@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,4 +1,10 @@
1
+ import { type SddPaths, type SddRuntimeConfig, type SddStateSnapshot } from './state.js';
1
2
  import { type StructuralDiagnosticReport } from './structural-health.js';
3
+ import type { BacklogItem } from './types.js';
4
+ export type Finding = StructuralDiagnosticReport['findings'][number];
5
+ export type FindingSeverity = Finding['severity'];
6
+ export type FindingCategory = Finding['category'];
7
+ export type SanitizerDisposition = Finding['sanitizer']['disposition'];
2
8
  export interface SddDiagnoseOptions {
3
9
  strict?: boolean;
4
10
  }
@@ -14,6 +20,59 @@ export interface SddDiagnoseResult {
14
20
  export declare class SddDiagnosticOptionsError extends Error {
15
21
  constructor(message: string);
16
22
  }
23
+ export declare function projectRelative(projectRoot: string, targetPath: string): string;
24
+ export declare function isInsidePath(rootPath: string, candidatePath: string): boolean;
25
+ export declare function pathExists(targetPath: string): Promise<boolean>;
26
+ export declare function safeRealpath(targetPath: string): Promise<string>;
27
+ export declare function addFinding(findings: Finding[], input: {
28
+ finding_id: string;
29
+ rule_id: string;
30
+ category: FindingCategory;
31
+ severity: FindingSeverity;
32
+ summary: string;
33
+ evidence?: Record<string, unknown>;
34
+ location?: string;
35
+ sanitizer: {
36
+ disposition: SanitizerDisposition;
37
+ reason: string;
38
+ actions?: string[];
39
+ };
40
+ }): void;
41
+ export declare function duplicateIdFindings<T extends {
42
+ id: string;
43
+ }>(findings: Finding[], items: T[], scope: string, filePath: string): void;
44
+ export declare function zodIssuePath(pathSegments: PropertyKey[]): string;
45
+ export declare function normalizeFindingToken(input: string): string;
46
+ export declare function listFeatureWorkspaceDirs(rootDir: string, lifecycleRoot: 'planned' | 'active' | 'archived'): Promise<Array<{
47
+ featureId: string;
48
+ lifecycleRoot: 'planned' | 'active' | 'archived';
49
+ dirPath: string;
50
+ }>>;
51
+ export declare function hasLegacyMarkdown(workspaceDir: string): Promise<boolean>;
52
+ export declare function collectWorkspaceSchemaFindings(findings: Finding[], paths: SddPaths): Promise<void>;
53
+ export declare function collectWorkspaceAllowlistFindings(findings: Finding[], paths: SddPaths): Promise<void>;
54
+ export declare function collectLifecycleViolationFindings(findings: Finding[], paths: SddPaths, backlogItems: BacklogItem[]): Promise<void>;
55
+ export declare function qualityEvidenceReferencesCoverage(evidenceLog: Array<{
56
+ kind: string;
57
+ result: string;
58
+ artifact?: string;
59
+ }>, targets: {
60
+ unit: number;
61
+ integration: number;
62
+ }): boolean;
63
+ export declare function collectQualityEvidenceFindings(findings: Finding[], paths: SddPaths, backlogItems: BacklogItem[]): Promise<void>;
64
+ export declare function collectTraceabilityFindings(findings: Finding[], paths: SddPaths, backlogItems: BacklogItem[]): Promise<void>;
65
+ export declare function isPrivacyComplianceBacklogItem(item: BacklogItem): boolean;
66
+ export declare function collectPrivacyComplianceFindings(findings: Finding[], paths: SddPaths, snapshot: SddStateSnapshot): Promise<void>;
67
+ export declare function collectDuplicateIdFindings(findings: Finding[], snapshot: SddStateSnapshot, paths: SddPaths): void;
68
+ export declare function addBrokenReference(findings: Finding[], ref: string, owner: string, relation: string, location: string): void;
69
+ export declare function collectReferenceFindings(findings: Finding[], snapshot: SddStateSnapshot, paths: SddPaths): void;
70
+ export declare function collectDirectoryFindings(findings: Finding[], config: SddRuntimeConfig, paths: SddPaths): Promise<void>;
71
+ export declare function collectStateFileFindings(findings: Finding[], config: SddRuntimeConfig, paths: SddPaths): Promise<void>;
72
+ export declare function collectLifecyclePlacementFindings(findings: Finding[], paths: SddPaths, backlogItems: BacklogItem[]): Promise<void>;
73
+ export declare function newestMtime(filePaths: string[]): Promise<number>;
74
+ export declare function collectGeneratedViewFindings(findings: Finding[], config: SddRuntimeConfig, paths: SddPaths): Promise<void>;
75
+ export declare function collectBoundaryFindings(findings: Finding[], paths: SddPaths): Promise<void>;
17
76
  export declare function getDiagnosticExitCode(report: StructuralDiagnosticReport): number;
18
77
  export declare function getDiagnosticHealth(report: StructuralDiagnosticReport): SddDiagnoseResult['health'];
19
78
  export declare function diagnoseSddRoot(projectRoot: string, options?: SddDiagnoseOptions): Promise<StructuralDiagnosticReport>;
@@ -22,15 +22,15 @@ export class SddDiagnosticOptionsError extends Error {
22
22
  this.name = 'SddDiagnosticOptionsError';
23
23
  }
24
24
  }
25
- function projectRelative(projectRoot, targetPath) {
25
+ export function projectRelative(projectRoot, targetPath) {
26
26
  const relative = path.relative(projectRoot, targetPath);
27
27
  return relative.length > 0 ? relative : '.';
28
28
  }
29
- function isInsidePath(rootPath, candidatePath) {
29
+ export function isInsidePath(rootPath, candidatePath) {
30
30
  const relative = path.relative(rootPath, candidatePath);
31
31
  return relative === '' || (!!relative && !relative.startsWith('..') && !path.isAbsolute(relative));
32
32
  }
33
- async function pathExists(targetPath) {
33
+ export async function pathExists(targetPath) {
34
34
  try {
35
35
  await fs.access(targetPath);
36
36
  return true;
@@ -39,7 +39,7 @@ async function pathExists(targetPath) {
39
39
  return false;
40
40
  }
41
41
  }
42
- async function safeRealpath(targetPath) {
42
+ export async function safeRealpath(targetPath) {
43
43
  try {
44
44
  return await fs.realpath(targetPath);
45
45
  }
@@ -47,7 +47,7 @@ async function safeRealpath(targetPath) {
47
47
  return path.resolve(targetPath);
48
48
  }
49
49
  }
50
- function addFinding(findings, input) {
50
+ export function addFinding(findings, input) {
51
51
  findings.push(StructuralFindingSchema.parse({
52
52
  evidence: {},
53
53
  ...input,
@@ -57,7 +57,7 @@ function addFinding(findings, input) {
57
57
  },
58
58
  }));
59
59
  }
60
- function duplicateIdFindings(findings, items, scope, filePath) {
60
+ export function duplicateIdFindings(findings, items, scope, filePath) {
61
61
  const seen = new Set();
62
62
  const duplicates = new Set();
63
63
  for (const item of items) {
@@ -82,13 +82,13 @@ function duplicateIdFindings(findings, items, scope, filePath) {
82
82
  });
83
83
  }
84
84
  }
85
- function zodIssuePath(pathSegments) {
85
+ export function zodIssuePath(pathSegments) {
86
86
  return pathSegments.length > 0 ? pathSegments.join('.') : '<root>';
87
87
  }
88
- function normalizeFindingToken(input) {
88
+ export function normalizeFindingToken(input) {
89
89
  return input.toUpperCase().replace(/[^A-Z0-9]+/g, '-').replace(/^-+|-+$/g, '');
90
90
  }
91
- async function listFeatureWorkspaceDirs(rootDir, lifecycleRoot) {
91
+ export async function listFeatureWorkspaceDirs(rootDir, lifecycleRoot) {
92
92
  const entries = await fs.readdir(rootDir, { withFileTypes: true }).catch(() => []);
93
93
  return entries
94
94
  .filter((entry) => entry.isDirectory() && FEATURE_WORKSPACE_PATTERN.test(entry.name))
@@ -98,11 +98,11 @@ async function listFeatureWorkspaceDirs(rootDir, lifecycleRoot) {
98
98
  dirPath: path.join(rootDir, entry.name),
99
99
  }));
100
100
  }
101
- async function hasLegacyMarkdown(workspaceDir) {
101
+ export async function hasLegacyMarkdown(workspaceDir) {
102
102
  const entries = await fs.readdir(workspaceDir, { withFileTypes: true }).catch(() => []);
103
103
  return entries.some((entry) => entry.isFile() && entry.name.endsWith('.md'));
104
104
  }
105
- async function collectWorkspaceSchemaFindings(findings, paths) {
105
+ export async function collectWorkspaceSchemaFindings(findings, paths) {
106
106
  const workspaces = [
107
107
  ...(await listFeatureWorkspaceDirs(paths.plannedDir, 'planned')),
108
108
  ...(await listFeatureWorkspaceDirs(paths.activeDir, 'active')),
@@ -143,7 +143,7 @@ async function collectWorkspaceSchemaFindings(findings, paths) {
143
143
  ? 'Legacy markdown exists and should be migrated into schema-valid workspace YAML.'
144
144
  : 'Workspace YAML cannot be repaired automatically without losing feature-specific intent.',
145
145
  actions: legacyMarkdown
146
- ? [`opensdd sdd migrate-workspace --feat ${workspace.featureId}`]
146
+ ? [`codesdd sdd migrate-workspace --feat ${workspace.featureId}`]
147
147
  : [`edit ${relativePath} to match ${entry.name} schema`],
148
148
  },
149
149
  });
@@ -175,14 +175,14 @@ async function collectWorkspaceSchemaFindings(findings, paths) {
175
175
  ? 'Legacy markdown exists and should be migrated into schema-valid workspace YAML.'
176
176
  : 'Workspace YAML requires schema-aware manual editing.',
177
177
  actions: legacyMarkdown
178
- ? [`opensdd sdd migrate-workspace --feat ${workspace.featureId}`]
179
- : [`edit ${relativePath} and rerun opensdd sdd diagnose`],
178
+ ? [`codesdd sdd migrate-workspace --feat ${workspace.featureId}`]
179
+ : [`edit ${relativePath} and rerun codesdd sdd diagnose`],
180
180
  },
181
181
  });
182
182
  }
183
183
  }
184
184
  }
185
- async function collectWorkspaceAllowlistFindings(findings, paths) {
185
+ export async function collectWorkspaceAllowlistFindings(findings, paths) {
186
186
  const workspaces = [
187
187
  ...(await listFeatureWorkspaceDirs(paths.plannedDir, 'planned')),
188
188
  ...(await listFeatureWorkspaceDirs(paths.activeDir, 'active')),
@@ -200,7 +200,7 @@ async function collectWorkspaceAllowlistFindings(findings, paths) {
200
200
  rule_id: 'SH-RULE-WORKSPACE-FILE-NOT-ALLOWLISTED',
201
201
  category: 'integrity',
202
202
  severity: 'warning',
203
- summary: `${workspace.featureId} contains a workspace file outside the OpenSDD allowlist: ${entry.name}.`,
203
+ summary: `${workspace.featureId} contains a workspace file outside the CodeSDD allowlist: ${entry.name}.`,
204
204
  location: relativePath,
205
205
  evidence: {
206
206
  id: workspace.featureId,
@@ -216,7 +216,7 @@ async function collectWorkspaceAllowlistFindings(findings, paths) {
216
216
  : 'Non-allowlisted files may contain user data and require confirmation before relocation.',
217
217
  actions: [
218
218
  entry.name.endsWith('.md')
219
- ? `opensdd sdd migrate-workspace --feat ${workspace.featureId}`
219
+ ? `codesdd sdd migrate-workspace --feat ${workspace.featureId}`
220
220
  : 'move the file to .sdd/backup after review',
221
221
  'remove the file only after confirming it is obsolete',
222
222
  ],
@@ -225,7 +225,7 @@ async function collectWorkspaceAllowlistFindings(findings, paths) {
225
225
  }
226
226
  }
227
227
  }
228
- async function collectLifecycleViolationFindings(findings, paths, backlogItems) {
228
+ export async function collectLifecycleViolationFindings(findings, paths, backlogItems) {
229
229
  const byId = new Map(backlogItems.map((item) => [item.id, item]));
230
230
  const checks = [
231
231
  { root: 'planned', dir: paths.plannedDir, expectedStatus: 'READY' },
@@ -261,7 +261,7 @@ async function collectLifecycleViolationFindings(findings, paths, backlogItems)
261
261
  }
262
262
  }
263
263
  }
264
- function qualityEvidenceReferencesCoverage(evidenceLog, targets) {
264
+ export function qualityEvidenceReferencesCoverage(evidenceLog, targets) {
265
265
  if (evidenceLog.length === 0)
266
266
  return false;
267
267
  const evidenceText = evidenceLog
@@ -272,7 +272,7 @@ function qualityEvidenceReferencesCoverage(evidenceLog, targets) {
272
272
  evidenceText.includes(`${targets.unit}`) ||
273
273
  evidenceText.includes(`${targets.integration}`));
274
274
  }
275
- async function collectQualityEvidenceFindings(findings, paths, backlogItems) {
275
+ export async function collectQualityEvidenceFindings(findings, paths, backlogItems) {
276
276
  const byId = new Map(backlogItems.map((item) => [item.id, item]));
277
277
  const activeWorkspaces = await listFeatureWorkspaceDirs(paths.activeDir, 'active');
278
278
  for (const workspace of activeWorkspaces) {
@@ -326,7 +326,7 @@ async function collectQualityEvidenceFindings(findings, paths, backlogItems) {
326
326
  sanitizer: {
327
327
  disposition: 'manual',
328
328
  reason: 'Fix the quality YAML so coverage evidence can be validated before finalize.',
329
- actions: [`edit ${relativePath} and rerun opensdd sdd diagnose`],
329
+ actions: [`edit ${relativePath} and rerun codesdd sdd diagnose`],
330
330
  },
331
331
  });
332
332
  continue;
@@ -356,7 +356,7 @@ async function collectQualityEvidenceFindings(findings, paths, backlogItems) {
356
356
  });
357
357
  }
358
358
  }
359
- async function collectTraceabilityFindings(findings, paths, backlogItems) {
359
+ export async function collectTraceabilityFindings(findings, paths, backlogItems) {
360
360
  const byId = new Map(backlogItems.map((item) => [item.id, item]));
361
361
  const activeWorkspaces = await listFeatureWorkspaceDirs(paths.activeDir, 'active');
362
362
  for (const workspace of activeWorkspaces) {
@@ -419,7 +419,7 @@ async function collectTraceabilityFindings(findings, paths, backlogItems) {
419
419
  sanitizer: {
420
420
  disposition: 'manual',
421
421
  reason: 'Fix the workspace YAML before validating traceability closure.',
422
- actions: [`edit ${relativePath} and rerun opensdd sdd diagnose`],
422
+ actions: [`edit ${relativePath} and rerun codesdd sdd diagnose`],
423
423
  },
424
424
  });
425
425
  continue;
@@ -447,13 +447,13 @@ async function collectTraceabilityFindings(findings, paths, backlogItems) {
447
447
  });
448
448
  }
449
449
  }
450
- function isPrivacyComplianceBacklogItem(item) {
450
+ export function isPrivacyComplianceBacklogItem(item) {
451
451
  if (item.origin_ref === 'EPIC-0020' || item.origin_ref === 'EPIC-0021')
452
452
  return true;
453
453
  const refs = new Set(item.acceptance_refs || []);
454
454
  return refs.has('EPIC-0020') || refs.has('EPIC-0021') || refs.has('DEB-0021') || refs.has('INS-0021');
455
455
  }
456
- async function collectPrivacyComplianceFindings(findings, paths, snapshot) {
456
+ export async function collectPrivacyComplianceFindings(findings, paths, snapshot) {
457
457
  const privacyItems = snapshot.backlog.items.filter((item) => item.status !== 'DONE' && item.status !== 'ARCHIVED' && isPrivacyComplianceBacklogItem(item));
458
458
  if (privacyItems.length === 0)
459
459
  return;
@@ -542,7 +542,7 @@ async function collectPrivacyComplianceFindings(findings, paths, snapshot) {
542
542
  reason: 'Regulatory traceability requires explicit provenance and verification metadata.',
543
543
  actions: [
544
544
  `set authority/source_classification/last_verified_at/source_version/source_fingerprint for ${source.id}`,
545
- 'rerun opensdd sdd check --render and opensdd sdd diagnose',
545
+ 'rerun codesdd sdd check --render and codesdd sdd diagnose',
546
546
  ],
547
547
  },
548
548
  });
@@ -636,7 +636,7 @@ async function collectPrivacyComplianceFindings(findings, paths, snapshot) {
636
636
  }
637
637
  }
638
638
  }
639
- function collectDuplicateIdFindings(findings, snapshot, paths) {
639
+ export function collectDuplicateIdFindings(findings, snapshot, paths) {
640
640
  duplicateIdFindings(findings, snapshot.discoveryIndex.records, 'discovery-index.records', projectRelative(paths.projectRoot, paths.stateFiles.discoveryIndex));
641
641
  duplicateIdFindings(findings, snapshot.backlog.items, 'backlog.items', projectRelative(paths.projectRoot, paths.stateFiles.backlog));
642
642
  duplicateIdFindings(findings, snapshot.techDebt.items, 'tech-debt.items', projectRelative(paths.projectRoot, paths.stateFiles.techDebt));
@@ -644,7 +644,7 @@ function collectDuplicateIdFindings(findings, snapshot, paths) {
644
644
  duplicateIdFindings(findings, snapshot.frontendGaps.items, 'frontend-gaps.items', projectRelative(paths.projectRoot, paths.stateFiles.frontendGaps));
645
645
  }
646
646
  }
647
- function addBrokenReference(findings, ref, owner, relation, location) {
647
+ export function addBrokenReference(findings, ref, owner, relation, location) {
648
648
  addFinding(findings, {
649
649
  finding_id: `SH-BROKEN-REF-${owner}-${relation}-${ref}`.replace(/[^A-Z0-9-]/g, '-'),
650
650
  rule_id: 'SH-RULE-BROKEN-REFERENCE',
@@ -660,7 +660,7 @@ function addBrokenReference(findings, ref, owner, relation, location) {
660
660
  },
661
661
  });
662
662
  }
663
- function collectReferenceFindings(findings, snapshot, paths) {
663
+ export function collectReferenceFindings(findings, snapshot, paths) {
664
664
  const discoveryIds = new Set(snapshot.discoveryIndex.records.map((record) => record.id));
665
665
  const backlogIds = new Set(snapshot.backlog.items.map((item) => item.id));
666
666
  const techDebtIds = new Set(snapshot.techDebt.items.map((item) => item.id));
@@ -702,7 +702,7 @@ function collectReferenceFindings(findings, snapshot, paths) {
702
702
  }
703
703
  }
704
704
  }
705
- async function collectDirectoryFindings(findings, config, paths) {
705
+ export async function collectDirectoryFindings(findings, config, paths) {
706
706
  const requiredDirectories = [
707
707
  { semantic: 'memory', dir: paths.memoryRoot, severity: 'blocker' },
708
708
  { semantic: 'state', dir: paths.stateDir, severity: 'blocker' },
@@ -771,7 +771,7 @@ async function collectDirectoryFindings(findings, config, paths) {
771
771
  }
772
772
  }
773
773
  }
774
- async function collectStateFileFindings(findings, config, paths) {
774
+ export async function collectStateFileFindings(findings, config, paths) {
775
775
  const requiredStateFiles = [
776
776
  paths.stateFiles.discoveryIndex,
777
777
  paths.stateFiles.backlog,
@@ -812,7 +812,7 @@ async function collectStateFileFindings(findings, config, paths) {
812
812
  }
813
813
  }
814
814
  }
815
- async function collectLifecyclePlacementFindings(findings, paths, backlogItems) {
815
+ export async function collectLifecyclePlacementFindings(findings, paths, backlogItems) {
816
816
  const byId = new Map(backlogItems.map((item) => [item.id, item]));
817
817
  const plannedEntries = await fs.readdir(paths.plannedDir).catch(() => []);
818
818
  const activeEntries = await fs.readdir(paths.activeDir).catch(() => []);
@@ -985,7 +985,7 @@ async function collectLifecyclePlacementFindings(findings, paths, backlogItems)
985
985
  }
986
986
  }
987
987
  }
988
- async function newestMtime(filePaths) {
988
+ export async function newestMtime(filePaths) {
989
989
  let newest = 0;
990
990
  for (const filePath of filePaths) {
991
991
  const stat = await fs.stat(filePath).catch(() => null);
@@ -994,7 +994,7 @@ async function newestMtime(filePaths) {
994
994
  }
995
995
  return newest;
996
996
  }
997
- async function collectGeneratedViewFindings(findings, config, paths) {
997
+ export async function collectGeneratedViewFindings(findings, config, paths) {
998
998
  const generatedViews = [
999
999
  path.join(paths.pendenciasDir, 'backlog-features.md'),
1000
1000
  path.join(paths.pendenciasDir, 'backlog-graph.md'),
@@ -1029,7 +1029,7 @@ async function collectGeneratedViewFindings(findings, config, paths) {
1029
1029
  sanitizer: {
1030
1030
  disposition: 'safe',
1031
1031
  reason: 'Generated views can be recreated from canonical state.',
1032
- actions: ['run opensdd sdd check --render'],
1032
+ actions: ['run codesdd sdd check --render'],
1033
1033
  },
1034
1034
  });
1035
1035
  continue;
@@ -1050,13 +1050,13 @@ async function collectGeneratedViewFindings(findings, config, paths) {
1050
1050
  sanitizer: {
1051
1051
  disposition: 'safe',
1052
1052
  reason: 'Stale generated views can be refreshed from canonical state.',
1053
- actions: ['run opensdd sdd check --render'],
1053
+ actions: ['run codesdd sdd check --render'],
1054
1054
  },
1055
1055
  });
1056
1056
  }
1057
1057
  }
1058
1058
  }
1059
- async function collectBoundaryFindings(findings, paths) {
1059
+ export async function collectBoundaryFindings(findings, paths) {
1060
1060
  if (!(await pathExists(paths.memoryRoot)))
1061
1061
  return;
1062
1062
  const memoryRootReal = await safeRealpath(paths.memoryRoot);
@@ -39,6 +39,12 @@ Operational authority:
39
39
  - Human-readable operational views are derived from \`${memoryDir}/core/*.md\` and \`${memoryDir}/${config?.folders.planning || 'planning'}/*.md\`.
40
40
  - Do not use external context, memory, workflow, or backlog tools as a project source of truth.
41
41
 
42
+ Initial operational directives:
43
+ - CodeSDD is the official planner for any build request; other planners or agent-native plans are secondary execution aids only.
44
+ - For API/backend work, use \`devtrack-api\` by default unless the user or SDD context explicitly selects another skill/profile; Python/Flask API work stays routed to \`api-clean-flask-langgraph\`.
45
+ - During init, onboard, insight, and debate flows, CodeSDD-managed agent instruction blocks must be inspected and reconfigured when they drift from this contract.
46
+ - Commit requests must follow Conventional Commits, selective staging, and grouping by modified directory plus change protocol (\`src\`, \`${memoryDir}\`, docs, config, infra, dependencies, or generated files).
47
+
42
48
  Read order for any new agent:
43
49
  1. \`README.md\` (this block)
44
50
  2. \`${memoryDir}/AGENT.md\`
@@ -57,7 +63,11 @@ Essential commands:
57
63
  - \`${CLI_NAME} sdd context <FEAT-ID>\`
58
64
  - update \`${memoryDir}/${config?.folders.active || 'active'}/<FEAT-ID>/5-quality.yaml\`
59
65
  - \`${CLI_NAME} sdd frontend-impact <FEAT-ID> --status required|none --reason "..."\`
60
- - \`${CLI_NAME} sdd finalize --ref <FEAT-ID>\``;
66
+ - \`${CLI_NAME} sdd finalize --ref <FEAT-ID>\`
67
+ - \`${CLI_NAME} sdd diagnose\`
68
+ - \`${CLI_NAME} sdd check --render\`
69
+ - confirm \`DONE\`, \`current_stage: consolidacao\`, \`done_at\`, \`archived_at\`, \`${memoryDir}/${config?.folders.archived || 'archived'}/<FEAT-ID>/\`, and no \`${memoryDir}/${config?.folders.active || 'active'}/<FEAT-ID>/\`
70
+ - triage remote security warnings such as Dependabot as a fix, exception, or follow-up SDD item`;
61
71
  }
62
72
  function buildAgentGuideBlock(memoryDir, config) {
63
73
  const planningDir = config?.folders.planning || 'planning';
@@ -74,6 +84,9 @@ Official workflow:
74
84
  5. Update \`${memoryDir}/${activeDir}/<FEAT-ID>/5-quality.yaml\` with validation evidence or a formal exception.
75
85
  6. Declare frontend impact with \`${CLI_NAME} sdd frontend-impact <FEAT-ID> ...\`.
76
86
  7. After archiving the technical change, run \`${CLI_NAME} sdd finalize --ref <FEAT-ID>\`.
87
+ 8. After finalize, run \`${CLI_NAME} sdd diagnose\` and \`${CLI_NAME} sdd check --render\`.
88
+ 9. Confirm the FEAT is \`DONE\`, \`current_stage: consolidacao\`, has \`done_at\` and \`archived_at\`, is present under \`${memoryDir}/${config?.folders.archived || 'archived'}/<FEAT-ID>/\`, and has no \`${memoryDir}/${activeDir}/<FEAT-ID>/\` residue.
89
+ 10. Triage remote security warnings such as Dependabot as an in-scope fix, formal exception, or follow-up SDD item before reporting completion.
77
90
 
78
91
  - Canonical state: \`${memoryDir}/state/*.yaml\`
79
92
  - Views: \`${memoryDir}/core/*.md\` and \`${memoryDir}/${planningDir}/*.md\`
@@ -84,14 +97,20 @@ Official workflow:
84
97
 
85
98
  Operational exclusivity:
86
99
  - Do not consult or persist planning, backlog, workflow status, handoff, or project memory in external context stores.
87
- - If legacy notes conflict with OpenSDD, migrate useful decisions into \`${memoryDir}/state/*.yaml\`, \`${memoryDir}/active/<FEAT-ID>/\`, or the relevant OpenSDD guide, then ignore the legacy note.
88
- - Current repository files remain the implementation fact source; OpenSDD remains the operational state source.`;
100
+ - If legacy notes conflict with CodeSDD, migrate useful decisions into \`${memoryDir}/state/*.yaml\`, \`${memoryDir}/active/<FEAT-ID>/\`, or the relevant CodeSDD guide, then ignore the legacy note.
101
+ - Current repository files remain the implementation fact source; CodeSDD remains the operational state source.
102
+
103
+ Initial directives:
104
+ - CodeSDD is the official planner for requested work; model-native plans and other planning tools are subordinate to CodeSDD artifacts.
105
+ - API/backend work uses \`devtrack-api\` by default unless an explicit skill/profile says otherwise; Python/Flask API work uses \`api-clean-flask-langgraph\`.
106
+ - CodeSDD-managed blocks in \`AGENTS.md\`, \`AGENT.md\`, \`CLAUDE.md\`, \`GEMINI.md\`, \`.codex\`, \`.opencode\`, \`.ai\`, \`.cloud\`, or equivalent agent files must be inspected and normalized during init/onboard/insight/debate when CodeSDD owns project governance.
107
+ - Commits must use Conventional Commits, selective staging, and grouping by modified directory plus protocol: source, \`${memoryDir}\`, docs, config, infra, dependencies, generated files, renames, or deletions.`;
89
108
  }
90
109
  function buildRootAgentsBlock(memoryDir) {
91
110
  return `## SDD Operational Contract
92
111
 
93
112
  Agents working in this repository must treat documentation sync as part of feature completion.
94
- OpenSDD is the only canonical operational state system for this repository.
113
+ CodeSDD is the only canonical operational state system for this repository.
95
114
 
96
115
  Required execution order:
97
116
  1. Run \`${CLI_NAME} sdd onboard system\` before broad work.
@@ -106,9 +125,18 @@ Required execution order:
106
125
  - \`AGENTS.md\`
107
126
  - \`AGENT.md\`
108
127
  7. Run \`${CLI_NAME} sdd finalize --ref <FEAT-ID>\` to consolidate memory.
128
+ 8. After finalize, run \`${CLI_NAME} sdd diagnose\` and \`${CLI_NAME} sdd check --render\`.
129
+ 9. Confirm the completed FEAT is \`DONE\` in \`${memoryDir}/state/backlog.yaml\`, has \`current_stage: consolidacao\`, has \`done_at\` and \`archived_at\`, lives under \`${memoryDir}/archived/<FEAT-ID>/\`, and no longer has \`${memoryDir}/active/<FEAT-ID>/\` residue.
130
+ 10. If push or validation reports a remote security warning such as Dependabot, record the triage result in CodeSDD as an in-scope fix, formal exception, or follow-up SDD item before reporting completion.
109
131
 
110
132
  Canonical state lives in \`${memoryDir}/state/*.yaml\`. Markdown files are operational views or guides derived from that state.
111
- Do not use external context, memory, workflow, backlog, scratchpad, or handoff tools as a project source of truth. If legacy material is useful, repatriate it into OpenSDD and remove or deprecate the legacy artifact.`;
133
+ Do not use external context, memory, workflow, backlog, scratchpad, or handoff tools as a project source of truth. If legacy material is useful, repatriate it into CodeSDD and remove or deprecate the legacy artifact.
134
+
135
+ Initial directives:
136
+ - CodeSDD is the official planner. Other planning systems may assist execution only after CodeSDD context exists.
137
+ - API/backend work defaults to \`devtrack-api\` unless an explicit skill/profile overrides it; Python/Flask API work remains a documented exception routed to \`api-clean-flask-langgraph\`.
138
+ - CodeSDD lifecycle entrypoints must inspect and normalize CodeSDD-managed agent instruction blocks in root and tool-specific agent files.
139
+ - Commit work must use Conventional Commits, selective staging, and directory/protocol grouping. Source changes, \`${memoryDir}\` governance, docs, config, infra, dependencies, generated files, renames, and deletions should be staged and committed separately unless indivisible.`;
112
140
  }
113
141
  export async function syncSddGuideDocs(projectRoot, paths, config) {
114
142
  const readmePath = path.join(projectRoot, 'README.md');
@@ -9,6 +9,13 @@ export interface PostActiveValidationResult {
9
9
  ok: boolean;
10
10
  reasons: string[];
11
11
  }
12
+ export interface ArchivedActiveReference {
13
+ feature_id: string;
14
+ path: string;
15
+ message: string;
16
+ }
17
+ export declare function normalizeArchivedFeatureActiveReferences(paths: SddPaths, featureId: string): Promise<string[]>;
18
+ export declare function detectArchivedFeatureActiveReferences(paths: SddPaths, featureId: string): Promise<ArchivedActiveReference[]>;
12
19
  export declare function detectArchiveArchivedLifecycleCollisions(paths: SddPaths, featureId?: string): Promise<ArchiveArchivedLifecycleCollision[]>;
13
20
  export declare function validatePreFinalizeArchiveCanonicalization(paths: SddPaths, featureId: string): Promise<PostActiveValidationResult>;
14
21
  export declare function validatePostActiveFeaturePlacement(paths: SddPaths, featureId: string): Promise<PostActiveValidationResult>;
@@ -17,6 +17,65 @@ function relativePath(paths, targetPath) {
17
17
  function legacyArchiveRoot(paths) {
18
18
  return path.join(paths.memoryRoot, LEGACY_ARCHIVE_DIR);
19
19
  }
20
+ async function listFiles(root) {
21
+ const entries = await fs.readdir(root, { withFileTypes: true }).catch(() => []);
22
+ const files = [];
23
+ for (const entry of entries) {
24
+ const fullPath = path.join(root, entry.name);
25
+ if (entry.isDirectory()) {
26
+ files.push(...(await listFiles(fullPath)));
27
+ }
28
+ else if (entry.isFile()) {
29
+ files.push(fullPath);
30
+ }
31
+ }
32
+ return files;
33
+ }
34
+ function archivedActiveReferenceNeedle(featureId) {
35
+ return `.sdd/active/${featureId}`;
36
+ }
37
+ function archivedFeatureReference(featureId) {
38
+ return `.sdd/archived/${featureId}`;
39
+ }
40
+ export async function normalizeArchivedFeatureActiveReferences(paths, featureId) {
41
+ const archivedFeaturePath = path.join(paths.archivedDir, featureId);
42
+ if (!(await exists(archivedFeaturePath))) {
43
+ return [];
44
+ }
45
+ const needle = archivedActiveReferenceNeedle(featureId);
46
+ const replacement = archivedFeatureReference(featureId);
47
+ const updated = [];
48
+ for (const filePath of await listFiles(archivedFeaturePath)) {
49
+ const content = await fs.readFile(filePath, 'utf-8').catch(() => '');
50
+ if (!content.includes(needle)) {
51
+ continue;
52
+ }
53
+ await fs.writeFile(filePath, content.split(needle).join(replacement), 'utf-8');
54
+ updated.push(relativePath(paths, filePath));
55
+ }
56
+ return updated;
57
+ }
58
+ export async function detectArchivedFeatureActiveReferences(paths, featureId) {
59
+ const archivedFeaturePath = path.join(paths.archivedDir, featureId);
60
+ if (!(await exists(archivedFeaturePath))) {
61
+ return [];
62
+ }
63
+ const needle = archivedActiveReferenceNeedle(featureId);
64
+ const references = [];
65
+ for (const filePath of await listFiles(archivedFeaturePath)) {
66
+ const content = await fs.readFile(filePath, 'utf-8').catch(() => '');
67
+ if (!content.includes(needle)) {
68
+ continue;
69
+ }
70
+ const relative = relativePath(paths, filePath);
71
+ references.push({
72
+ feature_id: featureId,
73
+ path: relative,
74
+ message: `${featureId} archived workspace file ${relative} references removed active workspace ${needle}.`,
75
+ });
76
+ }
77
+ return references;
78
+ }
20
79
  export async function detectArchiveArchivedLifecycleCollisions(paths, featureId) {
21
80
  const legacyRoot = legacyArchiveRoot(paths);
22
81
  if (path.resolve(legacyRoot) === path.resolve(paths.archivedDir)) {
@@ -63,6 +122,8 @@ export async function validatePostActiveFeaturePlacement(paths, featureId) {
63
122
  }
64
123
  const collisions = await detectArchiveArchivedLifecycleCollisions(paths, featureId);
65
124
  reasons.push(...collisions.map((collision) => collision.message));
125
+ const activeReferences = await detectArchivedFeatureActiveReferences(paths, featureId);
126
+ reasons.push(...activeReferences.map((reference) => reference.message));
66
127
  return {
67
128
  ok: reasons.length === 0,
68
129
  reasons,
@@ -5,6 +5,7 @@ export class TransitionEngine {
5
5
  NEW: ['DEBATED', 'DISCARDED'],
6
6
  },
7
7
  DEB: {
8
+ DEBATED: ['APPROVED', 'DISCARDED'],
8
9
  OPEN: ['APPROVED', 'DISCARDED'],
9
10
  },
10
11
  EPIC: {
@@ -0,0 +1,5 @@
1
+ export type SddEntityType = 'FEAT' | 'RAD' | 'EPIC' | 'FGAP' | 'TD';
2
+ export declare function normalizeFeatRef(input: string): string | null;
3
+ export declare function normalizeSddEntityRef(input: string): string;
4
+ export declare function detectSddEntityType(input: string): SddEntityType | null;
5
+ //# sourceMappingURL=entity-reference.d.ts.map
@@ -0,0 +1,22 @@
1
+ const FEAT_ALIAS_PATTERN = /^(?:FEAT|FEATS|FEATES)-(\d{3,})$/i;
2
+ const CANONICAL_PATTERNS = [
3
+ ['FEAT', /^FEAT-\d{3,}$/],
4
+ ['EPIC', /^EPIC-\d{3,}$/],
5
+ ['RAD', /^RAD-\d{3,}$/],
6
+ ['FGAP', /^FGAP-\d{3,}$/],
7
+ ['TD', /^TD-\d{3,}$/],
8
+ ];
9
+ export function normalizeFeatRef(input) {
10
+ const match = input.trim().match(FEAT_ALIAS_PATTERN);
11
+ if (!match)
12
+ return null;
13
+ return `FEAT-${match[1]}`;
14
+ }
15
+ export function normalizeSddEntityRef(input) {
16
+ return normalizeFeatRef(input) ?? input.trim();
17
+ }
18
+ export function detectSddEntityType(input) {
19
+ const normalized = normalizeSddEntityRef(input);
20
+ return CANONICAL_PATTERNS.find(([, pattern]) => pattern.test(normalized))?.[0] ?? null;
21
+ }
22
+ //# sourceMappingURL=entity-reference.js.map
@@ -0,0 +1,31 @@
1
+ type BackfillScope = 'discovery' | 'adr';
2
+ export interface GovernanceBackfillException {
3
+ scope: BackfillScope;
4
+ file: string;
5
+ id: string;
6
+ reason: string;
7
+ severity: 'warning' | 'skipped';
8
+ }
9
+ export interface GovernanceBackfillBucket {
10
+ inspected: number;
11
+ updated: number;
12
+ skipped: number;
13
+ exceptions: GovernanceBackfillException[];
14
+ }
15
+ export interface GovernanceBackfillReport {
16
+ generated_at: string;
17
+ write: boolean;
18
+ discovery: GovernanceBackfillBucket;
19
+ adr: GovernanceBackfillBucket;
20
+ }
21
+ export interface GovernanceBackfillOptions {
22
+ projectRoot: string;
23
+ discovery?: boolean;
24
+ adr?: boolean;
25
+ write?: boolean;
26
+ reportPath?: string;
27
+ nowIso?: string;
28
+ }
29
+ export declare function backfillGovernanceFrontmatter(options: GovernanceBackfillOptions): Promise<GovernanceBackfillReport>;
30
+ export {};
31
+ //# sourceMappingURL=governance-backfill.d.ts.map