@devtrack-solution/codesdd 1.2.2 → 1.2.3
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/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +17 -17
- package/.sdd/skills/curated/devtrack-api/SKILL.md +160 -28
- package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +1 -1
- package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +8 -7
- package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +93 -0
- package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +317 -0
- package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +95 -0
- package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +295 -0
- package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +4 -4
- package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +4 -0
- package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +2 -2
- package/LICENSE +1 -1
- package/README.md +243 -51
- package/bin/codesdd.js +3 -2
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +11 -558
- package/dist/cli/program.d.ts +14 -0
- package/dist/cli/program.js +645 -0
- package/dist/commands/change.js +5 -5
- package/dist/commands/completion.d.ts +1 -1
- package/dist/commands/completion.js +9 -2
- package/dist/commands/config.js +159 -20
- package/dist/commands/feedback.js +1 -1
- package/dist/commands/schema.d.ts +63 -0
- package/dist/commands/schema.js +12 -12
- package/dist/commands/sdd/backlog.d.ts +3 -0
- package/dist/commands/sdd/backlog.js +54 -0
- package/dist/commands/sdd/execution.js +147 -16
- package/dist/commands/sdd/plugin.d.ts +3 -0
- package/dist/commands/sdd/plugin.js +153 -0
- package/dist/commands/sdd/shared.js +2 -23
- package/dist/commands/sdd/skills.js +7 -0
- package/dist/commands/sdd.js +69 -12
- package/dist/commands/spec.js +9 -9
- package/dist/commands/validate.js +6 -6
- package/dist/commands/workflow/instructions.js +6 -6
- package/dist/commands/workflow/new-change.js +3 -3
- package/dist/commands/workflow/shared.d.ts +1 -1
- package/dist/commands/workflow/shared.js +4 -4
- package/dist/core/archive.js +15 -5
- package/dist/core/artifact-graph/instruction-loader.d.ts +1 -1
- package/dist/core/artifact-graph/instruction-loader.js +3 -3
- package/dist/core/artifact-graph/resolver.d.ts +4 -4
- package/dist/core/artifact-graph/resolver.js +6 -6
- package/dist/core/branding.js +3 -3
- package/dist/core/cli/command-matrix.js +10 -1
- package/dist/core/cli-command-quality.d.ts +27 -0
- package/dist/core/cli-command-quality.js +171 -0
- package/dist/core/command-generation/adapters/costrict.d.ts +1 -1
- package/dist/core/command-generation/adapters/costrict.js +2 -2
- package/dist/core/command-generation/types.d.ts +1 -1
- package/dist/core/completions/command-registry.d.ts +1 -1
- package/dist/core/completions/command-registry.js +155 -12
- package/dist/core/completions/completion-provider.d.ts +14 -1
- package/dist/core/completions/completion-provider.js +29 -1
- package/dist/core/completions/generators/bash-generator.d.ts +1 -1
- package/dist/core/completions/generators/bash-generator.js +20 -12
- package/dist/core/completions/generators/fish-generator.d.ts +9 -1
- package/dist/core/completions/generators/fish-generator.js +39 -25
- package/dist/core/completions/generators/powershell-generator.d.ts +1 -1
- package/dist/core/completions/generators/powershell-generator.js +21 -11
- package/dist/core/completions/generators/zsh-generator.d.ts +3 -6
- package/dist/core/completions/generators/zsh-generator.js +21 -42
- package/dist/core/completions/installers/bash-installer.js +6 -6
- package/dist/core/completions/installers/fish-installer.js +1 -1
- package/dist/core/completions/installers/powershell-installer.js +14 -14
- package/dist/core/completions/installers/zsh-installer.d.ts +7 -1
- package/dist/core/completions/installers/zsh-installer.js +36 -8
- package/dist/core/completions/templates/bash-templates.d.ts +1 -1
- package/dist/core/completions/templates/bash-templates.js +12 -6
- package/dist/core/completions/templates/fish-templates.d.ts +2 -2
- package/dist/core/completions/templates/fish-templates.js +20 -9
- package/dist/core/completions/templates/powershell-templates.d.ts +1 -1
- package/dist/core/completions/templates/powershell-templates.js +13 -4
- package/dist/core/completions/templates/zsh-templates.d.ts +1 -1
- package/dist/core/completions/templates/zsh-templates.js +18 -9
- package/dist/core/config-schema.d.ts +3 -1
- package/dist/core/config-schema.js +26 -1
- package/dist/core/config.d.ts +3 -3
- package/dist/core/config.js +4 -4
- package/dist/core/global-config.d.ts +41 -12
- package/dist/core/global-config.js +344 -27
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/init.d.ts +6 -1
- package/dist/core/init.js +99 -77
- package/dist/core/legacy-cleanup.d.ts +17 -17
- package/dist/core/legacy-cleanup.js +96 -79
- package/dist/core/list.js +18 -4
- package/dist/core/migration.d.ts +3 -1
- package/dist/core/migration.js +7 -8
- package/dist/core/parsers/change-parser.js +1 -1
- package/dist/core/parsers/markdown-parser.js +2 -2
- package/dist/core/profile-sync-drift.d.ts +1 -1
- package/dist/core/profile-sync-drift.js +13 -13
- package/dist/core/project-config.d.ts +4 -4
- package/dist/core/project-config.js +11 -11
- package/dist/core/schemas/change.schema.d.ts +1 -1
- package/dist/core/schemas/change.schema.js +1 -1
- package/dist/core/schemas/spec.schema.d.ts +1 -1
- package/dist/core/schemas/spec.schema.js +1 -1
- package/dist/core/sdd/adr.js +23 -1
- package/dist/core/sdd/agent-binding.d.ts +346 -0
- package/dist/core/sdd/agent-binding.js +343 -0
- package/dist/core/sdd/backlog-cli.d.ts +16 -0
- package/dist/core/sdd/backlog-cli.js +146 -0
- package/dist/core/sdd/backlog-conflict-policy.d.ts +58 -0
- package/dist/core/sdd/backlog-conflict-policy.js +230 -0
- package/dist/core/sdd/backlog-projection.d.ts +8 -0
- package/dist/core/sdd/backlog-projection.js +89 -0
- package/dist/core/sdd/backlog-provider-contract.d.ts +252 -0
- package/dist/core/sdd/backlog-provider-contract.js +158 -0
- package/dist/core/sdd/bootstrap.js +2 -2
- package/dist/core/sdd/check.d.ts +42 -0
- package/dist/core/sdd/check.js +22 -22
- package/dist/core/sdd/contract.d.ts +13 -0
- package/dist/core/sdd/contract.js +36 -0
- package/dist/core/sdd/coordination/coordination-adapters.d.ts +38 -0
- package/dist/core/sdd/coordination/coordination-adapters.js +139 -1
- package/dist/core/sdd/deepagent-contracts.d.ts +276 -0
- package/dist/core/sdd/deepagent-contracts.js +173 -0
- package/dist/core/sdd/deepagents/adr-governor.d.ts +2 -0
- package/dist/core/sdd/deepagents/adr-governor.js +30 -0
- package/dist/core/sdd/deepagents/backend.d.ts +63 -0
- package/dist/core/sdd/deepagents/backend.js +174 -0
- package/dist/core/sdd/deepagents/codesdd-tools.d.ts +39 -0
- package/dist/core/sdd/deepagents/codesdd-tools.js +83 -0
- package/dist/core/sdd/deepagents/evidence-mapper.d.ts +86 -0
- package/dist/core/sdd/deepagents/evidence-mapper.js +178 -0
- package/dist/core/sdd/deepagents/model-provider.d.ts +53 -0
- package/dist/core/sdd/deepagents/model-provider.js +379 -0
- package/dist/core/sdd/deepagents/policy-enforcement.d.ts +30 -0
- package/dist/core/sdd/deepagents/policy-enforcement.js +90 -0
- package/dist/core/sdd/deepagents/policy.d.ts +75 -0
- package/dist/core/sdd/deepagents/policy.js +358 -0
- package/dist/core/sdd/deepagents/quality-witness.d.ts +3 -0
- package/dist/core/sdd/deepagents/quality-witness.js +77 -0
- package/dist/core/sdd/deepagents/reversa-subagents.d.ts +75 -0
- package/dist/core/sdd/deepagents/reversa-subagents.js +182 -0
- package/dist/core/sdd/deepagents/runtime-factory.d.ts +90 -0
- package/dist/core/sdd/deepagents/runtime-factory.js +231 -0
- package/dist/core/sdd/deepagents/runtime-loader.d.ts +16 -0
- package/dist/core/sdd/deepagents/runtime-loader.js +65 -0
- package/dist/core/sdd/default-bootstrap-files.d.ts +2 -2
- package/dist/core/sdd/default-bootstrap-files.js +36 -2
- package/dist/core/sdd/default-skills.d.ts +30 -0
- package/dist/core/sdd/default-skills.js +181 -5
- package/dist/core/sdd/devtrack-api-appliance.d.ts +84 -0
- package/dist/core/sdd/devtrack-api-appliance.js +257 -0
- package/dist/core/sdd/devtrack-api-architecture.d.ts +31 -0
- package/dist/core/sdd/devtrack-api-architecture.js +608 -0
- package/dist/core/sdd/devtrack-api-import-boundary.d.ts +19 -0
- package/dist/core/sdd/devtrack-api-import-boundary.js +32 -0
- package/dist/core/sdd/diagnose.d.ts +59 -0
- package/dist/core/sdd/diagnose.js +37 -37
- package/dist/core/sdd/docs-sync.js +33 -5
- package/dist/core/sdd/domain/post-active-validation.d.ts +7 -0
- package/dist/core/sdd/domain/post-active-validation.js +61 -0
- package/dist/core/sdd/domain/transition-engine.js +1 -0
- package/dist/core/sdd/entity-reference.d.ts +5 -0
- package/dist/core/sdd/entity-reference.js +22 -0
- package/dist/core/sdd/governance-backfill.d.ts +31 -0
- package/dist/core/sdd/governance-backfill.js +359 -0
- package/dist/core/sdd/governance-parser.d.ts +21 -0
- package/dist/core/sdd/governance-parser.js +91 -0
- package/dist/core/sdd/governance-schemas.d.ts +245 -0
- package/dist/core/sdd/governance-schemas.js +143 -0
- package/dist/core/sdd/{import-openspec.d.ts → import-legacy-spec.d.ts} +7 -7
- package/dist/core/sdd/{import-openspec.js → import-legacy-spec.js} +21 -29
- package/dist/core/sdd/init.d.ts +3 -0
- package/dist/core/sdd/init.js +6 -3
- package/dist/core/sdd/json-schema.js +100 -6
- package/dist/core/sdd/knowledge-graph.d.ts +45 -0
- package/dist/core/sdd/knowledge-graph.js +288 -0
- package/dist/core/sdd/legacy-operations.js +431 -43
- package/dist/core/sdd/lenses.d.ts +1 -0
- package/dist/core/sdd/lenses.js +29 -1
- package/dist/core/sdd/migrate-workspace.js +56 -2
- package/dist/core/sdd/migrate.d.ts +1 -1
- package/dist/core/sdd/migrate.js +36 -2
- package/dist/core/sdd/package-structure-gate.d.ts +83 -0
- package/dist/core/sdd/package-structure-gate.js +362 -0
- package/dist/core/sdd/parallel-feat-automation.d.ts +152 -0
- package/dist/core/sdd/parallel-feat-automation.js +212 -0
- package/dist/core/sdd/plugin-broker.d.ts +558 -0
- package/dist/core/sdd/plugin-broker.js +482 -0
- package/dist/core/sdd/plugin-certification.d.ts +79 -0
- package/dist/core/sdd/plugin-certification.js +453 -0
- package/dist/core/sdd/plugin-cli.d.ts +109 -0
- package/dist/core/sdd/plugin-cli.js +198 -0
- package/dist/core/sdd/plugin-evidence.d.ts +275 -0
- package/dist/core/sdd/plugin-evidence.js +307 -0
- package/dist/core/sdd/plugin-manifest.d.ts +164 -0
- package/dist/core/sdd/plugin-manifest.js +215 -0
- package/dist/core/sdd/plugin-policy-pack.d.ts +88 -0
- package/dist/core/sdd/plugin-policy-pack.js +236 -0
- package/dist/core/sdd/plugin-policy.d.ts +68 -0
- package/dist/core/sdd/plugin-policy.js +212 -0
- package/dist/core/sdd/plugin-registry.d.ts +311 -0
- package/dist/core/sdd/plugin-registry.js +138 -0
- package/dist/core/sdd/plugin-skill-binding.d.ts +151 -0
- package/dist/core/sdd/plugin-skill-binding.js +339 -0
- package/dist/core/sdd/quality-artifact-manifest-validator.d.ts +28 -0
- package/dist/core/sdd/quality-artifact-manifest-validator.js +167 -0
- package/dist/core/sdd/quality-evidence-renderer.d.ts +65 -0
- package/dist/core/sdd/quality-evidence-renderer.js +218 -0
- package/dist/core/sdd/quality-scenario-runner.d.ts +42 -0
- package/dist/core/sdd/quality-scenario-runner.js +613 -0
- package/dist/core/sdd/quality-validation.d.ts +547 -0
- package/dist/core/sdd/quality-validation.js +239 -0
- package/dist/core/sdd/resolve-project-root.d.ts +2 -2
- package/dist/core/sdd/resolve-project-root.js +11 -5
- package/dist/core/sdd/sanitize.d.ts +30 -1
- package/dist/core/sdd/sanitize.js +23 -23
- package/dist/core/sdd/services/agent-run.service.d.ts +65 -0
- package/dist/core/sdd/services/agent-run.service.js +189 -0
- package/dist/core/sdd/services/breakdown.service.js +2 -1
- package/dist/core/sdd/services/context.service.js +18 -16
- package/dist/core/sdd/services/debate.service.js +15 -2
- package/dist/core/sdd/services/feature-lint.service.d.ts +22 -0
- package/dist/core/sdd/services/feature-lint.service.js +105 -5
- package/dist/core/sdd/services/finalize.service.d.ts +80 -0
- package/dist/core/sdd/services/finalize.service.js +323 -24
- package/dist/core/sdd/services/frontend-gap.service.js +22 -7
- package/dist/core/sdd/services/governance-control-plane-runtime-adapters.d.ts +17 -0
- package/dist/core/sdd/services/governance-control-plane-runtime-adapters.js +38 -0
- package/dist/core/sdd/services/governance-control-plane.service.d.ts +66 -0
- package/dist/core/sdd/services/governance-control-plane.service.js +134 -0
- package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
- package/dist/core/sdd/services/legacy-capability.service.d.ts +10 -7
- package/dist/core/sdd/services/legacy-capability.service.js +38 -21
- package/dist/core/sdd/services/mcp-runtime.service.d.ts +123 -8
- package/dist/core/sdd/services/mcp-runtime.service.js +1085 -33
- package/dist/core/sdd/services/onboard.service.js +2 -1
- package/dist/core/sdd/services/rebuild.service.js +6 -1
- package/dist/core/sdd/services/skills-sync.service.d.ts +17 -5
- package/dist/core/sdd/services/skills-sync.service.js +55 -2
- package/dist/core/sdd/services/start.service.js +6 -4
- package/dist/core/sdd/skill-bundles-curation-schema.d.ts +66 -0
- package/dist/core/sdd/skill-bundles-curation-schema.js +52 -0
- package/dist/core/sdd/skill-evidence.d.ts +19 -0
- package/dist/core/sdd/skill-evidence.js +38 -0
- package/dist/core/sdd/skill-policy-pool.d.ts +46 -0
- package/dist/core/sdd/skill-policy-pool.js +185 -0
- package/dist/core/sdd/state.d.ts +22 -0
- package/dist/core/sdd/state.js +66 -41
- package/dist/core/sdd/structural-health.d.ts +42 -42
- package/dist/core/sdd/types.d.ts +33 -7
- package/dist/core/sdd/types.js +17 -0
- package/dist/core/sdd/upgrade-to-codesdd.d.ts +45 -0
- package/dist/core/sdd/upgrade-to-codesdd.js +179 -0
- package/dist/core/sdd/workspace-schemas.d.ts +285 -14
- package/dist/core/sdd/workspace-schemas.js +148 -0
- package/dist/core/sdd/write-manifest.js +22 -4
- package/dist/core/shared/skill-generation.d.ts +1 -1
- package/dist/core/shared/skill-generation.js +15 -15
- package/dist/core/shared/tool-detection.d.ts +3 -3
- package/dist/core/shared/tool-detection.js +14 -14
- package/dist/core/specs-apply.js +6 -6
- package/dist/core/templates/index.d.ts +1 -1
- package/dist/core/templates/index.js +1 -1
- package/dist/core/templates/workflows/apply-change.js +14 -14
- package/dist/core/templates/workflows/archive-change.js +32 -32
- package/dist/core/templates/workflows/bulk-archive-change.js +25 -25
- package/dist/core/templates/workflows/continue-change.js +12 -12
- package/dist/core/templates/workflows/explore.js +29 -29
- package/dist/core/templates/workflows/feedback.js +6 -6
- package/dist/core/templates/workflows/ff-change.js +24 -24
- package/dist/core/templates/workflows/new-change.js +20 -20
- package/dist/core/templates/workflows/onboard.js +33 -33
- package/dist/core/templates/workflows/propose.js +23 -23
- package/dist/core/templates/workflows/sdd.js +8 -8
- package/dist/core/templates/workflows/sync-specs.js +19 -19
- package/dist/core/templates/workflows/verify-change.js +17 -17
- package/dist/core/update.d.ts +2 -2
- package/dist/core/update.js +16 -15
- package/dist/core/validation/constants.d.ts +1 -1
- package/dist/core/validation/constants.js +1 -1
- package/dist/core/view.js +11 -11
- package/dist/telemetry/config.d.ts +2 -1
- package/dist/telemetry/config.js +17 -8
- package/dist/telemetry/index.d.ts +10 -2
- package/dist/telemetry/index.js +40 -7
- package/dist/ui/ascii-patterns.d.ts +2 -2
- package/dist/ui/ascii-patterns.js +2 -2
- package/dist/ui/welcome-screen.js +2 -2
- package/dist/utils/change-metadata.d.ts +4 -4
- package/dist/utils/change-metadata.js +6 -6
- package/dist/utils/change-utils.d.ts +3 -3
- package/dist/utils/change-utils.js +5 -5
- package/dist/utils/file-system.js +1 -1
- package/dist/utils/interactive.js +1 -1
- package/dist/utils/item-discovery.js +4 -4
- package/dist/utils/legacy-spec-compat.d.ts +2 -0
- package/dist/utils/legacy-spec-compat.js +2 -0
- package/dist/utils/shell-detection.d.ts +1 -0
- package/dist/utils/shell-detection.js +16 -0
- package/package.json +27 -17
- package/schemas/sdd/1-spec.schema.json +1 -1
- package/schemas/sdd/2-plan.schema.json +73 -1
- package/schemas/sdd/3-tasks.schema.json +73 -1
- package/schemas/sdd/4-changelog.schema.json +1 -1
- package/schemas/sdd/5-quality.schema.json +442 -2
- package/schemas/sdd/adr.schema.json +148 -0
- package/schemas/sdd/agent-binding-adapter.schema.json +210 -0
- package/schemas/sdd/agent-binding-resolution.schema.json +338 -0
- package/schemas/sdd/backlog-projection-plan.schema.json +180 -0
- package/schemas/sdd/backlog-provider-contract.schema.json +260 -0
- package/schemas/sdd/codesdd-plugin.schema.json +474 -0
- package/schemas/sdd/debate.schema.json +244 -0
- package/schemas/sdd/deepagent-decision-evidence.schema.json +58 -0
- package/schemas/sdd/deepagent-env-contract.schema.json +143 -0
- package/schemas/sdd/deepagent-quality-evidence.schema.json +108 -0
- package/schemas/sdd/deepagent-run-evidence.schema.json +192 -0
- package/schemas/sdd/deepagent-run-plan.schema.json +197 -0
- package/schemas/sdd/deepagent-run-request.schema.json +321 -0
- package/schemas/sdd/deepagent-subagent-evidence.schema.json +110 -0
- package/schemas/sdd/deepagent-tool-call-evidence.schema.json +78 -0
- package/schemas/sdd/discarded.schema.json +127 -0
- package/schemas/sdd/epic.schema.json +147 -0
- package/schemas/sdd/insight.schema.json +136 -0
- package/schemas/sdd/parallel-feat-automation-plan.schema.json +215 -0
- package/schemas/sdd/parallel-feat-automation-request.schema.json +109 -0
- package/schemas/sdd/plugin-artifact-manifest.schema.json +150 -0
- package/schemas/sdd/plugin-compliance-index.schema.json +136 -0
- package/schemas/sdd/plugin-dry-run-plan.schema.json +260 -0
- package/schemas/sdd/plugin-evidence-manifest.schema.json +569 -0
- package/schemas/sdd/plugin-policy-evaluation.schema.json +92 -0
- package/schemas/sdd/plugin-policy-pack-evaluation.schema.json +94 -0
- package/schemas/sdd/plugin-policy-pack.schema.json +196 -0
- package/schemas/sdd/plugin-registry.schema.json +558 -0
- package/schemas/sdd/plugin-rollback-manifest.schema.json +87 -0
- package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +845 -0
- package/schemas/sdd/plugin-skill-binding-resolution.schema.json +305 -0
- package/schemas/sdd/plugin-skill-binding.schema.json +88 -0
- package/schemas/sdd/plugin-validation-manifest.schema.json +123 -0
- package/schemas/sdd/quality-architecture-schema.schema.json +216 -0
- package/schemas/sdd/quality-evidence-bundle.schema.json +1228 -0
- package/schemas/sdd/quality-run.schema.json +197 -0
- package/schemas/sdd/quality-scenario.schema.json +252 -0
- package/schemas/sdd/workspace-catalog.schema.json +9841 -22
- package/schemas/spec-driven/schema.yaml +4 -4
- package/schemas/spec-driven/templates/proposal.md +1 -1
- package/dist/utils/openspec-compat.d.ts +0 -2
- package/dist/utils/openspec-compat.js +0 -2
package/dist/commands/spec.js
CHANGED
|
@@ -5,7 +5,7 @@ import { Validator } from '../core/validation/validator.js';
|
|
|
5
5
|
import { isInteractive } from '../utils/interactive.js';
|
|
6
6
|
import { getSpecIds } from '../utils/item-discovery.js';
|
|
7
7
|
import { CLI_NAME } from '../core/branding.js';
|
|
8
|
-
import {
|
|
8
|
+
import { displayLegacySpecPath, resolveLegacySpecSubpath, } from '../core/sdd/services/legacy-capability.service.js';
|
|
9
9
|
const SPECS_DIR = 'specs';
|
|
10
10
|
function parseSpecFromFile(specPath, specId) {
|
|
11
11
|
const content = readFileSync(specPath, 'utf-8');
|
|
@@ -30,7 +30,7 @@ function filterSpec(spec, options) {
|
|
|
30
30
|
text: req.text,
|
|
31
31
|
scenarios: includeScenarios ? req.scenarios : [],
|
|
32
32
|
}));
|
|
33
|
-
const metadata = spec.metadata ?? { version: '1.0.0', format: '
|
|
33
|
+
const metadata = spec.metadata ?? { version: '1.0.0', format: 'codesdd' };
|
|
34
34
|
return {
|
|
35
35
|
name: spec.name,
|
|
36
36
|
overview: spec.overview,
|
|
@@ -63,9 +63,9 @@ export class SpecCommand {
|
|
|
63
63
|
throw new Error('Missing required argument <spec-id>');
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
-
const specPath =
|
|
66
|
+
const specPath = resolveLegacySpecSubpath(process.cwd(), this.SPECS_DIR, specId, 'spec.md');
|
|
67
67
|
if (!existsSync(specPath)) {
|
|
68
|
-
throw new Error(`Spec '${specId}' not found at ${
|
|
68
|
+
throw new Error(`Spec '${specId}' not found at ${displayLegacySpecPath('specs', specId, 'spec.md')}`);
|
|
69
69
|
}
|
|
70
70
|
if (options.json) {
|
|
71
71
|
if (options.requirements && options.requirement) {
|
|
@@ -79,7 +79,7 @@ export class SpecCommand {
|
|
|
79
79
|
overview: parsed.overview,
|
|
80
80
|
requirementCount: filtered.requirements.length,
|
|
81
81
|
requirements: filtered.requirements,
|
|
82
|
-
metadata: parsed.metadata ?? { version: '1.0.0', format: '
|
|
82
|
+
metadata: parsed.metadata ?? { version: '1.0.0', format: 'codesdd' },
|
|
83
83
|
};
|
|
84
84
|
console.log(JSON.stringify(output, null, 2));
|
|
85
85
|
return;
|
|
@@ -90,7 +90,7 @@ export class SpecCommand {
|
|
|
90
90
|
export function registerSpecCommand(rootProgram) {
|
|
91
91
|
const specCommand = rootProgram
|
|
92
92
|
.command('spec')
|
|
93
|
-
.description('Manage and view
|
|
93
|
+
.description('Manage and view specifications');
|
|
94
94
|
// Deprecation notice for noun-based commands
|
|
95
95
|
specCommand.hook('preAction', () => {
|
|
96
96
|
console.error(`Warning: The "${CLI_NAME} spec ..." commands are deprecated. Prefer verb-first commands (e.g., "${CLI_NAME} show", "${CLI_NAME} validate --specs").`);
|
|
@@ -120,7 +120,7 @@ export function registerSpecCommand(rootProgram) {
|
|
|
120
120
|
.option('--long', 'Show id and title with counts')
|
|
121
121
|
.action((options) => {
|
|
122
122
|
try {
|
|
123
|
-
const specsDir =
|
|
123
|
+
const specsDir = resolveLegacySpecSubpath(process.cwd(), SPECS_DIR);
|
|
124
124
|
if (!existsSync(specsDir)) {
|
|
125
125
|
console.log('No items found');
|
|
126
126
|
return;
|
|
@@ -194,9 +194,9 @@ export function registerSpecCommand(rootProgram) {
|
|
|
194
194
|
throw new Error('Missing required argument <spec-id>');
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
|
-
const specPath =
|
|
197
|
+
const specPath = resolveLegacySpecSubpath(process.cwd(), SPECS_DIR, specId, 'spec.md');
|
|
198
198
|
if (!existsSync(specPath)) {
|
|
199
|
-
throw new Error(`Spec '${specId}' not found at ${
|
|
199
|
+
throw new Error(`Spec '${specId}' not found at ${displayLegacySpecPath('specs', specId, 'spec.md')}`);
|
|
200
200
|
}
|
|
201
201
|
const validator = new Validator(options.strict);
|
|
202
202
|
const report = await validator.validateSpec(specPath);
|
|
@@ -4,7 +4,7 @@ import { isInteractive, resolveNoInteractive } from '../utils/interactive.js';
|
|
|
4
4
|
import { getActiveChangeIds, getSpecIds } from '../utils/item-discovery.js';
|
|
5
5
|
import { nearestMatches } from '../utils/match.js';
|
|
6
6
|
import { CLI_NAME } from '../core/branding.js';
|
|
7
|
-
import {
|
|
7
|
+
import { resolveLegacySpecSubpath } from '../core/sdd/services/legacy-capability.service.js';
|
|
8
8
|
export class ValidateCommand {
|
|
9
9
|
async execute(itemName, options = {}) {
|
|
10
10
|
const interactive = isInteractive(options);
|
|
@@ -100,7 +100,7 @@ export class ValidateCommand {
|
|
|
100
100
|
async validateByType(type, id, opts) {
|
|
101
101
|
const validator = new Validator(opts.strict);
|
|
102
102
|
if (type === 'change') {
|
|
103
|
-
const changeDir =
|
|
103
|
+
const changeDir = resolveLegacySpecSubpath(process.cwd(), 'changes', id);
|
|
104
104
|
const start = Date.now();
|
|
105
105
|
const report = await validator.validateChangeDeltaSpecs(changeDir);
|
|
106
106
|
const durationMs = Date.now() - start;
|
|
@@ -109,7 +109,7 @@ export class ValidateCommand {
|
|
|
109
109
|
process.exitCode = report.valid ? 0 : 1;
|
|
110
110
|
return;
|
|
111
111
|
}
|
|
112
|
-
const file =
|
|
112
|
+
const file = resolveLegacySpecSubpath(process.cwd(), 'specs', id, 'spec.md');
|
|
113
113
|
const start = Date.now();
|
|
114
114
|
const report = await validator.validateSpec(file);
|
|
115
115
|
const durationMs = Date.now() - start;
|
|
@@ -158,13 +158,13 @@ export class ValidateCommand {
|
|
|
158
158
|
]);
|
|
159
159
|
const DEFAULT_CONCURRENCY = 6;
|
|
160
160
|
const maxSuggestions = 5; // used by nearestMatches
|
|
161
|
-
const concurrency = normalizeConcurrency(opts.concurrency) ?? normalizeConcurrency(process.env.
|
|
161
|
+
const concurrency = normalizeConcurrency(opts.concurrency) ?? normalizeConcurrency(process.env.CODESDD_CONCURRENCY) ?? DEFAULT_CONCURRENCY;
|
|
162
162
|
const validator = new Validator(opts.strict);
|
|
163
163
|
const queue = [];
|
|
164
164
|
for (const id of changeIds) {
|
|
165
165
|
queue.push(async () => {
|
|
166
166
|
const start = Date.now();
|
|
167
|
-
const changeDir =
|
|
167
|
+
const changeDir = resolveLegacySpecSubpath(process.cwd(), 'changes', id);
|
|
168
168
|
const report = await validator.validateChangeDeltaSpecs(changeDir);
|
|
169
169
|
const durationMs = Date.now() - start;
|
|
170
170
|
return { id, type: 'change', valid: report.valid, issues: report.issues, durationMs };
|
|
@@ -173,7 +173,7 @@ export class ValidateCommand {
|
|
|
173
173
|
for (const id of specIds) {
|
|
174
174
|
queue.push(async () => {
|
|
175
175
|
const start = Date.now();
|
|
176
|
-
const file =
|
|
176
|
+
const file = resolveLegacySpecSubpath(process.cwd(), 'specs', id, 'spec.md');
|
|
177
177
|
const report = await validator.validateSpec(file);
|
|
178
178
|
const durationMs = Date.now() - start;
|
|
179
179
|
return { id, type: 'spec', valid: report.valid, issues: report.issues, durationMs };
|
|
@@ -8,7 +8,7 @@ import ora from 'ora';
|
|
|
8
8
|
import path from 'path';
|
|
9
9
|
import * as fs from 'fs';
|
|
10
10
|
import { loadChangeContext, generateInstructions, resolveSchema, } from '../../core/artifact-graph/index.js';
|
|
11
|
-
import {
|
|
11
|
+
import { resolveLegacySpecSubpath } from '../../core/sdd/services/legacy-capability.service.js';
|
|
12
12
|
import { validateChangeExists, validateSchemaExists, } from './shared.js';
|
|
13
13
|
import { CLI_NAME } from '../../core/branding.js';
|
|
14
14
|
// -----------------------------------------------------------------------------
|
|
@@ -228,7 +228,7 @@ function artifactOutputExists(changeDir, generates) {
|
|
|
228
228
|
export async function generateApplyInstructions(projectRoot, changeName, schemaName) {
|
|
229
229
|
// loadChangeContext will auto-detect schema from metadata if not provided
|
|
230
230
|
const context = loadChangeContext(projectRoot, changeName, schemaName);
|
|
231
|
-
const changeDir =
|
|
231
|
+
const changeDir = resolveLegacySpecSubpath(projectRoot, 'changes', changeName);
|
|
232
232
|
// Get the full schema to access the apply phase configuration
|
|
233
233
|
const schema = resolveSchema(context.schemaName, projectRoot);
|
|
234
234
|
const applyConfig = schema.apply;
|
|
@@ -272,19 +272,19 @@ export async function generateApplyInstructions(projectRoot, changeName, schemaN
|
|
|
272
272
|
let instruction;
|
|
273
273
|
if (missingArtifacts.length > 0) {
|
|
274
274
|
state = 'blocked';
|
|
275
|
-
instruction = `Cannot apply this change yet. Missing artifacts: ${missingArtifacts.join(', ')}.\nUse the
|
|
275
|
+
instruction = `Cannot apply this change yet. Missing artifacts: ${missingArtifacts.join(', ')}.\nUse the codesdd-continue-change skill or run ${CLI_NAME} instructions to create the missing artifacts first.`;
|
|
276
276
|
}
|
|
277
277
|
else if (tracksFile && !tracksFileExists) {
|
|
278
278
|
// Tracking file configured but doesn't exist yet
|
|
279
279
|
const tracksFilename = path.basename(tracksFile);
|
|
280
280
|
state = 'blocked';
|
|
281
|
-
instruction = `The ${tracksFilename} file is missing and must be created.\nUse
|
|
281
|
+
instruction = `The ${tracksFilename} file is missing and must be created.\nUse codesdd-continue-change or run ${CLI_NAME} instructions to generate the tracking file.`;
|
|
282
282
|
}
|
|
283
283
|
else if (tracksFile && tracksFileExists && total === 0) {
|
|
284
284
|
// Tracking file exists but contains no tasks
|
|
285
285
|
const tracksFilename = path.basename(tracksFile);
|
|
286
286
|
state = 'blocked';
|
|
287
|
-
instruction = `The ${tracksFilename} file exists but contains no tasks.\nAdd tasks to ${tracksFilename} or regenerate it with
|
|
287
|
+
instruction = `The ${tracksFilename} file exists but contains no tasks.\nAdd tasks to ${tracksFilename} or regenerate it with codesdd-continue-change.`;
|
|
288
288
|
}
|
|
289
289
|
else if (tracksFile && remaining === 0 && total > 0) {
|
|
290
290
|
state = 'all_done';
|
|
@@ -344,7 +344,7 @@ export function printApplyInstructionsText(instructions) {
|
|
|
344
344
|
console.log('### ⚠️ Blocked');
|
|
345
345
|
console.log();
|
|
346
346
|
console.log(`Missing artifacts: ${missingArtifacts.join(', ')}`);
|
|
347
|
-
console.log(`Use the
|
|
347
|
+
console.log(`Use the codesdd-continue-change skill or run ${CLI_NAME} instructions to create these first.`);
|
|
348
348
|
console.log();
|
|
349
349
|
}
|
|
350
350
|
// Context files (dynamically from schema)
|
|
@@ -7,7 +7,7 @@ import ora from 'ora';
|
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import { createChange, validateChangeName } from '../../utils/change-utils.js';
|
|
9
9
|
import { validateSchemaExists } from './shared.js';
|
|
10
|
-
import {
|
|
10
|
+
import { displayLegacySpecPath, resolveLegacySpecLiveSubpath } from '../../core/sdd/services/legacy-capability.service.js';
|
|
11
11
|
// -----------------------------------------------------------------------------
|
|
12
12
|
// Command Implementation
|
|
13
13
|
// -----------------------------------------------------------------------------
|
|
@@ -31,11 +31,11 @@ export async function newChangeCommand(name, options) {
|
|
|
31
31
|
// If description provided, create README.md with description
|
|
32
32
|
if (options.description) {
|
|
33
33
|
const { promises: fs } = await import('fs');
|
|
34
|
-
const changeDir =
|
|
34
|
+
const changeDir = resolveLegacySpecLiveSubpath(projectRoot, 'changes', name);
|
|
35
35
|
const readmePath = path.join(changeDir, 'README.md');
|
|
36
36
|
await fs.writeFile(readmePath, `# ${name}\n\n${options.description}\n`, 'utf-8');
|
|
37
37
|
}
|
|
38
|
-
spinner.succeed(`Created change '${name}' at ${
|
|
38
|
+
spinner.succeed(`Created change '${name}' at ${displayLegacySpecPath('changes', name)}/ (schema: ${result.schema})`);
|
|
39
39
|
}
|
|
40
40
|
catch (error) {
|
|
41
41
|
spinner.fail(`Failed to create change '${name}'`);
|
|
@@ -38,7 +38,7 @@ export declare function getStatusColor(status: 'done' | 'ready' | 'blocked'): (t
|
|
|
38
38
|
*/
|
|
39
39
|
export declare function getStatusIndicator(status: 'done' | 'ready' | 'blocked'): string;
|
|
40
40
|
/**
|
|
41
|
-
* Returns the list of available change directory names under
|
|
41
|
+
* Returns the list of available legacy change directory names under legacy-spec/changes/.
|
|
42
42
|
* Excludes the archive directory and hidden directories.
|
|
43
43
|
*/
|
|
44
44
|
export declare function getAvailableChanges(projectRoot: string): Promise<string[]>;
|
|
@@ -9,7 +9,7 @@ import * as fs from 'fs';
|
|
|
9
9
|
import { getSchemaDir, listSchemas } from '../../core/artifact-graph/index.js';
|
|
10
10
|
import { validateChangeName } from '../../utils/change-utils.js';
|
|
11
11
|
import { CLI_NAME } from '../../core/branding.js';
|
|
12
|
-
import {
|
|
12
|
+
import { resolveLegacySpecSubpath } from '../../core/sdd/services/legacy-capability.service.js';
|
|
13
13
|
// -----------------------------------------------------------------------------
|
|
14
14
|
// Constants
|
|
15
15
|
// -----------------------------------------------------------------------------
|
|
@@ -54,11 +54,11 @@ export function getStatusIndicator(status) {
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
|
-
* Returns the list of available change directory names under
|
|
57
|
+
* Returns the list of available legacy change directory names under legacy-spec/changes/.
|
|
58
58
|
* Excludes the archive directory and hidden directories.
|
|
59
59
|
*/
|
|
60
60
|
export async function getAvailableChanges(projectRoot) {
|
|
61
|
-
const changesPath =
|
|
61
|
+
const changesPath = resolveLegacySpecSubpath(projectRoot, 'changes');
|
|
62
62
|
try {
|
|
63
63
|
const entries = await fs.promises.readdir(changesPath, { withFileTypes: true });
|
|
64
64
|
return entries
|
|
@@ -89,7 +89,7 @@ export async function validateChangeExists(changeName, projectRoot) {
|
|
|
89
89
|
throw new Error(`Invalid change name '${changeName}': ${nameValidation.error}`);
|
|
90
90
|
}
|
|
91
91
|
// Check directory existence directly
|
|
92
|
-
const changePath =
|
|
92
|
+
const changePath = resolveLegacySpecSubpath(projectRoot, 'changes', changeName);
|
|
93
93
|
const exists = fs.existsSync(changePath) && fs.statSync(changePath).isDirectory();
|
|
94
94
|
if (!exists) {
|
|
95
95
|
const available = await getAvailableChanges(projectRoot);
|
package/dist/core/archive.js
CHANGED
|
@@ -10,7 +10,7 @@ import { computeRequirementHash, readMeta, captureFingerprintsForChange, writeMe
|
|
|
10
10
|
import { extractRequirementsSection, normalizeRequirementName, parseDeltaSpec, } from './parsers/requirement-blocks.js';
|
|
11
11
|
import { CLI_NAME } from './branding.js';
|
|
12
12
|
import { trackFingerprintMismatch } from '../telemetry/index.js';
|
|
13
|
-
import {
|
|
13
|
+
import { resolveLegacySpecLiveSubpath } from './sdd/services/legacy-capability.service.js';
|
|
14
14
|
const execFileAsync = promisify(execFile);
|
|
15
15
|
function buildRequirementKey(capability, name) {
|
|
16
16
|
return `${capability}::${normalizeRequirementName(name)}`;
|
|
@@ -56,15 +56,25 @@ async function moveDirectory(src, dest) {
|
|
|
56
56
|
export class ArchiveCommand {
|
|
57
57
|
async execute(changeName, options = {}) {
|
|
58
58
|
const targetPath = '.';
|
|
59
|
-
const changesDir =
|
|
59
|
+
const changesDir = resolveLegacySpecLiveSubpath(targetPath, 'changes');
|
|
60
60
|
const archiveDir = path.join(changesDir, 'archive');
|
|
61
|
-
const mainSpecsDir =
|
|
61
|
+
const mainSpecsDir = resolveLegacySpecLiveSubpath(targetPath, 'specs');
|
|
62
62
|
// Check if changes directory exists
|
|
63
63
|
try {
|
|
64
64
|
await fs.access(changesDir);
|
|
65
65
|
}
|
|
66
66
|
catch {
|
|
67
|
-
|
|
67
|
+
const sddStatePath = path.join(targetPath, '.sdd', 'state', 'backlog.yaml');
|
|
68
|
+
try {
|
|
69
|
+
await fs.access(sddStatePath);
|
|
70
|
+
throw new Error(`This repository uses SDD canonical state. The legacy '${CLI_NAME} archive' command does not apply here.\nUse '${CLI_NAME} sdd finalize --ref <FEAT-ID>' to consolidate a completed FEAT.`);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
if (err instanceof Error && err.message.startsWith('This repository uses SDD canonical state')) {
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
throw new Error(`No CodeSDD changes directory found. Run '${CLI_NAME} init' first.`);
|
|
77
|
+
}
|
|
68
78
|
}
|
|
69
79
|
// Get change name interactively if not provided
|
|
70
80
|
if (!changeName) {
|
|
@@ -336,7 +346,7 @@ export class ArchiveCommand {
|
|
|
336
346
|
return new Date().toISOString().split('T')[0];
|
|
337
347
|
}
|
|
338
348
|
async validateFingerprintsAgainstLiveSpec(changeName, changeDir, specUpdates) {
|
|
339
|
-
const mainSpecsDir =
|
|
349
|
+
const mainSpecsDir = resolveLegacySpecLiveSubpath('.', 'specs');
|
|
340
350
|
let meta = await readMeta(changeDir);
|
|
341
351
|
if (!meta) {
|
|
342
352
|
meta = await captureFingerprintsForChange(changeDir, mainSpecsDir, {
|
|
@@ -109,7 +109,7 @@ export declare function loadTemplate(schemaName: string, templatePath: string, p
|
|
|
109
109
|
*
|
|
110
110
|
* Schema resolution order:
|
|
111
111
|
* 1. Explicit schemaName parameter (if provided)
|
|
112
|
-
* 2. Schema from .
|
|
112
|
+
* 2. Schema from .sdd.yaml metadata (if exists in change directory)
|
|
113
113
|
* 3. Default 'spec-driven'
|
|
114
114
|
*
|
|
115
115
|
* @param projectRoot - Project root directory
|
|
@@ -5,7 +5,7 @@ import { ArtifactGraph } from './graph.js';
|
|
|
5
5
|
import { detectCompleted } from './state.js';
|
|
6
6
|
import { resolveSchemaForChange } from '../../utils/change-metadata.js';
|
|
7
7
|
import { readProjectConfig, validateConfigRules } from '../project-config.js';
|
|
8
|
-
import {
|
|
8
|
+
import { resolveLegacySpecSubpath } from '../sdd/services/legacy-capability.service.js';
|
|
9
9
|
// Session-level cache for validation warnings (avoid repeating same warnings)
|
|
10
10
|
const shownWarnings = new Set();
|
|
11
11
|
/**
|
|
@@ -50,7 +50,7 @@ export function loadTemplate(schemaName, templatePath, projectRoot) {
|
|
|
50
50
|
*
|
|
51
51
|
* Schema resolution order:
|
|
52
52
|
* 1. Explicit schemaName parameter (if provided)
|
|
53
|
-
* 2. Schema from .
|
|
53
|
+
* 2. Schema from .sdd.yaml metadata (if exists in change directory)
|
|
54
54
|
* 3. Default 'spec-driven'
|
|
55
55
|
*
|
|
56
56
|
* @param projectRoot - Project root directory
|
|
@@ -59,7 +59,7 @@ export function loadTemplate(schemaName, templatePath, projectRoot) {
|
|
|
59
59
|
* @returns Change context with graph, completed set, and metadata
|
|
60
60
|
*/
|
|
61
61
|
export function loadChangeContext(projectRoot, changeName, schemaName) {
|
|
62
|
-
const changeDir =
|
|
62
|
+
const changeDir = resolveLegacySpecSubpath(projectRoot, 'changes', changeName);
|
|
63
63
|
// Resolve schema: explicit > metadata > default
|
|
64
64
|
const resolvedSchemaName = resolveSchemaForChange(changeDir, schemaName);
|
|
65
65
|
const schema = resolveSchema(resolvedSchemaName, projectRoot);
|
|
@@ -26,8 +26,8 @@ export declare function getProjectSchemasDir(projectRoot: string): string;
|
|
|
26
26
|
* Resolves a schema name to its directory path.
|
|
27
27
|
*
|
|
28
28
|
* Resolution order (when projectRoot is provided):
|
|
29
|
-
* 1. Project-local: <projectRoot>/
|
|
30
|
-
* 2. User override: ${XDG_DATA_HOME}/
|
|
29
|
+
* 1. Project-local: <projectRoot>/legacy-spec/schemas/<name>/schema.yaml
|
|
30
|
+
* 2. User override: ${XDG_DATA_HOME}/legacy-spec/schemas/<name>/schema.yaml
|
|
31
31
|
* 3. Package built-in: <package>/schemas/<name>/schema.yaml
|
|
32
32
|
*
|
|
33
33
|
* When projectRoot is not provided, only user override and package built-in are checked
|
|
@@ -42,8 +42,8 @@ export declare function getSchemaDir(name: string, projectRoot?: string): string
|
|
|
42
42
|
* Resolves a schema name to a SchemaYaml object.
|
|
43
43
|
*
|
|
44
44
|
* Resolution order (when projectRoot is provided):
|
|
45
|
-
* 1. Project-local: <projectRoot>/
|
|
46
|
-
* 2. User override: ${XDG_DATA_HOME}/
|
|
45
|
+
* 1. Project-local: <projectRoot>/legacy-spec/schemas/<name>/schema.yaml
|
|
46
|
+
* 2. User override: ${XDG_DATA_HOME}/legacy-spec/schemas/<name>/schema.yaml
|
|
47
47
|
* 3. Package built-in: <package>/schemas/<name>/schema.yaml
|
|
48
48
|
*
|
|
49
49
|
* When projectRoot is not provided, only user override and package built-in are checked
|
|
@@ -2,7 +2,7 @@ import * as fs from 'node:fs';
|
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { getGlobalDataDir } from '../global-config.js';
|
|
5
|
-
import {
|
|
5
|
+
import { resolveLegacySpecSubpath } from '../sdd/services/legacy-capability.service.js';
|
|
6
6
|
import { parseSchema, SchemaValidationError } from './schema.js';
|
|
7
7
|
/**
|
|
8
8
|
* Error thrown when loading a schema fails.
|
|
@@ -38,14 +38,14 @@ export function getUserSchemasDir() {
|
|
|
38
38
|
* @returns The path to the project's schemas directory
|
|
39
39
|
*/
|
|
40
40
|
export function getProjectSchemasDir(projectRoot) {
|
|
41
|
-
return
|
|
41
|
+
return resolveLegacySpecSubpath(projectRoot, 'schemas');
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
44
|
* Resolves a schema name to its directory path.
|
|
45
45
|
*
|
|
46
46
|
* Resolution order (when projectRoot is provided):
|
|
47
|
-
* 1. Project-local: <projectRoot>/
|
|
48
|
-
* 2. User override: ${XDG_DATA_HOME}/
|
|
47
|
+
* 1. Project-local: <projectRoot>/legacy-spec/schemas/<name>/schema.yaml
|
|
48
|
+
* 2. User override: ${XDG_DATA_HOME}/legacy-spec/schemas/<name>/schema.yaml
|
|
49
49
|
* 3. Package built-in: <package>/schemas/<name>/schema.yaml
|
|
50
50
|
*
|
|
51
51
|
* When projectRoot is not provided, only user override and package built-in are checked
|
|
@@ -82,8 +82,8 @@ export function getSchemaDir(name, projectRoot) {
|
|
|
82
82
|
* Resolves a schema name to a SchemaYaml object.
|
|
83
83
|
*
|
|
84
84
|
* Resolution order (when projectRoot is provided):
|
|
85
|
-
* 1. Project-local: <projectRoot>/
|
|
86
|
-
* 2. User override: ${XDG_DATA_HOME}/
|
|
85
|
+
* 1. Project-local: <projectRoot>/legacy-spec/schemas/<name>/schema.yaml
|
|
86
|
+
* 2. User override: ${XDG_DATA_HOME}/legacy-spec/schemas/<name>/schema.yaml
|
|
87
87
|
* 3. Package built-in: <package>/schemas/<name>/schema.yaml
|
|
88
88
|
*
|
|
89
89
|
* When projectRoot is not provided, only user override and package built-in are checked
|
package/dist/core/branding.js
CHANGED
|
@@ -6,7 +6,7 @@ export const CLI_NAME = envOrDefault('CODESDD_CLI_NAME', 'codesdd');
|
|
|
6
6
|
export const CLI_PACKAGE_NAME = envOrDefault('CODESDD_CLI_PACKAGE_NAME', '@devtrack-solution/codesdd');
|
|
7
7
|
export const CLI_ENTRYPOINT = envOrDefault('CODESDD_CLI_ENTRYPOINT', 'bin/codesdd.js');
|
|
8
8
|
export const CLI_PRODUCT_NAME = envOrDefault('CODESDD_CLI_PRODUCT_NAME', 'CodeSDD');
|
|
9
|
-
export const CLI_REPOSITORY_SLUG = envOrDefault('CODESDD_REPOSITORY_SLUG', 'devtrack-solution/
|
|
10
|
-
export const CLI_REPOSITORY_URL = envOrDefault('CODESDD_REPOSITORY_URL', 'https://github.com/devtrack-solution/
|
|
11
|
-
export const CLI_ISSUES_URL = envOrDefault('CODESDD_ISSUES_URL', 'https://github.com/devtrack-solution/
|
|
9
|
+
export const CLI_REPOSITORY_SLUG = envOrDefault('CODESDD_REPOSITORY_SLUG', 'devtrack-solution/codesdd');
|
|
10
|
+
export const CLI_REPOSITORY_URL = envOrDefault('CODESDD_REPOSITORY_URL', 'https://github.com/devtrack-solution/codesdd');
|
|
11
|
+
export const CLI_ISSUES_URL = envOrDefault('CODESDD_ISSUES_URL', 'https://github.com/devtrack-solution/codesdd/issues');
|
|
12
12
|
//# sourceMappingURL=branding.js.map
|
|
@@ -23,6 +23,7 @@ export function collectCliLeafCommands(command, prefix = []) {
|
|
|
23
23
|
}
|
|
24
24
|
export const CLI_COMMAND_MATRIX = [
|
|
25
25
|
{ commandPath: 'init', strategy: 'contract', rationale: 'Project bootstrap is deterministic and already decomposes into testable setup services.' },
|
|
26
|
+
{ commandPath: 'reload', strategy: 'spawned-e2e', rationale: 'Reload reapplies base setup plus SDD bootstrap with the installed CLI version and needs real-bin smoke coverage.' },
|
|
26
27
|
{ commandPath: 'install', strategy: 'spawned-e2e', rationale: 'Full installation composes base bootstrap plus SDD initialization and should keep a spawned smoke path.' },
|
|
27
28
|
{ commandPath: 'experimental', strategy: 'exception', rationale: 'Deprecated compatibility alias inherits init behavior and only needs lightweight regression coverage.' },
|
|
28
29
|
{ commandPath: 'update', strategy: 'contract', rationale: 'Update flow is deterministic and validated through targeted service and CLI contract tests.' },
|
|
@@ -36,6 +37,8 @@ export const CLI_COMMAND_MATRIX = [
|
|
|
36
37
|
{ commandPath: 'spec:list', strategy: 'contract', rationale: 'Spec listing is read-only and easy to validate with direct CLI assertions.' },
|
|
37
38
|
{ commandPath: 'spec:validate', strategy: 'contract', rationale: 'Spec validation is a deterministic contract surface with fixture-driven expectations.' },
|
|
38
39
|
{ commandPath: 'config:path', strategy: 'contract', rationale: 'Config path output is deterministic and scriptable.' },
|
|
40
|
+
{ commandPath: 'config:init', strategy: 'contract', rationale: 'Global runtime bootstrap is deterministic and should be covered with fixture-backed contract tests.' },
|
|
41
|
+
{ commandPath: 'config:doctor', strategy: 'contract', rationale: 'Doctor emits deterministic readiness diagnostics for DeepAgents, cache, and Redis boundary.' },
|
|
39
42
|
{ commandPath: 'config:list', strategy: 'contract', rationale: 'Config listing is a stable read-only contract.' },
|
|
40
43
|
{ commandPath: 'config:get', strategy: 'contract', rationale: 'Config key retrieval is a stable scriptable surface.' },
|
|
41
44
|
{ commandPath: 'config:set', strategy: 'contract', rationale: 'Config writes can be asserted directly against temporary config fixtures.' },
|
|
@@ -57,6 +60,7 @@ export const CLI_COMMAND_MATRIX = [
|
|
|
57
60
|
{ commandPath: 'sdd:breakdown', strategy: 'spawned-e2e', rationale: 'Breakdown materializes executable FEAT workspaces and needs lifecycle smoke coverage.' },
|
|
58
61
|
{ commandPath: 'sdd:mcp-manifest', strategy: 'contract', rationale: 'Manifest rendering is deterministic and provider-profile driven.' },
|
|
59
62
|
{ commandPath: 'sdd:mcp-call', strategy: 'contract', rationale: 'The MCP bridge reuses canonical services and is best guarded with direct contract assertions.' },
|
|
63
|
+
{ commandPath: 'sdd:agent:run', strategy: 'contract', rationale: 'DeepAgents run gating is a deterministic fail-closed policy contract with no direct state writes.' },
|
|
60
64
|
{ commandPath: 'sdd:start', strategy: 'spawned-e2e', rationale: 'Start transitions planned work into active execution and is a core lifecycle boundary.' },
|
|
61
65
|
{ commandPath: 'sdd:frontend-impact', strategy: 'spawned-e2e', rationale: 'Frontend impact is a required lifecycle declaration that should remain part of spawned finalize-path smoke.' },
|
|
62
66
|
{ commandPath: 'sdd:finalize', strategy: 'spawned-e2e', rationale: 'Finalize is the highest-risk lifecycle transition and must keep spawned smoke coverage.' },
|
|
@@ -65,14 +69,19 @@ export const CLI_COMMAND_MATRIX = [
|
|
|
65
69
|
{ commandPath: 'sdd:aprovar', strategy: 'contract', rationale: 'Approval transitions are deterministic and fit fixture-driven lifecycle assertions.' },
|
|
66
70
|
{ commandPath: 'sdd:next', strategy: 'contract', rationale: 'Next is ranking logic over canonical state and is naturally contract-testable.' },
|
|
67
71
|
{ commandPath: 'sdd:audit', strategy: 'contract', rationale: 'Audit is a deterministic report over canonical state.' },
|
|
72
|
+
{ commandPath: 'sdd:plugin:inspect', strategy: 'contract', rationale: 'Plugin inspect is a read-only manifest parser surface.' },
|
|
73
|
+
{ commandPath: 'sdd:plugin:plan', strategy: 'contract', rationale: 'Plugin plan builds a non-executing runtime envelope from a manifest fixture.' },
|
|
74
|
+
{ commandPath: 'sdd:plugin:devtrack-api:scaffold-dry-run', strategy: 'contract', rationale: 'DevTrack API scaffold dry-run plans appliance artifacts without executing a generator.' },
|
|
75
|
+
{ commandPath: 'sdd:backlog:project', strategy: 'contract', rationale: 'Backlog projection is a read-only dry-run plan over canonical SDD refs with no provider I/O.' },
|
|
68
76
|
{ commandPath: 'sdd:check', strategy: 'contract', rationale: 'Check is a deterministic health summary with strict output contracts.' },
|
|
69
77
|
{ commandPath: 'sdd:rebuild', strategy: 'spawned-e2e', rationale: 'Rebuild reconstructs canonical state from filesystem artifacts and needs real-bin recovery smoke coverage.' },
|
|
70
78
|
{ commandPath: 'sdd:metrics', strategy: 'spawned-e2e', rationale: 'Metrics aggregate transition-log lifecycle data and should keep real-bin smoke coverage for reporting windows.' },
|
|
71
79
|
{ commandPath: 'sdd:dedup', strategy: 'spawned-e2e', rationale: 'Dedup apply reconciles historical warning_links across canonical state and needs real-bin mutation smoke coverage.' },
|
|
72
80
|
{ commandPath: 'sdd:lint:feature', strategy: 'spawned-e2e', rationale: 'Feature lint evaluates workspace scope heuristics and should keep real-bin smoke coverage for strict/non-strict behavior.' },
|
|
73
81
|
{ commandPath: 'sdd:migrate', strategy: 'contract', rationale: 'Migration planning and reporting are deterministic over fixture state.' },
|
|
82
|
+
{ commandPath: 'sdd:upgrade-to-codesdd', strategy: 'contract', rationale: 'Transactional upgrade readiness, apply manifest, and rollback behavior are deterministic over fixture SDD state.' },
|
|
74
83
|
{ commandPath: 'sdd:migrate-workspace', strategy: 'contract', rationale: 'Workspace migration is deterministic and already aligns with fixture-based validation.' },
|
|
75
|
-
{ commandPath: 'sdd:import-
|
|
84
|
+
{ commandPath: 'sdd:import-legacy-spec', strategy: 'spawned-e2e', rationale: 'Legacy import crosses filesystem and generated-state boundaries, so a spawned smoke path is valuable.' },
|
|
76
85
|
{ commandPath: 'sdd:skills:bundles', strategy: 'contract', rationale: 'Bundle listing is a stable read-only catalog contract.' },
|
|
77
86
|
{ commandPath: 'sdd:skills:sync', strategy: 'contract', rationale: 'Skill sync can be asserted directly against temporary memory roots and tool targets.' },
|
|
78
87
|
{ commandPath: 'sdd:skills:suggest', strategy: 'contract', rationale: 'Suggestion ranking is deterministic over the catalog state.' },
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type CliCommandEvidenceMode = 'contract' | 'in_process' | 'spawned_e2e' | 'exception';
|
|
2
|
+
export interface CliCommandQualityException {
|
|
3
|
+
reason: string;
|
|
4
|
+
accepted_risk: string;
|
|
5
|
+
compensating_control: string;
|
|
6
|
+
review_deadline: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CliCommandQualityEntry {
|
|
9
|
+
path: string;
|
|
10
|
+
evidence_mode: CliCommandEvidenceMode;
|
|
11
|
+
owner: string;
|
|
12
|
+
rationale: string;
|
|
13
|
+
validation_refs: string[];
|
|
14
|
+
interactive: boolean;
|
|
15
|
+
exception?: CliCommandQualityException;
|
|
16
|
+
}
|
|
17
|
+
export interface CliCommandQualityValidation {
|
|
18
|
+
missing: string[];
|
|
19
|
+
extra: string[];
|
|
20
|
+
duplicate_paths: string[];
|
|
21
|
+
invalid_entries: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare const UNIVERSAL_SPAWNED_HELP_SMOKE_REF = "test/cli-e2e/all-commands-smoke.test.ts";
|
|
24
|
+
export declare const CLI_COMMAND_QUALITY_MATRIX: CliCommandQualityEntry[];
|
|
25
|
+
export declare function commandQualityMatrixByPath(matrix?: CliCommandQualityEntry[]): Map<string, CliCommandQualityEntry>;
|
|
26
|
+
export declare function validateCliCommandQualityMatrix(registeredLeafCommandPaths: string[], matrix?: CliCommandQualityEntry[]): CliCommandQualityValidation;
|
|
27
|
+
//# sourceMappingURL=cli-command-quality.d.ts.map
|