Skip to content

feat(66): board widget snapshot + AddCardIntent quick-add#45

Merged
ChrisPelatari merged 6 commits into
developfrom
claude/66-widget-quickadd
Jun 12, 2026
Merged

feat(66): board widget snapshot + AddCardIntent quick-add#45
ChrisPelatari merged 6 commits into
developfrom
claude/66-widget-quickadd

Conversation

@ChrisPelatari

Copy link
Copy Markdown
Member

Mission: #28 · Status log: #66 · Widget data path per #35 (snapshot, option A)

Summary

  • AddCardIntent: Siri/Shortcuts quick-add intent with title (required), board (BoardEntity), and optional columnName (defaults to first column by sortOrder). Empty-title validation, missing-board error, case-insensitive column match with first-column fallback. Returns CardEntity + dialog. Registered in FenixKanbanShortcuts with three natural phrases ("Add a card to FenixKanban", etc.).
  • BoardSnapshot + BoardSnapshotWriter: Codable snapshot (boardName, columns[name, cardCount, topCardTitles≤3], generatedAt). Writer serialises the first board to JSON in the App Group container (group.com.bluefenixproductions.FenixKanban), falls back to Application Support when the entitlement is absent (dev/CI). App Group entitlement added to FenixKanban.entitlements. Hooked into FizzySyncProvider.sync() after every successful sync.
  • Widget sources in-tree (Widgets/): PlaygroundBoardWidget (TimelineProvider, 30-min refresh, column summary view), WidgetSnapshotReader (Foundation-only, safe for extension sandbox), FenixKanbanWidgets.entitlements — all ready to wire in.

Widget target status: DEFERRED

xcodegen 2.45.4 generates the "Embed Foundation Extensions" build phase without PLATFORM_FILTER = ios, causing macOS builds to error with:

This target is built for macOS but contains embedded content (FenixKanbanWidgets.appex) built for iOS, which is not allowed.

Per the scope decision in the task brief: a broken macOS build is mission-stopping, a deferred widget is not. Widget sources live in Widgets/ and are ready; the project.yml dependency is commented with the blocker. Resolution path: xcodegen upgrade or a post-generate pbxproj patch script.

TDD evidence

Commit Phase Tests
2f90593 RED 6 AddCardIntentTests (compile-only, failing pre-impl)
b8f14c4 GREEN AddCardIntent + shortcuts — all 6 pass
de3fa9a RED 7 BoardSnapshotWriterTests
e227e35 GREEN BoardSnapshot + writer — all 7 pass
819c5be N/A Widget sources in-tree

Gate results

  • iOS Simulator build: PASS (zero warnings)
  • macOS build: PASS (zero warnings — widget target removed per fallback rule)
  • scripts/add-ui-test-target.rb: PASS (composes cleanly after make generate)
  • Full unit suite: PASS on new tests (13/13); pre-existing flaky suite failures (Keychain, FizzyAuthState, FizzySyncEngine suites) are pre-existing — confirmed same count on baseline before this branch.
  • repo.sh check: INFRA-SKIP (script not found in repo)

App Group entitlement state

com.apple.security.application-groups = group.com.bluefenixproductions.FenixKanban added to FenixKanban/Resources/FenixKanban.entitlements. Widget entitlement file at Widgets/FenixKanbanWidgets.entitlements with the same group identifier.

Files changed

  • FenixKanban/Features/Intents/AddCardIntent.swift (new)
  • FenixKanban/Features/Intents/FenixKanbanShortcuts.swift (updated)
  • FenixKanban/Features/Widget/BoardSnapshot.swift (new)
  • FenixKanban/Features/Widget/BoardSnapshotWriter.swift (new)
  • FenixKanban/Features/Sync/Fizzy/FizzySyncProvider.swift (snapshot hook)
  • FenixKanban/Resources/FenixKanban.entitlements (App Group added)
  • FenixKanbanTests/Intents/AddCardIntentTests.swift (new)
  • FenixKanbanTests/Features/Widget/BoardSnapshotWriterTests.swift (new)
  • Widgets/PlaygroundBoardWidget.swift (new, not yet built)
  • Widgets/WidgetSnapshotReader.swift (new, not yet built)
  • Widgets/FenixKanbanWidgets.entitlements (new, not yet built)
  • Widgets/Info.plist (generated by xcodegen, not yet built)
  • project.yml (note on deferred widget target)

🤖 Generated with Claude Code

ChrisPelatari and others added 5 commits June 12, 2026 05:16
Six failing tests for AddCardIntent: default-column placement, named-column
routing, unknown-column fallback, empty-title validation, missing-board error,
and dialog result. Mirrors ToggleGoldenIntentTests patterns with in-memory
PersistenceController test seam.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
AddCardIntent creates cards via CoreData context seam (matching ToggleGolden
pattern): resolves board by UUID, defaults to first column by sortOrder,
accepts optional column name with case-insensitive match + first-column
fallback, validates non-empty title. Returns CardEntity + dialog. Registered
in FenixKanbanShortcuts with three natural phrases. All six AddCardIntentTests
pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Seven tests: board name + column order by sortOrder, card counts, top-3 titles
cap, empty-column board, JSON round-trip Codable, fallback location invariant,
and no-boards no-throw. All in-memory PersistenceController, no disk writes
needed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
BoardSnapshot (Codable): boardName, columns[name, cardCount, topCardTitles≤3],
generatedAt. BoardSnapshotWriter: builds snapshot from first board by
sortOrder via context.performAndWait, writes JSON to App Group container
(group.com.bluefenixproductions.FenixKanban), falls back to Application
Support when entitlement absent. FizzySyncProvider.sync() calls writer after
each successful sync. App Group entitlement added to main app entitlements
file. project.yml updated with note on deferred widget target.

All seven BoardSnapshotWriterTests pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Widgets/PlaygroundBoardWidget.swift: WidgetKit TimelineProvider reading
BoardSnapshot via WidgetSnapshotReader, 30-min refresh, placeholder + column
summary view (counts + top titles), .systemSmall + .systemMedium families.
Widgets/WidgetSnapshotReader.swift: Foundation-only reader (no CoreData),
safe for extension sandbox. Widgets/FenixKanbanWidgets.entitlements with
App Group entry.

Widget target NOT in project.yml: xcodegen 2.45.4 generates the
"Embed Foundation Extensions" build phase without PLATFORM_FILTER=ios,
causing macOS builds to error with "embedded content built for iOS not
allowed". Sources are ready to wire in once the xcodegen blocker is resolved
(see PR #66 report).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…uickadd

# Conflicts:
#	FenixKanban.xcodeproj/project.pbxproj
@ChrisPelatari ChrisPelatari merged commit 4a025ce into develop Jun 12, 2026
1 of 2 checks passed
@ChrisPelatari ChrisPelatari deleted the claude/66-widget-quickadd branch June 12, 2026 11:21
ChrisPelatari added a commit that referenced this pull request Jun 12, 2026
feat(72): wire FenixKanbanWidgets extension target (closes the #45 deferral)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant