@devtrack-solution/codesdd 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +17 -17
- package/.sdd/skills/curated/devtrack-api/SKILL.md +160 -28
- package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +1 -1
- package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +8 -7
- package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +93 -0
- package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +317 -0
- package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +95 -0
- package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +295 -0
- package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +4 -4
- package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +4 -0
- package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +2 -2
- package/LICENSE +1 -1
- package/README.md +243 -51
- package/bin/codesdd.js +3 -2
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +11 -558
- package/dist/cli/program.d.ts +14 -0
- package/dist/cli/program.js +645 -0
- package/dist/commands/change.js +5 -5
- package/dist/commands/completion.d.ts +1 -1
- package/dist/commands/completion.js +9 -2
- package/dist/commands/config.js +159 -20
- package/dist/commands/feedback.js +1 -1
- package/dist/commands/schema.d.ts +63 -0
- package/dist/commands/schema.js +12 -12
- package/dist/commands/sdd/backlog.d.ts +3 -0
- package/dist/commands/sdd/backlog.js +54 -0
- package/dist/commands/sdd/execution.js +147 -16
- package/dist/commands/sdd/plugin.d.ts +3 -0
- package/dist/commands/sdd/plugin.js +153 -0
- package/dist/commands/sdd/shared.js +2 -23
- package/dist/commands/sdd/skills.js +7 -0
- package/dist/commands/sdd.js +69 -12
- package/dist/commands/spec.js +9 -9
- package/dist/commands/validate.js +6 -6
- package/dist/commands/workflow/instructions.js +6 -6
- package/dist/commands/workflow/new-change.js +3 -3
- package/dist/commands/workflow/shared.d.ts +1 -1
- package/dist/commands/workflow/shared.js +4 -4
- package/dist/core/archive.js +15 -5
- package/dist/core/artifact-graph/instruction-loader.d.ts +1 -1
- package/dist/core/artifact-graph/instruction-loader.js +3 -3
- package/dist/core/artifact-graph/resolver.d.ts +4 -4
- package/dist/core/artifact-graph/resolver.js +6 -6
- package/dist/core/branding.js +3 -3
- package/dist/core/cli/command-matrix.js +10 -1
- package/dist/core/cli-command-quality.d.ts +27 -0
- package/dist/core/cli-command-quality.js +171 -0
- package/dist/core/command-generation/adapters/costrict.d.ts +1 -1
- package/dist/core/command-generation/adapters/costrict.js +2 -2
- package/dist/core/command-generation/types.d.ts +1 -1
- package/dist/core/completions/command-registry.d.ts +1 -1
- package/dist/core/completions/command-registry.js +155 -12
- package/dist/core/completions/completion-provider.d.ts +14 -1
- package/dist/core/completions/completion-provider.js +29 -1
- package/dist/core/completions/generators/bash-generator.d.ts +1 -1
- package/dist/core/completions/generators/bash-generator.js +20 -12
- package/dist/core/completions/generators/fish-generator.d.ts +9 -1
- package/dist/core/completions/generators/fish-generator.js +39 -25
- package/dist/core/completions/generators/powershell-generator.d.ts +1 -1
- package/dist/core/completions/generators/powershell-generator.js +21 -11
- package/dist/core/completions/generators/zsh-generator.d.ts +3 -6
- package/dist/core/completions/generators/zsh-generator.js +21 -42
- package/dist/core/completions/installers/bash-installer.js +6 -6
- package/dist/core/completions/installers/fish-installer.js +1 -1
- package/dist/core/completions/installers/powershell-installer.js +14 -14
- package/dist/core/completions/installers/zsh-installer.d.ts +7 -1
- package/dist/core/completions/installers/zsh-installer.js +36 -8
- package/dist/core/completions/templates/bash-templates.d.ts +1 -1
- package/dist/core/completions/templates/bash-templates.js +12 -6
- package/dist/core/completions/templates/fish-templates.d.ts +2 -2
- package/dist/core/completions/templates/fish-templates.js +20 -9
- package/dist/core/completions/templates/powershell-templates.d.ts +1 -1
- package/dist/core/completions/templates/powershell-templates.js +13 -4
- package/dist/core/completions/templates/zsh-templates.d.ts +1 -1
- package/dist/core/completions/templates/zsh-templates.js +18 -9
- package/dist/core/config-schema.d.ts +3 -1
- package/dist/core/config-schema.js +26 -1
- package/dist/core/config.d.ts +3 -3
- package/dist/core/config.js +4 -4
- package/dist/core/global-config.d.ts +41 -12
- package/dist/core/global-config.js +344 -27
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/init.d.ts +6 -1
- package/dist/core/init.js +99 -77
- package/dist/core/legacy-cleanup.d.ts +17 -17
- package/dist/core/legacy-cleanup.js +96 -79
- package/dist/core/list.js +18 -4
- package/dist/core/migration.d.ts +3 -1
- package/dist/core/migration.js +7 -8
- package/dist/core/parsers/change-parser.js +1 -1
- package/dist/core/parsers/markdown-parser.js +2 -2
- package/dist/core/profile-sync-drift.d.ts +1 -1
- package/dist/core/profile-sync-drift.js +13 -13
- package/dist/core/project-config.d.ts +4 -4
- package/dist/core/project-config.js +11 -11
- package/dist/core/schemas/change.schema.d.ts +1 -1
- package/dist/core/schemas/change.schema.js +1 -1
- package/dist/core/schemas/spec.schema.d.ts +1 -1
- package/dist/core/schemas/spec.schema.js +1 -1
- package/dist/core/sdd/adr.js +23 -1
- package/dist/core/sdd/agent-binding.d.ts +346 -0
- package/dist/core/sdd/agent-binding.js +343 -0
- package/dist/core/sdd/backlog-cli.d.ts +16 -0
- package/dist/core/sdd/backlog-cli.js +146 -0
- package/dist/core/sdd/backlog-conflict-policy.d.ts +58 -0
- package/dist/core/sdd/backlog-conflict-policy.js +230 -0
- package/dist/core/sdd/backlog-projection.d.ts +8 -0
- package/dist/core/sdd/backlog-projection.js +89 -0
- package/dist/core/sdd/backlog-provider-contract.d.ts +252 -0
- package/dist/core/sdd/backlog-provider-contract.js +158 -0
- package/dist/core/sdd/bootstrap.js +2 -2
- package/dist/core/sdd/check.d.ts +42 -0
- package/dist/core/sdd/check.js +22 -22
- package/dist/core/sdd/contract.d.ts +13 -0
- package/dist/core/sdd/contract.js +36 -0
- package/dist/core/sdd/coordination/coordination-adapters.d.ts +38 -0
- package/dist/core/sdd/coordination/coordination-adapters.js +139 -1
- package/dist/core/sdd/deepagent-contracts.d.ts +276 -0
- package/dist/core/sdd/deepagent-contracts.js +173 -0
- package/dist/core/sdd/deepagents/adr-governor.d.ts +2 -0
- package/dist/core/sdd/deepagents/adr-governor.js +30 -0
- package/dist/core/sdd/deepagents/backend.d.ts +63 -0
- package/dist/core/sdd/deepagents/backend.js +174 -0
- package/dist/core/sdd/deepagents/codesdd-tools.d.ts +39 -0
- package/dist/core/sdd/deepagents/codesdd-tools.js +83 -0
- package/dist/core/sdd/deepagents/evidence-mapper.d.ts +86 -0
- package/dist/core/sdd/deepagents/evidence-mapper.js +178 -0
- package/dist/core/sdd/deepagents/model-provider.d.ts +53 -0
- package/dist/core/sdd/deepagents/model-provider.js +379 -0
- package/dist/core/sdd/deepagents/policy-enforcement.d.ts +30 -0
- package/dist/core/sdd/deepagents/policy-enforcement.js +90 -0
- package/dist/core/sdd/deepagents/policy.d.ts +75 -0
- package/dist/core/sdd/deepagents/policy.js +358 -0
- package/dist/core/sdd/deepagents/quality-witness.d.ts +3 -0
- package/dist/core/sdd/deepagents/quality-witness.js +77 -0
- package/dist/core/sdd/deepagents/reversa-subagents.d.ts +75 -0
- package/dist/core/sdd/deepagents/reversa-subagents.js +182 -0
- package/dist/core/sdd/deepagents/runtime-factory.d.ts +90 -0
- package/dist/core/sdd/deepagents/runtime-factory.js +231 -0
- package/dist/core/sdd/deepagents/runtime-loader.d.ts +16 -0
- package/dist/core/sdd/deepagents/runtime-loader.js +65 -0
- package/dist/core/sdd/default-bootstrap-files.d.ts +2 -2
- package/dist/core/sdd/default-bootstrap-files.js +36 -2
- package/dist/core/sdd/default-skills.d.ts +30 -0
- package/dist/core/sdd/default-skills.js +181 -5
- package/dist/core/sdd/devtrack-api-appliance.d.ts +84 -0
- package/dist/core/sdd/devtrack-api-appliance.js +257 -0
- package/dist/core/sdd/devtrack-api-architecture.d.ts +31 -0
- package/dist/core/sdd/devtrack-api-architecture.js +608 -0
- package/dist/core/sdd/devtrack-api-import-boundary.d.ts +19 -0
- package/dist/core/sdd/devtrack-api-import-boundary.js +32 -0
- package/dist/core/sdd/diagnose.d.ts +59 -0
- package/dist/core/sdd/diagnose.js +37 -37
- package/dist/core/sdd/docs-sync.js +33 -5
- package/dist/core/sdd/domain/post-active-validation.d.ts +7 -0
- package/dist/core/sdd/domain/post-active-validation.js +61 -0
- package/dist/core/sdd/domain/transition-engine.js +1 -0
- package/dist/core/sdd/entity-reference.d.ts +5 -0
- package/dist/core/sdd/entity-reference.js +22 -0
- package/dist/core/sdd/governance-backfill.d.ts +31 -0
- package/dist/core/sdd/governance-backfill.js +359 -0
- package/dist/core/sdd/governance-parser.d.ts +21 -0
- package/dist/core/sdd/governance-parser.js +91 -0
- package/dist/core/sdd/governance-schemas.d.ts +245 -0
- package/dist/core/sdd/governance-schemas.js +143 -0
- package/dist/core/sdd/{import-openspec.d.ts → import-legacy-spec.d.ts} +7 -7
- package/dist/core/sdd/{import-openspec.js → import-legacy-spec.js} +21 -29
- package/dist/core/sdd/init.d.ts +3 -0
- package/dist/core/sdd/init.js +6 -3
- package/dist/core/sdd/json-schema.js +100 -6
- package/dist/core/sdd/knowledge-graph.d.ts +45 -0
- package/dist/core/sdd/knowledge-graph.js +288 -0
- package/dist/core/sdd/legacy-operations.js +431 -43
- package/dist/core/sdd/lenses.d.ts +1 -0
- package/dist/core/sdd/lenses.js +29 -1
- package/dist/core/sdd/migrate-workspace.js +56 -2
- package/dist/core/sdd/migrate.d.ts +1 -1
- package/dist/core/sdd/migrate.js +36 -2
- package/dist/core/sdd/package-structure-gate.d.ts +83 -0
- package/dist/core/sdd/package-structure-gate.js +362 -0
- package/dist/core/sdd/parallel-feat-automation.d.ts +152 -0
- package/dist/core/sdd/parallel-feat-automation.js +212 -0
- package/dist/core/sdd/plugin-broker.d.ts +558 -0
- package/dist/core/sdd/plugin-broker.js +482 -0
- package/dist/core/sdd/plugin-certification.d.ts +79 -0
- package/dist/core/sdd/plugin-certification.js +453 -0
- package/dist/core/sdd/plugin-cli.d.ts +109 -0
- package/dist/core/sdd/plugin-cli.js +198 -0
- package/dist/core/sdd/plugin-evidence.d.ts +275 -0
- package/dist/core/sdd/plugin-evidence.js +307 -0
- package/dist/core/sdd/plugin-manifest.d.ts +164 -0
- package/dist/core/sdd/plugin-manifest.js +215 -0
- package/dist/core/sdd/plugin-policy-pack.d.ts +88 -0
- package/dist/core/sdd/plugin-policy-pack.js +236 -0
- package/dist/core/sdd/plugin-policy.d.ts +68 -0
- package/dist/core/sdd/plugin-policy.js +212 -0
- package/dist/core/sdd/plugin-registry.d.ts +311 -0
- package/dist/core/sdd/plugin-registry.js +138 -0
- package/dist/core/sdd/plugin-skill-binding.d.ts +151 -0
- package/dist/core/sdd/plugin-skill-binding.js +339 -0
- package/dist/core/sdd/quality-artifact-manifest-validator.d.ts +28 -0
- package/dist/core/sdd/quality-artifact-manifest-validator.js +167 -0
- package/dist/core/sdd/quality-evidence-renderer.d.ts +65 -0
- package/dist/core/sdd/quality-evidence-renderer.js +218 -0
- package/dist/core/sdd/quality-scenario-runner.d.ts +42 -0
- package/dist/core/sdd/quality-scenario-runner.js +613 -0
- package/dist/core/sdd/quality-validation.d.ts +547 -0
- package/dist/core/sdd/quality-validation.js +239 -0
- package/dist/core/sdd/resolve-project-root.d.ts +2 -2
- package/dist/core/sdd/resolve-project-root.js +11 -5
- package/dist/core/sdd/sanitize.d.ts +30 -1
- package/dist/core/sdd/sanitize.js +23 -23
- package/dist/core/sdd/services/agent-run.service.d.ts +65 -0
- package/dist/core/sdd/services/agent-run.service.js +189 -0
- package/dist/core/sdd/services/breakdown.service.js +2 -1
- package/dist/core/sdd/services/context.service.js +18 -16
- package/dist/core/sdd/services/debate.service.js +15 -2
- package/dist/core/sdd/services/feature-lint.service.d.ts +22 -0
- package/dist/core/sdd/services/feature-lint.service.js +105 -5
- package/dist/core/sdd/services/finalize.service.d.ts +80 -0
- package/dist/core/sdd/services/finalize.service.js +323 -24
- package/dist/core/sdd/services/frontend-gap.service.js +22 -7
- package/dist/core/sdd/services/governance-control-plane-runtime-adapters.d.ts +17 -0
- package/dist/core/sdd/services/governance-control-plane-runtime-adapters.js +38 -0
- package/dist/core/sdd/services/governance-control-plane.service.d.ts +66 -0
- package/dist/core/sdd/services/governance-control-plane.service.js +134 -0
- package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
- package/dist/core/sdd/services/legacy-capability.service.d.ts +10 -7
- package/dist/core/sdd/services/legacy-capability.service.js +38 -21
- package/dist/core/sdd/services/mcp-runtime.service.d.ts +123 -8
- package/dist/core/sdd/services/mcp-runtime.service.js +1085 -33
- package/dist/core/sdd/services/onboard.service.js +2 -1
- package/dist/core/sdd/services/rebuild.service.js +6 -1
- package/dist/core/sdd/services/skills-sync.service.d.ts +17 -5
- package/dist/core/sdd/services/skills-sync.service.js +55 -2
- package/dist/core/sdd/services/start.service.js +6 -4
- package/dist/core/sdd/skill-bundles-curation-schema.d.ts +66 -0
- package/dist/core/sdd/skill-bundles-curation-schema.js +52 -0
- package/dist/core/sdd/skill-evidence.d.ts +19 -0
- package/dist/core/sdd/skill-evidence.js +38 -0
- package/dist/core/sdd/skill-policy-pool.d.ts +46 -0
- package/dist/core/sdd/skill-policy-pool.js +185 -0
- package/dist/core/sdd/state.d.ts +22 -0
- package/dist/core/sdd/state.js +66 -41
- package/dist/core/sdd/structural-health.d.ts +42 -42
- package/dist/core/sdd/types.d.ts +33 -7
- package/dist/core/sdd/types.js +17 -0
- package/dist/core/sdd/upgrade-to-codesdd.d.ts +45 -0
- package/dist/core/sdd/upgrade-to-codesdd.js +179 -0
- package/dist/core/sdd/workspace-schemas.d.ts +285 -14
- package/dist/core/sdd/workspace-schemas.js +148 -0
- package/dist/core/sdd/write-manifest.js +22 -4
- package/dist/core/shared/skill-generation.d.ts +1 -1
- package/dist/core/shared/skill-generation.js +15 -15
- package/dist/core/shared/tool-detection.d.ts +3 -3
- package/dist/core/shared/tool-detection.js +14 -14
- package/dist/core/specs-apply.js +6 -6
- package/dist/core/templates/index.d.ts +1 -1
- package/dist/core/templates/index.js +1 -1
- package/dist/core/templates/workflows/apply-change.js +14 -14
- package/dist/core/templates/workflows/archive-change.js +32 -32
- package/dist/core/templates/workflows/bulk-archive-change.js +25 -25
- package/dist/core/templates/workflows/continue-change.js +12 -12
- package/dist/core/templates/workflows/explore.js +29 -29
- package/dist/core/templates/workflows/feedback.js +6 -6
- package/dist/core/templates/workflows/ff-change.js +24 -24
- package/dist/core/templates/workflows/new-change.js +20 -20
- package/dist/core/templates/workflows/onboard.js +33 -33
- package/dist/core/templates/workflows/propose.js +23 -23
- package/dist/core/templates/workflows/sdd.js +8 -8
- package/dist/core/templates/workflows/sync-specs.js +19 -19
- package/dist/core/templates/workflows/verify-change.js +17 -17
- package/dist/core/update.d.ts +2 -2
- package/dist/core/update.js +16 -15
- package/dist/core/validation/constants.d.ts +1 -1
- package/dist/core/validation/constants.js +1 -1
- package/dist/core/view.js +11 -11
- package/dist/telemetry/config.d.ts +2 -1
- package/dist/telemetry/config.js +17 -8
- package/dist/telemetry/index.d.ts +10 -2
- package/dist/telemetry/index.js +40 -7
- package/dist/ui/ascii-patterns.d.ts +2 -2
- package/dist/ui/ascii-patterns.js +2 -2
- package/dist/ui/welcome-screen.js +2 -2
- package/dist/utils/change-metadata.d.ts +4 -4
- package/dist/utils/change-metadata.js +6 -6
- package/dist/utils/change-utils.d.ts +3 -3
- package/dist/utils/change-utils.js +5 -5
- package/dist/utils/file-system.js +1 -1
- package/dist/utils/interactive.js +1 -1
- package/dist/utils/item-discovery.js +4 -4
- package/dist/utils/legacy-spec-compat.d.ts +2 -0
- package/dist/utils/legacy-spec-compat.js +2 -0
- package/dist/utils/shell-detection.d.ts +1 -0
- package/dist/utils/shell-detection.js +16 -0
- package/package.json +27 -17
- package/schemas/sdd/1-spec.schema.json +1 -1
- package/schemas/sdd/2-plan.schema.json +73 -1
- package/schemas/sdd/3-tasks.schema.json +73 -1
- package/schemas/sdd/4-changelog.schema.json +1 -1
- package/schemas/sdd/5-quality.schema.json +442 -2
- package/schemas/sdd/adr.schema.json +148 -0
- package/schemas/sdd/agent-binding-adapter.schema.json +210 -0
- package/schemas/sdd/agent-binding-resolution.schema.json +338 -0
- package/schemas/sdd/backlog-projection-plan.schema.json +180 -0
- package/schemas/sdd/backlog-provider-contract.schema.json +260 -0
- package/schemas/sdd/codesdd-plugin.schema.json +474 -0
- package/schemas/sdd/debate.schema.json +244 -0
- package/schemas/sdd/deepagent-decision-evidence.schema.json +58 -0
- package/schemas/sdd/deepagent-env-contract.schema.json +143 -0
- package/schemas/sdd/deepagent-quality-evidence.schema.json +108 -0
- package/schemas/sdd/deepagent-run-evidence.schema.json +192 -0
- package/schemas/sdd/deepagent-run-plan.schema.json +197 -0
- package/schemas/sdd/deepagent-run-request.schema.json +321 -0
- package/schemas/sdd/deepagent-subagent-evidence.schema.json +110 -0
- package/schemas/sdd/deepagent-tool-call-evidence.schema.json +78 -0
- package/schemas/sdd/discarded.schema.json +127 -0
- package/schemas/sdd/epic.schema.json +147 -0
- package/schemas/sdd/insight.schema.json +136 -0
- package/schemas/sdd/parallel-feat-automation-plan.schema.json +215 -0
- package/schemas/sdd/parallel-feat-automation-request.schema.json +109 -0
- package/schemas/sdd/plugin-artifact-manifest.schema.json +150 -0
- package/schemas/sdd/plugin-compliance-index.schema.json +136 -0
- package/schemas/sdd/plugin-dry-run-plan.schema.json +260 -0
- package/schemas/sdd/plugin-evidence-manifest.schema.json +569 -0
- package/schemas/sdd/plugin-policy-evaluation.schema.json +92 -0
- package/schemas/sdd/plugin-policy-pack-evaluation.schema.json +94 -0
- package/schemas/sdd/plugin-policy-pack.schema.json +196 -0
- package/schemas/sdd/plugin-registry.schema.json +558 -0
- package/schemas/sdd/plugin-rollback-manifest.schema.json +87 -0
- package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +845 -0
- package/schemas/sdd/plugin-skill-binding-resolution.schema.json +305 -0
- package/schemas/sdd/plugin-skill-binding.schema.json +88 -0
- package/schemas/sdd/plugin-validation-manifest.schema.json +123 -0
- package/schemas/sdd/quality-architecture-schema.schema.json +216 -0
- package/schemas/sdd/quality-evidence-bundle.schema.json +1228 -0
- package/schemas/sdd/quality-run.schema.json +197 -0
- package/schemas/sdd/quality-scenario.schema.json +252 -0
- package/schemas/sdd/workspace-catalog.schema.json +9841 -22
- package/schemas/spec-driven/schema.yaml +4 -4
- package/schemas/spec-driven/templates/proposal.md +1 -1
- package/dist/utils/openspec-compat.d.ts +0 -2
- package/dist/utils/openspec-compat.js +0 -2
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Legacy cleanup module for detecting and removing
|
|
2
|
+
* Legacy cleanup module for detecting and removing CodeSDD artifacts
|
|
3
3
|
* from previous init versions during the migration to the skill-based workflow.
|
|
4
4
|
*/
|
|
5
5
|
import { promises as fs } from 'fs';
|
|
6
6
|
import chalk from 'chalk';
|
|
7
7
|
import { FileSystemUtils, removeMarkerBlock as removeMarkerBlockUtil } from '../utils/file-system.js';
|
|
8
|
-
import {
|
|
8
|
+
import { CODESDD_MARKERS, LEGACY_SPEC_DIR_NAME } from './config.js';
|
|
9
|
+
const DEPRECATED_LEGACY_SPEC_DIR_NAMES = ['codesdd'];
|
|
10
|
+
function legacySpecRootNames() {
|
|
11
|
+
return [LEGACY_SPEC_DIR_NAME, ...DEPRECATED_LEGACY_SPEC_DIR_NAMES];
|
|
12
|
+
}
|
|
9
13
|
/**
|
|
10
14
|
* Legacy config file names from the old ToolRegistry.
|
|
11
|
-
* These were config files created at project root with
|
|
15
|
+
* These were config files created at project root with CodeSDD markers.
|
|
12
16
|
*/
|
|
13
17
|
export const LEGACY_CONFIG_FILES = [
|
|
14
18
|
'CLAUDE.md',
|
|
@@ -17,7 +21,7 @@ export const LEGACY_CONFIG_FILES = [
|
|
|
17
21
|
'COSTRICT.md',
|
|
18
22
|
'QODER.md',
|
|
19
23
|
'IFLOW.md',
|
|
20
|
-
'AGENTS.md', // root AGENTS.md (not
|
|
24
|
+
'AGENTS.md', // root AGENTS.md (not legacy-spec/AGENTS.md)
|
|
21
25
|
'QWEN.md',
|
|
22
26
|
];
|
|
23
27
|
/**
|
|
@@ -26,33 +30,33 @@ export const LEGACY_CONFIG_FILES = [
|
|
|
26
30
|
* Some tools used a directory structure, others used individual files.
|
|
27
31
|
*/
|
|
28
32
|
export const LEGACY_SLASH_COMMAND_PATHS = {
|
|
29
|
-
// Directory-based: .tooldir/commands/
|
|
30
|
-
'claude': { type: 'directory', path: '.claude/commands/
|
|
31
|
-
'codebuddy': { type: 'directory', path: '.codebuddy/commands/
|
|
32
|
-
'qoder': { type: 'directory', path: '.qoder/commands/
|
|
33
|
-
'crush': { type: 'directory', path: '.crush/commands/
|
|
34
|
-
'gemini': { type: 'directory', path: '.gemini/commands/
|
|
35
|
-
'costrict': { type: 'directory', path: '.cospec/
|
|
36
|
-
// File-based: individual
|
|
37
|
-
'cursor': { type: 'files', pattern: '.cursor/commands/
|
|
38
|
-
'windsurf': { type: 'files', pattern: '.windsurf/workflows/
|
|
39
|
-
'kilocode': { type: 'files', pattern: '.kilocode/workflows/
|
|
40
|
-
'kiro': { type: 'files', pattern: '.kiro/prompts/
|
|
41
|
-
'github-copilot': { type: 'files', pattern: '.github/prompts/
|
|
42
|
-
'amazon-q': { type: 'files', pattern: '.amazonq/prompts/
|
|
43
|
-
'cline': { type: 'files', pattern: '.clinerules/workflows/
|
|
44
|
-
'roocode': { type: 'files', pattern: '.roo/commands/
|
|
45
|
-
'auggie': { type: 'files', pattern: '.augment/commands/
|
|
46
|
-
'factory': { type: 'files', pattern: '.factory/commands/
|
|
47
|
-
'opencode': { type: 'files', pattern: ['.opencode/command/opsx-*.md', '.opencode/command/
|
|
48
|
-
'continue': { type: 'files', pattern: '.continue/prompts/
|
|
49
|
-
'antigravity': { type: 'files', pattern: '.agent/workflows/
|
|
50
|
-
'iflow': { type: 'files', pattern: '.iflow/commands/
|
|
51
|
-
'qwen': { type: 'files', pattern: '.qwen/commands/
|
|
52
|
-
'codex': { type: 'files', pattern: '.codex/prompts/
|
|
33
|
+
// Directory-based: .tooldir/commands/legacy-spec/ or .tooldir/commands/legacy-spec/*.md
|
|
34
|
+
'claude': { type: 'directory', path: '.claude/commands/codesdd' },
|
|
35
|
+
'codebuddy': { type: 'directory', path: '.codebuddy/commands/codesdd' },
|
|
36
|
+
'qoder': { type: 'directory', path: '.qoder/commands/codesdd' },
|
|
37
|
+
'crush': { type: 'directory', path: '.crush/commands/codesdd' },
|
|
38
|
+
'gemini': { type: 'directory', path: '.gemini/commands/codesdd' },
|
|
39
|
+
'costrict': { type: 'directory', path: '.cospec/legacy-spec/commands' },
|
|
40
|
+
// File-based: individual codesdd-*.md files in a commands/workflows/prompts folder
|
|
41
|
+
'cursor': { type: 'files', pattern: '.cursor/commands/codesdd-*.md' },
|
|
42
|
+
'windsurf': { type: 'files', pattern: '.windsurf/workflows/codesdd-*.md' },
|
|
43
|
+
'kilocode': { type: 'files', pattern: '.kilocode/workflows/codesdd-*.md' },
|
|
44
|
+
'kiro': { type: 'files', pattern: '.kiro/prompts/codesdd-*.prompt.md' },
|
|
45
|
+
'github-copilot': { type: 'files', pattern: '.github/prompts/codesdd-*.prompt.md' },
|
|
46
|
+
'amazon-q': { type: 'files', pattern: '.amazonq/prompts/codesdd-*.md' },
|
|
47
|
+
'cline': { type: 'files', pattern: '.clinerules/workflows/codesdd-*.md' },
|
|
48
|
+
'roocode': { type: 'files', pattern: '.roo/commands/codesdd-*.md' },
|
|
49
|
+
'auggie': { type: 'files', pattern: '.augment/commands/codesdd-*.md' },
|
|
50
|
+
'factory': { type: 'files', pattern: '.factory/commands/codesdd-*.md' },
|
|
51
|
+
'opencode': { type: 'files', pattern: ['.opencode/command/opsx-*.md', '.opencode/command/codesdd-*.md'] },
|
|
52
|
+
'continue': { type: 'files', pattern: '.continue/prompts/codesdd-*.prompt' },
|
|
53
|
+
'antigravity': { type: 'files', pattern: '.agent/workflows/codesdd-*.md' },
|
|
54
|
+
'iflow': { type: 'files', pattern: '.iflow/commands/codesdd-*.md' },
|
|
55
|
+
'qwen': { type: 'files', pattern: '.qwen/commands/codesdd-*.toml' },
|
|
56
|
+
'codex': { type: 'files', pattern: '.codex/prompts/codesdd-*.md' },
|
|
53
57
|
};
|
|
54
58
|
/**
|
|
55
|
-
* Detects all legacy
|
|
59
|
+
* Detects all legacy CodeSDD artifacts in a project.
|
|
56
60
|
*
|
|
57
61
|
* @param projectPath - The root path of the project
|
|
58
62
|
* @returns Detection result with all found legacy artifacts
|
|
@@ -92,7 +96,7 @@ export async function detectLegacyArtifacts(projectPath) {
|
|
|
92
96
|
return result;
|
|
93
97
|
}
|
|
94
98
|
/**
|
|
95
|
-
* Detects legacy config files with
|
|
99
|
+
* Detects legacy config files with CodeSDD markers.
|
|
96
100
|
* All config files with markers are candidates for update (marker removal only).
|
|
97
101
|
* Config files are NEVER deleted - they belong to the user's project root.
|
|
98
102
|
*
|
|
@@ -106,7 +110,7 @@ export async function detectLegacyConfigFiles(projectPath) {
|
|
|
106
110
|
const filePath = FileSystemUtils.joinPath(projectPath, fileName);
|
|
107
111
|
if (await FileSystemUtils.fileExists(filePath)) {
|
|
108
112
|
const content = await FileSystemUtils.readFile(filePath);
|
|
109
|
-
if (
|
|
113
|
+
if (hasCodeSDDMarkers(content)) {
|
|
110
114
|
allFiles.push(fileName);
|
|
111
115
|
filesToUpdate.push(fileName); // Always update, never delete config files
|
|
112
116
|
}
|
|
@@ -145,7 +149,7 @@ export async function detectLegacySlashCommands(projectPath) {
|
|
|
145
149
|
* Finds legacy slash command files matching a glob pattern.
|
|
146
150
|
*
|
|
147
151
|
* @param projectPath - The root path of the project
|
|
148
|
-
* @param pattern - Glob pattern like '.cursor/commands/
|
|
152
|
+
* @param pattern - Glob pattern like '.cursor/commands/codesdd-*.md'
|
|
149
153
|
* @returns Array of matching file paths relative to projectPath
|
|
150
154
|
*/
|
|
151
155
|
async function findLegacySlashCommandFiles(projectPath, pattern) {
|
|
@@ -164,9 +168,9 @@ async function findLegacySlashCommandFiles(projectPath, pattern) {
|
|
|
164
168
|
try {
|
|
165
169
|
const entries = await fs.readdir(dirPath);
|
|
166
170
|
// Convert glob pattern to regex
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
//
|
|
171
|
+
// codesdd-*.md -> /^codesdd-.*\.md$/
|
|
172
|
+
// codesdd-*.prompt.md -> /^codesdd-.*\.prompt\.md$/
|
|
173
|
+
// codesdd-*.toml -> /^codesdd-.*\.toml$/
|
|
170
174
|
const regexPattern = filePart
|
|
171
175
|
.replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape regex special chars except *
|
|
172
176
|
.replace(/\*/g, '.*'); // Replace * with .*
|
|
@@ -185,7 +189,7 @@ async function findLegacySlashCommandFiles(projectPath, pattern) {
|
|
|
185
189
|
return foundFiles;
|
|
186
190
|
}
|
|
187
191
|
/**
|
|
188
|
-
* Detects legacy
|
|
192
|
+
* Detects legacy CodeSDD structure files (AGENTS.md and project.md).
|
|
189
193
|
*
|
|
190
194
|
* @param projectPath - The root path of the project
|
|
191
195
|
* @returns Object with detection results for structure files
|
|
@@ -194,59 +198,69 @@ export async function detectLegacyStructureFiles(projectPath) {
|
|
|
194
198
|
let hasOpenspecAgents = false;
|
|
195
199
|
let hasProjectMd = false;
|
|
196
200
|
let hasRootAgentsWithMarkers = false;
|
|
197
|
-
// Check for
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
201
|
+
// Check for legacy-spec/AGENTS.md
|
|
202
|
+
for (const rootName of legacySpecRootNames()) {
|
|
203
|
+
const legacySpecAgentsPath = FileSystemUtils.joinPath(projectPath, rootName, 'AGENTS.md');
|
|
204
|
+
if (await FileSystemUtils.fileExists(legacySpecAgentsPath)) {
|
|
205
|
+
hasOpenspecAgents = true;
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Check for legacy-spec/project.md (for migration messaging, not deleted)
|
|
210
|
+
for (const rootName of legacySpecRootNames()) {
|
|
211
|
+
const projectMdPath = FileSystemUtils.joinPath(projectPath, rootName, 'project.md');
|
|
212
|
+
if (await FileSystemUtils.fileExists(projectMdPath)) {
|
|
213
|
+
hasProjectMd = true;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Check for root AGENTS.md with CodeSDD markers
|
|
204
218
|
const rootAgentsPath = FileSystemUtils.joinPath(projectPath, 'AGENTS.md');
|
|
205
219
|
if (await FileSystemUtils.fileExists(rootAgentsPath)) {
|
|
206
220
|
const content = await FileSystemUtils.readFile(rootAgentsPath);
|
|
207
|
-
hasRootAgentsWithMarkers =
|
|
221
|
+
hasRootAgentsWithMarkers = hasCodeSDDMarkers(content);
|
|
208
222
|
}
|
|
209
223
|
return { hasOpenspecAgents, hasProjectMd, hasRootAgentsWithMarkers };
|
|
210
224
|
}
|
|
211
225
|
/**
|
|
212
|
-
* Checks if content contains
|
|
226
|
+
* Checks if content contains CodeSDD markers.
|
|
213
227
|
*
|
|
214
228
|
* @param content - File content to check
|
|
215
229
|
* @returns True if both start and end markers are present
|
|
216
230
|
*/
|
|
217
|
-
export function
|
|
218
|
-
return (content.includes(
|
|
231
|
+
export function hasCodeSDDMarkers(content) {
|
|
232
|
+
return (content.includes(CODESDD_MARKERS.start) && content.includes(CODESDD_MARKERS.end));
|
|
219
233
|
}
|
|
220
234
|
/**
|
|
221
|
-
* Checks if file content is 100%
|
|
235
|
+
* Checks if file content is 100% CodeSDD content (only markers and whitespace outside).
|
|
222
236
|
*
|
|
223
237
|
* @param content - File content to check
|
|
224
238
|
* @returns True if content outside markers is only whitespace
|
|
225
239
|
*/
|
|
226
|
-
export function
|
|
227
|
-
const startIndex = content.indexOf(
|
|
228
|
-
const endIndex = content.indexOf(
|
|
240
|
+
export function isOnlyCodeSDDContent(content) {
|
|
241
|
+
const startIndex = content.indexOf(CODESDD_MARKERS.start);
|
|
242
|
+
const endIndex = content.indexOf(CODESDD_MARKERS.end);
|
|
229
243
|
if (startIndex === -1 || endIndex === -1 || endIndex <= startIndex) {
|
|
230
244
|
return false;
|
|
231
245
|
}
|
|
232
246
|
const before = content.substring(0, startIndex);
|
|
233
|
-
const after = content.substring(endIndex +
|
|
247
|
+
const after = content.substring(endIndex + CODESDD_MARKERS.end.length);
|
|
234
248
|
return before.trim() === '' && after.trim() === '';
|
|
235
249
|
}
|
|
236
250
|
/**
|
|
237
|
-
* Removes the
|
|
251
|
+
* Removes the CodeSDD marker block from file content.
|
|
238
252
|
* Only removes markers that are on their own lines (ignores inline mentions).
|
|
239
253
|
* Cleans up double blank lines that may result from removal.
|
|
240
254
|
*
|
|
241
|
-
* @param content - File content with
|
|
255
|
+
* @param content - File content with CodeSDD markers
|
|
242
256
|
* @returns Content with marker block removed
|
|
243
257
|
*/
|
|
244
258
|
export function removeMarkerBlock(content) {
|
|
245
|
-
return removeMarkerBlockUtil(content,
|
|
259
|
+
return removeMarkerBlockUtil(content, CODESDD_MARKERS.start, CODESDD_MARKERS.end);
|
|
246
260
|
}
|
|
247
261
|
/**
|
|
248
|
-
* Cleans up legacy
|
|
249
|
-
* Preserves
|
|
262
|
+
* Cleans up legacy CodeSDD artifacts from a project.
|
|
263
|
+
* Preserves legacy-spec/project.md (shows migration hint instead of deleting).
|
|
250
264
|
*
|
|
251
265
|
* @param projectPath - The root path of the project
|
|
252
266
|
* @param detection - Detection result from detectLegacyArtifacts
|
|
@@ -275,7 +289,7 @@ export async function cleanupLegacyArtifacts(projectPath, detection) {
|
|
|
275
289
|
result.errors.push(`Failed to modify ${fileName}: ${error.message}`);
|
|
276
290
|
}
|
|
277
291
|
}
|
|
278
|
-
// Delete legacy slash command directories (these are 100%
|
|
292
|
+
// Delete legacy slash command directories (these are 100% CodeSDD-managed)
|
|
279
293
|
for (const dirPath of detection.slashCommandDirs) {
|
|
280
294
|
const fullPath = FileSystemUtils.joinPath(projectPath, dirPath);
|
|
281
295
|
try {
|
|
@@ -286,7 +300,7 @@ export async function cleanupLegacyArtifacts(projectPath, detection) {
|
|
|
286
300
|
result.errors.push(`Failed to delete directory ${dirPath}: ${error.message}`);
|
|
287
301
|
}
|
|
288
302
|
}
|
|
289
|
-
// Delete legacy slash command files (these are 100%
|
|
303
|
+
// Delete legacy slash command files (these are 100% CodeSDD-managed)
|
|
290
304
|
for (const filePath of detection.slashCommandFiles) {
|
|
291
305
|
const fullPath = FileSystemUtils.joinPath(projectPath, filePath);
|
|
292
306
|
try {
|
|
@@ -297,20 +311,23 @@ export async function cleanupLegacyArtifacts(projectPath, detection) {
|
|
|
297
311
|
result.errors.push(`Failed to delete ${filePath}: ${error.message}`);
|
|
298
312
|
}
|
|
299
313
|
}
|
|
300
|
-
// Delete
|
|
314
|
+
// Delete legacy-spec/AGENTS.md (this is inside legacy-spec/, it's CodeSDD-managed)
|
|
301
315
|
if (detection.hasOpenspecAgents) {
|
|
302
|
-
const
|
|
303
|
-
|
|
316
|
+
for (const rootName of legacySpecRootNames()) {
|
|
317
|
+
const relativePath = `${rootName}/AGENTS.md`;
|
|
318
|
+
const agentsPath = FileSystemUtils.joinPath(projectPath, relativePath);
|
|
319
|
+
if (!(await FileSystemUtils.fileExists(agentsPath)))
|
|
320
|
+
continue;
|
|
304
321
|
try {
|
|
305
322
|
await fs.unlink(agentsPath);
|
|
306
|
-
result.deletedFiles.push(
|
|
323
|
+
result.deletedFiles.push(relativePath);
|
|
307
324
|
}
|
|
308
325
|
catch (error) {
|
|
309
|
-
result.errors.push(`Failed to delete
|
|
326
|
+
result.errors.push(`Failed to delete ${relativePath}: ${error.message}`);
|
|
310
327
|
}
|
|
311
328
|
}
|
|
312
329
|
}
|
|
313
|
-
// Handle root AGENTS.md with
|
|
330
|
+
// Handle root AGENTS.md with CodeSDD markers - remove markers only, NEVER delete
|
|
314
331
|
// Note: Root AGENTS.md is handled via configFilesToUpdate above (it's in LEGACY_CONFIG_FILES)
|
|
315
332
|
// This hasRootAgentsWithMarkers flag is just for detection, cleanup happens via configFilesToUpdate
|
|
316
333
|
return result;
|
|
@@ -332,7 +349,7 @@ export function formatCleanupSummary(result) {
|
|
|
332
349
|
lines.push(` ✓ Removed ${dir}/ (replaced by /opsx:*)`);
|
|
333
350
|
}
|
|
334
351
|
for (const file of result.modifiedFiles) {
|
|
335
|
-
lines.push(` ✓ Removed
|
|
352
|
+
lines.push(` ✓ Removed CodeSDD markers from ${file}`);
|
|
336
353
|
}
|
|
337
354
|
}
|
|
338
355
|
if (result.projectMdNeedsMigration) {
|
|
@@ -354,7 +371,7 @@ export function formatCleanupSummary(result) {
|
|
|
354
371
|
}
|
|
355
372
|
/**
|
|
356
373
|
* Build list of files to be removed with explanations.
|
|
357
|
-
* Only includes
|
|
374
|
+
* Only includes CodeSDD-managed files (slash commands, legacy-spec/AGENTS.md).
|
|
358
375
|
* Config files like CLAUDE.md, AGENTS.md are NEVER deleted.
|
|
359
376
|
*
|
|
360
377
|
* @param detection - Detection result from detectLegacyArtifacts
|
|
@@ -362,19 +379,19 @@ export function formatCleanupSummary(result) {
|
|
|
362
379
|
*/
|
|
363
380
|
function buildRemovalsList(detection) {
|
|
364
381
|
const removals = [];
|
|
365
|
-
// Slash command directories (these are 100%
|
|
382
|
+
// Slash command directories (these are 100% CodeSDD-managed)
|
|
366
383
|
for (const dir of detection.slashCommandDirs) {
|
|
367
384
|
// Split on both forward and backward slashes for Windows compatibility
|
|
368
385
|
const toolDir = dir.split(/[\/\\]/)[0];
|
|
369
386
|
removals.push({ path: dir + '/', explanation: `replaced by ${toolDir}/skills/` });
|
|
370
387
|
}
|
|
371
|
-
// Slash command files (these are 100%
|
|
388
|
+
// Slash command files (these are 100% CodeSDD-managed)
|
|
372
389
|
for (const file of detection.slashCommandFiles) {
|
|
373
390
|
removals.push({ path: file, explanation: 'replaced by skills/' });
|
|
374
391
|
}
|
|
375
|
-
//
|
|
392
|
+
// legacy-spec/AGENTS.md (inside legacy-spec/, it's CodeSDD-managed)
|
|
376
393
|
if (detection.hasOpenspecAgents) {
|
|
377
|
-
removals.push({ path: '
|
|
394
|
+
removals.push({ path: 'legacy-spec/AGENTS.md', explanation: 'obsolete workflow file' });
|
|
378
395
|
}
|
|
379
396
|
// Note: Config files (CLAUDE.md, AGENTS.md, etc.) are NEVER in the removals list
|
|
380
397
|
// They always go to the updates list where only markers are removed
|
|
@@ -391,7 +408,7 @@ function buildUpdatesList(detection) {
|
|
|
391
408
|
const updates = [];
|
|
392
409
|
// All config files with markers get updated (markers removed, file preserved)
|
|
393
410
|
for (const file of detection.configFilesToUpdate) {
|
|
394
|
-
updates.push({ path: file, explanation: 'removing
|
|
411
|
+
updates.push({ path: file, explanation: 'removing CodeSDD markers' });
|
|
395
412
|
}
|
|
396
413
|
return updates;
|
|
397
414
|
}
|
|
@@ -411,9 +428,9 @@ export function formatDetectionSummary(detection) {
|
|
|
411
428
|
return '';
|
|
412
429
|
}
|
|
413
430
|
// Header - welcoming upgrade message
|
|
414
|
-
lines.push(chalk.bold('Upgrading to the new
|
|
431
|
+
lines.push(chalk.bold('Upgrading to the new CodeSDD'));
|
|
415
432
|
lines.push('');
|
|
416
|
-
lines.push('
|
|
433
|
+
lines.push('CodeSDD now uses agent skills, the emerging standard across coding');
|
|
417
434
|
lines.push('agents. This simplifies your setup while keeping everything working');
|
|
418
435
|
lines.push('as before.');
|
|
419
436
|
lines.push('');
|
|
@@ -430,7 +447,7 @@ export function formatDetectionSummary(detection) {
|
|
|
430
447
|
if (removals.length > 0)
|
|
431
448
|
lines.push('');
|
|
432
449
|
lines.push(chalk.bold('Files to update'));
|
|
433
|
-
lines.push(chalk.dim('
|
|
450
|
+
lines.push(chalk.dim('CodeSDD markers will be removed, your content preserved:'));
|
|
434
451
|
for (const { path } of updates) {
|
|
435
452
|
lines.push(` • ${path}`);
|
|
436
453
|
}
|
|
@@ -468,7 +485,7 @@ export function getToolsFromLegacyArtifacts(detection) {
|
|
|
468
485
|
for (const [toolId, pattern] of Object.entries(LEGACY_SLASH_COMMAND_PATHS)) {
|
|
469
486
|
if (pattern.type === 'files' && pattern.pattern) {
|
|
470
487
|
// Convert glob pattern to regex for matching
|
|
471
|
-
// e.g., '.cursor/commands/
|
|
488
|
+
// e.g., '.cursor/commands/codesdd-*.md' -> /^\.cursor\/commands\/codesdd-.*\.md$/
|
|
472
489
|
const patterns = Array.isArray(pattern.pattern) ? pattern.pattern : [pattern.pattern];
|
|
473
490
|
let matched = false;
|
|
474
491
|
for (const p of patterns) {
|
|
@@ -498,11 +515,11 @@ export function getToolsFromLegacyArtifacts(detection) {
|
|
|
498
515
|
export function formatProjectMdMigrationHint() {
|
|
499
516
|
const lines = [];
|
|
500
517
|
lines.push(chalk.yellow.bold('Needs your attention'));
|
|
501
|
-
lines.push(' •
|
|
518
|
+
lines.push(' • legacy-spec/project.md');
|
|
502
519
|
lines.push(chalk.dim(' We won\'t delete this file. It may contain useful project context.'));
|
|
503
520
|
lines.push('');
|
|
504
|
-
lines.push(chalk.dim(' The new
|
|
505
|
-
lines.push(chalk.dim(' context. This is included in every
|
|
521
|
+
lines.push(chalk.dim(' The new legacy-spec/config.yaml has a "context:" section for planning'));
|
|
522
|
+
lines.push(chalk.dim(' context. This is included in every CodeSDD request and works more'));
|
|
506
523
|
lines.push(chalk.dim(' reliably than the old project.md approach.'));
|
|
507
524
|
lines.push('');
|
|
508
525
|
lines.push(chalk.dim(' Review project.md, move any useful content to config.yaml\'s context'));
|
package/dist/core/list.js
CHANGED
|
@@ -5,7 +5,7 @@ import { readFileSync } from 'fs';
|
|
|
5
5
|
import { join } from 'path';
|
|
6
6
|
import { MarkdownParser } from './parsers/markdown-parser.js';
|
|
7
7
|
import { CLI_NAME } from './branding.js';
|
|
8
|
-
import {
|
|
8
|
+
import { resolveLegacySpecSubpath } from './sdd/services/legacy-capability.service.js';
|
|
9
9
|
/**
|
|
10
10
|
* Get the most recent modification time of any file in a directory (recursive).
|
|
11
11
|
* Falls back to the directory's own mtime if no files are found.
|
|
@@ -65,13 +65,27 @@ export class ListCommand {
|
|
|
65
65
|
async execute(targetPath = '.', mode = 'changes', options = {}) {
|
|
66
66
|
const { sort = 'recent', json = false } = options;
|
|
67
67
|
if (mode === 'changes') {
|
|
68
|
-
const changesDir =
|
|
68
|
+
const changesDir = resolveLegacySpecSubpath(targetPath, 'changes');
|
|
69
69
|
// Check if changes directory exists
|
|
70
70
|
try {
|
|
71
71
|
await fs.access(changesDir);
|
|
72
72
|
}
|
|
73
73
|
catch {
|
|
74
|
-
|
|
74
|
+
const sddStatePath = path.join(targetPath, '.sdd', 'state', 'backlog.yaml');
|
|
75
|
+
try {
|
|
76
|
+
await fs.access(sddStatePath);
|
|
77
|
+
const message = `This repository uses SDD canonical state. The legacy 'changes/' directory does not apply here.\nUse '${CLI_NAME} sdd next' to see ready FEATs or '${CLI_NAME} sdd check' for the backlog overview.`;
|
|
78
|
+
if (json) {
|
|
79
|
+
console.log(JSON.stringify({ changes: [], hint: message }, null, 2));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log(message);
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
throw new Error(`No CodeSDD changes directory found. Run '${CLI_NAME} init' first.`);
|
|
88
|
+
}
|
|
75
89
|
}
|
|
76
90
|
// Get all directories in changes (excluding archive)
|
|
77
91
|
const entries = await fs.readdir(changesDir, { withFileTypes: true });
|
|
@@ -132,7 +146,7 @@ export class ListCommand {
|
|
|
132
146
|
return;
|
|
133
147
|
}
|
|
134
148
|
// specs mode
|
|
135
|
-
const specsDir =
|
|
149
|
+
const specsDir = resolveLegacySpecSubpath(targetPath, 'specs');
|
|
136
150
|
try {
|
|
137
151
|
await fs.access(specsDir);
|
|
138
152
|
}
|
package/dist/core/migration.d.ts
CHANGED
|
@@ -19,5 +19,7 @@ export declare function scanInstalledWorkflows(projectPath: string, tools: AIToo
|
|
|
19
19
|
* - If no profile field exists and no workflows are installed: no-op (defaults apply).
|
|
20
20
|
* - If profile field already exists: no-op.
|
|
21
21
|
*/
|
|
22
|
-
export declare function migrateIfNeeded(projectPath: string, tools: AIToolOption[]
|
|
22
|
+
export declare function migrateIfNeeded(projectPath: string, tools: AIToolOption[], options?: {
|
|
23
|
+
silent?: boolean;
|
|
24
|
+
}): void;
|
|
23
25
|
//# sourceMappingURL=migration.d.ts.map
|
package/dist/core/migration.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* One-time migration logic for existing projects when profile system is introduced.
|
|
5
5
|
* Called by both init and update commands before profile resolution.
|
|
6
6
|
*/
|
|
7
|
-
import { getGlobalConfig,
|
|
7
|
+
import { getGlobalConfig, readGlobalConfigRaw, saveGlobalConfig } from './global-config.js';
|
|
8
8
|
import { CommandAdapterRegistry } from './command-generation/index.js';
|
|
9
9
|
import { WORKFLOW_TO_SKILL_DIR } from './profile-sync-drift.js';
|
|
10
10
|
import { ALL_WORKFLOWS } from './profiles.js';
|
|
@@ -71,15 +71,12 @@ function inferDelivery(artifacts) {
|
|
|
71
71
|
* - If no profile field exists and no workflows are installed: no-op (defaults apply).
|
|
72
72
|
* - If profile field already exists: no-op.
|
|
73
73
|
*/
|
|
74
|
-
export function migrateIfNeeded(projectPath, tools) {
|
|
74
|
+
export function migrateIfNeeded(projectPath, tools, options = {}) {
|
|
75
75
|
const config = getGlobalConfig();
|
|
76
76
|
// Check raw config file for profile field presence
|
|
77
|
-
const configPath = getGlobalConfigPath();
|
|
78
77
|
let rawConfig = {};
|
|
79
78
|
try {
|
|
80
|
-
|
|
81
|
-
rawConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
82
|
-
}
|
|
79
|
+
rawConfig = readGlobalConfigRaw();
|
|
83
80
|
}
|
|
84
81
|
catch {
|
|
85
82
|
return; // Can't read config, skip migration
|
|
@@ -102,7 +99,9 @@ export function migrateIfNeeded(projectPath, tools) {
|
|
|
102
99
|
config.delivery = inferDelivery(artifacts);
|
|
103
100
|
}
|
|
104
101
|
saveGlobalConfig(config);
|
|
105
|
-
|
|
106
|
-
|
|
102
|
+
if (!options.silent) {
|
|
103
|
+
console.log(`Migrated: custom profile with ${installedWorkflows.length} workflows`);
|
|
104
|
+
console.log("New in this version: /opsx:propose. Try 'codesdd config profile core' for the streamlined experience.");
|
|
105
|
+
}
|
|
107
106
|
}
|
|
108
107
|
//# sourceMappingURL=migration.js.map
|
|
@@ -26,7 +26,7 @@ export class MarkdownParser {
|
|
|
26
26
|
requirements,
|
|
27
27
|
metadata: {
|
|
28
28
|
version: '1.0.0',
|
|
29
|
-
format: '
|
|
29
|
+
format: 'codesdd',
|
|
30
30
|
},
|
|
31
31
|
};
|
|
32
32
|
}
|
|
@@ -48,7 +48,7 @@ export class MarkdownParser {
|
|
|
48
48
|
deltas,
|
|
49
49
|
metadata: {
|
|
50
50
|
version: '1.0.0',
|
|
51
|
-
format: '
|
|
51
|
+
format: 'codesdd-change',
|
|
52
52
|
},
|
|
53
53
|
};
|
|
54
54
|
}
|
|
@@ -6,7 +6,7 @@ type WorkflowId = (typeof ALL_WORKFLOWS)[number];
|
|
|
6
6
|
*/
|
|
7
7
|
export declare const WORKFLOW_TO_SKILL_DIR: Record<WorkflowId, string>;
|
|
8
8
|
/**
|
|
9
|
-
* Checks whether a tool has at least one generated
|
|
9
|
+
* Checks whether a tool has at least one generated CodeSDD command file.
|
|
10
10
|
*/
|
|
11
11
|
export declare function toolHasAnyConfiguredCommand(projectPath: string, toolId: string): boolean;
|
|
12
12
|
/**
|
|
@@ -8,24 +8,24 @@ import { COMMAND_IDS, getConfiguredTools } from './shared/index.js';
|
|
|
8
8
|
* Maps workflow IDs to their skill directory names.
|
|
9
9
|
*/
|
|
10
10
|
export const WORKFLOW_TO_SKILL_DIR = {
|
|
11
|
-
'explore': '
|
|
12
|
-
'new': '
|
|
13
|
-
'continue': '
|
|
14
|
-
'apply': '
|
|
15
|
-
'ff': '
|
|
16
|
-
'sync': '
|
|
17
|
-
'archive': '
|
|
18
|
-
'bulk-archive': '
|
|
19
|
-
'verify': '
|
|
20
|
-
'onboard': '
|
|
21
|
-
'propose': '
|
|
22
|
-
'sdd': '
|
|
11
|
+
'explore': 'codesdd-explore',
|
|
12
|
+
'new': 'codesdd-new-change',
|
|
13
|
+
'continue': 'codesdd-continue-change',
|
|
14
|
+
'apply': 'codesdd-apply-change',
|
|
15
|
+
'ff': 'codesdd-ff-change',
|
|
16
|
+
'sync': 'codesdd-sync-specs',
|
|
17
|
+
'archive': 'codesdd-archive-change',
|
|
18
|
+
'bulk-archive': 'codesdd-bulk-archive-change',
|
|
19
|
+
'verify': 'codesdd-verify-change',
|
|
20
|
+
'onboard': 'codesdd-onboard',
|
|
21
|
+
'propose': 'codesdd-propose',
|
|
22
|
+
'sdd': 'codesdd-sdd',
|
|
23
23
|
};
|
|
24
24
|
function toKnownWorkflows(workflows) {
|
|
25
25
|
return workflows.filter((workflow) => ALL_WORKFLOWS.includes(workflow));
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
-
* Checks whether a tool has at least one generated
|
|
28
|
+
* Checks whether a tool has at least one generated CodeSDD command file.
|
|
29
29
|
*/
|
|
30
30
|
export function toolHasAnyConfiguredCommand(projectPath, toolId) {
|
|
31
31
|
const adapter = CommandAdapterRegistry.get(toolId);
|
|
@@ -8,9 +8,9 @@ import { z } from 'zod';
|
|
|
8
8
|
* 3. Runtime validation - uses safeParse() for resilient field-by-field validation
|
|
9
9
|
*
|
|
10
10
|
* Why Zod over manual validation:
|
|
11
|
-
* - Helps understand
|
|
11
|
+
* - Helps understand CodeSDD's data interfaces at a glance
|
|
12
12
|
* - Single source of truth for type and validation
|
|
13
|
-
* - Consistent with other
|
|
13
|
+
* - Consistent with other CodeSDD schemas
|
|
14
14
|
*/
|
|
15
15
|
export declare const ProjectConfigSchema: z.ZodObject<{
|
|
16
16
|
schema: z.ZodString;
|
|
@@ -19,7 +19,7 @@ export declare const ProjectConfigSchema: z.ZodObject<{
|
|
|
19
19
|
}, z.core.$strip>;
|
|
20
20
|
export type ProjectConfig = z.infer<typeof ProjectConfigSchema>;
|
|
21
21
|
/**
|
|
22
|
-
* Read and parse
|
|
22
|
+
* Read and parse legacy-spec/config.yaml from project root.
|
|
23
23
|
* Uses resilient parsing - validates each field independently using Zod safeParse.
|
|
24
24
|
* Returns null if file doesn't exist.
|
|
25
25
|
* Returns partial config if some fields are invalid (with warnings).
|
|
@@ -34,7 +34,7 @@ export type ProjectConfig = z.infer<typeof ProjectConfigSchema>;
|
|
|
34
34
|
* invalidation logic) for negligible benefit. Direct reads also ensure config
|
|
35
35
|
* changes are reflected immediately without stale cache issues.
|
|
36
36
|
*
|
|
37
|
-
* @param projectRoot - The root directory of the project (where `
|
|
37
|
+
* @param projectRoot - The root directory of the project (where `legacy-spec/` lives)
|
|
38
38
|
* @returns Parsed config or null if file doesn't exist
|
|
39
39
|
*/
|
|
40
40
|
export declare function readProjectConfig(projectRoot: string): ProjectConfig | null;
|