feat(66): board widget snapshot + AddCardIntent quick-add#45
Merged
Conversation
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
added a commit
that referenced
this pull request
Jun 12, 2026
feat(72): wire FenixKanbanWidgets extension target (closes the #45 deferral)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Mission: #28 · Status log: #66 · Widget data path per #35 (snapshot, option A)
Summary
title(required),board(BoardEntity), and optionalcolumnName(defaults to first column by sortOrder). Empty-title validation, missing-board error, case-insensitive column match with first-column fallback. ReturnsCardEntity+ dialog. Registered inFenixKanbanShortcutswith three natural phrases ("Add a card to FenixKanban", etc.).group.com.bluefenixproductions.FenixKanban), falls back to Application Support when the entitlement is absent (dev/CI). App Group entitlement added toFenixKanban.entitlements. Hooked intoFizzySyncProvider.sync()after every successful sync.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: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
2f90593b8f14c4de3fa9ae227e35819c5beGate results
scripts/add-ui-test-target.rb: PASS (composes cleanly aftermake generate)repo.shcheck: INFRA-SKIP (script not found in repo)App Group entitlement state
com.apple.security.application-groups = group.com.bluefenixproductions.FenixKanbanadded toFenixKanban/Resources/FenixKanban.entitlements. Widget entitlement file atWidgets/FenixKanbanWidgets.entitlementswith 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