universal-dev-standards 5.17.0 → 6.0.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/bin/uds.js +13 -135
- package/bundled/ai/standards/acceptance-criteria-traceability.ai.yaml +13 -4
- package/bundled/ai/standards/accessibility-standards.ai.yaml +1 -1
- package/bundled/ai/standards/ai-response-navigation.ai.yaml +15 -2
- package/bundled/ai/standards/api-design-standards.ai.yaml +27 -4
- package/bundled/ai/standards/behavior-snapshot.ai.yaml +86 -9
- package/bundled/ai/standards/checkin-standards.ai.yaml +2 -2
- package/bundled/ai/standards/code-review.ai.yaml +2 -2
- package/bundled/ai/standards/context-aware-loading.ai.yaml +3 -3
- package/bundled/ai/standards/data-migration-testing.ai.yaml +79 -3
- package/bundled/ai/standards/deprecation-standards.ai.yaml +10 -2
- package/bundled/ai/standards/developer-memory.ai.yaml +4 -3
- package/bundled/ai/standards/flow-based-testing.ai.yaml +2 -2
- package/bundled/ai/standards/forward-derivation-standards.ai.yaml +26 -2
- package/bundled/ai/standards/full-coverage-testing.ai.yaml +34 -2
- package/bundled/ai/standards/git-worktree.ai.yaml +3 -3
- package/bundled/ai/standards/logging.ai.yaml +97 -3
- package/bundled/ai/standards/mock-boundary.ai.yaml +48 -2
- package/bundled/ai/standards/model-provenance.ai.yaml +297 -0
- package/bundled/ai/standards/model-selection.ai.yaml +11 -2
- package/bundled/ai/standards/observability-standards.ai.yaml +10 -0
- package/bundled/ai/standards/performance-standards.ai.yaml +46 -1
- package/bundled/ai/standards/pii-classification.ai.yaml +15 -1
- package/bundled/ai/standards/pipeline-security-gates.ai.yaml +10 -0
- package/bundled/ai/standards/privacy-standards.ai.yaml +2 -2
- package/bundled/ai/standards/project-context-memory.ai.yaml +2 -2
- package/bundled/ai/standards/refactoring-standards.ai.yaml +68 -3
- package/bundled/ai/standards/resource-cost-boundary.ai.yaml +279 -0
- package/bundled/ai/standards/reverse-engineering-standards.ai.yaml +55 -2
- package/bundled/ai/standards/security-testing.ai.yaml +13 -2
- package/bundled/ai/standards/skill-standard-alignment-check.ai.yaml +37 -2
- package/bundled/ai/standards/user-journey-testing.ai.yaml +107 -0
- package/bundled/ai/standards/verification-oracle.ai.yaml +278 -0
- package/bundled/ai/standards/versioning.ai.yaml +32 -38
- package/bundled/core/acceptance-criteria-traceability.md +15 -5
- package/bundled/core/accessibility-standards.md +8 -4
- package/bundled/core/ai-friendly-architecture.md +1 -1
- package/bundled/core/ai-response-navigation.md +31 -3
- package/bundled/core/anti-sycophancy-prompting.md +1 -1
- package/bundled/core/api-design-standards.md +92 -7
- package/bundled/core/audit-trail.md +119 -0
- package/bundled/core/behavior-snapshot.md +94 -7
- package/bundled/core/browser-compatibility-standards.md +15 -2
- package/bundled/core/checkin-standards.md +9 -2
- package/bundled/core/code-review-checklist.md +10 -2
- package/bundled/core/container-image-standards.md +97 -0
- package/bundled/core/context-aware-loading.md +2 -2
- package/bundled/core/cost-budget-test.md +1 -1
- package/bundled/core/cross-flow-regression.md +3 -2
- package/bundled/core/data-contract.md +104 -0
- package/bundled/core/data-migration-testing.md +90 -0
- package/bundled/core/data-pipeline.md +113 -0
- package/bundled/core/deprecation-standards.md +16 -2
- package/bundled/core/developer-memory.md +13 -8
- package/bundled/core/documentation-writing-standards.md +1 -1
- package/bundled/core/error-code-standards.md +4 -3
- package/bundled/core/flaky-test-management.md +1 -1
- package/bundled/core/flow-based-testing.md +3 -3
- package/bundled/core/forward-derivation-standards.md +33 -5
- package/bundled/core/full-coverage-testing.md +72 -0
- package/bundled/core/git-worktree.md +4 -4
- package/bundled/core/guides/performance-guide.md +1 -1
- package/bundled/core/guides/security-guide.md +1 -1
- package/bundled/core/health-check-standards.md +2 -2
- package/bundled/core/iac-design-principles.md +97 -0
- package/bundled/core/incident-response.md +119 -0
- package/bundled/core/license-compliance.md +2 -0
- package/bundled/core/logging-standards.md +78 -2
- package/bundled/core/mock-boundary.md +54 -2
- package/bundled/core/model-provenance.md +181 -0
- package/bundled/core/model-selection.md +27 -2
- package/bundled/core/packaging-standards.md +1 -0
- package/bundled/core/performance-standards.md +96 -2
- package/bundled/core/pii-classification.md +148 -0
- package/bundled/core/pipeline-security-gates.md +22 -2
- package/bundled/core/postmortem-standards.md +2 -0
- package/bundled/core/prd-standards.md +91 -0
- package/bundled/core/privacy-standards.md +14 -3
- package/bundled/core/product-metrics-standards.md +100 -0
- package/bundled/core/project-context-memory.md +8 -2
- package/bundled/core/prompt-regression.md +1 -1
- package/bundled/core/refactoring-standards.md +44 -3
- package/bundled/core/replay-test.md +1 -1
- package/bundled/core/resource-cost-boundary.md +180 -0
- package/bundled/core/reverse-engineering-standards.md +66 -2
- package/bundled/core/runbook.md +113 -0
- package/bundled/core/schema-evolution.md +105 -0
- package/bundled/core/secret-management-standards.md +110 -0
- package/bundled/core/security-testing.md +26 -2
- package/bundled/core/self-review-protocol.md +2 -2
- package/bundled/core/skill-standard-alignment-check.md +53 -0
- package/bundled/core/slo-sli.md +109 -0
- package/bundled/core/smoke-test.md +1 -1
- package/bundled/core/tech-debt-standards.md +1 -1
- package/bundled/core/test-data-standards.md +2 -2
- package/bundled/core/user-journey-testing.md +102 -0
- package/bundled/core/user-story-mapping.md +96 -0
- package/bundled/core/verification-oracle.md +167 -0
- package/bundled/core/versioning.md +133 -109
- package/bundled/locales/COVERAGE.md +84 -73
- package/bundled/locales/zh-CN/CHANGELOG.md +71 -6
- package/bundled/locales/zh-CN/CLAUDE.md +1 -1
- package/bundled/locales/zh-CN/README.md +22 -9
- package/bundled/locales/zh-CN/SECURITY.md +1 -1
- package/bundled/locales/zh-CN/adoption/DAILY-WORKFLOW-GUIDE.md +2 -2
- package/bundled/locales/zh-CN/core/acceptance-criteria-traceability.md +4 -6
- package/bundled/locales/zh-CN/core/accessibility-standards.md +1 -1
- package/bundled/locales/zh-CN/core/adversarial-test.md +226 -0
- package/bundled/locales/zh-CN/core/agent-behavior-discipline.md +187 -0
- package/bundled/locales/zh-CN/core/ai-response-navigation.md +32 -6
- package/bundled/locales/zh-CN/core/anti-sycophancy-prompting.md +1 -1
- package/bundled/locales/zh-CN/core/api-design-standards.md +1 -1
- package/bundled/locales/zh-CN/core/behavior-snapshot.md +335 -0
- package/bundled/locales/zh-CN/core/browser-compatibility-standards.md +229 -0
- package/bundled/locales/zh-CN/core/cd-deployment-strategies.md +135 -0
- package/bundled/locales/zh-CN/core/chaos-injection-tests.md +130 -0
- package/bundled/locales/zh-CN/core/checkin-standards.md +1 -1
- package/bundled/locales/zh-CN/core/code-review-checklist.md +1 -1
- package/bundled/locales/zh-CN/core/container-security.md +535 -0
- package/bundled/locales/zh-CN/core/context-aware-loading.md +1 -1
- package/bundled/locales/zh-CN/core/contract-testing-standards.md +191 -0
- package/bundled/locales/zh-CN/core/cost-budget-test.md +86 -0
- package/bundled/locales/zh-CN/core/cross-flow-regression.md +199 -0
- package/bundled/locales/zh-CN/core/data-migration-testing.md +217 -0
- package/bundled/locales/zh-CN/core/deployment-standards.md +328 -9
- package/bundled/locales/zh-CN/core/deprecation-standards.md +1 -1
- package/bundled/locales/zh-CN/core/developer-memory.md +2 -2
- package/bundled/locales/zh-CN/core/disaster-recovery-drill.md +87 -0
- package/bundled/locales/zh-CN/core/documentation-structure.md +1 -1
- package/bundled/locales/zh-CN/core/documentation-writing-standards.md +1 -1
- package/bundled/locales/zh-CN/core/error-code-standards.md +2 -2
- package/bundled/locales/zh-CN/core/feature-manifest-standard.md +222 -0
- package/bundled/locales/zh-CN/core/flaky-test-management.md +87 -0
- package/bundled/locales/zh-CN/core/flow-based-testing.md +284 -0
- package/bundled/locales/zh-CN/core/forward-derivation-standards.md +3 -4
- package/bundled/locales/zh-CN/core/full-coverage-testing.md +197 -0
- package/bundled/locales/zh-CN/core/git-worktree.md +1 -1
- package/bundled/locales/zh-CN/core/governance-layer.md +160 -0
- package/bundled/locales/zh-CN/core/guides/performance-guide.md +515 -0
- package/bundled/locales/zh-CN/core/guides/security-guide.md +494 -0
- package/bundled/locales/zh-CN/core/knowledge-graph-memory.md +128 -0
- package/bundled/locales/zh-CN/core/license-compliance.md +129 -0
- package/bundled/locales/zh-CN/core/llm-output-validation.md +192 -0
- package/bundled/locales/zh-CN/core/logging-standards.md +130 -8
- package/bundled/locales/zh-CN/core/mock-boundary.md +109 -0
- package/bundled/locales/zh-CN/core/model-selection.md +28 -5
- package/bundled/locales/zh-CN/core/mutation-testing.md +106 -0
- package/bundled/locales/zh-CN/core/no-cicd-deployment.md +219 -0
- package/bundled/locales/zh-CN/core/packaging-standards.md +76 -5
- package/bundled/locales/zh-CN/core/pipeline-security-gates.md +126 -0
- package/bundled/locales/zh-CN/core/policy-as-code-testing.md +203 -0
- package/bundled/locales/zh-CN/core/privacy-standards.md +1 -1
- package/bundled/locales/zh-CN/core/project-context-memory.md +1 -1
- package/bundled/locales/zh-CN/core/prompt-regression.md +88 -0
- package/bundled/locales/zh-CN/core/property-based-testing.md +87 -0
- package/bundled/locales/zh-CN/core/release-quality-manifest.md +207 -0
- package/bundled/locales/zh-CN/core/release-readiness-gate.md +193 -0
- package/bundled/locales/zh-CN/core/replay-test.md +102 -0
- package/bundled/locales/zh-CN/core/reverse-engineering-standards.md +46 -1
- package/bundled/locales/zh-CN/core/rollback-standards.md +120 -0
- package/bundled/locales/zh-CN/core/sast-advanced.md +309 -0
- package/bundled/locales/zh-CN/core/secure-op.md +328 -0
- package/bundled/locales/zh-CN/core/security-testing.md +96 -0
- package/bundled/locales/zh-CN/core/self-review-protocol.md +167 -0
- package/bundled/locales/zh-CN/core/server-ops-security.md +507 -0
- package/bundled/locales/zh-CN/core/smoke-test.md +79 -0
- package/bundled/locales/zh-CN/core/spec-driven-development.md +39 -3
- package/bundled/locales/zh-CN/core/supply-chain-attestation.md +131 -0
- package/bundled/locales/zh-CN/core/versioning.md +1 -1
- package/bundled/locales/zh-CN/docs/CHEATSHEET.md +31 -6
- package/bundled/locales/zh-CN/docs/FEATURE-REFERENCE.md +61 -34
- package/bundled/locales/zh-CN/docs/MIGRATION-v6.md +88 -0
- package/bundled/locales/zh-CN/docs/USAGE-MODES-COMPARISON.md +2 -2
- package/bundled/locales/zh-CN/docs/USER-MANUAL.md +14 -14
- package/bundled/locales/zh-CN/docs/specs/system/memory-adoption-strategy.md +105 -0
- package/bundled/locales/zh-CN/docs/user/FAQ.md +132 -0
- package/bundled/locales/zh-CN/docs/user/GETTING-STARTED.md +144 -0
- package/bundled/locales/zh-CN/docs/user/GLOSSARY.md +178 -0
- package/bundled/locales/zh-CN/docs/user/README.md +70 -0
- package/bundled/locales/zh-CN/docs/user/TROUBLESHOOTING.md +190 -0
- package/bundled/locales/zh-CN/integrations/github-copilot/COPILOT-CHAT-REFERENCE.md +1 -1
- package/bundled/locales/zh-CN/integrations/github-copilot/README.md +1 -1
- package/bundled/locales/zh-CN/integrations/github-copilot/skills-mapping.md +3 -3
- package/bundled/locales/zh-CN/integrations/opencode/skills-mapping.md +3 -3
- package/bundled/locales/zh-CN/methodologies/guides/sdd-guide.md +836 -0
- package/bundled/locales/zh-CN/options/changelog/auto-generated.md +166 -0
- package/bundled/locales/zh-CN/options/changelog/keep-a-changelog.md +140 -0
- package/bundled/locales/zh-CN/options/code-review/automated-review.md +214 -0
- package/bundled/locales/zh-CN/options/code-review/pair-programming.md +166 -0
- package/bundled/locales/zh-CN/options/code-review/pr-review.md +167 -0
- package/bundled/locales/zh-CN/options/documentation/api-docs.md +191 -0
- package/bundled/locales/zh-CN/options/documentation/markdown-docs.md +150 -0
- package/bundled/locales/zh-CN/options/documentation/wiki-style.md +131 -0
- package/bundled/locales/zh-CN/options/project-structure/kotlin.md +144 -0
- package/bundled/locales/zh-CN/options/project-structure/php.md +168 -0
- package/bundled/locales/zh-CN/options/project-structure/ruby.md +156 -0
- package/bundled/locales/zh-CN/options/project-structure/rust.md +136 -0
- package/bundled/locales/zh-CN/options/project-structure/swift.md +165 -0
- package/bundled/locales/zh-CN/options/testing/contract-testing.md +237 -0
- package/bundled/locales/zh-CN/options/testing/industry-pyramid.md +200 -0
- package/bundled/locales/zh-CN/options/testing/istqb-framework.md +144 -0
- package/bundled/locales/zh-CN/options/testing/performance-testing.md +251 -0
- package/bundled/locales/zh-CN/options/testing/security-testing.md +192 -0
- package/bundled/locales/zh-CN/skills/README.md +89 -126
- package/bundled/locales/zh-CN/skills/ac-coverage/SKILL.md +5 -7
- package/bundled/locales/zh-CN/skills/adr-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/agents/code-architect.md +263 -0
- package/bundled/locales/zh-CN/skills/agents/doc-writer.md +410 -0
- package/bundled/locales/zh-CN/skills/agents/reviewer.md +357 -0
- package/bundled/locales/zh-CN/skills/agents/spec-analyst.md +410 -0
- package/bundled/locales/zh-CN/skills/agents/test-specialist.md +368 -0
- package/bundled/locales/zh-CN/skills/ai-collaboration-standards/SKILL.md +2 -2
- package/bundled/locales/zh-CN/skills/ai-friendly-architecture/SKILL.md +2 -2
- package/bundled/locales/zh-CN/skills/ai-instruction-standards/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/atdd-assistant/acceptance-criteria-guide.md +1 -1
- package/bundled/locales/zh-CN/skills/atdd-assistant/atdd-workflow.md +3 -4
- package/bundled/locales/zh-CN/skills/audit-assistant/SKILL.md +2 -2
- package/bundled/locales/zh-CN/skills/bdd-assistant/guide.md +1 -2
- package/bundled/locales/zh-CN/skills/brainstorm-assistant/SKILL.md +109 -13
- package/bundled/locales/zh-CN/skills/brainstorm-assistant/guide.md +30 -8
- package/bundled/locales/zh-CN/skills/checkin-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/ci-cd-assistant/SKILL.md +50 -0
- package/bundled/locales/zh-CN/skills/code-review-assistant/SKILL.md +5 -5
- package/bundled/locales/zh-CN/skills/commands/ac-coverage.md +1 -1
- package/bundled/locales/zh-CN/skills/commands/atdd.md +3 -3
- package/bundled/locales/zh-CN/skills/commands/bdd.md +2 -2
- package/bundled/locales/zh-CN/skills/commands/brainstorm.md +26 -17
- package/bundled/locales/zh-CN/skills/commands/{review.md → code-review.md} +4 -4
- package/bundled/locales/zh-CN/skills/commands/derive-all.md +1 -1
- package/bundled/locales/zh-CN/skills/commands/derive-atdd.md +1 -1
- package/bundled/locales/zh-CN/skills/commands/derive-bdd.md +2 -3
- package/bundled/locales/zh-CN/skills/commands/derive-tdd.md +1 -1
- package/bundled/locales/zh-CN/skills/commands/derive.md +1 -1
- package/bundled/locales/zh-CN/skills/commands/dev-workflow.md +2 -2
- package/bundled/locales/zh-CN/skills/commands/methodology.md +4 -4
- package/bundled/locales/zh-CN/skills/commands/pr.md +1 -1
- package/bundled/locales/zh-CN/skills/commands/tdd.md +1 -1
- package/bundled/locales/zh-CN/skills/commit-standards/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/contract-test-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/dev-methodology/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/dev-methodology/create-methodology.md +456 -0
- package/bundled/locales/zh-CN/skills/dev-methodology/guide.md +6 -6
- package/bundled/locales/zh-CN/skills/dev-methodology/runtime.md +296 -0
- package/bundled/locales/zh-CN/skills/dev-workflow-guide/SKILL.md +5 -5
- package/bundled/locales/zh-CN/skills/docs-generator/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/e2e-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/incident-response-assistant/SKILL.md +2 -2
- package/bundled/locales/zh-CN/skills/journey-test-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/logging-guide/SKILL.md +146 -142
- package/bundled/locales/zh-CN/skills/migration-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/observability-assistant/guide.md +1 -1
- package/bundled/locales/zh-CN/skills/pr-automation-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/project-discovery/guide.md +2 -2
- package/bundled/locales/zh-CN/skills/reverse-engineer/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/runbook-assistant/guide.md +1 -1
- package/bundled/locales/zh-CN/skills/security-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/skill-builder/SKILL.md +3 -3
- package/bundled/locales/zh-CN/skills/slo-assistant/guide.md +1 -1
- package/bundled/locales/zh-CN/skills/spec-derivation/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/spec-derivation/guide.md +8 -9
- package/bundled/locales/zh-CN/skills/spec-driven-dev/SKILL.md +2 -2
- package/bundled/locales/zh-CN/skills/sweep/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/tdd-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-CN/skills/testing-guide/SKILL.md +2 -2
- package/bundled/locales/zh-CN/skills/testing-guide/testing-theory.md +2298 -0
- package/bundled/locales/zh-CN/skills/workflows/README.md +451 -0
- package/bundled/locales/zh-TW/CHANGELOG.md +71 -6
- package/bundled/locales/zh-TW/CLAUDE.md +1 -1
- package/bundled/locales/zh-TW/MAINTENANCE.md +25 -2
- package/bundled/locales/zh-TW/README.md +22 -9
- package/bundled/locales/zh-TW/SECURITY.md +1 -1
- package/bundled/locales/zh-TW/adoption/DAILY-WORKFLOW-GUIDE.md +2 -2
- package/bundled/locales/zh-TW/ai/standards/versioning.ai.yaml +8 -48
- package/bundled/locales/zh-TW/core/acceptance-criteria-traceability.md +4 -6
- package/bundled/locales/zh-TW/core/accessibility-standards.md +1 -1
- package/bundled/locales/zh-TW/core/adversarial-test.md +226 -0
- package/bundled/locales/zh-TW/core/agent-behavior-discipline.md +187 -0
- package/bundled/locales/zh-TW/core/ai-response-navigation.md +32 -6
- package/bundled/locales/zh-TW/core/anti-sycophancy-prompting.md +1 -1
- package/bundled/locales/zh-TW/core/api-design-standards.md +91 -9
- package/bundled/locales/zh-TW/core/audit-trail.md +110 -0
- package/bundled/locales/zh-TW/core/behavior-snapshot.md +335 -0
- package/bundled/locales/zh-TW/core/browser-compatibility-standards.md +1 -0
- package/bundled/locales/zh-TW/core/cd-deployment-strategies.md +135 -0
- package/bundled/locales/zh-TW/core/chaos-injection-tests.md +130 -0
- package/bundled/locales/zh-TW/core/checkin-standards.md +1 -1
- package/bundled/locales/zh-TW/core/code-review-checklist.md +1 -1
- package/bundled/locales/zh-TW/core/container-image-standards.md +93 -0
- package/bundled/locales/zh-TW/core/container-security.md +535 -0
- package/bundled/locales/zh-TW/core/cost-budget-test.md +86 -0
- package/bundled/locales/zh-TW/core/cross-flow-regression.md +1 -0
- package/bundled/locales/zh-TW/core/data-contract.md +101 -0
- package/bundled/locales/zh-TW/core/data-migration-testing.md +217 -0
- package/bundled/locales/zh-TW/core/data-pipeline.md +105 -0
- package/bundled/locales/zh-TW/core/deployment-standards.md +363 -25
- package/bundled/locales/zh-TW/core/deprecation-standards.md +17 -4
- package/bundled/locales/zh-TW/core/developer-memory.md +2 -2
- package/bundled/locales/zh-TW/core/disaster-recovery-drill.md +87 -0
- package/bundled/locales/zh-TW/core/documentation-writing-standards.md +1 -1
- package/bundled/locales/zh-TW/core/error-code-standards.md +2 -2
- package/bundled/locales/zh-TW/core/feature-manifest-standard.md +222 -0
- package/bundled/locales/zh-TW/core/flaky-test-management.md +87 -0
- package/bundled/locales/zh-TW/core/flow-based-testing.md +284 -0
- package/bundled/locales/zh-TW/core/forward-derivation-standards.md +3 -4
- package/bundled/locales/zh-TW/core/full-coverage-testing.md +250 -0
- package/bundled/locales/zh-TW/core/git-worktree.md +1 -1
- package/bundled/locales/zh-TW/core/guides/performance-guide.md +515 -0
- package/bundled/locales/zh-TW/core/guides/security-guide.md +494 -0
- package/bundled/locales/zh-TW/core/iac-design-principles.md +90 -0
- package/bundled/locales/zh-TW/core/incident-response.md +111 -0
- package/bundled/locales/zh-TW/core/license-compliance.md +129 -0
- package/bundled/locales/zh-TW/core/llm-output-validation.md +192 -0
- package/bundled/locales/zh-TW/core/logging-standards.md +208 -4
- package/bundled/locales/zh-TW/core/mock-boundary.md +161 -0
- package/bundled/locales/zh-TW/core/model-provenance.md +173 -0
- package/bundled/locales/zh-TW/core/model-selection.md +28 -5
- package/bundled/locales/zh-TW/core/mutation-testing.md +106 -0
- package/bundled/locales/zh-TW/core/no-cicd-deployment.md +219 -0
- package/bundled/locales/zh-TW/core/packaging-standards.md +76 -5
- package/bundled/locales/zh-TW/core/performance-standards.md +84 -5
- package/bundled/locales/zh-TW/core/pii-classification.md +102 -0
- package/bundled/locales/zh-TW/core/pipeline-security-gates.md +126 -0
- package/bundled/locales/zh-TW/core/policy-as-code-testing.md +203 -0
- package/bundled/locales/zh-TW/core/prd-standards.md +88 -0
- package/bundled/locales/zh-TW/core/privacy-standards.md +1 -1
- package/bundled/locales/zh-TW/core/product-metrics-standards.md +96 -0
- package/bundled/locales/zh-TW/core/project-context-memory.md +1 -1
- package/bundled/locales/zh-TW/core/prompt-regression.md +88 -0
- package/bundled/locales/zh-TW/core/property-based-testing.md +87 -0
- package/bundled/locales/zh-TW/core/refactoring-standards.md +43 -6
- package/bundled/locales/zh-TW/core/release-quality-manifest.md +207 -0
- package/bundled/locales/zh-TW/core/replay-test.md +102 -0
- package/bundled/locales/zh-TW/core/resource-cost-boundary.md +175 -0
- package/bundled/locales/zh-TW/core/reverse-engineering-standards.md +64 -5
- package/bundled/locales/zh-TW/core/rollback-standards.md +120 -0
- package/bundled/locales/zh-TW/core/runbook.md +110 -0
- package/bundled/locales/zh-TW/core/sast-advanced.md +309 -0
- package/bundled/locales/zh-TW/core/schema-evolution.md +98 -0
- package/bundled/locales/zh-TW/core/secret-management-standards.md +101 -0
- package/bundled/locales/zh-TW/core/secure-op.md +328 -0
- package/bundled/locales/zh-TW/core/security-testing.md +96 -0
- package/bundled/locales/zh-TW/core/self-review-protocol.md +2 -2
- package/bundled/locales/zh-TW/core/server-ops-security.md +507 -0
- package/bundled/locales/zh-TW/core/slo-sli.md +108 -0
- package/bundled/locales/zh-TW/core/smoke-test.md +79 -0
- package/bundled/locales/zh-TW/core/spec-driven-development.md +19 -11
- package/bundled/locales/zh-TW/core/supply-chain-attestation.md +131 -0
- package/bundled/locales/zh-TW/core/user-journey-testing.md +111 -0
- package/bundled/locales/zh-TW/core/user-story-mapping.md +94 -0
- package/bundled/locales/zh-TW/core/verification-oracle.md +159 -0
- package/bundled/locales/zh-TW/core/versioning.md +112 -112
- package/bundled/locales/zh-TW/docs/CHEATSHEET.md +31 -6
- package/bundled/locales/zh-TW/docs/DEV-WORKFLOW-MAPPING.md +6 -6
- package/bundled/locales/zh-TW/docs/FEATURE-REFERENCE.md +61 -34
- package/bundled/locales/zh-TW/docs/MIGRATION-v6.md +88 -0
- package/bundled/locales/zh-TW/docs/USAGE-MODES-COMPARISON.md +2 -2
- package/bundled/locales/zh-TW/docs/USER-MANUAL.md +14 -14
- package/bundled/locales/zh-TW/docs/specs/system/memory-adoption-strategy.md +105 -0
- package/bundled/locales/zh-TW/docs/user/FAQ.md +132 -0
- package/bundled/locales/zh-TW/docs/user/GETTING-STARTED.md +144 -0
- package/bundled/locales/zh-TW/docs/user/GLOSSARY.md +178 -0
- package/bundled/locales/zh-TW/docs/user/README.md +70 -0
- package/bundled/locales/zh-TW/docs/user/TROUBLESHOOTING.md +190 -0
- package/bundled/locales/zh-TW/integrations/github-copilot/COPILOT-CHAT-REFERENCE.md +1 -1
- package/bundled/locales/zh-TW/integrations/github-copilot/README.md +1 -1
- package/bundled/locales/zh-TW/integrations/github-copilot/skills-mapping.md +3 -3
- package/bundled/locales/zh-TW/integrations/opencode/skills-mapping.md +3 -3
- package/bundled/locales/zh-TW/methodologies/guides/sdd-guide.md +523 -26
- package/bundled/locales/zh-TW/options/changelog/auto-generated.md +166 -0
- package/bundled/locales/zh-TW/options/changelog/keep-a-changelog.md +140 -0
- package/bundled/locales/zh-TW/options/code-review/automated-review.md +214 -0
- package/bundled/locales/zh-TW/options/code-review/pair-programming.md +166 -0
- package/bundled/locales/zh-TW/options/code-review/pr-review.md +167 -0
- package/bundled/locales/zh-TW/options/documentation/api-docs.md +191 -0
- package/bundled/locales/zh-TW/options/documentation/markdown-docs.md +150 -0
- package/bundled/locales/zh-TW/options/documentation/wiki-style.md +131 -0
- package/bundled/locales/zh-TW/options/project-structure/kotlin.md +144 -0
- package/bundled/locales/zh-TW/options/project-structure/php.md +168 -0
- package/bundled/locales/zh-TW/options/project-structure/ruby.md +156 -0
- package/bundled/locales/zh-TW/options/project-structure/rust.md +136 -0
- package/bundled/locales/zh-TW/options/project-structure/swift.md +165 -0
- package/bundled/locales/zh-TW/options/testing/contract-testing.md +237 -0
- package/bundled/locales/zh-TW/options/testing/industry-pyramid.md +200 -0
- package/bundled/locales/zh-TW/options/testing/istqb-framework.md +144 -0
- package/bundled/locales/zh-TW/options/testing/performance-testing.md +251 -0
- package/bundled/locales/zh-TW/options/testing/security-testing.md +192 -0
- package/bundled/locales/zh-TW/skills/README.md +91 -128
- package/bundled/locales/zh-TW/skills/ac-coverage/SKILL.md +4 -6
- package/bundled/locales/zh-TW/skills/adr-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-TW/skills/agents/code-architect.md +263 -0
- package/bundled/locales/zh-TW/skills/agents/doc-writer.md +410 -0
- package/bundled/locales/zh-TW/skills/agents/reviewer.md +357 -0
- package/bundled/locales/zh-TW/skills/agents/spec-analyst.md +410 -0
- package/bundled/locales/zh-TW/skills/agents/test-specialist.md +368 -0
- package/bundled/locales/zh-TW/skills/ai-collaboration-standards/SKILL.md +2 -2
- package/bundled/locales/zh-TW/skills/ai-friendly-architecture/SKILL.md +2 -2
- package/bundled/locales/zh-TW/skills/ai-instruction-standards/SKILL.md +1 -1
- package/bundled/locales/zh-TW/skills/atdd-assistant/SKILL.md +2 -0
- package/bundled/locales/zh-TW/skills/atdd-assistant/acceptance-criteria-guide.md +1 -1
- package/bundled/locales/zh-TW/skills/atdd-assistant/atdd-workflow.md +3 -4
- package/bundled/locales/zh-TW/skills/audit-assistant/SKILL.md +2 -2
- package/bundled/locales/zh-TW/skills/bdd-assistant/SKILL.md +2 -0
- package/bundled/locales/zh-TW/skills/bdd-assistant/guide.md +1 -2
- package/bundled/locales/zh-TW/skills/brainstorm-assistant/SKILL.md +110 -14
- package/bundled/locales/zh-TW/skills/brainstorm-assistant/guide.md +31 -7
- package/bundled/locales/zh-TW/skills/checkin-assistant/SKILL.md +3 -1
- package/bundled/locales/zh-TW/skills/ci-cd-assistant/SKILL.md +50 -0
- package/bundled/locales/zh-TW/skills/code-review-assistant/SKILL.md +7 -5
- package/bundled/locales/zh-TW/skills/commands/ac-coverage.md +1 -1
- package/bundled/locales/zh-TW/skills/commands/atdd.md +3 -3
- package/bundled/locales/zh-TW/skills/commands/bdd.md +2 -2
- package/bundled/locales/zh-TW/skills/commands/brainstorm.md +26 -17
- package/bundled/locales/zh-TW/skills/commands/{review.md → code-review.md} +5 -5
- package/bundled/locales/zh-TW/skills/commands/derive-all.md +1 -1
- package/bundled/locales/zh-TW/skills/commands/derive-atdd.md +1 -1
- package/bundled/locales/zh-TW/skills/commands/derive-bdd.md +2 -3
- package/bundled/locales/zh-TW/skills/commands/derive-tdd.md +1 -1
- package/bundled/locales/zh-TW/skills/commands/derive.md +1 -1
- package/bundled/locales/zh-TW/skills/commands/dev-workflow.md +2 -2
- package/bundled/locales/zh-TW/skills/commands/methodology.md +4 -4
- package/bundled/locales/zh-TW/skills/commands/pr.md +1 -1
- package/bundled/locales/zh-TW/skills/commands/tdd.md +1 -1
- package/bundled/locales/zh-TW/skills/commit-standards/SKILL.md +1 -1
- package/bundled/locales/zh-TW/skills/contract-test-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-TW/skills/dev-methodology/create-methodology.md +456 -0
- package/bundled/locales/zh-TW/skills/dev-methodology/guide.md +5 -5
- package/bundled/locales/zh-TW/skills/dev-methodology/runtime.md +296 -0
- package/bundled/locales/zh-TW/skills/dev-workflow-guide/SKILL.md +5 -5
- package/bundled/locales/zh-TW/skills/docs-generator/SKILL.md +1 -1
- package/bundled/locales/zh-TW/skills/e2e-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-TW/skills/incident-response-assistant/SKILL.md +2 -2
- package/bundled/locales/zh-TW/skills/logging-guide/SKILL.md +29 -27
- package/bundled/locales/zh-TW/skills/migration-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-TW/skills/pr-automation-assistant/SKILL.md +3 -1
- package/bundled/locales/zh-TW/skills/project-discovery/guide.md +2 -2
- package/bundled/locales/zh-TW/skills/reverse-engineer/SKILL.md +1 -1
- package/bundled/locales/zh-TW/skills/security-assistant/SKILL.md +1 -1
- package/bundled/locales/zh-TW/skills/spec-derivation/guide.md +7 -8
- package/bundled/locales/zh-TW/skills/spec-driven-dev/SKILL.md +2 -2
- package/bundled/locales/zh-TW/skills/sweep/SKILL.md +1 -1
- package/bundled/locales/zh-TW/skills/tdd-assistant/SKILL.md +3 -1
- package/bundled/locales/zh-TW/skills/testing-guide/SKILL.md +2 -2
- package/bundled/locales/zh-TW/skills/testing-guide/testing-theory.md +2298 -0
- package/bundled/locales/zh-TW/skills/workflows/README.md +451 -0
- package/bundled/skills/README.md +1 -1
- package/bundled/skills/ac-coverage/SKILL.md +17 -7
- package/bundled/skills/adr-assistant/SKILL.md +1 -1
- package/bundled/skills/agents/code-architect.md +1 -1
- package/bundled/skills/agents/doc-writer.md +1 -1
- package/bundled/skills/agents/reviewer.md +2 -2
- package/bundled/skills/agents/spec-analyst.md +1 -1
- package/bundled/skills/agents/test-specialist.md +1 -1
- package/bundled/skills/ai-collaboration-standards/SKILL.md +2 -2
- package/bundled/skills/ai-friendly-architecture/SKILL.md +2 -2
- package/bundled/skills/ai-instruction-standards/SKILL.md +1 -1
- package/bundled/skills/atdd-assistant/SKILL.md +7 -0
- package/bundled/skills/atdd-assistant/acceptance-criteria-guide.md +1 -1
- package/bundled/skills/atdd-assistant/atdd-workflow.md +6 -8
- package/bundled/skills/audit-assistant/SKILL.md +2 -2
- package/bundled/skills/bdd-assistant/SKILL.md +7 -0
- package/bundled/skills/bdd-assistant/guide.md +1 -2
- package/bundled/skills/brainstorm-assistant/SKILL.md +133 -11
- package/bundled/skills/brainstorm-assistant/guide.md +33 -5
- package/bundled/skills/checkin-assistant/SKILL.md +8 -1
- package/bundled/skills/ci-cd-assistant/SKILL.md +57 -0
- package/bundled/skills/code-review-assistant/SKILL.md +15 -8
- package/bundled/skills/commands/COMMAND-FAMILY-OVERVIEW.md +2 -2
- package/bundled/skills/commands/COMMAND-INDEX.json +3 -3
- package/bundled/skills/commands/README.md +2 -2
- package/bundled/skills/commands/ac-coverage.md +1 -1
- package/bundled/skills/commands/atdd.md +2 -2
- package/bundled/skills/commands/bdd.md +2 -2
- package/bundled/skills/commands/brainstorm.md +25 -14
- package/bundled/skills/commands/{review.md → code-review.md} +6 -6
- package/bundled/skills/commands/derive-all.md +1 -1
- package/bundled/skills/commands/derive-atdd.md +1 -1
- package/bundled/skills/commands/derive-bdd.md +2 -3
- package/bundled/skills/commands/derive-tdd.md +1 -1
- package/bundled/skills/commands/derive.md +1 -1
- package/bundled/skills/commands/dev-workflow.md +1 -1
- package/bundled/skills/commands/journey-test.md +45 -0
- package/bundled/skills/commands/methodology.md +4 -4
- package/bundled/skills/commands/pr.md +1 -1
- package/bundled/skills/commands/skill-builder.md +42 -0
- package/bundled/skills/commands/tdd.md +1 -1
- package/bundled/skills/dev-methodology/create-methodology.md +1 -1
- package/bundled/skills/dev-methodology/guide.md +1 -1
- package/bundled/skills/dev-methodology/runtime.md +1 -1
- package/bundled/skills/dev-workflow-guide/SKILL.md +3 -3
- package/bundled/skills/dev-workflow-guide/workflow-phases.md +3 -3
- package/bundled/skills/docs-generator/SKILL.md +3 -3
- package/bundled/skills/incident-response-assistant/SKILL.md +2 -2
- package/bundled/skills/logging-guide/SKILL.md +38 -2
- package/bundled/skills/migration-assistant/SKILL.md +226 -0
- package/bundled/skills/observability-assistant/SKILL.md +74 -0
- package/bundled/skills/pr-automation-assistant/SKILL.md +5 -1
- package/bundled/skills/project-discovery/guide.md +2 -2
- package/bundled/skills/push/SKILL.md +1 -1
- package/bundled/skills/release-standards/SKILL.md +19 -5
- package/bundled/skills/security-assistant/SKILL.md +1 -1
- package/bundled/skills/skill-builder/SKILL.md +1 -1
- package/bundled/skills/spec-derivation/guide.md +3 -4
- package/bundled/skills/spec-driven-dev/SKILL.md +2 -2
- package/bundled/skills/sweep/SKILL.md +1 -1
- package/bundled/skills/tdd-assistant/SKILL.md +8 -1
- package/bundled/skills/testing-guide/SKILL.md +1 -1
- package/bundled/skills/testing-guide/testing-theory.md +1 -1
- package/bundled/skills/workflows/README.md +2 -2
- package/package.json +3 -3
- package/src/commands/audit.js +30 -9
- package/src/commands/config.js +33 -2
- package/src/commands/hitl.js +14 -1
- package/src/commands/init.js +110 -58
- package/src/commands/quickstart.js +1 -2
- package/src/commands/release.js +51 -6
- package/src/commands/run-intent.js +9 -0
- package/src/commands/spec-split.js +27 -2
- package/src/commands/update.js +22 -6
- package/src/config/ai-agent-paths.js +3 -1
- package/src/i18n/messages.js +3 -102
- package/src/missions/MissionManager.js +44 -12
- package/src/utils/build-manifest.js +35 -3
- package/src/utils/friction-detector.js +71 -22
- package/src/utils/health-checker.js +29 -2
- package/src/utils/transaction.js +111 -0
- package/src/utils/version-promote.js +16 -0
- package/standards-registry.json +58 -146
- package/bundled/ai/standards/agent-communication-protocol.ai.yaml +0 -42
- package/bundled/ai/standards/agent-dispatch.ai.yaml +0 -42
- package/bundled/ai/standards/branch-completion.ai.yaml +0 -44
- package/bundled/ai/standards/change-batching-standards.ai.yaml +0 -44
- package/bundled/ai/standards/execution-history.ai.yaml +0 -42
- package/bundled/ai/standards/pipeline-integration-standards.ai.yaml +0 -42
- package/bundled/ai/standards/workflow-enforcement.ai.yaml +0 -44
- package/bundled/ai/standards/workflow-state-protocol.ai.yaml +0 -43
- package/src/commands/flow.js +0 -260
- package/src/commands/start.js +0 -372
- package/src/commands/sweep.js +0 -151
- package/src/commands/workflow.js +0 -681
package/src/commands/audit.js
CHANGED
|
@@ -302,19 +302,40 @@ async function handleReport(auditResult, options, msg) {
|
|
|
302
302
|
return;
|
|
303
303
|
}
|
|
304
304
|
|
|
305
|
-
// Interactive selection
|
|
305
|
+
// Interactive selection (skipped with --yes: submit all findings)
|
|
306
306
|
let selectedFindings = findings.map(f => f.value);
|
|
307
307
|
let userComments = '';
|
|
308
308
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
choices: findings
|
|
313
|
-
});
|
|
309
|
+
const submitAll = options.yes || false;
|
|
310
|
+
const nonInteractiveHint = msg.nonInteractiveHint ||
|
|
311
|
+
'Interactive prompt unavailable in this terminal. Re-run with `uds audit --report --yes` to submit all findings without prompts.';
|
|
314
312
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
313
|
+
if (!isDryRun && !submitAll) {
|
|
314
|
+
// @inquirer/prompts throws ExitPromptError on non-TTY stdin
|
|
315
|
+
// (CI, piped shells, some Windows consoles) — guard instead of crashing (#125)
|
|
316
|
+
if (!process.stdin.isTTY) {
|
|
317
|
+
console.log(chalk.yellow(nonInteractiveHint));
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
let selected;
|
|
322
|
+
let comments;
|
|
323
|
+
try {
|
|
324
|
+
selected = await checkbox({
|
|
325
|
+
message: msg.submitPrompt || 'Select findings to submit:',
|
|
326
|
+
choices: findings
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
comments = await input({
|
|
330
|
+
message: msg.userCommentsPrompt || 'Additional comments (optional):'
|
|
331
|
+
});
|
|
332
|
+
} catch (err) {
|
|
333
|
+
if (err && err.name === 'ExitPromptError') {
|
|
334
|
+
console.log(chalk.yellow(nonInteractiveHint));
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
throw err;
|
|
338
|
+
}
|
|
318
339
|
|
|
319
340
|
selectedFindings = selected;
|
|
320
341
|
userComments = comments || '';
|
package/src/commands/config.js
CHANGED
|
@@ -106,6 +106,30 @@ const VIBE_PRESETS = {
|
|
|
106
106
|
* @param {string} value - Config value
|
|
107
107
|
* @param {Object} options - Command options
|
|
108
108
|
*/
|
|
109
|
+
/**
|
|
110
|
+
* Schema for known config keys (T12 input validation, XSPEC-292 §9).
|
|
111
|
+
* Unknown keys are allowed (forward-compatible); known keys are constrained.
|
|
112
|
+
*/
|
|
113
|
+
const CONFIG_SCHEMAS = {
|
|
114
|
+
'hitl.threshold': { type: 'number', enum: [0, 1, 2, 3, 4] },
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Validate a config value against CONFIG_SCHEMAS.
|
|
119
|
+
* Returns an error message string, or null if valid / no schema.
|
|
120
|
+
*/
|
|
121
|
+
export function validateConfigValue(key, value) {
|
|
122
|
+
const schema = CONFIG_SCHEMAS[key];
|
|
123
|
+
if (!schema) return null;
|
|
124
|
+
if (schema.type === 'number' && typeof value !== 'number') {
|
|
125
|
+
return `${key} must be a number`;
|
|
126
|
+
}
|
|
127
|
+
if (schema.enum && !schema.enum.includes(value)) {
|
|
128
|
+
return `${key} must be one of: ${schema.enum.join(', ')}`;
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
|
|
109
133
|
export async function configCommand(action, key, value, options) {
|
|
110
134
|
// Initialize config manager
|
|
111
135
|
const currentConfig = config.init();
|
|
@@ -141,6 +165,13 @@ export async function configCommand(action, key, value, options) {
|
|
|
141
165
|
if (value === 'false') typedValue = false;
|
|
142
166
|
if (!isNaN(Number(value))) typedValue = Number(value);
|
|
143
167
|
|
|
168
|
+
// T12 input validation: enforce schema for known config keys
|
|
169
|
+
const schemaError = validateConfigValue(key, typedValue);
|
|
170
|
+
if (schemaError) {
|
|
171
|
+
console.error(chalk.red(`Error: ${schemaError}`));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
144
175
|
const scope = options.global ? 'global' : 'project';
|
|
145
176
|
config.set(key, typedValue, scope);
|
|
146
177
|
|
|
@@ -442,8 +473,8 @@ async function initVibeMode(options) {
|
|
|
442
473
|
console.log('');
|
|
443
474
|
console.log(chalk.gray(t('config.nextSteps', 'Next steps:')));
|
|
444
475
|
console.log(chalk.gray(` • ${t('config.useSpec', 'Generate specs:')} uds spec create "your idea"`));
|
|
445
|
-
console.log(chalk.gray(` • ${t('config.useSweep', 'Clean up code:')}
|
|
446
|
-
console.log(chalk.gray(` • ${t('config.
|
|
476
|
+
console.log(chalk.gray(` • ${t('config.useSweep', 'Clean up code:')} /sweep (AI assistant skill)`));
|
|
477
|
+
console.log(chalk.gray(` • ${t('config.useQuickstart', 'Explore recipes:')} uds quickstart`));
|
|
447
478
|
}
|
|
448
479
|
|
|
449
480
|
/**
|
package/src/commands/hitl.js
CHANGED
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { hitl } from '../hitl/manager.js';
|
|
3
3
|
|
|
4
|
+
// T12 input validation (XSPEC-292 §9): bound operation description length.
|
|
5
|
+
const MAX_OP_LENGTH = 500;
|
|
6
|
+
|
|
4
7
|
export async function hitlCommand(options) {
|
|
5
8
|
if (!options.op) {
|
|
6
9
|
console.error(chalk.red('Error: --op <operation> is required'));
|
|
7
10
|
return;
|
|
8
11
|
}
|
|
9
12
|
|
|
10
|
-
const
|
|
13
|
+
const op = String(options.op).trim();
|
|
14
|
+
if (op.length === 0) {
|
|
15
|
+
console.error(chalk.red('Error: --op must not be empty'));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (op.length > MAX_OP_LENGTH) {
|
|
19
|
+
console.error(chalk.red(`Error: --op must be ≤ ${MAX_OP_LENGTH} characters (got ${op.length})`));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const allowed = await hitl.enforce(op, { reason: 'Manual check via CLI' });
|
|
11
24
|
|
|
12
25
|
if (allowed) {
|
|
13
26
|
console.log(chalk.green('✅ Approved'));
|
package/src/commands/init.js
CHANGED
|
@@ -24,6 +24,8 @@ import { displayLanguageToLocale } from '../utils/locale.js';
|
|
|
24
24
|
import { generateReleaseConfig, RELEASE_MODE_LABELS } from '../utils/release-config.js';
|
|
25
25
|
import { guardAgainstSelfAdoption } from '../utils/detect-self-adoption.js';
|
|
26
26
|
import { readInstallYaml } from '../utils/config-manager.js';
|
|
27
|
+
import { getToolFilePath } from '../utils/integration-generator.js';
|
|
28
|
+
import { withFileTransaction } from '../utils/transaction.js';
|
|
27
29
|
|
|
28
30
|
/**
|
|
29
31
|
* Init command - initialize standards in current project
|
|
@@ -92,69 +94,119 @@ export async function initCommand(options) {
|
|
|
92
94
|
}
|
|
93
95
|
}
|
|
94
96
|
|
|
95
|
-
// ===== Execute Installation =====
|
|
97
|
+
// ===== Execute Installation (transactional — T11 / XSPEC-292 §9.2) =====
|
|
96
98
|
console.log();
|
|
97
|
-
|
|
98
|
-
// 1. Install Standards
|
|
99
|
-
const standardsResults = await installStandards(config, projectPath);
|
|
100
|
-
config.installedStandards = standardsResults.standards.map(s => basename(s));
|
|
101
|
-
|
|
102
|
-
// 1.5. Generate release-config.yaml if non-default mode selected
|
|
103
|
-
if (config.releaseMode && config.releaseMode !== 'ci-cd') {
|
|
104
|
-
const releaseConfigData = generateReleaseConfig(config.releaseMode);
|
|
105
|
-
const releaseConfigPath = join(projectPath, '.standards', 'release-config.yaml');
|
|
106
|
-
const yaml = (await import('js-yaml')).default;
|
|
107
|
-
mkdirSync(join(projectPath, '.standards'), { recursive: true });
|
|
108
|
-
writeFileSync(releaseConfigPath, yaml.dump(releaseConfigData), 'utf-8');
|
|
109
|
-
console.log(chalk.green(` ✓ release-config.yaml (${config.releaseMode})`));
|
|
110
|
-
}
|
|
111
99
|
|
|
112
|
-
//
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
//
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
100
|
+
// Files/dirs `init` owns and must tear down if the install fails partway.
|
|
101
|
+
// `.standards/` (and release-config.yaml beneath it) plus the per-tool
|
|
102
|
+
// integration files at the project root. Skills/commands install into shared
|
|
103
|
+
// agent dirs (e.g. ~/.claude/skills, .opencode/) that may already hold
|
|
104
|
+
// unrelated content, so they are intentionally NOT tracked here — re-running
|
|
105
|
+
// `uds init` re-installs them idempotently.
|
|
106
|
+
const ownedPaths = [join(projectPath, '.standards')];
|
|
107
|
+
for (const tool of (config.integrations || config.aiTools || [])) {
|
|
108
|
+
const file = getToolFilePath(tool);
|
|
109
|
+
if (file) ownedPaths.push(join(projectPath, file));
|
|
110
|
+
}
|
|
111
|
+
if (config.generateAgentsMd) ownedPaths.push(join(projectPath, 'AGENTS.md'));
|
|
112
|
+
|
|
113
|
+
let combinedResults;
|
|
114
|
+
// Captured inside apply() so the catch block can report which installers
|
|
115
|
+
// failed even though the verification error itself is generic.
|
|
116
|
+
let installErrors = [];
|
|
117
|
+
try {
|
|
118
|
+
const tx = await withFileTransaction(
|
|
119
|
+
ownedPaths,
|
|
120
|
+
{
|
|
121
|
+
apply: async () => {
|
|
122
|
+
// 1. Install Standards
|
|
123
|
+
const standardsResults = await installStandards(config, projectPath);
|
|
124
|
+
config.installedStandards = standardsResults.standards.map(s => basename(s));
|
|
125
|
+
|
|
126
|
+
// 1.5. Generate release-config.yaml if non-default mode selected
|
|
127
|
+
if (config.releaseMode && config.releaseMode !== 'ci-cd') {
|
|
128
|
+
const releaseConfigData = generateReleaseConfig(config.releaseMode);
|
|
129
|
+
const releaseConfigPath = join(projectPath, '.standards', 'release-config.yaml');
|
|
130
|
+
const yaml = (await import('js-yaml')).default;
|
|
131
|
+
mkdirSync(join(projectPath, '.standards'), { recursive: true });
|
|
132
|
+
writeFileSync(releaseConfigPath, yaml.dump(releaseConfigData), 'utf-8');
|
|
133
|
+
console.log(chalk.green(` ✓ release-config.yaml (${config.releaseMode})`));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// 2. Install Integrations
|
|
137
|
+
const integrationResults = await installIntegrations(config, projectPath);
|
|
138
|
+
|
|
139
|
+
// 2.5. Generate universal AGENTS.md if requested
|
|
140
|
+
const agentsMdResult = await generateUniversalAgentsMd(config, integrationResults, projectPath);
|
|
141
|
+
if (agentsMdResult.path) {
|
|
142
|
+
integrationResults.integrations.push(agentsMdResult.path);
|
|
143
|
+
if (agentsMdResult.blockHashInfo) {
|
|
144
|
+
integrationResults.integrationBlockHashes[agentsMdResult.path] = {
|
|
145
|
+
...agentsMdResult.blockHashInfo,
|
|
146
|
+
installedAt: new Date().toISOString()
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// 3. Install Skills & Commands
|
|
152
|
+
const skillsResults = {
|
|
153
|
+
skills: [],
|
|
154
|
+
commands: [],
|
|
155
|
+
errors: [],
|
|
156
|
+
skillHashes: {},
|
|
157
|
+
commandHashes: {}
|
|
158
|
+
};
|
|
159
|
+
await installSkills(config.skillsConfig, projectPath, msg, skillsResults);
|
|
160
|
+
await installCommands(config.skillsConfig, projectPath, msg, skillsResults);
|
|
161
|
+
|
|
162
|
+
// Combine results
|
|
163
|
+
installErrors = [
|
|
164
|
+
...standardsResults.errors,
|
|
165
|
+
...integrationResults.errors,
|
|
166
|
+
...skillsResults.errors
|
|
167
|
+
];
|
|
168
|
+
return {
|
|
169
|
+
standards: standardsResults.standards,
|
|
170
|
+
extensions: standardsResults.extensions,
|
|
171
|
+
integrations: integrationResults.integrations,
|
|
172
|
+
skills: skillsResults.skills,
|
|
173
|
+
commands: skillsResults.commands,
|
|
174
|
+
errors: installErrors,
|
|
175
|
+
fileHashes: standardsResults.fileHashes,
|
|
176
|
+
skillHashes: skillsResults.skillHashes,
|
|
177
|
+
commandHashes: skillsResults.commandHashes,
|
|
178
|
+
integrationBlockHashes: integrationResults.integrationBlockHashes,
|
|
179
|
+
manifestIntegrationConfigs: integrationResults.manifestIntegrationConfigs
|
|
180
|
+
};
|
|
181
|
+
},
|
|
182
|
+
// A half-installed project must never be committed: if any installer
|
|
183
|
+
// reported an error, fail verification → roll back → no manifest written.
|
|
184
|
+
verify: (results) => results.errors.length === 0
|
|
185
|
+
},
|
|
186
|
+
{ label: 'uds init' }
|
|
187
|
+
);
|
|
188
|
+
combinedResults = tx.result;
|
|
189
|
+
} catch (err) {
|
|
190
|
+
console.log();
|
|
191
|
+
console.log(chalk.red(
|
|
192
|
+
(msg.installFailed || 'Installation failed and was rolled back: {error}')
|
|
193
|
+
.replace('{error}', err.message)
|
|
194
|
+
));
|
|
195
|
+
for (const e of installErrors) {
|
|
196
|
+
console.log(chalk.gray(` ${e}`));
|
|
197
|
+
}
|
|
198
|
+
if (err.rolledBack === false) {
|
|
199
|
+
console.log(chalk.yellow(
|
|
200
|
+
(msg.rollbackFailed || 'Rollback also failed: {error}. Manual cleanup may be required.')
|
|
201
|
+
.replace('{error}', err.rollbackError?.message || 'unknown')
|
|
202
|
+
));
|
|
124
203
|
}
|
|
204
|
+
process.exit(1);
|
|
205
|
+
return;
|
|
125
206
|
}
|
|
126
207
|
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
skills: [],
|
|
130
|
-
commands: [],
|
|
131
|
-
errors: [],
|
|
132
|
-
skillHashes: {},
|
|
133
|
-
commandHashes: {}
|
|
134
|
-
};
|
|
135
|
-
await installSkills(config.skillsConfig, projectPath, msg, skillsResults);
|
|
136
|
-
await installCommands(config.skillsConfig, projectPath, msg, skillsResults);
|
|
137
|
-
|
|
138
|
-
// Combine results
|
|
139
|
-
const combinedResults = {
|
|
140
|
-
standards: standardsResults.standards,
|
|
141
|
-
extensions: standardsResults.extensions,
|
|
142
|
-
integrations: integrationResults.integrations,
|
|
143
|
-
skills: skillsResults.skills,
|
|
144
|
-
commands: skillsResults.commands,
|
|
145
|
-
errors: [
|
|
146
|
-
...standardsResults.errors,
|
|
147
|
-
...integrationResults.errors,
|
|
148
|
-
...skillsResults.errors
|
|
149
|
-
],
|
|
150
|
-
fileHashes: standardsResults.fileHashes,
|
|
151
|
-
skillHashes: skillsResults.skillHashes,
|
|
152
|
-
commandHashes: skillsResults.commandHashes,
|
|
153
|
-
integrationBlockHashes: integrationResults.integrationBlockHashes,
|
|
154
|
-
manifestIntegrationConfigs: integrationResults.manifestIntegrationConfigs
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
// 4. Write Manifest & Display Summary
|
|
208
|
+
// 4. Write Manifest & Display Summary (commit point — only reached when the
|
|
209
|
+
// install verified clean; this is the "initialized" marker for the project)
|
|
158
210
|
writeFinalManifest(config, combinedResults, projectPath);
|
|
159
211
|
|
|
160
212
|
// 4.5. Generate layered CLAUDE.md (if --content-layout layered)
|
|
@@ -35,7 +35,7 @@ export const WORKFLOWS = [
|
|
|
35
35
|
name: 'Test-Driven Development (TDD)',
|
|
36
36
|
description: 'Red-Green-Refactor cycle',
|
|
37
37
|
steps: [
|
|
38
|
-
{ cmd: '
|
|
38
|
+
{ cmd: '# Drive TDD with the /tdd skill', desc: 'Red-Green-Refactor from your AI assistant' },
|
|
39
39
|
{ cmd: '# Write failing test (RED)', desc: 'Define expected behavior' },
|
|
40
40
|
{ cmd: '# Make it pass (GREEN)', desc: 'Minimal implementation' },
|
|
41
41
|
{ cmd: '# Improve (REFACTOR)', desc: 'Clean up without breaking tests' },
|
|
@@ -57,7 +57,6 @@ export const WORKFLOWS = [
|
|
|
57
57
|
steps: [
|
|
58
58
|
{ cmd: 'uds sync', desc: 'Generate context.md from git diff + workflow state' },
|
|
59
59
|
{ cmd: 'cat .workflow-state/context.md', desc: 'Read context in new session' },
|
|
60
|
-
{ cmd: 'uds workflow status', desc: 'Check workflow execution status' },
|
|
61
60
|
],
|
|
62
61
|
},
|
|
63
62
|
];
|
package/src/commands/release.js
CHANGED
|
@@ -14,8 +14,12 @@ import yaml from 'js-yaml';
|
|
|
14
14
|
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
15
15
|
import { join } from 'path';
|
|
16
16
|
import { execSync } from 'child_process';
|
|
17
|
+
import { createHash } from 'crypto';
|
|
17
18
|
import { resolveReleaseWorkflow } from '../utils/release-config.js';
|
|
18
|
-
import { formatGitTag, createPromotionRecord, parseRCVersion } from '../utils/version-promote.js';
|
|
19
|
+
import { formatGitTag, createPromotionRecord, parseRCVersion, isStableVersion } from '../utils/version-promote.js';
|
|
20
|
+
|
|
21
|
+
// Default deployment environments (overridable via release-config.yaml release.environments)
|
|
22
|
+
const DEFAULT_ENVIRONMENTS = ['development', 'staging', 'canary', 'preview', 'production'];
|
|
19
23
|
import { createManifest, verifyManifest } from '../utils/build-manifest.js';
|
|
20
24
|
import { recordDeployment, updateDeploymentResult, checkDeploymentReadiness } from '../utils/deployment-tracker.js';
|
|
21
25
|
|
|
@@ -149,7 +153,7 @@ export async function releaseCommand(subcommand, args, options) {
|
|
|
149
153
|
console.log(chalk.red('verify 子命令僅在 manual 或 hybrid 模式下可用。'));
|
|
150
154
|
return;
|
|
151
155
|
}
|
|
152
|
-
await handleVerify(projectPath);
|
|
156
|
+
await handleVerify(projectPath, options);
|
|
153
157
|
break;
|
|
154
158
|
|
|
155
159
|
default:
|
|
@@ -177,6 +181,13 @@ async function handlePromote(targetVersion, projectPath) {
|
|
|
177
181
|
return;
|
|
178
182
|
}
|
|
179
183
|
|
|
184
|
+
// Validate stable semver format (catches typos like 1.a.0, 1.2, abc)
|
|
185
|
+
if (!isStableVersion(targetVersion)) {
|
|
186
|
+
console.log(chalk.red(`版本格式無效: ${targetVersion}`));
|
|
187
|
+
console.log(chalk.gray(' 需為 stable semver(X.Y.Z),例如: uds release promote 1.2.0'));
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
|
|
180
191
|
// Find the latest RC for this version
|
|
181
192
|
const currentVersion = getPackageVersion(projectPath);
|
|
182
193
|
const parsed = currentVersion ? parseRCVersion(currentVersion) : null;
|
|
@@ -221,6 +232,19 @@ async function handleDeploy(environment, options, projectPath) {
|
|
|
221
232
|
return;
|
|
222
233
|
}
|
|
223
234
|
|
|
235
|
+
// Validate environment against allow-list (overridable via release-config.yaml)
|
|
236
|
+
const deployConfig = loadReleaseConfig(projectPath);
|
|
237
|
+
const allowedEnvironments =
|
|
238
|
+
Array.isArray(deployConfig?.release?.environments) && deployConfig.release.environments.length > 0
|
|
239
|
+
? deployConfig.release.environments
|
|
240
|
+
: DEFAULT_ENVIRONMENTS;
|
|
241
|
+
if (!allowedEnvironments.includes(environment)) {
|
|
242
|
+
console.log(chalk.red(`未知的部署環境: ${environment}`));
|
|
243
|
+
console.log(chalk.gray(` 允許的環境: ${allowedEnvironments.join(', ')}`));
|
|
244
|
+
console.log(chalk.gray(' 自訂環境請在 .standards/release-config.yaml 設定 release.environments'));
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
224
248
|
const currentVersion = getPackageVersion(projectPath) || 'unknown';
|
|
225
249
|
const deployments = loadDeployments(projectPath);
|
|
226
250
|
|
|
@@ -307,9 +331,12 @@ async function handleManifest(versionArg, options, projectPath) {
|
|
|
307
331
|
}
|
|
308
332
|
|
|
309
333
|
/**
|
|
310
|
-
* /release verify
|
|
334
|
+
* /release verify [--artifact <path>]
|
|
335
|
+
*
|
|
336
|
+
* T13 (XSPEC-292): when --artifact is given, compute its SHA256 so verify
|
|
337
|
+
* actually CONSUMES the checksum recorded in the manifest, not just stores it.
|
|
311
338
|
*/
|
|
312
|
-
async function handleVerify(projectPath) {
|
|
339
|
+
async function handleVerify(projectPath, options = {}) {
|
|
313
340
|
const manifestPath = join(projectPath, 'build-manifest.json');
|
|
314
341
|
|
|
315
342
|
if (!existsSync(manifestPath)) {
|
|
@@ -327,12 +354,26 @@ async function handleVerify(projectPath) {
|
|
|
327
354
|
}
|
|
328
355
|
const currentCommit = getGitCommit();
|
|
329
356
|
|
|
330
|
-
|
|
357
|
+
// Compute the artefact's checksum when a path is supplied.
|
|
358
|
+
let actualChecksum;
|
|
359
|
+
const artifactPath = options.artifact || null;
|
|
360
|
+
if (artifactPath) {
|
|
361
|
+
if (!existsSync(artifactPath)) {
|
|
362
|
+
console.log(chalk.red(`找不到 artifact:${artifactPath}`));
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
actualChecksum = createHash('sha256').update(readFileSync(artifactPath)).digest('hex');
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const result = verifyManifest(manifest, currentCommit, { actualChecksum });
|
|
331
369
|
|
|
332
370
|
if (result.valid) {
|
|
333
371
|
console.log(chalk.green('✓ Manifest 驗證通過'));
|
|
334
372
|
console.log(chalk.gray(` 版本: ${manifest.version}`));
|
|
335
373
|
console.log(chalk.gray(` Commit: ${manifest.commit} (一致)`));
|
|
374
|
+
if (actualChecksum && manifest.checksum?.package) {
|
|
375
|
+
console.log(chalk.gray(` Checksum: ${actualChecksum} (一致)`));
|
|
376
|
+
}
|
|
336
377
|
} else {
|
|
337
378
|
console.log(chalk.red('✗ Manifest 驗證失敗'));
|
|
338
379
|
for (const err of result.errors) {
|
|
@@ -340,6 +381,10 @@ async function handleVerify(projectPath) {
|
|
|
340
381
|
}
|
|
341
382
|
}
|
|
342
383
|
|
|
384
|
+
for (const w of result.warnings ?? []) {
|
|
385
|
+
console.log(chalk.yellow(` ⚠ ${w}`));
|
|
386
|
+
}
|
|
387
|
+
|
|
343
388
|
// Show staging status
|
|
344
389
|
const deployments = loadDeployments(projectPath);
|
|
345
390
|
const stagingPassed = deployments.some(
|
|
@@ -369,7 +414,7 @@ function showReleaseHelp(workflow) {
|
|
|
369
414
|
console.log(chalk.gray(' deploy <env> 記錄部署紀錄'));
|
|
370
415
|
console.log(chalk.gray(' deploy <env> --result 更新測試結果'));
|
|
371
416
|
console.log(chalk.gray(' manifest 產生 build-manifest.json'));
|
|
372
|
-
console.log(chalk.gray(' verify
|
|
417
|
+
console.log(chalk.gray(' verify [--artifact <path>] 驗證 manifest 一致性(含 checksum 比對)'));
|
|
373
418
|
} else {
|
|
374
419
|
console.log(chalk.gray(' CI/CD 模式下,請使用 /release start 和 /release finish'));
|
|
375
420
|
console.log(chalk.gray(' 切換到手動模式: uds config --type release_mode'));
|
|
@@ -19,6 +19,15 @@ export async function runIntentCommand(intent, options = {}) {
|
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
// T12 input validation (XSPEC-292 §9): intent is a config key lookup —
|
|
23
|
+
// restrict to a safe charset to reject malformed/injection-style input.
|
|
24
|
+
if (!/^[a-z0-9][a-z0-9_-]*$/.test(intent)) {
|
|
25
|
+
console.error(chalk.red(`✗ intent 格式無效: "${intent}"`));
|
|
26
|
+
console.log(chalk.gray(' intent 僅可含小寫字母、數字、- 與 _(例: test, lint, build)'));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
22
31
|
let resolved;
|
|
23
32
|
try {
|
|
24
33
|
resolved = resolveCommand(intent, projectPath);
|
|
@@ -12,6 +12,7 @@ import { checkbox, confirm as inquirerConfirm } from '@inquirer/prompts';
|
|
|
12
12
|
import { MicroSpec } from '../vibe/micro-spec.js';
|
|
13
13
|
import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from 'node:fs';
|
|
14
14
|
import { join } from 'node:path';
|
|
15
|
+
import { withFileTransaction } from '../utils/transaction.js';
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* Extract acceptance criteria from spec markdown
|
|
@@ -135,7 +136,6 @@ export async function specSplitCommand(id, options = {}) {
|
|
|
135
136
|
// Update original spec: add depends_on to new spec
|
|
136
137
|
const originalContent = originalLines.join('\n');
|
|
137
138
|
const updatedOriginal = addDependsOn(originalContent, newId);
|
|
138
|
-
writeFileSync(specPath, updatedOriginal, 'utf-8');
|
|
139
139
|
|
|
140
140
|
// Create new spec with moved ACs
|
|
141
141
|
const newSpec = {
|
|
@@ -154,7 +154,32 @@ export async function specSplitCommand(id, options = {}) {
|
|
|
154
154
|
/\*\*Acceptance\*\*:[\s\S]*?(?=\n\*\*|$)/,
|
|
155
155
|
`**Acceptance**:\n${acSection}`
|
|
156
156
|
);
|
|
157
|
-
|
|
157
|
+
|
|
158
|
+
// T11 (XSPEC-292 §9.2): the two writes must be atomic. If creating the new
|
|
159
|
+
// spec fails after the original was rewritten (ACs removed), the original
|
|
160
|
+
// would be corrupted and the moved ACs lost. Wrap both writes so any failure
|
|
161
|
+
// restores the original and removes a partially-written new spec.
|
|
162
|
+
try {
|
|
163
|
+
await withFileTransaction(
|
|
164
|
+
[specPath, newSpecPath],
|
|
165
|
+
{
|
|
166
|
+
apply: () => {
|
|
167
|
+
writeFileSync(specPath, updatedOriginal, 'utf-8');
|
|
168
|
+
writeFileSync(newSpecPath, finalContent, 'utf-8');
|
|
169
|
+
},
|
|
170
|
+
verify: () => existsSync(specPath) && existsSync(newSpecPath)
|
|
171
|
+
},
|
|
172
|
+
{ label: `spec-split ${id}` }
|
|
173
|
+
);
|
|
174
|
+
} catch (err) {
|
|
175
|
+
console.log(chalk.red(`\nError: spec split failed and was rolled back: ${err.message}`));
|
|
176
|
+
console.log(chalk.gray(` Original ${id} restored. Backup also at ${join(backupDir, `${id}-pre-split.md`)}`));
|
|
177
|
+
if (err.rolledBack === false) {
|
|
178
|
+
console.log(chalk.yellow(` ⚠ Rollback also failed: ${err.rollbackError?.message}. Restore manually from the backup.`));
|
|
179
|
+
}
|
|
180
|
+
process.exit(1);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
158
183
|
|
|
159
184
|
console.log(chalk.green('\nSplit complete:'));
|
|
160
185
|
console.log(` ${chalk.cyan(id)} — ${acs.length - toMove.length} ACs (updated)`);
|
package/src/commands/update.js
CHANGED
|
@@ -808,9 +808,18 @@ export async function updateCommand(options) {
|
|
|
808
808
|
}
|
|
809
809
|
|
|
810
810
|
// Update manifest
|
|
811
|
+
// T11 (XSPEC-292 §9.2): never record a partial failure as a completed update.
|
|
812
|
+
// If any standard/extension/integration copy failed, KEEP the previous
|
|
813
|
+
// upstream.version (and installed date) so that re-running `uds update`
|
|
814
|
+
// retries the failed files instead of treating the project as already up to
|
|
815
|
+
// date. The manifest is still written so that hash/migration bookkeeping for
|
|
816
|
+
// the files that DID succeed is persisted.
|
|
817
|
+
const updateIncomplete = results.errors.length > 0;
|
|
811
818
|
manifest.version = '3.3.0';
|
|
812
|
-
|
|
813
|
-
|
|
819
|
+
if (!updateIncomplete) {
|
|
820
|
+
manifest.upstream.version = latestVersion;
|
|
821
|
+
manifest.upstream.installed = new Date().toISOString().split('T')[0];
|
|
822
|
+
}
|
|
814
823
|
refreshIntegrationBlockHashes(manifest, projectPath);
|
|
815
824
|
writeManifest(manifest, projectPath);
|
|
816
825
|
|
|
@@ -893,8 +902,14 @@ export async function updateCommand(options) {
|
|
|
893
902
|
|
|
894
903
|
// Summary
|
|
895
904
|
console.log();
|
|
896
|
-
|
|
897
|
-
|
|
905
|
+
if (updateIncomplete) {
|
|
906
|
+
// T11: surface the partial state honestly instead of claiming success.
|
|
907
|
+
console.log(chalk.yellow(msg.updateIncomplete ||
|
|
908
|
+
'⚠ Update incomplete — some files failed to update. Version NOT advanced; re-run `uds update` to retry.'));
|
|
909
|
+
} else {
|
|
910
|
+
console.log(chalk.green(msg.updateSuccess));
|
|
911
|
+
console.log(chalk.gray(` ${msg.versionUpdated.replace('{current}', currentVersion).replace('{latest}', latestVersion)}`));
|
|
912
|
+
}
|
|
898
913
|
if (results.integrations.length > 0) {
|
|
899
914
|
console.log(chalk.gray(` ${msg.integrationsSynced.replace('{count}', results.integrations.length)}`));
|
|
900
915
|
}
|
|
@@ -1285,8 +1300,9 @@ export async function updateCommand(options) {
|
|
|
1285
1300
|
|
|
1286
1301
|
console.log();
|
|
1287
1302
|
|
|
1288
|
-
// Exit explicitly to prevent hanging
|
|
1289
|
-
|
|
1303
|
+
// Exit explicitly to prevent hanging.
|
|
1304
|
+
// T11: a partial update exits non-zero so CI / scripts can detect the failure.
|
|
1305
|
+
process.exit(updateIncomplete ? 1 : 0);
|
|
1290
1306
|
}
|
|
1291
1307
|
|
|
1292
1308
|
/**
|
|
@@ -471,7 +471,7 @@ export const AVAILABLE_COMMANDS = [
|
|
|
471
471
|
// Core Development Workflow (Action Skills)
|
|
472
472
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
473
473
|
{ name: 'commit', description: 'Generate commit messages following Conventional Commits' },
|
|
474
|
-
{ name: 'review', description: 'Perform code review with checklist' },
|
|
474
|
+
{ name: 'code-review', description: 'Perform code review with checklist' },
|
|
475
475
|
{ name: 'checkin', description: 'Pre-commit quality gates verification' },
|
|
476
476
|
{ name: 'release', description: 'Guide release process' },
|
|
477
477
|
{ name: 'changelog', description: 'Generate changelog entries' },
|
|
@@ -484,6 +484,7 @@ export const AVAILABLE_COMMANDS = [
|
|
|
484
484
|
{ name: 'atdd', description: 'Guide ATDD workflow (acceptance criteria)' },
|
|
485
485
|
{ name: 'coverage', description: 'Analyze test coverage (8 dimensions)' },
|
|
486
486
|
{ name: 'ac-coverage', description: 'Generate AC traceability matrix and coverage report' },
|
|
487
|
+
{ name: 'journey-test', description: 'Generate user journey test plan (TESTPLAN) and E2E skeletons' },
|
|
487
488
|
|
|
488
489
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
489
490
|
// Specification and Requirements (Action Skills)
|
|
@@ -524,6 +525,7 @@ export const AVAILABLE_COMMANDS = [
|
|
|
524
525
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
525
526
|
{ name: 'methodology', description: 'Development methodology selection' },
|
|
526
527
|
{ name: 'dev-workflow', description: 'Guide for mapping development phases to UDS commands' },
|
|
528
|
+
{ name: 'skill-builder', description: 'Identify repeated processes and build Skills with the right depth' },
|
|
527
529
|
|
|
528
530
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
529
531
|
// Operations and Infrastructure (Action Skills)
|