@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,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
- }