@mmerterden/multi-agent-pipeline 8.6.0
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 +2623 -0
- package/LICENSE +21 -0
- package/README.md +852 -0
- package/docs/FIGMA_PIPELINE.md +138 -0
- package/docs/GENERICITY-REVIEW.md +277 -0
- package/docs/STABILITY-FIX-PLAN.md +168 -0
- package/docs/adr/0001-three-model-triage.md +81 -0
- package/docs/adr/0002-instruction-driven-flag.md +62 -0
- package/docs/adr/0003-unified-shared-skills.md +55 -0
- package/docs/adr/0004-zero-dependency-philosophy.md +60 -0
- package/docs/adr/0005-lazy-phase-docs.md +68 -0
- package/docs/adr/0006-skills-core-external-split.md +52 -0
- package/docs/adr/0007-multi-tool-adapter-framework.md +110 -0
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +98 -0
- package/docs/adr/README.md +33 -0
- package/docs/architecture.md +181 -0
- package/docs/best-practices.md +93 -0
- package/docs/features.md +274 -0
- package/docs/performance.md +116 -0
- package/docs/recovery-guide.md +479 -0
- package/index.js +76 -0
- package/install/_adapters.mjs +69 -0
- package/install/_common.mjs +150 -0
- package/install/_copilot-instructions.mjs +32 -0
- package/install/_dev-only-files.mjs +23 -0
- package/install/_platform-filter.mjs +132 -0
- package/install/_telemetry.mjs +79 -0
- package/install/claude.mjs +332 -0
- package/install/copilot.mjs +254 -0
- package/install/index.mjs +179 -0
- package/install/templates/copilot-instructions.md +319 -0
- package/install.js +24 -0
- package/package.json +78 -0
- package/pipeline/adapters/_base.mjs +288 -0
- package/pipeline/adapters/copilot-chat.mjs +158 -0
- package/pipeline/adapters/cursor.mjs +187 -0
- package/pipeline/agents/android-architect.md +42 -0
- package/pipeline/agents/backend-architect.md +43 -0
- package/pipeline/agents/code-reviewer.md +57 -0
- package/pipeline/agents/dev-critic.md +148 -0
- package/pipeline/agents/explorer.md +34 -0
- package/pipeline/agents/ios-architect.md +41 -0
- package/pipeline/agents/security-auditor.md +98 -0
- package/pipeline/agents/task-clarifier.md +113 -0
- package/pipeline/claude-md-template.md +55 -0
- package/pipeline/commands/archive-guard.md +45 -0
- package/pipeline/commands/deploy.md +54 -0
- package/pipeline/commands/figma-to-swiftui.md +295 -0
- package/pipeline/commands/multi-agent/_account-picker.md +90 -0
- package/pipeline/commands/multi-agent/_dev-context.md +111 -0
- package/pipeline/commands/multi-agent/_input-parser.md +43 -0
- package/pipeline/commands/multi-agent/_repo-picker.md +76 -0
- package/pipeline/commands/multi-agent/autopilot.md +116 -0
- package/pipeline/commands/multi-agent/channels.md +465 -0
- package/pipeline/commands/multi-agent/delete.md +66 -0
- package/pipeline/commands/multi-agent/dev-autopilot.md +120 -0
- package/pipeline/commands/multi-agent/dev-local-autopilot.md +110 -0
- package/pipeline/commands/multi-agent/dev-local.md +105 -0
- package/pipeline/commands/multi-agent/dev.md +246 -0
- package/pipeline/commands/multi-agent/diff-explain.md +68 -0
- package/pipeline/commands/multi-agent/help.md +422 -0
- package/pipeline/commands/multi-agent/issue.md +79 -0
- package/pipeline/commands/multi-agent/jira.md +132 -0
- package/pipeline/commands/multi-agent/kill.md +38 -0
- package/pipeline/commands/multi-agent/language.md +94 -0
- package/pipeline/commands/multi-agent/local-autopilot.md +139 -0
- package/pipeline/commands/multi-agent/local.md +117 -0
- package/pipeline/commands/multi-agent/log.md +25 -0
- package/pipeline/commands/multi-agent/manual-test.md +43 -0
- package/pipeline/commands/multi-agent/purge.md +39 -0
- package/pipeline/commands/multi-agent/refactor.md +188 -0
- package/pipeline/commands/multi-agent/refs/android-guide.md +250 -0
- package/pipeline/commands/multi-agent/refs/audit-guide.md +240 -0
- package/pipeline/commands/multi-agent/refs/backend-guide.md +135 -0
- package/pipeline/commands/multi-agent/refs/channels/confluence.md +153 -0
- package/pipeline/commands/multi-agent/refs/channels/issue-comment.md +141 -0
- package/pipeline/commands/multi-agent/refs/channels/jira.md +127 -0
- package/pipeline/commands/multi-agent/refs/channels/pr-review-actions.md +135 -0
- package/pipeline/commands/multi-agent/refs/channels/pr.md +139 -0
- package/pipeline/commands/multi-agent/refs/channels/wiki.md +66 -0
- package/pipeline/commands/multi-agent/refs/component-dispatch.md +92 -0
- package/pipeline/commands/multi-agent/refs/cross-cli-contract.md +326 -0
- package/pipeline/commands/multi-agent/refs/frontend-guide.md +136 -0
- package/pipeline/commands/multi-agent/refs/issue-jira-triad.md +104 -0
- package/pipeline/commands/multi-agent/refs/keychain.md +80 -0
- package/pipeline/commands/multi-agent/refs/knowledge.md +112 -0
- package/pipeline/commands/multi-agent/refs/multi-repo-integration-build.md +207 -0
- package/pipeline/commands/multi-agent/refs/phases/log-format.md +89 -0
- package/pipeline/commands/multi-agent/refs/phases/modes.md +156 -0
- package/pipeline/commands/multi-agent/refs/phases/operations.md +91 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-0-init.md +481 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-1-analysis.md +264 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-2-planning.md +278 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-3-dev.md +364 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +378 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-5-test.md +129 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-6-commit.md +339 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-7-report.md +361 -0
- package/pipeline/commands/multi-agent/refs/phases.md +187 -0
- package/pipeline/commands/multi-agent/refs/progress-contract.md +155 -0
- package/pipeline/commands/multi-agent/refs/rules.md +189 -0
- package/pipeline/commands/multi-agent/refs/swiftui-guide.md +254 -0
- package/pipeline/commands/multi-agent/refs/tracker-contract.md +256 -0
- package/pipeline/commands/multi-agent/refs/wiki-capture.md +109 -0
- package/pipeline/commands/multi-agent/resume.md +28 -0
- package/pipeline/commands/multi-agent/review.md +228 -0
- package/pipeline/commands/multi-agent/scan.md +74 -0
- package/pipeline/commands/multi-agent/search.md +97 -0
- package/pipeline/commands/multi-agent/setup.md +767 -0
- package/pipeline/commands/multi-agent/stack.md +48 -0
- package/pipeline/commands/multi-agent/status.md +38 -0
- package/pipeline/commands/multi-agent/sync.md +319 -0
- package/pipeline/commands/multi-agent/test.md +39 -0
- package/pipeline/commands/multi-agent/update.md +88 -0
- package/pipeline/commands/multi-agent.md +293 -0
- package/pipeline/commands/security-review.md +6 -0
- package/pipeline/commands/sim-test.md +256 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +25 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +30 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +20 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +15 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +12 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +43 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +35 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +35 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +12 -0
- package/pipeline/eval/golden-tasks/README.md +65 -0
- package/pipeline/eval/triage/01-empty-findings/expected.json +6 -0
- package/pipeline/eval/triage/01-empty-findings/input.json +5 -0
- package/pipeline/eval/triage/01-empty-findings/notes.md +7 -0
- package/pipeline/eval/triage/02-real-blocker/expected.json +15 -0
- package/pipeline/eval/triage/02-real-blocker/input.json +14 -0
- package/pipeline/eval/triage/02-real-blocker/notes.md +7 -0
- package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +18 -0
- package/pipeline/eval/triage/03-out-of-scope-defer/input.json +14 -0
- package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +10 -0
- package/pipeline/eval/triage/04-false-positive-reject/expected.json +18 -0
- package/pipeline/eval/triage/04-false-positive-reject/input.json +14 -0
- package/pipeline/eval/triage/04-false-positive-reject/notes.md +10 -0
- package/pipeline/eval/triage/05-mixed-classification/expected.json +43 -0
- package/pipeline/eval/triage/05-mixed-classification/input.json +38 -0
- package/pipeline/eval/triage/05-mixed-classification/notes.md +17 -0
- package/pipeline/eval/triage/06-severity-mismatch/expected.json +15 -0
- package/pipeline/eval/triage/06-severity-mismatch/input.json +14 -0
- package/pipeline/eval/triage/06-severity-mismatch/notes.md +9 -0
- package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +27 -0
- package/pipeline/eval/triage/07-duplicate-reviewers/input.json +22 -0
- package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +9 -0
- package/pipeline/eval/triage/08-style-misclassified/expected.json +18 -0
- package/pipeline/eval/triage/08-style-misclassified/input.json +14 -0
- package/pipeline/eval/triage/08-style-misclassified/notes.md +9 -0
- package/pipeline/eval/triage/09-cascading-finding/expected.json +23 -0
- package/pipeline/eval/triage/09-cascading-finding/input.json +22 -0
- package/pipeline/eval/triage/09-cascading-finding/notes.md +9 -0
- package/pipeline/eval/triage/10-deferred-crossref/expected.json +18 -0
- package/pipeline/eval/triage/10-deferred-crossref/input.json +14 -0
- package/pipeline/eval/triage/10-deferred-crossref/notes.md +9 -0
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +27 -0
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +22 -0
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +14 -0
- package/pipeline/eval/triage/README.md +54 -0
- package/pipeline/lib/account-resolver.sh +204 -0
- package/pipeline/lib/channels-multi-repo.sh +218 -0
- package/pipeline/lib/context-link-extractor.sh +192 -0
- package/pipeline/lib/credential-store-resolver.sh +57 -0
- package/pipeline/lib/credential-store.sh +226 -0
- package/pipeline/lib/fetch-confluence.sh +358 -0
- package/pipeline/lib/fetch-crashlytics.sh +314 -0
- package/pipeline/lib/fetch-fortify.sh +321 -0
- package/pipeline/lib/fetch-swagger.sh +270 -0
- package/pipeline/lib/issue-fetcher.sh +333 -0
- package/pipeline/lib/multi-repo-pipeline.sh +252 -0
- package/pipeline/lib/plan-todos.sh +284 -0
- package/pipeline/lib/post-pr-review.sh +374 -0
- package/pipeline/lib/repo-cache.sh +231 -0
- package/pipeline/lib/review-watch.sh +244 -0
- package/pipeline/lib/shadow-git.sh +222 -0
- package/pipeline/lib/submodule-detector.sh +177 -0
- package/pipeline/lib/vercel-deploy.sh +170 -0
- package/pipeline/preferences-template.json +132 -0
- package/pipeline/rules/app-store-guidelines.md +59 -0
- package/pipeline/rules/code-review.md +27 -0
- package/pipeline/rules/code-style.md +37 -0
- package/pipeline/rules/debugging.md +24 -0
- package/pipeline/rules/figma-pipeline.md +190 -0
- package/pipeline/rules/git-conventions.md +29 -0
- package/pipeline/rules/kotlin-android.md +92 -0
- package/pipeline/rules/performance.md +23 -0
- package/pipeline/rules/security.md +39 -0
- package/pipeline/rules/swiftui-qa.md +32 -0
- package/pipeline/rules/tdd.md +25 -0
- package/pipeline/rules/testing.md +37 -0
- package/pipeline/schemas/agent-state.schema.json +273 -0
- package/pipeline/schemas/analysis-output.schema.json +59 -0
- package/pipeline/schemas/clarify-output.schema.json +74 -0
- package/pipeline/schemas/dev-critic-output.schema.json +104 -0
- package/pipeline/schemas/diff-risk.schema.json +78 -0
- package/pipeline/schemas/figma-project-config.schema.json +372 -0
- package/pipeline/schemas/migrations/README.md +73 -0
- package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +112 -0
- package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +75 -0
- package/pipeline/schemas/migrations/prefs-2.1.0-to-2.2.0.mjs +64 -0
- package/pipeline/schemas/migrations/prefs-2.2.0-to-2.3.0.mjs +36 -0
- package/pipeline/schemas/migrations/state-2.0.0-to-2.1.0.mjs +34 -0
- package/pipeline/schemas/plan-todos.schema.json +62 -0
- package/pipeline/schemas/planning-output.schema.json +57 -0
- package/pipeline/schemas/prefs.schema.json +1137 -0
- package/pipeline/schemas/reviewer-output.schema.json +55 -0
- package/pipeline/schemas/test-gap.schema.json +64 -0
- package/pipeline/schemas/token-budget.json +17 -0
- package/pipeline/schemas/triage-corpus.schema.json +31 -0
- package/pipeline/schemas/triage-output.schema.json +115 -0
- package/pipeline/scripts/.last-figma-sync-plan.json +23 -0
- package/pipeline/scripts/README-figma-smokes.md +34 -0
- package/pipeline/scripts/README.md +104 -0
- package/pipeline/scripts/aggregate-metrics.mjs +310 -0
- package/pipeline/scripts/audit-log-rotate.sh +61 -0
- package/pipeline/scripts/audit-log.sh +69 -0
- package/pipeline/scripts/benchmark-phase-0.sh +128 -0
- package/pipeline/scripts/build-skills-index.mjs +139 -0
- package/pipeline/scripts/classify-plan-safety.mjs +177 -0
- package/pipeline/scripts/cost-table.json +27 -0
- package/pipeline/scripts/diff-explain.mjs +276 -0
- package/pipeline/scripts/diff-risk-score.mjs +328 -0
- package/pipeline/scripts/eval-golden-tasks-live.mjs +294 -0
- package/pipeline/scripts/eval-golden-tasks.mjs +223 -0
- package/pipeline/scripts/eval-triage.mjs +171 -0
- package/pipeline/scripts/figma-placeholder-map.json +191 -0
- package/pipeline/scripts/fixtures/diff-risk-android.diff +40 -0
- package/pipeline/scripts/fixtures/diff-risk-ios.diff +48 -0
- package/pipeline/scripts/fixtures/install-layout.tsv +16 -0
- package/pipeline/scripts/fixtures/test-gap-node.diff +30 -0
- package/pipeline/scripts/fixtures/test-gap-python.diff +32 -0
- package/pipeline/scripts/gen-mode-dispatch.mjs +170 -0
- package/pipeline/scripts/gen-skills-index.mjs +90 -0
- package/pipeline/scripts/github-ssh-setup.sh +103 -0
- package/pipeline/scripts/import-figma-skills.sh +253 -0
- package/pipeline/scripts/keychain-save.sh +74 -0
- package/pipeline/scripts/keychain.py +294 -0
- package/pipeline/scripts/log-metric.sh +98 -0
- package/pipeline/scripts/match-skills.mjs +167 -0
- package/pipeline/scripts/memory-load.sh +46 -0
- package/pipeline/scripts/memory-save.sh +76 -0
- package/pipeline/scripts/migrate-prefs.mjs +390 -0
- package/pipeline/scripts/migrate-state.mjs +215 -0
- package/pipeline/scripts/output-quality-check.sh +125 -0
- package/pipeline/scripts/phase-banner.sh +158 -0
- package/pipeline/scripts/phase-tracker.sh +548 -0
- package/pipeline/scripts/pre-commit-check.sh +69 -0
- package/pipeline/scripts/pre-push-check.sh +77 -0
- package/pipeline/scripts/render-agent-log-cost.sh +149 -0
- package/pipeline/scripts/render-cost-summary.sh +137 -0
- package/pipeline/scripts/render-work-summary.sh +195 -0
- package/pipeline/scripts/repo-map.mjs +367 -0
- package/pipeline/scripts/run-aggregator.mjs +298 -0
- package/pipeline/scripts/scan-skills.sh +332 -0
- package/pipeline/scripts/search-logs.sh +291 -0
- package/pipeline/scripts/sign-skills.sh +67 -0
- package/pipeline/scripts/smoke-adapters.sh +207 -0
- package/pipeline/scripts/smoke-add-detail.sh +137 -0
- package/pipeline/scripts/smoke-agent-log-cost.sh +183 -0
- package/pipeline/scripts/smoke-agent-model-routing.sh +87 -0
- package/pipeline/scripts/smoke-bitbucket-contract.sh +223 -0
- package/pipeline/scripts/smoke-channels-flow.sh +130 -0
- package/pipeline/scripts/smoke-ci-workflows.sh +88 -0
- package/pipeline/scripts/smoke-clarify.sh +148 -0
- package/pipeline/scripts/smoke-commands-skills-parity.sh +87 -0
- package/pipeline/scripts/smoke-compliance-skills.sh +119 -0
- package/pipeline/scripts/smoke-cost-summary.sh +139 -0
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +198 -0
- package/pipeline/scripts/smoke-cross-phase-cohesion.sh +128 -0
- package/pipeline/scripts/smoke-delete-flow.sh +151 -0
- package/pipeline/scripts/smoke-dev-critic.sh +144 -0
- package/pipeline/scripts/smoke-diff-explain.sh +128 -0
- package/pipeline/scripts/smoke-diff-risk.sh +161 -0
- package/pipeline/scripts/smoke-dynamic-skill-loading.sh +160 -0
- package/pipeline/scripts/smoke-eval-live.sh +136 -0
- package/pipeline/scripts/smoke-existing-discovery-gate.sh +71 -0
- package/pipeline/scripts/smoke-figma-android-parity.sh +148 -0
- package/pipeline/scripts/smoke-figma-config-schema.sh +144 -0
- package/pipeline/scripts/smoke-figma-credential-store.sh +105 -0
- package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +177 -0
- package/pipeline/scripts/smoke-figma-dispatch.sh +123 -0
- package/pipeline/scripts/smoke-figma-skill-import.sh +174 -0
- package/pipeline/scripts/smoke-figma-sync.sh +149 -0
- package/pipeline/scripts/smoke-identity-isolation.sh +70 -0
- package/pipeline/scripts/smoke-install-layout.sh +241 -0
- package/pipeline/scripts/smoke-install-leak-gate.sh +125 -0
- package/pipeline/scripts/smoke-issue-comment-template.sh +86 -0
- package/pipeline/scripts/smoke-issue-jira-triad.sh +120 -0
- package/pipeline/scripts/smoke-keychain.sh +158 -0
- package/pipeline/scripts/smoke-language-axis.sh +109 -0
- package/pipeline/scripts/smoke-lib-scripts.sh +395 -0
- package/pipeline/scripts/smoke-migrate-state.sh +102 -0
- package/pipeline/scripts/smoke-mode-dispatch-drift.sh +158 -0
- package/pipeline/scripts/smoke-multi-repo-integration.sh +116 -0
- package/pipeline/scripts/smoke-multi-repo-worktree.sh +61 -0
- package/pipeline/scripts/smoke-no-token-prompt.sh +69 -0
- package/pipeline/scripts/smoke-pat-audit.sh +107 -0
- package/pipeline/scripts/smoke-per-repo-memory.sh +156 -0
- package/pipeline/scripts/smoke-personal-data.sh +82 -0
- package/pipeline/scripts/smoke-phase-0-multi-repo.sh +170 -0
- package/pipeline/scripts/smoke-phase-6-multi.sh +79 -0
- package/pipeline/scripts/smoke-phase-banner.sh +101 -0
- package/pipeline/scripts/smoke-phase-tracker.sh +255 -0
- package/pipeline/scripts/smoke-phase0-bridge-contract.sh +241 -0
- package/pipeline/scripts/smoke-phase4-triage.sh +142 -0
- package/pipeline/scripts/smoke-plan-approval-gate.sh +71 -0
- package/pipeline/scripts/smoke-plan-safety.sh +139 -0
- package/pipeline/scripts/smoke-plan-todos.sh +193 -0
- package/pipeline/scripts/smoke-pr-review-actions.sh +152 -0
- package/pipeline/scripts/smoke-pre-commit.sh +138 -0
- package/pipeline/scripts/smoke-pref-migration.sh +224 -0
- package/pipeline/scripts/smoke-prefs-language.sh +134 -0
- package/pipeline/scripts/smoke-progress-contract.sh +118 -0
- package/pipeline/scripts/smoke-push-retry.sh +75 -0
- package/pipeline/scripts/smoke-readme-counts.sh +120 -0
- package/pipeline/scripts/smoke-repo-map.sh +300 -0
- package/pipeline/scripts/smoke-review-watch.sh +134 -0
- package/pipeline/scripts/smoke-run-aggregator.sh +216 -0
- package/pipeline/scripts/smoke-schema-validation.sh +173 -0
- package/pipeline/scripts/smoke-search.sh +187 -0
- package/pipeline/scripts/smoke-shadow-git.sh +175 -0
- package/pipeline/scripts/smoke-skill-authoring.sh +142 -0
- package/pipeline/scripts/smoke-skill-language.sh +83 -0
- package/pipeline/scripts/smoke-skill-manifest.sh +138 -0
- package/pipeline/scripts/smoke-skill-scan.sh +198 -0
- package/pipeline/scripts/smoke-stack-swap.sh +132 -0
- package/pipeline/scripts/smoke-subagent-validators.sh +105 -0
- package/pipeline/scripts/smoke-sync-delegation.sh +74 -0
- package/pipeline/scripts/smoke-sync-parity.sh +92 -0
- package/pipeline/scripts/smoke-tasklist-ordering.sh +111 -0
- package/pipeline/scripts/smoke-telemetry.sh +147 -0
- package/pipeline/scripts/smoke-test-gap.sh +183 -0
- package/pipeline/scripts/smoke-token-budget.sh +67 -0
- package/pipeline/scripts/smoke-tracker-contract.sh +129 -0
- package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +65 -0
- package/pipeline/scripts/smoke-triage-memory.sh +174 -0
- package/pipeline/scripts/smoke-url-enrichment.sh +70 -0
- package/pipeline/scripts/smoke-validator-contradiction.sh +67 -0
- package/pipeline/scripts/smoke-vercel-deploy-redact.sh +129 -0
- package/pipeline/scripts/smoke-wiki-integration.sh +146 -0
- package/pipeline/scripts/smoke-work-summary.sh +163 -0
- package/pipeline/scripts/smoke-worktree-path-convention.sh +86 -0
- package/pipeline/scripts/smoke-write-state.sh +115 -0
- package/pipeline/scripts/stack-swap.sh +182 -0
- package/pipeline/scripts/sync-figma-source.sh +228 -0
- package/pipeline/scripts/sync-parity-check.sh +135 -0
- package/pipeline/scripts/test-gap-rules/android.json +25 -0
- package/pipeline/scripts/test-gap-rules/ios.json +29 -0
- package/pipeline/scripts/test-gap-rules/node.json +17 -0
- package/pipeline/scripts/test-gap-rules/python.json +19 -0
- package/pipeline/scripts/test-gap-scan.mjs +343 -0
- package/pipeline/scripts/token-budget-report.mjs +145 -0
- package/pipeline/scripts/triage-memory.mjs +258 -0
- package/pipeline/scripts/ui-tree-dumper.swift +122 -0
- package/pipeline/scripts/uninstall.mjs +331 -0
- package/pipeline/scripts/update-issue-progress.sh +146 -0
- package/pipeline/scripts/validate-analysis.mjs +132 -0
- package/pipeline/scripts/validate-diff-risk.mjs +117 -0
- package/pipeline/scripts/validate-planning.mjs +180 -0
- package/pipeline/scripts/validate-reviewer.mjs +131 -0
- package/pipeline/scripts/validate-schemas.mjs +88 -0
- package/pipeline/scripts/validate-test-gap.mjs +90 -0
- package/pipeline/scripts/validate-triage.mjs +175 -0
- package/pipeline/scripts/verify-skills.sh +126 -0
- package/pipeline/scripts/write-state.mjs +175 -0
- package/pipeline/skills/.skill-manifest.json +779 -0
- package/pipeline/skills/.skills-index.json +1771 -0
- package/pipeline/skills/figma-android/README.md +36 -0
- package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +62 -0
- package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +158 -0
- package/pipeline/skills/figma-android/figma-component-test/SKILL.md +120 -0
- package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +35 -0
- package/pipeline/skills/figma-android/figma-to-component/SKILL.md +124 -0
- package/pipeline/skills/figma-common/README.md +57 -0
- package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +277 -0
- package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +498 -0
- package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +283 -0
- package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +362 -0
- package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +206 -0
- package/pipeline/skills/figma-common/figma-commit/REVIEW.md +337 -0
- package/pipeline/skills/figma-common/figma-commit/SKILL.md +211 -0
- package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +218 -0
- package/pipeline/skills/figma-common/figma-component-start/SKILL.md +246 -0
- package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +73 -0
- package/pipeline/skills/figma-common/figma-fix/SKILL.md +316 -0
- package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +542 -0
- package/pipeline/skills/figma-common/figma-issue/SKILL.md +745 -0
- package/pipeline/skills/figma-common/figma-iterate/SKILL.md +203 -0
- package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +1015 -0
- package/pipeline/skills/figma-common/figma-mend/SKILL.md +331 -0
- package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +398 -0
- package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +104 -0
- package/pipeline/skills/figma-common/figma-review/SKILL.md +395 -0
- package/pipeline/skills/figma-common/figma-setup/SKILL.md +514 -0
- package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +592 -0
- package/pipeline/skills/figma-common/figma-skip/SKILL.md +129 -0
- package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +104 -0
- package/pipeline/skills/figma-common/figma-utility/SKILL.md +274 -0
- package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +808 -0
- package/pipeline/skills/figma-common/figma-validate/SKILL.md +633 -0
- package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +711 -0
- package/pipeline/skills/figma-common/performance-review-next/SKILL.md +233 -0
- package/pipeline/skills/figma-common/performance-start/SKILL.md +425 -0
- package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +706 -0
- package/pipeline/skills/figma-common/performance-tour/SKILL.md +418 -0
- package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +67 -0
- package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +178 -0
- package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +184 -0
- package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +219 -0
- package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +274 -0
- package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +401 -0
- package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +57 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +307 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +119 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +174 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +333 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +368 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +393 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +617 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +352 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +337 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +206 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +235 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +214 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +871 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +156 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +175 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +176 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +333 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +412 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +336 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +695 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +332 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +380 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +262 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +482 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +274 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +636 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +142 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +547 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +39 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +659 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +580 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +51 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +129 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +64 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +531 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +89 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +155 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +196 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +57 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +89 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +227 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +157 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +90 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +116 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +153 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +130 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +218 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +188 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +93 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +98 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +261 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +147 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +182 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +185 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +609 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +332 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +261 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +184 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +188 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +768 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +191 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +420 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.json +94 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +336 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +391 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +292 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +1 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +93 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +299 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +343 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +206 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +149 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +281 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +332 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +176 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +98 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +298 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +195 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +1298 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +228 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +1089 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +141 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +106 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +162 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +105 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +179 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +260 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +260 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +86 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +321 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +1470 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +176 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +147 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +629 -0
- package/pipeline/skills/shared/README.md +212 -0
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +315 -0
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +348 -0
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +944 -0
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +51 -0
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +300 -0
- package/pipeline/skills/shared/core/multi-agent-delete/SKILL.md +63 -0
- package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +64 -0
- package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +56 -0
- package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +36 -0
- package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +42 -0
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +66 -0
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +292 -0
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +35 -0
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +38 -0
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +41 -0
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +87 -0
- package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +37 -0
- package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +53 -0
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +28 -0
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +47 -0
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +42 -0
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +191 -0
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +31 -0
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +61 -0
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +61 -0
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +62 -0
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +309 -0
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +55 -0
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +41 -0
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +184 -0
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +44 -0
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +34 -0
- package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +45 -0
- package/pipeline/skills/shared/external/agentflow/SKILL.md +199 -0
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +438 -0
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +584 -0
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +407 -0
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +153 -0
- package/pipeline/skills/shared/external/android-performance/SKILL.md +736 -0
- package/pipeline/skills/shared/external/android-security/SKILL.md +577 -0
- package/pipeline/skills/shared/external/android_ui_verification/SKILL.md +66 -0
- package/pipeline/skills/shared/external/api-patterns/SKILL.md +85 -0
- package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +910 -0
- package/pipeline/skills/shared/external/app-clips/SKILL.md +436 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +489 -0
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +1076 -0
- package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +75 -0
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +409 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +411 -0
- package/pipeline/skills/shared/external/app-store-review/references/code-signing.md +259 -0
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +90 -0
- package/pipeline/skills/shared/external/app-store-review/references/rejection-patterns.md +152 -0
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +118 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +500 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +425 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +344 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +508 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +285 -0
- package/pipeline/skills/shared/external/architecture/SKILL.md +60 -0
- package/pipeline/skills/shared/external/authentication/SKILL.md +496 -0
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +211 -0
- package/pipeline/skills/shared/external/background-processing/SKILL.md +499 -0
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +390 -0
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +461 -0
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +425 -0
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +462 -0
- package/pipeline/skills/shared/external/clean-code/SKILL.md +94 -0
- package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +116 -0
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +492 -0
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +461 -0
- package/pipeline/skills/shared/external/compose-components/SKILL.md +441 -0
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +436 -0
- package/pipeline/skills/shared/external/compose-testing/SKILL.md +527 -0
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +425 -0
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +409 -0
- package/pipeline/skills/shared/external/context-compression/SKILL.md +266 -0
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +491 -0
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +435 -0
- package/pipeline/skills/shared/external/core-motion/SKILL.md +388 -0
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +405 -0
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +495 -0
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +420 -0
- package/pipeline/skills/shared/external/coreml/SKILL.md +458 -0
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +765 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +467 -0
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +335 -0
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +422 -0
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +387 -0
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +298 -0
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +37 -0
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +477 -0
- package/pipeline/skills/shared/external/docker-expert/SKILL.md +413 -0
- package/pipeline/skills/shared/external/energykit/SKILL.md +460 -0
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +541 -0
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +483 -0
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +326 -0
- package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +190 -0
- package/pipeline/skills/shared/external/firebase/SKILL.md +61 -0
- package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +348 -0
- package/pipeline/skills/shared/external/gradle-kotlin-dsl/SKILL.md +552 -0
- package/pipeline/skills/shared/external/healthkit/SKILL.md +498 -0
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +602 -0
- package/pipeline/skills/shared/external/help-skills/SKILL.md +166 -0
- package/pipeline/skills/shared/external/hig-components-content/SKILL.md +81 -0
- package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +95 -0
- package/pipeline/skills/shared/external/hig-components-status/SKILL.md +82 -0
- package/pipeline/skills/shared/external/hig-components-system/SKILL.md +101 -0
- package/pipeline/skills/shared/external/hig-foundations/SKILL.md +94 -0
- package/pipeline/skills/shared/external/hig-inputs/SKILL.md +110 -0
- package/pipeline/skills/shared/external/hig-patterns/SKILL.md +99 -0
- package/pipeline/skills/shared/external/hig-platforms/SKILL.md +81 -0
- package/pipeline/skills/shared/external/hig-technologies/SKILL.md +125 -0
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +496 -0
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +455 -0
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +301 -0
- package/pipeline/skills/shared/external/humanizer/SKILL.md +118 -0
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +301 -0
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +140 -0
- package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +59 -0
- package/pipeline/skills/shared/external/ios-developer/SKILL.md +217 -0
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +418 -0
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +627 -0
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +462 -0
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +441 -0
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +862 -0
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -0
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +563 -0
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +1116 -0
- package/pipeline/skills/shared/external/ios-security/SKILL.md +496 -0
- package/pipeline/skills/shared/external/ios-security/references/app-review-guidelines.md +174 -0
- package/pipeline/skills/shared/external/ios-security/references/cryptokit-advanced.md +297 -0
- package/pipeline/skills/shared/external/ios-security/references/file-storage-patterns.md +354 -0
- package/pipeline/skills/shared/external/ios-security/references/privacy-manifest.md +117 -0
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +101 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +500 -0
- package/pipeline/skills/shared/external/live-activities/references/live-activity-patterns.md +868 -0
- package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +109 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +110 -0
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +485 -0
- package/pipeline/skills/shared/external/mapkit-location/references/corelocation-patterns.md +730 -0
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +748 -0
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +479 -0
- package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +64 -0
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +395 -0
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +363 -0
- package/pipeline/skills/shared/external/natural-language/SKILL.md +412 -0
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +311 -0
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +418 -0
- package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +38 -0
- package/pipeline/skills/shared/external/observability-engineer/SKILL.md +235 -0
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +398 -0
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +254 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +387 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/references/paperkit-integration.md +376 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +302 -0
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +446 -0
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +435 -0
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +501 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +701 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +774 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +869 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/photospicker-patterns.md +597 -0
- package/pipeline/skills/shared/external/play-store-review/SKILL.md +350 -0
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +501 -0
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +677 -0
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +745 -0
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +383 -0
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +290 -0
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +479 -0
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +480 -0
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +386 -0
- package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +506 -0
- package/pipeline/skills/shared/external/room-database/SKILL.md +564 -0
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +483 -0
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +544 -0
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +485 -0
- package/pipeline/skills/shared/external/storekit/SKILL.md +478 -0
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +58 -0
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +755 -0
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +487 -0
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +895 -0
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +467 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +408 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +80 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/swift-6-2-concurrency.md +233 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +187 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +341 -0
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +113 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +124 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/actors.md +155 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/async-streams.md +67 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/bridging.md +52 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/bug-patterns.md +100 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/cancellation.md +107 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/diagnostics.md +70 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/hotspots.md +47 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/interop.md +129 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/new-features.md +224 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/structured.md +101 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/testing.md +218 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/unstructured.md +61 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +498 -0
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +505 -0
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +462 -0
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +504 -0
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +97 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/async-tests.md +252 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/core-rules.md +52 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/migrating-from-xctest.md +34 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +318 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/writing-better-tests.md +254 -0
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +334 -0
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +504 -0
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +975 -0
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +675 -0
- package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +102 -0
- package/pipeline/skills/shared/external/swiftdata-pro/references/class-inheritance.md +104 -0
- package/pipeline/skills/shared/external/swiftdata-pro/references/cloudkit.md +10 -0
- package/pipeline/skills/shared/external/swiftdata-pro/references/core-rules.md +20 -0
- package/pipeline/skills/shared/external/swiftdata-pro/references/indexing.md +27 -0
- package/pipeline/skills/shared/external/swiftdata-pro/references/predicates.md +73 -0
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +503 -0
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +821 -0
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +553 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +102 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/accessibility-patterns.md +215 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-advanced.md +403 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-basics.md +284 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-transitions.md +326 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts-accessibility.md +135 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts.md +602 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/image-optimization.md +203 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/latest-apis.md +464 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/layout-best-practices.md +266 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/liquid-glass.md +416 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/list-patterns.md +394 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-scenes.md +318 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-views.md +357 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-window-styling.md +303 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/performance-patterns.md +403 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/scroll-patterns.md +293 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/sheet-navigation-patterns.md +363 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/state-management.md +417 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/view-structure.md +389 -0
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +450 -0
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +425 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +336 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +97 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +69 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +99 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +147 -0
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +98 -0
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +262 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +207 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +177 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +169 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +178 -0
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +371 -0
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +486 -0
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +1097 -0
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +780 -0
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +696 -0
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +487 -0
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +46 -0
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +29 -0
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +33 -0
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +52 -0
- package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +114 -0
- package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +108 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/accessibility.md +13 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/api.md +39 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/data.md +43 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/design.md +31 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/hygiene.md +9 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/navigation.md +14 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/performance.md +46 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/swift.md +56 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/views.md +35 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +103 -0
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +428 -0
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +534 -0
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +948 -0
- package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +210 -0
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +273 -0
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +151 -0
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +95 -0
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +51 -0
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +111 -0
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +309 -0
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +393 -0
- package/pipeline/skills/shared/external/tipkit/SKILL.md +494 -0
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +782 -0
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +336 -0
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +475 -0
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +736 -0
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +738 -0
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +371 -0
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +410 -0
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +567 -0
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +373 -0
- package/pipeline/skills/shared/external/web-performance/SKILL.md +345 -0
- package/pipeline/skills/shared/external/web-testing/SKILL.md +385 -0
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +497 -0
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +871 -0
- package/pipeline/skills/skills-index.md +205 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: macos-menubar-tuist-app
|
|
3
|
+
description: Build, refactor, or review SwiftUI macOS menubar apps that use Tuist.
|
|
4
|
+
risk: safe
|
|
5
|
+
source: "Dimillian/Skills (MIT)"
|
|
6
|
+
date_added: "2026-03-25"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# macos-menubar-tuist-app
|
|
10
|
+
|
|
11
|
+
Build and maintain macOS menubar apps with a Tuist-first workflow and stable launch scripts. Preserve strict architecture boundaries so networking, state, and UI remain testable and predictable.
|
|
12
|
+
|
|
13
|
+
## When to Use
|
|
14
|
+
|
|
15
|
+
- When working on LSUIElement menubar utilities built with Tuist and SwiftUI.
|
|
16
|
+
- When you need Tuist manifests, launch scripts, or architecture guidance for a menubar app.
|
|
17
|
+
|
|
18
|
+
## Core Rules
|
|
19
|
+
|
|
20
|
+
- Keep the app menubar-only unless explicitly told otherwise. Use `LSUIElement = true` by default.
|
|
21
|
+
- Keep transport and decoding logic outside views. Do not call networking from SwiftUI view bodies.
|
|
22
|
+
- Keep state transitions in a store layer (`@Observable` or equivalent), not in row/view presentation code.
|
|
23
|
+
- Keep model decoding resilient to API drift: optional fields, safe fallbacks, and defensive parsing.
|
|
24
|
+
- Treat Tuist manifests as the source of truth. Do not rely on hand-edited generated Xcode artifacts.
|
|
25
|
+
- Prefer script-based launch for local iteration when `tuist run` is unreliable for macOS target/device resolution.
|
|
26
|
+
- Prefer `tuist xcodebuild build` over raw `xcodebuild` in local run scripts when building generated projects.
|
|
27
|
+
|
|
28
|
+
## Expected File Shape
|
|
29
|
+
|
|
30
|
+
Use this placement by default:
|
|
31
|
+
|
|
32
|
+
- `Project.swift`: app target, settings, resources, `Info.plist` keys
|
|
33
|
+
- `Sources/*Model*.swift`: API/domain models and decoding
|
|
34
|
+
- `Sources/*Client*.swift`: requests, response mapping, transport concerns
|
|
35
|
+
- `Sources/*Store*.swift`: observable state, refresh policy, filtering, caching
|
|
36
|
+
- `Sources/*Menu*View*.swift`: menu composition and top-level UI state
|
|
37
|
+
- `Sources/*Row*View*.swift`: row rendering and lightweight interactions
|
|
38
|
+
- `run-menubar.sh`: canonical local restart/build/launch path
|
|
39
|
+
- `stop-menubar.sh`: explicit stop helper when needed
|
|
40
|
+
|
|
41
|
+
## Workflow
|
|
42
|
+
|
|
43
|
+
1. Confirm Tuist ownership
|
|
44
|
+
- Verify `Tuist.swift` and `Project.swift` (or workspace manifests) exist.
|
|
45
|
+
- Read existing run scripts before changing launch behavior.
|
|
46
|
+
|
|
47
|
+
2. Probe backend behavior before coding assumptions
|
|
48
|
+
- Use `curl` to verify endpoint shape, auth requirements, and pagination behavior.
|
|
49
|
+
- If endpoint ignores `limit/page`, implement full-list handling with local trimming in the store.
|
|
50
|
+
|
|
51
|
+
3. Implement layers from bottom to top
|
|
52
|
+
- Define/adjust models first.
|
|
53
|
+
- Add or update client request/decoding logic.
|
|
54
|
+
- Update store refresh, filtering, and cache policy.
|
|
55
|
+
- Wire views last.
|
|
56
|
+
|
|
57
|
+
4. Keep app wiring minimal
|
|
58
|
+
- Keep app entry focused on scene/menu wiring and dependency injection.
|
|
59
|
+
- Avoid embedding business logic in `App` or menu scene declarations.
|
|
60
|
+
|
|
61
|
+
5. Standardize launch ergonomics
|
|
62
|
+
- Ensure run script restarts an existing instance before relaunching.
|
|
63
|
+
- Ensure run script does not open Xcode as a side effect.
|
|
64
|
+
- Use `tuist generate --no-open` when generation is required.
|
|
65
|
+
- When the run script builds the generated project, prefer `TUIST_SKIP_UPDATE_CHECK=1 tuist xcodebuild build ...` instead of invoking raw `xcodebuild` directly.
|
|
66
|
+
|
|
67
|
+
## Validation Matrix
|
|
68
|
+
|
|
69
|
+
Run validations after edits:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
TUIST_SKIP_UPDATE_CHECK=1 tuist xcodebuild build -scheme <TargetName> -configuration Debug
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
If launch workflow changed:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
./run-menubar.sh
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
If shell scripts changed:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
bash -n run-menubar.sh
|
|
85
|
+
bash -n stop-menubar.sh
|
|
86
|
+
./run-menubar.sh
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Failure Patterns and Fix Direction
|
|
90
|
+
|
|
91
|
+
- `tuist run` cannot resolve the macOS destination:
|
|
92
|
+
Use run/stop scripts as canonical local run path.
|
|
93
|
+
|
|
94
|
+
- Menu UI is laggy or inconsistent after refresh:
|
|
95
|
+
Move derived state and filtering into the store; keep views render-only.
|
|
96
|
+
|
|
97
|
+
- API payload changes break decode:
|
|
98
|
+
Relax model decoding with optional fields and defaults, then surface missing data safely in UI.
|
|
99
|
+
|
|
100
|
+
- Feature asks for quick UI patch:
|
|
101
|
+
Trace root cause in model/client/store before changing row/menu presentation.
|
|
102
|
+
|
|
103
|
+
## Completion Checklist
|
|
104
|
+
|
|
105
|
+
- Preserve menubar-only behavior unless explicitly changed.
|
|
106
|
+
- Keep network and state logic out of SwiftUI view bodies.
|
|
107
|
+
- Keep Tuist manifests and run scripts aligned with actual build/run flow.
|
|
108
|
+
- Run the validation matrix for touched areas.
|
|
109
|
+
- Report concrete commands run and outcomes.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: macos-spm-app-packaging
|
|
3
|
+
description: Scaffold, build, sign, and package SwiftPM macOS apps without Xcode projects.
|
|
4
|
+
risk: safe
|
|
5
|
+
source: "Dimillian/Skills (MIT)"
|
|
6
|
+
date_added: "2026-03-25"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# macOS SwiftPM App Packaging (No Xcode)
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
Bootstrap a complete SwiftPM macOS app folder, then build, package, and run it without Xcode. Use `assets/templates/bootstrap/` for the starter layout and `references/packaging.md` + `references/release.md` for packaging and release details.
|
|
13
|
+
|
|
14
|
+
## When to Use
|
|
15
|
+
|
|
16
|
+
- When the user needs a SwiftPM-based macOS app without relying on an Xcode project.
|
|
17
|
+
- When you need packaging, signing, notarization, or appcast guidance for a SwiftPM app.
|
|
18
|
+
|
|
19
|
+
## Two-Step Workflow
|
|
20
|
+
1) Bootstrap the project folder
|
|
21
|
+
- Copy `assets/templates/bootstrap/` into a new repo.
|
|
22
|
+
- Rename `MyApp` in `Package.swift`, `Sources/MyApp/`, and `version.env`.
|
|
23
|
+
- Customize `APP_NAME`, `BUNDLE_ID`, and versions.
|
|
24
|
+
|
|
25
|
+
2) Build, package, and run the bootstrapped app
|
|
26
|
+
- Copy scripts from `assets/templates/` into your repo (for example, `Scripts/`).
|
|
27
|
+
- Build/tests: `swift build` and `swift test`.
|
|
28
|
+
- Package: `Scripts/package_app.sh`.
|
|
29
|
+
- Run: `Scripts/compile_and_run.sh` (preferred) or `Scripts/launch.sh`.
|
|
30
|
+
- Release (optional): `Scripts/sign-and-notarize.sh` and `Scripts/make_appcast.sh`.
|
|
31
|
+
- Tag + GitHub release (optional): create a git tag, upload the zip/appcast to the GitHub release, and publish.
|
|
32
|
+
|
|
33
|
+
## Minimum End-to-End Example
|
|
34
|
+
Shortest path from bootstrap to a running app:
|
|
35
|
+
```bash
|
|
36
|
+
# 1. Copy and rename the skeleton
|
|
37
|
+
cp -R assets/templates/bootstrap/ ~/Projects/MyApp
|
|
38
|
+
cd ~/Projects/MyApp
|
|
39
|
+
sed -i '' 's/MyApp/HelloApp/g' Package.swift version.env
|
|
40
|
+
|
|
41
|
+
# 2. Copy scripts
|
|
42
|
+
cp assets/templates/package_app.sh Scripts/
|
|
43
|
+
cp assets/templates/compile_and_run.sh Scripts/
|
|
44
|
+
chmod +x Scripts/*.sh
|
|
45
|
+
|
|
46
|
+
# 3. Build and launch
|
|
47
|
+
swift build
|
|
48
|
+
Scripts/compile_and_run.sh
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Validation Checkpoints
|
|
52
|
+
Run these after key steps to catch failures early before proceeding to the next stage.
|
|
53
|
+
|
|
54
|
+
**After packaging (`Scripts/package_app.sh`):**
|
|
55
|
+
```bash
|
|
56
|
+
# Confirm .app bundle structure is intact
|
|
57
|
+
ls -R build/HelloApp.app/Contents
|
|
58
|
+
|
|
59
|
+
# Check that the binary is present and executable
|
|
60
|
+
file build/HelloApp.app/Contents/MacOS/HelloApp
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**After signing (`Scripts/sign-and-notarize.sh` or ad-hoc dev signing):**
|
|
64
|
+
```bash
|
|
65
|
+
# Inspect signature and entitlements
|
|
66
|
+
codesign -dv --verbose=4 build/HelloApp.app
|
|
67
|
+
|
|
68
|
+
# Verify the bundle passes Gatekeeper checks locally
|
|
69
|
+
spctl --assess --type execute --verbose build/HelloApp.app
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**After notarization and stapling:**
|
|
73
|
+
```bash
|
|
74
|
+
# Confirm the staple ticket is attached
|
|
75
|
+
stapler validate build/HelloApp.app
|
|
76
|
+
|
|
77
|
+
# Re-run Gatekeeper to confirm notarization is recognised
|
|
78
|
+
spctl --assess --type execute --verbose build/HelloApp.app
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Common Notarization Failures
|
|
82
|
+
| Symptom | Likely Cause | Recovery |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| `The software asset has already been uploaded` | Duplicate submission for same version | Bump `BUILD_NUMBER` in `version.env` and repackage. |
|
|
85
|
+
| `Package Invalid: Invalid Code Signing Entitlements` | Entitlements in `.entitlements` file don't match provisioning | Audit entitlements against Apple's allowed set; remove unsupported keys. |
|
|
86
|
+
| `The executable does not have the hardened runtime enabled` | Missing `--options runtime` flag in `codesign` invocation | Edit `sign-and-notarize.sh` to add `--options runtime` to all `codesign` calls. |
|
|
87
|
+
| Notarization hangs / no status email | `xcrun notarytool` network or credential issue | Run `xcrun notarytool history` to check status; re-export App Store Connect API key if expired. |
|
|
88
|
+
| `stapler validate` fails after successful notarization | Ticket not yet propagated | Wait ~60 s, then re-run `xcrun stapler staple`. |
|
|
89
|
+
|
|
90
|
+
## Templates
|
|
91
|
+
- `assets/templates/package_app.sh`: Build binaries, create the .app bundle, copy resources, sign.
|
|
92
|
+
- `assets/templates/compile_and_run.sh`: Dev loop to kill running app, package, launch.
|
|
93
|
+
- `assets/templates/build_icon.sh`: Generate .icns from an Icon Composer file (requires Xcode install).
|
|
94
|
+
- `assets/templates/sign-and-notarize.sh`: Notarize, staple, and zip a release build.
|
|
95
|
+
- `assets/templates/make_appcast.sh`: Generate Sparkle appcast entries for updates.
|
|
96
|
+
- `assets/templates/setup_dev_signing.sh`: Create a stable dev code-signing identity.
|
|
97
|
+
- `assets/templates/launch.sh`: Simple launcher for a packaged .app.
|
|
98
|
+
- `assets/templates/version.env`: Example version file consumed by packaging scripts.
|
|
99
|
+
- `assets/templates/bootstrap/`: Minimal SwiftPM macOS app skeleton (Package.swift, Sources/, version.env).
|
|
100
|
+
|
|
101
|
+
## Notes
|
|
102
|
+
- Keep entitlements and signing configuration explicit; edit the template scripts instead of reimplementing.
|
|
103
|
+
- Remove Sparkle steps if you do not use Sparkle for updates.
|
|
104
|
+
- Sparkle relies on the bundle build number (`CFBundleVersion`), so `BUILD_NUMBER` in `version.env` must increase for each update.
|
|
105
|
+
- For menu bar apps, set `MENU_BAR_APP=1` when packaging to emit `LSUIElement` in Info.plist.
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
All 22 SKILL.md files have been fetched and presented above with their complete raw content. The content was retrieved via `curl` directly from `raw.githubusercontent.com` to ensure nothing was summarized or truncated. One note: the **firebase** skill file appears to have a truncated sentence in the original source itself ("You advocate for Firebase w") -- that is how it exists in the repository, not a fetch artifact.
|
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mapkit-location
|
|
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
|
+
---
|
|
5
|
+
|
|
6
|
+
# MapKit and CoreLocation
|
|
7
|
+
|
|
8
|
+
Build map-based and location-aware features targeting iOS 17+ with SwiftUI
|
|
9
|
+
MapKit and modern CoreLocation async APIs. Use `Map` with `MapContentBuilder`
|
|
10
|
+
for views, `CLLocationUpdate.liveUpdates()` for streaming location, and
|
|
11
|
+
`CLMonitor` for geofencing.
|
|
12
|
+
|
|
13
|
+
See `references/mapkit-patterns.md` for extended MapKit patterns and
|
|
14
|
+
`references/corelocation-patterns.md` for CoreLocation patterns.
|
|
15
|
+
|
|
16
|
+
## Contents
|
|
17
|
+
|
|
18
|
+
- [Workflow](#workflow)
|
|
19
|
+
- [SwiftUI Map View (iOS 17+)](#swiftui-map-view-ios-17)
|
|
20
|
+
- [CoreLocation Modern API](#corelocation-modern-api)
|
|
21
|
+
- [Geocoding](#geocoding)
|
|
22
|
+
- [Search](#search)
|
|
23
|
+
- [Directions](#directions)
|
|
24
|
+
- [PlaceDescriptor (iOS 26+)](#placedescriptor-ios-26)
|
|
25
|
+
- [Common Mistakes](#common-mistakes)
|
|
26
|
+
- [Review Checklist](#review-checklist)
|
|
27
|
+
- [References](#references)
|
|
28
|
+
|
|
29
|
+
## Workflow
|
|
30
|
+
|
|
31
|
+
### 1. Add a map with markers or annotations
|
|
32
|
+
|
|
33
|
+
1. Import `MapKit`.
|
|
34
|
+
2. Create a `Map` view with optional `MapCameraPosition` binding.
|
|
35
|
+
3. Add `Marker`, `Annotation`, `MapPolyline`, `MapPolygon`, or `MapCircle`
|
|
36
|
+
inside the `MapContentBuilder` closure.
|
|
37
|
+
4. Configure map style with `.mapStyle()`.
|
|
38
|
+
5. Add map controls with `.mapControls { }`.
|
|
39
|
+
6. Handle selection with a `selection:` binding.
|
|
40
|
+
|
|
41
|
+
### 2. Track user location
|
|
42
|
+
|
|
43
|
+
1. Add `NSLocationWhenInUseUsageDescription` to Info.plist.
|
|
44
|
+
2. On iOS 18+, create a `CLServiceSession` to manage authorization.
|
|
45
|
+
3. Iterate `CLLocationUpdate.liveUpdates()` in a `Task`.
|
|
46
|
+
4. Filter updates by distance or accuracy before updating the UI.
|
|
47
|
+
5. Stop the task when location tracking is no longer needed.
|
|
48
|
+
|
|
49
|
+
### 3. Search for places
|
|
50
|
+
|
|
51
|
+
1. Configure `MKLocalSearchCompleter` for autocomplete suggestions.
|
|
52
|
+
2. Debounce user input (at least 300ms) before setting the query.
|
|
53
|
+
3. Convert selected completion to `MKLocalSearch.Request` for full results.
|
|
54
|
+
4. Display results as markers or in a list.
|
|
55
|
+
|
|
56
|
+
### 4. Get directions and display a route
|
|
57
|
+
|
|
58
|
+
1. Create an `MKDirections.Request` with source and destination `MKMapItem`.
|
|
59
|
+
2. Set `transportType` (`.automobile`, `.walking`, `.transit`, `.cycling`).
|
|
60
|
+
3. Await `MKDirections.calculate()`.
|
|
61
|
+
4. Draw the route with `MapPolyline(route.polyline)`.
|
|
62
|
+
|
|
63
|
+
### 5. Review existing map/location code
|
|
64
|
+
|
|
65
|
+
Run through the Review Checklist at the end of this file.
|
|
66
|
+
|
|
67
|
+
## SwiftUI Map View (iOS 17+)
|
|
68
|
+
|
|
69
|
+
```swift
|
|
70
|
+
import MapKit
|
|
71
|
+
import SwiftUI
|
|
72
|
+
|
|
73
|
+
struct PlaceMap: View {
|
|
74
|
+
@State private var position: MapCameraPosition = .automatic
|
|
75
|
+
|
|
76
|
+
var body: some View {
|
|
77
|
+
Map(position: $position) {
|
|
78
|
+
Marker("Apple Park", coordinate: applePark)
|
|
79
|
+
Marker("Infinite Loop", systemImage: "building.2",
|
|
80
|
+
coordinate: infiniteLoop)
|
|
81
|
+
}
|
|
82
|
+
.mapStyle(.standard(elevation: .realistic))
|
|
83
|
+
.mapControls {
|
|
84
|
+
MapUserLocationButton()
|
|
85
|
+
MapCompass()
|
|
86
|
+
MapScaleView()
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Marker and Annotation
|
|
93
|
+
|
|
94
|
+
```swift
|
|
95
|
+
// Balloon marker -- simplest way to pin a location
|
|
96
|
+
Marker("Cafe", systemImage: "cup.and.saucer.fill", coordinate: cafeCoord)
|
|
97
|
+
.tint(.brown)
|
|
98
|
+
|
|
99
|
+
// Annotation -- custom SwiftUI view at a coordinate
|
|
100
|
+
Annotation("You", coordinate: userCoord, anchor: .bottom) {
|
|
101
|
+
Image(systemName: "figure.wave")
|
|
102
|
+
.padding(6)
|
|
103
|
+
.background(.blue.gradient, in: .circle)
|
|
104
|
+
.foregroundStyle(.white)
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Overlays: Polyline, Polygon, Circle
|
|
109
|
+
|
|
110
|
+
```swift
|
|
111
|
+
Map {
|
|
112
|
+
// Polyline from coordinates
|
|
113
|
+
MapPolyline(coordinates: routeCoords)
|
|
114
|
+
.stroke(.blue, lineWidth: 4)
|
|
115
|
+
|
|
116
|
+
// Polygon (area highlight)
|
|
117
|
+
MapPolygon(coordinates: parkBoundary)
|
|
118
|
+
.foregroundStyle(.green.opacity(0.3))
|
|
119
|
+
.stroke(.green, lineWidth: 2)
|
|
120
|
+
|
|
121
|
+
// Circle (radius around a point)
|
|
122
|
+
MapCircle(center: storeCoord, radius: 500)
|
|
123
|
+
.foregroundStyle(.red.opacity(0.15))
|
|
124
|
+
.stroke(.red, lineWidth: 1)
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Camera Position
|
|
129
|
+
|
|
130
|
+
`MapCameraPosition` controls what the map displays. Bind it to let the user
|
|
131
|
+
interact and to programmatically move the camera.
|
|
132
|
+
|
|
133
|
+
```swift
|
|
134
|
+
// Center on a region
|
|
135
|
+
@State private var position: MapCameraPosition = .region(
|
|
136
|
+
MKCoordinateRegion(
|
|
137
|
+
center: CLLocationCoordinate2D(latitude: 37.334, longitude: -122.009),
|
|
138
|
+
span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05)
|
|
139
|
+
)
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
// Follow user location
|
|
143
|
+
@State private var position: MapCameraPosition = .userLocation(fallback: .automatic)
|
|
144
|
+
|
|
145
|
+
// Specific camera angle (3D perspective)
|
|
146
|
+
@State private var position: MapCameraPosition = .camera(
|
|
147
|
+
MapCamera(centerCoordinate: applePark, distance: 1000, heading: 90, pitch: 60)
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
// Frame specific items
|
|
151
|
+
position = .item(MKMapItem.forCurrentLocation())
|
|
152
|
+
position = .rect(MKMapRect(...))
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Map Style
|
|
156
|
+
|
|
157
|
+
```swift
|
|
158
|
+
.mapStyle(.standard) // Default road map
|
|
159
|
+
.mapStyle(.standard(elevation: .realistic, showsTraffic: true))
|
|
160
|
+
.mapStyle(.imagery) // Satellite
|
|
161
|
+
.mapStyle(.imagery(elevation: .realistic)) // 3D satellite
|
|
162
|
+
.mapStyle(.hybrid) // Satellite + labels
|
|
163
|
+
.mapStyle(.hybrid(elevation: .realistic, showsTraffic: true))
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Map Interaction Modes
|
|
167
|
+
|
|
168
|
+
```swift
|
|
169
|
+
.mapInteractionModes(.all) // Default: pan, zoom, rotate, pitch
|
|
170
|
+
.mapInteractionModes(.pan) // Pan only
|
|
171
|
+
.mapInteractionModes([.pan, .zoom]) // Pan and zoom
|
|
172
|
+
.mapInteractionModes([]) // Static map (no interaction)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Map Selection
|
|
176
|
+
|
|
177
|
+
```swift
|
|
178
|
+
@State private var selectedMarker: MKMapItem?
|
|
179
|
+
|
|
180
|
+
Map(selection: $selectedMarker) {
|
|
181
|
+
ForEach(places) { place in
|
|
182
|
+
Marker(place.name, coordinate: place.coordinate)
|
|
183
|
+
.tag(place.mapItem) // Tag must match selection type
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
.onChange(of: selectedMarker) { _, newValue in
|
|
187
|
+
guard let item = newValue else { return }
|
|
188
|
+
// React to selection
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## CoreLocation Modern API
|
|
193
|
+
|
|
194
|
+
### CLLocationUpdate.liveUpdates() (iOS 17+)
|
|
195
|
+
|
|
196
|
+
Replace `CLLocationManagerDelegate` callbacks with a single async sequence.
|
|
197
|
+
Each iteration yields a `CLLocationUpdate` containing an optional `CLLocation`.
|
|
198
|
+
|
|
199
|
+
```swift
|
|
200
|
+
import CoreLocation
|
|
201
|
+
|
|
202
|
+
@Observable
|
|
203
|
+
final class LocationTracker: @unchecked Sendable {
|
|
204
|
+
var currentLocation: CLLocation?
|
|
205
|
+
private var updateTask: Task<Void, Never>?
|
|
206
|
+
|
|
207
|
+
func startTracking() {
|
|
208
|
+
updateTask = Task {
|
|
209
|
+
let updates = CLLocationUpdate.liveUpdates()
|
|
210
|
+
for try await update in updates {
|
|
211
|
+
guard let location = update.location else { continue }
|
|
212
|
+
// Filter by horizontal accuracy
|
|
213
|
+
guard location.horizontalAccuracy < 50 else { continue }
|
|
214
|
+
await MainActor.run {
|
|
215
|
+
self.currentLocation = location
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
func stopTracking() {
|
|
222
|
+
updateTask?.cancel()
|
|
223
|
+
updateTask = nil
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### CLServiceSession (iOS 18+)
|
|
229
|
+
|
|
230
|
+
Declare authorization requirements for a feature's lifetime. Hold a reference
|
|
231
|
+
to the session for as long as you need location services.
|
|
232
|
+
|
|
233
|
+
```swift
|
|
234
|
+
// When-in-use authorization with full accuracy preference
|
|
235
|
+
let session = CLServiceSession(
|
|
236
|
+
authorization: .whenInUse,
|
|
237
|
+
fullAccuracyPurposeKey: "NearbySearchPurpose"
|
|
238
|
+
)
|
|
239
|
+
// Hold `session` as a stored property; release it when done.
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
On iOS 18+, `CLLocationUpdate.liveUpdates()` and `CLMonitor` take an implicit
|
|
243
|
+
`CLServiceSession` if you do not create one explicitly. Create one explicitly
|
|
244
|
+
when you need `.always` authorization or full accuracy.
|
|
245
|
+
|
|
246
|
+
### Authorization Flow
|
|
247
|
+
|
|
248
|
+
```swift
|
|
249
|
+
// Info.plist keys (required):
|
|
250
|
+
// NSLocationWhenInUseUsageDescription
|
|
251
|
+
// NSLocationAlwaysAndWhenInUseUsageDescription (only if .always needed)
|
|
252
|
+
|
|
253
|
+
// Check authorization and guide user to Settings when denied
|
|
254
|
+
struct LocationPermissionView: View {
|
|
255
|
+
@Environment(\.openURL) private var openURL
|
|
256
|
+
|
|
257
|
+
var body: some View {
|
|
258
|
+
ContentUnavailableView {
|
|
259
|
+
Label("Location Access Denied", systemImage: "location.slash")
|
|
260
|
+
} description: {
|
|
261
|
+
Text("Enable location access in Settings to use this feature.")
|
|
262
|
+
} actions: {
|
|
263
|
+
Button("Open Settings") {
|
|
264
|
+
if let url = URL(string: UIApplication.openSettingsURLString) {
|
|
265
|
+
openURL(url)
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## Geocoding
|
|
274
|
+
|
|
275
|
+
### CLGeocoder (iOS 8+)
|
|
276
|
+
|
|
277
|
+
```swift
|
|
278
|
+
let geocoder = CLGeocoder()
|
|
279
|
+
|
|
280
|
+
// Forward geocoding: address string -> coordinates
|
|
281
|
+
let placemarks = try await geocoder.geocodeAddressString("1 Apple Park Way, Cupertino")
|
|
282
|
+
if let location = placemarks.first?.location {
|
|
283
|
+
print(location.coordinate) // CLLocationCoordinate2D
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Reverse geocoding: coordinates -> placemark
|
|
287
|
+
let location = CLLocation(latitude: 37.3349, longitude: -122.0090)
|
|
288
|
+
let placemarks = try await geocoder.reverseGeocodeLocation(location)
|
|
289
|
+
if let placemark = placemarks.first {
|
|
290
|
+
let address = [placemark.name, placemark.locality, placemark.administrativeArea]
|
|
291
|
+
.compactMap { $0 }
|
|
292
|
+
.joined(separator: ", ")
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### MKGeocodingRequest and MKReverseGeocodingRequest (iOS 26+)
|
|
297
|
+
|
|
298
|
+
New MapKit-native geocoding that returns `MKMapItem` with richer data and
|
|
299
|
+
`MKAddress` / `MKAddressRepresentations` for flexible address formatting.
|
|
300
|
+
|
|
301
|
+
```swift
|
|
302
|
+
@available(iOS 26, *)
|
|
303
|
+
func reverseGeocode(location: CLLocation) async throws -> MKMapItem? {
|
|
304
|
+
guard let request = MKReverseGeocodingRequest(location: location) else {
|
|
305
|
+
return nil
|
|
306
|
+
}
|
|
307
|
+
let mapItems = try await request.mapItems
|
|
308
|
+
return mapItems.first
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
@available(iOS 26, *)
|
|
312
|
+
func forwardGeocode(address: String) async throws -> [MKMapItem] {
|
|
313
|
+
guard let request = MKGeocodingRequest(addressString: address) else { return [] }
|
|
314
|
+
return try await request.mapItems
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## Search
|
|
319
|
+
|
|
320
|
+
### MKLocalSearchCompleter (Autocomplete)
|
|
321
|
+
|
|
322
|
+
```swift
|
|
323
|
+
@Observable
|
|
324
|
+
final class SearchCompleter: NSObject, MKLocalSearchCompleterDelegate {
|
|
325
|
+
var results: [MKLocalSearchCompletion] = []
|
|
326
|
+
var query: String = "" { didSet { completer.queryFragment = query } }
|
|
327
|
+
|
|
328
|
+
private let completer = MKLocalSearchCompleter()
|
|
329
|
+
|
|
330
|
+
override init() {
|
|
331
|
+
super.init()
|
|
332
|
+
completer.delegate = self
|
|
333
|
+
completer.resultTypes = [.address, .pointOfInterest]
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
|
|
337
|
+
results = completer.results
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
|
|
341
|
+
results = []
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### MKLocalSearch (Full Search)
|
|
347
|
+
|
|
348
|
+
```swift
|
|
349
|
+
func search(for completion: MKLocalSearchCompletion) async throws -> [MKMapItem] {
|
|
350
|
+
let request = MKLocalSearch.Request(completion: completion)
|
|
351
|
+
request.resultTypes = [.pointOfInterest, .address]
|
|
352
|
+
let search = MKLocalSearch(request: request)
|
|
353
|
+
let response = try await search.start()
|
|
354
|
+
return response.mapItems
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// Search by natural language query within a region
|
|
358
|
+
func searchNearby(query: String, region: MKCoordinateRegion) async throws -> [MKMapItem] {
|
|
359
|
+
let request = MKLocalSearch.Request()
|
|
360
|
+
request.naturalLanguageQuery = query
|
|
361
|
+
request.region = region
|
|
362
|
+
let search = MKLocalSearch(request: request)
|
|
363
|
+
let response = try await search.start()
|
|
364
|
+
return response.mapItems
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
## Directions
|
|
369
|
+
|
|
370
|
+
```swift
|
|
371
|
+
func getDirections(from source: MKMapItem, to destination: MKMapItem,
|
|
372
|
+
transport: MKDirectionsTransportType = .automobile) async throws -> MKRoute? {
|
|
373
|
+
let request = MKDirections.Request()
|
|
374
|
+
request.source = source
|
|
375
|
+
request.destination = destination
|
|
376
|
+
request.transportType = transport
|
|
377
|
+
let directions = MKDirections(request: request)
|
|
378
|
+
let response = try await directions.calculate()
|
|
379
|
+
return response.routes.first
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Display Route on Map
|
|
384
|
+
|
|
385
|
+
```swift
|
|
386
|
+
@State private var route: MKRoute?
|
|
387
|
+
|
|
388
|
+
Map {
|
|
389
|
+
if let route {
|
|
390
|
+
MapPolyline(route.polyline)
|
|
391
|
+
.stroke(.blue, lineWidth: 5)
|
|
392
|
+
}
|
|
393
|
+
Marker("Start", coordinate: startCoord)
|
|
394
|
+
Marker("End", coordinate: endCoord)
|
|
395
|
+
}
|
|
396
|
+
.task {
|
|
397
|
+
route = try? await getDirections(from: startItem, to: endItem)
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### ETA Calculation
|
|
402
|
+
|
|
403
|
+
```swift
|
|
404
|
+
func getETA(from source: MKMapItem, to destination: MKMapItem) async throws -> TimeInterval {
|
|
405
|
+
let request = MKDirections.Request()
|
|
406
|
+
request.source = source
|
|
407
|
+
request.destination = destination
|
|
408
|
+
let directions = MKDirections(request: request)
|
|
409
|
+
let response = try await directions.calculateETA()
|
|
410
|
+
return response.expectedTravelTime
|
|
411
|
+
}
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
### Cycling Directions (iOS 26+)
|
|
415
|
+
|
|
416
|
+
```swift
|
|
417
|
+
@available(iOS 26, *)
|
|
418
|
+
func getCyclingDirections(to destination: MKMapItem) async throws -> MKRoute? {
|
|
419
|
+
let request = MKDirections.Request()
|
|
420
|
+
request.source = MKMapItem.forCurrentLocation()
|
|
421
|
+
request.destination = destination
|
|
422
|
+
request.transportType = .cycling
|
|
423
|
+
let directions = MKDirections(request: request)
|
|
424
|
+
let response = try await directions.calculate()
|
|
425
|
+
return response.routes.first
|
|
426
|
+
}
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
## PlaceDescriptor (iOS 26+)
|
|
430
|
+
|
|
431
|
+
Create rich place references from coordinates or addresses without needing a
|
|
432
|
+
Place ID. Requires `import GeoToolbox`.
|
|
433
|
+
|
|
434
|
+
```swift
|
|
435
|
+
@available(iOS 26, *)
|
|
436
|
+
func lookupPlace(name: String, coordinate: CLLocationCoordinate2D) async throws -> MKMapItem {
|
|
437
|
+
let descriptor = PlaceDescriptor(
|
|
438
|
+
representations: [.coordinate(coordinate)],
|
|
439
|
+
commonName: name
|
|
440
|
+
)
|
|
441
|
+
let request = MKMapItemRequest(placeDescriptor: descriptor)
|
|
442
|
+
return try await request.mapItem
|
|
443
|
+
}
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
## Common Mistakes
|
|
447
|
+
|
|
448
|
+
**DON'T:** Request `.authorizedAlways` upfront — users distrust broad permissions.
|
|
449
|
+
**DO:** Start with `.requestWhenInUseAuthorization()`, escalate to `.always` only when the user enables a background feature.
|
|
450
|
+
|
|
451
|
+
**DON'T:** Use `CLLocationManagerDelegate` for simple location fetches on iOS 17+.
|
|
452
|
+
**DO:** Use `CLLocationUpdate.liveUpdates()` async stream for cleaner, more concise code.
|
|
453
|
+
|
|
454
|
+
**DON'T:** Keep location updates running when the map/view is not visible (drains battery).
|
|
455
|
+
**DO:** Use `.task { }` in SwiftUI so updates cancel automatically on disappear.
|
|
456
|
+
|
|
457
|
+
**DON'T:** Force-unwrap `CLPlacemark` properties — they are all optional.
|
|
458
|
+
**DO:** Use nil-coalescing: `placemark.locality ?? "Unknown"`.
|
|
459
|
+
|
|
460
|
+
**DON'T:** Fire `MKLocalSearchCompleter` queries on every keystroke.
|
|
461
|
+
**DO:** Debounce with `.task(id: searchText)` + `Task.sleep(for: .milliseconds(300))`.
|
|
462
|
+
|
|
463
|
+
**DON'T:** Silently fail when location authorization is denied.
|
|
464
|
+
**DO:** Detect `.denied` status and show an alert with a Settings deep link.
|
|
465
|
+
|
|
466
|
+
**DON'T:** Assume geocoding always succeeds — handle empty results and network errors.
|
|
467
|
+
|
|
468
|
+
## Review Checklist
|
|
469
|
+
|
|
470
|
+
- [ ] Info.plist has `NSLocationWhenInUseUsageDescription` with specific reason
|
|
471
|
+
- [ ] Authorization denial handled with Settings deep link
|
|
472
|
+
- [ ] `CLLocationUpdate` task cancelled when not needed (battery)
|
|
473
|
+
- [ ] Location accuracy appropriate for the use case
|
|
474
|
+
- [ ] Map annotations use `Identifiable` data with stable IDs
|
|
475
|
+
- [ ] Geocoding errors handled (network failure, no results)
|
|
476
|
+
- [ ] Search completer input debounced
|
|
477
|
+
- [ ] `CLMonitor` limited to 20 conditions, instance kept alive
|
|
478
|
+
- [ ] Background location uses `CLBackgroundActivitySession`
|
|
479
|
+
- [ ] Map tested with VoiceOver
|
|
480
|
+
- [ ] Map annotation view models and location UI updates are `@MainActor`-isolated
|
|
481
|
+
|
|
482
|
+
## References
|
|
483
|
+
|
|
484
|
+
- `references/mapkit-patterns.md` — Map setup, annotations, search, routes, clustering, Look Around, snapshots.
|
|
485
|
+
- `references/corelocation-patterns.md` — CLLocationUpdate, CLMonitor, CLServiceSession, background location, testing.
|