ai-delivery-workflow 0.4.0 → 0.5.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/README.md +7 -8
- package/bin/ai-delivery.mjs +2 -24
- package/bin/release-check.mjs +8 -2
- package/docs/CLI-PARAMETER-REFERENCE.zh-CN.md +6 -67
- package/docs/DUAL-REPOSITORY-WORKSPACE.zh-CN.md +14 -1
- package/docs/FILE-REFERENCE.zh-CN.md +17 -36
- package/docs/MAINTENANCE-VERIFICATION.zh-CN.md +2 -2
- package/docs/NPM-RELEASE-MANAGEMENT.zh-CN.md +2 -1
- package/docs/PROJECT-MANUAL.zh-CN.md +50 -43
- package/docs/STATE-CLI-MAINTENANCE.zh-CN.md +8 -10
- package/docs/STATE-CLI-USER-GUIDE.zh-CN.md +7 -17
- package/docs/adr/0006-product-line-candidate-inventory.md +20 -0
- package/docs/agents/domain.md +31 -6
- package/docs/agents/issue-tracker.md +17 -18
- package/docs/agents/triage-labels.md +7 -7
- package/docs/agents/workflow-manager-acceptance-matrix.md +9 -15
- package/docs/agents/workflow-manager-current-state.md +14 -17
- package/lib/delivery-state.mjs +59 -910
- package/lib/fs-utils.mjs +0 -16
- package/lib/npm-auth.mjs +16 -0
- package/lib/project-bootstrap.mjs +21 -58
- package/lib/project-installer.mjs +24 -180
- package/lib/project-repair.mjs +217 -0
- package/lib/toml-hooks.mjs +2 -4
- package/lib/workflow-manager-governance.mjs +3 -47
- package/lib/workspace.mjs +2 -3
- package/package.json +2 -2
- package/skills/ai-delivery-assemble-release/SKILL.md +10 -8
- package/skills/ai-delivery-assemble-release/agents/openai.yaml +3 -3
- package/skills/ai-delivery-assemble-release/assets/release-candidate-manifest.yaml +16 -4
- package/skills/ai-delivery-assemble-release/assets/release-git-plan.yaml +96 -6
- package/skills/ai-delivery-assemble-release/assets/version-inclusion.csv +2 -2
- package/skills/ai-delivery-assemble-release/references/release-assembly-contract.md +16 -2
- package/skills/ai-delivery-assemble-release/scripts/plan-release.mjs +127 -3
- package/skills/ai-delivery-bootstrap/SKILL.md +1 -1
- package/skills/ai-delivery-bootstrap/agents/openai.yaml +3 -3
- package/skills/ai-delivery-bootstrap/references/bootstrap-contract.md +1 -1
- package/skills/ai-delivery-checkpoint-task/SKILL.md +0 -4
- package/skills/ai-delivery-checkpoint-task/agents/openai.yaml +3 -3
- package/skills/ai-delivery-checkpoint-task/references/checkpoint-contract.md +2 -2
- package/skills/ai-delivery-checkpoint-task/scripts/hook-event.mjs +2 -8
- package/skills/ai-delivery-checkpoint-task/scripts/task-state.mjs +26 -46
- package/skills/ai-delivery-close-version/agents/openai.yaml +3 -3
- package/skills/ai-delivery-define-product/agents/openai.yaml +4 -4
- package/skills/ai-delivery-deploy-production/agents/openai.yaml +3 -3
- package/skills/ai-delivery-design-experience/SKILL.md +3 -3
- package/skills/ai-delivery-design-experience/agents/openai.yaml +4 -4
- package/skills/ai-delivery-design-experience/references/experience-contract.md +1 -11
- package/skills/ai-delivery-design-experience/references/prototype-management-contract.md +1 -1
- package/skills/ai-delivery-develop-iteration/agents/openai.yaml +3 -3
- package/skills/ai-delivery-evolve-workflow/agents/openai.yaml +3 -3
- package/skills/ai-delivery-execute-test/agents/openai.yaml +4 -4
- package/skills/ai-delivery-execute-work-package/agents/openai.yaml +4 -4
- package/skills/ai-delivery-manage-git/SKILL.md +9 -7
- package/skills/ai-delivery-manage-git/agents/openai.yaml +3 -3
- package/skills/ai-delivery-manage-git/references/git-policy.md +7 -3
- package/skills/ai-delivery-manage-git/scripts/release-git.mjs +995 -0
- package/skills/ai-delivery-manage-standards/agents/openai.yaml +4 -4
- package/skills/ai-delivery-orchestrate/SKILL.md +5 -7
- package/skills/ai-delivery-orchestrate/agents/openai.yaml +3 -3
- package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/hooks/hook-event.mjs +2 -8
- package/skills/ai-delivery-orchestrate/assets/project-template/AGENTS.md +9 -8
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/CONTRIBUTING.md +25 -25
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/DESIGN.md +545 -545
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/DESIGN.md +554 -554
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/DESIGN.md +562 -562
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/DESIGN.md +634 -634
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/DESIGN.md +544 -544
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/DESIGN.md +503 -503
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/DESIGN.md +454 -454
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/DESIGN.md +542 -542
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/DESIGN.md +589 -589
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/DESIGN.md +541 -541
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/DESIGN.md +544 -544
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/DESIGN.md +451 -451
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/DESIGN.md +570 -570
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/DESIGN.md +506 -506
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/DESIGN.md +537 -537
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/DESIGN.md +632 -632
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/DESIGN.md +504 -504
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/DESIGN.md +526 -526
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/DESIGN.md +531 -531
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/DESIGN.md +578 -578
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/DESIGN.md +544 -544
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/DESIGN.md +575 -575
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/DESIGN.md +670 -670
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/DESIGN.md +550 -550
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/DESIGN.md +546 -546
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/DESIGN.md +125 -125
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/DESIGN.md +288 -288
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/DESIGN.md +548 -548
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/DESIGN.md +298 -298
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/DESIGN.md +365 -365
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/DESIGN.md +683 -683
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/DESIGN.md +746 -746
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/DESIGN.md +852 -852
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/DESIGN.md +825 -825
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/DESIGN.md +773 -773
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/DESIGN.md +767 -767
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/DESIGN.md +575 -575
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/DESIGN.md +649 -649
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/DESIGN.md +821 -821
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/DESIGN.md +640 -640
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/DESIGN.md +539 -539
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/DESIGN.md +521 -521
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/DESIGN.md +597 -597
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/DESIGN.md +661 -661
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/DESIGN.md +690 -690
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/DESIGN.md +669 -669
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/DESIGN.md +589 -589
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/DESIGN.md +616 -616
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/DESIGN.md +585 -585
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/DESIGN.md +636 -636
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/DESIGN.md +244 -244
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/DESIGN.md +357 -357
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/DESIGN.md +551 -551
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/DESIGN.md +516 -516
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/slack/DESIGN.md +482 -482
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/DESIGN.md +363 -363
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/DESIGN.md +246 -246
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/DESIGN.md +580 -580
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/DESIGN.md +487 -487
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/DESIGN.md +462 -462
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/DESIGN.md +448 -448
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/DESIGN.md +286 -286
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/DESIGN.md +339 -339
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/DESIGN.md +633 -633
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/DESIGN.md +636 -636
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/DESIGN.md +736 -736
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/DESIGN.md +538 -538
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/DESIGN.md +521 -521
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/DESIGN.md +526 -526
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/DESIGN.md +588 -588
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/DESIGN.md +497 -497
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/DESIGN.md +544 -544
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/DESIGN.md +465 -465
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/README.md +5 -5
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/DESIGN.md +537 -537
- package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/README.md +5 -5
- package/skills/ai-delivery-orchestrate/references/formal-state-contract.md +11 -20
- package/skills/ai-delivery-orchestrate/references/workflow-model.md +2 -4
- package/skills/ai-delivery-orchestrate-release/SKILL.md +10 -10
- package/skills/ai-delivery-orchestrate-release/agents/openai.yaml +4 -4
- package/skills/ai-delivery-orchestrate-release/assets/release-request.yaml +4 -1
- package/skills/ai-delivery-orchestrate-release/assets/version-selection.yaml +13 -1
- package/skills/ai-delivery-orchestrate-release/references/release-workflow-contract.md +14 -0
- package/skills/ai-delivery-plan-iteration/agents/openai.yaml +4 -4
- package/skills/ai-delivery-prepare-platform/agents/openai.yaml +4 -4
- package/skills/ai-delivery-prepare-release/SKILL.md +6 -5
- package/skills/ai-delivery-prepare-release/agents/openai.yaml +4 -4
- package/skills/ai-delivery-prepare-release/assets/release-template/release-manifest.yaml +21 -2
- package/skills/ai-delivery-prepare-release/references/release-contract.md +5 -1
- package/skills/ai-delivery-review-change/agents/openai.yaml +4 -4
- package/skills/ai-delivery-triage-failure/agents/openai.yaml +4 -4
- package/skills/ai-delivery-validate-artifacts/agents/openai.yaml +4 -4
- package/skills/ai-delivery-verify-candidate/agents/openai.yaml +3 -3
- package/skills/ai-delivery-verify-production/SKILL.md +7 -4
- package/skills/ai-delivery-verify-production/agents/openai.yaml +3 -3
- package/skills/ai-delivery-verify-production/assets/production-verification-template/production-verification.json +9 -0
- package/skills/ai-delivery-verify-production/assets/production-verification-template/production-verification.md +20 -0
- package/skills/ai-delivery-verify-production/references/production-verification-contract.md +19 -3
- package/docs/PROTOTYPE-MIGRATION.zh-CN.md +0 -164
- package/docs/VIEWER-MAINTENANCE.zh-CN.md +0 -150
- package/docs/VIEWER-USER-GUIDE.zh-CN.md +0 -113
- package/lib/project-migration.mjs +0 -1193
- package/lib/prototype-migration.mjs +0 -713
- package/skills/ai-delivery-design-experience/assets/experience-template/LEGACY-COMPATIBILITY.md +0 -16
- package/skills/ai-delivery-design-experience/assets/experience-template/canvas-catalog.csv +0 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/canvas-pages.csv +0 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/page-catalog.csv +0 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-file-terminals.csv +0 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-files.csv +0 -1
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-manifest.yaml +0 -76
- package/skills/ai-delivery-design-experience/assets/experience-template/prototype-set.yaml +0 -24
package/lib/fs-utils.mjs
CHANGED
|
@@ -35,19 +35,3 @@ export function assertPathInside(root, target) {
|
|
|
35
35
|
if (relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative))) return target;
|
|
36
36
|
throw new Error(`Path resolves outside the project: ${target} -> ${realAncestor}`);
|
|
37
37
|
}
|
|
38
|
-
|
|
39
|
-
export function resolveContainedRelativePath(root, relative, allowedPrefixes = []) {
|
|
40
|
-
const value = String(relative || "");
|
|
41
|
-
if (!value || value.includes("\\") || value.includes("\0")
|
|
42
|
-
|| path.posix.isAbsolute(value) || path.posix.normalize(value) !== value
|
|
43
|
-
|| value === ".." || value.startsWith("../")) {
|
|
44
|
-
throw new Error(`Invalid migration path: ${value || "missing"}.`);
|
|
45
|
-
}
|
|
46
|
-
if (allowedPrefixes.length && !allowedPrefixes.some((prefix) =>
|
|
47
|
-
value === prefix || value.startsWith(`${prefix}/`))) {
|
|
48
|
-
throw new Error(`Migration path is outside its allowed area: ${value}.`);
|
|
49
|
-
}
|
|
50
|
-
const target = path.resolve(root, ...value.split("/"));
|
|
51
|
-
assertPathInside(root, target);
|
|
52
|
-
return target;
|
|
53
|
-
}
|
package/lib/npm-auth.mjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const OFFICIAL_NPM_REGISTRY = "https://registry.npmjs.org/";
|
|
2
|
+
const OFFICIAL_NPM_TOKEN_ENV_KEY = "npm_config_//registry.npmjs.org/:_authToken";
|
|
3
|
+
|
|
4
|
+
export function withNpmAccessToken(environment = process.env) {
|
|
5
|
+
const token = typeof environment.NPM_ACCESS_TOKEN === "string"
|
|
6
|
+
? environment.NPM_ACCESS_TOKEN.trim()
|
|
7
|
+
: "";
|
|
8
|
+
if (!token) return environment;
|
|
9
|
+
|
|
10
|
+
return {
|
|
11
|
+
...environment,
|
|
12
|
+
[OFFICIAL_NPM_TOKEN_ENV_KEY]: token,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { OFFICIAL_NPM_REGISTRY, OFFICIAL_NPM_TOKEN_ENV_KEY };
|
|
@@ -14,7 +14,6 @@ const IGNORED_DIRECTORIES = new Set([
|
|
|
14
14
|
".git",
|
|
15
15
|
".agents",
|
|
16
16
|
".codex",
|
|
17
|
-
".ai-delivery",
|
|
18
17
|
".workflow",
|
|
19
18
|
".idea",
|
|
20
19
|
".vscode",
|
|
@@ -94,19 +93,6 @@ const WORKFLOW_REQUIRED_FILES = [
|
|
|
94
93
|
".workflow/standards/index.yaml",
|
|
95
94
|
".gitattributes",
|
|
96
95
|
];
|
|
97
|
-
const LEGACY_WORKFLOW_REQUIRED_FILES = [
|
|
98
|
-
".ai-delivery/workspace.yaml",
|
|
99
|
-
".ai-delivery/install-manifest.json",
|
|
100
|
-
".codex/config.toml",
|
|
101
|
-
"AGENTS.md",
|
|
102
|
-
".ai-delivery/state/state.mjs",
|
|
103
|
-
".ai-delivery/hooks/hook-event.mjs",
|
|
104
|
-
"delivery/project.yaml",
|
|
105
|
-
"delivery/workflow-state.yaml",
|
|
106
|
-
"delivery/artifact-registry.yaml",
|
|
107
|
-
"delivery/standards-baseline.yaml",
|
|
108
|
-
"standards/index.yaml",
|
|
109
|
-
];
|
|
110
96
|
const ESSENTIAL_STARTUP_SKILLS = [
|
|
111
97
|
"ai-delivery-bootstrap",
|
|
112
98
|
"ai-delivery-checkpoint-task",
|
|
@@ -306,13 +292,13 @@ function normalizeInspectedScope(value, fallbackScopeId = null) {
|
|
|
306
292
|
}
|
|
307
293
|
|
|
308
294
|
function inspectWorkflowScopes(workflowState, errors) {
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
: normalizeInspectedScope(
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
295
|
+
if (Number(workflowState?.schema_version) !== 2
|
|
296
|
+
|| !workflowState?.development_state || !workflowState?.release_state) {
|
|
297
|
+
errors.push("formal state must use schema 2 with development_state and release_state scopes");
|
|
298
|
+
return { development: normalizeInspectedScope(null), release: normalizeInspectedScope(null) };
|
|
299
|
+
}
|
|
300
|
+
const development = normalizeInspectedScope(workflowState.development_state);
|
|
301
|
+
const release = normalizeInspectedScope(workflowState.release_state);
|
|
316
302
|
|
|
317
303
|
for (const [scopeName, scope] of [["development", development], ["release", release]]) {
|
|
318
304
|
for (const conflict of findIncompatibleNodeStates(scope)) {
|
|
@@ -505,23 +491,15 @@ export function inspectProjectState(target) {
|
|
|
505
491
|
const codebase = scanProjectFiles(codeRoot);
|
|
506
492
|
const errors = [];
|
|
507
493
|
const currentIndicators = WORKFLOW_REQUIRED_FILES.filter((file) => exists(root, file));
|
|
508
|
-
const
|
|
509
|
-
const currentStateIndicators = WORKFLOW_REQUIRED_FILES.filter((file) =>
|
|
510
|
-
file.startsWith(".workflow/delivery/") || file === ".workflow/standards/index.yaml")
|
|
511
|
-
.filter((file) => exists(root, file));
|
|
512
|
-
const legacyStateIndicators = LEGACY_WORKFLOW_REQUIRED_FILES.filter((file) =>
|
|
513
|
-
file.startsWith("delivery/") || file === "standards/index.yaml")
|
|
494
|
+
const unsupportedIndicators = [".ai-delivery", ".ai-delivery-task", "delivery", "standards"]
|
|
514
495
|
.filter((file) => exists(root, file));
|
|
515
|
-
const
|
|
516
|
-
const
|
|
517
|
-
const
|
|
518
|
-
const workflowIndicators = requiredFiles.filter((file) => exists(root, file));
|
|
519
|
-
const missingFiles = requiredFiles.filter((file) => !exists(root, file));
|
|
496
|
+
const workflowRoot = ".workflow";
|
|
497
|
+
const workflowIndicators = WORKFLOW_REQUIRED_FILES.filter((file) => exists(root, file));
|
|
498
|
+
const missingFiles = WORKFLOW_REQUIRED_FILES.filter((file) => !exists(root, file));
|
|
520
499
|
const installation = {
|
|
521
|
-
detected: currentIndicators.length > 0 ||
|
|
522
|
-
complete: workflowIndicators.length ===
|
|
500
|
+
detected: currentIndicators.length > 0 || unsupportedIndicators.length > 0,
|
|
501
|
+
complete: workflowIndicators.length === WORKFLOW_REQUIRED_FILES.length,
|
|
523
502
|
workflow_root: workflowRoot,
|
|
524
|
-
legacy_layout: legacyLayout,
|
|
525
503
|
present_files: workflowIndicators,
|
|
526
504
|
missing_files: missingFiles,
|
|
527
505
|
installed_skill_count: 0,
|
|
@@ -556,25 +534,13 @@ export function inspectProjectState(target) {
|
|
|
556
534
|
dependency_errors: [],
|
|
557
535
|
};
|
|
558
536
|
|
|
559
|
-
if (
|
|
560
|
-
errors.push("
|
|
561
|
-
}
|
|
562
|
-
if (currentStateIndicators.length > 0 && legacyStateIndicators.length > 0) {
|
|
563
|
-
errors.push("同时检测到 .workflow 和旧版 delivery/standards 状态;必须人工确定唯一权威根。");
|
|
537
|
+
if (unsupportedIndicators.length) {
|
|
538
|
+
errors.push(`检测到不受支持的旧工作流路径:${unsupportedIndicators.join(", ")}。当前项目只接受 .workflow/ 布局。`);
|
|
564
539
|
}
|
|
565
540
|
|
|
566
541
|
if (installation.complete) {
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
}
|
|
570
|
-
if (currentStateIndicators.length > 0 && legacyStateIndicators.length > 0) {
|
|
571
|
-
errors.push("同时检测到 .workflow 和旧版 delivery/standards 状态;必须人工确定唯一权威根。");
|
|
572
|
-
}
|
|
573
|
-
const manifest = readStructuredFile(path.join(
|
|
574
|
-
root,
|
|
575
|
-
legacyLayout ? ".ai-delivery/install-manifest.json" : ".workflow/config/install-manifest.json",
|
|
576
|
-
), "json", errors);
|
|
577
|
-
const stateRoot = path.join(root, workflowRoot);
|
|
542
|
+
const manifest = readStructuredFile(path.join(root, ".workflow/config/install-manifest.json"), "json", errors);
|
|
543
|
+
const stateRoot = path.join(root, ".workflow");
|
|
578
544
|
let project = null;
|
|
579
545
|
let workflowState = null;
|
|
580
546
|
let registry = null;
|
|
@@ -583,13 +549,10 @@ export function inspectProjectState(target) {
|
|
|
583
549
|
workflowState = readStructuredFile(path.join(stateRoot, "delivery", "workflow-state.yaml"), "yaml", errors);
|
|
584
550
|
registry = readStructuredFile(path.join(stateRoot, "delivery", "artifact-registry.yaml"), "yaml", errors);
|
|
585
551
|
};
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
} catch (error) {
|
|
591
|
-
errors.push(error.message);
|
|
592
|
-
}
|
|
552
|
+
try {
|
|
553
|
+
withFormalStateReadLock(root, readFormalState);
|
|
554
|
+
} catch (error) {
|
|
555
|
+
errors.push(error.message);
|
|
593
556
|
}
|
|
594
557
|
readStructuredFile(path.join(stateRoot, "delivery", "standards-baseline.yaml"), "yaml", errors);
|
|
595
558
|
readStructuredFile(path.join(stateRoot, "standards", "index.yaml"), "yaml", errors);
|
|
@@ -9,10 +9,8 @@ import { isSeq, parse as parseYaml, parseDocument, stringify as stringifyYaml }
|
|
|
9
9
|
import { assertPathInside, atomicWrite, filesUnder } from "./fs-utils.mjs";
|
|
10
10
|
import { inspectCodeGraph } from "./codegraph.mjs";
|
|
11
11
|
import { executeDeliveryStateCommand } from "./delivery-state.mjs";
|
|
12
|
-
import { planPrototypeMigration } from "./prototype-migration.mjs";
|
|
13
12
|
import { inspectHookConfig, managedHookConfigProjection, mergeHookConfig } from "./toml-hooks.mjs";
|
|
14
13
|
import {
|
|
15
|
-
LEGACY_WORKSPACE_CONFIG,
|
|
16
14
|
WORKSPACE_CONFIG,
|
|
17
15
|
gitCommonDirectory,
|
|
18
16
|
gitTopLevel,
|
|
@@ -39,7 +37,6 @@ const GIT_ATTRIBUTE_ENTRIES = [
|
|
|
39
37
|
"/.gitattributes text eol=lf",
|
|
40
38
|
...RAW_GIT_ATTRIBUTE_TARGETS.map((file) => `/${file} -text`),
|
|
41
39
|
];
|
|
42
|
-
const OBSOLETE_IGNORE_ENTRIES = new Set([".ai-delivery-task", ".ai-delivery/backups/"]);
|
|
43
40
|
const INSTALL_MANIFEST = path.join(".workflow", "config", "install-manifest.json");
|
|
44
41
|
const UPGRADE_RUNTIME = path.join(".workflow", "delivery", "runtime", "upgrades");
|
|
45
42
|
const PRESERVED_DETAIL_LIMIT = 200;
|
|
@@ -48,32 +45,18 @@ const DOCTOR_ATTRIBUTE_BATCH_SIZE = 5_000;
|
|
|
48
45
|
const DOCTOR_DETAIL_LIMIT = 200;
|
|
49
46
|
const FORMAL_STATE_INSPECT_MAX_BUFFER = 16 * 1024 * 1024;
|
|
50
47
|
const INSTALL_MANIFEST_SCHEMA = 6;
|
|
51
|
-
const UI_CONTRACT_VERSION = "prototype-first-ui-v1";
|
|
52
|
-
const FORMAL_STATE_YAML = {
|
|
53
|
-
parse: parseYaml,
|
|
54
|
-
stringify: (value) => stringifyYaml(value, { lineWidth: 0 }),
|
|
55
|
-
};
|
|
56
48
|
const MERGED_MANAGED_SURFACES = Object.freeze([
|
|
57
49
|
{ key: "agents", path: "AGENTS.md" },
|
|
58
50
|
{ key: "hook_config", path: ".codex/config.toml" },
|
|
59
51
|
{ key: "gitignore", path: ".gitignore" },
|
|
60
52
|
{ key: "gitattributes", path: ".gitattributes" },
|
|
61
53
|
]);
|
|
62
|
-
const ACTIVE_TASK = path.join(".workflow", "delivery", "runtime", "active-task.json");
|
|
63
|
-
const LEGACY_ACTIVE_TASK = ".ai-delivery-task";
|
|
64
54
|
const WORKFLOW_CONTENT_DIRECTORIES = ["product", "architecture", "experience", "iterations", "releases"];
|
|
65
55
|
const CONTROL_DIRECTORIES = [
|
|
66
56
|
"tasks", "checkpoints", "artifacts", "gates", "versions", "releases", "events", "archives",
|
|
67
|
-
"
|
|
57
|
+
"repairs",
|
|
68
58
|
];
|
|
69
|
-
const ENSURED_CONTROL_DIRECTORIES = ["
|
|
70
|
-
const RETIRED_MANAGED_ASSETS = Object.freeze([
|
|
71
|
-
{
|
|
72
|
-
path: ".workflow/tools/viewer",
|
|
73
|
-
kind: "retired-directory",
|
|
74
|
-
manifest_key: "viewer",
|
|
75
|
-
},
|
|
76
|
-
]);
|
|
59
|
+
const ENSURED_CONTROL_DIRECTORIES = ["repairs"];
|
|
77
60
|
const ESSENTIAL_STARTUP_SKILLS = [
|
|
78
61
|
"ai-delivery-assemble-release",
|
|
79
62
|
"ai-delivery-bootstrap",
|
|
@@ -138,11 +121,9 @@ const V2_PROTOTYPE_DELIVERY_SURFACE_FILES = Object.freeze([
|
|
|
138
121
|
const REQUIRED_PACKAGE_SURFACE_FILES = Object.freeze([
|
|
139
122
|
"LICENSE",
|
|
140
123
|
"bin/ai-delivery.mjs",
|
|
141
|
-
"docs/PROTOTYPE-MIGRATION.zh-CN.md",
|
|
142
124
|
"lib/mock-scenario-pack.mjs",
|
|
143
125
|
"lib/mock-system.mjs",
|
|
144
|
-
"lib/project-
|
|
145
|
-
"lib/prototype-migration.mjs",
|
|
126
|
+
"lib/project-repair.mjs",
|
|
146
127
|
"lib/prototype-page-review.mjs",
|
|
147
128
|
"lib/prototype-review-target.mjs",
|
|
148
129
|
"skills/ai-delivery-checkpoint-task/scripts/hook-event.mjs",
|
|
@@ -344,8 +325,7 @@ function mergeManagedMarkdown(existing, managedTemplate) {
|
|
|
344
325
|
}
|
|
345
326
|
|
|
346
327
|
function mergeGitignore(existing, requiredEntries = []) {
|
|
347
|
-
const lines = existing.split(/\r?\n/)
|
|
348
|
-
.filter((line) => !OBSOLETE_IGNORE_ENTRIES.has(line.trim()));
|
|
328
|
+
const lines = existing.split(/\r?\n/);
|
|
349
329
|
const additions = [...IGNORE_ENTRIES, ...requiredEntries]
|
|
350
330
|
.filter((entry) => !lines.some((line) => line.trim() === entry));
|
|
351
331
|
const retained = lines.join("\n").trimEnd();
|
|
@@ -706,7 +686,7 @@ function mergedSurfaceManagedDigest(key, text, codePath) {
|
|
|
706
686
|
if (key === "hook_config") return contentDigest(JSON.stringify(managedHookConfigProjection(text)));
|
|
707
687
|
const lines = text.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
708
688
|
if (key === "gitignore") {
|
|
709
|
-
const managedEntries = new Set([...IGNORE_ENTRIES, `/${codePath}
|
|
689
|
+
const managedEntries = new Set([...IGNORE_ENTRIES, `/${codePath}/`]);
|
|
710
690
|
return contentDigest(JSON.stringify(lines.filter((line) => managedEntries.has(line)).sort()));
|
|
711
691
|
}
|
|
712
692
|
return contentDigest(JSON.stringify(lines.filter((line) => GIT_ATTRIBUTE_ENTRIES.includes(line)).sort()));
|
|
@@ -868,10 +848,11 @@ export function initProject(packageRoot, target, options = {}) {
|
|
|
868
848
|
"backups",
|
|
869
849
|
new Date().toISOString().replaceAll(":", "-"),
|
|
870
850
|
);
|
|
871
|
-
const
|
|
872
|
-
const
|
|
873
|
-
|
|
874
|
-
|
|
851
|
+
const unsupportedRoot = path.join(target, ".ai-delivery");
|
|
852
|
+
const unsupportedActiveTask = path.join(target, ".ai-delivery-task");
|
|
853
|
+
if (fs.existsSync(unsupportedRoot) || fs.existsSync(unsupportedActiveTask)) {
|
|
854
|
+
throw new Error("Unsupported workflow layout detected; install requires the current .workflow contract.");
|
|
855
|
+
}
|
|
875
856
|
let previousManifest = null;
|
|
876
857
|
try {
|
|
877
858
|
previousManifest = JSON.parse(fs.readFileSync(path.join(target, INSTALL_MANIFEST), "utf8"));
|
|
@@ -889,24 +870,9 @@ export function initProject(packageRoot, target, options = {}) {
|
|
|
889
870
|
throw new Error(`Refusing package downgrade from ${previousManifest.version} to ${packageVersion}; use --force only after explicit approval.`);
|
|
890
871
|
}
|
|
891
872
|
const packageVersionUpgrade = packageVersionComparison > 0;
|
|
892
|
-
const reinstallManagedRuntime = force ||
|
|
893
|
-
|| packageVersionUpgrade || (previousManifest && previousManifest.schema_version < 5);
|
|
894
|
-
if (!dryRun && hasLegacyRoot) {
|
|
895
|
-
const legacyBackup = path.join(backupRoot, "legacy-ai-delivery");
|
|
896
|
-
fs.mkdirSync(path.dirname(legacyBackup), { recursive: true });
|
|
897
|
-
fs.cpSync(legacyRoot, legacyBackup, { recursive: true });
|
|
898
|
-
}
|
|
899
|
-
if (!dryRun && hasLegacyActiveTask) {
|
|
900
|
-
const taskBackup = path.join(backupRoot, "legacy-active-task.json");
|
|
901
|
-
fs.mkdirSync(path.dirname(taskBackup), { recursive: true });
|
|
902
|
-
fs.copyFileSync(legacyActiveTask, taskBackup);
|
|
903
|
-
}
|
|
873
|
+
const reinstallManagedRuntime = force || packageVersionUpgrade;
|
|
904
874
|
const currentWorkspace = readWorkspaceConfiguration(target, { optional: true });
|
|
905
|
-
const
|
|
906
|
-
const legacyWorkspace = !currentWorkspace && fs.existsSync(legacyWorkspaceFile)
|
|
907
|
-
? readWorkspaceConfiguration(target, { configurationPath: LEGACY_WORKSPACE_CONFIG })
|
|
908
|
-
: null;
|
|
909
|
-
const existingWorkspace = (currentWorkspace || legacyWorkspace)?.configuration;
|
|
875
|
+
const existingWorkspace = currentWorkspace?.configuration;
|
|
910
876
|
const codePath = options.codePath || existingWorkspace?.code_repository?.path || "code";
|
|
911
877
|
const codeId = options.codeId || existingWorkspace?.code_repository?.repo_id || "app";
|
|
912
878
|
const sharedRemote = options.sharedRemote || null;
|
|
@@ -942,23 +908,23 @@ export function initProject(packageRoot, target, options = {}) {
|
|
|
942
908
|
const sourceStandardsIndex = path.join(sourceWorkflow, "standards", "index.yaml");
|
|
943
909
|
const workflowRoot = path.join(target, ".workflow");
|
|
944
910
|
const standardsIndexFile = path.join(workflowRoot, "standards", "index.yaml");
|
|
945
|
-
const
|
|
911
|
+
const unsupportedIndicators = [
|
|
946
912
|
path.join(target, "delivery", "project.yaml"),
|
|
947
913
|
path.join(target, "delivery", "workflow-state.yaml"),
|
|
948
914
|
path.join(target, "delivery", "artifact-registry.yaml"),
|
|
949
915
|
path.join(target, "delivery", "standards-baseline.yaml"),
|
|
950
916
|
path.join(target, "standards", "index.yaml"),
|
|
951
917
|
].filter((candidate) => fs.existsSync(candidate));
|
|
952
|
-
if (fs.existsSync(workflowRoot) &&
|
|
918
|
+
if (fs.existsSync(workflowRoot) && unsupportedIndicators.length) {
|
|
953
919
|
throw new Error(
|
|
954
|
-
"Detected both .workflow and
|
|
920
|
+
"Detected both .workflow and unsupported delivery/standards directories. "
|
|
955
921
|
+ "Resolve the split workflow state before initialization.",
|
|
956
922
|
);
|
|
957
923
|
}
|
|
958
|
-
if (
|
|
924
|
+
if (unsupportedIndicators.length) {
|
|
959
925
|
throw new Error(
|
|
960
|
-
"
|
|
961
|
-
+ "
|
|
926
|
+
"Unsupported workflow directories detected at delivery/ or standards/. "
|
|
927
|
+
+ "Remove them before initialization; refusing to create split workflow state.",
|
|
962
928
|
);
|
|
963
929
|
}
|
|
964
930
|
for (const managedPath of [
|
|
@@ -986,8 +952,6 @@ export function initProject(packageRoot, target, options = {}) {
|
|
|
986
952
|
const hookConflict = fs.existsSync(hookDestination)
|
|
987
953
|
&& !managedFilesEqual(hookDestination, sourceHook);
|
|
988
954
|
if (hookConflict && !reinstallManagedRuntime) conflicts.push(path.relative(target, hookDestination));
|
|
989
|
-
const retiredViewerDestination = path.join(target, ".workflow", "tools", "viewer");
|
|
990
|
-
const retireLegacyViewer = hasLegacyRoot && fs.existsSync(retiredViewerDestination);
|
|
991
955
|
const designReferenceDestination = path.join(target, "ref", "ui");
|
|
992
956
|
let designReferencePlan = null;
|
|
993
957
|
if (!fs.existsSync(designReferenceDestination)) {
|
|
@@ -1064,19 +1028,6 @@ export function initProject(packageRoot, target, options = {}) {
|
|
|
1064
1028
|
? fs.readFileSync(gitattributesFile, "utf8")
|
|
1065
1029
|
: "";
|
|
1066
1030
|
const gitattributesText = mergeGitattributes(existingGitattributes);
|
|
1067
|
-
if (hasLegacyRoot || hasLegacyActiveTask) {
|
|
1068
|
-
actions.push("migrate legacy .ai-delivery runtime into .workflow");
|
|
1069
|
-
if (!dryRun) {
|
|
1070
|
-
if (hasLegacyActiveTask) {
|
|
1071
|
-
const activeTask = path.join(target, ACTIVE_TASK);
|
|
1072
|
-
if (!fs.existsSync(activeTask)) {
|
|
1073
|
-
fs.mkdirSync(path.dirname(activeTask), { recursive: true });
|
|
1074
|
-
fs.copyFileSync(legacyActiveTask, activeTask);
|
|
1075
|
-
}
|
|
1076
|
-
}
|
|
1077
|
-
}
|
|
1078
|
-
}
|
|
1079
|
-
|
|
1080
1031
|
for (const plan of skillPlans) {
|
|
1081
1032
|
if (plan.type === "copy") {
|
|
1082
1033
|
actions.push(`install .agents/skills/${plan.name}`);
|
|
@@ -1098,9 +1049,6 @@ export function initProject(packageRoot, target, options = {}) {
|
|
|
1098
1049
|
} else if (hookConflict) {
|
|
1099
1050
|
backupAndReplace(target, hookDestination, sourceHook, backupRoot, actions, dryRun);
|
|
1100
1051
|
}
|
|
1101
|
-
if (retireLegacyViewer) {
|
|
1102
|
-
backupAndRemove(target, retiredViewerDestination, backupRoot, actions, dryRun);
|
|
1103
|
-
}
|
|
1104
1052
|
if (designReferencePlan?.type === "copy") {
|
|
1105
1053
|
actions.push("install ref/ui Design Reference Library");
|
|
1106
1054
|
if (!dryRun) {
|
|
@@ -1200,21 +1148,6 @@ export function initProject(packageRoot, target, options = {}) {
|
|
|
1200
1148
|
if (!dryRun) atomicWrite(manifestFile, manifestText);
|
|
1201
1149
|
}
|
|
1202
1150
|
|
|
1203
|
-
if (!dryRun && (hasLegacyRoot || hasLegacyActiveTask)) {
|
|
1204
|
-
for (const required of [
|
|
1205
|
-
path.join(target, WORKSPACE_CONFIG),
|
|
1206
|
-
path.join(target, INSTALL_MANIFEST),
|
|
1207
|
-
path.join(target, ".workflow", "tools", "state", "state.mjs"),
|
|
1208
|
-
path.join(target, ".workflow", "tools", "hooks", "hook-event.mjs"),
|
|
1209
|
-
]) {
|
|
1210
|
-
if (!fs.existsSync(required)) {
|
|
1211
|
-
throw new Error(`Legacy migration is incomplete; preserved .ai-delivery for recovery: ${required}`);
|
|
1212
|
-
}
|
|
1213
|
-
}
|
|
1214
|
-
if (hasLegacyRoot) fs.rmSync(legacyRoot, { recursive: true, force: true });
|
|
1215
|
-
if (hasLegacyActiveTask) fs.rmSync(legacyActiveTask, { force: true });
|
|
1216
|
-
}
|
|
1217
|
-
|
|
1218
1151
|
return {
|
|
1219
1152
|
actions: [...workspace.actions, ...actions],
|
|
1220
1153
|
summary: `${dryRun ? "Dry run" : "Initialized"} ${skillNames.length} workspace-scoped AI delivery skills in ${target}`,
|
|
@@ -1456,11 +1389,9 @@ function planUpgrade(packageRoot, target, options) {
|
|
|
1456
1389
|
validateManagedPath(target, path.join(target, managedPath));
|
|
1457
1390
|
}
|
|
1458
1391
|
const { manifest, manifestFile } = readInstallManifest(target);
|
|
1459
|
-
if (
|
|
1460
|
-
|| manifest.schema_version < 5
|
|
1461
|
-
|| manifest.schema_version > INSTALL_MANIFEST_SCHEMA) {
|
|
1392
|
+
if (manifest.schema_version !== INSTALL_MANIFEST_SCHEMA) {
|
|
1462
1393
|
throw new Error(
|
|
1463
|
-
`Installation manifest schema ${manifest.schema_version} is
|
|
1394
|
+
`Installation manifest schema ${manifest.schema_version} is unsupported; expected current schema ${INSTALL_MANIFEST_SCHEMA}.`,
|
|
1464
1395
|
);
|
|
1465
1396
|
}
|
|
1466
1397
|
const comparison = comparePackageVersions(packageVersion, manifest.version);
|
|
@@ -1471,10 +1402,6 @@ function planUpgrade(packageRoot, target, options) {
|
|
|
1471
1402
|
throw new Error(`Refusing package downgrade from ${manifest.version} to ${packageVersion}; use --force only after explicit approval.`);
|
|
1472
1403
|
}
|
|
1473
1404
|
const workspace = readWorkspaceConfiguration(target);
|
|
1474
|
-
const contractRetirement = executeDeliveryStateCommand([
|
|
1475
|
-
"contract", "retire", "--project", target, "--gate-id", "UX-LF", "--dry-run",
|
|
1476
|
-
], { yaml: FORMAL_STATE_YAML });
|
|
1477
|
-
const prototypeMigration = planPrototypeMigration(target);
|
|
1478
1405
|
const codeRepository = workspace.configuration.code_repository;
|
|
1479
1406
|
if (["path", "repo_id", "remote", "default_branch"].some((key) =>
|
|
1480
1407
|
(manifest.code_repository?.[key] ?? null) !== (codeRepository[key] ?? null))) {
|
|
@@ -1484,18 +1411,12 @@ function planUpgrade(packageRoot, target, options) {
|
|
|
1484
1411
|
}
|
|
1485
1412
|
const sources = installationSources(packageRoot);
|
|
1486
1413
|
const exactAssets = managedAssetInventory(sources, manifest);
|
|
1487
|
-
const retiredAssets = RETIRED_MANAGED_ASSETS
|
|
1488
|
-
.filter((asset) => manifest.managed_assets?.[asset.manifest_key])
|
|
1489
|
-
.map((asset) => ({
|
|
1490
|
-
...asset,
|
|
1491
|
-
previous_digest: manifest.managed_assets[asset.manifest_key].sha256 || null,
|
|
1492
|
-
}));
|
|
1493
1414
|
const mergedAssets = upgradeMergedAssets(
|
|
1494
1415
|
target,
|
|
1495
1416
|
sources,
|
|
1496
1417
|
{ ...manifest, code_repository: codeRepository },
|
|
1497
1418
|
);
|
|
1498
|
-
for (const asset of [...exactAssets, ...
|
|
1419
|
+
for (const asset of [...exactAssets, ...mergedAssets]) {
|
|
1499
1420
|
validateManagedPath(target, installPath(target, asset.path));
|
|
1500
1421
|
}
|
|
1501
1422
|
const additions = [];
|
|
@@ -1552,32 +1473,12 @@ function planUpgrade(packageRoot, target, options) {
|
|
|
1552
1473
|
replacements.push({ path: asset.path, kind: "merged-file", forced: false });
|
|
1553
1474
|
}
|
|
1554
1475
|
}
|
|
1555
|
-
for (const asset of retiredAssets) {
|
|
1556
|
-
const destination = installPath(target, asset.path);
|
|
1557
|
-
asset.destination = destination;
|
|
1558
|
-
const currentDigest = pathDigest(destination);
|
|
1559
|
-
asset.current_digest = currentDigest;
|
|
1560
|
-
if (currentDigest === null) {
|
|
1561
|
-
preserved.push({ path: asset.path, reason: "retired managed asset is already absent" });
|
|
1562
|
-
} else if (asset.previous_digest && currentDigest === asset.previous_digest) {
|
|
1563
|
-
removals.push({ path: asset.path, kind: asset.kind, forced: false });
|
|
1564
|
-
} else {
|
|
1565
|
-
conflicts.push({
|
|
1566
|
-
path: asset.path,
|
|
1567
|
-
reason: asset.previous_digest
|
|
1568
|
-
? "retired managed asset differs from the installed manifest digest"
|
|
1569
|
-
: "installed manifest does not prove ownership of the retired managed asset",
|
|
1570
|
-
});
|
|
1571
|
-
if (force) removals.push({ path: asset.path, kind: asset.kind, forced: true });
|
|
1572
|
-
}
|
|
1573
|
-
}
|
|
1574
1476
|
const preservedWorkflow = preservedWorkflowFiles(
|
|
1575
1477
|
target,
|
|
1576
1478
|
[
|
|
1577
1479
|
...exactAssets
|
|
1578
1480
|
.filter((asset) => asset.kind !== "ensure-directory")
|
|
1579
1481
|
.map((asset) => asset.path),
|
|
1580
|
-
...retiredAssets.map((asset) => asset.path),
|
|
1581
1482
|
...mergedAssets.map((asset) => asset.path),
|
|
1582
1483
|
],
|
|
1583
1484
|
);
|
|
@@ -1599,7 +1500,6 @@ function planUpgrade(packageRoot, target, options) {
|
|
|
1599
1500
|
codeRepository,
|
|
1600
1501
|
sources,
|
|
1601
1502
|
exactAssets,
|
|
1602
|
-
retiredAssets,
|
|
1603
1503
|
mergedAssets,
|
|
1604
1504
|
additions,
|
|
1605
1505
|
replacements,
|
|
@@ -1609,8 +1509,6 @@ function planUpgrade(packageRoot, target, options) {
|
|
|
1609
1509
|
conflicts,
|
|
1610
1510
|
backups,
|
|
1611
1511
|
comparison,
|
|
1612
|
-
contractRetirement,
|
|
1613
|
-
prototypeMigration,
|
|
1614
1512
|
};
|
|
1615
1513
|
}
|
|
1616
1514
|
|
|
@@ -1704,17 +1602,6 @@ function applyUpgradePlan(target, plan, packageVersion) {
|
|
|
1704
1602
|
apply: () => atomicWrite(asset.destination, asset.desired),
|
|
1705
1603
|
});
|
|
1706
1604
|
}
|
|
1707
|
-
for (const asset of plan.retiredAssets) {
|
|
1708
|
-
if (!changes.has(asset.path)) continue;
|
|
1709
|
-
applyReceiptBackedAsset({
|
|
1710
|
-
target,
|
|
1711
|
-
upgradeRoot,
|
|
1712
|
-
asset,
|
|
1713
|
-
operation: "remove",
|
|
1714
|
-
receiptAssets,
|
|
1715
|
-
apply: () => fs.rmSync(asset.destination, { recursive: true, force: true }),
|
|
1716
|
-
});
|
|
1717
|
-
}
|
|
1718
1605
|
const manifestRelative = INSTALL_MANIFEST.replaceAll("\\", "/");
|
|
1719
1606
|
const manifestBackup = backupUpgradePath(target, upgradeRoot, manifestRelative);
|
|
1720
1607
|
const nextManifest = buildInstallManifest(
|
|
@@ -1742,30 +1629,10 @@ function applyUpgradePlan(target, plan, packageVersion) {
|
|
|
1742
1629
|
to_version: packageVersion,
|
|
1743
1630
|
applied_at: new Date().toISOString(),
|
|
1744
1631
|
formal_event_tree_fingerprint: formalEventFingerprint,
|
|
1745
|
-
contract_retirement: {
|
|
1746
|
-
gate_id: plan.contractRetirement.gate_id,
|
|
1747
|
-
contract_version: UI_CONTRACT_VERSION,
|
|
1748
|
-
affected_iterations: plan.contractRetirement.affected_iterations,
|
|
1749
|
-
expected_scope_revisions: plan.contractRetirement.expected_scope_revisions,
|
|
1750
|
-
},
|
|
1751
1632
|
assets: receiptAssets,
|
|
1752
1633
|
};
|
|
1753
1634
|
atomicWrite(path.join(upgradeRoot, "receipt.json"), `${JSON.stringify(receipt, null, 2)}\n`);
|
|
1754
|
-
|
|
1755
|
-
"contract", "retire", "--project", target,
|
|
1756
|
-
"--gate-id", "UX-LF",
|
|
1757
|
-
"--actor", "system:package-upgrade",
|
|
1758
|
-
"--reason", "prototype-first UI contract",
|
|
1759
|
-
"--contract-version", UI_CONTRACT_VERSION,
|
|
1760
|
-
];
|
|
1761
|
-
const expectedRevisions = Object.values(plan.contractRetirement.expected_scope_revisions);
|
|
1762
|
-
if (expectedRevisions.length === 1) {
|
|
1763
|
-
retirementArgs.push("--expected-scope-revision", String(expectedRevisions[0]));
|
|
1764
|
-
}
|
|
1765
|
-
const contractRetirement = executeDeliveryStateCommand(retirementArgs, {
|
|
1766
|
-
yaml: FORMAL_STATE_YAML,
|
|
1767
|
-
});
|
|
1768
|
-
return { upgradeId, contractRetirement };
|
|
1635
|
+
return { upgradeId };
|
|
1769
1636
|
} catch (error) {
|
|
1770
1637
|
restoreUpgradeAssets(target, upgradeRoot, receiptAssets);
|
|
1771
1638
|
fs.rmSync(upgradeRoot, { recursive: true, force: true });
|
|
@@ -1796,7 +1663,6 @@ function rollbackUpgrade(packageRoot, target, upgradeId) {
|
|
|
1796
1663
|
const sources = installationSources(packageRoot);
|
|
1797
1664
|
const allowedPaths = new Set([
|
|
1798
1665
|
...managedAssetInventory(sources).map((asset) => asset.path),
|
|
1799
|
-
...RETIRED_MANAGED_ASSETS.map((asset) => asset.path),
|
|
1800
1666
|
...MERGED_MANAGED_SURFACES.map((surface) => surface.path),
|
|
1801
1667
|
INSTALL_MANIFEST.replaceAll("\\", "/"),
|
|
1802
1668
|
]);
|
|
@@ -1866,26 +1732,10 @@ export function upgradeProject(packageRoot, target, options = {}) {
|
|
|
1866
1732
|
conflicts: plan.conflicts,
|
|
1867
1733
|
backups: plan.backups,
|
|
1868
1734
|
},
|
|
1869
|
-
compatibility: {
|
|
1870
|
-
installation_manifest: "compatible",
|
|
1871
|
-
package_version: plan.comparison > 0 ? "upgrade" : plan.comparison === 0 ? "same-version repair" : "forced downgrade",
|
|
1872
|
-
},
|
|
1873
1735
|
code_repository: {
|
|
1874
1736
|
path: plan.codeRepository.path,
|
|
1875
1737
|
write_planned: false,
|
|
1876
1738
|
},
|
|
1877
|
-
contract_retirement: {
|
|
1878
|
-
...plan.contractRetirement,
|
|
1879
|
-
contract_version: UI_CONTRACT_VERSION,
|
|
1880
|
-
write_planned: plan.contractRetirement.affected_iterations.length > 0,
|
|
1881
|
-
},
|
|
1882
|
-
prototype_migration: {
|
|
1883
|
-
...plan.prototypeMigration,
|
|
1884
|
-
required_follow_up: {
|
|
1885
|
-
command: "ai-delivery migrate",
|
|
1886
|
-
write_planned: false,
|
|
1887
|
-
},
|
|
1888
|
-
},
|
|
1889
1739
|
};
|
|
1890
1740
|
if (dryRun) return report;
|
|
1891
1741
|
const blockingConflicts = plan.conflicts.filter((item) => !force || item.forceable === false);
|
|
@@ -1897,12 +1747,6 @@ export function upgradeProject(packageRoot, target, options = {}) {
|
|
|
1897
1747
|
}
|
|
1898
1748
|
const applied = applyUpgradePlan(target, plan, packageVersion);
|
|
1899
1749
|
report.upgrade_id = applied.upgradeId;
|
|
1900
|
-
report.contract_retirement = {
|
|
1901
|
-
...report.contract_retirement,
|
|
1902
|
-
...applied.contractRetirement,
|
|
1903
|
-
contract_version: UI_CONTRACT_VERSION,
|
|
1904
|
-
write_planned: false,
|
|
1905
|
-
};
|
|
1906
1750
|
report.applied = true;
|
|
1907
1751
|
return report;
|
|
1908
1752
|
}
|
|
@@ -2496,8 +2340,8 @@ export function doctorProject(target, options = {}) {
|
|
|
2496
2340
|
});
|
|
2497
2341
|
}
|
|
2498
2342
|
checks.push({
|
|
2499
|
-
ok: !fs.existsSync(path.join(target, ".ai-delivery")) && !fs.existsSync(path.join(target,
|
|
2500
|
-
message: "
|
|
2343
|
+
ok: !fs.existsSync(path.join(target, ".ai-delivery")) && !fs.existsSync(path.join(target, ".ai-delivery-task")),
|
|
2344
|
+
message: "unsupported workflow paths are absent",
|
|
2501
2345
|
});
|
|
2502
2346
|
checks.push({ ok: fs.existsSync(path.join(target, "AGENTS.md")), message: "project AGENTS.md is present" });
|
|
2503
2347
|
return { checks, ok: checks.filter((check) => check.required !== false).every((check) => check.ok) };
|