@mmerterden/multi-agent-pipeline 11.2.0 → 11.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +68 -0
- package/README.md +2 -2
- package/docs/FIGMA_PIPELINE.md +12 -25
- package/docs/architecture.md +3 -5
- package/docs/features.md +8 -8
- package/install/_dev-only-files.mjs +0 -6
- package/install/claude.mjs +39 -17
- package/install/copilot.mjs +22 -16
- package/install/templates/copilot-instructions.md +3 -3
- package/package.json +1 -1
- package/pipeline/commands/{multi-agent.md → multi-agent/SKILL.md} +39 -39
- package/pipeline/commands/multi-agent/{analysis.md → analysis/SKILL.md} +18 -18
- package/pipeline/commands/multi-agent/{analysis-resolve.md → analysis-resolve/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{autopilot.md → autopilot/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{build-optimize.md → build-optimize/SKILL.md} +1 -1
- package/pipeline/commands/multi-agent/{channels.md → channels/SKILL.md} +12 -12
- package/pipeline/commands/multi-agent/{dev.md → dev/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{dev-autopilot.md → dev-autopilot/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{dev-local.md → dev-local/SKILL.md} +5 -5
- package/pipeline/commands/multi-agent/{dev-local-autopilot.md → dev-local-autopilot/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{finish.md → finish/SKILL.md} +6 -6
- package/pipeline/commands/multi-agent/{generate.md → generate/SKILL.md} +3 -3
- package/pipeline/commands/multi-agent/{help.md → help/SKILL.md} +4 -4
- package/pipeline/commands/multi-agent/{local.md → local/SKILL.md} +5 -5
- package/pipeline/commands/multi-agent/{local-autopilot.md → local-autopilot/SKILL.md} +5 -5
- package/pipeline/commands/multi-agent/{manual-test.md → manual-test/SKILL.md} +1 -1
- package/pipeline/commands/multi-agent/refactor/SKILL.md +257 -0
- package/pipeline/commands/multi-agent/{resume.md → resume/SKILL.md} +1 -1
- package/pipeline/commands/multi-agent/{review.md → review/SKILL.md} +5 -5
- package/pipeline/commands/multi-agent/{setup.md → setup/SKILL.md} +1 -1
- package/pipeline/commands/multi-agent/{sync.md → sync/SKILL.md} +20 -58
- package/pipeline/lib/credential-store.sh +8 -4
- package/pipeline/{commands/multi-agent → multi-agent-refs}/_account-picker.md +2 -2
- package/pipeline/{commands/multi-agent → multi-agent-refs}/_dev-context.md +2 -2
- package/pipeline/{commands/multi-agent → multi-agent-refs}/_repo-picker.md +2 -2
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/android-guide.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/jira.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/wiki.md +7 -7
- package/pipeline/multi-agent-refs/component-dispatch.md +92 -0
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/cross-cli-contract.md +10 -77
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/verify-by-test.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/generate-issue.md +2 -2
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/issue-jira-triad.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/keychain.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/log-format.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/modes.md +2 -2
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/operations.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-0-init.md +10 -10
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-1-analysis.md +6 -6
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-2-planning.md +3 -3
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-3-dev.md +10 -10
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-4-review.md +8 -8
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-5-test.md +3 -3
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-6-commit.md +4 -4
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-7-report.md +6 -6
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases.md +12 -12
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/progress-contract.md +4 -4
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/swiftui-guide.md +1 -1
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/tracker-contract.md +3 -3
- package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/wiki-capture.md +4 -4
- package/pipeline/preferences-template.json +17 -1
- package/pipeline/rules/figma-pipeline.md +2 -2
- package/pipeline/schemas/prefs.schema.json +0 -34
- package/pipeline/scripts/README.md +1 -3
- package/pipeline/scripts/build-skills-index.mjs +3 -6
- package/pipeline/scripts/eval-mine-corpus.mjs +187 -0
- package/pipeline/scripts/fixtures/install-layout.tsv +6 -5
- package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
- package/pipeline/scripts/lint-skills.mjs +26 -1
- package/pipeline/scripts/phase-banner.sh +2 -2
- package/pipeline/scripts/review-scope.mjs +94 -0
- package/pipeline/scripts/scan-agent-config.sh +2 -2
- package/pipeline/scripts/smoke-agent-log-cost.sh +1 -1
- package/pipeline/scripts/smoke-agent-model-routing.sh +4 -4
- package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +2 -2
- package/pipeline/scripts/smoke-channels-approval-gate.sh +2 -2
- package/pipeline/scripts/smoke-channels-flow.sh +5 -5
- package/pipeline/scripts/smoke-clarify.sh +1 -1
- package/pipeline/scripts/smoke-commands-skills-parity.sh +3 -3
- package/pipeline/scripts/smoke-community-gates.sh +1 -1
- package/pipeline/scripts/smoke-compliance-skills.sh +2 -2
- package/pipeline/scripts/smoke-cost-summary.sh +1 -1
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +17 -43
- package/pipeline/scripts/smoke-cross-phase-cohesion.sh +1 -1
- package/pipeline/scripts/smoke-dev-critic.sh +1 -1
- package/pipeline/scripts/smoke-diff-explain.sh +1 -1
- package/pipeline/scripts/smoke-diff-risk.sh +1 -1
- package/pipeline/scripts/smoke-evidence-gate.sh +1 -1
- package/pipeline/scripts/smoke-figma-dispatch.sh +46 -57
- package/pipeline/scripts/smoke-gate-hooks.sh +1 -1
- package/pipeline/scripts/smoke-generate-issue.sh +8 -8
- package/pipeline/scripts/smoke-handoff-contract.sh +3 -3
- package/pipeline/scripts/smoke-identity-isolation.sh +2 -2
- package/pipeline/scripts/smoke-intent-guard.sh +1 -1
- package/pipeline/scripts/smoke-issue-comment-template.sh +2 -2
- package/pipeline/scripts/smoke-issue-jira-triad.sh +4 -4
- package/pipeline/scripts/smoke-language-axis.sh +6 -6
- package/pipeline/scripts/smoke-learnings-ledger.sh +3 -3
- package/pipeline/scripts/smoke-mode-dispatch-drift.sh +16 -16
- package/pipeline/scripts/smoke-model-fallback.sh +3 -3
- package/pipeline/scripts/smoke-multi-repo-integration.sh +2 -2
- package/pipeline/scripts/smoke-multi-repo-worktree.sh +1 -1
- package/pipeline/scripts/smoke-no-token-prompt.sh +5 -5
- package/pipeline/scripts/smoke-phase-0-multi-repo.sh +1 -1
- package/pipeline/scripts/smoke-phase-6-multi.sh +1 -1
- package/pipeline/scripts/smoke-phase4-gates.sh +45 -0
- package/pipeline/scripts/smoke-plan-approval-gate.sh +5 -5
- package/pipeline/scripts/smoke-plan-todos.sh +3 -3
- package/pipeline/scripts/smoke-pr-review-actions.sh +3 -3
- package/pipeline/scripts/smoke-prefs-language.sh +1 -1
- package/pipeline/scripts/smoke-progress-contract.sh +2 -2
- package/pipeline/scripts/smoke-push-retry.sh +1 -1
- package/pipeline/scripts/smoke-repo-map.sh +2 -2
- package/pipeline/scripts/smoke-shadow-git.sh +1 -1
- package/pipeline/scripts/smoke-skill-authoring.sh +4 -9
- package/pipeline/scripts/smoke-tasklist-ordering.sh +10 -10
- package/pipeline/scripts/smoke-test-gap.sh +1 -1
- package/pipeline/scripts/smoke-token-budget.sh +1 -1
- package/pipeline/scripts/smoke-token-preflight.sh +2 -2
- package/pipeline/scripts/smoke-tracker-contract.sh +13 -13
- package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +5 -5
- package/pipeline/scripts/smoke-triage-memory.sh +2 -2
- package/pipeline/scripts/smoke-update-check.sh +1 -1
- package/pipeline/scripts/smoke-url-enrichment.sh +2 -2
- package/pipeline/scripts/smoke-validator-gates.sh +1 -1
- package/pipeline/scripts/smoke-verify-by-test.sh +3 -3
- package/pipeline/scripts/smoke-wiki-integration.sh +9 -33
- package/pipeline/scripts/smoke-work-summary.sh +1 -1
- package/pipeline/scripts/smoke-worktree-path-convention.sh +4 -4
- package/pipeline/scripts/test-integrity-gate.mjs +83 -0
- package/pipeline/scripts/uninstall.mjs +17 -6
- package/pipeline/skills/.skill-manifest.json +40 -160
- package/pipeline/skills/.skills-index.json +3 -373
- package/pipeline/skills/shared/README.md +1 -1
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +3 -3
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +116 -51
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +8 -30
- package/pipeline/skills/shared/external/compose-components/SKILL.md +14 -14
- package/pipeline/skills/skills-index.md +3 -44
- package/pipeline/commands/multi-agent/refactor.md +0 -188
- package/pipeline/commands/multi-agent/refs/component-dispatch.md +0 -92
- package/pipeline/scripts/smoke-existing-discovery-gate.sh +0 -71
- package/pipeline/scripts/smoke-figma-android-parity.sh +0 -148
- package/pipeline/scripts/smoke-figma-credential-store.sh +0 -105
- package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +0 -177
- package/pipeline/scripts/smoke-figma-sync.sh +0 -149
- package/pipeline/scripts/smoke-sync-delegation.sh +0 -74
- package/pipeline/skills/figma-android/README.md +0 -38
- package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +0 -62
- package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +0 -158
- package/pipeline/skills/figma-android/figma-component-test/SKILL.md +0 -120
- package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +0 -35
- package/pipeline/skills/figma-android/figma-to-component/SKILL.md +0 -124
- package/pipeline/skills/figma-common/README.md +0 -64
- package/pipeline/skills/figma-common/figma-bottom-sheets/SKILL.md +0 -152
- package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +0 -282
- package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +0 -503
- package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +0 -288
- package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +0 -362
- package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +0 -206
- package/pipeline/skills/figma-common/figma-commit/REVIEW.md +0 -337
- package/pipeline/skills/figma-common/figma-commit/SKILL.md +0 -216
- package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +0 -223
- package/pipeline/skills/figma-common/figma-component-start/SKILL.md +0 -251
- package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +0 -78
- package/pipeline/skills/figma-common/figma-evolve-component/SKILL.md +0 -61
- package/pipeline/skills/figma-common/figma-fix/SKILL.md +0 -321
- package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +0 -542
- package/pipeline/skills/figma-common/figma-issue/SKILL.md +0 -750
- package/pipeline/skills/figma-common/figma-iterate/SKILL.md +0 -208
- package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +0 -1020
- package/pipeline/skills/figma-common/figma-mend/SKILL.md +0 -331
- package/pipeline/skills/figma-common/figma-navigation/SKILL.md +0 -156
- package/pipeline/skills/figma-common/figma-overlays/SKILL.md +0 -142
- package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +0 -398
- package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +0 -104
- package/pipeline/skills/figma-common/figma-review/SKILL.md +0 -400
- package/pipeline/skills/figma-common/figma-setup/SKILL.md +0 -514
- package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +0 -592
- package/pipeline/skills/figma-common/figma-skip/SKILL.md +0 -129
- package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +0 -105
- package/pipeline/skills/figma-common/figma-ui-patterns/patterns/animated-gradient-border.md +0 -116
- package/pipeline/skills/figma-common/figma-utility/SKILL.md +0 -274
- package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +0 -808
- package/pipeline/skills/figma-common/figma-validate/SKILL.md +0 -633
- package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +0 -716
- package/pipeline/skills/figma-common/performance-review-next/SKILL.md +0 -238
- package/pipeline/skills/figma-common/performance-start/SKILL.md +0 -430
- package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +0 -706
- package/pipeline/skills/figma-common/performance-tour/SKILL.md +0 -423
- package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +0 -67
- package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +0 -178
- package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +0 -184
- package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +0 -219
- package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +0 -274
- package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +0 -416
- package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +0 -57
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +0 -307
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +0 -119
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +0 -174
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +0 -333
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +0 -368
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +0 -393
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +0 -617
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +0 -352
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +0 -337
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +0 -206
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +0 -235
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +0 -214
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +0 -902
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +0 -156
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +0 -175
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +0 -176
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +0 -333
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +0 -412
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +0 -336
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +0 -705
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +0 -332
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +0 -380
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +0 -262
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +0 -482
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +0 -274
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +0 -636
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +0 -142
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +0 -547
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +0 -39
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +0 -659
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +0 -580
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +0 -51
- package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +0 -183
- package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +0 -64
- package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +0 -531
- package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +0 -89
- package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +0 -155
- package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +0 -196
- package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +0 -57
- package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +0 -89
- package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +0 -227
- package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +0 -157
- package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +0 -90
- package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +0 -116
- package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +0 -153
- package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +0 -130
- package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +0 -218
- package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +0 -188
- package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +0 -93
- package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +0 -98
- package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +0 -261
- package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +0 -147
- package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +0 -182
- package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +0 -185
- package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +0 -609
- package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +0 -332
- package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +0 -261
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +0 -184
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +0 -188
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +0 -768
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +0 -191
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +0 -420
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.example.json +0 -9
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +0 -336
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +0 -391
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +0 -292
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +0 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +0 -93
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +0 -299
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +0 -343
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +0 -206
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +0 -149
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +0 -281
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +0 -332
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +0 -176
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +0 -98
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +0 -298
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +0 -195
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +0 -1298
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +0 -228
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +0 -1089
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +0 -141
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +0 -106
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +0 -162
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +0 -105
- package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +0 -179
- package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +0 -260
- package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +0 -260
- package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +0 -86
- package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +0 -321
- package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +0 -1470
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +0 -176
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +0 -147
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +0 -629
- /package/pipeline/commands/multi-agent/{delete.md → delete/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{diff-explain.md → diff-explain/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{garbage-collect.md → garbage-collect/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{issue.md → issue/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{jira.md → jira/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{kill.md → kill/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{language.md → language/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{log.md → log/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{prune-logs.md → prune-logs/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{purge.md → purge/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{scan.md → scan/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{search.md → search/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{stack.md → stack/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{status.md → status/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{test.md → test/SKILL.md} +0 -0
- /package/pipeline/commands/multi-agent/{update.md → update/SKILL.md} +0 -0
- /package/pipeline/{commands/multi-agent → multi-agent-refs}/_input-parser.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/analysis-template.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/audit-guide.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/backend-guide.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/confluence.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/issue-comment.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr-review-actions.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/conventions-defaults.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/autopilot-circuit-breaker.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/dev-critic.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/external-context-injection.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/model-fallback.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/plan-todos.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/prior-fix-detection.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/repo-map.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/shadow-git.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/frontend-guide.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/knowledge.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/multi-repo-integration-build.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/picker-contract.md +0 -0
- /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/rules.md +0 -0
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-skip
|
|
3
|
-
description: Marks a Figma component as skipped in the component registry and updates the Confluence status dashboard.
|
|
4
|
-
user-invocable: true
|
|
5
|
-
argument-hint: <figma-url> [--reason <reason>]
|
|
6
|
-
allowed-tools: Bash, Read, Write, Edit, AskUserQuestion
|
|
7
|
-
status: wip-v5
|
|
8
|
-
sourced-from: upstream/figma-skip
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# /figma-skip - Mark Component as Skipped
|
|
12
|
-
|
|
13
|
-
## Parse Arguments
|
|
14
|
-
|
|
15
|
-
`$ARGUMENTS` must contain a Figma URL. Optional `--reason` flag for skip reason.
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
/figma-skip https://www.figma.com/design/{fileKey}/{fileName}?node-id={nodeId}
|
|
19
|
-
/figma-skip https://www.figma.com/design/{fileKey}/{fileName}?node-id={nodeId} --reason "Cursor component, not needed on mobile"
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
### URL Parsing
|
|
23
|
-
|
|
24
|
-
Extract from Figma URL:
|
|
25
|
-
```
|
|
26
|
-
https://www.figma.com/design/{fileKey}/{fileName}?node-id={nodeId}
|
|
27
|
-
```
|
|
28
|
-
Convert `-` to `:` in node-id (e.g., `3-9045` → `3:9045`).
|
|
29
|
-
Derive filename: `{nodeId with : replaced by -}.json` (e.g., `3-9045.json`).
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Workflow
|
|
34
|
-
|
|
35
|
-
### STEP 1 - Resolve Component Name
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
COMMON_PATH="${REPO_ROOT}/{repos.common.path}"
|
|
39
|
-
cd "${COMMON_PATH}" && .build/debug/FigmaRegistryUtility lookup --node-id '{nodeId}'
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Extract `suggestedComponentName` from the output.
|
|
43
|
-
|
|
44
|
-
If the registry file already exists at `Shared/Figma/Components/{nodeId}.json`:
|
|
45
|
-
- Read it. If `"skip": true` already set → inform user "Already skipped" and exit.
|
|
46
|
-
- If not skipped → ask user if they want to mark it as skipped (it may have implementation data).
|
|
47
|
-
|
|
48
|
-
### STEP 2 - Create/Update Registry Entry
|
|
49
|
-
|
|
50
|
-
Write `Shared/Figma/Components/{nodeId}.json`:
|
|
51
|
-
|
|
52
|
-
```json
|
|
53
|
-
{
|
|
54
|
-
"nodeId": "{nodeId}",
|
|
55
|
-
"componentName": {
|
|
56
|
-
"ios": "{componentName}",
|
|
57
|
-
"android": "{componentName}"
|
|
58
|
-
},
|
|
59
|
-
"skip": true,
|
|
60
|
-
"codeConnect": {
|
|
61
|
-
"ios": false,
|
|
62
|
-
"android": false
|
|
63
|
-
},
|
|
64
|
-
"confluence": {
|
|
65
|
-
"page": null,
|
|
66
|
-
"ios": null,
|
|
67
|
-
"android": null
|
|
68
|
-
},
|
|
69
|
-
"fileKey": "{fileKey}",
|
|
70
|
-
"lastUpdated": "{YYYY-MM-DD}",
|
|
71
|
-
"updatedBy": "ios",
|
|
72
|
-
"testingIdentifiers": [],
|
|
73
|
-
"localizationKeys": [],
|
|
74
|
-
"accessibilityKeys": [],
|
|
75
|
-
"analyticsEvents": []
|
|
76
|
-
}
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
### STEP 3 - Regenerate Catalog
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
cd "${COMMON_PATH}"
|
|
83
|
-
.build/debug/FigmaRegistryUtility catalog
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### STEP 4 - Update Confluence Status Dashboard
|
|
87
|
-
|
|
88
|
-
```bash
|
|
89
|
-
python3 "${REPO_ROOT}/.instructions/figma/figma-to-swiftui/scripts/confluence-component-status.py"
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
This updates the global Component Implementation Status dashboard on Confluence.
|
|
93
|
-
Requires VPN. If VPN unavailable, inform user and skip.
|
|
94
|
-
|
|
95
|
-
### STEP 5 - Summary
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
## Skip Summary
|
|
99
|
-
|
|
100
|
-
| Field | Value |
|
|
101
|
-
|-------|-------|
|
|
102
|
-
| Component | {componentName} |
|
|
103
|
-
| Node ID | {nodeId} |
|
|
104
|
-
| File Key | {fileKey} |
|
|
105
|
-
| Registry | Shared/Figma/Components/{nodeId}.json |
|
|
106
|
-
| Status | Skipped |
|
|
107
|
-
| Reason | {reason or "Not specified"} |
|
|
108
|
-
| Confluence | Updated / Skipped (no VPN) |
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
## Batch Mode
|
|
114
|
-
|
|
115
|
-
Multiple URLs can be passed space-separated:
|
|
116
|
-
|
|
117
|
-
```
|
|
118
|
-
/figma-skip https://...?node-id=3-9045 https://...?node-id=14-893 --reason "Cursor components"
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
Process each URL sequentially. Run catalog regeneration and Confluence update once at the end (not per component).
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## Error Handling
|
|
126
|
-
|
|
127
|
-
- **FigmaRegistryUtility not built**: Run `swift build --product FigmaRegistryUtility` first.
|
|
128
|
-
- **Node ID not found in registry**: Create new entry (the lookup may return a suggested name even for unknown nodes).
|
|
129
|
-
- **VPN unavailable**: Skip Confluence update, inform user.
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-ui-patterns
|
|
3
|
-
description: "Index of reusable SwiftUI UI-pattern guides (carousels, scroll tricks, animations, shaped views like scallops, pagers, parallax, gestures). Complementary to figma-to-swiftui and to vibe-coding: when a component needs a known UI pattern, pull the matching sub-guide from this skill instead of re-deriving the technique."
|
|
4
|
-
user-invocable: true
|
|
5
|
-
allowed-tools: Read, Glob, Grep
|
|
6
|
-
status: wip-v5
|
|
7
|
-
sourced-from: upstream/figma-ui-patterns
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# /figma-ui-patterns - UI Pattern Index
|
|
11
|
-
|
|
12
|
-
## Purpose
|
|
13
|
-
|
|
14
|
-
Reusable SwiftUI UI-pattern guides, indexed in one place. Each pattern lives in its own sub-markdown under `patterns/` with a self-contained recipe - API shape, SwiftUI techniques, gotchas, and a minimal reference snippet.
|
|
15
|
-
|
|
16
|
-
This skill is **complementary**, not gating:
|
|
17
|
-
- During **spec-driven** work (figma-to-swiftui pipeline): phases reference patterns by slug when the architecture calls for one.
|
|
18
|
-
- During **vibe coding**: invoke `/figma-ui-patterns` to browse the index, then open the matching sub-guide directly.
|
|
19
|
-
|
|
20
|
-
## Layout
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
.instructions/figma/figma-ui-patterns/
|
|
24
|
-
├── SKILL.md ← this file (index + conventions)
|
|
25
|
-
└── patterns/
|
|
26
|
-
├── carousel-pager.md ← e.g., paged horizontal carousel
|
|
27
|
-
├── scallop-view.md ← e.g., concave-notch shape
|
|
28
|
-
├── parallax-scroll.md
|
|
29
|
-
├── sticky-header.md
|
|
30
|
-
├── scroll-driven-animation.md
|
|
31
|
-
└── <new-pattern>.md
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Each sub-guide is a single markdown file. No deeper nesting - flat under `patterns/`.
|
|
35
|
-
|
|
36
|
-
## How to Use
|
|
37
|
-
|
|
38
|
-
### As a reader (implementation time)
|
|
39
|
-
|
|
40
|
-
1. Run `/figma-ui-patterns` to see the index below.
|
|
41
|
-
2. Open `patterns/<slug>.md` for the pattern you need.
|
|
42
|
-
3. Follow the recipe. Sub-guides are self-contained - you should not need to hop between them.
|
|
43
|
-
|
|
44
|
-
### As an author (adding a new pattern)
|
|
45
|
-
|
|
46
|
-
1. Pick a slug: `kebab-case`, descriptive, noun-phrase (`carousel-pager`, `scallop-view`, not `how-to-carousel`).
|
|
47
|
-
2. Create `patterns/<slug>.md` using the template below.
|
|
48
|
-
3. Add a row to the **Index** section of this file.
|
|
49
|
-
4. Keep the guide under ~200 lines. If it grows beyond that, the pattern is probably two patterns - split it.
|
|
50
|
-
|
|
51
|
-
## Sub-guide Template
|
|
52
|
-
|
|
53
|
-
Every `patterns/<slug>.md` MUST include these sections, in this order:
|
|
54
|
-
|
|
55
|
-
```markdown
|
|
56
|
-
# <Human-Readable Pattern Name>
|
|
57
|
-
|
|
58
|
-
## When to Use
|
|
59
|
-
One paragraph. What visual/behavioral signal in the Figma design means "this is the pattern." What it is NOT (to avoid false positives).
|
|
60
|
-
|
|
61
|
-
## Minimal API
|
|
62
|
-
The smallest SwiftUI surface that implements this pattern. Signature + modifier chain, no business logic.
|
|
63
|
-
|
|
64
|
-
## Technique
|
|
65
|
-
Step-by-step SwiftUI recipe. Which primitives (ScrollView, GeometryReader, TimelineView, matchedGeometryEffect, Canvas, Shape, etc.), in what composition, with what state.
|
|
66
|
-
|
|
67
|
-
## Gotchas
|
|
68
|
-
Numbered list. Common mistakes, platform quirks (iOS version gates, accessibility regressions, performance cliffs).
|
|
69
|
-
|
|
70
|
-
## Reference Snippet
|
|
71
|
-
One complete, compilable SwiftUI snippet - under 60 lines. Should run as-is in an Xcode preview.
|
|
72
|
-
|
|
73
|
-
## Related Patterns
|
|
74
|
-
Bullet list of other slugs in this skill (or in `figma-price-integration`, `coreui-forms`, etc.) that commonly co-occur or contrast with this one.
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Authoring Rules
|
|
78
|
-
|
|
79
|
-
1. **Self-contained.** A reader opening one sub-guide should implement the pattern without hopping.
|
|
80
|
-
2. **SwiftUI-first.** Prefer pure SwiftUI techniques. Drop to UIViewRepresentable only when SwiftUI cannot express the behavior - and say so in Gotchas.
|
|
81
|
-
3. **Design-token aware.** Use project tokens (`.Text.textPrimary`, `.bodyRegular`, etc.) in snippets, not raw colors/fonts. Keeps examples on-brand.
|
|
82
|
-
4. **No component specifics.** A pattern is generic. If your recipe references `FlightCard` or `TripSummary`, you're writing a component guide, not a pattern guide - move it to the component's wiki instead.
|
|
83
|
-
5. **Validate names before committing.** For the pattern's human-readable title, run `/intent-idempotency-check` if the name isn't already obvious - UI pattern names are easy to get wrong.
|
|
84
|
-
|
|
85
|
-
## Integration with figma-to-swiftui
|
|
86
|
-
|
|
87
|
-
- **Phase 3D (pattern detection):** when a scroll/motion/shape signal is detected, Phase 3D names the pattern by slug and cites `.instructions/figma/figma-ui-patterns/patterns/<slug>.md` for the implementation recipe.
|
|
88
|
-
- **Phase 4B (view):** the view implementer reads the sub-guide, copies the Technique + Reference Snippet, and adapts to the component's Configuration.
|
|
89
|
-
- **Phase 5 (testing):** snapshot + interaction tests should cover the pattern's key visual states; the sub-guide's Gotchas list is the checklist.
|
|
90
|
-
|
|
91
|
-
## Index
|
|
92
|
-
|
|
93
|
-
<!-- When adding a pattern, append a row here. Keep alphabetical by slug. -->
|
|
94
|
-
|
|
95
|
-
| Slug | Pattern | Status |
|
|
96
|
-
|------|---------|--------|
|
|
97
|
-
| `animated-gradient-border` | Snake/halo gradient stroke crawling the perimeter (promo/featured/premium cards) - angular-gradient stroke + animatable progress, corner-radius match, Reduce-Motion gate. Native-SwiftUI recipe; uses a project modifier if one ships. | Ready |
|
|
98
|
-
| `carousel-banner` | Auto-advancing paged banner - single item visible, swipe/tap paging, `CarouselGroup` indicator, configurable interval + loop + pause-on-interaction. | Ready |
|
|
99
|
-
| `scalloped-vstack` | Scalloped VStack (boarding-pass silhouette) - vertical card with semicircular edge cuts + dashed perforation line between segments. `CoreUI.ScallopedVStack`. | Ready |
|
|
100
|
-
|
|
101
|
-
## Anti-patterns
|
|
102
|
-
|
|
103
|
-
- **Dumping ground.** This is not a place for "here's a snippet I wrote once." A pattern appears here only if it is **reusable across ≥2 real components**.
|
|
104
|
-
- **Pattern-by-component.** If every component gets its own pattern file, the index stops being useful. Generalize first.
|
|
105
|
-
- **Stale snippets.** If a sub-guide's snippet no longer compiles on the project's current Swift/SwiftUI version, fix or remove it - don't leave a broken recipe.
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
# Animated Gradient Border (Snake / Halo Border)
|
|
2
|
-
|
|
3
|
-
## When to Use
|
|
4
|
-
|
|
5
|
-
A component's frame has a stroked border whose color fades around the perimeter as if a **snake / halo of gradient light crawls around the edge** — continuous, looping, usually 2–4pt wide, with a radius matching the host's corner radius. Figma signals: promo banners, premium/featured cards, upsell surfaces, "lit up" states of otherwise calm cards; a spec named "animated / glowing / gradient border" or an endless-loop prototype on the stroke.
|
|
6
|
-
|
|
7
|
-
**Not** this pattern when:
|
|
8
|
-
- The border is a single, *static* color → `.stroke(...)` / `.overlay(RoundedRectangle().stroke(...))` directly.
|
|
9
|
-
- The gradient is **on the fill**, not the stroke → that's an angular/linear gradient background.
|
|
10
|
-
- It's a **state-transition** pulse (red on error) → `.animation(...)` with color interpolation, not a crawling gradient.
|
|
11
|
-
- The stroke is **dashed/dotted** → different `StrokeStyle`; this pattern draws a solid stroke.
|
|
12
|
-
|
|
13
|
-
## Minimal API
|
|
14
|
-
|
|
15
|
-
If the project already ships a gradient-border modifier (some design systems do — check `reference/ui` / the repo), use it and do NOT re-implement the math. Otherwise use this generic modifier shape:
|
|
16
|
-
|
|
17
|
-
```swift
|
|
18
|
-
view
|
|
19
|
-
.background(fill)
|
|
20
|
-
.clipShape(RoundedRectangle(cornerRadius: radius))
|
|
21
|
-
.animatedGradientBorder(
|
|
22
|
-
colors: [start.opacity(0.6), middle, end.opacity(0.6)], // faded → solid → faded
|
|
23
|
-
lineWidth: 2,
|
|
24
|
-
cornerRadius: radius, // MUST match the host corner radius
|
|
25
|
-
isAnimated: !reduceMotion,
|
|
26
|
-
duration: 3.0
|
|
27
|
-
)
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
**Parameter intent:** 3 colors read best (faded→solid→faded); `lineWidth` 1–3pt from tokens; `cornerRadius` must equal the host's; `isAnimated:false` renders a static stroke; `duration` 1.5 urgent / 3 calm / 5+ ambient.
|
|
31
|
-
|
|
32
|
-
## Technique
|
|
33
|
-
|
|
34
|
-
A self-contained native-SwiftUI recipe (no external package):
|
|
35
|
-
|
|
36
|
-
1. **Overlay, don't replace.** Draw the stroke in an `.overlay` of a `RoundedRectangle` so the host keeps its own background/fill.
|
|
37
|
-
2. **Angular gradient stroked along the shape.** `RoundedRectangle(cornerRadius:).stroke(AngularGradient(...), lineWidth:)`. The angular gradient's rotation is driven by an animated angle so the bright spot travels the perimeter.
|
|
38
|
-
3. **Animatable progress 0→1 drives the gradient's `angle`.** Animate the `AngularGradient(angle:)` on a **static** shape — `.degrees(360 * progress)` — so only the bright band travels. Do NOT `.rotationEffect` the stroked shape (that spins the whole rounded-rect). Start in `.onAppear` with `withAnimation(.linear(duration:).repeatForever(autoreverses:false)) { progress = 1 }`.
|
|
39
|
-
4. **Halo shape** = the gradient stop distribution (a bright band with faded shoulders); keep the fade symmetric for the "snake" read.
|
|
40
|
-
5. **Static shortcut.** `isAnimated == false` → render the same stroke frozen (or a single-color stroke).
|
|
41
|
-
|
|
42
|
-
## Gotchas
|
|
43
|
-
|
|
44
|
-
1. **Corner-radius mismatch is the #1 bug** — the host `cornerRadius` and the border `cornerRadius` must be equal, or the stroke floats off the rounded path.
|
|
45
|
-
2. **Apply the border after `.background`/`.clipShape`** so it overlays the current bounds and clips to the rounded shape.
|
|
46
|
-
3. **Reduce Motion:** read `@Environment(\.accessibilityReduceMotion)` at the call site and pass `isAnimated: !reduceMotion`. A perpetually animating border must respect it.
|
|
47
|
-
4. **Perf on long lists:** a forever-repeating animation per row costs frames and never pauses off-screen. Measure with Instruments before shipping it on `LazyVStack`/`List` rows.
|
|
48
|
-
5. **`onAppear` restarts on every reappear** — don't rely on animation state surviving a re-mount.
|
|
49
|
-
6. **`lineWidth` ≥ `cornerRadius`** produces blobby corners; keep `lineWidth < cornerRadius` for clean corners.
|
|
50
|
-
7. **Use semantic tokens, not raw hex**, so the border follows light/dark + theme (`reference/ui` + figma-config token patterns).
|
|
51
|
-
|
|
52
|
-
## Reference Snippet
|
|
53
|
-
|
|
54
|
-
Drop-in preview — pure SwiftUI, no external dependency:
|
|
55
|
-
|
|
56
|
-
```swift
|
|
57
|
-
import SwiftUI
|
|
58
|
-
|
|
59
|
-
struct AnimatedGradientBorder: ViewModifier {
|
|
60
|
-
var colors: [Color]
|
|
61
|
-
var lineWidth: CGFloat = 2
|
|
62
|
-
var cornerRadius: CGFloat = 12
|
|
63
|
-
var isAnimated: Bool = true
|
|
64
|
-
var duration: Double = 3.0
|
|
65
|
-
@State private var progress: CGFloat = 0
|
|
66
|
-
|
|
67
|
-
func body(content: Content) -> some View {
|
|
68
|
-
// Animate the AngularGradient's `angle` on a STATIC shape — the bright
|
|
69
|
-
// band sweeps the perimeter. (Do NOT rotationEffect the shape: that spins
|
|
70
|
-
// the whole rounded-rect, corners and all.)
|
|
71
|
-
content.overlay(
|
|
72
|
-
RoundedRectangle(cornerRadius: cornerRadius)
|
|
73
|
-
.stroke(
|
|
74
|
-
AngularGradient(
|
|
75
|
-
gradient: Gradient(colors: colors + [colors.first ?? .clear]),
|
|
76
|
-
center: .center,
|
|
77
|
-
angle: .degrees(isAnimated ? 360 * Double(progress) : 0)
|
|
78
|
-
),
|
|
79
|
-
lineWidth: lineWidth
|
|
80
|
-
)
|
|
81
|
-
)
|
|
82
|
-
.onAppear {
|
|
83
|
-
guard isAnimated else { return }
|
|
84
|
-
withAnimation(.linear(duration: duration).repeatForever(autoreverses: false)) {
|
|
85
|
-
progress = 1
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
extension View {
|
|
92
|
-
func animatedGradientBorder(colors: [Color], lineWidth: CGFloat = 2,
|
|
93
|
-
cornerRadius: CGFloat = 12, isAnimated: Bool = true,
|
|
94
|
-
duration: Double = 3.0) -> some View {
|
|
95
|
-
modifier(AnimatedGradientBorder(colors: colors, lineWidth: lineWidth,
|
|
96
|
-
cornerRadius: cornerRadius, isAnimated: isAnimated,
|
|
97
|
-
duration: duration))
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
#Preview {
|
|
102
|
-
Text("Featured")
|
|
103
|
-
.padding(16)
|
|
104
|
-
.frame(maxWidth: .infinity, alignment: .leading)
|
|
105
|
-
.background(Color(.systemBackground))
|
|
106
|
-
.clipShape(RoundedRectangle(cornerRadius: 12))
|
|
107
|
-
.animatedGradientBorder(colors: [.blue.opacity(0.6), .blue, .blue.opacity(0.6)],
|
|
108
|
-
cornerRadius: 12)
|
|
109
|
-
.padding()
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
## Related Patterns
|
|
114
|
-
|
|
115
|
-
- `carousel-banner` — promo banners often pair an auto-advancing pager with this border on the active card.
|
|
116
|
-
- Price callouts — premium-price surfaces sit inside a card wearing this border; compose it at the card level, not on the price view (see `reference/ui` / `figma-price-integration`).
|
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-utility
|
|
3
|
-
description: "On-demand Figma data utility. Fetch screenshots, metadata, properties, tokens, design context, Code Connect mappings, node data, component lists, styles, file summaries, and auth status from Figma via REST API and MCP."
|
|
4
|
-
user-invocable: true
|
|
5
|
-
argument-hint: screenshot <url> [--output path] | metadata <url> | properties <url> | tokens <url> | context <url> | code-connect <url> | node <url> | components <url> | styles <url> | file <url> | whoami | reset-branches
|
|
6
|
-
allowed-tools: Bash, Read, Write, Glob, Grep, AskUserQuestion
|
|
7
|
-
status: wip-v5
|
|
8
|
-
sourced-from: upstream/figma-utility
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# /figma-utility - On-Demand Figma Data Utility
|
|
12
|
-
|
|
13
|
-
## Purpose
|
|
14
|
-
|
|
15
|
-
Standalone utility for querying Figma data on demand. Exposes Figma REST API and MCP capabilities as simple sub-commands. Does **not** modify any project files or affect other skills.
|
|
16
|
-
|
|
17
|
-
This is a **read-only data tool** - it fetches and displays Figma data. It does NOT implement, commit, or modify code.
|
|
18
|
-
|
|
19
|
-
## Parameters
|
|
20
|
-
|
|
21
|
-
| Parameter | Required | Description |
|
|
22
|
-
|-----------|----------|-------------|
|
|
23
|
-
| Sub-command | Yes | One of: `screenshot`, `metadata`, `properties`, `tokens`, `context`, `code-connect`, `node`, `components`, `styles`, `file`, `whoami`, `reset-branches` |
|
|
24
|
-
| Figma URL | Yes (except `whoami`) | `https://www.figma.com/design/{fileKey}/...?node-id={nodeId}` |
|
|
25
|
-
| `--output` | No | Save output to a file path |
|
|
26
|
-
| `--scale` | No | Screenshot scale 1-4 (default: 2) |
|
|
27
|
-
| `--depth` | No | Depth limit for `node` and `file` commands |
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
/figma-utility screenshot https://www.figma.com/design/abc123/?node-id=123-456
|
|
31
|
-
/figma-utility screenshot https://www.figma.com/design/abc123/?node-id=123-456 --output /tmp/shot.png
|
|
32
|
-
/figma-utility metadata https://www.figma.com/design/abc123/?node-id=123-456
|
|
33
|
-
/figma-utility properties https://www.figma.com/design/abc123/?node-id=123-456
|
|
34
|
-
/figma-utility tokens https://www.figma.com/design/abc123/?node-id=123-456
|
|
35
|
-
/figma-utility context https://www.figma.com/design/abc123/?node-id=123-456
|
|
36
|
-
/figma-utility code-connect https://www.figma.com/design/abc123/?node-id=123-456
|
|
37
|
-
/figma-utility node https://www.figma.com/design/abc123/?node-id=123-456 --depth 2
|
|
38
|
-
/figma-utility components https://www.figma.com/design/abc123/
|
|
39
|
-
/figma-utility styles https://www.figma.com/design/abc123/
|
|
40
|
-
/figma-utility file https://www.figma.com/design/abc123/ --depth 1
|
|
41
|
-
/figma-utility whoami
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Parse Arguments
|
|
47
|
-
|
|
48
|
-
1. Extract the **sub-command** (first argument after `/figma-utility`).
|
|
49
|
-
2. Extract the **Figma URL** (if provided).
|
|
50
|
-
3. Extract any **flags**: `--output <path>`, `--scale <N>`, `--depth <N>`.
|
|
51
|
-
|
|
52
|
-
### URL Parsing
|
|
53
|
-
|
|
54
|
-
```
|
|
55
|
-
https://www.figma.com/design/{fileKey}/{fileName}?node-id={nodeId}
|
|
56
|
-
```
|
|
57
|
-
Convert `-` to `:` in node-id (e.g., `123-456` -> `123:456`).
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## Constants
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
REPO_ROOT="$(git rev-parse --show-toplevel)"
|
|
65
|
-
SCRIPT="${REPO_ROOT}/.instructions/figma/figma-utility/scripts/figma-utility.py"
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## Sub-Command Reference
|
|
71
|
-
|
|
72
|
-
### screenshot
|
|
73
|
-
Get a PNG screenshot of a Figma node.
|
|
74
|
-
- **Source:** REST API (primary) -> MCP (fallback)
|
|
75
|
-
- **Requires:** fileKey + nodeId
|
|
76
|
-
- **Options:** `--output <path>`, `--scale 1|2|3|4`
|
|
77
|
-
|
|
78
|
-
### metadata
|
|
79
|
-
Get layer hierarchy as XML for a node.
|
|
80
|
-
- **Source:** MCP only (`get_metadata`)
|
|
81
|
-
- **Requires:** fileKey + nodeId
|
|
82
|
-
- **Options:** `--output <path>`
|
|
83
|
-
|
|
84
|
-
### properties
|
|
85
|
-
Get component properties, variant axes, types, and defaults.
|
|
86
|
-
- **Source:** REST API (`/files/{key}/nodes?ids={nodeId}`)
|
|
87
|
-
- **Requires:** fileKey + nodeId
|
|
88
|
-
- **Options:** `--output <path>`
|
|
89
|
-
|
|
90
|
-
### tokens
|
|
91
|
-
Get design tokens / variable definitions for a node.
|
|
92
|
-
- **Source:** MCP (primary, `get_variable_defs`) -> REST API fallback
|
|
93
|
-
- **Requires:** fileKey + nodeId
|
|
94
|
-
- **Options:** `--output <path>`
|
|
95
|
-
|
|
96
|
-
### context
|
|
97
|
-
Get design context (generated reference code) for a node.
|
|
98
|
-
- **Source:** MCP only (`get_design_context`)
|
|
99
|
-
- **Requires:** fileKey + nodeId
|
|
100
|
-
- **Options:** `--output <path>`
|
|
101
|
-
|
|
102
|
-
### code-connect
|
|
103
|
-
Get Code Connect source mappings for a node.
|
|
104
|
-
- **Source:** MCP only (`get_code_connect_map`)
|
|
105
|
-
- **Requires:** fileKey + nodeId
|
|
106
|
-
- **Options:** `--output <path>`
|
|
107
|
-
|
|
108
|
-
### node
|
|
109
|
-
Get raw node data from Figma REST API.
|
|
110
|
-
- **Source:** REST API (`/files/{key}/nodes?ids={nodeId}`)
|
|
111
|
-
- **Requires:** fileKey + nodeId
|
|
112
|
-
- **Options:** `--output <path>`, `--depth <N>`
|
|
113
|
-
|
|
114
|
-
### components
|
|
115
|
-
List all components in a Figma file.
|
|
116
|
-
- **Source:** REST API (`/files/{key}/components`)
|
|
117
|
-
- **Requires:** fileKey only (nodeId not needed)
|
|
118
|
-
- **Options:** `--output <path>`
|
|
119
|
-
|
|
120
|
-
### styles
|
|
121
|
-
Get all styles in a Figma file.
|
|
122
|
-
- **Source:** REST API (`/files/{key}/styles`)
|
|
123
|
-
- **Requires:** fileKey only (nodeId not needed)
|
|
124
|
-
- **Options:** `--output <path>`
|
|
125
|
-
|
|
126
|
-
### file
|
|
127
|
-
Get file summary: pages, last modified, version.
|
|
128
|
-
- **Source:** REST API (`/files/{key}`)
|
|
129
|
-
- **Requires:** fileKey only (nodeId not needed)
|
|
130
|
-
- **Options:** `--output <path>` (saves full tree), `--depth <N>`
|
|
131
|
-
|
|
132
|
-
### whoami
|
|
133
|
-
Check MCP authentication status.
|
|
134
|
-
- **Source:** MCP (`whoami` on remote, connection check on local)
|
|
135
|
-
- **Requires:** Nothing
|
|
136
|
-
|
|
137
|
-
### reset-branches
|
|
138
|
-
Reset all repo branches (main + submodules) to their remote defaults. Discards local changes.
|
|
139
|
-
- **Source:** Git
|
|
140
|
-
- **Requires:** Nothing
|
|
141
|
-
- **Options:** None
|
|
142
|
-
|
|
143
|
-
**IMPORTANT - run as a single Bash call.** `REPO_ROOT` must be resolved once before any `cd` into submodules; if split into separate Bash calls, `git rev-parse --show-toplevel` inside a submodule returns the submodule root, not the main repo.
|
|
144
|
-
|
|
145
|
-
```bash
|
|
146
|
-
REPO_ROOT="$(git rev-parse --show-toplevel)" && \
|
|
147
|
-
cd "${REPO_ROOT}" && git checkout develop && git fetch origin && git reset --hard origin/develop && \
|
|
148
|
-
cd "${REPO_ROOT}/{repos.common.path}" && \
|
|
149
|
-
(git stash -u 2>/dev/null || true) && git checkout iteration/develop && git fetch origin && git reset --hard origin/iteration/develop && \
|
|
150
|
-
cd "${REPO_ROOT}/{repos.components.path}" && \
|
|
151
|
-
(git stash -u 2>/dev/null || true) && git checkout iteration/develop && git fetch origin && git reset --hard origin/iteration/develop
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
**Output Format:**
|
|
155
|
-
```
|
|
156
|
-
Branches reset to remote:
|
|
157
|
-
figma: develop → origin/develop ({sha})
|
|
158
|
-
common: iteration/develop → origin/iteration/develop ({sha})
|
|
159
|
-
uicomponents: iteration/develop → origin/iteration/develop ({sha})
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## Execution
|
|
165
|
-
|
|
166
|
-
Run the Python script. Build the command from parsed arguments:
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
python3 "${SCRIPT}" <sub-command> \
|
|
170
|
-
--url "<figma-url>" \
|
|
171
|
-
[--output "<path>"] \
|
|
172
|
-
[--scale <N>] \
|
|
173
|
-
[--depth <N>]
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
### Examples
|
|
177
|
-
|
|
178
|
-
```bash
|
|
179
|
-
# Screenshot with output
|
|
180
|
-
python3 "${SCRIPT}" screenshot --url "https://www.figma.com/design/abc/File?node-id=123-456" --output /tmp/screenshot.png
|
|
181
|
-
|
|
182
|
-
# Metadata to stdout
|
|
183
|
-
python3 "${SCRIPT}" metadata --url "https://www.figma.com/design/abc/File?node-id=123-456"
|
|
184
|
-
|
|
185
|
-
# Properties saved to file
|
|
186
|
-
python3 "${SCRIPT}" properties --url "https://www.figma.com/design/abc/File?node-id=123-456" --output /tmp/props.json
|
|
187
|
-
|
|
188
|
-
# File summary with depth limit
|
|
189
|
-
python3 "${SCRIPT}" file --url "https://www.figma.com/design/abc/File" --depth 1
|
|
190
|
-
|
|
191
|
-
# Auth check
|
|
192
|
-
python3 "${SCRIPT}" whoami
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
---
|
|
196
|
-
|
|
197
|
-
## Output Formatting
|
|
198
|
-
|
|
199
|
-
After the script runs:
|
|
200
|
-
|
|
201
|
-
1. **JSON output:** Pretty-print the key fields to the user in a readable format.
|
|
202
|
-
2. **XML output** (metadata): Show it as a code block.
|
|
203
|
-
3. **Large output** (context, node): Summarize key points, suggest `--output` if not used.
|
|
204
|
-
4. **Errors:** Show the error message and hint clearly.
|
|
205
|
-
|
|
206
|
-
### Screenshot Output Format
|
|
207
|
-
```
|
|
208
|
-
Screenshot captured for node {nodeId}
|
|
209
|
-
Source: {rest-api | mcp-local | mcp-remote}
|
|
210
|
-
Saved: {output_path} (if --output used)
|
|
211
|
-
URL: {url} (if REST API, no --output)
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
### Properties Output Format
|
|
215
|
-
```
|
|
216
|
-
Component: {name} ({type})
|
|
217
|
-
Variants: {variantCount}
|
|
218
|
-
Properties ({propertyCount}):
|
|
219
|
-
- {propName}: {type} = {defaultValue} [options: ...]
|
|
220
|
-
- ...
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
---
|
|
224
|
-
|
|
225
|
-
## Data Source Matrix
|
|
226
|
-
|
|
227
|
-
| Command | REST API | MCP Local | MCP Remote |
|
|
228
|
-
|---------|----------|-----------|------------|
|
|
229
|
-
| screenshot | primary | fallback | fallback |
|
|
230
|
-
| metadata | - | primary | fallback |
|
|
231
|
-
| properties | primary | - | - |
|
|
232
|
-
| tokens | fallback | primary | fallback |
|
|
233
|
-
| context | - | primary | fallback |
|
|
234
|
-
| code-connect | - | primary | fallback |
|
|
235
|
-
| node | primary | - | - |
|
|
236
|
-
| components | primary | - | - |
|
|
237
|
-
| styles | primary | - | - |
|
|
238
|
-
| file | primary | - | - |
|
|
239
|
-
| whoami | - | connection check | whoami call |
|
|
240
|
-
|
|
241
|
-
---
|
|
242
|
-
|
|
243
|
-
## Token Resolution
|
|
244
|
-
|
|
245
|
-
Tokens are resolved automatically by the script:
|
|
246
|
-
|
|
247
|
-
1. **REST API token:** `--figma-token` CLI arg > macOS Keychain `FIGMA_ACCESS_TOKEN`
|
|
248
|
-
2. **MCP token:** `--mcp-token` CLI arg > Keychain `FIGMA_MCP_TOKEN` > Claude Code credentials
|
|
249
|
-
|
|
250
|
-
If no tokens are found, the script reports what's missing and suggests running `/figma-setup`.
|
|
251
|
-
|
|
252
|
-
---
|
|
253
|
-
|
|
254
|
-
## Error Handling
|
|
255
|
-
|
|
256
|
-
| Error | Action |
|
|
257
|
-
|-------|--------|
|
|
258
|
-
| No Figma URL provided | Ask user for URL |
|
|
259
|
-
| Invalid sub-command | Show available commands |
|
|
260
|
-
| MCP unavailable (for MCP-only commands) | Report error, suggest Figma Desktop or remote token |
|
|
261
|
-
| REST API 403 | Report token issue, suggest /figma-setup |
|
|
262
|
-
| REST API 404 | Report file/node not found |
|
|
263
|
-
| No tokens found | Suggest /figma-setup |
|
|
264
|
-
|
|
265
|
-
---
|
|
266
|
-
|
|
267
|
-
## Independence
|
|
268
|
-
|
|
269
|
-
This skill is **completely independent** from other Figma skills. It:
|
|
270
|
-
- Has its own script (`figma-utility.py`) - no shared imports
|
|
271
|
-
- Does not read or write implementation artifacts
|
|
272
|
-
- Does not modify the component registry
|
|
273
|
-
- Does not create branches or commits (except `reset-branches` which resets to remote)
|
|
274
|
-
- Can be used alongside any other skill without conflict
|