@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,695 @@
|
|
|
1
|
+
# PHASE 4B — View Implementation + Preview
|
|
2
|
+
|
|
3
|
+
Write the main View struct and Preview.
|
|
4
|
+
This is the most critical implementation phase — it produces the actual SwiftUI component.
|
|
5
|
+
|
|
6
|
+
required — always execute this phase.
|
|
7
|
+
PARALLEL WITH: Phase 4A (Configuration), Phase 4C (FIGMA.md)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## CONTEXT VARIABLES
|
|
12
|
+
|
|
13
|
+
These are provided by the orchestrator in the dispatch prompt:
|
|
14
|
+
- `componentName` — e.g., "LabelBadge"
|
|
15
|
+
- `componentLocation` — e.g., "Sources/UIComponents/.../LabelBadge/"
|
|
16
|
+
- `artifactPath` — path to implementation artifacts
|
|
17
|
+
- `nodeId` — Figma node ID
|
|
18
|
+
- `fileKey` — Figma file key
|
|
19
|
+
- `complexity` — SIMPLE or COMPLEX
|
|
20
|
+
- `gitUser` — from `git config user.name`
|
|
21
|
+
- `date` — current date in DD.MM.YYYY format
|
|
22
|
+
- `issueNumber` — GitHub issue number (e.g., "340"). May be empty if not available.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## PRE-CHECK
|
|
27
|
+
|
|
28
|
+
Read all required analysis files **in this order** (compact context first, large files last):
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
{artifactPath}/pass1/component_summary.json → Component overview (~100 lines) — READ FIRST
|
|
32
|
+
{artifactPath}/pass3/00_property_coverage.json → Property mandate (IMPLEMENT/SKIP/DEFER)
|
|
33
|
+
{artifactPath}/pass3/07_implementation_spec.md → Compiled blueprint
|
|
34
|
+
{artifactPath}/pass3/04b_component_architecture.md → API shape, enums, properties
|
|
35
|
+
{artifactPath}/pass3/04c_variant_config_analysis.json → Boolean classifications, sub-component types (from 3H)
|
|
36
|
+
{artifactPath}/pass3/02_token_mapping.md → Swift token usage patterns
|
|
37
|
+
{artifactPath}/pass3/03_nested_components.md → Child component init signatures
|
|
38
|
+
{artifactPath}/pass3/08_utility_integration.md → Testing IDs, accessibility, analytics
|
|
39
|
+
{artifactPath}/pass3/04_patterns.md → Dimensions, variant examples
|
|
40
|
+
{artifactPath}/pass1/screenshot.png → Visual reference
|
|
41
|
+
{artifactPath}/pass1/design_context_response.json → Layout hierarchy (ONLY if needed for complex layout detail)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
If `component_summary.json` does not exist, fall back to reading `component_properties.json` directly.
|
|
45
|
+
If `00_property_coverage.json` does not exist, proceed without it (backward compatibility with pre-3G components).
|
|
46
|
+
|
|
47
|
+
Read macros reference:
|
|
48
|
+
```
|
|
49
|
+
.instructions/figma/figma-to-swiftui/reference/macros.md
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Read effects conversion reference (shadows, blur, gradients, animations):
|
|
53
|
+
```
|
|
54
|
+
.instructions/figma/figma-to-swiftui/reference/figma-to-swiftui-effects.md
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**(strict) CSS effect lookup:** If `design_context_response.json` contains any of `backdrop-blur-[...]`, `backdrop-filter`, `filter: blur(...)`, `box-shadow`, `linear-gradient(...deg, ...)`, you MUST apply the mapping from `figma-to-swiftui-effects.md` verbatim. Cite the section number in a code comment next to the translated line.
|
|
58
|
+
|
|
59
|
+
**ANTI-PATTERN — do NOT reach for system Materials:** CSS `backdrop-blur-[Npx]` maps to `.blur(radius: N/2)` per effects-reference §2 — NOT to `.ultraThinMaterial`, `.regularMaterial`, or `.thinMaterial`. iOS Materials adapt their tint based on underlying content (darker on dark backgrounds, lighter on light) which does not match CSS `backdrop-filter` semantics. Use a plain gradient/fill + `.blur(radius:)` following the reference. If a stroke border must stay sharp, put it in an overlay above the blurred layer.
|
|
60
|
+
|
|
61
|
+
If any required file is missing:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
STATUS: HALT
|
|
65
|
+
PHASE: phase-4b
|
|
66
|
+
GATE: PRE_CHECK
|
|
67
|
+
REASON: Required artifacts missing.
|
|
68
|
+
COMPLETED_GATES: []
|
|
69
|
+
ARTIFACTS_CREATED: none
|
|
70
|
+
USER_ACTION_REQUIRED: Run Phase 3 first.
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## GATE 1: FILE_HEADER
|
|
76
|
+
|
|
77
|
+
```swift
|
|
78
|
+
//
|
|
79
|
+
// {ComponentName}.swift
|
|
80
|
+
// UIComponents
|
|
81
|
+
//
|
|
82
|
+
// Created by {gitUser} on {date}.
|
|
83
|
+
//
|
|
84
|
+
|
|
85
|
+
import SwiftUI
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Import resolution
|
|
89
|
+
|
|
90
|
+
Add imports based on what the component needs:
|
|
91
|
+
|
|
92
|
+
| Condition | Import | When |
|
|
93
|
+
|-----------|--------|------|
|
|
94
|
+
| COMPLEX component | `import UIMacros` | @GenerateViewConfiguration macro |
|
|
95
|
+
| Design tokens used | `import UIAssetTokens` | Color, Spacing, Radius, Font tokens |
|
|
96
|
+
| Utility modifiers | `import UIComponentUtilities` | Testing IDs, accessibility, analytics |
|
|
97
|
+
| Direct analytics | `import AnalyticsEvents` | Direct `.track()` calls |
|
|
98
|
+
| Nested component from another module | `import {ModuleName}` | Cross-module dependency |
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## GATE 2: CONSTANTS
|
|
103
|
+
|
|
104
|
+
Extract ALL raw numbers from Figma metadata and design_context. No magic numbers in the body.
|
|
105
|
+
|
|
106
|
+
INPUT: `pass3/04_patterns.md` → Dimensions section
|
|
107
|
+
INPUT: `pass1/design_context_response.json` → any raw values (opacity, gradient stops, etc.)
|
|
108
|
+
|
|
109
|
+
```swift
|
|
110
|
+
private enum Constants {
|
|
111
|
+
static let width: CGFloat = {from metadata}
|
|
112
|
+
static let height: CGFloat = {from metadata}
|
|
113
|
+
// Only values NOT covered by design tokens
|
|
114
|
+
// Do NOT duplicate token values here (spacing, radius, colors are tokens)
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Rules:**
|
|
119
|
+
- Spacing values → use `.Spacing.spacingN` tokens, NOT constants
|
|
120
|
+
- Radius values → use `.Radius.radiusN` tokens, NOT constants
|
|
121
|
+
- Colors → use `Color.Namespace.tokenName` tokens, NOT constants
|
|
122
|
+
- Only truly component-specific numbers go in Constants (opacity, gradient stops, fixed dimensions)
|
|
123
|
+
- If no component-specific constants exist, omit the Constants enum entirely
|
|
124
|
+
|
|
125
|
+
**Constants Placement Rule:**
|
|
126
|
+
- Constants MUST be `private enum Constants` nested INSIDE the View struct, NOT at file scope
|
|
127
|
+
- Place it as the first item inside the struct, before `// MARK: - Properties`
|
|
128
|
+
- Token values (`.Spacing.*`, `.Radius.*`, `Color.*`, `.Size.*`) are used directly in the body — do NOT wrap them in Constants
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## GATE 2.5: PROPERTY_MANDATE_CHECK
|
|
133
|
+
|
|
134
|
+
**If `pass3/00_property_coverage.json` exists**, verify that every property with `status: "IMPLEMENT"` has a corresponding Swift init parameter or configuration property in the view being implemented.
|
|
135
|
+
|
|
136
|
+
For each IMPLEMENT property:
|
|
137
|
+
- VARIANT → must have an enum type and init parameter
|
|
138
|
+
- BOOLEAN → must have a Bool parameter (or merged into Optional per Boolean Visibility Merge Rule)
|
|
139
|
+
- TEXT → must have a String parameter
|
|
140
|
+
- INSTANCE_SWAP → must have an Image?, AnyView?, or typed view parameter, OR be documented as fixed in FIGMA.md
|
|
141
|
+
|
|
142
|
+
If any IMPLEMENT property is missing from the view's init:
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
STATUS: HALT
|
|
146
|
+
PHASE: phase-4b
|
|
147
|
+
GATE: PROPERTY_MANDATE_CHECK
|
|
148
|
+
REASON: IMPLEMENT property not exposed in view init.
|
|
149
|
+
MISSING_PROPERTIES: [{list names and expected Swift types}]
|
|
150
|
+
COMPLETED_GATES: [PRE_CHECK, FILE_HEADER, CONSTANTS, VIEW_STRUCT]
|
|
151
|
+
ARTIFACTS_CREATED:
|
|
152
|
+
- {componentLocation}/{ComponentName}.swift (partial)
|
|
153
|
+
USER_ACTION_REQUIRED: Options:
|
|
154
|
+
1) Add the missing properties to the view
|
|
155
|
+
2) Update 00_property_coverage.json to mark as SKIP with reason
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
If `00_property_coverage.json` does not exist, skip this gate (backward compatibility).
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## GATE 3: VIEW_STRUCT
|
|
163
|
+
|
|
164
|
+
> **Issue link:** If `issueNumber` is provided, include the `/// Issue:` doc comment line. If empty or not available, omit the line entirely.
|
|
165
|
+
|
|
166
|
+
### SIMPLE component (≤3 properties)
|
|
167
|
+
|
|
168
|
+
```swift
|
|
169
|
+
/// {Brief description of component}
|
|
170
|
+
///
|
|
171
|
+
/// Figma: [{ComponentName}](https://www.figma.com/design/{fileKey}/?node-id={nodeId})
|
|
172
|
+
/// Issue: [#{issueNumber}](https://github.com/{github.componentsRepo}/issues/{issueNumber})
|
|
173
|
+
public struct {ComponentName}: View {
|
|
174
|
+
// MARK: - Properties
|
|
175
|
+
|
|
176
|
+
{All properties from Final API Design — public let}
|
|
177
|
+
|
|
178
|
+
// MARK: - Initialization
|
|
179
|
+
|
|
180
|
+
public init(
|
|
181
|
+
{param1}: {Type},
|
|
182
|
+
{param2}: {Type} = {default}
|
|
183
|
+
) {
|
|
184
|
+
self.{param1} = {param1}
|
|
185
|
+
self.{param2} = {param2}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// MARK: - Body
|
|
189
|
+
|
|
190
|
+
public var body: some View {
|
|
191
|
+
{implementation}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
**CRITICAL — Type Placement:**
|
|
197
|
+
- ALL component-specific enums/types MUST be nested inside the View struct (SIMPLE) or Configuration struct (COMPLEX)
|
|
198
|
+
- **For COMPLEX components: ALL data model types MUST be defined inside `{ComponentName}Configuration`, NOT inside the View struct.** The View then exposes them via `public typealias` for backwards-compatible API: `public typealias MyType = {ComponentName}Configuration.MyType`
|
|
199
|
+
- NEVER define them as top-level types outside the struct
|
|
200
|
+
- NEVER define data model types inside a COMPLEX View struct — they belong in Configuration
|
|
201
|
+
- Name them WITHOUT the component prefix: `Size` not `{ComponentName}Size`, `State` not `{ComponentName}State`
|
|
202
|
+
- Extensions on nested types use `extension {ComponentName}.TypeName { }` after the struct closing brace
|
|
203
|
+
|
|
204
|
+
For SIMPLE components, define enums inside the View struct:
|
|
205
|
+
|
|
206
|
+
```swift
|
|
207
|
+
public struct {ComponentName}: View {
|
|
208
|
+
// MARK: - Types
|
|
209
|
+
|
|
210
|
+
public enum State: String, CaseIterable, Sendable {
|
|
211
|
+
case active
|
|
212
|
+
case inactive
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// MARK: - Properties
|
|
216
|
+
|
|
217
|
+
private let state: State
|
|
218
|
+
// ...
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Extensions on nested types go after the struct
|
|
222
|
+
extension {ComponentName}.State {
|
|
223
|
+
var backgroundColor: Color {
|
|
224
|
+
switch self {
|
|
225
|
+
case .active: return .Success.n100
|
|
226
|
+
case .inactive: return .Background.backgroundGrey
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### COMPLEX component (>3 properties)
|
|
233
|
+
|
|
234
|
+
```swift
|
|
235
|
+
/// {Brief description of component}
|
|
236
|
+
///
|
|
237
|
+
/// Figma: [{ComponentName}](https://www.figma.com/design/{fileKey}/?node-id={nodeId})
|
|
238
|
+
/// Issue: [#{issueNumber}](https://github.com/{github.componentsRepo}/issues/{issueNumber})
|
|
239
|
+
@GenerateViewConfiguration
|
|
240
|
+
public struct {ComponentName}: View {
|
|
241
|
+
// MARK: - Properties
|
|
242
|
+
|
|
243
|
+
private let configuration: {ComponentName}Configuration
|
|
244
|
+
// Closure dependencies (from always-present actions)
|
|
245
|
+
private let primaryAction: () -> Void
|
|
246
|
+
// Optional closure dependencies (from PAIRED_ACTION_SUBCOMPONENT)
|
|
247
|
+
private var secondaryAction: (() -> Void)?
|
|
248
|
+
|
|
249
|
+
// MARK: - Initialization
|
|
250
|
+
|
|
251
|
+
public init({requiredDynamicProps}, {requiredClosures}) {
|
|
252
|
+
self.configuration = .init({requiredDynamicProps})
|
|
253
|
+
self.{closure} = {closure}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// MARK: - Body
|
|
257
|
+
|
|
258
|
+
public var body: some View {
|
|
259
|
+
{implementation}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**CRITICAL for COMPLEX:**
|
|
265
|
+
- `@GenerateViewConfiguration` macro generates ONLY:
|
|
266
|
+
- `configured(_:)` method — post-init configuration transform
|
|
267
|
+
- **AI writes the custom init** — the macro does NOT generate inits
|
|
268
|
+
- **Phase 4E writes +Modifiers** — View-level forwarding modifiers (`.state()`, `.title()`, etc.) are written by AI in +Modifiers.swift because Swift macros cannot introspect the Configuration struct
|
|
269
|
+
- Init includes **required dynamic props** as direct parameters + **required closures**
|
|
270
|
+
- Optional props with defaults → set via chain modifiers (generated by macro)
|
|
271
|
+
- Configuration is `private let` — the macro-generated `configured()` method reconstructs via init, not mutation
|
|
272
|
+
|
|
273
|
+
**Init generation rules:**
|
|
274
|
+
1. **Required props** = Configuration props that have no sensible default (the component is meaningless without them). These become init parameters. AI infers this from component semantics, not from whether a default exists in config.
|
|
275
|
+
2. **Required closures** = Always-present actions (e.g., primary button action). These become init parameters.
|
|
276
|
+
3. **Optional config props** = Props with defaults or optional props. Set via chain modifiers, NOT init params.
|
|
277
|
+
4. **Paired action closures** = From `PAIRED_ACTION_SUBCOMPONENT`. NOT in init — set via paired modifiers.
|
|
278
|
+
|
|
279
|
+
### With dependencies (Bindings, ObservedObjects)
|
|
280
|
+
|
|
281
|
+
```swift
|
|
282
|
+
@GenerateViewConfiguration
|
|
283
|
+
public struct {ComponentName}: View {
|
|
284
|
+
private let configuration: {ComponentName}Configuration
|
|
285
|
+
@Binding private var isExpanded: Bool
|
|
286
|
+
|
|
287
|
+
public init(isExpanded: Binding<Bool>, {requiredProps}) {
|
|
288
|
+
self._isExpanded = isExpanded
|
|
289
|
+
self.configuration = .init({requiredProps})
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
public var body: some View { ... }
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Paired modifiers (from PAIRED_ACTION_SUBCOMPONENT)
|
|
297
|
+
|
|
298
|
+
For each `PAIRED_ACTION_SUBCOMPONENT` from 3H, generate a View-level modifier that binds data + closure atomically:
|
|
299
|
+
|
|
300
|
+
```swift
|
|
301
|
+
// 1 dynamic prop + action:
|
|
302
|
+
public func secondaryButton(_ title: String, action: @escaping () -> Void) -> {ComponentName} {
|
|
303
|
+
var copy = self.configured { $0.secondaryButtonTitle(title) }
|
|
304
|
+
copy.secondaryAction = action
|
|
305
|
+
return copy
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// 2+ dynamic props + action:
|
|
309
|
+
public func actionLink(_ config: {ComponentName}Configuration.ActionLinkConfiguration,
|
|
310
|
+
action: @escaping () -> Void) -> {ComponentName} {
|
|
311
|
+
var copy = self.configured { $0.actionLinkConfiguration(config) }
|
|
312
|
+
copy.actionLinkAction = action
|
|
313
|
+
return copy
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// 0 dynamic props + action (fully static sub-component):
|
|
317
|
+
public func dismissButton(action: @escaping () -> Void) -> {ComponentName} {
|
|
318
|
+
var copy = self
|
|
319
|
+
copy.dismissAction = action
|
|
320
|
+
return copy
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**NOTE:** Paired modifiers use `configured()` for the config part (reconstructs via init, keeps `let configuration`), then mutate only the closure property on the copy. Optional closure properties (`secondaryAction`, etc.) must be `var` on the View for this pattern.
|
|
325
|
+
|
|
326
|
+
Place paired modifiers in the View file after the body, before Preview.
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## GATE 4: BODY_IMPLEMENTATION
|
|
331
|
+
|
|
332
|
+
INPUT: `pass1/design_context_response.json` → `code` field for layout structure
|
|
333
|
+
INPUT: `pass3/02_token_mapping.md` → token usage patterns
|
|
334
|
+
INPUT: `pass3/04b_component_architecture.md` → API shape
|
|
335
|
+
INPUT: `pass1/screenshot.png` → visual reference
|
|
336
|
+
|
|
337
|
+
### 4.1 Layout translation
|
|
338
|
+
|
|
339
|
+
Translate Figma layout to SwiftUI:
|
|
340
|
+
|
|
341
|
+
| Figma | SwiftUI |
|
|
342
|
+
|-------|---------|
|
|
343
|
+
| Horizontal auto-layout | `HStack(spacing:)` |
|
|
344
|
+
| Vertical auto-layout | `VStack(alignment:, spacing:)` |
|
|
345
|
+
| Padding (uniform) | `.padding(.Spacing.spacingN)` |
|
|
346
|
+
| Padding (per-side) | `.padding(.horizontal, .Spacing.spacingN)` |
|
|
347
|
+
| Border radius | `.clipShape(RoundedRectangle(cornerRadius: .Radius.radiusN))` |
|
|
348
|
+
| Background fill | `.background(Color.Namespace.token)` |
|
|
349
|
+
| Fixed width | `.frame(width: Constants.width)` |
|
|
350
|
+
| Hug contents | No frame modifier (natural sizing) |
|
|
351
|
+
| Fill container | `.frame(maxWidth: .infinity)` |
|
|
352
|
+
|
|
353
|
+
### 4.2 Alignment rules
|
|
354
|
+
|
|
355
|
+
Figma flex → SwiftUI alignment:
|
|
356
|
+
|
|
357
|
+
| Figma | SwiftUI |
|
|
358
|
+
|-------|---------|
|
|
359
|
+
| `flex-start` / `left` | `.leading` |
|
|
360
|
+
| `flex-end` / `right` | `.trailing` |
|
|
361
|
+
| `center` | `.center` |
|
|
362
|
+
| `space-between` | `Spacer()` between children |
|
|
363
|
+
|
|
364
|
+
### 4.3 Token application
|
|
365
|
+
|
|
366
|
+
INPUT: `pass3/02_token_mapping.md`
|
|
367
|
+
|
|
368
|
+
Apply Swift tokens from the mapping. Use the exact Swift usage patterns documented:
|
|
369
|
+
|
|
370
|
+
```swift
|
|
371
|
+
// Typography
|
|
372
|
+
Text(title)
|
|
373
|
+
.typographyStyle(.smallBold)
|
|
374
|
+
|
|
375
|
+
// Colors
|
|
376
|
+
.foregroundStyle(Color.Text.textPrimary)
|
|
377
|
+
.background(Color.Background.background)
|
|
378
|
+
|
|
379
|
+
// Spacing
|
|
380
|
+
.padding(.horizontal, .Spacing.spacing4)
|
|
381
|
+
HStack(spacing: .Spacing.spacing8) { ... }
|
|
382
|
+
|
|
383
|
+
// Radius
|
|
384
|
+
.clipShape(RoundedRectangle(cornerRadius: .Radius.radius4))
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### 4.4 Conditional rendering
|
|
388
|
+
|
|
389
|
+
For optional properties and boolean toggles:
|
|
390
|
+
|
|
391
|
+
```swift
|
|
392
|
+
// Optional content
|
|
393
|
+
if let subtitle = configuration.subtitle {
|
|
394
|
+
Text(subtitle)
|
|
395
|
+
.typographyStyle(.captionRegular)
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Boolean toggle
|
|
399
|
+
if configuration.showIcon, let icon = configuration.leftIcon {
|
|
400
|
+
icon
|
|
401
|
+
.resizable()
|
|
402
|
+
.frame(width: Constants.iconSize, height: Constants.iconSize)
|
|
403
|
+
}
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### 4.5 Computed properties for state-driven styling
|
|
407
|
+
|
|
408
|
+
When an enum drives visual changes (colors, icons), use computed properties:
|
|
409
|
+
|
|
410
|
+
```swift
|
|
411
|
+
// MARK: - Computed Properties
|
|
412
|
+
|
|
413
|
+
private var backgroundColor: Color {
|
|
414
|
+
switch configuration.state {
|
|
415
|
+
case .success: return .Success.n100
|
|
416
|
+
case .warning: return .Warning.n100
|
|
417
|
+
case .error: return .Error.n100
|
|
418
|
+
case .standard: return .Background.backgroundGrey
|
|
419
|
+
case .secondary: return .Badge.badgeBackgroundInfo
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
private var textColor: Color {
|
|
424
|
+
switch configuration.state {
|
|
425
|
+
case .success: return .Text.textSuccess
|
|
426
|
+
case .warning: return .Text.textWarning
|
|
427
|
+
// ...
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### 4.6 Nested component integration
|
|
433
|
+
|
|
434
|
+
INPUT: `pass3/03_nested_components.md`
|
|
435
|
+
INPUT: `pass3/04c_variant_config_analysis.json` → `staticProps` for boolean-gated sub-components
|
|
436
|
+
|
|
437
|
+
Use EXACT init signatures from the nested components analysis:
|
|
438
|
+
|
|
439
|
+
```swift
|
|
440
|
+
// From analysis: TextLink(_ text: String, action: () -> Void)
|
|
441
|
+
TextLink(configuration.linkText, action: configuration.action)
|
|
442
|
+
|
|
443
|
+
// From analysis: LabelBadge(text: String, state: LabelBadge.State)
|
|
444
|
+
LabelBadge(text: statusText, state: .success)
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
**For boolean-gated sub-components (KNOWN_SUBCOMPONENT / PAIRED_ACTION_SUBCOMPONENT):**
|
|
448
|
+
|
|
449
|
+
Static props from 3H `staticProps` are hardcoded in the View body. Only dynamic props come from Configuration:
|
|
450
|
+
|
|
451
|
+
```swift
|
|
452
|
+
// Secondary button: title is dynamic, style/size/colorTheme are static
|
|
453
|
+
if let title = configuration.secondaryButtonTitle {
|
|
454
|
+
TurkishButton { secondaryAction?() }
|
|
455
|
+
.title(title)
|
|
456
|
+
.style(.ghost) // static — hardcoded from 3H staticProps
|
|
457
|
+
.size(.default) // static
|
|
458
|
+
.colorTheme(.brand) // static
|
|
459
|
+
}
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### 4.7 Layer text — static vs dynamic
|
|
463
|
+
|
|
464
|
+
Texts from Figma layers are classified in `pass3/04_patterns.md` (Layer Text Classification table) as STATIC or DYNAMIC.
|
|
465
|
+
|
|
466
|
+
- **DYNAMIC** texts → MUST use the corresponding Configuration property: `Text(configuration.currencyCode)`, NOT `Text("TRY")`
|
|
467
|
+
- **STATIC** texts → use localization key if available (`Text(.Price.totalAmount)`), or hardcode only if truly fixed structural text (separators like "/", operators like "+")
|
|
468
|
+
|
|
469
|
+
**Never hardcode text that represents variable data.** If a text looks like sample data (a price, an amount, a percentage, a currency code, a date), it MUST come from a configuration property. If no matching property exists in the architecture, HALT — the architecture is incomplete.
|
|
470
|
+
|
|
471
|
+
### 4.7.1 Price pattern rendering
|
|
472
|
+
|
|
473
|
+
When the architecture identifies a **price pattern** (§1.5.1 in Phase 3D), use `CurrencyTextRenderer` for rendering:
|
|
474
|
+
|
|
475
|
+
```swift
|
|
476
|
+
// Create a style with the component's fonts
|
|
477
|
+
let style = CurrencyTextStyle(
|
|
478
|
+
currencyFont: .smallRegular,
|
|
479
|
+
amountFont: .smallBold,
|
|
480
|
+
color: .Text.textWhite
|
|
481
|
+
)
|
|
482
|
+
|
|
483
|
+
// Render as AttributedString — handles placement, formatting, grouping
|
|
484
|
+
Text(CurrencyTextRenderer.attributedString(
|
|
485
|
+
value: amount, // Double
|
|
486
|
+
currencyCode: currencyCode, // String
|
|
487
|
+
style: style
|
|
488
|
+
))
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
Do NOT manually place currency code left/right — `CurrencyTextRenderer` resolves placement from `CurrencyFormatProvider`. Do NOT format the amount as String — pass `Double`, the renderer formats it.
|
|
492
|
+
|
|
493
|
+
### 4.7.1a Attributed text rendering (multi-font)
|
|
494
|
+
|
|
495
|
+
When a text has mixed typography (§1.5.1a in Phase 3D), use `AttributedString.format()` from `UIExtensions`. The highlight value can be a dynamic prop or a localization key — use `.localized` (no args) to keep `%@` placeholders intact:
|
|
496
|
+
|
|
497
|
+
```swift
|
|
498
|
+
// Highlight from localization key (static but styled differently)
|
|
499
|
+
var highlight = AttributedString(LocalizationStringKey.Component.highlightKey.localized)
|
|
500
|
+
highlight.font = .xSmallBold
|
|
501
|
+
highlight.foregroundColor = .Text.textWhite
|
|
502
|
+
|
|
503
|
+
// Template with %@ placeholder
|
|
504
|
+
var template = AttributedString(LocalizationStringKey.Component.templateKey.localized)
|
|
505
|
+
template.font = .xSmallRegular
|
|
506
|
+
template.foregroundColor = .Text.textWhite
|
|
507
|
+
|
|
508
|
+
Text(template.format(highlight))
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
### 4.7.2 Image asset rendering
|
|
512
|
+
|
|
513
|
+
When the architecture identifies image assets (§1.5.2 in Phase 3D):
|
|
514
|
+
|
|
515
|
+
**DYNAMIC images (remote):**
|
|
516
|
+
```swift
|
|
517
|
+
import CoreUI
|
|
518
|
+
|
|
519
|
+
// Use the remote image component from CoreUI
|
|
520
|
+
RemoteImage(url: configuration.imageURL)
|
|
521
|
+
.frame(width: Constants.imageWidth, height: Constants.imageHeight)
|
|
522
|
+
.clipShape(RoundedRectangle(cornerRadius: .Radius.radius8))
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
Do NOT embed Figma placeholder photos as bundled assets — they are sample data. The component takes a `URL` and loads the real image at runtime.
|
|
526
|
+
|
|
527
|
+
**STATIC images (bundled):**
|
|
528
|
+
```swift
|
|
529
|
+
// Use generated Image accessor from UIAssets
|
|
530
|
+
Image.CategoryName.assetName
|
|
531
|
+
.resizable()
|
|
532
|
+
.frame(width: Constants.iconSize, height: Constants.iconSize)
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
Static assets are added to `Shared/UIAssets/Images/` in mobile-common and regenerated via `generate-ui-assets` plugin.
|
|
536
|
+
|
|
537
|
+
### 4.7.3 Collapsible sections
|
|
538
|
+
|
|
539
|
+
When a Figma component has expanded/collapsed variants (accordion, expandable card, FAQ item, disclosure group):
|
|
540
|
+
|
|
541
|
+
- Use `@State private var isExpanded: Bool` (or `@Binding` if parent controls it)
|
|
542
|
+
- **Arrow/chevron:** Rotate with `.rotationEffect(.degrees(isExpanded ? 180 : 0))` and animate with `.animation(.easeInOut(duration: 0.25), value: isExpanded)`
|
|
543
|
+
- **Content:** Wrap in conditional with height transition:
|
|
544
|
+
```swift
|
|
545
|
+
if isExpanded {
|
|
546
|
+
contentView
|
|
547
|
+
.transition(.opacity.combined(with: .move(edge: .top)))
|
|
548
|
+
}
|
|
549
|
+
```
|
|
550
|
+
- **Container:** Apply `.animation(.easeInOut(duration: 0.25), value: isExpanded)` on the outer VStack so SwiftUI animates the height change
|
|
551
|
+
- **Tap:** Toggle via `.onTapGesture { withAnimation { isExpanded.toggle() } }` on the header row
|
|
552
|
+
|
|
553
|
+
Do NOT use `DisclosureGroup` — it has limited styling control. Build the expand/collapse manually for pixel-perfect Figma match.
|
|
554
|
+
|
|
555
|
+
### 4.8 @ViewBuilder for complex conditional views
|
|
556
|
+
|
|
557
|
+
```swift
|
|
558
|
+
@ViewBuilder
|
|
559
|
+
private var iconView: some View {
|
|
560
|
+
if let icon = configuration.leftIcon {
|
|
561
|
+
icon
|
|
562
|
+
.resizable()
|
|
563
|
+
.frame(width: Constants.iconSize, height: Constants.iconSize)
|
|
564
|
+
.foregroundStyle(textColor)
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
---
|
|
570
|
+
|
|
571
|
+
## GATE 5: UTILITY_INTEGRATION
|
|
572
|
+
|
|
573
|
+
INPUT: `pass3/08_utility_integration.md`
|
|
574
|
+
|
|
575
|
+
Apply utility modifiers from the Element-to-Utility Mapping table.
|
|
576
|
+
|
|
577
|
+
### 5.1 Testing identifiers
|
|
578
|
+
|
|
579
|
+
```swift
|
|
580
|
+
import UIComponentUtilities
|
|
581
|
+
|
|
582
|
+
// Static identifier
|
|
583
|
+
someView
|
|
584
|
+
.accessibilityIdentifier(.{ComponentName}.badge)
|
|
585
|
+
|
|
586
|
+
// Dynamic identifier (list items)
|
|
587
|
+
ForEach(items.indices, id: \.self) { index in
|
|
588
|
+
ItemRow(item: items[index])
|
|
589
|
+
.accessibilityIdentifier(.{ComponentName}.Item.row.with(index))
|
|
590
|
+
}
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
### 5.2 Localization keys
|
|
594
|
+
|
|
595
|
+
```swift
|
|
596
|
+
// Static text from localization key
|
|
597
|
+
Text(.{ComponentName}.title)
|
|
598
|
+
|
|
599
|
+
// Format string
|
|
600
|
+
Text(String(format: LocalizationStringKey.{ComponentName}.subtitle.localized, count))
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
If utility_integration says "No localization keys" → skip. Dynamic text uses caller-provided strings.
|
|
604
|
+
|
|
605
|
+
### 5.3 Accessibility
|
|
606
|
+
|
|
607
|
+
INPUT: `pass3/08_utility_integration.md` → Accessibility section
|
|
608
|
+
|
|
609
|
+
Apply ONLY what the analysis specifies. If the analysis says 0 accessibility keys and no modifiers, add NOTHING.
|
|
610
|
+
|
|
611
|
+
**CRITICAL — No unnecessary accessibility annotations:**
|
|
612
|
+
- Accessibility is for vision-impaired users to **navigate and use** the app
|
|
613
|
+
- Ask: "Does a vision-impaired person need this information?" — if NO, do not add it
|
|
614
|
+
- Do NOT generate per-enum-variant accessibility keys for visual state the user already knows (loyalty tier, color-coded status)
|
|
615
|
+
- Do NOT add `localizedAccessibilityName` computed properties on enums unless Phase 2C explicitly defined those keys
|
|
616
|
+
- If any accessibility text IS needed, it MUST use `LocalizedAccessibilityStringKey` — never hardcode English strings
|
|
617
|
+
|
|
618
|
+
**Before adding ANY modifier, ask: "What breaks if I remove this?"** If the answer is "nothing", do not add it.
|
|
619
|
+
|
|
620
|
+
```swift
|
|
621
|
+
// Decorative elements → hide from VoiceOver
|
|
622
|
+
icon.accessibilityHidden(true)
|
|
623
|
+
|
|
624
|
+
// Group children into single VoiceOver stop
|
|
625
|
+
// SwiftUI reads visible Text automatically — do NOT add .accessibilityLabel on top
|
|
626
|
+
.accessibilityElement(children: .combine)
|
|
627
|
+
|
|
628
|
+
// Do NOT add .accessibilityLabel when SwiftUI reads visible text correctly
|
|
629
|
+
// Do NOT add .accessibilityAddTraits(.isStaticText) to Text — SwiftUI already knows
|
|
630
|
+
// Do NOT add .accessibilityRemoveTraits(.isButton) when there is no Button
|
|
631
|
+
// Do NOT announce visual state (color) for non-interactive display components
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
### 5.4 Analytics
|
|
635
|
+
|
|
636
|
+
```swift
|
|
637
|
+
// Button tracking (from snippet in utility_integration)
|
|
638
|
+
.analyticsButton(
|
|
639
|
+
id: UITestingIdentifierKey.{ComponentName}.submitButton.description,
|
|
640
|
+
label: "Submit",
|
|
641
|
+
type: .primary
|
|
642
|
+
)
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
If utility_integration says "No analytics events" → skip.
|
|
646
|
+
|
|
647
|
+
### 5.5 NO utilities
|
|
648
|
+
|
|
649
|
+
If `pass3/08_utility_integration.md` shows all counts as 0, skip all utility modifiers.
|
|
650
|
+
Do NOT invent utility modifiers that weren't specified in the analysis.
|
|
651
|
+
|
|
652
|
+
---
|
|
653
|
+
|
|
654
|
+
## VALIDATION CHECKLIST
|
|
655
|
+
|
|
656
|
+
Before marking complete, verify:
|
|
657
|
+
|
|
658
|
+
```
|
|
659
|
+
[ ] File exists at {componentLocation}/{ComponentName}.swift
|
|
660
|
+
[ ] Correct file header (author, date, module name)
|
|
661
|
+
[ ] Correct imports (UIMacros if COMPLEX, UIAssetTokens, UIComponentUtilities if needed)
|
|
662
|
+
[ ] @GenerateViewConfiguration applied (if COMPLEX)
|
|
663
|
+
[ ] Custom init present with required dynamic props + required closures (if COMPLEX)
|
|
664
|
+
[ ] Paired modifiers present for each PAIRED_ACTION_SUBCOMPONENT from 3H
|
|
665
|
+
[ ] Every config property (including data props from paired modifiers) will get a forwarding modifier in Phase 4E
|
|
666
|
+
[ ] Static sub-component props hardcoded in body (from 3H staticProps)
|
|
667
|
+
[ ] Manual init present (if SIMPLE — no macro)
|
|
668
|
+
[ ] SwiftDoc with Figma link above struct declaration
|
|
669
|
+
[ ] Constants enum: private, nested inside View struct, no raw numbers in body (or omitted if no component-specific constants)
|
|
670
|
+
[ ] ALL tokens from pass3/02_token_mapping.md applied (no hardcoded colors/spacing/fonts)
|
|
671
|
+
[ ] No hardcoded sample/placeholder text — all DYNAMIC layer texts use configuration properties (per pass3/04_patterns.md classification)
|
|
672
|
+
[ ] Layout matches Figma: correct stacks, spacing, alignment, padding
|
|
673
|
+
[ ] State-driven styling via computed properties (not inline switch in body)
|
|
674
|
+
[ ] Nested components use exact init signatures from pass3/03_nested_components.md
|
|
675
|
+
[ ] Testing identifiers applied per pass3/08_utility_integration.md (or skipped if 0)
|
|
676
|
+
[ ] Accessibility modifiers applied per pass3/08_utility_integration.md (or skipped if 0)
|
|
677
|
+
[ ] Analytics modifiers applied per pass3/08_utility_integration.md (or skipped if 0)
|
|
678
|
+
[ ] No invented utility modifiers — only what analysis specifies
|
|
679
|
+
[ ] NO Preview code in this file — Phase 4D handles Preview separately
|
|
680
|
+
[ ] Every IMPLEMENT property from 00_property_coverage.json has a Swift init parameter (if coverage file exists)
|
|
681
|
+
[ ] ALL types nested inside View or Configuration struct — no top-level enums
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
---
|
|
685
|
+
|
|
686
|
+
## SUCCESS OUTPUT
|
|
687
|
+
|
|
688
|
+
```
|
|
689
|
+
STATUS: COMPLETE
|
|
690
|
+
PHASE: phase-4b
|
|
691
|
+
GATES_PASSED: [PRE_CHECK, FILE_HEADER, CONSTANTS, VIEW_STRUCT, BODY_IMPLEMENTATION, UTILITY_INTEGRATION]
|
|
692
|
+
ARTIFACTS_CREATED:
|
|
693
|
+
- {componentLocation}/{ComponentName}.swift
|
|
694
|
+
SUMMARY: View implementation complete. {COMPLEXITY} component. {TOKEN_COUNT} tokens applied. {UTILITY_COUNT} utility modifiers. Preview handled by Phase 4D.
|
|
695
|
+
```
|