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
|
@@ -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)
|
package/src/i18n/messages.js
CHANGED
|
@@ -75,37 +75,6 @@ export const messages = {
|
|
|
75
75
|
deleted: 'Spec deleted.'
|
|
76
76
|
},
|
|
77
77
|
|
|
78
|
-
// Mission Command
|
|
79
|
-
mission: {
|
|
80
|
-
activeExists: 'An active mission already exists:',
|
|
81
|
-
existingAction: 'What would you like to do?',
|
|
82
|
-
resume: 'Resume existing mission',
|
|
83
|
-
cancel: 'Cancel existing and start new',
|
|
84
|
-
abort: 'Abort (do nothing)',
|
|
85
|
-
aborted: 'Operation cancelled.',
|
|
86
|
-
resuming: 'Resuming existing mission...',
|
|
87
|
-
previousCancelled: 'Previous mission cancelled.',
|
|
88
|
-
selectType: 'Select mission type:',
|
|
89
|
-
enterIntent: 'Describe your goal:',
|
|
90
|
-
intentRequired: 'Intent is required',
|
|
91
|
-
created: 'Mission created!',
|
|
92
|
-
suggestedWorkflow: 'Suggested workflow:',
|
|
93
|
-
nextSteps: 'Next steps:',
|
|
94
|
-
useSpecCreate: 'Create specs:',
|
|
95
|
-
useStatus: 'Check status:',
|
|
96
|
-
usePause: 'Pause mission:',
|
|
97
|
-
planningPhase: 'Mission is now in planning phase.',
|
|
98
|
-
noActive: 'No active mission.',
|
|
99
|
-
startHint: 'Start one with: uds start <type> "<intent>"',
|
|
100
|
-
paused: 'Mission paused.',
|
|
101
|
-
resumed: 'Mission resumed!',
|
|
102
|
-
confirmCancel: 'Cancel this mission?',
|
|
103
|
-
cancelAborted: 'Operation cancelled.',
|
|
104
|
-
cancelled: 'Mission cancelled.',
|
|
105
|
-
noMissions: 'No missions found.',
|
|
106
|
-
listTitle: 'Missions:'
|
|
107
|
-
},
|
|
108
|
-
|
|
109
78
|
// Display Language (first prompt - English only since language not yet selected)
|
|
110
79
|
displayLanguage: {
|
|
111
80
|
title: 'Display Language',
|
|
@@ -673,8 +642,6 @@ export const messages = {
|
|
|
673
642
|
vibeMode: 'Vibe Coding Mode - For AI-assisted development',
|
|
674
643
|
missionMode: 'Mission Mode - For goal-oriented development',
|
|
675
644
|
customMode: 'Custom - Set individual options',
|
|
676
|
-
missionComingSoon: 'Mission mode setup coming soon!',
|
|
677
|
-
useStartCommand: 'For now, use: uds start <mission-type> <intent>',
|
|
678
645
|
customHint: 'Use: uds config set <key> <value>',
|
|
679
646
|
vibeModeTitle: 'Vibe Coding Configuration',
|
|
680
647
|
vibeModeDesc: 'Configure UDS for natural language-driven development',
|
|
@@ -700,7 +667,7 @@ export const messages = {
|
|
|
700
667
|
nextSteps: 'Next steps:',
|
|
701
668
|
useSpec: 'Generate specs:',
|
|
702
669
|
useSweep: 'Clean up code:',
|
|
703
|
-
|
|
670
|
+
useQuickstart: 'Explore recipes:',
|
|
704
671
|
// Display Language
|
|
705
672
|
displayLanguageOption: 'Display Language - Change UI language',
|
|
706
673
|
currentLanguage: 'Current language',
|
|
@@ -1340,37 +1307,6 @@ export const messages = {
|
|
|
1340
1307
|
deleted: '規格已刪除。'
|
|
1341
1308
|
},
|
|
1342
1309
|
|
|
1343
|
-
// Mission Command
|
|
1344
|
-
mission: {
|
|
1345
|
-
activeExists: '已存在進行中的任務:',
|
|
1346
|
-
existingAction: '您想怎麼做?',
|
|
1347
|
-
resume: '繼續現有任務',
|
|
1348
|
-
cancel: '取消現有任務並開始新任務',
|
|
1349
|
-
abort: '中止(不執行任何操作)',
|
|
1350
|
-
aborted: '操作已取消。',
|
|
1351
|
-
resuming: '正在繼續現有任務...',
|
|
1352
|
-
previousCancelled: '已取消先前任務。',
|
|
1353
|
-
selectType: '選擇任務類型:',
|
|
1354
|
-
enterIntent: '描述您的目標:',
|
|
1355
|
-
intentRequired: '必須提供意圖描述',
|
|
1356
|
-
created: '任務已建立!',
|
|
1357
|
-
suggestedWorkflow: '建議的工作流程:',
|
|
1358
|
-
nextSteps: '後續步驟:',
|
|
1359
|
-
useSpecCreate: '建立規格:',
|
|
1360
|
-
useStatus: '查看狀態:',
|
|
1361
|
-
usePause: '暫停任務:',
|
|
1362
|
-
planningPhase: '任務現在處於規劃階段。',
|
|
1363
|
-
noActive: '沒有進行中的任務。',
|
|
1364
|
-
startHint: '使用以下命令開始:uds start <類型> "<意圖>"',
|
|
1365
|
-
paused: '任務已暫停。',
|
|
1366
|
-
resumed: '任務已繼續!',
|
|
1367
|
-
confirmCancel: '確定要取消此任務嗎?',
|
|
1368
|
-
cancelAborted: '操作已取消。',
|
|
1369
|
-
cancelled: '任務已取消。',
|
|
1370
|
-
noMissions: '找不到任務。',
|
|
1371
|
-
listTitle: '任務列表:'
|
|
1372
|
-
},
|
|
1373
|
-
|
|
1374
1310
|
// Display Language (first prompt - English only since language not yet selected)
|
|
1375
1311
|
displayLanguage: {
|
|
1376
1312
|
title: 'Display Language',
|
|
@@ -1938,8 +1874,6 @@ export const messages = {
|
|
|
1938
1874
|
vibeMode: 'Vibe Coding 模式 - AI 輔助開發',
|
|
1939
1875
|
missionMode: 'Mission 模式 - 目標導向開發',
|
|
1940
1876
|
customMode: '自訂 - 個別設定選項',
|
|
1941
|
-
missionComingSoon: 'Mission 模式設定即將推出!',
|
|
1942
|
-
useStartCommand: '目前請使用:uds start <mission-type> <intent>',
|
|
1943
1877
|
customHint: '使用:uds config set <key> <value>',
|
|
1944
1878
|
vibeModeTitle: 'Vibe Coding 設定',
|
|
1945
1879
|
vibeModeDesc: '設定 UDS 以進行自然語言驅動開發',
|
|
@@ -1965,7 +1899,7 @@ export const messages = {
|
|
|
1965
1899
|
nextSteps: '後續步驟:',
|
|
1966
1900
|
useSpec: '產生規格:',
|
|
1967
1901
|
useSweep: '清理程式碼:',
|
|
1968
|
-
|
|
1902
|
+
useQuickstart: '探索工作流程範例:',
|
|
1969
1903
|
// Display Language
|
|
1970
1904
|
displayLanguageOption: '顯示語言 - 變更 UI 語言',
|
|
1971
1905
|
currentLanguage: '目前語言',
|
|
@@ -2604,37 +2538,6 @@ export const messages = {
|
|
|
2604
2538
|
deleted: '规格已删除。'
|
|
2605
2539
|
},
|
|
2606
2540
|
|
|
2607
|
-
// Mission Command
|
|
2608
|
-
mission: {
|
|
2609
|
-
activeExists: '已存在进行中的任务:',
|
|
2610
|
-
existingAction: '您想怎么做?',
|
|
2611
|
-
resume: '继续现有任务',
|
|
2612
|
-
cancel: '取消现有任务并开始新任务',
|
|
2613
|
-
abort: '中止(不执行任何操作)',
|
|
2614
|
-
aborted: '操作已取消。',
|
|
2615
|
-
resuming: '正在继续现有任务...',
|
|
2616
|
-
previousCancelled: '已取消先前任务。',
|
|
2617
|
-
selectType: '选择任务类型:',
|
|
2618
|
-
enterIntent: '描述您的目标:',
|
|
2619
|
-
intentRequired: '必须提供意图描述',
|
|
2620
|
-
created: '任务已创建!',
|
|
2621
|
-
suggestedWorkflow: '建议的工作流程:',
|
|
2622
|
-
nextSteps: '后续步骤:',
|
|
2623
|
-
useSpecCreate: '创建规格:',
|
|
2624
|
-
useStatus: '查看状态:',
|
|
2625
|
-
usePause: '暂停任务:',
|
|
2626
|
-
planningPhase: '任务现在处于规划阶段。',
|
|
2627
|
-
noActive: '没有进行中的任务。',
|
|
2628
|
-
startHint: '使用以下命令开始:uds start <类型> "<意图>"',
|
|
2629
|
-
paused: '任务已暂停。',
|
|
2630
|
-
resumed: '任务已继续!',
|
|
2631
|
-
confirmCancel: '确定要取消此任务吗?',
|
|
2632
|
-
cancelAborted: '操作已取消。',
|
|
2633
|
-
cancelled: '任务已取消。',
|
|
2634
|
-
noMissions: '找不到任务。',
|
|
2635
|
-
listTitle: '任务列表:'
|
|
2636
|
-
},
|
|
2637
|
-
|
|
2638
2541
|
// Display Language (first prompt - English only since language not yet selected)
|
|
2639
2542
|
displayLanguage: {
|
|
2640
2543
|
title: 'Display Language',
|
|
@@ -3131,8 +3034,6 @@ export const messages = {
|
|
|
3131
3034
|
vibeMode: 'Vibe Coding 模式 - AI 辅助开发',
|
|
3132
3035
|
missionMode: 'Mission 模式 - 目标导向开发',
|
|
3133
3036
|
customMode: '自定义 - 单独设置选项',
|
|
3134
|
-
missionComingSoon: 'Mission 模式设置即将推出!',
|
|
3135
|
-
useStartCommand: '目前请使用:uds start <mission-type> <intent>',
|
|
3136
3037
|
customHint: '使用:uds config set <key> <value>',
|
|
3137
3038
|
vibeModeTitle: 'Vibe Coding 配置',
|
|
3138
3039
|
vibeModeDesc: '配置 UDS 以进行自然语言驱动开发',
|
|
@@ -3158,7 +3059,7 @@ export const messages = {
|
|
|
3158
3059
|
nextSteps: '后续步骤:',
|
|
3159
3060
|
useSpec: '生成规格:',
|
|
3160
3061
|
useSweep: '清理代码:',
|
|
3161
|
-
|
|
3062
|
+
useQuickstart: '探索工作流程示例:',
|
|
3162
3063
|
// Display Language
|
|
3163
3064
|
displayLanguageOption: '显示语言 - 更改 UI 语言',
|
|
3164
3065
|
currentLanguage: '当前语言',
|
|
@@ -26,22 +26,29 @@ export const MissionState = {
|
|
|
26
26
|
REVIEW: 'review',
|
|
27
27
|
COMPLETED: 'completed',
|
|
28
28
|
PAUSED: 'paused',
|
|
29
|
-
CANCELLED: 'cancelled'
|
|
29
|
+
CANCELLED: 'cancelled',
|
|
30
|
+
// Terminal failure state (T11 / XSPEC-292 §9.2): a mission that cannot
|
|
31
|
+
// proceed (unrecoverable error / abandoned). Like COMPLETED and CANCELLED it
|
|
32
|
+
// is terminal and cannot be resumed.
|
|
33
|
+
FAILED: 'failed'
|
|
30
34
|
};
|
|
31
35
|
|
|
32
36
|
/**
|
|
33
|
-
* Valid state transitions
|
|
37
|
+
* Valid state transitions.
|
|
38
|
+
* Any active (non-terminal) state may transition to FAILED; terminal states
|
|
39
|
+
* (COMPLETED / CANCELLED / FAILED) have no outgoing transitions.
|
|
34
40
|
*/
|
|
35
41
|
const STATE_TRANSITIONS = {
|
|
36
|
-
[MissionState.CREATED]: [MissionState.PLANNING, MissionState.CANCELLED],
|
|
37
|
-
[MissionState.PLANNING]: [MissionState.SPEC_PENDING, MissionState.PAUSED, MissionState.CANCELLED],
|
|
38
|
-
[MissionState.SPEC_PENDING]: [MissionState.SPEC_CONFIRMED, MissionState.PLANNING, MissionState.CANCELLED],
|
|
39
|
-
[MissionState.SPEC_CONFIRMED]: [MissionState.IN_PROGRESS, MissionState.PAUSED, MissionState.CANCELLED],
|
|
40
|
-
[MissionState.IN_PROGRESS]: [MissionState.REVIEW, MissionState.PAUSED, MissionState.CANCELLED],
|
|
41
|
-
[MissionState.REVIEW]: [MissionState.COMPLETED, MissionState.IN_PROGRESS, MissionState.CANCELLED],
|
|
42
|
-
[MissionState.PAUSED]: [MissionState.PLANNING, MissionState.IN_PROGRESS, MissionState.CANCELLED],
|
|
42
|
+
[MissionState.CREATED]: [MissionState.PLANNING, MissionState.CANCELLED, MissionState.FAILED],
|
|
43
|
+
[MissionState.PLANNING]: [MissionState.SPEC_PENDING, MissionState.PAUSED, MissionState.CANCELLED, MissionState.FAILED],
|
|
44
|
+
[MissionState.SPEC_PENDING]: [MissionState.SPEC_CONFIRMED, MissionState.PLANNING, MissionState.CANCELLED, MissionState.FAILED],
|
|
45
|
+
[MissionState.SPEC_CONFIRMED]: [MissionState.IN_PROGRESS, MissionState.PAUSED, MissionState.CANCELLED, MissionState.FAILED],
|
|
46
|
+
[MissionState.IN_PROGRESS]: [MissionState.REVIEW, MissionState.PAUSED, MissionState.CANCELLED, MissionState.FAILED],
|
|
47
|
+
[MissionState.REVIEW]: [MissionState.COMPLETED, MissionState.IN_PROGRESS, MissionState.CANCELLED, MissionState.FAILED],
|
|
48
|
+
[MissionState.PAUSED]: [MissionState.PLANNING, MissionState.IN_PROGRESS, MissionState.CANCELLED, MissionState.FAILED],
|
|
43
49
|
[MissionState.COMPLETED]: [],
|
|
44
|
-
[MissionState.CANCELLED]: []
|
|
50
|
+
[MissionState.CANCELLED]: [],
|
|
51
|
+
[MissionState.FAILED]: []
|
|
45
52
|
};
|
|
46
53
|
|
|
47
54
|
/**
|
|
@@ -157,12 +164,14 @@ export class MissionManager {
|
|
|
157
164
|
}
|
|
158
165
|
|
|
159
166
|
/**
|
|
160
|
-
* Check if state is terminal (completed or
|
|
167
|
+
* Check if state is terminal (completed, cancelled, or failed)
|
|
161
168
|
* @param {string} state - Mission state
|
|
162
169
|
* @returns {boolean}
|
|
163
170
|
*/
|
|
164
171
|
isTerminalState(state) {
|
|
165
|
-
return state === MissionState.COMPLETED
|
|
172
|
+
return state === MissionState.COMPLETED
|
|
173
|
+
|| state === MissionState.CANCELLED
|
|
174
|
+
|| state === MissionState.FAILED;
|
|
166
175
|
}
|
|
167
176
|
|
|
168
177
|
/**
|
|
@@ -188,6 +197,15 @@ export class MissionManager {
|
|
|
188
197
|
throw new Error('No active mission found');
|
|
189
198
|
}
|
|
190
199
|
|
|
200
|
+
// Resume guard (T11 / XSPEC-292 §9.2): terminal states are final. A
|
|
201
|
+
// completed / cancelled / failed mission must never be revived — fail
|
|
202
|
+
// loudly instead of silently re-activating an archived mission.
|
|
203
|
+
if (this.isTerminalState(mission.state)) {
|
|
204
|
+
throw new Error(
|
|
205
|
+
`Mission ${mission.id} is in terminal state '${mission.state}' and cannot be transitioned or resumed.`
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
191
209
|
if (!this.canTransition(mission.state, toState)) {
|
|
192
210
|
throw new Error(
|
|
193
211
|
`Invalid transition: ${mission.state} → ${toState}. ` +
|
|
@@ -431,6 +449,20 @@ export class MissionManager {
|
|
|
431
449
|
return this.transition(MissionState.CANCELLED, { reason });
|
|
432
450
|
}
|
|
433
451
|
|
|
452
|
+
/**
|
|
453
|
+
* Mark current mission as FAILED (terminal).
|
|
454
|
+
*
|
|
455
|
+
* Used when a mission cannot proceed — an unrecoverable error or an abandoned
|
|
456
|
+
* run. Unlike {@link pause}, a failed mission is archived to history and can
|
|
457
|
+
* never be resumed (see the resume guard in {@link transition}).
|
|
458
|
+
*
|
|
459
|
+
* @param {string} reason - Reason for the failure
|
|
460
|
+
* @returns {Object} Failed mission
|
|
461
|
+
*/
|
|
462
|
+
fail(reason = '') {
|
|
463
|
+
return this.transition(MissionState.FAILED, { reason });
|
|
464
|
+
}
|
|
465
|
+
|
|
434
466
|
/**
|
|
435
467
|
* Complete current mission
|
|
436
468
|
* @param {Object} summary - Completion summary
|
|
@@ -26,12 +26,28 @@ export function createManifest({ version, commit, builder, checksum, branch }) {
|
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
/** Normalize a checksum for comparison: drop an optional `sha256:` prefix, lowercase, trim. */
|
|
30
|
+
function normalizeChecksum(value) {
|
|
31
|
+
return String(value).trim().replace(/^sha256:/i, '').toLowerCase();
|
|
32
|
+
}
|
|
33
|
+
|
|
29
34
|
/**
|
|
30
|
-
* Verify a manifest against a Git tag's commit hash
|
|
31
|
-
*
|
|
35
|
+
* Verify a manifest against a Git tag's commit hash, and — when the manifest
|
|
36
|
+
* records a package checksum — against the artefact's actual checksum.
|
|
37
|
+
*
|
|
38
|
+
* T13 (XSPEC-292): the manifest carries `checksum.package`, but earlier this
|
|
39
|
+
* function only compared the commit. Recording a checksum that nothing verifies
|
|
40
|
+
* is a false integrity guarantee, so verify now consumes it.
|
|
41
|
+
*
|
|
42
|
+
* @param {object} manifest
|
|
43
|
+
* @param {string} gitTagCommit
|
|
44
|
+
* @param {{ actualChecksum?: string }} [options] - actualChecksum: SHA256 of the
|
|
45
|
+
* packaged artefact (computed by the caller). Omit when no artefact is at hand.
|
|
46
|
+
* @returns {{ valid: boolean, errors: string[], warnings: string[] }}
|
|
32
47
|
*/
|
|
33
|
-
export function verifyManifest(manifest, gitTagCommit) {
|
|
48
|
+
export function verifyManifest(manifest, gitTagCommit, options = {}) {
|
|
34
49
|
const errors = [];
|
|
50
|
+
const warnings = [];
|
|
35
51
|
|
|
36
52
|
if (!manifest.commit) {
|
|
37
53
|
errors.push('manifest missing commit field');
|
|
@@ -39,8 +55,24 @@ export function verifyManifest(manifest, gitTagCommit) {
|
|
|
39
55
|
errors.push(`commit mismatch: manifest has "${manifest.commit}", git tag points to "${gitTagCommit}"`);
|
|
40
56
|
}
|
|
41
57
|
|
|
58
|
+
const recorded = manifest.checksum?.package ?? null;
|
|
59
|
+
if (recorded) {
|
|
60
|
+
const { actualChecksum } = options;
|
|
61
|
+
if (actualChecksum == null) {
|
|
62
|
+
warnings.push(
|
|
63
|
+
'checksum recorded in manifest but no artefact provided to verify against ' +
|
|
64
|
+
'(pass --artifact <path> to verify integrity)'
|
|
65
|
+
);
|
|
66
|
+
} else if (normalizeChecksum(actualChecksum) !== normalizeChecksum(recorded)) {
|
|
67
|
+
errors.push(
|
|
68
|
+
`checksum mismatch: manifest records "${recorded}", artefact computes to "${actualChecksum}"`
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
42
73
|
return {
|
|
43
74
|
valid: errors.length === 0,
|
|
44
75
|
errors,
|
|
76
|
+
warnings,
|
|
45
77
|
};
|
|
46
78
|
}
|
|
@@ -114,26 +114,51 @@ function detectUnusedStandards(projectPath, manifest) {
|
|
|
114
114
|
|
|
115
115
|
const allConfigText = configContents.join('\n');
|
|
116
116
|
|
|
117
|
-
//
|
|
117
|
+
// Build a filename -> canonical id index from the registry. AI configs
|
|
118
|
+
// reference a standard by its canonical id (e.g. `.standards/ai-agreement`),
|
|
119
|
+
// which often diverges from the installed filename: most files carry a
|
|
120
|
+
// `-standards` suffix the id drops, and a few diverge entirely
|
|
121
|
+
// (error-codes.ai.yaml -> id error-code-standards). Matching only on the
|
|
122
|
+
// filename therefore produced false "unused" findings whose remediation is
|
|
123
|
+
// `uds uninstall` — i.e. it could remove standards that are in active use. (#125)
|
|
118
124
|
const allStdsFriction = getAllStandards();
|
|
119
125
|
const frictionFormat = manifest.format || 'ai';
|
|
120
|
-
const
|
|
126
|
+
const fileNameToId = new Map();
|
|
127
|
+
for (const entry of allStdsFriction) {
|
|
128
|
+
const src = getStandardSource(entry, frictionFormat) || getStandardSource(entry, 'human');
|
|
129
|
+
if (src) fileNameToId.set(src.split('/').pop(), entry.id);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Resolve each manifest standard to its canonical id + filename
|
|
133
|
+
// (handles both ID format and legacy path format)
|
|
134
|
+
const standardRefs = (manifest.standards || []).map(s => {
|
|
135
|
+
let id;
|
|
136
|
+
let fileName;
|
|
121
137
|
if (!s.includes('/') && !s.includes('.')) {
|
|
122
|
-
// ID format: resolve
|
|
138
|
+
// ID format: the entry itself is the id; resolve filename via registry
|
|
139
|
+
id = s;
|
|
123
140
|
const entry = allStdsFriction.find(r => r.id === s);
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
141
|
+
const src = entry ? getStandardSource(entry, frictionFormat) : null;
|
|
142
|
+
fileName = src ? src.split('/').pop() : s;
|
|
143
|
+
} else {
|
|
144
|
+
// Path format: derive filename, then look up canonical id
|
|
145
|
+
fileName = s.split('/').pop();
|
|
146
|
+
id = fileNameToId.get(fileName) || null;
|
|
129
147
|
}
|
|
130
|
-
return
|
|
148
|
+
return { id, fileName };
|
|
131
149
|
});
|
|
132
150
|
|
|
133
|
-
for (const fileName of
|
|
134
|
-
// Check if the filename (without extension) is referenced
|
|
151
|
+
for (const { id, fileName } of standardRefs) {
|
|
135
152
|
const baseName = fileName.replace(/\.ai\.yaml$/, '').replace(/\.md$/, '');
|
|
136
|
-
|
|
153
|
+
// Candidate reference tokens, canonical id first. The trailing
|
|
154
|
+
// `-standards` strip is a defensive fallback for standards absent from the
|
|
155
|
+
// registry. A match on any token means the standard is referenced — erring
|
|
156
|
+
// toward "referenced" is the safe direction (avoid uninstall-driven data loss).
|
|
157
|
+
const candidates = [id, fileName, baseName, baseName.replace(/-standards$/, '')]
|
|
158
|
+
.filter(Boolean);
|
|
159
|
+
const referenced = candidates.some(token => allConfigText.includes(token));
|
|
160
|
+
|
|
161
|
+
if (!referenced) {
|
|
137
162
|
frictions.push({
|
|
138
163
|
standard: fileName,
|
|
139
164
|
type: 'unused',
|
|
@@ -162,25 +187,24 @@ function detectOrphanedFiles(projectPath, manifest) {
|
|
|
162
187
|
// Get list of tracked files from manifest
|
|
163
188
|
const trackedFiles = new Set();
|
|
164
189
|
|
|
165
|
-
// From fileHashes
|
|
190
|
+
// From fileHashes (normalize separators so Windows-written manifests match)
|
|
166
191
|
if (manifest.fileHashes) {
|
|
167
192
|
for (const key of Object.keys(manifest.fileHashes)) {
|
|
168
193
|
if (key.startsWith('.standards/') || key.startsWith('.standards\\')) {
|
|
169
|
-
trackedFiles.add(key.replace(/^\.standards[/\\]/, ''));
|
|
194
|
+
trackedFiles.add(key.replace(/^\.standards[/\\]/, '').replaceAll('\\', '/'));
|
|
170
195
|
}
|
|
171
196
|
}
|
|
172
197
|
}
|
|
173
198
|
|
|
174
|
-
// Always exclude
|
|
199
|
+
// Always exclude UDS-managed files that are not hash-tracked
|
|
175
200
|
trackedFiles.add('manifest.json');
|
|
201
|
+
trackedFiles.add('release-config.yaml'); // written by `uds config` (#115)
|
|
176
202
|
|
|
177
|
-
// Scan .standards/
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
return frictions;
|
|
183
|
-
}
|
|
203
|
+
// Scan .standards/ recursively — option standards live in subdirectories
|
|
204
|
+
// such as .standards/options/, which a flat readdir reports as an
|
|
205
|
+
// orphaned "options" entry (#115)
|
|
206
|
+
const actualFiles = collectRelativeFilePaths(standardsDir)
|
|
207
|
+
.filter(f => f !== 'manifest.json');
|
|
184
208
|
|
|
185
209
|
for (const fileName of actualFiles) {
|
|
186
210
|
if (!trackedFiles.has(fileName)) {
|
|
@@ -196,3 +220,28 @@ function detectOrphanedFiles(projectPath, manifest) {
|
|
|
196
220
|
|
|
197
221
|
return frictions;
|
|
198
222
|
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Recursively list files under a directory as '/'-separated relative paths
|
|
226
|
+
* @param {string} baseDir
|
|
227
|
+
* @param {string} prefix
|
|
228
|
+
* @param {Array<string>} acc
|
|
229
|
+
* @returns {Array<string>}
|
|
230
|
+
*/
|
|
231
|
+
function collectRelativeFilePaths(baseDir, prefix = '', acc = []) {
|
|
232
|
+
let entries;
|
|
233
|
+
try {
|
|
234
|
+
entries = readdirSync(baseDir, { withFileTypes: true });
|
|
235
|
+
} catch {
|
|
236
|
+
return acc;
|
|
237
|
+
}
|
|
238
|
+
for (const entry of entries) {
|
|
239
|
+
const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
240
|
+
if (entry.isDirectory()) {
|
|
241
|
+
collectRelativeFilePaths(join(baseDir, entry.name), relPath, acc);
|
|
242
|
+
} else {
|
|
243
|
+
acc.push(relPath);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return acc;
|
|
247
|
+
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* @see docs/specs/system/SPEC-AUDIT-01-standards-audit.md (AC-1)
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import { existsSync, readFileSync } from 'fs';
|
|
14
|
+
import { existsSync, readFileSync, readdirSync } from 'fs';
|
|
15
15
|
import { join } from 'path';
|
|
16
16
|
import { readManifest } from './copier.js';
|
|
17
17
|
import { compareFileHash, hasFileHashes } from './hasher.js';
|
|
@@ -67,6 +67,9 @@ export function runHealthCheck(projectPath) {
|
|
|
67
67
|
if (manifest.standards && Array.isArray(manifest.standards)) {
|
|
68
68
|
const allStds = getAllStandards();
|
|
69
69
|
const stdFormat = manifest.format || 'ai';
|
|
70
|
+
// Option standards install under subdirectories (e.g. .standards/options/),
|
|
71
|
+
// so a root-only existence check reports them as false "missing" (#115)
|
|
72
|
+
const installedFileNames = collectInstalledFileNames(standardsDir);
|
|
70
73
|
for (const standardId of manifest.standards) {
|
|
71
74
|
// Resolve ID-format to actual filename via registry
|
|
72
75
|
let fileName;
|
|
@@ -82,7 +85,7 @@ export function runHealthCheck(projectPath) {
|
|
|
82
85
|
fileName = standardId.split('/').pop();
|
|
83
86
|
}
|
|
84
87
|
const filePath = join(standardsDir, fileName);
|
|
85
|
-
if (!existsSync(filePath)) {
|
|
88
|
+
if (!existsSync(filePath) && !installedFileNames.has(fileName)) {
|
|
86
89
|
issues.push({
|
|
87
90
|
severity: 'WARNING',
|
|
88
91
|
component: fileName,
|
|
@@ -111,6 +114,30 @@ export function runHealthCheck(projectPath) {
|
|
|
111
114
|
return { status, issues };
|
|
112
115
|
}
|
|
113
116
|
|
|
117
|
+
/**
|
|
118
|
+
* Recursively collect file basenames installed under .standards/
|
|
119
|
+
* (option standards live in subdirectories such as .standards/options/ — #115)
|
|
120
|
+
* @param {string} dir
|
|
121
|
+
* @param {Set<string>} names
|
|
122
|
+
* @returns {Set<string>}
|
|
123
|
+
*/
|
|
124
|
+
function collectInstalledFileNames(dir, names = new Set()) {
|
|
125
|
+
let entries;
|
|
126
|
+
try {
|
|
127
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
128
|
+
} catch {
|
|
129
|
+
return names;
|
|
130
|
+
}
|
|
131
|
+
for (const entry of entries) {
|
|
132
|
+
if (entry.isDirectory()) {
|
|
133
|
+
collectInstalledFileNames(join(dir, entry.name), names);
|
|
134
|
+
} else {
|
|
135
|
+
names.add(entry.name);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return names;
|
|
139
|
+
}
|
|
140
|
+
|
|
114
141
|
/**
|
|
115
142
|
* Check file hashes against manifest
|
|
116
143
|
* @param {string} projectPath
|