@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,155 @@
|
|
|
1
|
+
# Progress Line Contract
|
|
2
|
+
|
|
3
|
+
> **TLDR** — Every non-trivial pipeline action emits an inline "I'm doing X right now" line so the user always knows what's happening. Immediate flush, no batching. One line per action, standard shape. Autopilot prefers verbose. Low overhead. Mirrored in telemetry as `progress.step` events.
|
|
4
|
+
|
|
5
|
+
This contract is consumed by every phase (0–7) and every imported skill (figma-ios, figma-android). It is enforced by `smoke-progress-contract.sh` — any phase doc that drops the contract marker or diverges from the line shape fails CI.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Why
|
|
10
|
+
|
|
11
|
+
Today pipeline users see a phase banner (`→ Phase 3: Dev`) and then silence for 30 s–3 min while subagents churn. Users lose trust, hit ⌃C, or retry identical work. A single-line "current action" fixes it without adding noise: you see exactly what is happening, where, and for how long.
|
|
12
|
+
|
|
13
|
+
## Line shape
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
→ <verb> <object>[ <target>]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
- **4-space indent**, same as subphase indent elsewhere.
|
|
20
|
+
- `→` arrow, single space.
|
|
21
|
+
- **verb** — lowercase present participle or imperative, one word: `fetching`, `reading`, `running`, `writing`, `posting`, `waiting`, `dispatching`, `retrying`, `building`, `committing`, `checking`.
|
|
22
|
+
- **object** — what is being acted on: file basename, API endpoint last segment, subagent name, command, smoke name.
|
|
23
|
+
- **target** — optional, human-readable scope: repo name, ticket ID, URL host.
|
|
24
|
+
|
|
25
|
+
### Examples
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
→ fetching Jira issue ABC-12345
|
|
29
|
+
→ reading LoginView.swift
|
|
30
|
+
→ dispatching explore agent repo-map
|
|
31
|
+
→ running xcodebuild -scheme Components
|
|
32
|
+
→ posting review to Jira comment ABC-12345
|
|
33
|
+
→ retrying push origin (attempt 2/5)
|
|
34
|
+
→ committing squashed WIP to bugfix/ABC-12345
|
|
35
|
+
→ writing wiki FigmaComponents/Core/Button
|
|
36
|
+
→ checking smoke smoke-push-retry
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Forbidden
|
|
40
|
+
|
|
41
|
+
- **No** ANSI color inside the line (runtimes may not render it).
|
|
42
|
+
- **No** emoji in the verb slot (they collide with the phase banner glyphs).
|
|
43
|
+
- **No** payload ≥ 120 chars — truncate target with an ellipsis before shipping.
|
|
44
|
+
- **No** hostnames, tokens, PATs, stderr blobs — emit as `…` and attach detail via telemetry, not the line.
|
|
45
|
+
- **No** buffered flushes. `stdout` is flushed inside the same call that produces the line.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## When to emit
|
|
50
|
+
|
|
51
|
+
Emit a progress line **at least** at every one of these moments:
|
|
52
|
+
|
|
53
|
+
### Phase 0 (Init)
|
|
54
|
+
- parse input, classify, token lookup per service, repo scan, worktree create (per repo in multi-repo), identity bind, state file write.
|
|
55
|
+
|
|
56
|
+
### Phase 1 (Analysis)
|
|
57
|
+
- explore-agent start, explore-agent finish, analyst synthesis start, analysis.json write.
|
|
58
|
+
|
|
59
|
+
### Phase 2 (Planning)
|
|
60
|
+
- plan draft start, plan render, user-approval prompt.
|
|
61
|
+
- **v5.3.0 Plan Approval Gate (normal mode only — skipped for `--dev`, `autopilot`, `--dev autopilot`):**
|
|
62
|
+
- `clarification-ask` per round — orchestrator writes structured questions when Phase 1 flagged ambiguity (missing acceptance criteria, no Figma/endpoint link, vague language, parent-story scope drift)
|
|
63
|
+
- `clarification-answer` per round — user reply captured into `state.phases["2"].clarificationAnswers`
|
|
64
|
+
- `plan-edit-request` per free-text edit — user-supplied revision instruction captured into `state.phases["2"].planEditRequests`
|
|
65
|
+
- `plan-approved` — terminal success, writes `state.phases["2"].planApprovedAt`
|
|
66
|
+
- `plan-aborted` — terminal failure (user typed `iptal`/`no`), sets `state.status = "paused"`
|
|
67
|
+
|
|
68
|
+
### Phase 3 (Dev — non-component)
|
|
69
|
+
- every TDD cycle step: read-target, write-test, run-test RED, write-code, run-test GREEN, run-build, wip-commit.
|
|
70
|
+
|
|
71
|
+
### Phase 3 (Component — figma-to-component subphases)
|
|
72
|
+
- subphase dispatch, Figma API call, token mapping, file write per artifact, build step, REVIEW.md gate.
|
|
73
|
+
|
|
74
|
+
### Phase 4 (Review)
|
|
75
|
+
- deterministic-gate per gate, reviewer dispatch per reviewer, reviewer finish per reviewer, triage start, triage verdict render, fix dispatch.
|
|
76
|
+
|
|
77
|
+
### Phase 5 (User Test)
|
|
78
|
+
- local-test prompt render; user-answer capture; if local-test selected: repo checkout, build instructions print.
|
|
79
|
+
|
|
80
|
+
### Phase 6 (Commit & PR)
|
|
81
|
+
- squash per repo, commit per repo, push per repo (each retry attempt), PR body generate (humanizer call), PR create per repo, Jira comment post.
|
|
82
|
+
|
|
83
|
+
### Phase 7 (Report)
|
|
84
|
+
- humanizer summary, wiki write (if enabled), Jira comment post (if enabled), Confluence publish (if enabled), metrics rollup, summary render.
|
|
85
|
+
|
|
86
|
+
### Sync / Setup / Utility commands
|
|
87
|
+
- file discovery, Keychain lookup, config read/write, prompt render.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Verbosity
|
|
92
|
+
|
|
93
|
+
Controlled by `prefs.global.settings.progressVerbosity`. Enum:
|
|
94
|
+
|
|
95
|
+
| Value | Emits | Default for |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| `quiet` | Phase banners + terminal prompts only | CI runs, automated tests |
|
|
98
|
+
| `normal` | Banners + the "when to emit" list above | interactive users (default) |
|
|
99
|
+
| `verbose` | Banners + everything in `normal` + sub-agent internal actions, file-level reads, schema validations, retry internals | autopilot (forced), debugging |
|
|
100
|
+
|
|
101
|
+
**Autopilot rule:** When `mode: "autopilot"` is set in agent state, progressVerbosity is forced to `verbose` regardless of the preference — rationale: user isn't watching live, so the log must be audit-grade.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Telemetry
|
|
106
|
+
|
|
107
|
+
Every emitted progress line also writes one `metrics.jsonl` event:
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"ts": "2026-04-16T17:22:04Z",
|
|
112
|
+
"event": "progress.step",
|
|
113
|
+
"taskId": "T-0042",
|
|
114
|
+
"phase": "phase-3-dev",
|
|
115
|
+
"step": "run-test RED",
|
|
116
|
+
"ms": 2318,
|
|
117
|
+
"ok": true
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
`ms` captures the elapsed time since the previous `progress.step` in the same phase. `ok: false` flags the step that immediately preceded a phase fail (used by `token-budget-report.mjs` to localise slow or failing steps).
|
|
122
|
+
|
|
123
|
+
Overhead: ~40 bytes / line + one millisecond clock read. Negligible vs. any of the actions being measured.
|
|
124
|
+
|
|
125
|
+
### Token telemetry forwarding
|
|
126
|
+
|
|
127
|
+
Every phase that dispatches a billable LLM agent MUST forward the call's token totals to the tracker so the agent-log Cost Breakdown stays complete. The single canonical call shape is:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
LOG_METRIC_FORWARD_TO_TRACKER=1 pipeline/scripts/log-metric.sh "$TASK_ID" <phase-id> <event> \
|
|
131
|
+
model=<opus|sonnet|haiku|gpt-5.4> \
|
|
132
|
+
tokens_in=$IN tokens_out=$OUT duration_ms=$DUR
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
`LOG_METRIC_FORWARD_TO_TRACKER=1` mirrors the same `tokens_in` / `tokens_out` / `model` into `phase-tracker.sh` so the JSONL metrics line and the tracker's per-phase accumulator stay in sync from one call site. The forward path is best-effort — if the tracker is missing or its file is unwritable, the JSONL write still succeeds. Without the flag the line is purely analytic and the cost block stays empty for that phase.
|
|
136
|
+
|
|
137
|
+
This contract is enforced by `smoke-agent-log-cost.sh` (forwarder unit test) and `smoke-tracker-contract.sh` (Phase 4 reviewer/triage emission).
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Phase adoption marker
|
|
142
|
+
|
|
143
|
+
Every phase doc under `refs/phases/` must contain the marker line exactly once:
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
<!-- progress-contract: applied -->
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The smoke scans all phase docs for this marker. A missing marker means the phase hasn't adopted the contract yet and fails CI. Adding the marker commits the phase to the contract — any PR that removes it must also remove the phase's progress emissions (no silent regression).
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Cross-CLI parity
|
|
154
|
+
|
|
155
|
+
The progress line shape and the `progress.step` event schema are part of the cross-CLI contract. Both Claude Code and Copilot CLI implementations emit identical bytes on the same action — the shape is **not** wrapped in CLI-specific prelude or color codes. `smoke-cross-cli-behavior.sh` includes a progress-line parity check.
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Multi-Agent Pipeline — Global Rules
|
|
2
|
+
|
|
3
|
+
> **TLDR** — Non-negotiable rules that apply to every phase, every mode, every action. Read once, enforce everywhere. If code / a commit / a PR body violates any rule below, stop and fix before proceeding.
|
|
4
|
+
|
|
5
|
+
## Language Application (read this FIRST in every run)
|
|
6
|
+
|
|
7
|
+
The pipeline has two language axes. Both MUST be applied from the very first turn, before any status text is rendered.
|
|
8
|
+
|
|
9
|
+
| Axis | Source | Used for |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| `prefs.global.outputLanguage` (default `"en"`) | Read at Phase 0 Step 0 | All assistant-authored conversational text: status updates, findings, phase headers in chat, summaries, error explanations, audit reports, picker `question` + `description` text, anything the user reads outside the structural UI chrome. |
|
|
12
|
+
| `prefs.global.promptLanguage` (locked to `"en"`) | Hard-coded `"en"` | `AskUserQuestion` `label` (button text) + `header` (chip), CLI host error UI, internal contract identifiers. |
|
|
13
|
+
|
|
14
|
+
### Per-field language matrix (canonical)
|
|
15
|
+
|
|
16
|
+
This is the single source of truth. When a contributor or model is unsure where a string lives, look here first.
|
|
17
|
+
|
|
18
|
+
| Field / surface | Language |
|
|
19
|
+
|--- |--- |
|
|
20
|
+
| Assistant chat replies (any phase) | `outputLanguage` |
|
|
21
|
+
| Phase headers in chat | `outputLanguage` |
|
|
22
|
+
| Phase tracker render labels | English (script chrome) |
|
|
23
|
+
| `AskUserQuestion.question` | `outputLanguage` |
|
|
24
|
+
| `AskUserQuestion.options[].description` | `outputLanguage` |
|
|
25
|
+
| `AskUserQuestion.options[].label` | English (UI button contract) |
|
|
26
|
+
| `AskUserQuestion.header` | English (≤12-char chip) |
|
|
27
|
+
| Confirmation prompt body (e.g. push y/n) | `outputLanguage` |
|
|
28
|
+
| GitHub issue comment body | `outputLanguage` |
|
|
29
|
+
| Wiki / Confluence page body | `outputLanguage` |
|
|
30
|
+
| Jira comment body (cross-link + summary) | `outputLanguage` |
|
|
31
|
+
| PR description body | `outputLanguage` |
|
|
32
|
+
| Commit subject + body | English (git convention) |
|
|
33
|
+
| Branch name | English (`feature/…`) |
|
|
34
|
+
| PR title prefix (`feat:`, `fix:`, …) | English (Conventional Commits) |
|
|
35
|
+
| Code identifiers, file paths, log lines | English (interop) |
|
|
36
|
+
| `agent-state.json` values | English (machine-readable) |
|
|
37
|
+
| `agent-log.md` entries | English (audit trail consistency) |
|
|
38
|
+
| Reviewer / triage system prompts | English (model contract) |
|
|
39
|
+
|
|
40
|
+
**Required steps**
|
|
41
|
+
|
|
42
|
+
1. At the very start of every run (Phase 0 Step 0, before any status output), call `jq -r '.global.outputLanguage // "en"'` on `$HOME/.claude/multi-agent-preferences.json`. Cache as `OUTPUT_LANG` for the session.
|
|
43
|
+
2. Render every assistant-authored line in `OUTPUT_LANG`. If the user types Turkish but `outputLanguage="en"` is set, follow the pref but suggest `/multi-agent:language tr` once.
|
|
44
|
+
3. `AskUserQuestion` `label` and `header` stay English regardless of `OUTPUT_LANG` (UI contract). `question` and `description` follow `OUTPUT_LANG` — the user reads them as conversational copy, not as button affordances.
|
|
45
|
+
4. Always English regardless of either axis: commit messages, PR titles, branch names, code identifiers, agent-state.json values, agent-log.md, reviewer/triage system prompts.
|
|
46
|
+
|
|
47
|
+
**Failure mode this prevents.** Entering `/multi-agent:dev`, `/multi-agent:autopilot`, `/multi-agent:local`, etc. and switching the assistant's conversational text or picker question copy to English while `outputLanguage="tr"` is set. The user sees a half-English half-Turkish dialogue, flagged as a pipeline bug, not a stylistic choice.
|
|
48
|
+
|
|
49
|
+
## Code & Commit Rules
|
|
50
|
+
|
|
51
|
+
- **NEVER** put "Copilot", "AI", "generated by", or similar attribution in code, comments, commit messages, PR descriptions, or issue comments. The pipeline is a tool — it writes on behalf of the configured Git identity, not as itself.
|
|
52
|
+
- **NEVER** commit without passing build (all gates in Phase 4 Step 1 must be green).
|
|
53
|
+
- **NEVER** commit without passing review (at least one AI reviewer must return `approved: true` with no blocking findings).
|
|
54
|
+
- **NEVER** skip tests. Every public method, every error path, every edge case.
|
|
55
|
+
- **Follow existing code style and conventions.** Read neighbor files before writing new ones — match naming, structure, import order.
|
|
56
|
+
- **Use design tokens, no magic numbers.** `16` → `.Spacing.spacing16`. `#E31837` → `Color.Primary.primary`. `.font(.system(size: 14))` → `.typographyStyle(.body1)`.
|
|
57
|
+
|
|
58
|
+
## Swift-Specific Rules
|
|
59
|
+
|
|
60
|
+
- **Xcode header on new Swift files:**
|
|
61
|
+
```swift
|
|
62
|
+
//
|
|
63
|
+
// {FileName}.swift
|
|
64
|
+
// {ModuleName}
|
|
65
|
+
//
|
|
66
|
+
// Created by {identity.name} on {DD.MM.YYYY}.
|
|
67
|
+
//
|
|
68
|
+
```
|
|
69
|
+
- No force unwraps (`!`) except IBOutlets. No force casts (`as!`) — use `as?` with `guard`.
|
|
70
|
+
- No `print()` — use `os_log` or `Logger`.
|
|
71
|
+
|
|
72
|
+
## Commit Format
|
|
73
|
+
|
|
74
|
+
| Scenario | Format |
|
|
75
|
+
| --------------------------- | ------------------------------------------- |
|
|
76
|
+
| Has Jira ID | `{type}({scope}): description [{jiraId}]` |
|
|
77
|
+
| No Jira (GitHub issue only) | `{type}({scope}): description [#{shortId}]` |
|
|
78
|
+
| Free-text task (no tracker) | `{type}({scope}): description` |
|
|
79
|
+
|
|
80
|
+
- **Types**: `feat`, `fix`, `refactor`, `test`, `docs`, `chore`, `style`, `perf`
|
|
81
|
+
- **Max first-line length**: 72 chars
|
|
82
|
+
- **Body** for "why", not "what"
|
|
83
|
+
- **Git author**: identity selected in Phase 0, from preferences file (not Keychain, not git global config)
|
|
84
|
+
|
|
85
|
+
## Branch Naming
|
|
86
|
+
|
|
87
|
+
- `feature/{jiraId}-{short-description}` for features
|
|
88
|
+
- `bugfix/{jiraId}-{short-description}` for fixes
|
|
89
|
+
- `hotfix/{description}` for emergency patches (no tracker required)
|
|
90
|
+
- `release/{version}` for release branches
|
|
91
|
+
|
|
92
|
+
## External System Outputs (PR descriptions, Jira comments, GitHub issue bodies)
|
|
93
|
+
|
|
94
|
+
**formatting contract (required)** — violating these produces unreadable output and is the single most common regression:
|
|
95
|
+
|
|
96
|
+
1. **Real newlines, never literal `\n`.** Shell strings like `"line1\nline2"` get saved verbatim by Bitbucket / Jira REST APIs — they render as literal `\n`, not line breaks.
|
|
97
|
+
|
|
98
|
+
✅ **Correct pattern** (heredoc → rawfile → data-binary):
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
cat > /tmp/body.md <<'EOF'
|
|
102
|
+
## Summary
|
|
103
|
+
|
|
104
|
+
- bullet 1
|
|
105
|
+
- bullet 2
|
|
106
|
+
EOF
|
|
107
|
+
|
|
108
|
+
jq -n --rawfile body /tmp/body.md '{description: $body}' > /tmp/payload.json
|
|
109
|
+
|
|
110
|
+
curl -s -X POST -H "Content-Type: application/json" \
|
|
111
|
+
--data-binary @/tmp/payload.json \
|
|
112
|
+
"$API_URL"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
❌ **Wrong**: `-d '{"description": "## Summary\n- bullet"}'` → renders literal `\n`.
|
|
116
|
+
|
|
117
|
+
2. **Never use HTML entities** in titles, commit messages, task subjects, or body text: `&`, `<`, `"`, `'` are NOT decoded by Bitbucket / Jira / GitHub. They appear literally. Use plain `&`, `<`, `"`, `'`.
|
|
118
|
+
|
|
119
|
+
3. **Never hand-concatenate JSON** for bodies with special characters. Use `jq` (which escapes correctly) or `jq --rawfile` (which preserves bytes exactly).
|
|
120
|
+
|
|
121
|
+
4. **Terminal output, log lines, and `echo`/`printf` calls** also use real newlines — never `\n` literals. For multi-line messages, prefer heredoc.
|
|
122
|
+
|
|
123
|
+
## Issue Management
|
|
124
|
+
|
|
125
|
+
- **NEVER auto-close** GitHub issues or Jira tickets. Closure requires team review (configurable, typically 4 approvals).
|
|
126
|
+
- PR body: use `Ref: #N`, `Related: #N`, or `See: {jiraId}` — NEVER `Closes #N`, `Fixes #N`, `Resolves #N` (GitHub auto-closes on merge).
|
|
127
|
+
- Jira auto-close keywords forbidden for the same reason.
|
|
128
|
+
|
|
129
|
+
## Reviewers (Every PR)
|
|
130
|
+
|
|
131
|
+
- **Default reviewers are required** on every PR.
|
|
132
|
+
- **Bitbucket**: fetch from default-reviewers REST endpoint, filter out PR author, include in payload (empty `reviewers: []` means "no reviewers" — a regression, not a default).
|
|
133
|
+
- **GitHub**: rely on CODEOWNERS + branch protection required reviewers; fall back to `prefs.projects[{p}].githubDefaultReviewers` if none configured.
|
|
134
|
+
- **Every Bitbucket PUT must include** `reviewers`, `fromRef`, `toRef`, `draft` — missing fields wipe the existing values (Bitbucket treats omission as empty).
|
|
135
|
+
|
|
136
|
+
## Build Queue
|
|
137
|
+
|
|
138
|
+
- All `xcodebuild` / `xcodebuild test` calls acquire `/tmp/claude-xcodebuild.lock` before running. Parallel Xcode builds corrupt DerivedData and simulator state.
|
|
139
|
+
- Each worktree uses its own `-derivedDataPath "{worktreePath}/.DerivedData"` to prevent cross-contamination.
|
|
140
|
+
- Lock auto-releases; stale locks (>15min) get force-cleaned.
|
|
141
|
+
- Non-Xcode builds (Gradle, npm, Python) don't need the lock — they handle their own concurrency.
|
|
142
|
+
|
|
143
|
+
## Retry Discipline
|
|
144
|
+
|
|
145
|
+
- **3-iteration hard kill** on any retry loop (build fix, review fix, mutation verify). On the 4th failure, pause and ask the user. No exceptions.
|
|
146
|
+
- **Reflection prompt before retry**: "What failed? What specific change fixes it? Am I repeating the same approach?"
|
|
147
|
+
- **Never blindly retry** the identical action — diagnose the root cause first.
|
|
148
|
+
|
|
149
|
+
## Secrets & Sensitive Files
|
|
150
|
+
|
|
151
|
+
- **NEVER commit** secrets, tokens, keys, certificates, `.env` files, `Pods/`, `.build/`, `DerivedData/`, `.worktrees/`, or `agent-log.md` / `agent-state.json`.
|
|
152
|
+
- Stage files by name (`git add path/to/file.swift`) — never `git add -A` or `git add .` (accidentally includes sensitive files and agent artifacts).
|
|
153
|
+
- Secret scan runs as Phase 4 Gate 4 — if any hit, fix immediately before proceeding.
|
|
154
|
+
|
|
155
|
+
## Provider CLI Invocations
|
|
156
|
+
|
|
157
|
+
Provider tools that print failed argv on retry leak credentials into the conversation transcript. Every Vercel call from the pipeline (Phase 6 deploy hooks, Phase 7 site updates, manual `vercel deploy` shells) MUST go through the wrapper:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# CORRECT — token via env var, output redacted automatically. Token resolution
|
|
161
|
+
# goes through the cross-platform credential helper so the same snippet works
|
|
162
|
+
# on macOS / Linux / Windows installs:
|
|
163
|
+
VERCEL_TOKEN="$(~/.claude/lib/credential-store.sh get mmerterden_Vercel_Access_Token)" \
|
|
164
|
+
bash $HOME/.claude/scripts/vercel-deploy.sh deploy --prod
|
|
165
|
+
|
|
166
|
+
# Health check before deploy:
|
|
167
|
+
bash $HOME/.claude/scripts/vercel-deploy.sh doctor
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Forbidden:**
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# Vercel CLI prints argv on retry → token leaks to transcript.
|
|
174
|
+
vercel deploy --token=vcp_…
|
|
175
|
+
vercel deploy --token "$VERCEL_TOKEN"
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
The wrapper at `pipeline/lib/vercel-deploy.sh` (installed to `~/.claude/scripts/vercel-deploy.sh` and `~/.copilot/scripts/vercel-deploy.sh`) refuses any `--token=` argv input, runs the CLI with `VERCEL_TOKEN` env, and pipes every stdout/stderr line through a redact filter that scrubs `vcp_…`, `Bearer …`, and JSON-body token shapes. Regression gate: `smoke-vercel-deploy-redact.sh` (12 assertions).
|
|
179
|
+
|
|
180
|
+
Same rule applies to any future provider wrapper (e.g. `cloudflare-deploy.sh`, `npm-publish.sh`) — never pass tokens via argv when the underlying CLI may echo argv on failure.
|
|
181
|
+
|
|
182
|
+
## Subagent Contract
|
|
183
|
+
|
|
184
|
+
- Every subagent (Explore, code-reviewer, architect, dev task) returns **structured JSON**, not prose:
|
|
185
|
+
```json
|
|
186
|
+
{"status": "complete", "findings": [...], "files_changed": [...], "blocking": false}
|
|
187
|
+
```
|
|
188
|
+
- Subagents receive **minimum viable context** — diff + relevant files, never the whole repo.
|
|
189
|
+
- Subagents never write state, never post to external systems — the orchestrator owns side effects.
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
## SwiftUI Component Generation Guide (Generic)
|
|
2
|
+
|
|
3
|
+
When the task involves creating a SwiftUI component (any project), follow this architecture.
|
|
4
|
+
These practices come from the battle-tested Figma-to-SwiftUI pipeline — apply them in every iOS project.
|
|
5
|
+
|
|
6
|
+
### Component Architecture: Configuration / View / Modifiers
|
|
7
|
+
|
|
8
|
+
| File | When | Content |
|
|
9
|
+
| --------------------------- | ------------------ | ------------------------------------------- |
|
|
10
|
+
| `{Name}Configuration.swift` | Complex (>3 props) | Pure value type, all declarative properties |
|
|
11
|
+
| `{Name}View.swift` | Always | SwiftUI view, renders Configuration |
|
|
12
|
+
| `{Name}+Modifiers.swift` | Complex | Fluent modifier API chain |
|
|
13
|
+
| `{Name}Preview.swift` | Always | All meaningful variant previews |
|
|
14
|
+
| `{Name}Tests.swift` | Always | ViewInspector + Unit tests |
|
|
15
|
+
|
|
16
|
+
### Simple vs Complex Decision
|
|
17
|
+
|
|
18
|
+
- **<=3 properties** -> Simple: all props in View directly, no Configuration struct
|
|
19
|
+
- **>3 properties** -> Complex: separate Configuration struct + Modifiers extension
|
|
20
|
+
- **Variant-driven** (e.g. style enum with 5+ cases) -> Always Complex, even if few props
|
|
21
|
+
|
|
22
|
+
### Configuration Purity Rules
|
|
23
|
+
|
|
24
|
+
Configuration is a **pure value type** — zero side effects, zero view logic:
|
|
25
|
+
|
|
26
|
+
```swift
|
|
27
|
+
// Configuration: VALUES ONLY
|
|
28
|
+
struct ButtonConfiguration {
|
|
29
|
+
var title: String = ""
|
|
30
|
+
var style: ButtonStyle = .primary
|
|
31
|
+
var size: ButtonSize = .medium
|
|
32
|
+
var isEnabled: Bool = true
|
|
33
|
+
var leadingIcon: Image? = nil
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**What should NOT be in Configuration:**
|
|
38
|
+
|
|
39
|
+
- `@Binding`, `@State`, `@ObservedObject` — these belong in View
|
|
40
|
+
- Closures (`onTap: () -> Void`) — these belong in View
|
|
41
|
+
- `@ViewBuilder` content — View
|
|
42
|
+
- Computed properties — logic stays in View
|
|
43
|
+
- Any protocol conformance except `Equatable`, `Hashable`, `Sendable`
|
|
44
|
+
|
|
45
|
+
### Fluent Modifier Pattern
|
|
46
|
+
|
|
47
|
+
```swift
|
|
48
|
+
extension ButtonView {
|
|
49
|
+
func title(_ value: String) -> ButtonView {
|
|
50
|
+
var config = configuration
|
|
51
|
+
config.title = value
|
|
52
|
+
return ButtonView(configuration: config)
|
|
53
|
+
}
|
|
54
|
+
func style(_ value: ButtonStyle) -> ButtonView {
|
|
55
|
+
var config = configuration
|
|
56
|
+
config.style = value
|
|
57
|
+
return ButtonView(configuration: config)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Usage: ButtonView().title("OK").style(.secondary)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Token Discipline
|
|
64
|
+
|
|
65
|
+
**Zero magic numbers. Zero raw colors. Zero raw fonts.**
|
|
66
|
+
|
|
67
|
+
| Bad | Good |
|
|
68
|
+
| ------------------------------ | ------------------------------------------------ |
|
|
69
|
+
| `padding: 16` | `.padding(.Spacing.spacing16)` or named constant |
|
|
70
|
+
| `Color(hex: "#E31837")` | `Color.Primary.primary` or semantic token |
|
|
71
|
+
| `.font(.system(size: 14))` | `.typographyStyle(.body1)` or project typography |
|
|
72
|
+
| `cornerRadius: 8` | `.Radius.radius8` or named constant |
|
|
73
|
+
| `frame(width: 44, height: 44)` | `.Size.size44` or `minTapTarget` constant |
|
|
74
|
+
|
|
75
|
+
If the project has no design token system, create named constants at file scope:
|
|
76
|
+
|
|
77
|
+
```swift
|
|
78
|
+
private enum Layout {
|
|
79
|
+
static let horizontalPadding: CGFloat = 16
|
|
80
|
+
static let cornerRadius: CGFloat = 8
|
|
81
|
+
static let iconSize: CGFloat = 24
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Variant-Driven Implementation
|
|
86
|
+
|
|
87
|
+
When a component has variants (style, size, state), derive ALL visual differences from the variant enum:
|
|
88
|
+
|
|
89
|
+
```swift
|
|
90
|
+
enum ButtonStyle {
|
|
91
|
+
case primary, secondary, ghost
|
|
92
|
+
|
|
93
|
+
var backgroundColor: Color {
|
|
94
|
+
switch self {
|
|
95
|
+
case .primary: return .Primary.primary
|
|
96
|
+
case .secondary: return .Surface.surfaceSecondary
|
|
97
|
+
case .ghost: return .clear
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Never use `if/else` chains in the View body for variant styling** — push it into the enum or configuration.
|
|
104
|
+
|
|
105
|
+
### Nested Component Handling
|
|
106
|
+
|
|
107
|
+
If the design contains sub-components (e.g. a Card with an inner Badge):
|
|
108
|
+
|
|
109
|
+
1. Check if the sub-component already exists in the project — **reuse it**
|
|
110
|
+
2. If not, decide: inline (simple, <3 props) or extract (reusable, complex)
|
|
111
|
+
3. Pass sub-component configuration through parent: `CardConfiguration.badgeConfig: BadgeConfiguration?`
|
|
112
|
+
|
|
113
|
+
### Accessibility Requirements
|
|
114
|
+
|
|
115
|
+
Every interactive element MUST have:
|
|
116
|
+
|
|
117
|
+
- `accessibilityLabel` — what it is (e.g. "Submit button")
|
|
118
|
+
- `accessibilityHint` — what it does (e.g. "Submits the form") — only if not obvious from label
|
|
119
|
+
- `accessibilityIdentifier` — for UI testing (e.g. `"button_submit"`)
|
|
120
|
+
- Correct traits: `.isButton`, `.isHeader`, `.isSelected`, `.isToggle`
|
|
121
|
+
- Minimum tap target: **44x44pt** (Apple HIG)
|
|
122
|
+
|
|
123
|
+
```swift
|
|
124
|
+
Button(action: onTap) { ... }
|
|
125
|
+
.accessibilityLabel(configuration.accessibilityLabel)
|
|
126
|
+
.accessibilityIdentifier(TestingIdentifiers.submitButton)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Preview Best Practices
|
|
130
|
+
|
|
131
|
+
Previews must show **all meaningful variants**, not just the default:
|
|
132
|
+
|
|
133
|
+
```swift
|
|
134
|
+
#Preview("Default") { ButtonView() }
|
|
135
|
+
#Preview("Secondary") { ButtonView().style(.secondary) }
|
|
136
|
+
#Preview("Disabled") { ButtonView().disabled(true) }
|
|
137
|
+
#Preview("With Icon") { ButtonView().leadingIcon(Image(systemName: "star")) }
|
|
138
|
+
#Preview("RTL") { ButtonView().environment(\.layoutDirection, .rightToLeft) }
|
|
139
|
+
#Preview("Dark Mode") { ButtonView().preferredColorScheme(.dark) }
|
|
140
|
+
#Preview("Large Text") { ButtonView().dynamicTypeSize(.xxxLarge) }
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 3-Layer Test Strategy
|
|
144
|
+
|
|
145
|
+
| Layer | Tool | Validates | Priority |
|
|
146
|
+
| ---------- | -------------- | ----------------------------------------------------- | ----------------------- |
|
|
147
|
+
| Structural | ViewInspector | Hierarchy, subview existence, applied modifiers | P0 — always |
|
|
148
|
+
| Visual | Snapshot Tests | Pixel render: light/dark, RTL/LTR, Dynamic Type | P1 — complex components |
|
|
149
|
+
| Behavioral | Unit Tests | State changes, closure calls, configuration mutations | P0 — always |
|
|
150
|
+
|
|
151
|
+
**Test naming:** `test_{scenario}_{expected}` or `test_{whatItDoes}`
|
|
152
|
+
|
|
153
|
+
```swift
|
|
154
|
+
// ViewInspector — structure
|
|
155
|
+
func test_hasTitle() throws {
|
|
156
|
+
let sut = ButtonView(configuration: .init(title: "OK"))
|
|
157
|
+
let text = try sut.inspect().find(text: "OK")
|
|
158
|
+
XCTAssertNotNil(text)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Unit — configuration mutation via modifier
|
|
162
|
+
func test_titleModifier_updatesConfiguration() {
|
|
163
|
+
let sut = ButtonView().title("Submit")
|
|
164
|
+
XCTAssertEqual(sut.configuration.title, "Submit")
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Snapshot — visual regression
|
|
168
|
+
func test_snapshot_light_primary() {
|
|
169
|
+
assertSnapshot(of: ButtonView(configuration: .init(title: "OK")),
|
|
170
|
+
as: .image(layout: .device(config: .iPhone13)))
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Build Verification
|
|
175
|
+
|
|
176
|
+
After implementation, **always run build before considering complete**:
|
|
177
|
+
|
|
178
|
+
- Fix all compiler errors
|
|
179
|
+
- Fix all warnings in the component files
|
|
180
|
+
- Ensure previews render without crash
|
|
181
|
+
|
|
182
|
+
### Component Quality Checklist
|
|
183
|
+
|
|
184
|
+
Before marking a component as done:
|
|
185
|
+
|
|
186
|
+
1. No magic numbers — all values are tokens or named constants
|
|
187
|
+
2. Configuration purity — no side-effects, closures, or view logic in Config
|
|
188
|
+
3. Modifier chain works — each modifier returns a new View with updated config
|
|
189
|
+
4. Accessibility — labels, hints, identifiers, traits, 44pt tap targets
|
|
190
|
+
5. Preview coverage — all meaningful variants, dark mode, RTL, Dynamic Type
|
|
191
|
+
6. Tests — structural (ViewInspector) + behavioral (Unit), snapshot if complex
|
|
192
|
+
7. Dark mode — correct in both color schemes
|
|
193
|
+
8. Dynamic Type — text scales without layout breaking
|
|
194
|
+
9. RTL — leading/trailing used, layout mirrors correctly
|
|
195
|
+
10. Variant exhaustiveness — all enum cases handled, no default catch-all
|
|
196
|
+
11. Build passes — zero errors, zero warnings on component files
|
|
197
|
+
12. Self-documenting — code is clear without comments, MARK sections organized
|
|
198
|
+
|
|
199
|
+
### Compliance Rules (maps to dev-toolkit MCP audit tools)
|
|
200
|
+
|
|
201
|
+
These rules ensure your code passes `ios_accessibility_audit` and `ios_app_store_audit` without issues. Follow them during development — don't wait for audit to catch problems.
|
|
202
|
+
|
|
203
|
+
#### Accessibility (validated by `ios_accessibility_audit`)
|
|
204
|
+
|
|
205
|
+
| Rule | What Audit Checks | How to Pass |
|
|
206
|
+
| ------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------- |
|
|
207
|
+
| Every interactive element has `accessibilityLabel` | Missing label on Button, Link, TextField, Toggle, Slider | `.accessibilityLabel("Submit order")` |
|
|
208
|
+
| Every interactive element has `accessibilityIdentifier` | Missing identifier | `.accessibilityIdentifier("button_submit")` |
|
|
209
|
+
| Minimum tap target 44x44pt | Frame size < 44x44 | `.frame(minWidth: 44, minHeight: 44)` |
|
|
210
|
+
| Correct traits | Not checked by tool, but best practice | `.accessibilityAddTraits(.isButton)` |
|
|
211
|
+
|
|
212
|
+
```swift
|
|
213
|
+
// This PASSES audit:
|
|
214
|
+
Button(action: onTap) {
|
|
215
|
+
Image(systemName: "xmark")
|
|
216
|
+
}
|
|
217
|
+
.accessibilityLabel("Close")
|
|
218
|
+
.accessibilityIdentifier("button_close")
|
|
219
|
+
.frame(minWidth: 44, minHeight: 44)
|
|
220
|
+
|
|
221
|
+
// This FAILS audit:
|
|
222
|
+
Button(action: onTap) { // no label
|
|
223
|
+
Image(systemName: "xmark") // no identifier
|
|
224
|
+
} // no min frame
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
#### Release Compliance (validated by `ios_app_store_audit`)
|
|
228
|
+
|
|
229
|
+
| Rule | What Audit Checks | How to Pass |
|
|
230
|
+
| -------------------------------- | ------------------------------------------------- | ------------------------------------------------------------------------ |
|
|
231
|
+
| No debug tools in release | FLEX, Reveal, CocoaDebug, Pulse symbols in binary | `#if DEBUG` around debug imports, never link debug frameworks in Release |
|
|
232
|
+
| ATS enforced | `NSAllowsArbitraryLoads = true` in Info.plist | Remove ATS exception or add justification per domain |
|
|
233
|
+
| Privacy manifest present | Missing `PrivacyInfo.xcprivacy` | Add manifest, declare Required Reason APIs |
|
|
234
|
+
| Privacy strings for permissions | Missing `NS*UsageDescription` keys | Add all needed `NSCameraUsageDescription` etc. in Info.plist |
|
|
235
|
+
| No debug entitlements in release | `get-task-allow = true` | Use Release/Distribution profile, not Debug |
|
|
236
|
+
| Bundle version set | Missing `CFBundleShortVersionString` | Always set in Info.plist or build settings |
|
|
237
|
+
|
|
238
|
+
```swift
|
|
239
|
+
// Debug tools: guard with #if DEBUG
|
|
240
|
+
#if DEBUG
|
|
241
|
+
import FLEX
|
|
242
|
+
#endif
|
|
243
|
+
|
|
244
|
+
// App startup:
|
|
245
|
+
#if DEBUG
|
|
246
|
+
FLEXManager.shared.showExplorer()
|
|
247
|
+
#endif
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Figma URL Given
|
|
251
|
+
|
|
252
|
+
If user provides a Figma URL, use Figma MCP tools (get_design_context, get_screenshot) to fetch design data, map to project tokens, and apply Configuration/View/Modifiers pattern.
|
|
253
|
+
|
|
254
|
+
For figma project specifically: multi-agent reads `.instructions/figma/` SKILL.md files for the full 8-phase pipeline.
|