@devtrack-solution/codesdd 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +17 -17
- package/.sdd/skills/curated/devtrack-api/SKILL.md +160 -28
- package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +1 -1
- package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +8 -7
- package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +93 -0
- package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +317 -0
- package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +95 -0
- package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +295 -0
- package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +4 -4
- package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +4 -0
- package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +2 -2
- package/LICENSE +1 -1
- package/README.md +243 -51
- package/bin/codesdd.js +3 -2
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +11 -558
- package/dist/cli/program.d.ts +14 -0
- package/dist/cli/program.js +645 -0
- package/dist/commands/change.js +5 -5
- package/dist/commands/completion.d.ts +1 -1
- package/dist/commands/completion.js +9 -2
- package/dist/commands/config.js +159 -20
- package/dist/commands/feedback.js +1 -1
- package/dist/commands/schema.d.ts +63 -0
- package/dist/commands/schema.js +12 -12
- package/dist/commands/sdd/backlog.d.ts +3 -0
- package/dist/commands/sdd/backlog.js +54 -0
- package/dist/commands/sdd/execution.js +147 -16
- package/dist/commands/sdd/plugin.d.ts +3 -0
- package/dist/commands/sdd/plugin.js +153 -0
- package/dist/commands/sdd/shared.js +2 -23
- package/dist/commands/sdd/skills.js +7 -0
- package/dist/commands/sdd.js +69 -12
- package/dist/commands/spec.js +9 -9
- package/dist/commands/validate.js +6 -6
- package/dist/commands/workflow/instructions.js +6 -6
- package/dist/commands/workflow/new-change.js +3 -3
- package/dist/commands/workflow/shared.d.ts +1 -1
- package/dist/commands/workflow/shared.js +4 -4
- package/dist/core/archive.js +15 -5
- package/dist/core/artifact-graph/instruction-loader.d.ts +1 -1
- package/dist/core/artifact-graph/instruction-loader.js +3 -3
- package/dist/core/artifact-graph/resolver.d.ts +4 -4
- package/dist/core/artifact-graph/resolver.js +6 -6
- package/dist/core/branding.js +3 -3
- package/dist/core/cli/command-matrix.js +10 -1
- package/dist/core/cli-command-quality.d.ts +27 -0
- package/dist/core/cli-command-quality.js +171 -0
- package/dist/core/command-generation/adapters/costrict.d.ts +1 -1
- package/dist/core/command-generation/adapters/costrict.js +2 -2
- package/dist/core/command-generation/types.d.ts +1 -1
- package/dist/core/completions/command-registry.d.ts +1 -1
- package/dist/core/completions/command-registry.js +155 -12
- package/dist/core/completions/completion-provider.d.ts +14 -1
- package/dist/core/completions/completion-provider.js +29 -1
- package/dist/core/completions/generators/bash-generator.d.ts +1 -1
- package/dist/core/completions/generators/bash-generator.js +20 -12
- package/dist/core/completions/generators/fish-generator.d.ts +9 -1
- package/dist/core/completions/generators/fish-generator.js +39 -25
- package/dist/core/completions/generators/powershell-generator.d.ts +1 -1
- package/dist/core/completions/generators/powershell-generator.js +21 -11
- package/dist/core/completions/generators/zsh-generator.d.ts +3 -6
- package/dist/core/completions/generators/zsh-generator.js +21 -42
- package/dist/core/completions/installers/bash-installer.js +6 -6
- package/dist/core/completions/installers/fish-installer.js +1 -1
- package/dist/core/completions/installers/powershell-installer.js +14 -14
- package/dist/core/completions/installers/zsh-installer.d.ts +7 -1
- package/dist/core/completions/installers/zsh-installer.js +36 -8
- package/dist/core/completions/templates/bash-templates.d.ts +1 -1
- package/dist/core/completions/templates/bash-templates.js +12 -6
- package/dist/core/completions/templates/fish-templates.d.ts +2 -2
- package/dist/core/completions/templates/fish-templates.js +20 -9
- package/dist/core/completions/templates/powershell-templates.d.ts +1 -1
- package/dist/core/completions/templates/powershell-templates.js +13 -4
- package/dist/core/completions/templates/zsh-templates.d.ts +1 -1
- package/dist/core/completions/templates/zsh-templates.js +18 -9
- package/dist/core/config-schema.d.ts +3 -1
- package/dist/core/config-schema.js +26 -1
- package/dist/core/config.d.ts +3 -3
- package/dist/core/config.js +4 -4
- package/dist/core/global-config.d.ts +41 -12
- package/dist/core/global-config.js +344 -27
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/init.d.ts +6 -1
- package/dist/core/init.js +99 -77
- package/dist/core/legacy-cleanup.d.ts +17 -17
- package/dist/core/legacy-cleanup.js +96 -79
- package/dist/core/list.js +18 -4
- package/dist/core/migration.d.ts +3 -1
- package/dist/core/migration.js +7 -8
- package/dist/core/parsers/change-parser.js +1 -1
- package/dist/core/parsers/markdown-parser.js +2 -2
- package/dist/core/profile-sync-drift.d.ts +1 -1
- package/dist/core/profile-sync-drift.js +13 -13
- package/dist/core/project-config.d.ts +4 -4
- package/dist/core/project-config.js +11 -11
- package/dist/core/schemas/change.schema.d.ts +1 -1
- package/dist/core/schemas/change.schema.js +1 -1
- package/dist/core/schemas/spec.schema.d.ts +1 -1
- package/dist/core/schemas/spec.schema.js +1 -1
- package/dist/core/sdd/adr.js +23 -1
- package/dist/core/sdd/agent-binding.d.ts +346 -0
- package/dist/core/sdd/agent-binding.js +343 -0
- package/dist/core/sdd/backlog-cli.d.ts +16 -0
- package/dist/core/sdd/backlog-cli.js +146 -0
- package/dist/core/sdd/backlog-conflict-policy.d.ts +58 -0
- package/dist/core/sdd/backlog-conflict-policy.js +230 -0
- package/dist/core/sdd/backlog-projection.d.ts +8 -0
- package/dist/core/sdd/backlog-projection.js +89 -0
- package/dist/core/sdd/backlog-provider-contract.d.ts +252 -0
- package/dist/core/sdd/backlog-provider-contract.js +158 -0
- package/dist/core/sdd/bootstrap.js +2 -2
- package/dist/core/sdd/check.d.ts +42 -0
- package/dist/core/sdd/check.js +22 -22
- package/dist/core/sdd/contract.d.ts +13 -0
- package/dist/core/sdd/contract.js +36 -0
- package/dist/core/sdd/coordination/coordination-adapters.d.ts +38 -0
- package/dist/core/sdd/coordination/coordination-adapters.js +139 -1
- package/dist/core/sdd/deepagent-contracts.d.ts +276 -0
- package/dist/core/sdd/deepagent-contracts.js +173 -0
- package/dist/core/sdd/deepagents/adr-governor.d.ts +2 -0
- package/dist/core/sdd/deepagents/adr-governor.js +30 -0
- package/dist/core/sdd/deepagents/backend.d.ts +63 -0
- package/dist/core/sdd/deepagents/backend.js +174 -0
- package/dist/core/sdd/deepagents/codesdd-tools.d.ts +39 -0
- package/dist/core/sdd/deepagents/codesdd-tools.js +83 -0
- package/dist/core/sdd/deepagents/evidence-mapper.d.ts +86 -0
- package/dist/core/sdd/deepagents/evidence-mapper.js +178 -0
- package/dist/core/sdd/deepagents/model-provider.d.ts +53 -0
- package/dist/core/sdd/deepagents/model-provider.js +379 -0
- package/dist/core/sdd/deepagents/policy-enforcement.d.ts +30 -0
- package/dist/core/sdd/deepagents/policy-enforcement.js +90 -0
- package/dist/core/sdd/deepagents/policy.d.ts +75 -0
- package/dist/core/sdd/deepagents/policy.js +358 -0
- package/dist/core/sdd/deepagents/quality-witness.d.ts +3 -0
- package/dist/core/sdd/deepagents/quality-witness.js +77 -0
- package/dist/core/sdd/deepagents/reversa-subagents.d.ts +75 -0
- package/dist/core/sdd/deepagents/reversa-subagents.js +182 -0
- package/dist/core/sdd/deepagents/runtime-factory.d.ts +90 -0
- package/dist/core/sdd/deepagents/runtime-factory.js +231 -0
- package/dist/core/sdd/deepagents/runtime-loader.d.ts +16 -0
- package/dist/core/sdd/deepagents/runtime-loader.js +65 -0
- package/dist/core/sdd/default-bootstrap-files.d.ts +2 -2
- package/dist/core/sdd/default-bootstrap-files.js +36 -2
- package/dist/core/sdd/default-skills.d.ts +30 -0
- package/dist/core/sdd/default-skills.js +181 -5
- package/dist/core/sdd/devtrack-api-appliance.d.ts +84 -0
- package/dist/core/sdd/devtrack-api-appliance.js +257 -0
- package/dist/core/sdd/devtrack-api-architecture.d.ts +31 -0
- package/dist/core/sdd/devtrack-api-architecture.js +608 -0
- package/dist/core/sdd/devtrack-api-import-boundary.d.ts +19 -0
- package/dist/core/sdd/devtrack-api-import-boundary.js +32 -0
- package/dist/core/sdd/diagnose.d.ts +59 -0
- package/dist/core/sdd/diagnose.js +37 -37
- package/dist/core/sdd/docs-sync.js +33 -5
- package/dist/core/sdd/domain/post-active-validation.d.ts +7 -0
- package/dist/core/sdd/domain/post-active-validation.js +61 -0
- package/dist/core/sdd/domain/transition-engine.js +1 -0
- package/dist/core/sdd/entity-reference.d.ts +5 -0
- package/dist/core/sdd/entity-reference.js +22 -0
- package/dist/core/sdd/governance-backfill.d.ts +31 -0
- package/dist/core/sdd/governance-backfill.js +359 -0
- package/dist/core/sdd/governance-parser.d.ts +21 -0
- package/dist/core/sdd/governance-parser.js +91 -0
- package/dist/core/sdd/governance-schemas.d.ts +245 -0
- package/dist/core/sdd/governance-schemas.js +143 -0
- package/dist/core/sdd/{import-openspec.d.ts → import-legacy-spec.d.ts} +7 -7
- package/dist/core/sdd/{import-openspec.js → import-legacy-spec.js} +21 -29
- package/dist/core/sdd/init.d.ts +3 -0
- package/dist/core/sdd/init.js +6 -3
- package/dist/core/sdd/json-schema.js +100 -6
- package/dist/core/sdd/knowledge-graph.d.ts +45 -0
- package/dist/core/sdd/knowledge-graph.js +288 -0
- package/dist/core/sdd/legacy-operations.js +431 -43
- package/dist/core/sdd/lenses.d.ts +1 -0
- package/dist/core/sdd/lenses.js +29 -1
- package/dist/core/sdd/migrate-workspace.js +56 -2
- package/dist/core/sdd/migrate.d.ts +1 -1
- package/dist/core/sdd/migrate.js +36 -2
- package/dist/core/sdd/package-structure-gate.d.ts +83 -0
- package/dist/core/sdd/package-structure-gate.js +362 -0
- package/dist/core/sdd/parallel-feat-automation.d.ts +152 -0
- package/dist/core/sdd/parallel-feat-automation.js +212 -0
- package/dist/core/sdd/plugin-broker.d.ts +558 -0
- package/dist/core/sdd/plugin-broker.js +482 -0
- package/dist/core/sdd/plugin-certification.d.ts +79 -0
- package/dist/core/sdd/plugin-certification.js +453 -0
- package/dist/core/sdd/plugin-cli.d.ts +109 -0
- package/dist/core/sdd/plugin-cli.js +198 -0
- package/dist/core/sdd/plugin-evidence.d.ts +275 -0
- package/dist/core/sdd/plugin-evidence.js +307 -0
- package/dist/core/sdd/plugin-manifest.d.ts +164 -0
- package/dist/core/sdd/plugin-manifest.js +215 -0
- package/dist/core/sdd/plugin-policy-pack.d.ts +88 -0
- package/dist/core/sdd/plugin-policy-pack.js +236 -0
- package/dist/core/sdd/plugin-policy.d.ts +68 -0
- package/dist/core/sdd/plugin-policy.js +212 -0
- package/dist/core/sdd/plugin-registry.d.ts +311 -0
- package/dist/core/sdd/plugin-registry.js +138 -0
- package/dist/core/sdd/plugin-skill-binding.d.ts +151 -0
- package/dist/core/sdd/plugin-skill-binding.js +339 -0
- package/dist/core/sdd/quality-artifact-manifest-validator.d.ts +28 -0
- package/dist/core/sdd/quality-artifact-manifest-validator.js +167 -0
- package/dist/core/sdd/quality-evidence-renderer.d.ts +65 -0
- package/dist/core/sdd/quality-evidence-renderer.js +218 -0
- package/dist/core/sdd/quality-scenario-runner.d.ts +42 -0
- package/dist/core/sdd/quality-scenario-runner.js +613 -0
- package/dist/core/sdd/quality-validation.d.ts +547 -0
- package/dist/core/sdd/quality-validation.js +239 -0
- package/dist/core/sdd/resolve-project-root.d.ts +2 -2
- package/dist/core/sdd/resolve-project-root.js +11 -5
- package/dist/core/sdd/sanitize.d.ts +30 -1
- package/dist/core/sdd/sanitize.js +23 -23
- package/dist/core/sdd/services/agent-run.service.d.ts +65 -0
- package/dist/core/sdd/services/agent-run.service.js +189 -0
- package/dist/core/sdd/services/breakdown.service.js +2 -1
- package/dist/core/sdd/services/context.service.js +18 -16
- package/dist/core/sdd/services/debate.service.js +15 -2
- package/dist/core/sdd/services/feature-lint.service.d.ts +22 -0
- package/dist/core/sdd/services/feature-lint.service.js +105 -5
- package/dist/core/sdd/services/finalize.service.d.ts +80 -0
- package/dist/core/sdd/services/finalize.service.js +323 -24
- package/dist/core/sdd/services/frontend-gap.service.js +22 -7
- package/dist/core/sdd/services/governance-control-plane-runtime-adapters.d.ts +17 -0
- package/dist/core/sdd/services/governance-control-plane-runtime-adapters.js +38 -0
- package/dist/core/sdd/services/governance-control-plane.service.d.ts +66 -0
- package/dist/core/sdd/services/governance-control-plane.service.js +134 -0
- package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
- package/dist/core/sdd/services/legacy-capability.service.d.ts +10 -7
- package/dist/core/sdd/services/legacy-capability.service.js +38 -21
- package/dist/core/sdd/services/mcp-runtime.service.d.ts +123 -8
- package/dist/core/sdd/services/mcp-runtime.service.js +1085 -33
- package/dist/core/sdd/services/onboard.service.js +2 -1
- package/dist/core/sdd/services/rebuild.service.js +6 -1
- package/dist/core/sdd/services/skills-sync.service.d.ts +17 -5
- package/dist/core/sdd/services/skills-sync.service.js +55 -2
- package/dist/core/sdd/services/start.service.js +6 -4
- package/dist/core/sdd/skill-bundles-curation-schema.d.ts +66 -0
- package/dist/core/sdd/skill-bundles-curation-schema.js +52 -0
- package/dist/core/sdd/skill-evidence.d.ts +19 -0
- package/dist/core/sdd/skill-evidence.js +38 -0
- package/dist/core/sdd/skill-policy-pool.d.ts +46 -0
- package/dist/core/sdd/skill-policy-pool.js +185 -0
- package/dist/core/sdd/state.d.ts +22 -0
- package/dist/core/sdd/state.js +66 -41
- package/dist/core/sdd/structural-health.d.ts +42 -42
- package/dist/core/sdd/types.d.ts +33 -7
- package/dist/core/sdd/types.js +17 -0
- package/dist/core/sdd/upgrade-to-codesdd.d.ts +45 -0
- package/dist/core/sdd/upgrade-to-codesdd.js +179 -0
- package/dist/core/sdd/workspace-schemas.d.ts +285 -14
- package/dist/core/sdd/workspace-schemas.js +148 -0
- package/dist/core/sdd/write-manifest.js +22 -4
- package/dist/core/shared/skill-generation.d.ts +1 -1
- package/dist/core/shared/skill-generation.js +15 -15
- package/dist/core/shared/tool-detection.d.ts +3 -3
- package/dist/core/shared/tool-detection.js +14 -14
- package/dist/core/specs-apply.js +6 -6
- package/dist/core/templates/index.d.ts +1 -1
- package/dist/core/templates/index.js +1 -1
- package/dist/core/templates/workflows/apply-change.js +14 -14
- package/dist/core/templates/workflows/archive-change.js +32 -32
- package/dist/core/templates/workflows/bulk-archive-change.js +25 -25
- package/dist/core/templates/workflows/continue-change.js +12 -12
- package/dist/core/templates/workflows/explore.js +29 -29
- package/dist/core/templates/workflows/feedback.js +6 -6
- package/dist/core/templates/workflows/ff-change.js +24 -24
- package/dist/core/templates/workflows/new-change.js +20 -20
- package/dist/core/templates/workflows/onboard.js +33 -33
- package/dist/core/templates/workflows/propose.js +23 -23
- package/dist/core/templates/workflows/sdd.js +8 -8
- package/dist/core/templates/workflows/sync-specs.js +19 -19
- package/dist/core/templates/workflows/verify-change.js +17 -17
- package/dist/core/update.d.ts +2 -2
- package/dist/core/update.js +16 -15
- package/dist/core/validation/constants.d.ts +1 -1
- package/dist/core/validation/constants.js +1 -1
- package/dist/core/view.js +11 -11
- package/dist/telemetry/config.d.ts +2 -1
- package/dist/telemetry/config.js +17 -8
- package/dist/telemetry/index.d.ts +10 -2
- package/dist/telemetry/index.js +40 -7
- package/dist/ui/ascii-patterns.d.ts +2 -2
- package/dist/ui/ascii-patterns.js +2 -2
- package/dist/ui/welcome-screen.js +2 -2
- package/dist/utils/change-metadata.d.ts +4 -4
- package/dist/utils/change-metadata.js +6 -6
- package/dist/utils/change-utils.d.ts +3 -3
- package/dist/utils/change-utils.js +5 -5
- package/dist/utils/file-system.js +1 -1
- package/dist/utils/interactive.js +1 -1
- package/dist/utils/item-discovery.js +4 -4
- package/dist/utils/legacy-spec-compat.d.ts +2 -0
- package/dist/utils/legacy-spec-compat.js +2 -0
- package/dist/utils/shell-detection.d.ts +1 -0
- package/dist/utils/shell-detection.js +16 -0
- package/package.json +27 -17
- package/schemas/sdd/1-spec.schema.json +1 -1
- package/schemas/sdd/2-plan.schema.json +73 -1
- package/schemas/sdd/3-tasks.schema.json +73 -1
- package/schemas/sdd/4-changelog.schema.json +1 -1
- package/schemas/sdd/5-quality.schema.json +442 -2
- package/schemas/sdd/adr.schema.json +148 -0
- package/schemas/sdd/agent-binding-adapter.schema.json +210 -0
- package/schemas/sdd/agent-binding-resolution.schema.json +338 -0
- package/schemas/sdd/backlog-projection-plan.schema.json +180 -0
- package/schemas/sdd/backlog-provider-contract.schema.json +260 -0
- package/schemas/sdd/codesdd-plugin.schema.json +474 -0
- package/schemas/sdd/debate.schema.json +244 -0
- package/schemas/sdd/deepagent-decision-evidence.schema.json +58 -0
- package/schemas/sdd/deepagent-env-contract.schema.json +143 -0
- package/schemas/sdd/deepagent-quality-evidence.schema.json +108 -0
- package/schemas/sdd/deepagent-run-evidence.schema.json +192 -0
- package/schemas/sdd/deepagent-run-plan.schema.json +197 -0
- package/schemas/sdd/deepagent-run-request.schema.json +321 -0
- package/schemas/sdd/deepagent-subagent-evidence.schema.json +110 -0
- package/schemas/sdd/deepagent-tool-call-evidence.schema.json +78 -0
- package/schemas/sdd/discarded.schema.json +127 -0
- package/schemas/sdd/epic.schema.json +147 -0
- package/schemas/sdd/insight.schema.json +136 -0
- package/schemas/sdd/parallel-feat-automation-plan.schema.json +215 -0
- package/schemas/sdd/parallel-feat-automation-request.schema.json +109 -0
- package/schemas/sdd/plugin-artifact-manifest.schema.json +150 -0
- package/schemas/sdd/plugin-compliance-index.schema.json +136 -0
- package/schemas/sdd/plugin-dry-run-plan.schema.json +260 -0
- package/schemas/sdd/plugin-evidence-manifest.schema.json +569 -0
- package/schemas/sdd/plugin-policy-evaluation.schema.json +92 -0
- package/schemas/sdd/plugin-policy-pack-evaluation.schema.json +94 -0
- package/schemas/sdd/plugin-policy-pack.schema.json +196 -0
- package/schemas/sdd/plugin-registry.schema.json +558 -0
- package/schemas/sdd/plugin-rollback-manifest.schema.json +87 -0
- package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +845 -0
- package/schemas/sdd/plugin-skill-binding-resolution.schema.json +305 -0
- package/schemas/sdd/plugin-skill-binding.schema.json +88 -0
- package/schemas/sdd/plugin-validation-manifest.schema.json +123 -0
- package/schemas/sdd/quality-architecture-schema.schema.json +216 -0
- package/schemas/sdd/quality-evidence-bundle.schema.json +1228 -0
- package/schemas/sdd/quality-run.schema.json +197 -0
- package/schemas/sdd/quality-scenario.schema.json +252 -0
- package/schemas/sdd/workspace-catalog.schema.json +9841 -22
- package/schemas/spec-driven/schema.yaml +4 -4
- package/schemas/spec-driven/templates/proposal.md +1 -1
- package/dist/utils/openspec-compat.d.ts +0 -2
- package/dist/utils/openspec-compat.js +0 -2
package/dist/core/update.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Update Command
|
|
3
3
|
*
|
|
4
|
-
* Refreshes
|
|
4
|
+
* Refreshes CodeSDD skills and commands for configured tools.
|
|
5
5
|
* Supports profile-aware updates, delivery changes, migration, and smart update detection.
|
|
6
6
|
*/
|
|
7
7
|
import path from 'path';
|
|
@@ -11,7 +11,7 @@ import * as fs from 'fs';
|
|
|
11
11
|
import { createRequire } from 'module';
|
|
12
12
|
import { FileSystemUtils } from '../utils/file-system.js';
|
|
13
13
|
import { transformToHyphenCommands } from '../utils/command-references.js';
|
|
14
|
-
import { AI_TOOLS
|
|
14
|
+
import { AI_TOOLS } from './config.js';
|
|
15
15
|
import { generateCommands, CommandAdapterRegistry, } from './command-generation/index.js';
|
|
16
16
|
import { getToolVersionStatus, getSkillTemplates, getCommandContents, generateSkillContent, getToolsWithSkillsDir, } from './shared/index.js';
|
|
17
17
|
import { detectLegacyArtifacts, cleanupLegacyArtifacts, formatCleanupSummary, formatDetectionSummary, getToolsFromLegacyArtifacts, } from './legacy-cleanup.js';
|
|
@@ -22,8 +22,9 @@ import { getAvailableTools } from './available-tools.js';
|
|
|
22
22
|
import { WORKFLOW_TO_SKILL_DIR, getCommandConfiguredTools, getConfiguredToolsForProfileSync, getToolsNeedingProfileSync, } from './profile-sync-drift.js';
|
|
23
23
|
import { scanInstalledWorkflows as scanInstalledWorkflowsShared, migrateIfNeeded as migrateIfNeededShared, } from './migration.js';
|
|
24
24
|
import { CLI_NAME, CLI_REPOSITORY_URL } from './branding.js';
|
|
25
|
+
import { resolveLegacySpecLiveRoot } from './sdd/services/legacy-capability.service.js';
|
|
25
26
|
const require = createRequire(import.meta.url);
|
|
26
|
-
const { version:
|
|
27
|
+
const { version: CODESDD_VERSION } = require('../../package.json');
|
|
27
28
|
/**
|
|
28
29
|
* Scans installed workflow artifacts (skills and managed commands) across all configured tools.
|
|
29
30
|
* Returns the union of detected workflow IDs that match ALL_WORKFLOWS.
|
|
@@ -43,10 +44,10 @@ export class UpdateCommand {
|
|
|
43
44
|
}
|
|
44
45
|
async execute(projectPath) {
|
|
45
46
|
const resolvedProjectPath = path.resolve(projectPath);
|
|
46
|
-
const
|
|
47
|
-
// 1. Check
|
|
48
|
-
if (!await FileSystemUtils.directoryExists(
|
|
49
|
-
throw new Error(`No
|
|
47
|
+
const codesddPath = resolveLegacySpecLiveRoot(resolvedProjectPath);
|
|
48
|
+
// 1. Check codesdd directory exists
|
|
49
|
+
if (!await FileSystemUtils.directoryExists(codesddPath)) {
|
|
50
|
+
throw new Error(`No CodeSDD directory found. Run '${CLI_NAME} init' first.`);
|
|
50
51
|
}
|
|
51
52
|
// 2. Perform one-time migration if needed before any legacy upgrade generation.
|
|
52
53
|
// Use detected tool directories to preserve existing opsx skills/commands.
|
|
@@ -73,7 +74,7 @@ export class UpdateCommand {
|
|
|
73
74
|
const commandConfiguredTools = getCommandConfiguredTools(resolvedProjectPath);
|
|
74
75
|
const commandConfiguredSet = new Set(commandConfiguredTools);
|
|
75
76
|
const toolStatuses = configuredTools.map((toolId) => {
|
|
76
|
-
const status = getToolVersionStatus(resolvedProjectPath, toolId,
|
|
77
|
+
const status = getToolVersionStatus(resolvedProjectPath, toolId, CODESDD_VERSION);
|
|
77
78
|
if (!status.configured && commandConfiguredSet.has(toolId)) {
|
|
78
79
|
return { ...status, configured: true };
|
|
79
80
|
}
|
|
@@ -131,7 +132,7 @@ export class UpdateCommand {
|
|
|
131
132
|
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
132
133
|
// Use hyphen-based command references for OpenCode
|
|
133
134
|
const transformer = tool.value === 'opencode' ? transformToHyphenCommands : undefined;
|
|
134
|
-
const skillContent = generateSkillContent(template,
|
|
135
|
+
const skillContent = generateSkillContent(template, CODESDD_VERSION, transformer);
|
|
135
136
|
await FileSystemUtils.writeFile(skillFile, skillContent);
|
|
136
137
|
}
|
|
137
138
|
removedDeselectedSkillCount += await this.removeUnselectedSkillDirs(skillsDir, desiredWorkflows);
|
|
@@ -170,7 +171,7 @@ export class UpdateCommand {
|
|
|
170
171
|
// 11. Summary
|
|
171
172
|
console.log();
|
|
172
173
|
if (updatedTools.length > 0) {
|
|
173
|
-
console.log(chalk.green(`✓ Updated: ${updatedTools.join(', ')} (v${
|
|
174
|
+
console.log(chalk.green(`✓ Updated: ${updatedTools.join(', ')} (v${CODESDD_VERSION})`));
|
|
174
175
|
}
|
|
175
176
|
if (failedTools.length > 0) {
|
|
176
177
|
console.log(chalk.red(`✗ Failed: ${failedTools.map(f => `${f.name} (${f.error})`).join(', ')}`));
|
|
@@ -215,7 +216,7 @@ export class UpdateCommand {
|
|
|
215
216
|
*/
|
|
216
217
|
displayUpToDateMessage(toolStatuses) {
|
|
217
218
|
const toolNames = toolStatuses.map((s) => s.toolId);
|
|
218
|
-
console.log(chalk.green(`✓ All ${toolStatuses.length} tool(s) up to date (v${
|
|
219
|
+
console.log(chalk.green(`✓ All ${toolStatuses.length} tool(s) up to date (v${CODESDD_VERSION})`));
|
|
219
220
|
console.log(chalk.dim(` Tools: ${toolNames.join(', ')}`));
|
|
220
221
|
console.log();
|
|
221
222
|
console.log(chalk.dim('Use --force to refresh files anyway.'));
|
|
@@ -228,7 +229,7 @@ export class UpdateCommand {
|
|
|
228
229
|
const status = statusByTool.get(toolId);
|
|
229
230
|
if (status?.needsUpdate) {
|
|
230
231
|
const fromVersion = status.generatedByVersion ?? 'unknown';
|
|
231
|
-
return `${status.toolId} (${fromVersion} → ${
|
|
232
|
+
return `${status.toolId} (${fromVersion} → ${CODESDD_VERSION})`;
|
|
232
233
|
}
|
|
233
234
|
return `${toolId} (config sync)`;
|
|
234
235
|
});
|
|
@@ -262,7 +263,7 @@ export class UpdateCommand {
|
|
|
262
263
|
const profileSet = new Set(profileWorkflows);
|
|
263
264
|
const extraWorkflows = installedWorkflows.filter((w) => !profileSet.has(w));
|
|
264
265
|
if (extraWorkflows.length > 0) {
|
|
265
|
-
console.log(chalk.dim(`Note: ${extraWorkflows.length} extra workflows not in profile (use \`
|
|
266
|
+
console.log(chalk.dim(`Note: ${extraWorkflows.length} extra workflows not in profile (use \`codesdd config profile\` to manage)`));
|
|
266
267
|
}
|
|
267
268
|
}
|
|
268
269
|
/**
|
|
@@ -366,7 +367,7 @@ export class UpdateCommand {
|
|
|
366
367
|
return removed;
|
|
367
368
|
}
|
|
368
369
|
/**
|
|
369
|
-
* Detect and handle legacy
|
|
370
|
+
* Detect and handle legacy CodeSDD artifacts.
|
|
370
371
|
* Unlike init, update warns but continues if legacy files found in non-interactive mode.
|
|
371
372
|
* Returns array of tool IDs that were newly configured during legacy upgrade.
|
|
372
373
|
*/
|
|
@@ -506,7 +507,7 @@ export class UpdateCommand {
|
|
|
506
507
|
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
507
508
|
// Use hyphen-based command references for OpenCode
|
|
508
509
|
const transformer = tool.value === 'opencode' ? transformToHyphenCommands : undefined;
|
|
509
|
-
const skillContent = generateSkillContent(template,
|
|
510
|
+
const skillContent = generateSkillContent(template, CODESDD_VERSION, transformer);
|
|
510
511
|
await FileSystemUtils.writeFile(skillFile, skillContent);
|
|
511
512
|
}
|
|
512
513
|
}
|
|
@@ -26,7 +26,7 @@ export declare const VALIDATION_MESSAGES: {
|
|
|
26
26
|
readonly REQUIREMENT_TOO_LONG: "Requirement text is very long (>500 characters). Consider breaking it down.";
|
|
27
27
|
readonly DELTA_DESCRIPTION_TOO_BRIEF: "Delta description is too brief";
|
|
28
28
|
readonly DELTA_MISSING_REQUIREMENTS: "Delta should include requirements";
|
|
29
|
-
readonly GUIDE_NO_DELTAS: "No deltas found. Ensure your change has a specs/ directory with capability folders (e.g. specs/http-server/spec.md) containing .md files that use delta headers (## ADDED/MODIFIED/REMOVED/RENAMED Requirements) and that each requirement includes at least one \"#### Scenario:\" block. Tip: run \"
|
|
29
|
+
readonly GUIDE_NO_DELTAS: "No deltas found. Ensure your change has a specs/ directory with capability folders (e.g. specs/http-server/spec.md) containing .md files that use delta headers (## ADDED/MODIFIED/REMOVED/RENAMED Requirements) and that each requirement includes at least one \"#### Scenario:\" block. Tip: run \"codesdd change show <change-id> --json --deltas-only\" to inspect parsed deltas.";
|
|
30
30
|
readonly GUIDE_MISSING_SPEC_SECTIONS: "Missing required sections. Expected headers: \"## Purpose\" and \"## Requirements\". Example:\n## Purpose\n[brief purpose]\n\n## Requirements\n### Requirement: Clear requirement statement\nUsers SHALL ...\n\n#### Scenario: Descriptive name\n- **WHEN** ...\n- **THEN** ...";
|
|
31
31
|
readonly GUIDE_MISSING_CHANGE_SECTIONS: "Missing required sections. Expected headers: \"## Why\" and \"## What Changes\". Ensure deltas are documented in specs/ using delta headers.";
|
|
32
32
|
readonly GUIDE_SCENARIO_FORMAT: "Scenarios must use level-4 headers. Convert bullet lists into:\n#### Scenario: Short name\n- **WHEN** ...\n- **THEN** ...\n- **AND** ...";
|
|
@@ -32,7 +32,7 @@ export const VALIDATION_MESSAGES = {
|
|
|
32
32
|
DELTA_DESCRIPTION_TOO_BRIEF: 'Delta description is too brief',
|
|
33
33
|
DELTA_MISSING_REQUIREMENTS: 'Delta should include requirements',
|
|
34
34
|
// Guidance snippets (appended to primary messages for remediation)
|
|
35
|
-
GUIDE_NO_DELTAS: 'No deltas found. Ensure your change has a specs/ directory with capability folders (e.g. specs/http-server/spec.md) containing .md files that use delta headers (## ADDED/MODIFIED/REMOVED/RENAMED Requirements) and that each requirement includes at least one "#### Scenario:" block. Tip: run "
|
|
35
|
+
GUIDE_NO_DELTAS: 'No deltas found. Ensure your change has a specs/ directory with capability folders (e.g. specs/http-server/spec.md) containing .md files that use delta headers (## ADDED/MODIFIED/REMOVED/RENAMED Requirements) and that each requirement includes at least one "#### Scenario:" block. Tip: run "codesdd change show <change-id> --json --deltas-only" to inspect parsed deltas.',
|
|
36
36
|
GUIDE_MISSING_SPEC_SECTIONS: 'Missing required sections. Expected headers: "## Purpose" and "## Requirements". Example:\n## Purpose\n[brief purpose]\n\n## Requirements\n### Requirement: Clear requirement statement\nUsers SHALL ...\n\n#### Scenario: Descriptive name\n- **WHEN** ...\n- **THEN** ...',
|
|
37
37
|
GUIDE_MISSING_CHANGE_SECTIONS: 'Missing required sections. Expected headers: "## Why" and "## What Changes". Ensure deltas are documented in specs/ using delta headers.',
|
|
38
38
|
GUIDE_SCENARIO_FORMAT: 'Scenarios must use level-4 headers. Convert bullet lists into:\n#### Scenario: Short name\n- **WHEN** ...\n- **THEN** ...\n- **AND** ...',
|
package/dist/core/view.js
CHANGED
|
@@ -4,19 +4,19 @@ import chalk from 'chalk';
|
|
|
4
4
|
import { getTaskProgressForChange } from '../utils/task-progress.js';
|
|
5
5
|
import { MarkdownParser } from './parsers/markdown-parser.js';
|
|
6
6
|
import { CLI_NAME } from './branding.js';
|
|
7
|
-
import {
|
|
7
|
+
import { resolveLegacySpecSubpath } from './sdd/services/legacy-capability.service.js';
|
|
8
8
|
export class ViewCommand {
|
|
9
9
|
async execute(targetPath = '.') {
|
|
10
|
-
const
|
|
11
|
-
if (!fs.existsSync(
|
|
12
|
-
console.error(chalk.red('No
|
|
10
|
+
const codesddDir = resolveLegacySpecSubpath(targetPath);
|
|
11
|
+
if (!fs.existsSync(codesddDir)) {
|
|
12
|
+
console.error(chalk.red('No codesdd directory found'));
|
|
13
13
|
process.exit(1);
|
|
14
14
|
}
|
|
15
|
-
console.log(chalk.bold('\
|
|
15
|
+
console.log(chalk.bold('\nCodeSDD Dashboard\n'));
|
|
16
16
|
console.log('═'.repeat(60));
|
|
17
17
|
// Get changes and specs data
|
|
18
|
-
const changesData = await this.getChangesData(
|
|
19
|
-
const specsData = await this.getSpecsData(
|
|
18
|
+
const changesData = await this.getChangesData(codesddDir);
|
|
19
|
+
const specsData = await this.getSpecsData(codesddDir);
|
|
20
20
|
// Display summary metrics
|
|
21
21
|
this.displaySummary(changesData, specsData);
|
|
22
22
|
// Display draft changes
|
|
@@ -61,8 +61,8 @@ export class ViewCommand {
|
|
|
61
61
|
console.log('\n' + '═'.repeat(60));
|
|
62
62
|
console.log(chalk.dim(`\nUse ${chalk.white(`${CLI_NAME} list --changes`)} or ${chalk.white(`${CLI_NAME} list --specs`)} for detailed views`));
|
|
63
63
|
}
|
|
64
|
-
async getChangesData(
|
|
65
|
-
const changesDir = path.join(
|
|
64
|
+
async getChangesData(codesddDir) {
|
|
65
|
+
const changesDir = path.join(codesddDir, 'changes');
|
|
66
66
|
if (!fs.existsSync(changesDir)) {
|
|
67
67
|
return { draft: [], active: [], completed: [] };
|
|
68
68
|
}
|
|
@@ -102,8 +102,8 @@ export class ViewCommand {
|
|
|
102
102
|
completed.sort((a, b) => a.name.localeCompare(b.name));
|
|
103
103
|
return { draft, active, completed };
|
|
104
104
|
}
|
|
105
|
-
async getSpecsData(
|
|
106
|
-
const specsDir = path.join(
|
|
105
|
+
async getSpecsData(codesddDir) {
|
|
106
|
+
const specsDir = path.join(codesddDir, 'specs');
|
|
107
107
|
if (!fs.existsSync(specsDir)) {
|
|
108
108
|
return [];
|
|
109
109
|
}
|
|
@@ -8,9 +8,10 @@ export interface GlobalConfig {
|
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
10
|
* Get the path to the global config file.
|
|
11
|
-
* Uses ~/.
|
|
11
|
+
* Uses ~/.codesdd/config.toml.
|
|
12
12
|
*/
|
|
13
13
|
export declare function getConfigPath(): string;
|
|
14
|
+
export declare function getLegacyConfigPath(): string;
|
|
14
15
|
/**
|
|
15
16
|
* Read the global config file.
|
|
16
17
|
* Returns an empty object if the file doesn't exist.
|
package/dist/telemetry/config.js
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Global configuration for telemetry state.
|
|
3
|
-
* Stores anonymous ID and notice-seen flag in ~/.
|
|
3
|
+
* Stores anonymous ID and notice-seen flag in ~/.codesdd/config.toml.
|
|
4
|
+
* The legacy XDG JSON path remains a read-only compatibility fallback.
|
|
4
5
|
*/
|
|
5
6
|
import { promises as fs } from 'fs';
|
|
6
7
|
import path from 'path';
|
|
7
|
-
import
|
|
8
|
+
import { getGlobalConfigPath, getLegacyGlobalConfigPath, parseTomlContent, stringifyTomlContent, } from '../core/global-config.js';
|
|
8
9
|
/**
|
|
9
10
|
* Get the path to the global config file.
|
|
10
|
-
* Uses ~/.
|
|
11
|
+
* Uses ~/.codesdd/config.toml.
|
|
11
12
|
*/
|
|
12
13
|
export function getConfigPath() {
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
return getGlobalConfigPath();
|
|
15
|
+
}
|
|
16
|
+
export function getLegacyConfigPath() {
|
|
17
|
+
return getLegacyGlobalConfigPath();
|
|
15
18
|
}
|
|
16
19
|
/**
|
|
17
20
|
* Read the global config file.
|
|
@@ -21,11 +24,17 @@ export async function readConfig() {
|
|
|
21
24
|
const configPath = getConfigPath();
|
|
22
25
|
try {
|
|
23
26
|
const content = await fs.readFile(configPath, 'utf-8');
|
|
24
|
-
return
|
|
27
|
+
return parseTomlContent(content);
|
|
25
28
|
}
|
|
26
29
|
catch (error) {
|
|
27
30
|
if (error.code === 'ENOENT') {
|
|
28
|
-
|
|
31
|
+
try {
|
|
32
|
+
const legacyContent = await fs.readFile(getLegacyConfigPath(), 'utf-8');
|
|
33
|
+
return JSON.parse(legacyContent);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return {};
|
|
37
|
+
}
|
|
29
38
|
}
|
|
30
39
|
// If parse fails or other error, return empty config
|
|
31
40
|
return {};
|
|
@@ -47,7 +56,7 @@ export async function writeConfig(updates) {
|
|
|
47
56
|
if (updates.telemetry && existing.telemetry) {
|
|
48
57
|
merged.telemetry = { ...existing.telemetry, ...updates.telemetry };
|
|
49
58
|
}
|
|
50
|
-
await fs.writeFile(configPath,
|
|
59
|
+
await fs.writeFile(configPath, stringifyTomlContent(merged));
|
|
51
60
|
}
|
|
52
61
|
/**
|
|
53
62
|
* Get the telemetry config section.
|
|
@@ -1,8 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostHog hardcodes `console.error('Error while flushing PostHog', err)` in
|
|
3
|
+
* its core flush path (see @posthog/core posthog-core-stateless.mjs L38).
|
|
4
|
+
* The library exposes no option to disable it, so we filter those specific
|
|
5
|
+
* lines at the console.error layer. Non-PostHog calls pass through unchanged.
|
|
6
|
+
*/
|
|
7
|
+
export declare function __installPosthogErrorSilencer(): void;
|
|
1
8
|
/**
|
|
2
9
|
* Check if telemetry is enabled.
|
|
3
10
|
*
|
|
4
11
|
* Disabled when:
|
|
5
|
-
* -
|
|
12
|
+
* - CODESDD_TELEMETRY=0
|
|
13
|
+
* - CODESDD_TELEMETRY=0 (legacy alias)
|
|
6
14
|
* - DO_NOT_TRACK=1
|
|
7
15
|
* - CI=true (any CI environment)
|
|
8
16
|
*/
|
|
@@ -16,7 +24,7 @@ export declare function getOrCreateAnonymousId(): Promise<string>;
|
|
|
16
24
|
* Track a command execution.
|
|
17
25
|
*
|
|
18
26
|
* @param commandName - The command name (e.g., 'init', 'change:apply')
|
|
19
|
-
* @param version - The
|
|
27
|
+
* @param version - The CodeSDD version
|
|
20
28
|
*/
|
|
21
29
|
export declare function trackCommand(commandName: string, version: string): Promise<void>;
|
|
22
30
|
export declare function trackCommandCompleted(commandName: string, version: string, durationMs: number, status?: 'success' | 'error'): Promise<void>;
|
package/dist/telemetry/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Privacy-first design:
|
|
5
5
|
* - Only tracks command name and version
|
|
6
6
|
* - No arguments, file paths, or content
|
|
7
|
-
* - Opt-out via
|
|
7
|
+
* - Opt-out via CODESDD_TELEMETRY=0, legacy CODESDD_TELEMETRY=0, or DO_NOT_TRACK=1
|
|
8
8
|
* - Auto-disabled in CI environments
|
|
9
9
|
* - Anonymous ID is a random UUID with no relation to the user
|
|
10
10
|
*/
|
|
@@ -14,22 +14,49 @@ import { getTelemetryConfig, updateTelemetryConfig } from './config.js';
|
|
|
14
14
|
// PostHog API key - public key for client-side analytics
|
|
15
15
|
// This is safe to embed as it only allows sending events, not reading data
|
|
16
16
|
const POSTHOG_API_KEY = 'phc_Hthu8YvaIJ9QaFKyTG4TbVwkbd5ktcAFzVTKeMmoW2g';
|
|
17
|
-
//
|
|
18
|
-
const POSTHOG_HOST = 'https://edge.
|
|
17
|
+
// Legacy reverse proxy retained until the telemetry endpoint is renamed.
|
|
18
|
+
const POSTHOG_HOST = 'https://edge.sdd.dev';
|
|
19
19
|
let posthogClient = null;
|
|
20
20
|
let anonymousId = null;
|
|
21
21
|
const SHUTDOWN_TIMEOUT_MS = 200;
|
|
22
|
+
let consoleErrorPatched = false;
|
|
23
|
+
/**
|
|
24
|
+
* PostHog hardcodes `console.error('Error while flushing PostHog', err)` in
|
|
25
|
+
* its core flush path (see @posthog/core posthog-core-stateless.mjs L38).
|
|
26
|
+
* The library exposes no option to disable it, so we filter those specific
|
|
27
|
+
* lines at the console.error layer. Non-PostHog calls pass through unchanged.
|
|
28
|
+
*/
|
|
29
|
+
export function __installPosthogErrorSilencer() {
|
|
30
|
+
installPosthogErrorSilencer();
|
|
31
|
+
}
|
|
32
|
+
function installPosthogErrorSilencer() {
|
|
33
|
+
if (consoleErrorPatched)
|
|
34
|
+
return;
|
|
35
|
+
consoleErrorPatched = true;
|
|
36
|
+
const originalError = console.error.bind(console);
|
|
37
|
+
console.error = (...args) => {
|
|
38
|
+
const first = args[0];
|
|
39
|
+
if (typeof first === 'string' && first.startsWith('Error while flushing PostHog')) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
originalError(...args);
|
|
43
|
+
};
|
|
44
|
+
}
|
|
22
45
|
/**
|
|
23
46
|
* Check if telemetry is enabled.
|
|
24
47
|
*
|
|
25
48
|
* Disabled when:
|
|
26
|
-
* -
|
|
49
|
+
* - CODESDD_TELEMETRY=0
|
|
50
|
+
* - CODESDD_TELEMETRY=0 (legacy alias)
|
|
27
51
|
* - DO_NOT_TRACK=1
|
|
28
52
|
* - CI=true (any CI environment)
|
|
29
53
|
*/
|
|
30
54
|
export function isTelemetryEnabled() {
|
|
31
55
|
// Check explicit opt-out
|
|
32
|
-
if (process.env.
|
|
56
|
+
if (process.env.CODESDD_TELEMETRY === '0') {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (process.env.CODESDD_TELEMETRY === '0') {
|
|
33
60
|
return false;
|
|
34
61
|
}
|
|
35
62
|
// Respect DO_NOT_TRACK standard
|
|
@@ -72,11 +99,17 @@ export async function getOrCreateAnonymousId() {
|
|
|
72
99
|
*/
|
|
73
100
|
function getClient() {
|
|
74
101
|
if (!posthogClient) {
|
|
102
|
+
installPosthogErrorSilencer();
|
|
75
103
|
posthogClient = new PostHog(POSTHOG_API_KEY, {
|
|
76
104
|
host: POSTHOG_HOST,
|
|
77
105
|
flushAt: 1, // Send immediately, don't batch
|
|
78
106
|
flushInterval: 0, // No timer-based flushing
|
|
79
107
|
});
|
|
108
|
+
if (typeof posthogClient.on === 'function') {
|
|
109
|
+
posthogClient.on('error', () => {
|
|
110
|
+
// Swallow emitted errors; PostHog logs them via console.error which is filtered.
|
|
111
|
+
});
|
|
112
|
+
}
|
|
80
113
|
}
|
|
81
114
|
return posthogClient;
|
|
82
115
|
}
|
|
@@ -84,7 +117,7 @@ function getClient() {
|
|
|
84
117
|
* Track a command execution.
|
|
85
118
|
*
|
|
86
119
|
* @param commandName - The command name (e.g., 'init', 'change:apply')
|
|
87
|
-
* @param version - The
|
|
120
|
+
* @param version - The CodeSDD version
|
|
88
121
|
*/
|
|
89
122
|
export async function trackCommand(commandName, version) {
|
|
90
123
|
if (!isTelemetryEnabled()) {
|
|
@@ -173,7 +206,7 @@ export async function maybeShowTelemetryNotice() {
|
|
|
173
206
|
return;
|
|
174
207
|
}
|
|
175
208
|
// Display notice
|
|
176
|
-
console.log('Note:
|
|
209
|
+
console.log('Note: CodeSDD collects anonymous usage stats. Opt out: CODESDD_TELEMETRY=0');
|
|
177
210
|
// Mark as seen
|
|
178
211
|
await updateTelemetryConfig({ noticeSeen: true });
|
|
179
212
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ASCII art animation patterns for the welcome screen.
|
|
3
|
-
*
|
|
3
|
+
* CodeSDD logo animation - diamond/rhombus shape with hollow center "O".
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
|
-
* Welcome animation frames -
|
|
6
|
+
* Welcome animation frames - CodeSDD logo building from center
|
|
7
7
|
* 7 rows × 6 columns diamond with hollow center "O"
|
|
8
8
|
* Center bar is 2 cols × 3 rows (rows 3,4,5 cols 3,4)
|
|
9
9
|
* Each frame is an array of strings (lines of ASCII art)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ASCII art animation patterns for the welcome screen.
|
|
3
|
-
*
|
|
3
|
+
* CodeSDD logo animation - diamond/rhombus shape with hollow center "O".
|
|
4
4
|
*/
|
|
5
5
|
// Detect if full Unicode is supported
|
|
6
6
|
const supportsUnicode = process.platform !== 'win32' ||
|
|
@@ -15,7 +15,7 @@ const _ = CHARS.empty;
|
|
|
15
15
|
const F = CHARS.full;
|
|
16
16
|
const D = CHARS.dim;
|
|
17
17
|
/**
|
|
18
|
-
* Welcome animation frames -
|
|
18
|
+
* Welcome animation frames - CodeSDD logo building from center
|
|
19
19
|
* 7 rows × 6 columns diamond with hollow center "O"
|
|
20
20
|
* Center bar is 2 cols × 3 rows (rows 3,4,5 cols 3,4)
|
|
21
21
|
* Each frame is an array of strings (lines of ASCII art)
|
|
@@ -13,8 +13,8 @@ const ART_COLUMN_WIDTH = 24;
|
|
|
13
13
|
*/
|
|
14
14
|
function getWelcomeText() {
|
|
15
15
|
return [
|
|
16
|
-
chalk.white.bold('Welcome to
|
|
17
|
-
chalk.dim('
|
|
16
|
+
chalk.white.bold('Welcome to CodeSDD'),
|
|
17
|
+
chalk.dim('An AI-native spec-driven framework'),
|
|
18
18
|
'',
|
|
19
19
|
chalk.white('This setup will configure:'),
|
|
20
20
|
chalk.dim(' • Agent Skills for AI tools'),
|
|
@@ -17,7 +17,7 @@ export declare class ChangeMetadataError extends Error {
|
|
|
17
17
|
*/
|
|
18
18
|
export declare function validateSchemaName(schemaName: string, projectRoot?: string): string;
|
|
19
19
|
/**
|
|
20
|
-
* Writes change metadata to .
|
|
20
|
+
* Writes change metadata to .sdd.yaml in the change directory.
|
|
21
21
|
*
|
|
22
22
|
* @param changeDir - The path to the change directory
|
|
23
23
|
* @param metadata - The metadata to write
|
|
@@ -26,7 +26,7 @@ export declare function validateSchemaName(schemaName: string, projectRoot?: str
|
|
|
26
26
|
*/
|
|
27
27
|
export declare function writeChangeMetadata(changeDir: string, metadata: ChangeMetadata, projectRoot?: string): void;
|
|
28
28
|
/**
|
|
29
|
-
* Reads change metadata from .
|
|
29
|
+
* Reads change metadata from .sdd.yaml in the change directory.
|
|
30
30
|
*
|
|
31
31
|
* @param changeDir - The path to the change directory
|
|
32
32
|
* @param projectRoot - Optional project root for project-local schema resolution
|
|
@@ -39,8 +39,8 @@ export declare function readChangeMetadata(changeDir: string, projectRoot?: stri
|
|
|
39
39
|
*
|
|
40
40
|
* Resolution order:
|
|
41
41
|
* 1. Explicit schema (if provided)
|
|
42
|
-
* 2. Schema from .
|
|
43
|
-
* 3. Schema from
|
|
42
|
+
* 2. Schema from .sdd.yaml metadata (if exists)
|
|
43
|
+
* 3. Schema from legacy-spec/config.yaml (if exists)
|
|
44
44
|
* 4. Default 'spec-driven'
|
|
45
45
|
*
|
|
46
46
|
* @param changeDir - The path to the change directory
|
|
@@ -4,7 +4,7 @@ import * as yaml from 'yaml';
|
|
|
4
4
|
import { ChangeMetadataSchema } from '../core/artifact-graph/types.js';
|
|
5
5
|
import { listSchemas } from '../core/artifact-graph/resolver.js';
|
|
6
6
|
import { readProjectConfig } from '../core/project-config.js';
|
|
7
|
-
const METADATA_FILENAME = '.
|
|
7
|
+
const METADATA_FILENAME = '.sdd.yaml';
|
|
8
8
|
/**
|
|
9
9
|
* Error thrown when change metadata validation fails.
|
|
10
10
|
*/
|
|
@@ -34,7 +34,7 @@ export function validateSchemaName(schemaName, projectRoot) {
|
|
|
34
34
|
return schemaName;
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
* Writes change metadata to .
|
|
37
|
+
* Writes change metadata to .sdd.yaml in the change directory.
|
|
38
38
|
*
|
|
39
39
|
* @param changeDir - The path to the change directory
|
|
40
40
|
* @param metadata - The metadata to write
|
|
@@ -61,7 +61,7 @@ export function writeChangeMetadata(changeDir, metadata, projectRoot) {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
|
-
* Reads change metadata from .
|
|
64
|
+
* Reads change metadata from .sdd.yaml in the change directory.
|
|
65
65
|
*
|
|
66
66
|
* @param changeDir - The path to the change directory
|
|
67
67
|
* @param projectRoot - Optional project root for project-local schema resolution
|
|
@@ -106,8 +106,8 @@ export function readChangeMetadata(changeDir, projectRoot) {
|
|
|
106
106
|
*
|
|
107
107
|
* Resolution order:
|
|
108
108
|
* 1. Explicit schema (if provided)
|
|
109
|
-
* 2. Schema from .
|
|
110
|
-
* 3. Schema from
|
|
109
|
+
* 2. Schema from .sdd.yaml metadata (if exists)
|
|
110
|
+
* 3. Schema from legacy-spec/config.yaml (if exists)
|
|
111
111
|
* 4. Default 'spec-driven'
|
|
112
112
|
*
|
|
113
113
|
* @param changeDir - The path to the change directory
|
|
@@ -115,7 +115,7 @@ export function readChangeMetadata(changeDir, projectRoot) {
|
|
|
115
115
|
* @returns The resolved schema name
|
|
116
116
|
*/
|
|
117
117
|
export function resolveSchemaForChange(changeDir, explicitSchema) {
|
|
118
|
-
// Derive project root from changeDir (changeDir is typically projectRoot/
|
|
118
|
+
// Derive project root from changeDir (changeDir is typically projectRoot/legacy-spec/changes/change-name)
|
|
119
119
|
const projectRoot = path.resolve(changeDir, '../../..');
|
|
120
120
|
// 1. Explicit override wins
|
|
121
121
|
if (explicitSchema) {
|
|
@@ -39,7 +39,7 @@ export declare function validateChangeName(name: string): ValidationResult;
|
|
|
39
39
|
/**
|
|
40
40
|
* Creates a new change directory with metadata file.
|
|
41
41
|
*
|
|
42
|
-
* @param projectRoot - The root directory of
|
|
42
|
+
* @param projectRoot - The root directory of a project with compatibility `legacy-spec/` artifacts
|
|
43
43
|
* @param name - The change name (must be valid kebab-case)
|
|
44
44
|
* @param options - Optional settings for the change
|
|
45
45
|
* @throws Error if the change name is invalid
|
|
@@ -49,12 +49,12 @@ export declare function validateChangeName(name: string): ValidationResult;
|
|
|
49
49
|
* @returns Result containing the resolved schema name
|
|
50
50
|
*
|
|
51
51
|
* @example
|
|
52
|
-
* // Creates
|
|
52
|
+
* // Creates compatibility legacy-spec/changes/add-auth/ with default schema
|
|
53
53
|
* const result = await createChange('/path/to/project', 'add-auth')
|
|
54
54
|
* console.log(result.schema) // 'spec-driven' or value from config
|
|
55
55
|
*
|
|
56
56
|
* @example
|
|
57
|
-
* // Creates
|
|
57
|
+
* // Creates compatibility legacy-spec/changes/add-auth/ with custom schema
|
|
58
58
|
* const result = await createChange('/path/to/project', 'add-auth', { schema: 'my-workflow' })
|
|
59
59
|
* console.log(result.schema) // 'my-workflow'
|
|
60
60
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { FileSystemUtils } from './file-system.js';
|
|
2
2
|
import { writeChangeMetadata, validateSchemaName } from './change-metadata.js';
|
|
3
3
|
import { readProjectConfig } from '../core/project-config.js';
|
|
4
|
-
import {
|
|
4
|
+
import { resolveLegacySpecLiveSubpath } from '../core/sdd/services/legacy-capability.service.js';
|
|
5
5
|
const DEFAULT_SCHEMA = 'spec-driven';
|
|
6
6
|
/**
|
|
7
7
|
* Validates that a change name follows kebab-case conventions.
|
|
@@ -59,7 +59,7 @@ export function validateChangeName(name) {
|
|
|
59
59
|
/**
|
|
60
60
|
* Creates a new change directory with metadata file.
|
|
61
61
|
*
|
|
62
|
-
* @param projectRoot - The root directory of
|
|
62
|
+
* @param projectRoot - The root directory of a project with compatibility `legacy-spec/` artifacts
|
|
63
63
|
* @param name - The change name (must be valid kebab-case)
|
|
64
64
|
* @param options - Optional settings for the change
|
|
65
65
|
* @throws Error if the change name is invalid
|
|
@@ -69,12 +69,12 @@ export function validateChangeName(name) {
|
|
|
69
69
|
* @returns Result containing the resolved schema name
|
|
70
70
|
*
|
|
71
71
|
* @example
|
|
72
|
-
* // Creates
|
|
72
|
+
* // Creates compatibility legacy-spec/changes/add-auth/ with default schema
|
|
73
73
|
* const result = await createChange('/path/to/project', 'add-auth')
|
|
74
74
|
* console.log(result.schema) // 'spec-driven' or value from config
|
|
75
75
|
*
|
|
76
76
|
* @example
|
|
77
|
-
* // Creates
|
|
77
|
+
* // Creates compatibility legacy-spec/changes/add-auth/ with custom schema
|
|
78
78
|
* const result = await createChange('/path/to/project', 'add-auth', { schema: 'my-workflow' })
|
|
79
79
|
* console.log(result.schema) // 'my-workflow'
|
|
80
80
|
*/
|
|
@@ -103,7 +103,7 @@ export async function createChange(projectRoot, name, options = {}) {
|
|
|
103
103
|
// Validate the resolved schema
|
|
104
104
|
validateSchemaName(schemaName, projectRoot);
|
|
105
105
|
// Build the change directory path
|
|
106
|
-
const changeDir =
|
|
106
|
+
const changeDir = resolveLegacySpecLiveSubpath(projectRoot, 'changes', name);
|
|
107
107
|
// Check if change already exists
|
|
108
108
|
if (await FileSystemUtils.directoryExists(changeDir)) {
|
|
109
109
|
throw new Error(`Change '${name}' already exists at ${changeDir}`);
|
|
@@ -204,7 +204,7 @@ export class FileSystemUtils {
|
|
|
204
204
|
}
|
|
205
205
|
return await this.ensureWritePermissions(parentDir);
|
|
206
206
|
}
|
|
207
|
-
const testFile = path.join(dirPath, '.
|
|
207
|
+
const testFile = path.join(dirPath, '.sdd-test-' + Date.now() + '-' + Math.random().toString(36).slice(2));
|
|
208
208
|
await fs.writeFile(testFile, '');
|
|
209
209
|
// On Windows, file may be temporarily locked by antivirus or indexing services.
|
|
210
210
|
// Retry unlink with a small delay if it fails.
|
|
@@ -11,7 +11,7 @@ export function resolveNoInteractive(value) {
|
|
|
11
11
|
export function isInteractive(value) {
|
|
12
12
|
if (resolveNoInteractive(value))
|
|
13
13
|
return false;
|
|
14
|
-
if (process.env.
|
|
14
|
+
if (process.env.CODESDD_INTERACTIVE === '0')
|
|
15
15
|
return false;
|
|
16
16
|
// Respect the standard CI environment variable (set by GitHub Actions, GitLab CI, Travis, etc.)
|
|
17
17
|
if ('CI' in process.env)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { promises as fs } from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import {
|
|
3
|
+
import { resolveLegacySpecSubpath } from '../core/sdd/services/legacy-capability.service.js';
|
|
4
4
|
export async function getActiveChangeIds(root = process.cwd()) {
|
|
5
|
-
const changesPath =
|
|
5
|
+
const changesPath = resolveLegacySpecSubpath(root, 'changes');
|
|
6
6
|
try {
|
|
7
7
|
const entries = await fs.readdir(changesPath, { withFileTypes: true });
|
|
8
8
|
const result = [];
|
|
@@ -25,7 +25,7 @@ export async function getActiveChangeIds(root = process.cwd()) {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
export async function getSpecIds(root = process.cwd()) {
|
|
28
|
-
const specsPath =
|
|
28
|
+
const specsPath = resolveLegacySpecSubpath(root, 'specs');
|
|
29
29
|
const result = [];
|
|
30
30
|
try {
|
|
31
31
|
const entries = await fs.readdir(specsPath, { withFileTypes: true });
|
|
@@ -48,7 +48,7 @@ export async function getSpecIds(root = process.cwd()) {
|
|
|
48
48
|
return result.sort();
|
|
49
49
|
}
|
|
50
50
|
export async function getArchivedChangeIds(root = process.cwd()) {
|
|
51
|
-
const archivePath =
|
|
51
|
+
const archivePath = resolveLegacySpecSubpath(root, 'changes', 'archive');
|
|
52
52
|
try {
|
|
53
53
|
const entries = await fs.readdir(archivePath, { withFileTypes: true });
|
|
54
54
|
const result = [];
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { IMPORTED_LEGACY_SPEC_DIR, LEGACY_SPEC_DIR, LEGACY_SPEC_CAPABILITY, displayLegacyCapabilityPath, displayLegacySpecPath, resolveLegacyCapabilityDeprecatedLiveRoots, resolveLegacyCapabilityImportedRoot, resolveLegacyCapabilityDeprecatedImportedRoots, resolveLegacyCapabilityImportedDepositoRoot, resolveLegacyCapabilityLiveSubpath, resolveLegacyCapabilityLiveRoot, resolveLegacyCapabilityRoot, resolveLegacyCapabilitySubpath, resolveLegacySpecLiveSubpath, resolveLegacySpecLiveRoot, resolveLegacySpecRoot, resolveLegacySpecSubpath, type LegacyCapabilityDefinition, } from '../core/sdd/services/legacy-capability.service.js';
|
|
2
|
+
//# sourceMappingURL=legacy-spec-compat.d.ts.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { IMPORTED_LEGACY_SPEC_DIR, LEGACY_SPEC_DIR, LEGACY_SPEC_CAPABILITY, displayLegacyCapabilityPath, displayLegacySpecPath, resolveLegacyCapabilityDeprecatedLiveRoots, resolveLegacyCapabilityImportedRoot, resolveLegacyCapabilityDeprecatedImportedRoots, resolveLegacyCapabilityImportedDepositoRoot, resolveLegacyCapabilityLiveSubpath, resolveLegacyCapabilityLiveRoot, resolveLegacyCapabilityRoot, resolveLegacyCapabilitySubpath, resolveLegacySpecLiveSubpath, resolveLegacySpecLiveRoot, resolveLegacySpecRoot, resolveLegacySpecSubpath, } from '../core/sdd/services/legacy-capability.service.js';
|
|
2
|
+
//# sourceMappingURL=legacy-spec-compat.js.map
|
|
@@ -17,4 +17,5 @@ export interface ShellDetectionResult {
|
|
|
17
17
|
* @returns Detection result with supported shell and raw detected name
|
|
18
18
|
*/
|
|
19
19
|
export declare function detectShell(): ShellDetectionResult;
|
|
20
|
+
export declare function resolveShellProfilePath(shell: SupportedShell, homeDir?: string): string | undefined;
|
|
20
21
|
//# sourceMappingURL=shell-detection.d.ts.map
|