@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,177 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# smoke-figma-cross-cli-inventory.sh - enforces the cross-CLI parity
|
|
3
|
-
# inventory for the v5.0.0 figma-to-component skill set.
|
|
4
|
-
#
|
|
5
|
-
# Source-tree assertions (does not require install.js to have deployed
|
|
6
|
-
# the skills). Complements smoke-cross-cli-behavior.sh (installed-tree)
|
|
7
|
-
# and smoke-commands-skills-parity.sh (multi-agent commands).
|
|
8
|
-
#
|
|
9
|
-
# Contract source of truth: refs/cross-cli-contract.md section1.1.
|
|
10
|
-
#
|
|
11
|
-
# Verifies:
|
|
12
|
-
# 1. Every platform-specific figma-android skill exists in figma-ios too.
|
|
13
|
-
# 2. Every required figma-* skill from the contract table exists in figma-ios.
|
|
14
|
-
# 3. Every SKILL.md that claims "platform: android" lives under figma-android/.
|
|
15
|
-
# 4. Every SKILL.md that claims "platform: ios" lives under figma-ios/.
|
|
16
|
-
# 5. No orphaned figma skill directories (not in the contract).
|
|
17
|
-
# 6. Contract doc references both figma-ios and figma-android paths.
|
|
18
|
-
|
|
19
|
-
set -euo pipefail
|
|
20
|
-
|
|
21
|
-
HERE="$(cd "$(dirname "$0")" && pwd)"
|
|
22
|
-
ROOT="$(cd "$HERE/../.." && pwd)"
|
|
23
|
-
IOS_DIR="$ROOT/pipeline/skills/figma-ios"
|
|
24
|
-
ANDROID_DIR="$ROOT/pipeline/skills/figma-android"
|
|
25
|
-
COMMON_DIR="$ROOT/pipeline/skills/figma-common"
|
|
26
|
-
CONTRACT="$ROOT/pipeline/commands/multi-agent/refs/cross-cli-contract.md"
|
|
27
|
-
|
|
28
|
-
PASS=0
|
|
29
|
-
FAIL=0
|
|
30
|
-
pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
|
|
31
|
-
fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
|
|
32
|
-
|
|
33
|
-
for d in "$IOS_DIR" "$ANDROID_DIR" "$COMMON_DIR"; do
|
|
34
|
-
[ -d "$d" ] || { echo "error: $d missing" >&2; exit 1; }
|
|
35
|
-
done
|
|
36
|
-
[ -f "$CONTRACT" ] || { echo "error: $CONTRACT missing" >&2; exit 1; }
|
|
37
|
-
|
|
38
|
-
# Platform-specific skills (required on BOTH sides per contract)
|
|
39
|
-
PLATFORM_SPECIFIC=(
|
|
40
|
-
figma-to-component
|
|
41
|
-
figma-component-implement
|
|
42
|
-
figma-component-test
|
|
43
|
-
figma-component-code-connect
|
|
44
|
-
figma-component-wiki
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
# Platform-agnostic (required on at least iOS side today - WS-7b moves to figma-common/)
|
|
48
|
-
COMMON_REQUIRED=(
|
|
49
|
-
figma-component-start
|
|
50
|
-
figma-component-confluence-sync
|
|
51
|
-
figma-component-status-update
|
|
52
|
-
figma-commit
|
|
53
|
-
figma-iteration-commit
|
|
54
|
-
figma-issue
|
|
55
|
-
figma-iterate
|
|
56
|
-
figma-cli-iterate
|
|
57
|
-
figma-cli-lean-iterate
|
|
58
|
-
figma-cli-iterate-mend
|
|
59
|
-
figma-cli-skip
|
|
60
|
-
figma-fix
|
|
61
|
-
figma-mend
|
|
62
|
-
figma-review
|
|
63
|
-
figma-validate
|
|
64
|
-
figma-setup
|
|
65
|
-
figma-remote-mcp-auth
|
|
66
|
-
figma-ui-patterns
|
|
67
|
-
figma-utility
|
|
68
|
-
figma-skip
|
|
69
|
-
figma-form-integration
|
|
70
|
-
figma-price-integration
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
echo "→ 1. Platform-specific skills exist on BOTH figma-ios and figma-android"
|
|
74
|
-
for skill in "${PLATFORM_SPECIFIC[@]}"; do
|
|
75
|
-
ios_ok="false"
|
|
76
|
-
and_ok="false"
|
|
77
|
-
[ -f "$IOS_DIR/$skill/SKILL.md" ] && ios_ok="true"
|
|
78
|
-
[ -f "$ANDROID_DIR/$skill/SKILL.md" ] && and_ok="true"
|
|
79
|
-
if [ "$ios_ok" = "true" ] && [ "$and_ok" = "true" ]; then
|
|
80
|
-
pass "$skill present on both platforms"
|
|
81
|
-
else
|
|
82
|
-
fail "$skill parity broken (ios=$ios_ok android=$and_ok)"
|
|
83
|
-
fi
|
|
84
|
-
done
|
|
85
|
-
|
|
86
|
-
echo ""
|
|
87
|
-
echo "→ 2. Platform-agnostic skills live in figma-common/ (WS-7b ✓)"
|
|
88
|
-
for skill in "${COMMON_REQUIRED[@]}"; do
|
|
89
|
-
if [ -f "$COMMON_DIR/$skill/SKILL.md" ]; then
|
|
90
|
-
pass "$skill present in figma-common"
|
|
91
|
-
else
|
|
92
|
-
fail "$skill missing in figma-common"
|
|
93
|
-
fi
|
|
94
|
-
done
|
|
95
|
-
|
|
96
|
-
echo ""
|
|
97
|
-
echo "→ 2b. Platform-agnostic skills are NOT duplicated under figma-ios"
|
|
98
|
-
DUPES=0
|
|
99
|
-
for skill in "${COMMON_REQUIRED[@]}"; do
|
|
100
|
-
if [ -d "$IOS_DIR/$skill" ]; then
|
|
101
|
-
fail "duplication: $skill exists in BOTH figma-ios/ and figma-common/"
|
|
102
|
-
DUPES=$((DUPES+1))
|
|
103
|
-
fi
|
|
104
|
-
done
|
|
105
|
-
[ "$DUPES" -eq 0 ] && pass "no common-skill duplication in figma-ios"
|
|
106
|
-
|
|
107
|
-
echo ""
|
|
108
|
-
echo "→ 3. figma-android SKILL.md files stamp platform: android"
|
|
109
|
-
while IFS= read -r -d '' f; do
|
|
110
|
-
base=$(dirname "$f" | xargs basename)
|
|
111
|
-
if head -n 1 "$f" | grep -Fxq -- "---"; then
|
|
112
|
-
if awk '/^---$/{c++; next} c==1' "$f" | grep -Fq "platform: android"; then
|
|
113
|
-
pass "$base stamps platform: android"
|
|
114
|
-
else
|
|
115
|
-
fail "$base missing 'platform: android' stamp"
|
|
116
|
-
fi
|
|
117
|
-
fi
|
|
118
|
-
done < <(find "$ANDROID_DIR" -maxdepth 2 -name SKILL.md -print0)
|
|
119
|
-
|
|
120
|
-
echo ""
|
|
121
|
-
echo "→ 4. figma-ios SKILL.md files do NOT claim platform: android (only ios or none)"
|
|
122
|
-
while IFS= read -r -d '' f; do
|
|
123
|
-
if awk '/^---$/{c++; next} c==1' "$f" | grep -Fq "platform: android"; then
|
|
124
|
-
fail "$(dirname "$f" | xargs basename) claims platform: android but lives under figma-ios/"
|
|
125
|
-
fi
|
|
126
|
-
done < <(find "$IOS_DIR" -maxdepth 2 -name SKILL.md -print0)
|
|
127
|
-
pass "no cross-platform stamp leakage in figma-ios/"
|
|
128
|
-
|
|
129
|
-
echo ""
|
|
130
|
-
echo "→ 5. No orphaned figma-android directories (contract-table inventory)"
|
|
131
|
-
EXPECTED_ANDROID=("${PLATFORM_SPECIFIC[@]}")
|
|
132
|
-
ORPHANS=0
|
|
133
|
-
for d in "$ANDROID_DIR"/*/; do
|
|
134
|
-
[ -d "$d" ] || continue
|
|
135
|
-
name=$(basename "$d")
|
|
136
|
-
case " ${EXPECTED_ANDROID[*]} " in
|
|
137
|
-
*" $name "*) ;;
|
|
138
|
-
*) fail "unexpected dir: figma-android/$name (not in contract)"; ORPHANS=$((ORPHANS+1)) ;;
|
|
139
|
-
esac
|
|
140
|
-
done
|
|
141
|
-
[ "$ORPHANS" -eq 0 ] && pass "no orphaned figma-android directories"
|
|
142
|
-
|
|
143
|
-
echo ""
|
|
144
|
-
echo "→ 6. cross-cli-contract.md references both platforms"
|
|
145
|
-
if grep -Fq "pipeline/skills/figma-ios" "$CONTRACT" && grep -Fq "pipeline/skills/figma-android" "$CONTRACT"; then
|
|
146
|
-
pass "contract references figma-ios + figma-android paths"
|
|
147
|
-
else
|
|
148
|
-
fail "contract missing one or both figma platform paths"
|
|
149
|
-
fi
|
|
150
|
-
|
|
151
|
-
echo ""
|
|
152
|
-
echo "→ 7. Contract section 1.1 present (figma subphase skills section)"
|
|
153
|
-
if grep -Fq "1.1 Figma component subphase skills" "$CONTRACT"; then
|
|
154
|
-
pass "section 1.1 heading present"
|
|
155
|
-
else
|
|
156
|
-
fail "section 1.1 heading missing"
|
|
157
|
-
fi
|
|
158
|
-
|
|
159
|
-
echo ""
|
|
160
|
-
echo "→ 8. Contract section 1.2 routing rules present"
|
|
161
|
-
if grep -Fq "1.2 Figma-skill routing from multi-agent" "$CONTRACT"; then
|
|
162
|
-
pass "section 1.2 heading present"
|
|
163
|
-
else
|
|
164
|
-
fail "section 1.2 heading missing"
|
|
165
|
-
fi
|
|
166
|
-
|
|
167
|
-
echo ""
|
|
168
|
-
echo "→ 9. Contract section 1.3 frontmatter requirements present"
|
|
169
|
-
if grep -Fq "1.3 Figma skill frontmatter" "$CONTRACT"; then
|
|
170
|
-
pass "section 1.3 heading present"
|
|
171
|
-
else
|
|
172
|
-
fail "section 1.3 heading missing"
|
|
173
|
-
fi
|
|
174
|
-
|
|
175
|
-
echo ""
|
|
176
|
-
echo "══ figma-cross-cli-inventory smoke: $PASS passed, $FAIL failed ══"
|
|
177
|
-
[ "$FAIL" -eq 0 ]
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# smoke-figma-sync.sh - WS-9 contract for sync-figma-source.sh.
|
|
3
|
-
#
|
|
4
|
-
# Verifies:
|
|
5
|
-
# 1. sync script exists + executable.
|
|
6
|
-
# 2. prefs.schema.json declares global.figmaSource with correct shape.
|
|
7
|
-
# 3. sync script handles missing figmaSource gracefully (exit 0 w/ message).
|
|
8
|
-
# 4. sync script handles missing path file.
|
|
9
|
-
# 5. dry-run mode writes nothing.
|
|
10
|
-
# 6. CHANGELOG note format is correct (includes `### Sync YYYY-MM-DD`).
|
|
11
|
-
# 7. Watermark update logic (lastCommit + lastSyncedAt) runs atomically.
|
|
12
|
-
|
|
13
|
-
set -euo pipefail
|
|
14
|
-
|
|
15
|
-
HERE="$(cd "$(dirname "$0")" && pwd)"
|
|
16
|
-
ROOT="$(cd "$HERE/../.." && pwd)"
|
|
17
|
-
SYNC="$ROOT/pipeline/scripts/sync-figma-source.sh"
|
|
18
|
-
SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
|
|
19
|
-
TMP="$(mktemp -d -t figma-sync-smoke-XXXX)"
|
|
20
|
-
trap 'rm -rf "$TMP"' EXIT
|
|
21
|
-
|
|
22
|
-
PASS=0
|
|
23
|
-
FAIL=0
|
|
24
|
-
pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
|
|
25
|
-
fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
|
|
26
|
-
|
|
27
|
-
need() { command -v "$1" >/dev/null 2>&1 || { echo "error: $1 required" >&2; exit 127; }; }
|
|
28
|
-
need jq
|
|
29
|
-
need git
|
|
30
|
-
|
|
31
|
-
[ -x "$SYNC" ] && pass "sync script exists and is executable" || fail "sync script not executable at $SYNC"
|
|
32
|
-
|
|
33
|
-
echo ""
|
|
34
|
-
echo "→ 2. prefs schema declares global.figmaSource with correct shape"
|
|
35
|
-
for field in path branch lastSyncedAt lastCommit; do
|
|
36
|
-
if jq -e ".properties.global.properties.figmaSource.properties.$field" "$SCHEMA" >/dev/null 2>&1; then
|
|
37
|
-
pass "figmaSource.$field declared"
|
|
38
|
-
else
|
|
39
|
-
fail "figmaSource.$field missing from schema"
|
|
40
|
-
fi
|
|
41
|
-
done
|
|
42
|
-
|
|
43
|
-
echo ""
|
|
44
|
-
echo "→ 3. missing figmaSource → exit 0 with skip message"
|
|
45
|
-
cat > "$TMP/prefs-no-source.json" <<'EOF'
|
|
46
|
-
{ "schemaVersion": "2.1.0", "global": {}, "projects": {} }
|
|
47
|
-
EOF
|
|
48
|
-
OUT=$(MULTI_AGENT_PREFS="$TMP/prefs-no-source.json" bash "$SYNC" 2>&1)
|
|
49
|
-
RC=$?
|
|
50
|
-
if [ "$RC" -eq 0 ] && echo "$OUT" | grep -Fq "figmaSource not configured"; then
|
|
51
|
-
pass "gracefully handles missing figmaSource"
|
|
52
|
-
else
|
|
53
|
-
fail "did not skip cleanly (rc=$RC, out: $OUT)"
|
|
54
|
-
fi
|
|
55
|
-
|
|
56
|
-
echo ""
|
|
57
|
-
echo "→ 4. figmaSource.path missing on disk → exit 1 with error"
|
|
58
|
-
cat > "$TMP/prefs-bad-path.json" <<EOF
|
|
59
|
-
{ "schemaVersion": "2.1.0", "global": { "figmaSource": { "path": "$TMP/does-not-exist", "branch": "develop" } }, "projects": {} }
|
|
60
|
-
EOF
|
|
61
|
-
set +e
|
|
62
|
-
OUT=$(MULTI_AGENT_PREFS="$TMP/prefs-bad-path.json" bash "$SYNC" 2>&1)
|
|
63
|
-
RC=$?
|
|
64
|
-
set -e
|
|
65
|
-
if [ "$RC" -ne 0 ] && echo "$OUT" | grep -Fq "does not exist"; then
|
|
66
|
-
pass "errors cleanly on missing path"
|
|
67
|
-
else
|
|
68
|
-
fail "did not error on missing path (rc=$RC)"
|
|
69
|
-
fi
|
|
70
|
-
|
|
71
|
-
echo ""
|
|
72
|
-
echo "→ 5. dry-run mode does not mutate prefs"
|
|
73
|
-
# Build a tiny fake source with .instructions/figma/sample/SKILL.md
|
|
74
|
-
FAKE_SRC="$TMP/fake-src"
|
|
75
|
-
mkdir -p "$FAKE_SRC/.instructions/figma/sample" "$FAKE_SRC/.claude/skills/sample"
|
|
76
|
-
cat > "$FAKE_SRC/.instructions/figma/sample/SKILL.md" <<'EOF'
|
|
77
|
-
---
|
|
78
|
-
name: sample
|
|
79
|
-
description: smoke fixture
|
|
80
|
-
---
|
|
81
|
-
# sample
|
|
82
|
-
EOF
|
|
83
|
-
cat > "$FAKE_SRC/.claude/skills/sample/SKILL.md" <<'EOF'
|
|
84
|
-
---
|
|
85
|
-
name: sample
|
|
86
|
-
description: smoke stub
|
|
87
|
-
---
|
|
88
|
-
# sample stub
|
|
89
|
-
EOF
|
|
90
|
-
(cd "$FAKE_SRC" && git init -q && git -c user.email=t@t -c user.name=t add . && git -c user.email=t@t -c user.name=t commit -q -m init)
|
|
91
|
-
PREFS_BEFORE="$TMP/prefs-dry.json"
|
|
92
|
-
cat > "$PREFS_BEFORE" <<EOF
|
|
93
|
-
{ "schemaVersion": "2.1.0", "global": { "figmaSource": { "path": "$FAKE_SRC", "branch": "main" } }, "projects": {} }
|
|
94
|
-
EOF
|
|
95
|
-
CHECKSUM_BEFORE=$(jq -c '.' "$PREFS_BEFORE" | shasum | awk '{print $1}')
|
|
96
|
-
MULTI_AGENT_PREFS="$PREFS_BEFORE" bash "$SYNC" --dry-run >/dev/null 2>&1 || true
|
|
97
|
-
CHECKSUM_AFTER=$(jq -c '.' "$PREFS_BEFORE" | shasum | awk '{print $1}')
|
|
98
|
-
[ "$CHECKSUM_BEFORE" = "$CHECKSUM_AFTER" ] && pass "dry-run leaves prefs untouched" || fail "dry-run mutated prefs"
|
|
99
|
-
|
|
100
|
-
echo ""
|
|
101
|
-
echo "→ 6. CHANGELOG heading pattern used by sync (grep shape)"
|
|
102
|
-
if grep -Fq '### Sync $(date' "$SYNC" || grep -Eq '### Sync \$\(date' "$SYNC"; then
|
|
103
|
-
pass "sync emits '### Sync YYYY-MM-DD' heading"
|
|
104
|
-
else
|
|
105
|
-
fail "sync script does not emit the canonical CHANGELOG heading"
|
|
106
|
-
fi
|
|
107
|
-
|
|
108
|
-
echo ""
|
|
109
|
-
echo "→ 7. Watermark update uses atomic rename"
|
|
110
|
-
if grep -Fq "mv \"\$TMP\" \"\$PREFS_FILE\"" "$SYNC"; then
|
|
111
|
-
pass "atomic rename on prefs update"
|
|
112
|
-
else
|
|
113
|
-
fail "no atomic rename in sync script"
|
|
114
|
-
fi
|
|
115
|
-
|
|
116
|
-
echo ""
|
|
117
|
-
echo "→ 8. --force-full flag is recognised"
|
|
118
|
-
if grep -Fq -- "--force-full" "$SYNC"; then
|
|
119
|
-
pass "force-full flag supported"
|
|
120
|
-
else
|
|
121
|
-
fail "force-full flag missing"
|
|
122
|
-
fi
|
|
123
|
-
|
|
124
|
-
echo ""
|
|
125
|
-
echo "→ 9. --plan flag writes a structured JSON plan artifact"
|
|
126
|
-
if grep -Fq -- "--plan" "$SYNC"; then
|
|
127
|
-
pass "plan flag recognised"
|
|
128
|
-
else
|
|
129
|
-
fail "plan flag missing"
|
|
130
|
-
fi
|
|
131
|
-
if grep -Fq ".last-figma-sync-plan.json" "$SYNC"; then
|
|
132
|
-
pass "plan writes to .last-figma-sync-plan.json"
|
|
133
|
-
else
|
|
134
|
-
fail "plan output path missing"
|
|
135
|
-
fi
|
|
136
|
-
if grep -Fq "overlaySkip" "$SYNC"; then
|
|
137
|
-
pass "plan records overlay-skip per skill"
|
|
138
|
-
else
|
|
139
|
-
fail "plan does not record overlaySkip"
|
|
140
|
-
fi
|
|
141
|
-
if grep -Fq "tree" "$SYNC" && grep -Fq "figma-ios" "$SYNC" && grep -Fq "figma-common" "$SYNC"; then
|
|
142
|
-
pass "plan records destination tree (figma-ios vs figma-common)"
|
|
143
|
-
else
|
|
144
|
-
fail "plan missing tree routing info"
|
|
145
|
-
fi
|
|
146
|
-
|
|
147
|
-
echo ""
|
|
148
|
-
echo "══ figma-sync smoke: $PASS passed, $FAIL failed ══"
|
|
149
|
-
[ "$FAIL" -eq 0 ]
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# smoke-sync-delegation.sh - WS-9b contract.
|
|
3
|
-
#
|
|
4
|
-
# Verifies /multi-agent:sync (sync.md) documents the Step 0 delegation
|
|
5
|
-
# to sync-figma-source.sh when figmaSource is configured.
|
|
6
|
-
|
|
7
|
-
set -euo pipefail
|
|
8
|
-
|
|
9
|
-
HERE="$(cd "$(dirname "$0")" && pwd)"
|
|
10
|
-
ROOT="$(cd "$HERE/../.." && pwd)"
|
|
11
|
-
SYNC_DOC="$ROOT/pipeline/commands/multi-agent/sync.md"
|
|
12
|
-
SYNC_SCRIPT="$ROOT/pipeline/scripts/sync-figma-source.sh"
|
|
13
|
-
|
|
14
|
-
PASS=0
|
|
15
|
-
FAIL=0
|
|
16
|
-
pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
|
|
17
|
-
fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
|
|
18
|
-
|
|
19
|
-
[ -f "$SYNC_DOC" ] || { echo "error: sync.md missing" >&2; exit 1; }
|
|
20
|
-
[ -x "$SYNC_SCRIPT" ] || { echo "error: sync-figma-source.sh missing or not executable" >&2; exit 1; }
|
|
21
|
-
|
|
22
|
-
echo "→ 1. sync.md lists figma source as Step 0"
|
|
23
|
-
if grep -Fq "Step 0: FIGMA_SYNC" "$SYNC_DOC" || grep -Fq "FIGMA_SYNC" "$SYNC_DOC"; then
|
|
24
|
-
pass "Step 0 entry present"
|
|
25
|
-
else
|
|
26
|
-
fail "Step 0 FIGMA_SYNC entry missing"
|
|
27
|
-
fi
|
|
28
|
-
|
|
29
|
-
echo ""
|
|
30
|
-
echo "→ 2. sync.md references sync-figma-source.sh by path"
|
|
31
|
-
if grep -Fq "pipeline/scripts/sync-figma-source.sh" "$SYNC_DOC"; then
|
|
32
|
-
pass "sync script path referenced"
|
|
33
|
-
else
|
|
34
|
-
fail "sync script path missing from sync.md"
|
|
35
|
-
fi
|
|
36
|
-
|
|
37
|
-
echo ""
|
|
38
|
-
echo "→ 3. sync.md documents the figmaSource preference gate"
|
|
39
|
-
if grep -Fq "figmaSource.path" "$SYNC_DOC" || grep -Fq "figmaSource" "$SYNC_DOC"; then
|
|
40
|
-
pass "figmaSource pref gate documented"
|
|
41
|
-
else
|
|
42
|
-
fail "figmaSource pref gate missing"
|
|
43
|
-
fi
|
|
44
|
-
|
|
45
|
-
echo ""
|
|
46
|
-
echo "→ 4. sync.md notes skip behavior when figmaSource unset"
|
|
47
|
-
if grep -qi "skip" "$SYNC_DOC" && grep -Fq "figmaSource" "$SYNC_DOC"; then
|
|
48
|
-
pass "skip-when-unset documented"
|
|
49
|
-
else
|
|
50
|
-
fail "skip behavior not documented"
|
|
51
|
-
fi
|
|
52
|
-
|
|
53
|
-
echo ""
|
|
54
|
-
echo "→ 5. sync.md mentions local-overlay marker (preservation)"
|
|
55
|
-
if grep -Fq "local-overlay" "$SYNC_DOC"; then
|
|
56
|
-
pass "local-overlay preservation documented"
|
|
57
|
-
else
|
|
58
|
-
fail "local-overlay preservation missing"
|
|
59
|
-
fi
|
|
60
|
-
|
|
61
|
-
echo ""
|
|
62
|
-
echo "→ 6. sync.md puts FIGMA_SYNC BEFORE Step 1 (DETECT)"
|
|
63
|
-
# Regex: FIGMA_SYNC line must appear before DETECT line
|
|
64
|
-
FIGMA_LINE=$(grep -n "FIGMA_SYNC" "$SYNC_DOC" | head -1 | cut -d: -f1)
|
|
65
|
-
DETECT_LINE=$(grep -nE "Step 1(\.[0-9]+)?: DETECT" "$SYNC_DOC" | head -1 | cut -d: -f1)
|
|
66
|
-
if [ -n "$FIGMA_LINE" ] && [ -n "$DETECT_LINE" ] && [ "$FIGMA_LINE" -lt "$DETECT_LINE" ]; then
|
|
67
|
-
pass "FIGMA_SYNC precedes DETECT in step order"
|
|
68
|
-
else
|
|
69
|
-
fail "FIGMA_SYNC must precede DETECT (got FIGMA=$FIGMA_LINE DETECT=$DETECT_LINE)"
|
|
70
|
-
fi
|
|
71
|
-
|
|
72
|
-
echo ""
|
|
73
|
-
echo "══ sync-delegation smoke: $PASS passed, $FAIL failed ══"
|
|
74
|
-
[ "$FAIL" -eq 0 ]
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# figma-android - Android Platform Skills
|
|
2
|
-
|
|
3
|
-
Platform peer to `pipeline/skills/figma-ios/`.
|
|
4
|
-
|
|
5
|
-
## What lives here
|
|
6
|
-
|
|
7
|
-
Platform-specific skills for generating Jetpack Compose components from Figma designs:
|
|
8
|
-
|
|
9
|
-
| Skill | Subphase | Sibling in figma-ios |
|
|
10
|
-
|---|---|---|
|
|
11
|
-
| `figma-to-component` | Orchestrator (3.0 - 3.8) | `figma-ios/figma-to-component` |
|
|
12
|
-
| `figma-component-implement` | 3.4 (code gen: Compose) | `figma-ios/figma-component-implement` |
|
|
13
|
-
| `figma-component-test` | 3.5 (Compose Testing + Paparazzi) | `figma-ios/figma-component-test` |
|
|
14
|
-
| `figma-component-code-connect` | 3.6 (Code Connect for Compose) | `figma-ios/figma-component-code-connect` |
|
|
15
|
-
| `figma-component-wiki` | 3.7 (wiki - platform-aware rendering) | `figma-ios/figma-component-wiki` |
|
|
16
|
-
|
|
17
|
-
## What's NOT here (yet)
|
|
18
|
-
|
|
19
|
-
The platform-**agnostic** skills - `figma-commit`, `figma-iterate`, `figma-issue`, `figma-review`, `figma-setup`, `figma-validate`, `figma-utility`, `figma-fix`, `figma-mend`, `figma-evolve-component`, `figma-ui-patterns`, `figma-form-integration`, `figma-price-integration`, `figma-navigation`, `figma-overlays`, `figma-bottom-sheets`, `figma-remote-mcp-auth`, `figma-cli-*`, `performance-*`, etc. - live under [`pipeline/skills/figma-common/`](../figma-common/) (WS-7b ✓). Both iOS and Android orchestrators dispatch there without duplication.
|
|
20
|
-
|
|
21
|
-
The cross-cutting **integration adapters** (`figma-form-integration`, `figma-price-integration`, `figma-navigation`, `figma-overlays`, `figma-bottom-sheets`) carry both an iOS (SwiftUI) and an Android (Jetpack Compose) section - the Android orchestrator uses the Compose section; the same emit-intent / caller-owns rules and the `figma-config` `ui.*` hooks apply on both platforms.
|
|
22
|
-
|
|
23
|
-
## Routing
|
|
24
|
-
|
|
25
|
-
Multi-agent Phase 3 reads `figmaConfig.project.platform`:
|
|
26
|
-
|
|
27
|
-
- `"ios"` → dispatches to `figma-ios/figma-to-component`
|
|
28
|
-
- `"android"` → dispatches to `figma-android/figma-to-component` (this directory)
|
|
29
|
-
|
|
30
|
-
See `pipeline/commands/multi-agent/refs/component-dispatch.md` for the full contract.
|
|
31
|
-
|
|
32
|
-
## Build target
|
|
33
|
-
|
|
34
|
-
Android orchestrator expects `figmaConfig.build.gradleModule` to be set (e.g. `:components:button`). Missing → halt with a clear error. See `pipeline/schemas/figma-project-config.schema.json` v2.0.0 for the full `build` shape.
|
|
35
|
-
|
|
36
|
-
## Status
|
|
37
|
-
|
|
38
|
-
All five skills stamped `status: wip-v5` - contracts + skeleton in place, not yet validated against a real Android project. Fill in the reference implementation detail as a downstream integration lands (follow-up issues will be opened per skill).
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-component-code-connect
|
|
3
|
-
description: Generate Code Connect for Compose mappings - {Name}.figma.kt registers the composable with Figma's Code Connect so designers see live code snippets for each variant. Android peer to pipeline/skills/figma-ios/figma-component-code-connect.
|
|
4
|
-
user-invocable: true
|
|
5
|
-
argument-hint: <component-name>
|
|
6
|
-
allowed-tools: Read, Write, Edit, Glob, Grep, Bash
|
|
7
|
-
status: wip-v5
|
|
8
|
-
sourced-from: derived-from/figma-ios/figma-component-code-connect
|
|
9
|
-
platform: android
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# figma-component-code-connect - Code Connect for Compose
|
|
13
|
-
|
|
14
|
-
> **WS-7 v5.0.0** - Subphase 3.6 for Android. Generates `{Name}.figma.kt` so Figma's Dev Mode shows Compose usage for every variant of the component, classified by the Figma variant properties read in subphase 3.1.
|
|
15
|
-
|
|
16
|
-
## Output
|
|
17
|
-
|
|
18
|
-
`{Name}.figma.kt` beside the composable:
|
|
19
|
-
|
|
20
|
-
```kotlin
|
|
21
|
-
@FigmaConnect("https://www.figma.com/design/abc/?node-id=123-456")
|
|
22
|
-
class ButtonPrimaryFigmaConnect {
|
|
23
|
-
@FigmaProperty.Boolean("Enabled") var enabled: Boolean = true
|
|
24
|
-
@FigmaProperty.Enum("Style", mapping = [
|
|
25
|
-
"Primary" to ButtonStyle.Primary,
|
|
26
|
-
"Secondary" to ButtonStyle.Secondary,
|
|
27
|
-
"Ghost" to ButtonStyle.Ghost,
|
|
28
|
-
])
|
|
29
|
-
var style: ButtonStyle = ButtonStyle.Primary
|
|
30
|
-
|
|
31
|
-
@FigmaProperty.Text("Title") var title: String = ""
|
|
32
|
-
|
|
33
|
-
@Composable
|
|
34
|
-
fun Example() {
|
|
35
|
-
ButtonPrimary(
|
|
36
|
-
ButtonPrimaryConfiguration()
|
|
37
|
-
.title(title)
|
|
38
|
-
.style(style)
|
|
39
|
-
.enabled(enabled)
|
|
40
|
-
)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Variant property names come from the Figma node (fetched in 3.1). Mapping tables translate Figma's "Primary"/"Secondary" strings to the Compose `ButtonStyle` enum.
|
|
46
|
-
|
|
47
|
-
## Publish
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
figma code-connect publish --type kotlin --dir ${module-path}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Requires `figma-cli` with a valid PAT (resolved via `keychainMapping.figma`). Token missing → Token Save Flow. Publish failure → halt + error.
|
|
54
|
-
|
|
55
|
-
## Failure handling
|
|
56
|
-
|
|
57
|
-
- Figma property does not map cleanly to an enum → halt with an actionable message listing the unmapped variants; no partial publish.
|
|
58
|
-
- Composable signature changed between 3.4 and 3.6 → auto-fix the `Example()` body from the current Configuration.
|
|
59
|
-
|
|
60
|
-
## Cross-CLI parity
|
|
61
|
-
|
|
62
|
-
iOS and Android Code Connect skills emit identical progress lines, publish via the same `figma code-connect publish` CLI, and halt on variant mapping ambiguity the same way. `smoke-figma-android-parity.sh` asserts skill inventory match.
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-component-implement
|
|
3
|
-
description: Generate a Jetpack Compose component (Configuration data class + Composable + Modifier extensions + Preview + README) from gathered Figma data. Android peer to pipeline/skills/figma-ios/figma-component-implement.
|
|
4
|
-
user-invocable: true
|
|
5
|
-
argument-hint: <figma-url> | <component-name>
|
|
6
|
-
allowed-tools: Read, Write, Edit, Glob, Grep, Bash
|
|
7
|
-
status: wip-v5
|
|
8
|
-
sourced-from: derived-from/figma-ios/figma-component-implement
|
|
9
|
-
platform: android
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# figma-component-implement - Compose Code Generation
|
|
13
|
-
|
|
14
|
-
> **WS-7 v5.0.0** - Called by the Android `figma-to-component` orchestrator during subphase 3.4. Reads `agent-state.json.phases["3"].subphases["3.1-gather"]` for the fetched Figma tree + token map and writes Kotlin + Compose artefacts.
|
|
15
|
-
|
|
16
|
-
## Inputs
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
{
|
|
20
|
-
componentName: "ButtonPrimary", // PascalCase from registry
|
|
21
|
-
componentPath: "components/Button/ButtonPrimary",
|
|
22
|
-
figmaTree: <node object>, // from 3.1-gather
|
|
23
|
-
tokenMap: <Figma → token symbol map>, // from 3.3-token-mapping
|
|
24
|
-
testingIds: <semantic IDs>, // from 3.2a
|
|
25
|
-
localization: <strings map>, // from 3.2b
|
|
26
|
-
accessibility: <a11y metadata>, // from 3.2c
|
|
27
|
-
analytics: <events>, // from 3.2d
|
|
28
|
-
figmaConfig: <figma-project-config v2.0.0>,
|
|
29
|
-
agentState: <path>, // for progress emission + subphase record
|
|
30
|
-
dev: boolean // --dev elides some steps (see below)
|
|
31
|
-
}
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Outputs
|
|
35
|
-
|
|
36
|
-
Four Kotlin files beside the component's package, plus a README:
|
|
37
|
-
|
|
38
|
-
### 1. `{Name}Configuration.kt`
|
|
39
|
-
|
|
40
|
-
Pure data class. Every variable knob lives here - the composable itself holds no state beyond its `Configuration` parameter. Marked `@Immutable` so Compose can skip recomposition when the instance is `equals`:
|
|
41
|
-
|
|
42
|
-
```kotlin
|
|
43
|
-
@Immutable
|
|
44
|
-
data class ButtonPrimaryConfiguration(
|
|
45
|
-
val title: String = "",
|
|
46
|
-
val style: ButtonStyle = ButtonStyle.Primary,
|
|
47
|
-
val isEnabled: Boolean = true,
|
|
48
|
-
val onClick: () -> Unit = {}
|
|
49
|
-
) {
|
|
50
|
-
enum class ButtonStyle { Primary, Secondary, Ghost }
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
Rules:
|
|
55
|
-
|
|
56
|
-
- `@Immutable` OR `@Stable` - never raw. `@Immutable` when all properties are primitives / immutable; `@Stable` when you guarantee structural stability.
|
|
57
|
-
- Default values for every property so call sites can use `copy()` idiomatically (fluent-API equivalent).
|
|
58
|
-
- Callbacks typed as named function types (`val onClick: () -> Unit = {}`) - never `Any?`.
|
|
59
|
-
- Enums inside the Configuration's companion or nested scope - mirrors SwiftUI Configuration style.
|
|
60
|
-
|
|
61
|
-
### 2. `{Name}.kt` (the composable)
|
|
62
|
-
|
|
63
|
-
```kotlin
|
|
64
|
-
@Composable
|
|
65
|
-
fun ButtonPrimary(
|
|
66
|
-
configuration: ButtonPrimaryConfiguration,
|
|
67
|
-
modifier: Modifier = Modifier,
|
|
68
|
-
) {
|
|
69
|
-
val shape = MaterialTheme.customShapes.mediumRadius
|
|
70
|
-
Surface(
|
|
71
|
-
modifier = modifier.semantics {
|
|
72
|
-
testTag = TestingIdentifiers.buttonPrimary
|
|
73
|
-
contentDescription = stringResource(R.string.btn_primary_a11y)
|
|
74
|
-
},
|
|
75
|
-
shape = shape,
|
|
76
|
-
color = MaterialTheme.colorScheme.primary,
|
|
77
|
-
) {
|
|
78
|
-
// body uses ONLY configuration + MaterialTheme tokens
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
Rules:
|
|
84
|
-
|
|
85
|
-
- Signature is always `(configuration: XConfiguration, modifier: Modifier = Modifier)`. The `modifier` param is the caller's slot; nothing else.
|
|
86
|
-
- `testTag` from `testingIds`; `contentDescription` from `accessibility.label` or `stringResource(R.string...)`.
|
|
87
|
-
- No hardcoded `dp` / `Color(0xFF...)` / `TextStyle(...)` - every value reads from `MaterialTheme.*` or the project's theme extension.
|
|
88
|
-
- No `LaunchedEffect` / `rememberCoroutineScope` for stateful behaviour - keep the composable pure. If async is needed, surface it via Configuration callbacks (the caller orchestrates).
|
|
89
|
-
|
|
90
|
-
### 3. `{Name}Modifiers.kt`
|
|
91
|
-
|
|
92
|
-
Fluent modifier-style helpers. Android idiom: extension functions on the Configuration type:
|
|
93
|
-
|
|
94
|
-
```kotlin
|
|
95
|
-
fun ButtonPrimaryConfiguration.title(value: String) = copy(title = value)
|
|
96
|
-
fun ButtonPrimaryConfiguration.style(value: ButtonStyle) = copy(style = value)
|
|
97
|
-
fun ButtonPrimaryConfiguration.enabled(value: Boolean = true) = copy(isEnabled = value)
|
|
98
|
-
fun ButtonPrimaryConfiguration.onClick(block: () -> Unit) = copy(onClick = block)
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Call sites read fluently:
|
|
102
|
-
|
|
103
|
-
```kotlin
|
|
104
|
-
ButtonPrimary(
|
|
105
|
-
ButtonPrimaryConfiguration()
|
|
106
|
-
.title("Save")
|
|
107
|
-
.style(.Secondary)
|
|
108
|
-
.onClick { viewModel.save() }
|
|
109
|
-
)
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### 4. `{Name}Preview.kt`
|
|
113
|
-
|
|
114
|
-
`@Preview` covering meaningful variants. At minimum:
|
|
115
|
-
|
|
116
|
-
```kotlin
|
|
117
|
-
@Preview(name = "default", showBackground = true)
|
|
118
|
-
@Preview(name = "dark", showBackground = true, uiMode = UI_MODE_NIGHT_YES)
|
|
119
|
-
@Preview(name = "rtl", showBackground = true, locale = "ar")
|
|
120
|
-
@Preview(name = "fontScale",showBackground = true, fontScale = 1.5f)
|
|
121
|
-
@Composable
|
|
122
|
-
private fun ButtonPrimaryPreview() {
|
|
123
|
-
AppTheme { ButtonPrimary(ButtonPrimaryConfiguration().title("Save")) }
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
`--dev` may emit only `default` + `dark` previews; full set lands in non-dev runs.
|
|
128
|
-
|
|
129
|
-
### 5. `README.md`
|
|
130
|
-
|
|
131
|
-
Variant matrix + usage example. Format mirrors the iOS peer's `FIGMA.md` so wiki generators can read both without code branches.
|
|
132
|
-
|
|
133
|
-
## Progress emission
|
|
134
|
-
|
|
135
|
-
Per the WS-11 contract, emit the following inline before each write:
|
|
136
|
-
|
|
137
|
-
```
|
|
138
|
-
→ writing Configuration {Name}Configuration.kt
|
|
139
|
-
→ writing Composable {Name}.kt
|
|
140
|
-
→ writing Modifiers {Name}Modifiers.kt
|
|
141
|
-
→ writing Preview {Name}Preview.kt
|
|
142
|
-
→ writing README.md
|
|
143
|
-
→ running gradle compileDebugKotlin (verification)
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
## Build verification
|
|
147
|
-
|
|
148
|
-
After writing, run (with the build-queue lock from `refs/phases/operations.md`):
|
|
149
|
-
|
|
150
|
-
```bash
|
|
151
|
-
./gradlew :${module}:compileDebugKotlin --console=plain
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
Compile errors → up to 3 auto-fix cycles via Sonnet (iOS peer allows the same). Still failing → halt and surface via `state.phases["3"].errors[]`.
|
|
155
|
-
|
|
156
|
-
## Cross-CLI parity
|
|
157
|
-
|
|
158
|
-
The iOS and Android implement skills emit identical progress-line shapes and write the same 5-file set (Configuration + Component + Modifiers + Preview + README), just in the target language. `smoke-figma-android-parity.sh` asserts that every iOS implement output has an Android peer file name.
|