@peaske7/readit 0.3.0-rc.0 → 0.3.0-rc.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 (374) hide show
  1. package/README.md +3 -3
  2. package/dist/.vite/manifest.json +1111 -0
  3. package/dist/assets/_basePickBy-BMMA4Tou.js +1 -0
  4. package/dist/assets/_baseUniq-D40qku1I.js +1 -0
  5. package/dist/assets/arc-Ckg65iy8.js +1 -0
  6. package/dist/assets/architecture-YZFGNWBL-Dv3EY0zV.js +1 -0
  7. package/dist/assets/architectureDiagram-Q4EWVU46-DQnkwSaB.js +36 -0
  8. package/dist/assets/array-Bjz-wYpJ.js +1 -0
  9. package/dist/assets/blockDiagram-DXYQGD6D-UB6_S1lm.js +132 -0
  10. package/dist/assets/c4Diagram-AHTNJAMY-sn3k2GND.js +10 -0
  11. package/dist/assets/channel-D9wPw2fQ.js +1 -0
  12. package/dist/assets/chunk-2KRD3SAO-DaFfaCGO.js +1 -0
  13. package/dist/assets/chunk-336JU56O-C8siO5Of.js +2 -0
  14. package/dist/assets/chunk-426QAEUC-BB478m3j.js +1 -0
  15. package/dist/assets/chunk-4BX2VUAB-DRuTD7x5.js +1 -0
  16. package/dist/assets/chunk-4TB4RGXK-_l6jvVAY.js +206 -0
  17. package/dist/assets/chunk-55IACEB6-BExiaAoD.js +1 -0
  18. package/dist/assets/chunk-5FUZZQ4R-HOSFTxuG.js +62 -0
  19. package/dist/assets/chunk-5PVQY5BW-BRVNNRAX.js +2 -0
  20. package/dist/assets/chunk-67CJDMHE-DMt8LNEX.js +1 -0
  21. package/dist/assets/chunk-7N4EOEYR-CzLGefVf.js +1 -0
  22. package/dist/assets/chunk-AA7GKIK3-B6GFAk4U.js +1 -0
  23. package/dist/assets/chunk-BSJP7CBP-BK29yehL.js +1 -0
  24. package/dist/assets/chunk-CIAEETIT-D7hBXImP.js +1 -0
  25. package/dist/assets/chunk-Dlc7tRH4.js +1 -0
  26. package/dist/assets/chunk-EDXVE4YY-CSvKh9DT.js +1 -0
  27. package/dist/assets/chunk-ENJZ2VHE-QApb5cYr.js +10 -0
  28. package/dist/assets/chunk-FMBD7UC4-2FWyCCAV.js +15 -0
  29. package/dist/assets/chunk-FOC6F5B3-DKFHrt4K.js +1 -0
  30. package/dist/assets/chunk-ICPOFSXX-agBjBxsW.js +122 -0
  31. package/dist/assets/chunk-K5T4RW27-D51O7IkG.js +94 -0
  32. package/dist/assets/chunk-KGLVRYIC-DMHSCH4T.js +1 -0
  33. package/dist/assets/chunk-LIHQZDEY-C2aANxt9.js +1 -0
  34. package/dist/assets/chunk-ORNJ4GCN-Db_37NRX.js +1 -0
  35. package/dist/assets/chunk-OYMX7WX6-HGUtT2Q9.js +231 -0
  36. package/dist/assets/chunk-QZHKN3VN-8Lcg9gti.js +1 -0
  37. package/dist/assets/chunk-U2HBQHQK-BFYYQeuC.js +70 -0
  38. package/dist/assets/chunk-X2U36JSP-p8ehTP6s.js +1 -0
  39. package/dist/assets/chunk-XPW4576I-Bqbompq4.js +32 -0
  40. package/dist/assets/chunk-YZCP3GAM-HIMez9pG.js +1 -0
  41. package/dist/assets/chunk-ZZ45TVLE-DRIE_0bu.js +1 -0
  42. package/dist/assets/classDiagram-6PBFFD2Q-BawhEeUl.js +1 -0
  43. package/dist/assets/classDiagram-v2-HSJHXN6E-CLNjgH9n.js +1 -0
  44. package/dist/assets/clone-BBjvuERA.js +1 -0
  45. package/dist/assets/cose-bilkent-S5V4N54A-q90QeGKv.js +1 -0
  46. package/dist/assets/cytoscape.esm-BfXff3fb.js +321 -0
  47. package/dist/assets/dagre-Dxbob2Lr.js +1 -0
  48. package/dist/assets/dagre-KV5264BT-BuvpNxMw.js +4 -0
  49. package/dist/assets/defaultLocale-BwmRmqJp.js +1 -0
  50. package/dist/assets/diagram-5BDNPKRD-DQLsxwwt.js +10 -0
  51. package/dist/assets/diagram-G4DWMVQ6-Jv9Eefw4.js +24 -0
  52. package/dist/assets/diagram-MMDJMWI5-D-0YgNhU.js +43 -0
  53. package/dist/assets/diagram-TYMM5635-BHwO7zQG.js +24 -0
  54. package/dist/assets/dist-BNz65Ibc.js +1 -0
  55. package/dist/assets/erDiagram-SMLLAGMA-BjZGGBJz.js +85 -0
  56. package/dist/assets/flowDiagram-DWJPFMVM-CFbFUm_m.js +162 -0
  57. package/dist/assets/ganttDiagram-T4ZO3ILL-CXk4TcBi.js +292 -0
  58. package/dist/assets/gitGraph-7Q5UKJZL-BGFRt2qs.js +1 -0
  59. package/dist/assets/gitGraphDiagram-UUTBAWPF-C8yZOxjo.js +106 -0
  60. package/dist/assets/graphlib-DGcD9J2L.js +1 -0
  61. package/dist/assets/index-D-m0LiFI.js +14 -0
  62. package/dist/assets/index-DANHO6J0.css +2 -0
  63. package/dist/assets/info-OMHHGYJF-DI6-Z9vh.js +1 -0
  64. package/dist/assets/infoDiagram-42DDH7IO-p-PXDra2.js +2 -0
  65. package/dist/assets/init-TPm5RB77.js +1 -0
  66. package/dist/assets/isArrayLikeObject-69BLnVNM.js +1 -0
  67. package/dist/assets/isEmpty-DUS28g5f.js +1 -0
  68. package/dist/assets/ishikawaDiagram-UXIWVN3A-BrIoEvtb.js +70 -0
  69. package/dist/assets/journeyDiagram-VCZTEJTY-aZpvKa9g.js +139 -0
  70. package/dist/assets/kanban-definition-6JOO6SKY-CoOAY9ji.js +89 -0
  71. package/dist/assets/katex-5SGEXwpi.js +261 -0
  72. package/dist/assets/line-4MF1lR4d.js +1 -0
  73. package/dist/assets/linear-CXMqTN8N.js +1 -0
  74. package/dist/assets/mermaid-config-C8a4L22x.js +1 -0
  75. package/dist/assets/mermaid-parser.core-DREsY2u4.js +4 -0
  76. package/dist/assets/mermaid.core-8ysLpTJi.js +11 -0
  77. package/dist/assets/mindmap-definition-QFDTVHPH-CsqUJCMn.js +96 -0
  78. package/dist/assets/ordinal-D7l-8DAO.js +1 -0
  79. package/dist/assets/packet-4T2RLAQJ-DidW3JFc.js +1 -0
  80. package/dist/assets/path-BVpCanzE.js +1 -0
  81. package/dist/assets/pie-ZZUOXDRM-Bff2e5hg.js +1 -0
  82. package/dist/assets/pieDiagram-DEJITSTG-k0Br4NDS.js +30 -0
  83. package/dist/assets/quadrantDiagram-34T5L4WZ-Be9oCSza.js +7 -0
  84. package/dist/assets/radar-PYXPWWZC-CsdZBH3M.js +1 -0
  85. package/dist/assets/requirementDiagram-MS252O5E-8ECT7dEs.js +84 -0
  86. package/dist/assets/rough.esm-BoTisKeL.js +1 -0
  87. package/dist/assets/sankeyDiagram-XADWPNL6-CoKpeJJ0.js +10 -0
  88. package/dist/assets/sequenceDiagram-FGHM5R23-BTT2fFxG.js +157 -0
  89. package/dist/assets/src-CrmkjRpa.js +1 -0
  90. package/dist/assets/stateDiagram-FHFEXIEX-CIF47NYe.js +1 -0
  91. package/dist/assets/stateDiagram-v2-QKLJ7IA2-Cy1rmPfG.js +1 -0
  92. package/dist/assets/timeline-definition-GMOUNBTQ-Bes4B58n.js +120 -0
  93. package/dist/assets/treeView-SZITEDCU-DPKseaET.js +1 -0
  94. package/dist/assets/treemap-W4RFUUIX-DH-7GZe_.js +1 -0
  95. package/dist/assets/vennDiagram-DHZGUBPP-3wx2huKk.js +34 -0
  96. package/dist/assets/wardley-RL74JXVD-AgyXyBN5.js +1 -0
  97. package/dist/assets/wardleyDiagram-NUSXRM2D-DzViT1Yx.js +20 -0
  98. package/dist/assets/xychartDiagram-5P7HB3ND-BO_dbU0r.js +7 -0
  99. package/{index.html → dist/index.html} +2 -1
  100. package/dist/index.js +2625 -0
  101. package/package.json +11 -1
  102. package/.agents/skills/remotion-best-practices/SKILL.md +0 -61
  103. package/.agents/skills/remotion-best-practices/rules/3d.md +0 -86
  104. package/.agents/skills/remotion-best-practices/rules/animations.md +0 -27
  105. package/.agents/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +0 -178
  106. package/.agents/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +0 -100
  107. package/.agents/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +0 -108
  108. package/.agents/skills/remotion-best-practices/rules/assets.md +0 -78
  109. package/.agents/skills/remotion-best-practices/rules/audio-visualization.md +0 -198
  110. package/.agents/skills/remotion-best-practices/rules/audio.md +0 -169
  111. package/.agents/skills/remotion-best-practices/rules/calculate-metadata.md +0 -134
  112. package/.agents/skills/remotion-best-practices/rules/can-decode.md +0 -75
  113. package/.agents/skills/remotion-best-practices/rules/charts.md +0 -120
  114. package/.agents/skills/remotion-best-practices/rules/compositions.md +0 -154
  115. package/.agents/skills/remotion-best-practices/rules/display-captions.md +0 -184
  116. package/.agents/skills/remotion-best-practices/rules/extract-frames.md +0 -229
  117. package/.agents/skills/remotion-best-practices/rules/ffmpeg.md +0 -38
  118. package/.agents/skills/remotion-best-practices/rules/fonts.md +0 -152
  119. package/.agents/skills/remotion-best-practices/rules/get-audio-duration.md +0 -58
  120. package/.agents/skills/remotion-best-practices/rules/get-video-dimensions.md +0 -68
  121. package/.agents/skills/remotion-best-practices/rules/get-video-duration.md +0 -60
  122. package/.agents/skills/remotion-best-practices/rules/gifs.md +0 -141
  123. package/.agents/skills/remotion-best-practices/rules/images.md +0 -134
  124. package/.agents/skills/remotion-best-practices/rules/import-srt-captions.md +0 -69
  125. package/.agents/skills/remotion-best-practices/rules/light-leaks.md +0 -73
  126. package/.agents/skills/remotion-best-practices/rules/lottie.md +0 -70
  127. package/.agents/skills/remotion-best-practices/rules/maps.md +0 -412
  128. package/.agents/skills/remotion-best-practices/rules/measuring-dom-nodes.md +0 -34
  129. package/.agents/skills/remotion-best-practices/rules/measuring-text.md +0 -140
  130. package/.agents/skills/remotion-best-practices/rules/parameters.md +0 -109
  131. package/.agents/skills/remotion-best-practices/rules/sequencing.md +0 -118
  132. package/.agents/skills/remotion-best-practices/rules/sfx.md +0 -26
  133. package/.agents/skills/remotion-best-practices/rules/subtitles.md +0 -36
  134. package/.agents/skills/remotion-best-practices/rules/tailwind.md +0 -11
  135. package/.agents/skills/remotion-best-practices/rules/text-animations.md +0 -20
  136. package/.agents/skills/remotion-best-practices/rules/timing.md +0 -179
  137. package/.agents/skills/remotion-best-practices/rules/transcribe-captions.md +0 -70
  138. package/.agents/skills/remotion-best-practices/rules/transitions.md +0 -197
  139. package/.agents/skills/remotion-best-practices/rules/transparent-videos.md +0 -106
  140. package/.agents/skills/remotion-best-practices/rules/trimming.md +0 -51
  141. package/.agents/skills/remotion-best-practices/rules/videos.md +0 -171
  142. package/.agents/skills/remotion-best-practices/rules/voiceover.md +0 -99
  143. package/.agents/skills/simple/SKILL.md +0 -52
  144. package/.agents/skills/vercel-react-best-practices/AGENTS.md +0 -3254
  145. package/.agents/skills/vercel-react-best-practices/README.md +0 -123
  146. package/.agents/skills/vercel-react-best-practices/SKILL.md +0 -141
  147. package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  148. package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  149. package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  150. package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  151. package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
  152. package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  153. package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  154. package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  155. package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
  156. package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  157. package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  158. package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  159. package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  160. package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  161. package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  162. package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  163. package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  164. package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  165. package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  166. package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  167. package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  168. package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  169. package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  170. package/.agents/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
  171. package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  172. package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  173. package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  174. package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  175. package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  176. package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  177. package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  178. package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  179. package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  180. package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  181. package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  182. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  183. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  184. package/.agents/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
  185. package/.agents/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
  186. package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  187. package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  188. package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  189. package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  190. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  191. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  192. package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  193. package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  194. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  195. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  196. package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  197. package/.agents/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
  198. package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  199. package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  200. package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  201. package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  202. package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  203. package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  204. package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  205. package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  206. package/.agents/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -142
  207. package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  208. package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  209. package/.claude/CLAUDE.md +0 -184
  210. package/.claude/commands/review.md +0 -120
  211. package/.claude/commands/sync-docs.md +0 -71
  212. package/.claude/roadmap.md +0 -121
  213. package/.claude/rules/style-guide.md +0 -830
  214. package/.claude/settings.json +0 -18
  215. package/.claude/user-stories.md +0 -333
  216. package/AGENTS.md +0 -68
  217. package/Makefile +0 -32
  218. package/biome.json +0 -79
  219. package/bun.lock +0 -854
  220. package/bunfig.toml +0 -2
  221. package/docs/design.md +0 -563
  222. package/docs/perf-baseline.md +0 -130
  223. package/docs/plans/2026-03-13-client-mode-design.md +0 -86
  224. package/docs/plans/2026-03-13-client-mode-plan.md +0 -605
  225. package/docs/plans/2026-03-13-keyboard-shortcuts-design.md +0 -129
  226. package/docs/plans/2026-03-13-keyboard-shortcuts-plan.md +0 -1471
  227. package/docs/plans/2026-03-13-multi-document-design.md +0 -183
  228. package/docs/plans/2026-03-13-performance-benchmarks-design.md +0 -121
  229. package/docs/superpowers/plans/2026-03-26-surgical-pruning.md +0 -1176
  230. package/docs/superpowers/specs/2026-03-27-go-server-rewrite-design.md +0 -284
  231. package/e2e/comments.spec.ts +0 -81
  232. package/e2e/document-load.spec.ts +0 -32
  233. package/e2e/export.spec.ts +0 -58
  234. package/e2e/fixtures/sample.md +0 -7
  235. package/e2e/perf/add-comment.spec.ts +0 -116
  236. package/e2e/perf/fixtures/generate.ts +0 -327
  237. package/e2e/perf/initial-load.spec.ts +0 -49
  238. package/e2e/perf/perf.setup.ts +0 -23
  239. package/e2e/perf/perf.teardown.ts +0 -9
  240. package/e2e/perf/screenshot-final.png +0 -0
  241. package/e2e/perf/scroll.spec.ts +0 -39
  242. package/e2e/perf/tab-switch.spec.ts +0 -69
  243. package/e2e/perf/text-selection.spec.ts +0 -119
  244. package/e2e/perf/utils/metrics.ts +0 -350
  245. package/e2e/perf/utils/perf-cli.ts +0 -86
  246. package/e2e/persistence-file.spec.ts +0 -357
  247. package/e2e/utils/cli.ts +0 -84
  248. package/e2e/utils/selection.ts +0 -79
  249. package/go/cmd/readit/main.go +0 -416
  250. package/go/go.mod +0 -20
  251. package/go/go.sum +0 -41
  252. package/go/internal/server/anchor.go +0 -302
  253. package/go/internal/server/anchor_test.go +0 -111
  254. package/go/internal/server/comments.go +0 -390
  255. package/go/internal/server/documents.go +0 -113
  256. package/go/internal/server/embed.go +0 -17
  257. package/go/internal/server/headings.go +0 -33
  258. package/go/internal/server/headings_test.go +0 -75
  259. package/go/internal/server/htmltext.go +0 -123
  260. package/go/internal/server/markdown.go +0 -157
  261. package/go/internal/server/markdown_bench_test.go +0 -42
  262. package/go/internal/server/markdown_test.go +0 -79
  263. package/go/internal/server/server.go +0 -453
  264. package/go/internal/server/server_bench_test.go +0 -122
  265. package/go/internal/server/settings.go +0 -110
  266. package/go/internal/server/sse.go +0 -140
  267. package/go/internal/server/storage.go +0 -275
  268. package/go/internal/server/storage_test.go +0 -152
  269. package/go/internal/server/template.go +0 -66
  270. package/go/internal/server/types.go +0 -101
  271. package/go/internal/server/watcher.go +0 -74
  272. package/lefthook.yml +0 -8
  273. package/nvim-readit/lua/readit/health.lua +0 -64
  274. package/nvim-readit/lua/readit/init.lua +0 -463
  275. package/nvim-readit/plugin/readit.lua +0 -19
  276. package/playwright.config.ts +0 -34
  277. package/skills-lock.json +0 -20
  278. package/src/App.svelte +0 -890
  279. package/src/cli.ts +0 -881
  280. package/src/components/ActionsMenu.svelte +0 -95
  281. package/src/components/CommentBadge.svelte +0 -67
  282. package/src/components/CommentErrorBanner.svelte +0 -33
  283. package/src/components/CommentInput.svelte +0 -75
  284. package/src/components/CommentListItem.svelte +0 -95
  285. package/src/components/CommentManager.svelte +0 -129
  286. package/src/components/CommentNav.svelte +0 -109
  287. package/src/components/DocumentViewer.svelte +0 -233
  288. package/src/components/FloatingComment.svelte +0 -107
  289. package/src/components/Header.svelte +0 -76
  290. package/src/components/InlineEditor.svelte +0 -72
  291. package/src/components/MarginNote.svelte +0 -167
  292. package/src/components/MarginNotesContainer.svelte +0 -33
  293. package/src/components/MermaidEnhancer.svelte +0 -218
  294. package/src/components/MermaidModal.svelte +0 -67
  295. package/src/components/RawModal.svelte +0 -126
  296. package/src/components/ReanchorConfirm.svelte +0 -30
  297. package/src/components/SettingsModal.svelte +0 -220
  298. package/src/components/ShortcutCapture.svelte +0 -82
  299. package/src/components/ShortcutList.svelte +0 -145
  300. package/src/components/TabBar.svelte +0 -52
  301. package/src/components/TableOfContents.svelte +0 -125
  302. package/src/components/ui/ActionLink.svelte +0 -40
  303. package/src/components/ui/Button.svelte +0 -53
  304. package/src/components/ui/Dialog.svelte +0 -97
  305. package/src/components/ui/DropdownMenu.svelte +0 -85
  306. package/src/components/ui/DropdownMenuItem.svelte +0 -38
  307. package/src/components/ui/DropdownMenuSeparator.svelte +0 -11
  308. package/src/components/ui/Text.svelte +0 -42
  309. package/src/env.d.ts +0 -6
  310. package/src/index.css +0 -859
  311. package/src/lib/__fixtures__/bench-data.ts +0 -114
  312. package/src/lib/anchor.bench.ts +0 -91
  313. package/src/lib/anchor.test.ts +0 -527
  314. package/src/lib/anchor.ts +0 -381
  315. package/src/lib/comment-storage.bench.ts +0 -49
  316. package/src/lib/comment-storage.test.ts +0 -694
  317. package/src/lib/comment-storage.ts +0 -226
  318. package/src/lib/export.bench.ts +0 -21
  319. package/src/lib/export.ts +0 -36
  320. package/src/lib/fetch-or-throw.test.ts +0 -59
  321. package/src/lib/fetch-or-throw.ts +0 -12
  322. package/src/lib/headings.test.ts +0 -103
  323. package/src/lib/headings.ts +0 -44
  324. package/src/lib/highlight/core.test.ts +0 -93
  325. package/src/lib/highlight/dom.ts +0 -187
  326. package/src/lib/highlight/highlight-registry.ts +0 -221
  327. package/src/lib/highlight/highlight.bench.ts +0 -92
  328. package/src/lib/highlight/highlighter.ts +0 -247
  329. package/src/lib/highlight/resolver.ts +0 -38
  330. package/src/lib/highlight/types.ts +0 -17
  331. package/src/lib/html-text.test.ts +0 -162
  332. package/src/lib/html-text.ts +0 -161
  333. package/src/lib/i18n/en.ts +0 -124
  334. package/src/lib/i18n/index.ts +0 -3
  335. package/src/lib/i18n/ja.ts +0 -126
  336. package/src/lib/i18n/translations.ts +0 -27
  337. package/src/lib/i18n/types.ts +0 -130
  338. package/src/lib/key-lock.test.ts +0 -104
  339. package/src/lib/key-lock.ts +0 -23
  340. package/src/lib/margin-layout.bench.ts +0 -61
  341. package/src/lib/margin-layout.ts +0 -71
  342. package/src/lib/markdown-renderer.test.ts +0 -154
  343. package/src/lib/markdown-renderer.ts +0 -178
  344. package/src/lib/mermaid-config.ts +0 -38
  345. package/src/lib/mermaid-renderer.ts +0 -162
  346. package/src/lib/mermaid-worker.ts +0 -60
  347. package/src/lib/positions.ts +0 -157
  348. package/src/lib/shortcut-registry.ts +0 -244
  349. package/src/lib/utils.ts +0 -15
  350. package/src/main.ts +0 -16
  351. package/src/schema.ts +0 -92
  352. package/src/server.ts +0 -1216
  353. package/src/stores/app.svelte.ts +0 -231
  354. package/src/stores/locale.svelte.ts +0 -46
  355. package/src/stores/settings.svelte.ts +0 -90
  356. package/src/stores/shortcuts.svelte.ts +0 -104
  357. package/src/stores/ui.svelte.ts +0 -12
  358. package/src/template.ts +0 -104
  359. package/src/test-setup.ts +0 -48
  360. package/svelte.config.js +0 -5
  361. package/test.md +0 -74
  362. package/tsconfig.cli.json +0 -12
  363. package/tsconfig.json +0 -20
  364. package/vite.config.ts +0 -47
  365. package/vitest.config.ts +0 -15
  366. package/vscode-readit/.mcp.json +0 -7
  367. package/vscode-readit/.vscodeignore +0 -7
  368. package/vscode-readit/bun.lock +0 -78
  369. package/vscode-readit/icon.svg +0 -10
  370. package/vscode-readit/package.json +0 -110
  371. package/vscode-readit/src/extension.ts +0 -117
  372. package/vscode-readit/src/server-manager.ts +0 -272
  373. package/vscode-readit/src/webview-provider.ts +0 -204
  374. package/vscode-readit/tsconfig.json +0 -20
@@ -1,101 +0,0 @@
1
- package server
2
-
3
- type Comment struct {
4
- ID string `json:"id"`
5
- SelectedText string `json:"selectedText"`
6
- Comment string `json:"comment"`
7
- CreatedAt string `json:"createdAt"`
8
- StartOffset int `json:"startOffset"`
9
- EndOffset int `json:"endOffset"`
10
- LineHint string `json:"lineHint,omitempty"`
11
- AnchorConfidence string `json:"anchorConfidence,omitempty"`
12
- AnchorPrefix string `json:"anchorPrefix,omitempty"`
13
- }
14
-
15
- type Heading struct {
16
- ID string `json:"id"`
17
- Text string `json:"text"`
18
- Level int `json:"level"`
19
- }
20
-
21
- type FileState struct {
22
- FilePath string
23
- FileName string
24
- Content []byte
25
- RenderedHTML string
26
- Headings []Heading
27
- IsLoaded bool
28
- }
29
-
30
- type ShortcutBinding struct {
31
- Key string `json:"key"`
32
- Alt bool `json:"alt,omitempty"`
33
- Ctrl bool `json:"ctrl,omitempty"`
34
- Meta bool `json:"meta,omitempty"`
35
- Shift bool `json:"shift,omitempty"`
36
- }
37
-
38
- type Keybinding struct {
39
- ID string `json:"id"`
40
- Binding *ShortcutBinding `json:"binding,omitempty"`
41
- Enabled bool `json:"enabled"`
42
- }
43
-
44
- type Settings struct {
45
- Version int `json:"version"`
46
- FontFamily string `json:"fontFamily"`
47
- Keybindings []Keybinding `json:"keybindings,omitempty"`
48
- }
49
-
50
- type CommentFile struct {
51
- Source string
52
- Hash string
53
- Version int
54
- Comments []Comment
55
- }
56
-
57
- type InlineData struct {
58
- Files []FileRef `json:"files"`
59
- ActiveFile string `json:"activeFile"`
60
- Clean bool `json:"clean"`
61
- WorkingDir string `json:"workingDirectory"`
62
- Documents map[string]InlineDocData `json:"documents"`
63
- Settings Settings `json:"settings"`
64
- }
65
-
66
- type FileRef struct {
67
- Path string `json:"path"`
68
- FileName string `json:"fileName"`
69
- }
70
-
71
- type InlineDocData struct {
72
- Headings []Heading `json:"headings"`
73
- Comments []Comment `json:"comments"`
74
- }
75
-
76
- const (
77
- AnchorExact = "exact"
78
- AnchorNormalized = "normalized"
79
- AnchorFuzzy = "fuzzy"
80
- AnchorUnresolved = "unresolved"
81
- )
82
-
83
- const (
84
- FontSerif = "serif"
85
- FontSansSerif = "sans-serif"
86
- )
87
-
88
- const (
89
- FormatVersion = 1
90
- HashLength = 16
91
- MaxSelectionLength = 1000
92
- TruncationMarker = "\n...\n"
93
- AnchorPrefixLength = 200
94
- )
95
-
96
- const (
97
- DefaultSearchWindow = 500
98
- DefaultFuzzyThreshold = 5
99
- MaxFuzzyTextLength = 200
100
- FuzzySearchWindow = 2000
101
- )
@@ -1,74 +0,0 @@
1
- package server
2
-
3
- import (
4
- "sync"
5
- "time"
6
-
7
- "github.com/fsnotify/fsnotify"
8
- )
9
-
10
- type Watcher struct {
11
- fsWatcher *fsnotify.Watcher
12
- debounce map[string]*time.Timer
13
- onChange func(filePath string)
14
- mu sync.Mutex
15
- done chan struct{}
16
- }
17
-
18
- func NewWatcher(onChange func(string)) (*Watcher, error) {
19
- fsw, err := fsnotify.NewWatcher()
20
- if err != nil {
21
- return nil, err
22
- }
23
-
24
- w := &Watcher{
25
- fsWatcher: fsw,
26
- debounce: make(map[string]*time.Timer),
27
- onChange: onChange,
28
- done: make(chan struct{}),
29
- }
30
-
31
- go w.loop()
32
- return w, nil
33
- }
34
-
35
- func (w *Watcher) loop() {
36
- for {
37
- select {
38
- case event, ok := <-w.fsWatcher.Events:
39
- if !ok {
40
- return
41
- }
42
- if event.Has(fsnotify.Write) || event.Has(fsnotify.Create) {
43
- w.debounceChange(event.Name)
44
- }
45
- case _, ok := <-w.fsWatcher.Errors:
46
- if !ok {
47
- return
48
- }
49
- case <-w.done:
50
- return
51
- }
52
- }
53
- }
54
-
55
- func (w *Watcher) debounceChange(path string) {
56
- w.mu.Lock()
57
- defer w.mu.Unlock()
58
-
59
- if t, ok := w.debounce[path]; ok {
60
- t.Stop()
61
- }
62
- w.debounce[path] = time.AfterFunc(100*time.Millisecond, func() {
63
- w.onChange(path)
64
- })
65
- }
66
-
67
- func (w *Watcher) Add(path string) error {
68
- return w.fsWatcher.Add(path)
69
- }
70
-
71
- func (w *Watcher) Close() {
72
- close(w.done)
73
- _ = w.fsWatcher.Close()
74
- }
package/lefthook.yml DELETED
@@ -1,8 +0,0 @@
1
- pre-commit:
2
- parallel: true
3
- commands:
4
- check:
5
- glob: "*.{ts,tsx,json}"
6
- run: bunx biome check --no-errors-on-unmatched {staged_files}
7
- typecheck:
8
- run: bun run typecheck
@@ -1,64 +0,0 @@
1
- -- Health check for readit.nvim
2
- -- Run with :checkhealth readit
3
-
4
- local M = {}
5
-
6
- function M.check()
7
- vim.health.start("readit.nvim")
8
-
9
- -- Check bun
10
- local readit = require("readit")
11
- local bun_path = readit.config.bun_path or "bun"
12
- local bun_exec = vim.fn.exepath(bun_path)
13
-
14
- if bun_exec ~= "" then
15
- local version = vim.fn.system(bun_path .. " --version")
16
- vim.health.ok("bun found: " .. vim.trim(version) .. " (" .. bun_exec .. ")")
17
- else
18
- vim.health.error(
19
- "bun not found",
20
- { "Install Bun: https://bun.sh", "Or set bun_path in setup()" }
21
- )
22
- end
23
-
24
- -- Check readit CLI
25
- local readit_exec = vim.fn.exepath("readit")
26
- if readit_exec ~= "" then
27
- vim.health.ok("readit CLI found: " .. readit_exec)
28
- else
29
- local dist = vim.fn.expand("~/.readit/dist/index.js")
30
- if vim.fn.filereadable(dist) == 1 then
31
- vim.health.ok("readit dist found: " .. dist)
32
- else
33
- vim.health.warn(
34
- "readit CLI not in PATH",
35
- { "Install: npm install -g @peaske7/readit", "Or: bun add -g @peaske7/readit" }
36
- )
37
- end
38
- end
39
-
40
- -- Check curl (needed for server communication)
41
- if vim.fn.exepath("curl") ~= "" then
42
- vim.health.ok("curl found")
43
- else
44
- vim.health.error("curl not found (required for server API calls)")
45
- end
46
-
47
- -- Check server status
48
- if readit._server_port then
49
- vim.health.ok("Server running on port " .. readit._server_port)
50
- else
51
- vim.health.info("Server not running (will start on :ReaditOpen)")
52
- end
53
-
54
- -- Check for comments directory
55
- local comments_dir = vim.fn.expand("~/.readit/comments")
56
- if vim.fn.isdirectory(comments_dir) == 1 then
57
- local count = #vim.fn.glob(comments_dir .. "/**/*.comments.md", false, true)
58
- vim.health.ok("Comments directory exists (" .. count .. " comment files)")
59
- else
60
- vim.health.info("No comments directory yet (~/.readit/comments/)")
61
- end
62
- end
63
-
64
- return M
@@ -1,463 +0,0 @@
1
- -- readit.nvim — Neovim plugin for rendering Markdown with readit
2
- --
3
- -- Manages a readit server process and opens documents in the browser
4
- -- or a split terminal. Supports live-reload: edits in Neovim are
5
- -- reflected in the browser automatically (via readit's file watcher).
6
-
7
- local M = {}
8
-
9
- --- @class ReaditConfig
10
- --- @field bun_path string Path to bun executable
11
- --- @field port number Preferred server port (0 = auto)
12
- --- @field host string Server host
13
- --- @field auto_open boolean Open browser automatically
14
- --- @field auto_reload boolean Auto-reload on BufWritePost (enabled by default via readit's fs watcher)
15
- --- @field open_cmd string|nil Custom browser open command
16
- --- @field keymap_prefix string Key prefix for mappings
17
- --- @field keymaps table<string, string|false> Keymap overrides (false to disable)
18
- --- @field float_opts table Floating window options for terminal
19
-
20
- --- @type ReaditConfig
21
- M.config = {
22
- bun_path = "bun",
23
- port = 0,
24
- host = "127.0.0.1",
25
- auto_open = true,
26
- auto_reload = true,
27
- open_cmd = nil,
28
- keymap_prefix = "<leader>r",
29
- keymaps = {
30
- open = "o", -- Open current file in readit
31
- open_side = "s", -- Open in side browser (if available)
32
- stop = "q", -- Stop the server
33
- status = "i", -- Show server status
34
- reload = "r", -- Force reload in browser
35
- list = "l", -- List commented files
36
- },
37
- float_opts = {
38
- relative = "editor",
39
- width = 0.8,
40
- height = 0.8,
41
- border = "rounded",
42
- },
43
- }
44
-
45
- --- @type number|nil
46
- M._server_port = nil
47
- --- @type number|nil
48
- M._server_job_id = nil
49
- --- @type table<string, boolean>
50
- M._attached_files = {}
51
-
52
- -- ── Setup ────────────────────────────────────────────────────────────
53
-
54
- --- Setup the plugin with user configuration
55
- --- @param opts? ReaditConfig
56
- --- @type boolean
57
- M._setup_done = false
58
-
59
- function M.setup(opts)
60
- M.config = vim.tbl_deep_extend("force", M.config, opts or {})
61
- M._setup_commands()
62
- M._setup_keymaps()
63
- M._setup_autocmds()
64
- M._setup_done = true
65
- end
66
-
67
- -- ── Server Management ────────────────────────────────────────────────
68
-
69
- --- Discover an already-running readit server from ~/.readit/server.json
70
- --- @return {port: number, pid: number}|nil
71
- function M._discover_server()
72
- local path = vim.fn.expand("~/.readit/server.json")
73
- local ok, content = pcall(vim.fn.readfile, path)
74
- if not ok or #content == 0 then
75
- return nil
76
- end
77
-
78
- local decoded = vim.json.decode(table.concat(content, "\n"))
79
- if not decoded or not decoded.port or not decoded.pid then
80
- return nil
81
- end
82
-
83
- -- Check if the process is alive
84
- local alive = vim.fn.system("kill -0 " .. decoded.pid .. " 2>/dev/null; echo $?")
85
- if vim.trim(alive) ~= "0" then
86
- return nil
87
- end
88
-
89
- -- Health check
90
- local health = vim.fn.system(
91
- "curl -sf http://127.0.0.1:" .. decoded.port .. "/api/health 2>/dev/null"
92
- )
93
- if health == "" or vim.v.shell_error ~= 0 then
94
- return nil
95
- end
96
-
97
- return decoded
98
- end
99
-
100
- --- Start the readit server for a given file
101
- --- @param file_path string Absolute path to the markdown file
102
- --- @param callback? fun(port: number) Called when server is ready
103
- function M.start_server(file_path, callback)
104
- -- Check for existing server first
105
- local existing = M._discover_server()
106
- if existing then
107
- M._server_port = existing.port
108
- M._attach_file(file_path, callback)
109
- return
110
- end
111
-
112
- -- If we already have a running job, attach to it
113
- if M._server_job_id and vim.fn.jobwait({ M._server_job_id }, 0)[1] == -1 then
114
- if M._server_port then
115
- M._attach_file(file_path, callback)
116
- return
117
- end
118
- end
119
-
120
- local port = M.config.port
121
- local args = {
122
- M.config.bun_path,
123
- "run",
124
- "--bun",
125
- vim.fn.expand("~/.readit/dist/index.js"), -- Try installed version first
126
- file_path,
127
- "--no-open",
128
- }
129
-
130
- -- Check if the global dist exists; otherwise try npx
131
- if vim.fn.filereadable(vim.fn.expand("~/.readit/dist/index.js")) == 0 then
132
- -- Try to find readit in the project or globally
133
- local readit_bin = vim.fn.exepath("readit")
134
- if readit_bin ~= "" then
135
- args = { readit_bin, file_path, "--no-open" }
136
- else
137
- -- Fall back to bunx
138
- args = { M.config.bun_path .. "x", "@peaske7/readit", file_path, "--no-open" }
139
- end
140
- end
141
-
142
- if port > 0 then
143
- table.insert(args, "--port")
144
- table.insert(args, tostring(port))
145
- end
146
-
147
- vim.notify("readit: starting server...", vim.log.levels.INFO)
148
-
149
- M._server_job_id = vim.fn.jobstart(args, {
150
- on_stdout = function(_, data)
151
- for _, line in ipairs(data) do
152
- -- Parse the URL from server output
153
- local found_port = line:match("URL:%s*http://[^:]+:(%d+)")
154
- if found_port then
155
- M._server_port = tonumber(found_port)
156
- M._attached_files[file_path] = true
157
- vim.notify("readit: server ready on port " .. M._server_port, vim.log.levels.INFO)
158
- if callback then
159
- vim.schedule(function()
160
- callback(M._server_port)
161
- end)
162
- end
163
- end
164
- end
165
- end,
166
- on_stderr = function(_, data)
167
- for _, line in ipairs(data) do
168
- if line ~= "" then
169
- vim.notify("readit: " .. line, vim.log.levels.WARN)
170
- end
171
- end
172
- end,
173
- on_exit = function(_, code)
174
- M._server_job_id = nil
175
- M._server_port = nil
176
- M._attached_files = {}
177
- if code ~= 0 then
178
- vim.notify("readit: server exited with code " .. code, vim.log.levels.ERROR)
179
- end
180
- end,
181
- detach = false,
182
- })
183
-
184
- if M._server_job_id <= 0 then
185
- vim.notify("readit: failed to start server", vim.log.levels.ERROR)
186
- M._server_job_id = nil
187
- end
188
- end
189
-
190
- --- Attach a file to the running server via HTTP API
191
- --- @param file_path string
192
- --- @param callback? fun(port: number)
193
- function M._attach_file(file_path, callback)
194
- if M._attached_files[file_path] then
195
- if callback and M._server_port then
196
- callback(M._server_port)
197
- end
198
- return
199
- end
200
-
201
- if not M._server_port then
202
- vim.notify("readit: no server running", vim.log.levels.WARN)
203
- return
204
- end
205
-
206
- local cmd = string.format(
207
- 'curl -sf -X POST -H "Content-Type: application/json" -d \'{"path":"%s"}\' http://127.0.0.1:%d/api/documents 2>/dev/null',
208
- file_path:gsub("'", "'\\''"),
209
- M._server_port
210
- )
211
-
212
- vim.fn.jobstart({ "sh", "-c", cmd }, {
213
- on_exit = function(_, code)
214
- if code == 0 then
215
- M._attached_files[file_path] = true
216
- vim.schedule(function()
217
- if callback and M._server_port then
218
- callback(M._server_port)
219
- end
220
- end)
221
- else
222
- vim.schedule(function()
223
- vim.notify("readit: failed to attach file", vim.log.levels.ERROR)
224
- end)
225
- end
226
- end,
227
- })
228
- end
229
-
230
- --- Stop the readit server
231
- function M.stop_server()
232
- if M._server_job_id then
233
- vim.fn.jobstop(M._server_job_id)
234
- M._server_job_id = nil
235
- M._server_port = nil
236
- M._attached_files = {}
237
- vim.notify("readit: server stopped", vim.log.levels.INFO)
238
- else
239
- vim.notify("readit: no server running", vim.log.levels.INFO)
240
- end
241
- end
242
-
243
- --- Get server status info
244
- --- @return string
245
- function M.server_status()
246
- if M._server_port then
247
- local files = vim.tbl_keys(M._attached_files)
248
- return string.format(
249
- "readit server running on port %d (%d file%s)",
250
- M._server_port,
251
- #files,
252
- #files == 1 and "" or "s"
253
- )
254
- end
255
- return "readit server not running"
256
- end
257
-
258
- -- ── Actions ──────────────────────────────────────────────────────────
259
-
260
- --- Open the current markdown buffer in readit
261
- --- @param opts? {browser?: boolean}
262
- function M.open(opts)
263
- opts = opts or { browser = true }
264
- local bufname = vim.api.nvim_buf_get_name(0)
265
-
266
- if bufname == "" then
267
- vim.notify("readit: buffer has no file", vim.log.levels.WARN)
268
- return
269
- end
270
-
271
- if not bufname:match("%.md$") and not bufname:match("%.markdown$") then
272
- vim.notify("readit: not a markdown file", vim.log.levels.WARN)
273
- return
274
- end
275
-
276
- -- Save the buffer first to ensure file watcher picks up latest
277
- if vim.bo.modified then
278
- vim.cmd("write")
279
- end
280
-
281
- local file_path = vim.fn.fnamemodify(bufname, ":p")
282
-
283
- M.start_server(file_path, function(port)
284
- if opts.browser and M.config.auto_open then
285
- M._open_browser(port)
286
- end
287
- end)
288
- end
289
-
290
- --- Open the browser to the readit server
291
- --- @param port number
292
- function M._open_browser(port)
293
- local url = "http://" .. M.config.host .. ":" .. port
294
-
295
- if M.config.open_cmd then
296
- vim.fn.system(M.config.open_cmd .. " " .. vim.fn.shellescape(url))
297
- return
298
- end
299
-
300
- -- Platform-specific open
301
- local open_cmd
302
- if vim.fn.has("mac") == 1 then
303
- open_cmd = "open"
304
- elseif vim.fn.has("unix") == 1 then
305
- open_cmd = "xdg-open"
306
- elseif vim.fn.has("win32") == 1 then
307
- open_cmd = "start"
308
- end
309
-
310
- if open_cmd then
311
- vim.fn.jobstart({ open_cmd, url }, { detach = true })
312
- end
313
- end
314
-
315
- --- Force reload the current document in the browser
316
- function M.reload()
317
- if not M._server_port then
318
- vim.notify("readit: no server running", vim.log.levels.WARN)
319
- return
320
- end
321
-
322
- -- Save first so the file watcher triggers reload
323
- if vim.bo.modified then
324
- vim.cmd("write")
325
- end
326
-
327
- vim.notify("readit: document will reload via file watcher", vim.log.levels.INFO)
328
- end
329
-
330
- --- List files with comments (in a floating window)
331
- function M.list_comments()
332
- local comments_dir = vim.fn.expand("~/.readit/comments")
333
- if vim.fn.isdirectory(comments_dir) == 0 then
334
- vim.notify("readit: no comments found", vim.log.levels.INFO)
335
- return
336
- end
337
-
338
- local cmd = string.format(
339
- "grep -rh '^source:' %s 2>/dev/null | sed 's/^source: *//' | sort -u",
340
- vim.fn.shellescape(comments_dir)
341
- )
342
- local result = vim.fn.system(cmd)
343
- local files = vim.split(vim.trim(result), "\n", { trimempty = true })
344
-
345
- if #files == 0 then
346
- vim.notify("readit: no comments found", vim.log.levels.INFO)
347
- return
348
- end
349
-
350
- vim.ui.select(files, {
351
- prompt = "readit: files with comments",
352
- format_item = function(item)
353
- return vim.fn.fnamemodify(item, ":~:.")
354
- end,
355
- }, function(choice)
356
- if choice then
357
- vim.cmd("edit " .. vim.fn.fnameescape(choice))
358
- M.open()
359
- end
360
- end)
361
- end
362
-
363
- -- ── Commands ─────────────────────────────────────────────────────────
364
-
365
- function M._setup_commands()
366
- vim.api.nvim_create_user_command("ReaditOpen", function()
367
- M.open()
368
- end, { desc = "Open current markdown file in readit" })
369
-
370
- vim.api.nvim_create_user_command("ReaditStop", function()
371
- M.stop_server()
372
- end, { desc = "Stop the readit server" })
373
-
374
- vim.api.nvim_create_user_command("ReaditStatus", function()
375
- vim.notify(M.server_status(), vim.log.levels.INFO)
376
- end, { desc = "Show readit server status" })
377
-
378
- vim.api.nvim_create_user_command("ReaditReload", function()
379
- M.reload()
380
- end, { desc = "Reload current document in readit" })
381
-
382
- vim.api.nvim_create_user_command("ReaditList", function()
383
- M.list_comments()
384
- end, { desc = "List files with readit comments" })
385
-
386
- vim.api.nvim_create_user_command("ReaditOpenFile", function(cmd_opts)
387
- local file = cmd_opts.args
388
- if file == "" then
389
- vim.notify("readit: specify a file path", vim.log.levels.WARN)
390
- return
391
- end
392
- local abs = vim.fn.fnamemodify(file, ":p")
393
- M.start_server(abs, function(port)
394
- if M.config.auto_open then
395
- M._open_browser(port)
396
- end
397
- end)
398
- end, {
399
- nargs = 1,
400
- complete = function(_, cmd_line, _)
401
- -- Complete markdown files
402
- local files = vim.fn.glob("**/*.md", false, true)
403
- local markdown_files = vim.fn.glob("**/*.markdown", false, true)
404
- vim.list_extend(files, markdown_files)
405
- return files
406
- end,
407
- desc = "Open a specific file in readit",
408
- })
409
- end
410
-
411
- -- ── Keymaps ──────────────────────────────────────────────────────────
412
-
413
- function M._setup_keymaps()
414
- local prefix = M.config.keymap_prefix
415
- local maps = M.config.keymaps
416
-
417
- local function map(suffix, action, desc)
418
- if suffix == false then
419
- return
420
- end
421
- vim.keymap.set("n", prefix .. suffix, action, {
422
- desc = "readit: " .. desc,
423
- silent = true,
424
- })
425
- end
426
-
427
- if maps.open then
428
- map(maps.open, function() M.open() end, "Open in readit")
429
- end
430
- if maps.open_side then
431
- map(maps.open_side, function() M.open({ browser = true }) end, "Open in browser")
432
- end
433
- if maps.stop then
434
- map(maps.stop, function() M.stop_server() end, "Stop server")
435
- end
436
- if maps.status then
437
- map(maps.status, function() vim.notify(M.server_status()) end, "Server status")
438
- end
439
- if maps.reload then
440
- map(maps.reload, function() M.reload() end, "Reload document")
441
- end
442
- if maps.list then
443
- map(maps.list, function() M.list_comments() end, "List commented files")
444
- end
445
- end
446
-
447
- -- ── Autocommands ─────────────────────────────────────────────────────
448
-
449
- function M._setup_autocmds()
450
- local group = vim.api.nvim_create_augroup("readit", { clear = true })
451
-
452
- -- Clean up server on Neovim exit
453
- vim.api.nvim_create_autocmd("VimLeavePre", {
454
- group = group,
455
- callback = function()
456
- if M._server_job_id then
457
- vim.fn.jobstop(M._server_job_id)
458
- end
459
- end,
460
- })
461
- end
462
-
463
- return M