universal-dev-standards 5.17.0 → 6.1.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/options/commit-message/bilingual.ai.yaml +19 -1
- 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 +3 -3
- 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/documentation-writing-standards.ai.yaml +1 -1
- 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/frontend-design-standards.ai.yaml +33 -3
- 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/push-standards.ai.yaml +14 -3
- package/bundled/ai/standards/refactoring-standards.ai.yaml +68 -3
- package/bundled/ai/standards/requirement-engineering.ai.yaml +42 -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/self-review-protocol.ai.yaml +15 -10
- 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-evidence.ai.yaml +88 -5
- 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 +10 -3
- 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 +2 -2
- package/bundled/core/error-code-standards.md +4 -3
- package/bundled/core/feature-discovery-standards.md +191 -0
- 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/frontend-design-standards.md +93 -4
- 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/multi-environment-e2e-testing.md +195 -0
- 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/push-standards.md +82 -0
- package/bundled/core/refactoring-standards.md +44 -3
- package/bundled/core/replay-test.md +1 -1
- package/bundled/core/requirement-engineering.md +2 -2
- 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 +15 -10
- 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-evidence.md +170 -10
- package/bundled/core/verification-oracle.md +167 -0
- package/bundled/core/versioning.md +133 -109
- package/bundled/locales/COVERAGE.md +94 -77
- package/bundled/locales/zh-CN/CHANGELOG.md +94 -6
- package/bundled/locales/zh-CN/CLAUDE.md +1 -1
- package/bundled/locales/zh-CN/MAINTENANCE.md +42 -661
- package/bundled/locales/zh-CN/README.md +25 -12
- package/bundled/locales/zh-CN/SECURITY.md +2 -2
- package/bundled/locales/zh-CN/adoption/DAILY-WORKFLOW-GUIDE.md +2 -2
- package/bundled/locales/zh-CN/ai/options/commit-message/bilingual.ai.yaml +6 -1
- 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 +239 -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 +200 -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/frontend-design-standards.md +1 -1
- package/bundled/locales/zh-CN/core/full-coverage-testing.md +269 -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 +131 -0
- package/bundled/locales/zh-CN/core/llm-output-validation.md +192 -0
- package/bundled/locales/zh-CN/core/logging-standards.md +205 -7
- package/bundled/locales/zh-CN/core/mock-boundary.md +161 -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 +77 -5
- package/bundled/locales/zh-CN/core/pipeline-security-gates.md +146 -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/requirement-engineering.md +1 -1
- 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 +113 -0
- package/bundled/locales/zh-CN/core/self-review-protocol.md +172 -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/verification-evidence.md +252 -41
- package/bundled/locales/zh-CN/core/versioning.md +1 -1
- package/bundled/locales/zh-CN/docs/CHEATSHEET.md +36 -7
- package/bundled/locales/zh-CN/docs/FEATURE-REFERENCE.md +71 -53
- 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/commit-message/bilingual.md +10 -3
- 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 +115 -17
- package/bundled/locales/zh-CN/skills/brainstorm-assistant/guide.md +37 -12
- 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 +169 -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 +94 -6
- package/bundled/locales/zh-TW/CLAUDE.md +1 -1
- package/bundled/locales/zh-TW/MAINTENANCE.md +51 -4
- package/bundled/locales/zh-TW/README.md +25 -12
- package/bundled/locales/zh-TW/SECURITY.md +2 -2
- package/bundled/locales/zh-TW/adoption/DAILY-WORKFLOW-GUIDE.md +2 -2
- package/bundled/locales/zh-TW/ai/options/commit-message/bilingual.ai.yaml +6 -1
- 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/frontend-design-standards.md +1 -1
- 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 +131 -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 +77 -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 +146 -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/requirement-engineering.md +1 -1
- 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 +113 -0
- package/bundled/locales/zh-TW/core/self-review-protocol.md +18 -13
- 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-evidence.md +260 -31
- 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 +36 -7
- package/bundled/locales/zh-TW/docs/DEV-WORKFLOW-MAPPING.md +6 -6
- package/bundled/locales/zh-TW/docs/FEATURE-REFERENCE.md +71 -53
- 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/commit-message/bilingual.md +10 -3
- 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 +116 -18
- package/bundled/locales/zh-TW/skills/brainstorm-assistant/guide.md +38 -11
- 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 +52 -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 +139 -15
- package/bundled/skills/brainstorm-assistant/guide.md +39 -8
- 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 +13 -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 +4 -4
- 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 +168 -75
- 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 +61 -149
- 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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Testing Theory Knowledge Base
|
|
2
2
|
|
|
3
|
-
> **Language**: English | [繁體中文](../../locales/zh-TW/skills/testing-guide/testing-theory.md)
|
|
3
|
+
> **Language**: English | [繁體中文](../../locales/zh-TW/skills/testing-guide/testing-theory.md) | [简体中文](../../locales/zh-CN/skills/testing-guide/testing-theory.md)
|
|
4
4
|
|
|
5
5
|
**Version**: 1.0.0
|
|
6
6
|
**Last Updated**: 2026-01-29
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# UDS Workflows
|
|
2
2
|
|
|
3
|
-
> **Language**: English | [繁體中文](../../locales/zh-TW/skills/workflows/README.md)
|
|
3
|
+
> **Language**: English | [繁體中文](../../locales/zh-TW/skills/workflows/README.md) | [简体中文](../../locales/zh-CN/skills/workflows/README.md)
|
|
4
4
|
|
|
5
5
|
**Version**: 1.1.0
|
|
6
6
|
**Last Updated**: 2026-01-21
|
|
@@ -423,7 +423,7 @@ This prevents context pollution and ensures reproducible agent behavior.
|
|
|
423
423
|
|
|
424
424
|
- [Agents Documentation](../agents/README.md)
|
|
425
425
|
- [Skills Documentation](../README.md)
|
|
426
|
-
- [Methodology System](../methodology
|
|
426
|
+
- [Methodology System](../dev-methodology/SKILL.md)
|
|
427
427
|
|
|
428
428
|
---
|
|
429
429
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "universal-dev-standards",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.1.0",
|
|
4
4
|
"description": "CLI tool for adopting Universal Development Standards",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"documentation",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"@inquirer/prompts": "^8.4.2",
|
|
63
63
|
"chalk": "^5.3.0",
|
|
64
|
-
"commander": "^
|
|
64
|
+
"commander": "^15.0.0",
|
|
65
65
|
"js-yaml": "^4.1.0",
|
|
66
66
|
"ora": "^9.4.0"
|
|
67
67
|
},
|
|
@@ -70,9 +70,9 @@
|
|
|
70
70
|
"@vitest/coverage-v8": "^4.1.5",
|
|
71
71
|
"ajv": "^8.20.0",
|
|
72
72
|
"ajv-formats": "^3.0.1",
|
|
73
|
-
"eslint": "10.
|
|
73
|
+
"eslint": "10.6.0",
|
|
74
74
|
"glob": "^13.0.1",
|
|
75
|
-
"globals": "17.
|
|
75
|
+
"globals": "17.7.0",
|
|
76
76
|
"husky": "^9.1.7",
|
|
77
77
|
"lint-staged": "^17.0.3",
|
|
78
78
|
"vitest": "^4.1.5"
|
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}`));
|
|
124
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
|
+
));
|
|
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)
|
|
@@ -188,7 +240,7 @@ export async function initCommand(options) {
|
|
|
188
240
|
* - Node.js projects: use husky
|
|
189
241
|
* - Non-Node.js projects: write native .git/hooks/pre-commit
|
|
190
242
|
*/
|
|
191
|
-
async function setupHuskyHook(projectPath) {
|
|
243
|
+
export async function setupHuskyHook(projectPath) {
|
|
192
244
|
const hasGit = existsSync(join(projectPath, '.git'));
|
|
193
245
|
if (!hasGit) return;
|
|
194
246
|
|
|
@@ -197,6 +249,11 @@ async function setupHuskyHook(projectPath) {
|
|
|
197
249
|
if (isNodeProject) {
|
|
198
250
|
console.log(chalk.cyan('Configuring Pre-commit Hook (Husky)...'));
|
|
199
251
|
|
|
252
|
+
// Every edit we make to the adopter's package.json, reported at the end.
|
|
253
|
+
// `uds init` writes ~70 files; a one-line change to package.json is invisible
|
|
254
|
+
// in that diff unless we say it out loud (XSPEC-341 R1).
|
|
255
|
+
const pkgChanges = [];
|
|
256
|
+
|
|
200
257
|
// 1. Install husky if needed
|
|
201
258
|
try {
|
|
202
259
|
const pkgPath = join(projectPath, 'package.json');
|
|
@@ -205,25 +262,54 @@ async function setupHuskyHook(projectPath) {
|
|
|
205
262
|
|
|
206
263
|
if (!hasHusky) {
|
|
207
264
|
console.log(chalk.gray(' Installing husky...'));
|
|
208
|
-
|
|
265
|
+
// stdio: 'pipe' rather than 'ignore' — the error text belongs in the
|
|
266
|
+
// message below, not in /dev/null.
|
|
267
|
+
execSync('npm install --save-dev husky', { stdio: 'pipe', cwd: projectPath });
|
|
268
|
+
pkgChanges.push('devDependencies.husky — added');
|
|
209
269
|
}
|
|
210
270
|
} catch (e) {
|
|
211
271
|
console.log(chalk.yellow(` ⚠ Failed to check/install husky: ${e.message}`));
|
|
212
272
|
return;
|
|
213
273
|
}
|
|
214
274
|
|
|
215
|
-
// 2.
|
|
275
|
+
// 2. Wire husky's `prepare` script ourselves.
|
|
276
|
+
//
|
|
277
|
+
// We deliberately do NOT run `npx husky init` (XSPEC-341 R1). That command is a
|
|
278
|
+
// one-time bootstrap for a NEW project, not an idempotent operation: it sets
|
|
279
|
+
// `"prepare": "husky"` unconditionally, destroying whatever was there. For a
|
|
280
|
+
// published package whose `prepare` is its build step — `"prepare": "tsup"` with
|
|
281
|
+
// no prepack/prepublishOnly and `files: ["dist"]` — that silently breaks the next
|
|
282
|
+
// `npm publish`, and the failure surfaces at release time, far from this command.
|
|
283
|
+
// (It also seeds .husky/pre-commit with `npm test`, a gate the adopter never asked
|
|
284
|
+
// for.) Adopting a standards library must never rewrite the adopter's build.
|
|
216
285
|
const huskyDir = join(projectPath, '.husky');
|
|
217
286
|
try {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
287
|
+
const pkgPath = join(projectPath, 'package.json');
|
|
288
|
+
const raw = readFileSync(pkgPath, 'utf-8');
|
|
289
|
+
const pkg = JSON.parse(raw);
|
|
290
|
+
pkg.scripts = pkg.scripts || {};
|
|
291
|
+
const existing = pkg.scripts.prepare;
|
|
292
|
+
|
|
293
|
+
if (!existing) {
|
|
294
|
+
pkg.scripts.prepare = 'husky';
|
|
295
|
+
pkgChanges.push('scripts.prepare — added: "husky"');
|
|
296
|
+
} else if (!/\bhusky\b/.test(existing)) {
|
|
297
|
+
// Chain, never clobber. The adopter's command runs first and keeps its
|
|
298
|
+
// exit code meaningful.
|
|
299
|
+
pkg.scripts.prepare = `${existing} && husky`;
|
|
300
|
+
pkgChanges.push(`scripts.prepare — "${existing}" → "${pkg.scripts.prepare}"`);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if (pkg.scripts.prepare !== existing) {
|
|
304
|
+
// Preserve the file's trailing newline convention.
|
|
305
|
+
const indent = raw.match(/^\{\n(\s+)"/)?.[1]?.length ?? 2;
|
|
306
|
+
writeFileSync(pkgPath, JSON.stringify(pkg, null, indent) + (raw.endsWith('\n') ? '\n' : ''), 'utf-8');
|
|
221
307
|
}
|
|
222
|
-
} catch {
|
|
223
|
-
|
|
308
|
+
} catch (e) {
|
|
309
|
+
console.log(chalk.yellow(` ⚠ Failed to configure the prepare script: ${e.message}`));
|
|
224
310
|
}
|
|
225
311
|
|
|
226
|
-
// 3. Ensure .husky directory exists
|
|
312
|
+
// 3. Ensure .husky directory exists
|
|
227
313
|
if (!existsSync(huskyDir)) {
|
|
228
314
|
try {
|
|
229
315
|
mkdirSync(huskyDir, { recursive: true });
|
|
@@ -238,16 +324,15 @@ async function setupHuskyHook(projectPath) {
|
|
|
238
324
|
const udsCmd = 'npx uds check';
|
|
239
325
|
|
|
240
326
|
try {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
content = '#!/usr/bin/env sh\n. "$(dirname -- "$0")/_/husky.sh"\n';
|
|
247
|
-
}
|
|
327
|
+
// husky v9 hooks are plain shell scripts: no shebang, no `_/husky.sh` sourcing
|
|
328
|
+
// (that is v8 syntax, deprecated in v9 and removed in v10). We install husky
|
|
329
|
+
// ^9, so a fresh hook must be v9-shaped. Existing files are appended to, never
|
|
330
|
+
// rewritten — their contents are the adopter's, not ours.
|
|
331
|
+
const content = existsSync(preCommitPath) ? readFileSync(preCommitPath, 'utf-8') : '';
|
|
248
332
|
|
|
249
333
|
if (!content.includes('uds check')) {
|
|
250
|
-
|
|
334
|
+
const sep = content && !content.endsWith('\n') ? '\n' : '';
|
|
335
|
+
writeFileSync(preCommitPath, `${content}${sep}\n# UDS Standard Check\n${udsCmd}\n`, 'utf-8');
|
|
251
336
|
try {
|
|
252
337
|
execSync(`chmod +x ${preCommitPath}`);
|
|
253
338
|
} catch {
|
|
@@ -260,6 +345,14 @@ async function setupHuskyHook(projectPath) {
|
|
|
260
345
|
} catch (e) {
|
|
261
346
|
console.log(chalk.red(` ✗ Failed to configure pre-commit hook: ${e.message}`));
|
|
262
347
|
}
|
|
348
|
+
|
|
349
|
+
// 5. Say what we changed in their package.json.
|
|
350
|
+
if (pkgChanges.length > 0) {
|
|
351
|
+
console.log(chalk.cyan(' package.json modified:'));
|
|
352
|
+
for (const change of pkgChanges) {
|
|
353
|
+
console.log(chalk.gray(` • ${change}`));
|
|
354
|
+
}
|
|
355
|
+
}
|
|
263
356
|
} else {
|
|
264
357
|
// Non-Node.js: write native .git/hooks/pre-commit
|
|
265
358
|
console.log(chalk.cyan('Configuring Pre-commit Hook (native git hook)...'));
|
|
@@ -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);
|