ai-delivery-workflow 0.2.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -14
- package/bin/ai-delivery.mjs +181 -6
- package/bin/benchmark-autonomy.mjs +217 -0
- package/bin/release-check.mjs +382 -0
- package/docs/CLI-PARAMETER-REFERENCE.zh-CN.md +346 -0
- package/docs/CODEGRAPH-INTEGRATION.zh-CN.md +89 -0
- package/docs/DUAL-REPOSITORY-WORKSPACE.zh-CN.md +2 -2
- package/docs/EVOLUTION-MAINTENANCE.zh-CN.md +7 -7
- package/docs/EVOLUTION-USER-GUIDE.zh-CN.md +2 -2
- package/docs/FILE-REFERENCE.zh-CN.md +120 -39
- package/docs/MAINTENANCE-VERIFICATION.zh-CN.md +51 -0
- package/docs/MOCK-SYSTEM.zh-CN.md +141 -0
- package/docs/NPM-RELEASE-MANAGEMENT.zh-CN.md +106 -0
- package/docs/PROJECT-MANUAL.zh-CN.md +154 -95
- package/docs/PROTOTYPE-MIGRATION.zh-CN.md +164 -0
- package/docs/STATE-CLI-MAINTENANCE.zh-CN.md +35 -17
- package/docs/STATE-CLI-USER-GUIDE.zh-CN.md +115 -39
- package/docs/VIEWER-MAINTENANCE.zh-CN.md +101 -324
- package/docs/VIEWER-USER-GUIDE.zh-CN.md +68 -190
- package/docs/adr/0001-prototype-first-ui-governance.md +3 -0
- package/docs/adr/0002-microcks-as-default-mock-system.md +3 -0
- package/docs/adr/0003-workflow-manager-governed-control-surface.md +46 -0
- package/docs/adr/0004-operational-carbon-visual-standard.md +9 -0
- package/docs/adr/0005-prototype-management-as-routed-pages.md +7 -0
- package/docs/agents/domain.md +12 -0
- package/docs/agents/issue-tracker.md +27 -0
- package/docs/agents/triage-labels.md +11 -0
- package/docs/agents/workflow-manager-acceptance-matrix.md +93 -0
- package/docs/agents/workflow-manager-agent-interface.md +145 -0
- package/docs/agents/workflow-manager-current-state.md +205 -0
- package/lib/artifact-files.mjs +47 -0
- package/lib/codegraph.mjs +405 -0
- package/lib/delivery-state.mjs +3079 -198
- package/lib/frontend-guard.mjs +288 -0
- package/lib/fs-utils.mjs +53 -0
- package/lib/history-anchor.mjs +98 -0
- package/lib/mock-scenario-pack.mjs +687 -0
- package/lib/mock-system.mjs +897 -0
- package/lib/npm-package-result.mjs +11 -0
- package/lib/png-evidence.mjs +149 -0
- package/lib/project-bootstrap.mjs +96 -55
- package/lib/project-installer.mjs +1484 -164
- package/lib/project-migration.mjs +1193 -0
- package/lib/prototype-migration.mjs +713 -0
- package/lib/prototype-page-review.mjs +384 -0
- package/lib/prototype-review-target.mjs +334 -0
- package/lib/prototype-revision.mjs +812 -0
- package/lib/stable-value.mjs +15 -0
- package/lib/toml-hooks.mjs +69 -0
- package/lib/ui-acceptance.mjs +565 -0
- package/lib/visual-standard.mjs +232 -0
- package/lib/workflow-manager-contracts.mjs +367 -0
- package/lib/workflow-manager-facts.mjs +778 -0
- package/lib/workflow-manager-governance.mjs +514 -0
- package/lib/workflow-manager-mock.mjs +183 -0
- package/lib/workflow-manager-prototypes.mjs +1847 -0
- package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/lib/workflow-manager-public/assets/index-Chlg6r8f.css +1 -0
- package/lib/workflow-manager-public/assets/index-E-hGB5ZD.js +13 -0
- package/lib/workflow-manager-public/fonts/OFL-1.1.txt +90 -0
- package/lib/workflow-manager-public/index.html +14 -0
- package/lib/workflow-manager-systems.mjs +519 -0
- package/lib/workflow-manager-transaction.mjs +397 -0
- package/lib/workflow-manager.mjs +745 -0
- package/package.json +8 -2
- package/skills/ai-delivery-assemble-release/agents/openai.yaml +3 -3
- package/skills/ai-delivery-assemble-release/assets/release-material-index.csv +1 -1
- package/skills/ai-delivery-assemble-release/assets/version-inclusion.csv +1 -1
- package/skills/ai-delivery-bootstrap/SKILL.md +4 -4
- package/skills/ai-delivery-bootstrap/agents/openai.yaml +3 -3
- package/skills/ai-delivery-bootstrap/references/bootstrap-contract.md +4 -2
- package/skills/ai-delivery-checkpoint-task/SKILL.md +17 -3
- package/skills/ai-delivery-checkpoint-task/agents/openai.yaml +3 -3
- package/skills/ai-delivery-checkpoint-task/assets/runtime-template/task.json +7 -1
- package/skills/ai-delivery-checkpoint-task/references/checkpoint-contract.md +22 -8
- package/skills/ai-delivery-checkpoint-task/scripts/hook-event.mjs +91 -0
- package/skills/ai-delivery-checkpoint-task/scripts/task-state.mjs +1086 -51
- package/skills/ai-delivery-close-version/SKILL.md +9 -8
- package/skills/ai-delivery-close-version/agents/openai.yaml +3 -3
- package/skills/ai-delivery-close-version/assets/version-lineage.yaml +1 -1
- package/skills/ai-delivery-close-version/references/version-closeout-contract.md +2 -2
- package/skills/ai-delivery-define-product/SKILL.md +8 -4
- package/skills/ai-delivery-define-product/agents/openai.yaml +4 -4
- package/skills/ai-delivery-define-product/references/product-contract.md +2 -2
- package/skills/ai-delivery-deploy-production/agents/openai.yaml +3 -3
- package/skills/ai-delivery-design-architecture/SKILL.md +9 -5
- package/skills/ai-delivery-design-architecture/assets/architecture-template/prototype-architecture-validation.yaml +16 -16
- package/skills/ai-delivery-design-architecture/references/architecture-contract.md +1 -1
- package/skills/ai-delivery-design-experience/SKILL.md +36 -30
- package/skills/ai-delivery-design-experience/agents/openai.yaml +4 -4
- package/skills/ai-delivery-design-experience/assets/experience-template/LEGACY-COMPATIBILITY.md +16 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/design-reference-selection.yaml +32 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/experience-baseline.yaml +2 -2
- package/skills/ai-delivery-design-experience/assets/experience-template/formal-ui-confirmation.yaml +16 -3
- package/skills/ai-delivery-design-experience/assets/experience-template/frontend-change-scope.yaml +30 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/interaction-contract.csv +1 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/mock-admin-export.yaml +8 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/mock-scenario-mappings.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/mock-scenario-pack-request.yaml +24 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/product-prototype-reconciliation.yaml +2 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-adjustment-log.csv +1 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-component-bindings.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-component-candidates.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-components.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-confirmation.yaml +18 -18
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-data-contracts.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-impact-assessment.yaml +5 -5
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-implementation-bindings.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-manifest.yaml +2 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-pages.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-product-coverage.csv +1 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-comments.csv +1 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-decision.yaml +13 -12
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-scenes.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-sessions.csv +1 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-unit-pages.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-units.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-revision.yaml +88 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-routes.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-set.yaml +2 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-source-inspection-snapshots.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-terminals.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-tool-candidates.csv +1 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-tool-selection.yaml +2 -3
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-traceability.csv +1 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-trigger-conditions.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype.yaml +6 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/ui-framework-selection.yaml +17 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/ui-handoff.yaml +6 -5
- package/skills/ai-delivery-design-experience/assets/experience-template/ui-mapping.csv +1 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/visual-direction.yaml +4 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/visual-reference-manifest.yaml +23 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/visual-reference.html +163 -0
- package/skills/ai-delivery-design-experience/assets/experience-template/visual-system-confirmation.yaml +11 -0
- package/skills/ai-delivery-design-experience/references/experience-contract.md +26 -27
- package/skills/ai-delivery-design-experience/references/prototype-management-contract.md +42 -21
- package/skills/ai-delivery-design-tests/SKILL.md +13 -7
- package/skills/ai-delivery-design-tests/assets/test-design-template/prototype-test-scope.csv +1 -1
- package/skills/ai-delivery-design-tests/assets/test-design-template/prototype-test-validation.yaml +17 -16
- package/skills/ai-delivery-design-tests/references/test-design-contract.md +7 -5
- package/skills/ai-delivery-develop-iteration/SKILL.md +18 -11
- package/skills/ai-delivery-develop-iteration/agents/openai.yaml +3 -3
- package/skills/ai-delivery-develop-iteration/assets/development-template/candidate-manifest.yaml +36 -0
- package/skills/ai-delivery-develop-iteration/assets/development-template/task-prototype-traceability.csv +1 -1
- package/skills/ai-delivery-develop-iteration/references/development-contract.md +5 -3
- package/skills/ai-delivery-evolve-workflow/agents/openai.yaml +3 -3
- package/skills/ai-delivery-execute-test/SKILL.md +6 -2
- package/skills/ai-delivery-execute-test/agents/openai.yaml +4 -4
- package/skills/ai-delivery-execute-work-package/SKILL.md +10 -3
- package/skills/ai-delivery-execute-work-package/agents/openai.yaml +4 -4
- package/skills/ai-delivery-execute-work-package/references/work-package-contract.md +1 -1
- package/skills/ai-delivery-manage-git/agents/openai.yaml +3 -3
- package/skills/ai-delivery-manage-standards/agents/openai.yaml +4 -4
- package/skills/ai-delivery-orchestrate/SKILL.md +47 -29
- package/skills/ai-delivery-orchestrate/agents/openai.yaml +3 -3
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/migrations/.gitkeep +0 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/repairs/.gitkeep +0 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/project.yaml +1 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/workflow-state.yaml +2 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/frontend-guard/frontend-guard.mjs +50 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/hooks/hook-event.mjs +91 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/manager.mjs +64 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.cmd +4 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.ps1 +2 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/{viewer → manager}/start.sh +1 -1
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/mock/mock.mjs +50 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/ui-acceptance/ui-acceptance.mjs +37 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/AGENTS.md +32 -6
- package/skills/ai-delivery-orchestrate/assets/project-template/gitignore.template +1 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/CONTRIBUTING.md +25 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/LICENSE +21 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/README.md +250 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/UPSTREAM.yaml +19 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/DESIGN.md +545 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/DESIGN.md +554 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/DESIGN.md +562 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/DESIGN.md +634 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/DESIGN.md +544 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/DESIGN.md +503 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/DESIGN.md +454 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/DESIGN.md +542 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/DESIGN.md +589 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/DESIGN.md +541 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/DESIGN.md +544 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/DESIGN.md +451 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/DESIGN.md +570 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/DESIGN.md +506 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/DESIGN.md +537 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/DESIGN.md +632 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/DESIGN.md +504 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/DESIGN.md +526 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/DESIGN.md +531 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/DESIGN.md +578 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/DESIGN.md +544 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/DESIGN.md +575 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/DESIGN.md +670 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/DESIGN.md +550 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/DESIGN.md +546 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/DESIGN.md +125 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/DESIGN.md +288 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/DESIGN.md +548 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/DESIGN.md +298 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/DESIGN.md +365 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/DESIGN.md +683 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/DESIGN.md +746 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/DESIGN.md +852 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/DESIGN.md +825 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/DESIGN.md +773 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/DESIGN.md +767 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/DESIGN.md +575 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/DESIGN.md +649 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/DESIGN.md +821 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/DESIGN.md +640 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/DESIGN.md +539 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/DESIGN.md +521 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/DESIGN.md +597 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/DESIGN.md +661 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/DESIGN.md +690 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/DESIGN.md +669 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/DESIGN.md +589 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/DESIGN.md +616 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/DESIGN.md +585 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/DESIGN.md +636 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/DESIGN.md +244 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/DESIGN.md +357 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/DESIGN.md +551 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/DESIGN.md +516 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/slack/DESIGN.md +482 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/DESIGN.md +363 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/DESIGN.md +246 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/DESIGN.md +580 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/DESIGN.md +487 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/DESIGN.md +462 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/DESIGN.md +448 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/DESIGN.md +286 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/DESIGN.md +339 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/DESIGN.md +633 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/DESIGN.md +636 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/DESIGN.md +736 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/DESIGN.md +538 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/DESIGN.md +521 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/DESIGN.md +526 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/DESIGN.md +588 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/DESIGN.md +497 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/DESIGN.md +544 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/DESIGN.md +465 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/README.md +5 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/DESIGN.md +537 -0
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/README.md +5 -0
- package/skills/ai-delivery-orchestrate/references/formal-state-contract.md +65 -20
- package/skills/ai-delivery-orchestrate/references/workflow-model.md +7 -5
- package/skills/ai-delivery-orchestrate-release/SKILL.md +2 -2
- package/skills/ai-delivery-orchestrate-release/agents/openai.yaml +4 -4
- package/skills/ai-delivery-orchestrate-release/references/release-workflow-contract.md +1 -1
- package/skills/ai-delivery-plan-iteration/SKILL.md +11 -4
- package/skills/ai-delivery-plan-iteration/agents/openai.yaml +4 -4
- package/skills/ai-delivery-plan-iteration/assets/planning-template/scope-manifest.yaml +17 -0
- package/skills/ai-delivery-plan-iteration/assets/planning-template/slice-prototype-traceability.csv +1 -1
- package/skills/ai-delivery-plan-iteration/references/planning-contract.md +8 -2
- package/skills/ai-delivery-prepare-platform/SKILL.md +5 -1
- package/skills/ai-delivery-prepare-platform/agents/openai.yaml +4 -4
- package/skills/ai-delivery-prepare-release/agents/openai.yaml +4 -4
- package/skills/ai-delivery-review-change/SKILL.md +14 -4
- package/skills/ai-delivery-review-change/agents/openai.yaml +4 -4
- package/skills/ai-delivery-review-change/references/review-contract.md +6 -0
- package/skills/ai-delivery-triage-failure/SKILL.md +5 -1
- package/skills/ai-delivery-triage-failure/agents/openai.yaml +4 -4
- package/skills/ai-delivery-validate-artifacts/SKILL.md +6 -3
- package/skills/ai-delivery-validate-artifacts/agents/openai.yaml +4 -4
- package/skills/ai-delivery-validate-artifacts/references/artifact-contract.md +13 -13
- package/skills/ai-delivery-verify-candidate/SKILL.md +13 -6
- package/skills/ai-delivery-verify-candidate/agents/openai.yaml +3 -3
- package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-request.yaml +19 -0
- package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-results.yaml +53 -0
- package/skills/ai-delivery-verify-candidate/references/candidate-verification-contract.md +10 -2
- package/skills/ai-delivery-verify-production/agents/openai.yaml +3 -3
- package/skills/ai-delivery-design-experience/assets/experience-template/low-fidelity-confirmation.yaml +0 -32
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/app.js +0 -546
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/index.html +0 -199
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/styles.css +0 -529
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/server.mjs +0 -780
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.cmd +0 -4
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.ps1 +0 -2
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function normalizeNpmPackageResult(parsed, manifest) {
|
|
2
|
+
if (Array.isArray(parsed)) return parsed[0];
|
|
3
|
+
if (!parsed || typeof parsed !== "object") return parsed;
|
|
4
|
+
if (parsed.name || parsed.id || Array.isArray(parsed.files)) return parsed;
|
|
5
|
+
|
|
6
|
+
const direct = parsed[manifest.name];
|
|
7
|
+
if (direct && typeof direct === "object") return direct;
|
|
8
|
+
|
|
9
|
+
return Object.values(parsed).find((value) => value && typeof value === "object"
|
|
10
|
+
&& (value.name === manifest.name || value.id === `${manifest.name}@${manifest.version}`));
|
|
11
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import zlib from "node:zlib";
|
|
3
|
+
|
|
4
|
+
const pngSignature = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
5
|
+
|
|
6
|
+
function crc32(value) {
|
|
7
|
+
let checksum = 0xffffffff;
|
|
8
|
+
for (const byte of value) {
|
|
9
|
+
checksum ^= byte;
|
|
10
|
+
for (let bit = 0; bit < 8; bit += 1) {
|
|
11
|
+
checksum = (checksum >>> 1) ^ (0xedb88320 & -(checksum & 1));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return (checksum ^ 0xffffffff) >>> 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function paeth(left, above, upperLeft) {
|
|
18
|
+
const estimate = left + above - upperLeft;
|
|
19
|
+
const leftDistance = Math.abs(estimate - left);
|
|
20
|
+
const aboveDistance = Math.abs(estimate - above);
|
|
21
|
+
const upperLeftDistance = Math.abs(estimate - upperLeft);
|
|
22
|
+
if (leftDistance <= aboveDistance && leftDistance <= upperLeftDistance) return left;
|
|
23
|
+
return aboveDistance <= upperLeftDistance ? above : upperLeft;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function decodePng(file, expectedWidth, expectedHeight, label) {
|
|
27
|
+
const bytes = fs.readFileSync(file);
|
|
28
|
+
if (bytes.length < pngSignature.length || !bytes.subarray(0, 8).equals(pngSignature)) {
|
|
29
|
+
throw new Error(`${label} is not a PNG image.`);
|
|
30
|
+
}
|
|
31
|
+
let offset = 8;
|
|
32
|
+
let header = null;
|
|
33
|
+
let ended = false;
|
|
34
|
+
const compressed = [];
|
|
35
|
+
while (offset < bytes.length) {
|
|
36
|
+
if (offset + 12 > bytes.length) throw new Error(`${label} PNG chunk is truncated.`);
|
|
37
|
+
const length = bytes.readUInt32BE(offset);
|
|
38
|
+
const end = offset + 12 + length;
|
|
39
|
+
if (end > bytes.length) throw new Error(`${label} PNG chunk length is invalid.`);
|
|
40
|
+
const type = bytes.subarray(offset + 4, offset + 8);
|
|
41
|
+
const data = bytes.subarray(offset + 8, offset + 8 + length);
|
|
42
|
+
const expectedCrc = bytes.readUInt32BE(offset + 8 + length);
|
|
43
|
+
if (crc32(Buffer.concat([type, data])) !== expectedCrc) {
|
|
44
|
+
throw new Error(`${label} PNG chunk checksum mismatch.`);
|
|
45
|
+
}
|
|
46
|
+
const name = type.toString("ascii");
|
|
47
|
+
if (name === "IHDR") {
|
|
48
|
+
if (header || length !== 13) throw new Error(`${label} PNG header is invalid.`);
|
|
49
|
+
header = {
|
|
50
|
+
width: data.readUInt32BE(0),
|
|
51
|
+
height: data.readUInt32BE(4),
|
|
52
|
+
bitDepth: data[8],
|
|
53
|
+
colorType: data[9],
|
|
54
|
+
compression: data[10],
|
|
55
|
+
filter: data[11],
|
|
56
|
+
interlace: data[12],
|
|
57
|
+
};
|
|
58
|
+
} else if (name === "IDAT") {
|
|
59
|
+
compressed.push(data);
|
|
60
|
+
} else if (name === "IEND") {
|
|
61
|
+
if (length !== 0) throw new Error(`${label} PNG end chunk is invalid.`);
|
|
62
|
+
ended = true;
|
|
63
|
+
offset = end;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
offset = end;
|
|
67
|
+
}
|
|
68
|
+
if (!header || !ended || offset !== bytes.length || compressed.length === 0) {
|
|
69
|
+
throw new Error(`${label} PNG structure is incomplete.`);
|
|
70
|
+
}
|
|
71
|
+
if (header.width !== expectedWidth || header.height !== expectedHeight) {
|
|
72
|
+
throw new Error(
|
|
73
|
+
`${label} PNG dimensions ${header.width}x${header.height} do not match ${expectedWidth}x${expectedHeight}.`,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
if (header.bitDepth !== 8 || !new Set([2, 6]).has(header.colorType)
|
|
77
|
+
|| header.compression !== 0 || header.filter !== 0 || header.interlace !== 0) {
|
|
78
|
+
throw new Error(`${label} PNG must be non-interlaced 8-bit RGB or RGBA.`);
|
|
79
|
+
}
|
|
80
|
+
const channels = header.colorType === 6 ? 4 : 3;
|
|
81
|
+
const stride = header.width * channels;
|
|
82
|
+
const expectedLength = (stride + 1) * header.height;
|
|
83
|
+
let scanlines;
|
|
84
|
+
try {
|
|
85
|
+
scanlines = zlib.inflateSync(Buffer.concat(compressed), { maxOutputLength: expectedLength });
|
|
86
|
+
} catch (error) {
|
|
87
|
+
throw new Error(`${label} PNG pixel data is invalid: ${error.message}`);
|
|
88
|
+
}
|
|
89
|
+
if (scanlines.length !== expectedLength) throw new Error(`${label} PNG pixel data length is invalid.`);
|
|
90
|
+
const decoded = Buffer.alloc(stride * header.height);
|
|
91
|
+
for (let y = 0; y < header.height; y += 1) {
|
|
92
|
+
const encodedRow = y * (stride + 1);
|
|
93
|
+
const decodedRow = y * stride;
|
|
94
|
+
const filter = scanlines[encodedRow];
|
|
95
|
+
if (filter > 4) throw new Error(`${label} PNG uses an invalid scanline filter.`);
|
|
96
|
+
for (let x = 0; x < stride; x += 1) {
|
|
97
|
+
const raw = scanlines[encodedRow + 1 + x];
|
|
98
|
+
const left = x >= channels ? decoded[decodedRow + x - channels] : 0;
|
|
99
|
+
const above = y > 0 ? decoded[decodedRow + x - stride] : 0;
|
|
100
|
+
const upperLeft = y > 0 && x >= channels
|
|
101
|
+
? decoded[decodedRow + x - stride - channels]
|
|
102
|
+
: 0;
|
|
103
|
+
let value = raw;
|
|
104
|
+
if (filter === 1) value += left;
|
|
105
|
+
else if (filter === 2) value += above;
|
|
106
|
+
else if (filter === 3) value += Math.floor((left + above) / 2);
|
|
107
|
+
else if (filter === 4) value += paeth(left, above, upperLeft);
|
|
108
|
+
decoded[decodedRow + x] = value & 0xff;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (channels === 4) return decoded;
|
|
112
|
+
const rgba = Buffer.alloc(header.width * header.height * 4);
|
|
113
|
+
for (let source = 0, target = 0; source < decoded.length; source += 3, target += 4) {
|
|
114
|
+
rgba[target] = decoded[source];
|
|
115
|
+
rgba[target + 1] = decoded[source + 1];
|
|
116
|
+
rgba[target + 2] = decoded[source + 2];
|
|
117
|
+
rgba[target + 3] = 255;
|
|
118
|
+
}
|
|
119
|
+
return rgba;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function verifyVisualPngEvidence(files, viewport, label) {
|
|
123
|
+
const prototype = decodePng(
|
|
124
|
+
files.prototype,
|
|
125
|
+
viewport.width,
|
|
126
|
+
viewport.height,
|
|
127
|
+
`${label} Prototype screenshot`,
|
|
128
|
+
);
|
|
129
|
+
const candidate = decodePng(
|
|
130
|
+
files.candidate,
|
|
131
|
+
viewport.width,
|
|
132
|
+
viewport.height,
|
|
133
|
+
`${label} Candidate screenshot`,
|
|
134
|
+
);
|
|
135
|
+
const diff = decodePng(files.diff, viewport.width, viewport.height, `${label} Visual diff`);
|
|
136
|
+
let changedPixels = 0;
|
|
137
|
+
for (let offset = 0; offset < prototype.length; offset += 4) {
|
|
138
|
+
const changed = prototype[offset] !== candidate[offset]
|
|
139
|
+
|| prototype[offset + 1] !== candidate[offset + 1]
|
|
140
|
+
|| prototype[offset + 2] !== candidate[offset + 2]
|
|
141
|
+
|| prototype[offset + 3] !== candidate[offset + 3];
|
|
142
|
+
const marked = diff[offset + 3] > 0;
|
|
143
|
+
if (changed !== marked) {
|
|
144
|
+
throw new Error(`${label} Visual diff PNG does not mark the independently measured pixels.`);
|
|
145
|
+
}
|
|
146
|
+
if (changed) changedPixels += 1;
|
|
147
|
+
}
|
|
148
|
+
return { changedPixels, totalPixels: viewport.width * viewport.height };
|
|
149
|
+
}
|
|
@@ -3,7 +3,11 @@ import fs from "node:fs";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { spawnSync } from "node:child_process";
|
|
5
5
|
import { parse as parseYaml, stringify as stringifyYaml } from "./yaml-runtime.mjs";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
findIncompatibleNodeStates,
|
|
8
|
+
stableValue,
|
|
9
|
+
withFormalStateReadLock,
|
|
10
|
+
} from "./delivery-state.mjs";
|
|
7
11
|
import { inspectGitRepository, readWorkspaceConfiguration } from "./workspace.mjs";
|
|
8
12
|
|
|
9
13
|
const IGNORED_DIRECTORIES = new Set([
|
|
@@ -79,6 +83,8 @@ const WORKFLOW_REQUIRED_FILES = [
|
|
|
79
83
|
".codex/config.toml",
|
|
80
84
|
"AGENTS.md",
|
|
81
85
|
".workflow/tools/state/state.mjs",
|
|
86
|
+
".workflow/tools/state/history-anchor.mjs",
|
|
87
|
+
".workflow/tools/state/fs-utils.mjs",
|
|
82
88
|
".workflow/tools/evolution/evolve.mjs",
|
|
83
89
|
".workflow/tools/hooks/hook-event.mjs",
|
|
84
90
|
".workflow/delivery/project.yaml",
|
|
@@ -289,18 +295,40 @@ function readStructuredFile(file, format, errors) {
|
|
|
289
295
|
}
|
|
290
296
|
}
|
|
291
297
|
|
|
298
|
+
function normalizeInspectedScope(value, fallbackScopeId = null) {
|
|
299
|
+
return {
|
|
300
|
+
scope_id: value?.scope_id ?? fallbackScopeId,
|
|
301
|
+
active_nodes: Array.isArray(value?.active_nodes) ? value.active_nodes : [],
|
|
302
|
+
blocked_nodes: Array.isArray(value?.blocked_nodes) ? value.blocked_nodes : [],
|
|
303
|
+
completed_nodes: Array.isArray(value?.completed_nodes) ? value.completed_nodes : [],
|
|
304
|
+
pending_gates: Array.isArray(value?.pending_gates) ? value.pending_gates : [],
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function inspectWorkflowScopes(workflowState, errors) {
|
|
309
|
+
const schemaVersion = Number(workflowState?.schema_version || 1);
|
|
310
|
+
const development = schemaVersion >= 2
|
|
311
|
+
? normalizeInspectedScope(workflowState.development_state)
|
|
312
|
+
: normalizeInspectedScope(workflowState, workflowState.iteration_id ?? null);
|
|
313
|
+
const release = schemaVersion >= 2
|
|
314
|
+
? normalizeInspectedScope(workflowState.release_state)
|
|
315
|
+
: normalizeInspectedScope(null);
|
|
316
|
+
|
|
317
|
+
for (const [scopeName, scope] of [["development", development], ["release", release]]) {
|
|
318
|
+
for (const conflict of findIncompatibleNodeStates(scope)) {
|
|
319
|
+
errors.push(`Workflow node appears in incompatible states in ${scopeName}: ${conflict.node} (${conflict.states.join(", ")}).`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
return { development, release };
|
|
324
|
+
}
|
|
325
|
+
|
|
292
326
|
function compareTasks(left, right) {
|
|
293
327
|
const leftSequence = Number.isInteger(left.sequence) ? left.sequence : Number.MAX_SAFE_INTEGER;
|
|
294
328
|
const rightSequence = Number.isInteger(right.sequence) ? right.sequence : Number.MAX_SAFE_INTEGER;
|
|
295
329
|
return leftSequence - rightSequence || String(left.task_id).localeCompare(String(right.task_id));
|
|
296
330
|
}
|
|
297
331
|
|
|
298
|
-
function stableValue(value) {
|
|
299
|
-
if (Array.isArray(value)) return value.map(stableValue);
|
|
300
|
-
if (!value || typeof value !== "object") return value;
|
|
301
|
-
return Object.fromEntries(Object.keys(value).sort().map((key) => [key, stableValue(value[key])]));
|
|
302
|
-
}
|
|
303
|
-
|
|
304
332
|
function taskStateChecksum(task, root) {
|
|
305
333
|
const comparable = { ...task };
|
|
306
334
|
const stateRoot = path.resolve(root, comparable.state_root || ".");
|
|
@@ -365,8 +393,14 @@ function inspectRuntime(root, errors, workflowRoot = ".workflow") {
|
|
|
365
393
|
}
|
|
366
394
|
return true;
|
|
367
395
|
});
|
|
396
|
+
const readyIds = new Set(ready.map((task) => task.task_id));
|
|
397
|
+
const waiting = queued.filter((task) => !readyIds.has(task.task_id));
|
|
368
398
|
const active = tasks.filter((task) => ACTIVE_TASK_STATUSES.has(task.status));
|
|
369
|
-
const
|
|
399
|
+
const retryable = tasks.filter((task) => task.status === "failed");
|
|
400
|
+
const recommended = active.sort(compareTasks)[0]
|
|
401
|
+
|| retryable.sort(compareTasks)[0]
|
|
402
|
+
|| ready.sort(compareTasks)[0]
|
|
403
|
+
|| null;
|
|
370
404
|
const checkpointRoot = path.join(root, workflowRoot, "control", "checkpoints");
|
|
371
405
|
let sharedCheckpointCount = 0;
|
|
372
406
|
const countCheckpoints = (directory) => {
|
|
@@ -381,9 +415,16 @@ function inspectRuntime(root, errors, workflowRoot = ".workflow") {
|
|
|
381
415
|
return {
|
|
382
416
|
task_count: tasks.length,
|
|
383
417
|
closed_task_count: tasks.filter((task) => CLOSED_TASK_STATUSES.has(task.status)).length,
|
|
418
|
+
completed_task_count: tasks.filter((task) => task.status === "completed").length,
|
|
419
|
+
failed_task_count: tasks.filter((task) => task.status === "failed").length,
|
|
420
|
+
abandoned_task_count: tasks.filter((task) => task.status === "abandoned").length,
|
|
421
|
+
blocked_task_count: tasks.filter((task) => task.status === "blocked").length,
|
|
422
|
+
waiting_task_count: waiting.length,
|
|
384
423
|
active_task_ids: active.map((task) => task.task_id),
|
|
424
|
+
retryable_task_ids: retryable.map((task) => task.task_id),
|
|
385
425
|
queued_task_ids: queued.map((task) => task.task_id),
|
|
386
426
|
ready_task_ids: ready.map((task) => task.task_id),
|
|
427
|
+
waiting_task_ids: waiting.map((task) => task.task_id),
|
|
387
428
|
recommended_task_id: recommended?.task_id || null,
|
|
388
429
|
recommended_iteration_id: recommended?.iteration_id || null,
|
|
389
430
|
recommended_status: recommended?.status || null,
|
|
@@ -422,11 +463,16 @@ function recommendationFor(state, workflow, runtime) {
|
|
|
422
463
|
if (state === "workflow-interrupted" || runtime.recommended_task_id) {
|
|
423
464
|
const awaitingUser = runtime.next_action_owner === "user";
|
|
424
465
|
const awaitingExternal = runtime.next_action_owner === "external";
|
|
466
|
+
const retryCommand = runtime.recommended_status === "failed"
|
|
467
|
+
? `task-state.mjs activate --task-id ${runtime.recommended_task_id} --new-attempt --phase repair`
|
|
468
|
+
: null;
|
|
425
469
|
return {
|
|
426
470
|
skill: "ai-delivery-checkpoint-task",
|
|
427
471
|
action: awaitingUser || awaitingExternal
|
|
428
472
|
? runtime.next_action
|
|
429
|
-
:
|
|
473
|
+
: retryCommand
|
|
474
|
+
? `使用 ${retryCommand} 重试失败的逻辑任务,然后只继续其幂等 next_action。`
|
|
475
|
+
: `恢复并核对任务 ${runtime.recommended_task_id || "unknown"},只继续其幂等 next_action。`,
|
|
430
476
|
requires_user_input: awaitingUser,
|
|
431
477
|
mutation_allowed: !awaitingUser && !awaitingExternal,
|
|
432
478
|
};
|
|
@@ -484,17 +530,28 @@ export function inspectProjectState(target) {
|
|
|
484
530
|
const workflow = {
|
|
485
531
|
project_id: null,
|
|
486
532
|
iteration_id: null,
|
|
533
|
+
release_id: null,
|
|
487
534
|
artifact_count: 0,
|
|
488
535
|
delivery_artifact_count: 0,
|
|
489
536
|
active_nodes: [],
|
|
490
537
|
blocked_nodes: [],
|
|
491
538
|
pending_gates: [],
|
|
539
|
+
development_state: normalizeInspectedScope(null),
|
|
540
|
+
release_state: normalizeInspectedScope(null),
|
|
492
541
|
};
|
|
493
542
|
let runtime = {
|
|
494
543
|
task_count: 0,
|
|
544
|
+
closed_task_count: 0,
|
|
545
|
+
completed_task_count: 0,
|
|
546
|
+
failed_task_count: 0,
|
|
547
|
+
abandoned_task_count: 0,
|
|
548
|
+
blocked_task_count: 0,
|
|
549
|
+
waiting_task_count: 0,
|
|
495
550
|
active_task_ids: [],
|
|
551
|
+
retryable_task_ids: [],
|
|
496
552
|
queued_task_ids: [],
|
|
497
553
|
ready_task_ids: [],
|
|
554
|
+
waiting_task_ids: [],
|
|
498
555
|
recommended_task_id: null,
|
|
499
556
|
dependency_errors: [],
|
|
500
557
|
};
|
|
@@ -518,9 +575,22 @@ export function inspectProjectState(target) {
|
|
|
518
575
|
legacyLayout ? ".ai-delivery/install-manifest.json" : ".workflow/config/install-manifest.json",
|
|
519
576
|
), "json", errors);
|
|
520
577
|
const stateRoot = path.join(root, workflowRoot);
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
578
|
+
let project = null;
|
|
579
|
+
let workflowState = null;
|
|
580
|
+
let registry = null;
|
|
581
|
+
const readFormalState = () => {
|
|
582
|
+
project = readStructuredFile(path.join(stateRoot, "delivery", "project.yaml"), "yaml", errors);
|
|
583
|
+
workflowState = readStructuredFile(path.join(stateRoot, "delivery", "workflow-state.yaml"), "yaml", errors);
|
|
584
|
+
registry = readStructuredFile(path.join(stateRoot, "delivery", "artifact-registry.yaml"), "yaml", errors);
|
|
585
|
+
};
|
|
586
|
+
if (legacyLayout) readFormalState();
|
|
587
|
+
else {
|
|
588
|
+
try {
|
|
589
|
+
withFormalStateReadLock(root, readFormalState);
|
|
590
|
+
} catch (error) {
|
|
591
|
+
errors.push(error.message);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
524
594
|
readStructuredFile(path.join(stateRoot, "delivery", "standards-baseline.yaml"), "yaml", errors);
|
|
525
595
|
readStructuredFile(path.join(stateRoot, "standards", "index.yaml"), "yaml", errors);
|
|
526
596
|
if (manifest) {
|
|
@@ -532,11 +602,15 @@ export function inspectProjectState(target) {
|
|
|
532
602
|
if (!installedSkills.length) errors.push("安装清单未登记任何 skill");
|
|
533
603
|
}
|
|
534
604
|
if (project && workflowState) {
|
|
605
|
+
const scopes = inspectWorkflowScopes(workflowState, errors);
|
|
535
606
|
workflow.project_id = project.project_id || null;
|
|
536
|
-
workflow.iteration_id =
|
|
537
|
-
workflow.
|
|
538
|
-
workflow.
|
|
539
|
-
workflow.
|
|
607
|
+
workflow.iteration_id = scopes.development.scope_id || project.current_iteration_id || null;
|
|
608
|
+
workflow.release_id = scopes.release.scope_id || project.current_release_id || null;
|
|
609
|
+
workflow.active_nodes = scopes.development.active_nodes;
|
|
610
|
+
workflow.blocked_nodes = scopes.development.blocked_nodes;
|
|
611
|
+
workflow.pending_gates = scopes.development.pending_gates;
|
|
612
|
+
workflow.development_state = scopes.development;
|
|
613
|
+
workflow.release_state = scopes.release;
|
|
540
614
|
if (project.project_id !== workflowState.project_id) {
|
|
541
615
|
errors.push(`${workflowRoot}/delivery/project.yaml 与 workflow-state.yaml 的 project_id 不一致`);
|
|
542
616
|
}
|
|
@@ -655,16 +729,11 @@ function taskPlanFor(initialState, result) {
|
|
|
655
729
|
|
|
656
730
|
function adoptionMarkdown(initialState, scan, result) {
|
|
657
731
|
const gaps = [];
|
|
658
|
-
|
|
659
|
-
try {
|
|
660
|
-
const registry = parseYaml(fs.readFileSync(
|
|
732
|
+
const registry = withFormalStateReadLock(result.project_root, () => parseYaml(fs.readFileSync(
|
|
661
733
|
path.join(result.project_root, ".workflow", "delivery", "artifact-registry.yaml"),
|
|
662
734
|
"utf8",
|
|
663
|
-
));
|
|
664
|
-
|
|
665
|
-
} catch {
|
|
666
|
-
artifactTypes = [];
|
|
667
|
-
}
|
|
735
|
+
)));
|
|
736
|
+
const artifactTypes = (registry?.artifacts || []).map((artifact) => artifact.artifact_type || "");
|
|
668
737
|
if (!artifactTypes.some((type) => /product.*baseline/.test(type))) gaps.push("缺少经确认的产品基线。");
|
|
669
738
|
if (!artifactTypes.some((type) => /architecture.*baseline/.test(type))) gaps.push("缺少经确认的架构基线。");
|
|
670
739
|
if (scan.summary.has_code && !scan.summary.categories.test) gaps.push("未发现可识别的自动化测试文件,需人工核对测试入口。");
|
|
@@ -694,26 +763,6 @@ ${result.recommendation.action}
|
|
|
694
763
|
`;
|
|
695
764
|
}
|
|
696
765
|
|
|
697
|
-
function registerBootstrapReport(root, entry) {
|
|
698
|
-
const yaml = {
|
|
699
|
-
parse: parseYaml,
|
|
700
|
-
stringify: (value) => stringifyYaml(value, { lineWidth: 0 }),
|
|
701
|
-
};
|
|
702
|
-
const inspected = executeDeliveryStateCommand(["inspect", "--project", root], { yaml });
|
|
703
|
-
executeDeliveryStateCommand([
|
|
704
|
-
"artifact", "register",
|
|
705
|
-
"--project", root,
|
|
706
|
-
"--expected-revision", String(inspected.artifact_registry.revision),
|
|
707
|
-
"--id", entry.artifact_id,
|
|
708
|
-
"--artifact-type", entry.artifact_type,
|
|
709
|
-
"--path", entry.path,
|
|
710
|
-
"--node", "00-bootstrap",
|
|
711
|
-
"--status", entry.status,
|
|
712
|
-
"--version", String(entry.version),
|
|
713
|
-
"--producer-skill", entry.producer_skill,
|
|
714
|
-
], { yaml });
|
|
715
|
-
}
|
|
716
|
-
|
|
717
766
|
function writeBootstrapArtifacts(root, initialState, result, sourceScan = null) {
|
|
718
767
|
const configuredCodeRoot = path.resolve(root, result.workspace?.code_repository?.path || "code");
|
|
719
768
|
const scan = sourceScan || scanProjectFiles(configuredCodeRoot);
|
|
@@ -840,16 +889,6 @@ function writeBootstrapArtifacts(root, initialState, result, sourceScan = null)
|
|
|
840
889
|
recommended_task_id: result.runtime.recommended_task_id,
|
|
841
890
|
updated_at: result.detected_at,
|
|
842
891
|
}, { lineWidth: 0 }));
|
|
843
|
-
registerBootstrapReport(root, {
|
|
844
|
-
artifact_id: report.artifact_id,
|
|
845
|
-
artifact_type: report.artifact_type,
|
|
846
|
-
version: 1,
|
|
847
|
-
status: "draft",
|
|
848
|
-
producer_skill: "ai-delivery-bootstrap",
|
|
849
|
-
path: reportRef,
|
|
850
|
-
checksum_algorithm: "sha256",
|
|
851
|
-
checksum: reportChecksum,
|
|
852
|
-
});
|
|
853
892
|
return {
|
|
854
893
|
run_id: runId,
|
|
855
894
|
report_ref: reportRef,
|
|
@@ -921,7 +960,9 @@ export function bootstrapProject(packageRoot, target, options = {}) {
|
|
|
921
960
|
: shouldDeferToExternal
|
|
922
961
|
? `Wait for external input: ${result.runtime.next_action}`
|
|
923
962
|
: shouldDeferToRecovery
|
|
924
|
-
?
|
|
963
|
+
? result.runtime.recommended_status === "failed"
|
|
964
|
+
? `Retry task ${result.runtime.recommended_task_id} with task-state.mjs activate --task-id ${result.runtime.recommended_task_id} --new-attempt --phase repair before any bootstrap mutation.`
|
|
965
|
+
: `Resume task ${result.runtime.recommended_task_id} before any bootstrap mutation.`
|
|
925
966
|
: "Project bootstrap completed.",
|
|
926
967
|
};
|
|
927
968
|
}
|