@peaske7/readit 0.2.1 → 0.3.0-rc.1

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 (367) hide show
  1. package/dist/.vite/manifest.json +1111 -0
  2. package/dist/assets/_basePickBy-BMMA4Tou.js +1 -0
  3. package/dist/assets/_baseUniq-D40qku1I.js +1 -0
  4. package/dist/assets/arc-Ckg65iy8.js +1 -0
  5. package/dist/assets/architecture-YZFGNWBL-Dv3EY0zV.js +1 -0
  6. package/dist/assets/architectureDiagram-Q4EWVU46-ClRss4cm.js +36 -0
  7. package/dist/assets/array-Bjz-wYpJ.js +1 -0
  8. package/dist/assets/blockDiagram-DXYQGD6D-CBcFvoK1.js +132 -0
  9. package/dist/assets/c4Diagram-AHTNJAMY-D4d3ZLam.js +10 -0
  10. package/dist/assets/channel-D9EJxDy_.js +1 -0
  11. package/dist/assets/chunk-2KRD3SAO-DaFfaCGO.js +1 -0
  12. package/dist/assets/chunk-336JU56O-yLEQoF0v.js +2 -0
  13. package/dist/assets/chunk-426QAEUC-Uyzd4wAA.js +1 -0
  14. package/dist/assets/chunk-4BX2VUAB-DRuTD7x5.js +1 -0
  15. package/dist/assets/chunk-4TB4RGXK-3xbpIi_o.js +206 -0
  16. package/dist/assets/chunk-55IACEB6-BExiaAoD.js +1 -0
  17. package/dist/assets/chunk-5FUZZQ4R-DatVvHnF.js +62 -0
  18. package/dist/assets/chunk-5PVQY5BW-BKgvrGh8.js +2 -0
  19. package/dist/assets/chunk-67CJDMHE-DMt8LNEX.js +1 -0
  20. package/dist/assets/chunk-7N4EOEYR-CzLGefVf.js +1 -0
  21. package/dist/assets/chunk-AA7GKIK3-B6GFAk4U.js +1 -0
  22. package/dist/assets/chunk-BSJP7CBP-BK29yehL.js +1 -0
  23. package/dist/assets/chunk-CIAEETIT-D7hBXImP.js +1 -0
  24. package/dist/assets/chunk-Dlc7tRH4.js +1 -0
  25. package/dist/assets/chunk-EDXVE4YY-PYJdlmyH.js +1 -0
  26. package/dist/assets/chunk-ENJZ2VHE-DUHKBv6x.js +10 -0
  27. package/dist/assets/chunk-FMBD7UC4-2FWyCCAV.js +15 -0
  28. package/dist/assets/chunk-FOC6F5B3-DKFHrt4K.js +1 -0
  29. package/dist/assets/chunk-ICPOFSXX-Bh__D0ec.js +122 -0
  30. package/dist/assets/chunk-K5T4RW27-D51O7IkG.js +94 -0
  31. package/dist/assets/chunk-KGLVRYIC-DMHSCH4T.js +1 -0
  32. package/dist/assets/chunk-LIHQZDEY-C2aANxt9.js +1 -0
  33. package/dist/assets/chunk-ORNJ4GCN-Db_37NRX.js +1 -0
  34. package/dist/assets/chunk-OYMX7WX6-BltXOJLJ.js +231 -0
  35. package/dist/assets/chunk-QZHKN3VN-8Lcg9gti.js +1 -0
  36. package/dist/assets/chunk-U2HBQHQK-ByS6tilY.js +70 -0
  37. package/dist/assets/chunk-X2U36JSP-Bm-4Gqg_.js +1 -0
  38. package/dist/assets/chunk-XPW4576I-Bqbompq4.js +32 -0
  39. package/dist/assets/chunk-YZCP3GAM-CsC0imPb.js +1 -0
  40. package/dist/assets/chunk-ZZ45TVLE-CG-CqfPC.js +1 -0
  41. package/dist/assets/classDiagram-6PBFFD2Q-Jy1uFUk4.js +1 -0
  42. package/dist/assets/classDiagram-v2-HSJHXN6E-ChiLl3rR.js +1 -0
  43. package/dist/assets/clone-BBjvuERA.js +1 -0
  44. package/dist/assets/cose-bilkent-S5V4N54A-q90QeGKv.js +1 -0
  45. package/dist/assets/cytoscape.esm-BfXff3fb.js +321 -0
  46. package/dist/assets/dagre-KV5264BT-BQWiLFJB.js +4 -0
  47. package/dist/assets/dagre-nn_aIZ2E.js +1 -0
  48. package/dist/assets/defaultLocale-BwmRmqJp.js +1 -0
  49. package/dist/assets/diagram-5BDNPKRD-CJa7Y97H.js +10 -0
  50. package/dist/assets/diagram-G4DWMVQ6-tVQGBWfY.js +24 -0
  51. package/dist/assets/diagram-MMDJMWI5-CpimFldm.js +43 -0
  52. package/dist/assets/diagram-TYMM5635-D11WQVgy.js +24 -0
  53. package/dist/assets/dist-BNz65Ibc.js +1 -0
  54. package/dist/assets/erDiagram-SMLLAGMA-C2bLd0jS.js +85 -0
  55. package/dist/assets/flowDiagram-DWJPFMVM-Kw3fOOLT.js +162 -0
  56. package/dist/assets/ganttDiagram-T4ZO3ILL-fyMhyE2X.js +292 -0
  57. package/dist/assets/gitGraph-7Q5UKJZL-BGFRt2qs.js +1 -0
  58. package/dist/assets/gitGraphDiagram-UUTBAWPF-D4JoiOvg.js +106 -0
  59. package/dist/assets/graphlib-DGcD9J2L.js +1 -0
  60. package/dist/assets/index-Cow3qpoq.css +2 -0
  61. package/dist/assets/index-DUf7okYi.js +14 -0
  62. package/dist/assets/info-OMHHGYJF-DI6-Z9vh.js +1 -0
  63. package/dist/assets/infoDiagram-42DDH7IO-D1ZkeMBy.js +2 -0
  64. package/dist/assets/init-TPm5RB77.js +1 -0
  65. package/dist/assets/isArrayLikeObject-69BLnVNM.js +1 -0
  66. package/dist/assets/isEmpty-DUS28g5f.js +1 -0
  67. package/dist/assets/ishikawaDiagram-UXIWVN3A-Dv8hzjZB.js +70 -0
  68. package/dist/assets/journeyDiagram-VCZTEJTY-COeB7F5r.js +139 -0
  69. package/dist/assets/kanban-definition-6JOO6SKY-BbYmxCYU.js +89 -0
  70. package/dist/assets/katex-5SGEXwpi.js +261 -0
  71. package/dist/assets/line-_v2NGEdn.js +1 -0
  72. package/dist/assets/linear-CXMqTN8N.js +1 -0
  73. package/dist/assets/mermaid-config-C8a4L22x.js +1 -0
  74. package/dist/assets/mermaid-parser.core-CFmphzPP.js +4 -0
  75. package/dist/assets/mermaid.core-DnHAupTp.js +11 -0
  76. package/dist/assets/mindmap-definition-QFDTVHPH-D7_lIep7.js +96 -0
  77. package/dist/assets/ordinal-D7l-8DAO.js +1 -0
  78. package/dist/assets/packet-4T2RLAQJ-DidW3JFc.js +1 -0
  79. package/dist/assets/path-BVpCanzE.js +1 -0
  80. package/dist/assets/pie-ZZUOXDRM-Bff2e5hg.js +1 -0
  81. package/dist/assets/pieDiagram-DEJITSTG-DDvYHCT_.js +30 -0
  82. package/dist/assets/quadrantDiagram-34T5L4WZ-DcLcIrdi.js +7 -0
  83. package/dist/assets/radar-PYXPWWZC-CsdZBH3M.js +1 -0
  84. package/dist/assets/requirementDiagram-MS252O5E-DLX6ld7D.js +84 -0
  85. package/dist/assets/rough.esm-BoTisKeL.js +1 -0
  86. package/dist/assets/sankeyDiagram-XADWPNL6-D-1GtsHM.js +10 -0
  87. package/dist/assets/sequenceDiagram-FGHM5R23-Bwxs0YQg.js +157 -0
  88. package/dist/assets/src-CrmkjRpa.js +1 -0
  89. package/dist/assets/stateDiagram-FHFEXIEX-DW7rOcnQ.js +1 -0
  90. package/dist/assets/stateDiagram-v2-QKLJ7IA2-Jm-24vQ2.js +1 -0
  91. package/dist/assets/timeline-definition-GMOUNBTQ-DVdHyzxS.js +120 -0
  92. package/dist/assets/treeView-SZITEDCU-DPKseaET.js +1 -0
  93. package/dist/assets/treemap-W4RFUUIX-DH-7GZe_.js +1 -0
  94. package/dist/assets/vennDiagram-DHZGUBPP-DJaC6xmI.js +34 -0
  95. package/dist/assets/wardley-RL74JXVD-AgyXyBN5.js +1 -0
  96. package/dist/assets/wardleyDiagram-NUSXRM2D-CTKERPKv.js +20 -0
  97. package/dist/assets/xychartDiagram-5P7HB3ND-BuExiLXc.js +7 -0
  98. package/{index.html → dist/index.html} +2 -1
  99. package/dist/index.js +2539 -0
  100. package/package.json +11 -1
  101. package/.agents/skills/remotion-best-practices/SKILL.md +0 -61
  102. package/.agents/skills/remotion-best-practices/rules/3d.md +0 -86
  103. package/.agents/skills/remotion-best-practices/rules/animations.md +0 -27
  104. package/.agents/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +0 -178
  105. package/.agents/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +0 -100
  106. package/.agents/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +0 -108
  107. package/.agents/skills/remotion-best-practices/rules/assets.md +0 -78
  108. package/.agents/skills/remotion-best-practices/rules/audio-visualization.md +0 -198
  109. package/.agents/skills/remotion-best-practices/rules/audio.md +0 -169
  110. package/.agents/skills/remotion-best-practices/rules/calculate-metadata.md +0 -134
  111. package/.agents/skills/remotion-best-practices/rules/can-decode.md +0 -75
  112. package/.agents/skills/remotion-best-practices/rules/charts.md +0 -120
  113. package/.agents/skills/remotion-best-practices/rules/compositions.md +0 -154
  114. package/.agents/skills/remotion-best-practices/rules/display-captions.md +0 -184
  115. package/.agents/skills/remotion-best-practices/rules/extract-frames.md +0 -229
  116. package/.agents/skills/remotion-best-practices/rules/ffmpeg.md +0 -38
  117. package/.agents/skills/remotion-best-practices/rules/fonts.md +0 -152
  118. package/.agents/skills/remotion-best-practices/rules/get-audio-duration.md +0 -58
  119. package/.agents/skills/remotion-best-practices/rules/get-video-dimensions.md +0 -68
  120. package/.agents/skills/remotion-best-practices/rules/get-video-duration.md +0 -60
  121. package/.agents/skills/remotion-best-practices/rules/gifs.md +0 -141
  122. package/.agents/skills/remotion-best-practices/rules/images.md +0 -134
  123. package/.agents/skills/remotion-best-practices/rules/import-srt-captions.md +0 -69
  124. package/.agents/skills/remotion-best-practices/rules/light-leaks.md +0 -73
  125. package/.agents/skills/remotion-best-practices/rules/lottie.md +0 -70
  126. package/.agents/skills/remotion-best-practices/rules/maps.md +0 -412
  127. package/.agents/skills/remotion-best-practices/rules/measuring-dom-nodes.md +0 -34
  128. package/.agents/skills/remotion-best-practices/rules/measuring-text.md +0 -140
  129. package/.agents/skills/remotion-best-practices/rules/parameters.md +0 -109
  130. package/.agents/skills/remotion-best-practices/rules/sequencing.md +0 -118
  131. package/.agents/skills/remotion-best-practices/rules/sfx.md +0 -26
  132. package/.agents/skills/remotion-best-practices/rules/subtitles.md +0 -36
  133. package/.agents/skills/remotion-best-practices/rules/tailwind.md +0 -11
  134. package/.agents/skills/remotion-best-practices/rules/text-animations.md +0 -20
  135. package/.agents/skills/remotion-best-practices/rules/timing.md +0 -179
  136. package/.agents/skills/remotion-best-practices/rules/transcribe-captions.md +0 -70
  137. package/.agents/skills/remotion-best-practices/rules/transitions.md +0 -197
  138. package/.agents/skills/remotion-best-practices/rules/transparent-videos.md +0 -106
  139. package/.agents/skills/remotion-best-practices/rules/trimming.md +0 -51
  140. package/.agents/skills/remotion-best-practices/rules/videos.md +0 -171
  141. package/.agents/skills/remotion-best-practices/rules/voiceover.md +0 -99
  142. package/.agents/skills/simple/SKILL.md +0 -52
  143. package/.agents/skills/vercel-react-best-practices/AGENTS.md +0 -3254
  144. package/.agents/skills/vercel-react-best-practices/README.md +0 -123
  145. package/.agents/skills/vercel-react-best-practices/SKILL.md +0 -141
  146. package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  147. package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  148. package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  149. package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  150. package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
  151. package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  152. package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  153. package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  154. package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
  155. package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  156. package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  157. package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  158. package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  159. package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  160. package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  161. package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  162. package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  163. package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  164. package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  165. package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  166. package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  167. package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  168. package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  169. package/.agents/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
  170. package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  171. package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  172. package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  173. package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  174. package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  175. package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  176. package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  177. package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  178. package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  179. package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  180. package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  181. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  182. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  183. package/.agents/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
  184. package/.agents/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
  185. package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  186. package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  187. package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  188. package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  189. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  190. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  191. package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  192. package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  193. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  194. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  195. package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  196. package/.agents/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
  197. package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  198. package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  199. package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  200. package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  201. package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  202. package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  203. package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  204. package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  205. package/.agents/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -142
  206. package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  207. package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  208. package/.claude/CLAUDE.md +0 -184
  209. package/.claude/commands/review.md +0 -120
  210. package/.claude/commands/sync-docs.md +0 -71
  211. package/.claude/roadmap.md +0 -121
  212. package/.claude/rules/style-guide.md +0 -830
  213. package/.claude/settings.json +0 -18
  214. package/.claude/user-stories.md +0 -333
  215. package/AGENTS.md +0 -68
  216. package/Makefile +0 -32
  217. package/biome.json +0 -79
  218. package/bun.lock +0 -854
  219. package/bunfig.toml +0 -2
  220. package/docs/design.md +0 -563
  221. package/docs/perf-baseline.md +0 -130
  222. package/docs/plans/2026-03-13-client-mode-design.md +0 -86
  223. package/docs/plans/2026-03-13-client-mode-plan.md +0 -605
  224. package/docs/plans/2026-03-13-keyboard-shortcuts-design.md +0 -129
  225. package/docs/plans/2026-03-13-keyboard-shortcuts-plan.md +0 -1471
  226. package/docs/plans/2026-03-13-multi-document-design.md +0 -183
  227. package/docs/plans/2026-03-13-performance-benchmarks-design.md +0 -121
  228. package/docs/superpowers/plans/2026-03-26-surgical-pruning.md +0 -1176
  229. package/docs/superpowers/specs/2026-03-27-go-server-rewrite-design.md +0 -284
  230. package/e2e/comments.spec.ts +0 -81
  231. package/e2e/document-load.spec.ts +0 -32
  232. package/e2e/export.spec.ts +0 -58
  233. package/e2e/fixtures/sample.md +0 -7
  234. package/e2e/perf/add-comment.spec.ts +0 -116
  235. package/e2e/perf/fixtures/generate.ts +0 -327
  236. package/e2e/perf/initial-load.spec.ts +0 -49
  237. package/e2e/perf/perf.setup.ts +0 -23
  238. package/e2e/perf/perf.teardown.ts +0 -9
  239. package/e2e/perf/screenshot-final.png +0 -0
  240. package/e2e/perf/scroll.spec.ts +0 -39
  241. package/e2e/perf/tab-switch.spec.ts +0 -69
  242. package/e2e/perf/text-selection.spec.ts +0 -119
  243. package/e2e/perf/utils/metrics.ts +0 -350
  244. package/e2e/perf/utils/perf-cli.ts +0 -86
  245. package/e2e/persistence-file.spec.ts +0 -357
  246. package/e2e/utils/cli.ts +0 -84
  247. package/e2e/utils/selection.ts +0 -79
  248. package/go/cmd/readit/main.go +0 -416
  249. package/go/go.mod +0 -20
  250. package/go/go.sum +0 -41
  251. package/go/internal/server/anchor.go +0 -302
  252. package/go/internal/server/anchor_test.go +0 -111
  253. package/go/internal/server/comments.go +0 -390
  254. package/go/internal/server/documents.go +0 -113
  255. package/go/internal/server/embed.go +0 -17
  256. package/go/internal/server/headings.go +0 -33
  257. package/go/internal/server/headings_test.go +0 -75
  258. package/go/internal/server/htmltext.go +0 -123
  259. package/go/internal/server/markdown.go +0 -157
  260. package/go/internal/server/markdown_bench_test.go +0 -42
  261. package/go/internal/server/markdown_test.go +0 -79
  262. package/go/internal/server/server.go +0 -453
  263. package/go/internal/server/server_bench_test.go +0 -122
  264. package/go/internal/server/settings.go +0 -110
  265. package/go/internal/server/sse.go +0 -140
  266. package/go/internal/server/storage.go +0 -275
  267. package/go/internal/server/storage_test.go +0 -118
  268. package/go/internal/server/template.go +0 -66
  269. package/go/internal/server/types.go +0 -101
  270. package/go/internal/server/watcher.go +0 -74
  271. package/lefthook.yml +0 -8
  272. package/nvim-readit/lua/readit/health.lua +0 -64
  273. package/nvim-readit/lua/readit/init.lua +0 -463
  274. package/nvim-readit/plugin/readit.lua +0 -19
  275. package/playwright.config.ts +0 -34
  276. package/skills-lock.json +0 -20
  277. package/src/App.svelte +0 -881
  278. package/src/cli.ts +0 -881
  279. package/src/components/ActionsMenu.svelte +0 -95
  280. package/src/components/CommentBadge.svelte +0 -67
  281. package/src/components/CommentErrorBanner.svelte +0 -33
  282. package/src/components/CommentInput.svelte +0 -75
  283. package/src/components/CommentListItem.svelte +0 -95
  284. package/src/components/CommentManager.svelte +0 -129
  285. package/src/components/CommentNav.svelte +0 -109
  286. package/src/components/DocumentViewer.svelte +0 -218
  287. package/src/components/FloatingComment.svelte +0 -107
  288. package/src/components/Header.svelte +0 -76
  289. package/src/components/InlineEditor.svelte +0 -72
  290. package/src/components/MarginNote.svelte +0 -167
  291. package/src/components/MarginNotesContainer.svelte +0 -33
  292. package/src/components/RawModal.svelte +0 -126
  293. package/src/components/ReanchorConfirm.svelte +0 -30
  294. package/src/components/SettingsModal.svelte +0 -220
  295. package/src/components/ShortcutCapture.svelte +0 -82
  296. package/src/components/ShortcutList.svelte +0 -145
  297. package/src/components/TabBar.svelte +0 -52
  298. package/src/components/TableOfContents.svelte +0 -125
  299. package/src/components/ui/ActionLink.svelte +0 -40
  300. package/src/components/ui/Button.svelte +0 -53
  301. package/src/components/ui/Dialog.svelte +0 -97
  302. package/src/components/ui/DropdownMenu.svelte +0 -85
  303. package/src/components/ui/DropdownMenuItem.svelte +0 -38
  304. package/src/components/ui/DropdownMenuSeparator.svelte +0 -11
  305. package/src/components/ui/Text.svelte +0 -42
  306. package/src/env.d.ts +0 -6
  307. package/src/index.css +0 -754
  308. package/src/lib/__fixtures__/bench-data.ts +0 -114
  309. package/src/lib/anchor.bench.ts +0 -91
  310. package/src/lib/anchor.test.ts +0 -527
  311. package/src/lib/anchor.ts +0 -381
  312. package/src/lib/comment-storage.bench.ts +0 -49
  313. package/src/lib/comment-storage.test.ts +0 -632
  314. package/src/lib/comment-storage.ts +0 -222
  315. package/src/lib/export.bench.ts +0 -21
  316. package/src/lib/export.ts +0 -36
  317. package/src/lib/headings.test.ts +0 -103
  318. package/src/lib/headings.ts +0 -44
  319. package/src/lib/highlight/core.test.ts +0 -93
  320. package/src/lib/highlight/dom.ts +0 -187
  321. package/src/lib/highlight/highlight-registry.ts +0 -221
  322. package/src/lib/highlight/highlight.bench.ts +0 -92
  323. package/src/lib/highlight/highlighter.ts +0 -247
  324. package/src/lib/highlight/resolver.ts +0 -38
  325. package/src/lib/highlight/types.ts +0 -17
  326. package/src/lib/html-text.test.ts +0 -162
  327. package/src/lib/html-text.ts +0 -161
  328. package/src/lib/i18n/en.ts +0 -116
  329. package/src/lib/i18n/index.ts +0 -3
  330. package/src/lib/i18n/ja.ts +0 -118
  331. package/src/lib/i18n/translations.ts +0 -27
  332. package/src/lib/i18n/types.ts +0 -122
  333. package/src/lib/margin-layout.bench.ts +0 -61
  334. package/src/lib/margin-layout.ts +0 -71
  335. package/src/lib/markdown-renderer.test.ts +0 -154
  336. package/src/lib/markdown-renderer.ts +0 -177
  337. package/src/lib/mermaid-config.ts +0 -38
  338. package/src/lib/mermaid-renderer.ts +0 -162
  339. package/src/lib/mermaid-worker.ts +0 -60
  340. package/src/lib/positions.ts +0 -157
  341. package/src/lib/shortcut-registry.ts +0 -244
  342. package/src/lib/utils.ts +0 -15
  343. package/src/main.ts +0 -16
  344. package/src/schema.ts +0 -92
  345. package/src/server.ts +0 -1220
  346. package/src/stores/app.svelte.ts +0 -231
  347. package/src/stores/locale.svelte.ts +0 -46
  348. package/src/stores/settings.svelte.ts +0 -90
  349. package/src/stores/shortcuts.svelte.ts +0 -104
  350. package/src/stores/ui.svelte.ts +0 -12
  351. package/src/template.ts +0 -104
  352. package/src/test-setup.ts +0 -48
  353. package/svelte.config.js +0 -5
  354. package/test.md +0 -74
  355. package/tsconfig.cli.json +0 -12
  356. package/tsconfig.json +0 -20
  357. package/vite.config.ts +0 -47
  358. package/vitest.config.ts +0 -15
  359. package/vscode-readit/.mcp.json +0 -7
  360. package/vscode-readit/.vscodeignore +0 -7
  361. package/vscode-readit/bun.lock +0 -78
  362. package/vscode-readit/icon.svg +0 -10
  363. package/vscode-readit/package.json +0 -110
  364. package/vscode-readit/src/extension.ts +0 -117
  365. package/vscode-readit/src/server-manager.ts +0 -272
  366. package/vscode-readit/src/webview-provider.ts +0 -204
  367. package/vscode-readit/tsconfig.json +0 -20
@@ -1,272 +0,0 @@
1
- import { type ChildProcess, spawn } from "node:child_process";
2
- import * as net from "node:net";
3
- import * as vscode from "vscode";
4
-
5
- /**
6
- * Manages the lifecycle of a readit Bun server process.
7
- *
8
- * Spawns `bun dist/index.js <file> --no-open --port <port>` as a child process.
9
- * Subsequent files are attached via POST /api/documents to the running server.
10
- * The server is killed when the extension deactivates or the last panel closes.
11
- */
12
- export class ServerManager implements vscode.Disposable {
13
- private process: ChildProcess | null = null;
14
- private port: number | null = null;
15
- private outputChannel: vscode.OutputChannel;
16
- private startPromise: Promise<number> | null = null;
17
-
18
- constructor(outputChannel: vscode.OutputChannel) {
19
- this.outputChannel = outputChannel;
20
- }
21
-
22
- /** Returns the port of the running server, or null if not started. */
23
- getPort(): number | null {
24
- return this.port;
25
- }
26
-
27
- /** Returns the base URL of the running server. */
28
- getBaseUrl(): string | null {
29
- if (this.port === null) return null;
30
- return `http://127.0.0.1:${this.port}`;
31
- }
32
-
33
- /** True if the server process is running. */
34
- isRunning(): boolean {
35
- return this.process !== null && this.process.exitCode === null;
36
- }
37
-
38
- /**
39
- * Ensures the server is running and the given file is loaded.
40
- * If the server is not started, spawns it with the file.
41
- * If already running, attaches the file via the HTTP API.
42
- * Returns the port number.
43
- */
44
- async ensureRunning(
45
- filePath: string,
46
- readitDistDir: string,
47
- ): Promise<number> {
48
- if (this.startPromise) {
49
- const port = await this.startPromise;
50
- await this.attachFile(filePath);
51
- return port;
52
- }
53
-
54
- if (this.isRunning() && this.port !== null) {
55
- await this.attachFile(filePath);
56
- return this.port;
57
- }
58
-
59
- return this.start(filePath, readitDistDir);
60
- }
61
-
62
- /**
63
- * Starts the Bun server process.
64
- * Resolves with the port once the server is healthy.
65
- */
66
- private start(filePath: string, readitDistDir: string): Promise<number> {
67
- this.startPromise = this.doStart(filePath, readitDistDir);
68
- return this.startPromise;
69
- }
70
-
71
- private async doStart(
72
- filePath: string,
73
- readitDistDir: string,
74
- ): Promise<number> {
75
- const config = vscode.workspace.getConfiguration("readit");
76
- const bunPath = config.get<string>("bunPath", "bun");
77
- const configPort = config.get<number>("serverPort", 0);
78
-
79
- const port = configPort > 0 ? configPort : await findFreePort();
80
-
81
- const cliEntry = vscode.Uri.joinPath(
82
- vscode.Uri.file(readitDistDir),
83
- "index.js",
84
- ).fsPath;
85
-
86
- const args = [cliEntry, filePath, "--no-open", "--port", String(port)];
87
-
88
- this.outputChannel.appendLine(
89
- `Starting readit server: ${bunPath} ${args.join(" ")}`,
90
- );
91
-
92
- return new Promise<number>((resolve, reject) => {
93
- const child = spawn(bunPath, args, {
94
- stdio: ["ignore", "pipe", "pipe"],
95
- env: {
96
- ...process.env,
97
- NODE_ENV: "production",
98
- },
99
- });
100
-
101
- this.process = child;
102
- let settled = false;
103
- let timer: NodeJS.Timeout | undefined;
104
-
105
- const rejectStartup = (message: string) => {
106
- if (settled) return;
107
- settled = true;
108
- if (timer) {
109
- clearInterval(timer);
110
- }
111
- this.cleanup(child);
112
- reject(new Error(message));
113
- };
114
-
115
- child.stdout?.on("data", (data: Buffer) => {
116
- this.outputChannel.appendLine(data.toString().trimEnd());
117
- });
118
-
119
- child.stderr?.on("data", (data: Buffer) => {
120
- this.outputChannel.appendLine(`[stderr] ${data.toString().trimEnd()}`);
121
- });
122
-
123
- child.on("error", (err) => {
124
- this.outputChannel.appendLine(`Server process error: ${err.message}`);
125
- rejectStartup(
126
- `Failed to start readit server. Is Bun installed? (${err.message})`,
127
- );
128
- });
129
-
130
- const handleProcessExit = (
131
- code: number | null,
132
- signal: NodeJS.Signals | null,
133
- ) => {
134
- this.outputChannel.appendLine(
135
- `Server process exited with code ${code}${signal ? ` (signal: ${signal})` : ""}`,
136
- );
137
- if (!settled) {
138
- rejectStartup(
139
- `readit server exited before it became ready (${code === null ? (signal ?? "unknown") : `code ${code}`})`,
140
- );
141
- return;
142
- }
143
- this.cleanup(child);
144
- };
145
-
146
- child.on("exit", handleProcessExit);
147
-
148
- // Poll for server readiness
149
- const maxWaitMs = 15_000;
150
- const intervalMs = 200;
151
- const startTime = Date.now();
152
-
153
- timer = setInterval(async () => {
154
- if (Date.now() - startTime > maxWaitMs) {
155
- clearInterval(timer);
156
- child.kill("SIGTERM");
157
- rejectStartup("readit server failed to start within 15 seconds");
158
- return;
159
- }
160
-
161
- try {
162
- const res = await fetch(`http://127.0.0.1:${port}/api/health`);
163
- if (res.ok) {
164
- clearInterval(timer);
165
- settled = true;
166
- this.port = port;
167
- this.outputChannel.appendLine(`Server ready on port ${port}`);
168
- resolve(port);
169
- }
170
- } catch {
171
- // Not ready yet, keep polling
172
- }
173
- }, intervalMs);
174
- });
175
- }
176
-
177
- /**
178
- * Attaches a file to the running server via POST /api/documents.
179
- */
180
- private async attachFile(filePath: string): Promise<void> {
181
- if (this.port === null) return;
182
-
183
- try {
184
- const res = await fetch(`http://127.0.0.1:${this.port}/api/documents`, {
185
- method: "POST",
186
- headers: { "Content-Type": "application/json" },
187
- body: JSON.stringify({ path: filePath }),
188
- });
189
-
190
- if (!res.ok) {
191
- const raw = await res.text();
192
- let errorMessage = res.statusText;
193
- if (raw) {
194
- try {
195
- const data = JSON.parse(raw) as { error?: string };
196
- errorMessage = data.error ?? raw;
197
- } catch {
198
- errorMessage = raw;
199
- }
200
- }
201
- this.outputChannel.appendLine(
202
- `Failed to attach file ${filePath}: ${errorMessage}`,
203
- );
204
- } else {
205
- const data = (await res.json()) as {
206
- status?: string;
207
- fileName?: string;
208
- };
209
- this.outputChannel.appendLine(
210
- `File ${data.fileName ?? filePath}: ${data.status ?? "attached"}`,
211
- );
212
- }
213
- } catch (err) {
214
- this.outputChannel.appendLine(
215
- `Error attaching file: ${err instanceof Error ? err.message : String(err)}`,
216
- );
217
- }
218
- }
219
-
220
- /** Stops the server process. */
221
- stop(): void {
222
- const child = this.process;
223
- if (child) {
224
- this.outputChannel.appendLine("Stopping readit server...");
225
- child.kill("SIGTERM");
226
- let hasExited = false;
227
-
228
- // Force kill after 3 seconds
229
- const forceKillTimer = setTimeout(() => {
230
- if (!hasExited && child.exitCode === null) {
231
- child.kill("SIGKILL");
232
- }
233
- }, 3_000);
234
-
235
- child.once("exit", () => {
236
- hasExited = true;
237
- clearTimeout(forceKillTimer);
238
- });
239
- }
240
- this.cleanup();
241
- }
242
-
243
- private cleanup(child?: ChildProcess): void {
244
- if (child && this.process !== child) {
245
- return;
246
- }
247
- this.process = null;
248
- this.port = null;
249
- this.startPromise = null;
250
- }
251
-
252
- dispose(): void {
253
- this.stop();
254
- }
255
- }
256
-
257
- /** Finds a free TCP port by binding to port 0 and reading the assigned port. */
258
- function findFreePort(): Promise<number> {
259
- return new Promise((resolve, reject) => {
260
- const server = net.createServer();
261
- server.listen(0, "127.0.0.1", () => {
262
- const addr = server.address();
263
- if (addr && typeof addr === "object") {
264
- const port = addr.port;
265
- server.close(() => resolve(port));
266
- } else {
267
- server.close(() => reject(new Error("Could not determine free port")));
268
- }
269
- });
270
- server.on("error", reject);
271
- });
272
- }
@@ -1,204 +0,0 @@
1
- import * as path from "node:path";
2
- import * as vscode from "vscode";
3
- import type { ServerManager } from "./server-manager";
4
-
5
- /**
6
- * Manages readit webview panels.
7
- *
8
- * Each panel contains an iframe pointing at the readit server on 127.0.0.1.
9
- * This preserves the full interactive experience: SSE live-reload, comment
10
- * CRUD, keyboard shortcuts, and all Svelte reactivity — without duplicating
11
- * any rendering logic.
12
- */
13
- export class ReaditWebviewProvider implements vscode.Disposable {
14
- private panels = new Map<string, vscode.WebviewPanel>();
15
- private disposables: vscode.Disposable[] = [];
16
-
17
- constructor(
18
- private readonly extensionUri: vscode.Uri,
19
- private readonly serverManager: ServerManager,
20
- private readonly outputChannel: vscode.OutputChannel,
21
- ) {}
22
-
23
- /**
24
- * Opens (or reveals) a readit preview panel for the given file.
25
- * @param filePath Absolute path to the markdown file.
26
- * @param readitDistDir Absolute path to the readit dist/ directory.
27
- * @param column Which editor column to open the panel in.
28
- */
29
- async openPreview(
30
- filePath: string,
31
- readitDistDir: string,
32
- column: vscode.ViewColumn = vscode.ViewColumn.Active,
33
- ): Promise<void> {
34
- // If a panel for this file already exists, reveal it
35
- const existing = this.panels.get(filePath);
36
- if (existing) {
37
- existing.reveal(column);
38
- return;
39
- }
40
-
41
- // Ensure the server is running with this file loaded
42
- let port: number;
43
- try {
44
- port = await this.serverManager.ensureRunning(filePath, readitDistDir);
45
- } catch (err) {
46
- const message = err instanceof Error ? err.message : String(err);
47
- vscode.window.showErrorMessage(`readit: ${message}`);
48
- return;
49
- }
50
-
51
- const fileName = path.basename(filePath);
52
-
53
- const panel = vscode.window.createWebviewPanel(
54
- "readitPreview",
55
- `readit: ${fileName}`,
56
- column,
57
- {
58
- enableScripts: true,
59
- retainContextWhenHidden: true,
60
- localResourceRoots: [this.extensionUri],
61
- // Allow the webview to access the local readit server
62
- portMapping: [
63
- {
64
- webviewPort: port,
65
- extensionHostPort: port,
66
- },
67
- ],
68
- },
69
- );
70
-
71
- panel.iconPath = vscode.Uri.joinPath(this.extensionUri, "icon.svg");
72
- panel.webview.html = this.getWebviewContent(port, filePath, panel.webview);
73
-
74
- this.panels.set(filePath, panel);
75
-
76
- // Clean up when the panel is closed
77
- panel.onDidDispose(
78
- () => {
79
- this.panels.delete(filePath);
80
- // If no panels remain, stop the server
81
- if (this.panels.size === 0) {
82
- this.outputChannel.appendLine("Last panel closed, stopping server.");
83
- this.serverManager.stop();
84
- }
85
- },
86
- null,
87
- this.disposables,
88
- );
89
- }
90
-
91
- /**
92
- * Generates the HTML content for the webview.
93
- * Uses an iframe pointing at the local readit server so the full Svelte app
94
- * runs unmodified — SSE, comments, settings, and all.
95
- */
96
- private getWebviewContent(
97
- port: number,
98
- _filePath: string,
99
- webview: vscode.Webview,
100
- ): string {
101
- const serverUrl = `http://127.0.0.1:${port}`;
102
- const nonce = getNonce();
103
-
104
- // The CSP allows framing the local readit server and running inline scripts
105
- // with a nonce. The iframe approach means all readit functionality works
106
- // without any modification to the Svelte frontend.
107
- const csp = [
108
- `default-src 'none'`,
109
- `frame-src http://127.0.0.1:${port}`,
110
- `style-src 'unsafe-inline'`,
111
- `script-src 'nonce-${nonce}'`,
112
- ].join("; ");
113
-
114
- // Use the VS Code webview API to properly resolve the resource
115
- void webview;
116
-
117
- return /* html */ `<!DOCTYPE html>
118
- <html lang="en">
119
- <head>
120
- <meta charset="UTF-8" />
121
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
122
- <meta http-equiv="Content-Security-Policy" content="${csp}" />
123
- <title>readit</title>
124
- <style>
125
- html, body {
126
- margin: 0;
127
- padding: 0;
128
- width: 100%;
129
- height: 100%;
130
- overflow: hidden;
131
- background: var(--vscode-editor-background, #1e1e1e);
132
- }
133
- iframe {
134
- border: none;
135
- width: 100%;
136
- height: 100%;
137
- }
138
- .loading {
139
- display: flex;
140
- align-items: center;
141
- justify-content: center;
142
- width: 100%;
143
- height: 100%;
144
- color: var(--vscode-foreground, #ccc);
145
- font-family: var(--vscode-font-family, sans-serif);
146
- font-size: 14px;
147
- }
148
- .loading.hidden {
149
- display: none;
150
- }
151
- </style>
152
- </head>
153
- <body>
154
- <div id="loading" class="loading">Starting readit server...</div>
155
- <iframe
156
- id="readit-frame"
157
- src="${serverUrl}"
158
- sandbox="allow-scripts allow-same-origin allow-forms allow-popups"
159
- style="display: none;"
160
- ></iframe>
161
- <script nonce="${nonce}">
162
- const iframe = document.getElementById('readit-frame');
163
- const loading = document.getElementById('loading');
164
- iframe.addEventListener('load', () => {
165
- loading.classList.add('hidden');
166
- iframe.style.display = 'block';
167
- });
168
- // Show iframe after a max timeout even if load event doesn't fire
169
- setTimeout(() => {
170
- loading.classList.add('hidden');
171
- iframe.style.display = 'block';
172
- }, 10000);
173
- </script>
174
- </body>
175
- </html>`;
176
- }
177
-
178
- /** Closes all open panels. */
179
- closeAll(): void {
180
- for (const panel of this.panels.values()) {
181
- panel.dispose();
182
- }
183
- this.panels.clear();
184
- }
185
-
186
- dispose(): void {
187
- this.closeAll();
188
- for (const d of this.disposables) {
189
- d.dispose();
190
- }
191
- this.disposables = [];
192
- }
193
- }
194
-
195
- /** Generate a random nonce for CSP inline script tags. */
196
- function getNonce(): string {
197
- const chars =
198
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
199
- let result = "";
200
- for (let i = 0; i < 32; i++) {
201
- result += chars.charAt(Math.floor(Math.random() * chars.length));
202
- }
203
- return result;
204
- }
@@ -1,20 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "lib": ["ES2022"],
5
- "types": ["node"],
6
- "module": "Node16",
7
- "moduleResolution": "Node16",
8
- "strict": true,
9
- "esModuleInterop": true,
10
- "skipLibCheck": true,
11
- "resolveJsonModule": true,
12
- "isolatedModules": true,
13
- "noEmit": true,
14
- "rootDir": "src",
15
- "noUnusedLocals": true,
16
- "noUnusedParameters": true
17
- },
18
- "include": ["src"],
19
- "exclude": ["node_modules", "dist"]
20
- }