@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,93 +0,0 @@
|
|
|
1
|
-
"""Post-finalize propagation: invoke update-issue-from-registry.py for one node.
|
|
2
|
-
|
|
3
|
-
Called at the end of each phase{4,5,6,7}-finalize.py so that completing a
|
|
4
|
-
phase flips the matching Projects V2 Status column immediately, instead of
|
|
5
|
-
waiting for the next figma-iteration-commit. Failures here are *logged
|
|
6
|
-
but not fatal* - the registry write is the single source of truth; the
|
|
7
|
-
issue sync is propagation, not a prerequisite.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
import json
|
|
13
|
-
import os
|
|
14
|
-
import subprocess
|
|
15
|
-
import sys
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
from typing import Optional
|
|
18
|
-
|
|
19
|
-
SYNC_TIMEOUT_SECONDS = 120 # per-node upper bound on the full sync (4 flag + status + review writes)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def _script_path() -> Path:
|
|
23
|
-
here = Path(__file__).resolve().parent
|
|
24
|
-
return here.parent / "update-issue-from-registry.py"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def propagate_to_issue(
|
|
28
|
-
node_id: str,
|
|
29
|
-
platform: str = "ios",
|
|
30
|
-
registry_dir: Optional[Path] = None,
|
|
31
|
-
dry_run: bool = False,
|
|
32
|
-
timeout: int = SYNC_TIMEOUT_SECONDS,
|
|
33
|
-
) -> dict:
|
|
34
|
-
"""Run update-issue-from-registry.py for a single node.
|
|
35
|
-
|
|
36
|
-
Returns:
|
|
37
|
-
{"status": "ok", "result": <parsed json>} on success
|
|
38
|
-
{"status": "skip", "reason": <str>} on skip_marked_skip / skip_icon
|
|
39
|
-
{"status": "error", "reason": <str>, "stderr": <str>} on failure
|
|
40
|
-
|
|
41
|
-
The finalize caller should include the returned dict in its own JSON
|
|
42
|
-
output under a key like "issue_sync" for visibility but should NOT
|
|
43
|
-
change its own exit code based on this result.
|
|
44
|
-
"""
|
|
45
|
-
script = _script_path()
|
|
46
|
-
if not script.exists():
|
|
47
|
-
return {"status": "error", "reason": f"script not found: {script}"}
|
|
48
|
-
|
|
49
|
-
cmd = [sys.executable, str(script), "--node-id", node_id, "--platform", platform]
|
|
50
|
-
if registry_dir is not None:
|
|
51
|
-
cmd.extend(["--registry-dir", str(registry_dir)])
|
|
52
|
-
if dry_run:
|
|
53
|
-
cmd.append("--dry-run")
|
|
54
|
-
|
|
55
|
-
try:
|
|
56
|
-
proc = subprocess.run(
|
|
57
|
-
cmd,
|
|
58
|
-
capture_output=True,
|
|
59
|
-
text=True,
|
|
60
|
-
timeout=timeout,
|
|
61
|
-
)
|
|
62
|
-
except subprocess.TimeoutExpired:
|
|
63
|
-
return {"status": "error", "reason": f"timeout after {timeout}s"}
|
|
64
|
-
except OSError as e:
|
|
65
|
-
return {"status": "error", "reason": f"{type(e).__name__}: {e}"}
|
|
66
|
-
|
|
67
|
-
if proc.returncode != 0:
|
|
68
|
-
return {
|
|
69
|
-
"status": "error",
|
|
70
|
-
"reason": f"exit {proc.returncode}",
|
|
71
|
-
"stderr": (proc.stderr or "")[:400],
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
# Parse the JSON the sync script prints so the caller can see what happened.
|
|
75
|
-
stdout = proc.stdout.strip()
|
|
76
|
-
try:
|
|
77
|
-
result = json.loads(stdout)
|
|
78
|
-
except json.JSONDecodeError:
|
|
79
|
-
return {"status": "error", "reason": "non-json stdout", "stderr": stdout[:400]}
|
|
80
|
-
|
|
81
|
-
action = result.get("action") if isinstance(result, dict) else None
|
|
82
|
-
if action in ("skip_marked_skip", "skip_icon"):
|
|
83
|
-
return {"status": "skip", "reason": action}
|
|
84
|
-
return {"status": "ok", "result": result}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
def should_skip_sync(env_override: Optional[str] = None) -> bool:
|
|
88
|
-
"""Check the FIGMA_SKIP_ISSUE_SYNC env var (for CI / tests).
|
|
89
|
-
|
|
90
|
-
Returns True if the env var is set to a truthy value ("1", "true", "yes").
|
|
91
|
-
"""
|
|
92
|
-
val = env_override if env_override is not None else os.environ.get("FIGMA_SKIP_ISSUE_SYNC", "")
|
|
93
|
-
return val.strip().lower() in ("1", "true", "yes", "on")
|
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
"""registry_writer.py - single writer for component registry JSON files.
|
|
2
|
-
|
|
3
|
-
All phase finalize scripts (phase4/5/6/7) and the figma-update script MUST go
|
|
4
|
-
through this module. No script writes to registry JSONs directly.
|
|
5
|
-
|
|
6
|
-
Schema extension (additive, does not touch existing fields):
|
|
7
|
-
|
|
8
|
-
"figmaUpdatedAt": "2026-04-08T09:12:00Z",
|
|
9
|
-
"status": {
|
|
10
|
-
"ios": {
|
|
11
|
-
"stale": false,
|
|
12
|
-
"implemented": { "value": true, "version": 3, "hash": "sha256:...", "at": "..." },
|
|
13
|
-
"tested": { "value": true, "against": 3, "at": "..." },
|
|
14
|
-
"codeConnect": { "value": true, "against": 3, "at": "..." },
|
|
15
|
-
"wiki": { "value": true, "against": 3, "at": "..." }
|
|
16
|
-
},
|
|
17
|
-
"android": { ...same shape... }
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
Yellow rule (enforced in get_flag_state):
|
|
21
|
-
A flag is YELLOW when its `against` value is less than
|
|
22
|
-
`implemented.version`. That means the implementation changed after this
|
|
23
|
-
flag was last validated, so the flag needs re-validation.
|
|
24
|
-
|
|
25
|
-
Version bump rule (enforced in set_implemented):
|
|
26
|
-
- If source_file is provided, the file is hashed and compared to the
|
|
27
|
-
stored hash. Byte-identical content does NOT bump the version.
|
|
28
|
-
- If source_file is omitted, version always bumps on each call (caller
|
|
29
|
-
explicitly wants to record a change).
|
|
30
|
-
|
|
31
|
-
Legacy compatibility:
|
|
32
|
-
The top-level `codeConnect: { ios, android }` field is mirrored whenever
|
|
33
|
-
set_flag(flag="codeConnect") is called, so existing readers
|
|
34
|
-
(register-icons-codeconnect.py, confluence-component-status.py) keep
|
|
35
|
-
working unchanged during the transition.
|
|
36
|
-
"""
|
|
37
|
-
|
|
38
|
-
import hashlib
|
|
39
|
-
import json
|
|
40
|
-
from datetime import datetime, timezone
|
|
41
|
-
from pathlib import Path
|
|
42
|
-
from typing import Optional
|
|
43
|
-
|
|
44
|
-
FLAGS = ("tested", "codeConnect", "wiki")
|
|
45
|
-
PLATFORMS = ("ios", "android")
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def now_iso() -> str:
|
|
49
|
-
"""ISO 8601 UTC timestamp with Z suffix."""
|
|
50
|
-
return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def _hash_file(path: Path) -> str:
|
|
54
|
-
"""SHA-256 hex digest of a file, truncated to 16 chars for readability."""
|
|
55
|
-
h = hashlib.sha256()
|
|
56
|
-
h.update(path.read_bytes())
|
|
57
|
-
return "sha256:" + h.hexdigest()[:16]
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def _blank_platform_status() -> dict:
|
|
61
|
-
return {
|
|
62
|
-
"stale": False,
|
|
63
|
-
"implemented": {"value": False, "version": 0, "hash": None, "at": None},
|
|
64
|
-
"tested": {"value": False, "against": 0, "at": None},
|
|
65
|
-
"codeConnect": {"value": False, "against": 0, "at": None},
|
|
66
|
-
"wiki": {"value": False, "against": 0, "at": None},
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _registry_file(registry_dir: Path, node_id: str) -> Path:
|
|
71
|
-
return Path(registry_dir) / f"{node_id.replace(':', '-')}.json"
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def _load(path: Path) -> dict:
|
|
75
|
-
if path.exists():
|
|
76
|
-
return json.loads(path.read_text(encoding="utf-8"))
|
|
77
|
-
return {}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def _save(path: Path, data: dict) -> None:
|
|
81
|
-
path.parent.mkdir(parents=True, exist_ok=True)
|
|
82
|
-
path.write_text(
|
|
83
|
-
json.dumps(data, indent=2, ensure_ascii=False) + "\n",
|
|
84
|
-
encoding="utf-8",
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
def _ensure_status_block(data: dict, platform: str) -> dict:
|
|
89
|
-
if platform not in PLATFORMS:
|
|
90
|
-
raise ValueError(f"platform must be one of {PLATFORMS}, got {platform!r}")
|
|
91
|
-
status = data.setdefault("status", {})
|
|
92
|
-
for p in PLATFORMS:
|
|
93
|
-
if p not in status:
|
|
94
|
-
status[p] = _blank_platform_status()
|
|
95
|
-
return status[platform]
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
def set_implemented(
|
|
99
|
-
registry_dir: Path,
|
|
100
|
-
node_id: str,
|
|
101
|
-
platform: str,
|
|
102
|
-
updater: str = "phase-4-view",
|
|
103
|
-
source_file: Optional[Path] = None,
|
|
104
|
-
) -> dict:
|
|
105
|
-
"""Phase 4 finalize entry point. Bumps implemented.version iff content changed.
|
|
106
|
-
|
|
107
|
-
Returns the updated `implemented` block so the caller can log the new version.
|
|
108
|
-
|
|
109
|
-
Side effects:
|
|
110
|
-
- Creates the registry file if missing (with nodeId set).
|
|
111
|
-
- Adds a `status` block if missing (both ios + android blank).
|
|
112
|
-
- Clears `status.<platform>.stale` (re-impl acknowledges Figma update).
|
|
113
|
-
- Updates `lastUpdated` and `updatedBy` top-level fields.
|
|
114
|
-
"""
|
|
115
|
-
path = _registry_file(registry_dir, node_id)
|
|
116
|
-
data = _load(path)
|
|
117
|
-
data.setdefault("nodeId", node_id)
|
|
118
|
-
|
|
119
|
-
ps = _ensure_status_block(data, platform)
|
|
120
|
-
current = ps["implemented"]
|
|
121
|
-
current_version = current.get("version", 0)
|
|
122
|
-
current_hash = current.get("hash")
|
|
123
|
-
|
|
124
|
-
new_hash = _hash_file(source_file) if source_file else None
|
|
125
|
-
|
|
126
|
-
# Byte-identical re-run with prior recording: no-op
|
|
127
|
-
if source_file and new_hash == current_hash and current.get("value"):
|
|
128
|
-
return current
|
|
129
|
-
|
|
130
|
-
# Bump: version increments by 1, or starts at 1 if first time
|
|
131
|
-
new_version = current_version + 1 if current.get("value") else max(current_version, 0) + 1
|
|
132
|
-
|
|
133
|
-
ps["implemented"] = {
|
|
134
|
-
"value": True,
|
|
135
|
-
"version": new_version,
|
|
136
|
-
"hash": new_hash,
|
|
137
|
-
"at": now_iso(),
|
|
138
|
-
}
|
|
139
|
-
ps["stale"] = False # re-impl clears stale on this platform
|
|
140
|
-
|
|
141
|
-
data["lastUpdated"] = now_iso()
|
|
142
|
-
data["updatedBy"] = updater
|
|
143
|
-
_save(path, data)
|
|
144
|
-
|
|
145
|
-
return ps["implemented"]
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
def set_flag(
|
|
149
|
-
registry_dir: Path,
|
|
150
|
-
node_id: str,
|
|
151
|
-
platform: str,
|
|
152
|
-
flag: str,
|
|
153
|
-
updater: str,
|
|
154
|
-
) -> dict:
|
|
155
|
-
"""Phase 5/6/7 finalize entry point. Records flag as validated against current impl.version.
|
|
156
|
-
|
|
157
|
-
flag must be one of: tested | codeConnect | wiki
|
|
158
|
-
|
|
159
|
-
Side effects:
|
|
160
|
-
- Writes `status.<platform>.<flag> = { value: true, against: <impl.version>, at }`
|
|
161
|
-
- For flag='codeConnect', mirrors to legacy `codeConnect.<platform> = true`
|
|
162
|
-
- Updates `lastUpdated` and `updatedBy`
|
|
163
|
-
|
|
164
|
-
Returns the updated flag block.
|
|
165
|
-
"""
|
|
166
|
-
if flag not in FLAGS:
|
|
167
|
-
raise ValueError(f"flag must be one of {FLAGS}, got {flag!r}")
|
|
168
|
-
|
|
169
|
-
path = _registry_file(registry_dir, node_id)
|
|
170
|
-
data = _load(path)
|
|
171
|
-
data.setdefault("nodeId", node_id)
|
|
172
|
-
|
|
173
|
-
ps = _ensure_status_block(data, platform)
|
|
174
|
-
impl_version = ps["implemented"].get("version", 0)
|
|
175
|
-
|
|
176
|
-
ps[flag] = {
|
|
177
|
-
"value": True,
|
|
178
|
-
"against": impl_version,
|
|
179
|
-
"at": now_iso(),
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
# Legacy mirror for codeConnect
|
|
183
|
-
if flag == "codeConnect":
|
|
184
|
-
data.setdefault("codeConnect", {"ios": False, "android": False})
|
|
185
|
-
data["codeConnect"][platform] = True
|
|
186
|
-
|
|
187
|
-
data["lastUpdated"] = now_iso()
|
|
188
|
-
data["updatedBy"] = updater
|
|
189
|
-
_save(path, data)
|
|
190
|
-
|
|
191
|
-
return ps[flag]
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
def set_implemented_by(
|
|
195
|
-
registry_dir: Path,
|
|
196
|
-
node_id: str,
|
|
197
|
-
platform: str,
|
|
198
|
-
author: str,
|
|
199
|
-
updater: str = "backfill-status",
|
|
200
|
-
) -> None:
|
|
201
|
-
"""Record who implemented a component (git author, most-commits-wins).
|
|
202
|
-
|
|
203
|
-
Writes `status.<platform>.implementedBy = <author_name>`. This is
|
|
204
|
-
metadata for issue assignment - does NOT affect any version or
|
|
205
|
-
flag-state computation.
|
|
206
|
-
"""
|
|
207
|
-
if not isinstance(platform, str) or platform not in PLATFORMS:
|
|
208
|
-
raise ValueError(f"platform must be one of {PLATFORMS}, got {platform!r}")
|
|
209
|
-
if not author or not isinstance(author, str):
|
|
210
|
-
return
|
|
211
|
-
|
|
212
|
-
path = _registry_file(registry_dir, node_id)
|
|
213
|
-
data = _load(path)
|
|
214
|
-
data.setdefault("nodeId", node_id)
|
|
215
|
-
|
|
216
|
-
ps = _ensure_status_block(data, platform)
|
|
217
|
-
ps["implementedBy"] = author
|
|
218
|
-
|
|
219
|
-
data["lastUpdated"] = now_iso()
|
|
220
|
-
data["updatedBy"] = updater
|
|
221
|
-
_save(path, data)
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
def mark_stale(
|
|
225
|
-
registry_dir: Path,
|
|
226
|
-
node_id: str,
|
|
227
|
-
figma_updated_at: str,
|
|
228
|
-
) -> bool:
|
|
229
|
-
"""figma-update script entry point.
|
|
230
|
-
|
|
231
|
-
If `figma_updated_at` is newer than the stored `figmaUpdatedAt`, sets
|
|
232
|
-
`status.<platform>.stale=true` for any platform that has been implemented.
|
|
233
|
-
|
|
234
|
-
Does NOT create new registry files - only updates existing ones.
|
|
235
|
-
|
|
236
|
-
Returns True if the registry was modified, False otherwise.
|
|
237
|
-
"""
|
|
238
|
-
path = _registry_file(registry_dir, node_id)
|
|
239
|
-
if not path.exists():
|
|
240
|
-
return False
|
|
241
|
-
|
|
242
|
-
data = _load(path)
|
|
243
|
-
|
|
244
|
-
prev = data.get("figmaUpdatedAt")
|
|
245
|
-
if prev and prev >= figma_updated_at:
|
|
246
|
-
return False
|
|
247
|
-
|
|
248
|
-
data["figmaUpdatedAt"] = figma_updated_at
|
|
249
|
-
for platform in PLATFORMS:
|
|
250
|
-
ps = _ensure_status_block(data, platform)
|
|
251
|
-
# Only mark a platform stale if something was actually implemented there
|
|
252
|
-
if ps["implemented"].get("value"):
|
|
253
|
-
ps["stale"] = True
|
|
254
|
-
|
|
255
|
-
data["lastUpdated"] = now_iso()
|
|
256
|
-
data["updatedBy"] = "figma-update-script"
|
|
257
|
-
_save(path, data)
|
|
258
|
-
return True
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
def get_flag_state(
|
|
262
|
-
registry_dir: Path,
|
|
263
|
-
node_id: str,
|
|
264
|
-
platform: str,
|
|
265
|
-
flag: str,
|
|
266
|
-
) -> str:
|
|
267
|
-
"""Returns 'gray' | 'yellow' | 'green' for dashboard/reader consumption.
|
|
268
|
-
|
|
269
|
-
Rules:
|
|
270
|
-
implemented:
|
|
271
|
-
value == False → 'gray'
|
|
272
|
-
value == True → 'green' (baseline, never yellow)
|
|
273
|
-
|
|
274
|
-
tested | codeConnect | wiki:
|
|
275
|
-
value == False → 'gray'
|
|
276
|
-
value == True, against < impl.ver → 'yellow'
|
|
277
|
-
value == True, against >= impl.ver → 'green'
|
|
278
|
-
|
|
279
|
-
The `stale` flag is intentionally orthogonal - it signals "Figma changed"
|
|
280
|
-
and is surfaced separately to dashboards, not folded into the flag state.
|
|
281
|
-
"""
|
|
282
|
-
path = _registry_file(registry_dir, node_id)
|
|
283
|
-
if not path.exists():
|
|
284
|
-
return "gray"
|
|
285
|
-
|
|
286
|
-
data = _load(path)
|
|
287
|
-
status = data.get("status", {}).get(platform, {})
|
|
288
|
-
f = status.get(flag, {"value": False})
|
|
289
|
-
|
|
290
|
-
if not f.get("value"):
|
|
291
|
-
return "gray"
|
|
292
|
-
|
|
293
|
-
if flag == "implemented":
|
|
294
|
-
return "green"
|
|
295
|
-
|
|
296
|
-
impl_version = status.get("implemented", {}).get("version", 0)
|
|
297
|
-
if f.get("against", 0) < impl_version:
|
|
298
|
-
return "yellow"
|
|
299
|
-
return "green"
|