@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,120 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-component-test
|
|
3
|
-
description: Generate Compose Testing + Paparazzi/Roborazzi snapshot + unit tests for a Jetpack Compose component. Android peer to pipeline/skills/figma-ios/figma-component-test.
|
|
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-test
|
|
9
|
-
platform: android
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# figma-component-test - Compose Test Suite
|
|
13
|
-
|
|
14
|
-
> **WS-7 v5.0.0** - Subphase 3.5 for Android. Three-layer test strategy mirroring the iOS peer (ViewInspector → Compose Testing, Snapshot → Paparazzi/Roborazzi, Unit → JUnit).
|
|
15
|
-
|
|
16
|
-
## Three-layer strategy (Android)
|
|
17
|
-
|
|
18
|
-
| Layer | Tool | What it verifies |
|
|
19
|
-
|---|---|---|
|
|
20
|
-
| **Structural** | Compose Testing (`createComposeRule()`) | Semantic tree, node existence, applied modifiers, click + input actions |
|
|
21
|
-
| **Visual** | Paparazzi (JVM) or Roborazzi | Pixel-accurate render: light/dark, LTR/RTL, multi-density, multi-fontScale |
|
|
22
|
-
| **Behavioural** | JUnit + Turbine | State changes, callback invocation, configuration copy semantics |
|
|
23
|
-
|
|
24
|
-
The orchestrator picks Paparazzi by default (JVM-side, fast). Override by setting `figmaConfig.build.snapshotEngine = "roborazzi"` when the project already wires Robolectric.
|
|
25
|
-
|
|
26
|
-
## Generated files
|
|
27
|
-
|
|
28
|
-
### 1. `{Name}ComposeTest.kt` (structural)
|
|
29
|
-
|
|
30
|
-
```kotlin
|
|
31
|
-
class ButtonPrimaryComposeTest {
|
|
32
|
-
@get:Rule val composeRule = createComposeRule()
|
|
33
|
-
|
|
34
|
-
@Test
|
|
35
|
-
fun default_config_renders_title_and_is_clickable() {
|
|
36
|
-
var clicked = false
|
|
37
|
-
composeRule.setContent {
|
|
38
|
-
AppTheme {
|
|
39
|
-
ButtonPrimary(
|
|
40
|
-
ButtonPrimaryConfiguration()
|
|
41
|
-
.title("Save")
|
|
42
|
-
.onClick { clicked = true }
|
|
43
|
-
)
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
composeRule.onNodeWithText("Save")
|
|
48
|
-
.assertIsDisplayed()
|
|
49
|
-
.assertHasClickAction()
|
|
50
|
-
.performClick()
|
|
51
|
-
|
|
52
|
-
assertThat(clicked).isTrue()
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
@Test
|
|
56
|
-
fun disabled_state_is_not_clickable() {
|
|
57
|
-
// ... covers isEnabled=false path
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
Rules:
|
|
63
|
-
- Prefer `onNodeWithTag(TestingIdentifiers.buttonPrimary)` over `onNodeWithText` when the text is localised.
|
|
64
|
-
- Every interactive state (enabled, disabled, loading) gets a test.
|
|
65
|
-
- No `Thread.sleep` - use `composeRule.waitUntil { ... }` or `runTest` for coroutine flows.
|
|
66
|
-
|
|
67
|
-
### 2. `{Name}SnapshotTest.kt` (visual)
|
|
68
|
-
|
|
69
|
-
Paparazzi variant:
|
|
70
|
-
|
|
71
|
-
```kotlin
|
|
72
|
-
class ButtonPrimarySnapshotTest {
|
|
73
|
-
@get:Rule val paparazzi = Paparazzi(
|
|
74
|
-
deviceConfig = DeviceConfig.PIXEL_6,
|
|
75
|
-
theme = "AppTheme",
|
|
76
|
-
renderingMode = SessionParams.RenderingMode.SHRINK
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
@Test fun primary_light() { paparazzi.snapshot { variant(ButtonStyle.Primary, dark = false) } }
|
|
80
|
-
@Test fun primary_dark() { paparazzi.snapshot { variant(ButtonStyle.Primary, dark = true) } }
|
|
81
|
-
@Test fun secondary_rtl() { paparazzi.snapshot { variant(ButtonStyle.Secondary, rtl = true) } }
|
|
82
|
-
@Test fun fontScale_large() { paparazzi.snapshot { variant(ButtonStyle.Primary, fontScale = 1.5f) } }
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
Minimum matrix: primary × (light, dark) × (LTR, RTL) × (default, large fontScale) = 8 snapshots per component. `--dev` elides fontScale row.
|
|
87
|
-
|
|
88
|
-
### 3. `{Name}ConfigurationTest.kt` (unit)
|
|
89
|
-
|
|
90
|
-
```kotlin
|
|
91
|
-
class ButtonPrimaryConfigurationTest {
|
|
92
|
-
@Test fun copy_preserves_unchanged_fields() {
|
|
93
|
-
val base = ButtonPrimaryConfiguration().title("A").style(ButtonStyle.Primary)
|
|
94
|
-
val changed = base.title("B")
|
|
95
|
-
assertThat(changed.title).isEqualTo("B")
|
|
96
|
-
assertThat(changed.style).isEqualTo(base.style)
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Covers: fluent modifier semantics, default values, enum exhaustiveness.
|
|
102
|
-
|
|
103
|
-
## Build + run
|
|
104
|
-
|
|
105
|
-
```bash
|
|
106
|
-
# JVM side (Paparazzi + Configuration unit tests)
|
|
107
|
-
./gradlew :${module}:testDebugUnitTest --console=plain
|
|
108
|
-
|
|
109
|
-
# Instrumented side (Compose Testing)
|
|
110
|
-
./gradlew :${module}:connectedDebugAndroidTest --console=plain
|
|
111
|
-
|
|
112
|
-
# Paparazzi record (only when snapshots are intentionally updated)
|
|
113
|
-
./gradlew :${module}:recordPaparazziDebug
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
On failure - up to 3 auto-fix cycles, then halt.
|
|
117
|
-
|
|
118
|
-
## Cross-CLI parity
|
|
119
|
-
|
|
120
|
-
Both CLIs emit identical progress lines, generate the same 3-file set (compose + snapshot + configuration), and honour `figmaConfig.build.snapshotEngine`. `smoke-figma-android-parity.sh` asserts the inventory match with the iOS peer.
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-component-wiki
|
|
3
|
-
description: Component wiki generation for Android. Dispatches to the same 4-mode adapter set as the iOS peer (submodule / in-repo / github-wiki / separate-repo). Body rendering reads the Kotlin composable + sibling README.md instead of Swift + FIGMA.md.
|
|
4
|
-
user-invocable: true
|
|
5
|
-
argument-hint: <figma-url> | <component-name>
|
|
6
|
-
allowed-tools: Read, Write, Glob, Grep, Bash
|
|
7
|
-
status: wip-v5
|
|
8
|
-
sourced-from: derived-from/figma-ios/figma-component-wiki
|
|
9
|
-
platform: android
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# figma-component-wiki - Component Wiki (Android)
|
|
13
|
-
|
|
14
|
-
> **WS-7 v5.0.0** - Android peer to `pipeline/skills/figma-ios/figma-component-wiki`. Identical dispatch contract (Phase 7 Report Step 2 → `{componentName, componentPath, figmaConfig, agentState}` → `{writtenPaths[], committedSha?, pushedRemote?}`). Identical 4-adapter matrix (submodule / in-repo / github-wiki / separate-repo). Only the markdown rendering differs: reads Kotlin composable signature + sibling `README.md` rather than SwiftUI `+Modifiers.swift` + `FIGMA.md`.
|
|
15
|
-
|
|
16
|
-
See `pipeline/skills/figma-ios/figma-component-wiki/SKILL.md` for the full adapter table and dispatch contract - shared verbatim.
|
|
17
|
-
|
|
18
|
-
## Android-specific rendering notes
|
|
19
|
-
|
|
20
|
-
- Parameter table reads the Composable signature AND the Configuration data class:
|
|
21
|
-
```kotlin
|
|
22
|
-
@Composable fun ButtonPrimary(configuration: ButtonPrimaryConfiguration, modifier: Modifier = Modifier)
|
|
23
|
-
```
|
|
24
|
-
Yields: `configuration: ButtonPrimaryConfiguration`, `modifier: Modifier`. Nested Configuration properties are rendered as a second table (one row per knob).
|
|
25
|
-
- Code examples quote `@Preview` bodies rather than SwiftUI `#Preview` bodies.
|
|
26
|
-
- Design tokens section reads `MaterialTheme.colorScheme.*` + `MaterialTheme.typography.*` references grepped from the composable.
|
|
27
|
-
- Accessibility notes read `.semantics { ... }` blocks instead of `.accessibility*` modifiers.
|
|
28
|
-
|
|
29
|
-
## Python helpers
|
|
30
|
-
|
|
31
|
-
Shared with the iOS peer - same `pipeline/scripts/wiki/sidebar-generator.py` and `pipeline/scripts/wiki/status-page.py` land in WS-5b. The helpers are platform-agnostic (they read component markdown files, not Swift or Kotlin sources).
|
|
32
|
-
|
|
33
|
-
## Cross-CLI parity
|
|
34
|
-
|
|
35
|
-
Byte-identical progress lines, identical adapter dispatch, identical return schema. Wiki layout convergence across iOS and Android is an explicit goal - the same `/components/{Category}/{Name}.md` path structure on every project regardless of platform.
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-to-component
|
|
3
|
-
description: Figma-to-Compose component implementation workflow for Android. Takes a Figma URL and produces a production-ready Jetpack Compose component through the same 8-phase pipeline shape as the iOS peer - data gathering, analysis, code generation, testing, Code Connect, documentation.
|
|
4
|
-
user-invocable: true
|
|
5
|
-
argument-hint: <figma-url> | phase-<N> | status
|
|
6
|
-
allowed-tools: Task, Read, Glob, Grep, Bash, Write, Edit, AskUserQuestion
|
|
7
|
-
status: wip-v5
|
|
8
|
-
sourced-from: derived-from/figma-ios/figma-to-component
|
|
9
|
-
platform: android
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# figma-to-component - Android Orchestrator
|
|
13
|
-
|
|
14
|
-
> **WS-7 v5.0.0** - Platform peer to `pipeline/skills/figma-ios/figma-to-component`. Same 8-phase shape; platform-specific phases (3-Token Mapping, 4-Code Gen, 5-Tests, 6-Code Connect) target Kotlin / Jetpack Compose / Paparazzi / Code Connect for Compose. Common phases (0-Init, 1-Gather, 2A-2D utilities, 7-Wiki, 8-Cleanup) share logic with the iOS peer - implementations stay in this skill for now; a `figma-common/` refactor lands in WS-7b.
|
|
15
|
-
|
|
16
|
-
## Dispatch entry
|
|
17
|
-
|
|
18
|
-
Called from multi-agent Phase 3 when `state.taskType === "component"` AND `figmaConfig.project.platform === "android"`. See `pipeline/commands/multi-agent/refs/component-dispatch.md` for the full dispatch contract shared with the iOS peer (same input/output schema, subphase state shape).
|
|
19
|
-
|
|
20
|
-
## Parameters
|
|
21
|
-
|
|
22
|
-
| Parameter | Required | Description |
|
|
23
|
-
|-----------|----------|-------------|
|
|
24
|
-
| Figma URL | Yes | `https://www.figma.com/design/{fileKey}/...?node-id={nodeId}` |
|
|
25
|
-
| `phase-<N>` | No | Resume a specific subphase instead of running the full chain |
|
|
26
|
-
| `status` | No | Print subphase progress from `state.phases["3"].subphases[]` and exit |
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
/figma-to-component https://www.figma.com/design/abc/?node-id=123-456
|
|
30
|
-
/figma-to-component phase-4a # resume at Kotlin Configuration generation
|
|
31
|
-
/figma-to-component status
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Phase order (Android-flavoured)
|
|
35
|
-
|
|
36
|
-
| # | Phase | Platform-specific? | Notes |
|
|
37
|
-
|---|---|---|---|
|
|
38
|
-
| 3.0 | Init | no | Node-id parse, registry lookup, worktree confirm |
|
|
39
|
-
| 3.1 | Gather | no | Figma API/MCP fetch, design tokens, properties |
|
|
40
|
-
| 3.2a | Testing identifiers | no | Platform-agnostic semantic IDs (shared with iOS) |
|
|
41
|
-
| 3.2b | Localization | no | Shared strings - lands in `{repos.common}` |
|
|
42
|
-
| 3.2c | Accessibility | partial | `contentDescription` / `Role` / `semantics {}` vs SwiftUI's `.accessibility*` - the generator knows both |
|
|
43
|
-
| 3.2d | Analytics | no | Shared analytics keys |
|
|
44
|
-
| 3.3 | Token Mapping | **yes** | Maps Figma tokens → MaterialTheme dimensions / colorScheme / typography; outputs a per-project `DesignTokens.kt` if missing |
|
|
45
|
-
| 3.4a | Configuration | **yes** | `{Name}Configuration.kt` - data class with all properties, marked `@Immutable`/`@Stable` for Compose skippability |
|
|
46
|
-
| 3.4b | View | **yes** | `{Name}Screen.kt` or `{Name}.kt` - `@Composable fun {Name}(configuration: {Name}Configuration, modifier: Modifier = Modifier)` |
|
|
47
|
-
| 3.4c | Docs | no | `README.md` next to the composable |
|
|
48
|
-
| 3.4d | Preview | **yes** | `@Preview` functions covering variants (device, darkMode, RTL, fontScale) |
|
|
49
|
-
| 3.4e | Modifiers | **yes** | Kotlin extension functions on `Modifier` or on the Configuration type - the fluent API the iOS peer expresses as `+Modifiers.swift` |
|
|
50
|
-
| 3.5a | Structural tests | **yes** | `createComposeRule()` + semantic matchers (`onNodeWithText`, `onNodeWithTag`, `onNodeWithContentDescription`) |
|
|
51
|
-
| 3.5b | Snapshot | **yes** | Paparazzi or Roborazzi snapshot tests covering light/dark, LTR/RTL, Dynamic Font Scale |
|
|
52
|
-
| 3.5c | Unit | yes (opt) | Logic-only unit tests; `--dev` may elide |
|
|
53
|
-
| 3.6 | Code Connect | **yes** | Code Connect for Compose - `{Name}.figma.kt` with `@FigmaConnect` variant mappings |
|
|
54
|
-
| 3.7 | Wiki | no | Delegates to `figma-component-wiki` - same 4-mode adapter as iOS |
|
|
55
|
-
| 3.8 | Cleanup | no | Artifact pruning, state finalize |
|
|
56
|
-
|
|
57
|
-
## Delegation graph
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
figma-to-component (this skill)
|
|
61
|
-
├─ phase 3.4 (code gen) → figma-component-implement (Android peer)
|
|
62
|
-
├─ phase 3.5 (tests) → figma-component-test (Android peer)
|
|
63
|
-
├─ phase 3.6 (code connect) → figma-component-code-connect (Android peer)
|
|
64
|
-
└─ phase 3.7 (wiki) → figma-component-wiki (Android peer - mode-aware adapter)
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
The platform-agnostic subphases (3.0-3.3, 3.2a-d, 3.8) use the same logic as the iOS orchestrator - they read `figmaConfig` + Figma API results and write registry entries that don't care about language target. WS-7b extracts those to `pipeline/skills/figma-common/` so both platforms import rather than duplicate.
|
|
68
|
-
|
|
69
|
-
## Build target resolution
|
|
70
|
-
|
|
71
|
-
Reads from `figmaConfig.build`:
|
|
72
|
-
|
|
73
|
-
```json
|
|
74
|
-
{
|
|
75
|
-
"gradleModule": ":components:button",
|
|
76
|
-
"variant": "debug",
|
|
77
|
-
"buildType": "release"
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
Invokes build via:
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
./gradlew :${build.gradleModule//:/}:assembleDebug
|
|
85
|
-
./gradlew :${build.gradleModule//:/}:testDebugUnitTest
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
If `build.gradleModule` is missing, halt with a clear "configure `figmaConfig.build.gradleModule` for Android" message. Do not guess.
|
|
89
|
-
|
|
90
|
-
## Component output locations
|
|
91
|
-
|
|
92
|
-
Default layout - override per project via `figmaConfig.repos` and `figmaConfig.artifactBasePath`:
|
|
93
|
-
|
|
94
|
-
| Artifact | Path |
|
|
95
|
-
|---|---|
|
|
96
|
-
| Composable + Configuration | `{repos.components.path}/src/main/java/.../components/{Category}/{Name}/{Name}.kt` |
|
|
97
|
-
| Modifiers extensions | Same directory as the composable |
|
|
98
|
-
| Unit tests | `{repos.components.path}/src/test/java/.../components/{Category}/{Name}Test.kt` |
|
|
99
|
-
| Instrumented/Compose tests | `{repos.components.path}/src/androidTest/java/.../components/{Category}/{Name}ComposeTest.kt` |
|
|
100
|
-
| Snapshot tests | Beside Compose tests, using Paparazzi's `@get:Rule val paparazzi = Paparazzi(...)` |
|
|
101
|
-
| Code Connect | `{repos.components.path}/src/main/java/.../components/{Category}/{Name}/{Name}.figma.kt` |
|
|
102
|
-
| Component artifacts | `{artifactBasePath}/{Category}/{Name}/` (screenshots, specs - platform-agnostic) |
|
|
103
|
-
|
|
104
|
-
## Design token conventions
|
|
105
|
-
|
|
106
|
-
Tokens for Compose land in `MaterialTheme`:
|
|
107
|
-
|
|
108
|
-
- Spacing → `CustomSpacing` extension on `MaterialTheme` (or vanilla `dp` constants if the project has no theme wrapper)
|
|
109
|
-
- Color → `MaterialTheme.colorScheme.{name}` or project's `CustomColorScheme`
|
|
110
|
-
- Typography → `MaterialTheme.typography.{name}`
|
|
111
|
-
- Radius → `CustomShapes` extension
|
|
112
|
-
|
|
113
|
-
The generator reads `figmaConfig.tokens.*Path` to locate the theme file and resolves symbolic tokens (e.g. `Spacing.spacing16`) in the same way the iOS peer resolves `.Spacing.spacing16`. No magic numbers land in the composable.
|
|
114
|
-
|
|
115
|
-
## Cross-CLI parity
|
|
116
|
-
|
|
117
|
-
Claude Code and Copilot CLI implementations MUST:
|
|
118
|
-
|
|
119
|
-
- Accept identical arguments (`<figma-url>`, `phase-<N>`, `status`).
|
|
120
|
-
- Emit byte-identical progress lines via the WS-11 contract.
|
|
121
|
-
- Write the same `state.phases["3"].subphases[]` schema so multi-agent's phase-tracker renders identically.
|
|
122
|
-
- Resolve `figmaConfig.build.gradleModule` the same way.
|
|
123
|
-
|
|
124
|
-
`smoke-figma-android-parity.sh` asserts the platform-specific skill inventory matches the iOS peer (same skill names exist on both sides).
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# figma-common - Platform-agnostic figma-to-component skills
|
|
2
|
-
|
|
3
|
-
Shared skills that both `pipeline/skills/figma-ios/` (SwiftUI) and `pipeline/skills/figma-android/` (Jetpack Compose) dispatch. Moved here by WS-7b of the v5.0.0 rebuild so the platform trees stay lean and there's no duplication.
|
|
4
|
-
|
|
5
|
-
## What lives here (31 skills)
|
|
6
|
-
|
|
7
|
-
**Workflow orchestration:**
|
|
8
|
-
|
|
9
|
-
- `figma-component-start` - Issue → branches, check out worktree
|
|
10
|
-
- `figma-component-confluence-sync` - Phase 7b: wiki markdown → Confluence XHTML
|
|
11
|
-
- `figma-component-status-update` - Refresh Confluence dashboard
|
|
12
|
-
- `figma-commit` - 14-item review + PR creation
|
|
13
|
-
- `figma-iteration-commit` - Commit to iteration/develop + PR
|
|
14
|
-
|
|
15
|
-
**Batch + iterate:**
|
|
16
|
-
|
|
17
|
-
- `figma-iterate` - Auto loop: pick → implement → commit
|
|
18
|
-
- `figma-cli-iterate` - Full CLI iterate (all phases)
|
|
19
|
-
- `figma-cli-lean-iterate` - Iterate skipping test + wiki
|
|
20
|
-
- `figma-cli-iterate-mend` - Re-implement discarded components
|
|
21
|
-
- `figma-cli-skip` - Mark component as skipped
|
|
22
|
-
- `figma-skip` - Skip + update Confluence dashboard
|
|
23
|
-
|
|
24
|
-
**Issue + review:**
|
|
25
|
-
|
|
26
|
-
- `figma-issue` - Create GitHub issue + optional Jira (feeds WS-6 triad)
|
|
27
|
-
- `figma-review` - Interactive review gate (approve / bug / skip)
|
|
28
|
-
- `figma-validate` - Pre-implementation validation
|
|
29
|
-
- `figma-fix` - Targeted bug fix from review findings
|
|
30
|
-
- `figma-mend` - Re-implement component from scratch
|
|
31
|
-
- `figma-evolve-component` - Reconcile drift + additively extend an existing component (human-gated)
|
|
32
|
-
|
|
33
|
-
**Setup + utility:**
|
|
34
|
-
|
|
35
|
-
- `figma-setup` - Environment setup wizard (MCP, tokens, Code Connect CLI)
|
|
36
|
-
- `figma-remote-mcp-auth` - Figma MCP OAuth flow
|
|
37
|
-
- `figma-utility` - Figma data fetch (screenshots, metadata)
|
|
38
|
-
- `figma-ui-patterns` - UI pattern library index
|
|
39
|
-
- `figma-form-integration` - Form protocol adapter (shared UX)
|
|
40
|
-
- `figma-price-integration` - Price protocol adapter (shared UX)
|
|
41
|
-
|
|
42
|
-
**Cross-cutting interaction adapters (dual-platform: iOS SwiftUI + Android Jetpack Compose; native-first; project system via `figma-config` `ui.*`):**
|
|
43
|
-
|
|
44
|
-
- `figma-navigation` - Navigation pattern: headless Output vs self-route; native `NavigationStack` or `ui.navigationSystem`
|
|
45
|
-
- `figma-overlays` - Overlay pattern: toast/HUD/alert/data-modal; native `.alert`/`.sheet(item:)` or `ui.overlaySystem`
|
|
46
|
-
- `figma-bottom-sheets` - Bottom-sheet/detent pattern: native `.presentationDetents` or `ui.sheetSystem`
|
|
47
|
-
|
|
48
|
-
**Performance batch:**
|
|
49
|
-
|
|
50
|
-
- `performance-start`, `performance-swiftui`, `performance-tour`, `performance-review-next`, `performance-iteration-commit-all`
|
|
51
|
-
|
|
52
|
-
## What does NOT live here
|
|
53
|
-
|
|
54
|
-
Platform-specific skills stay under `figma-ios/` or `figma-android/`:
|
|
55
|
-
|
|
56
|
-
- `figma-to-component` - orchestrator (platform-specific build command)
|
|
57
|
-
- `figma-component-implement` - Swift / Kotlin code generator
|
|
58
|
-
- `figma-component-test` - SwiftUI ViewInspector / Compose Testing
|
|
59
|
-
- `figma-component-code-connect` - Swift / Kotlin Code Connect
|
|
60
|
-
- `figma-component-wiki` - same 4-adapter contract, but platform-aware rendering
|
|
61
|
-
|
|
62
|
-
## Invocation
|
|
63
|
-
|
|
64
|
-
Both platforms' orchestrators call the same common skill paths - no CLI or platform routing needed. The cross-CLI contract (`refs/cross-cli-contract.md` section 1.1) enforces the inventory.
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-bottom-sheets
|
|
3
|
-
description: "Bottom-sheet / detent pattern integration for Figma-to-UI components (iOS SwiftUI + Android Jetpack Compose) — half-sheets, drawers, pinned bottom CTAs, resizable pull-up panels, content-sized sheets, and multi-step in-sheet flows. Native by default (SwiftUI .sheet+presentationDetents; Compose ModalBottomSheet + rememberModalBottomSheetState); an optional project-supplied detent-sheet system when figma-config declares one. Reach for this when a design shows a bottom sheet, half-sheet, bottom drawer, snap points, a sticky footer button, or a wizard-in-a-sheet."
|
|
4
|
-
user-invocable: true
|
|
5
|
-
allowed-tools: Read, Glob, Grep
|
|
6
|
-
status: wip-v5
|
|
7
|
-
sourced-from: upstream/figma-bottom-sheets
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# /figma-bottom-sheets - Bottom-Sheet / Detent Pattern Integration
|
|
11
|
-
|
|
12
|
-
## Purpose
|
|
13
|
-
|
|
14
|
-
Consumed by the figma-to-swiftui pipeline (Phase 3D detection, Phase 4B view) and available ad-hoc, this skill defines how **bottom-anchored, detent-based surfaces** are presented. Sibling of `/figma-overlays` (transient/blocking overlays) and `/figma-navigation` (routing): native-SwiftUI default + a config-driven hook for projects that ship a custom detent-sheet engine.
|
|
15
|
-
|
|
16
|
-
**Generic by design.** Default is stock SwiftUI `.sheet` + `.presentationDetents`. If `figma-config.json` declares `ui.sheetSystem`, route through that engine by name - same rules, project vocabulary. (Some apps replace system sheets because iOS 26 forces a Liquid-Glass floating inset on partial detents with no removal API; that replacement is the custom-system case, not the default.)
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## Strict Rules (non-negotiable)
|
|
21
|
-
|
|
22
|
-
1. **The sheet surface is a caller concern; the component is the content.** A reusable component authored from Figma is the sheet's **content**, not the presenter. The caller owns the `isPresented`/`item` binding and the detents. A component that presents itself can't be reused elsewhere.
|
|
23
|
-
2. **No magic numbers.** Detents, corner radius, grabber size, insets come from tokens / figma-config token patterns, never hard-coded literals.
|
|
24
|
-
3. **Detents ascend, max 3.** Pass `[detent]` lowest→highest; the sheet opens at the lowest. Prefer semantic detents (`.medium`, `.large`, `.fraction`, content-height) over pixel heights where possible.
|
|
25
|
-
4. **A bottom sheet is not a modal card and not a navigation push.** Data alert/modal card → `/figma-overlays`; screen routing → `/figma-navigation` (a routed modal may still *render* as a sheet, but navigation owns the routing).
|
|
26
|
-
5. **Native SwiftUI is the default; a custom sheet engine is opt-in via config.** Only use a project detent-sheet system when `ui.sheetSystem.mode == "custom"`.
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## When to Invoke This Skill
|
|
31
|
-
|
|
32
|
-
1. **Phase 3D - sheet affordance/pattern:** the design is (or contains) a bottom sheet / half-sheet / drawer, a **pinned bottom CTA** bar, a resizable pull-up panel, a **content-sized** sheet, or a **multi-step** in-sheet flow (in-sheet back/next that resizes per step).
|
|
33
|
-
2. **Phase 4B - View:** the view is authored as sheet content, or presents a child as a sheet.
|
|
34
|
-
3. **Ad-hoc:** "half sheet", "bottom drawer", "pull-up panel", "snap points", "sticky footer button", "multi-step sheet", "sheet sized to its content".
|
|
35
|
-
|
|
36
|
-
**Not a bottom sheet (guards):**
|
|
37
|
-
- Toast / HUD / alert / data modal card → `/figma-overlays`.
|
|
38
|
-
- Full screen navigation / tab / deep link → `/figma-navigation`.
|
|
39
|
-
- An inline expandable section within the page flow (not an anchored surface) → plain component content.
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## Native-first architecture (default)
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
Caller
|
|
47
|
-
| owns isPresented / item + detents; presents the component as content
|
|
48
|
-
v
|
|
49
|
-
.sheet(item:/isPresented:) {
|
|
50
|
-
ComponentContent() // the Figma-authored component
|
|
51
|
-
.presentationDetents([.medium, .large])
|
|
52
|
-
.presentationDragIndicator(.visible)
|
|
53
|
-
.presentationBackgroundInteraction(.enabled(upThrough: .medium)) // passthrough-ish
|
|
54
|
-
.presentationCornerRadius(<token>)
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
- **Half / expandable:** `.presentationDetents([.medium, .large])` or `[.fraction(0.25), .fraction(0.6), .large]`.
|
|
59
|
-
- **Content-sized:** `.presentationDetents([.height(measuredHeight)])` using a height read via a preference key (a `sizeThatFits`/`GeometryReader` measured content height), then scroll past the cap.
|
|
60
|
-
- **Pinned bottom CTA (part of the screen, not a modal):** `.safeAreaInset(edge: .bottom) { CTA() }` - reserves space, screen stays interactive. This is NOT a presented sheet.
|
|
61
|
-
- **Backdrop behavior:** dim+block is the `.sheet` default; passthrough/interactive-behind uses `.presentationBackgroundInteraction(.enabled(...))`.
|
|
62
|
-
- **Multi-step in-sheet flow:** drive a `NavigationStack(path:)` *inside* the sheet content for push/pop, resizing detents per step; each step is a headless view emitting `Output` (see `/figma-navigation`). If the target project's custom engine forbids a nested `NavigationStack`, use its engine (config hook).
|
|
63
|
-
- **Overlays over a sheet:** mount the toast/HUD host on the sheet content (`/figma-overlays`), not the root.
|
|
64
|
-
|
|
65
|
-
Tokens per `reference/ui` + figma-config token patterns.
|
|
66
|
-
|
|
67
|
-
## Config hook - project-supplied detent-sheet engine
|
|
68
|
-
|
|
69
|
-
When `figma-config.json` declares:
|
|
70
|
-
```jsonc
|
|
71
|
-
"ui": { "sheetSystem": {
|
|
72
|
-
"mode": "custom",
|
|
73
|
-
"brandedModifier": "bottomSheet", // .bottomSheet(isPresented:title:) branded entry
|
|
74
|
-
"headlessModifiers": ["modalSheet", "dockedSheet", "expandableSheet", "detentNavigationSheet"],
|
|
75
|
-
"detentType": "SheetDetentType", // detent enum
|
|
76
|
-
"backdropType": "Backdrop", // backdrop enum
|
|
77
|
-
"cornerRadiusToken": ".CornerRadius.radius12" // example: your branded top-corner radius token
|
|
78
|
-
}}
|
|
79
|
-
```
|
|
80
|
-
apply the SAME rules via the project's engine (names from config, do NOT hardcode):
|
|
81
|
-
- Use `.{brandedModifier}` for product sheets needing brand chrome; the headless modifiers for unbranded surfaces / CTAs / resizable panels / multi-step flows.
|
|
82
|
-
- Detents/backdrops use `{detentType}`/`{backdropType}` values; corner radius from `{cornerRadiusToken}`.
|
|
83
|
-
- Multi-step flows use the engine's navigation sheet (e.g. `detentNavigationSheet` with a `Navigator<Route>`) rather than a raw nested `NavigationStack`.
|
|
84
|
-
- One container-owned grabber (pass custom headers grabberless if the engine draws the grabber).
|
|
85
|
-
- Present only from the surface's own host - never walk the scene/window hierarchy for a "top" controller.
|
|
86
|
-
|
|
87
|
-
If `mode` is absent or `native`, use the native-first section.
|
|
88
|
-
|
|
89
|
-
## Android (Jetpack Compose)
|
|
90
|
-
|
|
91
|
-
Same rules, Compose vocabulary. Default is Material3; a project sheet engine is used only when `ui.sheetSystem.mode == "custom"`.
|
|
92
|
-
|
|
93
|
-
- **Half / expandable / drawer:** `ModalBottomSheet(onDismissRequest = { showSheet = false }, sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = false)) { Content() }`. The caller owns `var showSheet by remember` and the `SheetState`; the Figma-authored composable is the **content**.
|
|
94
|
-
- **Detents / snap points:** Material3 exposes partial + expanded (`skipPartiallyExpanded`, `SheetValue`); for finer snap points use an `AnchoredDraggable`-based sheet. Don't hard-code pixel heights - derive from content / fractions.
|
|
95
|
-
- **Content-sized:** let the content wrap-height; the sheet grows to content then scrolls (inner `Column`/`LazyColumn` with `verticalScroll`).
|
|
96
|
-
- **Pinned bottom CTA (part of the screen, not a sheet):** `Scaffold(bottomBar = { CTA() })` - reserves space, screen stays interactive. Not a `ModalBottomSheet`.
|
|
97
|
-
- **Multi-step in-sheet flow:** host a nested `NavHost` (or step state) inside the sheet content, resizing per step; each step is a headless composable emitting events (see `/figma-navigation`).
|
|
98
|
-
- **Overlays over the sheet:** show `Snackbar`/`AlertDialog` scoped to the sheet content (`/figma-overlays`), not the root.
|
|
99
|
-
|
|
100
|
-
**Config hook:** `ui.sheetSystem.mode == "custom"` → use the project's `{brandedModifier}` / headless composables + `{detentType}` / `{backdropType}` and radius from `{cornerRadiusToken}`, resolved from config.
|
|
101
|
-
|
|
102
|
-
Corner radius / grabber / insets from tokens (`MaterialTheme.shapes` / figma-config), not literals.
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## Integration with Phase 3D
|
|
107
|
-
|
|
108
|
-
Record in `04b_component_architecture.md`:
|
|
109
|
-
|
|
110
|
-
```markdown
|
|
111
|
-
## Bottom Sheet
|
|
112
|
-
| Signal | Surface | Detents | Owner |
|
|
113
|
-
|---|---|---|---|
|
|
114
|
-
| Half-sheet picker | presented sheet | [.medium, .large] | caller owns isPresented |
|
|
115
|
-
| Sticky "Devam Et" bar | pinned bottom CTA | n/a (safeAreaInset) | part of screen |
|
|
116
|
-
| 3-step add flow | multi-step in-sheet | per-step (content height) | caller drives path |
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
Property classification addition:
|
|
120
|
-
|
|
121
|
-
| Classification | When | Swift Pattern |
|
|
122
|
-
|---|---|---|
|
|
123
|
-
| Sheet content | Component is authored to live inside a sheet | plain component; caller adds `.presentationDetents(...)` |
|
|
124
|
-
| Present-child-as-sheet | Component reveals a child surface | caller-owned `isPresented`/`item` + `.sheet` (component emits the trigger intent) |
|
|
125
|
-
| Pinned CTA | Sticky bottom action bar | `.safeAreaInset(edge:.bottom)` at the screen, not a modal |
|
|
126
|
-
|
|
127
|
-
## Integration with Phase 4B
|
|
128
|
-
- Author the component as sheet **content**; let the caller own presentation + detents.
|
|
129
|
-
- Prefer semantic detents; content-sized sheets measure height via a preference key.
|
|
130
|
-
- Pinned CTA = `.safeAreaInset(edge:.bottom)`, not a presented sheet.
|
|
131
|
-
- Multi-step flow = `NavigationStack` inside the sheet (native) or the engine's nav sheet (custom).
|
|
132
|
-
- If `ui.sheetSystem.mode == custom`, use `{brandedModifier}`/headless modifiers + `{detentType}`/`{backdropType}` per config.
|
|
133
|
-
- Verify on the simulator across detents, backdrop, and drag/dismiss on the project's min + current iOS.
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## When NOT to Use Bottom-Sheet Integration
|
|
138
|
-
- Toast/HUD/alert/data modal card → `/figma-overlays`.
|
|
139
|
-
- Screen routing/tabs/deep links → `/figma-navigation`.
|
|
140
|
-
- An inline expandable/disclosure within page flow → plain component content.
|
|
141
|
-
|
|
142
|
-
## Checklist - Before Leaving the Skill
|
|
143
|
-
```
|
|
144
|
-
[ ] Component is sheet CONTENT; caller owns isPresented/item + detents
|
|
145
|
-
[ ] Detents ascend, max 3; semantic detents preferred; no magic-number heights
|
|
146
|
-
[ ] Pinned CTA uses safeAreaInset(edge:.bottom), not a presented sheet
|
|
147
|
-
[ ] Content-sized sheet measures height via preference key, then scrolls
|
|
148
|
-
[ ] Multi-step flow uses NavigationStack-in-sheet (native) or engine nav sheet (custom)
|
|
149
|
-
[ ] Corner radius / grabber / insets from tokens, not literals
|
|
150
|
-
[ ] Default native SwiftUI; custom engine only when figma-config ui.sheetSystem.mode == custom
|
|
151
|
-
[ ] Overlays over the sheet mount on the sheet content surface
|
|
152
|
-
```
|