@plebeiantech/lat.md 0.12.3-fork.9 → 0.13.4-fork.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/README.md +27 -3
  2. package/dist/src/cli/agent-invocation.d.ts +6 -0
  3. package/dist/src/cli/agent-invocation.js +23 -0
  4. package/dist/src/cli/checklist-menu.d.ts +2 -1
  5. package/dist/src/cli/checklist-menu.js +3 -2
  6. package/dist/src/cli/fork-instructions.d.ts +1 -0
  7. package/dist/src/cli/fork-instructions.js +8 -32
  8. package/dist/src/cli/fork-scaffold.js +2 -2
  9. package/dist/src/cli/graph.d.ts +1 -1
  10. package/dist/src/cli/hook.d.ts +26 -0
  11. package/dist/src/cli/hook.js +115 -64
  12. package/dist/src/cli/index.js +178 -70
  13. package/dist/src/cli/init-preferences.d.ts +4 -0
  14. package/dist/src/cli/init-preferences.js +36 -0
  15. package/dist/src/cli/init.d.ts +2 -1
  16. package/dist/src/cli/init.js +100 -60
  17. package/dist/src/cli/reindex.d.ts +1 -1
  18. package/dist/src/cli/reindex.js +7 -10
  19. package/dist/src/cli/search.d.ts +14 -4
  20. package/dist/src/cli/search.js +115 -101
  21. package/dist/src/cli/ui-build-server.d.ts +12 -0
  22. package/dist/src/cli/ui-build-server.js +26 -0
  23. package/dist/src/cli/ui-build.d.ts +1 -1
  24. package/dist/src/cli/ui-build.js +1 -1
  25. package/dist/src/cli/ui.d.ts +1 -1
  26. package/dist/src/cli/ui.js +1 -1
  27. package/dist/src/cli/wiki.d.ts +12 -0
  28. package/dist/src/cli/wiki.js +85 -0
  29. package/dist/src/fork/antigravity-hook.d.ts +47 -0
  30. package/dist/src/fork/antigravity-hook.js +424 -0
  31. package/dist/src/fork/antigravity-init.d.ts +17 -0
  32. package/dist/src/fork/antigravity-init.js +124 -0
  33. package/dist/src/fork/upstream-drift.js +1 -1
  34. package/dist/src/fork/upstream-guard.d.ts +1 -1
  35. package/dist/src/fork/upstream-guard.js +8 -7
  36. package/dist/src/graph-export.js +7 -7
  37. package/dist/src/knowledge/index.js +2 -2
  38. package/dist/src/mcp/server.js +34 -18
  39. package/dist/src/search/cache.d.ts +3 -0
  40. package/dist/src/search/cache.js +104 -0
  41. package/dist/src/search/chunks.d.ts +23 -0
  42. package/dist/src/search/chunks.js +200 -0
  43. package/dist/src/search/db.d.ts +28 -16
  44. package/dist/src/search/db.js +100 -40
  45. package/dist/src/search/embedder.d.ts +2 -1
  46. package/dist/src/search/embedder.js +7 -6
  47. package/dist/src/search/index.d.ts +6 -2
  48. package/dist/src/search/index.js +176 -70
  49. package/dist/src/search/lexical.d.ts +6 -0
  50. package/dist/src/search/lexical.js +36 -0
  51. package/dist/src/search/lock.d.ts +5 -0
  52. package/dist/src/search/lock.js +45 -0
  53. package/dist/src/search/query.d.ts +26 -0
  54. package/dist/src/search/query.js +103 -0
  55. package/dist/src/search/search.d.ts +16 -7
  56. package/dist/src/search/search.js +165 -21
  57. package/dist/src/search/types.d.ts +15 -0
  58. package/dist/src/view/client/assets/GraphView-D_xnk0bP.js +456 -0
  59. package/dist/src/view/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  60. package/dist/src/view/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  61. package/dist/src/view/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  62. package/dist/src/view/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  63. package/dist/src/view/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  64. package/dist/src/view/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  65. package/dist/src/view/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  66. package/dist/src/view/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  67. package/dist/src/view/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  68. package/dist/src/view/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  69. package/dist/src/view/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  70. package/dist/src/view/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  71. package/dist/src/view/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  72. package/dist/src/view/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  73. package/dist/src/view/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  74. package/dist/src/view/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  75. package/dist/src/view/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  76. package/dist/src/view/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  77. package/dist/src/view/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  78. package/dist/src/view/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  79. package/dist/src/view/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  80. package/dist/src/view/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  81. package/dist/src/view/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  82. package/dist/src/view/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  83. package/dist/src/view/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  84. package/dist/src/view/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  85. package/dist/src/view/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  86. package/dist/src/view/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  87. package/dist/src/view/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  88. package/dist/src/view/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  89. package/dist/src/view/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  90. package/dist/src/view/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  91. package/dist/src/view/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  92. package/dist/src/view/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  93. package/dist/src/view/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  94. package/dist/src/view/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  95. package/dist/src/view/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  96. package/dist/src/view/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  97. package/dist/src/view/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  98. package/dist/src/view/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  99. package/dist/src/view/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  100. package/dist/src/view/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  101. package/dist/src/view/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  102. package/dist/src/view/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  103. package/dist/src/view/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  104. package/dist/src/view/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  105. package/dist/src/view/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  106. package/dist/src/view/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  107. package/dist/src/view/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  108. package/dist/src/view/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  109. package/dist/src/view/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  110. package/dist/src/view/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  111. package/dist/src/view/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  112. package/dist/src/view/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  113. package/dist/src/view/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  114. package/dist/src/view/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  115. package/dist/src/view/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  116. package/dist/src/view/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  117. package/dist/src/view/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  118. package/dist/src/view/client/assets/MarkdownEditor-bjqt_FoF.js +28 -0
  119. package/dist/src/view/client/assets/OrbitControls-DwcpQNja.js +1 -0
  120. package/dist/src/view/client/assets/STLLoader-CLWTKt5i.js +1 -0
  121. package/dist/src/view/client/assets/_commonjsHelpers-CqkleIqs.js +1 -0
  122. package/dist/src/view/client/assets/abnfDiagram-VCTEODGH-kWGvtRnL.js +1 -0
  123. package/dist/src/view/client/assets/arc-BPAFd7cP.js +1 -0
  124. package/dist/src/view/client/assets/architectureDiagram-5GKGNRK7-CsY39oIR.js +36 -0
  125. package/dist/src/view/client/assets/blockDiagram-I7D4REHJ-DHGBG7BJ.js +129 -0
  126. package/dist/src/view/client/assets/c4Diagram-7LVT6UL2-vywK4eb7.js +38 -0
  127. package/dist/src/view/client/assets/channel-CX71L_qV.js +1 -0
  128. package/dist/src/view/client/assets/chunk-2Q5K7J3B-Do3Hz_ci.js +1 -0
  129. package/dist/src/view/client/assets/chunk-5VM5RSS4-B5R1lSeY.js +15 -0
  130. package/dist/src/view/client/assets/chunk-F27PBJKO-Dm55FM_W.js +1 -0
  131. package/dist/src/view/client/assets/chunk-IMKFNOWR-ChptrvvM.js +231 -0
  132. package/dist/src/view/client/assets/chunk-JWPE2WC7-BRQBjrKS.js +1 -0
  133. package/dist/src/view/client/assets/chunk-POPQ4Y6H-CainVZIL.js +1 -0
  134. package/dist/src/view/client/assets/chunk-SVP7TREG-DsKsNGmM.js +88 -0
  135. package/dist/src/view/client/assets/chunk-TICWLB2K-BctkMcJc.js +206 -0
  136. package/dist/src/view/client/assets/chunk-XXDRQBXY-BN7SgOUT.js +1 -0
  137. package/dist/src/view/client/assets/classDiagram-ZZMXUADV-B1VyU6zO.js +1 -0
  138. package/dist/src/view/client/assets/classDiagram-v2-VYDZK3BY-B1VyU6zO.js +1 -0
  139. package/dist/src/view/client/assets/cose-bilkent-JH36ORCC-BszzwrMe.js +1 -0
  140. package/dist/src/view/client/assets/cynefin-OW5HDTMX-CdRyAkPs.js +166 -0
  141. package/dist/src/view/client/assets/cynefinDiagram-5FMLGOSQ-BLvKPZ1u.js +62 -0
  142. package/dist/src/view/client/assets/cytoscape.esm-DzSz-X2X.js +321 -0
  143. package/dist/src/view/client/assets/dagre-GXQ25YYZ-V68w_l65.js +4 -0
  144. package/dist/src/view/client/assets/defaultLocale-DX6XiGOO.js +1 -0
  145. package/dist/src/view/client/assets/diagram-S7CK7UJ4-C2i4eEMg.js +30 -0
  146. package/dist/src/view/client/assets/diagram-UQ7AKVKN-BiwWh5jC.js +41 -0
  147. package/dist/src/view/client/assets/diagram-VSXAHHWV-hkKR_vyS.js +3 -0
  148. package/dist/src/view/client/assets/diagram-VX7I27RA-DzRCSMAc.js +24 -0
  149. package/dist/src/view/client/assets/diagram-Z3DM3KII-fhSFPxyK.js +24 -0
  150. package/dist/src/view/client/assets/ebnfDiagram-PWID7BFC-CCEUDKSA.js +1 -0
  151. package/dist/src/view/client/assets/erDiagram-RLTQ6QDP-FJ2IMyTi.js +99 -0
  152. package/dist/src/view/client/assets/flowDiagram-HODETNUW-BvasdLeK.js +168 -0
  153. package/dist/src/view/client/assets/ganttDiagram-EL5Y4UJY-CiwkBZvY.js +292 -0
  154. package/dist/src/view/client/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  155. package/dist/src/view/client/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  156. package/dist/src/view/client/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  157. package/dist/src/view/client/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  158. package/dist/src/view/client/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
  159. package/dist/src/view/client/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
  160. package/dist/src/view/client/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
  161. package/dist/src/view/client/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  162. package/dist/src/view/client/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
  163. package/dist/src/view/client/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
  164. package/dist/src/view/client/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  165. package/dist/src/view/client/assets/gitGraphDiagram-WWUBYQGX-DYlP2_js.js +106 -0
  166. package/dist/src/view/client/assets/index-BnENo9bV.js +1 -0
  167. package/dist/src/view/client/assets/index-CQ7EOox7.css +1 -0
  168. package/dist/src/view/client/assets/index-CynNDkxt.js +13 -0
  169. package/dist/src/view/client/assets/infoDiagram-27XIBGKW-DRPB2c48.js +2 -0
  170. package/dist/src/view/client/assets/init-Gi6I4Gst.js +1 -0
  171. package/dist/src/view/client/assets/ishikawaDiagram-5VMMS53U-8VV429Cv.js +70 -0
  172. package/dist/src/view/client/assets/journeyDiagram-3NMN7TZE-Dzmwnf83.js +139 -0
  173. package/dist/src/view/client/assets/kanban-definition-UXKFOSKX-pYyZZ1i-.js +89 -0
  174. package/dist/src/view/client/assets/katex-HP8lGamR.js +257 -0
  175. package/dist/src/view/client/assets/layout-GF9k6yGo.js +1 -0
  176. package/dist/src/view/client/assets/linear-Yt2sSOYV.js +1 -0
  177. package/dist/src/view/client/assets/logo-RR_KBOAT.svg +149 -0
  178. package/dist/src/view/client/assets/maplibre-gl-CDX6Zuow.js +800 -0
  179. package/dist/src/view/client/assets/mermaid.core-ChWYCHN0.js +310 -0
  180. package/dist/src/view/client/assets/mindmap-definition-YA3MSWOX-Cc4fQvf1.js +96 -0
  181. package/dist/src/view/client/assets/ordinal-Cboi1Yqb.js +1 -0
  182. package/dist/src/view/client/assets/pegDiagram-XKGWAZYB-C0SsB8bZ.js +1 -0
  183. package/dist/src/view/client/assets/pieDiagram-E7YTZNPT-DIJpqERZ.js +39 -0
  184. package/dist/src/view/client/assets/quadrantDiagram-AXDQQJYC--d-gl6j-.js +7 -0
  185. package/dist/src/view/client/assets/railroadDiagram-O6MQD6OU-BQxwTt7z.js +1 -0
  186. package/dist/src/view/client/assets/requirementDiagram-BXWQKSXE-B_oTeD2A.js +84 -0
  187. package/dist/src/view/client/assets/sankeyDiagram-P5KCCOFB-DLukmE8X.js +40 -0
  188. package/dist/src/view/client/assets/sequenceDiagram-WJ2MYXX4-BNjVB2sc.js +162 -0
  189. package/dist/src/view/client/assets/sizeCapture-INFHLROL-BZecQTOw.js +1 -0
  190. package/dist/src/view/client/assets/stateDiagram-D77RDMKH-Bu1urvXC.js +1 -0
  191. package/dist/src/view/client/assets/stateDiagram-v2-MP3YSRHH-5pc_697G.js +1 -0
  192. package/dist/src/view/client/assets/swimlanes-42K2YHIH-bLAlcepB.js +1 -0
  193. package/dist/src/view/client/assets/swimlanesDiagram-VR7AAH4N-BbOpZjpp.js +8 -0
  194. package/dist/src/view/client/assets/three.module-PDSP0dbZ.js +4108 -0
  195. package/dist/src/view/client/assets/timeline-definition-24CTP7MA-tbwCNvcA.js +120 -0
  196. package/dist/src/view/client/assets/vennDiagram-4TSXK5OY-D8U8Fk0N.js +34 -0
  197. package/dist/src/view/client/assets/wardleyDiagram-VM6X3IG4-LHBVIeNb.js +78 -0
  198. package/dist/src/view/client/assets/xychartDiagram-S5SC5T6Z-CN4tfaFV.js +7 -0
  199. package/dist/src/view/client/index.html +2 -2
  200. package/dist/src/view/client-shell.d.ts +2 -0
  201. package/dist/src/view/client-shell.js +5 -0
  202. package/dist/src/view/diagnostics.d.ts +3 -2
  203. package/dist/src/view/diagnostics.js +49 -58
  204. package/dist/src/view/document-edit.d.ts +8 -0
  205. package/dist/src/view/document-edit.js +25 -0
  206. package/dist/src/view/document-route.d.ts +14 -0
  207. package/dist/src/view/document-route.js +137 -0
  208. package/dist/src/view/document-tree.d.ts +18 -0
  209. package/dist/src/view/document-tree.js +139 -0
  210. package/dist/src/view/external-document-tree.d.ts +3 -0
  211. package/dist/src/view/external-document-tree.js +674 -0
  212. package/dist/src/view/git-diff.js +202 -2
  213. package/dist/src/view/git.js +1 -1
  214. package/dist/src/view/graph.d.ts +4 -3
  215. package/dist/src/view/graph.js +100 -9
  216. package/dist/src/view/highlight.d.ts +10 -2
  217. package/dist/src/view/highlight.js +50648 -3166
  218. package/dist/src/view/markdown.d.ts +3 -2
  219. package/dist/src/view/markdown.js +256 -54
  220. package/dist/src/view/preindexed-search.d.ts +15 -0
  221. package/dist/src/view/preindexed-search.js +25 -0
  222. package/dist/src/view/protocol.d.ts +53 -7
  223. package/dist/src/view/publication.d.ts +2 -0
  224. package/dist/src/view/publication.js +78 -0
  225. package/dist/src/view/references.d.ts +11 -26
  226. package/dist/src/view/references.js +121 -112
  227. package/dist/src/view/repository.d.ts +14 -4
  228. package/dist/src/view/repository.js +260 -19
  229. package/dist/src/view/request-security.d.ts +5 -0
  230. package/dist/src/view/request-security.js +46 -0
  231. package/dist/src/view/search-result.d.ts +4 -0
  232. package/dist/src/view/search-result.js +25 -0
  233. package/dist/src/view/search.d.ts +7 -2
  234. package/dist/src/view/search.js +23 -34
  235. package/dist/src/view/server-build.d.ts +21 -0
  236. package/dist/src/view/server-build.js +145 -0
  237. package/dist/src/view/server-deployment.d.ts +31 -0
  238. package/dist/src/view/server-deployment.js +123 -0
  239. package/dist/src/view/server-index-worker.d.ts +6 -0
  240. package/dist/src/view/server-index-worker.js +14 -0
  241. package/dist/src/view/server.d.ts +11 -2
  242. package/dist/src/view/server.js +245 -73
  243. package/dist/src/view/source-target.d.ts +2 -0
  244. package/dist/src/view/source-target.js +49 -8
  245. package/dist/src/view/static-build.d.ts +18 -2
  246. package/dist/src/view/static-build.js +449 -110
  247. package/dist/src/view/static-protocol.d.ts +26 -2
  248. package/dist/src/view/static-protocol.js +5 -0
  249. package/dist/src/view/store.d.ts +20 -3
  250. package/dist/src/view/store.js +304 -48
  251. package/dist/src/view/table-of-contents.d.ts +2 -2
  252. package/dist/src/view/table-of-contents.js +2 -22
  253. package/dist/src/view/vercel-build.d.ts +24 -0
  254. package/dist/src/view/vercel-build.js +152 -0
  255. package/dist/src/view/vercel-server-build.d.ts +10 -0
  256. package/dist/src/view/vercel-server-build.js +61 -0
  257. package/dist/src/wiki/catalog.d.ts +21 -0
  258. package/dist/src/wiki/catalog.js +256 -0
  259. package/dist/src/wiki/publish.d.ts +27 -0
  260. package/dist/src/wiki/publish.js +265 -0
  261. package/dist/src/wiki/render.d.ts +20 -0
  262. package/dist/src/wiki/render.js +163 -0
  263. package/dist/src/wiki/transform.d.ts +7 -0
  264. package/dist/src/wiki/transform.js +264 -0
  265. package/dist/vendor/lat.md-server/cli.d.ts +2 -0
  266. package/dist/vendor/lat.md-server/cli.js +12 -0
  267. package/dist/vendor/lat.md-server/index.d.ts +38 -0
  268. package/dist/vendor/lat.md-server/index.js +128 -0
  269. package/package.json +68 -22
  270. package/plugins/lat-md/README.md +61 -0
  271. package/plugins/lat-md/hooks.json +38 -0
  272. package/plugins/lat-md/plugin.json +9 -0
  273. package/plugins/lat-md/rules/AGENTS.md +344 -0
  274. package/plugins/lat-md/skills/lat-md/SKILL.md +210 -0
  275. package/plugins/lat-md/skills/lat-md-conventions/SKILL.md +226 -0
  276. package/templates/AGENTS.md +26 -7
  277. package/templates/cursor-rules.md +23 -7
  278. package/templates/fork/conventions.md +133 -11
  279. package/templates/opencode-plugin.ts +9 -9
  280. package/templates/pi-extension.ts +11 -11
  281. package/templates/skill/SKILL.md +35 -3
  282. package/dist/src/cli/check-coverage.d.ts +0 -2
  283. package/dist/src/cli/check-coverage.js +0 -71
  284. package/dist/src/cli/check-frontmatter.d.ts +0 -12
  285. package/dist/src/cli/check-frontmatter.js +0 -44
  286. package/dist/src/cli/check-mode.d.ts +0 -21
  287. package/dist/src/cli/check-mode.js +0 -364
  288. package/dist/src/cli/check-status.d.ts +0 -74
  289. package/dist/src/cli/check-status.js +0 -217
  290. package/dist/src/cli/check.d.ts +0 -45
  291. package/dist/src/cli/check.js +0 -781
  292. package/dist/src/cli/context.d.ts +0 -11
  293. package/dist/src/cli/context.js +0 -58
  294. package/dist/src/cli/expand.d.ts +0 -8
  295. package/dist/src/cli/expand.js +0 -94
  296. package/dist/src/cli/gen-index.d.ts +0 -45
  297. package/dist/src/cli/gen-index.js +0 -235
  298. package/dist/src/cli/link-scheme.d.ts +0 -54
  299. package/dist/src/cli/link-scheme.js +0 -101
  300. package/dist/src/cli/locate.d.ts +0 -2
  301. package/dist/src/cli/locate.js +0 -17
  302. package/dist/src/cli/refs.d.ts +0 -22
  303. package/dist/src/cli/refs.js +0 -229
  304. package/dist/src/cli/section.d.ts +0 -43
  305. package/dist/src/cli/section.js +0 -252
  306. package/dist/src/cli/select-menu.d.ts +0 -13
  307. package/dist/src/cli/select-menu.js +0 -100
  308. package/dist/src/code-refs.d.ts +0 -17
  309. package/dist/src/code-refs.js +0 -298
  310. package/dist/src/config.d.ts +0 -29
  311. package/dist/src/config.js +0 -83
  312. package/dist/src/context.d.ts +0 -23
  313. package/dist/src/context.js +0 -11
  314. package/dist/src/extensions/wiki-link/from-markdown.d.ts +0 -5
  315. package/dist/src/extensions/wiki-link/from-markdown.js +0 -34
  316. package/dist/src/extensions/wiki-link/index.d.ts +0 -4
  317. package/dist/src/extensions/wiki-link/index.js +0 -3
  318. package/dist/src/extensions/wiki-link/syntax.d.ts +0 -14
  319. package/dist/src/extensions/wiki-link/syntax.js +0 -121
  320. package/dist/src/extensions/wiki-link/to-markdown.d.ts +0 -5
  321. package/dist/src/extensions/wiki-link/to-markdown.js +0 -28
  322. package/dist/src/extensions/wiki-link/types.d.ts +0 -34
  323. package/dist/src/format.d.ts +0 -8
  324. package/dist/src/format.js +0 -43
  325. package/dist/src/init-version.d.ts +0 -10
  326. package/dist/src/init-version.js +0 -49
  327. package/dist/src/lattice.d.ts +0 -109
  328. package/dist/src/lattice.js +0 -817
  329. package/dist/src/parser.d.ts +0 -3
  330. package/dist/src/parser.js +0 -18
  331. package/dist/src/source-parser.d.ts +0 -27
  332. package/dist/src/source-parser.js +0 -916
  333. package/dist/src/untrusted.d.ts +0 -18
  334. package/dist/src/untrusted.js +0 -93
  335. package/dist/src/view/client/assets/index-C3iaZyYT.css +0 -1
  336. package/dist/src/view/client/assets/index-KWi67IMz.js +0 -334
  337. package/dist/src/view/client/assets/logo-CNF8zs47.svg +0 -182
  338. package/dist/src/walk.d.ts +0 -18
  339. package/dist/src/walk.js +0 -27
  340. /package/dist/src/{extensions/wiki-link → search}/types.js +0 -0
@@ -0,0 +1,152 @@
1
+ import { cp, lstat, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile, } from 'node:fs/promises';
2
+ import { dirname, isAbsolute, join, resolve, sep } from 'node:path';
3
+ import { nodeFileTrace } from '@vercel/nft';
4
+ import { LAT_UI_CONTENT_SECURITY_POLICY } from '../../vendor/lat.md-server/index.js';
5
+ import { INDEX_FILE, hasIndex } from '../search/db.js';
6
+ const defaultDependencies = {
7
+ traceFiles: nodeFileTrace,
8
+ };
9
+ function json(value) {
10
+ return `${JSON.stringify(value, null, 2)}\n`;
11
+ }
12
+ function basePathSegments(basePath) {
13
+ const parsed = new URL(basePath, 'http://lat.local');
14
+ if (parsed.origin !== 'http://lat.local' ||
15
+ parsed.search ||
16
+ parsed.hash ||
17
+ !basePath.startsWith('/')) {
18
+ throw new Error(`Invalid Lat UI server base path: ${basePath}`);
19
+ }
20
+ return parsed.pathname
21
+ .split('/')
22
+ .filter(Boolean)
23
+ .map((part) => {
24
+ const decoded = decodeURIComponent(part);
25
+ if (decoded === '.' ||
26
+ decoded === '..' ||
27
+ decoded.includes('/') ||
28
+ decoded.includes('\\')) {
29
+ throw new Error(`Invalid Lat UI server base path: ${basePath}`);
30
+ }
31
+ return decoded;
32
+ });
33
+ }
34
+ function safeTracePath(path) {
35
+ if (isAbsolute(path) ||
36
+ path === '..' ||
37
+ path.startsWith(`..${sep}`) ||
38
+ path.split(/[\\/]/).includes('..')) {
39
+ throw new Error(`Node file trace escaped the server artifact: ${path}`);
40
+ }
41
+ return path;
42
+ }
43
+ function outputConfig() {
44
+ const securityHeaders = {
45
+ 'Content-Security-Policy': LAT_UI_CONTENT_SECURITY_POLICY,
46
+ 'Referrer-Policy': 'no-referrer',
47
+ 'X-Content-Type-Options': 'nosniff',
48
+ };
49
+ const immutableHeaders = {
50
+ 'Cache-Control': 'public, max-age=31536000, immutable',
51
+ };
52
+ return {
53
+ version: 3,
54
+ routes: [
55
+ { src: '/(.*)', headers: securityHeaders, continue: true },
56
+ {
57
+ src: '/(?:.*?/)?assets/.*',
58
+ headers: immutableHeaders,
59
+ continue: true,
60
+ },
61
+ {
62
+ src: '/(?:.*?/)?data/[^/]+/[a-f0-9]{20}\\.json',
63
+ headers: immutableHeaders,
64
+ continue: true,
65
+ },
66
+ { handle: 'filesystem' },
67
+ { src: '/', dest: '/index.html' },
68
+ { src: '/(.*)/', dest: '/$1/index.html' },
69
+ { src: '/(.*)', dest: '/$1/index.html' },
70
+ ],
71
+ };
72
+ }
73
+ /** Convert an installed portable Lat UI server into Vercel Build Output API v3. */
74
+ export async function buildVercelOutput(requestedArtifact, requestedOutput = '.vercel/output', options = {}, dependencies = defaultDependencies) {
75
+ const artifactDir = resolve(requestedArtifact);
76
+ const outputDir = resolve(requestedOutput);
77
+ if (!options.force) {
78
+ try {
79
+ await lstat(outputDir);
80
+ throw new Error(`Vercel build output already exists: ${outputDir}. Use force to replace it.`);
81
+ }
82
+ catch (error) {
83
+ if (error.code !== 'ENOENT')
84
+ throw error;
85
+ }
86
+ }
87
+ const manifestFile = join(artifactDir, 'server-data', 'server.json');
88
+ const manifest = JSON.parse(await readFile(manifestFile, 'utf8'));
89
+ if (typeof manifest.basePath !== 'string') {
90
+ throw new Error(`Invalid Lat UI server manifest: ${manifestFile}`);
91
+ }
92
+ const entrypoint = join(artifactDir, 'app.mjs');
93
+ const trace = await dependencies.traceFiles([entrypoint], {
94
+ base: artifactDir,
95
+ conditions: ['node', 'production'],
96
+ exportsOnly: true,
97
+ processCwd: artifactDir,
98
+ });
99
+ for (const warning of trace.warnings) {
100
+ options.warn?.(`Node file trace: ${warning.message}`);
101
+ }
102
+ // Keep the database in the function even if tracing cannot infer the asset.
103
+ if (!hasIndex(join(artifactDir, 'server-data'))) {
104
+ throw new Error('Missing hybrid search database; rebuild this deployment.');
105
+ }
106
+ trace.fileList.add('server-data/server.json');
107
+ trace.fileList.add(`server-data/${INDEX_FILE}`);
108
+ // bare-addon resolves native lock bindings dynamically, beyond file tracing.
109
+ for (const file of [...trace.fileList]) {
110
+ if (!file.endsWith('fs-native-extensions/binding.js'))
111
+ continue;
112
+ const prebuilds = join(dirname(file), 'prebuilds');
113
+ for (const asset of await readdir(join(artifactDir, prebuilds), {
114
+ recursive: true,
115
+ })) {
116
+ if (asset.endsWith('.node'))
117
+ trace.fileList.add(join(prebuilds, asset));
118
+ }
119
+ }
120
+ await mkdir(dirname(outputDir), { recursive: true });
121
+ const stagingDir = await mkdtemp(join(dirname(outputDir), '.lat-vercel-staging-'));
122
+ try {
123
+ const staticDir = join(stagingDir, 'static');
124
+ const functionPath = join('functions', ...basePathSegments(manifest.basePath), 'api', 'search.func');
125
+ const functionDir = join(stagingDir, functionPath);
126
+ await cp(join(artifactDir, 'public'), staticDir, { recursive: true });
127
+ for (const traced of trace.fileList) {
128
+ const path = safeTracePath(traced);
129
+ const destination = join(functionDir, path);
130
+ await mkdir(dirname(destination), { recursive: true });
131
+ await cp(join(artifactDir, path), destination, {
132
+ dereference: true,
133
+ recursive: true,
134
+ });
135
+ }
136
+ await writeFile(join(functionDir, '.vc-config.json'), json({
137
+ runtime: 'nodejs22.x',
138
+ handler: 'app.mjs',
139
+ launcherType: 'Nodejs',
140
+ shouldAddHelpers: true,
141
+ }));
142
+ await writeFile(join(stagingDir, 'config.json'), json(outputConfig()));
143
+ if (options.force)
144
+ await rm(outputDir, { recursive: true, force: true });
145
+ await rename(stagingDir, outputDir);
146
+ return { files: trace.fileList.size, functionPath, outputDir };
147
+ }
148
+ catch (error) {
149
+ await rm(stagingDir, { recursive: true, force: true });
150
+ throw error;
151
+ }
152
+ }
@@ -0,0 +1,10 @@
1
+ import type { CmdContext } from '@plebeiantech/lat.md-core/context';
2
+ import { buildServerView, type ServerViewBuildOptions, type ServerViewBuildResult } from './server-build.js';
3
+ import { type VercelBuildOptions, type VercelBuildResult } from './vercel-build.js';
4
+ export type VercelServerBuildDependencies = {
5
+ buildNode: typeof buildServerView;
6
+ buildOutput: (artifact: string, output: string, options: VercelBuildOptions) => Promise<VercelBuildResult>;
7
+ installDependencies: (artifact: string) => Promise<void>;
8
+ };
9
+ /** Build the portable server in staging, install it, then emit Vercel v3 output. */
10
+ export declare function buildVercelServerView(ctx: CmdContext, requestedOutput: string, options?: ServerViewBuildOptions, dependencies?: VercelServerBuildDependencies): Promise<ServerViewBuildResult>;
@@ -0,0 +1,61 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdir, mkdtemp, rm } from 'node:fs/promises';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ import { buildServerView, } from './server-build.js';
5
+ import { validateViewBuildOutput } from './static-build.js';
6
+ import { buildVercelOutput, } from './vercel-build.js';
7
+ function installServerDependencies(artifact) {
8
+ const executable = process.platform === 'win32' ? 'npm.cmd' : 'npm';
9
+ const args = [
10
+ 'install',
11
+ '--ignore-scripts',
12
+ '--no-package-lock',
13
+ '--omit=dev',
14
+ '--no-audit',
15
+ '--no-fund',
16
+ ];
17
+ return new Promise((resolveInstall, reject) => {
18
+ const child = spawn(executable, args, { cwd: artifact, stdio: 'inherit' });
19
+ child.once('error', reject);
20
+ child.once('exit', (code, signal) => {
21
+ if (code === 0) {
22
+ resolveInstall();
23
+ return;
24
+ }
25
+ reject(new Error(`npm install failed${signal ? ` with signal ${signal}` : ` with exit code ${code}`}`));
26
+ });
27
+ });
28
+ }
29
+ const defaultDependencies = {
30
+ buildNode: buildServerView,
31
+ buildOutput: buildVercelOutput,
32
+ installDependencies: installServerDependencies,
33
+ };
34
+ /** Build the portable server in staging, install it, then emit Vercel v3 output. */
35
+ export async function buildVercelServerView(ctx, requestedOutput, options = {}, dependencies = defaultDependencies) {
36
+ const outputDir = resolve(ctx.projectRoot, requestedOutput);
37
+ await validateViewBuildOutput(outputDir, ctx.projectRoot, 'Vercel', options.force);
38
+ await mkdir(dirname(outputDir), { recursive: true });
39
+ const stagingDir = await mkdtemp(join(dirname(outputDir), '.lat-vercel-server-'));
40
+ const nodeArtifact = join(stagingDir, 'node');
41
+ try {
42
+ const result = await dependencies.buildNode(ctx, nodeArtifact, {
43
+ ...options,
44
+ force: false,
45
+ });
46
+ await dependencies.installDependencies(nodeArtifact);
47
+ await dependencies.buildOutput(nodeArtifact, outputDir, {
48
+ force: options.force,
49
+ warn: (message) => console.warn(message),
50
+ });
51
+ return { ...result, outputDir };
52
+ }
53
+ finally {
54
+ await rm(stagingDir, {
55
+ recursive: true,
56
+ force: true,
57
+ maxRetries: 10,
58
+ retryDelay: 150,
59
+ });
60
+ }
61
+ }
@@ -0,0 +1,21 @@
1
+ import { type Section } from '@plebeiantech/lat.md-core/lattice';
2
+ import { type DiataxisMode } from '@plebeiantech/lat.md-core/cli/check-mode';
3
+ export type WikiCatalogDoc = {
4
+ mode: DiataxisMode;
5
+ slug: string;
6
+ title: string;
7
+ firstParagraph: string;
8
+ relPath: string;
9
+ filePath: string;
10
+ body: string;
11
+ sections: Section[];
12
+ };
13
+ export type WikiCatalog = {
14
+ latDir: string;
15
+ projectRoot: string;
16
+ rootTitle?: string;
17
+ rootOverview?: string;
18
+ docs: WikiCatalogDoc[];
19
+ allSections: Section[];
20
+ };
21
+ export declare function buildWikiCatalog(latDir: string, projectRoot?: string): Promise<WikiCatalog>;
@@ -0,0 +1,256 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { basename, dirname, relative } from 'node:path';
3
+ import { listLatticeFiles, parseFrontmatter, parseSections, } from '@plebeiantech/lat.md-core/lattice';
4
+ import { parse } from '@plebeiantech/lat.md-core/parser';
5
+ import { toPosix } from '@plebeiantech/lat.md-core/path';
6
+ import { DIATAXIS_MODES, MODE_DIRS, indexNameFor, } from '@plebeiantech/lat.md-core/cli/check-mode';
7
+ const DIR_TO_MODE = Object.create(null);
8
+ for (const mode of DIATAXIS_MODES) {
9
+ DIR_TO_MODE[MODE_DIRS[mode]] = mode;
10
+ }
11
+ const RESERVED_SLUGS = new Set(['home', '_sidebar', '_footer']);
12
+ function headingToText(node) {
13
+ function collect(children) {
14
+ let result = '';
15
+ for (const c of children) {
16
+ if ('value' in c && typeof c.value === 'string') {
17
+ result += c.value;
18
+ }
19
+ else if ('children' in c &&
20
+ Array.isArray(c.children)) {
21
+ result += collect(c.children);
22
+ }
23
+ }
24
+ return result;
25
+ }
26
+ return collect(node.children).trim();
27
+ }
28
+ function isBadgeOrImageParagraph(node) {
29
+ if (!node.children || node.children.length === 0)
30
+ return true;
31
+ for (const child of node.children) {
32
+ if (child.type === 'image')
33
+ continue;
34
+ if (child.type === 'link') {
35
+ const link = child;
36
+ const allImageOrEmpty = link.children?.every((c) => c.type === 'image' ||
37
+ (c.type === 'text' &&
38
+ typeof c.value === 'string' &&
39
+ c.value.trim() === '')) ?? false;
40
+ if (allImageOrEmpty)
41
+ continue;
42
+ }
43
+ if (child.type === 'text' &&
44
+ typeof child.value === 'string' &&
45
+ child.value.trim() === '') {
46
+ continue;
47
+ }
48
+ return false;
49
+ }
50
+ return true;
51
+ }
52
+ function extractParagraphText(content, node) {
53
+ if (node.position?.start?.offset != null &&
54
+ node.position?.end?.offset != null) {
55
+ return content
56
+ .slice(node.position.start.offset, node.position.end.offset)
57
+ .replace(/\r?\n\s*/g, ' ')
58
+ .trim();
59
+ }
60
+ return '';
61
+ }
62
+ export async function buildWikiCatalog(latDir, projectRoot = dirname(latDir)) {
63
+ const files = await listLatticeFiles(latDir);
64
+ const allSections = [];
65
+ const rawDocs = [];
66
+ let rootTitle;
67
+ let rootOverview;
68
+ for (const file of files) {
69
+ const content = await readFile(file, 'utf-8');
70
+ const tree = parse(content);
71
+ const sections = parseSections(file, content, projectRoot, tree);
72
+ allSections.push(...sections);
73
+ const relPath = toPosix(relative(latDir, file));
74
+ const filePath = toPosix(relative(projectRoot, file));
75
+ const segments = relPath.split('/');
76
+ const fileName = segments.pop();
77
+ const holder = segments.length === 0 ? basename(latDir) : segments.at(-1);
78
+ const isIndex = fileName === indexNameFor(holder);
79
+ // Root index extraction
80
+ if (isIndex && segments.length === 0) {
81
+ // Find first H1 heading
82
+ let h1Node;
83
+ for (const node of tree.children) {
84
+ if (node.type === 'heading' && node.depth === 1) {
85
+ h1Node = node;
86
+ break;
87
+ }
88
+ }
89
+ if (h1Node) {
90
+ rootTitle = headingToText(h1Node);
91
+ const h1Index = tree.children.indexOf(h1Node);
92
+ for (let i = h1Index + 1; i < tree.children.length; i++) {
93
+ const node = tree.children[i];
94
+ if (node.type === 'heading')
95
+ break;
96
+ if (node.type === 'paragraph' && !isBadgeOrImageParagraph(node)) {
97
+ rootOverview = extractParagraphText(content, node);
98
+ break;
99
+ }
100
+ }
101
+ }
102
+ else {
103
+ rootTitle = undefined;
104
+ for (const node of tree.children) {
105
+ if (node.type === 'heading')
106
+ break;
107
+ if (node.type === 'paragraph' && !isBadgeOrImageParagraph(node)) {
108
+ rootOverview = extractParagraphText(content, node);
109
+ break;
110
+ }
111
+ }
112
+ }
113
+ continue;
114
+ }
115
+ // Exclude other directory indexes
116
+ if (isIndex)
117
+ continue;
118
+ const fm = parseFrontmatter(content);
119
+ if (fm.requireCodeMention === true ||
120
+ fm.raw['require-code-mention'] === true) {
121
+ continue;
122
+ }
123
+ const firstSegment = relPath.split('/')[0];
124
+ const dirMode = firstSegment && firstSegment !== relPath
125
+ ? DIR_TO_MODE[firstSegment]
126
+ : undefined;
127
+ const declaredRaw = fm.raw['mode'];
128
+ const hasDeclared = declaredRaw !== null && declaredRaw !== undefined;
129
+ const declaredValid = typeof declaredRaw === 'string' &&
130
+ DIATAXIS_MODES.includes(declaredRaw);
131
+ if (hasDeclared && !declaredValid) {
132
+ continue;
133
+ }
134
+ const declared = declaredValid ? declaredRaw : undefined;
135
+ if (declared && dirMode && declared !== dirMode) {
136
+ continue;
137
+ }
138
+ const resolvedMode = declared ?? dirMode;
139
+ if (!resolvedMode)
140
+ continue;
141
+ // Body with stripped frontmatter
142
+ const body = content.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, '');
143
+ // Title: first H1 heading text, falling back to file stem
144
+ let title;
145
+ for (const s of sections) {
146
+ if (s.depth === 1) {
147
+ title = s.heading;
148
+ break;
149
+ }
150
+ }
151
+ const stem = basename(file, '.md');
152
+ if (!title)
153
+ title = stem;
154
+ // First paragraph
155
+ let firstParagraph = '';
156
+ const firstHeadingIndex = tree.children.findIndex((n) => n.type === 'heading');
157
+ if (firstHeadingIndex >= 0) {
158
+ for (let i = firstHeadingIndex + 1; i < tree.children.length; i++) {
159
+ const node = tree.children[i];
160
+ if (node.type === 'heading')
161
+ break;
162
+ if (node.type === 'paragraph') {
163
+ firstParagraph = extractParagraphText(content, node);
164
+ break;
165
+ }
166
+ }
167
+ }
168
+ else {
169
+ const firstP = tree.children.find((n) => n.type === 'paragraph');
170
+ if (firstP) {
171
+ firstParagraph = extractParagraphText(content, firstP);
172
+ }
173
+ }
174
+ if (!firstParagraph && sections.length > 0 && sections[0].firstParagraph) {
175
+ firstParagraph = sections[0].firstParagraph;
176
+ }
177
+ rawDocs.push({
178
+ file,
179
+ relPath,
180
+ filePath,
181
+ content,
182
+ tree,
183
+ sections,
184
+ mode: resolvedMode,
185
+ body,
186
+ title,
187
+ firstParagraph,
188
+ });
189
+ }
190
+ // Sort docs deterministically by relPath
191
+ rawDocs.sort((a, b) => a.relPath.localeCompare(b.relPath));
192
+ // Slug assignment with collision and reserved name handling
193
+ const stemCounts = new Map();
194
+ for (const doc of rawDocs) {
195
+ const stem = basename(doc.relPath, '.md').toLowerCase();
196
+ stemCounts.set(stem, (stemCounts.get(stem) ?? 0) + 1);
197
+ }
198
+ const candidates = rawDocs.map((doc) => {
199
+ const stem = basename(doc.relPath, '.md');
200
+ const modeSlug = `${doc.mode}-${stem}`;
201
+ const relDir = dirname(doc.relPath);
202
+ const dirPrefix = relDir === '.' ? '' : relDir.replace(/\//g, '-');
203
+ const dirSlug = dirPrefix ? `${dirPrefix}-${stem}` : modeSlug;
204
+ return { doc, stem, modeSlug, dirSlug };
205
+ });
206
+ // Check which initial slugs collide or are reserved
207
+ const candidateModeCounts = new Map();
208
+ for (const c of candidates) {
209
+ candidateModeCounts.set(c.modeSlug.toLowerCase(), (candidateModeCounts.get(c.modeSlug.toLowerCase()) ?? 0) + 1);
210
+ }
211
+ const assignedDocs = [];
212
+ const usedSlugs = new Set();
213
+ for (const c of candidates) {
214
+ const lowerStem = c.stem.toLowerCase();
215
+ const isReserved = RESERVED_SLUGS.has(lowerStem);
216
+ const hasStemCollision = (stemCounts.get(lowerStem) ?? 0) > 1;
217
+ let slug;
218
+ if (isReserved || hasStemCollision) {
219
+ const modeCollides = (candidateModeCounts.get(c.modeSlug.toLowerCase()) ?? 0) > 1;
220
+ if (modeCollides && c.dirSlug !== c.modeSlug) {
221
+ slug = c.dirSlug;
222
+ }
223
+ else {
224
+ slug = c.modeSlug;
225
+ }
226
+ }
227
+ else {
228
+ slug = c.stem;
229
+ }
230
+ // Ensure no accidental collision with already assigned slug
231
+ let finalSlug = slug;
232
+ let suffix = 2;
233
+ while (usedSlugs.has(finalSlug.toLowerCase())) {
234
+ finalSlug = `${slug}-${suffix++}`;
235
+ }
236
+ usedSlugs.add(finalSlug.toLowerCase());
237
+ assignedDocs.push({
238
+ mode: c.doc.mode,
239
+ slug: finalSlug,
240
+ title: c.doc.title,
241
+ firstParagraph: c.doc.firstParagraph,
242
+ relPath: c.doc.relPath,
243
+ filePath: c.doc.filePath,
244
+ body: c.doc.body,
245
+ sections: c.doc.sections,
246
+ });
247
+ }
248
+ return {
249
+ latDir,
250
+ projectRoot,
251
+ rootTitle,
252
+ rootOverview,
253
+ docs: assignedDocs,
254
+ allSections,
255
+ };
256
+ }
@@ -0,0 +1,27 @@
1
+ export type WikiRemoteInfo = {
2
+ repoName: string;
3
+ repoUrl?: string;
4
+ wikiRemoteUrl: string;
5
+ };
6
+ export type PublishWikiOptions = {
7
+ latDir: string;
8
+ projectRoot?: string;
9
+ remote?: string;
10
+ repoUrl?: string;
11
+ ref?: string;
12
+ message?: string;
13
+ dryRun?: boolean;
14
+ };
15
+ export type PublishWikiResult = {
16
+ wikiRemoteUrl: string;
17
+ repoUrl?: string;
18
+ ref: string;
19
+ pages: number;
20
+ writtenFiles: string[];
21
+ removedFiles: string[];
22
+ changed: boolean;
23
+ pushed: boolean;
24
+ commitSha?: string;
25
+ };
26
+ export declare function resolveWikiRemote(projectRoot: string, remoteOrUrl?: string): WikiRemoteInfo;
27
+ export declare function publishWiki(options: PublishWikiOptions): Promise<PublishWikiResult>;