@mmerterden/multi-agent-pipeline 8.6.2 → 10.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +544 -2484
- package/README.md +99 -101
- package/docs/features.md +1 -1
- package/index.js +8 -10
- package/install/_adapters.mjs +5 -1
- package/install/_common.mjs +63 -0
- package/install/claude.mjs +14 -14
- package/install/copilot.mjs +14 -8
- package/install/index.mjs +85 -19
- package/install/templates/claude-hooks.json +18 -0
- package/install/templates/copilot-instructions.md +3 -3
- package/package.json +21 -6
- package/pipeline/adapters/_base.mjs +366 -14
- package/pipeline/adapters/antigravity.mjs +140 -0
- package/pipeline/adapters/codex.mjs +159 -0
- package/pipeline/adapters/copilot-chat-orchestration.mjs +148 -0
- package/pipeline/adapters/copilot-chat.mjs +34 -68
- package/pipeline/adapters/cursor-orchestration.mjs +152 -0
- package/pipeline/adapters/cursor.mjs +49 -90
- package/pipeline/agents/android-architect.md +5 -5
- package/pipeline/agents/backend-architect.md +4 -4
- package/pipeline/agents/code-reviewer.md +10 -10
- package/pipeline/agents/dev-critic.md +17 -17
- package/pipeline/agents/explorer.md +3 -3
- package/pipeline/agents/ios-architect.md +4 -4
- package/pipeline/agents/security-auditor.md +12 -12
- package/pipeline/agents/task-clarifier.md +18 -18
- package/pipeline/claude-md-template.md +3 -3
- package/pipeline/commands/archive-guard.md +3 -3
- package/pipeline/commands/figma-to-swiftui.md +10 -10
- package/pipeline/commands/multi-agent/_account-picker.md +12 -8
- package/pipeline/commands/multi-agent/_dev-context.md +15 -15
- package/pipeline/commands/multi-agent/_input-parser.md +4 -4
- package/pipeline/commands/multi-agent/_repo-picker.md +9 -9
- package/pipeline/commands/multi-agent/analysis-resolve.md +129 -0
- package/pipeline/commands/multi-agent/analysis.md +667 -0
- package/pipeline/commands/multi-agent/autopilot.md +22 -22
- package/pipeline/commands/multi-agent/build-optimize.md +77 -0
- package/pipeline/commands/multi-agent/channels.md +96 -96
- package/pipeline/commands/multi-agent/delete.md +19 -17
- package/pipeline/commands/multi-agent/dev-autopilot.md +23 -23
- package/pipeline/commands/multi-agent/dev-local-autopilot.md +23 -23
- package/pipeline/commands/multi-agent/dev-local.md +25 -22
- package/pipeline/commands/multi-agent/dev.md +49 -49
- package/pipeline/commands/multi-agent/diff-explain.md +4 -4
- package/pipeline/commands/multi-agent/garbage-collect.md +58 -0
- package/pipeline/commands/multi-agent/help.md +75 -66
- package/pipeline/commands/multi-agent/issue.md +3 -3
- package/pipeline/commands/multi-agent/jira.md +12 -12
- package/pipeline/commands/multi-agent/kill.md +6 -6
- package/pipeline/commands/multi-agent/language.md +12 -12
- package/pipeline/commands/multi-agent/local-autopilot.md +34 -34
- package/pipeline/commands/multi-agent/local.md +24 -25
- package/pipeline/commands/multi-agent/log.md +6 -6
- package/pipeline/commands/multi-agent/manual-test.md +3 -3
- package/pipeline/commands/multi-agent/prune-logs.md +60 -0
- package/pipeline/commands/multi-agent/purge.md +10 -7
- package/pipeline/commands/multi-agent/refactor.md +9 -9
- package/pipeline/commands/multi-agent/refs/analysis-template.md +1062 -0
- package/pipeline/commands/multi-agent/refs/android-guide.md +15 -13
- package/pipeline/commands/multi-agent/refs/audit-guide.md +20 -20
- package/pipeline/commands/multi-agent/refs/backend-guide.md +9 -9
- package/pipeline/commands/multi-agent/refs/channels/confluence.md +17 -17
- package/pipeline/commands/multi-agent/refs/channels/issue-comment.md +30 -30
- package/pipeline/commands/multi-agent/refs/channels/jira.md +15 -15
- package/pipeline/commands/multi-agent/refs/channels/pr-review-actions.md +19 -17
- package/pipeline/commands/multi-agent/refs/channels/pr.md +22 -22
- package/pipeline/commands/multi-agent/refs/channels/wiki.md +19 -19
- package/pipeline/commands/multi-agent/refs/component-dispatch.md +11 -11
- package/pipeline/commands/multi-agent/refs/conventions-defaults.md +179 -0
- package/pipeline/commands/multi-agent/refs/cross-cli-contract.md +35 -33
- package/pipeline/commands/multi-agent/refs/features/dev-critic.md +5 -5
- package/pipeline/commands/multi-agent/refs/features/external-context-injection.md +6 -6
- package/pipeline/commands/multi-agent/refs/features/model-fallback.md +73 -0
- package/pipeline/commands/multi-agent/refs/features/plan-todos.md +1 -1
- package/pipeline/commands/multi-agent/refs/features/prior-fix-detection.md +4 -4
- package/pipeline/commands/multi-agent/refs/features/repo-map.md +6 -6
- package/pipeline/commands/multi-agent/refs/features/shadow-git.md +2 -2
- package/pipeline/commands/multi-agent/refs/frontend-guide.md +16 -16
- package/pipeline/commands/multi-agent/refs/issue-jira-triad.md +18 -18
- package/pipeline/commands/multi-agent/refs/keychain.md +18 -8
- package/pipeline/commands/multi-agent/refs/knowledge.md +9 -9
- package/pipeline/commands/multi-agent/refs/multi-repo-integration-build.md +19 -19
- package/pipeline/commands/multi-agent/refs/phases/log-format.md +29 -9
- package/pipeline/commands/multi-agent/refs/phases/modes.md +33 -33
- package/pipeline/commands/multi-agent/refs/phases/operations.md +11 -11
- package/pipeline/commands/multi-agent/refs/phases/phase-0-init.md +93 -57
- package/pipeline/commands/multi-agent/refs/phases/phase-1-analysis.md +59 -28
- package/pipeline/commands/multi-agent/refs/phases/phase-2-planning.md +115 -63
- package/pipeline/commands/multi-agent/refs/phases/phase-3-dev.md +99 -36
- package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +160 -63
- package/pipeline/commands/multi-agent/refs/phases/phase-5-test.md +33 -18
- package/pipeline/commands/multi-agent/refs/phases/phase-6-commit.md +45 -43
- package/pipeline/commands/multi-agent/refs/phases/phase-7-report.md +54 -28
- package/pipeline/commands/multi-agent/refs/phases.md +17 -17
- package/pipeline/commands/multi-agent/refs/picker-contract.md +65 -0
- package/pipeline/commands/multi-agent/refs/progress-contract.md +37 -21
- package/pipeline/commands/multi-agent/refs/rules.md +83 -25
- package/pipeline/commands/multi-agent/refs/swiftui-guide.md +32 -30
- package/pipeline/commands/multi-agent/refs/tracker-contract.md +54 -30
- package/pipeline/commands/multi-agent/refs/wiki-capture.md +36 -33
- package/pipeline/commands/multi-agent/resume.md +9 -9
- package/pipeline/commands/multi-agent/review.md +24 -24
- package/pipeline/commands/multi-agent/scan.md +10 -10
- package/pipeline/commands/multi-agent/search.md +8 -8
- package/pipeline/commands/multi-agent/setup.md +111 -84
- package/pipeline/commands/multi-agent/stack.md +5 -5
- package/pipeline/commands/multi-agent/status.md +5 -5
- package/pipeline/commands/multi-agent/sync.md +123 -111
- package/pipeline/commands/multi-agent/test.md +6 -6
- package/pipeline/commands/multi-agent/update.md +1 -1
- package/pipeline/commands/multi-agent.md +66 -60
- package/pipeline/commands/sim-test.md +14 -14
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +1 -1
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +2 -2
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +2 -2
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +1 -1
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +2 -2
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +3 -3
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +4 -4
- package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +1 -1
- package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +1 -1
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-2-plan.json +42 -0
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-review.json +20 -0
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-triage.json +15 -0
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/task.json +12 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-2-plan.json +40 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-review.json +20 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-triage.json +15 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/task.json +12 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-2-plan.json +42 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-review.json +28 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-triage.json +27 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/task.json +12 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-2-plan.json +41 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-review.json +12 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-triage.json +6 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/task.json +12 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-2-plan.json +42 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-review.json +28 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-triage.json +27 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/task.json +12 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-1-analysis.json +25 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-2-plan.json +31 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-review.json +12 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-triage.json +18 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/task.json +12 -0
- package/pipeline/eval/golden-tasks/README.md +14 -14
- package/pipeline/eval/intent-cases.json +40 -0
- package/pipeline/eval/run-metrics-fixture.json +46 -0
- package/pipeline/eval/triage/01-empty-findings/notes.md +1 -1
- package/pipeline/eval/triage/02-real-blocker/notes.md +2 -2
- package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +1 -1
- package/pipeline/eval/triage/04-false-positive-reject/notes.md +1 -1
- package/pipeline/eval/triage/05-mixed-classification/notes.md +2 -2
- package/pipeline/eval/triage/06-severity-mismatch/notes.md +2 -2
- package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +1 -1
- package/pipeline/eval/triage/08-style-misclassified/notes.md +1 -1
- package/pipeline/eval/triage/09-cascading-finding/notes.md +2 -2
- package/pipeline/eval/triage/10-deferred-crossref/notes.md +2 -2
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +3 -3
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +2 -2
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +5 -5
- package/pipeline/eval/triage/README.md +4 -4
- package/pipeline/lib/account-resolver.sh +3 -3
- package/pipeline/lib/ask-choice.sh +98 -0
- package/pipeline/lib/channels-multi-repo.sh +3 -3
- package/pipeline/lib/classify-intent.sh +110 -0
- package/pipeline/lib/context-link-extractor.sh +3 -3
- package/pipeline/lib/credential-store-resolver.sh +3 -3
- package/pipeline/lib/credential-store.sh +9 -5
- package/pipeline/lib/extract-conventions.sh +1034 -0
- package/pipeline/lib/fetch-confluence.sh +3 -3
- package/pipeline/lib/fetch-crashlytics.sh +5 -5
- package/pipeline/lib/fetch-fortify.sh +5 -21
- package/pipeline/lib/fetch-swagger.sh +5 -5
- package/pipeline/lib/figma-screenshot.sh +536 -0
- package/pipeline/lib/issue-fetcher.sh +46 -20
- package/pipeline/lib/md2confluence-v3.py +1076 -0
- package/pipeline/lib/multi-repo-pipeline.sh +13 -22
- package/pipeline/lib/plan-todos.sh +7 -7
- package/pipeline/lib/post-pr-review.sh +53 -21
- package/pipeline/lib/repo-cache.sh +5 -5
- package/pipeline/lib/review-watch.sh +17 -13
- package/pipeline/lib/shadow-git.sh +7 -7
- package/pipeline/lib/submodule-detector.sh +3 -3
- package/pipeline/lib/vercel-deploy.sh +28 -15
- package/pipeline/preferences-template.json +21 -4
- package/pipeline/rules/app-store-guidelines.md +2 -2
- package/pipeline/rules/code-style.md +6 -6
- package/pipeline/rules/figma-pipeline.md +100 -2
- package/pipeline/rules/kotlin-android.md +8 -8
- package/pipeline/rules/security.md +4 -4
- package/pipeline/rules/tdd.md +1 -1
- package/pipeline/rules/testing.md +5 -5
- package/pipeline/schemas/agent-state.schema.json +55 -20
- package/pipeline/schemas/analysis-output.schema.json +7 -2
- package/pipeline/schemas/analysis-spec.schema.json +484 -0
- package/pipeline/schemas/clarify-output.schema.json +5 -5
- package/pipeline/schemas/conventions-output.schema.json +70 -0
- package/pipeline/schemas/dev-critic-output.schema.json +2 -2
- package/pipeline/schemas/diff-risk.schema.json +3 -3
- package/pipeline/schemas/figma-project-config.schema.json +3 -3
- package/pipeline/schemas/learnings-ledger.schema.json +39 -0
- package/pipeline/schemas/migrations/README.md +2 -2
- package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +5 -5
- package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +3 -3
- package/pipeline/schemas/migrations/prefs-2.1.0-to-2.2.0.mjs +4 -4
- package/pipeline/schemas/migrations/prefs-2.2.0-to-2.3.0.mjs +5 -5
- package/pipeline/schemas/migrations/state-2.0.0-to-2.1.0.mjs +3 -3
- package/pipeline/schemas/plan-todos.schema.json +4 -4
- package/pipeline/schemas/planning-output.schema.json +3 -3
- package/pipeline/schemas/prefs.schema.json +95 -11
- package/pipeline/schemas/reviewer-output.schema.json +7 -3
- package/pipeline/schemas/test-gap.schema.json +1 -1
- package/pipeline/schemas/token-budget.json +8 -8
- package/pipeline/schemas/triage-corpus.schema.json +1 -1
- package/pipeline/schemas/triage-output.schema.json +44 -6
- package/pipeline/scripts/README.md +64 -64
- package/pipeline/scripts/aggregate-metrics.mjs +55 -16
- package/pipeline/scripts/audit-log-rotate.sh +3 -3
- package/pipeline/scripts/audit-log.sh +20 -7
- package/pipeline/scripts/benchmark-phase-0.sh +6 -6
- package/pipeline/scripts/build-skills-index.mjs +15 -15
- package/pipeline/scripts/check-md-links.mjs +59 -0
- package/pipeline/scripts/classify-plan-safety.mjs +24 -18
- package/pipeline/scripts/cost-budget-check.mjs +160 -0
- package/pipeline/scripts/cost-table.json +23 -13
- package/pipeline/scripts/diff-explain.mjs +12 -12
- package/pipeline/scripts/diff-risk-score.mjs +18 -17
- package/pipeline/scripts/eval-golden-tasks-live.mjs +13 -10
- package/pipeline/scripts/eval-golden-tasks.mjs +3 -14
- package/pipeline/scripts/eval-intent.mjs +103 -0
- package/pipeline/scripts/eval-triage.mjs +3 -3
- package/pipeline/scripts/evidence-gate.mjs +155 -0
- package/pipeline/scripts/fixtures/install-layout.tsv +9 -9
- package/pipeline/scripts/gc-tmp.sh +102 -0
- package/pipeline/scripts/gen-mode-dispatch.mjs +27 -21
- package/pipeline/scripts/gen-skills-index.mjs +6 -6
- package/pipeline/scripts/github-ssh-setup.sh +1 -1
- package/pipeline/scripts/keychain-save.sh +1 -1
- package/pipeline/scripts/keychain.py +6 -6
- package/pipeline/scripts/learnings-ledger.mjs +284 -0
- package/pipeline/scripts/lint-skills.mjs +80 -0
- package/pipeline/scripts/log-metric.sh +18 -9
- package/pipeline/scripts/match-skills.mjs +13 -8
- package/pipeline/scripts/memory-load.sh +3 -3
- package/pipeline/scripts/memory-save.sh +5 -5
- package/pipeline/scripts/migrate-prefs.mjs +17 -17
- package/pipeline/scripts/migrate-state.mjs +12 -12
- package/pipeline/scripts/output-quality-check.sh +7 -7
- package/pipeline/scripts/phase-banner.sh +5 -5
- package/pipeline/scripts/phase-tracker.sh +90 -53
- package/pipeline/scripts/pre-commit-check.sh +45 -5
- package/pipeline/scripts/pre-push-check.sh +7 -7
- package/pipeline/scripts/prune-logs.sh +118 -0
- package/pipeline/scripts/render-agent-log-cost.sh +55 -18
- package/pipeline/scripts/render-cost-summary.sh +9 -9
- package/pipeline/scripts/render-work-summary.sh +4 -4
- package/pipeline/scripts/repo-map.mjs +9 -9
- package/pipeline/scripts/run-aggregator.mjs +7 -6
- package/pipeline/scripts/run-metrics.mjs +129 -0
- package/pipeline/scripts/run-smokes.mjs +76 -0
- package/pipeline/scripts/scan-skills.sh +11 -11
- package/pipeline/scripts/search-logs.sh +8 -8
- package/pipeline/scripts/sign-skills.sh +2 -2
- package/pipeline/scripts/smoke-adapters.sh +79 -10
- package/pipeline/scripts/smoke-add-detail.sh +5 -5
- package/pipeline/scripts/smoke-agent-log-cost.sh +85 -6
- package/pipeline/scripts/smoke-agent-model-routing.sh +3 -3
- package/pipeline/scripts/smoke-ask-choice.sh +42 -0
- package/pipeline/scripts/smoke-bitbucket-contract.sh +19 -3
- package/pipeline/scripts/smoke-changelog-version.sh +47 -0
- package/pipeline/scripts/smoke-channels-flow.sh +1 -1
- package/pipeline/scripts/smoke-ci-workflows.sh +5 -5
- package/pipeline/scripts/smoke-clarify.sh +3 -3
- package/pipeline/scripts/smoke-commands-skills-parity.sh +4 -4
- package/pipeline/scripts/smoke-community-gates.sh +75 -0
- package/pipeline/scripts/smoke-compliance-skills.sh +5 -5
- package/pipeline/scripts/smoke-cost-budget.sh +70 -0
- package/pipeline/scripts/smoke-cost-summary.sh +4 -4
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +50 -9
- package/pipeline/scripts/smoke-cross-phase-cohesion.sh +5 -5
- package/pipeline/scripts/smoke-delete-flow.sh +5 -5
- package/pipeline/scripts/smoke-dev-critic.sh +2 -2
- package/pipeline/scripts/smoke-diff-explain.sh +22 -3
- package/pipeline/scripts/smoke-diff-risk.sh +1 -1
- package/pipeline/scripts/smoke-dynamic-skill-loading.sh +1 -1
- package/pipeline/scripts/smoke-eval-live.sh +4 -4
- package/pipeline/scripts/smoke-evidence-gate.sh +93 -0
- package/pipeline/scripts/smoke-existing-discovery-gate.sh +1 -1
- package/pipeline/scripts/smoke-extract-conventions.sh +163 -0
- package/pipeline/scripts/smoke-figma-android-parity.sh +1 -1
- package/pipeline/scripts/smoke-figma-credential-store.sh +3 -3
- package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +12 -12
- package/pipeline/scripts/smoke-figma-dispatch.sh +5 -5
- package/pipeline/scripts/smoke-figma-sync.sh +1 -1
- package/pipeline/scripts/smoke-gate-hooks.sh +56 -0
- package/pipeline/scripts/smoke-gc-tmp.sh +84 -0
- package/pipeline/scripts/smoke-identity-isolation.sh +7 -7
- package/pipeline/scripts/smoke-install-layout.sh +10 -10
- package/pipeline/scripts/smoke-intent-guard.sh +86 -0
- package/pipeline/scripts/smoke-issue-comment-template.sh +3 -3
- package/pipeline/scripts/smoke-issue-jira-triad.sh +1 -1
- package/pipeline/scripts/smoke-keychain.sh +6 -6
- package/pipeline/scripts/smoke-language-axis.sh +2 -2
- package/pipeline/scripts/smoke-learnings-ledger.sh +86 -0
- package/pipeline/scripts/smoke-lib-scripts.sh +2 -2
- package/pipeline/scripts/smoke-mcp-gate.sh +68 -0
- package/pipeline/scripts/smoke-md-links.sh +8 -0
- package/pipeline/scripts/smoke-md2confluence.sh +126 -0
- package/pipeline/scripts/smoke-metrics-cache-ratio.sh +72 -0
- package/pipeline/scripts/smoke-migrate-state.sh +10 -10
- package/pipeline/scripts/smoke-mode-dispatch-drift.sh +7 -4
- package/pipeline/scripts/smoke-model-fallback.sh +80 -0
- package/pipeline/scripts/smoke-multi-repo-integration.sh +3 -3
- package/pipeline/scripts/smoke-multi-repo-worktree.sh +1 -1
- package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +115 -0
- package/pipeline/scripts/smoke-no-token-prompt.sh +31 -15
- package/pipeline/scripts/smoke-pat-audit.sh +26 -5
- package/pipeline/scripts/smoke-per-repo-memory.sh +1 -1
- package/pipeline/scripts/smoke-phase-0-multi-repo.sh +1 -1
- package/pipeline/scripts/smoke-phase-6-multi.sh +2 -2
- package/pipeline/scripts/smoke-phase-banner.sh +1 -1
- package/pipeline/scripts/smoke-phase-tracker.sh +1 -1
- package/pipeline/scripts/smoke-phase0-bridge-contract.sh +4 -4
- package/pipeline/scripts/smoke-phase4-triage.sh +94 -7
- package/pipeline/scripts/smoke-plan-approval-gate.sh +3 -3
- package/pipeline/scripts/smoke-plan-safety.sh +1 -1
- package/pipeline/scripts/smoke-plan-todos.sh +2 -2
- package/pipeline/scripts/smoke-pr-review-actions.sh +2 -2
- package/pipeline/scripts/smoke-pre-commit.sh +34 -2
- package/pipeline/scripts/smoke-pref-migration.sh +1 -1
- package/pipeline/scripts/smoke-prefs-language.sh +5 -5
- package/pipeline/scripts/smoke-progress-contract.sh +3 -3
- package/pipeline/scripts/smoke-prune-logs.sh +87 -0
- package/pipeline/scripts/smoke-push-retry.sh +1 -1
- package/pipeline/scripts/smoke-readme-counts.sh +1 -1
- package/pipeline/scripts/smoke-repo-map.sh +9 -9
- package/pipeline/scripts/smoke-review-watch.sh +12 -0
- package/pipeline/scripts/smoke-run-aggregator.sh +7 -7
- package/pipeline/scripts/smoke-run-metrics.sh +50 -0
- package/pipeline/scripts/smoke-schema-validation.sh +18 -11
- package/pipeline/scripts/smoke-search.sh +5 -5
- package/pipeline/scripts/smoke-shared-runtime.sh +108 -0
- package/pipeline/scripts/smoke-skill-authoring.sh +13 -13
- package/pipeline/scripts/smoke-skill-language.sh +4 -4
- package/pipeline/scripts/smoke-skill-manifest.sh +2 -2
- package/pipeline/scripts/smoke-skill-scan.sh +2 -2
- package/pipeline/scripts/smoke-stack-swap.sh +2 -2
- package/pipeline/scripts/smoke-subagent-validators.sh +8 -5
- package/pipeline/scripts/smoke-sync-adapters.sh +1 -1
- package/pipeline/scripts/smoke-sync-delegation.sh +7 -7
- package/pipeline/scripts/smoke-sync-parity.sh +1 -1
- package/pipeline/scripts/smoke-tasklist-ordering.sh +7 -7
- package/pipeline/scripts/smoke-telemetry.sh +1 -1
- package/pipeline/scripts/smoke-test-gap.sh +5 -5
- package/pipeline/scripts/smoke-token-budget.sh +1 -1
- package/pipeline/scripts/smoke-tracker-contract.sh +6 -6
- package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +9 -1
- package/pipeline/scripts/smoke-triage-memory.sh +2 -2
- package/pipeline/scripts/smoke-url-enrichment.sh +2 -2
- package/pipeline/scripts/smoke-validator-contradiction.sh +1 -1
- package/pipeline/scripts/smoke-validator-gates.sh +164 -0
- package/pipeline/scripts/smoke-vercel-deploy-redact.sh +11 -11
- package/pipeline/scripts/smoke-wiki-integration.sh +2 -2
- package/pipeline/scripts/smoke-work-summary.sh +3 -3
- package/pipeline/scripts/smoke-worktree-path-convention.sh +4 -4
- package/pipeline/scripts/smoke-write-state.sh +2 -2
- package/pipeline/scripts/stack-swap.sh +3 -3
- package/pipeline/scripts/sync-adapters.mjs +37 -10
- package/pipeline/scripts/sync-parity-check.sh +6 -6
- package/pipeline/scripts/test-gap-scan.mjs +11 -13
- package/pipeline/scripts/token-budget-report.mjs +4 -4
- package/pipeline/scripts/triage-memory.mjs +6 -6
- package/pipeline/scripts/uninstall.mjs +42 -4
- package/pipeline/scripts/update-issue-progress.sh +2 -2
- package/pipeline/scripts/validate-analysis.mjs +19 -21
- package/pipeline/scripts/validate-diff-risk.mjs +4 -4
- package/pipeline/scripts/validate-planning.mjs +3 -3
- package/pipeline/scripts/validate-reviewer.mjs +4 -4
- package/pipeline/scripts/validate-schemas.mjs +4 -4
- package/pipeline/scripts/validate-test-gap.mjs +4 -4
- package/pipeline/scripts/validate-triage.mjs +68 -9
- package/pipeline/scripts/verify-skills.sh +7 -7
- package/pipeline/scripts/write-state.mjs +49 -11
- package/pipeline/skills/.skill-manifest.json +245 -149
- package/pipeline/skills/.skills-index.json +236 -47
- package/pipeline/skills/figma-android/README.md +5 -5
- package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +3 -3
- package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +8 -8
- package/pipeline/skills/figma-android/figma-component-test/SKILL.md +4 -4
- package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +5 -5
- package/pipeline/skills/figma-android/figma-to-component/SKILL.md +14 -14
- package/pipeline/skills/figma-common/README.md +29 -29
- package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +20 -15
- package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +35 -30
- package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +35 -30
- package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +20 -20
- package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +32 -32
- package/pipeline/skills/figma-common/figma-commit/REVIEW.md +9 -9
- package/pipeline/skills/figma-common/figma-commit/SKILL.md +25 -20
- package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +11 -6
- package/pipeline/skills/figma-common/figma-component-start/SKILL.md +30 -25
- package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +9 -4
- package/pipeline/skills/figma-common/figma-fix/SKILL.md +27 -22
- package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +38 -38
- package/pipeline/skills/figma-common/figma-issue/SKILL.md +39 -34
- package/pipeline/skills/figma-common/figma-iterate/SKILL.md +20 -15
- package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +44 -39
- package/pipeline/skills/figma-common/figma-mend/SKILL.md +6 -6
- package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +30 -30
- package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +1 -1
- package/pipeline/skills/figma-common/figma-review/SKILL.md +31 -26
- package/pipeline/skills/figma-common/figma-setup/SKILL.md +11 -11
- package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +5 -5
- package/pipeline/skills/figma-common/figma-skip/SKILL.md +6 -6
- package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +12 -12
- package/pipeline/skills/figma-common/figma-utility/SKILL.md +4 -4
- package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +1 -1
- package/pipeline/skills/figma-common/figma-validate/SKILL.md +48 -48
- package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +42 -37
- package/pipeline/skills/figma-common/performance-review-next/SKILL.md +23 -18
- package/pipeline/skills/figma-common/performance-start/SKILL.md +52 -47
- package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +68 -68
- package/pipeline/skills/figma-common/performance-tour/SKILL.md +42 -37
- package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +16 -16
- package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +15 -15
- package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +9 -9
- package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +15 -15
- package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +18 -18
- package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +38 -38
- package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +2 -2
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +12 -12
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +19 -19
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +25 -25
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +7 -7
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +6 -6
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +38 -38
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +29 -29
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +6 -6
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +12 -12
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +57 -57
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +6 -6
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +10 -10
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +16 -16
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +23 -23
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +26 -26
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +43 -43
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +17 -17
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +19 -19
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +15 -15
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +39 -39
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +7 -7
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +29 -29
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +9 -9
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +31 -31
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +18 -18
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +16 -16
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +2 -2
- package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +49 -49
- package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +8 -8
- package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +2 -2
- package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +9 -9
- package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +10 -10
- package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +11 -11
- package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +14 -14
- package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +2 -2
- package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +6 -6
- package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +9 -9
- package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +18 -18
- package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +18 -18
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.example.json +9 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +12 -12
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +26 -26
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +2 -2
- package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +41 -41
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +8 -8
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +7 -7
- package/pipeline/skills/shared/README.md +62 -41
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +39 -39
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +44 -44
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +182 -176
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +55 -0
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +48 -0
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +16 -16
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +48 -0
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +40 -40
- package/pipeline/skills/shared/core/multi-agent-delete/SKILL.md +33 -30
- package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +26 -26
- package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +22 -22
- package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +6 -6
- package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +12 -12
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +20 -20
- package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +61 -0
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +22 -22
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +15 -15
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +12 -12
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +14 -14
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +12 -12
- package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +10 -10
- package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +18 -18
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +9 -9
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +20 -20
- package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +63 -0
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +16 -13
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +110 -110
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +13 -13
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +22 -22
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +18 -18
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +13 -13
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +33 -30
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +14 -14
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +9 -9
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +79 -79
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +5 -5
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +10 -10
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +41 -0
- package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +53 -0
- package/pipeline/skills/shared/external/agentflow/SKILL.md +9 -9
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +113 -52
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +41 -0
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +23 -16
- package/pipeline/skills/shared/external/app-clips/SKILL.md +85 -354
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +50 -0
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +135 -0
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +125 -0
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +113 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +152 -59
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +161 -118
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +289 -392
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +46 -0
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +174 -0
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +191 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +57 -107
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +35 -12
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +28 -26
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +53 -62
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +7 -1
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +4 -1
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +32 -12
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +34 -30
- package/pipeline/skills/shared/external/authentication/SKILL.md +134 -138
- package/pipeline/skills/shared/external/authentication/evals/evals.json +48 -0
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +56 -29
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +183 -0
- package/pipeline/skills/shared/external/avkit/SKILL.md +497 -0
- package/pipeline/skills/shared/external/avkit/evals/evals.json +55 -0
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +668 -0
- package/pipeline/skills/shared/external/background-processing/SKILL.md +29 -29
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +44 -19
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +136 -99
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +27 -8
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +7 -6
- package/pipeline/skills/shared/external/clean-code/SKILL.md +2 -2
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +63 -56
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +7 -4
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +31 -11
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +41 -0
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +51 -51
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +70 -65
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +25 -1
- package/pipeline/skills/shared/external/core-data/SKILL.md +496 -0
- package/pipeline/skills/shared/external/core-data/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/core-motion/SKILL.md +47 -14
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +49 -0
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +47 -16
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +43 -54
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +49 -0
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +32 -2
- package/pipeline/skills/shared/external/coreml/SKILL.md +89 -48
- package/pipeline/skills/shared/external/coreml/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +82 -37
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +493 -0
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +602 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +6 -5
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +77 -47
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +42 -34
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +2 -2
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +136 -176
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +45 -0
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +240 -0
- package/pipeline/skills/shared/external/energykit/SKILL.md +73 -34
- package/pipeline/skills/shared/external/energykit/evals/evals.json +45 -0
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +80 -38
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +67 -53
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +53 -3
- package/pipeline/skills/shared/external/healthkit/SKILL.md +57 -124
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +46 -0
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +82 -1
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +43 -41
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +45 -0
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +13 -8
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +5 -4
- package/pipeline/skills/shared/external/humanizer/SKILL.md +4 -4
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +174 -18
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +49 -0
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +262 -4
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +117 -0
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +141 -0
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +67 -14
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +49 -0
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +20 -3
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +131 -22
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +69 -22
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +50 -0
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +28 -16
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +354 -0
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +69 -44
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +35 -69
- package/pipeline/skills/shared/external/ios-security/references/file-storage-patterns.md +8 -8
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +485 -0
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +316 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +120 -131
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/live-activities/references/{live-activity-patterns.md → activitykit-patterns.md} +148 -63
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +40 -21
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/mapkit-location/references/{corelocation-patterns.md → mapkit-corelocation-patterns.md} +88 -41
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +27 -24
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +129 -172
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +46 -0
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +180 -0
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +45 -18
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +26 -6
- package/pipeline/skills/shared/external/natural-language/SKILL.md +48 -18
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +20 -7
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +4 -3
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +156 -66
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +51 -0
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +69 -19
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +499 -0
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +42 -0
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +844 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +122 -28
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +49 -18
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +100 -51
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +48 -8
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +13 -15
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +4 -4
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +2 -2
- package/pipeline/skills/shared/external/photos-camera-media/references/{photospicker-patterns.md → photokit-patterns.md} +3 -3
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +45 -48
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +46 -0
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +22 -33
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +56 -37
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +4 -3
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +1 -0
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +74 -53
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +10 -10
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +21 -20
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +81 -64
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +48 -9
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +118 -104
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +49 -0
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +171 -0
- package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +93 -0
- package/pipeline/skills/shared/external/spm-build-analysis/references/build-optimization-sources.md +155 -0
- package/pipeline/skills/shared/external/spm-build-analysis/references/recommendation-format.md +85 -0
- package/pipeline/skills/shared/external/spm-build-analysis/references/spm-analysis-checks.md +105 -0
- package/pipeline/skills/shared/external/spm-build-analysis/scripts/check_spm_pins.py +118 -0
- package/pipeline/skills/shared/external/storekit/SKILL.md +110 -44
- package/pipeline/skills/shared/external/storekit/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +94 -43
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +82 -33
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +449 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +50 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +164 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +219 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +184 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +158 -0
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +499 -0
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +45 -0
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +52 -40
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +92 -11
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +43 -16
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +43 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +50 -30
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +11 -4
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +113 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +150 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/{swift-6-2-concurrency.md → concurrency-patterns.md} +22 -11
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +52 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +2 -2
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +21 -15
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +3 -3
- package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -2
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/actors.md +3 -3
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/async-streams.md +1 -1
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/bridging.md +3 -3
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/bug-patterns.md +3 -3
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/cancellation.md +8 -8
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/diagnostics.md +1 -1
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/hotspots.md +2 -2
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/interop.md +4 -4
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/new-features.md +1 -1
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/structured.md +2 -2
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/testing.md +2 -2
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/unstructured.md +3 -3
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +339 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +33 -34
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +97 -0
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +19 -6
- package/pipeline/skills/shared/external/swift-security/SKILL.md +195 -0
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +48 -0
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +595 -0
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +611 -0
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +708 -0
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +573 -0
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +752 -0
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +538 -0
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +530 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +543 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +620 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +515 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +496 -0
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +747 -0
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +566 -0
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +813 -0
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +97 -297
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +123 -0
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +162 -34
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -2
- package/pipeline/skills/shared/external/swift-testing-pro/references/async-tests.md +3 -3
- package/pipeline/skills/shared/external/swift-testing-pro/references/core-rules.md +2 -2
- package/pipeline/skills/shared/external/swift-testing-pro/references/migrating-from-xctest.md +5 -5
- package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +3 -3
- package/pipeline/skills/shared/external/swift-testing-pro/references/writing-better-tests.md +5 -5
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +44 -23
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +3 -3
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +75 -0
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +54 -0
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +14 -10
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +5 -5
- package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -2
- package/pipeline/skills/shared/external/swiftdata-pro/references/class-inheritance.md +2 -2
- package/pipeline/skills/shared/external/swiftdata-pro/references/cloudkit.md +1 -1
- package/pipeline/skills/shared/external/swiftdata-pro/references/core-rules.md +6 -6
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +337 -0
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +297 -0
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +170 -0
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +307 -0
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +35 -0
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +306 -0
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +56 -65
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +48 -44
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +6 -6
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts-accessibility.md +13 -13
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts.md +3 -3
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/image-optimization.md +1 -1
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/latest-apis.md +4 -4
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/layout-best-practices.md +2 -2
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/list-patterns.md +1 -1
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-scenes.md +16 -16
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-views.md +11 -11
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-window-styling.md +7 -7
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/state-management.md +5 -5
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/view-structure.md +6 -6
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +38 -16
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +13 -3
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +32 -28
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +1 -1
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +202 -41
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +16 -25
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +71 -26
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +284 -65
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +387 -0
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +10 -10
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +15 -3
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +2 -2
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +1 -1
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +51 -25
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +78 -6
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +161 -16
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +85 -27
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +37 -33
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +39 -51
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +204 -30
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +226 -21
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +220 -20
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +159 -34
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +27 -0
- package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -2
- package/pipeline/skills/shared/external/swiftui-pro/references/accessibility.md +4 -4
- package/pipeline/skills/shared/external/swiftui-pro/references/api.md +1 -1
- package/pipeline/skills/shared/external/swiftui-pro/references/data.md +2 -2
- package/pipeline/skills/shared/external/swiftui-pro/references/design.md +4 -4
- package/pipeline/skills/shared/external/swiftui-pro/references/hygiene.md +2 -2
- package/pipeline/skills/shared/external/swiftui-pro/references/navigation.md +1 -1
- package/pipeline/skills/shared/external/swiftui-pro/references/performance.md +1 -1
- package/pipeline/skills/shared/external/swiftui-pro/references/swift.md +2 -2
- package/pipeline/skills/shared/external/swiftui-pro/references/views.md +2 -2
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +12 -12
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +3 -3
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +1 -1
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +11 -11
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +124 -10
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +2 -1
- package/pipeline/skills/shared/external/tipkit/SKILL.md +3 -3
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +9 -9
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +17 -16
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +11 -11
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +1 -1
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +5 -5
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +7 -6
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +3 -3
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +9 -9
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +1 -0
- package/pipeline/skills/shared/external/web-performance/SKILL.md +8 -7
- package/pipeline/skills/shared/external/web-testing/SKILL.md +7 -6
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +23 -17
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +99 -0
- package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +89 -0
- package/pipeline/skills/shared/external/xcode-build-benchmark/references/benchmark-artifacts.md +94 -0
- package/pipeline/skills/shared/external/xcode-build-benchmark/references/benchmarking-workflow.md +67 -0
- package/pipeline/skills/shared/external/xcode-build-benchmark/schemas/build-benchmark.schema.json +230 -0
- package/pipeline/skills/shared/external/xcode-build-benchmark/scripts/benchmark_builds.py +308 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +219 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/references/build-settings-best-practices.md +216 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/references/fix-patterns.md +290 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/references/recommendation-format.md +85 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/scripts/benchmark_builds.py +308 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +157 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/references/benchmark-artifacts.md +94 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/references/build-settings-best-practices.md +216 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/references/orchestration-report-template.md +143 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/references/recommendation-format.md +85 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/scripts/benchmark_builds.py +308 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/scripts/diagnose_compilation.py +273 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/scripts/generate_optimization_report.py +533 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +90 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/build-optimization-sources.md +155 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/code-compilation-checks.md +106 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/recommendation-format.md +85 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/scripts/diagnose_compilation.py +273 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +77 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/references/build-optimization-sources.md +155 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/references/build-settings-best-practices.md +216 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/references/project-audit-checks.md +101 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/references/recommendation-format.md +85 -0
- package/pipeline/skills/skills-index.md +213 -192
- package/docs/GENERICITY-REVIEW.md +0 -277
- package/docs/STABILITY-FIX-PLAN.md +0 -168
- package/pipeline/scripts/README-figma-smokes.md +0 -34
- package/pipeline/scripts/figma-placeholder-map.json +0 -191
- package/pipeline/scripts/import-figma-skills.sh +0 -253
- package/pipeline/scripts/smoke-figma-config-schema.sh +0 -144
- package/pipeline/scripts/smoke-figma-skill-import.sh +0 -174
- package/pipeline/scripts/smoke-install-leak-gate.sh +0 -125
- package/pipeline/scripts/smoke-personal-data.sh +0 -84
- package/pipeline/scripts/sync-figma-source.sh +0 -228
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.json +0 -94
- package/pipeline/skills/shared/external/app-store-review/references/code-signing.md +0 -259
- package/pipeline/skills/shared/external/app-store-review/references/rejection-patterns.md +0 -152
- package/pipeline/skills/shared/external/pencilkit-drawing/references/paperkit-integration.md +0 -376
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Complete implementation patterns for ActivityKit Live Activities, Dynamic
|
|
4
4
|
Island, push-to-update, and lifecycle management. All patterns use modern
|
|
5
|
-
Swift async/await and target iOS 16.
|
|
5
|
+
Swift async/await and `ActivityContent`, so they target iOS 16.2+ unless noted.
|
|
6
6
|
|
|
7
7
|
## Contents
|
|
8
8
|
|
|
@@ -41,7 +41,9 @@ struct RideAttributes: ActivityAttributes {
|
|
|
41
41
|
var driverName: String
|
|
42
42
|
var driverPhoto: String // SF Symbol name or asset name
|
|
43
43
|
var vehicleDescription: String
|
|
44
|
-
var
|
|
44
|
+
var etaStartSeconds: Int
|
|
45
|
+
var etaEndSeconds: Int
|
|
46
|
+
// For server pushes, prefer scalar fields or coordinated custom Codable keys.
|
|
45
47
|
var status: RideStatus
|
|
46
48
|
var distanceRemaining: Double // miles
|
|
47
49
|
}
|
|
@@ -55,12 +57,20 @@ enum RideStatus: String, Codable, Hashable {
|
|
|
55
57
|
case arriving
|
|
56
58
|
case completed
|
|
57
59
|
case cancelled
|
|
60
|
+
case failed
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
extension RideAttributes.ContentState {
|
|
64
|
+
var etaRange: ClosedRange<Date> {
|
|
65
|
+
Date(timeIntervalSince1970: TimeInterval(etaStartSeconds))...
|
|
66
|
+
Date(timeIntervalSince1970: TimeInterval(etaEndSeconds))
|
|
67
|
+
}
|
|
58
68
|
}
|
|
59
69
|
```
|
|
60
70
|
|
|
61
|
-
Keep `ContentState` lightweight.
|
|
62
|
-
|
|
63
|
-
deeply nested objects.
|
|
71
|
+
Keep `ContentState` lightweight. ActivityKit attributes and content-state data
|
|
72
|
+
must fit within the framework's 4 KB data limit. Avoid storing images, large
|
|
73
|
+
strings, or deeply nested objects.
|
|
64
74
|
|
|
65
75
|
## Starting a Live Activity with All Parameters
|
|
66
76
|
|
|
@@ -91,7 +101,8 @@ func startRideActivity(
|
|
|
91
101
|
driverName: driver,
|
|
92
102
|
driverPhoto: "car.fill",
|
|
93
103
|
vehicleDescription: vehicle,
|
|
94
|
-
|
|
104
|
+
etaStartSeconds: Int(Date().timeIntervalSince1970),
|
|
105
|
+
etaEndSeconds: Int(Date().addingTimeInterval(600).timeIntervalSince1970),
|
|
95
106
|
status: .driverAssigned,
|
|
96
107
|
distanceRemaining: 2.5
|
|
97
108
|
)
|
|
@@ -145,19 +156,31 @@ let activity = try Activity.request(
|
|
|
145
156
|
attributes: attributes,
|
|
146
157
|
content: content,
|
|
147
158
|
pushType: .token,
|
|
159
|
+
style: .standard,
|
|
160
|
+
alertConfiguration: AlertConfiguration(
|
|
161
|
+
title: "Game Starting",
|
|
162
|
+
body: "The live score is ready.",
|
|
163
|
+
sound: .default
|
|
164
|
+
),
|
|
148
165
|
start: gameTime // iOS 26+
|
|
149
166
|
)
|
|
150
167
|
```
|
|
151
168
|
|
|
152
|
-
### Starting with ActivityStyle (iOS
|
|
169
|
+
### Starting with ActivityStyle (iOS 18+ request parameter)
|
|
170
|
+
|
|
171
|
+
Use `.standard` for persistent Live Activities that should remain visible until
|
|
172
|
+
the app, push, user, or system duration limit ends them. `.transient` is only
|
|
173
|
+
for short-lived expanded Dynamic Island presentations that can auto-end when the
|
|
174
|
+
user locks the device, collapses or shrinks the expanded presentation, leaves
|
|
175
|
+
the app, or does other work outside Dynamic Island; it is wrong for persistent
|
|
176
|
+
Live Activities.
|
|
153
177
|
|
|
154
178
|
```swift
|
|
155
|
-
// Transient: system may auto-dismiss after a period
|
|
156
179
|
let activity = try Activity.request(
|
|
157
180
|
attributes: attributes,
|
|
158
181
|
content: content,
|
|
159
182
|
pushType: .token,
|
|
160
|
-
style: .
|
|
183
|
+
style: .standard
|
|
161
184
|
)
|
|
162
185
|
```
|
|
163
186
|
|
|
@@ -175,7 +198,8 @@ func updateRideActivity(
|
|
|
175
198
|
driverName: activity.content.state.driverName,
|
|
176
199
|
driverPhoto: activity.content.state.driverPhoto,
|
|
177
200
|
vehicleDescription: activity.content.state.vehicleDescription,
|
|
178
|
-
|
|
201
|
+
etaStartSeconds: Int(eta.lowerBound.timeIntervalSince1970),
|
|
202
|
+
etaEndSeconds: Int(eta.upperBound.timeIntervalSince1970),
|
|
179
203
|
status: newStatus,
|
|
180
204
|
distanceRemaining: distance
|
|
181
205
|
)
|
|
@@ -220,10 +244,8 @@ private func alertMessage(for status: RideStatus) -> String {
|
|
|
220
244
|
"driverName": "Maria",
|
|
221
245
|
"driverPhoto": "car.fill",
|
|
222
246
|
"vehicleDescription": "White Toyota Camry",
|
|
223
|
-
"
|
|
224
|
-
|
|
225
|
-
"upperBound": 1700000300
|
|
226
|
-
},
|
|
247
|
+
"etaStartSeconds": 1700000000,
|
|
248
|
+
"etaEndSeconds": 1700000300,
|
|
227
249
|
"status": "driverArrived",
|
|
228
250
|
"distanceRemaining": 0.0
|
|
229
251
|
},
|
|
@@ -250,10 +272,8 @@ private func alertMessage(for status: RideStatus) -> String {
|
|
|
250
272
|
"driverName": "Maria",
|
|
251
273
|
"driverPhoto": "car.fill",
|
|
252
274
|
"vehicleDescription": "White Toyota Camry",
|
|
253
|
-
"
|
|
254
|
-
|
|
255
|
-
"upperBound": 1700002000
|
|
256
|
-
},
|
|
275
|
+
"etaStartSeconds": 1700002000,
|
|
276
|
+
"etaEndSeconds": 1700002000,
|
|
257
277
|
"status": "completed",
|
|
258
278
|
"distanceRemaining": 0.0
|
|
259
279
|
}
|
|
@@ -263,7 +283,7 @@ private func alertMessage(for status: RideStatus) -> String {
|
|
|
263
283
|
|
|
264
284
|
### Push-to-Start Payload (iOS 17.2+)
|
|
265
285
|
|
|
266
|
-
Send to the push-to-start token to remotely create an activity:
|
|
286
|
+
Send to the push-to-start token to remotely create an activity. The `alert` field is required for push-to-start:
|
|
267
287
|
|
|
268
288
|
```json
|
|
269
289
|
{
|
|
@@ -280,10 +300,8 @@ Send to the push-to-start token to remotely create an activity:
|
|
|
280
300
|
"driverName": "Maria",
|
|
281
301
|
"driverPhoto": "car.fill",
|
|
282
302
|
"vehicleDescription": "White Toyota Camry",
|
|
283
|
-
"
|
|
284
|
-
|
|
285
|
-
"upperBound": 1700000600
|
|
286
|
-
},
|
|
303
|
+
"etaStartSeconds": 1700000000,
|
|
304
|
+
"etaEndSeconds": 1700000600,
|
|
287
305
|
"status": "driverAssigned",
|
|
288
306
|
"distanceRemaining": 3.2
|
|
289
307
|
},
|
|
@@ -301,12 +319,35 @@ Send to the push-to-start token to remotely create an activity:
|
|
|
301
319
|
|---|---|
|
|
302
320
|
| `apns-push-type` | `liveactivity` |
|
|
303
321
|
| `apns-topic` | `<bundle-id>.push-type.liveactivity` |
|
|
304
|
-
| `apns-priority` | `5` (
|
|
322
|
+
| `apns-priority` | `5` (lower priority) or `10` (immediate, counts against budget) |
|
|
305
323
|
| `authorization` | `bearer <jwt>` (token auth) or use certificate auth |
|
|
306
324
|
|
|
307
|
-
The `
|
|
308
|
-
|
|
309
|
-
|
|
325
|
+
The `aps.alert` payload controls visible alert/banner/sound behavior; priority
|
|
326
|
+
alone does not create an alert. The `content-state` JSON must decode into
|
|
327
|
+
`ActivityAttributes.ContentState`. Use the default synthesized `Codable` key and
|
|
328
|
+
value shape unless the Swift model declares custom `CodingKeys`; then coordinate
|
|
329
|
+
those exact keys and value shapes server-side. Do not assume `Date` or
|
|
330
|
+
`ClosedRange<Date>` values are Unix timestamp dictionaries unless your Swift
|
|
331
|
+
model explicitly encodes them that way. A type mismatch (e.g., sending a string
|
|
332
|
+
where a number is expected) can prevent ActivityKit from applying the update.
|
|
333
|
+
|
|
334
|
+
### Channel / Broadcast Updates (iOS 18+)
|
|
335
|
+
|
|
336
|
+
Use channel-based push only with a valid APNs-created channel ID. Enable the
|
|
337
|
+
broadcast capability outside Xcode, have the server create the channel, and pass
|
|
338
|
+
that channel ID to the app:
|
|
339
|
+
|
|
340
|
+
```swift
|
|
341
|
+
let activity = try Activity.request(
|
|
342
|
+
attributes: attributes,
|
|
343
|
+
content: content,
|
|
344
|
+
pushType: .channel(channelIDFromServer)
|
|
345
|
+
)
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
Channel pushes can update or end Live Activities, but cannot start them. Use
|
|
349
|
+
`apns-channel-id` and expiration for channel requests instead of the device-token
|
|
350
|
+
`apns-topic` header.
|
|
310
351
|
|
|
311
352
|
## Ending with Different Dismissal Policies
|
|
312
353
|
|
|
@@ -319,7 +360,8 @@ func endRideActivity(
|
|
|
319
360
|
driverName: activity.content.state.driverName,
|
|
320
361
|
driverPhoto: activity.content.state.driverPhoto,
|
|
321
362
|
vehicleDescription: activity.content.state.vehicleDescription,
|
|
322
|
-
|
|
363
|
+
etaStartSeconds: Int(Date().timeIntervalSince1970),
|
|
364
|
+
etaEndSeconds: Int(Date().timeIntervalSince1970),
|
|
323
365
|
status: finalStatus,
|
|
324
366
|
distanceRemaining: 0
|
|
325
367
|
)
|
|
@@ -342,6 +384,37 @@ func endRideActivity(
|
|
|
342
384
|
}
|
|
343
385
|
```
|
|
344
386
|
|
|
387
|
+
When reviewing duration claims, distinguish the active lifetime (up to 8 hours
|
|
388
|
+
unless the app or user ends it sooner), system-ended Lock Screen presence (up to
|
|
389
|
+
4 additional hours, for 12 hours total from start), and app-ended `.default`
|
|
390
|
+
dismissal linger (up to 4 hours after ending).
|
|
391
|
+
|
|
392
|
+
### Ending on Terminal Server Failure
|
|
393
|
+
|
|
394
|
+
When a server reports that the tracked event failed or can no longer be
|
|
395
|
+
represented accurately, publish a terminal state and end the activity instead of
|
|
396
|
+
leaving stale progress visible.
|
|
397
|
+
|
|
398
|
+
```swift
|
|
399
|
+
func handleTerminalServerFailure(
|
|
400
|
+
_ activity: Activity<RideAttributes>,
|
|
401
|
+
message: String
|
|
402
|
+
) async {
|
|
403
|
+
let failedState = RideAttributes.ContentState(
|
|
404
|
+
driverName: activity.content.state.driverName,
|
|
405
|
+
driverPhoto: activity.content.state.driverPhoto,
|
|
406
|
+
vehicleDescription: message,
|
|
407
|
+
etaStartSeconds: Int(Date().timeIntervalSince1970),
|
|
408
|
+
etaEndSeconds: Int(Date().timeIntervalSince1970),
|
|
409
|
+
status: .failed,
|
|
410
|
+
distanceRemaining: 0
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
let content = ActivityContent(state: failedState, staleDate: nil, relevanceScore: 0)
|
|
414
|
+
await activity.end(content, dismissalPolicy: .immediate)
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
345
418
|
### Ending All Activities (cleanup on sign-out)
|
|
346
419
|
|
|
347
420
|
```swift
|
|
@@ -364,7 +437,7 @@ struct RideActivityWidget: Widget {
|
|
|
364
437
|
DynamicIsland {
|
|
365
438
|
// EXPANDED: shown on long-press
|
|
366
439
|
DynamicIslandExpandedRegion(.leading) {
|
|
367
|
-
VStack(alignment: .leading
|
|
440
|
+
VStack(alignment: .leading) {
|
|
368
441
|
Image(systemName: context.state.driverPhoto)
|
|
369
442
|
.font(.title2)
|
|
370
443
|
Text(context.state.driverName)
|
|
@@ -374,8 +447,8 @@ struct RideActivityWidget: Widget {
|
|
|
374
447
|
}
|
|
375
448
|
|
|
376
449
|
DynamicIslandExpandedRegion(.trailing) {
|
|
377
|
-
VStack(alignment: .trailing
|
|
378
|
-
Text(timerInterval: context.state.
|
|
450
|
+
VStack(alignment: .trailing) {
|
|
451
|
+
Text(timerInterval: context.state.etaRange, countsDown: true)
|
|
379
452
|
.font(.title3.monospacedDigit())
|
|
380
453
|
Text(String(format: "%.1f mi", context.state.distanceRemaining))
|
|
381
454
|
.font(.caption2)
|
|
@@ -390,7 +463,7 @@ struct RideActivityWidget: Widget {
|
|
|
390
463
|
}
|
|
391
464
|
|
|
392
465
|
DynamicIslandExpandedRegion(.bottom) {
|
|
393
|
-
VStack
|
|
466
|
+
VStack {
|
|
394
467
|
ProgressView(
|
|
395
468
|
value: context.state.status.progress,
|
|
396
469
|
total: 1.0
|
|
@@ -415,7 +488,7 @@ struct RideActivityWidget: Widget {
|
|
|
415
488
|
.foregroundStyle(.green)
|
|
416
489
|
} compactTrailing: {
|
|
417
490
|
// COMPACT TRAILING: one key value
|
|
418
|
-
Text(timerInterval: context.state.
|
|
491
|
+
Text(timerInterval: context.state.etaRange, countsDown: true)
|
|
419
492
|
.frame(width: 44)
|
|
420
493
|
.monospacedDigit()
|
|
421
494
|
} minimal: {
|
|
@@ -436,7 +509,7 @@ struct RideLockScreenView: View {
|
|
|
436
509
|
let context: ActivityViewContext<RideAttributes>
|
|
437
510
|
|
|
438
511
|
var body: some View {
|
|
439
|
-
VStack
|
|
512
|
+
VStack {
|
|
440
513
|
// Header
|
|
441
514
|
HStack {
|
|
442
515
|
VStack(alignment: .leading) {
|
|
@@ -448,7 +521,7 @@ struct RideLockScreenView: View {
|
|
|
448
521
|
}
|
|
449
522
|
Spacer()
|
|
450
523
|
// Live countdown timer (auto-updating, no code needed)
|
|
451
|
-
Text(timerInterval: context.state.
|
|
524
|
+
Text(timerInterval: context.state.etaRange, countsDown: true)
|
|
452
525
|
.font(.title2.monospacedDigit().bold())
|
|
453
526
|
.foregroundStyle(.green)
|
|
454
527
|
}
|
|
@@ -555,7 +628,7 @@ func observeActivityState(_ activity: Activity<RideAttributes>) {
|
|
|
555
628
|
// iOS 26+: scheduled but not yet displayed
|
|
556
629
|
print("Activity is pending start")
|
|
557
630
|
case .stale:
|
|
558
|
-
//
|
|
631
|
+
// iOS 16.2+: staleDate passed without an update
|
|
559
632
|
print("Content is stale -- update or end")
|
|
560
633
|
case .ended:
|
|
561
634
|
// Ended but may still be visible on Lock Screen
|
|
@@ -601,7 +674,8 @@ func observePushToken(for activity: Activity<RideAttributes>) {
|
|
|
601
674
|
}
|
|
602
675
|
}
|
|
603
676
|
|
|
604
|
-
/// Observe the push-to-start token for remote activity creation (iOS 17.2+)
|
|
677
|
+
/// Observe the ActivityKit push-to-start token for remote activity creation (iOS 17.2+).
|
|
678
|
+
/// This token is distinct from ordinary app/device APNs tokens and per-activity update tokens.
|
|
605
679
|
func observePushToStartToken() {
|
|
606
680
|
Task {
|
|
607
681
|
for await token in Activity<RideAttributes>.pushToStartTokenUpdates {
|
|
@@ -620,13 +694,11 @@ Live Activities in Settings at any time.
|
|
|
620
694
|
```swift
|
|
621
695
|
func checkLiveActivityAuthorization() async -> Bool {
|
|
622
696
|
let authInfo = ActivityAuthorizationInfo()
|
|
697
|
+
return authInfo.areActivitiesEnabled
|
|
698
|
+
}
|
|
623
699
|
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
return false
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
return true
|
|
700
|
+
func checkFrequentPushAuthorization() -> Bool {
|
|
701
|
+
ActivityAuthorizationInfo().frequentPushesEnabled
|
|
630
702
|
}
|
|
631
703
|
|
|
632
704
|
/// Observe authorization changes to react when user toggles the setting
|
|
@@ -635,14 +707,19 @@ func observeAuthorization() {
|
|
|
635
707
|
let authInfo = ActivityAuthorizationInfo()
|
|
636
708
|
for await enabled in authInfo.activityEnablementUpdates {
|
|
637
709
|
if enabled {
|
|
638
|
-
// Re-register push-to-start token
|
|
639
710
|
observePushToStartToken()
|
|
640
711
|
} else {
|
|
641
|
-
// Inform server to stop sending push updates
|
|
642
712
|
try? await ServerAPI.shared.disableActivityPush()
|
|
643
713
|
}
|
|
644
714
|
}
|
|
645
715
|
}
|
|
716
|
+
|
|
717
|
+
Task {
|
|
718
|
+
let authInfo = ActivityAuthorizationInfo()
|
|
719
|
+
for await frequentPushesEnabled in authInfo.frequentPushEnablementUpdates {
|
|
720
|
+
try? await ServerAPI.shared.setFrequentPushesEnabled(frequentPushesEnabled)
|
|
721
|
+
}
|
|
722
|
+
}
|
|
646
723
|
}
|
|
647
724
|
```
|
|
648
725
|
|
|
@@ -666,7 +743,7 @@ func startActivitySafely(
|
|
|
666
743
|
// User disabled Live Activities in Settings
|
|
667
744
|
print("Live Activities disabled by user")
|
|
668
745
|
case .globalMaximumExceeded:
|
|
669
|
-
//
|
|
746
|
+
// Device-level ongoing Live Activity maximum reached
|
|
670
747
|
print("System-wide activity limit reached")
|
|
671
748
|
case .targetMaximumExceeded:
|
|
672
749
|
// Too many Live Activities for this app
|
|
@@ -683,9 +760,10 @@ func startActivitySafely(
|
|
|
683
760
|
## Background Handling Considerations
|
|
684
761
|
|
|
685
762
|
Live Activities continue to display when the app is backgrounded or suspended.
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
763
|
+
The Live Activity UI runs in a widget extension sandbox and cannot fetch network
|
|
764
|
+
data or receive location updates directly. Push-to-update is the primary
|
|
765
|
+
mechanism for background updates. When the app returns to foreground, reconcile
|
|
766
|
+
local state with the activity's current content.
|
|
689
767
|
|
|
690
768
|
```swift
|
|
691
769
|
@MainActor
|
|
@@ -731,17 +809,17 @@ func handleAppBecameActive() {
|
|
|
731
809
|
```
|
|
732
810
|
|
|
733
811
|
For truly background-driven updates, rely on push-to-update rather than
|
|
734
|
-
Background App Refresh. Push updates
|
|
735
|
-
|
|
736
|
-
|
|
812
|
+
Background App Refresh. Push updates can arrive while the app is suspended, but
|
|
813
|
+
APNs delivery, priority, budget, and throttling still apply; use `staleDate` and
|
|
814
|
+
foreground reconciliation for missed updates.
|
|
737
815
|
|
|
738
816
|
## Testing in Simulator and on Device
|
|
739
817
|
|
|
740
818
|
### Simulator
|
|
741
819
|
|
|
742
820
|
The Simulator supports Live Activity rendering on the Lock Screen and displays
|
|
743
|
-
the Dynamic Island on
|
|
744
|
-
rapid iteration:
|
|
821
|
+
the Dynamic Island on simulator models that include Dynamic Island. Use Xcode
|
|
822
|
+
previews for rapid iteration:
|
|
745
823
|
|
|
746
824
|
```swift
|
|
747
825
|
#Preview("Lock Screen", as: .content, using: RideAttributes.preview) {
|
|
@@ -751,7 +829,8 @@ rapid iteration:
|
|
|
751
829
|
driverName: "Alex",
|
|
752
830
|
driverPhoto: "car.fill",
|
|
753
831
|
vehicleDescription: "White Toyota Camry",
|
|
754
|
-
|
|
832
|
+
etaStartSeconds: Int(Date().timeIntervalSince1970),
|
|
833
|
+
etaEndSeconds: Int(Date().addingTimeInterval(300).timeIntervalSince1970),
|
|
755
834
|
status: .driverEnRoute,
|
|
756
835
|
distanceRemaining: 1.5
|
|
757
836
|
)
|
|
@@ -759,7 +838,8 @@ rapid iteration:
|
|
|
759
838
|
driverName: "Alex",
|
|
760
839
|
driverPhoto: "car.fill",
|
|
761
840
|
vehicleDescription: "White Toyota Camry",
|
|
762
|
-
|
|
841
|
+
etaStartSeconds: Int(Date().timeIntervalSince1970),
|
|
842
|
+
etaEndSeconds: Int(Date().addingTimeInterval(60).timeIntervalSince1970),
|
|
763
843
|
status: .arriving,
|
|
764
844
|
distanceRemaining: 0.1
|
|
765
845
|
)
|
|
@@ -772,7 +852,8 @@ rapid iteration:
|
|
|
772
852
|
driverName: "Alex",
|
|
773
853
|
driverPhoto: "car.fill",
|
|
774
854
|
vehicleDescription: "White Toyota Camry",
|
|
775
|
-
|
|
855
|
+
etaStartSeconds: Int(Date().timeIntervalSince1970),
|
|
856
|
+
etaEndSeconds: Int(Date().addingTimeInterval(300).timeIntervalSince1970),
|
|
776
857
|
status: .driverEnRoute,
|
|
777
858
|
distanceRemaining: 1.5
|
|
778
859
|
)
|
|
@@ -785,7 +866,8 @@ rapid iteration:
|
|
|
785
866
|
driverName: "Alex",
|
|
786
867
|
driverPhoto: "car.fill",
|
|
787
868
|
vehicleDescription: "White Toyota Camry",
|
|
788
|
-
|
|
869
|
+
etaStartSeconds: Int(Date().timeIntervalSince1970),
|
|
870
|
+
etaEndSeconds: Int(Date().addingTimeInterval(300).timeIntervalSince1970),
|
|
789
871
|
status: .driverEnRoute,
|
|
790
872
|
distanceRemaining: 1.5
|
|
791
873
|
)
|
|
@@ -798,7 +880,8 @@ rapid iteration:
|
|
|
798
880
|
driverName: "Alex",
|
|
799
881
|
driverPhoto: "car.fill",
|
|
800
882
|
vehicleDescription: "White Toyota Camry",
|
|
801
|
-
|
|
883
|
+
etaStartSeconds: Int(Date().timeIntervalSince1970),
|
|
884
|
+
etaEndSeconds: Int(Date().addingTimeInterval(300).timeIntervalSince1970),
|
|
802
885
|
status: .driverEnRoute,
|
|
803
886
|
distanceRemaining: 1.5
|
|
804
887
|
)
|
|
@@ -833,15 +916,16 @@ curl -v \
|
|
|
833
916
|
--header "apns-topic: com.example.app.push-type.liveactivity" \
|
|
834
917
|
--header "apns-priority: 10" \
|
|
835
918
|
--header "authorization: bearer $JWT_TOKEN" \
|
|
836
|
-
--data '{"aps":{"timestamp":1700000000,"event":"update","content-state":{"driverName":"Alex","driverPhoto":"car.fill","vehicleDescription":"White Toyota Camry","
|
|
919
|
+
--data '{"aps":{"timestamp":1700000000,"event":"update","content-state":{"driverName":"Alex","driverPhoto":"car.fill","vehicleDescription":"White Toyota Camry","etaStartSeconds":1700000000,"etaEndSeconds":1700000300,"status":"driverArrived","distanceRemaining":0.0},"alert":{"title":"Driver Arrived","body":"Your driver is here!"}}}' \
|
|
837
920
|
https://api.push.apple.com/3/device/$DEVICE_PUSH_TOKEN
|
|
838
921
|
```
|
|
839
922
|
|
|
840
923
|
### Debugging Tips
|
|
841
924
|
|
|
842
925
|
- Check Console.app for `ActivityKit` log messages when activities fail to start.
|
|
843
|
-
- Verify `content-state` JSON keys match `ContentState`
|
|
844
|
-
|
|
926
|
+
- Verify `content-state` JSON keys match the default `ContentState` `Codable`
|
|
927
|
+
shape or coordinated `CodingKeys`. Mismatches can prevent ActivityKit from
|
|
928
|
+
applying updates.
|
|
845
929
|
- Use `Activity<T>.activities` to inspect all running activities in the debugger.
|
|
846
930
|
- Set a breakpoint in `pushTokenUpdates` to verify tokens are being delivered.
|
|
847
931
|
- If activities do not appear, confirm `NSSupportsLiveActivities = YES` is in
|
|
@@ -852,7 +936,7 @@ curl -v \
|
|
|
852
936
|
| Key | Value | Purpose |
|
|
853
937
|
|---|---|---|
|
|
854
938
|
| `NSSupportsLiveActivities` | `YES` | Enable Live Activities (required) |
|
|
855
|
-
| `NSSupportsLiveActivitiesFrequentUpdates` | `YES` | Increase push update budget |
|
|
939
|
+
| `NSSupportsLiveActivitiesFrequentUpdates` | `YES` | Increase the system-managed push update budget |
|
|
856
940
|
|
|
857
941
|
Both keys belong in the host app's Info.plist, not the widget extension.
|
|
858
942
|
|
|
@@ -866,3 +950,4 @@ Both keys belong in the host app's Info.plist, not the widget extension.
|
|
|
866
950
|
- [DynamicIsland](https://sosumi.ai/documentation/widgetkit/dynamicisland)
|
|
867
951
|
- [ActivityConfiguration](https://sosumi.ai/documentation/widgetkit/activityconfiguration)
|
|
868
952
|
- [Starting and updating with push notifications](https://sosumi.ai/documentation/activitykit/starting-and-updating-live-activities-with-activitykit-push-notifications)
|
|
953
|
+
- [Sending broadcast push notifications](https://sosumi.ai/documentation/usernotifications/sending-broadcast-push-notification-requests-to-apns)
|
|
@@ -3,15 +3,17 @@ name: mapkit-location
|
|
|
3
3
|
description: "Implement, review, or improve maps and location features in iOS/macOS apps using MapKit and CoreLocation. Use when working with Map views, annotations, markers, polylines, user location tracking, geocoding, reverse geocoding, search/autocomplete, directions and routes, geofencing, region monitoring, CLLocationUpdate async streams, or location authorization flows. Also use when working with maps, coordinates, addresses, places, directions, distance calculations, or location-based features in Swift apps."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# MapKit
|
|
6
|
+
# MapKit
|
|
7
7
|
|
|
8
8
|
Build map-based and location-aware features targeting iOS 17+ with SwiftUI
|
|
9
9
|
MapKit and modern CoreLocation async APIs. Use `Map` with `MapContentBuilder`
|
|
10
10
|
for views, `CLLocationUpdate.liveUpdates()` for streaming location, and
|
|
11
11
|
`CLMonitor` for geofencing.
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
Read [references/mapkit-patterns.md](references/mapkit-patterns.md) when you need full map setup, search,
|
|
14
|
+
routes, Look Around, snapshots, or iOS 26 place APIs. Read
|
|
15
|
+
[references/mapkit-corelocation-patterns.md](references/mapkit-corelocation-patterns.md) when the task involves
|
|
16
|
+
location update lifecycle, geofencing, background location, testing, or privacy keys.
|
|
15
17
|
|
|
16
18
|
## Contents
|
|
17
19
|
|
|
@@ -195,25 +197,36 @@ Map(selection: $selectedMarker) {
|
|
|
195
197
|
|
|
196
198
|
Replace `CLLocationManagerDelegate` callbacks with a single async sequence.
|
|
197
199
|
Each iteration yields a `CLLocationUpdate` containing an optional `CLLocation`.
|
|
200
|
+
On iOS 18+, handle diagnostic states such as denied authorization, globally
|
|
201
|
+
disabled Location Services, unavailable location, and insufficient in-use
|
|
202
|
+
conditions with a visible degraded path instead of silently waiting forever.
|
|
203
|
+
Store the task so the feature can cancel it, and reject invalid, inaccurate,
|
|
204
|
+
stale, or unusable movement data before driving map UI or background work.
|
|
198
205
|
|
|
199
206
|
```swift
|
|
200
207
|
import CoreLocation
|
|
201
208
|
|
|
209
|
+
@MainActor
|
|
202
210
|
@Observable
|
|
203
|
-
final class LocationTracker
|
|
211
|
+
final class LocationTracker {
|
|
204
212
|
var currentLocation: CLLocation?
|
|
205
213
|
private var updateTask: Task<Void, Never>?
|
|
206
214
|
|
|
207
215
|
func startTracking() {
|
|
208
216
|
updateTask = Task {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
217
|
+
do {
|
|
218
|
+
let updates = CLLocationUpdate.liveUpdates()
|
|
219
|
+
for try await update in updates {
|
|
220
|
+
guard let location = update.location else { continue }
|
|
221
|
+
// Filter by horizontal accuracy
|
|
222
|
+
guard location.horizontalAccuracy >= 0,
|
|
223
|
+
location.horizontalAccuracy < 50 else { continue }
|
|
224
|
+
currentLocation = location
|
|
216
225
|
}
|
|
226
|
+
} catch is CancellationError {
|
|
227
|
+
// Expected when tracking stops.
|
|
228
|
+
} catch {
|
|
229
|
+
currentLocation = nil
|
|
217
230
|
}
|
|
218
231
|
}
|
|
219
232
|
}
|
|
@@ -411,10 +424,9 @@ func getETA(from source: MKMapItem, to destination: MKMapItem) async throws -> T
|
|
|
411
424
|
}
|
|
412
425
|
```
|
|
413
426
|
|
|
414
|
-
### Cycling Directions (iOS
|
|
427
|
+
### Cycling Directions (iOS 14+)
|
|
415
428
|
|
|
416
429
|
```swift
|
|
417
|
-
@available(iOS 26, *)
|
|
418
430
|
func getCyclingDirections(to destination: MKMapItem) async throws -> MKRoute? {
|
|
419
431
|
let request = MKDirections.Request()
|
|
420
432
|
request.source = MKMapItem.forCurrentLocation()
|
|
@@ -432,6 +444,8 @@ Create rich place references from coordinates or addresses without needing a
|
|
|
432
444
|
Place ID. Requires `import GeoToolbox`.
|
|
433
445
|
|
|
434
446
|
```swift
|
|
447
|
+
import GeoToolbox
|
|
448
|
+
|
|
435
449
|
@available(iOS 26, *)
|
|
436
450
|
func lookupPlace(name: String, coordinate: CLLocationCoordinate2D) async throws -> MKMapItem {
|
|
437
451
|
let descriptor = PlaceDescriptor(
|
|
@@ -445,16 +459,21 @@ func lookupPlace(name: String, coordinate: CLLocationCoordinate2D) async throws
|
|
|
445
459
|
|
|
446
460
|
## Common Mistakes
|
|
447
461
|
|
|
448
|
-
**DON'T:** Request
|
|
449
|
-
**DO:** Start with
|
|
462
|
+
**DON'T:** Request always authorization upfront.
|
|
463
|
+
**DO:** Start with when-in-use authorization. On iOS 18+, hold a `CLServiceSession`
|
|
464
|
+
for the feature lifetime; request `.always` only for background features that
|
|
465
|
+
need system relaunch after termination.
|
|
450
466
|
|
|
451
467
|
**DON'T:** Use `CLLocationManagerDelegate` for simple location fetches on iOS 17+.
|
|
452
468
|
**DO:** Use `CLLocationUpdate.liveUpdates()` async stream for cleaner, more concise code.
|
|
453
469
|
|
|
454
|
-
**DON'T:**
|
|
455
|
-
**DO:**
|
|
470
|
+
**DON'T:** Ignore `CLLocationUpdate` diagnostics such as denied, globally denied, or unavailable location.
|
|
471
|
+
**DO:** Stop or degrade the feature, show recovery UI such as Settings guidance, and keep search/manual flows usable.
|
|
472
|
+
|
|
473
|
+
**DON'T:** Let `liveUpdates()` run from an unowned task after the map/view is gone.
|
|
474
|
+
**DO:** Store the `Task`, cancel it when the feature stops, and filter invalid, inaccurate, stale, or impossible movement fixes.
|
|
456
475
|
|
|
457
|
-
**DON'T:** Force-unwrap `CLPlacemark` properties
|
|
476
|
+
**DON'T:** Force-unwrap `CLPlacemark` properties - they are all optional.
|
|
458
477
|
**DO:** Use nil-coalescing: `placemark.locality ?? "Unknown"`.
|
|
459
478
|
|
|
460
479
|
**DON'T:** Fire `MKLocalSearchCompleter` queries on every keystroke.
|
|
@@ -463,7 +482,7 @@ func lookupPlace(name: String, coordinate: CLLocationCoordinate2D) async throws
|
|
|
463
482
|
**DON'T:** Silently fail when location authorization is denied.
|
|
464
483
|
**DO:** Detect `.denied` status and show an alert with a Settings deep link.
|
|
465
484
|
|
|
466
|
-
**DON'T:** Assume geocoding always succeeds
|
|
485
|
+
**DON'T:** Assume geocoding always succeeds - handle empty results and network errors.
|
|
467
486
|
|
|
468
487
|
## Review Checklist
|
|
469
488
|
|
|
@@ -481,5 +500,5 @@ func lookupPlace(name: String, coordinate: CLLocationCoordinate2D) async throws
|
|
|
481
500
|
|
|
482
501
|
## References
|
|
483
502
|
|
|
484
|
-
-
|
|
485
|
-
-
|
|
503
|
+
- [references/mapkit-patterns.md](references/mapkit-patterns.md) - Map setup, annotations, search, routes, clustering, Look Around, snapshots.
|
|
504
|
+
- [references/mapkit-corelocation-patterns.md](references/mapkit-corelocation-patterns.md) - CLLocationUpdate, CLMonitor, CLServiceSession, background location, testing.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "mapkit",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 0,
|
|
6
|
+
"prompt": "I'm building a SwiftUI store locator for iOS 18. Sketch the MapKit implementation for a searchable map with autocomplete, markers for results, marker selection that shows details, a route overlay to the selected store, and a user-location button. Include the privacy and cancellation details that matter.",
|
|
7
|
+
"expected_output": "A SwiftUI MapKit implementation plan that uses Map, Marker or Annotation, MapCameraPosition, MKLocalSearchCompleter plus MKLocalSearch, Map selection tags, MKDirections and MapPolyline, UserAnnotation or MapUserLocationButton, and CoreLocation authorization/task cancellation guidance.",
|
|
8
|
+
"files": [],
|
|
9
|
+
"expectations": [
|
|
10
|
+
"Uses SwiftUI MapKit APIs such as Map, Marker or Annotation, MapCameraPosition, map controls, and MapPolyline rather than defaulting to MKMapView.",
|
|
11
|
+
"Describes MKLocalSearchCompleter for autocomplete and MKLocalSearch.Request(completion:) or naturalLanguageQuery for full search results, with debounced input.",
|
|
12
|
+
"Handles map selection with a binding and tags whose type matches the selected value.",
|
|
13
|
+
"Builds directions with MKDirections.Request and displays the selected route with MapPolyline(route.polyline).",
|
|
14
|
+
"Includes NSLocationWhenInUseUsageDescription and a denied-location UI path such as a Settings deep link.",
|
|
15
|
+
"Cancels or scopes live location/search tasks to the view lifecycle and avoids running location updates indefinitely."
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 1,
|
|
20
|
+
"prompt": "Review this location feature plan: create a CLMonitor every time the view appears, monitor 45 circular regions for coupons, request Always location on launch, start liveUpdates forever, and use background location without a Live Activity or CLBackgroundActivitySession. What should I change for iOS 18+?",
|
|
21
|
+
"expected_output": "A correction-focused CoreLocation review that uses CLServiceSession only for active user-facing features, limits CLMonitor conditions, keeps monitor/event subscriptions stable, uses CLLocationUpdate.liveUpdates with filtering and cancellation, and explains the background-location requirements.",
|
|
22
|
+
"files": [],
|
|
23
|
+
"expectations": [
|
|
24
|
+
"Rejects requesting Always authorization on launch and recommends when-in-use first, with CLServiceSession scoped to the feature lifetime on iOS 18+.",
|
|
25
|
+
"States that CLMonitor condition monitoring is limited to 20 conditions per app and the app must prioritize or rotate regions.",
|
|
26
|
+
"Warns against rapidly recreating CLMonitor instances with the same name and recommends a long-lived monitor plus add/remove diffing.",
|
|
27
|
+
"Uses CLLocationUpdate.liveUpdates() as an async sequence and filters invalid or inaccurate locations while cancelling the task when not needed.",
|
|
28
|
+
"Explains that background updates require the Location updates background mode and either a CLBackgroundActivitySession or Live Activity, with active update or monitor subscriptions.",
|
|
29
|
+
"Mentions handling denied/global-denied/location-unavailable diagnostics or degraded behavior instead of silently failing."
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": 2,
|
|
34
|
+
"prompt": "I need a navigation experience that shows a map inside CarPlay, opens a small App Clip from a place card, and pairs a BLE beacon when the user enters a geofence. Which parts belong in this MapKit skill, and where should the other pieces go?",
|
|
35
|
+
"expected_output": "A boundary-aware answer that keeps MapKit/CoreLocation responsibilities in scope while routing CarPlay templates, App Clip invocation, and BLE accessory setup to the appropriate sibling skills or frameworks.",
|
|
36
|
+
"files": [],
|
|
37
|
+
"expectations": [
|
|
38
|
+
"Keeps MapKit/CoreLocation scope to maps, annotations, routes, geocoding/search, user location, CLMonitor geofencing, and background location constraints.",
|
|
39
|
+
"Routes CarPlay map templates, navigation alerts, and CarPlay-specific UI to the CarPlay skill or CarPlay framework guidance.",
|
|
40
|
+
"Routes App Clip invocation, size limits, and handoff behavior to the App Clips skill.",
|
|
41
|
+
"Routes BLE beacon pairing or accessory onboarding to Core Bluetooth or AccessorySetupKit rather than expanding MapKit scope.",
|
|
42
|
+
"Does not claim MapKit handles CarPlay templates, App Clip launch infrastructure, or BLE pairing directly.",
|
|
43
|
+
"Still explains the handoff points between geofence events, routes/search results, and the adjacent frameworks."
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|