@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.
Files changed (345) hide show
  1. package/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +17 -17
  2. package/.sdd/skills/curated/devtrack-api/SKILL.md +160 -28
  3. package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +1 -1
  4. package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +8 -7
  5. package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +93 -0
  6. package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +317 -0
  7. package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +95 -0
  8. package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +295 -0
  9. package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +4 -4
  10. package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +4 -0
  11. package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +2 -2
  12. package/LICENSE +1 -1
  13. package/README.md +243 -51
  14. package/bin/codesdd.js +3 -2
  15. package/dist/cli/index.d.ts +2 -2
  16. package/dist/cli/index.js +11 -558
  17. package/dist/cli/program.d.ts +14 -0
  18. package/dist/cli/program.js +645 -0
  19. package/dist/commands/change.js +5 -5
  20. package/dist/commands/completion.d.ts +1 -1
  21. package/dist/commands/completion.js +9 -2
  22. package/dist/commands/config.js +159 -20
  23. package/dist/commands/feedback.js +1 -1
  24. package/dist/commands/schema.d.ts +63 -0
  25. package/dist/commands/schema.js +12 -12
  26. package/dist/commands/sdd/backlog.d.ts +3 -0
  27. package/dist/commands/sdd/backlog.js +54 -0
  28. package/dist/commands/sdd/execution.js +147 -16
  29. package/dist/commands/sdd/plugin.d.ts +3 -0
  30. package/dist/commands/sdd/plugin.js +153 -0
  31. package/dist/commands/sdd/shared.js +2 -23
  32. package/dist/commands/sdd/skills.js +7 -0
  33. package/dist/commands/sdd.js +69 -12
  34. package/dist/commands/spec.js +9 -9
  35. package/dist/commands/validate.js +6 -6
  36. package/dist/commands/workflow/instructions.js +6 -6
  37. package/dist/commands/workflow/new-change.js +3 -3
  38. package/dist/commands/workflow/shared.d.ts +1 -1
  39. package/dist/commands/workflow/shared.js +4 -4
  40. package/dist/core/archive.js +15 -5
  41. package/dist/core/artifact-graph/instruction-loader.d.ts +1 -1
  42. package/dist/core/artifact-graph/instruction-loader.js +3 -3
  43. package/dist/core/artifact-graph/resolver.d.ts +4 -4
  44. package/dist/core/artifact-graph/resolver.js +6 -6
  45. package/dist/core/branding.js +3 -3
  46. package/dist/core/cli/command-matrix.js +10 -1
  47. package/dist/core/cli-command-quality.d.ts +27 -0
  48. package/dist/core/cli-command-quality.js +171 -0
  49. package/dist/core/command-generation/adapters/costrict.d.ts +1 -1
  50. package/dist/core/command-generation/adapters/costrict.js +2 -2
  51. package/dist/core/command-generation/types.d.ts +1 -1
  52. package/dist/core/completions/command-registry.d.ts +1 -1
  53. package/dist/core/completions/command-registry.js +155 -12
  54. package/dist/core/completions/completion-provider.d.ts +14 -1
  55. package/dist/core/completions/completion-provider.js +29 -1
  56. package/dist/core/completions/generators/bash-generator.d.ts +1 -1
  57. package/dist/core/completions/generators/bash-generator.js +20 -12
  58. package/dist/core/completions/generators/fish-generator.d.ts +9 -1
  59. package/dist/core/completions/generators/fish-generator.js +39 -25
  60. package/dist/core/completions/generators/powershell-generator.d.ts +1 -1
  61. package/dist/core/completions/generators/powershell-generator.js +21 -11
  62. package/dist/core/completions/generators/zsh-generator.d.ts +3 -6
  63. package/dist/core/completions/generators/zsh-generator.js +21 -42
  64. package/dist/core/completions/installers/bash-installer.js +6 -6
  65. package/dist/core/completions/installers/fish-installer.js +1 -1
  66. package/dist/core/completions/installers/powershell-installer.js +14 -14
  67. package/dist/core/completions/installers/zsh-installer.d.ts +7 -1
  68. package/dist/core/completions/installers/zsh-installer.js +36 -8
  69. package/dist/core/completions/templates/bash-templates.d.ts +1 -1
  70. package/dist/core/completions/templates/bash-templates.js +12 -6
  71. package/dist/core/completions/templates/fish-templates.d.ts +2 -2
  72. package/dist/core/completions/templates/fish-templates.js +20 -9
  73. package/dist/core/completions/templates/powershell-templates.d.ts +1 -1
  74. package/dist/core/completions/templates/powershell-templates.js +13 -4
  75. package/dist/core/completions/templates/zsh-templates.d.ts +1 -1
  76. package/dist/core/completions/templates/zsh-templates.js +18 -9
  77. package/dist/core/config-schema.d.ts +3 -1
  78. package/dist/core/config-schema.js +26 -1
  79. package/dist/core/config.d.ts +3 -3
  80. package/dist/core/config.js +4 -4
  81. package/dist/core/global-config.d.ts +41 -12
  82. package/dist/core/global-config.js +344 -27
  83. package/dist/core/index.d.ts +1 -1
  84. package/dist/core/index.js +2 -2
  85. package/dist/core/init.d.ts +6 -1
  86. package/dist/core/init.js +99 -77
  87. package/dist/core/legacy-cleanup.d.ts +17 -17
  88. package/dist/core/legacy-cleanup.js +96 -79
  89. package/dist/core/list.js +18 -4
  90. package/dist/core/migration.d.ts +3 -1
  91. package/dist/core/migration.js +7 -8
  92. package/dist/core/parsers/change-parser.js +1 -1
  93. package/dist/core/parsers/markdown-parser.js +2 -2
  94. package/dist/core/profile-sync-drift.d.ts +1 -1
  95. package/dist/core/profile-sync-drift.js +13 -13
  96. package/dist/core/project-config.d.ts +4 -4
  97. package/dist/core/project-config.js +11 -11
  98. package/dist/core/schemas/change.schema.d.ts +1 -1
  99. package/dist/core/schemas/change.schema.js +1 -1
  100. package/dist/core/schemas/spec.schema.d.ts +1 -1
  101. package/dist/core/schemas/spec.schema.js +1 -1
  102. package/dist/core/sdd/adr.js +23 -1
  103. package/dist/core/sdd/agent-binding.d.ts +346 -0
  104. package/dist/core/sdd/agent-binding.js +343 -0
  105. package/dist/core/sdd/backlog-cli.d.ts +16 -0
  106. package/dist/core/sdd/backlog-cli.js +146 -0
  107. package/dist/core/sdd/backlog-conflict-policy.d.ts +58 -0
  108. package/dist/core/sdd/backlog-conflict-policy.js +230 -0
  109. package/dist/core/sdd/backlog-projection.d.ts +8 -0
  110. package/dist/core/sdd/backlog-projection.js +89 -0
  111. package/dist/core/sdd/backlog-provider-contract.d.ts +252 -0
  112. package/dist/core/sdd/backlog-provider-contract.js +158 -0
  113. package/dist/core/sdd/bootstrap.js +2 -2
  114. package/dist/core/sdd/check.d.ts +42 -0
  115. package/dist/core/sdd/check.js +22 -22
  116. package/dist/core/sdd/contract.d.ts +13 -0
  117. package/dist/core/sdd/contract.js +36 -0
  118. package/dist/core/sdd/coordination/coordination-adapters.d.ts +38 -0
  119. package/dist/core/sdd/coordination/coordination-adapters.js +139 -1
  120. package/dist/core/sdd/deepagent-contracts.d.ts +276 -0
  121. package/dist/core/sdd/deepagent-contracts.js +173 -0
  122. package/dist/core/sdd/deepagents/adr-governor.d.ts +2 -0
  123. package/dist/core/sdd/deepagents/adr-governor.js +30 -0
  124. package/dist/core/sdd/deepagents/backend.d.ts +63 -0
  125. package/dist/core/sdd/deepagents/backend.js +174 -0
  126. package/dist/core/sdd/deepagents/codesdd-tools.d.ts +39 -0
  127. package/dist/core/sdd/deepagents/codesdd-tools.js +83 -0
  128. package/dist/core/sdd/deepagents/evidence-mapper.d.ts +86 -0
  129. package/dist/core/sdd/deepagents/evidence-mapper.js +178 -0
  130. package/dist/core/sdd/deepagents/model-provider.d.ts +53 -0
  131. package/dist/core/sdd/deepagents/model-provider.js +379 -0
  132. package/dist/core/sdd/deepagents/policy-enforcement.d.ts +30 -0
  133. package/dist/core/sdd/deepagents/policy-enforcement.js +90 -0
  134. package/dist/core/sdd/deepagents/policy.d.ts +75 -0
  135. package/dist/core/sdd/deepagents/policy.js +358 -0
  136. package/dist/core/sdd/deepagents/quality-witness.d.ts +3 -0
  137. package/dist/core/sdd/deepagents/quality-witness.js +77 -0
  138. package/dist/core/sdd/deepagents/reversa-subagents.d.ts +75 -0
  139. package/dist/core/sdd/deepagents/reversa-subagents.js +182 -0
  140. package/dist/core/sdd/deepagents/runtime-factory.d.ts +90 -0
  141. package/dist/core/sdd/deepagents/runtime-factory.js +231 -0
  142. package/dist/core/sdd/deepagents/runtime-loader.d.ts +16 -0
  143. package/dist/core/sdd/deepagents/runtime-loader.js +65 -0
  144. package/dist/core/sdd/default-bootstrap-files.d.ts +2 -2
  145. package/dist/core/sdd/default-bootstrap-files.js +36 -2
  146. package/dist/core/sdd/default-skills.d.ts +30 -0
  147. package/dist/core/sdd/default-skills.js +181 -5
  148. package/dist/core/sdd/devtrack-api-appliance.d.ts +84 -0
  149. package/dist/core/sdd/devtrack-api-appliance.js +257 -0
  150. package/dist/core/sdd/devtrack-api-architecture.d.ts +31 -0
  151. package/dist/core/sdd/devtrack-api-architecture.js +608 -0
  152. package/dist/core/sdd/devtrack-api-import-boundary.d.ts +19 -0
  153. package/dist/core/sdd/devtrack-api-import-boundary.js +32 -0
  154. package/dist/core/sdd/diagnose.d.ts +59 -0
  155. package/dist/core/sdd/diagnose.js +37 -37
  156. package/dist/core/sdd/docs-sync.js +33 -5
  157. package/dist/core/sdd/domain/post-active-validation.d.ts +7 -0
  158. package/dist/core/sdd/domain/post-active-validation.js +61 -0
  159. package/dist/core/sdd/domain/transition-engine.js +1 -0
  160. package/dist/core/sdd/entity-reference.d.ts +5 -0
  161. package/dist/core/sdd/entity-reference.js +22 -0
  162. package/dist/core/sdd/governance-backfill.d.ts +31 -0
  163. package/dist/core/sdd/governance-backfill.js +359 -0
  164. package/dist/core/sdd/governance-parser.d.ts +21 -0
  165. package/dist/core/sdd/governance-parser.js +91 -0
  166. package/dist/core/sdd/governance-schemas.d.ts +245 -0
  167. package/dist/core/sdd/governance-schemas.js +143 -0
  168. package/dist/core/sdd/{import-openspec.d.ts → import-legacy-spec.d.ts} +7 -7
  169. package/dist/core/sdd/{import-openspec.js → import-legacy-spec.js} +21 -29
  170. package/dist/core/sdd/init.d.ts +3 -0
  171. package/dist/core/sdd/init.js +6 -3
  172. package/dist/core/sdd/json-schema.js +100 -6
  173. package/dist/core/sdd/knowledge-graph.d.ts +45 -0
  174. package/dist/core/sdd/knowledge-graph.js +288 -0
  175. package/dist/core/sdd/legacy-operations.js +431 -43
  176. package/dist/core/sdd/lenses.d.ts +1 -0
  177. package/dist/core/sdd/lenses.js +29 -1
  178. package/dist/core/sdd/migrate-workspace.js +56 -2
  179. package/dist/core/sdd/migrate.d.ts +1 -1
  180. package/dist/core/sdd/migrate.js +36 -2
  181. package/dist/core/sdd/package-structure-gate.d.ts +83 -0
  182. package/dist/core/sdd/package-structure-gate.js +362 -0
  183. package/dist/core/sdd/parallel-feat-automation.d.ts +152 -0
  184. package/dist/core/sdd/parallel-feat-automation.js +212 -0
  185. package/dist/core/sdd/plugin-broker.d.ts +558 -0
  186. package/dist/core/sdd/plugin-broker.js +482 -0
  187. package/dist/core/sdd/plugin-certification.d.ts +79 -0
  188. package/dist/core/sdd/plugin-certification.js +453 -0
  189. package/dist/core/sdd/plugin-cli.d.ts +109 -0
  190. package/dist/core/sdd/plugin-cli.js +198 -0
  191. package/dist/core/sdd/plugin-evidence.d.ts +275 -0
  192. package/dist/core/sdd/plugin-evidence.js +307 -0
  193. package/dist/core/sdd/plugin-manifest.d.ts +164 -0
  194. package/dist/core/sdd/plugin-manifest.js +215 -0
  195. package/dist/core/sdd/plugin-policy-pack.d.ts +88 -0
  196. package/dist/core/sdd/plugin-policy-pack.js +236 -0
  197. package/dist/core/sdd/plugin-policy.d.ts +68 -0
  198. package/dist/core/sdd/plugin-policy.js +212 -0
  199. package/dist/core/sdd/plugin-registry.d.ts +311 -0
  200. package/dist/core/sdd/plugin-registry.js +138 -0
  201. package/dist/core/sdd/plugin-skill-binding.d.ts +151 -0
  202. package/dist/core/sdd/plugin-skill-binding.js +339 -0
  203. package/dist/core/sdd/quality-artifact-manifest-validator.d.ts +28 -0
  204. package/dist/core/sdd/quality-artifact-manifest-validator.js +167 -0
  205. package/dist/core/sdd/quality-evidence-renderer.d.ts +65 -0
  206. package/dist/core/sdd/quality-evidence-renderer.js +218 -0
  207. package/dist/core/sdd/quality-scenario-runner.d.ts +42 -0
  208. package/dist/core/sdd/quality-scenario-runner.js +613 -0
  209. package/dist/core/sdd/quality-validation.d.ts +547 -0
  210. package/dist/core/sdd/quality-validation.js +239 -0
  211. package/dist/core/sdd/resolve-project-root.d.ts +2 -2
  212. package/dist/core/sdd/resolve-project-root.js +11 -5
  213. package/dist/core/sdd/sanitize.d.ts +30 -1
  214. package/dist/core/sdd/sanitize.js +23 -23
  215. package/dist/core/sdd/services/agent-run.service.d.ts +65 -0
  216. package/dist/core/sdd/services/agent-run.service.js +189 -0
  217. package/dist/core/sdd/services/breakdown.service.js +2 -1
  218. package/dist/core/sdd/services/context.service.js +18 -16
  219. package/dist/core/sdd/services/debate.service.js +15 -2
  220. package/dist/core/sdd/services/feature-lint.service.d.ts +22 -0
  221. package/dist/core/sdd/services/feature-lint.service.js +105 -5
  222. package/dist/core/sdd/services/finalize.service.d.ts +80 -0
  223. package/dist/core/sdd/services/finalize.service.js +323 -24
  224. package/dist/core/sdd/services/frontend-gap.service.js +22 -7
  225. package/dist/core/sdd/services/governance-control-plane-runtime-adapters.d.ts +17 -0
  226. package/dist/core/sdd/services/governance-control-plane-runtime-adapters.js +38 -0
  227. package/dist/core/sdd/services/governance-control-plane.service.d.ts +66 -0
  228. package/dist/core/sdd/services/governance-control-plane.service.js +134 -0
  229. package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
  230. package/dist/core/sdd/services/legacy-capability.service.d.ts +10 -7
  231. package/dist/core/sdd/services/legacy-capability.service.js +38 -21
  232. package/dist/core/sdd/services/mcp-runtime.service.d.ts +123 -8
  233. package/dist/core/sdd/services/mcp-runtime.service.js +1085 -33
  234. package/dist/core/sdd/services/onboard.service.js +2 -1
  235. package/dist/core/sdd/services/rebuild.service.js +6 -1
  236. package/dist/core/sdd/services/skills-sync.service.d.ts +17 -5
  237. package/dist/core/sdd/services/skills-sync.service.js +55 -2
  238. package/dist/core/sdd/services/start.service.js +6 -4
  239. package/dist/core/sdd/skill-bundles-curation-schema.d.ts +66 -0
  240. package/dist/core/sdd/skill-bundles-curation-schema.js +52 -0
  241. package/dist/core/sdd/skill-evidence.d.ts +19 -0
  242. package/dist/core/sdd/skill-evidence.js +38 -0
  243. package/dist/core/sdd/skill-policy-pool.d.ts +46 -0
  244. package/dist/core/sdd/skill-policy-pool.js +185 -0
  245. package/dist/core/sdd/state.d.ts +22 -0
  246. package/dist/core/sdd/state.js +66 -41
  247. package/dist/core/sdd/structural-health.d.ts +42 -42
  248. package/dist/core/sdd/types.d.ts +33 -7
  249. package/dist/core/sdd/types.js +17 -0
  250. package/dist/core/sdd/upgrade-to-codesdd.d.ts +45 -0
  251. package/dist/core/sdd/upgrade-to-codesdd.js +179 -0
  252. package/dist/core/sdd/workspace-schemas.d.ts +285 -14
  253. package/dist/core/sdd/workspace-schemas.js +148 -0
  254. package/dist/core/sdd/write-manifest.js +22 -4
  255. package/dist/core/shared/skill-generation.d.ts +1 -1
  256. package/dist/core/shared/skill-generation.js +15 -15
  257. package/dist/core/shared/tool-detection.d.ts +3 -3
  258. package/dist/core/shared/tool-detection.js +14 -14
  259. package/dist/core/specs-apply.js +6 -6
  260. package/dist/core/templates/index.d.ts +1 -1
  261. package/dist/core/templates/index.js +1 -1
  262. package/dist/core/templates/workflows/apply-change.js +14 -14
  263. package/dist/core/templates/workflows/archive-change.js +32 -32
  264. package/dist/core/templates/workflows/bulk-archive-change.js +25 -25
  265. package/dist/core/templates/workflows/continue-change.js +12 -12
  266. package/dist/core/templates/workflows/explore.js +29 -29
  267. package/dist/core/templates/workflows/feedback.js +6 -6
  268. package/dist/core/templates/workflows/ff-change.js +24 -24
  269. package/dist/core/templates/workflows/new-change.js +20 -20
  270. package/dist/core/templates/workflows/onboard.js +33 -33
  271. package/dist/core/templates/workflows/propose.js +23 -23
  272. package/dist/core/templates/workflows/sdd.js +8 -8
  273. package/dist/core/templates/workflows/sync-specs.js +19 -19
  274. package/dist/core/templates/workflows/verify-change.js +17 -17
  275. package/dist/core/update.d.ts +2 -2
  276. package/dist/core/update.js +16 -15
  277. package/dist/core/validation/constants.d.ts +1 -1
  278. package/dist/core/validation/constants.js +1 -1
  279. package/dist/core/view.js +11 -11
  280. package/dist/telemetry/config.d.ts +2 -1
  281. package/dist/telemetry/config.js +17 -8
  282. package/dist/telemetry/index.d.ts +10 -2
  283. package/dist/telemetry/index.js +40 -7
  284. package/dist/ui/ascii-patterns.d.ts +2 -2
  285. package/dist/ui/ascii-patterns.js +2 -2
  286. package/dist/ui/welcome-screen.js +2 -2
  287. package/dist/utils/change-metadata.d.ts +4 -4
  288. package/dist/utils/change-metadata.js +6 -6
  289. package/dist/utils/change-utils.d.ts +3 -3
  290. package/dist/utils/change-utils.js +5 -5
  291. package/dist/utils/file-system.js +1 -1
  292. package/dist/utils/interactive.js +1 -1
  293. package/dist/utils/item-discovery.js +4 -4
  294. package/dist/utils/legacy-spec-compat.d.ts +2 -0
  295. package/dist/utils/legacy-spec-compat.js +2 -0
  296. package/dist/utils/shell-detection.d.ts +1 -0
  297. package/dist/utils/shell-detection.js +16 -0
  298. package/package.json +27 -17
  299. package/schemas/sdd/1-spec.schema.json +1 -1
  300. package/schemas/sdd/2-plan.schema.json +73 -1
  301. package/schemas/sdd/3-tasks.schema.json +73 -1
  302. package/schemas/sdd/4-changelog.schema.json +1 -1
  303. package/schemas/sdd/5-quality.schema.json +442 -2
  304. package/schemas/sdd/adr.schema.json +148 -0
  305. package/schemas/sdd/agent-binding-adapter.schema.json +210 -0
  306. package/schemas/sdd/agent-binding-resolution.schema.json +338 -0
  307. package/schemas/sdd/backlog-projection-plan.schema.json +180 -0
  308. package/schemas/sdd/backlog-provider-contract.schema.json +260 -0
  309. package/schemas/sdd/codesdd-plugin.schema.json +474 -0
  310. package/schemas/sdd/debate.schema.json +244 -0
  311. package/schemas/sdd/deepagent-decision-evidence.schema.json +58 -0
  312. package/schemas/sdd/deepagent-env-contract.schema.json +143 -0
  313. package/schemas/sdd/deepagent-quality-evidence.schema.json +108 -0
  314. package/schemas/sdd/deepagent-run-evidence.schema.json +192 -0
  315. package/schemas/sdd/deepagent-run-plan.schema.json +197 -0
  316. package/schemas/sdd/deepagent-run-request.schema.json +321 -0
  317. package/schemas/sdd/deepagent-subagent-evidence.schema.json +110 -0
  318. package/schemas/sdd/deepagent-tool-call-evidence.schema.json +78 -0
  319. package/schemas/sdd/discarded.schema.json +127 -0
  320. package/schemas/sdd/epic.schema.json +147 -0
  321. package/schemas/sdd/insight.schema.json +136 -0
  322. package/schemas/sdd/parallel-feat-automation-plan.schema.json +215 -0
  323. package/schemas/sdd/parallel-feat-automation-request.schema.json +109 -0
  324. package/schemas/sdd/plugin-artifact-manifest.schema.json +150 -0
  325. package/schemas/sdd/plugin-compliance-index.schema.json +136 -0
  326. package/schemas/sdd/plugin-dry-run-plan.schema.json +260 -0
  327. package/schemas/sdd/plugin-evidence-manifest.schema.json +569 -0
  328. package/schemas/sdd/plugin-policy-evaluation.schema.json +92 -0
  329. package/schemas/sdd/plugin-policy-pack-evaluation.schema.json +94 -0
  330. package/schemas/sdd/plugin-policy-pack.schema.json +196 -0
  331. package/schemas/sdd/plugin-registry.schema.json +558 -0
  332. package/schemas/sdd/plugin-rollback-manifest.schema.json +87 -0
  333. package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +845 -0
  334. package/schemas/sdd/plugin-skill-binding-resolution.schema.json +305 -0
  335. package/schemas/sdd/plugin-skill-binding.schema.json +88 -0
  336. package/schemas/sdd/plugin-validation-manifest.schema.json +123 -0
  337. package/schemas/sdd/quality-architecture-schema.schema.json +216 -0
  338. package/schemas/sdd/quality-evidence-bundle.schema.json +1228 -0
  339. package/schemas/sdd/quality-run.schema.json +197 -0
  340. package/schemas/sdd/quality-scenario.schema.json +252 -0
  341. package/schemas/sdd/workspace-catalog.schema.json +9841 -22
  342. package/schemas/spec-driven/schema.yaml +4 -4
  343. package/schemas/spec-driven/templates/proposal.md +1 -1
  344. package/dist/utils/openspec-compat.d.ts +0 -2
  345. package/dist/utils/openspec-compat.js +0 -2
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Update Command
3
3
  *
4
- * Refreshes OpenSpec skills and commands for configured tools.
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, OPENSPEC_DIR_NAME } from './config.js';
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: OPENSPEC_VERSION } = require('../../package.json');
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 openspecPath = path.join(resolvedProjectPath, OPENSPEC_DIR_NAME);
47
- // 1. Check openspec directory exists
48
- if (!await FileSystemUtils.directoryExists(openspecPath)) {
49
- throw new Error(`No OpenSpec directory found. Run '${CLI_NAME} init' first.`);
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, OPENSPEC_VERSION);
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, OPENSPEC_VERSION, transformer);
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${OPENSPEC_VERSION})`));
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${OPENSPEC_VERSION})`));
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} → ${OPENSPEC_VERSION})`;
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 \`openspec config profile\` to manage)`));
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 OpenSpec artifacts.
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, OPENSPEC_VERSION, transformer);
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 \"opensdd change show <change-id> --json --deltas-only\" to inspect parsed deltas.";
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 "opensdd change show <change-id> --json --deltas-only" to inspect parsed deltas.',
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 { resolveOpenSpecSubpath } from './sdd/services/legacy-capability.service.js';
7
+ import { resolveLegacySpecSubpath } from './sdd/services/legacy-capability.service.js';
8
8
  export class ViewCommand {
9
9
  async execute(targetPath = '.') {
10
- const openspecDir = resolveOpenSpecSubpath(targetPath);
11
- if (!fs.existsSync(openspecDir)) {
12
- console.error(chalk.red('No openspec directory found'));
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('\nOpenSpec Dashboard\n'));
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(openspecDir);
19
- const specsData = await this.getSpecsData(openspecDir);
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(openspecDir) {
65
- const changesDir = path.join(openspecDir, 'changes');
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(openspecDir) {
106
- const specsDir = path.join(openspecDir, 'specs');
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 ~/.config/openspec/config.json on all platforms.
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.
@@ -1,17 +1,20 @@
1
1
  /**
2
2
  * Global configuration for telemetry state.
3
- * Stores anonymous ID and notice-seen flag in ~/.config/openspec/config.json
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 os from 'os';
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 ~/.config/openspec/config.json on all platforms.
11
+ * Uses ~/.codesdd/config.toml.
11
12
  */
12
13
  export function getConfigPath() {
13
- const configDir = path.join(os.homedir(), '.config', 'openspec');
14
- return path.join(configDir, 'config.json');
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 JSON.parse(content);
27
+ return parseTomlContent(content);
25
28
  }
26
29
  catch (error) {
27
30
  if (error.code === 'ENOENT') {
28
- return {};
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, JSON.stringify(merged, null, 2) + '\n');
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
- * - OPENSPEC_TELEMETRY=0
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 OpenSpec version
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>;
@@ -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 OPENSPEC_TELEMETRY=0 or DO_NOT_TRACK=1
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
- // Using reverse proxy to avoid ad blockers and keep traffic on our domain
18
- const POSTHOG_HOST = 'https://edge.openspec.dev';
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
- * - OPENSPEC_TELEMETRY=0
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.OPENSPEC_TELEMETRY === '0') {
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 OpenSpec version
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: OpenSpec collects anonymous usage stats. Opt out: OPENSPEC_TELEMETRY=0');
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
- * OpenSpec logo animation - diamond/rhombus shape with hollow center "O".
3
+ * CodeSDD logo animation - diamond/rhombus shape with hollow center "O".
4
4
  */
5
5
  /**
6
- * Welcome animation frames - OpenSpec logo building from center
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
- * OpenSpec logo animation - diamond/rhombus shape with hollow center "O".
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 - OpenSpec logo building from center
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 OpenSpec'),
17
- chalk.dim('A lightweight spec-driven framework'),
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 .openspec.yaml in the change directory.
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 .openspec.yaml in the change directory.
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 .openspec.yaml metadata (if exists)
43
- * 3. Schema from openspec/config.yaml (if exists)
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 = '.openspec.yaml';
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 .openspec.yaml in the change directory.
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 .openspec.yaml in the change directory.
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 .openspec.yaml metadata (if exists)
110
- * 3. Schema from openspec/config.yaml (if exists)
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/openspec/changes/change-name)
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 the project (where `openspec/` lives)
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 openspec/changes/add-auth/ with default schema
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 openspec/changes/add-auth/ with custom schema
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 { resolveOpenSpecLiveSubpath } from '../core/sdd/services/legacy-capability.service.js';
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 the project (where `openspec/` lives)
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 openspec/changes/add-auth/ with default schema
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 openspec/changes/add-auth/ with custom schema
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 = resolveOpenSpecLiveSubpath(projectRoot, 'changes', name);
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, '.openspec-test-' + Date.now() + '-' + Math.random().toString(36).slice(2));
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.OPEN_SPEC_INTERACTIVE === '0')
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 { resolveOpenSpecSubpath } from '../core/sdd/services/legacy-capability.service.js';
3
+ import { resolveLegacySpecSubpath } from '../core/sdd/services/legacy-capability.service.js';
4
4
  export async function getActiveChangeIds(root = process.cwd()) {
5
- const changesPath = resolveOpenSpecSubpath(root, 'changes');
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 = resolveOpenSpecSubpath(root, 'specs');
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 = resolveOpenSpecSubpath(root, 'changes', 'archive');
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