@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,1015 @@
|
|
|
1
|
+
# /figma-iteration-commit — Validate & Commit to iteration/develop + PR to develop
|
|
2
|
+
|
|
3
|
+
## Guardrails
|
|
4
|
+
|
|
5
|
+
> **NEVER create branches on the main repo (REPO_ROOT).** Do not create `iteration/develop` or any other branch on the main repo. Do not commit to the main repo. This skill only commits to submodules (common, uicomponents, wiki). Main repo submodule refs are updated separately — not by this skill.
|
|
6
|
+
|
|
7
|
+
> **NEVER use `json.dumps()` default formatting on JSON files.** When editing JSON files (e.g., `ui-testing-identifiers.json`), preserve the existing file format. Do not reformat, re-indent, or change separators. The canonical format for `ui-testing-identifiers.json` is `" : "` (space-colon-space), not `": "`. If you must write JSON programmatically, post-process the output to match the existing format.
|
|
8
|
+
|
|
9
|
+
> **NEVER manually edit `ui-testing-identifiers.json`.** Format corruption on this file is most likely caused by conflict resolution. When a rebase conflict occurs on this file:
|
|
10
|
+
> 1. Check what keys we added — look at `Shared/Figma/Components/{nodeId}.json` (has the key list) or `git show HEAD:Shared/UITestingIdentifiers/ui-testing-identifiers.json`
|
|
11
|
+
> 2. Take the remote version: `git checkout --ours Shared/UITestingIdentifiers/ui-testing-identifiers.json` (during rebase, `--ours` = upstream/remote)
|
|
12
|
+
> 3. Re-add our keys via `/common-utility` (`utility-add-key`) — this writes in the correct `" : "` format
|
|
13
|
+
> 4. `git add Shared/UITestingIdentifiers/ui-testing-identifiers.json` + `git rebase --continue`
|
|
14
|
+
>
|
|
15
|
+
> Never resolve JSON conflicts by hand-editing or `json.dumps()` — it reformats the entire file.
|
|
16
|
+
|
|
17
|
+
> **ALWAYS validate `ui-testing-identifiers.json` key count after every rebase — even when there were no conflicts.** The implement agent regenerates this file from `identifier-keys.json` only, which means an auto-merge can silently drop keys that exist on `iteration/develop` but not in the local metadata. After every rebase (or cherry-pick), before staging and continuing, run:
|
|
18
|
+
>
|
|
19
|
+
> ```bash
|
|
20
|
+
> REMOTE_KEY_COUNT=$(git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null | grep -c '".*" : "' || echo 0)
|
|
21
|
+
> LOCAL_KEY_COUNT=$(grep -c '".*" : "' Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null || echo 0)
|
|
22
|
+
> if [ "$LOCAL_KEY_COUNT" -lt "$REMOTE_KEY_COUNT" ]; then
|
|
23
|
+
> echo "⚠️ INTEGRITY VIOLATION: ui-testing-identifiers.json lost $((REMOTE_KEY_COUNT - LOCAL_KEY_COUNT)) keys vs origin/iteration/develop"
|
|
24
|
+
> echo " Remote: ${REMOTE_KEY_COUNT} keys, Local: ${LOCAL_KEY_COUNT} keys"
|
|
25
|
+
> echo " Restoring from origin/iteration/develop and re-adding component keys..."
|
|
26
|
+
> git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json \
|
|
27
|
+
> > Shared/UITestingIdentifiers/ui-testing-identifiers.json
|
|
28
|
+
> # Re-add our component's keys (they are in identifier-keys.json — tool will merge them in)
|
|
29
|
+
> .build/debug/UITestingIdentifierTool generate \
|
|
30
|
+
> --config Shared/UITestingIdentifiers/Config/identifier-config.json
|
|
31
|
+
> git add Shared/UITestingIdentifiers/ui-testing-identifiers.json
|
|
32
|
+
> git add iOS/Sources/UITestingIdentifiers/Generated/UITestingIdentifierKeys.swift
|
|
33
|
+
> fi
|
|
34
|
+
> ```
|
|
35
|
+
>
|
|
36
|
+
> This guard runs even when `ui-testing-identifiers.json` was NOT in the conflict list. Silent key loss from auto-merge is the most common failure mode.
|
|
37
|
+
|
|
38
|
+
> **ALWAYS validate Generated Swift key files after every rebase — even when there were no conflicts.** The codegen tool (`UnifiedCodeGenerationTool`) regenerates `LocalizationStringKeys.swift` and `LocalizedAccessibilityStringKeys.swift` from config JSONs that reference `Sources/Suggested/*.json` files. An auto-merge (or accepting either side during conflict resolution) can silently drop enum blocks if the suggested-key files from another developer's component are not present locally. After every rebase (or cherry-pick), before rebuilding, run:
|
|
39
|
+
>
|
|
40
|
+
> ```bash
|
|
41
|
+
> LOC_FILE="iOS/Sources/LocalizationStringKeys/Generated/LocalizationStringKeys.swift"
|
|
42
|
+
> A11Y_FILE="iOS/Sources/AccessibilityStringKeys/Generated/LocalizedAccessibilityStringKeys.swift"
|
|
43
|
+
> for GEN_FILE in "$LOC_FILE" "$A11Y_FILE"; do
|
|
44
|
+
> REMOTE_ENUMS=$(git show origin/iteration/develop:"${GEN_FILE}" 2>/dev/null | grep -oE 'enum [A-Za-z0-9_]+' | sort -u || true)
|
|
45
|
+
> LOCAL_ENUMS=$(grep -oE 'enum [A-Za-z0-9_]+' "${GEN_FILE}" 2>/dev/null | sort -u || true)
|
|
46
|
+
> MISSING=$(comm -23 <(echo "$REMOTE_ENUMS") <(echo "$LOCAL_ENUMS"))
|
|
47
|
+
> if [ -n "$MISSING" ]; then
|
|
48
|
+
> echo "⚠️ INTEGRITY VIOLATION: ${GEN_FILE##*/} lost enum blocks vs origin/iteration/develop:"
|
|
49
|
+
> echo "$MISSING"
|
|
50
|
+
> echo " Restoring remote version (rebuild will re-add our component's keys)..."
|
|
51
|
+
> git show origin/iteration/develop:"${GEN_FILE}" > "${GEN_FILE}"
|
|
52
|
+
> git add "${GEN_FILE}"
|
|
53
|
+
> fi
|
|
54
|
+
> done
|
|
55
|
+
> ```
|
|
56
|
+
>
|
|
57
|
+
> This guard runs even when the Generated files were NOT in the conflict list. Silent enum loss from auto-merge or "accept either side" resolution is a known failure mode — the rebuild script's codegen step (3.5) will re-add our component's keys on top of the restored remote file.
|
|
58
|
+
|
|
59
|
+
> **ALWAYS validate `Sources/Suggested/*.json` file count after every rebase, cherry-pick, AND before every commit — even when there were no conflicts.** The implement agent only creates source JSONs for the current component. A rebase, cherry-pick, or `git add -A` can silently drop source JSON files belonging to OTHER components (e.g., a tool run deletes files, or a workspace reset loses them). These per-key source files are the ground truth for localization and accessibility code generation — losing them means generated code silently loses keys for other components. After every rebase (or cherry-pick), AND before every `git add -A` in the commit step, run:
|
|
60
|
+
>
|
|
61
|
+
> ```bash
|
|
62
|
+
> for SUGGESTED_DIR in \
|
|
63
|
+
> "Shared/Localization/LocalizationStrings/Sources/Suggested" \
|
|
64
|
+
> "Shared/Localization/AccessibilityStrings/Sources/Suggested"; do
|
|
65
|
+
>
|
|
66
|
+
> REMOTE_FILES=$(git ls-tree --name-only origin/iteration/develop -- "${SUGGESTED_DIR}/" 2>/dev/null | sed "s|${SUGGESTED_DIR}/||" | sort)
|
|
67
|
+
> LOCAL_FILES=$(ls -1 "${SUGGESTED_DIR}/" 2>/dev/null | sort)
|
|
68
|
+
> MISSING_FILES=$(comm -23 <(echo "$REMOTE_FILES") <(echo "$LOCAL_FILES"))
|
|
69
|
+
>
|
|
70
|
+
> if [ -n "$MISSING_FILES" ]; then
|
|
71
|
+
> MISSING_COUNT=$(echo "$MISSING_FILES" | wc -l | tr -d ' ')
|
|
72
|
+
> echo "⚠️ INTEGRITY VIOLATION: ${SUGGESTED_DIR} lost ${MISSING_COUNT} source JSON file(s) vs origin/iteration/develop:"
|
|
73
|
+
> echo "$MISSING_FILES" | head -20
|
|
74
|
+
> echo " Restoring missing files from origin/iteration/develop..."
|
|
75
|
+
> while IFS= read -r FILE; do
|
|
76
|
+
> git show "origin/iteration/develop:${SUGGESTED_DIR}/${FILE}" > "${SUGGESTED_DIR}/${FILE}"
|
|
77
|
+
> git add "${SUGGESTED_DIR}/${FILE}"
|
|
78
|
+
> done <<< "$MISSING_FILES"
|
|
79
|
+
> echo "✅ Restored ${MISSING_COUNT} missing source JSON file(s) in ${SUGGESTED_DIR##*/}."
|
|
80
|
+
> fi
|
|
81
|
+
> done
|
|
82
|
+
> ```
|
|
83
|
+
>
|
|
84
|
+
> This guard catches the most dangerous form of silent data loss: source JSON files from OTHER components being deleted by the current component's pipeline. Unlike generated files (which can be rebuilt), source JSONs contain the original translations and cannot be re-derived.
|
|
85
|
+
|
|
86
|
+
> **NEVER call `common-rebuild-derived-artifacts.sh` blindly after conflict resolution when `ui-testing-identifiers.json` may have been touched.** The rebuild script calls `UITestingIdentifierTool generate --swift-only` which only writes the Swift file — but the JSON may already be corrupt from a bad auto-merge. Always run the key-count integrity check BEFORE the rebuild script, and fix the JSON FIRST if the count decreased.
|
|
87
|
+
|
|
88
|
+
## Conflict File Classification (common submodule)
|
|
89
|
+
|
|
90
|
+
When a cherry-pick or rebase conflict occurs in the common submodule, classify each conflicted file and resolve automatically by pattern:
|
|
91
|
+
|
|
92
|
+
| File Pattern | Strategy | Reason |
|
|
93
|
+
|-------------|----------|--------|
|
|
94
|
+
| `iOS/Sources/*/Generated/*` | Accept either side | Will regenerate |
|
|
95
|
+
| `Shared/Figma/Generated/*` | Accept either side | Gitignored, will regenerate |
|
|
96
|
+
| `iOS/Sources/LocalizationAssets/Resources/*.xcstrings` | Accept either side | Will regenerate |
|
|
97
|
+
| `iOS/Sources/AccessibilityAssets/Resources/*.xcstrings` | Accept either side | Will regenerate |
|
|
98
|
+
| `Shared/Localization/*/Metadata/*` | Accept either side | Gitignored, will regenerate |
|
|
99
|
+
| `Shared/UITestingIdentifiers/Metadata/*` | Accept either side | Gitignored, will regenerate |
|
|
100
|
+
| `Sources/Suggested/*.json` | Our version wins | Per-key files, we created them |
|
|
101
|
+
| `Shared/Figma/Components/*.json` | Our version wins | We created/modified it |
|
|
102
|
+
| `Shared/UITestingIdentifiers/ui-testing-identifiers.json` | Take remote + re-add keys via tool | See Guardrails — never hand-edit |
|
|
103
|
+
| `Shared/UIAssets/Colors/*.json` | Take remote + manually insert new entries | Match existing format exactly |
|
|
104
|
+
|
|
105
|
+
**After resolving all conflicts, ALWAYS rebuild derived artifacts:**
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
bash "${REPO_ROOT}/.instructions/common/scripts/common-rebuild-derived-artifacts.sh"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
This regenerates all merged data, metadata, keys indexes, UI assets, token registries, and Figma catalogs.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Purpose
|
|
116
|
+
|
|
117
|
+
Validates a component implementation, commits directly to `iteration/develop` in submodules, and handles issue housekeeping (comment, phase update, auto-unblock dependents).
|
|
118
|
+
|
|
119
|
+
## Parameters
|
|
120
|
+
|
|
121
|
+
| Parameter | Required | Default | Description |
|
|
122
|
+
|-----------|----------|---------|-------------|
|
|
123
|
+
| `<ComponentName>` | Yes | — | PascalCase component name |
|
|
124
|
+
| `--gh` | No | — | GitHub issue number (auto-detected if on a tracked issue) |
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
/figma-iteration-commit ModalsTitle
|
|
128
|
+
/figma-iteration-commit ModalsTitle --gh 107
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Constants
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
REPO_ROOT = git repo root (auto-detect)
|
|
137
|
+
GH_REPO = {github.componentsRepo}
|
|
138
|
+
MAIN_REPO = ${REPO_ROOT}
|
|
139
|
+
COMMON = ${REPO_ROOT}/{repos.common.path}
|
|
140
|
+
UICOMPONENTS = ${REPO_ROOT}/{repos.components.path}
|
|
141
|
+
WIKI = ${REPO_ROOT}/{repos.wiki.path}
|
|
142
|
+
DEFAULT_JIRA = {jira.projectKey}-124692
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## STEP 0 — Resolve
|
|
148
|
+
|
|
149
|
+
1. Parse `ComponentName`. Convert to kebab-case.
|
|
150
|
+
2. If `--gh` provided, read the issue to get Jira key. Otherwise search for the issue:
|
|
151
|
+
```bash
|
|
152
|
+
gh issue list --repo ${GH_REPO} --state open --label component --search "{ComponentName}" --json number,body --jq '.[0]'
|
|
153
|
+
```
|
|
154
|
+
3. Extract Jira key from issue body (or use `DEFAULT_JIRA`).
|
|
155
|
+
4. Ensure submodules are on `iteration/develop`. For each submodule (common, uicomponents):
|
|
156
|
+
|
|
157
|
+
**If already on `iteration/develop`** → continue.
|
|
158
|
+
|
|
159
|
+
**If on a feature branch with commits** → rebase onto `iteration/develop` with backup:
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
a. Record the feature branch name and HEAD SHA
|
|
163
|
+
b. Create a backup branch: backup/{feature-branch-name}
|
|
164
|
+
c. Fetch latest iteration/develop from origin
|
|
165
|
+
d. Checkout iteration/develop
|
|
166
|
+
e. Cherry-pick (or rebase) the feature branch commits onto iteration/develop
|
|
167
|
+
f. Run build (STEP 1a) to verify nothing broke after rebase
|
|
168
|
+
g. If build succeeds:
|
|
169
|
+
- Delete the local feature branch
|
|
170
|
+
- Delete the remote feature branch (origin)
|
|
171
|
+
- Delete the local backup branch
|
|
172
|
+
h. If build fails:
|
|
173
|
+
- Reset iteration/develop to its previous state
|
|
174
|
+
- Restore the feature branch from the backup
|
|
175
|
+
- HALT: "Rebase broke the build. Feature branch preserved at {branch-name}."
|
|
176
|
+
- Do NOT delete the backup — leave it for manual resolution
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
cd ${SUBMODULE}
|
|
181
|
+
FEATURE_BRANCH=$(git branch --show-current)
|
|
182
|
+
|
|
183
|
+
if [ "${FEATURE_BRANCH}" != "iteration/develop" ]; then
|
|
184
|
+
FEATURE_SHA=$(git rev-parse HEAD)
|
|
185
|
+
ITER_BASE=$(git merge-base ${FEATURE_BRANCH} origin/iteration/develop)
|
|
186
|
+
|
|
187
|
+
# Backup
|
|
188
|
+
git branch backup/${FEATURE_BRANCH}
|
|
189
|
+
|
|
190
|
+
# Collect feature commits (from where it diverged from iteration/develop)
|
|
191
|
+
COMMITS=$(git log --oneline ${ITER_BASE}..${FEATURE_BRANCH} --reverse --format="%H")
|
|
192
|
+
|
|
193
|
+
# Switch to iteration/develop
|
|
194
|
+
git fetch origin iteration/develop
|
|
195
|
+
git checkout iteration/develop
|
|
196
|
+
git reset --hard origin/iteration/develop
|
|
197
|
+
|
|
198
|
+
# Cherry-pick feature commits
|
|
199
|
+
for COMMIT in ${COMMITS}; do
|
|
200
|
+
git cherry-pick ${COMMIT} || {
|
|
201
|
+
# CONFLICT HANDLING — do NOT abort or delete any changes
|
|
202
|
+
echo "⚠️ Cherry-pick conflict at ${COMMIT}."
|
|
203
|
+
echo "Conflicting files:"
|
|
204
|
+
CONFLICTED_FILES=$(git diff --name-only --diff-filter=U)
|
|
205
|
+
echo "${CONFLICTED_FILES}"
|
|
206
|
+
|
|
207
|
+
# Auto-resolve by file classification (see "Conflict File Classification" section)
|
|
208
|
+
AUTO_RESOLVED=()
|
|
209
|
+
MANUAL_NEEDED=()
|
|
210
|
+
|
|
211
|
+
for FILE in ${CONFLICTED_FILES}; do
|
|
212
|
+
case "${FILE}" in
|
|
213
|
+
iOS/Sources/*/Generated/*|Shared/Figma/Generated/*|iOS/Sources/LocalizationAssets/Resources/*.xcstrings|iOS/Sources/AccessibilityAssets/Resources/*.xcstrings|Shared/Localization/*/Metadata/*|Shared/UITestingIdentifiers/Metadata/*)
|
|
214
|
+
# Accept remote (will regenerate)
|
|
215
|
+
git checkout --ours "${FILE}" && git add "${FILE}"
|
|
216
|
+
AUTO_RESOLVED+=("${FILE} → accepted remote (will regenerate)")
|
|
217
|
+
;;
|
|
218
|
+
Sources/Suggested/*.json|Shared/Figma/Components/*.json)
|
|
219
|
+
# Our version wins (we created these)
|
|
220
|
+
git checkout --theirs "${FILE}" && git add "${FILE}"
|
|
221
|
+
AUTO_RESOLVED+=("${FILE} → kept ours (we created it)")
|
|
222
|
+
;;
|
|
223
|
+
Shared/UITestingIdentifiers/ui-testing-identifiers.json)
|
|
224
|
+
# Take remote + re-add keys via tool (see Guardrails)
|
|
225
|
+
git checkout --ours "${FILE}" && git add "${FILE}"
|
|
226
|
+
AUTO_RESOLVED+=("${FILE} → accepted remote (will re-add keys via tool after)")
|
|
227
|
+
;;
|
|
228
|
+
Shared/UIAssets/Colors/*.json)
|
|
229
|
+
# Take remote + manually insert new entries
|
|
230
|
+
git checkout --ours "${FILE}" && git add "${FILE}"
|
|
231
|
+
AUTO_RESOLVED+=("${FILE} → accepted remote (will insert new entries after)")
|
|
232
|
+
;;
|
|
233
|
+
*)
|
|
234
|
+
MANUAL_NEEDED+=("${FILE}")
|
|
235
|
+
;;
|
|
236
|
+
esac
|
|
237
|
+
done
|
|
238
|
+
|
|
239
|
+
if [ ${#AUTO_RESOLVED[@]} -gt 0 ]; then
|
|
240
|
+
echo "\n✅ Auto-resolved files:"
|
|
241
|
+
for ENTRY in "${AUTO_RESOLVED[@]}"; do echo " - ${ENTRY}"; done
|
|
242
|
+
fi
|
|
243
|
+
|
|
244
|
+
# If ui-testing-identifiers.json was conflicted, re-add our keys via /common-utility
|
|
245
|
+
if echo "${CONFLICTED_FILES}" | grep -q 'ui-testing-identifiers.json'; then
|
|
246
|
+
echo "\n📋 Re-adding our keys to ui-testing-identifiers.json via /common-utility (utility-add-key)..."
|
|
247
|
+
# Agent: use /common-utility utility-add-key for each key from Shared/Figma/Components/{nodeId}.json
|
|
248
|
+
fi
|
|
249
|
+
|
|
250
|
+
# If all files were auto-resolved, rebuild and continue
|
|
251
|
+
if [ ${#MANUAL_NEEDED[@]} -eq 0 ]; then
|
|
252
|
+
echo "\n✅ All conflicts auto-resolved."
|
|
253
|
+
|
|
254
|
+
# ── ui-testing-identifiers.json integrity guard (ALWAYS run before rebuild) ──
|
|
255
|
+
# The implement agent regenerates this file from identifier-keys.json only.
|
|
256
|
+
# An auto-merge can silently drop keys that exist on iteration/develop but not locally.
|
|
257
|
+
REMOTE_KEY_COUNT=$(git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null | grep -c '".*" : "' || echo 0)
|
|
258
|
+
LOCAL_KEY_COUNT=$(grep -c '".*" : "' Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null || echo 0)
|
|
259
|
+
if [ "${LOCAL_KEY_COUNT}" -lt "${REMOTE_KEY_COUNT}" ]; then
|
|
260
|
+
MISSING=$((REMOTE_KEY_COUNT - LOCAL_KEY_COUNT))
|
|
261
|
+
echo "⚠️ INTEGRITY FIX: ui-testing-identifiers.json lost ${MISSING} keys vs origin/iteration/develop. Restoring..."
|
|
262
|
+
git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json \
|
|
263
|
+
> Shared/UITestingIdentifiers/ui-testing-identifiers.json
|
|
264
|
+
.build/debug/UITestingIdentifierTool generate \
|
|
265
|
+
--config Shared/UITestingIdentifiers/Config/identifier-config.json
|
|
266
|
+
git add Shared/UITestingIdentifiers/ui-testing-identifiers.json
|
|
267
|
+
git add iOS/Sources/UITestingIdentifiers/Generated/UITestingIdentifierKeys.swift
|
|
268
|
+
echo "✅ Restored ${REMOTE_KEY_COUNT} remote keys + re-added component keys."
|
|
269
|
+
fi
|
|
270
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
271
|
+
|
|
272
|
+
# ── Generated Swift keys integrity guard (ALWAYS run before rebuild) ──
|
|
273
|
+
# The codegen tool regenerates from config JSONs + Sources/Suggested/*.json.
|
|
274
|
+
# An auto-merge can silently drop enum blocks from other developers' components.
|
|
275
|
+
LOC_FILE="iOS/Sources/LocalizationStringKeys/Generated/LocalizationStringKeys.swift"
|
|
276
|
+
A11Y_FILE="iOS/Sources/AccessibilityStringKeys/Generated/LocalizedAccessibilityStringKeys.swift"
|
|
277
|
+
for GEN_FILE in "$LOC_FILE" "$A11Y_FILE"; do
|
|
278
|
+
REMOTE_ENUMS=$(git show origin/iteration/develop:"${GEN_FILE}" 2>/dev/null | grep -oE 'enum [A-Za-z0-9_]+' | sort -u || true)
|
|
279
|
+
LOCAL_ENUMS=$(grep -oE 'enum [A-Za-z0-9_]+' "${GEN_FILE}" 2>/dev/null | sort -u || true)
|
|
280
|
+
MISSING_ENUMS=$(comm -23 <(echo "$REMOTE_ENUMS") <(echo "$LOCAL_ENUMS"))
|
|
281
|
+
if [ -n "$MISSING_ENUMS" ]; then
|
|
282
|
+
echo "⚠️ INTEGRITY FIX: ${GEN_FILE##*/} lost enum blocks vs origin/iteration/develop:"
|
|
283
|
+
echo "$MISSING_ENUMS"
|
|
284
|
+
echo " Restoring remote version (rebuild will re-add our component's keys)..."
|
|
285
|
+
git show origin/iteration/develop:"${GEN_FILE}" > "${GEN_FILE}"
|
|
286
|
+
git add "${GEN_FILE}"
|
|
287
|
+
fi
|
|
288
|
+
done
|
|
289
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
# ── Sources/Suggested/*.json integrity guard (ALWAYS run before rebuild) ──
|
|
293
|
+
# The implement agent only creates source JSONs for the current component.
|
|
294
|
+
# A cherry-pick or git add -A can silently drop source JSONs from other components.
|
|
295
|
+
for SUGGESTED_DIR in \
|
|
296
|
+
"Shared/Localization/LocalizationStrings/Sources/Suggested" \
|
|
297
|
+
"Shared/Localization/AccessibilityStrings/Sources/Suggested"; do
|
|
298
|
+
|
|
299
|
+
REMOTE_FILES=$(git ls-tree --name-only origin/iteration/develop -- "${SUGGESTED_DIR}/" 2>/dev/null | sed "s|${SUGGESTED_DIR}/||" | sort)
|
|
300
|
+
LOCAL_FILES=$(ls -1 "${SUGGESTED_DIR}/" 2>/dev/null | sort)
|
|
301
|
+
MISSING_FILES=$(comm -23 <(echo "$REMOTE_FILES") <(echo "$LOCAL_FILES"))
|
|
302
|
+
|
|
303
|
+
if [ -n "$MISSING_FILES" ]; then
|
|
304
|
+
MISSING_COUNT=$(echo "$MISSING_FILES" | wc -l | tr -d ' ')
|
|
305
|
+
echo "⚠️ INTEGRITY FIX: ${SUGGESTED_DIR##*/} lost ${MISSING_COUNT} source JSON file(s) vs origin/iteration/develop:"
|
|
306
|
+
echo "$MISSING_FILES" | head -20
|
|
307
|
+
echo " Restoring missing files from origin/iteration/develop..."
|
|
308
|
+
while IFS= read -r FILE; do
|
|
309
|
+
git show "origin/iteration/develop:${SUGGESTED_DIR}/${FILE}" > "${SUGGESTED_DIR}/${FILE}"
|
|
310
|
+
git add "${SUGGESTED_DIR}/${FILE}"
|
|
311
|
+
done <<< "$MISSING_FILES"
|
|
312
|
+
echo "✅ Restored ${MISSING_COUNT} missing source JSON file(s)."
|
|
313
|
+
fi
|
|
314
|
+
done
|
|
315
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
316
|
+
|
|
317
|
+
echo "Rebuilding derived artifacts..."
|
|
318
|
+
bash "${REPO_ROOT}/.instructions/common/scripts/common-rebuild-derived-artifacts.sh"
|
|
319
|
+
git add -A
|
|
320
|
+
git cherry-pick --continue
|
|
321
|
+
else
|
|
322
|
+
# Show remaining conflicts that need manual resolution
|
|
323
|
+
echo "\n⚠️ Files needing manual resolution:"
|
|
324
|
+
for FILE in "${MANUAL_NEEDED[@]}"; do
|
|
325
|
+
echo "\n--- Conflict in: ${FILE} ---"
|
|
326
|
+
grep -n '<<<<<<<\|=======\|>>>>>>>' "${FILE}" || true
|
|
327
|
+
done
|
|
328
|
+
|
|
329
|
+
echo "\n📋 Suggested resolution:"
|
|
330
|
+
echo " - Review the conflict markers above"
|
|
331
|
+
echo " - Both local (feature) and remote (iteration/develop) changes are preserved in the conflict markers"
|
|
332
|
+
echo " - Edit the conflicting files to keep the desired changes from both sides"
|
|
333
|
+
echo " - Then run: git add <resolved-files> && git cherry-pick --continue"
|
|
334
|
+
echo " - After resolving, rebuild: bash \"${REPO_ROOT}/.instructions/common/scripts/common-rebuild-derived-artifacts.sh\""
|
|
335
|
+
echo " - Backup branch is available at: backup/${FEATURE_BRANCH}"
|
|
336
|
+
|
|
337
|
+
# ASK the user whether to continue
|
|
338
|
+
# The agent MUST use the ask-questions tool here:
|
|
339
|
+
# Question: "Cherry-pick conflict detected. Auto-resolved N files, M need manual resolution.
|
|
340
|
+
# Would you like to: (a) resolve manually and continue, or (b) abort the commit?"
|
|
341
|
+
# If user chooses (b): git cherry-pick --abort && git checkout ${FEATURE_BRANCH} && exit 1
|
|
342
|
+
# If user chooses (a): wait for user to resolve, then rebuild derived artifacts, then git cherry-pick --continue
|
|
343
|
+
#
|
|
344
|
+
# IMPORTANT: Do NOT auto-abort. Do NOT delete the feature branch.
|
|
345
|
+
# Leave all changes intact and let the user decide.
|
|
346
|
+
fi
|
|
347
|
+
}
|
|
348
|
+
done
|
|
349
|
+
|
|
350
|
+
# Build validation after rebase (STEP 1a will run fully later, this is a quick gate)
|
|
351
|
+
# If build fails, restore from backup
|
|
352
|
+
# If build succeeds, clean up branches (after full STEP 1 passes and push succeeds in STEP 3b)
|
|
353
|
+
fi
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**Important:** Do NOT delete feature branches until STEP 3b push succeeds. Track them for cleanup:
|
|
357
|
+
```
|
|
358
|
+
BRANCHES_TO_CLEANUP=("common:${FEATURE_BRANCH}" ...)
|
|
359
|
+
```
|
|
360
|
+
After successful push in STEP 3b, delete each:
|
|
361
|
+
```bash
|
|
362
|
+
git branch -D ${FEATURE_BRANCH}
|
|
363
|
+
git push origin --delete ${FEATURE_BRANCH}
|
|
364
|
+
git branch -D backup/${FEATURE_BRANCH}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## STEP 1 — Validate
|
|
370
|
+
|
|
371
|
+
### 1a. Build
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
xcodebuild build -project "${REPO_ROOT}/{build.xcodeproj}" \
|
|
375
|
+
-scheme {build.scheme} -destination 'generic/platform=iOS' \
|
|
376
|
+
CODE_SIGNING_ALLOWED=NO -quiet
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
If build fails → HALT. Fix before committing.
|
|
380
|
+
|
|
381
|
+
### 1b. Tests
|
|
382
|
+
|
|
383
|
+
Run component tests:
|
|
384
|
+
|
|
385
|
+
```bash
|
|
386
|
+
xcodebuild test -project "${REPO_ROOT}/{build.xcodeproj}" \
|
|
387
|
+
-scheme {build.scheme} -destination 'platform=iOS Simulator,name=iPhone 16 Pro' \
|
|
388
|
+
-only-testing:"UIComponentsTests/${ComponentName}ViewInspectorTests" \
|
|
389
|
+
-only-testing:"UIComponentsTests/${ComponentName}SnapshotTests" \
|
|
390
|
+
CODE_SIGNING_ALLOWED=NO -quiet
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
If tests fail → HALT. Fix before committing.
|
|
394
|
+
|
|
395
|
+
### 1c. Key Sync Validation
|
|
396
|
+
|
|
397
|
+
Verify localization, accessibility, and testing identifier keys are in sync:
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
cd ${COMMON}
|
|
401
|
+
python3 .instructions/figma/figma-to-swiftui/scripts/validate-localization-sync.py \
|
|
402
|
+
--component "{ComponentName}"
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
If out of sync → HALT. Regenerate with `update-*-dev` (NOT `generate-*-code` — see common-utility docs):
|
|
406
|
+
```bash
|
|
407
|
+
swift package plugin --allow-writing-to-package-directory update-localizations-dev
|
|
408
|
+
swift package plugin --allow-writing-to-package-directory update-accessibility-dev
|
|
409
|
+
swift run UITestingIdentifierTool generate
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### 1d. Code Review (lightweight)
|
|
413
|
+
|
|
414
|
+
Read `.instructions/figma/figma-commit/REVIEW.md` and run the full 13-point checklist.
|
|
415
|
+
|
|
416
|
+
- **Auto-fix** any fixable violations (magic numbers, missing identifiers, wrong patterns).
|
|
417
|
+
- If auto-fixes applied, re-run build (STEP 1a) to verify.
|
|
418
|
+
- If unfixable violations remain → print them, ask user whether to proceed or abort.
|
|
419
|
+
|
|
420
|
+
Print validation result:
|
|
421
|
+
|
|
422
|
+
```
|
|
423
|
+
Validation: PASS / FAIL
|
|
424
|
+
Build: ✅
|
|
425
|
+
Tests: ✅ (N passed)
|
|
426
|
+
Key Sync: ✅
|
|
427
|
+
Review: ✅ / ⚠️ (N warnings)
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
## STEP 2 — Detect Changes
|
|
433
|
+
|
|
434
|
+
```bash
|
|
435
|
+
HAS_COMMON=$(cd "${COMMON}" && git status --porcelain | head -1)
|
|
436
|
+
HAS_UICOMPONENTS=$(cd "${UICOMPONENTS}" && git status --porcelain | head -1)
|
|
437
|
+
HAS_WIKI=$(cd "${WIKI}" && git status --porcelain | head -1)
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## STEP 3 — Commit Locally
|
|
443
|
+
|
|
444
|
+
Commit to local `iteration/develop` in submodules. Do NOT push yet — pushing happens in STEP 3b after validation confirms the build is clean.
|
|
445
|
+
|
|
446
|
+
### 3a. Commit (local only)
|
|
447
|
+
|
|
448
|
+
**Common (if HAS_COMMON):**
|
|
449
|
+
|
|
450
|
+
> ⚠️ **Before `git add -A`**, run the Sources/Suggested integrity guard (see Guardrails). This prevents silently staging deletions of other components' source JSON files.
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
cd ${COMMON}
|
|
454
|
+
|
|
455
|
+
# ── Pre-commit Sources/Suggested integrity guard ──
|
|
456
|
+
for SUGGESTED_DIR in \
|
|
457
|
+
"Shared/Localization/LocalizationStrings/Sources/Suggested" \
|
|
458
|
+
"Shared/Localization/AccessibilityStrings/Sources/Suggested"; do
|
|
459
|
+
|
|
460
|
+
REMOTE_FILES=$(git ls-tree --name-only origin/iteration/develop -- "${SUGGESTED_DIR}/" 2>/dev/null | sed "s|${SUGGESTED_DIR}/||" | sort)
|
|
461
|
+
LOCAL_FILES=$(ls -1 "${SUGGESTED_DIR}/" 2>/dev/null | sort)
|
|
462
|
+
MISSING_FILES=$(comm -23 <(echo "$REMOTE_FILES") <(echo "$LOCAL_FILES"))
|
|
463
|
+
|
|
464
|
+
if [ -n "$MISSING_FILES" ]; then
|
|
465
|
+
MISSING_COUNT=$(echo "$MISSING_FILES" | wc -l | tr -d ' ')
|
|
466
|
+
echo "⚠️ PRE-COMMIT FIX: ${SUGGESTED_DIR##*/} missing ${MISSING_COUNT} source JSON file(s) vs origin. Restoring..."
|
|
467
|
+
while IFS= read -r FILE; do
|
|
468
|
+
git show "origin/iteration/develop:${SUGGESTED_DIR}/${FILE}" > "${SUGGESTED_DIR}/${FILE}"
|
|
469
|
+
done <<< "$MISSING_FILES"
|
|
470
|
+
echo "✅ Restored ${MISSING_COUNT} file(s). They will be included in the commit."
|
|
471
|
+
fi
|
|
472
|
+
done
|
|
473
|
+
# ──────────────────────────────────────────────────
|
|
474
|
+
|
|
475
|
+
git add -A
|
|
476
|
+
git commit -m "feat(common): [${JIRA_ISSUE}] add ${COMPONENT_PASCAL} tokens and keys
|
|
477
|
+
|
|
478
|
+
Refs: ${JIRA_ISSUE}"
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
**UIComponents (if HAS_UICOMPONENTS):**
|
|
482
|
+
|
|
483
|
+
```bash
|
|
484
|
+
cd ${UICOMPONENTS}
|
|
485
|
+
git add -A
|
|
486
|
+
git commit -m "feat(uicomponents): [${JIRA_ISSUE}] add ${COMPONENT_PASCAL} component
|
|
487
|
+
|
|
488
|
+
Refs: ${JIRA_ISSUE}"
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
**Wiki (if HAS_WIKI):**
|
|
492
|
+
|
|
493
|
+
```bash
|
|
494
|
+
cd ${WIKI}
|
|
495
|
+
git add -A
|
|
496
|
+
git commit -m "docs: [${JIRA_ISSUE}] add ${COMPONENT_PASCAL} wiki documentation
|
|
497
|
+
|
|
498
|
+
Refs: ${JIRA_ISSUE}"
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
### ⛔ 3a-gate — Pre-Push Approval (required HARD STOP)
|
|
504
|
+
|
|
505
|
+
> **Do NOT proceed to STEP 3b until the user explicitly approves.**
|
|
506
|
+
> Use the `ask-questions` tool here. A silent "yes" assumption is a pipeline violation.
|
|
507
|
+
|
|
508
|
+
**Print the following push summary for every submodule that has local commits:**
|
|
509
|
+
|
|
510
|
+
```
|
|
511
|
+
╔══════════════════════════════════════════════════════════════════╗
|
|
512
|
+
║ PRE-PUSH SUMMARY — iteration/develop ║
|
|
513
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
514
|
+
║ common (if HAS_COMMON): ║
|
|
515
|
+
║ Branch : iteration/develop ║
|
|
516
|
+
║ Ahead : N commits ahead of origin/iteration/develop ║
|
|
517
|
+
║ Commits: (list each SHA + title) ║
|
|
518
|
+
║ Files : +X insertions, -Y deletions ║
|
|
519
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
520
|
+
║ uicomponents (if HAS_UICOMPONENTS): ║
|
|
521
|
+
║ Branch : iteration/develop ║
|
|
522
|
+
║ Ahead : N commits ahead of origin/iteration/develop ║
|
|
523
|
+
║ Commits: (list each SHA + title) ║
|
|
524
|
+
║ Files : +X insertions, -Y deletions ║
|
|
525
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
526
|
+
║ wiki (if HAS_WIKI): ║
|
|
527
|
+
║ Branch : master ║
|
|
528
|
+
║ Ahead : N commits ahead of origin/master ║
|
|
529
|
+
║ Commits: (list each SHA + title) ║
|
|
530
|
+
║ Files : +X insertions, -Y deletions ║
|
|
531
|
+
╚══════════════════════════════════════════════════════════════════╝
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
Generate this summary with:
|
|
535
|
+
|
|
536
|
+
```bash
|
|
537
|
+
# For each submodule with commits — adapt branch name per repo:
|
|
538
|
+
cd ${SUBMODULE}
|
|
539
|
+
echo "Ahead: $(git rev-list origin/${PUSH_BRANCH}..HEAD --count) commits"
|
|
540
|
+
git log origin/${PUSH_BRANCH}..HEAD --oneline
|
|
541
|
+
git diff origin/${PUSH_BRANCH}..HEAD --stat | tail -1
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
**Then ask the user:**
|
|
545
|
+
|
|
546
|
+
> ✅ All validations passed. The commits above are ready to push to `origin/iteration/develop`.
|
|
547
|
+
>
|
|
548
|
+
> **Ready to push? Reply `yes` to push, or `no` to stop here and leave local commits intact.**
|
|
549
|
+
|
|
550
|
+
**Branching logic:**
|
|
551
|
+
|
|
552
|
+
- If user replies **`yes`** (or `ok`, `go`, `approved`, `looks good`) → proceed to STEP 3b.
|
|
553
|
+
- If user replies **`no`** (or `stop`, `cancel`, `wait`) → print:
|
|
554
|
+
|
|
555
|
+
```
|
|
556
|
+
Push cancelled. Local commits preserved:
|
|
557
|
+
common : <SHA>
|
|
558
|
+
uicomponents : <SHA>
|
|
559
|
+
wiki : <SHA>
|
|
560
|
+
|
|
561
|
+
Run /figma-iteration-commit again when ready to push.
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
Then **HALT** — do not revert any local commits, do not push anything.
|
|
565
|
+
|
|
566
|
+
---
|
|
567
|
+
|
|
568
|
+
### 3b. Push with Rebase-Retry Loop
|
|
569
|
+
|
|
570
|
+
For each submodule (common, uicomponents), push with this logic:
|
|
571
|
+
|
|
572
|
+
```
|
|
573
|
+
1. Attempt push
|
|
574
|
+
2. If push succeeds → done
|
|
575
|
+
3. If push rejected (remote has new commits):
|
|
576
|
+
a. Fetch latest from origin
|
|
577
|
+
b. Rebase local commits onto updated remote
|
|
578
|
+
c. Re-run build (STEP 1a) to verify nothing broke after rebase
|
|
579
|
+
d. If build passes → retry push (go to 1)
|
|
580
|
+
e. If build fails → HALT, report conflict
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
**Per submodule:**
|
|
584
|
+
|
|
585
|
+
```bash
|
|
586
|
+
cd ${SUBMODULE}
|
|
587
|
+
PUSH_BRANCH="iteration/develop" # or "master" for wiki
|
|
588
|
+
|
|
589
|
+
MAX_RETRIES=3
|
|
590
|
+
for i in $(seq 1 $MAX_RETRIES); do
|
|
591
|
+
git push origin ${PUSH_BRANCH} && break
|
|
592
|
+
|
|
593
|
+
echo "Push rejected — remote updated. Rebasing (attempt $i)..."
|
|
594
|
+
git fetch origin ${PUSH_BRANCH}
|
|
595
|
+
git rebase origin/${PUSH_BRANCH}
|
|
596
|
+
|
|
597
|
+
if [ $? -ne 0 ]; then
|
|
598
|
+
# CONFLICT HANDLING — do NOT abort or delete any changes
|
|
599
|
+
echo "⚠️ Rebase conflict detected during push retry."
|
|
600
|
+
echo "Conflicting files:"
|
|
601
|
+
CONFLICTED_FILES=$(git diff --name-only --diff-filter=U)
|
|
602
|
+
echo "${CONFLICTED_FILES}"
|
|
603
|
+
|
|
604
|
+
# Auto-resolve by file classification (see "Conflict File Classification" section)
|
|
605
|
+
AUTO_RESOLVED=()
|
|
606
|
+
MANUAL_NEEDED=()
|
|
607
|
+
|
|
608
|
+
for FILE in ${CONFLICTED_FILES}; do
|
|
609
|
+
case "${FILE}" in
|
|
610
|
+
iOS/Sources/*/Generated/*|Shared/Figma/Generated/*|iOS/Sources/LocalizationAssets/Resources/*.xcstrings|iOS/Sources/AccessibilityAssets/Resources/*.xcstrings|Shared/Localization/*/Metadata/*|Shared/UITestingIdentifiers/Metadata/*)
|
|
611
|
+
# Accept remote (will regenerate)
|
|
612
|
+
git checkout --ours "${FILE}" && git add "${FILE}"
|
|
613
|
+
AUTO_RESOLVED+=("${FILE} → accepted remote (will regenerate)")
|
|
614
|
+
;;
|
|
615
|
+
Sources/Suggested/*.json|Shared/Figma/Components/*.json)
|
|
616
|
+
# Our version wins (we created these)
|
|
617
|
+
git checkout --theirs "${FILE}" && git add "${FILE}"
|
|
618
|
+
AUTO_RESOLVED+=("${FILE} → kept ours (we created it)")
|
|
619
|
+
;;
|
|
620
|
+
Shared/UITestingIdentifiers/ui-testing-identifiers.json)
|
|
621
|
+
# Take remote + re-add keys via tool (see Guardrails)
|
|
622
|
+
git checkout --ours "${FILE}" && git add "${FILE}"
|
|
623
|
+
AUTO_RESOLVED+=("${FILE} → accepted remote (will re-add keys via tool after)")
|
|
624
|
+
;;
|
|
625
|
+
Shared/UIAssets/Colors/*.json)
|
|
626
|
+
# Take remote + manually insert new entries
|
|
627
|
+
git checkout --ours "${FILE}" && git add "${FILE}"
|
|
628
|
+
AUTO_RESOLVED+=("${FILE} → accepted remote (will insert new entries after)")
|
|
629
|
+
;;
|
|
630
|
+
*)
|
|
631
|
+
MANUAL_NEEDED+=("${FILE}")
|
|
632
|
+
;;
|
|
633
|
+
esac
|
|
634
|
+
done
|
|
635
|
+
|
|
636
|
+
if [ ${#AUTO_RESOLVED[@]} -gt 0 ]; then
|
|
637
|
+
echo "\n✅ Auto-resolved files:"
|
|
638
|
+
for ENTRY in "${AUTO_RESOLVED[@]}"; do echo " - ${ENTRY}"; done
|
|
639
|
+
fi
|
|
640
|
+
|
|
641
|
+
# If ui-testing-identifiers.json was conflicted, re-add our keys via /common-utility
|
|
642
|
+
if echo "${CONFLICTED_FILES}" | grep -q 'ui-testing-identifiers.json'; then
|
|
643
|
+
echo "\n📋 Re-adding our keys to ui-testing-identifiers.json via /common-utility (utility-add-key)..."
|
|
644
|
+
# Agent: use /common-utility utility-add-key for each key from Shared/Figma/Components/{nodeId}.json
|
|
645
|
+
fi
|
|
646
|
+
|
|
647
|
+
# If all files were auto-resolved, rebuild and continue
|
|
648
|
+
if [ ${#MANUAL_NEEDED[@]} -eq 0 ]; then
|
|
649
|
+
echo "\n✅ All conflicts auto-resolved."
|
|
650
|
+
|
|
651
|
+
# ── ui-testing-identifiers.json integrity guard (ALWAYS run before rebuild) ──
|
|
652
|
+
# The implement agent regenerates this file from identifier-keys.json only.
|
|
653
|
+
# An auto-merge can silently drop keys that exist on iteration/develop but not locally.
|
|
654
|
+
REMOTE_KEY_COUNT=$(git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null | grep -c '".*" : "' || echo 0)
|
|
655
|
+
LOCAL_KEY_COUNT=$(grep -c '".*" : "' Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null || echo 0)
|
|
656
|
+
if [ "${LOCAL_KEY_COUNT}" -lt "${REMOTE_KEY_COUNT}" ]; then
|
|
657
|
+
MISSING=$((REMOTE_KEY_COUNT - LOCAL_KEY_COUNT))
|
|
658
|
+
echo "⚠️ INTEGRITY FIX: ui-testing-identifiers.json lost ${MISSING} keys vs origin/iteration/develop. Restoring..."
|
|
659
|
+
git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json \
|
|
660
|
+
> Shared/UITestingIdentifiers/ui-testing-identifiers.json
|
|
661
|
+
.build/debug/UITestingIdentifierTool generate \
|
|
662
|
+
--config Shared/UITestingIdentifiers/Config/identifier-config.json
|
|
663
|
+
git add Shared/UITestingIdentifiers/ui-testing-identifiers.json
|
|
664
|
+
git add iOS/Sources/UITestingIdentifiers/Generated/UITestingIdentifierKeys.swift
|
|
665
|
+
echo "✅ Restored ${REMOTE_KEY_COUNT} remote keys + re-added component keys."
|
|
666
|
+
fi
|
|
667
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
668
|
+
|
|
669
|
+
# ── Generated Swift keys integrity guard (ALWAYS run before rebuild) ──
|
|
670
|
+
# The codegen tool regenerates from config JSONs + Sources/Suggested/*.json.
|
|
671
|
+
# An auto-merge can silently drop enum blocks from other developers' components.
|
|
672
|
+
LOC_FILE="iOS/Sources/LocalizationStringKeys/Generated/LocalizationStringKeys.swift"
|
|
673
|
+
A11Y_FILE="iOS/Sources/AccessibilityStringKeys/Generated/LocalizedAccessibilityStringKeys.swift"
|
|
674
|
+
for GEN_FILE in "$LOC_FILE" "$A11Y_FILE"; do
|
|
675
|
+
REMOTE_ENUMS=$(git show origin/iteration/develop:"${GEN_FILE}" 2>/dev/null | grep -oE 'enum [A-Za-z0-9_]+' | sort -u || true)
|
|
676
|
+
LOCAL_ENUMS=$(grep -oE 'enum [A-Za-z0-9_]+' "${GEN_FILE}" 2>/dev/null | sort -u || true)
|
|
677
|
+
MISSING_ENUMS=$(comm -23 <(echo "$REMOTE_ENUMS") <(echo "$LOCAL_ENUMS"))
|
|
678
|
+
if [ -n "$MISSING_ENUMS" ]; then
|
|
679
|
+
echo "⚠️ INTEGRITY FIX: ${GEN_FILE##*/} lost enum blocks vs origin/iteration/develop:"
|
|
680
|
+
echo "$MISSING_ENUMS"
|
|
681
|
+
echo " Restoring remote version (rebuild will re-add our component's keys)..."
|
|
682
|
+
git show origin/iteration/develop:"${GEN_FILE}" > "${GEN_FILE}"
|
|
683
|
+
git add "${GEN_FILE}"
|
|
684
|
+
fi
|
|
685
|
+
done
|
|
686
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
687
|
+
|
|
688
|
+
# ── Sources/Suggested/*.json integrity guard (ALWAYS run before rebuild) ──
|
|
689
|
+
for SUGGESTED_DIR in \
|
|
690
|
+
"Shared/Localization/LocalizationStrings/Sources/Suggested" \
|
|
691
|
+
"Shared/Localization/AccessibilityStrings/Sources/Suggested"; do
|
|
692
|
+
|
|
693
|
+
REMOTE_FILES=$(git ls-tree --name-only origin/iteration/develop -- "${SUGGESTED_DIR}/" 2>/dev/null | sed "s|${SUGGESTED_DIR}/||" | sort)
|
|
694
|
+
LOCAL_FILES=$(ls -1 "${SUGGESTED_DIR}/" 2>/dev/null | sort)
|
|
695
|
+
MISSING_FILES=$(comm -23 <(echo "$REMOTE_FILES") <(echo "$LOCAL_FILES"))
|
|
696
|
+
|
|
697
|
+
if [ -n "$MISSING_FILES" ]; then
|
|
698
|
+
MISSING_COUNT=$(echo "$MISSING_FILES" | wc -l | tr -d ' ')
|
|
699
|
+
echo "⚠️ INTEGRITY FIX: ${SUGGESTED_DIR##*/} lost ${MISSING_COUNT} source JSON file(s) vs origin/iteration/develop:"
|
|
700
|
+
echo "$MISSING_FILES" | head -20
|
|
701
|
+
echo " Restoring missing files from origin/iteration/develop..."
|
|
702
|
+
while IFS= read -r FILE; do
|
|
703
|
+
git show "origin/iteration/develop:${SUGGESTED_DIR}/${FILE}" > "${SUGGESTED_DIR}/${FILE}"
|
|
704
|
+
git add "${SUGGESTED_DIR}/${FILE}"
|
|
705
|
+
done <<< "$MISSING_FILES"
|
|
706
|
+
echo "✅ Restored ${MISSING_COUNT} missing source JSON file(s)."
|
|
707
|
+
fi
|
|
708
|
+
done
|
|
709
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
710
|
+
|
|
711
|
+
echo "Rebuilding derived artifacts..."
|
|
712
|
+
bash "${REPO_ROOT}/.instructions/common/scripts/common-rebuild-derived-artifacts.sh"
|
|
713
|
+
git add -A
|
|
714
|
+
git rebase --continue
|
|
715
|
+
else
|
|
716
|
+
# Show remaining conflicts that need manual resolution
|
|
717
|
+
echo "\n⚠️ Files needing manual resolution:"
|
|
718
|
+
for FILE in "${MANUAL_NEEDED[@]}"; do
|
|
719
|
+
echo "\n--- Conflict in: ${FILE} ---"
|
|
720
|
+
grep -n '<<<<<<<\|=======\|>>>>>>>' "${FILE}" || true
|
|
721
|
+
done
|
|
722
|
+
|
|
723
|
+
echo "\n📋 Suggested resolution:"
|
|
724
|
+
echo " - Review the conflict markers above"
|
|
725
|
+
echo " - Both local and remote changes are preserved in the conflict markers"
|
|
726
|
+
echo " - Edit the conflicting files to keep the desired changes from both sides"
|
|
727
|
+
echo " - After resolving, rebuild: bash \"${REPO_ROOT}/.instructions/common/scripts/common-rebuild-derived-artifacts.sh\""
|
|
728
|
+
echo " - Then run: git add <resolved-files> && git rebase --continue"
|
|
729
|
+
|
|
730
|
+
# ASK the user whether to continue
|
|
731
|
+
# The agent MUST use the ask-questions tool here:
|
|
732
|
+
# Question: "Rebase conflict detected during push. Auto-resolved N files, M need manual resolution.
|
|
733
|
+
# Would you like to: (a) resolve manually and continue pushing, or (b) abort the rebase and stop?"
|
|
734
|
+
# If user chooses (b): git rebase --abort && HALT
|
|
735
|
+
# If user chooses (a): wait for user to resolve, then rebuild derived artifacts, then git rebase --continue and re-validate build
|
|
736
|
+
#
|
|
737
|
+
# IMPORTANT: Do NOT auto-abort. Do NOT delete any committed changes.
|
|
738
|
+
# Leave all changes intact and let the user decide.
|
|
739
|
+
fi
|
|
740
|
+
fi
|
|
741
|
+
|
|
742
|
+
# Re-validate build after rebase
|
|
743
|
+
xcodebuild build -project "${REPO_ROOT}/{build.xcodeproj}" \
|
|
744
|
+
-scheme {build.scheme} -destination 'generic/platform=iOS' \
|
|
745
|
+
CODE_SIGNING_ALLOWED=NO -quiet
|
|
746
|
+
|
|
747
|
+
if [ $? -ne 0 ]; then
|
|
748
|
+
echo "HALT: Build failed after rebase. Fix before pushing."
|
|
749
|
+
exit 1
|
|
750
|
+
fi
|
|
751
|
+
done
|
|
752
|
+
```
|
|
753
|
+
|
|
754
|
+
### 3c. Fetch all remotes
|
|
755
|
+
|
|
756
|
+
After successful push, sync all local branches:
|
|
757
|
+
|
|
758
|
+
```bash
|
|
759
|
+
cd ${MAIN_REPO} && git fetch origin develop
|
|
760
|
+
cd ${COMMON} && git fetch origin iteration/develop
|
|
761
|
+
cd ${UICOMPONENTS} && git fetch origin iteration/develop
|
|
762
|
+
```
|
|
763
|
+
|
|
764
|
+
---
|
|
765
|
+
|
|
766
|
+
## STEP 4 — Issue Housekeeping
|
|
767
|
+
|
|
768
|
+
### 4a. Comment on issue
|
|
769
|
+
|
|
770
|
+
If issue was found/provided:
|
|
771
|
+
|
|
772
|
+
```bash
|
|
773
|
+
COMMON_SHA=$(git -C ${COMMON} rev-parse --short HEAD)
|
|
774
|
+
UICOMP_SHA=$(git -C ${UICOMPONENTS} rev-parse --short HEAD)
|
|
775
|
+
|
|
776
|
+
gh issue comment <N> --repo ${GH_REPO} --body "$(cat <<'EOF'
|
|
777
|
+
Committed to iteration/develop (submodules):
|
|
778
|
+
- common: ${COMMON_SHA}
|
|
779
|
+
- uicomponents: ${UICOMP_SHA}
|
|
780
|
+
|
|
781
|
+
Ready for review.
|
|
782
|
+
EOF
|
|
783
|
+
)"
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
### 4b. Sync issue from registry
|
|
787
|
+
|
|
788
|
+
Phase state is tracked per-flag in the component registry
|
|
789
|
+
(`status.ios.{implemented,tested,codeConnect,wiki}`), written by the
|
|
790
|
+
phase finalize scripts during STEP 2 of `/figma-cli-iterate`. The
|
|
791
|
+
issue's labels and Progress table are projections of that state — no
|
|
792
|
+
filesystem inference anymore.
|
|
793
|
+
|
|
794
|
+
Run the registry sync once, after the commit succeeds:
|
|
795
|
+
|
|
796
|
+
```bash
|
|
797
|
+
python3 .instructions/figma/figma-to-swiftui/scripts/update-issue-from-registry.py \
|
|
798
|
+
--node-id "<NODE_ID>" \
|
|
799
|
+
--platform ios
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
This call is idempotent:
|
|
803
|
+
|
|
804
|
+
- Adds/removes `impl:*`/`test:*`/`cc:*`/`wiki:*` labels to match
|
|
805
|
+
registry state (green when current, yellow when stale or against an
|
|
806
|
+
older impl.version).
|
|
807
|
+
- Rewrites the `### Progress` table in the issue body.
|
|
808
|
+
- Strips any legacy `phase:*` labels.
|
|
809
|
+
- If zero open issues reference this node-id, creates a new one with
|
|
810
|
+
`team:core` as default.
|
|
811
|
+
- If multiple open issues reference the node-id, closes all but the
|
|
812
|
+
lowest-numbered one with a "Duplicate of #N" comment.
|
|
813
|
+
|
|
814
|
+
If the call fails (gh not authenticated, rate limit, etc.), log the
|
|
815
|
+
error but don't fail the commit — the sync can always be re-run
|
|
816
|
+
manually or via `bulk-sync-issues.py`.
|
|
817
|
+
|
|
818
|
+
### 4c. Link wiki to issue
|
|
819
|
+
|
|
820
|
+
If wiki was committed (HAS_WIKI), add or update the **Wiki** section in the issue body:
|
|
821
|
+
|
|
822
|
+
```
|
|
823
|
+
WIKI_URL=https://github.com/${GH_REPO}/wiki/${COMPONENT_PASCAL}
|
|
824
|
+
```
|
|
825
|
+
|
|
826
|
+
Read the current issue body, then:
|
|
827
|
+
- If a `### Wiki` section already exists, replace its content with the new link.
|
|
828
|
+
- If no `### Wiki` section exists, insert it before `### Notes`.
|
|
829
|
+
|
|
830
|
+
The Wiki section format:
|
|
831
|
+
|
|
832
|
+
```markdown
|
|
833
|
+
### Wiki
|
|
834
|
+
|
|
835
|
+
[${COMPONENT_PASCAL}](${WIKI_URL})
|
|
836
|
+
```
|
|
837
|
+
|
|
838
|
+
Use a Python script written to a temp file to avoid shell quoting issues with `gh issue edit --body-file`:
|
|
839
|
+
|
|
840
|
+
```python
|
|
841
|
+
import subprocess, json, re
|
|
842
|
+
|
|
843
|
+
COMPONENT = "${COMPONENT_PASCAL}"
|
|
844
|
+
GH_REPO = "${GH_REPO}"
|
|
845
|
+
ISSUE_N = <N>
|
|
846
|
+
WIKI_URL = f"https://github.com/{GH_REPO}/wiki/{COMPONENT}"
|
|
847
|
+
WIKI_SECTION = f"### Wiki\n\n[{COMPONENT}]({WIKI_URL})"
|
|
848
|
+
|
|
849
|
+
result = subprocess.run(
|
|
850
|
+
["gh", "issue", "view", str(ISSUE_N), "--repo", GH_REPO, "--json", "body"],
|
|
851
|
+
capture_output=True, text=True)
|
|
852
|
+
body = json.loads(result.stdout)["body"]
|
|
853
|
+
|
|
854
|
+
if "### Wiki" in body:
|
|
855
|
+
body = re.sub(r"### Wiki\n\n.*?\n(\n###|\Z)", lambda m: WIKI_SECTION + "\n" + m.group(1), body, flags=re.DOTALL)
|
|
856
|
+
else:
|
|
857
|
+
body = body.replace("### Notes", WIKI_SECTION + "\n\n### Notes")
|
|
858
|
+
|
|
859
|
+
with open("/tmp/issue_body_update.md", "w") as f:
|
|
860
|
+
f.write(body)
|
|
861
|
+
|
|
862
|
+
subprocess.run(["gh", "issue", "edit", str(ISSUE_N), "--repo", GH_REPO, "--body-file", "/tmp/issue_body_update.md"])
|
|
863
|
+
```
|
|
864
|
+
|
|
865
|
+
### 4d. Link Sub-Component Issues
|
|
866
|
+
|
|
867
|
+
Read the nested components artifact to find which sub-components this component uses:
|
|
868
|
+
|
|
869
|
+
```bash
|
|
870
|
+
# Get artifactPath from registry
|
|
871
|
+
ARTIFACT_PATH=$(cd ${COMMON} && .build/debug/FigmaRegistryUtility lookup --node-id "${NODE_ID}" 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('suggestedArtifactPath',''))" 2>/dev/null || echo "")
|
|
872
|
+
|
|
873
|
+
NESTED_FILE="${REPO_ROOT}/${ARTIFACT_PATH}/pass3/03_nested_components.md"
|
|
874
|
+
```
|
|
875
|
+
|
|
876
|
+
If `NESTED_FILE` does not exist → skip this step silently.
|
|
877
|
+
|
|
878
|
+
If it exists, parse connected components:
|
|
879
|
+
|
|
880
|
+
```bash
|
|
881
|
+
# Extract component names from the Connected Components table in 03_nested_components.md
|
|
882
|
+
# Lines look like: | ComponentName | Sources/... | `Init...` |
|
|
883
|
+
CONNECTED_COMPONENTS=$(grep '^\| [A-Z]' "${NESTED_FILE}" | awk -F'|' '{print $2}' | tr -d ' ')
|
|
884
|
+
```
|
|
885
|
+
|
|
886
|
+
For each connected component name, find its GitHub issue and add as sub-issue:
|
|
887
|
+
|
|
888
|
+
```python
|
|
889
|
+
import subprocess, json, re
|
|
890
|
+
|
|
891
|
+
GH_REPO = "${GH_REPO}"
|
|
892
|
+
PARENT_ISSUE_N = <N>
|
|
893
|
+
|
|
894
|
+
# Read connected components from nested file
|
|
895
|
+
nested_path = "${NESTED_FILE}"
|
|
896
|
+
connected = []
|
|
897
|
+
in_connected_section = False
|
|
898
|
+
|
|
899
|
+
with open(nested_path) as f:
|
|
900
|
+
for line in f:
|
|
901
|
+
if line.strip() == "## Connected Components":
|
|
902
|
+
in_connected_section = True
|
|
903
|
+
continue
|
|
904
|
+
if in_connected_section and line.startswith("## "):
|
|
905
|
+
break
|
|
906
|
+
if in_connected_section and line.startswith("| "):
|
|
907
|
+
parts = [p.strip() for p in line.split("|")]
|
|
908
|
+
# parts[1] = component name, skip header and separator rows
|
|
909
|
+
if len(parts) > 2 and parts[1] and not parts[1].startswith("-") and parts[1] != "Component":
|
|
910
|
+
connected.append(parts[1])
|
|
911
|
+
|
|
912
|
+
sub_issues_added = []
|
|
913
|
+
|
|
914
|
+
for comp_name in connected:
|
|
915
|
+
# Search for the sub-component's issue
|
|
916
|
+
result = subprocess.run(
|
|
917
|
+
["gh", "issue", "list", "--repo", GH_REPO, "--state", "open",
|
|
918
|
+
"--label", "component", "--search", comp_name,
|
|
919
|
+
"--json", "number,title"],
|
|
920
|
+
capture_output=True, text=True
|
|
921
|
+
)
|
|
922
|
+
if result.returncode != 0:
|
|
923
|
+
print(f" ⚠️ Could not search issue for {comp_name}")
|
|
924
|
+
continue
|
|
925
|
+
|
|
926
|
+
issues = json.loads(result.stdout)
|
|
927
|
+
# Find closest match (title contains exact component name)
|
|
928
|
+
match = next((i for i in issues if comp_name.lower() in i["title"].lower()), None)
|
|
929
|
+
if not match:
|
|
930
|
+
print(f" ⚠️ No open issue found for sub-component: {comp_name}")
|
|
931
|
+
continue
|
|
932
|
+
|
|
933
|
+
sub_issue_n = match["number"]
|
|
934
|
+
|
|
935
|
+
# Add as sub-issue via GitHub API
|
|
936
|
+
api_result = subprocess.run(
|
|
937
|
+
["gh", "api", "--method", "POST",
|
|
938
|
+
f"repos/{GH_REPO}/issues/{PARENT_ISSUE_N}/sub_issues",
|
|
939
|
+
"--field", f"sub_issue_id={sub_issue_n}"],
|
|
940
|
+
capture_output=True, text=True
|
|
941
|
+
)
|
|
942
|
+
|
|
943
|
+
if api_result.returncode == 0:
|
|
944
|
+
sub_issues_added.append(f"#{sub_issue_n} ({comp_name})")
|
|
945
|
+
print(f" ✅ Linked sub-issue #{sub_issue_n} ({comp_name})")
|
|
946
|
+
else:
|
|
947
|
+
# May already be linked — not a fatal error
|
|
948
|
+
print(f" ℹ️ Could not link #{sub_issue_n} ({comp_name}): {api_result.stderr.strip()}")
|
|
949
|
+
|
|
950
|
+
if sub_issues_added:
|
|
951
|
+
print(f"\nSub-issues linked: {', '.join(sub_issues_added)}")
|
|
952
|
+
else:
|
|
953
|
+
print("No sub-issues linked (no matching open issues found).")
|
|
954
|
+
```
|
|
955
|
+
|
|
956
|
+
> **Non-fatal:** If this step fails (artifact missing, gh API error, no matching issues), log and continue — it must never block the commit.
|
|
957
|
+
|
|
958
|
+
|
|
959
|
+
---
|
|
960
|
+
|
|
961
|
+
## STEP 5 — Auto-Unblock Dependents
|
|
962
|
+
|
|
963
|
+
Scan all open issues with `blocked` label:
|
|
964
|
+
|
|
965
|
+
```bash
|
|
966
|
+
gh issue list --repo ${GH_REPO} --state open --label blocked --json number,title,body
|
|
967
|
+
```
|
|
968
|
+
|
|
969
|
+
For each blocked issue:
|
|
970
|
+
1. Read the issue body or sub-issue comments to find what it's blocked by (component names).
|
|
971
|
+
2. For each blocking component, check if `{ComponentName}.swift` exists:
|
|
972
|
+
```bash
|
|
973
|
+
find ${UICOMPONENTS}/Sources -name "{BlockingComponent}.swift" -type f | head -1
|
|
974
|
+
```
|
|
975
|
+
3. If ALL blocking components now have Swift files → unblock:
|
|
976
|
+
```bash
|
|
977
|
+
gh issue edit <BLOCKED_N> --repo ${GH_REPO} --remove-label "blocked"
|
|
978
|
+
gh issue comment <BLOCKED_N> --repo ${GH_REPO} --body "Auto-unblocked: all dependencies now implemented."
|
|
979
|
+
```
|
|
980
|
+
|
|
981
|
+
Print any unblocked issues.
|
|
982
|
+
|
|
983
|
+
---
|
|
984
|
+
|
|
985
|
+
## STEP 6 — Summary
|
|
986
|
+
|
|
987
|
+
```
|
|
988
|
+
Iteration Commit: ${COMPONENT_PASCAL}
|
|
989
|
+
|
|
990
|
+
| Repo | Commit | Status |
|
|
991
|
+
|------|--------|--------|
|
|
992
|
+
| common | ${COMMON_SHA} | ✅ pushed |
|
|
993
|
+
| uicomponents | ${UICOMP_SHA} | ✅ pushed |
|
|
994
|
+
| wiki | ${WIKI_SHA} | ✅ pushed |
|
|
995
|
+
| main | ${MAIN_SHA} | ✅ pushed / PR created |
|
|
996
|
+
|
|
997
|
+
Validation: PASS
|
|
998
|
+
Issue: #N — commented + phase updated
|
|
999
|
+
Sub-issues: #X (ComponentA), #Y (ComponentB) (or "none")
|
|
1000
|
+
Unblocked: #M, #K (or "none")
|
|
1001
|
+
Jira: ${JIRA_ISSUE}
|
|
1002
|
+
```
|
|
1003
|
+
|
|
1004
|
+
---
|
|
1005
|
+
|
|
1006
|
+
## Error Handling
|
|
1007
|
+
|
|
1008
|
+
- **Submodules not on iteration/develop**: Checkout automatically (rebase-merge if commits exist).
|
|
1009
|
+
- **Build fails**: HALT — fix before committing.
|
|
1010
|
+
- **Tests fail**: HALT — fix before committing.
|
|
1011
|
+
- **Key sync fails**: HALT — regenerate keys first.
|
|
1012
|
+
- **Push rejected**: Report error, do NOT force-push.
|
|
1013
|
+
- **No changes**: Print "Nothing to commit" and exit.
|
|
1014
|
+
- **Issue not found**: Commit without issue housekeeping, print warning.
|
|
1015
|
+
- **Rebase/cherry-pick conflict**: Do NOT abort or delete any changes. Show conflicting files and conflict markers, suggest resolution steps, and ASK the user whether to (a) resolve and continue or (b) abort. Preserve all local and remote changes in conflict markers until the user decides. For `ui-testing-identifiers.json` conflicts, always suggest the take-remote + re-add-keys approach (see Guardrails).
|