@mmerterden/multi-agent-pipeline 11.1.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 +58 -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/_common.mjs +9 -1
- package/install/_dev-only-files.mjs +0 -6
- package/install/claude.mjs +45 -18
- 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/build-stack-plugins.mjs +1 -1
- 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 +21 -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/backlog/BACKLOG.md +32 -0
- package/pipeline/skills/shared/external/backlog/SKILL.md +49 -0
- package/pipeline/skills/shared/external/compose-components/SKILL.md +14 -14
- package/pipeline/skills/shared/external/skill-creator/SKILL.md +48 -0
- package/pipeline/skills/shared/external/skill-creator/audit.md +59 -0
- package/pipeline/skills/shared/external/skill-creator/checklist.md +32 -0
- package/pipeline/skills/shared/external/skill-creator/examples.md +65 -0
- package/pipeline/skills/shared/external/skill-creator/label-check.md +43 -0
- package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +83 -0
- package/pipeline/skills/shared/external/skill-creator/template.md +67 -0
- package/pipeline/skills/skills-index.md +4 -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,331 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-mend
|
|
3
|
-
description: Re-implements discarded components from scratch using the figma-to-swiftui workflow, preserving old implementation as complementary reference for animations, domain logic, and UI refinements. Cleans up old files after completion.
|
|
4
|
-
user-invocable: true
|
|
5
|
-
argument-hint: <figma-url> [--name ComponentName] | cleanup | status
|
|
6
|
-
allowed-tools: Task, Read, Glob, Grep, Bash, Write, Edit, AskUserQuestion
|
|
7
|
-
status: wip-v5
|
|
8
|
-
sourced-from: upstream/figma-mend
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# /figma-mend - Re-implement Discarded Components
|
|
12
|
-
|
|
13
|
-
This skill wraps the full `figma-to-swiftui` workflow (Phases 0-8) with two additions:
|
|
14
|
-
1. **Pre-flight**: Locates old component in `Discarded/`, catalogs all its files
|
|
15
|
-
2. **Cleanup**: Deletes old files after successful re-implementation
|
|
16
|
-
|
|
17
|
-
All phase instructions, scripts, and references come from `.instructions/figma/figma-to-swiftui/`. Nothing is duplicated.
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Parse Arguments
|
|
22
|
-
|
|
23
|
-
`$ARGUMENTS` determines the mode:
|
|
24
|
-
|
|
25
|
-
| Input | Mode | Action |
|
|
26
|
-
|-------|------|--------|
|
|
27
|
-
| `https://www.figma.com/design/...` | **Start** | Pre-flight → Phase 0-8 → Cleanup |
|
|
28
|
-
| URL + `--name ComponentName` | **Start** | Same, with explicit name override |
|
|
29
|
-
| `phase-0` through `phase-8` | **Resume** | Read mend-context.json, dispatch with old file injection |
|
|
30
|
-
| `cleanup` | **Cleanup** | Delete old files only (manual invocation) |
|
|
31
|
-
| `status` | **Status** | Read IMPLEMENTATION_HISTORY.md + mend-context.json |
|
|
32
|
-
|
|
33
|
-
### URL Parsing
|
|
34
|
-
|
|
35
|
-
Same as figma-to-swiftui: extract `fileKey` and `nodeId`, convert `-` to `:` in node-id.
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Pre-Flight Phase (orchestrator-level - no subagent)
|
|
40
|
-
|
|
41
|
-
Run BEFORE Phase 0. Uses Grep/Glob/Bash directly in the main orchestrator.
|
|
42
|
-
|
|
43
|
-
### PRE-1: LOCATE_OLD_COMPONENT
|
|
44
|
-
|
|
45
|
-
Search for the old component in `Discarded/` using these strategies in order:
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
UICOMP="{repos.components.path}/Sources/UIComponents"
|
|
49
|
-
|
|
50
|
-
# 1. By node ID in FIGMA.md
|
|
51
|
-
grep -rl "{nodeId}" --include="FIGMA.md" "$UICOMP/Discarded/"
|
|
52
|
-
|
|
53
|
-
# 2. By node ID (dash format) in FIGMA.md
|
|
54
|
-
grep -rl "{nodeIdDash}" --include="FIGMA.md" "$UICOMP/Discarded/"
|
|
55
|
-
|
|
56
|
-
# 3. By node ID in .figma.swift
|
|
57
|
-
grep -rl "{nodeId}" --include="*.figma.swift" "$UICOMP/Discarded/"
|
|
58
|
-
|
|
59
|
-
# 4. By --name argument (directory match)
|
|
60
|
-
find "$UICOMP/Discarded/" -type d -name "{nameOverride}"
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
If no match → HALT:
|
|
64
|
-
```
|
|
65
|
-
STATUS: HALT | GATE: LOCATE_OLD_COMPONENT
|
|
66
|
-
REASON: No discarded component found for node {nodeId}.
|
|
67
|
-
USER_ACTION_REQUIRED: Verify this component exists in Discarded/ or use /figma-to-swiftui instead.
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Extract `oldComponentPath` (directory) and `oldComponentName` (directory name).
|
|
71
|
-
|
|
72
|
-
### PRE-2: CATALOG_OLD_FILES
|
|
73
|
-
|
|
74
|
-
Catalog ALL files related to the old component:
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
TESTS="{repos.components.path}/Tests/UIComponentsTests"
|
|
78
|
-
ARTIFACTS="{repos.artifactsRepo}/ImplementationArtifacts"
|
|
79
|
-
|
|
80
|
-
# Sources (all .swift in old directory)
|
|
81
|
-
find "{oldComponentPath}" -name "*.swift" -type f
|
|
82
|
-
|
|
83
|
-
# Tests (search by old component name)
|
|
84
|
-
find "$TESTS/Snapshot" -type d -name "{OldComponentName}"
|
|
85
|
-
find "$TESTS/ViewInspector" -type d -name "{OldComponentName}"
|
|
86
|
-
find "$TESTS/Components" -path "*{OldComponentName}*" -name "*.swift"
|
|
87
|
-
|
|
88
|
-
# Artifacts
|
|
89
|
-
find "$ARTIFACTS/Figma/Components" -type d -name "{OldComponentName}"
|
|
90
|
-
find "$ARTIFACTS/Confluence" -type d -name "{OldComponentName}"
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
Store as `oldFilesCatalog`:
|
|
94
|
-
- `sources`: list of .swift file paths
|
|
95
|
-
- `codeConnect`: list of .figma.swift paths
|
|
96
|
-
- `documentation`: FIGMA.md path (if exists)
|
|
97
|
-
- `tests.snapshot`: snapshot test directory (if exists)
|
|
98
|
-
- `tests.viewInspector`: viewInspector test directory (if exists)
|
|
99
|
-
- `tests.unit`: unit test files (if exist)
|
|
100
|
-
- `artifacts`: old artifact directory (if exists)
|
|
101
|
-
- `confluence`: old confluence directory (if exists)
|
|
102
|
-
|
|
103
|
-
### PRE-3: NAME_RESOLUTION
|
|
104
|
-
|
|
105
|
-
- `oldComponentName` = directory name from PRE-1
|
|
106
|
-
- `newComponentName` = `--name` override if provided, else will be resolved by Phase 0 registry lookup
|
|
107
|
-
- If names differ, record: `"nameChanged": true`
|
|
108
|
-
|
|
109
|
-
### PRE-4: STORE CONTEXT (deferred)
|
|
110
|
-
|
|
111
|
-
Hold the catalog in memory. Write `mend-context.json` to `{artifactPath}/` immediately AFTER Phase 0 creates the artifact directory.
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## Phase Execution
|
|
116
|
-
|
|
117
|
-
Follow the EXACT same execution order as `.instructions/figma/figma-to-swiftui/SKILL.md`:
|
|
118
|
-
|
|
119
|
-
```
|
|
120
|
-
0 (Init) → 1 (Gather) → 2A → 2B → 2C → 2D → 3 (Analysis) → 4 (Implementation) → 5A → 5B → 5C → 6 (Code Connect) → 7A → 7B → 8 → Cleanup
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
### Dispatch Table
|
|
124
|
-
|
|
125
|
-
Use the SAME dispatch table from `.instructions/figma/figma-to-swiftui/SKILL.md` - same phases, same models, same turn limits, same tool restrictions, same phase instruction paths. Do NOT read that file - the table is reproduced here for reference:
|
|
126
|
-
|
|
127
|
-
| Phase | Instruction (under figma-to-swiftui/) | Model | Max Turns | Tool Restrictions |
|
|
128
|
-
|-------|---------------------------------------|-------|-----------|-------------------|
|
|
129
|
-
| 0 | `phases/phase-0-init.md` | opus | 30 | No Edit |
|
|
130
|
-
| 1 | `phases/phase-1-gathering.md` + `scripts/phase1-gather.py` | N/A | N/A | Bash only |
|
|
131
|
-
| 2A | `phases/phase-2a-testing-identifiers.md` | opus | 25 | No Edit |
|
|
132
|
-
| 2B | `phases/phase-2b-localization.md` | sonnet | 25 | No Edit |
|
|
133
|
-
| 2C | `phases/phase-2c-accessibility.md` | opus | 25 | No Edit |
|
|
134
|
-
| 2D | `phases/phase-2d-analytics.md` | sonnet | 20 | No Edit, No Bash |
|
|
135
|
-
| 3A | `phases/phase-3a-location.md` | sonnet | 20 | No Edit |
|
|
136
|
-
| 3C | `phases/phase-3c-nested.md` | sonnet | 20 | No Edit |
|
|
137
|
-
| 3D | `phases/phase-3d-patterns.md` | opus | 30 | No Edit |
|
|
138
|
-
| 4A | `phases/phase-4a-configuration.md` | opus | 30 | ALL allowed |
|
|
139
|
-
| 4B | `phases/phase-4b-view.md` | opus | 40 | ALL allowed |
|
|
140
|
-
| 4C | `phases/phase-4c-documentation.md` | sonnet | 20 | ALL allowed |
|
|
141
|
-
| 4D | `phases/phase-4d-preview.md` | sonnet | 20 | ALL allowed |
|
|
142
|
-
| 4E | `phases/phase-4e-modifiers.md` | sonnet | 20 | ALL allowed |
|
|
143
|
-
| 5A | `phases/phase-5a-viewinspector.md` | sonnet | 40 | ALL allowed |
|
|
144
|
-
| 5B | `phases/phase-5b-snapshot.md` | sonnet | 40 | ALL allowed |
|
|
145
|
-
| 5C | `phases/phase-5c-unit.md` | sonnet | 30 | ALL allowed |
|
|
146
|
-
| 6 | `phases/phase-6-code-connect.md` | sonnet | 30 | No Edit |
|
|
147
|
-
| 7A | `phases/phase-7a-confluence-generate.md` | sonnet | 30 | No Edit |
|
|
148
|
-
| 7B | `phases/phase-7b-confluence-upload.md` | sonnet | 15 | No Edit |
|
|
149
|
-
| 8 | `phases/phase-8-cleanup.md` | haiku | 10 | ALL allowed |
|
|
150
|
-
|
|
151
|
-
### Phase Routing
|
|
152
|
-
|
|
153
|
-
Use the SAME routing logic from figma-to-swiftui SKILL.md for Phase 2, Phase 3, Phase 4, Phase 5, Phase 6, and Phase 7. Read that file's routing sections when dispatching.
|
|
154
|
-
|
|
155
|
-
### Dispatch Prompt Modification
|
|
156
|
-
|
|
157
|
-
The ONLY change from figma-to-swiftui: append this section to every AI subagent dispatch prompt (NOT to scripts):
|
|
158
|
-
|
|
159
|
-
```
|
|
160
|
-
## Complementary Reference (Old Implementation)
|
|
161
|
-
|
|
162
|
-
This component is being RE-IMPLEMENTED from Discarded/.
|
|
163
|
-
Old source files (read as reference - do NOT copy verbatim):
|
|
164
|
-
{list of relevant old file paths from oldFilesCatalog - see injection table below}
|
|
165
|
-
|
|
166
|
-
Preserve domain-specific patterns if architecturally sound:
|
|
167
|
-
- Animations, transitions, gesture handling
|
|
168
|
-
- UI refinements (feathered edges, gradients, shadows)
|
|
169
|
-
- Domain logic (list handling, data transformation)
|
|
170
|
-
- State management patterns
|
|
171
|
-
- Variant mappings that were manually refined
|
|
172
|
-
|
|
173
|
-
IMPORTANT: New implementation MUST follow current workflow standards
|
|
174
|
-
(macros, Configuration pattern, design tokens). Use old code ONLY as reference
|
|
175
|
-
for domain logic - not as a template for architecture.
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
### Selective File Injection Table
|
|
179
|
-
|
|
180
|
-
Each phase receives ONLY the relevant old files to prevent context bloat:
|
|
181
|
-
|
|
182
|
-
| Phase | Old files to inject |
|
|
183
|
-
|-------|--------------------|
|
|
184
|
-
| 0 | None (standard init) |
|
|
185
|
-
| 1 | None (automated script) |
|
|
186
|
-
| 2A | Old FIGMA.md, old source files |
|
|
187
|
-
| 2B | Old FIGMA.md |
|
|
188
|
-
| 2C | Old FIGMA.md, old source files |
|
|
189
|
-
| 2D | Old FIGMA.md |
|
|
190
|
-
| 3A | None |
|
|
191
|
-
| 3C | Old source files |
|
|
192
|
-
| 3D | Old source files, old modifier files |
|
|
193
|
-
| 3B/3E/3F/3G | None (automated scripts) |
|
|
194
|
-
| 4A | Old Configuration + Model files |
|
|
195
|
-
| 4B | ALL old source files (primary reference phase) |
|
|
196
|
-
| 4C | Old FIGMA.md |
|
|
197
|
-
| 4D | Old source files |
|
|
198
|
-
| 4E | Old modifier files |
|
|
199
|
-
| 5A | Old ViewInspector test files (if exist) |
|
|
200
|
-
| 5B | Old Snapshot test files (if exist) |
|
|
201
|
-
| 5C | Old unit test files (if exist) |
|
|
202
|
-
| 6 | Old .figma.swift file |
|
|
203
|
-
| 7A, 7B | None |
|
|
204
|
-
| 8 | None |
|
|
205
|
-
|
|
206
|
-
### After Phase 0 Completes
|
|
207
|
-
|
|
208
|
-
Write `mend-context.json` to `{artifactPath}/`:
|
|
209
|
-
|
|
210
|
-
```json
|
|
211
|
-
{
|
|
212
|
-
"mode": "mend",
|
|
213
|
-
"oldComponentName": "{oldComponentName}",
|
|
214
|
-
"oldComponentPath": "{oldComponentPath}",
|
|
215
|
-
"oldFiles": {
|
|
216
|
-
"sources": ["{path1}", "{path2}"],
|
|
217
|
-
"codeConnect": ["{path}"],
|
|
218
|
-
"documentation": "{path}",
|
|
219
|
-
"tests": {
|
|
220
|
-
"snapshot": "{dirPath or null}",
|
|
221
|
-
"viewInspector": "{dirPath or null}",
|
|
222
|
-
"unit": "{filePath or null}"
|
|
223
|
-
},
|
|
224
|
-
"artifacts": "{dirPath or null}",
|
|
225
|
-
"confluence": "{dirPath or null}"
|
|
226
|
-
},
|
|
227
|
-
"nameChanged": false,
|
|
228
|
-
"newComponentName": "{newComponentName}"
|
|
229
|
-
}
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## Cleanup Phase
|
|
235
|
-
|
|
236
|
-
Runs automatically after Phase 8, or manually via `/figma-mend cleanup`.
|
|
237
|
-
|
|
238
|
-
### CLEANUP-1: VERIFY_NEW_IMPLEMENTATION
|
|
239
|
-
|
|
240
|
-
```bash
|
|
241
|
-
# Check new component exists
|
|
242
|
-
ls {componentLocation}/{ComponentName}.swift
|
|
243
|
-
|
|
244
|
-
# Check it builds
|
|
245
|
-
xcodebuild build -project {build.xcodeproj} -scheme UIComponents \
|
|
246
|
-
-destination 'generic/platform=iOS' CODE_SIGNING_ALLOWED=NO -quiet
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
If new component missing or build fails → HALT. Do NOT delete old files.
|
|
250
|
-
|
|
251
|
-
### CLEANUP-2: DELETE_OLD_SOURCE
|
|
252
|
-
|
|
253
|
-
```bash
|
|
254
|
-
rm -rf {oldComponentPath}
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
Walk up parent directories (max 3 levels) and remove if empty.
|
|
258
|
-
|
|
259
|
-
### CLEANUP-3: DELETE_OLD_TESTS
|
|
260
|
-
|
|
261
|
-
For each test directory in `oldFilesCatalog.tests`:
|
|
262
|
-
```bash
|
|
263
|
-
rm -rf {testDir} # snapshot, viewInspector, unit test directories
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
Walk up parent directories and remove if empty.
|
|
267
|
-
|
|
268
|
-
### CLEANUP-4: DELETE_OLD_ARTIFACTS
|
|
269
|
-
|
|
270
|
-
```bash
|
|
271
|
-
# Old Figma artifacts
|
|
272
|
-
rm -rf {oldFilesCatalog.artifacts}
|
|
273
|
-
|
|
274
|
-
# Old Confluence artifacts
|
|
275
|
-
rm -rf {oldFilesCatalog.confluence}
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
### CLEANUP-5: VERIFY_BUILD
|
|
279
|
-
|
|
280
|
-
```bash
|
|
281
|
-
xcodebuild build -project {build.xcodeproj} -scheme UIComponents \
|
|
282
|
-
-destination 'generic/platform=iOS' CODE_SIGNING_ALLOWED=NO -quiet
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
Report result. Old files were in `Discarded/` (excluded from compilation) so deletion should not break anything.
|
|
286
|
-
|
|
287
|
-
### CLEANUP-6: UPDATE_HISTORY
|
|
288
|
-
|
|
289
|
-
Append to `{artifactPath}/IMPLEMENTATION_HISTORY.md`:
|
|
290
|
-
|
|
291
|
-
```markdown
|
|
292
|
-
## Mend Cleanup
|
|
293
|
-
- Old component: {oldComponentName} at {oldComponentPath}
|
|
294
|
-
- Sources deleted: {count} files
|
|
295
|
-
- Tests deleted: {count} files/directories
|
|
296
|
-
- Artifacts deleted: {count} directories
|
|
297
|
-
- Build verified: yes/no
|
|
298
|
-
- Date: {DD.MM.YYYY}
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
---
|
|
302
|
-
|
|
303
|
-
## Resume Mode
|
|
304
|
-
|
|
305
|
-
When `$ARGUMENTS` is `phase-N`:
|
|
306
|
-
|
|
307
|
-
1. Search for `mend-context.json` in `ImplementationArtifacts/Figma/Components/`
|
|
308
|
-
2. Read it + IMPLEMENTATION_HISTORY.md to restore: oldComponentPath, oldFiles, componentName, fileKey, nodeId, artifactPath, componentLocation
|
|
309
|
-
3. Dispatch the requested phase with old file injection from the catalog
|
|
310
|
-
|
|
311
|
-
If `mend-context.json` not found → HALT. Run the full workflow from a Figma URL instead.
|
|
312
|
-
|
|
313
|
-
---
|
|
314
|
-
|
|
315
|
-
## Cleanup Mode
|
|
316
|
-
|
|
317
|
-
When `$ARGUMENTS` is `cleanup`:
|
|
318
|
-
|
|
319
|
-
1. Search for `mend-context.json` in `ImplementationArtifacts/Figma/Components/`
|
|
320
|
-
2. Read it to get old file catalog
|
|
321
|
-
3. Read IMPLEMENTATION_HISTORY.md to get componentLocation and componentName
|
|
322
|
-
4. Execute Cleanup Phase (CLEANUP-1 through CLEANUP-6)
|
|
323
|
-
|
|
324
|
-
---
|
|
325
|
-
|
|
326
|
-
## Status Mode
|
|
327
|
-
|
|
328
|
-
When `$ARGUMENTS` is `status`:
|
|
329
|
-
|
|
330
|
-
1. Search for all `mend-context.json` files in `ImplementationArtifacts/Figma/Components/`
|
|
331
|
-
2. For each, display: component name, old → new name, current phase, cleanup status
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-navigation
|
|
3
|
-
description: "Navigation pattern integration for Figma-to-UI components (iOS SwiftUI + Android Jetpack Compose). Guides how a component reaches other screens, tabs, or deep links without coupling to a router — headless screens that emit a typed Output/event, native NavigationStack (iOS) / Navigation Compose (Android) by default, an optional project-supplied navigation system when figma-config declares one. Reach for this when a design embeds a tab bar, nav bar / back button, a push/detail affordance, or a deep-link entry point."
|
|
4
|
-
user-invocable: true
|
|
5
|
-
allowed-tools: Read, Glob, Grep
|
|
6
|
-
status: wip-v5
|
|
7
|
-
sourced-from: upstream/figma-navigation
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# /figma-navigation - Navigation Pattern Integration
|
|
11
|
-
|
|
12
|
-
## Purpose
|
|
13
|
-
|
|
14
|
-
Consumed by the figma-to-swiftui pipeline (Phase 3D pattern detection, Phase 4B view implementation) and available for ad-hoc/vibe-coding, this skill defines how a component participates in navigation **without owning routing**. It is the navigation counterpart of `/figma-form-integration` and `/figma-price-integration`: a cross-cutting integration with a **native-SwiftUI default** and a **config-driven hook** for projects that ship their own navigation system.
|
|
15
|
-
|
|
16
|
-
**Generic by design.** Nothing here assumes a specific app. The default is stock SwiftUI (`NavigationStack`, `navigationDestination`, `.toolbar`, `.sheet`). If the target project declares a custom navigation system in its `figma-config.json` (`ui.navigationSystem`), this skill routes to that system's types by name instead — same rules, project-specific vocabulary.
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## Strict Rules (non-negotiable)
|
|
21
|
-
|
|
22
|
-
1. **A component never names a route, a sibling screen, or a router.** A component/screen takes its arrival data as init params and emits intent through a typed **`Output`** closure (`onSelect`, `onSubmit`, `output:`). The *caller* (scene/coordinator/parent) maps each output to a navigation edge. This keeps the component reusable and testable in isolation.
|
|
23
|
-
2. **No navigation side effects inside a component body.** No `NavigationLink(destination:)` hardcoding a concrete next screen, no router calls, no global singletons touched from `body`. Navigation is a caller concern expressed via the emitted output.
|
|
24
|
-
3. **Selection/tab state is observable data, not an imperative bridge.** A selected tab/section is a bound value (`@Binding`/observable), written by the caller; the component reflects it. A selection set before the container mounts is simply rendered on appear - no cold-start race.
|
|
25
|
-
4. **Deep links reduce to state and never crash.** A URL parses to a plan/value; malformed input is dropped (logged, no trap). The component is never the deep-link parser - it only exposes the entry state the parser can set.
|
|
26
|
-
5. **Native SwiftUI is the default; a custom system is opt-in via config.** Do NOT invent a bespoke router for a project that hasn't asked for one. Only use custom navigation types when `ui.navigationSystem.mode == "custom"` is set in `figma-config.json`.
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## When to Invoke This Skill
|
|
31
|
-
|
|
32
|
-
Invoke when ANY of these are detected in the design or task:
|
|
33
|
-
|
|
34
|
-
1. **Phase 3D - navigation sub-component / affordance:** a nested instance of a navigation-capable design element:
|
|
35
|
-
- Tab bar / segmented section switcher that changes the top-level view
|
|
36
|
-
- Navigation bar / header with a **back button** or close affordance
|
|
37
|
-
- A row/card whose variant implies a **push/detail** affordance (chevron, "Detaylar", disclosure)
|
|
38
|
-
- A link/button whose label implies leaving the screen ("Devam", "Tümünü gör")
|
|
39
|
-
- A deep-link entry point (the design is a landing surface reached by URL)
|
|
40
|
-
2. **Phase 4B - View:** the view renders a back button, tab strip, or a control that should navigate.
|
|
41
|
-
3. **Ad-hoc:** wiring a screen's push/pop/tab/deep-link flow outside the full pipeline.
|
|
42
|
-
|
|
43
|
-
**Not navigation (false-positive guards):**
|
|
44
|
-
- A segmented control that filters in-place (no screen change) → plain `Binding<Enum>`, not navigation.
|
|
45
|
-
- A button that submits a form → that's `/figma-form-integration`; the *result* may navigate, but the control is a form action.
|
|
46
|
-
- A modal card of data / a toast / a loading HUD → `/figma-overlays`. A bottom sheet surface → `/figma-bottom-sheets`.
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Native-first architecture (default)
|
|
51
|
-
|
|
52
|
-
```
|
|
53
|
-
Parent / Scene (caller)
|
|
54
|
-
| owns NavigationStack(path:) or tab Binding, maps Output → edge
|
|
55
|
-
v
|
|
56
|
-
ComponentView
|
|
57
|
-
| init(arrivalData…, output: @escaping (Output) -> Void)
|
|
58
|
-
| emits .selected(id) / .continue / .back - never routes
|
|
59
|
-
v
|
|
60
|
-
(caller) path.append(route) | selectedTab = .x | present(.sheet)
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
- **Push/pop within a flow:** caller owns `NavigationStack(path:)`; component emits `Output`; caller appends a `Hashable` route; `navigationDestination(for:)` renders it.
|
|
64
|
-
- **Back button:** prefer the system back button. A custom header back affordance emits `.back` (or calls `dismiss`); it renders only when there is something to pop (depth > 0 / `isPresented`).
|
|
65
|
-
- **Tabs:** `TabView(selection:)` bound to an observable selection the caller owns; the component reads/writes the binding, never a global.
|
|
66
|
-
- **Deep links:** caller parses URL → a `Hashable` route / tab selection and applies it to the same path/selection state the UI already uses. Component only exposes the entry state.
|
|
67
|
-
- **Modal presentation of another screen:** `.sheet(item:)` / `.fullScreenCover(item:)` driven by caller state (data-driven, no `AnyView`). A *bottom sheet surface* is `/figma-bottom-sheets`; an *alert/data modal card* is `/figma-overlays`.
|
|
68
|
-
|
|
69
|
-
Design tokens (spacing, colors, typography) follow `reference/ui` + the project's figma-config token patterns - never raw literals.
|
|
70
|
-
|
|
71
|
-
## Config hook - project-supplied navigation system
|
|
72
|
-
|
|
73
|
-
When `figma-config.json` declares:
|
|
74
|
-
```jsonc
|
|
75
|
-
"ui": { "navigationSystem": {
|
|
76
|
-
"mode": "custom",
|
|
77
|
-
"router": "AppRouter", // type that dispatches routes
|
|
78
|
-
"routeEnum": "AppRoute", // exhaustive cross-surface route enum
|
|
79
|
-
"sceneType": "SceneContent", // headless screen container (optional)
|
|
80
|
-
"navigatorProtocol": "NavigatorProtocol" // DI'd selection/present API (optional)
|
|
81
|
-
}}
|
|
82
|
-
```
|
|
83
|
-
then apply the SAME rules, but express them in the project's vocabulary resolved from config (do NOT hardcode the names below - read them from `ui.navigationSystem`):
|
|
84
|
-
|
|
85
|
-
- Wrap screen content in `{sceneType}` (headless container) instead of a bare `NavigationStack` child, when provided.
|
|
86
|
-
- Screens still emit a typed `Output`; the domain coordinator maps outputs to the project's route type (`{routeEnum}`) and the `{router}` dispatches.
|
|
87
|
-
- Cross-surface jumps go through the DI'd `{navigatorProtocol}` (`selectTab`, `present`), never by importing a sibling domain.
|
|
88
|
-
- Deep links build the project's `{routeEnum}` case and hand it to the router's deep-link entry.
|
|
89
|
-
|
|
90
|
-
If `mode` is absent or `native`, use the native-first section above. Resolve types via `tools/resource-utility` / repo grep only when the config points at real files.
|
|
91
|
-
|
|
92
|
-
## Android (Jetpack Compose)
|
|
93
|
-
|
|
94
|
-
Same rules, Compose vocabulary. Default is stock **Navigation Compose**; a project system is used only when `ui.navigationSystem.mode == "custom"`.
|
|
95
|
-
|
|
96
|
-
- **Push/pop within a flow:** caller owns `NavHostController` + `NavHost`; the composable emits events via lambdas (`onSelect: (Id) -> Unit`), never calls `navController.navigate(...)` itself. Prefer type-safe routes (`@Serializable` route objects, `navigation-compose` 2.8+).
|
|
97
|
-
- **Back:** system back / `navController.popBackStack()`; intercept only with `BackHandler { }` when the screen owns the gesture. A custom top-bar back emits `onBack` / calls the caller's pop.
|
|
98
|
-
- **Tabs:** state-hoisted selection (`var selected by rememberSaveable`) bound to a `NavigationBar`; the composable reads/writes the hoisted state, never a global.
|
|
99
|
-
- **Deep links:** `navDeepLink { uriPattern = ... }` on the destination, or the caller parses the URI → route and applies it to the same `NavController`. The composable never parses URIs.
|
|
100
|
-
- **Present another screen modally:** caller-owned `var showX by remember` → `Dialog`/`ModalBottomSheet` (see `/figma-bottom-sheets`).
|
|
101
|
-
|
|
102
|
-
**Config hook:** `ui.navigationSystem.mode == "custom"` → use the project's `{router}` / `{routeEnum}` (and a screen container if `{sceneType}` is set) resolved from config; cross-graph jumps go through the DI'd `{navigatorProtocol}`.
|
|
103
|
-
|
|
104
|
-
Tokens/theme via `MaterialTheme` + the project's figma-config token patterns.
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## Integration with Phase 3D
|
|
109
|
-
|
|
110
|
-
When Phase 3D detects a navigation affordance, record it in `04b_component_architecture.md` and classify it as an **Output**, not a route:
|
|
111
|
-
|
|
112
|
-
```markdown
|
|
113
|
-
## Navigation
|
|
114
|
-
| Affordance | Emits | Caller maps to |
|
|
115
|
-
|---|---|---|
|
|
116
|
-
| Back button (header) | `.back` closure / dismiss | pop current stack |
|
|
117
|
-
| Row chevron ("Detaylar") | `.selected(id)` | push detail route |
|
|
118
|
-
| Tab strip | `selection: Binding<Tab>` | caller-owned tab state |
|
|
119
|
-
| Deep-link landing | entry `route`/`tab` param | parser sets caller state |
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
Property classification addition:
|
|
123
|
-
|
|
124
|
-
| Classification | When | Swift Pattern |
|
|
125
|
-
|---|---|---|
|
|
126
|
-
| Navigation output | Component has a push/select/back affordance | `output: (Output) -> Void` / `onSelect: (ID) -> Void` closure on the View |
|
|
127
|
-
| Tab/selection binding | Component switches top-level content | `selection: Binding<SomeTab>` |
|
|
128
|
-
| Deep-link entry | Component is a URL landing surface | plain entry `route`/`tab` param on the View/Configuration |
|
|
129
|
-
|
|
130
|
-
The affordance's **label/icon copy is static Configuration content** (localized), exactly like other copy - only the *intent* is an Output closure.
|
|
131
|
-
|
|
132
|
-
## Integration with Phase 4B
|
|
133
|
-
|
|
134
|
-
- Never hardcode `NavigationLink(destination: ConcreteScreen())` inside a reusable component - emit the Output.
|
|
135
|
-
- Prefer the system back button; a custom back affordance calls `@Environment(\.dismiss)` or emits `.back`.
|
|
136
|
-
- Bind tab/selection via the caller-owned binding; never a global.
|
|
137
|
-
- If `ui.navigationSystem.mode == custom`, wrap in `{sceneType}` and route via `{router}`/`{routeEnum}` per config.
|
|
138
|
-
- Verify by building + running on the simulator (`reference/build-and-test` / `figma-to-component` Phase 5): the transition happens, the back button appears only after a push, deep links land on the right surface.
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## When NOT to Use Navigation Integration
|
|
143
|
-
- In-place filters/segmented state that never changes screen → `Binding<Enum>`.
|
|
144
|
-
- Form submission → `/figma-form-integration` (the *result* may navigate; the control is a form action).
|
|
145
|
-
- Toast / loading / alert / data modal → `/figma-overlays`. Bottom-sheet surface → `/figma-bottom-sheets`.
|
|
146
|
-
|
|
147
|
-
## Checklist - Before Leaving the Skill
|
|
148
|
-
```
|
|
149
|
-
[ ] Component emits a typed Output for every navigation affordance - no hardcoded routes
|
|
150
|
-
[ ] Back uses system back / dismiss / .back output; renders only when poppable
|
|
151
|
-
[ ] Tab/selection is a caller-owned binding, not a global
|
|
152
|
-
[ ] Deep-link entry is plain state the caller's parser can set (component never parses URLs)
|
|
153
|
-
[ ] Default is native SwiftUI (NavigationStack/navigationDestination/TabView/.sheet(item:))
|
|
154
|
-
[ ] Custom system used ONLY when figma-config ui.navigationSystem.mode == custom (names from config)
|
|
155
|
-
[ ] Labels/icons are localized Configuration copy; only intent is a closure
|
|
156
|
-
```
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-overlays
|
|
3
|
-
description: "Overlay pattern integration for Figma-to-UI components (iOS SwiftUI + Android Jetpack Compose) — toasts/snackbars, blocking loading HUDs, alert dialogs, and data-driven modal cards presented from anywhere without the component owning presentation. Native by default (SwiftUI .alert/.confirmationDialog/.overlay + ref-counted loading + .sheet; Compose Snackbar/AlertDialog/Dialog + state-driven loading); an optional project-supplied overlay center when figma-config declares one. Reach for this when a design shows a toast/snackbar, a spinner/HUD, an alert, or a modal card, or when giving post-action feedback (saved/deleted/error) from a view model."
|
|
4
|
-
user-invocable: true
|
|
5
|
-
allowed-tools: Read, Glob, Grep
|
|
6
|
-
status: wip-v5
|
|
7
|
-
sourced-from: upstream/figma-overlays
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# /figma-overlays - Overlay 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 transient/blocking UI is presented **without a component owning the presentation surface**. Overlays counterpart of `/figma-form-integration` / `/figma-price-integration`: native-SwiftUI default + a config-driven hook for projects that ship an overlay center.
|
|
15
|
-
|
|
16
|
-
Four channels: **toast** (transient, non-blocking), **loading** (blocking HUD), **alert** (blocking dialog), **modal** (data-driven card). Rich/interactive content is a local view-modifier, never routed as an erased view.
|
|
17
|
-
|
|
18
|
-
**Generic by design.** Default is stock SwiftUI. If `figma-config.json` declares `ui.overlaySystem`, route through that DI'd center by name instead - same rules, project vocabulary.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Strict Rules (non-negotiable)
|
|
23
|
-
|
|
24
|
-
1. **A component does not present its own app-level overlays.** A reusable component emits an intent (`onSaved`, `output: .removed`) or exposes state; the **caller** (scene/VM/coordinator) shows the toast/alert/modal. A component owning a global toast/alert makes it un-reusable and double-fires when composed.
|
|
25
|
-
2. **Overlay requests are pure data, not erased views.** Toast/alert/modal content is a value (title, style, actions), mapped to a design-system view at the host. **Never** pass `AnyView` through an overlay center. Rich/interactive content uses a **local** `.modal/.sheet { }` view modifier declared at the owning view.
|
|
26
|
-
3. **Loading is ref-counted with a min-show.** Pair every begin with an end (or use a `withLoading { }` wrapper); enforce a ~300ms minimum visible so it doesn't flash. Never leave a HUD un-ended on an error path.
|
|
27
|
-
4. **Presentable from non-view code.** Post-action feedback originates in a VM/coordinator; the overlay API must be callable there (a DI'd center or a bound state), not only from SwiftUI `body`.
|
|
28
|
-
5. **Native SwiftUI is the default; a custom center is opt-in via config.** Only use a project overlay center when `ui.overlaySystem.mode == "custom"`.
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## When to Invoke This Skill
|
|
33
|
-
|
|
34
|
-
1. **Phase 3D - overlay affordance/pattern:** the design shows a toast/snackbar, a spinner/HUD or blocking dim, an alert dialog (1-3 buttons), or a data-driven modal card; or a component action needs post-action feedback.
|
|
35
|
-
2. **Phase 4B - View:** the view triggers feedback after an action, or renders a dim/HUD/alert/modal.
|
|
36
|
-
3. **Ad-hoc:** "show a confirmation", "flash a message", "block the screen while loading", "pop a dialog", "feedback after save".
|
|
37
|
-
|
|
38
|
-
**Not an overlay (guards):**
|
|
39
|
-
- A bottom sheet / half-sheet / drawer *surface* → `/figma-bottom-sheets`.
|
|
40
|
-
- Screen-to-screen routing / tabs / deep links → `/figma-navigation`.
|
|
41
|
-
- An inline banner that is part of the component's own layout (not app-level, not dismissible-over-content) → plain component content.
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
## Native-first architecture (default)
|
|
46
|
-
|
|
47
|
-
```
|
|
48
|
-
Scene / VM (caller)
|
|
49
|
-
| owns overlay state, calls after an action
|
|
50
|
-
v
|
|
51
|
-
SwiftUI presentation modifiers on the scene root:
|
|
52
|
-
toast → .overlay(alignment:) of a transient message view + auto-dismiss task
|
|
53
|
-
loading → a ref-counted @Observable LoadingState → dim + ProgressView, min-show
|
|
54
|
-
alert → .alert(_:isPresented:) / .confirmationDialog (roles: cancel/destructive/default)
|
|
55
|
-
modal → .sheet(item:) driven by an Identifiable data value → host maps data → card
|
|
56
|
-
rich → local .sheet/.fullScreenCover { InteractiveContent() } at the owning view
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
- **Toast:** newest-replaces (single visible), `hug`≈2s / `fill`≈5s auto-dismiss; anchor above any bottom bar. Model as a small value + an `.overlay`.
|
|
60
|
-
- **Loading:** an observable counter (`begin`/`end`, `withLoading`) with min-show; dim + `ProgressView`.
|
|
61
|
-
- **Alert:** native `.alert` / `.confirmationDialog` with proper button roles; data-driven.
|
|
62
|
-
- **Modal card:** `.sheet(item:)` with an `Identifiable` request value; the host builds the design-system card from data (no `AnyView`).
|
|
63
|
-
- **Over a bottom sheet:** mount the toast/HUD host on the sheet's own content (a root-level host sits *behind* a presented sheet).
|
|
64
|
-
|
|
65
|
-
Tokens per `reference/ui` + figma-config token patterns; no literals.
|
|
66
|
-
|
|
67
|
-
## Config hook - project-supplied overlay center
|
|
68
|
-
|
|
69
|
-
When `figma-config.json` declares:
|
|
70
|
-
```jsonc
|
|
71
|
-
"ui": { "overlaySystem": {
|
|
72
|
-
"mode": "custom",
|
|
73
|
-
"center": "OverlayCenter", // DI'd protocol callable from VM/coordinator
|
|
74
|
-
"surfaces": ["root", "currentScene"] // independent render surfaces (optional)
|
|
75
|
-
}}
|
|
76
|
-
```
|
|
77
|
-
apply the SAME rules via the project's center (names from config, do NOT hardcode):
|
|
78
|
-
- Inject `any {center}` (with a Noop default for previews/tests); call `.toast/.withLoading/.alert/.modal` from the VM.
|
|
79
|
-
- Keep the center **UI-framework-free**: it stores data; a host maps data → design-system component. If you reach for `AnyView`, use a local `.modal { }` view modifier instead.
|
|
80
|
-
- Choose the surface from the caller's context (`root` vs `currentScene`); over-a-sheet fires on `currentScene`.
|
|
81
|
-
|
|
82
|
-
If `mode` is absent or `native`, use the native-first section.
|
|
83
|
-
|
|
84
|
-
## Android (Jetpack Compose)
|
|
85
|
-
|
|
86
|
-
Same rules, Compose vocabulary. Default is stock Compose/Material3; a project overlay system is used only when `ui.overlaySystem.mode == "custom"`.
|
|
87
|
-
|
|
88
|
-
- **Toast/snackbar:** `SnackbarHostState` hoisted at a `Scaffold(snackbarHost = { SnackbarHost(state) })`; the composable emits an intent and the caller calls `snackbarHostState.showSnackbar(...)` from a coroutine. (Prefer an in-app `Snackbar` over the platform `android.widget.Toast`.)
|
|
89
|
-
- **Loading:** a state-driven overlay — `if (uiState.isLoading) Box(Modifier.fillMaxSize()) { CircularProgressIndicator() }`; back the flag with a ref-count in the ViewModel + a min-show so it doesn't flash.
|
|
90
|
-
- **Alert:** `AlertDialog(onDismissRequest, confirmButton, dismissButton)` — data-driven from state, proper confirm/dismiss roles.
|
|
91
|
-
- **Modal card:** data-driven `Dialog { }` / `ModalBottomSheet { }` where a host maps the request value → a Material component (no arbitrary erased content passed through a "center").
|
|
92
|
-
- **From a ViewModel:** expose events (`SharedFlow`/`Channel`) or state; the composable collects and shows the overlay. Keep the VM UI-framework-free.
|
|
93
|
-
|
|
94
|
-
**Config hook:** `ui.overlaySystem.mode == "custom"` → inject/collect the project's `{center}` and render its Material host; keep it data-only.
|
|
95
|
-
|
|
96
|
-
Rich/interactive content stays a local composable (`Dialog`/`ModalBottomSheet` declared at the owning composable), not routed through a center.
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## Integration with Phase 3D
|
|
101
|
-
|
|
102
|
-
Record overlays in `04b_component_architecture.md` as **caller intents**, not component-owned UI:
|
|
103
|
-
|
|
104
|
-
```markdown
|
|
105
|
-
## Overlays
|
|
106
|
-
| Trigger | Channel | Owner | Note |
|
|
107
|
-
|---|---|---|---|
|
|
108
|
-
| Row "Sil" tapped | alert (confirm) | caller | component emits .removeRequested(id) |
|
|
109
|
-
| Save succeeded | toast (success) | caller VM | component emits .saved |
|
|
110
|
-
| Async fetch | loading HUD | caller VM | withLoading around the call |
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
Property classification addition:
|
|
114
|
-
|
|
115
|
-
| Classification | When | Swift Pattern |
|
|
116
|
-
|---|---|---|
|
|
117
|
-
| Overlay intent | Component action needs app-level feedback/confirm | `output`/`onX` closure on the View (caller shows the overlay) |
|
|
118
|
-
| Local rich modal | Interactive content owned by this view | local `.sheet/.modal { }` at the owning view, caller state |
|
|
119
|
-
|
|
120
|
-
## Integration with Phase 4B
|
|
121
|
-
- Never present an app-level toast/alert/modal from inside a reusable component - emit the intent.
|
|
122
|
-
- Use native `.alert`/`.confirmationDialog` for 1-3 button dialogs; `.sheet(item:)` for data modal cards.
|
|
123
|
-
- Ref-count loading; guarantee `end` on all paths; min-show to avoid flash.
|
|
124
|
-
- If `ui.overlaySystem.mode == custom`, inject and call `{center}`; keep it data-only.
|
|
125
|
-
- Verify on the simulator: toast above the bottom bar, HUD min-show, alert roles, data modal, overlays over a sheet.
|
|
126
|
-
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
## When NOT to Use Overlay Integration
|
|
130
|
-
- Bottom-sheet surface → `/figma-bottom-sheets`. Routing/tabs/deep links → `/figma-navigation`.
|
|
131
|
-
- A static inline banner that is part of the component layout → plain content.
|
|
132
|
-
- Form validation error shown inline on a field → `/figma-form-integration` (field state), not an overlay.
|
|
133
|
-
|
|
134
|
-
## Checklist - Before Leaving the Skill
|
|
135
|
-
```
|
|
136
|
-
[ ] Reusable component emits intent/state; caller owns the overlay (no self-presentation)
|
|
137
|
-
[ ] Overlay content is data, not AnyView; rich content uses a local .sheet/.modal { }
|
|
138
|
-
[ ] Loading is ref-counted with min-show; end guaranteed on error paths
|
|
139
|
-
[ ] Alerts use native roles (cancel/destructive/default) unless a design card is required
|
|
140
|
-
[ ] Default native SwiftUI; custom center only when figma-config ui.overlaySystem.mode == custom
|
|
141
|
-
[ ] Over-a-sheet feedback mounts on the sheet's content surface, not the root
|
|
142
|
-
```
|