@inharness-ai/claude4spec 1.0.0

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 (552) hide show
  1. package/.claude/skills/c4s-brief-implementer/SKILL.md +105 -0
  2. package/.claude/skills/c4s-spec-reader/SKILL.md +46 -0
  3. package/CHANGELOG.md +19 -0
  4. package/LICENSE +21 -0
  5. package/README.md +50 -0
  6. package/dist/bin/agent-md-template.d.ts +1 -0
  7. package/dist/bin/agent-md-template.js +76 -0
  8. package/dist/bin/agent-md-template.js.map +1 -0
  9. package/dist/bin/bootstrap-template.d.ts +1 -0
  10. package/dist/bin/bootstrap-template.js +12 -0
  11. package/dist/bin/bootstrap-template.js.map +1 -0
  12. package/dist/bin/c4s/args.d.ts +13 -0
  13. package/dist/bin/c4s/args.js +82 -0
  14. package/dist/bin/c4s/args.js.map +1 -0
  15. package/dist/bin/c4s/commands/_meta.d.ts +2 -0
  16. package/dist/bin/c4s/commands/_meta.js +13 -0
  17. package/dist/bin/c4s/commands/_meta.js.map +1 -0
  18. package/dist/bin/c4s/commands/catalog.d.ts +2 -0
  19. package/dist/bin/c4s/commands/catalog.js +38 -0
  20. package/dist/bin/c4s/commands/catalog.js.map +1 -0
  21. package/dist/bin/c4s/commands/detail.d.ts +2 -0
  22. package/dist/bin/c4s/commands/detail.js +22 -0
  23. package/dist/bin/c4s/commands/detail.js.map +1 -0
  24. package/dist/bin/c4s/commands/element-list.d.ts +2 -0
  25. package/dist/bin/c4s/commands/element-list.js +23 -0
  26. package/dist/bin/c4s/commands/element-list.js.map +1 -0
  27. package/dist/bin/c4s/commands/inline-mention.d.ts +2 -0
  28. package/dist/bin/c4s/commands/inline-mention.js +22 -0
  29. package/dist/bin/c4s/commands/inline-mention.js.map +1 -0
  30. package/dist/bin/c4s/commands/list-slugs.d.ts +2 -0
  31. package/dist/bin/c4s/commands/list-slugs.js +16 -0
  32. package/dist/bin/c4s/commands/list-slugs.js.map +1 -0
  33. package/dist/bin/c4s/commands/list-tags.d.ts +2 -0
  34. package/dist/bin/c4s/commands/list-tags.js +13 -0
  35. package/dist/bin/c4s/commands/list-tags.js.map +1 -0
  36. package/dist/bin/c4s/commands/resolve.d.ts +2 -0
  37. package/dist/bin/c4s/commands/resolve.js +40 -0
  38. package/dist/bin/c4s/commands/resolve.js.map +1 -0
  39. package/dist/bin/c4s/commands/section-ref.d.ts +2 -0
  40. package/dist/bin/c4s/commands/section-ref.js +25 -0
  41. package/dist/bin/c4s/commands/section-ref.js.map +1 -0
  42. package/dist/bin/c4s/commands/single-element.d.ts +2 -0
  43. package/dist/bin/c4s/commands/single-element.js +22 -0
  44. package/dist/bin/c4s/commands/single-element.js.map +1 -0
  45. package/dist/bin/c4s/commands/tagged-list-mixed.d.ts +2 -0
  46. package/dist/bin/c4s/commands/tagged-list-mixed.js +39 -0
  47. package/dist/bin/c4s/commands/tagged-list-mixed.js.map +1 -0
  48. package/dist/bin/c4s/commands/tagged-list.d.ts +2 -0
  49. package/dist/bin/c4s/commands/tagged-list.js +24 -0
  50. package/dist/bin/c4s/commands/tagged-list.js.map +1 -0
  51. package/dist/bin/c4s/context.d.ts +12 -0
  52. package/dist/bin/c4s/context.js +27 -0
  53. package/dist/bin/c4s/context.js.map +1 -0
  54. package/dist/bin/c4s/errors.d.ts +6 -0
  55. package/dist/bin/c4s/errors.js +11 -0
  56. package/dist/bin/c4s/errors.js.map +1 -0
  57. package/dist/bin/c4s/output.d.ts +4 -0
  58. package/dist/bin/c4s/output.js +57 -0
  59. package/dist/bin/c4s/output.js.map +1 -0
  60. package/dist/bin/c4s/project.d.ts +1 -0
  61. package/dist/bin/c4s/project.js +23 -0
  62. package/dist/bin/c4s/project.js.map +1 -0
  63. package/dist/bin/c4s/type-validation.d.ts +3 -0
  64. package/dist/bin/c4s/type-validation.js +11 -0
  65. package/dist/bin/c4s/type-validation.js.map +1 -0
  66. package/dist/bin/c4s-mcp.d.ts +2 -0
  67. package/dist/bin/c4s-mcp.js +118 -0
  68. package/dist/bin/c4s-mcp.js.map +1 -0
  69. package/dist/bin/c4s.d.ts +2 -0
  70. package/dist/bin/c4s.js +134 -0
  71. package/dist/bin/c4s.js.map +1 -0
  72. package/dist/bin/claude4spec.d.ts +2 -0
  73. package/dist/bin/claude4spec.js +132 -0
  74. package/dist/bin/claude4spec.js.map +1 -0
  75. package/dist/bin/gitignore.d.ts +1 -0
  76. package/dist/bin/gitignore.js +44 -0
  77. package/dist/bin/gitignore.js.map +1 -0
  78. package/dist/client/assets/arc-D8brDDag.js +1 -0
  79. package/dist/client/assets/architectureDiagram-3BPJPVTR-Bmh1uTQZ.js +36 -0
  80. package/dist/client/assets/blockDiagram-GPEHLZMM-55jaVWwd.js +132 -0
  81. package/dist/client/assets/c4Diagram-AAUBKEIU-Dxm0tLsZ.js +10 -0
  82. package/dist/client/assets/channel-ArVcv4Yl.js +1 -0
  83. package/dist/client/assets/chunk-2J33WTMH-vDJ1slcJ.js +1 -0
  84. package/dist/client/assets/chunk-4BX2VUAB-DP6CC-Qn.js +1 -0
  85. package/dist/client/assets/chunk-55IACEB6-SgOSJYkL.js +1 -0
  86. package/dist/client/assets/chunk-727SXJPM-BtRfbjBO.js +206 -0
  87. package/dist/client/assets/chunk-AQP2D5EJ-yIRaTgFg.js +231 -0
  88. package/dist/client/assets/chunk-FMBD7UC4-B_VD4t8N.js +15 -0
  89. package/dist/client/assets/chunk-ND2GUHAM-BvJdtX82.js +1 -0
  90. package/dist/client/assets/chunk-QZHKN3VN-BLNWKymD.js +1 -0
  91. package/dist/client/assets/classDiagram-4FO5ZUOK-B3nmPR7w.js +1 -0
  92. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B3nmPR7w.js +1 -0
  93. package/dist/client/assets/cose-bilkent-S5V4N54A-BQyA-r-y.js +1 -0
  94. package/dist/client/assets/cytoscape.esm-D_LviqZs.js +331 -0
  95. package/dist/client/assets/dagre-BM42HDAG-CAh0mTzA.js +4 -0
  96. package/dist/client/assets/defaultLocale-DX6XiGOO.js +1 -0
  97. package/dist/client/assets/diagram-2AECGRRQ-C83TGK4o.js +43 -0
  98. package/dist/client/assets/diagram-5GNKFQAL-2L6uowvf.js +10 -0
  99. package/dist/client/assets/diagram-KO2AKTUF-Cj5n4jdq.js +3 -0
  100. package/dist/client/assets/diagram-LMA3HP47-Bp5SDMjg.js +24 -0
  101. package/dist/client/assets/diagram-OG6HWLK6-cFsDQ8Qk.js +24 -0
  102. package/dist/client/assets/erDiagram-TEJ5UH35-D8G5xpg3.js +85 -0
  103. package/dist/client/assets/flowDiagram-I6XJVG4X-CuNudlCD.js +162 -0
  104. package/dist/client/assets/ganttDiagram-6RSMTGT7-CtFlsB15.js +292 -0
  105. package/dist/client/assets/gitGraphDiagram-PVQCEYII-h66Tso4O.js +106 -0
  106. package/dist/client/assets/graph-CAnANduQ.js +1 -0
  107. package/dist/client/assets/index-CZOpb3O7.css +1 -0
  108. package/dist/client/assets/index-D5ljIkCJ.js +727 -0
  109. package/dist/client/assets/index-aJE-l7h7.js +11 -0
  110. package/dist/client/assets/index-aPVup1Re.js +51 -0
  111. package/dist/client/assets/infoDiagram-5YYISTIA-CO_BLfuW.js +2 -0
  112. package/dist/client/assets/init-Gi6I4Gst.js +1 -0
  113. package/dist/client/assets/ishikawaDiagram-YF4QCWOH-D4rSRnQA.js +70 -0
  114. package/dist/client/assets/journeyDiagram-JHISSGLW-GyHI6dB8.js +139 -0
  115. package/dist/client/assets/kanban-definition-UN3LZRKU-CrH33WLe.js +89 -0
  116. package/dist/client/assets/katex-CQk2-UhE.js +257 -0
  117. package/dist/client/assets/layout-DGIYPm2g.js +1 -0
  118. package/dist/client/assets/linear-Dh1OyvSm.js +1 -0
  119. package/dist/client/assets/mermaid.core-C45sMDhS.js +309 -0
  120. package/dist/client/assets/mindmap-definition-RKZ34NQL-Bgwb0vwA.js +96 -0
  121. package/dist/client/assets/ordinal-Cboi1Yqb.js +1 -0
  122. package/dist/client/assets/pieDiagram-4H26LBE5-l9cCpVfG.js +30 -0
  123. package/dist/client/assets/quadrantDiagram-W4KKPZXB-BCPSUbC3.js +7 -0
  124. package/dist/client/assets/requirementDiagram-4Y6WPE33-TEGOe-vV.js +84 -0
  125. package/dist/client/assets/sankeyDiagram-5OEKKPKP-C69pv_7D.js +40 -0
  126. package/dist/client/assets/sequenceDiagram-3UESZ5HK-arinzeCk.js +162 -0
  127. package/dist/client/assets/stateDiagram-AJRCARHV-C2YENpmw.js +1 -0
  128. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CS6ocDH6.js +1 -0
  129. package/dist/client/assets/timeline-definition-PNZ67QCA-h5qtI99f.js +120 -0
  130. package/dist/client/assets/vennDiagram-CIIHVFJN-CnuK75Ut.js +34 -0
  131. package/dist/client/assets/wardley-L42UT6IY-B4bQ0Xyy.js +173 -0
  132. package/dist/client/assets/wardleyDiagram-YWT4CUSO-apV8olQc.js +78 -0
  133. package/dist/client/assets/xychartDiagram-2RQKCTM6-OTP6zeEy.js +7 -0
  134. package/dist/client/index.html +19 -0
  135. package/dist/server/config.d.ts +59 -0
  136. package/dist/server/config.js +211 -0
  137. package/dist/server/config.js.map +1 -0
  138. package/dist/server/core/plugin-host/cross-cutting.d.ts +8 -0
  139. package/dist/server/core/plugin-host/cross-cutting.js +14 -0
  140. package/dist/server/core/plugin-host/cross-cutting.js.map +1 -0
  141. package/dist/server/core/plugin-host/entities-router.d.ts +11 -0
  142. package/dist/server/core/plugin-host/entities-router.js +77 -0
  143. package/dist/server/core/plugin-host/entities-router.js.map +1 -0
  144. package/dist/server/core/plugin-host/host.d.ts +11 -0
  145. package/dist/server/core/plugin-host/host.js +128 -0
  146. package/dist/server/core/plugin-host/host.js.map +1 -0
  147. package/dist/server/core/plugin-host/legacy-adapter.d.ts +31 -0
  148. package/dist/server/core/plugin-host/legacy-adapter.js +88 -0
  149. package/dist/server/core/plugin-host/legacy-adapter.js.map +1 -0
  150. package/dist/server/core/plugin-host/serialization-engine.d.ts +35 -0
  151. package/dist/server/core/plugin-host/serialization-engine.js +132 -0
  152. package/dist/server/core/plugin-host/serialization-engine.js.map +1 -0
  153. package/dist/server/core/plugin-host/types.d.ts +143 -0
  154. package/dist/server/core/plugin-host/types.js +10 -0
  155. package/dist/server/core/plugin-host/types.js.map +1 -0
  156. package/dist/server/db/fixups/backfill-plan-titles.d.ts +2 -0
  157. package/dist/server/db/fixups/backfill-plan-titles.js +22 -0
  158. package/dist/server/db/fixups/backfill-plan-titles.js.map +1 -0
  159. package/dist/server/db/index.d.ts +6 -0
  160. package/dist/server/db/index.js +26 -0
  161. package/dist/server/db/index.js.map +1 -0
  162. package/dist/server/db/migrate.d.ts +2 -0
  163. package/dist/server/db/migrate.js +33 -0
  164. package/dist/server/db/migrate.js.map +1 -0
  165. package/dist/server/db/migrations/000_init.sql +7 -0
  166. package/dist/server/db/migrations/001_endpoint.sql +51 -0
  167. package/dist/server/db/migrations/002_dto.sql +23 -0
  168. package/dist/server/db/migrations/003_drop_endpoint_body.sql +5 -0
  169. package/dist/server/db/migrations/004_drop_module_and_status.sql +31 -0
  170. package/dist/server/db/migrations/005_chat.sql +23 -0
  171. package/dist/server/db/migrations/006_database_table.sql +10 -0
  172. package/dist/server/db/migrations/007_sections.sql +30 -0
  173. package/dist/server/db/migrations/008_subagent_task.sql +20 -0
  174. package/dist/server/db/migrations/009_chat_todo_snapshot.sql +4 -0
  175. package/dist/server/db/migrations/010_chat_plan_mode.sql +5 -0
  176. package/dist/server/db/migrations/011_chat_initial_system_prompt.sql +4 -0
  177. package/dist/server/db/migrations/012_chat_message_status.sql +5 -0
  178. package/dist/server/db/migrations/013_chat_usage_snapshot.sql +7 -0
  179. package/dist/server/db/migrations/014_plans.sql +33 -0
  180. package/dist/server/db/migrations/015_dto_examples.sql +4 -0
  181. package/dist/server/db/migrations/016_ui_view.sql +10 -0
  182. package/dist/server/db/migrations/017_entity_version_m17.sql +23 -0
  183. package/dist/server/db/migrations/018_page_version.sql +20 -0
  184. package/dist/server/db/migrations/019_spec_release.sql +13 -0
  185. package/dist/server/db/migrations/020_drop_plan_status.sql +10 -0
  186. package/dist/server/db/migrations/021_plans_n1.sql +36 -0
  187. package/dist/server/db/migrations/022_brief_chat_columns.sql +23 -0
  188. package/dist/server/db/migrations/023_page_version_kind.sql +26 -0
  189. package/dist/server/db/migrations/024_chat_context_size.sql +10 -0
  190. package/dist/server/db/migrations/025_ac.sql +19 -0
  191. package/dist/server/db/migrations/026_ac_seed.sql +75 -0
  192. package/dist/server/db/migrations/027_page_version_change_summary.sql +10 -0
  193. package/dist/server/db/readonly.d.ts +12 -0
  194. package/dist/server/db/readonly.js +32 -0
  195. package/dist/server/db/readonly.js.map +1 -0
  196. package/dist/server/domain/raw-entity-reader.d.ts +76 -0
  197. package/dist/server/domain/raw-entity-reader.js +240 -0
  198. package/dist/server/domain/raw-entity-reader.js.map +1 -0
  199. package/dist/server/entities/ac/mcp-server.d.ts +10 -0
  200. package/dist/server/entities/ac/mcp-server.js +154 -0
  201. package/dist/server/entities/ac/mcp-server.js.map +1 -0
  202. package/dist/server/entities/ac/plugin.d.ts +2 -0
  203. package/dist/server/entities/ac/plugin.js +33 -0
  204. package/dist/server/entities/ac/plugin.js.map +1 -0
  205. package/dist/server/entities/ac/routes.d.ts +4 -0
  206. package/dist/server/entities/ac/routes.js +92 -0
  207. package/dist/server/entities/ac/routes.js.map +1 -0
  208. package/dist/server/entities/ac/serializer.d.ts +13 -0
  209. package/dist/server/entities/ac/serializer.js +124 -0
  210. package/dist/server/entities/ac/serializer.js.map +1 -0
  211. package/dist/server/entities/ac/services.d.ts +35 -0
  212. package/dist/server/entities/ac/services.js +261 -0
  213. package/dist/server/entities/ac/services.js.map +1 -0
  214. package/dist/server/entities/ac/system-prompt.d.ts +2 -0
  215. package/dist/server/entities/ac/system-prompt.js +18 -0
  216. package/dist/server/entities/ac/system-prompt.js.map +1 -0
  217. package/dist/server/entities/database-table/mcp-server.d.ts +10 -0
  218. package/dist/server/entities/database-table/mcp-server.js +184 -0
  219. package/dist/server/entities/database-table/mcp-server.js.map +1 -0
  220. package/dist/server/entities/database-table/plugin.d.ts +2 -0
  221. package/dist/server/entities/database-table/plugin.js +33 -0
  222. package/dist/server/entities/database-table/plugin.js.map +1 -0
  223. package/dist/server/entities/database-table/routes.d.ts +5 -0
  224. package/dist/server/entities/database-table/routes.js +86 -0
  225. package/dist/server/entities/database-table/routes.js.map +1 -0
  226. package/dist/server/entities/database-table/serializer.d.ts +12 -0
  227. package/dist/server/entities/database-table/serializer.js +192 -0
  228. package/dist/server/entities/database-table/serializer.js.map +1 -0
  229. package/dist/server/entities/database-table/services.d.ts +45 -0
  230. package/dist/server/entities/database-table/services.js +323 -0
  231. package/dist/server/entities/database-table/services.js.map +1 -0
  232. package/dist/server/entities/database-table/system-prompt.d.ts +2 -0
  233. package/dist/server/entities/database-table/system-prompt.js +11 -0
  234. package/dist/server/entities/database-table/system-prompt.js.map +1 -0
  235. package/dist/server/entities/dto/mcp-server.d.ts +10 -0
  236. package/dist/server/entities/dto/mcp-server.js +141 -0
  237. package/dist/server/entities/dto/mcp-server.js.map +1 -0
  238. package/dist/server/entities/dto/plugin.d.ts +2 -0
  239. package/dist/server/entities/dto/plugin.js +33 -0
  240. package/dist/server/entities/dto/plugin.js.map +1 -0
  241. package/dist/server/entities/dto/routes.d.ts +4 -0
  242. package/dist/server/entities/dto/routes.js +74 -0
  243. package/dist/server/entities/dto/routes.js.map +1 -0
  244. package/dist/server/entities/dto/serializer.d.ts +12 -0
  245. package/dist/server/entities/dto/serializer.js +184 -0
  246. package/dist/server/entities/dto/serializer.js.map +1 -0
  247. package/dist/server/entities/dto/services.d.ts +30 -0
  248. package/dist/server/entities/dto/services.js +242 -0
  249. package/dist/server/entities/dto/services.js.map +1 -0
  250. package/dist/server/entities/dto/system-prompt.d.ts +2 -0
  251. package/dist/server/entities/dto/system-prompt.js +11 -0
  252. package/dist/server/entities/dto/system-prompt.js.map +1 -0
  253. package/dist/server/entities/endpoint/mcp-server.d.ts +10 -0
  254. package/dist/server/entities/endpoint/mcp-server.js +156 -0
  255. package/dist/server/entities/endpoint/mcp-server.js.map +1 -0
  256. package/dist/server/entities/endpoint/plugin.d.ts +2 -0
  257. package/dist/server/entities/endpoint/plugin.js +36 -0
  258. package/dist/server/entities/endpoint/plugin.js.map +1 -0
  259. package/dist/server/entities/endpoint/routes.d.ts +4 -0
  260. package/dist/server/entities/endpoint/routes.js +107 -0
  261. package/dist/server/entities/endpoint/routes.js.map +1 -0
  262. package/dist/server/entities/endpoint/serializer.d.ts +17 -0
  263. package/dist/server/entities/endpoint/serializer.js +217 -0
  264. package/dist/server/entities/endpoint/serializer.js.map +1 -0
  265. package/dist/server/entities/endpoint/services.d.ts +30 -0
  266. package/dist/server/entities/endpoint/services.js +260 -0
  267. package/dist/server/entities/endpoint/services.js.map +1 -0
  268. package/dist/server/entities/endpoint/system-prompt.d.ts +2 -0
  269. package/dist/server/entities/endpoint/system-prompt.js +11 -0
  270. package/dist/server/entities/endpoint/system-prompt.js.map +1 -0
  271. package/dist/server/entities/ui-view/mcp-server.d.ts +10 -0
  272. package/dist/server/entities/ui-view/mcp-server.js +161 -0
  273. package/dist/server/entities/ui-view/mcp-server.js.map +1 -0
  274. package/dist/server/entities/ui-view/plugin.d.ts +2 -0
  275. package/dist/server/entities/ui-view/plugin.js +33 -0
  276. package/dist/server/entities/ui-view/plugin.js.map +1 -0
  277. package/dist/server/entities/ui-view/routes.d.ts +5 -0
  278. package/dist/server/entities/ui-view/routes.js +82 -0
  279. package/dist/server/entities/ui-view/routes.js.map +1 -0
  280. package/dist/server/entities/ui-view/serializer.d.ts +12 -0
  281. package/dist/server/entities/ui-view/serializer.js +262 -0
  282. package/dist/server/entities/ui-view/serializer.js.map +1 -0
  283. package/dist/server/entities/ui-view/services.d.ts +35 -0
  284. package/dist/server/entities/ui-view/services.js +255 -0
  285. package/dist/server/entities/ui-view/services.js.map +1 -0
  286. package/dist/server/entities/ui-view/system-prompt.d.ts +7 -0
  287. package/dist/server/entities/ui-view/system-prompt.js +15 -0
  288. package/dist/server/entities/ui-view/system-prompt.js.map +1 -0
  289. package/dist/server/external-skills/brief-implementer-template.d.ts +2 -0
  290. package/dist/server/external-skills/brief-implementer-template.js +123 -0
  291. package/dist/server/external-skills/brief-implementer-template.js.map +1 -0
  292. package/dist/server/external-skills/external-skills-service.d.ts +3 -0
  293. package/dist/server/external-skills/external-skills-service.js +47 -0
  294. package/dist/server/external-skills/external-skills-service.js.map +1 -0
  295. package/dist/server/external-skills/spec-reader-template.d.ts +2 -0
  296. package/dist/server/external-skills/spec-reader-template.js +47 -0
  297. package/dist/server/external-skills/spec-reader-template.js.map +1 -0
  298. package/dist/server/fs/watcher.d.ts +26 -0
  299. package/dist/server/fs/watcher.js +64 -0
  300. package/dist/server/fs/watcher.js.map +1 -0
  301. package/dist/server/index.d.ts +18 -0
  302. package/dist/server/index.js +474 -0
  303. package/dist/server/index.js.map +1 -0
  304. package/dist/server/mcp/brief-tools.d.ts +19 -0
  305. package/dist/server/mcp/brief-tools.js +189 -0
  306. package/dist/server/mcp/brief-tools.js.map +1 -0
  307. package/dist/server/mcp/c4s-reader.d.ts +12 -0
  308. package/dist/server/mcp/c4s-reader.js +263 -0
  309. package/dist/server/mcp/c4s-reader.js.map +1 -0
  310. package/dist/server/mcp/database-tools.d.ts +10 -0
  311. package/dist/server/mcp/database-tools.js +184 -0
  312. package/dist/server/mcp/database-tools.js.map +1 -0
  313. package/dist/server/mcp/dependency-tools.d.ts +12 -0
  314. package/dist/server/mcp/dependency-tools.js +205 -0
  315. package/dist/server/mcp/dependency-tools.js.map +1 -0
  316. package/dist/server/mcp/dto-tools.d.ts +10 -0
  317. package/dist/server/mcp/dto-tools.js +141 -0
  318. package/dist/server/mcp/dto-tools.js.map +1 -0
  319. package/dist/server/mcp/endpoint-tools.d.ts +10 -0
  320. package/dist/server/mcp/endpoint-tools.js +156 -0
  321. package/dist/server/mcp/endpoint-tools.js.map +1 -0
  322. package/dist/server/mcp/ensure-mcp-json.d.ts +6 -0
  323. package/dist/server/mcp/ensure-mcp-json.js +30 -0
  324. package/dist/server/mcp/ensure-mcp-json.js.map +1 -0
  325. package/dist/server/mcp/index.d.ts +29 -0
  326. package/dist/server/mcp/index.js +40 -0
  327. package/dist/server/mcp/index.js.map +1 -0
  328. package/dist/server/mcp/plan-tools.d.ts +7 -0
  329. package/dist/server/mcp/plan-tools.js +105 -0
  330. package/dist/server/mcp/plan-tools.js.map +1 -0
  331. package/dist/server/mcp/reference-tools.d.ts +17 -0
  332. package/dist/server/mcp/reference-tools.js +630 -0
  333. package/dist/server/mcp/reference-tools.js.map +1 -0
  334. package/dist/server/mcp/release-tools/index.d.ts +21 -0
  335. package/dist/server/mcp/release-tools/index.js +140 -0
  336. package/dist/server/mcp/release-tools/index.js.map +1 -0
  337. package/dist/server/mcp/release-tools/projection.d.ts +32 -0
  338. package/dist/server/mcp/release-tools/projection.js +278 -0
  339. package/dist/server/mcp/release-tools/projection.js.map +1 -0
  340. package/dist/server/mcp/release-tools/types.d.ts +91 -0
  341. package/dist/server/mcp/release-tools/types.js +11 -0
  342. package/dist/server/mcp/release-tools/types.js.map +1 -0
  343. package/dist/server/mcp/release-tools.d.ts +14 -0
  344. package/dist/server/mcp/release-tools.js +83 -0
  345. package/dist/server/mcp/release-tools.js.map +1 -0
  346. package/dist/server/mcp/ui-view-tools.d.ts +10 -0
  347. package/dist/server/mcp/ui-view-tools.js +161 -0
  348. package/dist/server/mcp/ui-view-tools.js.map +1 -0
  349. package/dist/server/routes/briefs.d.ts +8 -0
  350. package/dist/server/routes/briefs.js +178 -0
  351. package/dist/server/routes/briefs.js.map +1 -0
  352. package/dist/server/routes/chat.d.ts +29 -0
  353. package/dist/server/routes/chat.js +604 -0
  354. package/dist/server/routes/chat.js.map +1 -0
  355. package/dist/server/routes/database-tables.d.ts +5 -0
  356. package/dist/server/routes/database-tables.js +86 -0
  357. package/dist/server/routes/database-tables.js.map +1 -0
  358. package/dist/server/routes/dependencies.d.ts +6 -0
  359. package/dist/server/routes/dependencies.js +164 -0
  360. package/dist/server/routes/dependencies.js.map +1 -0
  361. package/dist/server/routes/dtos.d.ts +4 -0
  362. package/dist/server/routes/dtos.js +74 -0
  363. package/dist/server/routes/dtos.js.map +1 -0
  364. package/dist/server/routes/endpoints.d.ts +4 -0
  365. package/dist/server/routes/endpoints.js +107 -0
  366. package/dist/server/routes/endpoints.js.map +1 -0
  367. package/dist/server/routes/entities.d.ts +8 -0
  368. package/dist/server/routes/entities.js +84 -0
  369. package/dist/server/routes/entities.js.map +1 -0
  370. package/dist/server/routes/errors.d.ts +2 -0
  371. package/dist/server/routes/errors.js +37 -0
  372. package/dist/server/routes/errors.js.map +1 -0
  373. package/dist/server/routes/page-links.d.ts +3 -0
  374. package/dist/server/routes/page-links.js +40 -0
  375. package/dist/server/routes/page-links.js.map +1 -0
  376. package/dist/server/routes/pages.d.ts +5 -0
  377. package/dist/server/routes/pages.js +142 -0
  378. package/dist/server/routes/pages.js.map +1 -0
  379. package/dist/server/routes/plans.d.ts +3 -0
  380. package/dist/server/routes/plans.js +192 -0
  381. package/dist/server/routes/plans.js.map +1 -0
  382. package/dist/server/routes/references.d.ts +3 -0
  383. package/dist/server/routes/references.js +34 -0
  384. package/dist/server/routes/references.js.map +1 -0
  385. package/dist/server/routes/releases.d.ts +4 -0
  386. package/dist/server/routes/releases.js +122 -0
  387. package/dist/server/routes/releases.js.map +1 -0
  388. package/dist/server/routes/sections.d.ts +3 -0
  389. package/dist/server/routes/sections.js +32 -0
  390. package/dist/server/routes/sections.js.map +1 -0
  391. package/dist/server/routes/tags.d.ts +4 -0
  392. package/dist/server/routes/tags.js +56 -0
  393. package/dist/server/routes/tags.js.map +1 -0
  394. package/dist/server/routes/threads.d.ts +3 -0
  395. package/dist/server/routes/threads.js +78 -0
  396. package/dist/server/routes/threads.js.map +1 -0
  397. package/dist/server/routes/todos.d.ts +3 -0
  398. package/dist/server/routes/todos.js +28 -0
  399. package/dist/server/routes/todos.js.map +1 -0
  400. package/dist/server/routes/ui-views.d.ts +5 -0
  401. package/dist/server/routes/ui-views.js +82 -0
  402. package/dist/server/routes/ui-views.js.map +1 -0
  403. package/dist/server/serialization/auto-schema.d.ts +3 -0
  404. package/dist/server/serialization/auto-schema.js +55 -0
  405. package/dist/server/serialization/auto-schema.js.map +1 -0
  406. package/dist/server/serialization/fallback.d.ts +4 -0
  407. package/dist/server/serialization/fallback.js +27 -0
  408. package/dist/server/serialization/fallback.js.map +1 -0
  409. package/dist/server/serialization/inline-renderer.d.ts +4 -0
  410. package/dist/server/serialization/inline-renderer.js +151 -0
  411. package/dist/server/serialization/inline-renderer.js.map +1 -0
  412. package/dist/server/serialization/registerAll.d.ts +6 -0
  413. package/dist/server/serialization/registerAll.js +7 -0
  414. package/dist/server/serialization/registerAll.js.map +1 -0
  415. package/dist/server/serialization/registry.d.ts +26 -0
  416. package/dist/server/serialization/registry.js +121 -0
  417. package/dist/server/serialization/registry.js.map +1 -0
  418. package/dist/server/serialization/resolve-page.d.ts +24 -0
  419. package/dist/server/serialization/resolve-page.js +192 -0
  420. package/dist/server/serialization/resolve-page.js.map +1 -0
  421. package/dist/server/serialization/serializers/database-table.d.ts +1 -0
  422. package/dist/server/serialization/serializers/database-table.js +46 -0
  423. package/dist/server/serialization/serializers/database-table.js.map +1 -0
  424. package/dist/server/serialization/serializers/dto.d.ts +1 -0
  425. package/dist/server/serialization/serializers/dto.js +48 -0
  426. package/dist/server/serialization/serializers/dto.js.map +1 -0
  427. package/dist/server/serialization/serializers/endpoint.d.ts +1 -0
  428. package/dist/server/serialization/serializers/endpoint.js +93 -0
  429. package/dist/server/serialization/serializers/endpoint.js.map +1 -0
  430. package/dist/server/serialization/serializers/section.d.ts +1 -0
  431. package/dist/server/serialization/serializers/section.js +24 -0
  432. package/dist/server/serialization/serializers/section.js.map +1 -0
  433. package/dist/server/serialization/serializers/ui-view.d.ts +1 -0
  434. package/dist/server/serialization/serializers/ui-view.js +124 -0
  435. package/dist/server/serialization/serializers/ui-view.js.map +1 -0
  436. package/dist/server/serialization/snapshot.d.ts +22 -0
  437. package/dist/server/serialization/snapshot.js +102 -0
  438. package/dist/server/serialization/snapshot.js.map +1 -0
  439. package/dist/server/serialization/types.d.ts +70 -0
  440. package/dist/server/serialization/types.js +7 -0
  441. package/dist/server/serialization/types.js.map +1 -0
  442. package/dist/server/serialization/writer.d.ts +41 -0
  443. package/dist/server/serialization/writer.js +13 -0
  444. package/dist/server/serialization/writer.js.map +1 -0
  445. package/dist/server/services/brief.d.ts +86 -0
  446. package/dist/server/services/brief.js +218 -0
  447. package/dist/server/services/brief.js.map +1 -0
  448. package/dist/server/services/chat-context.d.ts +26 -0
  449. package/dist/server/services/chat-context.js +434 -0
  450. package/dist/server/services/chat-context.js.map +1 -0
  451. package/dist/server/services/chat.d.ts +50 -0
  452. package/dist/server/services/chat.js +309 -0
  453. package/dist/server/services/chat.js.map +1 -0
  454. package/dist/server/services/database-table.d.ts +36 -0
  455. package/dist/server/services/database-table.js +303 -0
  456. package/dist/server/services/database-table.js.map +1 -0
  457. package/dist/server/services/dependencies.d.ts +45 -0
  458. package/dist/server/services/dependencies.js +302 -0
  459. package/dist/server/services/dependencies.js.map +1 -0
  460. package/dist/server/services/dto.d.ts +22 -0
  461. package/dist/server/services/dto.js +222 -0
  462. package/dist/server/services/dto.js.map +1 -0
  463. package/dist/server/services/endpoint.d.ts +22 -0
  464. package/dist/server/services/endpoint.js +239 -0
  465. package/dist/server/services/endpoint.js.map +1 -0
  466. package/dist/server/services/entity-writer.d.ts +46 -0
  467. package/dist/server/services/entity-writer.js +137 -0
  468. package/dist/server/services/entity-writer.js.map +1 -0
  469. package/dist/server/services/page-serializer.d.ts +109 -0
  470. package/dist/server/services/page-serializer.js +359 -0
  471. package/dist/server/services/page-serializer.js.map +1 -0
  472. package/dist/server/services/page-version.d.ts +75 -0
  473. package/dist/server/services/page-version.js +159 -0
  474. package/dist/server/services/page-version.js.map +1 -0
  475. package/dist/server/services/pages-frontmatter-indexer.d.ts +51 -0
  476. package/dist/server/services/pages-frontmatter-indexer.js +138 -0
  477. package/dist/server/services/pages-frontmatter-indexer.js.map +1 -0
  478. package/dist/server/services/pages-link-indexer.d.ts +36 -0
  479. package/dist/server/services/pages-link-indexer.js +474 -0
  480. package/dist/server/services/pages-link-indexer.js.map +1 -0
  481. package/dist/server/services/pages.d.ts +16 -0
  482. package/dist/server/services/pages.js +149 -0
  483. package/dist/server/services/pages.js.map +1 -0
  484. package/dist/server/services/plan.d.ts +59 -0
  485. package/dist/server/services/plan.js +459 -0
  486. package/dist/server/services/plan.js.map +1 -0
  487. package/dist/server/services/references.d.ts +17 -0
  488. package/dist/server/services/references.js +175 -0
  489. package/dist/server/services/references.js.map +1 -0
  490. package/dist/server/services/release.d.ts +146 -0
  491. package/dist/server/services/release.js +602 -0
  492. package/dist/server/services/release.js.map +1 -0
  493. package/dist/server/services/section-indexer.d.ts +20 -0
  494. package/dist/server/services/section-indexer.js +276 -0
  495. package/dist/server/services/section-indexer.js.map +1 -0
  496. package/dist/server/services/sections.d.ts +34 -0
  497. package/dist/server/services/sections.js +136 -0
  498. package/dist/server/services/sections.js.map +1 -0
  499. package/dist/server/services/skill-registry.d.ts +38 -0
  500. package/dist/server/services/skill-registry.js +171 -0
  501. package/dist/server/services/skill-registry.js.map +1 -0
  502. package/dist/server/services/slug.d.ts +7 -0
  503. package/dist/server/services/slug.js +41 -0
  504. package/dist/server/services/slug.js.map +1 -0
  505. package/dist/server/services/tags.d.ts +27 -0
  506. package/dist/server/services/tags.js +153 -0
  507. package/dist/server/services/tags.js.map +1 -0
  508. package/dist/server/services/todos-indexer.d.ts +21 -0
  509. package/dist/server/services/todos-indexer.js +123 -0
  510. package/dist/server/services/todos-indexer.js.map +1 -0
  511. package/dist/server/services/ui-view.d.ts +26 -0
  512. package/dist/server/services/ui-view.js +235 -0
  513. package/dist/server/services/ui-view.js.map +1 -0
  514. package/dist/server/services/versions.d.ts +59 -0
  515. package/dist/server/services/versions.js +181 -0
  516. package/dist/server/services/versions.js.map +1 -0
  517. package/dist/server/skills/brief-author/SKILL.md +117 -0
  518. package/dist/server/skills/layered-vertical-slices/SKILL.md +135 -0
  519. package/dist/server/skills/layered-vertical-slices/templates/index.md +97 -0
  520. package/dist/server/skills/layered-vertical-slices/templates/layer.md +42 -0
  521. package/dist/server/skills/layered-vertical-slices/templates/module.md +52 -0
  522. package/dist/server/skills/layered-vertical-slices/workflows/bootstrap.md +116 -0
  523. package/dist/server/skills/layered-vertical-slices/workflows/brief.md +154 -0
  524. package/dist/server/skills/layered-vertical-slices/workflows/daily.md +77 -0
  525. package/dist/server/ws/gateway.d.ts +10 -0
  526. package/dist/server/ws/gateway.js +35 -0
  527. package/dist/server/ws/gateway.js.map +1 -0
  528. package/dist/shared/anchor-pattern.d.ts +15 -0
  529. package/dist/shared/anchor-pattern.js +16 -0
  530. package/dist/shared/anchor-pattern.js.map +1 -0
  531. package/dist/shared/diagram-source-escape.d.ts +2 -0
  532. package/dist/shared/diagram-source-escape.js +19 -0
  533. package/dist/shared/diagram-source-escape.js.map +1 -0
  534. package/dist/shared/entities.d.ts +622 -0
  535. package/dist/shared/entities.js +9 -0
  536. package/dist/shared/entities.js.map +1 -0
  537. package/dist/shared/page-links.d.ts +40 -0
  538. package/dist/shared/page-links.js +2 -0
  539. package/dist/shared/page-links.js.map +1 -0
  540. package/dist/shared/plugin-host/types.d.ts +66 -0
  541. package/dist/shared/plugin-host/types.js +11 -0
  542. package/dist/shared/plugin-host/types.js.map +1 -0
  543. package/dist/shared/reference-extensions.d.ts +13 -0
  544. package/dist/shared/reference-extensions.js +17 -0
  545. package/dist/shared/reference-extensions.js.map +1 -0
  546. package/dist/shared/types.d.ts +86 -0
  547. package/dist/shared/types.js +2 -0
  548. package/dist/shared/types.js.map +1 -0
  549. package/dist/shared/xml-tags.d.ts +16 -0
  550. package/dist/shared/xml-tags.js +101 -0
  551. package/dist/shared/xml-tags.js.map +1 -0
  552. package/package.json +110 -0
@@ -0,0 +1,602 @@
1
+ /**
2
+ * ReleaseService — public API M17. Single source of truth for release listing,
3
+ * detail, snapshot, diff, and (Phase 6) restore. All other surfaces
4
+ * (REST `/api/releases/*`, MCP `release-tools`, UI sidebar) are thin
5
+ * adapters.
6
+ *
7
+ * Spec reference: `modules/m17-snapshots-releases.md` (`m17api001`,
8
+ * `m17dom001`, `m17dcre01`).
9
+ */
10
+ import { DomainError } from './tags.js';
11
+ import { HostEntityWriter } from './entity-writer.js';
12
+ const ENTITY_TYPES = ['endpoint', 'dto', 'database-table', 'ui-view', 'ac'];
13
+ const ENTITY_TABLES = {
14
+ endpoint: 'endpoint',
15
+ dto: 'dto',
16
+ 'database-table': 'database_table',
17
+ 'ui-view': 'ui_view',
18
+ ac: 'ac',
19
+ };
20
+ export class ReleaseService {
21
+ db;
22
+ host;
23
+ versions;
24
+ pageVersions;
25
+ pageSerializer;
26
+ rawReader;
27
+ tagsService;
28
+ pagesService;
29
+ watcher;
30
+ constructor(db, host, versions, pageVersions, pageSerializer, rawReader, tagsService, pagesService, watcher = null) {
31
+ this.db = db;
32
+ this.host = host;
33
+ this.versions = versions;
34
+ this.pageVersions = pageVersions;
35
+ this.pageSerializer = pageSerializer;
36
+ this.rawReader = rawReader;
37
+ this.tagsService = tagsService;
38
+ this.pagesService = pagesService;
39
+ this.watcher = watcher;
40
+ }
41
+ // ─── Listing & retrieval ─────────────────────────────────────────────────
42
+ listReleases() {
43
+ const rows = this.db
44
+ .prepare(`SELECT * FROM spec_release ORDER BY created_at DESC, id DESC`)
45
+ .all();
46
+ return rows.map((r) => this.toRelease(r));
47
+ }
48
+ getRelease(idOrName) {
49
+ const row = this.findReleaseRow(idOrName);
50
+ if (!row)
51
+ throw new DomainError('NOT_FOUND', `release '${idOrName}' not found`);
52
+ const release = this.toRelease(row);
53
+ return { ...release, countBreakdown: this.computeCountBreakdown(row.id) };
54
+ }
55
+ // ─── Mutations ───────────────────────────────────────────────────────────
56
+ /**
57
+ * Manual release creation (decyzja 9: zero auto-trigger). Validates
58
+ * non-empty + UNIQUE name and non-empty description; in a single
59
+ * transaction inserts spec_release and assigns all unreleased
60
+ * entity_version + page_version rows.
61
+ */
62
+ createRelease(input, actor) {
63
+ const name = (input.name ?? '').trim();
64
+ const description = (input.description ?? '').trim();
65
+ if (!name)
66
+ throw new DomainError('VALIDATION', 'release name is required');
67
+ if (!description)
68
+ throw new DomainError('RELEASE_DESCRIPTION_REQUIRED', 'release description is required');
69
+ const tx = this.db.transaction(() => {
70
+ const conflict = this.db
71
+ .prepare(`SELECT 1 FROM spec_release WHERE name = ?`)
72
+ .get(name);
73
+ if (conflict)
74
+ throw new DomainError('RELEASE_NAME_CONFLICT', `release name '${name}' already exists`);
75
+ const info = this.db
76
+ .prepare(`INSERT INTO spec_release (name, description, created_by) VALUES (?, ?, ?)`)
77
+ .run(name, description, actor);
78
+ const releaseId = Number(info.lastInsertRowid);
79
+ this.db
80
+ .prepare(`UPDATE entity_version SET release_id = ? WHERE release_id IS NULL`)
81
+ .run(releaseId);
82
+ this.pageVersions.assignToRelease(releaseId);
83
+ const row = this.db
84
+ .prepare(`SELECT * FROM spec_release WHERE id = ?`)
85
+ .get(releaseId);
86
+ return row;
87
+ });
88
+ const releaseRow = tx();
89
+ const release = this.toRelease(releaseRow);
90
+ return { ...release, countBreakdown: this.computeCountBreakdown(release.id) };
91
+ }
92
+ /**
93
+ * Mutate the LATEST release only (decyzja 13: implicit last = mutable).
94
+ * Older releases are frozen — `id != MAX(id)` ⇒ 409 RELEASE_FROZEN.
95
+ * Optionally pulls all `release_id IS NULL` rows from entity_version /
96
+ * page_version into this release (decyzja 14, no untie).
97
+ */
98
+ updateRelease(input) {
99
+ const tx = this.db.transaction(() => {
100
+ const row = this.findReleaseRow(input.idOrName);
101
+ if (!row)
102
+ throw new DomainError('NOT_FOUND', `release '${input.idOrName}' not found`);
103
+ const maxRow = this.db
104
+ .prepare(`SELECT MAX(id) AS maxId FROM spec_release`)
105
+ .get();
106
+ if (row.id !== maxRow.maxId) {
107
+ throw new DomainError('RELEASE_FROZEN', `release '${row.name}' is frozen — only the latest release is mutable`);
108
+ }
109
+ const nextName = input.name === undefined ? undefined : input.name.trim();
110
+ const nextDescription = input.description === undefined ? undefined : input.description.trim();
111
+ if (nextName !== undefined) {
112
+ if (!nextName)
113
+ throw new DomainError('VALIDATION', 'release name is required');
114
+ if (nextName !== row.name) {
115
+ const conflict = this.db
116
+ .prepare(`SELECT 1 FROM spec_release WHERE name = ? AND id != ?`)
117
+ .get(nextName, row.id);
118
+ if (conflict) {
119
+ throw new DomainError('RELEASE_NAME_CONFLICT', `release name '${nextName}' already exists`);
120
+ }
121
+ }
122
+ }
123
+ if (nextDescription !== undefined && !nextDescription) {
124
+ throw new DomainError('RELEASE_DESCRIPTION_REQUIRED', 'release description is required');
125
+ }
126
+ if (nextName !== undefined || nextDescription !== undefined) {
127
+ this.db
128
+ .prepare(`UPDATE spec_release
129
+ SET name = COALESCE(?, name),
130
+ description = COALESCE(?, description)
131
+ WHERE id = ?`)
132
+ .run(nextName ?? null, nextDescription ?? null, row.id);
133
+ }
134
+ if (input.assignUnreleased === true) {
135
+ this.db
136
+ .prepare(`UPDATE entity_version SET release_id = ? WHERE release_id IS NULL`)
137
+ .run(row.id);
138
+ this.pageVersions.assignToRelease(row.id);
139
+ }
140
+ return row.id;
141
+ });
142
+ const releaseId = tx();
143
+ return this.getRelease(releaseId);
144
+ }
145
+ // ─── Snapshots & diffs ───────────────────────────────────────────────────
146
+ /**
147
+ * Cumulative state at the end of a release: per (type, slug), the latest
148
+ * entity_version row at-or-before `releaseId`. Each row carries
149
+ * `op` + `data` (snapshot) + `serializer_version`.
150
+ */
151
+ getReleaseSnapshot(idOrName) {
152
+ const row = this.findReleaseRow(idOrName);
153
+ if (!row)
154
+ throw new DomainError('NOT_FOUND', `release '${idOrName}' not found`);
155
+ const release = this.toRelease(row);
156
+ const entities = [];
157
+ const serializerVersions = {};
158
+ for (const type of ENTITY_TYPES) {
159
+ const module = this.host.getEntity(type);
160
+ if (!module)
161
+ continue;
162
+ serializerVersions[type] = module.serializer.version;
163
+ const rows = this.latestEntityRowsAtOrBefore(type, row.id);
164
+ for (const r of rows) {
165
+ if (!r.op)
166
+ continue;
167
+ const slug = this.resolveSlug(type, r.entity_id, r.data);
168
+ if (!slug)
169
+ continue;
170
+ entities.push({
171
+ type,
172
+ slug,
173
+ op: r.op,
174
+ data: safeJsonParse(r.data),
175
+ });
176
+ }
177
+ }
178
+ serializerVersions.page = this.pageSerializer.version;
179
+ const pages = this.latestPageRowsAtOrBefore(row.id).map((p) => ({
180
+ path: p.path,
181
+ op: p.op,
182
+ data: safeJsonParse(p.data),
183
+ }));
184
+ return {
185
+ release,
186
+ serializer_versions: serializerVersions,
187
+ entities,
188
+ pages,
189
+ };
190
+ }
191
+ /**
192
+ * Structured semantic diff between two releases. For each entity that
193
+ * differs (or pages that differ), computes per-plugin `host.diff(...)`
194
+ * (entities) or `pageSerializer.diff(...)` (pages). Falls back to
195
+ * default deep-diff when plugin doesn't override `diff`.
196
+ *
197
+ * `fromIdOrName === null` ⇒ initial brief: synthetic empty `from` snapshot.
198
+ * Wszystkie encje/strony w `to` widoczne jako `op: 'create'`. Output
199
+ * `RawDelta.from` jest wtedy `null` (sygnal dla M21 / UI).
200
+ */
201
+ getReleaseDiff(fromIdOrName, toIdOrName) {
202
+ const toRow = this.findReleaseRow(toIdOrName);
203
+ if (!toRow)
204
+ throw new DomainError('NOT_FOUND', `release '${toIdOrName}' not found`);
205
+ const toSnap = this.getReleaseSnapshot(toRow.id);
206
+ let fromSnap;
207
+ let fromMeta;
208
+ if (fromIdOrName === null) {
209
+ fromSnap = {
210
+ release: { id: 0, name: '__initial__', description: '', createdBy: 'user', createdAt: '' },
211
+ serializer_versions: toSnap.serializer_versions,
212
+ entities: [],
213
+ pages: [],
214
+ };
215
+ fromMeta = null;
216
+ }
217
+ else {
218
+ const fromRow = this.findReleaseRow(fromIdOrName);
219
+ if (!fromRow)
220
+ throw new DomainError('NOT_FOUND', `release '${fromIdOrName}' not found`);
221
+ fromSnap = this.getReleaseSnapshot(fromRow.id);
222
+ fromMeta = { id: fromRow.id, name: fromRow.name };
223
+ }
224
+ const entityChanges = [];
225
+ // Index by `${type}|${slug}` for both sides
226
+ const aMap = new Map();
227
+ for (const e of fromSnap.entities)
228
+ aMap.set(`${e.type}|${e.slug}`, e);
229
+ const bMap = new Map();
230
+ for (const e of toSnap.entities)
231
+ bMap.set(`${e.type}|${e.slug}`, e);
232
+ const allKeys = new Set([...aMap.keys(), ...bMap.keys()]);
233
+ for (const key of allKeys) {
234
+ const a = aMap.get(key);
235
+ const b = bMap.get(key);
236
+ const sample = (a ?? b);
237
+ const aData = a && a.op !== 'delete' ? a.data : null;
238
+ const bData = b && b.op !== 'delete' ? b.data : null;
239
+ const diff = this.host.diff(sample.type, aData, bData, sample.slug);
240
+ if (diff.op === 'noop')
241
+ continue;
242
+ const aVer = fromSnap.serializer_versions[sample.type] ?? null;
243
+ const bVer = toSnap.serializer_versions[sample.type] ?? null;
244
+ entityChanges.push({
245
+ type: diff.type,
246
+ slug: diff.slug,
247
+ op: diff.op,
248
+ ...(diff.changes ? { changes: diff.changes } : {}),
249
+ ...(diff.raw ? { raw: diff.raw } : {}),
250
+ ...(aVer !== bVer ? { _serializerVersionMismatch: { type: sample.type, from: aVer, to: bVer } } : {}),
251
+ });
252
+ }
253
+ const pageChanges = [];
254
+ const aPagesMap = new Map(fromSnap.pages.map((p) => [p.path, p]));
255
+ const bPagesMap = new Map(toSnap.pages.map((p) => [p.path, p]));
256
+ const allPaths = new Set([...aPagesMap.keys(), ...bPagesMap.keys()]);
257
+ for (const path of allPaths) {
258
+ const a = aPagesMap.get(path);
259
+ const b = bPagesMap.get(path);
260
+ const aData = a && a.op !== 'delete' ? a.data : null;
261
+ const bData = b && b.op !== 'delete' ? b.data : null;
262
+ const diff = this.pageSerializer.diff(aData, bData, path);
263
+ if (diff.op === 'noop')
264
+ continue;
265
+ pageChanges.push({
266
+ path: diff.path,
267
+ op: diff.op,
268
+ added_sections: diff.added_sections,
269
+ removed_sections: diff.removed_sections,
270
+ modified_sections: diff.modified_sections,
271
+ moved_sections: diff.moved_sections,
272
+ frontmatter_diff: diff.frontmatter_diff,
273
+ xml_refs_diff: diff.xml_refs_diff,
274
+ });
275
+ }
276
+ return {
277
+ from: fromMeta,
278
+ to: { id: toRow.id, name: toRow.name },
279
+ entities: entityChanges,
280
+ pages: pageChanges,
281
+ };
282
+ }
283
+ // ─── Restore (M17 Phase 6) ───────────────────────────────────────────────
284
+ /**
285
+ * Restore a single entity to its state at the target release. Append-only:
286
+ * the restore generates a normal mutation through write-API, producing a
287
+ * new entity_version row with `release_id = NULL`. Idempotent (decyzja 11):
288
+ * re-running restore on already-matching state yields op='noop'.
289
+ */
290
+ restoreEntity(input, actor = 'user') {
291
+ const releaseRow = this.findReleaseRow(input.releaseId);
292
+ if (!releaseRow)
293
+ throw new DomainError('NOT_FOUND', `release '${input.releaseId}' not found`);
294
+ const targetRow = this.latestEntityRowForSlug(input.type, input.slug, releaseRow.id);
295
+ const writer = new HostEntityWriter(this.host, this.tagsService);
296
+ const restoreCtx = {
297
+ reader: this.rawReader,
298
+ writer,
299
+ releaseId: releaseRow.id,
300
+ actor,
301
+ };
302
+ if (!targetRow || targetRow.op === 'delete' || targetRow.data === 'null') {
303
+ // Snapshot says entity didn't exist (or was deleted) at this release.
304
+ const deleted = writer.delete(input.type, input.slug, actor);
305
+ return {
306
+ type: input.type,
307
+ slug: input.slug,
308
+ op: deleted.deleted ? 'deleted' : 'noop',
309
+ };
310
+ }
311
+ const targetSnapshot = safeJsonParse(targetRow.data);
312
+ // Compare to current state — if identical, no-op.
313
+ const current = this.rawReader.getEntity(input.type, input.slug);
314
+ if (current) {
315
+ const currentSnapshot = this.host.snapshot(input.type, current, {
316
+ reader: this.rawReader,
317
+ depth: 0,
318
+ maxDepth: 1,
319
+ });
320
+ const diff = this.host.diff(input.type, currentSnapshot, targetSnapshot, input.slug);
321
+ if (diff.op === 'noop') {
322
+ return { type: input.type, slug: input.slug, op: 'noop' };
323
+ }
324
+ }
325
+ const result = this.host.restore(input.type, targetSnapshot, restoreCtx);
326
+ return {
327
+ type: input.type,
328
+ slug: input.slug,
329
+ op: result.op,
330
+ ...(result.warnings && result.warnings.length ? { warnings: result.warnings } : {}),
331
+ };
332
+ }
333
+ /**
334
+ * Restore a single page. Looks up the latest page_version snapshot at-or-
335
+ * before the release and writes its content via PagesService. The watcher
336
+ * suppresses the resulting chokidar event; the REST capture path then
337
+ * records a fresh page_version row with `release_id = NULL` and
338
+ * `changed_by = 'user'`.
339
+ */
340
+ async restorePage(input, _actor = 'user') {
341
+ const releaseRow = this.findReleaseRow(input.releaseId);
342
+ if (!releaseRow)
343
+ throw new DomainError('NOT_FOUND', `release '${input.releaseId}' not found`);
344
+ const target = this.pageVersions.getLatestForPath(input.path, releaseRow.id);
345
+ if (!target || target.op === 'delete') {
346
+ // Snapshot says page didn't exist — delete current file if present.
347
+ if (await this.pagesService.exists(input.path)) {
348
+ this.watcher?.suppress(input.path);
349
+ await this.pagesService.remove(input.path);
350
+ await this.pageVersions.recordVersion(input.path, 'delete', 'user');
351
+ return { path: input.path, op: 'deleted' };
352
+ }
353
+ return { path: input.path, op: 'noop' };
354
+ }
355
+ const data = target.data;
356
+ const exists = await this.pagesService.exists(input.path);
357
+ let currentContent = null;
358
+ if (exists) {
359
+ try {
360
+ const fs = await import('node:fs/promises');
361
+ const path = await import('node:path');
362
+ currentContent = await fs.readFile(path.join(this.pagesService.root, input.path), 'utf-8');
363
+ }
364
+ catch {
365
+ currentContent = null;
366
+ }
367
+ }
368
+ if (currentContent === data.content) {
369
+ return { path: input.path, op: 'noop' };
370
+ }
371
+ this.watcher?.suppress(input.path);
372
+ // Write raw content directly — bypass frontmatter splitting so byte-for-byte fidelity is preserved.
373
+ const fsP = await import('node:fs/promises');
374
+ const pathMod = await import('node:path');
375
+ const abs = pathMod.join(this.pagesService.root, input.path);
376
+ await fsP.mkdir(pathMod.dirname(abs), { recursive: true });
377
+ await fsP.writeFile(abs, data.content, 'utf-8');
378
+ const op = exists ? 'updated' : 'created';
379
+ await this.pageVersions.recordVersion(input.path, op === 'created' ? 'create' : 'update', 'user');
380
+ return { path: input.path, op };
381
+ }
382
+ /**
383
+ * Restore the entire spec to a release. Topological sort: DTO first
384
+ * (Endpoint references DTO via linked_dtos), then everything else, then
385
+ * pages. Each step generates normal mutations → all visible in timeline.
386
+ */
387
+ async restoreSpec(input, actor = 'user') {
388
+ const releaseRow = this.findReleaseRow(input.releaseId);
389
+ if (!releaseRow)
390
+ throw new DomainError('NOT_FOUND', `release '${input.releaseId}' not found`);
391
+ const releaseId = releaseRow.id;
392
+ const entityResults = [];
393
+ const pageResults = [];
394
+ // Topological order — DTO before Endpoint (Endpoint linked_dtos references DTO slugs).
395
+ const order = ['dto', 'database-table', 'ui-view', 'endpoint'];
396
+ for (const type of order) {
397
+ // Slugs in target release
398
+ const targetRows = this.latestEntityRowsAtOrBefore(type, releaseId);
399
+ const targetSlugs = new Set();
400
+ for (const r of targetRows) {
401
+ if (!r.op || r.op === 'delete' || r.data === 'null')
402
+ continue;
403
+ const slug = this.resolveSlug(type, r.entity_id, r.data);
404
+ if (slug)
405
+ targetSlugs.add(slug);
406
+ }
407
+ // Restore each slug present in target
408
+ for (const slug of targetSlugs) {
409
+ try {
410
+ entityResults.push(this.restoreEntity({ type, slug, releaseId }, actor));
411
+ }
412
+ catch (err) {
413
+ entityResults.push({
414
+ type,
415
+ slug,
416
+ op: 'noop',
417
+ warnings: [`restore failed: ${err.message}`],
418
+ });
419
+ }
420
+ }
421
+ // Delete extras: entities currently present but not in target
422
+ const currentSlugs = new Set(this.rawReader.listSlugs(type));
423
+ for (const slug of currentSlugs) {
424
+ if (targetSlugs.has(slug))
425
+ continue;
426
+ // Was this entity present in any earlier release? If so, target says delete.
427
+ // If never released (entity created after target release), still delete to
428
+ // align state with target.
429
+ try {
430
+ entityResults.push(this.restoreEntity({ type, slug, releaseId }, actor));
431
+ }
432
+ catch (err) {
433
+ entityResults.push({
434
+ type,
435
+ slug,
436
+ op: 'noop',
437
+ warnings: [`delete-restore failed: ${err.message}`],
438
+ });
439
+ }
440
+ }
441
+ }
442
+ // Pages
443
+ const targetPagePaths = this.pageVersions.listPathsForRelease(releaseId);
444
+ const allCurrentPaths = new Set(await this.pagesService.listMarkdownFiles());
445
+ const pathsToRestore = new Set([...targetPagePaths, ...allCurrentPaths]);
446
+ for (const path of pathsToRestore) {
447
+ try {
448
+ pageResults.push(await this.restorePage({ path, releaseId }, actor));
449
+ }
450
+ catch (err) {
451
+ pageResults.push({
452
+ path,
453
+ op: 'noop',
454
+ warnings: [`restore failed: ${err.message}`],
455
+ });
456
+ }
457
+ }
458
+ return { releaseId, entityResults, pageResults };
459
+ }
460
+ // ─── Internals ───────────────────────────────────────────────────────────
461
+ findReleaseRow(idOrName) {
462
+ if (typeof idOrName === 'number') {
463
+ return this.db.prepare(`SELECT * FROM spec_release WHERE id = ?`).get(idOrName) ?? null;
464
+ }
465
+ const asNum = Number(idOrName);
466
+ if (!Number.isNaN(asNum) && /^\d+$/.test(idOrName)) {
467
+ const byId = this.db.prepare(`SELECT * FROM spec_release WHERE id = ?`).get(asNum);
468
+ if (byId)
469
+ return byId;
470
+ }
471
+ return this.db.prepare(`SELECT * FROM spec_release WHERE name = ?`).get(idOrName) ?? null;
472
+ }
473
+ toRelease(row) {
474
+ return {
475
+ id: row.id,
476
+ name: row.name,
477
+ description: row.description,
478
+ createdBy: row.created_by,
479
+ createdAt: row.created_at,
480
+ };
481
+ }
482
+ computeCountBreakdown(releaseId) {
483
+ const entityCounts = {};
484
+ let entityTotal = 0;
485
+ const rows = this.db
486
+ .prepare(`SELECT entity_type, COUNT(*) AS n FROM entity_version WHERE release_id = ? GROUP BY entity_type`)
487
+ .all(releaseId);
488
+ for (const r of rows) {
489
+ entityCounts[r.entity_type] = r.n;
490
+ entityTotal += r.n;
491
+ }
492
+ const pageRow = this.db
493
+ .prepare(`SELECT COUNT(*) AS n FROM page_version WHERE release_id = ? AND kind = 'page'`)
494
+ .get(releaseId);
495
+ return {
496
+ entities: entityCounts,
497
+ pages: pageRow.n,
498
+ total: entityTotal + pageRow.n,
499
+ };
500
+ }
501
+ /**
502
+ * Find the latest entity_version row matching a slug at-or-before
503
+ * `releaseId`. Slug lookup is index-by-data-slug since legacy rows may
504
+ * predate slug presence in `data`. Returns null if no row found.
505
+ */
506
+ latestEntityRowForSlug(type, slug, releaseId) {
507
+ // Resolve current entity id by slug (if entity still exists).
508
+ const currentId = this.host.resolveEntityId(type, slug);
509
+ if (currentId != null) {
510
+ const row = this.db
511
+ .prepare(`SELECT * FROM entity_version
512
+ WHERE entity_type = ? AND entity_id = ?
513
+ AND release_id IS NOT NULL AND release_id <= ?
514
+ ORDER BY version DESC LIMIT 1`)
515
+ .get(type, currentId, releaseId);
516
+ if (row)
517
+ return row;
518
+ }
519
+ // Entity no longer exists or never existed under this slug — scan rows
520
+ // in the target release range and match against snapshot data.slug.
521
+ const rows = this.db
522
+ .prepare(`SELECT * FROM entity_version
523
+ WHERE entity_type = ?
524
+ AND release_id IS NOT NULL AND release_id <= ?
525
+ ORDER BY entity_id, version DESC`)
526
+ .all(type, releaseId);
527
+ const seen = new Set();
528
+ for (const r of rows) {
529
+ if (seen.has(r.entity_id))
530
+ continue;
531
+ seen.add(r.entity_id);
532
+ const rowSlug = this.resolveSlug(type, r.entity_id, r.data);
533
+ if (rowSlug === slug)
534
+ return r;
535
+ }
536
+ return null;
537
+ }
538
+ /**
539
+ * For each entity_id seen in the release range, return the latest version
540
+ * row at-or-before `releaseId`. Rows where the underlying entity table has
541
+ * since been DELETEd appear as op='delete' tombstones (data carries the
542
+ * last snapshot before deletion).
543
+ */
544
+ latestEntityRowsAtOrBefore(type, releaseId) {
545
+ return this.db
546
+ .prepare(`SELECT ev1.* FROM entity_version ev1
547
+ WHERE ev1.entity_type = ?
548
+ AND ev1.release_id IS NOT NULL AND ev1.release_id <= ?
549
+ AND ev1.version = (
550
+ SELECT MAX(ev2.version) FROM entity_version ev2
551
+ WHERE ev2.entity_type = ev1.entity_type
552
+ AND ev2.entity_id = ev1.entity_id
553
+ AND ev2.release_id IS NOT NULL AND ev2.release_id <= ?
554
+ )
555
+ ORDER BY ev1.entity_id`)
556
+ .all(type, releaseId, releaseId);
557
+ }
558
+ latestPageRowsAtOrBefore(releaseId) {
559
+ return this.db
560
+ .prepare(`SELECT pv1.* FROM page_version pv1
561
+ WHERE pv1.kind = 'page'
562
+ AND pv1.release_id IS NOT NULL AND pv1.release_id <= ?
563
+ AND pv1.version = (
564
+ SELECT MAX(pv2.version) FROM page_version pv2
565
+ WHERE pv2.kind = 'page'
566
+ AND pv2.path = pv1.path
567
+ AND pv2.release_id IS NOT NULL AND pv2.release_id <= ?
568
+ )
569
+ ORDER BY pv1.path`)
570
+ .all(releaseId, releaseId);
571
+ }
572
+ /**
573
+ * Resolve a slug for an entity_version row. Snapshot data carries `slug`
574
+ * directly (post-M17 rows). For pre-M17 legacy rows, fall back to the
575
+ * underlying table — but the table may be deleted. Return null in that
576
+ * case (caller skips the entry).
577
+ */
578
+ resolveSlug(type, entityId, dataJson) {
579
+ try {
580
+ const parsed = JSON.parse(dataJson);
581
+ if (parsed && typeof parsed === 'object' && typeof parsed.slug === 'string') {
582
+ return parsed.slug;
583
+ }
584
+ }
585
+ catch {
586
+ /* fall through */
587
+ }
588
+ // Legacy fallback: read slug from the entity table directly.
589
+ const table = ENTITY_TABLES[type];
590
+ const row = this.db.prepare(`SELECT slug FROM ${table} WHERE id = ?`).get(entityId);
591
+ return row?.slug ?? null;
592
+ }
593
+ }
594
+ function safeJsonParse(raw) {
595
+ try {
596
+ return JSON.parse(raw);
597
+ }
598
+ catch {
599
+ return raw;
600
+ }
601
+ }
602
+ //# sourceMappingURL=release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.js","sourceRoot":"","sources":["../../../src/server/services/release.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { PagesService } from './pages.js';
3
+ import type { PagesWatcher } from '../fs/watcher.js';
4
+ import type { WsGateway } from '../ws/gateway.js';
5
+ export declare class SectionIndexerService {
6
+ private db;
7
+ private pages;
8
+ private watcher;
9
+ private ws;
10
+ private debounceMs;
11
+ private pending;
12
+ constructor(db: Database.Database, pages: PagesService, watcher: PagesWatcher, ws: WsGateway);
13
+ schedulePage(relPath: string): void;
14
+ handleUnlink(relPath: string): Promise<void>;
15
+ private removeSectionIndex;
16
+ indexAll(): Promise<void>;
17
+ indexPage(relPath: string): Promise<void>;
18
+ private resolveEntityId;
19
+ }
20
+ export declare function normalizeContent(content: string): string;