@mmerterden/multi-agent-pipeline 11.2.0 → 11.3.1
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 +68 -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 +39 -17
- package/install/copilot.mjs +22 -16
- 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/lib/credential-store.sh +8 -4
- 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/build-skills-index.mjs +3 -6
- package/pipeline/scripts/eval-mine-corpus.mjs +187 -0
- package/pipeline/scripts/fixtures/install-layout.tsv +6 -5
- package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
- package/pipeline/scripts/lint-skills.mjs +26 -1
- 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 +17 -6
- package/pipeline/skills/.skill-manifest.json +40 -160
- package/pipeline/skills/.skills-index.json +3 -373
- 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 +3 -44
- 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,153 +0,0 @@
|
|
|
1
|
-
# REMOTE MCP SCRIPT REFERENCE
|
|
2
|
-
|
|
3
|
-
Script: `scripts/remote-mcp-fetch.py`
|
|
4
|
-
|
|
5
|
-
Standalone Python script to call Figma remote MCP (`mcp.figma.com`) from subagents, CI, or any context where Claude MCP tools are unavailable.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Usage
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
python3 scripts/remote-mcp-fetch.py \
|
|
13
|
-
--tool get_design_context \
|
|
14
|
-
--file-key "ps4xrJzhn7WNbfkZs895Bi" \
|
|
15
|
-
--node-id "5:17752" \
|
|
16
|
-
--output /path/to/output.json
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Arguments
|
|
22
|
-
|
|
23
|
-
| Argument | Required | Description |
|
|
24
|
-
|----------|----------|-------------|
|
|
25
|
-
| `--tool` | yes | MCP tool name (see below) |
|
|
26
|
-
| `--file-key` | yes | Figma file key from URL |
|
|
27
|
-
| `--node-id` | yes | Node ID (`X:Y` format) |
|
|
28
|
-
| `--mcp-token` | no | OAuth token override |
|
|
29
|
-
| `--output` | no | Write text output to file (omit → stdout) |
|
|
30
|
-
| `--output-image` | no | Write screenshot PNG to file |
|
|
31
|
-
| `--extra-args` | no | JSON string merged into tool arguments |
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Supported Tools
|
|
36
|
-
|
|
37
|
-
| Tool | Output Type | Description |
|
|
38
|
-
|------|-------------|-------------|
|
|
39
|
-
| `get_metadata` | XML text | Layer hierarchy with IDs, types, positions |
|
|
40
|
-
| `get_design_context` | Code text | Reference code + Code Connect snippets |
|
|
41
|
-
| `get_variable_defs` | JSON text | Resolved design token values |
|
|
42
|
-
| `get_code_connect_map` | JSON text | Component-to-source mappings |
|
|
43
|
-
| `get_screenshot` | PNG image | Visual snapshot of node |
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## Token Resolution Chain
|
|
48
|
-
|
|
49
|
-
The script resolves the OAuth token in this order:
|
|
50
|
-
|
|
51
|
-
1. **`--mcp-token` CLI arg** - explicit token passed at invocation
|
|
52
|
-
2. **Keychain `FIGMA_MCP_TOKEN`** - dedicated entry stored by `/figma-setup` (CHECK 3b)
|
|
53
|
-
3. **Keychain `Claude Code-credentials`** - extracts `figma-remote` OAuth token via regex
|
|
54
|
-
|
|
55
|
-
Fallback #2 is fast (direct keychain lookup). Fallback #3 works but parses a large JSON blob.
|
|
56
|
-
Run `/figma-setup` to pre-store the token for fast access.
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## Token Details
|
|
61
|
-
|
|
62
|
-
- **Type:** OAuth access token (NOT a personal access token)
|
|
63
|
-
- **Prefix:** `figu_` (vs `figd_` for PATs)
|
|
64
|
-
- **Source:** Claude Code's MCP OAuth flow for `figma-remote` server
|
|
65
|
-
- **PATs do NOT work** with remote MCP - always returns 401
|
|
66
|
-
|
|
67
|
-
---
|
|
68
|
-
|
|
69
|
-
## Protocol
|
|
70
|
-
|
|
71
|
-
- **Endpoint:** `https://mcp.figma.com/mcp`
|
|
72
|
-
- **Auth:** `Authorization: Bearer <figu_token>`
|
|
73
|
-
- **Protocol:** JSON-RPC 2.0 over HTTP with SSE responses
|
|
74
|
-
- **Stateless:** Each call does `initialize` + `tools/call` (no session persistence)
|
|
75
|
-
- **Default params:** `clientLanguages=swift`, `clientFrameworks=swiftui`
|
|
76
|
-
|
|
77
|
-
### Request Flow
|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
1. POST /mcp → {"method": "initialize", ...} → HTTP 200 (SSE)
|
|
81
|
-
2. POST /mcp → {"method": "tools/call", "params": {"name": "<tool>", "arguments": {...}}} → HTTP 200 (SSE)
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### SSE Response Parsing
|
|
85
|
-
|
|
86
|
-
Response body contains SSE events. The JSON payload is in the `data:` line and may span multiple physical lines (embedded newlines in text content). The script handles this by finding the `data:` prefix and parsing the full JSON object.
|
|
87
|
-
|
|
88
|
-
---
|
|
89
|
-
|
|
90
|
-
## Examples
|
|
91
|
-
|
|
92
|
-
**Get metadata:**
|
|
93
|
-
```bash
|
|
94
|
-
python3 scripts/remote-mcp-fetch.py \
|
|
95
|
-
--tool get_metadata \
|
|
96
|
-
--file-key ps4xrJzhn7WNbfkZs895Bi \
|
|
97
|
-
--node-id "5:17752" \
|
|
98
|
-
--output artifacts/metadata_response.xml
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
**Get design context with force-code:**
|
|
102
|
-
```bash
|
|
103
|
-
python3 scripts/remote-mcp-fetch.py \
|
|
104
|
-
--tool get_design_context \
|
|
105
|
-
--file-key ps4xrJzhn7WNbfkZs895Bi \
|
|
106
|
-
--node-id "1411:18186" \
|
|
107
|
-
--extra-args '{"forceCode": true}' \
|
|
108
|
-
--output artifacts/design_context_response.json
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
**Get screenshot:**
|
|
112
|
-
```bash
|
|
113
|
-
python3 scripts/remote-mcp-fetch.py \
|
|
114
|
-
--tool get_screenshot \
|
|
115
|
-
--file-key ps4xrJzhn7WNbfkZs895Bi \
|
|
116
|
-
--node-id "5:17752" \
|
|
117
|
-
--output-image artifacts/screenshot.png
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## Exit Codes
|
|
123
|
-
|
|
124
|
-
| Code | Meaning |
|
|
125
|
-
|------|---------|
|
|
126
|
-
| 0 | Success |
|
|
127
|
-
| 1 | Failure (JSON error printed to stderr) |
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
## Errors
|
|
132
|
-
|
|
133
|
-
| Error | Cause | Fix |
|
|
134
|
-
|-------|-------|-----|
|
|
135
|
-
| `no_mcp_token` | No token found in any fallback | Run `/figma-setup` or pass `--mcp-token` |
|
|
136
|
-
| `MCP init failed: HTTP 401` | Token expired or invalid | Re-authenticate figma-remote in Claude Code, re-run `/figma-setup` |
|
|
137
|
-
| `MCP <tool>: HTTP 4xx` | Bad request or auth failure | Check file-key, node-id, token validity |
|
|
138
|
-
| `An unexpected error occurred` | Figma server-side error | Retry; check node-id exists in file |
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## Local vs Remote MCP Comparison
|
|
143
|
-
|
|
144
|
-
| Aspect | Local MCP | Remote MCP (this script) |
|
|
145
|
-
|--------|-----------|--------------------------|
|
|
146
|
-
| Endpoint | `http://127.0.0.1:3845/mcp` | `https://mcp.figma.com/mcp` |
|
|
147
|
-
| Auth | None | OAuth Bearer token |
|
|
148
|
-
| `fileKey` required | No (uses open file) | Yes (always) |
|
|
149
|
-
| `dirForAssetWrites` | Supported (writes SVGs to disk) | Not supported (returns URLs) |
|
|
150
|
-
| Requires Figma Desktop | Yes | No |
|
|
151
|
-
| Works in subagents/CI | Yes (HTTP) | Yes (HTTP) |
|
|
152
|
-
| Code Connect output | Returns ALL platforms | Filters by target platform |
|
|
153
|
-
| Rate limits | Daily cap (varies) | Per plan (see tools.md section1.7) |
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
# FIGMA REST API - SCRIPT USAGE REFERENCE
|
|
2
|
-
|
|
3
|
-
How the Phase 1 script (`scripts/phase1-gather.py`) uses the Figma REST API for data that MCP doesn't efficiently provide.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Auth
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
# Token stored in macOS Keychain by /figma-setup (CHECK 4)
|
|
11
|
-
TOKEN=$("$HOME/.claude/lib/credential-store.sh" get \1)
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
```python
|
|
15
|
-
# In scripts:
|
|
16
|
-
token = subprocess.check_output(
|
|
17
|
-
["security", "find-generic-password", "-a", os.environ["USER"],
|
|
18
|
-
"-s", "FIGMA_ACCESS_TOKEN", "-w"],
|
|
19
|
-
stderr=subprocess.DEVNULL,
|
|
20
|
-
).decode().strip()
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
**Header:** `X-Figma-Token: <token>` (NOT `Authorization: Bearer`)
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## Endpoints Used by Phase 1 Script
|
|
28
|
-
|
|
29
|
-
### 1. Node Data - Component Properties
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
GET https://api.figma.com/v1/files/{fileKey}/nodes?ids={nodeId}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Returns full node JSON including `componentPropertyDefinitions` for the component set. The script processes this into `component_properties.json` with variant axes, types, and default values.
|
|
36
|
-
|
|
37
|
-
**Why REST not MCP:** MCP `get_design_context` returns code, not raw component property definitions. REST gives the structured node data needed for variant enumeration.
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
### 2. Screenshot Export - Single Node
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
GET https://api.figma.com/v1/images/{fileKey}?ids={nodeId}&format=png&scale=2
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Returns JSON with `images` map: `{ "nodeId": "https://...s3.amazonaws.com/..." }`. The script downloads the URL to save as `screenshot.png`.
|
|
48
|
-
|
|
49
|
-
**Why REST not MCP:** MCP `get_screenshot` returns base64 inline (works but larger payload). REST returns a URL - better for scripts that save to disk.
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
### 3. Batch Screenshot Export - Variants
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
GET https://api.figma.com/v1/images/{fileKey}?ids={id1},{id2},{id3},...&format=png&scale=2
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Same endpoint, comma-separated IDs. Returns all image URLs in one call. The script downloads each to `screenshots/VariantName.png`.
|
|
60
|
-
|
|
61
|
-
**Why batch:** A component with 288 variants would need 288 individual MCP `get_screenshot` calls. The REST batch endpoint returns all URLs in one request (~2-3s total).
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
### 4. Variable Definitions (Fallback)
|
|
66
|
-
|
|
67
|
-
```
|
|
68
|
-
GET https://api.figma.com/v1/files/{fileKey}/variables/local
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**Note:** Returns 403 on non-Enterprise Figma plans. The script uses MCP `get_variable_defs` as primary, falls back to this endpoint, and writes an error placeholder if both fail.
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## Rate Limits
|
|
76
|
-
|
|
77
|
-
The REST API has no documented hard rate limit for PAT-authenticated requests. In practice:
|
|
78
|
-
- Parallel requests work fine (script uses `ThreadPoolExecutor(max_workers=10)`)
|
|
79
|
-
- Batch image endpoint is preferred over individual calls
|
|
80
|
-
- No 429s observed during testing with 288-variant batch exports
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Script Integration Pattern
|
|
85
|
-
|
|
86
|
-
```python
|
|
87
|
-
# Standard request helper from phase1-gather.py
|
|
88
|
-
def figma_api(path):
|
|
89
|
-
"""GET from Figma REST API. Returns parsed JSON."""
|
|
90
|
-
url = f"https://api.figma.com/v1{path}"
|
|
91
|
-
req = Request(url, headers={"X-Figma-Token": FIGMA_TOKEN})
|
|
92
|
-
with urlopen(req, timeout=60) as resp:
|
|
93
|
-
return json.loads(resp.read().decode())
|
|
94
|
-
|
|
95
|
-
# Node data
|
|
96
|
-
data = figma_api(f"/files/{FILE_KEY}/nodes?ids={NODE_ID}")
|
|
97
|
-
|
|
98
|
-
# Batch images
|
|
99
|
-
ids_param = ",".join(variant_ids)
|
|
100
|
-
data = figma_api(f"/images/{FILE_KEY}?ids={ids_param}&format=png&scale=2")
|
|
101
|
-
for node_id, url in data["images"].items():
|
|
102
|
-
download(url, f"screenshots/{variant_name}.png")
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## REST vs MCP - When to Use What
|
|
108
|
-
|
|
109
|
-
| Data | Use REST | Use MCP | Reason |
|
|
110
|
-
|------|----------|---------|--------|
|
|
111
|
-
| Component properties/variants | yes | - | MCP doesn't expose raw property defs |
|
|
112
|
-
| Screenshot (single) | ok | ok | Both work; MCP is simpler for inline use |
|
|
113
|
-
| Screenshots (batch) | yes | - | One REST call vs N MCP calls |
|
|
114
|
-
| Design context (code) | - | yes | MCP generates reference code |
|
|
115
|
-
| Metadata (XML hierarchy) | - | yes | MCP returns structured XML |
|
|
116
|
-
| Variable definitions | fallback | primary | MCP preferred; REST 403 on non-Enterprise |
|
|
117
|
-
| Code Connect mappings | - | yes | MCP-only feature |
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## Error Handling
|
|
122
|
-
|
|
123
|
-
| Status | Meaning | Script Action |
|
|
124
|
-
|--------|---------|---------------|
|
|
125
|
-
| 200 | Success | Parse JSON response |
|
|
126
|
-
| 400 | Bad request | Log error, halt gate |
|
|
127
|
-
| 403 | Forbidden / no access | Log warning, skip (e.g., variables endpoint) |
|
|
128
|
-
| 404 | File/node not found | Halt with user action |
|
|
129
|
-
| 429 | Rate limited | Not observed in practice |
|
|
130
|
-
| 5xx | Server error | Retry once, then halt |
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
# SCRIPTS INVENTORY
|
|
2
|
-
|
|
3
|
-
All scripts in `.instructions/figma/figma-to-swiftui/scripts/`. Each replaces slow LLM subagent turns with deterministic, fast execution.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Data Gathering
|
|
8
|
-
|
|
9
|
-
### `phase1-gather.py` - Phase 1 Data Collection
|
|
10
|
-
|
|
11
|
-
Replaces the Phase 1 LLM subagent. Collects all Figma data for a component in one run.
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
python3 scripts/phase1-gather.py \
|
|
15
|
-
--file-key "ps4xrJzhn7WNbfkZs895Bi" \
|
|
16
|
-
--node-id "5:17752" \
|
|
17
|
-
--artifact-path "path/to/ComponentName/" \
|
|
18
|
-
--component-name "Button" \
|
|
19
|
-
[--figma-token TOKEN] \
|
|
20
|
-
[--mcp-url "http://127.0.0.1:3845/mcp"]
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
| Aspect | Detail |
|
|
24
|
-
|--------|--------|
|
|
25
|
-
| Runtime | 5-15s (small), 25-40s (large/288 variants) |
|
|
26
|
-
| Data sources | Local MCP (HTTP) + REST API |
|
|
27
|
-
| Auth | `FIGMA_ACCESS_TOKEN` from Keychain + local MCP (no auth) |
|
|
28
|
-
| Output | JSON summary to stdout, artifacts to `--artifact-path` |
|
|
29
|
-
|
|
30
|
-
**Artifacts produced:**
|
|
31
|
-
|
|
32
|
-
| File | Source |
|
|
33
|
-
|------|--------|
|
|
34
|
-
| `pass1/screenshot.png` | REST API `/v1/images` |
|
|
35
|
-
| `pass1/metadata_response.xml` | MCP `get_metadata` |
|
|
36
|
-
| `pass1/design_context_response.json` | MCP `get_design_context` |
|
|
37
|
-
| `pass1/design_context_assets.txt` | Asset URL list from design context |
|
|
38
|
-
| `pass1/variable_defs_response.json` | MCP `get_variable_defs` → REST fallback |
|
|
39
|
-
| `pass1/code_connect_map_response.json` | MCP `get_code_connect_map` |
|
|
40
|
-
| `pass1/component_properties.json` | REST API `/v1/files/.../nodes` (processed) |
|
|
41
|
-
| `pass1/component_summary.json` | Compiled from all above |
|
|
42
|
-
| `pass1/screenshots/*.png` | REST API batch image export |
|
|
43
|
-
|
|
44
|
-
**Key features:**
|
|
45
|
-
- Sublayer auto-split: If `get_design_context` returns "too large" XML, recursively splits into sublayer calls (max depth 3)
|
|
46
|
-
- Parallel variant screenshots: `ThreadPoolExecutor(max_workers=10)`
|
|
47
|
-
- Variable defs fallback: MCP → REST API (403 on non-Enterprise) → error placeholder
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
### `remote-mcp-fetch.py` - Remote MCP Tool Caller
|
|
52
|
-
|
|
53
|
-
Calls Figma remote MCP from any context (subagents, CI, scripts). See `reference/remote-mcp-script.md` for full docs.
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
python3 scripts/remote-mcp-fetch.py \
|
|
57
|
-
--tool get_design_context \
|
|
58
|
-
--file-key "ps4xrJzhn7WNbfkZs895Bi" \
|
|
59
|
-
--node-id "5:17752" \
|
|
60
|
-
--output output.json
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
| Aspect | Detail |
|
|
64
|
-
|--------|--------|
|
|
65
|
-
| Runtime | 2-10s per call |
|
|
66
|
-
| Auth | OAuth token: `--mcp-token` → Keychain `FIGMA_MCP_TOKEN` → Claude Code credentials |
|
|
67
|
-
| Tools | `get_metadata`, `get_design_context`, `get_variable_defs`, `get_code_connect_map`, `get_screenshot` |
|
|
68
|
-
|
|
69
|
-
---
|
|
70
|
-
|
|
71
|
-
## Phase Processing
|
|
72
|
-
|
|
73
|
-
### `phase2-finalize.py` - Phase 2 Finalization
|
|
74
|
-
|
|
75
|
-
Builds `component-utilities.json` from Phase 2 sub-phase JSON sidecars and registers with FigmaRegistryUtility.
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
python3 scripts/phase2-finalize.py \
|
|
79
|
-
--artifact-path /path/to/artifacts \
|
|
80
|
-
--node-id "9047:386" \
|
|
81
|
-
--file-key "ps4xrJzhn7WNbfkZs895Bi" \
|
|
82
|
-
--component-name "AvatarMembership"
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
| Input | Output |
|
|
86
|
-
|-------|--------|
|
|
87
|
-
| `pass2/utility_identifiers.json` (2A) | `pass2/component-utilities.json` |
|
|
88
|
-
| `pass2/utility_localization.json` (2B) | `pass2/_index.md` |
|
|
89
|
-
| `pass2/utility_accessibility.json` (2C) | Registry entry (via CLI) |
|
|
90
|
-
| `pass2/utility_analytics.json` (2D) | |
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
### `phase3-scripts.py` - Phase 3 Scriptable Sub-Phases
|
|
95
|
-
|
|
96
|
-
Runs deterministic Phase 3 sub-phases that don't need AI reasoning.
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
python3 scripts/phase3-scripts.py 3b --artifact-path /path # Token mapping
|
|
100
|
-
python3 scripts/phase3-scripts.py 3e --artifact-path /path # Asset inventory
|
|
101
|
-
python3 scripts/phase3-scripts.py 3f --artifact-path /path # Utility integration
|
|
102
|
-
python3 scripts/phase3-scripts.py 3g --artifact-path /path # Coverage check
|
|
103
|
-
python3 scripts/phase3-scripts.py wave1 --artifact-path /path # 3b+3e+3f together
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
| Sub-command | Phase | What it does | Runtime |
|
|
107
|
-
|-------------|-------|-------------|---------|
|
|
108
|
-
| `3b` | Token Mapping | Parses `variable_defs_response.json` → CLI lookup → `02_token_mapping.md` | <0.1s |
|
|
109
|
-
| `3e` | Assets | Parses asset list → CLI lookup → identifies existing assets → `06_assets.md` | <0.1s |
|
|
110
|
-
| `3f` | Utilities | Reads `component-utilities.json` → formats → `08_utility_integration.md` | <0.1s |
|
|
111
|
-
| `3g` | Coverage | Reads `component_properties.json` + `04b_component_architecture.json` → diff → coverage report | <0.1s |
|
|
112
|
-
| `wave1` | 3b+3e+3f | Parallel run of all three | <0.2s |
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
## Validation
|
|
117
|
-
|
|
118
|
-
### `validate-phase4.sh` - Phase 4 Output Validation
|
|
119
|
-
|
|
120
|
-
Checks Phase 4 (code generation) output for completeness.
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
bash scripts/validate-phase4.sh /path/to/artifacts
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### `validate-phase6.sh` - Phase 6 Output Validation
|
|
127
|
-
|
|
128
|
-
Checks Phase 6 (Code Connect) output for completeness.
|
|
129
|
-
|
|
130
|
-
```bash
|
|
131
|
-
bash scripts/validate-phase6.sh /path/to/artifacts
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### `code-connect-publish.sh` - Resilient Code Connect Publish
|
|
135
|
-
|
|
136
|
-
Wrapper around `npx figma connect publish` that auto-excludes stale components causing validation failures, retries once, and restores `figma.config.json` via trap.
|
|
137
|
-
|
|
138
|
-
```bash
|
|
139
|
-
bash scripts/code-connect-publish.sh [--dry-run]
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Must be run from the uicomponents package root. Requires `FIGMA_ACCESS_TOKEN` env var.
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
## Utilities
|
|
147
|
-
|
|
148
|
-
### `sync-skills.sh` - Sync Skill Files
|
|
149
|
-
|
|
150
|
-
Copies `.instructions/figma/figma-to-swiftui/` to `.gemini/skills/figma/` and `.github/skills/figma/`.
|
|
151
|
-
|
|
152
|
-
```bash
|
|
153
|
-
bash scripts/sync-skills.sh
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### `run-uicomponents-tests.sh` - Run UIComponents Tests
|
|
157
|
-
|
|
158
|
-
Runs the Swift test suite for the UIComponents package.
|
|
159
|
-
|
|
160
|
-
```bash
|
|
161
|
-
bash scripts/run-uicomponents-tests.sh
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## Code Connect
|
|
167
|
-
|
|
168
|
-
### `register-icons-codeconnect.py` - Batch Icon Registration
|
|
169
|
-
|
|
170
|
-
Registers icon assets in Figma via Code Connect.
|
|
171
|
-
|
|
172
|
-
```bash
|
|
173
|
-
python3 scripts/register-icons-codeconnect.py [options]
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
### `figma-subcomponent-graph.py` - Component Dependency Graph
|
|
177
|
-
|
|
178
|
-
Builds a graph of nested component dependencies from Figma metadata.
|
|
179
|
-
|
|
180
|
-
```bash
|
|
181
|
-
python3 scripts/figma-subcomponent-graph.py [options]
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
---
|
|
185
|
-
|
|
186
|
-
## Confluence
|
|
187
|
-
|
|
188
|
-
### `confluence-publish.py` - Publish to Confluence
|
|
189
|
-
|
|
190
|
-
Publishes component documentation to Confluence.
|
|
191
|
-
|
|
192
|
-
```bash
|
|
193
|
-
python3 scripts/confluence-publish.py [options]
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### `confluence-component-status.py` - Component Status Tracker
|
|
197
|
-
|
|
198
|
-
Tracks implementation status across components in Confluence.
|
|
199
|
-
|
|
200
|
-
```bash
|
|
201
|
-
python3 scripts/confluence-component-status.py [options]
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
### `confluence-page-ids.json` - Page ID Mapping
|
|
205
|
-
|
|
206
|
-
Static JSON mapping of Confluence page IDs for documentation targets.
|
|
207
|
-
|
|
208
|
-
---
|
|
209
|
-
|
|
210
|
-
## Performance Summary
|
|
211
|
-
|
|
212
|
-
| Script | Replaces | Old Time | New Time | Speedup |
|
|
213
|
-
|--------|----------|----------|----------|---------|
|
|
214
|
-
| `phase1-gather.py` | Phase 1 LLM subagent | ~20 min | 5-40s | ~30-240x |
|
|
215
|
-
| `phase2-finalize.py` | Phase 2 orchestrator merge | ~2 min | <1s | ~120x |
|
|
216
|
-
| `phase3-scripts.py` (wave1) | Phase 3 AI agents (3B+3E+3F) | ~3 min | 0.2s | ~900x |
|
|
217
|
-
| `phase3-scripts.py` (3g) | Phase 3G AI agent | ~1 min | <0.1s | ~600x |
|
|
218
|
-
| `remote-mcp-fetch.py` | Inline MCP calls (chat only) | N/A | 2-10s | Enables subagent/CI use |
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
# SNAPSHOT TESTING REFERENCE
|
|
2
|
-
|
|
3
|
-
Point-Free swift-snapshot-testing for SwiftUI visual regression testing.
|
|
4
|
-
|
|
5
|
-
Package: `https://github.com/pointfreeco/swift-snapshot-testing`
|
|
6
|
-
Version: `1.17.6` (latest as of Aug 2025)
|
|
7
|
-
License: MIT
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## FRAMEWORK SUPPORT
|
|
12
|
-
|
|
13
|
-
| Framework | Supported |
|
|
14
|
-
|-----------|-----------|
|
|
15
|
-
| XCTest | Yes |
|
|
16
|
-
| Swift Testing | Yes (auto-detects context) |
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## BASIC USAGE
|
|
21
|
-
|
|
22
|
-
### XCTest
|
|
23
|
-
|
|
24
|
-
```swift
|
|
25
|
-
import SnapshotTesting
|
|
26
|
-
import SwiftUI
|
|
27
|
-
import XCTest
|
|
28
|
-
|
|
29
|
-
final class MyComponentTests: XCTestCase {
|
|
30
|
-
func testDefaultState() {
|
|
31
|
-
let view = MyComponent(title: "Hello")
|
|
32
|
-
let vc = UIHostingController(rootView: view)
|
|
33
|
-
vc.view.frame = CGRect(x: 0, y: 0, width: 375, height: 100)
|
|
34
|
-
assertSnapshot(of: vc, as: .image)
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### Swift Testing
|
|
40
|
-
|
|
41
|
-
```swift
|
|
42
|
-
import SnapshotTesting
|
|
43
|
-
import SwiftUI
|
|
44
|
-
import Testing
|
|
45
|
-
|
|
46
|
-
@Suite(.snapshots(record: .missing))
|
|
47
|
-
struct MyComponentTests {
|
|
48
|
-
@Test func defaultState() {
|
|
49
|
-
let vc = UIHostingController(rootView: MyComponent(title: "Hello"))
|
|
50
|
-
vc.view.frame = CGRect(x: 0, y: 0, width: 375, height: 100)
|
|
51
|
-
assertSnapshot(of: vc, as: .image)
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## RECORD MODES
|
|
59
|
-
|
|
60
|
-
| Mode | Behavior |
|
|
61
|
-
|------|----------|
|
|
62
|
-
| `.missing` | Record only if snapshot doesn't exist |
|
|
63
|
-
| `.all` | Overwrite all existing snapshots |
|
|
64
|
-
| `.never` | Fail if missing (CI mode) |
|
|
65
|
-
| `.failed` | Re-record only failed snapshots |
|
|
66
|
-
|
|
67
|
-
**XCTest:** `withSnapshotTesting(record: .missing) { super.invokeTest() }`
|
|
68
|
-
**Swift Testing:** `@Suite(.snapshots(record: .missing))`
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## STRATEGIES
|
|
73
|
-
|
|
74
|
-
```swift
|
|
75
|
-
// Basic
|
|
76
|
-
assertSnapshot(of: vc, as: .image)
|
|
77
|
-
|
|
78
|
-
// With precision
|
|
79
|
-
assertSnapshot(of: vc, as: .image(precision: 0.99, perceptualPrecision: 0.98))
|
|
80
|
-
|
|
81
|
-
// Device-specific
|
|
82
|
-
assertSnapshot(of: vc, as: .image(on: .iPhone13Pro))
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
| Device | Constant |
|
|
86
|
-
|--------|----------|
|
|
87
|
-
| iPhone SE | `.iPhoneSe` |
|
|
88
|
-
| iPhone 13 Pro | `.iPhone13Pro` |
|
|
89
|
-
| iPhone 13 Pro Max | `.iPhone13ProMax` |
|
|
90
|
-
| iPad Pro 12.9" | `.iPadPro12_9` |
|
|
91
|
-
| iPad Mini | `.iPadMini` |
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
## SNAPSHOT STORAGE
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
Tests/<Module>Tests/
|
|
99
|
-
├── __Snapshots__/
|
|
100
|
-
│ └── MyComponentTests/
|
|
101
|
-
│ ├── testDefaultState.1.png
|
|
102
|
-
│ └── testDisabledState.1.png
|
|
103
|
-
└── MyComponentTests.swift
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## VARIANT AND THEME TESTING
|
|
109
|
-
|
|
110
|
-
```swift
|
|
111
|
-
// All variants
|
|
112
|
-
for variant in MyComponent.Variant.allCases {
|
|
113
|
-
let vc = UIHostingController(rootView: MyComponent(variant: variant))
|
|
114
|
-
vc.view.frame = CGRect(x: 0, y: 0, width: 375, height: 100)
|
|
115
|
-
assertSnapshot(of: vc, as: .image, named: variant.rawValue)
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Dark mode
|
|
119
|
-
vc.overrideUserInterfaceStyle = .dark
|
|
120
|
-
assertSnapshot(of: vc, as: .image, named: "dark")
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## FAILURE OUTPUT
|
|
126
|
-
|
|
127
|
-
| File | Content |
|
|
128
|
-
|------|---------|
|
|
129
|
-
| `testName.1.png` | Reference (expected) |
|
|
130
|
-
| `testName.1.failed.png` | Actual (current) |
|
|
131
|
-
| `testName.1.diff.png` | Difference highlighted |
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
## DI REGISTRATION FOR TESTS
|
|
136
|
-
|
|
137
|
-
Snapshot tests run in SPM package context - no AppDelegate, no DI registration. Use `TestDependencies` helper to register providers before tests.
|
|
138
|
-
|
|
139
|
-
```swift
|
|
140
|
-
override class func setUp() {
|
|
141
|
-
super.setUp()
|
|
142
|
-
TestDependencies.registerAll() // registers LocalizedStringProvider + CurrencyFormatProvider + AppLanguageCodeProvider
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
`TestDependencies` is at `Tests/UIComponentsTests/TestDependencies.swift`.
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
## RTL TESTING WITH ARABIC LOCALIZATION
|
|
151
|
-
|
|
152
|
-
For RTL snapshot tests, override the app language to Arabic so localized labels render in Arabic (not system language):
|
|
153
|
-
|
|
154
|
-
```swift
|
|
155
|
-
func test_snapshot_rtl_light_default() {
|
|
156
|
-
TestDependencies.setLanguage("ar")
|
|
157
|
-
let sut = makeSUT()
|
|
158
|
-
assertSnapshotRTL(sut, named: "rtl_light_default")
|
|
159
|
-
TestDependencies.resetLanguage()
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
**CRITICAL:** `String(localized:bundle:locale:)` does NOT select translation language - the `locale` parameter only affects interpolated value formatting. The `DevelopmentLocalizedStringProvider` uses `Bundle.localizedString(forKey:value:table:)` with a language-specific `.lproj` sub-bundle to correctly resolve translations by language.
|
|
164
|
-
|
|
165
|
-
**RTL snapshot helper pattern:**
|
|
166
|
-
|
|
167
|
-
```swift
|
|
168
|
-
private func assertSnapshotRTL(_ view: some View, named name: String) {
|
|
169
|
-
let rtlView = view.environment(\.layoutDirection, .rightToLeft)
|
|
170
|
-
let vc = UIHostingController(rootView: rtlView)
|
|
171
|
-
vc.view.frame = CGRect(x: 0, y: 0, width: 375, height: 0)
|
|
172
|
-
vc.view.semanticContentAttribute = .forceRightToLeft
|
|
173
|
-
vc.view.sizeToFit()
|
|
174
|
-
vc.view.layoutIfNeeded()
|
|
175
|
-
SnapshotTesting.assertSnapshot(of: vc, as: .image(precision: 0.99, perceptualPrecision: 0.98), named: name)
|
|
176
|
-
}
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
---
|
|
180
|
-
|
|
181
|
-
## COMMON ISSUES
|
|
182
|
-
|
|
183
|
-
| Issue | Solution |
|
|
184
|
-
|-------|----------|
|
|
185
|
-
| Font rendering differs on CI | Use `perceptualPrecision: 0.98` |
|
|
186
|
-
| Snapshot not found | Run with `record: .missing` first |
|
|
187
|
-
| Size mismatch | Set explicit frame on UIHostingController |
|
|
188
|
-
| Dark mode not applied | Set `overrideUserInterfaceStyle` |
|