@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
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { inspectPluginManifestFromFile, planDevTrackApiScaffoldDryRunFromFile, planPluginInvocationFromFile, } from '../../core/sdd/plugin-cli.js';
|
|
3
|
+
import { parseCsvOption } from './shared.js';
|
|
4
|
+
export function registerPluginCommands(sddCmd) {
|
|
5
|
+
const pluginCmd = sddCmd.command('plugin').description('Inspect and plan enterprise plugin operations');
|
|
6
|
+
pluginCmd
|
|
7
|
+
.command('inspect <manifestPath>')
|
|
8
|
+
.description('Inspect a CodeSDD plugin manifest without executing it')
|
|
9
|
+
.option('--json', 'Return plugin manifest summary as JSON')
|
|
10
|
+
.action(async (manifestPath, options) => {
|
|
11
|
+
const result = await inspectPluginManifestFromFile(manifestPath);
|
|
12
|
+
if (options?.json) {
|
|
13
|
+
console.log(JSON.stringify(result, null, 2));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
printInspectResult(result);
|
|
17
|
+
});
|
|
18
|
+
pluginCmd
|
|
19
|
+
.command('plan <manifestPath>')
|
|
20
|
+
.description('Build a non-executing runtime invocation plan for a plugin capability')
|
|
21
|
+
.requiredOption('--feature <ref>', 'Feature reference that owns the operation, for example FEAT-0148')
|
|
22
|
+
.requiredOption('--capability <name>', 'Plugin capability to resolve, for example scaffold.project')
|
|
23
|
+
.option('--skill <ref>', 'Skill reference bound to the operation')
|
|
24
|
+
.option('--input <json>', 'JSON object passed as plugin capability input')
|
|
25
|
+
.option('--write-scope <list>', 'Comma-separated requested write scope')
|
|
26
|
+
.option('--apply', 'Plan an apply operation instead of dry-run')
|
|
27
|
+
.option('--rollback', 'Plan a rollback operation instead of dry-run')
|
|
28
|
+
.option('--approval <list>', 'Comma-separated approval grants: maintainer,security,architecture-board')
|
|
29
|
+
.option('--operation-id <id>', 'Stable operation id to use in the invocation envelope')
|
|
30
|
+
.option('--source-checksum <checksum>', 'Expected source checksum for policy evaluation')
|
|
31
|
+
.option('--planned-writes <list>', 'Comma-separated planned write paths for policy evaluation')
|
|
32
|
+
.option('--env <list>', 'Comma-separated requested environment variables')
|
|
33
|
+
.option('--network-domains <list>', 'Comma-separated requested network domains')
|
|
34
|
+
.option('--process-spawn', 'Declare that the operation requests process spawning')
|
|
35
|
+
.option('--project-root <path>', 'Project root used for standalone storage-boundary validation')
|
|
36
|
+
.option('--language <language>', 'Technology language constraint')
|
|
37
|
+
.option('--framework <framework>', 'Technology framework constraint')
|
|
38
|
+
.option('--json', 'Return invocation plan as JSON')
|
|
39
|
+
.action(async (manifestPath, options) => {
|
|
40
|
+
const result = await planPluginInvocationFromFile(manifestPath, {
|
|
41
|
+
feature_ref: options.feature,
|
|
42
|
+
capability: options.capability,
|
|
43
|
+
mode: resolvePlanMode(options),
|
|
44
|
+
skill_ref: options.skill,
|
|
45
|
+
inputs: parseJsonObjectOption(options.input),
|
|
46
|
+
requested_write_scope: parseCsvOption(options.writeScope),
|
|
47
|
+
approval_grants: parseCsvOption(options.approval),
|
|
48
|
+
operation_id: options.operationId,
|
|
49
|
+
source_checksum: options.sourceChecksum,
|
|
50
|
+
planned_writes: parseCsvOption(options.plannedWrites),
|
|
51
|
+
requested_env: parseCsvOption(options.env),
|
|
52
|
+
network_domains: parseCsvOption(options.networkDomains),
|
|
53
|
+
process_spawn_requested: options.processSpawn ?? false,
|
|
54
|
+
project_root: options.projectRoot,
|
|
55
|
+
technology: resolveTechnologyConstraint(options),
|
|
56
|
+
});
|
|
57
|
+
if (options.json) {
|
|
58
|
+
console.log(JSON.stringify(result, null, 2));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
printPlanResult(result);
|
|
62
|
+
});
|
|
63
|
+
const devtrackApiCmd = pluginCmd.command('devtrack-api').description('Plan DevTrack API appliance operations');
|
|
64
|
+
devtrackApiCmd
|
|
65
|
+
.command('scaffold-dry-run <manifestPath>')
|
|
66
|
+
.description('Build a deterministic DevTrack API scaffold dry-run plan without executing the appliance')
|
|
67
|
+
.requiredOption('--feature <ref>', 'Feature reference that owns the scaffold operation, for example FEAT-0152')
|
|
68
|
+
.requiredOption('--project <name>', 'Project display name to scaffold')
|
|
69
|
+
.option('--package <name>', 'Package name to use in the scaffold plan')
|
|
70
|
+
.option('--operation-id <id>', 'Stable operation id to use in the dry-run plan')
|
|
71
|
+
.option('--write-scope <list>', 'Comma-separated requested write scope')
|
|
72
|
+
.option('--json', 'Return scaffold dry-run plan as JSON')
|
|
73
|
+
.action(async (manifestPath, options) => {
|
|
74
|
+
const result = await planDevTrackApiScaffoldDryRunFromFile(manifestPath, {
|
|
75
|
+
feature_ref: options.feature,
|
|
76
|
+
project_name: options.project,
|
|
77
|
+
package_name: options.package,
|
|
78
|
+
operation_id: options.operationId,
|
|
79
|
+
requested_write_scope: parseCsvOption(options.writeScope),
|
|
80
|
+
});
|
|
81
|
+
if (options.json) {
|
|
82
|
+
console.log(JSON.stringify(result, null, 2));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
printDevTrackApiScaffoldDryRunResult(result);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function resolvePlanMode(options) {
|
|
89
|
+
if (options.apply && options.rollback) {
|
|
90
|
+
throw new Error('Use only one of --apply or --rollback.');
|
|
91
|
+
}
|
|
92
|
+
if (options.apply)
|
|
93
|
+
return 'apply';
|
|
94
|
+
if (options.rollback)
|
|
95
|
+
return 'rollback';
|
|
96
|
+
return 'dry-run';
|
|
97
|
+
}
|
|
98
|
+
function parseJsonObjectOption(value) {
|
|
99
|
+
if (!value)
|
|
100
|
+
return {};
|
|
101
|
+
const parsed = JSON.parse(value);
|
|
102
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
103
|
+
throw new Error('--input must be a JSON object.');
|
|
104
|
+
}
|
|
105
|
+
return parsed;
|
|
106
|
+
}
|
|
107
|
+
function resolveTechnologyConstraint(options) {
|
|
108
|
+
if (!options.language && !options.framework) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
language: options.language,
|
|
113
|
+
framework: options.framework,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function printInspectResult(result) {
|
|
117
|
+
console.log(chalk.green(`Plugin: ${result.plugin_ref.id}@${result.plugin_ref.version}`));
|
|
118
|
+
console.log(`Manifest: ${result.manifest_path}`);
|
|
119
|
+
console.log(`Contract: ${result.contract_version}`);
|
|
120
|
+
console.log(`Technology: ${result.technology.language}${result.technology.framework ? `/${result.technology.framework}` : ''}`);
|
|
121
|
+
console.log(`Trust: ${result.governance.trust_tier}`);
|
|
122
|
+
console.log(`Capabilities: ${result.capabilities.map((capability) => capability.name).join(', ')}`);
|
|
123
|
+
}
|
|
124
|
+
function printPlanResult(result) {
|
|
125
|
+
const { plan } = result;
|
|
126
|
+
console.log(chalk.green(`Plugin plan: ${plan.status}`));
|
|
127
|
+
console.log(`Manifest: ${result.manifest_path}`);
|
|
128
|
+
console.log(`Policy: ${plan.policy?.decision ?? 'not-evaluated'}`);
|
|
129
|
+
console.log(`Standalone runner: ${result.workcell_runner.standalone.status}`);
|
|
130
|
+
console.log(`Package governance: ${result.workcell_runner.standalone.package_governance.status}`);
|
|
131
|
+
console.log(`Storage boundary: ${result.workcell_runner.standalone.storage_boundary.status}`);
|
|
132
|
+
if (plan.envelope) {
|
|
133
|
+
console.log(`Operation: ${plan.envelope.operation_id}`);
|
|
134
|
+
console.log(`Plugin: ${plan.envelope.plugin_ref.id}@${plan.envelope.plugin_ref.version}`);
|
|
135
|
+
console.log(`Capability: ${plan.envelope.capability}`);
|
|
136
|
+
console.log(`Mode: ${plan.envelope.mode}`);
|
|
137
|
+
console.log(`Write scope: ${plan.envelope.write_scope.join(', ') || 'none'}`);
|
|
138
|
+
}
|
|
139
|
+
if (plan.reasons.length > 0) {
|
|
140
|
+
console.log(`Reasons: ${plan.reasons.join(' | ')}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function printDevTrackApiScaffoldDryRunResult(result) {
|
|
144
|
+
const { plan } = result;
|
|
145
|
+
console.log(chalk.green(`DevTrack API scaffold dry-run: ${plan.status}`));
|
|
146
|
+
console.log(`Manifest: ${result.manifest_path}`);
|
|
147
|
+
console.log(`Project: ${plan.project_name}`);
|
|
148
|
+
console.log(`Package: ${plan.package_name}`);
|
|
149
|
+
if (plan.status === 'planned') {
|
|
150
|
+
console.log(`Operation: ${plan.operation_id}`);
|
|
151
|
+
console.log(`Artifacts: ${plan.artifacts.length}`);
|
|
152
|
+
console.log(`Policy: ${plan.runtime_plan.policy?.decision ?? 'not-evaluated'}`);
|
|
153
|
+
}
|
|
154
|
+
if (plan.issues.length > 0) {
|
|
155
|
+
console.log(`Issues: ${plan.issues.join(' | ')}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -2,6 +2,7 @@ import { type SddLanguage, type SddLayout } from '../../core/sdd/state.js';
|
|
|
2
2
|
import type { FlowMode } from '../../core/sdd/types.js';
|
|
3
3
|
export declare function parseCsvOption(value?: string): string[];
|
|
4
4
|
export declare function resolveRoot(targetPath?: string): string;
|
|
5
|
+
export declare function resolveInitRoot(targetPath?: string): string;
|
|
5
6
|
export declare function parseLangOption(value?: string): SddLanguage | undefined;
|
|
6
7
|
export declare function parseLayoutOption(value?: string): SddLayout | undefined;
|
|
7
8
|
export declare function parseFlowModeOption(value?: string): FlowMode | undefined;
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { promises as fs } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import chalk from 'chalk';
|
|
4
3
|
import { resolveProjectRoot } from '../../core/sdd/resolve-project-root.js';
|
|
5
4
|
import { loadProjectSddConfig, resolveSddPaths, } from '../../core/sdd/state.js';
|
|
6
|
-
import { assessSddMigration
|
|
7
|
-
import { withStateLock } from '../../core/sdd/state-lock.js';
|
|
8
|
-
import { isInteractive } from '../../utils/interactive.js';
|
|
5
|
+
import { assessSddMigration } from '../../core/sdd/migrate.js';
|
|
9
6
|
export function parseCsvOption(value) {
|
|
10
7
|
if (!value)
|
|
11
8
|
return [];
|
|
@@ -17,6 +14,15 @@ export function parseCsvOption(value) {
|
|
|
17
14
|
export function resolveRoot(targetPath = '.') {
|
|
18
15
|
return resolveProjectRoot(targetPath === '.' ? undefined : targetPath);
|
|
19
16
|
}
|
|
17
|
+
export function resolveInitRoot(targetPath = '.') {
|
|
18
|
+
const absoluteTarget = path.resolve(targetPath);
|
|
19
|
+
const segments = absoluteTarget.split(path.sep);
|
|
20
|
+
const sddIndex = segments.lastIndexOf('.sdd');
|
|
21
|
+
if (sddIndex >= 0) {
|
|
22
|
+
return segments.slice(0, sddIndex).join(path.sep) || path.parse(absoluteTarget).root;
|
|
23
|
+
}
|
|
24
|
+
return absoluteTarget;
|
|
25
|
+
}
|
|
20
26
|
export function parseLangOption(value) {
|
|
21
27
|
if (!value)
|
|
22
28
|
return undefined;
|
|
@@ -62,23 +68,6 @@ export async function ensureMandatorySddMigration(targetPath) {
|
|
|
62
68
|
return;
|
|
63
69
|
}
|
|
64
70
|
const summary = assessment.reasons.join(' | ');
|
|
65
|
-
|
|
66
|
-
const { confirm } = await import('@inquirer/prompts');
|
|
67
|
-
const approved = await confirm({
|
|
68
|
-
message: `Migracao SDD obrigatoria detectada. Deseja aplicar agora para continuar? ${summary}`,
|
|
69
|
-
default: true,
|
|
70
|
-
});
|
|
71
|
-
if (!approved) {
|
|
72
|
-
throw new Error('Operacao interrompida: aplique a migracao SDD mandatória com `openspec sdd migrate`.');
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
const stateDir = path.dirname(paths.stateFiles.discoveryIndex);
|
|
76
|
-
const result = await withStateLock(stateDir, async () => {
|
|
77
|
-
const command = new SddMigrateCommand();
|
|
78
|
-
return command.execute(resolved, { radToEpic: true });
|
|
79
|
-
});
|
|
80
|
-
for (const message of result.messages) {
|
|
81
|
-
console.log(chalk.yellow(`[sdd:migrate] ${message}`));
|
|
82
|
-
}
|
|
71
|
+
throw new Error(`Migracao SDD obrigatoria detectada: ${summary}. Execute \`codesdd sdd migrate --yes\` e reexecute o comando.`);
|
|
83
72
|
}
|
|
84
73
|
//# sourceMappingURL=shared.js.map
|
|
@@ -62,6 +62,13 @@ export function registerSkillsCommands(sddCmd) {
|
|
|
62
62
|
console.log(chalk.green(`Skills sincronizadas: ${result.synced}`));
|
|
63
63
|
console.log(`Skills locais (${localSkillsPath}): ${result.local_synced}`);
|
|
64
64
|
console.log(`Ferramentas atualizadas: ${result.tools.length > 0 ? result.tools.join(', ') : 'nenhuma'}`);
|
|
65
|
+
if (result.alerts.length > 0) {
|
|
66
|
+
console.log(chalk.yellow(`Alertas de user-extension (nao bloqueante): ${result.alerts.length}`));
|
|
67
|
+
for (const alert of result.alerts) {
|
|
68
|
+
const expected = alert.expected_sha256 || '<missing>';
|
|
69
|
+
console.log(`- ${alert.skill_id}: ${alert.status} (expected=${expected}, observed=${alert.observed_sha256})`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
65
72
|
});
|
|
66
73
|
skillsCmd
|
|
67
74
|
.command('suggest [path]')
|
package/dist/commands/sdd.js
CHANGED
|
@@ -5,8 +5,9 @@ import { SddInitCommand, SddInitContextCommand } from '../core/sdd/init.js';
|
|
|
5
5
|
import { SddCheckCommand } from '../core/sdd/check.js';
|
|
6
6
|
import { loadProjectSddConfig, resolveSddPaths, } from '../core/sdd/state.js';
|
|
7
7
|
import { assessSddMigration, SddMigrateCommand } from '../core/sdd/migrate.js';
|
|
8
|
+
import { formatUpgradeToCodeSddReadiness, UpgradeToCodeSddCommand, } from '../core/sdd/upgrade-to-codesdd.js';
|
|
8
9
|
import { MigrateWorkspaceCommand } from '../core/sdd/migrate-workspace.js';
|
|
9
|
-
import {
|
|
10
|
+
import { SddImportLegacySpecCommand } from '../core/sdd/import-legacy-spec.js';
|
|
10
11
|
import { isInteractive } from '../utils/interactive.js';
|
|
11
12
|
import { createSddStores } from "../core/sdd/store/sdd-stores.js";
|
|
12
13
|
import { InsightService } from "../core/sdd/services/insight.service.js";
|
|
@@ -22,13 +23,50 @@ import { SddRebuildService, formatSddRebuildReport } from "../core/sdd/services/
|
|
|
22
23
|
import { SddMetricsService, formatSddMetricsReport } from "../core/sdd/services/metrics.service.js";
|
|
23
24
|
import { FeatureLintService, formatFeatureLintReport } from "../core/sdd/services/feature-lint.service.js";
|
|
24
25
|
import { SddDedupApplyService, formatSddDedupApplyReport } from "../core/sdd/services/dedup-apply.service.js";
|
|
26
|
+
import { evaluateSddIntentGuard } from '../core/sdd/intent-guard.js';
|
|
25
27
|
import { captureFingerprintsForChange, writeMeta } from '../core/sdd/fingerprint.js';
|
|
26
|
-
import { ensureMandatorySddMigration, parseCsvOption, parseFlowModeOption, parseLangOption, parseLayoutOption, resolveRoot, } from './sdd/shared.js';
|
|
28
|
+
import { ensureMandatorySddMigration, parseCsvOption, parseFlowModeOption, parseLangOption, parseLayoutOption, resolveInitRoot, resolveRoot, } from './sdd/shared.js';
|
|
27
29
|
import { registerExecutionCommands } from './sdd/execution.js';
|
|
30
|
+
import { registerPluginCommands } from './sdd/plugin.js';
|
|
28
31
|
import { registerSkillsCommands } from './sdd/skills.js';
|
|
29
|
-
import {
|
|
32
|
+
import { registerBacklogCommands } from './sdd/backlog.js';
|
|
33
|
+
import { displayLegacySpecPath, resolveLegacySpecSubpath, } from '../core/sdd/services/legacy-capability.service.js';
|
|
30
34
|
export function registerSddCommand(program) {
|
|
31
35
|
const sddCmd = program.command('sdd').description('SDD memory operations');
|
|
36
|
+
sddCmd
|
|
37
|
+
.command('intent-guard')
|
|
38
|
+
.description('Classifica uma solicitacao e informa quando o fluxo CodeSDD e obrigatorio')
|
|
39
|
+
.alias('guarda-intencao')
|
|
40
|
+
.requiredOption('--request <text>', 'Texto da solicitacao do usuario/agente')
|
|
41
|
+
.option('--feat <FEAT-ID>', 'FEAT ja selecionada para o contexto CodeSDD')
|
|
42
|
+
.option('--strict', 'Retorna exit code 2 quando a solicitacao exige CodeSDD e nenhuma FEAT foi informada')
|
|
43
|
+
.option('--json', 'Saida em JSON')
|
|
44
|
+
.action((options) => {
|
|
45
|
+
const result = evaluateSddIntentGuard({
|
|
46
|
+
request: options?.request ?? '',
|
|
47
|
+
featureRef: options?.feat,
|
|
48
|
+
});
|
|
49
|
+
if (options?.json) {
|
|
50
|
+
console.log(JSON.stringify(result, null, 2));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.log(`Classificacao: ${result.classification}`);
|
|
54
|
+
console.log(`Requer CodeSDD: ${result.requires_codesdd_planning ? 'sim' : 'nao'}`);
|
|
55
|
+
console.log(`Motivo: ${result.reason}`);
|
|
56
|
+
if (result.required_commands.length > 0) {
|
|
57
|
+
console.log('Comandos obrigatorios:');
|
|
58
|
+
for (const command of result.required_commands) {
|
|
59
|
+
console.log(`- ${command}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
for (const warning of result.warnings) {
|
|
63
|
+
console.log(chalk.yellow(`Aviso: ${warning}`));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (options?.strict && result.requires_codesdd_planning && !result.feature_ref) {
|
|
67
|
+
process.exitCode = 2;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
32
70
|
sddCmd
|
|
33
71
|
.command('init [path]')
|
|
34
72
|
.description('Initializes the .sdd structure and base state files')
|
|
@@ -38,7 +76,7 @@ export function registerSddCommand(program) {
|
|
|
38
76
|
.option('--layout <layout>', 'Folder layout: en-US|legacy|pt-BR')
|
|
39
77
|
.option('--no-render', 'Does not generate Markdown views after initialization')
|
|
40
78
|
.action(async (targetPath = '.', options) => {
|
|
41
|
-
const root =
|
|
79
|
+
const root = resolveInitRoot(targetPath);
|
|
42
80
|
const __config = await loadProjectSddConfig(root);
|
|
43
81
|
const __paths = resolveSddPaths(root, __config);
|
|
44
82
|
const stores = createSddStores(__paths);
|
|
@@ -69,6 +107,9 @@ export function registerSddCommand(program) {
|
|
|
69
107
|
.alias('iniciar-contexto')
|
|
70
108
|
.option('--mode <mode>', 'Modo de escrita: merge|replace (padrao: merge)')
|
|
71
109
|
.option('--no-deep', 'Desativa inspecao profunda de estrutura de repositorio')
|
|
110
|
+
.option('--frontend', 'Ativa arquivos e views de frontend durante o bootstrap')
|
|
111
|
+
.option('--lang <lang>', 'Idioma SDD: pt-BR|en-US')
|
|
112
|
+
.option('--layout <layout>', 'Layout de pastas: en-US|legacy|pt-BR')
|
|
72
113
|
.option('--no-render', 'Nao gera views apos bootstrap de contexto')
|
|
73
114
|
.option('--json', 'Saida em JSON')
|
|
74
115
|
.action(async (targetPath = '.', options) => {
|
|
@@ -84,6 +125,9 @@ export function registerSddCommand(program) {
|
|
|
84
125
|
mode: options?.mode,
|
|
85
126
|
deep: options?.deep,
|
|
86
127
|
render: options?.render,
|
|
128
|
+
frontendEnabled: options?.frontend,
|
|
129
|
+
language: parseLangOption(options?.lang),
|
|
130
|
+
layout: parseLayoutOption(options?.layout),
|
|
87
131
|
});
|
|
88
132
|
if (options?.json) {
|
|
89
133
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -113,8 +157,8 @@ export function registerSddCommand(program) {
|
|
|
113
157
|
if (!options?.backfill) {
|
|
114
158
|
throw new Error('Use --backfill para executar esta operação.');
|
|
115
159
|
}
|
|
116
|
-
const changeRoot =
|
|
117
|
-
const mainSpecsDir =
|
|
160
|
+
const changeRoot = resolveLegacySpecSubpath(root, 'changes');
|
|
161
|
+
const mainSpecsDir = resolveLegacySpecSubpath(root, 'specs');
|
|
118
162
|
await fs.access(changeRoot);
|
|
119
163
|
let changeIds;
|
|
120
164
|
if (options?.ref) {
|
|
@@ -124,7 +168,7 @@ export function registerSddCommand(program) {
|
|
|
124
168
|
const requestedChangeDir = path.join(changeRoot, options.ref);
|
|
125
169
|
const stat = await fs.stat(requestedChangeDir);
|
|
126
170
|
if (!stat.isDirectory()) {
|
|
127
|
-
throw new Error(`Change '${options.ref}' nao encontrado em ${
|
|
171
|
+
throw new Error(`Change '${options.ref}' nao encontrado em ${displayLegacySpecPath('changes')}`);
|
|
128
172
|
}
|
|
129
173
|
changeIds = [options.ref];
|
|
130
174
|
}
|
|
@@ -341,6 +385,8 @@ export function registerSddCommand(program) {
|
|
|
341
385
|
console.log(`Duplicatas puladas: ${result.skipped_duplicates.length}`);
|
|
342
386
|
});
|
|
343
387
|
registerExecutionCommands(sddCmd);
|
|
388
|
+
registerPluginCommands(sddCmd);
|
|
389
|
+
registerBacklogCommands(sddCmd);
|
|
344
390
|
sddCmd
|
|
345
391
|
.command('check [path]')
|
|
346
392
|
.description('Valida arquivos de estado .sdd e opcionalmente gera views')
|
|
@@ -367,7 +413,7 @@ export function registerSddCommand(program) {
|
|
|
367
413
|
console.log(`Registros de discovery: ${report.summary.discovery}`);
|
|
368
414
|
console.log(`Itens de backlog: ${report.summary.backlog}`);
|
|
369
415
|
console.log(`Itens de divida tecnica: ${report.summary.techDebt}`);
|
|
370
|
-
console.log(`
|
|
416
|
+
console.log(`Registros de finalize: ${report.summary.finalizeQueue} (pendentes: ${report.summary.finalizeQueuePending}; concluidos: ${report.summary.finalizeQueueDone})`);
|
|
371
417
|
console.log(`Frontend ativado: ${report.summary.frontendEnabled ? 'sim' : 'nao'}`);
|
|
372
418
|
console.log(`Progresso global: ${report.summary.progress_global.percent}% (${report.summary.progress_global.done}/${report.summary.progress_global.total})`);
|
|
373
419
|
console.log(`Prontas para paralelo: ${report.summary.ready_for_parallel}`);
|
|
@@ -545,6 +591,52 @@ export function registerSddCommand(program) {
|
|
|
545
591
|
console.log(`- ${msg}`);
|
|
546
592
|
}
|
|
547
593
|
});
|
|
594
|
+
sddCmd
|
|
595
|
+
.command('upgrade-to-codesdd')
|
|
596
|
+
.description('Plans, applies, or rolls back a transactional upgrade to the CodeSDD SDD contract')
|
|
597
|
+
.option('--dry-run', 'Preview readiness and planned steps without writing files')
|
|
598
|
+
.option('--apply', 'Apply the transactional upgrade')
|
|
599
|
+
.option('--yes', 'Confirm transactional mutation')
|
|
600
|
+
.option('--rollback <transactionId>', 'Rollback a previous upgrade transaction id')
|
|
601
|
+
.option('--reason <reason>', 'Rollback reason used with --rollback')
|
|
602
|
+
.option('--json', 'JSON output')
|
|
603
|
+
.action(async (options) => {
|
|
604
|
+
const root = resolveRoot();
|
|
605
|
+
const command = new UpgradeToCodeSddCommand();
|
|
606
|
+
if (options?.rollback) {
|
|
607
|
+
if (options.apply || options.dryRun) {
|
|
608
|
+
throw new Error('Use --rollback without --apply or --dry-run.');
|
|
609
|
+
}
|
|
610
|
+
const result = await command.rollback(root, options.rollback, {
|
|
611
|
+
reason: options.reason,
|
|
612
|
+
});
|
|
613
|
+
if (options.json) {
|
|
614
|
+
console.log(JSON.stringify(result, null, 2));
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
console.log(chalk.green(`Upgrade rollback completed: ${result.transaction_id}`));
|
|
618
|
+
console.log(`Manifest: ${result.manifest_path}`);
|
|
619
|
+
console.log(`Restored: ${result.restored_paths.join(', ') || '-'}`);
|
|
620
|
+
console.log(`Skipped: ${result.skipped_paths.join(', ') || '-'}`);
|
|
621
|
+
console.log(`Reason: ${result.reason}`);
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
const result = await command.execute(root, {
|
|
625
|
+
dryRun: options?.dryRun || !options?.apply,
|
|
626
|
+
apply: options?.apply,
|
|
627
|
+
yes: options?.yes,
|
|
628
|
+
});
|
|
629
|
+
if (options?.json) {
|
|
630
|
+
console.log(JSON.stringify(result, null, 2));
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
console.log(formatUpgradeToCodeSddReadiness(result.readiness));
|
|
634
|
+
if (result.mode === 'apply') {
|
|
635
|
+
console.log(chalk.green('Transactional upgrade applied.'));
|
|
636
|
+
console.log(`Transaction: ${result.manifest?.transaction_id}`);
|
|
637
|
+
console.log(`Manifest: ${result.manifest_path}`);
|
|
638
|
+
}
|
|
639
|
+
});
|
|
548
640
|
sddCmd
|
|
549
641
|
.command('migrate-workspace')
|
|
550
642
|
.description('Migra workspaces SDD legados de Markdown para YAML validado')
|
|
@@ -586,11 +678,11 @@ export function registerSddCommand(program) {
|
|
|
586
678
|
}
|
|
587
679
|
});
|
|
588
680
|
sddCmd
|
|
589
|
-
.command('import-
|
|
590
|
-
.description('Imports legacy
|
|
591
|
-
.alias('importar-
|
|
681
|
+
.command('import-legacy-spec [path]')
|
|
682
|
+
.description('Imports legacy legacy-spec/ state into .sdd sources and source-index')
|
|
683
|
+
.alias('importar-codesdd')
|
|
592
684
|
.option('--dry-run', 'Preview import without writing files')
|
|
593
|
-
.option('--remove', 'Remove
|
|
685
|
+
.option('--remove', 'Remove legacy-spec/ after successful import verification')
|
|
594
686
|
.option('--yes', 'Confirm destructive removal when --remove is used')
|
|
595
687
|
.option('--json', 'JSON output')
|
|
596
688
|
.option('--no-render', 'Does not generate views after updating state')
|
|
@@ -600,7 +692,7 @@ export function registerSddCommand(program) {
|
|
|
600
692
|
const __paths = resolveSddPaths(root, __config);
|
|
601
693
|
const stores = createSddStores(__paths);
|
|
602
694
|
await ensureMandatorySddMigration(root);
|
|
603
|
-
const command = new
|
|
695
|
+
const command = new SddImportLegacySpecCommand();
|
|
604
696
|
const result = await command.execute(root, {
|
|
605
697
|
dryRun: options?.dryRun,
|
|
606
698
|
remove: options?.remove,
|
|
@@ -611,7 +703,7 @@ export function registerSddCommand(program) {
|
|
|
611
703
|
console.log(JSON.stringify(result, null, 2));
|
|
612
704
|
return;
|
|
613
705
|
}
|
|
614
|
-
console.log(chalk.green('
|
|
706
|
+
console.log(chalk.green('Legacy spec import completed.'));
|
|
615
707
|
console.log(`Source root: ${result.source_root}`);
|
|
616
708
|
console.log(`Target root: ${result.target_root}`);
|
|
617
709
|
console.log(`Report: ${result.report_path}`);
|
|
@@ -619,7 +711,7 @@ export function registerSddCommand(program) {
|
|
|
619
711
|
console.log(`Files seen: ${result.files_seen}`);
|
|
620
712
|
console.log(`Files copied: ${result.files_copied}`);
|
|
621
713
|
console.log(`Sources indexed: ${result.sources_indexed}`);
|
|
622
|
-
console.log(`Removed
|
|
714
|
+
console.log(`Removed legacy-spec/: ${result.removed_source_root ? 'yes' : 'no'}`);
|
|
623
715
|
const categories = Object.entries(result.categories)
|
|
624
716
|
.map(([name, count]) => `${name}=${count}`)
|
|
625
717
|
.join(', ');
|
package/dist/commands/spec.js
CHANGED
|
@@ -5,7 +5,7 @@ import { Validator } from '../core/validation/validator.js';
|
|
|
5
5
|
import { isInteractive } from '../utils/interactive.js';
|
|
6
6
|
import { getSpecIds } from '../utils/item-discovery.js';
|
|
7
7
|
import { CLI_NAME } from '../core/branding.js';
|
|
8
|
-
import {
|
|
8
|
+
import { displayLegacySpecPath, resolveLegacySpecSubpath, } from '../core/sdd/services/legacy-capability.service.js';
|
|
9
9
|
const SPECS_DIR = 'specs';
|
|
10
10
|
function parseSpecFromFile(specPath, specId) {
|
|
11
11
|
const content = readFileSync(specPath, 'utf-8');
|
|
@@ -30,7 +30,7 @@ function filterSpec(spec, options) {
|
|
|
30
30
|
text: req.text,
|
|
31
31
|
scenarios: includeScenarios ? req.scenarios : [],
|
|
32
32
|
}));
|
|
33
|
-
const metadata = spec.metadata ?? { version: '1.0.0', format: '
|
|
33
|
+
const metadata = spec.metadata ?? { version: '1.0.0', format: 'codesdd' };
|
|
34
34
|
return {
|
|
35
35
|
name: spec.name,
|
|
36
36
|
overview: spec.overview,
|
|
@@ -63,9 +63,9 @@ export class SpecCommand {
|
|
|
63
63
|
throw new Error('Missing required argument <spec-id>');
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
-
const specPath =
|
|
66
|
+
const specPath = resolveLegacySpecSubpath(process.cwd(), this.SPECS_DIR, specId, 'spec.md');
|
|
67
67
|
if (!existsSync(specPath)) {
|
|
68
|
-
throw new Error(`Spec '${specId}' not found at ${
|
|
68
|
+
throw new Error(`Spec '${specId}' not found at ${displayLegacySpecPath('specs', specId, 'spec.md')}`);
|
|
69
69
|
}
|
|
70
70
|
if (options.json) {
|
|
71
71
|
if (options.requirements && options.requirement) {
|
|
@@ -79,7 +79,7 @@ export class SpecCommand {
|
|
|
79
79
|
overview: parsed.overview,
|
|
80
80
|
requirementCount: filtered.requirements.length,
|
|
81
81
|
requirements: filtered.requirements,
|
|
82
|
-
metadata: parsed.metadata ?? { version: '1.0.0', format: '
|
|
82
|
+
metadata: parsed.metadata ?? { version: '1.0.0', format: 'codesdd' },
|
|
83
83
|
};
|
|
84
84
|
console.log(JSON.stringify(output, null, 2));
|
|
85
85
|
return;
|
|
@@ -90,7 +90,7 @@ export class SpecCommand {
|
|
|
90
90
|
export function registerSpecCommand(rootProgram) {
|
|
91
91
|
const specCommand = rootProgram
|
|
92
92
|
.command('spec')
|
|
93
|
-
.description('Manage and view
|
|
93
|
+
.description('Manage and view specifications');
|
|
94
94
|
// Deprecation notice for noun-based commands
|
|
95
95
|
specCommand.hook('preAction', () => {
|
|
96
96
|
console.error(`Warning: The "${CLI_NAME} spec ..." commands are deprecated. Prefer verb-first commands (e.g., "${CLI_NAME} show", "${CLI_NAME} validate --specs").`);
|
|
@@ -120,7 +120,7 @@ export function registerSpecCommand(rootProgram) {
|
|
|
120
120
|
.option('--long', 'Show id and title with counts')
|
|
121
121
|
.action((options) => {
|
|
122
122
|
try {
|
|
123
|
-
const specsDir =
|
|
123
|
+
const specsDir = resolveLegacySpecSubpath(process.cwd(), SPECS_DIR);
|
|
124
124
|
if (!existsSync(specsDir)) {
|
|
125
125
|
console.log('No items found');
|
|
126
126
|
return;
|
|
@@ -194,9 +194,9 @@ export function registerSpecCommand(rootProgram) {
|
|
|
194
194
|
throw new Error('Missing required argument <spec-id>');
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
|
-
const specPath =
|
|
197
|
+
const specPath = resolveLegacySpecSubpath(process.cwd(), SPECS_DIR, specId, 'spec.md');
|
|
198
198
|
if (!existsSync(specPath)) {
|
|
199
|
-
throw new Error(`Spec '${specId}' not found at ${
|
|
199
|
+
throw new Error(`Spec '${specId}' not found at ${displayLegacySpecPath('specs', specId, 'spec.md')}`);
|
|
200
200
|
}
|
|
201
201
|
const validator = new Validator(options.strict);
|
|
202
202
|
const report = await validator.validateSpec(specPath);
|
|
@@ -4,7 +4,7 @@ import { isInteractive, resolveNoInteractive } from '../utils/interactive.js';
|
|
|
4
4
|
import { getActiveChangeIds, getSpecIds } from '../utils/item-discovery.js';
|
|
5
5
|
import { nearestMatches } from '../utils/match.js';
|
|
6
6
|
import { CLI_NAME } from '../core/branding.js';
|
|
7
|
-
import {
|
|
7
|
+
import { resolveLegacySpecSubpath } from '../core/sdd/services/legacy-capability.service.js';
|
|
8
8
|
export class ValidateCommand {
|
|
9
9
|
async execute(itemName, options = {}) {
|
|
10
10
|
const interactive = isInteractive(options);
|
|
@@ -100,7 +100,7 @@ export class ValidateCommand {
|
|
|
100
100
|
async validateByType(type, id, opts) {
|
|
101
101
|
const validator = new Validator(opts.strict);
|
|
102
102
|
if (type === 'change') {
|
|
103
|
-
const changeDir =
|
|
103
|
+
const changeDir = resolveLegacySpecSubpath(process.cwd(), 'changes', id);
|
|
104
104
|
const start = Date.now();
|
|
105
105
|
const report = await validator.validateChangeDeltaSpecs(changeDir);
|
|
106
106
|
const durationMs = Date.now() - start;
|
|
@@ -109,7 +109,7 @@ export class ValidateCommand {
|
|
|
109
109
|
process.exitCode = report.valid ? 0 : 1;
|
|
110
110
|
return;
|
|
111
111
|
}
|
|
112
|
-
const file =
|
|
112
|
+
const file = resolveLegacySpecSubpath(process.cwd(), 'specs', id, 'spec.md');
|
|
113
113
|
const start = Date.now();
|
|
114
114
|
const report = await validator.validateSpec(file);
|
|
115
115
|
const durationMs = Date.now() - start;
|
|
@@ -158,13 +158,13 @@ export class ValidateCommand {
|
|
|
158
158
|
]);
|
|
159
159
|
const DEFAULT_CONCURRENCY = 6;
|
|
160
160
|
const maxSuggestions = 5; // used by nearestMatches
|
|
161
|
-
const concurrency = normalizeConcurrency(opts.concurrency) ?? normalizeConcurrency(process.env.
|
|
161
|
+
const concurrency = normalizeConcurrency(opts.concurrency) ?? normalizeConcurrency(process.env.CODESDD_CONCURRENCY) ?? DEFAULT_CONCURRENCY;
|
|
162
162
|
const validator = new Validator(opts.strict);
|
|
163
163
|
const queue = [];
|
|
164
164
|
for (const id of changeIds) {
|
|
165
165
|
queue.push(async () => {
|
|
166
166
|
const start = Date.now();
|
|
167
|
-
const changeDir =
|
|
167
|
+
const changeDir = resolveLegacySpecSubpath(process.cwd(), 'changes', id);
|
|
168
168
|
const report = await validator.validateChangeDeltaSpecs(changeDir);
|
|
169
169
|
const durationMs = Date.now() - start;
|
|
170
170
|
return { id, type: 'change', valid: report.valid, issues: report.issues, durationMs };
|
|
@@ -173,7 +173,7 @@ export class ValidateCommand {
|
|
|
173
173
|
for (const id of specIds) {
|
|
174
174
|
queue.push(async () => {
|
|
175
175
|
const start = Date.now();
|
|
176
|
-
const file =
|
|
176
|
+
const file = resolveLegacySpecSubpath(process.cwd(), 'specs', id, 'spec.md');
|
|
177
177
|
const report = await validator.validateSpec(file);
|
|
178
178
|
const durationMs = Date.now() - start;
|
|
179
179
|
return { id, type: 'spec', valid: report.valid, issues: report.issues, durationMs };
|
|
@@ -8,7 +8,7 @@ import ora from 'ora';
|
|
|
8
8
|
import path from 'path';
|
|
9
9
|
import * as fs from 'fs';
|
|
10
10
|
import { loadChangeContext, generateInstructions, resolveSchema, } from '../../core/artifact-graph/index.js';
|
|
11
|
-
import {
|
|
11
|
+
import { resolveLegacySpecSubpath } from '../../core/sdd/services/legacy-capability.service.js';
|
|
12
12
|
import { validateChangeExists, validateSchemaExists, } from './shared.js';
|
|
13
13
|
import { CLI_NAME } from '../../core/branding.js';
|
|
14
14
|
// -----------------------------------------------------------------------------
|
|
@@ -228,7 +228,7 @@ function artifactOutputExists(changeDir, generates) {
|
|
|
228
228
|
export async function generateApplyInstructions(projectRoot, changeName, schemaName) {
|
|
229
229
|
// loadChangeContext will auto-detect schema from metadata if not provided
|
|
230
230
|
const context = loadChangeContext(projectRoot, changeName, schemaName);
|
|
231
|
-
const changeDir =
|
|
231
|
+
const changeDir = resolveLegacySpecSubpath(projectRoot, 'changes', changeName);
|
|
232
232
|
// Get the full schema to access the apply phase configuration
|
|
233
233
|
const schema = resolveSchema(context.schemaName, projectRoot);
|
|
234
234
|
const applyConfig = schema.apply;
|
|
@@ -272,19 +272,19 @@ export async function generateApplyInstructions(projectRoot, changeName, schemaN
|
|
|
272
272
|
let instruction;
|
|
273
273
|
if (missingArtifacts.length > 0) {
|
|
274
274
|
state = 'blocked';
|
|
275
|
-
instruction = `Cannot apply this change yet. Missing artifacts: ${missingArtifacts.join(', ')}.\nUse the
|
|
275
|
+
instruction = `Cannot apply this change yet. Missing artifacts: ${missingArtifacts.join(', ')}.\nUse the codesdd-continue-change skill or run ${CLI_NAME} instructions to create the missing artifacts first.`;
|
|
276
276
|
}
|
|
277
277
|
else if (tracksFile && !tracksFileExists) {
|
|
278
278
|
// Tracking file configured but doesn't exist yet
|
|
279
279
|
const tracksFilename = path.basename(tracksFile);
|
|
280
280
|
state = 'blocked';
|
|
281
|
-
instruction = `The ${tracksFilename} file is missing and must be created.\nUse
|
|
281
|
+
instruction = `The ${tracksFilename} file is missing and must be created.\nUse codesdd-continue-change or run ${CLI_NAME} instructions to generate the tracking file.`;
|
|
282
282
|
}
|
|
283
283
|
else if (tracksFile && tracksFileExists && total === 0) {
|
|
284
284
|
// Tracking file exists but contains no tasks
|
|
285
285
|
const tracksFilename = path.basename(tracksFile);
|
|
286
286
|
state = 'blocked';
|
|
287
|
-
instruction = `The ${tracksFilename} file exists but contains no tasks.\nAdd tasks to ${tracksFilename} or regenerate it with
|
|
287
|
+
instruction = `The ${tracksFilename} file exists but contains no tasks.\nAdd tasks to ${tracksFilename} or regenerate it with codesdd-continue-change.`;
|
|
288
288
|
}
|
|
289
289
|
else if (tracksFile && remaining === 0 && total > 0) {
|
|
290
290
|
state = 'all_done';
|
|
@@ -344,7 +344,7 @@ export function printApplyInstructionsText(instructions) {
|
|
|
344
344
|
console.log('### ⚠️ Blocked');
|
|
345
345
|
console.log();
|
|
346
346
|
console.log(`Missing artifacts: ${missingArtifacts.join(', ')}`);
|
|
347
|
-
console.log(`Use the
|
|
347
|
+
console.log(`Use the codesdd-continue-change skill or run ${CLI_NAME} instructions to create these first.`);
|
|
348
348
|
console.log();
|
|
349
349
|
}
|
|
350
350
|
// Context files (dynamically from schema)
|