@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
|
@@ -6,7 +6,7 @@ import { CompletionProvider } from '../core/completions/completion-provider.js';
|
|
|
6
6
|
import { getArchivedChangeIds } from '../utils/item-discovery.js';
|
|
7
7
|
import { CLI_NAME } from '../core/branding.js';
|
|
8
8
|
/**
|
|
9
|
-
* Command for managing shell completions for
|
|
9
|
+
* Command for managing shell completions for CodeSDD CLI
|
|
10
10
|
*/
|
|
11
11
|
export class CompletionCommand {
|
|
12
12
|
completionProvider;
|
|
@@ -180,7 +180,7 @@ export class CompletionCommand {
|
|
|
180
180
|
};
|
|
181
181
|
const configPath = configPaths[shell] || `${shell} configuration`;
|
|
182
182
|
const confirmed = await confirm({
|
|
183
|
-
message: `Remove
|
|
183
|
+
message: `Remove CodeSDD configuration from ${configPath}?`,
|
|
184
184
|
default: false,
|
|
185
185
|
});
|
|
186
186
|
if (!confirmed) {
|
|
@@ -237,6 +237,13 @@ export class CompletionCommand {
|
|
|
237
237
|
}
|
|
238
238
|
break;
|
|
239
239
|
}
|
|
240
|
+
case 'schemas': {
|
|
241
|
+
const schemaNames = await this.completionProvider.getSchemaNames();
|
|
242
|
+
for (const name of schemaNames) {
|
|
243
|
+
console.log(`${name}\tworkflow schema`);
|
|
244
|
+
}
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
240
247
|
default:
|
|
241
248
|
// Invalid type - silently exit with no output for graceful shell completion failure
|
|
242
249
|
process.exitCode = 1;
|
package/dist/commands/config.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { spawn, execSync } from 'node:child_process';
|
|
2
2
|
import * as fs from 'node:fs';
|
|
3
|
+
import * as os from 'node:os';
|
|
3
4
|
import * as path from 'node:path';
|
|
4
|
-
import { getGlobalConfigPath, getGlobalConfig, saveGlobalConfig, } from '../core/global-config.js';
|
|
5
|
-
import { getNestedValue, setNestedValue, deleteNestedValue, coerceValue, formatValueYaml, validateConfigKeyPath, validateConfig, DEFAULT_CONFIG, } from '../core/config-schema.js';
|
|
5
|
+
import { getGlobalConfigPath, getGlobalConfig, getGlobalCacheDir, getGlobalCacheTierDirs, ensureGlobalCacheLayout, readGlobalConfigRaw, parseTomlContent, saveGlobalConfig, } from '../core/global-config.js';
|
|
6
|
+
import { getNestedValue, setNestedValue, deleteNestedValue, coerceValue, formatValueYaml, validateConfigKeyPath, validateConfig, isSensitiveConfigPath, redactConfigSecrets, DEFAULT_CONFIG, } from '../core/config-schema.js';
|
|
6
7
|
import { CORE_WORKFLOWS, ALL_WORKFLOWS, getProfileWorkflows } from '../core/profiles.js';
|
|
7
|
-
import { OPENSPEC_DIR_NAME } from '../core/config.js';
|
|
8
8
|
import { hasProjectConfigDrift } from '../core/profile-sync-drift.js';
|
|
9
9
|
import { CLI_NAME } from '../core/branding.js';
|
|
10
|
+
import { resolveLegacySpecLiveRoot } from '../core/sdd/services/legacy-capability.service.js';
|
|
11
|
+
import { resolveRedisBoundaryConfig } from '../core/sdd/coordination/index.js';
|
|
12
|
+
import { buildDeepAgentsOperationalPreflight, createDeepAgentsPolicySnapshot, } from '../core/sdd/deepagents/policy.js';
|
|
13
|
+
import { detectShell } from '../utils/shell-detection.js';
|
|
14
|
+
import { ZshInstaller } from '../core/completions/installers/zsh-installer.js';
|
|
10
15
|
const WORKFLOW_PROMPT_META = {
|
|
11
16
|
propose: {
|
|
12
17
|
name: 'Propose change',
|
|
@@ -50,9 +55,33 @@ const WORKFLOW_PROMPT_META = {
|
|
|
50
55
|
},
|
|
51
56
|
onboard: {
|
|
52
57
|
name: 'Onboard',
|
|
53
|
-
description: 'Guided onboarding flow for
|
|
58
|
+
description: 'Guided onboarding flow for CodeSDD',
|
|
54
59
|
},
|
|
55
60
|
};
|
|
61
|
+
function resolveHomeDir() {
|
|
62
|
+
return process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
63
|
+
}
|
|
64
|
+
function buildCodesddEnvTemplate() {
|
|
65
|
+
return [
|
|
66
|
+
'#!/usr/bin/env zsh',
|
|
67
|
+
'# CodeSDD global runtime profile (non-secret settings only).',
|
|
68
|
+
'export CODESDD_AGENT_PROVIDER="${CODESDD_AGENT_PROVIDER:-deepagents}"',
|
|
69
|
+
'export CODESDD_DEEPAGENTS_ENABLED="${CODESDD_DEEPAGENTS_ENABLED:-false}"',
|
|
70
|
+
'export CODESDD_DEEPAGENTS_RUNTIME="${CODESDD_DEEPAGENTS_RUNTIME:-disabled}"',
|
|
71
|
+
'export CODESDD_AGENT_NETWORK_POLICY="${CODESDD_AGENT_NETWORK_POLICY:-disabled}"',
|
|
72
|
+
'export CODESDD_DEEPAGENTS_PROVIDER_SMOKE="${CODESDD_DEEPAGENTS_PROVIDER_SMOKE:-0}"',
|
|
73
|
+
'# Optional live-provider launcher references. Keep values in your shell,',
|
|
74
|
+
'# password manager, CI secret store, or another untracked launcher context.',
|
|
75
|
+
'# export CODESDD_DEEPAGENTS_ENABLED=true',
|
|
76
|
+
'# export CODESDD_DEEPAGENTS_RUNTIME=deepagents-js',
|
|
77
|
+
'# export CODESDD_AGENT_NETWORK_POLICY=restricted',
|
|
78
|
+
'# export CODESDD_DEEPAGENTS_MODEL="azure-openai:gpt-4o-mini"',
|
|
79
|
+
'# export CODESDD_AGENT_ALLOWED_DOMAINS="api.openai.com"',
|
|
80
|
+
'# export AZURE_OPENAI_ENDPOINT="https://example-resource.openai.azure.com/"',
|
|
81
|
+
'# export AZURE_OPENAI_API_KEY="<secret-from-manager>"',
|
|
82
|
+
'',
|
|
83
|
+
].join('\n');
|
|
84
|
+
}
|
|
56
85
|
function isPromptCancellationError(error) {
|
|
57
86
|
return (error instanceof Error &&
|
|
58
87
|
(error.name === 'ExitPromptError' || error.message.includes('force closed the prompt with SIGINT')));
|
|
@@ -134,8 +163,8 @@ export function diffProfileState(before, after) {
|
|
|
134
163
|
};
|
|
135
164
|
}
|
|
136
165
|
function maybeWarnConfigDrift(projectDir, state, colorize) {
|
|
137
|
-
const
|
|
138
|
-
if (!fs.existsSync(
|
|
166
|
+
const codesddDir = resolveLegacySpecLiveRoot(projectDir);
|
|
167
|
+
if (!fs.existsSync(codesddDir)) {
|
|
139
168
|
return;
|
|
140
169
|
}
|
|
141
170
|
if (!hasProjectConfigDrift(projectDir, state.workflows, state.delivery)) {
|
|
@@ -151,7 +180,7 @@ function maybeWarnConfigDrift(projectDir, state, colorize) {
|
|
|
151
180
|
export function registerConfigCommand(program) {
|
|
152
181
|
const configCmd = program
|
|
153
182
|
.command('config')
|
|
154
|
-
.description('View and modify global
|
|
183
|
+
.description('View and modify global CodeSDD configuration')
|
|
155
184
|
.option('--scope <scope>', 'Config scope (only "global" supported currently)')
|
|
156
185
|
.hook('preAction', (thisCommand) => {
|
|
157
186
|
const opts = thisCommand.opts();
|
|
@@ -167,6 +196,101 @@ export function registerConfigCommand(program) {
|
|
|
167
196
|
.action(() => {
|
|
168
197
|
console.log(getGlobalConfigPath());
|
|
169
198
|
});
|
|
199
|
+
// config init
|
|
200
|
+
configCmd
|
|
201
|
+
.command('init')
|
|
202
|
+
.description('Initialize ~/.codesdd runtime files and idempotent shell integration')
|
|
203
|
+
.option('--json', 'Output as JSON')
|
|
204
|
+
.action(async (options) => {
|
|
205
|
+
const homeDir = resolveHomeDir();
|
|
206
|
+
const configPath = getGlobalConfigPath();
|
|
207
|
+
const envPath = path.join(homeDir, '.codesdd', 'env.zsh');
|
|
208
|
+
if (!fs.existsSync(configPath)) {
|
|
209
|
+
saveGlobalConfig(getGlobalConfig());
|
|
210
|
+
}
|
|
211
|
+
const tierPaths = ensureGlobalCacheLayout();
|
|
212
|
+
const envTemplate = buildCodesddEnvTemplate();
|
|
213
|
+
if (!fs.existsSync(path.dirname(envPath))) {
|
|
214
|
+
fs.mkdirSync(path.dirname(envPath), { recursive: true });
|
|
215
|
+
}
|
|
216
|
+
fs.writeFileSync(envPath, envTemplate, { encoding: 'utf-8', mode: 0o600 });
|
|
217
|
+
try {
|
|
218
|
+
fs.chmodSync(envPath, 0o600);
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// best effort on non-POSIX filesystems
|
|
222
|
+
}
|
|
223
|
+
const detectedShell = detectShell().shell;
|
|
224
|
+
let zshrcConfigured = false;
|
|
225
|
+
if (detectedShell === 'zsh' || process.env.SHELL?.toLowerCase().includes('zsh')) {
|
|
226
|
+
const installer = new ZshInstaller(homeDir);
|
|
227
|
+
zshrcConfigured = await installer.ensureCodesddEnvSource(envPath);
|
|
228
|
+
}
|
|
229
|
+
const payload = {
|
|
230
|
+
schema_version: 1,
|
|
231
|
+
config_path: configPath,
|
|
232
|
+
env_path: envPath,
|
|
233
|
+
cache_root: getGlobalCacheDir(),
|
|
234
|
+
cache_tiers: Object.keys(tierPaths),
|
|
235
|
+
shell_detected: detectedShell ?? 'unknown',
|
|
236
|
+
zshrc_configured: zshrcConfigured,
|
|
237
|
+
};
|
|
238
|
+
if (options.json) {
|
|
239
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
console.log(`Config file: ${configPath}`);
|
|
243
|
+
console.log(`Shell profile: ${envPath}`);
|
|
244
|
+
console.log(`Cache root: ${payload.cache_root}`);
|
|
245
|
+
console.log(`Cache tiers: ${payload.cache_tiers.join(', ')}`);
|
|
246
|
+
if (detectedShell === 'zsh') {
|
|
247
|
+
console.log('Zsh source block ensured for ~/.codesdd/env.zsh.');
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
console.log('Shell source block was not changed automatically (non-zsh or undetected shell).');
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
// config doctor
|
|
254
|
+
configCmd
|
|
255
|
+
.command('doctor')
|
|
256
|
+
.description('Run operational readiness checks for DeepAgents/Azure, cache, and Redis boundary')
|
|
257
|
+
.option('--json', 'Output as JSON')
|
|
258
|
+
.action((options) => {
|
|
259
|
+
const snapshot = createDeepAgentsPolicySnapshot(process.env);
|
|
260
|
+
const preflight = buildDeepAgentsOperationalPreflight(snapshot, process.env);
|
|
261
|
+
const redisBoundary = resolveRedisBoundaryConfig(process.env);
|
|
262
|
+
const cacheTiers = getGlobalCacheTierDirs();
|
|
263
|
+
const report = {
|
|
264
|
+
schema_version: 1,
|
|
265
|
+
global_config_path: getGlobalConfigPath(),
|
|
266
|
+
cache: {
|
|
267
|
+
root: getGlobalCacheDir(),
|
|
268
|
+
tiers: Object.keys(cacheTiers),
|
|
269
|
+
},
|
|
270
|
+
redis: {
|
|
271
|
+
requested: redisBoundary.requested,
|
|
272
|
+
namespace: redisBoundary.namespace,
|
|
273
|
+
status: redisBoundary.requested ? 'requested-unavailable' : 'disabled',
|
|
274
|
+
},
|
|
275
|
+
deepagents: preflight,
|
|
276
|
+
};
|
|
277
|
+
if (options.json) {
|
|
278
|
+
console.log(JSON.stringify(report, null, 2));
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
console.log(`Global config: ${report.global_config_path}`);
|
|
282
|
+
console.log(`Cache root: ${report.cache.root}`);
|
|
283
|
+
console.log(`Cache tiers: ${report.cache.tiers.join(', ')}`);
|
|
284
|
+
console.log(`Redis: ${report.redis.status} (namespace=${report.redis.namespace})`);
|
|
285
|
+
console.log(`DeepAgents preflight: ${preflight.status}`);
|
|
286
|
+
for (const reason of preflight.reasons) {
|
|
287
|
+
console.log(`- ${reason}`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (preflight.status === 'blocked') {
|
|
291
|
+
process.exitCode = 1;
|
|
292
|
+
}
|
|
293
|
+
});
|
|
170
294
|
// config list
|
|
171
295
|
configCmd
|
|
172
296
|
.command('list')
|
|
@@ -174,22 +298,20 @@ export function registerConfigCommand(program) {
|
|
|
174
298
|
.option('--json', 'Output as JSON')
|
|
175
299
|
.action((options) => {
|
|
176
300
|
const config = getGlobalConfig();
|
|
301
|
+
const redactedConfig = redactConfigSecrets(config);
|
|
177
302
|
if (options.json) {
|
|
178
|
-
console.log(JSON.stringify(
|
|
303
|
+
console.log(JSON.stringify(redactedConfig, null, 2));
|
|
179
304
|
}
|
|
180
305
|
else {
|
|
181
306
|
// Read raw config to determine which values are explicit vs defaults
|
|
182
|
-
const configPath = getGlobalConfigPath();
|
|
183
307
|
let rawConfig = {};
|
|
184
308
|
try {
|
|
185
|
-
|
|
186
|
-
rawConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
187
|
-
}
|
|
309
|
+
rawConfig = readGlobalConfigRaw();
|
|
188
310
|
}
|
|
189
311
|
catch {
|
|
190
312
|
// If reading fails, treat all as defaults
|
|
191
313
|
}
|
|
192
|
-
console.log(formatValueYaml(
|
|
314
|
+
console.log(formatValueYaml(redactedConfig));
|
|
193
315
|
// Annotate profile settings
|
|
194
316
|
const profileSource = rawConfig.profile !== undefined ? '(explicit)' : '(default)';
|
|
195
317
|
const deliverySource = rawConfig.delivery !== undefined ? '(explicit)' : '(default)';
|
|
@@ -205,6 +327,15 @@ export function registerConfigCommand(program) {
|
|
|
205
327
|
else {
|
|
206
328
|
console.log(` workflows: (none)`);
|
|
207
329
|
}
|
|
330
|
+
const cacheTiers = getGlobalCacheTierDirs();
|
|
331
|
+
console.log(`\nCache settings:`);
|
|
332
|
+
console.log(` root: ${getGlobalCacheDir()}`);
|
|
333
|
+
console.log(` tiers: ${Object.keys(cacheTiers).join(', ')}`);
|
|
334
|
+
const redisBoundary = resolveRedisBoundaryConfig(process.env);
|
|
335
|
+
const redisStatus = redisBoundary.requested ? 'requested-unavailable (filesystem-first fallback)' : 'disabled';
|
|
336
|
+
console.log(`\nRedis boundary:`);
|
|
337
|
+
console.log(` status: ${redisStatus}`);
|
|
338
|
+
console.log(` namespace: ${redisBoundary.namespace}`);
|
|
208
339
|
}
|
|
209
340
|
});
|
|
210
341
|
// config get
|
|
@@ -218,6 +349,10 @@ export function registerConfigCommand(program) {
|
|
|
218
349
|
process.exitCode = 1;
|
|
219
350
|
return;
|
|
220
351
|
}
|
|
352
|
+
if (isSensitiveConfigPath(key)) {
|
|
353
|
+
console.log('[REDACTED]');
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
221
356
|
if (typeof value === 'object' && value !== null) {
|
|
222
357
|
console.log(JSON.stringify(value));
|
|
223
358
|
}
|
|
@@ -257,7 +392,11 @@ export function registerConfigCommand(program) {
|
|
|
257
392
|
// Apply changes and save
|
|
258
393
|
setNestedValue(config, key, coercedValue);
|
|
259
394
|
saveGlobalConfig(config);
|
|
260
|
-
const displayValue =
|
|
395
|
+
const displayValue = isSensitiveConfigPath(key)
|
|
396
|
+
? '[REDACTED]'
|
|
397
|
+
: typeof coercedValue === 'string'
|
|
398
|
+
? `"${coercedValue}"`
|
|
399
|
+
: String(coercedValue);
|
|
261
400
|
console.log(`Set ${key} = ${displayValue}`);
|
|
262
401
|
});
|
|
263
402
|
// config unset
|
|
@@ -351,7 +490,7 @@ export function registerConfigCommand(program) {
|
|
|
351
490
|
});
|
|
352
491
|
try {
|
|
353
492
|
const rawConfig = fs.readFileSync(configPath, 'utf-8');
|
|
354
|
-
const parsedConfig =
|
|
493
|
+
const parsedConfig = parseTomlContent(rawConfig);
|
|
355
494
|
const validation = validateConfig(parsedConfig);
|
|
356
495
|
if (!validation.success) {
|
|
357
496
|
console.error(`Error: Invalid configuration - ${validation.error}`);
|
|
@@ -363,7 +502,7 @@ export function registerConfigCommand(program) {
|
|
|
363
502
|
console.error(`Error: Config file not found at ${configPath}`);
|
|
364
503
|
}
|
|
365
504
|
else if (error instanceof SyntaxError) {
|
|
366
|
-
console.error(`Error: Invalid
|
|
505
|
+
console.error(`Error: Invalid TOML in ${configPath}`);
|
|
367
506
|
console.error(error.message);
|
|
368
507
|
}
|
|
369
508
|
else {
|
|
@@ -377,7 +516,7 @@ export function registerConfigCommand(program) {
|
|
|
377
516
|
.command('profile [preset]')
|
|
378
517
|
.description('Configure workflow profile (interactive picker or preset shortcut)')
|
|
379
518
|
.action(async (preset) => {
|
|
380
|
-
// Preset shortcut: `
|
|
519
|
+
// Preset shortcut: `codesdd config profile core`
|
|
381
520
|
if (preset === 'core') {
|
|
382
521
|
const config = getGlobalConfig();
|
|
383
522
|
config.profile = 'core';
|
|
@@ -517,10 +656,10 @@ export function registerConfigCommand(program) {
|
|
|
517
656
|
config.delivery = nextState.delivery;
|
|
518
657
|
config.workflows = nextState.workflows;
|
|
519
658
|
saveGlobalConfig(config);
|
|
520
|
-
// Check if inside
|
|
659
|
+
// Check if inside a legacy spec compatibility project
|
|
521
660
|
const projectDir = process.cwd();
|
|
522
|
-
const
|
|
523
|
-
if (fs.existsSync(
|
|
661
|
+
const codesddDir = resolveLegacySpecLiveRoot(projectDir);
|
|
662
|
+
if (fs.existsSync(codesddDir)) {
|
|
524
663
|
const applyNow = await confirm({
|
|
525
664
|
message: 'Apply changes to this project now?',
|
|
526
665
|
default: true,
|
|
@@ -1,6 +1,69 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Schema source location type
|
|
4
|
+
*/
|
|
5
|
+
export type SchemaSource = 'project' | 'user' | 'package';
|
|
6
|
+
/**
|
|
7
|
+
* Result of checking a schema location
|
|
8
|
+
*/
|
|
9
|
+
export interface SchemaLocation {
|
|
10
|
+
source: SchemaSource;
|
|
11
|
+
path: string;
|
|
12
|
+
exists: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Schema resolution info with shadowing details
|
|
16
|
+
*/
|
|
17
|
+
export interface SchemaResolution {
|
|
18
|
+
name: string;
|
|
19
|
+
source: SchemaSource;
|
|
20
|
+
path: string;
|
|
21
|
+
shadows: Array<{
|
|
22
|
+
source: SchemaSource;
|
|
23
|
+
path: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Validation issue structure
|
|
28
|
+
*/
|
|
29
|
+
export interface ValidationIssue {
|
|
30
|
+
level: 'error' | 'warning';
|
|
31
|
+
path: string;
|
|
32
|
+
message: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check all three locations for a schema and return which ones exist.
|
|
36
|
+
*/
|
|
37
|
+
export declare function checkAllLocations(name: string, projectRoot: string): SchemaLocation[];
|
|
38
|
+
/**
|
|
39
|
+
* Get resolution info for a schema including shadow detection.
|
|
40
|
+
*/
|
|
41
|
+
export declare function getSchemaResolution(name: string, projectRoot: string): SchemaResolution | null;
|
|
42
|
+
/**
|
|
43
|
+
* Get all schemas with resolution info.
|
|
44
|
+
*/
|
|
45
|
+
export declare function getAllSchemasWithResolution(projectRoot: string): SchemaResolution[];
|
|
46
|
+
/**
|
|
47
|
+
* Validate a schema and return issues.
|
|
48
|
+
*/
|
|
49
|
+
export declare function validateSchema(schemaDir: string, verbose?: boolean): {
|
|
50
|
+
valid: boolean;
|
|
51
|
+
issues: ValidationIssue[];
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Validate schema name format (kebab-case).
|
|
55
|
+
*/
|
|
56
|
+
export declare function isValidSchemaName(name: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Copy a directory recursively.
|
|
59
|
+
*/
|
|
60
|
+
export declare function copyDirRecursive(src: string, dest: string): void;
|
|
2
61
|
/**
|
|
3
62
|
* Register the schema command and all its subcommands.
|
|
4
63
|
*/
|
|
5
64
|
export declare function registerSchemaCommand(program: Command): void;
|
|
65
|
+
/**
|
|
66
|
+
* Create default template content for an artifact.
|
|
67
|
+
*/
|
|
68
|
+
export declare function createDefaultTemplate(artifactId: string): string;
|
|
6
69
|
//# sourceMappingURL=schema.d.ts.map
|
package/dist/commands/schema.js
CHANGED
|
@@ -4,11 +4,11 @@ import ora from 'ora';
|
|
|
4
4
|
import { stringify as stringifyYaml } from 'yaml';
|
|
5
5
|
import { getSchemaDir, getProjectSchemasDir, getUserSchemasDir, getPackageSchemasDir, listSchemas, } from '../core/artifact-graph/resolver.js';
|
|
6
6
|
import { parseSchema, SchemaValidationError } from '../core/artifact-graph/schema.js';
|
|
7
|
-
import {
|
|
7
|
+
import { resolveLegacySpecLiveSubpath } from '../core/sdd/services/legacy-capability.service.js';
|
|
8
8
|
/**
|
|
9
9
|
* Check all three locations for a schema and return which ones exist.
|
|
10
10
|
*/
|
|
11
|
-
function checkAllLocations(name, projectRoot) {
|
|
11
|
+
export function checkAllLocations(name, projectRoot) {
|
|
12
12
|
const locations = [];
|
|
13
13
|
// Project location
|
|
14
14
|
const projectDir = path.join(getProjectSchemasDir(projectRoot), name);
|
|
@@ -39,7 +39,7 @@ function checkAllLocations(name, projectRoot) {
|
|
|
39
39
|
/**
|
|
40
40
|
* Get resolution info for a schema including shadow detection.
|
|
41
41
|
*/
|
|
42
|
-
function getSchemaResolution(name, projectRoot) {
|
|
42
|
+
export function getSchemaResolution(name, projectRoot) {
|
|
43
43
|
const locations = checkAllLocations(name, projectRoot);
|
|
44
44
|
const existingLocations = locations.filter((loc) => loc.exists);
|
|
45
45
|
if (existingLocations.length === 0) {
|
|
@@ -60,7 +60,7 @@ function getSchemaResolution(name, projectRoot) {
|
|
|
60
60
|
/**
|
|
61
61
|
* Get all schemas with resolution info.
|
|
62
62
|
*/
|
|
63
|
-
function getAllSchemasWithResolution(projectRoot) {
|
|
63
|
+
export function getAllSchemasWithResolution(projectRoot) {
|
|
64
64
|
const schemaNames = listSchemas(projectRoot);
|
|
65
65
|
const results = [];
|
|
66
66
|
for (const name of schemaNames) {
|
|
@@ -74,7 +74,7 @@ function getAllSchemasWithResolution(projectRoot) {
|
|
|
74
74
|
/**
|
|
75
75
|
* Validate a schema and return issues.
|
|
76
76
|
*/
|
|
77
|
-
function validateSchema(schemaDir, verbose = false) {
|
|
77
|
+
export function validateSchema(schemaDir, verbose = false) {
|
|
78
78
|
const issues = [];
|
|
79
79
|
const schemaPath = path.join(schemaDir, 'schema.yaml');
|
|
80
80
|
// Check schema.yaml exists
|
|
@@ -157,13 +157,13 @@ function validateSchema(schemaDir, verbose = false) {
|
|
|
157
157
|
/**
|
|
158
158
|
* Validate schema name format (kebab-case).
|
|
159
159
|
*/
|
|
160
|
-
function isValidSchemaName(name) {
|
|
160
|
+
export function isValidSchemaName(name) {
|
|
161
161
|
return /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(name);
|
|
162
162
|
}
|
|
163
163
|
/**
|
|
164
164
|
* Copy a directory recursively.
|
|
165
165
|
*/
|
|
166
|
-
function copyDirRecursive(src, dest) {
|
|
166
|
+
export function copyDirRecursive(src, dest) {
|
|
167
167
|
fs.mkdirSync(dest, { recursive: true });
|
|
168
168
|
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
169
169
|
for (const entry of entries) {
|
|
@@ -592,12 +592,12 @@ export function registerSchemaCommand(program) {
|
|
|
592
592
|
console.log(JSON.stringify({
|
|
593
593
|
created: false,
|
|
594
594
|
error: `Schema '${name}' already exists`,
|
|
595
|
-
suggestion: 'Use --force to overwrite or "
|
|
595
|
+
suggestion: 'Use --force to overwrite or "codesdd schema fork" to copy',
|
|
596
596
|
}, null, 2));
|
|
597
597
|
}
|
|
598
598
|
else {
|
|
599
599
|
console.error(`Error: Schema '${name}' already exists at ${schemaDir}`);
|
|
600
|
-
console.error('Use --force to overwrite or "
|
|
600
|
+
console.error('Use --force to overwrite or "codesdd schema fork" to copy');
|
|
601
601
|
}
|
|
602
602
|
process.exitCode = 1;
|
|
603
603
|
return;
|
|
@@ -734,7 +734,7 @@ export function registerSchemaCommand(program) {
|
|
|
734
734
|
}
|
|
735
735
|
// Update config if --default
|
|
736
736
|
if (options?.default) {
|
|
737
|
-
const configPath =
|
|
737
|
+
const configPath = resolveLegacySpecLiveSubpath(projectRoot, 'config.yaml');
|
|
738
738
|
if (fs.existsSync(configPath)) {
|
|
739
739
|
const { parse: parseYaml, stringify: stringifyYaml2 } = await import('yaml');
|
|
740
740
|
const configContent = fs.readFileSync(configPath, 'utf-8');
|
|
@@ -771,7 +771,7 @@ export function registerSchemaCommand(program) {
|
|
|
771
771
|
console.log(`\nNext steps:`);
|
|
772
772
|
console.log(` 1. Edit ${schemaDir}/schema.yaml to customize artifacts`);
|
|
773
773
|
console.log(` 2. Modify templates in the schema directory`);
|
|
774
|
-
console.log(` 3. Use with:
|
|
774
|
+
console.log(` 3. Use with: codesdd new --schema ${name}`);
|
|
775
775
|
}
|
|
776
776
|
}
|
|
777
777
|
catch (error) {
|
|
@@ -793,7 +793,7 @@ export function registerSchemaCommand(program) {
|
|
|
793
793
|
/**
|
|
794
794
|
* Create default template content for an artifact.
|
|
795
795
|
*/
|
|
796
|
-
function createDefaultTemplate(artifactId) {
|
|
796
|
+
export function createDefaultTemplate(artifactId) {
|
|
797
797
|
switch (artifactId) {
|
|
798
798
|
case 'proposal':
|
|
799
799
|
return `## Why
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { buildBacklogProjectDryRun, } from '../../core/sdd/backlog-cli.js';
|
|
3
|
+
export function registerBacklogCommands(sddCmd) {
|
|
4
|
+
const backlogCmd = sddCmd.command('backlog').description('Plan external backlog projections without provider writes');
|
|
5
|
+
backlogCmd
|
|
6
|
+
.command('project')
|
|
7
|
+
.description('Build a dry-run projection plan for an external backlog provider')
|
|
8
|
+
.requiredOption('--provider <provider>', 'Backlog provider id, for example azure-devops')
|
|
9
|
+
.requiredOption('--ref <ref>', 'Canonical SDD ref to project, for example EPIC-0039')
|
|
10
|
+
.option('--json', 'Return the dry-run projection plan as JSON')
|
|
11
|
+
.action(async (options) => {
|
|
12
|
+
try {
|
|
13
|
+
const result = buildBacklogProjectDryRun({
|
|
14
|
+
provider: options.provider,
|
|
15
|
+
ref: options.ref,
|
|
16
|
+
});
|
|
17
|
+
if (options.json) {
|
|
18
|
+
console.log(JSON.stringify(result, null, 2));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
printBacklogProjectDryRun(result);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error(chalk.red(`Error: ${formatBacklogError(error)}`));
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function formatBacklogError(error) {
|
|
30
|
+
return error instanceof Error ? error.message : String(error);
|
|
31
|
+
}
|
|
32
|
+
function printBacklogProjectDryRun(result) {
|
|
33
|
+
const { plan } = result;
|
|
34
|
+
console.log(chalk.green(`Backlog projection dry-run: ${plan.provider}`));
|
|
35
|
+
console.log(`Ref: ${result.ref}`);
|
|
36
|
+
console.log(`Mode: ${plan.mode}`);
|
|
37
|
+
console.log(`Direction: ${plan.direction}`);
|
|
38
|
+
console.log(`Source of truth: ${plan.source_of_truth}`);
|
|
39
|
+
console.log(`Items: ${plan.items.length}`);
|
|
40
|
+
console.log(`Operations: ${summarizeOperations(plan.items.map((item) => item.operation))}`);
|
|
41
|
+
if (plan.warnings.length > 0) {
|
|
42
|
+
console.log(`Warnings: ${plan.warnings.join(' | ')}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function summarizeOperations(operations) {
|
|
46
|
+
const counts = new Map();
|
|
47
|
+
for (const operation of operations) {
|
|
48
|
+
counts.set(operation, (counts.get(operation) ?? 0) + 1);
|
|
49
|
+
}
|
|
50
|
+
return Array.from(counts.entries())
|
|
51
|
+
.map(([operation, count]) => `${operation}=${count}`)
|
|
52
|
+
.join(', ');
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=backlog.js.map
|