@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,254 @@
1
+ import { z } from 'zod';
2
+ import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
3
+ export const workspaceFeatureIdSchema = z.string().regex(/^FEAT-\d{4}$/);
4
+ export const workspaceGateSchema = z.object({
5
+ status: z.enum(['nao_exigida', 'rascunho', 'pronta', 'aprovada']).default('rascunho'),
6
+ approved_at: z.string().optional(),
7
+ approved_by: z.string().optional(),
8
+ note: z.string().optional(),
9
+ });
10
+ export const workspaceSpecSchema = z.object({
11
+ schema_version: z.literal(1),
12
+ feature_id: workspaceFeatureIdSchema,
13
+ title: z.string().min(10),
14
+ origin: z.object({
15
+ type: z.enum(['epic', 'radar', 'direct', 'fgap', 'td']),
16
+ ref: z.string(),
17
+ }),
18
+ objective: z.string().min(100),
19
+ expected_outcome: z.string().min(50),
20
+ system_impact: z.string().min(30),
21
+ acceptance_refs: z.array(z.string()).min(1),
22
+ gates: z.object({
23
+ proposta: workspaceGateSchema,
24
+ planejamento: workspaceGateSchema,
25
+ tarefas: workspaceGateSchema,
26
+ }),
27
+ compliance_context: z
28
+ .object({
29
+ jurisdictions: z.array(z.string()).default([]),
30
+ data_classes: z.array(z.string()).default([]),
31
+ source_refs: z.array(z.string()).default([]),
32
+ legal_review_required: z.boolean().default(false),
33
+ legal_review_notes: z.string().optional(),
34
+ })
35
+ .optional(),
36
+ created_at: z.string().datetime(),
37
+ updated_at: z.string().datetime(),
38
+ });
39
+ export const workspacePlanSchema = z.object({
40
+ schema_version: z.literal(1),
41
+ feature_id: workspaceFeatureIdSchema,
42
+ architectural_impact: z.object({
43
+ description: z.string(),
44
+ affected_modules: z.array(z.string()),
45
+ }),
46
+ frontend_impact: z.object({
47
+ status: z.enum(['unknown', 'none', 'required']),
48
+ description: z.string(),
49
+ }),
50
+ affected_contracts: z.array(z.object({
51
+ name: z.string(),
52
+ change_type: z.string(),
53
+ })),
54
+ quality_strategy: z.object({
55
+ unit_target: z.number(),
56
+ integration_target: z.number(),
57
+ approach: z.string(),
58
+ }),
59
+ suggested_skills: z.array(z.string()),
60
+ privacy_controls: z
61
+ .object({
62
+ source_registry_refs: z.array(z.string()).default([]),
63
+ jurisdiction_profiles: z.array(z.string()).default([]),
64
+ control_ids: z.array(z.string()).default([]),
65
+ legal_review_gate: z.enum(['required', 'conditional', 'not_required']).default('conditional'),
66
+ unresolved_legal_questions: z.array(z.string()).default([]),
67
+ })
68
+ .optional(),
69
+ skill_conformance: z
70
+ .object({
71
+ selected_skills: z.array(z.string()).default([]),
72
+ required_skills: z.array(z.string()).default([]),
73
+ detected_conflicts: z.array(z.string()).default([]),
74
+ resolution_adr_ref: z.string().optional(),
75
+ architecture_tree_ascii: z.string().optional(),
76
+ })
77
+ .optional(),
78
+ });
79
+ export const workspaceTaskSchema = z.object({
80
+ id: z.string(),
81
+ phase: z.enum(['preparation', 'implementation', 'testing', 'documentation', 'finalization']),
82
+ title: z.string(),
83
+ description: z.string(),
84
+ files_touched: z.array(z.string()),
85
+ test_scripts: z.array(z.object({
86
+ command: z.string(),
87
+ type: z.string(),
88
+ expected: z.string(),
89
+ })),
90
+ acceptance: z.string(),
91
+ status: z.enum(['pending', 'in_progress', 'done', 'skipped']),
92
+ });
93
+ export const workspaceTasksSchema = z.object({
94
+ schema_version: z.literal(1),
95
+ feature_id: workspaceFeatureIdSchema,
96
+ tasks: z.array(workspaceTaskSchema).min(5),
97
+ });
98
+ export const workspaceChangelogSchema = z.object({
99
+ schema_version: z.literal(1),
100
+ feature_id: workspaceFeatureIdSchema,
101
+ entries: z.array(z.object({
102
+ timestamp: z.string().datetime(),
103
+ action: z.string(),
104
+ details: z.string(),
105
+ refs: z.array(z.string()).default([]),
106
+ })),
107
+ });
108
+ export const workspaceTraceabilityCodeRefSchema = z.object({
109
+ path: z.string().min(1),
110
+ symbols: z.array(z.string()).default([]),
111
+ note: z.string().optional(),
112
+ });
113
+ export const workspaceTraceabilityTestRefSchema = z.object({
114
+ id: z.string().min(1),
115
+ path: z.string().optional(),
116
+ kind: z.string().optional(),
117
+ note: z.string().optional(),
118
+ });
119
+ export const workspaceTraceabilityRequirementSchema = z.object({
120
+ requirement_ref: z.string().min(1),
121
+ requirement: z.string().min(10),
122
+ code_refs: z.array(workspaceTraceabilityCodeRefSchema).min(1),
123
+ test_refs: z.array(workspaceTraceabilityTestRefSchema).min(1),
124
+ semantic_coverage: z
125
+ .enum(['covered', 'partial', 'not_covered', 'not_applicable'])
126
+ .default('covered'),
127
+ changelog_refs: z.array(z.string().min(1)).min(1),
128
+ evidence_refs: z.array(z.string().min(1)).min(1),
129
+ });
130
+ export const workspaceTraceabilitySchema = z.object({
131
+ spec_anchor: z.object({
132
+ spec_updated_at: z.string().default(''),
133
+ changelog_refs: z.array(z.string().min(1)).default([]),
134
+ }),
135
+ requirements: z.array(workspaceTraceabilityRequirementSchema).default([]),
136
+ });
137
+ export const workspaceQualitySchema = z.object({
138
+ schema_version: z.literal(1),
139
+ feature_id: workspaceFeatureIdSchema,
140
+ coverage_targets: z.object({
141
+ unit: z.number(),
142
+ integration: z.number(),
143
+ modules: z.record(z.string(), z.number()).optional(),
144
+ }),
145
+ validation_strategies: z.array(z.object({
146
+ name: z.string(),
147
+ command: z.string(),
148
+ expected: z.string(),
149
+ })),
150
+ evidence_log: z.array(z.object({
151
+ timestamp: z.string(),
152
+ kind: z.string(),
153
+ result: z.string(),
154
+ artifact: z.string().optional(),
155
+ })),
156
+ skill_evidence: z
157
+ .object({
158
+ required_skill_ids: z.array(z.string()),
159
+ evidence: z.array(z.object({
160
+ skill_id: z.string().min(1),
161
+ note: z.string().min(10),
162
+ source: z.enum(['manual', 'tooling', 'quality_artifact']).default('manual'),
163
+ })),
164
+ verification_rule: z.string().min(1),
165
+ })
166
+ .default({
167
+ required_skill_ids: [],
168
+ evidence: [],
169
+ verification_rule: 'No skill evidence required for this feature.',
170
+ }),
171
+ acceptance_matrix: z.array(z.object({
172
+ criterion: z.string(),
173
+ status: z.enum(['met', 'not_met', 'na']),
174
+ evidence: z.string(),
175
+ })),
176
+ exceptions: z.array(z.object({
177
+ scope: z.string(),
178
+ reason: z.string(),
179
+ accepted_risk: z.string(),
180
+ compensating_control: z.string(),
181
+ })),
182
+ remediation_policy: z.object({
183
+ on_coverage_miss: z.enum(['re_task', 'exception', 'block']),
184
+ max_rounds: z.number().default(3),
185
+ }),
186
+ traceability: workspaceTraceabilitySchema.default({
187
+ spec_anchor: {
188
+ spec_updated_at: '',
189
+ changelog_refs: [],
190
+ },
191
+ requirements: [],
192
+ }),
193
+ security_integrity: z
194
+ .object({
195
+ endpoint_auth_review: z.enum(['not_applicable', 'pending', 'passed', 'failed']).default('pending'),
196
+ sensitive_data_exposure_review: z
197
+ .enum(['not_applicable', 'pending', 'passed', 'failed'])
198
+ .default('pending'),
199
+ incident_response_review: z.enum(['not_applicable', 'pending', 'passed', 'failed']).default('pending'),
200
+ notes: z.string().optional(),
201
+ })
202
+ .optional(),
203
+ });
204
+ export const workspaceDocumentSchemas = {
205
+ '1-spec.yaml': workspaceSpecSchema,
206
+ '2-plan.yaml': workspacePlanSchema,
207
+ '3-tasks.yaml': workspaceTasksSchema,
208
+ '4-changelog.yaml': workspaceChangelogSchema,
209
+ '5-quality.yaml': workspaceQualitySchema,
210
+ };
211
+ export class WorkspaceYamlError extends Error {
212
+ constructor(message) {
213
+ super(message);
214
+ this.name = 'WorkspaceYamlError';
215
+ }
216
+ }
217
+ export function workspaceSchemaForFile(fileName) {
218
+ return workspaceDocumentSchemas[fileName];
219
+ }
220
+ export function parseWorkspaceYamlDocument(fileName, content) {
221
+ const schema = workspaceSchemaForFile(fileName);
222
+ if (!schema) {
223
+ throw new WorkspaceYamlError(`Workspace schema not found for ${fileName}.`);
224
+ }
225
+ let parsed;
226
+ try {
227
+ parsed = parseYaml(content);
228
+ }
229
+ catch (error) {
230
+ const message = error instanceof Error ? error.message : String(error);
231
+ throw new WorkspaceYamlError(`Workspace YAML parse failed for ${fileName}: ${message}`);
232
+ }
233
+ const result = schema.safeParse(parsed);
234
+ if (!result.success) {
235
+ throw new WorkspaceYamlError(`Workspace YAML schema validation failed for ${fileName}: ${result.error.message}`);
236
+ }
237
+ return result.data;
238
+ }
239
+ export function stringifyWorkspaceYamlDocument(fileName, value) {
240
+ const schema = workspaceSchemaForFile(fileName);
241
+ if (!schema) {
242
+ throw new WorkspaceYamlError(`Workspace schema not found for ${fileName}.`);
243
+ }
244
+ const schemaValidation = schema.safeParse(value);
245
+ if (!schemaValidation.success) {
246
+ throw new WorkspaceYamlError(`Workspace YAML schema validation failed before serialization for ${fileName}: ${schemaValidation.error.message}`);
247
+ }
248
+ const serialized = stringifyYaml(schemaValidation.data, {
249
+ lineWidth: 0,
250
+ });
251
+ parseWorkspaceYamlDocument(fileName, serialized);
252
+ return serialized;
253
+ }
254
+ //# sourceMappingURL=workspace-schemas.js.map
@@ -0,0 +1,25 @@
1
+ export type WriteOperation = {
2
+ type: 'write';
3
+ relativePath: string;
4
+ content: string;
5
+ } | {
6
+ type: 'mkdir';
7
+ relativePath: string;
8
+ } | {
9
+ type: 'delete';
10
+ relativePath: string;
11
+ };
12
+ export interface SddWriteCommitOptions {
13
+ bypassPolicy?: boolean;
14
+ }
15
+ export declare class SddWritePolicyError extends Error {
16
+ constructor(message: string);
17
+ }
18
+ export declare class SddWriteTransaction {
19
+ private operations;
20
+ writeFile(relativePath: string, content: string): void;
21
+ mkdir(relativePath: string): void;
22
+ delete(relativePath: string): void;
23
+ commit(projectRoot: string, memoryRoot: string, label?: string, options?: SddWriteCommitOptions): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=write-manifest.d.ts.map
@@ -0,0 +1,353 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { RootResolver } from './root-resolver.js';
4
+ import { loadProjectSddConfig, resolveSddPaths } from './state.js';
5
+ import { parseWorkspaceYamlDocument, workspaceSchemaForFile } from './workspace-schemas.js';
6
+ export class SddWritePolicyError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = 'SddWritePolicyError';
10
+ }
11
+ }
12
+ const FEATURE_DIR_PATTERN = /^FEAT-\d{4}$/;
13
+ const CANONICAL_FEATURE_FILES = new Set([
14
+ '1-spec.yaml',
15
+ '2-plan.yaml',
16
+ '3-tasks.yaml',
17
+ '4-changelog.yaml',
18
+ '5-quality.yaml',
19
+ ]);
20
+ const DISCOVERY_DIRS = new Set(['1-insights', '2-debates', '3-epic', '4-discarded']);
21
+ const ROOT_FILE_ALLOWLIST = new Set(['README.md', 'AGENT.md', 'config.yaml']);
22
+ const STATIC_ROOTS = new Set(['state', 'core', 'reports', 'prompts']);
23
+ export class SddWriteTransaction {
24
+ operations = [];
25
+ writeFile(relativePath, content) {
26
+ this.operations.push({ type: 'write', relativePath, content });
27
+ }
28
+ mkdir(relativePath) {
29
+ this.operations.push({ type: 'mkdir', relativePath });
30
+ }
31
+ delete(relativePath) {
32
+ this.operations.push({ type: 'delete', relativePath });
33
+ }
34
+ async commit(projectRoot, memoryRoot, label = 'SddWriteTransaction', options = {}) {
35
+ const verifiedOperations = [];
36
+ for (const op of this.operations) {
37
+ const targetPath = await RootResolver.verifyRealpathContainment(projectRoot, memoryRoot, op.relativePath, `${label} (${op.type})`);
38
+ const policyPath = path.relative(memoryRoot, targetPath).split(path.sep).join(path.posix.sep);
39
+ verifiedOperations.push({ operation: op, targetPath, policyPath });
40
+ }
41
+ if (options.bypassPolicy) {
42
+ console.warn(`[sdd:write-policy] ${label} bypassed write policy validation.`);
43
+ }
44
+ else {
45
+ const policyPaths = new Set(verifiedOperations.map(({ policyPath }) => policyPath.replace(/^\.\/+/, '')));
46
+ const config = await loadProjectSddConfig(projectRoot);
47
+ const paths = resolveSddPaths(projectRoot, config);
48
+ const stateFiles = new Set(Object.values(paths.stateFiles).map((filePath) => path.basename(filePath)));
49
+ const context = {
50
+ memoryRoot,
51
+ policyPaths,
52
+ lifecycleDirs: new Set([config.folders.planned, config.folders.active, config.folders.archived]),
53
+ lifecycleRoots: {
54
+ planned: config.folders.planned,
55
+ active: config.folders.active,
56
+ archived: config.folders.archived,
57
+ },
58
+ discoveryRoot: config.folders.discovery,
59
+ planningRoot: config.folders.planning,
60
+ templatesRoot: config.folders.templates,
61
+ skillsRoot: config.folders.skills,
62
+ sourcesRoot: config.folders.deposito,
63
+ stateFiles,
64
+ };
65
+ for (const { operation, policyPath } of verifiedOperations) {
66
+ await validateWritePolicy(operation, policyPath, label, context);
67
+ }
68
+ }
69
+ for (const { operation, targetPath } of verifiedOperations) {
70
+ switch (operation.type) {
71
+ case 'write':
72
+ await fs.mkdir(path.dirname(targetPath), { recursive: true });
73
+ await fs.writeFile(targetPath, operation.content, 'utf-8');
74
+ break;
75
+ case 'mkdir':
76
+ await fs.mkdir(targetPath, { recursive: true });
77
+ break;
78
+ case 'delete':
79
+ await fs.unlink(targetPath).catch((err) => {
80
+ if (err.code !== 'ENOENT')
81
+ throw err;
82
+ });
83
+ break;
84
+ }
85
+ }
86
+ }
87
+ }
88
+ async function validateWritePolicy(operation, policyPath, label, context) {
89
+ const normalizedPath = policyPath.replace(/^\.\/+/, '');
90
+ if (!normalizedPath || normalizedPath === '.') {
91
+ return;
92
+ }
93
+ const segments = normalizedPath.split('/').filter(Boolean);
94
+ const [topLevel] = segments;
95
+ if (segments.length === 1 && ROOT_FILE_ALLOWLIST.has(topLevel)) {
96
+ if (operation.type === 'mkdir') {
97
+ throw policyError(label, operation, policyPath, 'root-level files cannot be created as directories');
98
+ }
99
+ return;
100
+ }
101
+ if (context.lifecycleDirs.has(topLevel)) {
102
+ await validateLifecyclePath(operation, normalizedPath, segments, label, context);
103
+ return;
104
+ }
105
+ if (topLevel === 'state') {
106
+ validateStatePath(operation, normalizedPath, segments, label, context);
107
+ return;
108
+ }
109
+ if (topLevel === context.discoveryRoot) {
110
+ validateDiscoveryPath(operation, normalizedPath, segments, label);
111
+ return;
112
+ }
113
+ if (topLevel === 'core') {
114
+ validateCorePath(operation, normalizedPath, segments, label);
115
+ return;
116
+ }
117
+ if (topLevel === context.planningRoot) {
118
+ validatePlanningPath(operation, normalizedPath, segments, label);
119
+ return;
120
+ }
121
+ if (topLevel === context.templatesRoot) {
122
+ validateTemplatesPath(operation, normalizedPath, segments, label);
123
+ return;
124
+ }
125
+ if (topLevel === context.skillsRoot) {
126
+ validateSkillsPath(operation, normalizedPath, segments, label);
127
+ return;
128
+ }
129
+ if (topLevel === 'reports') {
130
+ validateReportsPath(operation, normalizedPath, segments, label);
131
+ return;
132
+ }
133
+ if (topLevel === 'prompts') {
134
+ validatePromptsPath(operation, normalizedPath, segments, label);
135
+ return;
136
+ }
137
+ if (topLevel === context.sourcesRoot) {
138
+ validateSourcesPath(operation, normalizedPath, segments, label);
139
+ return;
140
+ }
141
+ if (STATIC_ROOTS.has(topLevel)) {
142
+ throw policyError(label, operation, policyPath, `path under ${topLevel} is not allowed by canonical rules`);
143
+ }
144
+ throw policyError(label, operation, policyPath, `unknown top-level path "${topLevel}" under .sdd`);
145
+ }
146
+ async function pathExists(filePath) {
147
+ try {
148
+ await fs.access(filePath);
149
+ return true;
150
+ }
151
+ catch {
152
+ return false;
153
+ }
154
+ }
155
+ function hasPlannedFeatureInPolicySet(policyPaths, featureId, plannedFolder) {
156
+ const plannedRoot = `${plannedFolder}/${featureId}`;
157
+ for (const policyPath of policyPaths) {
158
+ if (policyPath === plannedRoot || policyPath.startsWith(`${plannedRoot}/`)) {
159
+ return true;
160
+ }
161
+ }
162
+ return false;
163
+ }
164
+ async function validateLifecyclePath(operation, policyPath, segments, label, context) {
165
+ const lifecycleRoot = segments[0];
166
+ const { planned, active, archived } = context.lifecycleRoots;
167
+ if (segments.length === 1) {
168
+ if (operation.type === 'mkdir') {
169
+ if (lifecycleRoot === archived) {
170
+ throw policyError(label, operation, policyPath, 'direct archived creation is forbidden');
171
+ }
172
+ return;
173
+ }
174
+ throw policyError(label, operation, policyPath, 'lifecycle roots may only be created as directories');
175
+ }
176
+ const featureId = segments[1];
177
+ if (!FEATURE_DIR_PATTERN.test(featureId)) {
178
+ throw policyError(label, operation, policyPath, 'lifecycle directories must use FEAT-NNNN feature folders');
179
+ }
180
+ if (lifecycleRoot === archived && (operation.type === 'write' || operation.type === 'mkdir')) {
181
+ throw policyError(label, operation, policyPath, 'direct archived creation is forbidden');
182
+ }
183
+ if (lifecycleRoot === active && (operation.type === 'write' || operation.type === 'mkdir')) {
184
+ const activeFeatureDir = path.join(context.memoryRoot, active, featureId);
185
+ const hasActiveWorkspace = await pathExists(activeFeatureDir);
186
+ if (!hasActiveWorkspace) {
187
+ const plannedFeatureDir = path.join(context.memoryRoot, planned, featureId);
188
+ const hasPlannedWorkspace = await pathExists(plannedFeatureDir);
189
+ const hasPlannedInTransaction = hasPlannedFeatureInPolicySet(context.policyPaths, featureId, planned);
190
+ if (!hasPlannedWorkspace && !hasPlannedInTransaction) {
191
+ throw policyError(label, operation, policyPath, 'active workspace creation requires planned workspace first (or bypass mode)');
192
+ }
193
+ }
194
+ }
195
+ if (segments.length === 2) {
196
+ if (operation.type === 'mkdir') {
197
+ return;
198
+ }
199
+ throw policyError(label, operation, policyPath, 'lifecycle operations must target a canonical feature file');
200
+ }
201
+ if (segments.length !== 3) {
202
+ throw policyError(label, operation, policyPath, 'lifecycle feature folders cannot contain nested paths');
203
+ }
204
+ const fileName = segments[2];
205
+ if (!CANONICAL_FEATURE_FILES.has(fileName)) {
206
+ throw policyError(label, operation, policyPath, 'lifecycle feature files must use canonical YAML names');
207
+ }
208
+ if ((segments[0] === planned || segments[0] === active) && operation.type === 'write') {
209
+ validateWorkspaceYamlContent(operation.content, fileName, label, operation, policyPath);
210
+ }
211
+ }
212
+ function validateStatePath(operation, policyPath, segments, label, context) {
213
+ if (segments.length === 1) {
214
+ if (operation.type === 'mkdir') {
215
+ return;
216
+ }
217
+ throw policyError(label, operation, policyPath, 'state root may only be created as a directory');
218
+ }
219
+ if (segments.length !== 2 || !context.stateFiles.has(segments[1])) {
220
+ throw policyError(label, operation, policyPath, 'state writes are limited to canonical state files');
221
+ }
222
+ }
223
+ function validateDiscoveryPath(operation, policyPath, segments, label) {
224
+ if (segments.length === 1) {
225
+ if (operation.type === 'mkdir') {
226
+ return;
227
+ }
228
+ throw policyError(label, operation, policyPath, 'discovery root may only be created as a directory');
229
+ }
230
+ const discoveryDir = segments[1];
231
+ if (!DISCOVERY_DIRS.has(discoveryDir)) {
232
+ throw policyError(label, operation, policyPath, 'discovery writes are limited to canonical discovery directories');
233
+ }
234
+ if (segments.length === 2) {
235
+ if (operation.type === 'mkdir') {
236
+ return;
237
+ }
238
+ throw policyError(label, operation, policyPath, 'discovery operations must target a markdown file');
239
+ }
240
+ if (segments.length !== 3 || !segments[2].endsWith('.md')) {
241
+ throw policyError(label, operation, policyPath, 'discovery files must be markdown files directly under a canonical directory');
242
+ }
243
+ }
244
+ function validateCorePath(operation, policyPath, segments, label) {
245
+ if (segments.length === 1) {
246
+ if (operation.type === 'mkdir')
247
+ return;
248
+ throw policyError(label, operation, policyPath, 'core root may only be created as a directory');
249
+ }
250
+ if (segments.length === 2) {
251
+ if (segments[1].endsWith('.md') && operation.type !== 'mkdir')
252
+ return;
253
+ if (operation.type === 'mkdir' && ['adrs', 'dados', 'integracoes'].includes(segments[1]))
254
+ return;
255
+ throw policyError(label, operation, policyPath, 'core accepts canonical markdown files or canonical subdirectories');
256
+ }
257
+ if (segments[1] === 'adrs' && segments.length === 3 && segments[2].endsWith('.md') && operation.type !== 'mkdir') {
258
+ return;
259
+ }
260
+ throw policyError(label, operation, policyPath, 'nested core writes are restricted to core/adrs/*.md');
261
+ }
262
+ function validatePlanningPath(operation, policyPath, segments, label) {
263
+ if (segments.length === 1) {
264
+ if (operation.type === 'mkdir')
265
+ return;
266
+ throw policyError(label, operation, policyPath, 'planning root may only be created as a directory');
267
+ }
268
+ if (segments.length === 2 && segments[1].endsWith('.md') && operation.type !== 'mkdir') {
269
+ return;
270
+ }
271
+ throw policyError(label, operation, policyPath, 'planning accepts markdown files directly under root');
272
+ }
273
+ function validateTemplatesPath(operation, policyPath, segments, label) {
274
+ if (segments.length === 1) {
275
+ if (operation.type === 'mkdir')
276
+ return;
277
+ throw policyError(label, operation, policyPath, 'templates root may only be created as a directory');
278
+ }
279
+ if (segments.length === 2 && /\.(md|ya?ml)$/.test(segments[1]) && operation.type !== 'mkdir') {
280
+ return;
281
+ }
282
+ throw policyError(label, operation, policyPath, 'templates accepts .md/.yaml files directly under root');
283
+ }
284
+ function validateSkillsPath(operation, policyPath, segments, label) {
285
+ if (segments.length === 1) {
286
+ if (operation.type === 'mkdir')
287
+ return;
288
+ throw policyError(label, operation, policyPath, 'skills root may only be created as a directory');
289
+ }
290
+ if (operation.type === 'mkdir') {
291
+ return;
292
+ }
293
+ if (segments.length >= 3) {
294
+ return;
295
+ }
296
+ throw policyError(label, operation, policyPath, 'skills writes require scoped subdirectories (e.g., curated/<id>/...)');
297
+ }
298
+ function validateReportsPath(operation, policyPath, segments, label) {
299
+ if (segments.length === 1) {
300
+ if (operation.type === 'mkdir')
301
+ return;
302
+ throw policyError(label, operation, policyPath, 'reports root may only be created as a directory');
303
+ }
304
+ if (operation.type === 'mkdir') {
305
+ return;
306
+ }
307
+ if (segments.length >= 2 && /\.(json|jsonl|md)$/.test(segments[segments.length - 1])) {
308
+ return;
309
+ }
310
+ throw policyError(label, operation, policyPath, 'reports accepts json/jsonl/markdown artifacts');
311
+ }
312
+ function validatePromptsPath(operation, policyPath, segments, label) {
313
+ if (segments.length === 1) {
314
+ if (operation.type === 'mkdir')
315
+ return;
316
+ throw policyError(label, operation, policyPath, 'prompts root may only be created as a directory');
317
+ }
318
+ if (segments.length === 2 && segments[1].endsWith('.md') && operation.type !== 'mkdir') {
319
+ return;
320
+ }
321
+ throw policyError(label, operation, policyPath, 'prompts accepts markdown files directly under root');
322
+ }
323
+ function validateSourcesPath(operation, policyPath, segments, label) {
324
+ if (segments.length === 1) {
325
+ if (operation.type === 'mkdir')
326
+ return;
327
+ throw policyError(label, operation, policyPath, 'sources root may only be created as a directory');
328
+ }
329
+ if (operation.type === 'mkdir') {
330
+ return;
331
+ }
332
+ if (segments.length >= 3) {
333
+ return;
334
+ }
335
+ throw policyError(label, operation, policyPath, 'sources writes must target a typed subdirectory');
336
+ }
337
+ function policyError(label, operation, policyPath, reason) {
338
+ return new SddWritePolicyError(`${label} (${operation.type}) violates SDD write policy for ${policyPath}: ${reason}`);
339
+ }
340
+ function validateWorkspaceYamlContent(content, fileName, label, operation, policyPath) {
341
+ const schema = workspaceSchemaForFile(fileName);
342
+ if (!schema) {
343
+ return;
344
+ }
345
+ try {
346
+ parseWorkspaceYamlDocument(fileName, content);
347
+ }
348
+ catch (err) {
349
+ const message = err instanceof Error ? err.message : String(err);
350
+ throw policyError(label, operation, policyPath, `workspace YAML schema validation failed: ${message}`);
351
+ }
352
+ }
353
+ //# sourceMappingURL=write-manifest.js.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared Utilities
3
+ *
4
+ * Common code shared between init and update commands.
5
+ */
6
+ export { SKILL_NAMES, type SkillName, COMMAND_IDS, type CommandId, type ToolSkillStatus, type ToolVersionStatus, getToolsWithSkillsDir, getToolSkillStatus, getToolStates, extractGeneratedByVersion, getToolVersionStatus, getConfiguredTools, getAllToolVersionStatus, } from './tool-detection.js';
7
+ export { type SkillTemplateEntry, type CommandTemplateEntry, getSkillTemplates, getCommandTemplates, getCommandContents, generateSkillContent, } from './skill-generation.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared Utilities
3
+ *
4
+ * Common code shared between init and update commands.
5
+ */
6
+ export { SKILL_NAMES, COMMAND_IDS, getToolsWithSkillsDir, getToolSkillStatus, getToolStates, extractGeneratedByVersion, getToolVersionStatus, getConfiguredTools, getAllToolVersionStatus, } from './tool-detection.js';
7
+ export { getSkillTemplates, getCommandTemplates, getCommandContents, generateSkillContent, } from './skill-generation.js';
8
+ //# sourceMappingURL=index.js.map