@devtrack-solution/codesdd 1.2.2 → 1.2.4-rc3
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 +170 -31
- package/.sdd/skills/curated/devtrack-api/agents/claude-code.yaml +8 -0
- package/.sdd/skills/curated/devtrack-api/agents/codex.yaml +8 -0
- package/.sdd/skills/curated/devtrack-api/agents/cursor.yaml +8 -0
- package/.sdd/skills/curated/devtrack-api/agents/gemini.yaml +8 -0
- package/.sdd/skills/curated/devtrack-api/agents/kimi.yaml +8 -0
- package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +4 -2
- package/.sdd/skills/curated/devtrack-api/agents/opencode.yaml +10 -0
- package/.sdd/skills/curated/devtrack-api/references/application-presentation.md +2 -2
- 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 +372 -0
- package/.sdd/skills/curated/devtrack-api/references/domain-modeling.md +13 -13
- package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +95 -0
- package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +294 -0
- package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +5 -5
- package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +4 -0
- package/.sdd/skills/curated/devtrack-api/references/portable-agent-contract.md +41 -0
- package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +2 -2
- package/.sdd/skills/curated/devtrack-api/references/typeorm-infrastructure.md +7 -9
- package/LICENSE +1 -1
- package/README.md +399 -53
- package/bin/codesdd.js +3 -2
- package/dist/applications/sdd/index.d.ts +16 -0
- package/dist/applications/sdd/index.js +16 -0
- 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 +320 -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 +489 -28
- package/dist/commands/sdd/plugin.d.ts +3 -0
- package/dist/commands/sdd/plugin.js +158 -0
- package/dist/commands/sdd/shared.d.ts +1 -0
- package/dist/commands/sdd/shared.js +11 -22
- package/dist/commands/sdd/skills.js +7 -0
- package/dist/commands/sdd.js +107 -15
- 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 +19 -1
- package/dist/core/cli-command-quality.d.ts +27 -0
- package/dist/core/cli-command-quality.js +180 -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 +200 -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 +20 -1
- package/dist/core/config-schema.js +70 -2
- package/dist/core/config.d.ts +3 -3
- package/dist/core/config.js +4 -4
- package/dist/core/global-config.d.ts +57 -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/agent-runtime-contract.d.ts +204 -0
- package/dist/core/sdd/agent-runtime-contract.js +200 -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 +44 -0
- package/dist/core/sdd/check.js +62 -24
- 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 +53 -8
- package/dist/core/sdd/coordination/coordination-adapters.js +182 -16
- package/dist/core/sdd/coordination/index.d.ts +1 -0
- package/dist/core/sdd/coordination/index.js +1 -0
- package/dist/core/sdd/coordination/redis-runtime.d.ts +131 -0
- package/dist/core/sdd/coordination/redis-runtime.js +698 -0
- package/dist/core/sdd/deepagent-contracts.d.ts +370 -0
- package/dist/core/sdd/deepagent-contracts.js +235 -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 +3 -3
- package/dist/core/sdd/default-bootstrap-files.js +50 -10
- package/dist/core/sdd/default-skills.d.ts +30 -0
- package/dist/core/sdd/default-skills.js +288 -8
- package/dist/core/sdd/devtrack-api-appliance.d.ts +91 -0
- package/dist/core/sdd/devtrack-api-appliance.js +280 -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 +54 -20
- package/dist/core/sdd/domain/capability-diff.d.ts +63 -0
- package/dist/core/sdd/domain/capability-diff.js +200 -0
- package/dist/core/sdd/domain/change-safety-guardrails.d.ts +74 -0
- package/dist/core/sdd/domain/change-safety-guardrails.js +333 -0
- 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/semantic-intent-classifier.d.ts +29 -0
- package/dist/core/sdd/domain/semantic-intent-classifier.js +117 -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/foundation-artifact-map-validator.d.ts +16 -0
- package/dist/core/sdd/foundation-artifact-map-validator.js +71 -0
- package/dist/core/sdd/foundation-layer-manifest.d.ts +24 -0
- package/dist/core/sdd/foundation-layer-manifest.js +117 -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/intent-guard.d.ts +22 -0
- package/dist/core/sdd/intent-guard.js +67 -0
- package/dist/core/sdd/json-schema.js +108 -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 +507 -44
- package/dist/core/sdd/lenses.d.ts +1 -0
- package/dist/core/sdd/lenses.js +29 -1
- package/dist/core/sdd/migrate-workspace.js +95 -2
- package/dist/core/sdd/migrate.d.ts +1 -1
- package/dist/core/sdd/migrate.js +36 -2
- package/dist/core/sdd/package-security-gates.d.ts +21 -0
- package/dist/core/sdd/package-security-gates.js +119 -0
- package/dist/core/sdd/package-structure-gate.d.ts +83 -0
- package/dist/core/sdd/package-structure-gate.js +357 -0
- package/dist/core/sdd/parallel-feat-automation.d.ts +330 -0
- package/dist/core/sdd/parallel-feat-automation.js +424 -0
- package/dist/core/sdd/plugin-broker.d.ts +777 -0
- package/dist/core/sdd/plugin-broker.js +492 -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 +139 -0
- package/dist/core/sdd/plugin-cli.js +265 -0
- package/dist/core/sdd/plugin-evidence.d.ts +348 -0
- package/dist/core/sdd/plugin-evidence.js +307 -0
- package/dist/core/sdd/plugin-manifest.d.ts +232 -0
- package/dist/core/sdd/plugin-manifest.js +225 -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 +447 -0
- package/dist/core/sdd/plugin-registry.js +138 -0
- package/dist/core/sdd/plugin-sdk-contract.d.ts +363 -0
- package/dist/core/sdd/plugin-sdk-contract.js +268 -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 +620 -0
- package/dist/core/sdd/quality-validation.js +239 -0
- package/dist/core/sdd/release-readiness.d.ts +19 -0
- package/dist/core/sdd/release-readiness.js +472 -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/runtime-boundary-contract.d.ts +45 -0
- package/dist/core/sdd/runtime-boundary-contract.js +90 -0
- package/dist/core/sdd/sanitize.d.ts +30 -1
- package/dist/core/sdd/sanitize.js +23 -23
- package/dist/core/sdd/sdk-agent-plugin-quality-gates.d.ts +150 -0
- package/dist/core/sdd/sdk-agent-plugin-quality-gates.js +258 -0
- package/dist/core/sdd/services/agent-run.service.d.ts +97 -0
- package/dist/core/sdd/services/agent-run.service.js +261 -0
- package/dist/core/sdd/services/breakdown.service.js +2 -1
- package/dist/core/sdd/services/capability-diff.service.d.ts +18 -0
- package/dist/core/sdd/services/capability-diff.service.js +26 -0
- package/dist/core/sdd/services/change-safety-preflight.service.d.ts +17 -0
- package/dist/core/sdd/services/change-safety-preflight.service.js +17 -0
- package/dist/core/sdd/services/context.service.d.ts +43 -340
- package/dist/core/sdd/services/context.service.js +341 -25
- 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 +105 -0
- package/dist/core/sdd/services/finalize.service.js +499 -38
- package/dist/core/sdd/services/frontend-gap.service.js +22 -7
- package/dist/core/sdd/services/frontend-impact.service.d.ts +1 -1
- 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/semantic-intent-classifier.service.d.ts +6 -0
- package/dist/core/sdd/services/semantic-intent-classifier.service.js +7 -0
- 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 +23 -0
- package/dist/core/sdd/state.js +313 -66
- package/dist/core/sdd/store/sdd-stores.js +2 -2
- package/dist/core/sdd/structural-health.d.ts +55 -55
- package/dist/core/sdd/types.d.ts +60 -19
- package/dist/core/sdd/types.js +21 -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/views.js +17 -0
- package/dist/core/sdd/workspace-schemas.d.ts +670 -19
- package/dist/core/sdd/workspace-schemas.js +285 -5
- 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/domains/sdd/index.d.ts +6 -0
- package/dist/domains/sdd/index.js +6 -0
- package/dist/infrastructures/sdd/index.d.ts +7 -0
- package/dist/infrastructures/sdd/index.js +6 -0
- package/dist/presentations/cli/sdd/index.d.ts +3 -0
- package/dist/presentations/cli/sdd/index.js +3 -0
- package/dist/shared/sdd/index.d.ts +3 -0
- package/dist/shared/sdd/index.js +2 -0
- 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 +34 -21
- package/schemas/sdd/1-spec.schema.json +1 -1
- package/schemas/sdd/2-plan.schema.json +280 -3
- 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 +701 -5
- 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/agent-runtime-command-plan.schema.json +212 -0
- package/schemas/sdd/agent-runtime-opencode-run-evidence.schema.json +270 -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 +645 -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 +637 -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 +304 -0
- package/schemas/sdd/parallel-feat-automation-request.schema.json +109 -0
- package/schemas/sdd/parallel-feat-scheduler-request.schema.json +116 -0
- package/schemas/sdd/parallel-feat-scheduler-result.schema.json +404 -0
- package/schemas/sdd/plugin-artifact-manifest.schema.json +259 -0
- package/schemas/sdd/plugin-artifact-map.schema.json +223 -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 +678 -0
- package/schemas/sdd/plugin-language-runtime.schema.json +103 -0
- package/schemas/sdd/plugin-package-governance.schema.json +74 -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 +729 -0
- package/schemas/sdd/plugin-rollback-manifest.schema.json +87 -0
- package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +954 -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 +1337 -0
- package/schemas/sdd/quality-run.schema.json +197 -0
- package/schemas/sdd/quality-scenario.schema.json +252 -0
- package/schemas/sdd/sdk-agent-plugin-quality-gate-input.schema.json +168 -0
- package/schemas/sdd/sdk-agent-plugin-quality-gate-report.schema.json +160 -0
- package/schemas/sdd/workspace-catalog.schema.json +13232 -35
- 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,18 @@
|
|
|
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 { buildRedisOperationalReport, deleteKeysByPrefix, RedisClientFactory, resolveRedisBoundaryConfig, runRedisBenchmark, } from '../core/sdd/coordination/index.js';
|
|
12
|
+
import { buildCodesddStorageBoundaryReport } from '../core/sdd/runtime-boundary-contract.js';
|
|
13
|
+
import { buildDeepAgentsOperationalPreflight, createDeepAgentsPolicySnapshot, } from '../core/sdd/deepagents/policy.js';
|
|
14
|
+
import { detectShell } from '../utils/shell-detection.js';
|
|
15
|
+
import { ZshInstaller } from '../core/completions/installers/zsh-installer.js';
|
|
10
16
|
const WORKFLOW_PROMPT_META = {
|
|
11
17
|
propose: {
|
|
12
18
|
name: 'Propose change',
|
|
@@ -50,9 +56,37 @@ const WORKFLOW_PROMPT_META = {
|
|
|
50
56
|
},
|
|
51
57
|
onboard: {
|
|
52
58
|
name: 'Onboard',
|
|
53
|
-
description: 'Guided onboarding flow for
|
|
59
|
+
description: 'Guided onboarding flow for CodeSDD',
|
|
54
60
|
},
|
|
55
61
|
};
|
|
62
|
+
function resolveHomeDir() {
|
|
63
|
+
return process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
64
|
+
}
|
|
65
|
+
function buildCodesddEnvTemplate() {
|
|
66
|
+
return [
|
|
67
|
+
'#!/usr/bin/env zsh',
|
|
68
|
+
'# CodeSDD global runtime profile (non-secret settings only).',
|
|
69
|
+
'export CODESDD_AGENT_PROVIDER="${CODESDD_AGENT_PROVIDER:-deepagents}"',
|
|
70
|
+
'export CODESDD_DEEPAGENTS_ENABLED="${CODESDD_DEEPAGENTS_ENABLED:-false}"',
|
|
71
|
+
'export CODESDD_DEEPAGENTS_RUNTIME="${CODESDD_DEEPAGENTS_RUNTIME:-disabled}"',
|
|
72
|
+
'export CODESDD_AGENT_NETWORK_POLICY="${CODESDD_AGENT_NETWORK_POLICY:-disabled}"',
|
|
73
|
+
'export CODESDD_DEEPAGENTS_PROVIDER_SMOKE="${CODESDD_DEEPAGENTS_PROVIDER_SMOKE:-0}"',
|
|
74
|
+
'export CODESDD_REDIS_ENABLED="${CODESDD_REDIS_ENABLED:-false}"',
|
|
75
|
+
'export CODESDD_REDIS_NAMESPACE="${CODESDD_REDIS_NAMESPACE:-codesdd}"',
|
|
76
|
+
'# export CODESDD_REDIS_URL="redis://localhost:6379"',
|
|
77
|
+
'# export CODESDD_REDIS_FALLBACK="filesystem"',
|
|
78
|
+
'# Optional live-provider launcher references. Keep values in your shell,',
|
|
79
|
+
'# password manager, CI secret store, or another untracked launcher context.',
|
|
80
|
+
'# export CODESDD_DEEPAGENTS_ENABLED=true',
|
|
81
|
+
'# export CODESDD_DEEPAGENTS_RUNTIME=deepagents-js',
|
|
82
|
+
'# export CODESDD_AGENT_NETWORK_POLICY=restricted',
|
|
83
|
+
'# export CODESDD_DEEPAGENTS_MODEL="azure-openai:gpt-4o-mini"',
|
|
84
|
+
'# export CODESDD_AGENT_ALLOWED_DOMAINS="api.openai.com"',
|
|
85
|
+
'# export AZURE_OPENAI_ENDPOINT="https://example-resource.openai.azure.com/"',
|
|
86
|
+
'# export AZURE_OPENAI_API_KEY="<secret-from-manager>"',
|
|
87
|
+
'',
|
|
88
|
+
].join('\n');
|
|
89
|
+
}
|
|
56
90
|
function isPromptCancellationError(error) {
|
|
57
91
|
return (error instanceof Error &&
|
|
58
92
|
(error.name === 'ExitPromptError' || error.message.includes('force closed the prompt with SIGINT')));
|
|
@@ -134,8 +168,8 @@ export function diffProfileState(before, after) {
|
|
|
134
168
|
};
|
|
135
169
|
}
|
|
136
170
|
function maybeWarnConfigDrift(projectDir, state, colorize) {
|
|
137
|
-
const
|
|
138
|
-
if (!fs.existsSync(
|
|
171
|
+
const codesddDir = resolveLegacySpecLiveRoot(projectDir);
|
|
172
|
+
if (!fs.existsSync(codesddDir)) {
|
|
139
173
|
return;
|
|
140
174
|
}
|
|
141
175
|
if (!hasProjectConfigDrift(projectDir, state.workflows, state.delivery)) {
|
|
@@ -151,7 +185,7 @@ function maybeWarnConfigDrift(projectDir, state, colorize) {
|
|
|
151
185
|
export function registerConfigCommand(program) {
|
|
152
186
|
const configCmd = program
|
|
153
187
|
.command('config')
|
|
154
|
-
.description('View and modify global
|
|
188
|
+
.description('View and modify global CodeSDD configuration')
|
|
155
189
|
.option('--scope <scope>', 'Config scope (only "global" supported currently)')
|
|
156
190
|
.hook('preAction', (thisCommand) => {
|
|
157
191
|
const opts = thisCommand.opts();
|
|
@@ -167,6 +201,249 @@ export function registerConfigCommand(program) {
|
|
|
167
201
|
.action(() => {
|
|
168
202
|
console.log(getGlobalConfigPath());
|
|
169
203
|
});
|
|
204
|
+
// config init
|
|
205
|
+
configCmd
|
|
206
|
+
.command('init')
|
|
207
|
+
.description('Initialize ~/.codesdd runtime files and idempotent shell integration')
|
|
208
|
+
.option('--json', 'Output as JSON')
|
|
209
|
+
.action(async (options) => {
|
|
210
|
+
const homeDir = resolveHomeDir();
|
|
211
|
+
const configPath = getGlobalConfigPath();
|
|
212
|
+
const envPath = path.join(homeDir, '.codesdd', 'env.zsh');
|
|
213
|
+
if (!fs.existsSync(configPath)) {
|
|
214
|
+
saveGlobalConfig(getGlobalConfig());
|
|
215
|
+
}
|
|
216
|
+
const tierPaths = ensureGlobalCacheLayout();
|
|
217
|
+
const envTemplate = buildCodesddEnvTemplate();
|
|
218
|
+
if (!fs.existsSync(path.dirname(envPath))) {
|
|
219
|
+
fs.mkdirSync(path.dirname(envPath), { recursive: true });
|
|
220
|
+
}
|
|
221
|
+
fs.writeFileSync(envPath, envTemplate, { encoding: 'utf-8', mode: 0o600 });
|
|
222
|
+
try {
|
|
223
|
+
fs.chmodSync(envPath, 0o600);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// best effort on non-POSIX filesystems
|
|
227
|
+
}
|
|
228
|
+
const detectedShell = detectShell().shell;
|
|
229
|
+
let zshrcConfigured = false;
|
|
230
|
+
if (detectedShell === 'zsh' || process.env.SHELL?.toLowerCase().includes('zsh')) {
|
|
231
|
+
const installer = new ZshInstaller(homeDir);
|
|
232
|
+
zshrcConfigured = await installer.ensureCodesddEnvSource(envPath);
|
|
233
|
+
}
|
|
234
|
+
const payload = {
|
|
235
|
+
schema_version: 1,
|
|
236
|
+
config_path: configPath,
|
|
237
|
+
env_path: envPath,
|
|
238
|
+
cache_root: getGlobalCacheDir(),
|
|
239
|
+
cache_tiers: Object.keys(tierPaths),
|
|
240
|
+
shell_detected: detectedShell ?? 'unknown',
|
|
241
|
+
zshrc_configured: zshrcConfigured,
|
|
242
|
+
};
|
|
243
|
+
if (options.json) {
|
|
244
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
console.log(`Config file: ${configPath}`);
|
|
248
|
+
console.log(`Shell profile: ${envPath}`);
|
|
249
|
+
console.log(`Cache root: ${payload.cache_root}`);
|
|
250
|
+
console.log(`Cache tiers: ${payload.cache_tiers.join(', ')}`);
|
|
251
|
+
if (detectedShell === 'zsh') {
|
|
252
|
+
console.log('Zsh source block ensured for ~/.codesdd/env.zsh.');
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
console.log('Shell source block was not changed automatically (non-zsh or undetected shell).');
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
// config doctor
|
|
259
|
+
configCmd
|
|
260
|
+
.command('doctor')
|
|
261
|
+
.description('Run operational readiness checks for DeepAgents/Azure, cache, and Redis boundary')
|
|
262
|
+
.option('--json', 'Output as JSON')
|
|
263
|
+
.action(async (options) => {
|
|
264
|
+
const snapshot = createDeepAgentsPolicySnapshot(process.env);
|
|
265
|
+
const preflight = buildDeepAgentsOperationalPreflight(snapshot, process.env);
|
|
266
|
+
const redisReport = await buildRedisOperationalReport({
|
|
267
|
+
env: process.env,
|
|
268
|
+
globalConfig: getGlobalConfig(),
|
|
269
|
+
});
|
|
270
|
+
const cacheTiers = getGlobalCacheTierDirs();
|
|
271
|
+
const storageBoundary = buildCodesddStorageBoundaryReport(process.cwd());
|
|
272
|
+
const report = {
|
|
273
|
+
schema_version: 1,
|
|
274
|
+
global_config_path: getGlobalConfigPath(),
|
|
275
|
+
cache: {
|
|
276
|
+
root: getGlobalCacheDir(),
|
|
277
|
+
tiers: Object.keys(cacheTiers),
|
|
278
|
+
},
|
|
279
|
+
storage_boundary: storageBoundary,
|
|
280
|
+
redis: {
|
|
281
|
+
requested: redisReport.requested,
|
|
282
|
+
namespace: redisReport.namespace,
|
|
283
|
+
status: redisReport.status,
|
|
284
|
+
fallback: redisReport.fallback,
|
|
285
|
+
redacted_url: redisReport.redacted_url,
|
|
286
|
+
latency_ms: redisReport.latency_ms,
|
|
287
|
+
reason: redisReport.reason,
|
|
288
|
+
validation_errors: redisReport.validation_errors,
|
|
289
|
+
warnings: redisReport.warnings,
|
|
290
|
+
},
|
|
291
|
+
deepagents: preflight,
|
|
292
|
+
};
|
|
293
|
+
if (options.json) {
|
|
294
|
+
console.log(JSON.stringify(report, null, 2));
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
console.log(`Global config: ${report.global_config_path}`);
|
|
298
|
+
console.log(`Cache root: ${report.cache.root}`);
|
|
299
|
+
console.log(`Cache tiers: ${report.cache.tiers.join(', ')}`);
|
|
300
|
+
console.log(`Project state: ${report.storage_boundary.project_state_dir}`);
|
|
301
|
+
console.log(`Global runtime: ${report.storage_boundary.global_runtime_dir}`);
|
|
302
|
+
console.log(`Redis: ${report.redis.status} (namespace=${report.redis.namespace}, fallback=${report.redis.fallback})`);
|
|
303
|
+
if (report.redis.redacted_url) {
|
|
304
|
+
console.log(`Redis URL: ${report.redis.redacted_url}`);
|
|
305
|
+
}
|
|
306
|
+
if (report.redis.latency_ms !== undefined) {
|
|
307
|
+
console.log(`Redis latency: ${report.redis.latency_ms}ms`);
|
|
308
|
+
}
|
|
309
|
+
console.log(`Redis reason: ${report.redis.reason}`);
|
|
310
|
+
for (const warning of report.redis.warnings) {
|
|
311
|
+
console.log(`- ${warning}`);
|
|
312
|
+
}
|
|
313
|
+
for (const error of report.redis.validation_errors) {
|
|
314
|
+
console.log(`- ${error}`);
|
|
315
|
+
}
|
|
316
|
+
console.log(`DeepAgents preflight: ${preflight.status}`);
|
|
317
|
+
for (const reason of preflight.reasons) {
|
|
318
|
+
console.log(`- ${reason}`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
if (preflight.status === 'blocked' || redisReport.status === 'blocked') {
|
|
322
|
+
process.exitCode = 1;
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
const redisCmd = configCmd
|
|
326
|
+
.command('redis')
|
|
327
|
+
.description('Inspect and operate the optional Redis runtime backend');
|
|
328
|
+
redisCmd
|
|
329
|
+
.command('status')
|
|
330
|
+
.description('Show Redis runtime status')
|
|
331
|
+
.option('--json', 'Output as JSON')
|
|
332
|
+
.action(async (options) => {
|
|
333
|
+
const report = await buildRedisOperationalReport({
|
|
334
|
+
env: process.env,
|
|
335
|
+
globalConfig: getGlobalConfig(),
|
|
336
|
+
});
|
|
337
|
+
if (options.json) {
|
|
338
|
+
console.log(JSON.stringify(report, null, 2));
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
console.log(`Redis: ${report.status}`);
|
|
342
|
+
console.log(`Namespace: ${report.namespace}`);
|
|
343
|
+
console.log(`Fallback: ${report.fallback}`);
|
|
344
|
+
if (report.redacted_url)
|
|
345
|
+
console.log(`URL: ${report.redacted_url}`);
|
|
346
|
+
if (report.latency_ms !== undefined)
|
|
347
|
+
console.log(`Latency: ${report.latency_ms}ms`);
|
|
348
|
+
console.log(`Reason: ${report.reason}`);
|
|
349
|
+
if (report.status === 'blocked')
|
|
350
|
+
process.exitCode = 1;
|
|
351
|
+
});
|
|
352
|
+
redisCmd
|
|
353
|
+
.command('ping')
|
|
354
|
+
.description('Ping Redis using the effective CodeSDD configuration')
|
|
355
|
+
.option('--json', 'Output as JSON')
|
|
356
|
+
.action(async (options) => {
|
|
357
|
+
const report = await buildRedisOperationalReport({
|
|
358
|
+
env: process.env,
|
|
359
|
+
globalConfig: getGlobalConfig(),
|
|
360
|
+
});
|
|
361
|
+
if (options.json) {
|
|
362
|
+
console.log(JSON.stringify(report, null, 2));
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
console.log(`Redis ping: ${report.status}`);
|
|
366
|
+
if (report.latency_ms !== undefined)
|
|
367
|
+
console.log(`Latency: ${report.latency_ms}ms`);
|
|
368
|
+
console.log(report.reason);
|
|
369
|
+
}
|
|
370
|
+
if (report.status !== 'ready')
|
|
371
|
+
process.exitCode = 1;
|
|
372
|
+
});
|
|
373
|
+
redisCmd
|
|
374
|
+
.command('bench')
|
|
375
|
+
.description('Run a short redacted Redis latency benchmark')
|
|
376
|
+
.option('--json', 'Output as JSON')
|
|
377
|
+
.option('--iterations <n>', 'Number of benchmark iterations')
|
|
378
|
+
.action(async (options) => {
|
|
379
|
+
const iterations = options.iterations ? Number.parseInt(options.iterations, 10) : undefined;
|
|
380
|
+
const report = await runRedisBenchmark({
|
|
381
|
+
env: process.env,
|
|
382
|
+
globalConfig: getGlobalConfig(),
|
|
383
|
+
iterations,
|
|
384
|
+
});
|
|
385
|
+
if (options.json) {
|
|
386
|
+
console.log(JSON.stringify(report, null, 2));
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
console.log(`Redis benchmark: ${report.status}`);
|
|
390
|
+
console.log(`Namespace: ${report.namespace}`);
|
|
391
|
+
console.log(`Iterations: ${report.iterations}`);
|
|
392
|
+
if (report.p50_ms !== undefined)
|
|
393
|
+
console.log(`p50: ${report.p50_ms}ms`);
|
|
394
|
+
if (report.p95_ms !== undefined)
|
|
395
|
+
console.log(`p95: ${report.p95_ms}ms`);
|
|
396
|
+
console.log(`Reason: ${report.reason}`);
|
|
397
|
+
}
|
|
398
|
+
if (report.status !== 'ready')
|
|
399
|
+
process.exitCode = 1;
|
|
400
|
+
});
|
|
401
|
+
redisCmd
|
|
402
|
+
.command('flush-namespace')
|
|
403
|
+
.description('Delete only keys under the effective CodeSDD Redis namespace')
|
|
404
|
+
.option('--json', 'Output as JSON')
|
|
405
|
+
.option('-y, --yes', 'Confirm namespace-scoped deletion')
|
|
406
|
+
.action(async (options) => {
|
|
407
|
+
const config = resolveRedisBoundaryConfig(process.env, getGlobalConfig());
|
|
408
|
+
if (!options.yes) {
|
|
409
|
+
console.error('Error: --yes is required to flush the CodeSDD Redis namespace.');
|
|
410
|
+
process.exitCode = 1;
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
const report = await buildRedisOperationalReport({
|
|
414
|
+
env: process.env,
|
|
415
|
+
globalConfig: getGlobalConfig(),
|
|
416
|
+
});
|
|
417
|
+
if (report.status !== 'ready') {
|
|
418
|
+
if (options.json) {
|
|
419
|
+
console.log(JSON.stringify({ ...report, deleted_keys: 0 }, null, 2));
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
console.log(`Redis namespace flush skipped: ${report.reason}`);
|
|
423
|
+
}
|
|
424
|
+
process.exitCode = 1;
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
const factory = new RedisClientFactory(config);
|
|
428
|
+
try {
|
|
429
|
+
const deleted = await deleteKeysByPrefix(factory, `${config.namespace}:`);
|
|
430
|
+
const payload = {
|
|
431
|
+
schema_version: 1,
|
|
432
|
+
namespace: config.namespace,
|
|
433
|
+
deleted_keys: deleted,
|
|
434
|
+
status: 'ok',
|
|
435
|
+
};
|
|
436
|
+
if (options.json) {
|
|
437
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
console.log(`Deleted ${deleted} Redis key(s) under namespace ${config.namespace}.`);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
finally {
|
|
444
|
+
await factory.close();
|
|
445
|
+
}
|
|
446
|
+
});
|
|
170
447
|
// config list
|
|
171
448
|
configCmd
|
|
172
449
|
.command('list')
|
|
@@ -174,22 +451,20 @@ export function registerConfigCommand(program) {
|
|
|
174
451
|
.option('--json', 'Output as JSON')
|
|
175
452
|
.action((options) => {
|
|
176
453
|
const config = getGlobalConfig();
|
|
454
|
+
const redactedConfig = redactConfigSecrets(config);
|
|
177
455
|
if (options.json) {
|
|
178
|
-
console.log(JSON.stringify(
|
|
456
|
+
console.log(JSON.stringify(redactedConfig, null, 2));
|
|
179
457
|
}
|
|
180
458
|
else {
|
|
181
459
|
// Read raw config to determine which values are explicit vs defaults
|
|
182
|
-
const configPath = getGlobalConfigPath();
|
|
183
460
|
let rawConfig = {};
|
|
184
461
|
try {
|
|
185
|
-
|
|
186
|
-
rawConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
187
|
-
}
|
|
462
|
+
rawConfig = readGlobalConfigRaw();
|
|
188
463
|
}
|
|
189
464
|
catch {
|
|
190
465
|
// If reading fails, treat all as defaults
|
|
191
466
|
}
|
|
192
|
-
console.log(formatValueYaml(
|
|
467
|
+
console.log(formatValueYaml(redactedConfig));
|
|
193
468
|
// Annotate profile settings
|
|
194
469
|
const profileSource = rawConfig.profile !== undefined ? '(explicit)' : '(default)';
|
|
195
470
|
const deliverySource = rawConfig.delivery !== undefined ? '(explicit)' : '(default)';
|
|
@@ -205,6 +480,23 @@ export function registerConfigCommand(program) {
|
|
|
205
480
|
else {
|
|
206
481
|
console.log(` workflows: (none)`);
|
|
207
482
|
}
|
|
483
|
+
const cacheTiers = getGlobalCacheTierDirs();
|
|
484
|
+
console.log(`\nCache settings:`);
|
|
485
|
+
console.log(` root: ${getGlobalCacheDir()}`);
|
|
486
|
+
console.log(` tiers: ${Object.keys(cacheTiers).join(', ')}`);
|
|
487
|
+
const redisBoundary = resolveRedisBoundaryConfig(process.env, config);
|
|
488
|
+
const redisStatus = redisBoundary.validationErrors.length > 0
|
|
489
|
+
? 'blocked'
|
|
490
|
+
: redisBoundary.requested
|
|
491
|
+
? 'requested-unavailable or ready after ping'
|
|
492
|
+
: 'disabled';
|
|
493
|
+
console.log(`\nRedis boundary:`);
|
|
494
|
+
console.log(` status: ${redisStatus}`);
|
|
495
|
+
console.log(` namespace: ${redisBoundary.namespace}`);
|
|
496
|
+
console.log(` fallback: ${redisBoundary.fallback}`);
|
|
497
|
+
if (redisBoundary.redactedUrl) {
|
|
498
|
+
console.log(` url: ${redisBoundary.redactedUrl}`);
|
|
499
|
+
}
|
|
208
500
|
}
|
|
209
501
|
});
|
|
210
502
|
// config get
|
|
@@ -218,6 +510,10 @@ export function registerConfigCommand(program) {
|
|
|
218
510
|
process.exitCode = 1;
|
|
219
511
|
return;
|
|
220
512
|
}
|
|
513
|
+
if (isSensitiveConfigPath(key)) {
|
|
514
|
+
console.log('[REDACTED]');
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
221
517
|
if (typeof value === 'object' && value !== null) {
|
|
222
518
|
console.log(JSON.stringify(value));
|
|
223
519
|
}
|
|
@@ -257,7 +553,11 @@ export function registerConfigCommand(program) {
|
|
|
257
553
|
// Apply changes and save
|
|
258
554
|
setNestedValue(config, key, coercedValue);
|
|
259
555
|
saveGlobalConfig(config);
|
|
260
|
-
const displayValue =
|
|
556
|
+
const displayValue = isSensitiveConfigPath(key)
|
|
557
|
+
? '[REDACTED]'
|
|
558
|
+
: typeof coercedValue === 'string'
|
|
559
|
+
? `"${coercedValue}"`
|
|
560
|
+
: String(coercedValue);
|
|
261
561
|
console.log(`Set ${key} = ${displayValue}`);
|
|
262
562
|
});
|
|
263
563
|
// config unset
|
|
@@ -351,7 +651,7 @@ export function registerConfigCommand(program) {
|
|
|
351
651
|
});
|
|
352
652
|
try {
|
|
353
653
|
const rawConfig = fs.readFileSync(configPath, 'utf-8');
|
|
354
|
-
const parsedConfig =
|
|
654
|
+
const parsedConfig = parseTomlContent(rawConfig);
|
|
355
655
|
const validation = validateConfig(parsedConfig);
|
|
356
656
|
if (!validation.success) {
|
|
357
657
|
console.error(`Error: Invalid configuration - ${validation.error}`);
|
|
@@ -363,7 +663,7 @@ export function registerConfigCommand(program) {
|
|
|
363
663
|
console.error(`Error: Config file not found at ${configPath}`);
|
|
364
664
|
}
|
|
365
665
|
else if (error instanceof SyntaxError) {
|
|
366
|
-
console.error(`Error: Invalid
|
|
666
|
+
console.error(`Error: Invalid TOML in ${configPath}`);
|
|
367
667
|
console.error(error.message);
|
|
368
668
|
}
|
|
369
669
|
else {
|
|
@@ -377,7 +677,7 @@ export function registerConfigCommand(program) {
|
|
|
377
677
|
.command('profile [preset]')
|
|
378
678
|
.description('Configure workflow profile (interactive picker or preset shortcut)')
|
|
379
679
|
.action(async (preset) => {
|
|
380
|
-
// Preset shortcut: `
|
|
680
|
+
// Preset shortcut: `codesdd config profile core`
|
|
381
681
|
if (preset === 'core') {
|
|
382
682
|
const config = getGlobalConfig();
|
|
383
683
|
config.profile = 'core';
|
|
@@ -517,10 +817,10 @@ export function registerConfigCommand(program) {
|
|
|
517
817
|
config.delivery = nextState.delivery;
|
|
518
818
|
config.workflows = nextState.workflows;
|
|
519
819
|
saveGlobalConfig(config);
|
|
520
|
-
// Check if inside
|
|
820
|
+
// Check if inside a legacy spec compatibility project
|
|
521
821
|
const projectDir = process.cwd();
|
|
522
|
-
const
|
|
523
|
-
if (fs.existsSync(
|
|
822
|
+
const codesddDir = resolveLegacySpecLiveRoot(projectDir);
|
|
823
|
+
if (fs.existsSync(codesddDir)) {
|
|
524
824
|
const applyNow = await confirm({
|
|
525
825
|
message: 'Apply changes to this project now?',
|
|
526
826
|
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
|