@mmerterden/multi-agent-pipeline 11.2.0 → 11.3.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 +37 -0
- package/README.md +2 -2
- package/docs/FIGMA_PIPELINE.md +12 -25
- package/docs/architecture.md +3 -5
- package/docs/features.md +8 -8
- package/install/_dev-only-files.mjs +0 -6
- package/install/claude.mjs +33 -15
- package/install/copilot.mjs +16 -14
- package/install/templates/copilot-instructions.md +3 -3
- package/package.json +1 -1
- package/pipeline/commands/{multi-agent.md → multi-agent/SKILL.md} +39 -39
- package/pipeline/commands/multi-agent/{analysis.md → analysis/SKILL.md} +18 -18
- package/pipeline/commands/multi-agent/{analysis-resolve.md → analysis-resolve/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{autopilot.md → autopilot/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{build-optimize.md → build-optimize/SKILL.md} +1 -1
- package/pipeline/commands/multi-agent/{channels.md → channels/SKILL.md} +12 -12
- package/pipeline/commands/multi-agent/{dev.md → dev/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{dev-autopilot.md → dev-autopilot/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{dev-local.md → dev-local/SKILL.md} +5 -5
- package/pipeline/commands/multi-agent/{dev-local-autopilot.md → dev-local-autopilot/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{finish.md → finish/SKILL.md} +6 -6
- package/pipeline/commands/multi-agent/{generate.md → generate/SKILL.md} +3 -3
- package/pipeline/commands/multi-agent/{help.md → help/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{local.md → local/SKILL.md} +5 -5
- package/pipeline/commands/multi-agent/{local-autopilot.md → local-autopilot/SKILL.md} +5 -5
- package/pipeline/commands/multi-agent/{manual-test.md → manual-test/SKILL.md} +1 -1
- package/pipeline/commands/multi-agent/refactor/SKILL.md +257 -0
- package/pipeline/commands/multi-agent/{resume.md → resume/SKILL.md} +1 -1
- package/pipeline/commands/multi-agent/{review.md → review/SKILL.md} +5 -5
- package/pipeline/commands/multi-agent/{setup.md → setup/SKILL.md} +1 -1
- package/pipeline/commands/multi-agent/{sync.md → sync/SKILL.md} +20 -58
- package/pipeline/{commands/multi-agent → multi-agent-refs}/_account-picker.md +2 -2
- package/pipeline/{commands/multi-agent → multi-agent-refs}/_dev-context.md +2 -2
- package/pipeline/{commands/multi-agent → multi-agent-refs}/_repo-picker.md +2 -2
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/android-guide.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/jira.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/wiki.md +7 -7
- package/pipeline/multi-agent-refs/component-dispatch.md +92 -0
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/cross-cli-contract.md +10 -77
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/verify-by-test.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/generate-issue.md +2 -2
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/issue-jira-triad.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/keychain.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/log-format.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/modes.md +2 -2
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/operations.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-0-init.md +10 -10
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-1-analysis.md +6 -6
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-2-planning.md +3 -3
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-3-dev.md +10 -10
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-4-review.md +8 -8
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-5-test.md +3 -3
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-6-commit.md +4 -4
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-7-report.md +6 -6
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases.md +12 -12
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/progress-contract.md +4 -4
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/swiftui-guide.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/tracker-contract.md +3 -3
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/wiki-capture.md +4 -4
- package/pipeline/preferences-template.json +17 -1
- package/pipeline/rules/figma-pipeline.md +2 -2
- package/pipeline/schemas/prefs.schema.json +0 -34
- package/pipeline/scripts/README.md +1 -3
- package/pipeline/scripts/fixtures/install-layout.tsv +6 -5
- package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
- package/pipeline/scripts/phase-banner.sh +2 -2
- package/pipeline/scripts/review-scope.mjs +94 -0
- package/pipeline/scripts/scan-agent-config.sh +2 -2
- package/pipeline/scripts/smoke-agent-log-cost.sh +1 -1
- package/pipeline/scripts/smoke-agent-model-routing.sh +4 -4
- package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +2 -2
- package/pipeline/scripts/smoke-channels-approval-gate.sh +2 -2
- package/pipeline/scripts/smoke-channels-flow.sh +5 -5
- package/pipeline/scripts/smoke-clarify.sh +1 -1
- package/pipeline/scripts/smoke-commands-skills-parity.sh +3 -3
- package/pipeline/scripts/smoke-community-gates.sh +1 -1
- package/pipeline/scripts/smoke-compliance-skills.sh +2 -2
- package/pipeline/scripts/smoke-cost-summary.sh +1 -1
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +17 -43
- package/pipeline/scripts/smoke-cross-phase-cohesion.sh +1 -1
- package/pipeline/scripts/smoke-dev-critic.sh +1 -1
- package/pipeline/scripts/smoke-diff-explain.sh +1 -1
- package/pipeline/scripts/smoke-diff-risk.sh +1 -1
- package/pipeline/scripts/smoke-evidence-gate.sh +1 -1
- package/pipeline/scripts/smoke-figma-dispatch.sh +46 -57
- package/pipeline/scripts/smoke-gate-hooks.sh +1 -1
- package/pipeline/scripts/smoke-generate-issue.sh +8 -8
- package/pipeline/scripts/smoke-handoff-contract.sh +3 -3
- package/pipeline/scripts/smoke-identity-isolation.sh +2 -2
- package/pipeline/scripts/smoke-intent-guard.sh +1 -1
- package/pipeline/scripts/smoke-issue-comment-template.sh +2 -2
- package/pipeline/scripts/smoke-issue-jira-triad.sh +4 -4
- package/pipeline/scripts/smoke-language-axis.sh +6 -6
- package/pipeline/scripts/smoke-learnings-ledger.sh +3 -3
- package/pipeline/scripts/smoke-mode-dispatch-drift.sh +16 -16
- package/pipeline/scripts/smoke-model-fallback.sh +3 -3
- package/pipeline/scripts/smoke-multi-repo-integration.sh +2 -2
- package/pipeline/scripts/smoke-multi-repo-worktree.sh +1 -1
- package/pipeline/scripts/smoke-no-token-prompt.sh +5 -5
- package/pipeline/scripts/smoke-phase-0-multi-repo.sh +1 -1
- package/pipeline/scripts/smoke-phase-6-multi.sh +1 -1
- package/pipeline/scripts/smoke-phase4-gates.sh +45 -0
- package/pipeline/scripts/smoke-plan-approval-gate.sh +5 -5
- package/pipeline/scripts/smoke-plan-todos.sh +3 -3
- package/pipeline/scripts/smoke-pr-review-actions.sh +3 -3
- package/pipeline/scripts/smoke-prefs-language.sh +1 -1
- package/pipeline/scripts/smoke-progress-contract.sh +2 -2
- package/pipeline/scripts/smoke-push-retry.sh +1 -1
- package/pipeline/scripts/smoke-repo-map.sh +2 -2
- package/pipeline/scripts/smoke-shadow-git.sh +1 -1
- package/pipeline/scripts/smoke-skill-authoring.sh +4 -9
- package/pipeline/scripts/smoke-tasklist-ordering.sh +10 -10
- package/pipeline/scripts/smoke-test-gap.sh +1 -1
- package/pipeline/scripts/smoke-token-budget.sh +1 -1
- package/pipeline/scripts/smoke-token-preflight.sh +2 -2
- package/pipeline/scripts/smoke-tracker-contract.sh +13 -13
- package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +5 -5
- package/pipeline/scripts/smoke-triage-memory.sh +2 -2
- package/pipeline/scripts/smoke-update-check.sh +1 -1
- package/pipeline/scripts/smoke-url-enrichment.sh +2 -2
- package/pipeline/scripts/smoke-validator-gates.sh +1 -1
- package/pipeline/scripts/smoke-verify-by-test.sh +3 -3
- package/pipeline/scripts/smoke-wiki-integration.sh +9 -33
- package/pipeline/scripts/smoke-work-summary.sh +1 -1
- package/pipeline/scripts/smoke-worktree-path-convention.sh +4 -4
- package/pipeline/scripts/test-integrity-gate.mjs +83 -0
- package/pipeline/scripts/uninstall.mjs +2 -2
- package/pipeline/skills/.skill-manifest.json +40 -160
- package/pipeline/skills/.skills-index.json +3 -372
- package/pipeline/skills/shared/README.md +1 -1
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +3 -3
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +116 -51
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +8 -30
- package/pipeline/skills/shared/external/compose-components/SKILL.md +14 -14
- package/pipeline/skills/skills-index.md +2 -43
- package/pipeline/commands/multi-agent/refactor.md +0 -188
- package/pipeline/commands/multi-agent/refs/component-dispatch.md +0 -92
- package/pipeline/scripts/smoke-existing-discovery-gate.sh +0 -71
- package/pipeline/scripts/smoke-figma-android-parity.sh +0 -148
- package/pipeline/scripts/smoke-figma-credential-store.sh +0 -105
- package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +0 -177
- package/pipeline/scripts/smoke-figma-sync.sh +0 -149
- package/pipeline/scripts/smoke-sync-delegation.sh +0 -74
- package/pipeline/skills/figma-android/README.md +0 -38
- package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +0 -62
- package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +0 -158
- package/pipeline/skills/figma-android/figma-component-test/SKILL.md +0 -120
- package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +0 -35
- package/pipeline/skills/figma-android/figma-to-component/SKILL.md +0 -124
- package/pipeline/skills/figma-common/README.md +0 -64
- package/pipeline/skills/figma-common/figma-bottom-sheets/SKILL.md +0 -152
- package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +0 -282
- package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +0 -503
- package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +0 -288
- package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +0 -362
- package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +0 -206
- package/pipeline/skills/figma-common/figma-commit/REVIEW.md +0 -337
- package/pipeline/skills/figma-common/figma-commit/SKILL.md +0 -216
- package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +0 -223
- package/pipeline/skills/figma-common/figma-component-start/SKILL.md +0 -251
- package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +0 -78
- package/pipeline/skills/figma-common/figma-evolve-component/SKILL.md +0 -61
- package/pipeline/skills/figma-common/figma-fix/SKILL.md +0 -321
- package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +0 -542
- package/pipeline/skills/figma-common/figma-issue/SKILL.md +0 -750
- package/pipeline/skills/figma-common/figma-iterate/SKILL.md +0 -208
- package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +0 -1020
- package/pipeline/skills/figma-common/figma-mend/SKILL.md +0 -331
- package/pipeline/skills/figma-common/figma-navigation/SKILL.md +0 -156
- package/pipeline/skills/figma-common/figma-overlays/SKILL.md +0 -142
- package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +0 -398
- package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +0 -104
- package/pipeline/skills/figma-common/figma-review/SKILL.md +0 -400
- package/pipeline/skills/figma-common/figma-setup/SKILL.md +0 -514
- package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +0 -592
- package/pipeline/skills/figma-common/figma-skip/SKILL.md +0 -129
- package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +0 -105
- package/pipeline/skills/figma-common/figma-ui-patterns/patterns/animated-gradient-border.md +0 -116
- package/pipeline/skills/figma-common/figma-utility/SKILL.md +0 -274
- package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +0 -808
- package/pipeline/skills/figma-common/figma-validate/SKILL.md +0 -633
- package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +0 -716
- package/pipeline/skills/figma-common/performance-review-next/SKILL.md +0 -238
- package/pipeline/skills/figma-common/performance-start/SKILL.md +0 -430
- package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +0 -706
- package/pipeline/skills/figma-common/performance-tour/SKILL.md +0 -423
- package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +0 -67
- package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +0 -178
- package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +0 -184
- package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +0 -219
- package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +0 -274
- package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +0 -416
- package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +0 -57
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +0 -307
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +0 -119
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +0 -174
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +0 -333
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +0 -368
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +0 -393
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +0 -617
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +0 -352
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +0 -337
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +0 -206
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +0 -235
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +0 -214
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +0 -902
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +0 -156
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +0 -175
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +0 -176
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +0 -333
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +0 -412
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +0 -336
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +0 -705
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +0 -332
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +0 -380
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +0 -262
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +0 -482
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +0 -274
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +0 -636
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +0 -142
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +0 -547
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +0 -39
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +0 -659
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +0 -580
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +0 -51
- package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +0 -183
- package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +0 -64
- package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +0 -531
- package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +0 -89
- package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +0 -155
- package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +0 -196
- package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +0 -57
- package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +0 -89
- package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +0 -227
- package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +0 -157
- package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +0 -90
- package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +0 -116
- package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +0 -153
- package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +0 -130
- package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +0 -218
- package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +0 -188
- package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +0 -93
- package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +0 -98
- package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +0 -261
- package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +0 -147
- package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +0 -182
- package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +0 -185
- package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +0 -609
- package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +0 -332
- package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +0 -261
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +0 -184
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +0 -188
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +0 -768
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +0 -191
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +0 -420
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.example.json +0 -9
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +0 -336
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +0 -391
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +0 -292
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +0 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +0 -93
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +0 -299
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +0 -343
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +0 -206
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +0 -149
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +0 -281
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +0 -332
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +0 -176
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +0 -98
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +0 -298
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +0 -195
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +0 -1298
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +0 -228
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +0 -1089
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +0 -141
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +0 -106
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +0 -162
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +0 -105
- package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +0 -179
- package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +0 -260
- package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +0 -260
- package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +0 -86
- package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +0 -321
- package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +0 -1470
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +0 -176
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +0 -147
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +0 -629
- /package/pipeline/commands/multi-agent/{delete.md → delete/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{diff-explain.md → diff-explain/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{garbage-collect.md → garbage-collect/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{issue.md → issue/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{jira.md → jira/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{kill.md → kill/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{language.md → language/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{log.md → log/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{prune-logs.md → prune-logs/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{purge.md → purge/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{scan.md → scan/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{search.md → search/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{stack.md → stack/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{status.md → status/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{test.md → test/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{update.md → update/SKILL.md} +0 -0
- /package/pipeline/{commands/multi-agent → multi-agent-refs}/_input-parser.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/analysis-template.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/audit-guide.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/backend-guide.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/confluence.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/issue-comment.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr-review-actions.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/conventions-defaults.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/autopilot-circuit-breaker.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/dev-critic.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/external-context-injection.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/model-fallback.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/plan-todos.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/prior-fix-detection.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/repo-map.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/shadow-git.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/frontend-guide.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/knowledge.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/multi-repo-integration-build.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/picker-contract.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/rules.md +0 -0
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
# PHASE 2 - Utility Integration Orchestrator
|
|
2
|
-
|
|
3
|
-
Orchestrates Phase 2 sub-phases: dispatches sub-agents, collects results, writes pass2/_index.md.
|
|
4
|
-
PREV: Phase 1.5 (Existing Component Discovery)
|
|
5
|
-
NEXT: Phase 3 (Data Analysis)
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## ENTRY GATE - discovery status
|
|
10
|
-
|
|
11
|
-
Phase 2 reads `agent-state.discovery.status` written by Phase 1.5:
|
|
12
|
-
|
|
13
|
-
| `discovery.status` | Phase 2 action |
|
|
14
|
-
|---|---|
|
|
15
|
-
| `GREENFIELD_OK` (or absent for backward compat) | EXECUTE - run all sub-phases below |
|
|
16
|
-
| `GAP_ANALYSIS` | SKIP - Phase 2 outputs are not needed; jump to Phase 4 (only run Documentation / Code Connect / tests / wiki sub-phases that target the gap list) |
|
|
17
|
-
| `ALREADY_MAPPED` (no user override) | SKIP - same as `GAP_ANALYSIS` |
|
|
18
|
-
| `EXISTING_SOURCE_NO_CC` (publish-only path picked) | SKIP - jump to Phase 6 |
|
|
19
|
-
| `CANCELLED` | HALT |
|
|
20
|
-
| Any other value | HALT - unknown discovery state, refuse to proceed |
|
|
21
|
-
|
|
22
|
-
If `discovery` field is absent on `agent-state.json`, log a one-line warning ("phase-1.5 not run; assuming GREENFIELD_OK") and proceed. This preserves backward compatibility with runs started before the discovery gate existed.
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## IMPLEMENTATION_MODULE
|
|
27
|
-
|
|
28
|
-
All utilities from this phase are consumed via `UIComponentUtilities`:
|
|
29
|
-
|
|
30
|
-
```swift
|
|
31
|
-
import UIComponentUtilities
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
| Category | Extension | Usage |
|
|
35
|
-
|----------|-----------|-------|
|
|
36
|
-
| Testing | `View.accessibilityIdentifier(_ key: UITestingIdentifierKey)` | `.accessibilityIdentifier(.ComponentName.element)` |
|
|
37
|
-
| Localization | `Text(_ key: LocalizationStringKey)` | `Text(.ComponentName.title)` |
|
|
38
|
-
| Accessibility | `View.accessibilityLabel(_ key: LocalizedAccessibilityStringKey)` | Only when SwiftUI can't read visible text - many components need NO accessibility modifiers |
|
|
39
|
-
| Analytics | `View.analyticsButton(id:label:type:)` | `.analyticsButton(id: "id", label: "Submit", type: .primary)` |
|
|
40
|
-
|
|
41
|
-
SOURCE: `Sources/UIComponentUtilities/`
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
## PRE-CHECK: Phase 1 Complete
|
|
46
|
-
|
|
47
|
-
```
|
|
48
|
-
Read: {artifactPath}/IMPLEMENTATION_HISTORY.md
|
|
49
|
-
Read: {artifactPath}/pass1/_index.md
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
EXTRACT:
|
|
53
|
-
- `componentName`
|
|
54
|
-
- `artifactPath`
|
|
55
|
-
- `nodeId`
|
|
56
|
-
- `fileKey`
|
|
57
|
-
|
|
58
|
-
| Result | Action |
|
|
59
|
-
|--------|--------|
|
|
60
|
-
| Both files exist | Proceed to REGISTRY_LOOKUP |
|
|
61
|
-
| Either missing | HALT |
|
|
62
|
-
|
|
63
|
-
FAIL →
|
|
64
|
-
```
|
|
65
|
-
STATUS: HALT
|
|
66
|
-
PHASE: phase-2
|
|
67
|
-
GATE: PRE_CHECK
|
|
68
|
-
REASON: IMPLEMENTATION_HISTORY.md or pass1/_index.md not found. Phase 1 must complete first.
|
|
69
|
-
COMPLETED_GATES: []
|
|
70
|
-
ARTIFACTS_CREATED: none
|
|
71
|
-
USER_ACTION_REQUIRED: Run Phase 1 first.
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Verify `pass2/` directory exists. If not:
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
mkdir -p {artifactPath}/pass2
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
## NORMALIZE_DESIGN_CONTEXT: Handle Sublayer Format
|
|
83
|
-
|
|
84
|
-
Phase 1 script may produce a sublayer format for large components. Normalize it before dispatching sub-phases so they always see a single `response` field.
|
|
85
|
-
|
|
86
|
-
```
|
|
87
|
-
Read: {artifactPath}/pass1/design_context_response.json
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
Check the JSON structure:
|
|
91
|
-
|
|
92
|
-
| Format | Detection | Action |
|
|
93
|
-
|--------|-----------|--------|
|
|
94
|
-
| Normal | `sublayers` is `false` or absent | No action needed - `response` field exists |
|
|
95
|
-
| Sublayer | `sublayers` is `true` | Concatenate all `responses` values (see below) |
|
|
96
|
-
|
|
97
|
-
### Sublayer normalization
|
|
98
|
-
|
|
99
|
-
If `sublayers: true`:
|
|
100
|
-
|
|
101
|
-
1. Read all values from the `responses` object (keyed by node ID, e.g. `"123:456": "...code..."`)
|
|
102
|
-
2. Concatenate them into a single string, separated by `\n\n// --- Sublayer: {nodeId} ---\n\n`
|
|
103
|
-
3. Add a `response` field to the JSON with the concatenated string
|
|
104
|
-
4. Keep the original `sublayers`, `sublayerNodeIds`, and `responses` fields intact (for traceability)
|
|
105
|
-
5. Write the updated JSON back to `{artifactPath}/pass1/design_context_response.json`
|
|
106
|
-
|
|
107
|
-
After normalization, all sub-phases read the `response` field as usual - no sublayer awareness needed.
|
|
108
|
-
|
|
109
|
-
```json
|
|
110
|
-
{
|
|
111
|
-
"sublayers": true,
|
|
112
|
-
"sublayerNodeIds": ["123:456", "789:012"],
|
|
113
|
-
"responses": { "123:456": "...code...", "789:012": "...code..." },
|
|
114
|
-
"response": "...concatenated code from all sublayers..."
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## REGISTRY_LOOKUP: Check Pre-existing Keys
|
|
121
|
-
|
|
122
|
-
Lookup whether this component already has utility keys registered (e.g., by Android or a previous iOS run).
|
|
123
|
-
|
|
124
|
-
```bash
|
|
125
|
-
cd {repos.common.path} && .build/debug/FigmaRegistryUtility utility-lookup --node-id '{nodeId}'
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
> **If binary not found:** `swift build --package-path {repos.common.path} --product FigmaRegistryUtility`
|
|
129
|
-
|
|
130
|
-
| Result | Action |
|
|
131
|
-
|--------|--------|
|
|
132
|
-
| Returns JSON with keys | Pass pre-existing keys to each sub-phase as `registryData` input |
|
|
133
|
-
| Returns `{}` (empty) | Proceed normally (fresh generation) |
|
|
134
|
-
| Tool error | Log warning, proceed without registry data (non-blocking) |
|
|
135
|
-
|
|
136
|
-
The `registryData` is passed to sub-phases so they can:
|
|
137
|
-
- Skip CLI check calls for keys already in the registry AND in the data files
|
|
138
|
-
- Merge new keys with existing ones instead of duplicating
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## ROUTING
|
|
143
|
-
|
|
144
|
-
### Sub-phase inventory
|
|
145
|
-
|
|
146
|
-
| Sub-phase | Skill Doc | Purpose | Required | Depends On |
|
|
147
|
-
|-----------|-----------|---------|----------|------------|
|
|
148
|
-
| 2A | `phase-2a-testing-identifiers.md` | UI testing identifiers | **ALWAYS** | Phase 1 |
|
|
149
|
-
| 2B | `phase-2b-localization.md` | Localized display text | If visible text exists | Phase 1 |
|
|
150
|
-
| 2C | `phase-2c-accessibility.md` | VoiceOver labels/hints | **ALWAYS** | Phase 1 |
|
|
151
|
-
| 2D | `phase-2d-analytics.md` | Event tracking | If interactive elements exist | Phase 1 + **2A** |
|
|
152
|
-
|
|
153
|
-
### Execution flow
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
PRE-CHECK
|
|
157
|
-
↓
|
|
158
|
-
NORMALIZE_DESIGN_CONTEXT
|
|
159
|
-
↓
|
|
160
|
-
REGISTRY_LOOKUP
|
|
161
|
-
↓
|
|
162
|
-
┌───────────────────────────────────┐
|
|
163
|
-
│ PARALLEL DISPATCH (sub-agents) │
|
|
164
|
-
│ │
|
|
165
|
-
│ 2A - Testing Identifiers │ ← required
|
|
166
|
-
│ 2B - Localization Keys │ ← if visible text
|
|
167
|
-
│ 2C - Accessibility Keys │ ← required
|
|
168
|
-
│ │
|
|
169
|
-
└───────────────────────────────────┘
|
|
170
|
-
↓ wait for all to complete
|
|
171
|
-
↓
|
|
172
|
-
2D - Analytics Events ← if interactive elements (depends on 2A output)
|
|
173
|
-
↓
|
|
174
|
-
COLLECT RESULTS
|
|
175
|
-
↓
|
|
176
|
-
UPDATE_IMPLEMENTATION_HISTORY
|
|
177
|
-
↓
|
|
178
|
-
WRITE_PASS2_INDEX
|
|
179
|
-
↓
|
|
180
|
-
PHASE OUTPUT
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### Dispatch instructions
|
|
184
|
-
|
|
185
|
-
**Wave 1 (parallel):** Launch 2A, 2B, 2C as sub-agents simultaneously.
|
|
186
|
-
- Each reads `pass1/_index.md` independently.
|
|
187
|
-
- Each writes its own artifact to `pass2/`.
|
|
188
|
-
- Wait for ALL to complete before proceeding.
|
|
189
|
-
|
|
190
|
-
**Wave 2 (sequential):** Launch 2D after Wave 1 completes.
|
|
191
|
-
- 2D requires `pass2/utility_identifiers.md` from 2A (uses testing identifiers as analytics event IDs).
|
|
192
|
-
- Skip 2D if no interactive elements found in `pass1/design_context_response.json`.
|
|
193
|
-
|
|
194
|
-
### Skip conditions
|
|
195
|
-
|
|
196
|
-
| Sub-phase | Skip when |
|
|
197
|
-
|-----------|-----------|
|
|
198
|
-
| 2B | No visible text in design_context_response.json |
|
|
199
|
-
| 2D | No interactive elements (buttons, links, toggles, cards) in design_context_response.json |
|
|
200
|
-
|
|
201
|
-
If skipped, write a placeholder artifact:
|
|
202
|
-
|
|
203
|
-
```markdown
|
|
204
|
-
# {Category}: {componentName}
|
|
205
|
-
|
|
206
|
-
No {category} required for this component.
|
|
207
|
-
Generated: {ISO_DATE}
|
|
208
|
-
Reason: No {condition} found in design context.
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## GATE 1: COLLECT_RESULTS
|
|
214
|
-
|
|
215
|
-
After all sub-phases complete, verify each produced its artifacts (both JSON sidecar and markdown):
|
|
216
|
-
|
|
217
|
-
```
|
|
218
|
-
[ ] pass2/utility_identifiers.md exists (Phase 2A)
|
|
219
|
-
[ ] pass2/utility_identifiers.json exists (Phase 2A - JSON sidecar)
|
|
220
|
-
[ ] pass2/utility_localization.md exists (Phase 2B - or skipped placeholder)
|
|
221
|
-
[ ] pass2/utility_localization.json exists (Phase 2B - JSON sidecar)
|
|
222
|
-
[ ] pass2/utility_accessibility.md exists (Phase 2C)
|
|
223
|
-
[ ] pass2/utility_accessibility.json exists (Phase 2C - JSON sidecar)
|
|
224
|
-
[ ] pass2/utility_analytics.md exists (Phase 2D - or skipped placeholder)
|
|
225
|
-
[ ] pass2/utility_analytics.json exists (Phase 2D - JSON sidecar)
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
ANY markdown missing →
|
|
229
|
-
```
|
|
230
|
-
STATUS: HALT
|
|
231
|
-
PHASE: phase-2
|
|
232
|
-
GATE: COLLECT_RESULTS
|
|
233
|
-
REASON: Sub-phase artifact missing.
|
|
234
|
-
MISSING: [list missing files]
|
|
235
|
-
USER_ACTION_REQUIRED: Re-run the failed sub-phase.
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
If a JSON sidecar is missing but the markdown exists, the finalize script will log a warning and use empty arrays - this is non-blocking.
|
|
239
|
-
|
|
240
|
-
---
|
|
241
|
-
|
|
242
|
-
## GATE 2: FINALIZE (script)
|
|
243
|
-
|
|
244
|
-
**IMPORTANT:** Do NOT read sub-phase markdown files in the main orchestrator context. The finalize script handles everything: building component-utilities.json, registering, and writing _index.md.
|
|
245
|
-
|
|
246
|
-
```bash
|
|
247
|
-
python3 {skillPath}/scripts/phase2-finalize.py \
|
|
248
|
-
--artifact-path '{artifactPath}' \
|
|
249
|
-
--node-id '{nodeId}' \
|
|
250
|
-
--file-key '{fileKey}' \
|
|
251
|
-
--component-name '{componentName}'
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
The script:
|
|
255
|
-
1. Reads the 4 JSON sidecar files (NOT the markdowns)
|
|
256
|
-
2. Builds `pass2/component-utilities.json`
|
|
257
|
-
3. Registers via `FigmaRegistryUtility utility-register`
|
|
258
|
-
4. Writes `pass2/_index.md`
|
|
259
|
-
5. Outputs a JSON summary to stdout
|
|
260
|
-
|
|
261
|
-
Parse the stdout JSON:
|
|
262
|
-
```json
|
|
263
|
-
{"status": "ok", "testing": 5, "localization": 0, "accessibility": 0, "analytics": 0, "registry": true}
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
| Result | Action |
|
|
267
|
-
|--------|--------|
|
|
268
|
-
| `status: "ok"` | Use counts for IMPLEMENTATION_HISTORY.md update |
|
|
269
|
-
| `status: "error"` | HALT with error message |
|
|
270
|
-
|
|
271
|
-
---
|
|
272
|
-
|
|
273
|
-
## GATE 3: UPDATE_IMPLEMENTATION_HISTORY
|
|
274
|
-
|
|
275
|
-
Using the counts from the finalize script output, append to `{artifactPath}/IMPLEMENTATION_HISTORY.md`:
|
|
276
|
-
|
|
277
|
-
```markdown
|
|
278
|
-
## Phase 2: Utility Integration
|
|
279
|
-
- Testing Identifiers: ✅ pass2/utility_identifiers.md ({testing} added)
|
|
280
|
-
- Localization Keys: ✅ pass2/utility_localization.md ({localization} keys) | ⏭️ Skipped (no visible text)
|
|
281
|
-
- Accessibility Keys: ✅ pass2/utility_accessibility.md ({accessibility} keys)
|
|
282
|
-
- Analytics Events: ✅ pass2/utility_analytics.md ({analytics} events) | ⏭️ Skipped (no interactive elements)
|
|
283
|
-
- Registry: ✅ {repos.common.path}/Shared/Figma/Components/{nodeId}.json updated | ⚠️ Registry update failed (non-blocking)
|
|
284
|
-
- Completed: {DATE}
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
---
|
|
288
|
-
|
|
289
|
-
## VALIDATION CHECKLIST
|
|
290
|
-
|
|
291
|
-
```
|
|
292
|
-
[ ] IMPLEMENTATION_HISTORY.md loaded from Phase 1
|
|
293
|
-
[ ] design_context_response.json normalized (sublayer → flat response field)
|
|
294
|
-
[ ] Registry lookup performed (utility-lookup)
|
|
295
|
-
[ ] Pre-existing keys passed to sub-phases (if registry data found)
|
|
296
|
-
[ ] Phase 2A completed - utility_identifiers.md + .json exists (required)
|
|
297
|
-
[ ] Phase 2B completed - utility_localization.md + .json exists (or skipped with placeholder)
|
|
298
|
-
[ ] Phase 2C completed - utility_accessibility.md + .json exists (required)
|
|
299
|
-
[ ] Phase 2D completed - utility_analytics.md + .json exists (or skipped with placeholder)
|
|
300
|
-
[ ] phase2-finalize.py ran successfully (builds component-utilities.json, registers, writes _index.md)
|
|
301
|
-
[ ] IMPLEMENTATION_HISTORY.md updated with Phase 2 summary (using script output counts)
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
---
|
|
305
|
-
|
|
306
|
-
## SUCCESS OUTPUT
|
|
307
|
-
|
|
308
|
-
```
|
|
309
|
-
STATUS: COMPLETE
|
|
310
|
-
PHASE: phase-2
|
|
311
|
-
GATES_PASSED: [PRE_CHECK, NORMALIZE_DESIGN_CONTEXT, REGISTRY_LOOKUP, DISPATCH_WAVE_1, DISPATCH_WAVE_2, COLLECT_RESULTS, FINALIZE, UPDATE_IMPLEMENTATION_HISTORY]
|
|
312
|
-
ARTIFACTS_CREATED:
|
|
313
|
-
- {artifactPath}/pass2/utility_identifiers.json + .md (via Phase 2A)
|
|
314
|
-
- {artifactPath}/pass2/utility_localization.json + .md (via Phase 2B)
|
|
315
|
-
- {artifactPath}/pass2/utility_accessibility.json + .md (via Phase 2C)
|
|
316
|
-
- {artifactPath}/pass2/utility_analytics.json + .md (via Phase 2D)
|
|
317
|
-
- {artifactPath}/pass2/component-utilities.json (via finalize script)
|
|
318
|
-
- {artifactPath}/pass2/_index.md (via finalize script)
|
|
319
|
-
- {repos.common.path}/Shared/Figma/Components/{nodeId}.json (via finalize script registry)
|
|
320
|
-
SUMMARY: Utility integration complete. {testing} testing, {localization} loc, {accessibility} a11y, {analytics} analytics. Registry updated.
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
---
|
|
324
|
-
|
|
325
|
-
## REFERENCES
|
|
326
|
-
|
|
327
|
-
| Topic | File |
|
|
328
|
-
|-------|------|
|
|
329
|
-
| Phase 2A | `phases/phase-2a-testing-identifiers.md` |
|
|
330
|
-
| Phase 2B | `phases/phase-2b-localization.md` |
|
|
331
|
-
| Phase 2C | `phases/phase-2c-accessibility.md` |
|
|
332
|
-
| Phase 2D | `phases/phase-2d-analytics.md` |
|
|
333
|
-
| UIComponentUtilities | `Sources/UIComponentUtilities/` |
|
|
@@ -1,368 +0,0 @@
|
|
|
1
|
-
# PHASE 2A - Testing Identifiers
|
|
2
|
-
|
|
3
|
-
UI testing identifier integration.
|
|
4
|
-
REF: `reference/testing-identifiers-naming.md`
|
|
5
|
-
|
|
6
|
-
required - always execute this phase.
|
|
7
|
-
PARALLEL WITH: Phase 2B, Phase 2C (all read from pass1/_index.md independently)
|
|
8
|
-
NEXT: Phase 2D (depends on this phase's output)
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## IMPLEMENTATION_PATTERN
|
|
13
|
-
|
|
14
|
-
Extension: `Sources/UIComponentUtilities/TestingIdentifiers/View+UITestingIdentifierKey.swift`
|
|
15
|
-
|
|
16
|
-
```swift
|
|
17
|
-
import UIComponentUtilities
|
|
18
|
-
|
|
19
|
-
// Static identifier
|
|
20
|
-
Button("Submit") { }
|
|
21
|
-
.accessibilityIdentifier(.ComponentName.submitButton)
|
|
22
|
-
|
|
23
|
-
// Dynamic identifier (list items)
|
|
24
|
-
ForEach(items.indices, id: \.self) { index in
|
|
25
|
-
ItemRow(item: items[index])
|
|
26
|
-
.accessibilityIdentifier(.ComponentName.Item.row.with(index))
|
|
27
|
-
}
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## PRE-CHECK: Phase 1 Complete
|
|
33
|
-
|
|
34
|
-
```
|
|
35
|
-
Read: {artifactPath}/pass1/_index.md
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
Verify this file exists and lists the expected Phase 1 output files.
|
|
39
|
-
|
|
40
|
-
Then read the files needed for this phase:
|
|
41
|
-
- `{artifactPath}/pass1/design_context_response.json`
|
|
42
|
-
- `{artifactPath}/pass1/component_properties.json`
|
|
43
|
-
|
|
44
|
-
Also read:
|
|
45
|
-
- `{artifactPath}/IMPLEMENTATION_HISTORY.md`
|
|
46
|
-
|
|
47
|
-
Extract: `componentName`, `artifactPath`, `nodeId`, `fileKey`.
|
|
48
|
-
|
|
49
|
-
### Registry Input (optional)
|
|
50
|
-
|
|
51
|
-
The orchestrator may pass `registryData` containing pre-existing keys from `{repos.common.path}/Shared/Figma/Components/{nodeId}.json`.
|
|
52
|
-
If `registryData.testingIdentifiers` exists and is non-empty, use it to pre-populate the identifiers list.
|
|
53
|
-
Keys found in both registry AND the data files can be marked "Existing" immediately (skip CLI check in GATE 4).
|
|
54
|
-
|
|
55
|
-
If any required file is missing:
|
|
56
|
-
|
|
57
|
-
```
|
|
58
|
-
STATUS: HALT
|
|
59
|
-
PHASE: phase-2a
|
|
60
|
-
GATE: PRE_CHECK
|
|
61
|
-
REASON: Required Phase 1 artifacts missing. Pass1/_index.md or referenced files not found.
|
|
62
|
-
COMPLETED_GATES: []
|
|
63
|
-
ARTIFACTS_CREATED: none
|
|
64
|
-
USER_ACTION_REQUIRED: Run Phase 1 first to gather Figma data.
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
---
|
|
68
|
-
|
|
69
|
-
## CONTEXT-AWARE IDENTIFIERS
|
|
70
|
-
|
|
71
|
-
Components are reusable - the same `TurkishButton` appears in many screens.
|
|
72
|
-
Testing identifiers cascade via `UIIdentifierContext` (SwiftUI EnvironmentKey).
|
|
73
|
-
|
|
74
|
-
### How It Works
|
|
75
|
-
|
|
76
|
-
Parent views set context using `UITestingIdentifierKey` or raw strings:
|
|
77
|
-
|
|
78
|
-
```swift
|
|
79
|
-
// Type-safe (recommended) - uses key's identifier string as segment
|
|
80
|
-
PassengerListView()
|
|
81
|
-
.identifierContext(.PassengerList.screen)
|
|
82
|
-
|
|
83
|
-
// Raw string (fallback)
|
|
84
|
-
SearchSection()
|
|
85
|
-
.identifierContext("search")
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
Child components use standard `.accessibilityIdentifier(.Component.element)` -
|
|
89
|
-
the context is prepended automatically:
|
|
90
|
-
|
|
91
|
-
```
|
|
92
|
-
context = ["passenger_list", "search"]
|
|
93
|
-
.accessibilityIdentifier(.TurkishButton.button)
|
|
94
|
-
→ "passenger_list_search_turkishbutton_button"
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### What Phase 2A Generates
|
|
98
|
-
|
|
99
|
-
Phase 2A generates **component-level** identifiers only (e.g., `TurkishButton.button`).
|
|
100
|
-
Context prefixes are NOT baked into component identifiers - they come from the
|
|
101
|
-
parent view hierarchy at runtime via `.identifierContext()`.
|
|
102
|
-
|
|
103
|
-
### Artifact Guidance
|
|
104
|
-
|
|
105
|
-
In the Implementation section of `utility_identifiers.md`, include a note:
|
|
106
|
-
|
|
107
|
-
> **Context**: These identifiers support hierarchical context via `.identifierContext()`.
|
|
108
|
-
> Parent screens should set `.identifierContext(.ScreenKey.name)` to disambiguate
|
|
109
|
-
> reusable components. The component itself does NOT need modification.
|
|
110
|
-
> Use `.testIdentifier()` as an alias for `.accessibilityIdentifier()`.
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## GATE 1: COLLECT_REQUIREMENTS
|
|
115
|
-
|
|
116
|
-
| Priority | Source | Check |
|
|
117
|
-
|----------|--------|-------|
|
|
118
|
-
| 1 | User prompt | Explicit identifier requests |
|
|
119
|
-
| 2 | Attached file | README.md, Confluence export, screenshot |
|
|
120
|
-
| 3 | Generated | From design_context_response.json |
|
|
121
|
-
|
|
122
|
-
USE: Merge all sources. User input overrides generated.
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
## GATE 2: GENERATE_FROM_DESIGN_CONTEXT
|
|
127
|
-
|
|
128
|
-
INPUT: `{artifactPath}/pass1/design_context_response.json`
|
|
129
|
-
INPUT: `{artifactPath}/pass1/component_properties.json`
|
|
130
|
-
|
|
131
|
-
SCAN for:
|
|
132
|
-
|
|
133
|
-
| Node Pattern | Identifier Type | Key Suffix |
|
|
134
|
-
|--------------|-----------------|------------|
|
|
135
|
-
| Root text element | Static | `.title` |
|
|
136
|
-
| Button/link element | Static | `.submitButton`, `.link` |
|
|
137
|
-
| Repeated sibling structure | Dynamic | `.Item.row` |
|
|
138
|
-
| Input field | Static | `.input` |
|
|
139
|
-
| Card container | Static | `.card` |
|
|
140
|
-
| Image element | Static | `.image` |
|
|
141
|
-
| Close/dismiss button | Static | `.closeButton` |
|
|
142
|
-
| Header text | Static | `.header` |
|
|
143
|
-
| Badge/tag | Static | `.badge` |
|
|
144
|
-
|
|
145
|
-
Also use `component_properties.json` to identify:
|
|
146
|
-
- Variant properties → identifier per variant state
|
|
147
|
-
- Boolean properties → identifiers for togglable elements
|
|
148
|
-
- Text slots → identifiers for text elements
|
|
149
|
-
- Nested components → identifiers for sub-component containers
|
|
150
|
-
|
|
151
|
-
OUTPUT: List of `{ key, value, usage }`.
|
|
152
|
-
|
|
153
|
-
---
|
|
154
|
-
|
|
155
|
-
## GATE 3: VALIDATE_NAMING
|
|
156
|
-
|
|
157
|
-
REF: `reference/testing-identifiers-naming.md`
|
|
158
|
-
|
|
159
|
-
| Pattern | Key Format (PascalCase.Dot) | Value Format (snake_case) |
|
|
160
|
-
|---------|------------|--------------|
|
|
161
|
-
| Static | `<ComponentName>.<Element>` | `<componentname>_<element>` |
|
|
162
|
-
| List Item | `<ComponentName>.Item.<Element>` | `<componentname>_item_<element>_%@` |
|
|
163
|
-
| Variant | `<ComponentName>.Item.<Variant>` | `<componentname>_item_<variant>_%@` |
|
|
164
|
-
|
|
165
|
-
VALIDATE each identifier:
|
|
166
|
-
- Key follows PascalCase.Dot.Notation
|
|
167
|
-
- Value is snake_case
|
|
168
|
-
- Value length ≤ 100 characters
|
|
169
|
-
- No spaces or special characters in value
|
|
170
|
-
- Unique within component scope
|
|
171
|
-
- Max 5 levels in key hierarchy
|
|
172
|
-
|
|
173
|
-
If any identifier fails validation, fix it before proceeding.
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## GATE 4: CHECK_EXISTING_IDENTIFIERS
|
|
178
|
-
|
|
179
|
-
### Registry fast-path
|
|
180
|
-
|
|
181
|
-
If `registryData.testingIdentifiers` contains this key, run the CLI check to confirm it still exists in the data file.
|
|
182
|
-
If both registry AND CLI confirm → mark "Existing" immediately.
|
|
183
|
-
If registry has it but CLI says not found → mark "To Add" (re-add it).
|
|
184
|
-
|
|
185
|
-
### CLI check
|
|
186
|
-
|
|
187
|
-
For each identifier in the list, check if it already exists:
|
|
188
|
-
|
|
189
|
-
```bash
|
|
190
|
-
{repos.common.path}/.build/debug/UITestingIdentifierTool check --key '<KEY>'
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
> **If binary not found:** `swift build --package-path {repos.common.path} --product UITestingIdentifierTool`
|
|
194
|
-
|
|
195
|
-
OUTPUT:
|
|
196
|
-
```
|
|
197
|
-
✅ Key exists: <KEY>
|
|
198
|
-
Value: <VALUE>
|
|
199
|
-
```
|
|
200
|
-
or
|
|
201
|
-
```
|
|
202
|
-
❌ Key not found: <KEY>
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
| Result | Action |
|
|
206
|
-
|--------|--------|
|
|
207
|
-
| `✅ Key exists` | Mark status: "Existing" |
|
|
208
|
-
| `❌ Key not found` | Mark status: "To Add" |
|
|
209
|
-
|
|
210
|
-
FAIL (tool error) →
|
|
211
|
-
```
|
|
212
|
-
STATUS: HALT
|
|
213
|
-
PHASE: phase-2a
|
|
214
|
-
GATE: CHECK_EXISTING_IDENTIFIERS
|
|
215
|
-
REASON: UITestingIdentifierTool failed.
|
|
216
|
-
COMPLETED_GATES: [PRE_CHECK, COLLECT_REQUIREMENTS, GENERATE_FROM_DESIGN_CONTEXT, VALIDATE_NAMING]
|
|
217
|
-
ARTIFACTS_CREATED: none
|
|
218
|
-
USER_ACTION_REQUIRED: Options:
|
|
219
|
-
1) Retry command
|
|
220
|
-
2) Build tool first: swift build --package-path {repos.common.path} --product UITestingIdentifierTool
|
|
221
|
-
3) Skip identifier integration
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
---
|
|
225
|
-
|
|
226
|
-
## GATE 5: ADD_MISSING_IDENTIFIERS
|
|
227
|
-
|
|
228
|
-
For each identifier with status "To Add":
|
|
229
|
-
|
|
230
|
-
```bash
|
|
231
|
-
{repos.common.path}/.build/debug/UITestingIdentifierTool add --key '<KEY>' --value '<VALUE>'
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
OUTPUT:
|
|
235
|
-
```
|
|
236
|
-
✅ Added: <KEY> = <VALUE>
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
After all additions, generate Swift code:
|
|
240
|
-
|
|
241
|
-
```bash
|
|
242
|
-
{repos.common.path}/.build/debug/UITestingIdentifierTool generate
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
OUTPUT:
|
|
246
|
-
```
|
|
247
|
-
✅ Generated iOS code: iOS/Sources/UITestingIdentifiers/Generated/UITestingIdentifierKeys.swift
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
| Result | Action |
|
|
251
|
-
|--------|--------|
|
|
252
|
-
| All succeeded | Proceed to GATE 6 |
|
|
253
|
-
| Any failed | HALT |
|
|
254
|
-
|
|
255
|
-
FAIL →
|
|
256
|
-
```
|
|
257
|
-
STATUS: HALT
|
|
258
|
-
PHASE: phase-2a
|
|
259
|
-
GATE: ADD_MISSING_IDENTIFIERS
|
|
260
|
-
REASON: Failed to add identifier or generate code.
|
|
261
|
-
COMPLETED_GATES: [PRE_CHECK, COLLECT_REQUIREMENTS, GENERATE_FROM_DESIGN_CONTEXT, VALIDATE_NAMING, CHECK_EXISTING_IDENTIFIERS]
|
|
262
|
-
ARTIFACTS_CREATED: none
|
|
263
|
-
USER_ACTION_REQUIRED: Options:
|
|
264
|
-
1) Retry failed command
|
|
265
|
-
2) Skip this identifier and continue
|
|
266
|
-
3) Skip identifier integration entirely
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
---
|
|
270
|
-
|
|
271
|
-
## GATE 6: WRITE_ARTIFACT
|
|
272
|
-
|
|
273
|
-
### JSON Sidecar (machine-readable)
|
|
274
|
-
|
|
275
|
-
Write `{artifactPath}/pass2/utility_identifiers.json`:
|
|
276
|
-
|
|
277
|
-
```json
|
|
278
|
-
{
|
|
279
|
-
"testingIdentifiers": [
|
|
280
|
-
{ "key": "ComponentName.element", "value": "componentname_element", "usage": "Element description" }
|
|
281
|
-
]
|
|
282
|
-
}
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
This JSON is consumed by `phase2-finalize.py` to build `component-utilities.json`. The orchestrator reads ONLY this JSON - never the markdown.
|
|
286
|
-
|
|
287
|
-
### Markdown Artifact (human-readable)
|
|
288
|
-
|
|
289
|
-
Write `{artifactPath}/pass2/utility_identifiers.md`:
|
|
290
|
-
|
|
291
|
-
```markdown
|
|
292
|
-
# Testing Identifiers
|
|
293
|
-
|
|
294
|
-
Component: {componentName}
|
|
295
|
-
Generated: {ISO_DATE}
|
|
296
|
-
Source: pass1/design_context_response.json, pass1/component_properties.json
|
|
297
|
-
|
|
298
|
-
## Identifiers
|
|
299
|
-
|
|
300
|
-
| Key | Value | Status | Usage |
|
|
301
|
-
|-----|-------|--------|-------|
|
|
302
|
-
| {ComponentName}.title | {componentname}_title | Added | Title label |
|
|
303
|
-
| {ComponentName}.submitButton | {componentname}_submit_button | Added | Submit button |
|
|
304
|
-
| {ComponentName}.closeButton | {componentname}_close_button | Existing | Close button |
|
|
305
|
-
| {ComponentName}.Item.row | {componentname}_item_row_%@ | Added | Row (dynamic) |
|
|
306
|
-
|
|
307
|
-
## Implementation
|
|
308
|
-
|
|
309
|
-
```swift
|
|
310
|
-
import UIComponentUtilities
|
|
311
|
-
|
|
312
|
-
// Static identifier
|
|
313
|
-
Text(title)
|
|
314
|
-
.accessibilityIdentifier(.{ComponentName}.title)
|
|
315
|
-
|
|
316
|
-
Button("Submit") { }
|
|
317
|
-
.accessibilityIdentifier(.{ComponentName}.submitButton)
|
|
318
|
-
|
|
319
|
-
// Dynamic identifier (list items)
|
|
320
|
-
ForEach(items.indices, id: \.self) { index in
|
|
321
|
-
ItemRow(item: items[index])
|
|
322
|
-
.accessibilityIdentifier(.{ComponentName}.Item.row.with(index))
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
// With analytics (identifiers used as analytics IDs)
|
|
326
|
-
Button("Submit") { }
|
|
327
|
-
.accessibilityIdentifier(.{ComponentName}.submitButton)
|
|
328
|
-
.analyticsButton(
|
|
329
|
-
id: UITestingIdentifierKey.{ComponentName}.submitButton.description,
|
|
330
|
-
label: "Submit",
|
|
331
|
-
type: .primary
|
|
332
|
-
)
|
|
333
|
-
```
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
---
|
|
337
|
-
|
|
338
|
-
## VALIDATION CHECKLIST
|
|
339
|
-
|
|
340
|
-
Before marking complete, verify:
|
|
341
|
-
|
|
342
|
-
```
|
|
343
|
-
[ ] All text elements in design_context have identifiers
|
|
344
|
-
[ ] All interactive elements have identifiers
|
|
345
|
-
[ ] All list/repeated structures have dynamic identifiers with %@
|
|
346
|
-
[ ] Key format: PascalCase.Dot.Notation
|
|
347
|
-
[ ] Value format: snake_case, ≤100 chars
|
|
348
|
-
[ ] No duplicate keys within component scope
|
|
349
|
-
[ ] UITestingIdentifierTool check passes for all added keys
|
|
350
|
-
[ ] UITestingIdentifierTool generate completed successfully
|
|
351
|
-
[ ] utility_identifiers.json written to pass2/ (JSON sidecar for finalize script)
|
|
352
|
-
[ ] utility_identifiers.md written to pass2/
|
|
353
|
-
[ ] Implementation section shows correct import and usage patterns
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
---
|
|
357
|
-
|
|
358
|
-
## SUCCESS OUTPUT
|
|
359
|
-
|
|
360
|
-
```
|
|
361
|
-
STATUS: COMPLETE
|
|
362
|
-
PHASE: phase-2a
|
|
363
|
-
GATES_PASSED: [PRE_CHECK, COLLECT_REQUIREMENTS, GENERATE_FROM_DESIGN_CONTEXT, VALIDATE_NAMING, CHECK_EXISTING_IDENTIFIERS, ADD_MISSING_IDENTIFIERS, WRITE_ARTIFACT]
|
|
364
|
-
ARTIFACTS_CREATED:
|
|
365
|
-
- {artifactPath}/pass2/utility_identifiers.json
|
|
366
|
-
- {artifactPath}/pass2/utility_identifiers.md
|
|
367
|
-
SUMMARY: Testing identifiers: {ADDED} added, {EXISTING} existing.
|
|
368
|
-
```
|