@inharness-ai/claude4spec 1.0.14 → 1.0.16

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 (353) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/bin/c4s/args.d.ts +2 -0
  3. package/dist/bin/c4s/args.js +3 -0
  4. package/dist/bin/c4s/args.js.map +1 -1
  5. package/dist/bin/c4s/commands/ask.js +2 -0
  6. package/dist/bin/c4s/commands/ask.js.map +1 -1
  7. package/dist/bin/c4s/commands/catalog.js +1 -1
  8. package/dist/bin/c4s/commands/catalog.js.map +1 -1
  9. package/dist/bin/c4s/commands/describe.d.ts +2 -0
  10. package/dist/bin/c4s/commands/describe.js +22 -0
  11. package/dist/bin/c4s/commands/describe.js.map +1 -0
  12. package/dist/bin/c4s/commands/find-references.d.ts +13 -0
  13. package/dist/bin/c4s/commands/find-references.js +81 -0
  14. package/dist/bin/c4s/commands/find-references.js.map +1 -0
  15. package/dist/bin/c4s/context.d.ts +4 -3
  16. package/dist/bin/c4s/context.js +17 -6
  17. package/dist/bin/c4s/context.js.map +1 -1
  18. package/dist/bin/c4s/errors.d.ts +1 -1
  19. package/dist/bin/c4s/errors.js.map +1 -1
  20. package/dist/bin/c4s/type-validation.d.ts +3 -0
  21. package/dist/bin/c4s/type-validation.js +14 -0
  22. package/dist/bin/c4s/type-validation.js.map +1 -1
  23. package/dist/bin/c4s-mcp.d.ts +1 -1
  24. package/dist/bin/c4s-mcp.js +23 -12
  25. package/dist/bin/c4s-mcp.js.map +1 -1
  26. package/dist/bin/c4s.js +20 -3
  27. package/dist/bin/c4s.js.map +1 -1
  28. package/dist/bin/claude4spec.js +122 -74
  29. package/dist/bin/claude4spec.js.map +1 -1
  30. package/dist/client/assets/{arc-E0e7X_zn.js → arc-DrA6qHTw.js} +1 -1
  31. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BzlqOVZv.js → architectureDiagram-3BPJPVTR-TEnwTtVX.js} +1 -1
  32. package/dist/client/assets/{blockDiagram-GPEHLZMM-BIQcApN7.js → blockDiagram-GPEHLZMM-txRnQm5w.js} +1 -1
  33. package/dist/client/assets/{c4Diagram-AAUBKEIU-CDU0V1yk.js → c4Diagram-AAUBKEIU-ad8X3Q8n.js} +1 -1
  34. package/dist/client/assets/channel-zmRfuI3H.js +1 -0
  35. package/dist/client/assets/{chunk-2J33WTMH-PtDSwC5f.js → chunk-2J33WTMH-Cp08Xa7f.js} +1 -1
  36. package/dist/client/assets/{chunk-4BX2VUAB-DTUPWrSO.js → chunk-4BX2VUAB-Dc_0On6j.js} +1 -1
  37. package/dist/client/assets/{chunk-55IACEB6-Cpd59xZT.js → chunk-55IACEB6-8d1qQ5z6.js} +1 -1
  38. package/dist/client/assets/{chunk-727SXJPM-C4DOvpJT.js → chunk-727SXJPM-TZenviWx.js} +1 -1
  39. package/dist/client/assets/{chunk-AQP2D5EJ-CtjeHPBB.js → chunk-AQP2D5EJ-DKRRWy-J.js} +1 -1
  40. package/dist/client/assets/{chunk-FMBD7UC4-CZA3OvVr.js → chunk-FMBD7UC4-DLEErJWK.js} +1 -1
  41. package/dist/client/assets/{chunk-ND2GUHAM-Cbx6nQHm.js → chunk-ND2GUHAM-pKGgwz_0.js} +1 -1
  42. package/dist/client/assets/{chunk-QZHKN3VN-3DunELI_.js → chunk-QZHKN3VN-DVcNz8ng.js} +1 -1
  43. package/dist/client/assets/classDiagram-4FO5ZUOK-B9RFgPu-.js +1 -0
  44. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B9RFgPu-.js +1 -0
  45. package/dist/client/assets/{cose-bilkent-S5V4N54A-CKYJnuL7.js → cose-bilkent-S5V4N54A-DZejbxEG.js} +1 -1
  46. package/dist/client/assets/{dagre-BM42HDAG-BrvRwrr_.js → dagre-BM42HDAG-DrPrkFcW.js} +1 -1
  47. package/dist/client/assets/{diagram-2AECGRRQ-BaVLuzcD.js → diagram-2AECGRRQ-Dpn8TJa2.js} +1 -1
  48. package/dist/client/assets/{diagram-5GNKFQAL-9Cu7Wa7J.js → diagram-5GNKFQAL-BxkzEc_t.js} +1 -1
  49. package/dist/client/assets/{diagram-KO2AKTUF-XKiCVdjO.js → diagram-KO2AKTUF-KG0o4LQ7.js} +1 -1
  50. package/dist/client/assets/{diagram-LMA3HP47-DerecU5v.js → diagram-LMA3HP47-CJ-AjQPt.js} +1 -1
  51. package/dist/client/assets/{diagram-OG6HWLK6-BWcREvZ9.js → diagram-OG6HWLK6-D_FG9cDJ.js} +1 -1
  52. package/dist/client/assets/{erDiagram-TEJ5UH35-DU3BBQJY.js → erDiagram-TEJ5UH35-DllhUlzY.js} +1 -1
  53. package/dist/client/assets/{flowDiagram-I6XJVG4X-DXO_IJeR.js → flowDiagram-I6XJVG4X-Bg3OotXu.js} +1 -1
  54. package/dist/client/assets/{ganttDiagram-6RSMTGT7-CXiFZEPx.js → ganttDiagram-6RSMTGT7-BUpUL2Cj.js} +1 -1
  55. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DHewdln-.js → gitGraphDiagram-PVQCEYII-DMRhyWth.js} +1 -1
  56. package/dist/client/assets/{index-DT5g2AtL.js → index-BB2RmhGR.js} +1 -1
  57. package/dist/client/assets/index-BXzOTCgN.css +1 -0
  58. package/dist/client/assets/index-DRFbyGvK.js +788 -0
  59. package/dist/client/assets/{index-DD0GkjkG.js → index-Daewu-VD.js} +1 -1
  60. package/dist/client/assets/{infoDiagram-5YYISTIA-CN40PAGW.js → infoDiagram-5YYISTIA-Bq9D64Ar.js} +1 -1
  61. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-B8KsyuPk.js → ishikawaDiagram-YF4QCWOH-DIaKHHF-.js} +1 -1
  62. package/dist/client/assets/{journeyDiagram-JHISSGLW-BlEb3E_P.js → journeyDiagram-JHISSGLW-gQWGLTeZ.js} +1 -1
  63. package/dist/client/assets/{kanban-definition-UN3LZRKU-B080CGS9.js → kanban-definition-UN3LZRKU-vRgZ5RjE.js} +1 -1
  64. package/dist/client/assets/{linear-D6Tg-IET.js → linear-B4a11szP.js} +1 -1
  65. package/dist/client/assets/{mermaid.core-DP18nW3T.js → mermaid.core-JhUbsJFB.js} +4 -4
  66. package/dist/client/assets/{mindmap-definition-RKZ34NQL-bfo7Qm5I.js → mindmap-definition-RKZ34NQL-ZH-Oz_D-.js} +1 -1
  67. package/dist/client/assets/{pieDiagram-4H26LBE5-ZsPztPu6.js → pieDiagram-4H26LBE5-6rpNrJR6.js} +1 -1
  68. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DKrTleIL.js → quadrantDiagram-W4KKPZXB-DpTKtxEM.js} +1 -1
  69. package/dist/client/assets/{requirementDiagram-4Y6WPE33-D4YX8ZgG.js → requirementDiagram-4Y6WPE33-DpDvZkrK.js} +1 -1
  70. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Bo-xm6Mc.js → sankeyDiagram-5OEKKPKP-KKjWCTYP.js} +1 -1
  71. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CozgdKp6.js → sequenceDiagram-3UESZ5HK-BCmXos1U.js} +1 -1
  72. package/dist/client/assets/{stateDiagram-AJRCARHV-CiK61MwV.js → stateDiagram-AJRCARHV-Xq7jqpMj.js} +1 -1
  73. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C3mDHsxD.js +1 -0
  74. package/dist/client/assets/{timeline-definition-PNZ67QCA-CgHoguI7.js → timeline-definition-PNZ67QCA-CMmq8p5q.js} +1 -1
  75. package/dist/client/assets/{vennDiagram-CIIHVFJN-TY32dxQb.js → vennDiagram-CIIHVFJN-DgK-w2Jv.js} +1 -1
  76. package/dist/client/assets/{wardley-L42UT6IY-C6Q7VFwH.js → wardley-L42UT6IY-C5CwlFHh.js} +1 -1
  77. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-nZLnVsQL.js → wardleyDiagram-YWT4CUSO-D47CtDSc.js} +1 -1
  78. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DHdYRHEr.js → xychartDiagram-2RQKCTM6-C1M_xTVv.js} +1 -1
  79. package/dist/client/index.html +2 -2
  80. package/dist/core/ask/run-ask.d.ts +3 -1
  81. package/dist/core/ask/run-ask.js +75 -54
  82. package/dist/core/ask/run-ask.js.map +1 -1
  83. package/dist/core/references/find-references.d.ts +13 -0
  84. package/dist/core/references/find-references.js +41 -0
  85. package/dist/core/references/find-references.js.map +1 -0
  86. package/dist/core/references/index.d.ts +2 -0
  87. package/dist/core/references/index.js +2 -0
  88. package/dist/core/references/index.js.map +1 -0
  89. package/dist/core/references/types.d.ts +45 -0
  90. package/dist/core/references/types.js +9 -0
  91. package/dist/core/references/types.js.map +1 -0
  92. package/dist/core/workspace/resolve.d.ts +29 -0
  93. package/dist/core/workspace/resolve.js +80 -0
  94. package/dist/core/workspace/resolve.js.map +1 -0
  95. package/dist/server/config.d.ts +58 -6
  96. package/dist/server/config.js +94 -19
  97. package/dist/server/config.js.map +1 -1
  98. package/dist/server/core/plugin-host/cli-engine.d.ts +8 -0
  99. package/dist/server/core/plugin-host/cli-engine.js +16 -0
  100. package/dist/server/core/plugin-host/cli-engine.js.map +1 -0
  101. package/dist/server/core/plugin-host/cross-cutting.js +1 -1
  102. package/dist/server/core/plugin-host/cross-cutting.js.map +1 -1
  103. package/dist/server/core/plugin-host/entities-router.d.ts +3 -1
  104. package/dist/server/core/plugin-host/entities-router.js +24 -19
  105. package/dist/server/core/plugin-host/entities-router.js.map +1 -1
  106. package/dist/server/core/plugin-host/host.js +4 -9
  107. package/dist/server/core/plugin-host/host.js.map +1 -1
  108. package/dist/server/core/plugin-host/project-host.d.ts +38 -0
  109. package/dist/server/core/plugin-host/project-host.js +118 -0
  110. package/dist/server/core/plugin-host/project-host.js.map +1 -0
  111. package/dist/server/core/plugin-host/registry.d.ts +14 -0
  112. package/dist/server/core/plugin-host/registry.js +26 -0
  113. package/dist/server/core/plugin-host/registry.js.map +1 -0
  114. package/dist/server/core/plugin-host/serialization-engine.d.ts +38 -8
  115. package/dist/server/core/plugin-host/serialization-engine.js +63 -39
  116. package/dist/server/core/plugin-host/serialization-engine.js.map +1 -1
  117. package/dist/server/core/plugin-host/types.d.ts +49 -27
  118. package/dist/server/db/index.d.ts +8 -1
  119. package/dist/server/db/index.js +12 -3
  120. package/dist/server/db/index.js.map +1 -1
  121. package/dist/server/db/migrations/035_m29_slug_identity.sql +248 -0
  122. package/dist/server/db/readonly.d.ts +8 -3
  123. package/dist/server/db/readonly.js +7 -4
  124. package/dist/server/db/readonly.js.map +1 -1
  125. package/dist/server/domain/raw-entity-reader.d.ts +5 -5
  126. package/dist/server/domain/raw-entity-reader.js +34 -39
  127. package/dist/server/domain/raw-entity-reader.js.map +1 -1
  128. package/dist/server/entities/ac/ac-analysis.service.d.ts +54 -0
  129. package/dist/server/entities/ac/ac-analysis.service.js +162 -0
  130. package/dist/server/entities/ac/ac-analysis.service.js.map +1 -0
  131. package/dist/server/entities/ac/mcp-server.d.ts +10 -2
  132. package/dist/server/entities/ac/mcp-server.js +34 -3
  133. package/dist/server/entities/ac/mcp-server.js.map +1 -1
  134. package/dist/server/entities/ac/plugin.d.ts +3 -1
  135. package/dist/server/entities/ac/plugin.js +9 -5
  136. package/dist/server/entities/ac/plugin.js.map +1 -1
  137. package/dist/server/entities/ac/serializer.js +1 -1
  138. package/dist/server/entities/ac/serializer.js.map +1 -1
  139. package/dist/server/entities/ac/services.d.ts +19 -7
  140. package/dist/server/entities/ac/services.js +65 -42
  141. package/dist/server/entities/ac/services.js.map +1 -1
  142. package/dist/server/entities/ac/system-prompt.js +1 -8
  143. package/dist/server/entities/ac/system-prompt.js.map +1 -1
  144. package/dist/server/entities/database-table/mcp-server.d.ts +2 -2
  145. package/dist/server/entities/database-table/mcp-server.js +5 -2
  146. package/dist/server/entities/database-table/mcp-server.js.map +1 -1
  147. package/dist/server/entities/database-table/plugin.d.ts +3 -1
  148. package/dist/server/entities/database-table/plugin.js +6 -5
  149. package/dist/server/entities/database-table/plugin.js.map +1 -1
  150. package/dist/server/entities/database-table/routes.d.ts +2 -2
  151. package/dist/server/entities/database-table/serializer.js +1 -1
  152. package/dist/server/entities/database-table/serializer.js.map +1 -1
  153. package/dist/server/entities/database-table/services.d.ts +19 -7
  154. package/dist/server/entities/database-table/services.js +77 -49
  155. package/dist/server/entities/database-table/services.js.map +1 -1
  156. package/dist/server/entities/database-table/system-prompt.js +1 -1
  157. package/dist/server/entities/database-table/system-prompt.js.map +1 -1
  158. package/dist/server/entities/dto/mcp-server.d.ts +2 -2
  159. package/dist/server/entities/dto/mcp-server.js +5 -2
  160. package/dist/server/entities/dto/mcp-server.js.map +1 -1
  161. package/dist/server/entities/dto/plugin.d.ts +3 -1
  162. package/dist/server/entities/dto/plugin.js +6 -5
  163. package/dist/server/entities/dto/plugin.js.map +1 -1
  164. package/dist/server/entities/dto/serializer.js +2 -2
  165. package/dist/server/entities/dto/serializer.js.map +1 -1
  166. package/dist/server/entities/dto/services.d.ts +19 -7
  167. package/dist/server/entities/dto/services.js +73 -49
  168. package/dist/server/entities/dto/services.js.map +1 -1
  169. package/dist/server/entities/dto/system-prompt.js +1 -1
  170. package/dist/server/entities/dto/system-prompt.js.map +1 -1
  171. package/dist/server/entities/endpoint/mcp-server.d.ts +2 -2
  172. package/dist/server/entities/endpoint/mcp-server.js +5 -2
  173. package/dist/server/entities/endpoint/mcp-server.js.map +1 -1
  174. package/dist/server/entities/endpoint/plugin.d.ts +3 -1
  175. package/dist/server/entities/endpoint/plugin.js +6 -5
  176. package/dist/server/entities/endpoint/plugin.js.map +1 -1
  177. package/dist/server/entities/endpoint/serializer.js +4 -4
  178. package/dist/server/entities/endpoint/serializer.js.map +1 -1
  179. package/dist/server/entities/endpoint/services.d.ts +21 -9
  180. package/dist/server/entities/endpoint/services.js +94 -65
  181. package/dist/server/entities/endpoint/services.js.map +1 -1
  182. package/dist/server/entities/endpoint/system-prompt.js +1 -1
  183. package/dist/server/entities/endpoint/system-prompt.js.map +1 -1
  184. package/dist/server/entities/mutate-opts.d.ts +15 -0
  185. package/dist/server/entities/mutate-opts.js +2 -0
  186. package/dist/server/entities/mutate-opts.js.map +1 -0
  187. package/dist/server/entities/ui-view/mcp-server.d.ts +2 -2
  188. package/dist/server/entities/ui-view/mcp-server.js +5 -2
  189. package/dist/server/entities/ui-view/mcp-server.js.map +1 -1
  190. package/dist/server/entities/ui-view/plugin.d.ts +3 -1
  191. package/dist/server/entities/ui-view/plugin.js +6 -5
  192. package/dist/server/entities/ui-view/plugin.js.map +1 -1
  193. package/dist/server/entities/ui-view/routes.d.ts +2 -2
  194. package/dist/server/entities/ui-view/serializer.js +1 -1
  195. package/dist/server/entities/ui-view/serializer.js.map +1 -1
  196. package/dist/server/entities/ui-view/services.d.ts +19 -7
  197. package/dist/server/entities/ui-view/services.js +68 -44
  198. package/dist/server/entities/ui-view/services.js.map +1 -1
  199. package/dist/server/entities/ui-view/system-prompt.d.ts +0 -5
  200. package/dist/server/entities/ui-view/system-prompt.js +3 -7
  201. package/dist/server/entities/ui-view/system-prompt.js.map +1 -1
  202. package/dist/server/external-skills/brief-implementer-template.d.ts +1 -1
  203. package/dist/server/external-skills/brief-implementer-template.js +1 -1
  204. package/dist/server/external-skills/spec-reader-template.d.ts +1 -1
  205. package/dist/server/external-skills/spec-reader-template.js +3 -2
  206. package/dist/server/external-skills/spec-reader-template.js.map +1 -1
  207. package/dist/server/fs/entities-watcher.d.ts +31 -0
  208. package/dist/server/fs/entities-watcher.js +68 -0
  209. package/dist/server/fs/entities-watcher.js.map +1 -0
  210. package/dist/server/fs/watcher.d.ts +2 -2
  211. package/dist/server/fs/watcher.js +7 -1
  212. package/dist/server/fs/watcher.js.map +1 -1
  213. package/dist/server/index.d.ts +11 -1
  214. package/dist/server/index.js +134 -639
  215. package/dist/server/index.js.map +1 -1
  216. package/dist/server/mcp/c4s-reader.d.ts +2 -2
  217. package/dist/server/mcp/c4s-reader.js +41 -4
  218. package/dist/server/mcp/c4s-reader.js.map +1 -1
  219. package/dist/server/mcp/c4s-tools.js +2 -0
  220. package/dist/server/mcp/c4s-tools.js.map +1 -1
  221. package/dist/server/mcp/ensure-mcp-json.d.ts +9 -2
  222. package/dist/server/mcp/ensure-mcp-json.js +18 -4
  223. package/dist/server/mcp/ensure-mcp-json.js.map +1 -1
  224. package/dist/server/mcp/reference-tools.d.ts +8 -2
  225. package/dist/server/mcp/reference-tools.js +52 -179
  226. package/dist/server/mcp/reference-tools.js.map +1 -1
  227. package/dist/server/mcp/release-tools/index.d.ts +2 -2
  228. package/dist/server/routes/agent-turn.d.ts +41 -7
  229. package/dist/server/routes/agent-turn.js +84 -20
  230. package/dist/server/routes/agent-turn.js.map +1 -1
  231. package/dist/server/routes/chat.js +47 -15
  232. package/dist/server/routes/chat.js.map +1 -1
  233. package/dist/server/routes/config.d.ts +24 -0
  234. package/dist/server/routes/config.js +231 -0
  235. package/dist/server/routes/config.js.map +1 -0
  236. package/dist/server/routes/references.d.ts +2 -1
  237. package/dist/server/routes/references.js +4 -5
  238. package/dist/server/routes/references.js.map +1 -1
  239. package/dist/server/routes/releases.d.ts +2 -2
  240. package/dist/server/routes/static.d.ts +11 -0
  241. package/dist/server/routes/static.js +44 -0
  242. package/dist/server/routes/static.js.map +1 -0
  243. package/dist/server/routes/threads.js +14 -2
  244. package/dist/server/routes/threads.js.map +1 -1
  245. package/dist/server/serialization/auto-schema.d.ts +2 -1
  246. package/dist/server/serialization/auto-schema.js +5 -6
  247. package/dist/server/serialization/auto-schema.js.map +1 -1
  248. package/dist/server/serialization/registerAll.d.ts +7 -6
  249. package/dist/server/serialization/registerAll.js +17 -6
  250. package/dist/server/serialization/registerAll.js.map +1 -1
  251. package/dist/server/serialization/resolve-page.d.ts +2 -2
  252. package/dist/server/serialization/serializers/section.d.ts +6 -1
  253. package/dist/server/serialization/serializers/section.js +6 -3
  254. package/dist/server/serialization/serializers/section.js.map +1 -1
  255. package/dist/server/services/brief.d.ts +2 -2
  256. package/dist/server/services/chat-context.d.ts +24 -0
  257. package/dist/server/services/chat-context.js +70 -13
  258. package/dist/server/services/chat-context.js.map +1 -1
  259. package/dist/server/services/entity-indexer.d.ts +42 -0
  260. package/dist/server/services/entity-indexer.js +179 -0
  261. package/dist/server/services/entity-indexer.js.map +1 -0
  262. package/dist/server/services/entity-store.d.ts +68 -0
  263. package/dist/server/services/entity-store.js +162 -0
  264. package/dist/server/services/entity-store.js.map +1 -0
  265. package/dist/server/services/entity-writer.d.ts +12 -1
  266. package/dist/server/services/entity-writer.js +22 -11
  267. package/dist/server/services/entity-writer.js.map +1 -1
  268. package/dist/server/services/git.js +6 -1
  269. package/dist/server/services/git.js.map +1 -1
  270. package/dist/server/services/pages-frontmatter-indexer.d.ts +2 -2
  271. package/dist/server/services/pages-link-indexer.d.ts +2 -2
  272. package/dist/server/services/pages.d.ts +2 -0
  273. package/dist/server/services/pages.js +24 -9
  274. package/dist/server/services/pages.js.map +1 -1
  275. package/dist/server/services/plan.d.ts +2 -2
  276. package/dist/server/services/references.d.ts +25 -0
  277. package/dist/server/services/references.js +102 -21
  278. package/dist/server/services/references.js.map +1 -1
  279. package/dist/server/services/release-bundle.d.ts +0 -1
  280. package/dist/server/services/release-bundle.js +0 -1
  281. package/dist/server/services/release-bundle.js.map +1 -1
  282. package/dist/server/services/release-import.d.ts +2 -0
  283. package/dist/server/services/release-import.js +6 -4
  284. package/dist/server/services/release-import.js.map +1 -1
  285. package/dist/server/services/release.d.ts +10 -10
  286. package/dist/server/services/release.js +32 -63
  287. package/dist/server/services/release.js.map +1 -1
  288. package/dist/server/services/section-indexer.d.ts +4 -3
  289. package/dist/server/services/section-indexer.js +8 -9
  290. package/dist/server/services/section-indexer.js.map +1 -1
  291. package/dist/server/services/skill-registry.d.ts +28 -1
  292. package/dist/server/services/skill-registry.js +51 -10
  293. package/dist/server/services/skill-registry.js.map +1 -1
  294. package/dist/server/services/slug.js +6 -0
  295. package/dist/server/services/slug.js.map +1 -1
  296. package/dist/server/services/static-html.d.ts +24 -0
  297. package/dist/server/services/static-html.js +49 -0
  298. package/dist/server/services/static-html.js.map +1 -0
  299. package/dist/server/services/tags.d.ts +13 -3
  300. package/dist/server/services/tags.js +65 -26
  301. package/dist/server/services/tags.js.map +1 -1
  302. package/dist/server/services/todos-indexer.d.ts +2 -2
  303. package/dist/server/services/versions.d.ts +7 -7
  304. package/dist/server/services/versions.js +34 -37
  305. package/dist/server/services/versions.js.map +1 -1
  306. package/dist/server/workspace/bootstrap.d.ts +42 -0
  307. package/dist/server/workspace/bootstrap.js +73 -0
  308. package/dist/server/workspace/bootstrap.js.map +1 -0
  309. package/dist/server/workspace/context-cache.d.ts +48 -0
  310. package/dist/server/workspace/context-cache.js +147 -0
  311. package/dist/server/workspace/context-cache.js.map +1 -0
  312. package/dist/server/workspace/db-migration.d.ts +11 -0
  313. package/dist/server/workspace/db-migration.js +44 -0
  314. package/dist/server/workspace/db-migration.js.map +1 -0
  315. package/dist/server/workspace/middleware.d.ts +15 -0
  316. package/dist/server/workspace/middleware.js +36 -0
  317. package/dist/server/workspace/middleware.js.map +1 -0
  318. package/dist/server/workspace/project-context.d.ts +65 -0
  319. package/dist/server/workspace/project-context.js +655 -0
  320. package/dist/server/workspace/project-context.js.map +1 -0
  321. package/dist/server/workspace/project-id.d.ts +7 -0
  322. package/dist/server/workspace/project-id.js +11 -0
  323. package/dist/server/workspace/project-id.js.map +1 -0
  324. package/dist/server/workspace/registry.d.ts +58 -0
  325. package/dist/server/workspace/registry.js +264 -0
  326. package/dist/server/workspace/registry.js.map +1 -0
  327. package/dist/server/workspace/routes.d.ts +21 -0
  328. package/dist/server/workspace/routes.js +181 -0
  329. package/dist/server/workspace/routes.js.map +1 -0
  330. package/dist/server/workspace/types.d.ts +30 -0
  331. package/dist/server/workspace/types.js +6 -0
  332. package/dist/server/workspace/types.js.map +1 -0
  333. package/dist/server/ws/gateway.d.ts +12 -2
  334. package/dist/server/ws/gateway.js +51 -9
  335. package/dist/server/ws/gateway.js.map +1 -1
  336. package/dist/server/ws/project-emitter.d.ts +17 -0
  337. package/dist/server/ws/project-emitter.js +12 -0
  338. package/dist/server/ws/project-emitter.js.map +1 -0
  339. package/dist/shared/entities.d.ts +2 -2
  340. package/dist/shared/languages.d.ts +17 -0
  341. package/dist/shared/languages.js +31 -0
  342. package/dist/shared/languages.js.map +1 -0
  343. package/dist/shared/types.d.ts +11 -0
  344. package/dist/shared/xml-tags.d.ts +8 -0
  345. package/dist/shared/xml-tags.js +24 -0
  346. package/dist/shared/xml-tags.js.map +1 -1
  347. package/package.json +10 -3
  348. package/dist/client/assets/channel-BqjILLUr.js +0 -1
  349. package/dist/client/assets/classDiagram-4FO5ZUOK-LjT84-kK.js +0 -1
  350. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-LjT84-kK.js +0 -1
  351. package/dist/client/assets/index-BTXWIk4x.css +0 -1
  352. package/dist/client/assets/index-DcIG_8JB.js +0 -760
  353. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C6-8M5Sb.js +0 -1
@@ -1,20 +1,21 @@
1
1
  import type Database from 'better-sqlite3';
2
2
  import type { PagesService } from './pages.js';
3
3
  import type { PagesWatcher } from '../fs/watcher.js';
4
- import type { WsGateway } from '../ws/gateway.js';
4
+ import type { WsEmitter } from '../ws/project-emitter.js';
5
+ import type { ProjectPluginHost } from '../core/plugin-host/types.js';
5
6
  export declare class SectionIndexerService {
6
7
  private db;
7
8
  private pages;
8
9
  private watcher;
9
10
  private ws;
11
+ private host;
10
12
  private debounceMs;
11
13
  private pending;
12
- constructor(db: Database.Database, pages: PagesService, watcher: PagesWatcher, ws: WsGateway);
14
+ constructor(db: Database.Database, pages: PagesService, watcher: PagesWatcher, ws: WsEmitter, host: ProjectPluginHost);
13
15
  schedulePage(relPath: string): void;
14
16
  handleUnlink(relPath: string): Promise<void>;
15
17
  private removeSectionIndex;
16
18
  indexAll(): Promise<void>;
17
19
  indexPage(relPath: string): Promise<void>;
18
- private resolveEntityId;
19
20
  }
20
21
  export declare function normalizeContent(content: string): string;
@@ -2,7 +2,6 @@ import crypto from 'node:crypto';
2
2
  import { customAlphabet } from 'nanoid';
3
3
  import { parseXmlTagsExcludingCode } from '../../shared/xml-tags.js';
4
4
  import { ANCHOR_PATTERN_SOURCE } from '../../shared/anchor-pattern.js';
5
- import { pluginHost } from '../core/plugin-host/host.js';
6
5
  // Generator stays strict 8 (per M06 spec `15u7sazr` — auto-inject contract).
7
6
  const nanoid8 = customAlphabet('abcdefghijklmnopqrstuvwxyz0123456789', 8);
8
7
  const ANCHOR_RE = new RegExp(ANCHOR_PATTERN_SOURCE);
@@ -12,13 +11,15 @@ export class SectionIndexerService {
12
11
  pages;
13
12
  watcher;
14
13
  ws;
14
+ host;
15
15
  debounceMs = 300;
16
16
  pending = new Map();
17
- constructor(db, pages, watcher, ws) {
17
+ constructor(db, pages, watcher, ws, host) {
18
18
  this.db = db;
19
19
  this.pages = pages;
20
20
  this.watcher = watcher;
21
21
  this.ws = ws;
22
+ this.host = host;
22
23
  }
23
24
  schedulePage(relPath) {
24
25
  const prev = this.pending.get(relPath);
@@ -128,7 +129,7 @@ export class SectionIndexerService {
128
129
  this.db
129
130
  .prepare(`DELETE FROM section_entity_link WHERE anchor IN (${placeholders})`)
130
131
  .run(...anchorsInFile);
131
- const linkStmt = this.db.prepare(`INSERT OR IGNORE INTO section_entity_link (anchor, entity_type, entity_id, relation)
132
+ const linkStmt = this.db.prepare(`INSERT OR IGNORE INTO section_entity_link (anchor, entity_type, entity_slug, relation)
132
133
  VALUES (?, ?, ?, 'uses')`);
133
134
  for (const s of sections) {
134
135
  const xmlTags = parseXmlTagsExcludingCode(s.content);
@@ -143,9 +144,10 @@ export class SectionIndexerService {
143
144
  if (seen.has(key))
144
145
  continue;
145
146
  seen.add(key);
146
- const entityId = this.resolveEntityId(type, slug);
147
- if (entityId != null)
148
- linkStmt.run(s.anchor, type, entityId);
147
+ // M29: link by slug (sole identity); only persist for entities
148
+ // that actually exist, mirroring the prior id-resolver guard.
149
+ if (this.host.entityExists(type, slug))
150
+ linkStmt.run(s.anchor, type, slug);
149
151
  }
150
152
  }
151
153
  }
@@ -158,9 +160,6 @@ export class SectionIndexerService {
158
160
  anchors: sections.map((s) => s.anchor),
159
161
  });
160
162
  }
161
- resolveEntityId(type, slug) {
162
- return pluginHost.resolveEntityId(type, slug);
163
- }
164
163
  }
165
164
  function parseHeadings(lines) {
166
165
  const out = [];
@@ -1 +1 @@
1
- {"version":3,"file":"section-indexer.js","sourceRoot":"","sources":["../../../src/server/services/section-indexer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"section-indexer.js","sourceRoot":"","sources":["../../../src/server/services/section-indexer.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAgB,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAMvE,6EAA6E;AAC7E,MAAM,OAAO,GAAG,cAAc,CAAC,sCAAsC,EAAE,CAAC,CAAC,CAAC;AAE1E,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,CAAC;AACpD,MAAM,UAAU,GAAG,uBAAuB,CAAC;AAsB3C,MAAM,OAAO,qBAAqB;IAKtB;IACA;IACA;IACA;IACA;IARF,UAAU,GAAG,GAAG,CAAC;IACjB,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEpD,YACU,EAAqB,EACrB,KAAmB,EACnB,OAAqB,EACrB,EAAa,EACb,IAAuB;QAJvB,OAAE,GAAF,EAAE,CAAmB;QACrB,UAAK,GAAL,KAAK,CAAc;QACnB,YAAO,GAAP,OAAO,CAAc;QACrB,OAAE,GAAF,EAAE,CAAW;QACb,SAAI,GAAJ,IAAI,CAAmB;IAC9B,CAAC;IAEJ,YAAY,CAAC,OAAe;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,IAAI;YAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACpC,OAAO,CAAC,KAAK,CAAC,qCAAqC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,IAAI,EAAE,CAAC;YACT,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE;aACrB,OAAO,CAAC,sDAAsD,CAAC;aAC/D,GAAG,CAAC,OAAO,CAA8B,CAAC;QAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClC,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QACH,EAAE,EAAE,CAAC;IACP,CAAC;IAEO,kBAAkB,CAAC,MAAc;QACvC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;QACnD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe;QAC7B,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAErB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBACtB,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC;gBAC5B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,gBAAgB,SAAS,MAAM,CAAC,CAAC;gBAC9D,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC5C,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;gBACrB,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;gBACpC,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE;aACtB,OAAO,CACN,oEAAoE,CACrE;aACA,GAAG,CAAC,OAAO,CAAoD,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,YAAY,CAAU,CAAC,CAAC,CAAC;QACjF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE9D,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClC,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAChC;;;;;;;;;;;;;;;yCAeiC,CAClC,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,UAAU,CAAC,GAAG,CACZ,CAAC,CAAC,MAAM,EACR,OAAO,EACP,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,OAAO,CAAC,KAAK,EACf,CAAC,CAAC,OAAO,CAAC,IAAI,EACd,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,cAAc,CACjB,CAAC;YACJ,CAAC;YAED,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;gBAC1B,KAAK,MAAM,MAAM,IAAI,cAAc;oBAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC5D,IAAI,CAAC,EAAE;qBACJ,OAAO,CAAC,oDAAoD,YAAY,GAAG,CAAC;qBAC5E,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;gBAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC9B;wCAC8B,CAC/B,CAAC;gBACF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;oBAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;wBAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;wBAC5B,IAAI,CAAC,IAAI;4BAAE,SAAS;wBACpB,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;wBACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;4BACzB,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;4BAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gCAAE,SAAS;4BAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BACd,+DAA+D;4BAC/D,8DAA8D;4BAC9D,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;gCAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;wBAC7E,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,EAAE,EAAE,CAAC;QAEL,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;YAChB,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,aAAa,CAAC,KAAe;IACpC,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAClC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,eAAe,GAAkB,IAAI,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,KAAK,KAAK,EAAE;gBAAE,SAAS;YAC3B,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBACvB,eAAe,GAAG,CAAC,CAAC;YACtB,CAAC;YACD,MAAM;QACR,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAyB,EAAE,SAAiB,EAAE,KAAa;IACpF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,SAAS,IAAI,SAAS;YAAE,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC;QACnD,IAAI,CAAC,CAAC,eAAe,KAAK,IAAI,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,EAAE,CAAC;YACjE,CAAC,CAAC,eAAe,IAAI,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAe,EAAE,QAAyB;IAC/D,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAE,CAAC;QACzB,IAAI,CAAC,CAAC,CAAC,MAAM;YAAE,SAAS;QACxB,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;YAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QAC9E,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEd,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBAClC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,eAAe,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC;gBACjE,MAAM;YACR,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;QAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjF,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO,EAAE,CAAC;YACV,WAAW;YACX,WAAW;YACX,SAAS,EAAE,SAAS,GAAG,CAAC;YACxB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,OAAO;YAChB,WAAW;YACX,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,IAAI,EAAE;SACN,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,OAAO;SACX,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC;SAChD,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;SAC/B,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;SACzB,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;SAC3B,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC;SACvC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,WAAW,EAAE;SACb,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,SAAS,mBAAmB,CAAC,GAA4C;IACvE,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACnE,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;aAC3B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import type { InlineSkill } from '@inharness-ai/agent-adapters';
2
2
  export type SkillScope = 'writing-style' | 'contextual';
3
+ /** Where a skill was discovered: in-package bundle vs a user `.claude/skills` root. */
4
+ export type SkillSource = 'bundled' | 'user';
3
5
  export interface SkillMetadata {
4
6
  slug: string;
5
7
  title: string;
@@ -7,8 +9,18 @@ export interface SkillMetadata {
7
9
  version: number;
8
10
  language: 'en' | 'pl';
9
11
  scope: SkillScope;
12
+ source: SkillSource;
10
13
  path: string;
11
14
  }
15
+ /**
16
+ * A root scanned by {@link SkillRegistry.load}. Roots are scanned in array order
17
+ * (highest precedence first); on a slug collision the first root wins, so callers
18
+ * pass project before global before bundled. See {@link findSkillsRoots}.
19
+ */
20
+ export interface SkillRoot {
21
+ dir: string;
22
+ source: SkillSource;
23
+ }
12
24
  export interface ResolvedSkill {
13
25
  metadata: SkillMetadata;
14
26
  content: string;
@@ -16,7 +28,16 @@ export interface ResolvedSkill {
16
28
  }
17
29
  export declare class SkillRegistry {
18
30
  private metadataBySlug;
19
- static load(skillsDir: string): SkillRegistry;
31
+ /**
32
+ * Scan one or more roots once at startup and merge them, deduplicated per slug
33
+ * by precedence: roots earlier in the array win (project > global > bundled).
34
+ * A missing or unreadable root is treated as empty — no throw. A malformed
35
+ * `SKILL.md` is skipped with a warning. Skills declaring `scope: contextual`
36
+ * found in a `source: 'user'` root are ignored entirely (contextual skills are
37
+ * package-only); bundled contextual skills are kept.
38
+ */
39
+ static load(roots: SkillRoot[]): SkillRegistry;
40
+ private scanRoot;
20
41
  list(): SkillMetadata[];
21
42
  listSelectable(): SkillMetadata[];
22
43
  has(slug: string): boolean;
@@ -36,3 +57,9 @@ export declare class SkillResolver {
36
57
  resolve(): InlineSkill[];
37
58
  }
38
59
  export declare function findSkillsDir(): string;
60
+ /**
61
+ * Roots to scan for selectable writing styles, highest precedence first:
62
+ * project `<cwd>/.claude/skills` > global `~/.claude/skills` > in-package bundle.
63
+ * Project/global are user-authored (`source: 'user'`); the bundle is `'bundled'`.
64
+ */
65
+ export declare function findSkillsRoots(cwd: string): SkillRoot[];
@@ -1,4 +1,5 @@
1
1
  import fs from 'node:fs';
2
+ import os from 'node:os';
2
3
  import path from 'node:path';
3
4
  import { fileURLToPath } from 'node:url';
4
5
  import matter from 'gray-matter';
@@ -7,16 +8,39 @@ const SUPPORTED_VERSION = 1;
7
8
  const FILES_SUBDIRS = ['templates', 'examples', 'workflows'];
8
9
  export class SkillRegistry {
9
10
  metadataBySlug = new Map();
10
- static load(skillsDir) {
11
+ /**
12
+ * Scan one or more roots once at startup and merge them, deduplicated per slug
13
+ * by precedence: roots earlier in the array win (project > global > bundled).
14
+ * A missing or unreadable root is treated as empty — no throw. A malformed
15
+ * `SKILL.md` is skipped with a warning. Skills declaring `scope: contextual`
16
+ * found in a `source: 'user'` root are ignored entirely (contextual skills are
17
+ * package-only); bundled contextual skills are kept.
18
+ */
19
+ static load(roots) {
11
20
  const registry = new SkillRegistry();
12
- if (!fs.existsSync(skillsDir))
13
- return registry;
14
- const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
21
+ for (const root of roots)
22
+ registry.scanRoot(root);
23
+ return registry;
24
+ }
25
+ scanRoot(root) {
26
+ let entries;
27
+ try {
28
+ if (!fs.existsSync(root.dir))
29
+ return;
30
+ entries = fs.readdirSync(root.dir, { withFileTypes: true });
31
+ }
32
+ catch (err) {
33
+ console.warn(`[skill] root "${root.dir}" unreadable: ${err.message}, treating as empty`);
34
+ return;
35
+ }
15
36
  for (const entry of entries) {
16
37
  if (!entry.isDirectory())
17
38
  continue;
18
39
  const slug = entry.name;
19
- const skillDir = path.join(skillsDir, slug);
40
+ // Higher-precedence root already claimed this slug.
41
+ if (this.metadataBySlug.has(slug))
42
+ continue;
43
+ const skillDir = path.join(root.dir, slug);
20
44
  const skillFile = path.join(skillDir, 'SKILL.md');
21
45
  if (!fs.existsSync(skillFile)) {
22
46
  console.warn(`[skill] ${slug}: missing SKILL.md, skipping`);
@@ -25,18 +49,23 @@ export class SkillRegistry {
25
49
  try {
26
50
  const raw = fs.readFileSync(skillFile, 'utf8');
27
51
  const { data } = matter(raw);
28
- const metadata = parseFrontmatter(slug, skillDir, data);
52
+ const metadata = parseFrontmatter(slug, skillDir, root.source, data);
29
53
  if (metadata.version > SUPPORTED_VERSION) {
30
54
  console.warn(`[skill] ${slug}: version ${metadata.version} > supported ${SUPPORTED_VERSION}, skipping`);
31
55
  continue;
32
56
  }
33
- registry.metadataBySlug.set(slug, metadata);
57
+ // Contextual skills are package-only: ignore them entirely when dropped
58
+ // into a user root (not selectable, not used for contextual resolution).
59
+ if (metadata.scope === 'contextual' && root.source === 'user') {
60
+ console.warn(`[skill] ${slug}: scope "contextual" in user root, ignored (package-only)`);
61
+ continue;
62
+ }
63
+ this.metadataBySlug.set(slug, metadata);
34
64
  }
35
65
  catch (err) {
36
66
  console.warn(`[skill] ${slug}: ${err.message}, skipping`);
37
67
  }
38
68
  }
39
- return registry;
40
69
  }
41
70
  list() {
42
71
  return Array.from(this.metadataBySlug.values());
@@ -108,7 +137,19 @@ export function findSkillsDir() {
108
137
  const here = path.dirname(fileURLToPath(import.meta.url));
109
138
  return path.resolve(here, '..', 'skills');
110
139
  }
111
- function parseFrontmatter(slug, skillPath, data) {
140
+ /**
141
+ * Roots to scan for selectable writing styles, highest precedence first:
142
+ * project `<cwd>/.claude/skills` > global `~/.claude/skills` > in-package bundle.
143
+ * Project/global are user-authored (`source: 'user'`); the bundle is `'bundled'`.
144
+ */
145
+ export function findSkillsRoots(cwd) {
146
+ return [
147
+ { dir: path.join(cwd, '.claude', 'skills'), source: 'user' },
148
+ { dir: path.join(os.homedir(), '.claude', 'skills'), source: 'user' },
149
+ { dir: findSkillsDir(), source: 'bundled' },
150
+ ];
151
+ }
152
+ function parseFrontmatter(slug, skillPath, source, data) {
112
153
  const title = data.title;
113
154
  const description = data.description;
114
155
  const version = data.version;
@@ -124,7 +165,7 @@ function parseFrontmatter(slug, skillPath, data) {
124
165
  throw new Error("frontmatter 'language' must be 'en' or 'pl'");
125
166
  if (scopeRaw !== 'writing-style' && scopeRaw !== 'contextual')
126
167
  throw new Error("frontmatter 'scope' must be 'writing-style' or 'contextual'");
127
- return { slug, title, description, version, language, scope: scopeRaw, path: skillPath };
168
+ return { slug, title, description, version, language, scope: scopeRaw, source, path: skillPath };
128
169
  }
129
170
  function loadSkillFiles(skillDir) {
130
171
  const out = {};
@@ -1 +1 @@
1
- {"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../../src/server/services/skill-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../../src/server/services/skill-registry.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,12 @@
1
1
  export function slugify(input) {
2
2
  return input
3
3
  .toLowerCase()
4
+ // ł nie ma dekompozycji NFD — mapujemy jawnie przed normalizacją.
5
+ .replace(/ł/g, 'l')
6
+ // Transliteracja diakrytyków: NFD + usunięcie znaków łączących
7
+ // (ó→o, ż→z, ź→z, ę→e, ą→a, ś→s, ć→c, ń→n).
8
+ .normalize('NFD')
9
+ .replace(/[̀-ͯ]/g, '')
4
10
  .replace(/[^a-z0-9]+/g, '-')
5
11
  .replace(/^-+|-+$/g, '');
6
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"slug.js","sourceRoot":"","sources":["../../../src/server/services/slug.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAY;IACvD,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IACxD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,cAAc,GAAG,IAAI;SACxB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,cAAc,GAAG,IAAI;SACxB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,cAAc,GAAG,IAAI;SACxB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,4EAA4E;IAC5E,sDAAsD;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"slug.js","sourceRoot":"","sources":["../../../src/server/services/slug.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,WAAW,EAAE;QACd,kEAAkE;SACjE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;QACnB,+DAA+D;QAC/D,4CAA4C;SAC3C,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAY;IACvD,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IACxD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,cAAc,GAAG,IAAI;SACxB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,cAAc,GAAG,IAAI;SACxB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,cAAc,GAAG,IAAI;SACxB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,4EAA4E;IAC5E,sDAAsD;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * M30 (L2): static file server rooted at `pagesDir`, backing `GET /api/static/*`.
3
+ *
4
+ * Used as the iframe `src` for the read-only HTML preview. Deliberately a separate
5
+ * slice from `PagesService`: it copies the `resolveSafe` *pattern* from `pages.ts`
6
+ * rather than sharing a helper, and applies NO extension whitelist (any file under
7
+ * `pagesDir` is servable so relative assets — `./style.css`, `img/x.png` — resolve).
8
+ */
9
+ /** Thrown when a requested path escapes `pagesDir` (`../`, absolute, null byte). Maps to HTTP 403. */
10
+ export declare class StaticPathTraversalError extends Error {
11
+ constructor(relPath: string);
12
+ }
13
+ export declare class StaticHtmlService {
14
+ readonly root: string;
15
+ constructor(cwd: string, pagesDir?: string);
16
+ /**
17
+ * Resolve a request path (relative to `pagesDir`) to an absolute path, guarding
18
+ * against traversal. No extension check. Throws {@link StaticPathTraversalError}
19
+ * if the path would escape the root.
20
+ */
21
+ resolveSafe(relPath: string): string;
22
+ /** True if the resolved (in-root) path exists and is a regular file. */
23
+ existsFile(abs: string): Promise<boolean>;
24
+ }
@@ -0,0 +1,49 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ /**
4
+ * M30 (L2): static file server rooted at `pagesDir`, backing `GET /api/static/*`.
5
+ *
6
+ * Used as the iframe `src` for the read-only HTML preview. Deliberately a separate
7
+ * slice from `PagesService`: it copies the `resolveSafe` *pattern* from `pages.ts`
8
+ * rather than sharing a helper, and applies NO extension whitelist (any file under
9
+ * `pagesDir` is servable so relative assets — `./style.css`, `img/x.png` — resolve).
10
+ */
11
+ /** Thrown when a requested path escapes `pagesDir` (`../`, absolute, null byte). Maps to HTTP 403. */
12
+ export class StaticPathTraversalError extends Error {
13
+ constructor(relPath) {
14
+ super(`path escapes pages root: ${relPath}`);
15
+ this.name = 'StaticPathTraversalError';
16
+ }
17
+ }
18
+ export class StaticHtmlService {
19
+ root;
20
+ constructor(cwd, pagesDir = 'pages') {
21
+ this.root = path.join(cwd, pagesDir);
22
+ }
23
+ /**
24
+ * Resolve a request path (relative to `pagesDir`) to an absolute path, guarding
25
+ * against traversal. No extension check. Throws {@link StaticPathTraversalError}
26
+ * if the path would escape the root.
27
+ */
28
+ resolveSafe(relPath) {
29
+ if (!relPath || relPath.includes('\0'))
30
+ throw new StaticPathTraversalError(relPath);
31
+ const abs = path.resolve(this.root, relPath);
32
+ const rel = path.relative(this.root, abs);
33
+ if (rel.startsWith('..') || path.isAbsolute(rel)) {
34
+ throw new StaticPathTraversalError(relPath);
35
+ }
36
+ return abs;
37
+ }
38
+ /** True if the resolved (in-root) path exists and is a regular file. */
39
+ async existsFile(abs) {
40
+ try {
41
+ const stat = await fs.stat(abs);
42
+ return stat.isFile();
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ }
49
+ //# sourceMappingURL=static-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-html.js","sourceRoot":"","sources":["../../../src/server/services/static-html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;GAOG;AAEH,sGAAsG;AACtG,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,iBAAiB;IACnB,IAAI,CAAS;IAEtB,YAAY,GAAW,EAAE,WAAmB,OAAO;QACjD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,OAAe;QACzB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACpF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1C,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -1,12 +1,22 @@
1
1
  import type Database from 'better-sqlite3';
2
2
  import type { EntityType, Tag, TagCreateInput, TagUpdateInput } from '../../shared/entities.js';
3
+ import type { EntityStore } from './entity-store.js';
3
4
  export declare class TagsService {
4
5
  private db;
5
6
  constructor(db: Database.Database);
7
+ /**
8
+ * M29: tags.json is the registry source of truth. Wired post-construction
9
+ * (the store is built later in boot). When present, every tag mutation
10
+ * re-writes tags.json; a tag rename also re-persists the entity files whose
11
+ * `tags[]` the FK cascade just moved. Null during early boot / index rebuild.
12
+ */
13
+ private store;
14
+ setEntityStore(store: EntityStore): void;
6
15
  list(): Tag[];
7
16
  getBySlug(slug: string): Tag | null;
8
- getIdBySlug(slug: string): number | null;
9
17
  create(input: TagCreateInput): Tag;
18
+ /** M29: re-persist the entity files whose `tags[]` changed due to a tag mutation. */
19
+ private persistEntitiesWithTag;
10
20
  /** Idempotent: returns existing tag if already present. */
11
21
  ensure(name: string): Tag;
12
22
  update(slug: string, input: TagUpdateInput): Tag;
@@ -15,8 +25,8 @@ export declare class TagsService {
15
25
  affectedEntities: number;
16
26
  };
17
27
  /** Sets the tag set of an entity to exactly `tagNames` (auto-creating missing tags). */
18
- assignTags(entityType: EntityType, entityId: number, tagNames: string[]): string[];
19
- getEntityTagSlugs(entityType: EntityType, entityId: number): string[];
28
+ assignTags(entityType: EntityType, entitySlug: string, tagNames: string[]): string[];
29
+ getEntityTagSlugs(entityType: EntityType, entitySlug: string): string[];
20
30
  private countsByTagSlug;
21
31
  private pickColor;
22
32
  private toTag;
@@ -8,6 +8,16 @@ export class TagsService {
8
8
  constructor(db) {
9
9
  this.db = db;
10
10
  }
11
+ /**
12
+ * M29: tags.json is the registry source of truth. Wired post-construction
13
+ * (the store is built later in boot). When present, every tag mutation
14
+ * re-writes tags.json; a tag rename also re-persists the entity files whose
15
+ * `tags[]` the FK cascade just moved. Null during early boot / index rebuild.
16
+ */
17
+ store = null;
18
+ setEntityStore(store) {
19
+ this.store = store;
20
+ }
11
21
  list() {
12
22
  const rows = this.db.prepare(`SELECT * FROM tag ORDER BY name`).all();
13
23
  const counts = this.countsByTagSlug();
@@ -19,10 +29,6 @@ export class TagsService {
19
29
  return null;
20
30
  return this.toTag(row, this.countsByTagSlug(slug));
21
31
  }
22
- getIdBySlug(slug) {
23
- const row = this.db.prepare(`SELECT id FROM tag WHERE slug = ?`).get(slug);
24
- return row?.id ?? null;
25
- }
26
32
  create(input) {
27
33
  const slug = tagSlug(input.name);
28
34
  if (!slug)
@@ -34,8 +40,25 @@ export class TagsService {
34
40
  this.db
35
41
  .prepare(`INSERT INTO tag (slug, name, color, description) VALUES (?, ?, ?, ?)`)
36
42
  .run(slug, input.name, color, input.description ?? null);
43
+ this.store?.persistTags();
37
44
  return this.getBySlug(slug);
38
45
  }
46
+ /** M29: re-persist the entity files whose `tags[]` changed due to a tag mutation. */
47
+ persistEntitiesWithTag(tagSlugValue) {
48
+ if (!this.store)
49
+ return;
50
+ const rows = this.db
51
+ .prepare(`SELECT DISTINCT entity_type, entity_slug FROM entity_tag WHERE tag_slug = ?`)
52
+ .all(tagSlugValue);
53
+ for (const r of rows) {
54
+ try {
55
+ this.store.persist(r.entity_type, r.entity_slug);
56
+ }
57
+ catch {
58
+ /* entity may be inactive/missing — skip */
59
+ }
60
+ }
61
+ }
39
62
  /** Idempotent: returns existing tag if already present. */
40
63
  ensure(name) {
41
64
  const slug = tagSlug(name);
@@ -66,54 +89,70 @@ export class TagsService {
66
89
  updated_at = datetime('now')
67
90
  WHERE slug = ?`)
68
91
  .run(newSlug, newName, input.color !== undefined ? input.color : existing.color, input.description !== undefined ? input.description : existing.description, slug);
92
+ this.store?.persistTags();
93
+ // M29: on rename, entity_tag.tag_slug already cascaded (FK ON UPDATE
94
+ // CASCADE) — re-persist the entity files whose tags[] now reference newSlug.
95
+ if (newSlug !== slug)
96
+ this.persistEntitiesWithTag(newSlug);
69
97
  return this.getBySlug(newSlug);
70
98
  }
71
99
  remove(slug) {
72
- const existing = this.db.prepare(`SELECT id FROM tag WHERE slug = ?`).get(slug);
100
+ const existing = this.db.prepare(`SELECT slug FROM tag WHERE slug = ?`).get(slug);
73
101
  if (!existing)
74
102
  throw new DomainError('NOT_FOUND', `tag '${slug}' not found`);
75
- const affected = this.db
76
- .prepare(`SELECT COUNT(*) AS c FROM entity_tag WHERE tag_id = ?`)
77
- .get(existing.id).c;
78
- this.db.prepare(`DELETE FROM tag WHERE id = ?`).run(existing.id);
79
- return { deleted: true, affectedEntities: affected };
103
+ // Capture affected entities BEFORE the delete cascades entity_tag away.
104
+ const affectedEntities = this.db
105
+ .prepare(`SELECT DISTINCT entity_type, entity_slug FROM entity_tag WHERE tag_slug = ?`)
106
+ .all(slug);
107
+ this.db.prepare(`DELETE FROM tag WHERE slug = ?`).run(slug);
108
+ this.store?.persistTags();
109
+ if (this.store) {
110
+ for (const r of affectedEntities) {
111
+ try {
112
+ this.store.persist(r.entity_type, r.entity_slug);
113
+ }
114
+ catch {
115
+ /* skip */
116
+ }
117
+ }
118
+ }
119
+ return { deleted: true, affectedEntities: affectedEntities.length };
80
120
  }
81
121
  /** Sets the tag set of an entity to exactly `tagNames` (auto-creating missing tags). */
82
- assignTags(entityType, entityId, tagNames) {
122
+ assignTags(entityType, entitySlug, tagNames) {
83
123
  const names = [...new Set(tagNames.map((n) => n.trim()).filter(Boolean))];
84
124
  const tx = this.db.transaction(() => {
85
- const tagIds = [];
125
+ const tagSlugs = [];
86
126
  for (const name of names) {
87
127
  const tag = this.ensure(name);
88
- tagIds.push(this.getIdBySlug(tag.slug));
128
+ tagSlugs.push(tag.slug);
89
129
  }
90
130
  this.db
91
- .prepare(`DELETE FROM entity_tag WHERE entity_type = ? AND entity_id = ?`)
92
- .run(entityType, entityId);
93
- const insert = this.db.prepare(`INSERT INTO entity_tag (entity_type, entity_id, tag_id) VALUES (?, ?, ?)`);
94
- for (const tagId of tagIds)
95
- insert.run(entityType, entityId, tagId);
131
+ .prepare(`DELETE FROM entity_tag WHERE entity_type = ? AND entity_slug = ?`)
132
+ .run(entityType, entitySlug);
133
+ const insert = this.db.prepare(`INSERT INTO entity_tag (entity_type, entity_slug, tag_slug) VALUES (?, ?, ?)`);
134
+ for (const ts of tagSlugs)
135
+ insert.run(entityType, entitySlug, ts);
96
136
  return names.map((n) => tagSlug(n));
97
137
  });
98
138
  return tx();
99
139
  }
100
- getEntityTagSlugs(entityType, entityId) {
140
+ getEntityTagSlugs(entityType, entitySlug) {
101
141
  const rows = this.db
102
142
  .prepare(`SELECT t.slug AS slug
103
143
  FROM entity_tag et
104
- JOIN tag t ON t.id = et.tag_id
105
- WHERE et.entity_type = ? AND et.entity_id = ?
144
+ JOIN tag t ON t.slug = et.tag_slug
145
+ WHERE et.entity_type = ? AND et.entity_slug = ?
106
146
  ORDER BY t.name`)
107
- .all(entityType, entityId);
147
+ .all(entityType, entitySlug);
108
148
  return rows.map((r) => r.slug);
109
149
  }
110
150
  countsByTagSlug(slug) {
111
151
  const sql = `
112
- SELECT t.slug AS slug, et.entity_type AS entity_type, COUNT(*) AS c
152
+ SELECT et.tag_slug AS slug, et.entity_type AS entity_type, COUNT(*) AS c
113
153
  FROM entity_tag et
114
- JOIN tag t ON t.id = et.tag_id
115
- ${slug ? `WHERE t.slug = ?` : ``}
116
- GROUP BY t.slug, et.entity_type
154
+ ${slug ? `WHERE et.tag_slug = ?` : ``}
155
+ GROUP BY et.tag_slug, et.entity_type
117
156
  `;
118
157
  const rows = (slug ? this.db.prepare(sql).all(slug) : this.db.prepare(sql).all());
119
158
  const out = new Map();