@devtrack-solution/codesdd 1.2.2

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 (433) hide show
  1. package/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +2751 -0
  2. package/.sdd/skills/curated/devtrack-api/SKILL.md +137 -0
  3. package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +4 -0
  4. package/.sdd/skills/curated/devtrack-api/references/application-presentation.md +381 -0
  5. package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +219 -0
  6. package/.sdd/skills/curated/devtrack-api/references/domain-modeling.md +359 -0
  7. package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +127 -0
  8. package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +207 -0
  9. package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +167 -0
  10. package/.sdd/skills/curated/devtrack-api/references/typeorm-infrastructure.md +334 -0
  11. package/LICENSE +21 -0
  12. package/README.md +842 -0
  13. package/bin/codesdd.js +10 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.js +560 -0
  16. package/dist/commands/change.d.ts +35 -0
  17. package/dist/commands/change.js +296 -0
  18. package/dist/commands/completion.d.ts +72 -0
  19. package/dist/commands/completion.js +258 -0
  20. package/dist/commands/config.d.ts +36 -0
  21. package/dist/commands/config.js +552 -0
  22. package/dist/commands/feedback.d.ts +9 -0
  23. package/dist/commands/feedback.js +184 -0
  24. package/dist/commands/schema.d.ts +6 -0
  25. package/dist/commands/schema.js +870 -0
  26. package/dist/commands/sdd/execution.d.ts +3 -0
  27. package/dist/commands/sdd/execution.js +409 -0
  28. package/dist/commands/sdd/shared.d.ts +9 -0
  29. package/dist/commands/sdd/shared.js +84 -0
  30. package/dist/commands/sdd/skills.d.ts +3 -0
  31. package/dist/commands/sdd/skills.js +154 -0
  32. package/dist/commands/sdd.d.ts +3 -0
  33. package/dist/commands/sdd.js +769 -0
  34. package/dist/commands/show.d.ts +14 -0
  35. package/dist/commands/show.js +133 -0
  36. package/dist/commands/spec.d.ts +15 -0
  37. package/dist/commands/spec.js +228 -0
  38. package/dist/commands/validate.d.ts +24 -0
  39. package/dist/commands/validate.js +295 -0
  40. package/dist/commands/workflow/index.d.ts +17 -0
  41. package/dist/commands/workflow/index.js +12 -0
  42. package/dist/commands/workflow/instructions.d.ts +29 -0
  43. package/dist/commands/workflow/instructions.js +383 -0
  44. package/dist/commands/workflow/new-change.d.ts +11 -0
  45. package/dist/commands/workflow/new-change.js +45 -0
  46. package/dist/commands/workflow/schemas.d.ts +10 -0
  47. package/dist/commands/workflow/schemas.js +34 -0
  48. package/dist/commands/workflow/shared.d.ts +57 -0
  49. package/dist/commands/workflow/shared.js +117 -0
  50. package/dist/commands/workflow/status.d.ts +14 -0
  51. package/dist/commands/workflow/status.js +76 -0
  52. package/dist/commands/workflow/templates.d.ts +16 -0
  53. package/dist/commands/workflow/templates.js +68 -0
  54. package/dist/core/archive.d.ts +16 -0
  55. package/dist/core/archive.js +487 -0
  56. package/dist/core/artifact-graph/graph.d.ts +56 -0
  57. package/dist/core/artifact-graph/graph.js +141 -0
  58. package/dist/core/artifact-graph/index.d.ts +7 -0
  59. package/dist/core/artifact-graph/index.js +13 -0
  60. package/dist/core/artifact-graph/instruction-loader.d.ts +143 -0
  61. package/dist/core/artifact-graph/instruction-loader.js +215 -0
  62. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  63. package/dist/core/artifact-graph/resolver.js +258 -0
  64. package/dist/core/artifact-graph/schema.d.ts +13 -0
  65. package/dist/core/artifact-graph/schema.js +108 -0
  66. package/dist/core/artifact-graph/state.d.ts +12 -0
  67. package/dist/core/artifact-graph/state.js +54 -0
  68. package/dist/core/artifact-graph/types.d.ts +45 -0
  69. package/dist/core/artifact-graph/types.js +43 -0
  70. package/dist/core/available-tools.d.ts +16 -0
  71. package/dist/core/available-tools.js +30 -0
  72. package/dist/core/branding.d.ts +8 -0
  73. package/dist/core/branding.js +12 -0
  74. package/dist/core/cli/command-matrix.d.ts +23 -0
  75. package/dist/core/cli/command-matrix.js +123 -0
  76. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  77. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  78. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  79. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  80. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  81. package/dist/core/command-generation/adapters/auggie.js +27 -0
  82. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  83. package/dist/core/command-generation/adapters/claude.js +50 -0
  84. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  85. package/dist/core/command-generation/adapters/cline.js +27 -0
  86. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  87. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  88. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  89. package/dist/core/command-generation/adapters/codex.js +39 -0
  90. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  91. package/dist/core/command-generation/adapters/continue.js +28 -0
  92. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  93. package/dist/core/command-generation/adapters/costrict.js +27 -0
  94. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  95. package/dist/core/command-generation/adapters/crush.js +30 -0
  96. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  97. package/dist/core/command-generation/adapters/cursor.js +44 -0
  98. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  99. package/dist/core/command-generation/adapters/factory.js +27 -0
  100. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  101. package/dist/core/command-generation/adapters/gemini.js +26 -0
  102. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  103. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  104. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  105. package/dist/core/command-generation/adapters/iflow.js +29 -0
  106. package/dist/core/command-generation/adapters/index.d.ts +29 -0
  107. package/dist/core/command-generation/adapters/index.js +29 -0
  108. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  109. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  110. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  111. package/dist/core/command-generation/adapters/kiro.js +26 -0
  112. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  113. package/dist/core/command-generation/adapters/opencode.js +29 -0
  114. package/dist/core/command-generation/adapters/pi.d.ts +14 -0
  115. package/dist/core/command-generation/adapters/pi.js +41 -0
  116. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  117. package/dist/core/command-generation/adapters/qoder.js +30 -0
  118. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  119. package/dist/core/command-generation/adapters/qwen.js +26 -0
  120. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  121. package/dist/core/command-generation/adapters/roocode.js +27 -0
  122. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  123. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  124. package/dist/core/command-generation/generator.d.ts +21 -0
  125. package/dist/core/command-generation/generator.js +27 -0
  126. package/dist/core/command-generation/index.d.ts +22 -0
  127. package/dist/core/command-generation/index.js +24 -0
  128. package/dist/core/command-generation/registry.d.ts +36 -0
  129. package/dist/core/command-generation/registry.js +92 -0
  130. package/dist/core/command-generation/types.d.ts +56 -0
  131. package/dist/core/command-generation/types.js +8 -0
  132. package/dist/core/completions/command-registry.d.ts +7 -0
  133. package/dist/core/completions/command-registry.js +461 -0
  134. package/dist/core/completions/completion-provider.d.ts +60 -0
  135. package/dist/core/completions/completion-provider.js +102 -0
  136. package/dist/core/completions/factory.d.ts +64 -0
  137. package/dist/core/completions/factory.js +75 -0
  138. package/dist/core/completions/generators/bash-generator.d.ts +32 -0
  139. package/dist/core/completions/generators/bash-generator.js +174 -0
  140. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  141. package/dist/core/completions/generators/fish-generator.js +157 -0
  142. package/dist/core/completions/generators/powershell-generator.d.ts +33 -0
  143. package/dist/core/completions/generators/powershell-generator.js +207 -0
  144. package/dist/core/completions/generators/zsh-generator.d.ts +44 -0
  145. package/dist/core/completions/generators/zsh-generator.js +250 -0
  146. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  147. package/dist/core/completions/installers/bash-installer.js +318 -0
  148. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  149. package/dist/core/completions/installers/fish-installer.js +143 -0
  150. package/dist/core/completions/installers/powershell-installer.d.ts +88 -0
  151. package/dist/core/completions/installers/powershell-installer.js +327 -0
  152. package/dist/core/completions/installers/zsh-installer.d.ts +125 -0
  153. package/dist/core/completions/installers/zsh-installer.js +452 -0
  154. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  155. package/dist/core/completions/templates/bash-templates.js +24 -0
  156. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  157. package/dist/core/completions/templates/fish-templates.js +39 -0
  158. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  159. package/dist/core/completions/templates/powershell-templates.js +25 -0
  160. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  161. package/dist/core/completions/templates/zsh-templates.js +36 -0
  162. package/dist/core/completions/types.d.ts +79 -0
  163. package/dist/core/completions/types.js +2 -0
  164. package/dist/core/config-prompts.d.ts +9 -0
  165. package/dist/core/config-prompts.js +34 -0
  166. package/dist/core/config-schema.d.ts +86 -0
  167. package/dist/core/config-schema.js +213 -0
  168. package/dist/core/config.d.ts +17 -0
  169. package/dist/core/config.js +33 -0
  170. package/dist/core/converters/json-converter.d.ts +6 -0
  171. package/dist/core/converters/json-converter.js +51 -0
  172. package/dist/core/global-config.d.ts +44 -0
  173. package/dist/core/global-config.js +125 -0
  174. package/dist/core/index.d.ts +2 -0
  175. package/dist/core/index.js +3 -0
  176. package/dist/core/init.d.ts +36 -0
  177. package/dist/core/init.js +576 -0
  178. package/dist/core/legacy-cleanup.d.ts +162 -0
  179. package/dist/core/legacy-cleanup.js +512 -0
  180. package/dist/core/list.d.ts +9 -0
  181. package/dist/core/list.js +173 -0
  182. package/dist/core/migration.d.ts +23 -0
  183. package/dist/core/migration.js +108 -0
  184. package/dist/core/parsers/change-parser.d.ts +13 -0
  185. package/dist/core/parsers/change-parser.js +193 -0
  186. package/dist/core/parsers/markdown-parser.d.ts +22 -0
  187. package/dist/core/parsers/markdown-parser.js +187 -0
  188. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  189. package/dist/core/parsers/requirement-blocks.js +201 -0
  190. package/dist/core/profile-sync-drift.d.ts +38 -0
  191. package/dist/core/profile-sync-drift.js +201 -0
  192. package/dist/core/profiles.d.ts +26 -0
  193. package/dist/core/profiles.js +41 -0
  194. package/dist/core/project-config.d.ts +64 -0
  195. package/dist/core/project-config.js +223 -0
  196. package/dist/core/schemas/base.schema.d.ts +13 -0
  197. package/dist/core/schemas/base.schema.js +13 -0
  198. package/dist/core/schemas/change.schema.d.ts +73 -0
  199. package/dist/core/schemas/change.schema.js +31 -0
  200. package/dist/core/schemas/index.d.ts +4 -0
  201. package/dist/core/schemas/index.js +4 -0
  202. package/dist/core/schemas/spec.schema.d.ts +18 -0
  203. package/dist/core/schemas/spec.schema.js +15 -0
  204. package/dist/core/sdd/adr-policy.d.ts +7 -0
  205. package/dist/core/sdd/adr-policy.js +47 -0
  206. package/dist/core/sdd/adr.d.ts +4 -0
  207. package/dist/core/sdd/adr.js +27 -0
  208. package/dist/core/sdd/bootstrap.d.ts +28 -0
  209. package/dist/core/sdd/bootstrap.js +353 -0
  210. package/dist/core/sdd/check.d.ts +51 -0
  211. package/dist/core/sdd/check.js +831 -0
  212. package/dist/core/sdd/coordination/coordination-adapters.d.ts +73 -0
  213. package/dist/core/sdd/coordination/coordination-adapters.js +87 -0
  214. package/dist/core/sdd/coordination/index.d.ts +2 -0
  215. package/dist/core/sdd/coordination/index.js +2 -0
  216. package/dist/core/sdd/dedup.d.ts +23 -0
  217. package/dist/core/sdd/dedup.js +62 -0
  218. package/dist/core/sdd/default-bootstrap-files.d.ts +23 -0
  219. package/dist/core/sdd/default-bootstrap-files.js +385 -0
  220. package/dist/core/sdd/default-skills.d.ts +16 -0
  221. package/dist/core/sdd/default-skills.js +427 -0
  222. package/dist/core/sdd/diagnose.d.ts +25 -0
  223. package/dist/core/sdd/diagnose.js +1312 -0
  224. package/dist/core/sdd/docs-sync.d.ts +21 -0
  225. package/dist/core/sdd/docs-sync.js +231 -0
  226. package/dist/core/sdd/domain/helpers.d.ts +6 -0
  227. package/dist/core/sdd/domain/helpers.js +37 -0
  228. package/dist/core/sdd/domain/lifecycle-guardrails.d.ts +22 -0
  229. package/dist/core/sdd/domain/lifecycle-guardrails.js +31 -0
  230. package/dist/core/sdd/domain/lifecycle-hooks.d.ts +16 -0
  231. package/dist/core/sdd/domain/lifecycle-hooks.js +27 -0
  232. package/dist/core/sdd/domain/post-active-validation.d.ts +15 -0
  233. package/dist/core/sdd/domain/post-active-validation.js +71 -0
  234. package/dist/core/sdd/domain/traceability.d.ts +8 -0
  235. package/dist/core/sdd/domain/traceability.js +83 -0
  236. package/dist/core/sdd/domain/transition-engine.d.ts +49 -0
  237. package/dist/core/sdd/domain/transition-engine.js +120 -0
  238. package/dist/core/sdd/fingerprint.d.ts +23 -0
  239. package/dist/core/sdd/fingerprint.js +146 -0
  240. package/dist/core/sdd/import-openspec.d.ts +31 -0
  241. package/dist/core/sdd/import-openspec.js +232 -0
  242. package/dist/core/sdd/init.d.ts +36 -0
  243. package/dist/core/sdd/init.js +65 -0
  244. package/dist/core/sdd/json-schema.d.ts +6 -0
  245. package/dist/core/sdd/json-schema.js +59 -0
  246. package/dist/core/sdd/legacy-operations.d.ts +286 -0
  247. package/dist/core/sdd/legacy-operations.js +2175 -0
  248. package/dist/core/sdd/lenses.d.ts +14 -0
  249. package/dist/core/sdd/lenses.js +97 -0
  250. package/dist/core/sdd/merge-catalog.d.ts +9 -0
  251. package/dist/core/sdd/merge-catalog.js +70 -0
  252. package/dist/core/sdd/migrate-workspace.d.ts +36 -0
  253. package/dist/core/sdd/migrate-workspace.js +344 -0
  254. package/dist/core/sdd/migrate.d.ts +24 -0
  255. package/dist/core/sdd/migrate.js +385 -0
  256. package/dist/core/sdd/resolve-project-root.d.ts +15 -0
  257. package/dist/core/sdd/resolve-project-root.js +46 -0
  258. package/dist/core/sdd/root-resolver.d.ts +16 -0
  259. package/dist/core/sdd/root-resolver.js +62 -0
  260. package/dist/core/sdd/sanitize.d.ts +35 -0
  261. package/dist/core/sdd/sanitize.js +750 -0
  262. package/dist/core/sdd/services/approve.service.d.ts +20 -0
  263. package/dist/core/sdd/services/approve.service.js +82 -0
  264. package/dist/core/sdd/services/audit.service.d.ts +53 -0
  265. package/dist/core/sdd/services/audit.service.js +136 -0
  266. package/dist/core/sdd/services/breakdown.service.d.ts +35 -0
  267. package/dist/core/sdd/services/breakdown.service.js +185 -0
  268. package/dist/core/sdd/services/context.service.d.ts +346 -0
  269. package/dist/core/sdd/services/context.service.js +278 -0
  270. package/dist/core/sdd/services/debate.service.d.ts +16 -0
  271. package/dist/core/sdd/services/debate.service.js +73 -0
  272. package/dist/core/sdd/services/decide.service.d.ts +23 -0
  273. package/dist/core/sdd/services/decide.service.js +81 -0
  274. package/dist/core/sdd/services/dedup-apply.service.d.ts +39 -0
  275. package/dist/core/sdd/services/dedup-apply.service.js +259 -0
  276. package/dist/core/sdd/services/feature-lint.service.d.ts +29 -0
  277. package/dist/core/sdd/services/feature-lint.service.js +146 -0
  278. package/dist/core/sdd/services/finalize.service.d.ts +33 -0
  279. package/dist/core/sdd/services/finalize.service.js +707 -0
  280. package/dist/core/sdd/services/frontend-gap.service.d.ts +23 -0
  281. package/dist/core/sdd/services/frontend-gap.service.js +117 -0
  282. package/dist/core/sdd/services/frontend-impact.service.d.ts +19 -0
  283. package/dist/core/sdd/services/frontend-impact.service.js +46 -0
  284. package/dist/core/sdd/services/ingest-deposito.service.d.ts +32 -0
  285. package/dist/core/sdd/services/ingest-deposito.service.js +231 -0
  286. package/dist/core/sdd/services/insight.service.d.ts +21 -0
  287. package/dist/core/sdd/services/insight.service.js +81 -0
  288. package/dist/core/sdd/services/legacy-capability.service.d.ts +24 -0
  289. package/dist/core/sdd/services/legacy-capability.service.js +59 -0
  290. package/dist/core/sdd/services/mcp-runtime.service.d.ts +42 -0
  291. package/dist/core/sdd/services/mcp-runtime.service.js +144 -0
  292. package/dist/core/sdd/services/metrics.service.d.ts +49 -0
  293. package/dist/core/sdd/services/metrics.service.js +181 -0
  294. package/dist/core/sdd/services/next.service.d.ts +35 -0
  295. package/dist/core/sdd/services/next.service.js +54 -0
  296. package/dist/core/sdd/services/onboard.service.d.ts +9 -0
  297. package/dist/core/sdd/services/onboard.service.js +165 -0
  298. package/dist/core/sdd/services/rebuild.service.d.ts +31 -0
  299. package/dist/core/sdd/services/rebuild.service.js +482 -0
  300. package/dist/core/sdd/services/scan-naming.service.d.ts +43 -0
  301. package/dist/core/sdd/services/scan-naming.service.js +246 -0
  302. package/dist/core/sdd/services/skills-invoke.service.d.ts +24 -0
  303. package/dist/core/sdd/services/skills-invoke.service.js +63 -0
  304. package/dist/core/sdd/services/skills-sync.service.d.ts +15 -0
  305. package/dist/core/sdd/services/skills-sync.service.js +117 -0
  306. package/dist/core/sdd/services/start.service.d.ts +26 -0
  307. package/dist/core/sdd/services/start.service.js +237 -0
  308. package/dist/core/sdd/skills.d.ts +15 -0
  309. package/dist/core/sdd/skills.js +46 -0
  310. package/dist/core/sdd/state-lock.d.ts +19 -0
  311. package/dist/core/sdd/state-lock.js +144 -0
  312. package/dist/core/sdd/state.d.ts +155 -0
  313. package/dist/core/sdd/state.js +1000 -0
  314. package/dist/core/sdd/store/in-memory-adapter.d.ts +12 -0
  315. package/dist/core/sdd/store/in-memory-adapter.js +27 -0
  316. package/dist/core/sdd/store/index.d.ts +5 -0
  317. package/dist/core/sdd/store/index.js +5 -0
  318. package/dist/core/sdd/store/sdd-stores.d.ts +25 -0
  319. package/dist/core/sdd/store/sdd-stores.js +59 -0
  320. package/dist/core/sdd/store/state-store.d.ts +32 -0
  321. package/dist/core/sdd/store/state-store.js +2 -0
  322. package/dist/core/sdd/store/yaml-file-adapter.d.ts +12 -0
  323. package/dist/core/sdd/store/yaml-file-adapter.js +43 -0
  324. package/dist/core/sdd/structural-health.d.ts +557 -0
  325. package/dist/core/sdd/structural-health.js +187 -0
  326. package/dist/core/sdd/transaction.d.ts +14 -0
  327. package/dist/core/sdd/transaction.js +100 -0
  328. package/dist/core/sdd/types.d.ts +1570 -0
  329. package/dist/core/sdd/types.js +617 -0
  330. package/dist/core/sdd/views.d.ts +3 -0
  331. package/dist/core/sdd/views.js +560 -0
  332. package/dist/core/sdd/workspace-schemas.d.ts +620 -0
  333. package/dist/core/sdd/workspace-schemas.js +254 -0
  334. package/dist/core/sdd/write-manifest.d.ts +25 -0
  335. package/dist/core/sdd/write-manifest.js +353 -0
  336. package/dist/core/shared/index.d.ts +8 -0
  337. package/dist/core/shared/index.js +8 -0
  338. package/dist/core/shared/skill-generation.d.ts +49 -0
  339. package/dist/core/shared/skill-generation.js +106 -0
  340. package/dist/core/shared/tool-detection.d.ts +71 -0
  341. package/dist/core/shared/tool-detection.js +158 -0
  342. package/dist/core/specs-apply.d.ts +73 -0
  343. package/dist/core/specs-apply.js +385 -0
  344. package/dist/core/styles/palette.d.ts +7 -0
  345. package/dist/core/styles/palette.js +8 -0
  346. package/dist/core/templates/index.d.ts +8 -0
  347. package/dist/core/templates/index.js +9 -0
  348. package/dist/core/templates/skill-templates.d.ts +20 -0
  349. package/dist/core/templates/skill-templates.js +19 -0
  350. package/dist/core/templates/types.d.ts +19 -0
  351. package/dist/core/templates/types.js +5 -0
  352. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  353. package/dist/core/templates/workflows/apply-change.js +308 -0
  354. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  355. package/dist/core/templates/workflows/archive-change.js +277 -0
  356. package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
  357. package/dist/core/templates/workflows/bulk-archive-change.js +502 -0
  358. package/dist/core/templates/workflows/continue-change.d.ts +10 -0
  359. package/dist/core/templates/workflows/continue-change.js +232 -0
  360. package/dist/core/templates/workflows/explore.d.ts +10 -0
  361. package/dist/core/templates/workflows/explore.js +475 -0
  362. package/dist/core/templates/workflows/feedback.d.ts +9 -0
  363. package/dist/core/templates/workflows/feedback.js +108 -0
  364. package/dist/core/templates/workflows/ff-change.d.ts +10 -0
  365. package/dist/core/templates/workflows/ff-change.js +206 -0
  366. package/dist/core/templates/workflows/new-change.d.ts +10 -0
  367. package/dist/core/templates/workflows/new-change.js +151 -0
  368. package/dist/core/templates/workflows/onboard.d.ts +10 -0
  369. package/dist/core/templates/workflows/onboard.js +573 -0
  370. package/dist/core/templates/workflows/propose.d.ts +10 -0
  371. package/dist/core/templates/workflows/propose.js +224 -0
  372. package/dist/core/templates/workflows/sdd.d.ts +10 -0
  373. package/dist/core/templates/workflows/sdd.js +107 -0
  374. package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
  375. package/dist/core/templates/workflows/sync-specs.js +286 -0
  376. package/dist/core/templates/workflows/verify-change.d.ts +10 -0
  377. package/dist/core/templates/workflows/verify-change.js +346 -0
  378. package/dist/core/update.d.ts +77 -0
  379. package/dist/core/update.js +538 -0
  380. package/dist/core/validation/constants.d.ts +34 -0
  381. package/dist/core/validation/constants.js +40 -0
  382. package/dist/core/validation/types.d.ts +18 -0
  383. package/dist/core/validation/types.js +2 -0
  384. package/dist/core/validation/validator.d.ts +33 -0
  385. package/dist/core/validation/validator.js +409 -0
  386. package/dist/core/view.d.ts +8 -0
  387. package/dist/core/view.js +170 -0
  388. package/dist/index.d.ts +3 -0
  389. package/dist/index.js +3 -0
  390. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  391. package/dist/prompts/searchable-multi-select.js +159 -0
  392. package/dist/telemetry/config.d.ts +32 -0
  393. package/dist/telemetry/config.js +68 -0
  394. package/dist/telemetry/index.d.ts +44 -0
  395. package/dist/telemetry/index.js +207 -0
  396. package/dist/ui/ascii-patterns.d.ts +16 -0
  397. package/dist/ui/ascii-patterns.js +133 -0
  398. package/dist/ui/welcome-screen.d.ts +10 -0
  399. package/dist/ui/welcome-screen.js +146 -0
  400. package/dist/utils/change-metadata.d.ts +51 -0
  401. package/dist/utils/change-metadata.js +147 -0
  402. package/dist/utils/change-utils.d.ts +62 -0
  403. package/dist/utils/change-utils.js +121 -0
  404. package/dist/utils/command-references.d.ts +18 -0
  405. package/dist/utils/command-references.js +20 -0
  406. package/dist/utils/file-system.d.ts +36 -0
  407. package/dist/utils/file-system.js +281 -0
  408. package/dist/utils/index.d.ts +6 -0
  409. package/dist/utils/index.js +9 -0
  410. package/dist/utils/interactive.d.ts +18 -0
  411. package/dist/utils/interactive.js +21 -0
  412. package/dist/utils/item-discovery.d.ts +4 -0
  413. package/dist/utils/item-discovery.js +73 -0
  414. package/dist/utils/match.d.ts +3 -0
  415. package/dist/utils/match.js +22 -0
  416. package/dist/utils/openspec-compat.d.ts +2 -0
  417. package/dist/utils/openspec-compat.js +2 -0
  418. package/dist/utils/shell-detection.d.ts +20 -0
  419. package/dist/utils/shell-detection.js +41 -0
  420. package/dist/utils/task-progress.d.ts +8 -0
  421. package/dist/utils/task-progress.js +36 -0
  422. package/package.json +111 -0
  423. package/schemas/sdd/1-spec.schema.json +221 -0
  424. package/schemas/sdd/2-plan.schema.json +199 -0
  425. package/schemas/sdd/3-tasks.schema.json +102 -0
  426. package/schemas/sdd/4-changelog.schema.json +55 -0
  427. package/schemas/sdd/5-quality.schema.json +427 -0
  428. package/schemas/sdd/workspace-catalog.schema.json +1012 -0
  429. package/schemas/spec-driven/schema.yaml +153 -0
  430. package/schemas/spec-driven/templates/design.md +19 -0
  431. package/schemas/spec-driven/templates/proposal.md +23 -0
  432. package/schemas/spec-driven/templates/spec.md +8 -0
  433. package/schemas/spec-driven/templates/tasks.md +9 -0
@@ -0,0 +1,237 @@
1
+ import path from "node:path";
2
+ import { promises as fs } from "node:fs";
3
+ import { LENSES, validateDocumentAgainstLens } from "../lenses.js";
4
+ import { adrFileName, generateAdrTemplate } from "../adr.js";
5
+ import { evaluateFeatureStartGuardrails } from "../domain/lifecycle-guardrails.js";
6
+ import { runLifecycleHooks } from "../domain/lifecycle-hooks.js";
7
+ import { allocateEntityId, loadStateSnapshot, loadSkillCatalogState, nowIso, saveStateTransaction } from "../state.js";
8
+ import { slugify, findDiscoveryRecord, ensureFeatureQualityContract, bundlesForSkills, syncCounterFromId, getRuntime, persistAndRender, activeDocNamesForLayout, ensureFeaturePlannedWorkspace, resolveRadar, resolveFeat, buildBacklogItem, classifyFeatureShape, stackContextTokens, updateDependencyMetadata, gitHeadCommit, resolveRoutedSkills, inferOriginType, applyLoggedTransition, pathExists } from "../legacy-operations.js";
9
+ import { SddWriteTransaction } from "../write-manifest.js";
10
+ import { withStateLock } from "../state-lock.js";
11
+ import { featureDeclaresMandatoryAdrImpact } from "../adr-policy.js";
12
+ export class StartService {
13
+ stores;
14
+ constructor(stores) {
15
+ this.stores = stores;
16
+ }
17
+ async execute(projectRoot, refOrText, options) {
18
+ const value = refOrText.trim();
19
+ if (!value) {
20
+ throw new Error('Informe uma referencia ou descricao para iniciar.');
21
+ }
22
+ const { config, paths } = await getRuntime(projectRoot);
23
+ return withStateLock(paths.stateDir, async () => {
24
+ const snapshot = await loadStateSnapshot(paths, config);
25
+ const catalog = await loadSkillCatalogState(paths);
26
+ const now = nowIso();
27
+ let feature;
28
+ if (/^FEAT-\d{3,}$/.test(value)) {
29
+ feature = resolveFeat(snapshot.backlog.items, value);
30
+ }
31
+ else if (/^(?:RAD|EPIC)-\d{3,}$/.test(value)) {
32
+ const existing = snapshot.backlog.items.find((item) => (item.origin_type === 'radar' || item.origin_type === 'epic') && item.origin_ref === value);
33
+ if (existing) {
34
+ feature = existing;
35
+ }
36
+ else {
37
+ const id = await allocateEntityId(paths, 'FEAT');
38
+ syncCounterFromId(snapshot.discoveryIndex, id);
39
+ const radar = findDiscoveryRecord(snapshot.discoveryIndex.records, value);
40
+ resolveRadar(radar);
41
+ const title = radar.title || `Feature de ${value}`;
42
+ const shape = classifyFeatureShape(title, stackContextTokens(snapshot));
43
+ const recommended = resolveRoutedSkills(snapshot, shape.touches);
44
+ feature = buildBacklogItem(id, title, 'epic', value, options?.scale || 'STANDARD', recommended, {
45
+ parallelGroup: `epic-${value.toLowerCase()}`,
46
+ executionKind: shape.executionKind,
47
+ planningMode: shape.planningMode,
48
+ acceptanceRefs: [value],
49
+ touches: shape.touches,
50
+ lockDomains: shape.lockDomains,
51
+ produces: shape.produces,
52
+ consumes: shape.consumes,
53
+ flowMode: options?.flowMode,
54
+ });
55
+ snapshot.backlog.items.push(feature);
56
+ }
57
+ }
58
+ else {
59
+ const id = await allocateEntityId(paths, 'FEAT');
60
+ syncCounterFromId(snapshot.discoveryIndex, id);
61
+ const shape = classifyFeatureShape(value, stackContextTokens(snapshot));
62
+ const recommended = resolveRoutedSkills(snapshot, shape.touches);
63
+ feature = buildBacklogItem(id, value, inferOriginType(value), /^([A-Z]+-\d{3,})$/.test(value) ? value : undefined, options?.scale || 'STANDARD', recommended, {
64
+ executionKind: shape.executionKind,
65
+ planningMode: shape.planningMode,
66
+ touches: shape.touches,
67
+ lockDomains: shape.lockDomains,
68
+ produces: shape.produces,
69
+ consumes: shape.consumes,
70
+ flowMode: options?.flowMode,
71
+ });
72
+ snapshot.backlog.items.push(feature);
73
+ }
74
+ if (options?.flowMode) {
75
+ feature.flow_mode = options.flowMode;
76
+ if (options.flowMode === 'direto') {
77
+ feature.gates.proposta.status = 'nao_exigida';
78
+ feature.gates.planejamento.status = 'nao_exigida';
79
+ }
80
+ }
81
+ const startGuardrails = evaluateFeatureStartGuardrails(feature, snapshot.backlog.items, !!options?.force);
82
+ const unresolved = startGuardrails.blocked_check.unresolved;
83
+ const lockConflicts = startGuardrails.lock_check.conflicts;
84
+ if (unresolved.length > 0 && !options?.force) {
85
+ throw new Error(`Nao foi possivel iniciar ${feature.id}: blocked_by pendente (${unresolved.join(', ')}). Use --force para bypass explicito.`);
86
+ }
87
+ if (lockConflicts.length > 0 && !options?.force) {
88
+ throw new Error(`Nao foi possivel iniciar ${feature.id}: lock conflict com ${lockConflicts.join(', ')}. Use --force para bypass explicito.`);
89
+ }
90
+ if (!feature.change_name) {
91
+ const base = slugify(`${feature.id}-${feature.title}`).slice(0, 50).replace(/-+$/g, '') ||
92
+ feature.id.toLowerCase();
93
+ // OpenSDD-native execution keeps this as a compatibility identifier only.
94
+ // It must not materialize legacy OpenSpec change directories.
95
+ feature.change_name = base;
96
+ }
97
+ await runLifecycleHooks('before-start', {
98
+ projectRoot,
99
+ featureId: feature.id,
100
+ entityId: feature.id,
101
+ options: options,
102
+ metadata: {
103
+ start_guardrails: startGuardrails,
104
+ current_status: feature.status,
105
+ },
106
+ });
107
+ let startLensViolations = [];
108
+ if (feature.origin_type === 'epic' && feature.origin_ref) {
109
+ const parentDir = paths.discoveryEpicDir;
110
+ const files = await fs.readdir(parentDir).catch(() => []);
111
+ const parentFile = files.find((f) => f.startsWith(`${feature.origin_ref}-`));
112
+ if (parentFile) {
113
+ const content = await fs.readFile(path.join(parentDir, parentFile), 'utf-8').catch(() => '');
114
+ if (content) {
115
+ const miss = validateDocumentAgainstLens(content, LENSES.epic);
116
+ startLensViolations.push(...miss.map((m) => `Epic: ${m}`));
117
+ }
118
+ else {
119
+ startLensViolations.push(`Epic Original (${feature.origin_ref}) vazio ou inacessível.`);
120
+ }
121
+ }
122
+ else {
123
+ startLensViolations.push(`Epic Original (${feature.origin_ref}) não encontrado.`);
124
+ }
125
+ }
126
+ applyLoggedTransition(snapshot.transitionLog.events, 'FEAT', feature, 'IN_PROGRESS', {
127
+ sourceCommand: 'sdd start',
128
+ forceTransition: options?.forceTransition,
129
+ lensViolations: startLensViolations,
130
+ reason: `Feature iniciada em workspace ativo`,
131
+ timestamp: now,
132
+ afterTransition: (currentFeature) => {
133
+ currentFeature.current_stage = 'execucao';
134
+ currentFeature.last_sync_at = now;
135
+ },
136
+ });
137
+ if (!feature.start_commit_sha) {
138
+ feature.start_commit_sha = await gitHeadCommit(projectRoot);
139
+ }
140
+ if (feature.execution_kind === 'frontend_coverage' && feature.frontend_impact_status === 'unknown') {
141
+ feature.frontend_impact_status = 'required';
142
+ }
143
+ feature.recommended_skills = resolveRoutedSkills(snapshot, feature.touches);
144
+ if (options?.force && (unresolved.length > 0 || lockConflicts.length > 0)) {
145
+ const notes = [
146
+ unresolved.length > 0 ? `FORCED blocked_by pendente: ${unresolved.join(', ')}` : '',
147
+ lockConflicts.length > 0 ? `FORCED lock conflict: ${lockConflicts.join(', ')}` : '',
148
+ ].filter(Boolean);
149
+ feature.summary = [feature.summary || '', ...notes].filter(Boolean).join('\n');
150
+ }
151
+ if ((feature.origin_type === 'radar' || feature.origin_type === 'epic') && feature.origin_ref) {
152
+ const radar = findDiscoveryRecord(snapshot.discoveryIndex.records, feature.origin_ref);
153
+ if (radar && (radar.type === 'RAD' || radar.type === 'EPIC')) {
154
+ const shouldPromoteParent = radar.status === 'READY' || radar.status === 'PLANNED';
155
+ if (shouldPromoteParent) {
156
+ applyLoggedTransition(snapshot.transitionLog.events, radar.type, radar, 'IN_PROGRESS', {
157
+ sourceCommand: 'sdd start',
158
+ reason: `Feature filha ${feature.id} iniciou execucao`,
159
+ timestamp: now,
160
+ afterTransition: (currentRadar) => {
161
+ currentRadar.updated_at = now;
162
+ },
163
+ });
164
+ }
165
+ }
166
+ }
167
+ const recommendedBundles = bundlesForSkills(catalog, feature.recommended_skills);
168
+ ensureFeatureQualityContract(feature, feature.origin_ref || feature.id);
169
+ if (featureDeclaresMandatoryAdrImpact(feature)) {
170
+ feature.requires_adr = true;
171
+ }
172
+ const plannedDir = path.join(paths.plannedDir, feature.id);
173
+ const activeDir = path.join(paths.activeDir, feature.id);
174
+ const docNames = activeDocNamesForLayout(config);
175
+ const activeWorkspace = {
176
+ activePath: activeDir,
177
+ generatedDocs: [
178
+ path.relative(paths.projectRoot, path.join(activeDir, docNames.spec)),
179
+ path.relative(paths.projectRoot, path.join(activeDir, docNames.plan)),
180
+ path.relative(paths.projectRoot, path.join(activeDir, docNames.quality)),
181
+ path.relative(paths.projectRoot, path.join(activeDir, docNames.tasks)),
182
+ path.relative(paths.projectRoot, path.join(activeDir, docNames.changelog)),
183
+ ],
184
+ handoffSeedRefs: [feature.id, feature.origin_ref].filter((v) => Boolean(v)),
185
+ };
186
+ await fs.mkdir(paths.activeDir, { recursive: true });
187
+ if (!(await pathExists(activeDir))) {
188
+ let plannedWorkspace = await ensureFeaturePlannedWorkspace(paths, config, feature, recommendedBundles);
189
+ if (!(await pathExists(plannedWorkspace.plannedPath))) {
190
+ plannedWorkspace = await ensureFeaturePlannedWorkspace(paths, config, feature, recommendedBundles);
191
+ }
192
+ await fs.rename(plannedWorkspace.plannedPath, activeDir);
193
+ activeWorkspace.handoffSeedRefs = plannedWorkspace.handoffSeedRefs;
194
+ }
195
+ if (feature.requires_adr) {
196
+ const adrDir = path.join(paths.coreDir, 'adrs');
197
+ const adrPath = path.join(adrDir, adrFileName(feature.id));
198
+ const adrExists = await pathExists(adrPath);
199
+ if (!adrExists) {
200
+ const tx = new SddWriteTransaction();
201
+ tx.writeFile(adrPath, generateAdrTemplate(feature, now));
202
+ await tx.commit(paths.projectRoot, paths.memoryRoot, 'start.service (ADR)');
203
+ }
204
+ }
205
+ updateDependencyMetadata(snapshot.backlog.items);
206
+ await saveStateTransaction(paths, {
207
+ backlog: snapshot.backlog,
208
+ discoveryIndex: snapshot.discoveryIndex,
209
+ transitionLog: snapshot.transitionLog,
210
+ });
211
+ await persistAndRender(paths, config, options?.render);
212
+ await runLifecycleHooks('after-start', {
213
+ projectRoot,
214
+ featureId: feature.id,
215
+ entityId: feature.id,
216
+ options: options,
217
+ metadata: {
218
+ start_guardrails: startGuardrails,
219
+ active_path: path.relative(paths.projectRoot, activeWorkspace.activePath),
220
+ },
221
+ });
222
+ return {
223
+ featureId: feature.id,
224
+ changeName: feature.change_name,
225
+ status: feature.status,
226
+ start_guardrails: startGuardrails,
227
+ active_path: path.relative(paths.projectRoot, activeWorkspace.activePath),
228
+ generated_docs: activeWorkspace.generatedDocs,
229
+ recommended_bundles: recommendedBundles,
230
+ handoff_seed_refs: activeWorkspace.handoffSeedRefs,
231
+ flow_mode: feature.flow_mode,
232
+ start_commit_sha: feature.start_commit_sha || '',
233
+ };
234
+ });
235
+ }
236
+ }
237
+ //# sourceMappingURL=start.service.js.map
@@ -0,0 +1,15 @@
1
+ import type { SkillCatalogEntry, SkillBundle, SkillCatalogState } from './types.js';
2
+ export interface SkillSuggestFilters {
3
+ phase?: string;
4
+ domains?: string[];
5
+ bundles?: string[];
6
+ max?: number;
7
+ }
8
+ export interface RankedSkill {
9
+ skill: SkillCatalogEntry;
10
+ score: number;
11
+ reasons: string[];
12
+ }
13
+ export declare function listBundles(catalog: SkillCatalogState): SkillBundle[];
14
+ export declare function suggestSkills(catalog: SkillCatalogState, filters?: SkillSuggestFilters): RankedSkill[];
15
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1,46 @@
1
+ function normalize(values) {
2
+ if (!values)
3
+ return [];
4
+ return values.map((v) => v.trim().toLowerCase()).filter((v) => v.length > 0);
5
+ }
6
+ export function listBundles(catalog) {
7
+ return catalog.bundles.slice().sort((a, b) => a.id.localeCompare(b.id));
8
+ }
9
+ export function suggestSkills(catalog, filters = {}) {
10
+ const phase = filters.phase?.trim().toLowerCase();
11
+ const domains = normalize(filters.domains);
12
+ const bundles = normalize(filters.bundles);
13
+ const max = Math.max(1, Math.min(filters.max ?? 5, 20));
14
+ const ranked = catalog.skills.map((skill) => {
15
+ let score = skill.priority;
16
+ const reasons = [];
17
+ if (phase && skill.phases.map((p) => p.toLowerCase()).includes(phase)) {
18
+ score += 3;
19
+ reasons.push(`fase=${phase}`);
20
+ }
21
+ if (domains.length > 0) {
22
+ const skillDomains = skill.domains.map((d) => d.toLowerCase());
23
+ const hits = domains.filter((domain) => skillDomains.includes(domain));
24
+ if (hits.length > 0) {
25
+ score += hits.length * 2;
26
+ reasons.push(`dominios=${hits.join(',')}`);
27
+ }
28
+ }
29
+ if (bundles.length > 0) {
30
+ const skillBundles = skill.bundle_ids.map((b) => b.toLowerCase());
31
+ const hits = bundles.filter((bundle) => skillBundles.includes(bundle));
32
+ if (hits.length > 0) {
33
+ score += 4;
34
+ reasons.push(`bundle=${hits.join(',')}`);
35
+ }
36
+ }
37
+ return { skill, score, reasons };
38
+ });
39
+ ranked.sort((a, b) => {
40
+ if (b.score !== a.score)
41
+ return b.score - a.score;
42
+ return a.skill.id.localeCompare(b.skill.id);
43
+ });
44
+ return ranked.slice(0, max);
45
+ }
46
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1,19 @@
1
+ export interface LockMetadata {
2
+ pid: number;
3
+ hostname: string;
4
+ acquired_at: string;
5
+ }
6
+ export interface AcquireOptions {
7
+ timeoutMs?: number;
8
+ staleMs?: number;
9
+ signal?: AbortSignal;
10
+ }
11
+ export declare class StateLockTimeoutError extends Error {
12
+ readonly lockPath: string;
13
+ readonly holder?: LockMetadata | undefined;
14
+ constructor(lockPath: string, holder?: LockMetadata | undefined);
15
+ }
16
+ export declare function acquireStateLock(stateDir: string, options?: AcquireOptions): Promise<() => Promise<void>>;
17
+ export declare function releaseStateLock(stateDir: string): Promise<void>;
18
+ export declare function withStateLock<T>(stateDir: string, fn: () => Promise<T>, options?: AcquireOptions): Promise<T>;
19
+ //# sourceMappingURL=state-lock.d.ts.map
@@ -0,0 +1,144 @@
1
+ import path from 'node:path';
2
+ import { promises as fs } from 'node:fs';
3
+ import os from 'node:os';
4
+ const LOCK_FILE_NAME = '.lock';
5
+ const DEFAULT_TIMEOUT_MS = 30_000;
6
+ const DEFAULT_STALE_MS = 60_000;
7
+ const RETRY_INTERVAL_MS = 100;
8
+ export class StateLockTimeoutError extends Error {
9
+ lockPath;
10
+ holder;
11
+ constructor(lockPath, holder) {
12
+ const holderInfo = holder
13
+ ? ` held by pid=${holder.pid}@${holder.hostname} since ${holder.acquired_at}`
14
+ : '';
15
+ super(`Could not acquire SDD state lock at ${lockPath}${holderInfo}.`);
16
+ this.lockPath = lockPath;
17
+ this.holder = holder;
18
+ this.name = 'StateLockTimeoutError';
19
+ }
20
+ }
21
+ function lockPathFor(stateDir) {
22
+ return path.join(stateDir, LOCK_FILE_NAME);
23
+ }
24
+ function isProcessAlive(pid, hostname) {
25
+ if (hostname !== os.hostname())
26
+ return true;
27
+ try {
28
+ process.kill(pid, 0);
29
+ return true;
30
+ }
31
+ catch (err) {
32
+ const code = err.code;
33
+ if (code === 'ESRCH')
34
+ return false;
35
+ return true;
36
+ }
37
+ }
38
+ async function readHolder(lockPath) {
39
+ try {
40
+ const raw = await fs.readFile(lockPath, 'utf-8');
41
+ const parsed = JSON.parse(raw);
42
+ if (typeof parsed?.pid === 'number' &&
43
+ typeof parsed?.hostname === 'string' &&
44
+ typeof parsed?.acquired_at === 'string') {
45
+ return parsed;
46
+ }
47
+ return null;
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ async function isStale(holder, staleMs) {
54
+ if (!holder)
55
+ return true;
56
+ const acquiredAt = Date.parse(holder.acquired_at);
57
+ if (Number.isNaN(acquiredAt))
58
+ return true;
59
+ if (Date.now() - acquiredAt > staleMs)
60
+ return true;
61
+ if (!isProcessAlive(holder.pid, holder.hostname))
62
+ return true;
63
+ return false;
64
+ }
65
+ async function tryClaim(lockPath) {
66
+ const metadata = {
67
+ pid: process.pid,
68
+ hostname: os.hostname(),
69
+ acquired_at: new Date().toISOString(),
70
+ };
71
+ try {
72
+ const handle = await fs.open(lockPath, 'wx');
73
+ try {
74
+ await handle.writeFile(JSON.stringify(metadata), 'utf-8');
75
+ }
76
+ finally {
77
+ await handle.close();
78
+ }
79
+ return true;
80
+ }
81
+ catch (err) {
82
+ if (err.code === 'EEXIST')
83
+ return false;
84
+ throw err;
85
+ }
86
+ }
87
+ async function breakStaleLock(lockPath) {
88
+ try {
89
+ await fs.unlink(lockPath);
90
+ }
91
+ catch {
92
+ /* swallow: another process may have already broken it */
93
+ }
94
+ }
95
+ export async function acquireStateLock(stateDir, options = {}) {
96
+ const lockPath = lockPathFor(stateDir);
97
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
98
+ const staleMs = options.staleMs ?? DEFAULT_STALE_MS;
99
+ const deadline = Date.now() + timeoutMs;
100
+ await fs.mkdir(stateDir, { recursive: true });
101
+ while (true) {
102
+ if (options.signal?.aborted) {
103
+ throw new StateLockTimeoutError(lockPath);
104
+ }
105
+ if (await tryClaim(lockPath)) {
106
+ return async () => {
107
+ await releaseStateLock(stateDir);
108
+ };
109
+ }
110
+ const holder = await readHolder(lockPath);
111
+ if (await isStale(holder, staleMs)) {
112
+ await breakStaleLock(lockPath);
113
+ continue;
114
+ }
115
+ if (Date.now() >= deadline) {
116
+ throw new StateLockTimeoutError(lockPath, holder ?? undefined);
117
+ }
118
+ await new Promise((resolve) => setTimeout(resolve, RETRY_INTERVAL_MS));
119
+ }
120
+ }
121
+ export async function releaseStateLock(stateDir) {
122
+ const lockPath = lockPathFor(stateDir);
123
+ const holder = await readHolder(lockPath);
124
+ if (holder && holder.pid === process.pid && holder.hostname === os.hostname()) {
125
+ try {
126
+ await fs.unlink(lockPath);
127
+ }
128
+ catch (err) {
129
+ const code = err.code;
130
+ if (code !== 'ENOENT')
131
+ throw err;
132
+ }
133
+ }
134
+ }
135
+ export async function withStateLock(stateDir, fn, options = {}) {
136
+ const release = await acquireStateLock(stateDir, options);
137
+ try {
138
+ return await fn();
139
+ }
140
+ finally {
141
+ await release();
142
+ }
143
+ }
144
+ //# sourceMappingURL=state-lock.js.map
@@ -0,0 +1,155 @@
1
+ import { type NamingContractState, type ArchitectureState, type BacklogState, type DiscoveryIndexState, type FinalizeQueueState, type FrontendDecisionsState, type FrontendGapsState, type FrontendMapState, type IntegrationContractsState, type RepoMapState, type SourceIndexState, type SkillCatalogState, type SkillRoutingState, type ServiceCatalogState, type TechStackState, type TechDebtState, type UnblockEventsState, type TransitionLogState, type AuditHistoryState } from './types.js';
2
+ export type SddLanguage = 'pt-BR' | 'en-US';
3
+ export type SddLayout = 'legacy' | 'pt-BR' | 'en-US';
4
+ export interface SddRuntimeConfig {
5
+ enabled: boolean;
6
+ memoryDir: string;
7
+ language: SddLanguage;
8
+ layout: SddLayout;
9
+ folders: {
10
+ discovery: string;
11
+ planning: string;
12
+ skills: string;
13
+ templates: string;
14
+ deposito: string;
15
+ planned: string;
16
+ active: string;
17
+ archived: string;
18
+ };
19
+ frontend: {
20
+ enabled: boolean;
21
+ };
22
+ views: {
23
+ autoRender: boolean;
24
+ };
25
+ }
26
+ export interface SddPaths {
27
+ projectRoot: string;
28
+ memoryRoot: string;
29
+ configFile: string;
30
+ coreDir: string;
31
+ discoveryDir: string;
32
+ pendenciasDir: string;
33
+ stateDir: string;
34
+ skillsDir: string;
35
+ skillsCuratedDir: string;
36
+ skillsBundlesDir: string;
37
+ skillsCuratedFolderName: string;
38
+ skillsBundlesFolderName: string;
39
+ templatesDir: string;
40
+ promptsDir: string;
41
+ depositoDir: string;
42
+ plannedDir: string;
43
+ activeDir: string;
44
+ archivedDir: string;
45
+ discoveryInsightsDir: string;
46
+ discoveryDebatesDir: string;
47
+ discoveryRadarDir: string;
48
+ discoveryEpicDir: string;
49
+ discoveryDiscardedDir: string;
50
+ stateFiles: {
51
+ discoveryIndex: string;
52
+ backlog: string;
53
+ techDebt: string;
54
+ finalizeQueue: string;
55
+ skillCatalog: string;
56
+ unblockEvents: string;
57
+ transitionLog: string;
58
+ auditHistory: string;
59
+ frontendGaps: string;
60
+ frontendMap: string;
61
+ architecture: string;
62
+ serviceCatalog: string;
63
+ techStack: string;
64
+ integrationContracts: string;
65
+ frontendDecisions: string;
66
+ repoMap: string;
67
+ sourceIndex: string;
68
+ skillRouting: string;
69
+ namingContract: string;
70
+ };
71
+ }
72
+ export interface SddStateSnapshot {
73
+ discoveryIndex: DiscoveryIndexState;
74
+ backlog: BacklogState;
75
+ techDebt: TechDebtState;
76
+ finalizeQueue: FinalizeQueueState;
77
+ skillCatalog: SkillCatalogState;
78
+ unblockEvents: UnblockEventsState;
79
+ transitionLog: TransitionLogState;
80
+ auditHistory: AuditHistoryState;
81
+ frontendGaps?: FrontendGapsState;
82
+ frontendMap?: FrontendMapState;
83
+ architecture: ArchitectureState;
84
+ serviceCatalog: ServiceCatalogState;
85
+ techStack: TechStackState;
86
+ integrationContracts: IntegrationContractsState;
87
+ frontendDecisions?: FrontendDecisionsState;
88
+ repoMap: RepoMapState;
89
+ sourceIndex: SourceIndexState;
90
+ skillRouting: SkillRoutingState;
91
+ }
92
+ export declare function loadProjectSddConfig(projectRoot: string): Promise<SddRuntimeConfig>;
93
+ export declare function upsertProjectSddConfig(projectRoot: string, overrides?: {
94
+ frontendEnabled?: boolean;
95
+ language?: SddLanguage;
96
+ layout?: SddLayout;
97
+ }): Promise<SddRuntimeConfig>;
98
+ export declare function resolveSddPaths(projectRoot: string, config: SddRuntimeConfig): SddPaths;
99
+ export declare function ensureBaseStructure(paths: SddPaths): Promise<void>;
100
+ export declare function ensureBaseFiles(paths: SddPaths, config: SddRuntimeConfig): Promise<void>;
101
+ export declare function loadStateSnapshot(paths: SddPaths, config: SddRuntimeConfig): Promise<SddStateSnapshot>;
102
+ export declare function loadSkillCatalogState(paths: SddPaths): Promise<SkillCatalogState>;
103
+ export type SddCounterType = 'INS' | 'DEB' | 'RAD' | 'EPIC' | 'FEAT' | 'FGAP' | 'TD';
104
+ export declare function nowIso(): string;
105
+ export declare function saveDiscoveryIndexState(paths: SddPaths, state: DiscoveryIndexState): Promise<void>;
106
+ export declare function saveBacklogState(paths: SddPaths, state: BacklogState): Promise<void>;
107
+ export declare function saveTechDebtState(paths: SddPaths, state: TechDebtState): Promise<void>;
108
+ export declare function saveFinalizeQueueState(paths: SddPaths, state: FinalizeQueueState): Promise<void>;
109
+ export declare function saveSkillCatalogState(paths: SddPaths, state: SkillCatalogState): Promise<void>;
110
+ export declare function saveUnblockEventsState(paths: SddPaths, state: UnblockEventsState): Promise<void>;
111
+ export declare function saveTransitionLogState(paths: SddPaths, state: TransitionLogState): Promise<void>;
112
+ export declare function saveFrontendGapsState(paths: SddPaths, state: FrontendGapsState): Promise<void>;
113
+ export declare function saveFrontendMapState(paths: SddPaths, state: FrontendMapState): Promise<void>;
114
+ export declare function saveArchitectureState(paths: SddPaths, state: ArchitectureState): Promise<void>;
115
+ export declare function saveServiceCatalogState(paths: SddPaths, state: ServiceCatalogState): Promise<void>;
116
+ export declare function saveTechStackState(paths: SddPaths, state: TechStackState): Promise<void>;
117
+ export declare function saveIntegrationContractsState(paths: SddPaths, state: IntegrationContractsState): Promise<void>;
118
+ export declare function saveFrontendDecisionsState(paths: SddPaths, state: FrontendDecisionsState): Promise<void>;
119
+ export declare function saveRepoMapState(paths: SddPaths, state: RepoMapState): Promise<void>;
120
+ export declare function saveSourceIndexState(paths: SddPaths, state: SourceIndexState): Promise<void>;
121
+ export declare function defaultNamingContractState(): NamingContractState;
122
+ export declare function loadNamingContractState(paths: SddPaths): Promise<NamingContractState>;
123
+ export declare function saveNamingContractState(paths: SddPaths, state: NamingContractState): Promise<void>;
124
+ export interface SddStateWriteSet {
125
+ discoveryIndex?: DiscoveryIndexState;
126
+ backlog?: BacklogState;
127
+ techDebt?: TechDebtState;
128
+ finalizeQueue?: FinalizeQueueState;
129
+ skillCatalog?: SkillCatalogState;
130
+ unblockEvents?: UnblockEventsState;
131
+ transitionLog?: TransitionLogState;
132
+ auditHistory?: AuditHistoryState;
133
+ frontendGaps?: FrontendGapsState;
134
+ frontendMap?: FrontendMapState;
135
+ architecture?: ArchitectureState;
136
+ serviceCatalog?: ServiceCatalogState;
137
+ techStack?: TechStackState;
138
+ integrationContracts?: IntegrationContractsState;
139
+ frontendDecisions?: FrontendDecisionsState;
140
+ repoMap?: RepoMapState;
141
+ sourceIndex?: SourceIndexState;
142
+ }
143
+ export declare function saveStateTransaction(paths: SddPaths, updates: SddStateWriteSet): Promise<void>;
144
+ /**
145
+ * Allocates a new entity ID with atomic reservation and collision detection.
146
+ * Verifies that the generated ID does not already exist in the discovery index
147
+ * records before persisting. Retries with the next counter value if collision
148
+ * is detected (defensive against manual edits or stale counters).
149
+ *
150
+ * @param paths - SDD directory paths
151
+ * @param type - Counter type (INS, DEB, RAD, EPIC, FEAT, FGAP, TD)
152
+ * @returns The reserved ID string
153
+ */
154
+ export declare function allocateEntityId(paths: SddPaths, type: SddCounterType): Promise<string>;
155
+ //# sourceMappingURL=state.d.ts.map