@peaske7/readit 0.3.0-rc.0 → 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.
- package/dist/.vite/manifest.json +1111 -0
- package/dist/assets/_basePickBy-BMMA4Tou.js +1 -0
- package/dist/assets/_baseUniq-D40qku1I.js +1 -0
- package/dist/assets/arc-Ckg65iy8.js +1 -0
- package/dist/assets/architecture-YZFGNWBL-Dv3EY0zV.js +1 -0
- package/dist/assets/architectureDiagram-Q4EWVU46-ClRss4cm.js +36 -0
- package/dist/assets/array-Bjz-wYpJ.js +1 -0
- package/dist/assets/blockDiagram-DXYQGD6D-CBcFvoK1.js +132 -0
- package/dist/assets/c4Diagram-AHTNJAMY-D4d3ZLam.js +10 -0
- package/dist/assets/channel-D9EJxDy_.js +1 -0
- package/dist/assets/chunk-2KRD3SAO-DaFfaCGO.js +1 -0
- package/dist/assets/chunk-336JU56O-yLEQoF0v.js +2 -0
- package/dist/assets/chunk-426QAEUC-Uyzd4wAA.js +1 -0
- package/dist/assets/chunk-4BX2VUAB-DRuTD7x5.js +1 -0
- package/dist/assets/chunk-4TB4RGXK-3xbpIi_o.js +206 -0
- package/dist/assets/chunk-55IACEB6-BExiaAoD.js +1 -0
- package/dist/assets/chunk-5FUZZQ4R-DatVvHnF.js +62 -0
- package/dist/assets/chunk-5PVQY5BW-BKgvrGh8.js +2 -0
- package/dist/assets/chunk-67CJDMHE-DMt8LNEX.js +1 -0
- package/dist/assets/chunk-7N4EOEYR-CzLGefVf.js +1 -0
- package/dist/assets/chunk-AA7GKIK3-B6GFAk4U.js +1 -0
- package/dist/assets/chunk-BSJP7CBP-BK29yehL.js +1 -0
- package/dist/assets/chunk-CIAEETIT-D7hBXImP.js +1 -0
- package/dist/assets/chunk-Dlc7tRH4.js +1 -0
- package/dist/assets/chunk-EDXVE4YY-PYJdlmyH.js +1 -0
- package/dist/assets/chunk-ENJZ2VHE-DUHKBv6x.js +10 -0
- package/dist/assets/chunk-FMBD7UC4-2FWyCCAV.js +15 -0
- package/dist/assets/chunk-FOC6F5B3-DKFHrt4K.js +1 -0
- package/dist/assets/chunk-ICPOFSXX-Bh__D0ec.js +122 -0
- package/dist/assets/chunk-K5T4RW27-D51O7IkG.js +94 -0
- package/dist/assets/chunk-KGLVRYIC-DMHSCH4T.js +1 -0
- package/dist/assets/chunk-LIHQZDEY-C2aANxt9.js +1 -0
- package/dist/assets/chunk-ORNJ4GCN-Db_37NRX.js +1 -0
- package/dist/assets/chunk-OYMX7WX6-BltXOJLJ.js +231 -0
- package/dist/assets/chunk-QZHKN3VN-8Lcg9gti.js +1 -0
- package/dist/assets/chunk-U2HBQHQK-ByS6tilY.js +70 -0
- package/dist/assets/chunk-X2U36JSP-Bm-4Gqg_.js +1 -0
- package/dist/assets/chunk-XPW4576I-Bqbompq4.js +32 -0
- package/dist/assets/chunk-YZCP3GAM-CsC0imPb.js +1 -0
- package/dist/assets/chunk-ZZ45TVLE-CG-CqfPC.js +1 -0
- package/dist/assets/classDiagram-6PBFFD2Q-Jy1uFUk4.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-ChiLl3rR.js +1 -0
- package/dist/assets/clone-BBjvuERA.js +1 -0
- package/dist/assets/cose-bilkent-S5V4N54A-q90QeGKv.js +1 -0
- package/dist/assets/cytoscape.esm-BfXff3fb.js +321 -0
- package/dist/assets/dagre-KV5264BT-BQWiLFJB.js +4 -0
- package/dist/assets/dagre-nn_aIZ2E.js +1 -0
- package/dist/assets/defaultLocale-BwmRmqJp.js +1 -0
- package/dist/assets/diagram-5BDNPKRD-CJa7Y97H.js +10 -0
- package/dist/assets/diagram-G4DWMVQ6-tVQGBWfY.js +24 -0
- package/dist/assets/diagram-MMDJMWI5-CpimFldm.js +43 -0
- package/dist/assets/diagram-TYMM5635-D11WQVgy.js +24 -0
- package/dist/assets/dist-BNz65Ibc.js +1 -0
- package/dist/assets/erDiagram-SMLLAGMA-C2bLd0jS.js +85 -0
- package/dist/assets/flowDiagram-DWJPFMVM-Kw3fOOLT.js +162 -0
- package/dist/assets/ganttDiagram-T4ZO3ILL-fyMhyE2X.js +292 -0
- package/dist/assets/gitGraph-7Q5UKJZL-BGFRt2qs.js +1 -0
- package/dist/assets/gitGraphDiagram-UUTBAWPF-D4JoiOvg.js +106 -0
- package/dist/assets/graphlib-DGcD9J2L.js +1 -0
- package/dist/assets/index-Cow3qpoq.css +2 -0
- package/dist/assets/index-DUf7okYi.js +14 -0
- package/dist/assets/info-OMHHGYJF-DI6-Z9vh.js +1 -0
- package/dist/assets/infoDiagram-42DDH7IO-D1ZkeMBy.js +2 -0
- package/dist/assets/init-TPm5RB77.js +1 -0
- package/dist/assets/isArrayLikeObject-69BLnVNM.js +1 -0
- package/dist/assets/isEmpty-DUS28g5f.js +1 -0
- package/dist/assets/ishikawaDiagram-UXIWVN3A-Dv8hzjZB.js +70 -0
- package/dist/assets/journeyDiagram-VCZTEJTY-COeB7F5r.js +139 -0
- package/dist/assets/kanban-definition-6JOO6SKY-BbYmxCYU.js +89 -0
- package/dist/assets/katex-5SGEXwpi.js +261 -0
- package/dist/assets/line-_v2NGEdn.js +1 -0
- package/dist/assets/linear-CXMqTN8N.js +1 -0
- package/dist/assets/mermaid-config-C8a4L22x.js +1 -0
- package/dist/assets/mermaid-parser.core-CFmphzPP.js +4 -0
- package/dist/assets/mermaid.core-DnHAupTp.js +11 -0
- package/dist/assets/mindmap-definition-QFDTVHPH-D7_lIep7.js +96 -0
- package/dist/assets/ordinal-D7l-8DAO.js +1 -0
- package/dist/assets/packet-4T2RLAQJ-DidW3JFc.js +1 -0
- package/dist/assets/path-BVpCanzE.js +1 -0
- package/dist/assets/pie-ZZUOXDRM-Bff2e5hg.js +1 -0
- package/dist/assets/pieDiagram-DEJITSTG-DDvYHCT_.js +30 -0
- package/dist/assets/quadrantDiagram-34T5L4WZ-DcLcIrdi.js +7 -0
- package/dist/assets/radar-PYXPWWZC-CsdZBH3M.js +1 -0
- package/dist/assets/requirementDiagram-MS252O5E-DLX6ld7D.js +84 -0
- package/dist/assets/rough.esm-BoTisKeL.js +1 -0
- package/dist/assets/sankeyDiagram-XADWPNL6-D-1GtsHM.js +10 -0
- package/dist/assets/sequenceDiagram-FGHM5R23-Bwxs0YQg.js +157 -0
- package/dist/assets/src-CrmkjRpa.js +1 -0
- package/dist/assets/stateDiagram-FHFEXIEX-DW7rOcnQ.js +1 -0
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-Jm-24vQ2.js +1 -0
- package/dist/assets/timeline-definition-GMOUNBTQ-DVdHyzxS.js +120 -0
- package/dist/assets/treeView-SZITEDCU-DPKseaET.js +1 -0
- package/dist/assets/treemap-W4RFUUIX-DH-7GZe_.js +1 -0
- package/dist/assets/vennDiagram-DHZGUBPP-DJaC6xmI.js +34 -0
- package/dist/assets/wardley-RL74JXVD-AgyXyBN5.js +1 -0
- package/dist/assets/wardleyDiagram-NUSXRM2D-CTKERPKv.js +20 -0
- package/dist/assets/xychartDiagram-5P7HB3ND-BuExiLXc.js +7 -0
- package/{index.html → dist/index.html} +2 -1
- package/dist/index.js +2539 -0
- package/package.json +11 -1
- package/.agents/skills/remotion-best-practices/SKILL.md +0 -61
- package/.agents/skills/remotion-best-practices/rules/3d.md +0 -86
- package/.agents/skills/remotion-best-practices/rules/animations.md +0 -27
- package/.agents/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +0 -178
- package/.agents/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +0 -100
- package/.agents/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +0 -108
- package/.agents/skills/remotion-best-practices/rules/assets.md +0 -78
- package/.agents/skills/remotion-best-practices/rules/audio-visualization.md +0 -198
- package/.agents/skills/remotion-best-practices/rules/audio.md +0 -169
- package/.agents/skills/remotion-best-practices/rules/calculate-metadata.md +0 -134
- package/.agents/skills/remotion-best-practices/rules/can-decode.md +0 -75
- package/.agents/skills/remotion-best-practices/rules/charts.md +0 -120
- package/.agents/skills/remotion-best-practices/rules/compositions.md +0 -154
- package/.agents/skills/remotion-best-practices/rules/display-captions.md +0 -184
- package/.agents/skills/remotion-best-practices/rules/extract-frames.md +0 -229
- package/.agents/skills/remotion-best-practices/rules/ffmpeg.md +0 -38
- package/.agents/skills/remotion-best-practices/rules/fonts.md +0 -152
- package/.agents/skills/remotion-best-practices/rules/get-audio-duration.md +0 -58
- package/.agents/skills/remotion-best-practices/rules/get-video-dimensions.md +0 -68
- package/.agents/skills/remotion-best-practices/rules/get-video-duration.md +0 -60
- package/.agents/skills/remotion-best-practices/rules/gifs.md +0 -141
- package/.agents/skills/remotion-best-practices/rules/images.md +0 -134
- package/.agents/skills/remotion-best-practices/rules/import-srt-captions.md +0 -69
- package/.agents/skills/remotion-best-practices/rules/light-leaks.md +0 -73
- package/.agents/skills/remotion-best-practices/rules/lottie.md +0 -70
- package/.agents/skills/remotion-best-practices/rules/maps.md +0 -412
- package/.agents/skills/remotion-best-practices/rules/measuring-dom-nodes.md +0 -34
- package/.agents/skills/remotion-best-practices/rules/measuring-text.md +0 -140
- package/.agents/skills/remotion-best-practices/rules/parameters.md +0 -109
- package/.agents/skills/remotion-best-practices/rules/sequencing.md +0 -118
- package/.agents/skills/remotion-best-practices/rules/sfx.md +0 -26
- package/.agents/skills/remotion-best-practices/rules/subtitles.md +0 -36
- package/.agents/skills/remotion-best-practices/rules/tailwind.md +0 -11
- package/.agents/skills/remotion-best-practices/rules/text-animations.md +0 -20
- package/.agents/skills/remotion-best-practices/rules/timing.md +0 -179
- package/.agents/skills/remotion-best-practices/rules/transcribe-captions.md +0 -70
- package/.agents/skills/remotion-best-practices/rules/transitions.md +0 -197
- package/.agents/skills/remotion-best-practices/rules/transparent-videos.md +0 -106
- package/.agents/skills/remotion-best-practices/rules/trimming.md +0 -51
- package/.agents/skills/remotion-best-practices/rules/videos.md +0 -171
- package/.agents/skills/remotion-best-practices/rules/voiceover.md +0 -99
- package/.agents/skills/simple/SKILL.md +0 -52
- package/.agents/skills/vercel-react-best-practices/AGENTS.md +0 -3254
- package/.agents/skills/vercel-react-best-practices/README.md +0 -123
- package/.agents/skills/vercel-react-best-practices/SKILL.md +0 -141
- package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
- package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
- package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
- package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
- package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
- package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
- package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
- package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
- package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
- package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
- package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
- package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
- package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
- package/.agents/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
- package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
- package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
- package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
- package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
- package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
- package/.agents/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
- package/.agents/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
- package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
- package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
- package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
- package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
- package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
- package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
- package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
- package/.agents/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
- package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
- package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
- package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
- package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
- package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
- package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
- package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
- package/.agents/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -142
- package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
- package/.claude/CLAUDE.md +0 -184
- package/.claude/commands/review.md +0 -120
- package/.claude/commands/sync-docs.md +0 -71
- package/.claude/roadmap.md +0 -121
- package/.claude/rules/style-guide.md +0 -830
- package/.claude/settings.json +0 -18
- package/.claude/user-stories.md +0 -333
- package/AGENTS.md +0 -68
- package/Makefile +0 -32
- package/biome.json +0 -79
- package/bun.lock +0 -854
- package/bunfig.toml +0 -2
- package/docs/design.md +0 -563
- package/docs/perf-baseline.md +0 -130
- package/docs/plans/2026-03-13-client-mode-design.md +0 -86
- package/docs/plans/2026-03-13-client-mode-plan.md +0 -605
- package/docs/plans/2026-03-13-keyboard-shortcuts-design.md +0 -129
- package/docs/plans/2026-03-13-keyboard-shortcuts-plan.md +0 -1471
- package/docs/plans/2026-03-13-multi-document-design.md +0 -183
- package/docs/plans/2026-03-13-performance-benchmarks-design.md +0 -121
- package/docs/superpowers/plans/2026-03-26-surgical-pruning.md +0 -1176
- package/docs/superpowers/specs/2026-03-27-go-server-rewrite-design.md +0 -284
- package/e2e/comments.spec.ts +0 -81
- package/e2e/document-load.spec.ts +0 -32
- package/e2e/export.spec.ts +0 -58
- package/e2e/fixtures/sample.md +0 -7
- package/e2e/perf/add-comment.spec.ts +0 -116
- package/e2e/perf/fixtures/generate.ts +0 -327
- package/e2e/perf/initial-load.spec.ts +0 -49
- package/e2e/perf/perf.setup.ts +0 -23
- package/e2e/perf/perf.teardown.ts +0 -9
- package/e2e/perf/screenshot-final.png +0 -0
- package/e2e/perf/scroll.spec.ts +0 -39
- package/e2e/perf/tab-switch.spec.ts +0 -69
- package/e2e/perf/text-selection.spec.ts +0 -119
- package/e2e/perf/utils/metrics.ts +0 -350
- package/e2e/perf/utils/perf-cli.ts +0 -86
- package/e2e/persistence-file.spec.ts +0 -357
- package/e2e/utils/cli.ts +0 -84
- package/e2e/utils/selection.ts +0 -79
- package/go/cmd/readit/main.go +0 -416
- package/go/go.mod +0 -20
- package/go/go.sum +0 -41
- package/go/internal/server/anchor.go +0 -302
- package/go/internal/server/anchor_test.go +0 -111
- package/go/internal/server/comments.go +0 -390
- package/go/internal/server/documents.go +0 -113
- package/go/internal/server/embed.go +0 -17
- package/go/internal/server/headings.go +0 -33
- package/go/internal/server/headings_test.go +0 -75
- package/go/internal/server/htmltext.go +0 -123
- package/go/internal/server/markdown.go +0 -157
- package/go/internal/server/markdown_bench_test.go +0 -42
- package/go/internal/server/markdown_test.go +0 -79
- package/go/internal/server/server.go +0 -453
- package/go/internal/server/server_bench_test.go +0 -122
- package/go/internal/server/settings.go +0 -110
- package/go/internal/server/sse.go +0 -140
- package/go/internal/server/storage.go +0 -275
- package/go/internal/server/storage_test.go +0 -152
- package/go/internal/server/template.go +0 -66
- package/go/internal/server/types.go +0 -101
- package/go/internal/server/watcher.go +0 -74
- package/lefthook.yml +0 -8
- package/nvim-readit/lua/readit/health.lua +0 -64
- package/nvim-readit/lua/readit/init.lua +0 -463
- package/nvim-readit/plugin/readit.lua +0 -19
- package/playwright.config.ts +0 -34
- package/skills-lock.json +0 -20
- package/src/App.svelte +0 -890
- package/src/cli.ts +0 -881
- package/src/components/ActionsMenu.svelte +0 -95
- package/src/components/CommentBadge.svelte +0 -67
- package/src/components/CommentErrorBanner.svelte +0 -33
- package/src/components/CommentInput.svelte +0 -75
- package/src/components/CommentListItem.svelte +0 -95
- package/src/components/CommentManager.svelte +0 -129
- package/src/components/CommentNav.svelte +0 -109
- package/src/components/DocumentViewer.svelte +0 -233
- package/src/components/FloatingComment.svelte +0 -107
- package/src/components/Header.svelte +0 -76
- package/src/components/InlineEditor.svelte +0 -72
- package/src/components/MarginNote.svelte +0 -167
- package/src/components/MarginNotesContainer.svelte +0 -33
- package/src/components/MermaidEnhancer.svelte +0 -218
- package/src/components/MermaidModal.svelte +0 -67
- package/src/components/RawModal.svelte +0 -126
- package/src/components/ReanchorConfirm.svelte +0 -30
- package/src/components/SettingsModal.svelte +0 -220
- package/src/components/ShortcutCapture.svelte +0 -82
- package/src/components/ShortcutList.svelte +0 -145
- package/src/components/TabBar.svelte +0 -52
- package/src/components/TableOfContents.svelte +0 -125
- package/src/components/ui/ActionLink.svelte +0 -40
- package/src/components/ui/Button.svelte +0 -53
- package/src/components/ui/Dialog.svelte +0 -97
- package/src/components/ui/DropdownMenu.svelte +0 -85
- package/src/components/ui/DropdownMenuItem.svelte +0 -38
- package/src/components/ui/DropdownMenuSeparator.svelte +0 -11
- package/src/components/ui/Text.svelte +0 -42
- package/src/env.d.ts +0 -6
- package/src/index.css +0 -859
- package/src/lib/__fixtures__/bench-data.ts +0 -114
- package/src/lib/anchor.bench.ts +0 -91
- package/src/lib/anchor.test.ts +0 -527
- package/src/lib/anchor.ts +0 -381
- package/src/lib/comment-storage.bench.ts +0 -49
- package/src/lib/comment-storage.test.ts +0 -694
- package/src/lib/comment-storage.ts +0 -226
- package/src/lib/export.bench.ts +0 -21
- package/src/lib/export.ts +0 -36
- package/src/lib/fetch-or-throw.test.ts +0 -59
- package/src/lib/fetch-or-throw.ts +0 -12
- package/src/lib/headings.test.ts +0 -103
- package/src/lib/headings.ts +0 -44
- package/src/lib/highlight/core.test.ts +0 -93
- package/src/lib/highlight/dom.ts +0 -187
- package/src/lib/highlight/highlight-registry.ts +0 -221
- package/src/lib/highlight/highlight.bench.ts +0 -92
- package/src/lib/highlight/highlighter.ts +0 -247
- package/src/lib/highlight/resolver.ts +0 -38
- package/src/lib/highlight/types.ts +0 -17
- package/src/lib/html-text.test.ts +0 -162
- package/src/lib/html-text.ts +0 -161
- package/src/lib/i18n/en.ts +0 -124
- package/src/lib/i18n/index.ts +0 -3
- package/src/lib/i18n/ja.ts +0 -126
- package/src/lib/i18n/translations.ts +0 -27
- package/src/lib/i18n/types.ts +0 -130
- package/src/lib/key-lock.test.ts +0 -104
- package/src/lib/key-lock.ts +0 -23
- package/src/lib/margin-layout.bench.ts +0 -61
- package/src/lib/margin-layout.ts +0 -71
- package/src/lib/markdown-renderer.test.ts +0 -154
- package/src/lib/markdown-renderer.ts +0 -178
- package/src/lib/mermaid-config.ts +0 -38
- package/src/lib/mermaid-renderer.ts +0 -162
- package/src/lib/mermaid-worker.ts +0 -60
- package/src/lib/positions.ts +0 -157
- package/src/lib/shortcut-registry.ts +0 -244
- package/src/lib/utils.ts +0 -15
- package/src/main.ts +0 -16
- package/src/schema.ts +0 -92
- package/src/server.ts +0 -1216
- package/src/stores/app.svelte.ts +0 -231
- package/src/stores/locale.svelte.ts +0 -46
- package/src/stores/settings.svelte.ts +0 -90
- package/src/stores/shortcuts.svelte.ts +0 -104
- package/src/stores/ui.svelte.ts +0 -12
- package/src/template.ts +0 -104
- package/src/test-setup.ts +0 -48
- package/svelte.config.js +0 -5
- package/test.md +0 -74
- package/tsconfig.cli.json +0 -12
- package/tsconfig.json +0 -20
- package/vite.config.ts +0 -47
- package/vitest.config.ts +0 -15
- package/vscode-readit/.mcp.json +0 -7
- package/vscode-readit/.vscodeignore +0 -7
- package/vscode-readit/bun.lock +0 -78
- package/vscode-readit/icon.svg +0 -10
- package/vscode-readit/package.json +0 -110
- package/vscode-readit/src/extension.ts +0 -117
- package/vscode-readit/src/server-manager.ts +0 -272
- package/vscode-readit/src/webview-provider.ts +0 -204
- package/vscode-readit/tsconfig.json +0 -20
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
# Multi-Document Support Design
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-03-13
|
|
4
|
-
**Status:** Approved
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
Evolve readit from single-document to multi-document support with tabbed navigation, full state preservation across tab switches, and Zustand for state management.
|
|
9
|
-
|
|
10
|
-
## Motivation
|
|
11
|
-
|
|
12
|
-
readit currently opens one file per session. Reviewers often need to cross-reference multiple documents — reviewing a spec alongside its implementation notes, or scanning an entire docs directory. Multi-document support makes readit useful for real review workflows.
|
|
13
|
-
|
|
14
|
-
## Invocation
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
npx readit file1.md file2.md # Multiple files
|
|
18
|
-
npx readit ./docs/ # Directory (all .md and .html files)
|
|
19
|
-
npx readit README.md ./docs/ notes.html # Mixed
|
|
20
|
-
npx readit file.md # Single file (unchanged)
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Interaction Model
|
|
24
|
-
|
|
25
|
-
- **Tabbed view** — one document visible at a time, tab bar to switch
|
|
26
|
-
- **Full state preservation** — selection, half-typed comments, scroll position all restored on tab switch
|
|
27
|
-
- **Lazy loading** — document content fetched on first tab activation, not all at once
|
|
28
|
-
- **Split view deferred** — tabs are the foundation; split view ships later
|
|
29
|
-
|
|
30
|
-
## Store Design (Zustand)
|
|
31
|
-
|
|
32
|
-
### Why Zustand
|
|
33
|
-
|
|
34
|
-
"Preserve everything on tab switch" means state must survive component unmounting. With tabs, only one document renders — inactive documents' React trees are gone. React Context dies with the tree. Zustand stores state outside React, solving this naturally.
|
|
35
|
-
|
|
36
|
-
### Shape
|
|
37
|
-
|
|
38
|
-
```ts
|
|
39
|
-
interface DocumentState {
|
|
40
|
-
// Document data
|
|
41
|
-
document: Document;
|
|
42
|
-
|
|
43
|
-
// Comments
|
|
44
|
-
comments: Comment[];
|
|
45
|
-
commentsError: string | null;
|
|
46
|
-
|
|
47
|
-
// Selection & input
|
|
48
|
-
selection: SelectionRange | null;
|
|
49
|
-
pendingSelectionTop: number | undefined;
|
|
50
|
-
pendingCommentText: string;
|
|
51
|
-
|
|
52
|
-
// Highlight positions (DOM-derived, recomputed on mount)
|
|
53
|
-
highlightPositions: Record<string, number>;
|
|
54
|
-
documentPositions: Record<string, number>;
|
|
55
|
-
|
|
56
|
-
// Navigation
|
|
57
|
-
scrollY: number;
|
|
58
|
-
hoveredCommentId: string | undefined;
|
|
59
|
-
|
|
60
|
-
// Re-anchor
|
|
61
|
-
reanchorTarget: { commentId: string } | null;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
interface AppStore {
|
|
65
|
-
documents: Map<string, DocumentState>;
|
|
66
|
-
activeDocumentPath: string | null;
|
|
67
|
-
|
|
68
|
-
// Global actions
|
|
69
|
-
openDocument: (doc: Document) => void;
|
|
70
|
-
closeDocument: (filePath: string) => void;
|
|
71
|
-
setActiveDocument: (filePath: string) => void;
|
|
72
|
-
|
|
73
|
-
// Per-document actions (default to active document)
|
|
74
|
-
addComment: (
|
|
75
|
-
text: string,
|
|
76
|
-
comment: string,
|
|
77
|
-
start: number,
|
|
78
|
-
end: number,
|
|
79
|
-
) => void;
|
|
80
|
-
editComment: (id: string, newText: string) => void;
|
|
81
|
-
deleteComment: (id: string) => void;
|
|
82
|
-
setSelection: (selection: SelectionRange | null) => void;
|
|
83
|
-
setHoveredComment: (id: string | undefined) => void;
|
|
84
|
-
// ...
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
`highlightPositions` and `documentPositions` are DOM-derived — stale when unmounted, recomputed on mount. `scrollY` is the critical value to preserve; highlight positions are ephemeral.
|
|
89
|
-
|
|
90
|
-
Per-document actions take an optional `filePath` parameter but default to `activeDocumentPath`. This keeps call sites simple while enabling future split-view.
|
|
91
|
-
|
|
92
|
-
## Component Architecture
|
|
93
|
-
|
|
94
|
-
```
|
|
95
|
-
<App> # Thin shell: store init, tab bar, active DocumentView
|
|
96
|
-
+- <Toaster />
|
|
97
|
-
+- <TabBar /> # NEW - tab strip
|
|
98
|
-
+- <Header /> # Simplified - reads from store, ~8 props down from 14
|
|
99
|
-
+- <DocumentView> # NEW - per-document layout
|
|
100
|
-
| +- <TableOfContents /> or <TOCPopover /> # Renamed from FloatingTOC
|
|
101
|
-
| +- <DocumentViewer />
|
|
102
|
-
| +- Margin area
|
|
103
|
-
| | +- <ReanchorConfirmation /> # NEW - extracted from inline JSX
|
|
104
|
-
| | +- <NewCommentForm /> # Renamed from CommentInputArea
|
|
105
|
-
| | +- <MarginNotes /> # Renamed from MarginNotesContainer
|
|
106
|
-
| | +- <MarginNote /> # Reads actions from store directly
|
|
107
|
-
| +- <CommentMinimap />
|
|
108
|
-
| +- <CommentNavigator />
|
|
109
|
-
+- <footer />
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Component changes
|
|
113
|
-
|
|
114
|
-
- **App**: God component (~520 lines) becomes thin shell
|
|
115
|
-
- **DocumentView** (new): Owns per-document layout. On mount: restores scroll, re-applies highlights. On unmount: saves scrollY to store
|
|
116
|
-
- **MarginNote**: 6 callback props eliminated — calls `useAppStore()` directly
|
|
117
|
-
- **Header**: 14 props reduced to ~8 — reads comment data from store
|
|
118
|
-
- **CommentListDropdown** (renamed from CommentManagerDropdown): Reads from store directly
|
|
119
|
-
- **TabBar** (new): Renders open document tabs, close buttons, active indicator
|
|
120
|
-
|
|
121
|
-
## Server API Changes
|
|
122
|
-
|
|
123
|
-
| Endpoint | Before | After |
|
|
124
|
-
| --------------------- | ----------------------- | ------------------------------------------ |
|
|
125
|
-
| `GET /api/document` | Returns single document | Requires `?path=` query param |
|
|
126
|
-
| `GET /api/documents` | (new) | Returns list of open file paths + metadata |
|
|
127
|
-
| `POST /api/documents` | (new, deferred) | Add document at runtime (add-from-browser) |
|
|
128
|
-
| `GET /api/comments` | Single file scoped | Requires `?path=` query param |
|
|
129
|
-
| `POST /api/comments` | Single file scoped | Requires `path` in body |
|
|
130
|
-
|
|
131
|
-
`GET /api/documents` returns only metadata (path, fileName, type) — lightweight enough to populate the tab bar immediately. Content loads lazily via `GET /api/document?path=`.
|
|
132
|
-
|
|
133
|
-
Comment storage unchanged — already per-file in `~/.readit/comments/`.
|
|
134
|
-
|
|
135
|
-
## Tab Switch Lifecycle
|
|
136
|
-
|
|
137
|
-
### Saving (unmount)
|
|
138
|
-
|
|
139
|
-
Most state is already in the store as it changes. The only explicit "save on unmount" is `scrollY`, since scroll isn't React-controlled.
|
|
140
|
-
|
|
141
|
-
### Restoring (mount)
|
|
142
|
-
|
|
143
|
-
1. Read document content from store (or fetch if first visit)
|
|
144
|
-
2. Highlighter applies marks, emits fresh highlightPositions
|
|
145
|
-
3. `window.scrollTo(0, scrollY)` after highlights are painted
|
|
146
|
-
4. If selection exists, highlight pending selection
|
|
147
|
-
5. If pendingCommentText, NewCommentForm renders pre-filled
|
|
148
|
-
6. If reanchorTarget, show re-anchor UI
|
|
149
|
-
|
|
150
|
-
Scroll restoration uses the existing double-rAF pattern extended with scrollTo as the final step.
|
|
151
|
-
|
|
152
|
-
### Edge cases
|
|
153
|
-
|
|
154
|
-
| Scenario | Behavior |
|
|
155
|
-
| --------------------------------------------- | ---------------------------------------------------------------------------- |
|
|
156
|
-
| Close active tab | Activate nearest tab (right, then left). Last tab shows empty state |
|
|
157
|
-
| Close tab with unsaved comment text | Close immediately — ephemeral state, expected behavior |
|
|
158
|
-
| Document changes on disk while on another tab | SSE live-reload updates store for that path; content is fresh on switch-back |
|
|
159
|
-
| Same file via different paths | Deduplicate by resolved absolute path in CLI |
|
|
160
|
-
|
|
161
|
-
## Deferrals
|
|
162
|
-
|
|
163
|
-
| Feature | Reason |
|
|
164
|
-
| -------------------------------------- | --------------------------------------------------- |
|
|
165
|
-
| Split view | Separate feature; tabs are the foundation |
|
|
166
|
-
| Add-from-browser | CLI + directory mode covers primary use cases first |
|
|
167
|
-
| Tab reordering | Polish, not essential |
|
|
168
|
-
| Cross-document comment search | No current demand |
|
|
169
|
-
| Tab persistence across server restarts | Overkill for a dev tool |
|
|
170
|
-
| Bulk export across documents | Per-document export works; bulk is convenience |
|
|
171
|
-
|
|
172
|
-
## Migration Path
|
|
173
|
-
|
|
174
|
-
Incremental — store introduced alongside existing hooks, components migrate one at a time:
|
|
175
|
-
|
|
176
|
-
1. Create store with `openDocument` / `setActiveDocument`
|
|
177
|
-
2. Add `TabBar`, wrap existing App content in `DocumentView`
|
|
178
|
-
3. Migrate `useComments` into store (biggest change)
|
|
179
|
-
4. Migrate selection, scroll, hover state into store
|
|
180
|
-
5. Remove emptied hooks, rename components
|
|
181
|
-
6. Add multi-file CLI + server endpoints
|
|
182
|
-
|
|
183
|
-
Each step is independently shippable and testable.
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
# Performance Benchmarks Design
|
|
2
|
-
|
|
3
|
-
## Context
|
|
4
|
-
|
|
5
|
-
readit feels slow across startup, rendering, and interactions. The main JS bundle is 748 KB (230 KB gzipped), with no code splitting. Heavy libraries (react-markdown, mermaid, react-syntax-highlighter) load upfront.
|
|
6
|
-
|
|
7
|
-
## Goal
|
|
8
|
-
|
|
9
|
-
Establish Vitest bench benchmarks for critical server-side and library operations, with a <50ms target per operation. CI-gated to prevent regressions.
|
|
10
|
-
|
|
11
|
-
## Scope
|
|
12
|
-
|
|
13
|
-
Benchmark the four core user flows:
|
|
14
|
-
|
|
15
|
-
1. **Adding comments** — anchor resolution, comment serialization, file I/O
|
|
16
|
-
2. **Copying/exporting comments** — export formatting, context extraction
|
|
17
|
-
3. **Startup** — time-to-first-byte once server is up (exception: process spawn, browser open)
|
|
18
|
-
4. **Rendering/reading** — margin layout calculations
|
|
19
|
-
|
|
20
|
-
Client-side rendering (react-markdown, syntax highlighting) is out of scope for Vitest bench — those require Playwright, which can be added later.
|
|
21
|
-
|
|
22
|
-
## Approach: Vitest Bench
|
|
23
|
-
|
|
24
|
-
Use Vitest's built-in `bench` mode (powered by tinybench). Benchmark files are co-located with source, following the existing `*.test.ts` pattern.
|
|
25
|
-
|
|
26
|
-
### Benchmark files
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
src/lib/
|
|
30
|
-
├── anchor.bench.ts # findAnchorWithFallback
|
|
31
|
-
├── comment-storage.bench.ts # parse, serialize, computeHash
|
|
32
|
-
├── margin-layout.bench.ts # position calculations
|
|
33
|
-
├── export.bench.ts # export formatting
|
|
34
|
-
├── context.bench.ts # LLM context extraction
|
|
35
|
-
└── __fixtures__/
|
|
36
|
-
└── bench-data.ts # shared synthetic test data
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### What each benchmark measures
|
|
40
|
-
|
|
41
|
-
#### `anchor.bench.ts` — hottest path
|
|
42
|
-
|
|
43
|
-
- `findAnchorWithFallback()` with exact match (best case)
|
|
44
|
-
- `findAnchorWithFallback()` with fuzzy match (worst case)
|
|
45
|
-
- Both against a ~300-line synthetic Markdown document
|
|
46
|
-
|
|
47
|
-
#### `comment-storage.bench.ts`
|
|
48
|
-
|
|
49
|
-
- `parseCommentFile()` with 1, 10, 50 comments
|
|
50
|
-
- `serializeComments()` with 1, 10, 50 comments
|
|
51
|
-
- `computeHash()` on a ~300-line document
|
|
52
|
-
|
|
53
|
-
#### `margin-layout.bench.ts`
|
|
54
|
-
|
|
55
|
-
- Position resolution with 1, 10, 50 comments
|
|
56
|
-
- Overlap resolution (worst case: all comments on adjacent lines)
|
|
57
|
-
|
|
58
|
-
#### `export.bench.ts` + `context.bench.ts`
|
|
59
|
-
|
|
60
|
-
- Export to JSON format with 10, 50 comments
|
|
61
|
-
- Export to prompt format with 10, 50 comments
|
|
62
|
-
- Context extraction for a ~300-line document
|
|
63
|
-
|
|
64
|
-
### Test fixtures (`__fixtures__/bench-data.ts`)
|
|
65
|
-
|
|
66
|
-
Shared synthetic data:
|
|
67
|
-
|
|
68
|
-
- A ~300-line Markdown document representative of real usage
|
|
69
|
-
- Comment sets at various sizes (1, 10, 50)
|
|
70
|
-
- Pre-computed anchors for deterministic benchmarks
|
|
71
|
-
|
|
72
|
-
### Running benchmarks
|
|
73
|
-
|
|
74
|
-
```bash
|
|
75
|
-
pnpm bench # vitest bench
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
Package.json script:
|
|
79
|
-
|
|
80
|
-
```json
|
|
81
|
-
"bench": "vitest bench"
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### CI integration
|
|
85
|
-
|
|
86
|
-
GitHub Actions runs `pnpm bench` after tests pass. Vitest bench outputs timing statistics (min, max, mean, p99).
|
|
87
|
-
|
|
88
|
-
For hard CI gating, each benchmark file includes a companion assertion in the existing test file:
|
|
89
|
-
|
|
90
|
-
```ts
|
|
91
|
-
test("anchor resolution completes under 50ms", () => {
|
|
92
|
-
const start = performance.now();
|
|
93
|
-
for (let i = 0; i < 100; i++) {
|
|
94
|
-
findAnchorWithFallback({
|
|
95
|
-
source: doc,
|
|
96
|
-
selectedText: text,
|
|
97
|
-
lineHint: "L150",
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
const elapsed = (performance.now() - start) / 100;
|
|
101
|
-
expect(elapsed).toBeLessThan(50);
|
|
102
|
-
});
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
This gives both:
|
|
106
|
-
|
|
107
|
-
- **Benchmark data** (vitest bench) — for tracking performance over time
|
|
108
|
-
- **Hard assertions** (vitest test) — for CI gating at <50ms
|
|
109
|
-
|
|
110
|
-
## Performance target
|
|
111
|
-
|
|
112
|
-
| Operation | Target |
|
|
113
|
-
| ----------------------------------------------------- | ------------------- |
|
|
114
|
-
| All benchmarked operations | < 50ms |
|
|
115
|
-
| Exceptions: process spawn, browser open, port binding | As fast as possible |
|
|
116
|
-
|
|
117
|
-
## Future work
|
|
118
|
-
|
|
119
|
-
- Playwright benchmarks for client-side rendering (react-markdown, syntax highlighting, comment highlight positioning)
|
|
120
|
-
- Bundle size budgets if bundle growth becomes a concern
|
|
121
|
-
- `Server-Timing` headers on API routes for production observability
|