@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,871 @@
|
|
|
1
|
+
# PHASE 3D — Pattern Detection + Component Architecture + Complexity
|
|
2
|
+
|
|
3
|
+
Analyze design data to detect structural patterns, design the Swift API shape, and evaluate complexity.
|
|
4
|
+
This is the most critical analysis phase — its output defines the API that Phase 4 implements.
|
|
5
|
+
|
|
6
|
+
required — always execute this phase.
|
|
7
|
+
PARALLEL WITH: Phase 3A, 3B, 3C, 3E, 3F (all read from pass1/ independently)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## PRE-CHECK: Phase 1 Complete
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
Read: {artifactPath}/pass1/_index.md
|
|
15
|
+
Read: {artifactPath}/pass1/design_context_response.json
|
|
16
|
+
Read: {artifactPath}/pass1/component_properties.json
|
|
17
|
+
Read: {artifactPath}/pass1/metadata_response.xml
|
|
18
|
+
Read: {artifactPath}/IMPLEMENTATION_HISTORY.md
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Extract: `componentName`, `artifactPath`, `nodeId`, `fileKey`.
|
|
22
|
+
|
|
23
|
+
If any required file is missing:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
STATUS: HALT
|
|
27
|
+
PHASE: phase-3d
|
|
28
|
+
GATE: PRE_CHECK
|
|
29
|
+
REASON: Required Phase 1 artifacts missing.
|
|
30
|
+
COMPLETED_GATES: []
|
|
31
|
+
ARTIFACTS_CREATED: none
|
|
32
|
+
USER_ACTION_REQUIRED: Run Phase 1 first to gather Figma data.
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## GATE 1: PATTERN_DETECTION
|
|
38
|
+
|
|
39
|
+
Analyze design_context for structural patterns to reduce parameters and improve API.
|
|
40
|
+
|
|
41
|
+
INPUT: `{artifactPath}/pass1/design_context_response.json`
|
|
42
|
+
INPUT: `{artifactPath}/pass1/component_properties.json`
|
|
43
|
+
|
|
44
|
+
### 1.1 Repeating Pattern
|
|
45
|
+
|
|
46
|
+
Sibling elements with same structure, different content.
|
|
47
|
+
|
|
48
|
+
**Detection:**
|
|
49
|
+
- Count siblings with identical structure (same child types, same nesting depth)
|
|
50
|
+
- If count >= 2 → REPEATING
|
|
51
|
+
- Minor variations (hidden element, optional field) = same pattern
|
|
52
|
+
- Different content (text, image, color) = same pattern
|
|
53
|
+
|
|
54
|
+
**Action:** Model as array with generic fields.
|
|
55
|
+
|
|
56
|
+
```swift
|
|
57
|
+
// Before pattern reduction: 12 explicit parameters
|
|
58
|
+
// After: 1 array parameter
|
|
59
|
+
public struct Row: Identifiable {
|
|
60
|
+
public let id = UUID()
|
|
61
|
+
public let label: String
|
|
62
|
+
public let value: String
|
|
63
|
+
public let detail: String? // Hidden in some instances
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 1.2 Variant Pattern
|
|
68
|
+
|
|
69
|
+
Same component with property-based variations.
|
|
70
|
+
|
|
71
|
+
**Detection from component_properties.json:**
|
|
72
|
+
- Variant properties with enumerated values → Swift enum
|
|
73
|
+
- Boolean properties → Bool parameter
|
|
74
|
+
- Instance swap properties → Sub-component slot
|
|
75
|
+
- Text override properties → String parameter
|
|
76
|
+
|
|
77
|
+
**Detection from design_context_response.json:**
|
|
78
|
+
- Multiple variants showing visibility differences → Optional properties
|
|
79
|
+
- Multiple variants showing styling differences → Enum-driven styling
|
|
80
|
+
- Multiple variants showing content differences → Configuration-driven
|
|
81
|
+
|
|
82
|
+
**Action:** Classify each variant property:
|
|
83
|
+
|
|
84
|
+
| Figma Property Type | Swift Mapping | Example |
|
|
85
|
+
|---------------------|---------------|---------|
|
|
86
|
+
| Variant with 2-5 named values | `enum` | `State: Active/Inactive/Disabled` → `enum State` |
|
|
87
|
+
| Variant with true/false | `Bool` | `HasIcon: true/false` → `showIcon: Bool` |
|
|
88
|
+
| Variant with only visibility toggle | `Bool` or `Optional` | `ShowSubtitle: true/false` → `subtitle: String?` |
|
|
89
|
+
| Instance swap slot | Child view or configuration | `Icon: IconA/IconB` → `icon: IconConfiguration` |
|
|
90
|
+
| Text override | `String` | `Title: "..."` → `title: String` |
|
|
91
|
+
|
|
92
|
+
### 1.2.1 Boolean Visibility Merge Rule
|
|
93
|
+
|
|
94
|
+
**When a Figma boolean ONLY toggles visibility of a single content element, merge the boolean into the content property as an optional type. Do NOT generate a separate `Bool` parameter.**
|
|
95
|
+
|
|
96
|
+
| Figma Pattern | Swift Result | Example |
|
|
97
|
+
|---|---|---|
|
|
98
|
+
| Boolean toggles ONE content element | Optional type, drop the boolean | `Label boolean` + `Text` → `text: String?` (nil = hidden) |
|
|
99
|
+
| Boolean + Instance swap for same element | Optional type, drop the boolean | `Icon boolean` + `Icon swap` → `icon: Image?` (nil = hidden) |
|
|
100
|
+
| Boolean toggles MULTIPLE elements | Keep `Bool`, keep content properties | `ShowHeader boolean` controls title + subtitle + icon → `showHeader: Bool` |
|
|
101
|
+
| Boolean controls behavior (not visibility) | Keep `Bool` | `IsInteractive boolean` → `isInteractive: Bool` |
|
|
102
|
+
|
|
103
|
+
**Rationale:** In Figma, a boolean + content slot is two properties because Figma has no optionals. In Swift, `Optional` naturally expresses "present or absent." Keeping a separate `showX: Bool` alongside the content creates redundant state — you can have `showLabel: false` but `text: "Hello"`, which is a contradiction the API shouldn't allow.
|
|
104
|
+
|
|
105
|
+
**Apply this merge consistently** — if the icon boolean was merged into `Image?`, the label boolean must also be merged into `String?`. Same pattern, same treatment.
|
|
106
|
+
|
|
107
|
+
**Cross-source merges (Figma boolean + LAYER_TEXT):** After Layer Text Classification (§1.5), re-evaluate the merge rule against the combined property set. A Figma boolean may gate a LAYER_TEXT dynamic property — if the boolean toggles visibility of that single text element, merge the boolean into the LAYER_TEXT property as `String?`. The merge rule applies identically regardless of whether the content property originated from a Figma TEXT override or from layer text classification.
|
|
108
|
+
|
|
109
|
+
**Shared-content exception:** When MULTIPLE booleans independently gate sections that share ONE content source, do NOT merge. Each boolean provides independent per-section visibility that a single optional can't express. Example: `/Money&Mil` and `+Money&Mil` both display `milesAmount` — merging would destroy the ability to show one section but not the other. Keep the booleans; the view short-circuits via `if showX, let content = sharedContent { ... }`.
|
|
110
|
+
|
|
111
|
+
### 1.3 Extract Variant Examples
|
|
112
|
+
|
|
113
|
+
From design_context, extract exact sample values for preview rendering:
|
|
114
|
+
- Text content (actual strings used in variants)
|
|
115
|
+
- Image names/references
|
|
116
|
+
- Dimensions (width, height from metadata)
|
|
117
|
+
- Background color (if component has transparent bg that needs container)
|
|
118
|
+
|
|
119
|
+
### 1.4 Extract Dimensions
|
|
120
|
+
|
|
121
|
+
From metadata_response.xml:
|
|
122
|
+
- Component width
|
|
123
|
+
- Component height
|
|
124
|
+
- Background fill (transparent, white, colored)
|
|
125
|
+
|
|
126
|
+
### 1.5 Layer Text Classification
|
|
127
|
+
|
|
128
|
+
Figma component properties capture variant axes, boolean toggles, text overrides, and instance swaps — but NOT the actual text content rendered inside layers. That layer text often contains **sample/placeholder data** that must become dynamic API parameters.
|
|
129
|
+
|
|
130
|
+
**Procedure:**
|
|
131
|
+
|
|
132
|
+
1. Extract every visible text value from `design_context_response.json` (from the generated code / layer content)
|
|
133
|
+
2. Filter out texts already captured as Figma TEXT properties in `component_properties.json` — these are already handled
|
|
134
|
+
3. Filter out texts that have a localization key assigned in `pass2/utility_localization.json` (read if available) — these are static labels managed by the localization system
|
|
135
|
+
4. For each remaining text, classify as STATIC or DYNAMIC using contextual reasoning
|
|
136
|
+
|
|
137
|
+
**Classification — reason about the component's semantic purpose and each text's role:**
|
|
138
|
+
|
|
139
|
+
| Question | If YES → |
|
|
140
|
+
|----------|----------|
|
|
141
|
+
| Would different instances of this component show different values here? | DYNAMIC |
|
|
142
|
+
| Is this a data value (price, amount, count, percentage, date, name, currency code)? | DYNAMIC |
|
|
143
|
+
| Does the text only make sense as sample data given the component's domain? | DYNAMIC |
|
|
144
|
+
| Is this a fixed UI label describing what adjacent data represents? | STATIC |
|
|
145
|
+
| Is this a structural/grammatical element (separator, connector, operator like "/" or "+")? | STATIC |
|
|
146
|
+
|
|
147
|
+
**Key principle:** Reason about what the component IS FOR. A Price component displays prices — price amounts are inherently variable. A "Total Amount" label is inherently fixed — it describes the data, it IS not data. A currency code like "TRY" is variable — the same component shows USD, EUR, GBP in different contexts.
|
|
148
|
+
|
|
149
|
+
**Edge cases:**
|
|
150
|
+
- Currency codes/symbols (TRY, USD, €) → DYNAMIC: varies by market/context
|
|
151
|
+
- Percentage values (%30, 15%) → DYNAMIC: varies per instance
|
|
152
|
+
- "Step 1 of 3" → "Step" and "of" are STATIC, the numbers are DYNAMIC
|
|
153
|
+
- A text that COULD be dynamic but already has a localization key → STATIC (localization handles it)
|
|
154
|
+
- Structural operators that visually separate data ("+", "/", "·") → STATIC
|
|
155
|
+
|
|
156
|
+
**For each DYNAMIC text, propose:**
|
|
157
|
+
- Swift property name (camelCase, descriptive of the semantic role — e.g., `currencyCode` not `tryText`)
|
|
158
|
+
- Swift type: `String` (formatting is the caller's responsibility — even for numeric data)
|
|
159
|
+
- Whether required or optional (based on whether the element's parent section is boolean-gated)
|
|
160
|
+
|
|
161
|
+
**Output:** Include classification in `04_patterns.md` (Layer Text Classification table) and carry DYNAMIC entries into GATE 2 as additional API properties.
|
|
162
|
+
|
|
163
|
+
### 1.5.1 Price Pattern Detection
|
|
164
|
+
|
|
165
|
+
When Layer Text Classification identifies a **currency code + numeric amount** pair (e.g., "TRY" + "10.000", or "USD" + "1,250.99"), this is a **price pattern**.
|
|
166
|
+
|
|
167
|
+
**IMPORTANT:** When a price pattern is detected, read the `/figma-price-integration` skill instructions at `.instructions/figma/figma-price-integration/SKILL.md` for the full integration guide.
|
|
168
|
+
|
|
169
|
+
**Detection:** Two adjacent DYNAMIC texts where one is a currency code (3-letter ISO 4217 or known symbol) and the other is a numeric amount. Also triggered when a nested `Price` component instance is detected.
|
|
170
|
+
|
|
171
|
+
**Rules:**
|
|
172
|
+
- Define a **nested `Price` struct** conforming to `PriceRepresentable` — include ONLY the properties this component needs (amount + currency at minimum)
|
|
173
|
+
- The amount parameter type MUST be `Double`, NOT `String` — formatting is handled by `toConfiguration()` → `CurrencyAmountFormatter` at render time
|
|
174
|
+
- Do NOT flatten price fields into the parent Configuration — keep them grouped in the nested `Price` type
|
|
175
|
+
- The view uses `Price(priceModel)` for standalone price display or `CurrencyTextRenderer` for inline attributed text
|
|
176
|
+
- Do NOT hardcode currency placement (left/right) — `CurrencyFormatProvider` determines this from the currency code
|
|
177
|
+
|
|
178
|
+
**Additional price properties to check for in the design:**
|
|
179
|
+
- Strikethrough/original price → `originalAmount: Double?`
|
|
180
|
+
- Sale badge (e.g., "%30") → `saleBadgeText: String?`
|
|
181
|
+
- Miles section (e.g., "/ 2000 Mil") → `milesValue: Int?`
|
|
182
|
+
- Green/red coloring with +/- prefix → `sign: PriceSign?`
|
|
183
|
+
|
|
184
|
+
**Architecture output:** When a price pattern is detected, the property coverage should list:
|
|
185
|
+
- `price: ComponentName.Price` (PRICE_PATTERN, IMPLEMENT) — nested `PriceRepresentable` conformance
|
|
186
|
+
|
|
187
|
+
### 1.5.1b Inline Price in Attributed Text
|
|
188
|
+
|
|
189
|
+
When a **price pattern** (§1.5.1) appears **inside a text element** alongside static surrounding text (e.g., "TRY 10.000 dan başlayan fiyatlarla"), this is an **inline price attributed text pattern**.
|
|
190
|
+
|
|
191
|
+
**Detection:** A DYNAMIC price (currency + amount) adjacent to STATIC text within the same visual text block, where the price portion has different typography (bold, larger) than the surrounding text.
|
|
192
|
+
|
|
193
|
+
**This is NOT a standalone Price view.** It is a formatted `AttributedString` rendered inside a `Text()` view.
|
|
194
|
+
|
|
195
|
+
**Rules:**
|
|
196
|
+
- The surrounding text → localization format key with `%@` placeholder (e.g., `"%@ dan başlayan fiyatlarla"`)
|
|
197
|
+
- The price portion → `PriceRepresentable` model, rendered via `price.attributedString(style:)`
|
|
198
|
+
- Compose with `AttributedString.format()` from `UIExtensions`:
|
|
199
|
+
```swift
|
|
200
|
+
var template = AttributedString(localized: .Component.startingFromPrice)
|
|
201
|
+
template.font = .bodyRegular
|
|
202
|
+
template.foregroundColor = .Text.textGrey
|
|
203
|
+
|
|
204
|
+
let result = template.format(
|
|
205
|
+
price.attributedString(style: CurrencyTextStyle(
|
|
206
|
+
currencyFont: .smallRegular,
|
|
207
|
+
amountFont: .smallBold,
|
|
208
|
+
color: .Text.textPrimary
|
|
209
|
+
))
|
|
210
|
+
)
|
|
211
|
+
Text(result)
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Architecture output:** When an inline price attributed text pattern is detected, the property coverage should list:
|
|
215
|
+
- `price: ComponentName.Price` (PRICE_PATTERN, IMPLEMENT) — nested `PriceRepresentable` conformance
|
|
216
|
+
- Note in patterns output: "Inline price in attributed text — use `price.attributedString(style:)` with `AttributedString.format()`"
|
|
217
|
+
|
|
218
|
+
**This pattern must be explicitly confirmed during analysis.** If a price appears near text, ask: is this a standalone `Price` view + separate `Text`, or a single attributed string combining both? Check the Figma layer structure — if the price and surrounding text are in the same text layer with different font styles, it's inline attributed text.
|
|
219
|
+
|
|
220
|
+
### 1.5.1a Attributed Text Pattern (Multi-Font Text)
|
|
221
|
+
|
|
222
|
+
**Detection during Layer Text Classification:** When examining text elements in `design_context_response.json`, look for text where the generated code has multiple sibling `<span>` tags with different `font-family` or `font-weight` classes. Each distinct style run within a single text element indicates a multi-font attributed text pattern.
|
|
223
|
+
|
|
224
|
+
**Classify each style run independently** using the same DYNAMIC/STATIC rules from §1.5 — a highlighted portion may be a dynamic prop (varies per instance) OR a static localization key (fixed but styled differently).
|
|
225
|
+
|
|
226
|
+
**Rules:**
|
|
227
|
+
- The surrounding text → localization format key with `%@` placeholders
|
|
228
|
+
- Each differently-styled portion → classify as DYNAMIC (`String` prop) or STATIC (its own localization key)
|
|
229
|
+
- Render using `AttributedString.format()` from `UIExtensions` — template gets base styling, each `%@` argument gets its own styling
|
|
230
|
+
|
|
231
|
+
### 1.5.3 Form Pattern Detection
|
|
232
|
+
|
|
233
|
+
When Sub-Component analysis identifies embedded instances of form-capable design-system components — **Selectbox, Checkbox, CheckboxButton, Radio, RadioButton, TextboxTextarea, DatepickerSchedule** — this is a **form pattern**.
|
|
234
|
+
|
|
235
|
+
**IMPORTANT:** When a form pattern is detected, read the `/figma-form-integration` skill instructions at `.instructions/figma/figma-form-integration/SKILL.md` for the full integration guide.
|
|
236
|
+
|
|
237
|
+
**Detection (count form-capable instances):**
|
|
238
|
+
- 0 → no form pattern; skip.
|
|
239
|
+
- 1 → **atomic form**: component exposes ONE `*FormField` directly on Configuration / View init; no `FormSection` wrapper.
|
|
240
|
+
- 2+ → **composite form**: nested `Section: FormSection` class declared in an extension on the component namespace, owned via Configuration.
|
|
241
|
+
|
|
242
|
+
**Rules:**
|
|
243
|
+
- Every form input MUST be modeled as a `*FormField` subclass — no `Binding<Value>`, no `@State` values, no ad-hoc `isChecked: Bool` / `selectedOption` properties.
|
|
244
|
+
- The caller (scene view-model) constructs fields and rules. The component is headless — it never instantiates fields and never calls `validate()`.
|
|
245
|
+
- Static copy (labels, placeholders, helper text, toggle captions) lives in Configuration; fields carry value+state+rules only.
|
|
246
|
+
- Non-form actions (e.g. "Sil", "Edit", "Detaylar") stay as paired closures on the View — they are NOT fields and NOT Configuration values.
|
|
247
|
+
|
|
248
|
+
**Figma → FormField mapping:**
|
|
249
|
+
|
|
250
|
+
| Figma sub-component | FormField subclass |
|
|
251
|
+
|---|---|
|
|
252
|
+
| Selectbox (single value) | `PickerFormField<Option>` |
|
|
253
|
+
| Selectbox (multi select) | `MultiPickerFormField<Option>` |
|
|
254
|
+
| Checkbox / CheckboxButton | `CheckboxFormField` |
|
|
255
|
+
| Checkbox group | `CheckboxGroupFormField<Option>` |
|
|
256
|
+
| Radio / RadioButton group | `RadioFormField<Option>` |
|
|
257
|
+
| TextboxTextarea | `TextFormField` |
|
|
258
|
+
| DatepickerSchedule (single date) | `DatePickerFormField` |
|
|
259
|
+
| DatepickerSchedule (range) | `DateRangePickerFormField` |
|
|
260
|
+
| Visual Switch (Bool) | `CheckboxFormField` (atomic view decides Switch rendering) |
|
|
261
|
+
|
|
262
|
+
**Architecture output (composite, 2+ fields):**
|
|
263
|
+
|
|
264
|
+
```swift
|
|
265
|
+
extension ComponentName {
|
|
266
|
+
@FormSection
|
|
267
|
+
@Observable
|
|
268
|
+
public final class Section: FormSection {
|
|
269
|
+
public let {field1}: {FormFieldType1}
|
|
270
|
+
public let {field2}: {FormFieldType2}
|
|
271
|
+
// ... only the fields this component renders
|
|
272
|
+
public init(...) { ... }
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Configuration then carries `public let section: ComponentName.Section` plus static copy.
|
|
278
|
+
|
|
279
|
+
**Architecture output (atomic, 1 field):** Configuration (or View init) carries the FormField directly, e.g. `public let terms: CheckboxFormField`.
|
|
280
|
+
|
|
281
|
+
### 1.5.2 Image Asset Classification
|
|
282
|
+
|
|
283
|
+
Figma designs contain images that are either **static assets** (bundled in the app) or **dynamic content** (loaded remotely at runtime). Classify each image in the design context.
|
|
284
|
+
|
|
285
|
+
**Classification — reason about what the image represents:**
|
|
286
|
+
|
|
287
|
+
| Signal | Classification |
|
|
288
|
+
|--------|---------------|
|
|
289
|
+
| Photograph of real place, person, food, destination | DYNAMIC (remote) |
|
|
290
|
+
| Large raster image filling a container (hero, banner, card cover) | DYNAMIC (remote) |
|
|
291
|
+
| Layer named "image", "photo", "hero", "banner", "thumbnail", "cover" | DYNAMIC (remote) |
|
|
292
|
+
| Content that varies per user/context (profile photo, campaign, product) | DYNAMIC (remote) |
|
|
293
|
+
| Small vector icon (monochrome, brand colors, <48px) | STATIC (bundled) |
|
|
294
|
+
| Logo (airline, payment provider, partner) | STATIC (bundled) |
|
|
295
|
+
| Illustration or decorative artwork (brand-specific) | STATIC (bundled) |
|
|
296
|
+
| Figma layer is a component instance swap with icon variants | STATIC (bundled) |
|
|
297
|
+
|
|
298
|
+
**For DYNAMIC images:**
|
|
299
|
+
- Swift type: `URL` or `String` (the remote image URL)
|
|
300
|
+
- The view MUST use the remote image component from `CoreUI` (Kingfisher-backed) for async loading, caching, and placeholder handling
|
|
301
|
+
- Do NOT download the Figma placeholder image — it's sample data, not a real asset
|
|
302
|
+
- Add a `placeholder` parameter or use a default placeholder view for loading state
|
|
303
|
+
|
|
304
|
+
**For STATIC images:**
|
|
305
|
+
- Download the asset from Figma (SVG or PNG)
|
|
306
|
+
- Add to the uncategorized images directory in `{project.slug}-common`: `Shared/UIAssets/Images/`
|
|
307
|
+
- Run `swift package plugin --allow-writing-to-package-directory generate-ui-assets` to regenerate asset extensions
|
|
308
|
+
- Reference via the generated `Image.` accessor
|
|
309
|
+
|
|
310
|
+
**Architecture output:** When a dynamic image is detected, the property coverage should list:
|
|
311
|
+
- `{imageName}URL: URL` (LAYER_IMAGE, IMPLEMENT) — or `String` if the URL comes as a string from the API
|
|
312
|
+
|
|
313
|
+
### 1.6 Write `{artifactPath}/pass3/04_patterns.md`
|
|
314
|
+
|
|
315
|
+
```markdown
|
|
316
|
+
# Pattern Detection
|
|
317
|
+
|
|
318
|
+
Component: {componentName}
|
|
319
|
+
Generated: {ISO_DATE}
|
|
320
|
+
Source: pass1/design_context_response.json, pass1/component_properties.json
|
|
321
|
+
|
|
322
|
+
## Repeating Patterns
|
|
323
|
+
|
|
324
|
+
| Pattern | Count | Fields | Parameter Reduction |
|
|
325
|
+
|---------|-------|--------|---------------------|
|
|
326
|
+
| Row items | 4 | label, value, detail? | 12 → 2 params (1 array + 1 struct) |
|
|
327
|
+
|
|
328
|
+
OR: None detected.
|
|
329
|
+
|
|
330
|
+
## Variant Properties
|
|
331
|
+
|
|
332
|
+
| Figma Property | Type | Values | Swift Mapping |
|
|
333
|
+
|----------------|------|--------|---------------|
|
|
334
|
+
| State | Variant | Active, Inactive, Disabled | `enum State` |
|
|
335
|
+
| HasIcon | Boolean | true, false | `showIcon: Bool` |
|
|
336
|
+
| ShowSubtitle | Boolean | true, false | `subtitle: String?` |
|
|
337
|
+
|
|
338
|
+
## Variant Examples (for Preview)
|
|
339
|
+
|
|
340
|
+
| Variant | Sample Values |
|
|
341
|
+
|---------|---------------|
|
|
342
|
+
| Default | title: "Flight Details", state: .active |
|
|
343
|
+
| Disabled | title: "Unavailable", state: .disabled |
|
|
344
|
+
|
|
345
|
+
## Dimensions
|
|
346
|
+
|
|
347
|
+
| Property | Value |
|
|
348
|
+
|----------|-------|
|
|
349
|
+
| Width | {width} |
|
|
350
|
+
| Height | {height} |
|
|
351
|
+
| Background | {fill color or transparent} |
|
|
352
|
+
| Container Needed | {Yes (transparent bg) / No} |
|
|
353
|
+
|
|
354
|
+
## Layer Text Classification
|
|
355
|
+
|
|
356
|
+
| Layer Text | Semantic Role | Classification | Swift Property | Notes |
|
|
357
|
+
|------------|--------------|----------------|----------------|-------|
|
|
358
|
+
| "{text}" | {role} | DYNAMIC / STATIC | `{propName}: String` / — | {rationale} |
|
|
359
|
+
|
|
360
|
+
OR: All layer text already captured as Figma TEXT properties or localization keys — no additional dynamic parameters.
|
|
361
|
+
|
|
362
|
+
## Image Asset Classification
|
|
363
|
+
|
|
364
|
+
| Image | Layer Name | Classification | Swift Property | Notes |
|
|
365
|
+
|-------|-----------|----------------|----------------|-------|
|
|
366
|
+
| {description} | {layerName} | DYNAMIC / STATIC | `{propName}: URL` / bundled | {rationale} |
|
|
367
|
+
|
|
368
|
+
OR: No images detected in component.
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## GATE 2: COMPONENT_ARCHITECTURE
|
|
374
|
+
|
|
375
|
+
**This is the core analysis gate.** Using pattern data from GATE 1, determine the complete Swift API shape.
|
|
376
|
+
|
|
377
|
+
INPUT: GATE 1 output (in memory — just computed)
|
|
378
|
+
INPUT: `{artifactPath}/pass1/design_context_response.json`
|
|
379
|
+
INPUT: `{artifactPath}/pass1/component_properties.json`
|
|
380
|
+
INPUT: `{artifactPath}/pass3/04c_variant_config_analysis.json` (from Phase 3H)
|
|
381
|
+
|
|
382
|
+
### 2.0 Consume Phase 3H Classifications
|
|
383
|
+
|
|
384
|
+
Read `04c_variant_config_analysis.json`. This contains typed recommendations for every boolean property. **Do NOT re-classify** — use 3H output directly.
|
|
385
|
+
|
|
386
|
+
For entries with `"deferredTo": "3D"` (UNCLASSIFIED booleans): analyze using `design_context_response.json` HTML structure to determine if the boolean is a section toggle (controls multiple children → `Bool`), decorative leaf (`Bool`), or behavioral bool (`Bool`).
|
|
387
|
+
|
|
388
|
+
Update 3H entries with resolved types and include in the architecture output.
|
|
389
|
+
|
|
390
|
+
### 2.1 List Inference
|
|
391
|
+
|
|
392
|
+
Analyze child elements to determine if they form lists:
|
|
393
|
+
|
|
394
|
+
**Homogeneous list detection:**
|
|
395
|
+
- Multiple children with identical structure but different content
|
|
396
|
+
- Variant property controls count (e.g., "Items: 1/2/3")
|
|
397
|
+
- Same child component type repeated
|
|
398
|
+
|
|
399
|
+
→ Model as `[ItemType]` array
|
|
400
|
+
|
|
401
|
+
```swift
|
|
402
|
+
// Homogeneous: all items are the same struct
|
|
403
|
+
public struct PassengerRow: Identifiable {
|
|
404
|
+
public let id = UUID()
|
|
405
|
+
public let name: String
|
|
406
|
+
public let seatNumber: String
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Usage in component
|
|
410
|
+
public let passengers: [PassengerRow]
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
**Heterogeneous list detection:**
|
|
414
|
+
- Multiple children with DIFFERENT structures in the same container
|
|
415
|
+
- Instance swap property cycles through different component types
|
|
416
|
+
- Each slot has fundamentally different content (not just styling)
|
|
417
|
+
|
|
418
|
+
→ Model as enum with associated values (CONCRETE types, NOT protocols)
|
|
419
|
+
|
|
420
|
+
```swift
|
|
421
|
+
// Heterogeneous: different item types in same list
|
|
422
|
+
public enum CardSection {
|
|
423
|
+
case header(title: String, subtitle: String?)
|
|
424
|
+
case flightInfo(departure: String, arrival: String, duration: String)
|
|
425
|
+
case priceBreakdown(rows: [PriceRow])
|
|
426
|
+
case action(buttonTitle: String)
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// Usage in component
|
|
430
|
+
public let sections: [CardSection]
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
**NOT a list (false positive guards):**
|
|
434
|
+
- Different children serve structurally different roles (header vs body vs footer)
|
|
435
|
+
- Children are at different hierarchy levels
|
|
436
|
+
- Only 1 instance exists across all variants
|
|
437
|
+
|
|
438
|
+
→ Model as separate properties
|
|
439
|
+
|
|
440
|
+
### 2.2 Sub-Component Integration
|
|
441
|
+
|
|
442
|
+
**This section consumes Phase 3H output.** Do NOT re-detect sub-components — 3H has already classified them.
|
|
443
|
+
|
|
444
|
+
Phase 3H provides `dynamicProps` and `staticProps` for each sub-component entry. Only dynamic props are exposed to the caller. Static props are hardcoded internally by the parent View (Phase 4B).
|
|
445
|
+
|
|
446
|
+
**For each `KNOWN_SUBCOMPONENT` entry:**
|
|
447
|
+
|
|
448
|
+
Use the `swiftType` from 3H directly — it's already resolved based on dynamic prop count:
|
|
449
|
+
|
|
450
|
+
| Dynamic Props | Result |
|
|
451
|
+
|---|---|
|
|
452
|
+
| 0 | Boolean presence only |
|
|
453
|
+
| 1 | Unwrapped to prop type (e.g., `String?`) |
|
|
454
|
+
| 2+ | Mini config struct (e.g., `PriceConfiguration?`) — define it in the parent's Configuration |
|
|
455
|
+
|
|
456
|
+
```swift
|
|
457
|
+
// 1 dynamic prop (title only): unwrapped to String?
|
|
458
|
+
public let toggleLinkTitle: String? // nil = hidden
|
|
459
|
+
|
|
460
|
+
// 2+ dynamic props: mini config (only dynamic props, no styling)
|
|
461
|
+
public struct PriceConfiguration: Sendable {
|
|
462
|
+
public let label: String
|
|
463
|
+
public let currency: String
|
|
464
|
+
public let wholeAmount: String
|
|
465
|
+
public let decimalAmount: String
|
|
466
|
+
// textStyle is STATIC — not exposed, hardcoded in View body
|
|
467
|
+
}
|
|
468
|
+
public let priceConfiguration: PriceConfiguration? // nil = hidden
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
**For each `PAIRED_ACTION_SUBCOMPONENT` entry:**
|
|
472
|
+
|
|
473
|
+
Same prop filtering as KNOWN_SUBCOMPONENT, plus a paired closure. The data goes in Configuration, the closure is a View dependency. Phase 4B generates a **paired modifier** that binds them at the call site:
|
|
474
|
+
|
|
475
|
+
```swift
|
|
476
|
+
// 1 dynamic prop + action → title in config, closure in View, paired modifier
|
|
477
|
+
// Config: secondaryButtonTitle: String?
|
|
478
|
+
// View: secondaryAction: (() -> Void)?
|
|
479
|
+
// Modifier: .secondaryButton("Details") { action() }
|
|
480
|
+
|
|
481
|
+
// 2+ dynamic props + action → mini config in config, closure in View, paired modifier
|
|
482
|
+
// Config: actionLinkConfiguration: ActionLinkConfiguration?
|
|
483
|
+
// View: actionLinkAction: (() -> Void)?
|
|
484
|
+
// Modifier: .actionLink(.init(text: "Download", icon: .download)) { action() }
|
|
485
|
+
|
|
486
|
+
// 0 dynamic props + action → nothing in config, closure in View, closure-only modifier
|
|
487
|
+
// View: dismissAction: (() -> Void)?
|
|
488
|
+
// Modifier: .dismissButton { action() }
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
**For each `ICON_BOOLEAN_GATED` entry:**
|
|
492
|
+
- Use the `swiftType` from 3H (`Image?` or `Optional3<Image>`)
|
|
493
|
+
- Use the `swiftName` from 3H for naming
|
|
494
|
+
|
|
495
|
+
**For `UNCLASSIFIED` entries resolved in §2.0:**
|
|
496
|
+
- Integrate the resolved type (`Bool` for section toggles, etc.)
|
|
497
|
+
|
|
498
|
+
### 2.3 Property Classification
|
|
499
|
+
|
|
500
|
+
For each property identified in GATE 1, classify into its final Swift form:
|
|
501
|
+
|
|
502
|
+
| Classification | When | Swift Pattern |
|
|
503
|
+
|----------------|------|---------------|
|
|
504
|
+
| Required parameter | Always visible, component meaningless without it | `init(title: String)` |
|
|
505
|
+
| Optional parameter | Sometimes hidden/absent | `subtitle: String? = nil` — chain modifier |
|
|
506
|
+
| Merged optional | Boolean toggles ONE content element | `text: String?` — boolean dropped, nil = hidden |
|
|
507
|
+
| Enum | Variant with named values | `enum State { case active, inactive }` |
|
|
508
|
+
| Bool toggle | Binary behavior OR toggles MULTIPLE elements | `isInteractive: Bool = true` |
|
|
509
|
+
| Array | Repeated homogeneous children | `items: [ItemRow]` |
|
|
510
|
+
| Enum array | Repeated heterogeneous children | `sections: [CardSection]` |
|
|
511
|
+
| Mini config (display) | Boolean-gated sub-component, 2+ dynamic props, no action | `priceConfiguration: PriceConfiguration?` — chain modifier |
|
|
512
|
+
| Mini config (paired) | Boolean-gated sub-component, 2+ dynamic props + action | Paired modifier: `.actionLink(config) { action }` |
|
|
513
|
+
| Paired single prop | Boolean-gated sub-component, 1 dynamic prop + action | Paired modifier: `.secondaryButton(title) { action }` |
|
|
514
|
+
| Paired closure-only | Boolean-gated sub-component, 0 dynamic props + action | Paired modifier: `.dismissButton { action }` |
|
|
515
|
+
| Closure | Interactive action (always present, not boolean-gated) | `onTap: (() -> Void)?` |
|
|
516
|
+
| Layer text (dynamic) | Sample/placeholder data in Figma layers (from §1.5 classification) | `{propName}: String` |
|
|
517
|
+
|
|
518
|
+
### 2.3.1 Coexistent Property Rule
|
|
519
|
+
|
|
520
|
+
When two properties are semantically meaningless without each other, they MUST be paired at the call site. Do NOT allow them to be set independently.
|
|
521
|
+
|
|
522
|
+
**Detection:** Ask "does prop A without prop B create a nonsensical state?" If yes → coexistent pair.
|
|
523
|
+
|
|
524
|
+
**Common patterns:**
|
|
525
|
+
- title + action (button without action or action without button = nonsensical)
|
|
526
|
+
- icon + iconAction (tappable icon without handler = broken)
|
|
527
|
+
- label + labelAccessory (accessory without context = orphaned)
|
|
528
|
+
|
|
529
|
+
**Resolution:** Coexistent pairs are expressed as **paired modifiers** on the View. The data prop goes in Configuration (for nil = hidden), the closure stays as a View dependency. The modifier sets both atomically.
|
|
530
|
+
|
|
531
|
+
This is NOT limited to sub-components — any two semantically bound props follow this rule.
|
|
532
|
+
|
|
533
|
+
### 2.4 Configuration Hierarchy
|
|
534
|
+
|
|
535
|
+
Determine if properties need grouping into sub-configurations:
|
|
536
|
+
|
|
537
|
+
**Flat init (no sub-config needed):**
|
|
538
|
+
- Total properties ≤ 5
|
|
539
|
+
- No logical grouping exists
|
|
540
|
+
- All properties are at the same conceptual level
|
|
541
|
+
|
|
542
|
+
```swift
|
|
543
|
+
public init(
|
|
544
|
+
title: String,
|
|
545
|
+
subtitle: String?,
|
|
546
|
+
state: State,
|
|
547
|
+
showIcon: Bool
|
|
548
|
+
)
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
**Sub-configuration needed when:**
|
|
552
|
+
- A group of 3+ properties always appear together
|
|
553
|
+
- A group represents a conceptual sub-entity (price, badge, action)
|
|
554
|
+
- A group maps to a distinct visual region of the component
|
|
555
|
+
|
|
556
|
+
```swift
|
|
557
|
+
// Group "price" properties into sub-configuration
|
|
558
|
+
public struct PriceConfiguration {
|
|
559
|
+
public let amount: String
|
|
560
|
+
public let currency: String
|
|
561
|
+
public let originalAmount: String? // Strikethrough price
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
public init(
|
|
565
|
+
title: String,
|
|
566
|
+
price: PriceConfiguration,
|
|
567
|
+
state: State
|
|
568
|
+
)
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
**Rules:**
|
|
572
|
+
- Configuration models are CONCRETE structs, not protocols
|
|
573
|
+
- Sub-configurations are also concrete structs
|
|
574
|
+
- Use `public let` for immutable data, `public var` only if component mutates it
|
|
575
|
+
- All configurations must be `Sendable`
|
|
576
|
+
- Nested configurations use composition, not inheritance
|
|
577
|
+
|
|
578
|
+
### 2.5 Variant-to-Enum Mapping
|
|
579
|
+
|
|
580
|
+
For each variant property that maps to an enum:
|
|
581
|
+
|
|
582
|
+
```swift
|
|
583
|
+
// Figma variant: "State" with values "Active", "Inactive", "Disabled", "Error", "Success"
|
|
584
|
+
public enum State: String, CaseIterable, Sendable {
|
|
585
|
+
case active
|
|
586
|
+
case inactive
|
|
587
|
+
case disabled
|
|
588
|
+
case error
|
|
589
|
+
case success
|
|
590
|
+
}
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
**Naming rules:**
|
|
594
|
+
- Enum name = Figma property name in PascalCase
|
|
595
|
+
- Case names = Figma values in camelCase
|
|
596
|
+
- If Figma value is "Default" → use `.standard` (avoid Swift keyword)
|
|
597
|
+
- If enum is purely visual (only affects colors/styling) → internal to component, not in public API
|
|
598
|
+
- If enum affects content/structure → public, exposed in init
|
|
599
|
+
|
|
600
|
+
### 2.6 Final API Design
|
|
601
|
+
|
|
602
|
+
Compile the complete public API:
|
|
603
|
+
|
|
604
|
+
```swift
|
|
605
|
+
// FINAL API DESIGN for {componentName}
|
|
606
|
+
|
|
607
|
+
// Enums
|
|
608
|
+
public enum {EnumName}: String, CaseIterable, Sendable {
|
|
609
|
+
case {value1}
|
|
610
|
+
case {value2}
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
// Sub-configurations (if any)
|
|
614
|
+
public struct {SubConfig}: Sendable {
|
|
615
|
+
public let {property}: {Type}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// Data models (if list patterns detected)
|
|
619
|
+
public struct {ItemType}: Identifiable, Sendable {
|
|
620
|
+
public let id = UUID()
|
|
621
|
+
public let {field}: {Type}
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
// Main init
|
|
625
|
+
public init(
|
|
626
|
+
{param1}: {Type},
|
|
627
|
+
{param2}: {Type} = {default},
|
|
628
|
+
{param3}: {Type}? = nil
|
|
629
|
+
)
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
### 2.7 Write `{artifactPath}/pass3/04b_component_architecture.md`
|
|
633
|
+
|
|
634
|
+
```markdown
|
|
635
|
+
# Component Architecture
|
|
636
|
+
|
|
637
|
+
Component: {componentName}
|
|
638
|
+
Generated: {ISO_DATE}
|
|
639
|
+
Source: pass1/design_context_response.json, pass1/component_properties.json
|
|
640
|
+
|
|
641
|
+
## List Inference
|
|
642
|
+
|
|
643
|
+
| Element Group | Type | Count Across Variants | Conclusion |
|
|
644
|
+
|---------------|------|----------------------|------------|
|
|
645
|
+
| Passenger rows | Homogeneous | 1-3 | `[PassengerRow]` array |
|
|
646
|
+
| Card sections | Heterogeneous | 3-5 | `[CardSection]` enum array |
|
|
647
|
+
|
|
648
|
+
OR: No list patterns detected.
|
|
649
|
+
|
|
650
|
+
## Sub-Components
|
|
651
|
+
|
|
652
|
+
| Element | Scope | Configuration |
|
|
653
|
+
|---------|-------|---------------|
|
|
654
|
+
| Badge | Optional sub-component | `BadgeConfiguration` struct |
|
|
655
|
+
| Price | Always present group | `PriceConfiguration` struct |
|
|
656
|
+
|
|
657
|
+
OR: No sub-components detected. All properties are flat.
|
|
658
|
+
|
|
659
|
+
## Property Classification
|
|
660
|
+
|
|
661
|
+
| Property | Classification | Swift Type | Default |
|
|
662
|
+
|----------|---------------|------------|---------|
|
|
663
|
+
| title | Required | `String` | — |
|
|
664
|
+
| subtitle | Optional | `String?` | `nil` |
|
|
665
|
+
| state | Enum | `State` | — |
|
|
666
|
+
| showIcon | Bool toggle | `Bool` | `true` |
|
|
667
|
+
| passengers | Array | `[PassengerRow]` | — |
|
|
668
|
+
| onTap | Closure | `(() -> Void)?` | `nil` |
|
|
669
|
+
|
|
670
|
+
## Enum Definitions
|
|
671
|
+
|
|
672
|
+
### {EnumName}
|
|
673
|
+
|
|
674
|
+
| Figma Value | Swift Case | Visual Effect |
|
|
675
|
+
|-------------|------------|---------------|
|
|
676
|
+
| Active | `.active` | Green border, checkmark |
|
|
677
|
+
| Inactive | `.inactive` | Grey border, no icon |
|
|
678
|
+
| Disabled | `.disabled` | Light grey, reduced opacity |
|
|
679
|
+
|
|
680
|
+
## Configuration Hierarchy
|
|
681
|
+
|
|
682
|
+
{Flat / Grouped}
|
|
683
|
+
|
|
684
|
+
### Sub-Configurations (if grouped)
|
|
685
|
+
|
|
686
|
+
#### {SubConfigName}
|
|
687
|
+
|
|
688
|
+
| Property | Type | Required |
|
|
689
|
+
|----------|------|----------|
|
|
690
|
+
| amount | `String` | Yes |
|
|
691
|
+
| currency | `String` | Yes |
|
|
692
|
+
| originalAmount | `String?` | No |
|
|
693
|
+
|
|
694
|
+
## Final API Design
|
|
695
|
+
|
|
696
|
+
```swift
|
|
697
|
+
{Complete API from 2.6}
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
## Preview Data
|
|
701
|
+
|
|
702
|
+
```swift
|
|
703
|
+
// Default variant
|
|
704
|
+
static var preview: {componentName} {
|
|
705
|
+
.init(
|
|
706
|
+
title: "{sample}",
|
|
707
|
+
state: .active
|
|
708
|
+
)
|
|
709
|
+
}
|
|
710
|
+
```
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
### 2.8 Write `{artifactPath}/pass3/04b_component_architecture.json`
|
|
714
|
+
|
|
715
|
+
Alongside the markdown, emit a structured JSON so Phase 3G (Property Coverage) can verify coverage deterministically without AI interpretation.
|
|
716
|
+
|
|
717
|
+
```json
|
|
718
|
+
{
|
|
719
|
+
"componentName": "{componentName}",
|
|
720
|
+
"generated": "{ISO_DATE}",
|
|
721
|
+
"properties": [
|
|
722
|
+
{
|
|
723
|
+
"figmaKey": "{exact key from componentPropertyDefinitions, e.g. State or Text#6893:1}",
|
|
724
|
+
"name": "{display name}",
|
|
725
|
+
"type": "{VARIANT|BOOLEAN|TEXT|INSTANCE_SWAP|LAYER_TEXT}",
|
|
726
|
+
"status": "{IMPLEMENT|SKIP}",
|
|
727
|
+
"swiftType": "{enum State | String? | Image? | Bool | ...}",
|
|
728
|
+
"reason": "{only for SKIP — mandatory, e.g. 'Boolean merged into icon: Image? per Boolean Visibility Merge Rule'}"
|
|
729
|
+
}
|
|
730
|
+
],
|
|
731
|
+
"enums": [
|
|
732
|
+
{
|
|
733
|
+
"name": "{EnumName}",
|
|
734
|
+
"cases": ["{case1}", "{case2}"]
|
|
735
|
+
}
|
|
736
|
+
],
|
|
737
|
+
"complexity": "{SIMPLE|COMPLEX}",
|
|
738
|
+
"propertyCount": 0
|
|
739
|
+
}
|
|
740
|
+
```
|
|
741
|
+
|
|
742
|
+
**Rules:**
|
|
743
|
+
- Every key from `componentPropertyDefinitions` in `component_properties.json` MUST appear in `properties`
|
|
744
|
+
- DYNAMIC entries from Layer Text Classification (§1.5) MUST also appear in `properties` with `"type": "LAYER_TEXT"` and `"figmaKey": null`
|
|
745
|
+
- IMPLEMENT properties MUST have `swiftType`
|
|
746
|
+
- SKIP properties MUST have `reason`
|
|
747
|
+
- `propertyCount` = count of IMPLEMENT properties (used by GATE 3 complexity check)
|
|
748
|
+
|
|
749
|
+
---
|
|
750
|
+
|
|
751
|
+
## GATE 3: COMPLEXITY_EVALUATION
|
|
752
|
+
|
|
753
|
+
### 3.1 Count Properties
|
|
754
|
+
|
|
755
|
+
Count total configurable properties from the FINAL API DESIGN (after pattern reduction and architecture decisions):
|
|
756
|
+
- Init parameters
|
|
757
|
+
- Enum cases (count the enum itself as 1 property, not each case)
|
|
758
|
+
- Sub-configuration structs (count as 1 property each)
|
|
759
|
+
|
|
760
|
+
### 3.2 Determine Complexity
|
|
761
|
+
|
|
762
|
+
```
|
|
763
|
+
PROPERTY_COUNT = <COUNT from final API, not raw Figma properties>
|
|
764
|
+
SIMPLE = PROPERTY_COUNT <= 3
|
|
765
|
+
COMPLEX = PROPERTY_COUNT > 3
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
| Result | Configuration File | Workflow |
|
|
769
|
+
|--------|-------------------|----------|
|
|
770
|
+
| SIMPLE | No | Direct init parameters |
|
|
771
|
+
| COMPLEX | Yes | Configuration struct wraps all init params |
|
|
772
|
+
|
|
773
|
+
For COMPLEX components, the Configuration struct pattern:
|
|
774
|
+
|
|
775
|
+
```swift
|
|
776
|
+
// Configuration struct holds all init params
|
|
777
|
+
public struct {componentName}Configuration: Sendable {
|
|
778
|
+
public let {param1}: {Type}
|
|
779
|
+
public let {param2}: {Type}
|
|
780
|
+
// ...
|
|
781
|
+
|
|
782
|
+
public init(
|
|
783
|
+
{param1}: {Type},
|
|
784
|
+
{param2}: {Type} = {default}
|
|
785
|
+
) {
|
|
786
|
+
self.{param1} = {param1}
|
|
787
|
+
self.{param2} = {param2}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
// Component accepts configuration
|
|
792
|
+
public struct {componentName}: View {
|
|
793
|
+
private let configuration: {componentName}Configuration
|
|
794
|
+
|
|
795
|
+
public init(configuration: {componentName}Configuration) {
|
|
796
|
+
self.configuration = configuration
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
### 3.3 Write `{artifactPath}/pass3/05_complexity.md`
|
|
802
|
+
|
|
803
|
+
```markdown
|
|
804
|
+
# Complexity Evaluation
|
|
805
|
+
|
|
806
|
+
Component: {componentName}
|
|
807
|
+
Generated: {ISO_DATE}
|
|
808
|
+
|
|
809
|
+
## Property Count
|
|
810
|
+
|
|
811
|
+
| Source | Count | Details |
|
|
812
|
+
|--------|-------|---------|
|
|
813
|
+
| Raw Figma properties | {RAW_COUNT} | Before pattern reduction |
|
|
814
|
+
| After pattern reduction | {REDUCED_COUNT} | Arrays, enums collapsed |
|
|
815
|
+
| Final API properties | {FINAL_COUNT} | From component architecture |
|
|
816
|
+
|
|
817
|
+
## Result
|
|
818
|
+
|
|
819
|
+
| Field | Value |
|
|
820
|
+
|-------|-------|
|
|
821
|
+
| Complexity | {SIMPLE / COMPLEX} |
|
|
822
|
+
| Configuration struct | {Required / Not required} |
|
|
823
|
+
| Property count | {FINAL_COUNT} |
|
|
824
|
+
|
|
825
|
+
## Rationale
|
|
826
|
+
|
|
827
|
+
{Brief explanation: e.g., "5 init parameters including 1 enum, 1 optional, and 1 array. Configuration struct recommended for clean API."}
|
|
828
|
+
```
|
|
829
|
+
|
|
830
|
+
---
|
|
831
|
+
|
|
832
|
+
## VALIDATION CHECKLIST
|
|
833
|
+
|
|
834
|
+
Before marking complete, verify:
|
|
835
|
+
|
|
836
|
+
```
|
|
837
|
+
[ ] design_context_response.json fully analyzed for patterns
|
|
838
|
+
[ ] component_properties.json fully analyzed for variant types
|
|
839
|
+
[ ] All repeating patterns identified and modeled as arrays
|
|
840
|
+
[ ] All variant properties classified (enum, bool, optional, array)
|
|
841
|
+
[ ] Layer text classification performed — all sample/placeholder data identified as DYNAMIC API parameters
|
|
842
|
+
[ ] Image asset classification performed — stock photos as DYNAMIC (remote URL), icons/logos as STATIC (bundled)
|
|
843
|
+
[ ] List inference performed — homogeneous vs heterogeneous determined
|
|
844
|
+
[ ] Sub-component detection performed — configurations created where needed
|
|
845
|
+
[ ] Configuration hierarchy decided — flat vs grouped
|
|
846
|
+
[ ] All enums defined with correct case names
|
|
847
|
+
[ ] Final API design is complete and compilable
|
|
848
|
+
[ ] NO protocols used — all types are concrete structs/enums
|
|
849
|
+
[ ] All configurations are Sendable
|
|
850
|
+
[ ] Complexity evaluated using FINAL property count (not raw Figma count)
|
|
851
|
+
[ ] 04_patterns.md written to pass3/
|
|
852
|
+
[ ] 04b_component_architecture.md written to pass3/
|
|
853
|
+
[ ] 04b_component_architecture.json written to pass3/ (structured, for 3G script)
|
|
854
|
+
[ ] 05_complexity.md written to pass3/
|
|
855
|
+
```
|
|
856
|
+
|
|
857
|
+
---
|
|
858
|
+
|
|
859
|
+
## SUCCESS OUTPUT
|
|
860
|
+
|
|
861
|
+
```
|
|
862
|
+
STATUS: COMPLETE
|
|
863
|
+
PHASE: phase-3d
|
|
864
|
+
GATES_PASSED: [PRE_CHECK, PATTERN_DETECTION, COMPONENT_ARCHITECTURE, COMPLEXITY_EVALUATION]
|
|
865
|
+
ARTIFACTS_CREATED:
|
|
866
|
+
- {artifactPath}/pass3/04_patterns.md
|
|
867
|
+
- {artifactPath}/pass3/04b_component_architecture.md
|
|
868
|
+
- {artifactPath}/pass3/04b_component_architecture.json
|
|
869
|
+
- {artifactPath}/pass3/05_complexity.md
|
|
870
|
+
SUMMARY: Patterns: {REPEATING_COUNT} repeating, {VARIANT_COUNT} variant properties. Architecture: {ENUM_COUNT} enums, {SUBCONFIG_COUNT} sub-configurations, {LIST_COUNT} lists. Complexity: {SIMPLE/COMPLEX} ({FINAL_COUNT} properties).
|
|
871
|
+
```
|