@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,750 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-issue
|
|
3
|
-
description: Creates and manages GitHub Issues for Figma component implementations.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# /figma-issue - GitHub Issue Manager for Figma Components
|
|
7
|
-
|
|
8
|
-
## Purpose
|
|
9
|
-
|
|
10
|
-
Creates and manages GitHub Issues for Figma component implementations. Resolves component metadata from the registry, creates structured issues using the issue template format, adds them to the **Figma Components** Projects V2 board with custom fields, and provides sub-commands for ongoing issue management.
|
|
11
|
-
|
|
12
|
-
## Commands
|
|
13
|
-
|
|
14
|
-
| Command | Description |
|
|
15
|
-
|---------|-------------|
|
|
16
|
-
| `/figma-issue open <url>[,<url>] [--team <team>]` | Create GitHub issue |
|
|
17
|
-
| `/figma-issue assign <#N>` | Assign issue to current user (GitHub + Jira if linked) |
|
|
18
|
-
| `/figma-issue bind-jira <#N> <{jira.projectKey}-XXXXX>` | Link an existing Jira task (both directions) |
|
|
19
|
-
| `/figma-issue phase <#N> <phase>` | Update phase on project board |
|
|
20
|
-
| `/figma-issue block <#N> by <#M>` | Mark issue #N as blocked by #M |
|
|
21
|
-
| `/figma-issue unblock <#N>` | Remove blocked status |
|
|
22
|
-
| `/figma-issue close <#N>` | Close the issue |
|
|
23
|
-
| `/figma-issue status [#N]` | Show issue status or list all open |
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## Constants
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
REPO_ROOT = git repo root (auto-detect)
|
|
31
|
-
REGISTRY_UTIL = ${REPO_ROOT}/{repos.common.path}/.build/debug/FigmaRegistryUtility
|
|
32
|
-
GH_REPO = {github.componentsRepo}
|
|
33
|
-
GH_ORG = {github.org}
|
|
34
|
-
PROJECT_ID = {github.projectV2Id}
|
|
35
|
-
JIRA_BASE_URL = {jira.baseUrl}
|
|
36
|
-
JIRA_PROJECT = {jira.projectKey}
|
|
37
|
-
JIRA_LABELS = ["redesign_ios_ui_component", "MobRedesign"]
|
|
38
|
-
JIRA_ISSUE_TYPE = Task
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Jira Authentication
|
|
42
|
-
|
|
43
|
-
Jira token is stored in macOS Keychain under service name `JIRA_TOKEN`:
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
JIRA_TOKEN=$("$HOME/.claude/lib/credential-store.sh" get \1 2>/dev/null)
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
If not found, prompt the user to add it:
|
|
50
|
-
```bash
|
|
51
|
-
"$HOME/.claude/lib/credential-store.sh" set \1 \"\2\"
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Project Field IDs
|
|
55
|
-
|
|
56
|
-
```
|
|
57
|
-
STATUS_FIELD = {github.projectV2Fields.status}
|
|
58
|
-
Todo = 25f3e7a3
|
|
59
|
-
In Develop = bc6c45f7
|
|
60
|
-
In Review = bdb0d8ef
|
|
61
|
-
Bugfix = e46fa72d
|
|
62
|
-
Done = 6275b69e
|
|
63
|
-
Blocked = 95949fd8
|
|
64
|
-
Stale = 457a1e74
|
|
65
|
-
|
|
66
|
-
PHASE_FIELD = {github.projectV2Fields.phase}
|
|
67
|
-
Implementation = 0577dcda
|
|
68
|
-
Testing = 106b64ce
|
|
69
|
-
Code Connect = 5384b1e1
|
|
70
|
-
Documentation = 7307fb8f
|
|
71
|
-
|
|
72
|
-
FIGMA_PAGE_FIELD = {github.projectV2Fields.figmaPage}
|
|
73
|
-
Home Screen = 72d24832
|
|
74
|
-
Booker = a143357e
|
|
75
|
-
Check-in = 5c204dd7
|
|
76
|
-
Modals = 72983b95
|
|
77
|
-
Cards = e8dedeee
|
|
78
|
-
Buttons = f57b9f30
|
|
79
|
-
Navigation Bar = 54bfd163
|
|
80
|
-
Other = 62a5ecbe
|
|
81
|
-
|
|
82
|
-
JIRA_FIELD = {github.projectV2Fields.jira}
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### Figma Page Mapping
|
|
86
|
-
|
|
87
|
-
Map the registry `pageName` to the project board's Figma Page option. Use substring matching:
|
|
88
|
-
|
|
89
|
-
| pageName contains | Option ID |
|
|
90
|
-
|---|---|
|
|
91
|
-
| `Home` | `72d24832` |
|
|
92
|
-
| `Booker` | `a143357e` |
|
|
93
|
-
| `Check-in`, `Boarding Pass` | `5c204dd7` |
|
|
94
|
-
| `Modal` | `72983b95` |
|
|
95
|
-
| `Card` | `e8dedeee` |
|
|
96
|
-
| `Button` | `f57b9f30` |
|
|
97
|
-
| `Navigation` | `54bfd163` |
|
|
98
|
-
| *(everything else)* | `62a5ecbe` (Other) |
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## Command: `open <url>[,<url>,...]`
|
|
103
|
-
|
|
104
|
-
### STEP 0 - Parse Input
|
|
105
|
-
|
|
106
|
-
1. Extract all Figma URLs from `$ARGUMENTS` (comma-separated or space-separated).
|
|
107
|
-
2. For each URL, extract `node-id` query parameter. Keep as-is (e.g., `2251-15872`).
|
|
108
|
-
3. Deduplicate by `node-id` - if the same node-id appears multiple times, process it only once.
|
|
109
|
-
4. Print: "Found N unique Figma component(s) to process."
|
|
110
|
-
|
|
111
|
-
**For each component, run STEPs 1-6 sequentially.** The specs prompt (STEP 2.5) is asked once per component.
|
|
112
|
-
|
|
113
|
-
### STEP 1 - Registry Lookup
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
cd ${REPO_ROOT}/{repos.common.path}
|
|
117
|
-
.build/debug/FigmaRegistryUtility lookup --node-id <NODE_ID>
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
Collect from JSON output:
|
|
121
|
-
- `name` → Registry name (e.g., `Modals/Title`)
|
|
122
|
-
- `suggestedComponentName` → PascalCase name (e.g., `ModalsTitle`)
|
|
123
|
-
- `pageName` → Figma page name (e.g., `❖ Modals`)
|
|
124
|
-
- `suggestedArtifactPath` → Artifact path
|
|
125
|
-
- `suggestedComponentLocation` → Component location
|
|
126
|
-
|
|
127
|
-
If lookup fails, mark as **unregistered**.
|
|
128
|
-
|
|
129
|
-
### STEP 1.5 - Dependency Detection
|
|
130
|
-
|
|
131
|
-
Uses the **exact same algorithm** as `confluence-component-status-upload.py` → `readiness()`:
|
|
132
|
-
1. Build unified `name → nodeId` lookup from catalog + registry + graph
|
|
133
|
-
2. Resolve sub-component names to nodeIds
|
|
134
|
-
3. Check each resolved nodeId for `codeConnect.ios` and `skip`
|
|
135
|
-
4. Unresolved names (nodeId = None) are NOT blockers (same as `all_comps.get(sub_nid)` returning None)
|
|
136
|
-
|
|
137
|
-
```bash
|
|
138
|
-
COMMON_PATH="${REPO_ROOT}/{repos.common.path}"
|
|
139
|
-
FIGMA_DIR="${COMMON_PATH}/Shared/Figma"
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
#### 1.5a. Compute readiness (single Python script)
|
|
143
|
-
|
|
144
|
-
Run the following as a single Python block. It replicates `build_component_index()` + `readiness()` from `confluence-component-status-upload.py`:
|
|
145
|
-
|
|
146
|
-
```bash
|
|
147
|
-
cd ${REPO_ROOT}
|
|
148
|
-
python3 -c "
|
|
149
|
-
import json, os, glob
|
|
150
|
-
|
|
151
|
-
FIGMA_DIR = '${FIGMA_DIR}'
|
|
152
|
-
NODE_ID = '<NODE_ID>'
|
|
153
|
-
|
|
154
|
-
# --- 1. Load all Components/*.json into dict keyed by nodeId ---
|
|
155
|
-
components = {}
|
|
156
|
-
comp_dir = os.path.join(FIGMA_DIR, 'Components')
|
|
157
|
-
for f in glob.glob(os.path.join(comp_dir, '*.json')):
|
|
158
|
-
with open(f) as fh:
|
|
159
|
-
reg = json.load(fh)
|
|
160
|
-
nid = reg.get('nodeId', os.path.basename(f)[:-5].replace('-', ':'))
|
|
161
|
-
components[nid] = reg
|
|
162
|
-
|
|
163
|
-
# --- 2. Build name → nodeId lookup (same as confluence-component-status-upload.py lines 143-164) ---
|
|
164
|
-
name_to_nid = {}
|
|
165
|
-
for nid, c in components.items():
|
|
166
|
-
cn = c.get('componentName', {})
|
|
167
|
-
ios_name = cn.get('ios', '') if isinstance(cn, dict) else cn or ''
|
|
168
|
-
if ios_name:
|
|
169
|
-
name_to_nid[ios_name] = nid
|
|
170
|
-
# Strip Image. prefix for graph name matching: Image.caretRight → caretRight → CaretRight
|
|
171
|
-
if '.' in ios_name:
|
|
172
|
-
suffix = ios_name.split('.', 1)[1]
|
|
173
|
-
if suffix not in name_to_nid:
|
|
174
|
-
name_to_nid[suffix] = nid
|
|
175
|
-
upper = suffix[0:1].upper() + suffix[1:]
|
|
176
|
-
if upper not in name_to_nid:
|
|
177
|
-
name_to_nid[upper] = nid
|
|
178
|
-
|
|
179
|
-
# Also add catalog names from component-catalog.json if available
|
|
180
|
-
cat_path = os.path.join(FIGMA_DIR, 'Generated', 'component-catalog.json')
|
|
181
|
-
if os.path.isfile(cat_path):
|
|
182
|
-
with open(cat_path) as f:
|
|
183
|
-
catalog = json.load(f)
|
|
184
|
-
for file_entry in catalog.get('files', []):
|
|
185
|
-
for page in file_entry.get('pages', []):
|
|
186
|
-
for comp in page.get('components', []):
|
|
187
|
-
cn = comp.get('name', '')
|
|
188
|
-
fn = comp.get('figmaName', '')
|
|
189
|
-
cnid = comp.get('nodeId', '')
|
|
190
|
-
if cn: name_to_nid[cn] = cnid
|
|
191
|
-
if fn and fn not in name_to_nid: name_to_nid[fn] = cnid
|
|
192
|
-
|
|
193
|
-
# --- 3. Load graph, get sub-components for this node ---
|
|
194
|
-
graph_path = os.path.join(FIGMA_DIR, 'sub-component-graph.json')
|
|
195
|
-
with open(graph_path) as f:
|
|
196
|
-
graph = json.load(f).get('graph', {})
|
|
197
|
-
entry = graph.get(NODE_ID, {})
|
|
198
|
-
sub_names = entry.get('subComponents', [])
|
|
199
|
-
|
|
200
|
-
if not sub_names:
|
|
201
|
-
print(json.dumps({'status': 'no_deps', 'subComponents': []}))
|
|
202
|
-
else:
|
|
203
|
-
# --- 4. Resolve names → nodeIds, then compute readiness per sub-component ---
|
|
204
|
-
results = []
|
|
205
|
-
for sname in sub_names:
|
|
206
|
-
sub_nid = name_to_nid.get(sname)
|
|
207
|
-
if not sub_nid:
|
|
208
|
-
# Unresolved - not in any registry/catalog (same as all_comps.get() → None → not a blocker)
|
|
209
|
-
results.append({'name': sname, 'nodeId': None, 'status': 'unresolved'})
|
|
210
|
-
continue
|
|
211
|
-
sc = components.get(sub_nid)
|
|
212
|
-
if not sc:
|
|
213
|
-
results.append({'name': sname, 'nodeId': sub_nid, 'status': 'unresolved'})
|
|
214
|
-
continue
|
|
215
|
-
if sc.get('skip', False):
|
|
216
|
-
results.append({'name': sname, 'nodeId': sub_nid, 'status': 'skipped'})
|
|
217
|
-
continue
|
|
218
|
-
|
|
219
|
-
# NEW: status.ios.implemented is the canonical source of truth after
|
|
220
|
-
# the architecture-update migration. Fall back to legacy signals for
|
|
221
|
-
# components that haven't been backfilled yet.
|
|
222
|
-
ios_status = sc.get('status', {}).get('ios', {})
|
|
223
|
-
impl_value = ios_status.get('implemented', {}).get('value', False)
|
|
224
|
-
|
|
225
|
-
if impl_value:
|
|
226
|
-
results.append({'name': sname, 'nodeId': sub_nid, 'status': 'implemented'})
|
|
227
|
-
continue
|
|
228
|
-
|
|
229
|
-
# Legacy fallback 1: top-level codeConnect.ios (pre-architecture-update)
|
|
230
|
-
if sc.get('codeConnect', {}).get('ios', False):
|
|
231
|
-
results.append({'name': sname, 'nodeId': sub_nid, 'status': 'implemented'})
|
|
232
|
-
continue
|
|
233
|
-
|
|
234
|
-
# Legacy fallback 2: does a Swift file with this component name exist?
|
|
235
|
-
# Catches components implemented in code but never backfilled. Delete
|
|
236
|
-
# this fallback after backfill-status.py has been run and the legacy
|
|
237
|
-
# codeConnect field is no longer the primary source.
|
|
238
|
-
comp_name = (sc.get('componentName') or {}).get('ios')
|
|
239
|
-
sources_dir = os.environ.get('UICOMPONENTS_SOURCES', '')
|
|
240
|
-
if comp_name and sources_dir and os.path.isdir(sources_dir):
|
|
241
|
-
pattern = os.path.join(sources_dir, '**', comp_name + '.swift')
|
|
242
|
-
if glob.glob(pattern, recursive=True):
|
|
243
|
-
results.append({'name': sname, 'nodeId': sub_nid, 'status': 'implemented'})
|
|
244
|
-
continue
|
|
245
|
-
|
|
246
|
-
results.append({'name': sname, 'nodeId': sub_nid, 'status': 'not_implemented'})
|
|
247
|
-
print(json.dumps({'status': 'checked', 'subComponents': results}))
|
|
248
|
-
"
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
Parse the JSON output. Only `not_implemented` entries are blockers - `implemented`, `skipped`, and `unresolved` (not in any registry) are NOT blockers.
|
|
252
|
-
|
|
253
|
-
**Readiness precedence (architecture-update):**
|
|
254
|
-
1. `status.ios.implemented.value` (new canonical field, set by `phase4-finalize.py`)
|
|
255
|
-
2. Legacy `codeConnect.ios` (pre-architecture-update components)
|
|
256
|
-
3. Swift-file-exists check (final fallback for un-backfilled components;
|
|
257
|
-
requires `UICOMPONENTS_SOURCES` env var or falls through as not_implemented)
|
|
258
|
-
|
|
259
|
-
Delete fallbacks 2 and 3 after `backfill-status.py` has been run and all
|
|
260
|
-
active components have been re-run through the pipeline at least once.
|
|
261
|
-
|
|
262
|
-
#### 1.5b. Find existing issues for blockers
|
|
263
|
-
|
|
264
|
-
For each `not_implemented` sub-component:
|
|
265
|
-
|
|
266
|
-
```bash
|
|
267
|
-
gh issue list --repo ${GH_REPO} --state open --label component \
|
|
268
|
-
--search "<SubComponentName>" --json number,title --jq '.[0]'
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
Collect: `BLOCKING_DEPS` = list of `{name, nodeId, issueNumber (or null)}` - only `not_implemented` entries.
|
|
272
|
-
|
|
273
|
-
#### 1.5c. Report
|
|
274
|
-
|
|
275
|
-
```
|
|
276
|
-
Dependencies (from sub-component-graph.json):
|
|
277
|
-
- <SubName> → ✅ implemented
|
|
278
|
-
- <SubName> → ⏭️ skipped
|
|
279
|
-
- <SubName> → unresolved (not in registry)
|
|
280
|
-
- <SubName> → #N (not implemented)
|
|
281
|
-
- <SubName> → ❌ not implemented, no issue
|
|
282
|
-
|
|
283
|
-
This issue will be auto-blocked after creation.
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
If zero `not_implemented` → **no blockers**, do NOT auto-block.
|
|
287
|
-
|
|
288
|
-
Store `BLOCKING_DEPS` for use in STEP 3.5.
|
|
289
|
-
|
|
290
|
-
### STEP 2 - Duplicate Check
|
|
291
|
-
|
|
292
|
-
```bash
|
|
293
|
-
gh issue list --repo ${GH_REPO} --state open --search "node-id=<NODE_ID>" --json number,title,url
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
If a match is found, print warning and stop:
|
|
297
|
-
"Issue already exists: #N - <title> (<url>)"
|
|
298
|
-
|
|
299
|
-
### STEP 2.5 - Specs & Acceptance Criteria
|
|
300
|
-
|
|
301
|
-
Present the component info and **STOP. Do not proceed to STEP 3.** Wait for the user's next message.
|
|
302
|
-
|
|
303
|
-
**Print exactly this and nothing else:**
|
|
304
|
-
|
|
305
|
-
```
|
|
306
|
-
-------------------------------------------
|
|
307
|
-
Component: <SuggestedComponentName>
|
|
308
|
-
Registry: <RegistryName>
|
|
309
|
-
Page: <PageName>
|
|
310
|
-
Figma: <FIGMA_URL>
|
|
311
|
-
-------------------------------------------
|
|
312
|
-
|
|
313
|
-
Write your acceptance criteria and specs below.
|
|
314
|
-
You can include:
|
|
315
|
-
- Acceptance criteria (checkbox list)
|
|
316
|
-
- Design specs (variants, states, animations)
|
|
317
|
-
- Dependencies (nested components, tokens)
|
|
318
|
-
- Edge cases or constraints
|
|
319
|
-
|
|
320
|
-
Type "skip" to create without specs.
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
**STOP HERE. The user's next message is the specs content.**
|
|
324
|
-
|
|
325
|
-
When the user responds:
|
|
326
|
-
- If the response is `skip` (case-insensitive): set `SPECS = ""`, proceed to STEP 3.
|
|
327
|
-
- Otherwise: the user's message is the specs input. You MAY read referenced files to gather context and understand the user's intent better - this helps write clearer specs. Then rewrite the user's input into clean, actionable acceptance criteria (checkbox list) that another AI can easily follow when it fetches this issue for implementation. Do NOT implement anything - this skill only creates issues, not code. Then proceed to team selection / STEP 3.
|
|
328
|
-
|
|
329
|
-
If `SPECS` is not empty, include it in the issue body under `### Acceptance Criteria` (see STEP 3 body template).
|
|
330
|
-
|
|
331
|
-
### STEP 3 - Create GitHub Issue
|
|
332
|
-
|
|
333
|
-
**Title:**
|
|
334
|
-
```
|
|
335
|
-
feat: <TEAM_SHORT> Implement <SuggestedComponentName>
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
Where `<TEAM_SHORT>` is mapped from the team label:
|
|
339
|
-
|
|
340
|
-
| Label | Short |
|
|
341
|
-
|---|---|
|
|
342
|
-
| `team:core` | `core` |
|
|
343
|
-
| `team:shopping-and-payment` | `shopping` |
|
|
344
|
-
| `team:add-services` | `add-services` |
|
|
345
|
-
| `team:miles-and-smiles` | `miles` |
|
|
346
|
-
| `team:post-ops-irrops` | `post-ops` |
|
|
347
|
-
|
|
348
|
-
If unregistered: `feat: <TEAM_SHORT> Implement component (node-id: <NODE_ID>)`
|
|
349
|
-
|
|
350
|
-
**Body** - must match the issue template field headers exactly:
|
|
351
|
-
|
|
352
|
-
```markdown
|
|
353
|
-
### Figma URL
|
|
354
|
-
|
|
355
|
-
<FIGMA_URL>
|
|
356
|
-
|
|
357
|
-
### Node ID
|
|
358
|
-
|
|
359
|
-
<NODE_ID>
|
|
360
|
-
|
|
361
|
-
### Registry Name
|
|
362
|
-
|
|
363
|
-
<REGISTRY_NAME>
|
|
364
|
-
|
|
365
|
-
### Component Name (PascalCase)
|
|
366
|
-
|
|
367
|
-
<SUGGESTED_COMPONENT_NAME>
|
|
368
|
-
|
|
369
|
-
### Figma Page
|
|
370
|
-
|
|
371
|
-
<PAGE_NAME>
|
|
372
|
-
|
|
373
|
-
### Jira Issue
|
|
374
|
-
|
|
375
|
-
_No response_
|
|
376
|
-
|
|
377
|
-
### Progress
|
|
378
|
-
|
|
379
|
-
| Flag | State |
|
|
380
|
-
|---|---|
|
|
381
|
-
| Implementation | ⚪ |
|
|
382
|
-
| Testing | ⚪ |
|
|
383
|
-
| Code Connect | ⚪ |
|
|
384
|
-
| Wiki | ⚪ |
|
|
385
|
-
|
|
386
|
-
<!--
|
|
387
|
-
State legend:
|
|
388
|
-
🟢 green - flag is set and validated against the current implementation version
|
|
389
|
-
🟡 yellow - flag was validated against an older impl version (or Figma moved ahead, for implemented)
|
|
390
|
-
⚪ gray - flag is not set
|
|
391
|
-
|
|
392
|
-
The Progress table is rewritten automatically by update-issue-from-registry.py
|
|
393
|
-
on every phase finalize. Do not hand-edit this section; edits will be
|
|
394
|
-
overwritten on the next pipeline run.
|
|
395
|
-
-->
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
### Acceptance Criteria
|
|
399
|
-
|
|
400
|
-
<SPECS or "_No response_" if empty>
|
|
401
|
-
|
|
402
|
-
### Pull Requests
|
|
403
|
-
|
|
404
|
-
- **common:**
|
|
405
|
-
- **uicomponents:**
|
|
406
|
-
|
|
407
|
-
### Notes
|
|
408
|
-
|
|
409
|
-
_No response_
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
### Team Label Mapping
|
|
413
|
-
|
|
414
|
-
If `--team` was provided, map to a label:
|
|
415
|
-
|
|
416
|
-
| Argument (case-insensitive) | Label |
|
|
417
|
-
|---|---|
|
|
418
|
-
| `core` | `team:core` |
|
|
419
|
-
| `post-ops-irrops`, `post-ops`, `irrops` | `team:post-ops-irrops` |
|
|
420
|
-
| `add-services`, `additional-services` | `team:add-services` |
|
|
421
|
-
| `miles-and-smiles`, `miles`, `m&s` | `team:miles-and-smiles` |
|
|
422
|
-
| `shopping-and-payment`, `shopping`, `payment` | `team:shopping-and-payment` |
|
|
423
|
-
|
|
424
|
-
If `--team` was NOT provided, ask the user which team before creating the issue. Print and STOP:
|
|
425
|
-
|
|
426
|
-
```
|
|
427
|
-
Which team?
|
|
428
|
-
1. Core
|
|
429
|
-
2. Post-Ops & Irrops
|
|
430
|
-
3. Additional Services
|
|
431
|
-
4. Miles & Smiles
|
|
432
|
-
5. Shopping & Payment
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
Wait for the user's response (number or name), then map to the label.
|
|
436
|
-
|
|
437
|
-
```bash
|
|
438
|
-
gh issue create \
|
|
439
|
-
--repo ${GH_REPO} \
|
|
440
|
-
--title "<TITLE>" \
|
|
441
|
-
--label "component" \
|
|
442
|
-
--label "redesign" \
|
|
443
|
-
--label "<TEAM_LABEL>" \
|
|
444
|
-
--body "<BODY>"
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
**No `phase:*` label on creation.** The per-flag labels
|
|
448
|
-
(`impl:green`, `impl:yellow`, `test:green`, etc.) are applied
|
|
449
|
-
automatically by `update-issue-from-registry.py` once a phase finalize
|
|
450
|
-
script has populated `status` in the registry. On creation the issue
|
|
451
|
-
has zero flag labels (all gray) - that's the correct initial state for
|
|
452
|
-
a component nobody has implemented yet.
|
|
453
|
-
|
|
454
|
-
Legacy `phase:*` labels are stripped from existing issues on any sync;
|
|
455
|
-
new issues never get them.
|
|
456
|
-
|
|
457
|
-
Capture the issue number and URL from the output.
|
|
458
|
-
|
|
459
|
-
### STEP 3.5 - Auto-Block (if dependencies detected)
|
|
460
|
-
|
|
461
|
-
If `BLOCKING_DEPS` from STEP 1.5 has any `not_implemented` sub-components:
|
|
462
|
-
|
|
463
|
-
1. Add `blocked` label:
|
|
464
|
-
```bash
|
|
465
|
-
gh issue edit <N> --repo ${GH_REPO} --add-label "blocked"
|
|
466
|
-
```
|
|
467
|
-
|
|
468
|
-
2. Comment with blocking info:
|
|
469
|
-
```bash
|
|
470
|
-
gh issue comment <N> --repo ${GH_REPO} --body "**Auto-blocked** - unimplemented sub-components (from sub-component-graph.json):
|
|
471
|
-
- <SubName> → #M
|
|
472
|
-
- <SubName> → no issue
|
|
473
|
-
|
|
474
|
-
Will be auto-unblocked when all dependencies are implemented."
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
The issue will be auto-unblocked by `/figma-iteration-commit` STEP 5 when blocking components get implemented.
|
|
478
|
-
|
|
479
|
-
### STEP 4 - Add to Project Board
|
|
480
|
-
|
|
481
|
-
#### 4a. Add issue to project
|
|
482
|
-
|
|
483
|
-
```bash
|
|
484
|
-
# Get issue node ID
|
|
485
|
-
ISSUE_NODE_ID=$(gh api graphql -f query='{ repository(owner: "{github.org}", name: "{project.slug}-components") { issue(number: <ISSUE_NUMBER>) { id } } }' --jq '.data.repository.issue.id')
|
|
486
|
-
|
|
487
|
-
# Add to project
|
|
488
|
-
ITEM_ID=$(gh api graphql -f query='mutation { addProjectV2ItemById(input: { projectId: "{github.projectV2Id}", contentId: "'"$ISSUE_NODE_ID"'" }) { item { id } } }' --jq '.data.addProjectV2ItemById.item.id')
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
#### 4b. Set Status = Todo
|
|
492
|
-
|
|
493
|
-
```bash
|
|
494
|
-
gh api graphql -f query='mutation { updateProjectV2ItemFieldValue(input: { projectId: "{github.projectV2Id}", itemId: "'"$ITEM_ID"'", fieldId: "{github.projectV2Fields.status}", value: { singleSelectOptionId: "25f3e7a3" } }) { projectV2Item { id } } }'
|
|
495
|
-
```
|
|
496
|
-
|
|
497
|
-
#### 4c. Set Phase = Implementation
|
|
498
|
-
|
|
499
|
-
```bash
|
|
500
|
-
gh api graphql -f query='mutation { updateProjectV2ItemFieldValue(input: { projectId: "{github.projectV2Id}", itemId: "'"$ITEM_ID"'", fieldId: "{github.projectV2Fields.phase}", value: { singleSelectOptionId: "0577dcda" } }) { projectV2Item { id } } }'
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
#### 4d. Set Figma Page
|
|
504
|
-
|
|
505
|
-
Map `pageName` using the Figma Page Mapping table, then:
|
|
506
|
-
|
|
507
|
-
```bash
|
|
508
|
-
gh api graphql -f query='mutation { updateProjectV2ItemFieldValue(input: { projectId: "{github.projectV2Id}", itemId: "'"$ITEM_ID"'", fieldId: "{github.projectV2Fields.figmaPage}", value: { singleSelectOptionId: "<MAPPED_PAGE_OPTION_ID>" } }) { projectV2Item { id } } }'
|
|
509
|
-
```
|
|
510
|
-
|
|
511
|
-
### STEP 5 - Summary
|
|
512
|
-
|
|
513
|
-
Print:
|
|
514
|
-
|
|
515
|
-
```markdown
|
|
516
|
-
Issue created:
|
|
517
|
-
|
|
518
|
-
| Field | Value |
|
|
519
|
-
|-------|-------|
|
|
520
|
-
| Issue | [#N](url) |
|
|
521
|
-
| Component | <SuggestedComponentName> |
|
|
522
|
-
| Registry | <RegistryName> |
|
|
523
|
-
| Page | <PageName> |
|
|
524
|
-
| Phase | Implementation |
|
|
525
|
-
| Status | Todo |
|
|
526
|
-
| Assignee | unassigned |
|
|
527
|
-
```
|
|
528
|
-
|
|
529
|
-
---
|
|
530
|
-
|
|
531
|
-
## Command: `assign <#N>`
|
|
532
|
-
|
|
533
|
-
Assign the issue to the current GitHub user. If a Jira task is linked, also assign it.
|
|
534
|
-
|
|
535
|
-
### STEP 1 - Assign GitHub Issue
|
|
536
|
-
|
|
537
|
-
```bash
|
|
538
|
-
gh issue edit <N> --repo ${GH_REPO} --add-assignee @me
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
### STEP 2 - Assign Jira (if linked)
|
|
542
|
-
|
|
543
|
-
Read the issue body and check the `### Jira Issue` section for a linked key.
|
|
544
|
-
|
|
545
|
-
If a Jira key is found (not `_No response_`):
|
|
546
|
-
|
|
547
|
-
```bash
|
|
548
|
-
JIRA_TOKEN=$("$HOME/.claude/lib/credential-store.sh" get \1 2>/dev/null)
|
|
549
|
-
USERNAME=$(curl -s "${JIRA_BASE_URL}/rest/api/2/myself" \
|
|
550
|
-
-H "Authorization: Bearer ${JIRA_TOKEN}" | python3 -c "import sys,json; print(json.load(sys.stdin)['name'])")
|
|
551
|
-
|
|
552
|
-
curl -s -X PUT "${JIRA_BASE_URL}/rest/api/2/issue/<JIRA_KEY>/assignee" \
|
|
553
|
-
-H "Authorization: Bearer ${JIRA_TOKEN}" \
|
|
554
|
-
-H "Content-Type: application/json" \
|
|
555
|
-
-d "{\"name\": \"${USERNAME}\"}"
|
|
556
|
-
```
|
|
557
|
-
|
|
558
|
-
If Jira token not found or VPN unreachable, skip with warning.
|
|
559
|
-
|
|
560
|
-
Print: "Issue #N assigned to you." (+ "Jira <KEY> assigned." if applicable)
|
|
561
|
-
|
|
562
|
-
---
|
|
563
|
-
|
|
564
|
-
## Command: `bind-jira <#N> <{jira.projectKey}-XXXXX>`
|
|
565
|
-
|
|
566
|
-
Link an existing Jira task to the GitHub issue (both directions).
|
|
567
|
-
|
|
568
|
-
### STEP 1 - Update GitHub Issue Body
|
|
569
|
-
|
|
570
|
-
1. Read current issue body:
|
|
571
|
-
```bash
|
|
572
|
-
BODY=$(gh issue view <N> --repo ${GH_REPO} --json body --jq '.body')
|
|
573
|
-
```
|
|
574
|
-
|
|
575
|
-
2. Replace the Jira section:
|
|
576
|
-
- Find `### Jira Issue` section
|
|
577
|
-
- Replace the line after it (`_No response_` or existing key) with:
|
|
578
|
-
```
|
|
579
|
-
[<JIRA_KEY>]({jira.baseUrl}/browse/<JIRA_KEY>)
|
|
580
|
-
```
|
|
581
|
-
|
|
582
|
-
3. Update:
|
|
583
|
-
```bash
|
|
584
|
-
gh issue edit <N> --repo ${GH_REPO} --body "<UPDATED_BODY>"
|
|
585
|
-
```
|
|
586
|
-
|
|
587
|
-
### STEP 2 - Update Project Board Jira Field
|
|
588
|
-
|
|
589
|
-
```bash
|
|
590
|
-
# Get item ID from project
|
|
591
|
-
ITEM_ID=$(gh api graphql -f query='{ node(id: "{github.projectV2Id}") { ... on ProjectV2 { items(first: 100) { nodes { id content { ... on Issue { number } } } } } } }' --jq '.data.node.items.nodes[] | select(.content.number == <N>) | .id')
|
|
592
|
-
|
|
593
|
-
# Set Jira field
|
|
594
|
-
gh api graphql -f query='mutation { updateProjectV2ItemFieldValue(input: { projectId: "{github.projectV2Id}", itemId: "'"$ITEM_ID"'", fieldId: "{github.projectV2Fields.jira}", value: { text: "<JIRA_KEY>" } }) { projectV2Item { id } } }'
|
|
595
|
-
```
|
|
596
|
-
|
|
597
|
-
### STEP 3 - Update Jira Description with GitHub Link
|
|
598
|
-
|
|
599
|
-
```bash
|
|
600
|
-
JIRA_TOKEN=$("$HOME/.claude/lib/credential-store.sh" get \1 2>/dev/null)
|
|
601
|
-
|
|
602
|
-
# Get current Jira description
|
|
603
|
-
JIRA_DESC=$(curl -s "${JIRA_BASE_URL}/rest/api/2/issue/<JIRA_KEY>?fields=description" \
|
|
604
|
-
-H "Authorization: Bearer ${JIRA_TOKEN}" | python3 -c "import sys,json; print(json.load(sys.stdin)['fields'].get('description','') or '')")
|
|
605
|
-
|
|
606
|
-
# Append GitHub issue link if not already present
|
|
607
|
-
GITHUB_URL=$(gh issue view <N> --repo ${GH_REPO} --json url --jq '.url')
|
|
608
|
-
|
|
609
|
-
curl -s -X PUT "${JIRA_BASE_URL}/rest/api/2/issue/<JIRA_KEY>" \
|
|
610
|
-
-H "Authorization: Bearer ${JIRA_TOKEN}" \
|
|
611
|
-
-H "Content-Type: application/json" \
|
|
612
|
-
-d "{\"fields\": {\"description\": \"${JIRA_DESC}\n\nh3. GitHub Issue\n${GITHUB_URL}\"}}"
|
|
613
|
-
```
|
|
614
|
-
|
|
615
|
-
If Jira token is not found, skip this step with a warning.
|
|
616
|
-
|
|
617
|
-
Print: "Issue #N linked to [JIRA_KEY]({jira.baseUrl}/browse/JIRA_KEY)"
|
|
618
|
-
|
|
619
|
-
---
|
|
620
|
-
|
|
621
|
-
## Command: `phase <#N> <phase>` - **DEPRECATED**
|
|
622
|
-
|
|
623
|
-
This command is deprecated as of the architecture-update. Phase state
|
|
624
|
-
is now tracked per-flag in the component registry
|
|
625
|
-
(`status.ios.{implemented,tested,codeConnect,wiki}`), not as a single
|
|
626
|
-
enum. The `phase:*` labels are no longer used - they're replaced by
|
|
627
|
-
per-flag `impl:green`/`impl:yellow`/`test:green`/etc. labels, which are
|
|
628
|
-
applied automatically by `update-issue-from-registry.py` after every
|
|
629
|
-
phase finalize script writes the registry.
|
|
630
|
-
|
|
631
|
-
If you run this command:
|
|
632
|
-
|
|
633
|
-
```
|
|
634
|
-
/figma-issue phase 42 testing
|
|
635
|
-
```
|
|
636
|
-
|
|
637
|
-
Print this message and stop (do NOT touch the issue):
|
|
638
|
-
|
|
639
|
-
```
|
|
640
|
-
/figma-issue phase is deprecated. Phase state is now computed from the
|
|
641
|
-
component registry (Shared/Figma/Components/{nodeId}.json → status.ios).
|
|
642
|
-
|
|
643
|
-
To update an issue's labels and Progress table from the current
|
|
644
|
-
registry state, run:
|
|
645
|
-
|
|
646
|
-
python3 .instructions/figma/figma-to-swiftui/scripts/update-issue-from-registry.py \
|
|
647
|
-
--node-id <NODE_ID>
|
|
648
|
-
|
|
649
|
-
To bulk-sync all backfilled issues:
|
|
650
|
-
|
|
651
|
-
python3 .instructions/figma/figma-to-swiftui/scripts/bulk-sync-issues.py
|
|
652
|
-
```
|
|
653
|
-
|
|
654
|
-
Do not update the Projects V2 Phase field from this command anymore.
|
|
655
|
-
If you need to change Projects V2 field state, do it manually via
|
|
656
|
-
`gh api graphql` or the GitHub UI.
|
|
657
|
-
|
|
658
|
-
---
|
|
659
|
-
|
|
660
|
-
## Command: `block <#N> by <#M>`
|
|
661
|
-
|
|
662
|
-
Mark issue #N as blocked by issue #M.
|
|
663
|
-
|
|
664
|
-
### Steps
|
|
665
|
-
|
|
666
|
-
1. Add `blocked` label to issue #N:
|
|
667
|
-
```bash
|
|
668
|
-
gh issue edit <N> --repo ${GH_REPO} --add-label "blocked"
|
|
669
|
-
```
|
|
670
|
-
|
|
671
|
-
2. Add a comment to issue #N:
|
|
672
|
-
```bash
|
|
673
|
-
gh issue comment <N> --repo ${GH_REPO} --body "Blocked by #<M>"
|
|
674
|
-
```
|
|
675
|
-
|
|
676
|
-
3. Set Status = "Todo" on project board (blocked issues shouldn't be "In Progress").
|
|
677
|
-
|
|
678
|
-
Print: "Issue #N is now blocked by #M."
|
|
679
|
-
|
|
680
|
-
---
|
|
681
|
-
|
|
682
|
-
## Command: `unblock <#N>`
|
|
683
|
-
|
|
684
|
-
Remove blocked status from issue #N.
|
|
685
|
-
|
|
686
|
-
### Steps
|
|
687
|
-
|
|
688
|
-
1. Remove `blocked` label:
|
|
689
|
-
```bash
|
|
690
|
-
gh issue edit <N> --repo ${GH_REPO} --remove-label "blocked"
|
|
691
|
-
```
|
|
692
|
-
|
|
693
|
-
2. Add a comment:
|
|
694
|
-
```bash
|
|
695
|
-
gh issue comment <N> --repo ${GH_REPO} --body "Unblocked."
|
|
696
|
-
```
|
|
697
|
-
|
|
698
|
-
Print: "Issue #N unblocked."
|
|
699
|
-
|
|
700
|
-
---
|
|
701
|
-
|
|
702
|
-
## Command: `close <#N>`
|
|
703
|
-
|
|
704
|
-
1. Check all progress checkboxes in the issue body.
|
|
705
|
-
2. Set Status = Done on project board.
|
|
706
|
-
3. Close the issue:
|
|
707
|
-
```bash
|
|
708
|
-
gh issue close <N> --repo ${GH_REPO}
|
|
709
|
-
```
|
|
710
|
-
|
|
711
|
-
Print: "Issue #N closed."
|
|
712
|
-
|
|
713
|
-
---
|
|
714
|
-
|
|
715
|
-
## Command: `status [#N]`
|
|
716
|
-
|
|
717
|
-
### With issue number - show single issue
|
|
718
|
-
|
|
719
|
-
```bash
|
|
720
|
-
gh issue view <N> --repo ${GH_REPO} --json number,title,state,assignees,labels,body
|
|
721
|
-
```
|
|
722
|
-
|
|
723
|
-
Also fetch project fields:
|
|
724
|
-
```bash
|
|
725
|
-
gh api graphql -f query='{ node(id: "{github.projectV2Id}") { ... on ProjectV2 { items(first: 100) { nodes { id fieldValues(first: 10) { nodes { ... on ProjectV2ItemFieldSingleSelectValue { field { ... on ProjectV2SingleSelectField { name } } name } ... on ProjectV2ItemFieldTextValue { field { ... on ProjectV2Field { name } } text } } } content { ... on Issue { number } } } } } } }' --jq '.data.node.items.nodes[] | select(.content.number == <N>)'
|
|
726
|
-
```
|
|
727
|
-
|
|
728
|
-
Print a formatted summary with issue details + board fields.
|
|
729
|
-
|
|
730
|
-
### Without issue number - list all open
|
|
731
|
-
|
|
732
|
-
```bash
|
|
733
|
-
gh issue list --repo ${GH_REPO} --state open --label component --json number,title,assignees --jq '.[] | "| #\(.number) | \(.title) | \(.assignees | map(.login) | join(", ")) |"'
|
|
734
|
-
```
|
|
735
|
-
|
|
736
|
-
Print as a table.
|
|
737
|
-
|
|
738
|
-
---
|
|
739
|
-
|
|
740
|
-
## Error Handling
|
|
741
|
-
|
|
742
|
-
- **FigmaRegistryUtility not built**: Run `cd ${REPO_ROOT}/{repos.common.path} && swift build --product FigmaRegistryUtility`.
|
|
743
|
-
- **Issue not found**: Print error and stop.
|
|
744
|
-
- **Invalid phase**: Print valid options: `implementation`, `testing`, `code-connect`, `documentation`.
|
|
745
|
-
- **Duplicate issue**: Print existing issue link and stop - do not create.
|
|
746
|
-
- **GraphQL errors**: Print the error message from the API response.
|
|
747
|
-
- **Jira token not found**: Prompt user to add to keychain: `"$HOME/.claude/lib/credential-store.sh" set \1 \"\2\"`.
|
|
748
|
-
- **Jira API error (401/403)**: Token expired or invalid - prompt user to update keychain.
|
|
749
|
-
- **Jira API error (404)**: Wrong issue key - print error and continue.
|
|
750
|
-
- **Jira VPN not reachable**: Print warning, skip Jira steps, continue with GitHub-only operations.
|