{"_id":"@boomarche/loupe","name":"@boomarche/loupe","dist-tags":{"next":"0.1.0-rc.1","latest":"0.1.0-rc.1"},"versions":{"0.1.0-rc.1":{"name":"@boomarche/loupe","version":"0.1.0-rc.1","description":"Open AI-cited code locations in Neovide — tabs, quickfix list, highlighted ranges.","type":"module","bin":{"loupe":"dist/index.js"},"engines":{"node":">=18"},"scripts":{"build":"tsc -p tsconfig.json","test":"node --test --import tsx 'test/*.test.ts'","test:int":"node --test --import tsx 'test/integration/*.test.ts'"},"devDependencies":{"typescript":"^5","tsx":"^4","@types/node":"^22"},"gitHead":"72596e8bff19400a350aee8fa5e0d08b29d75cf7","_id":"@boomarche/loupe@0.1.0-rc.1","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-RGHK+wQppPkBhU80AS+haz3pfuS8acltLCKzr+woIudmqFReSaMNYps596tY+SSsX9Pz24KyLeGPifHObKYhKQ==","shasum":"a86ff7b1cdc25475ce6938f925176e14b8016ce6","tarball":"https://registry.npmjs.org/@boomarche/loupe/-/loupe-0.1.0-rc.1.tgz","fileCount":10,"unpackedSize":31910,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC1QbQG95FkltubHeD4CnYlbsRIvpPQIWZBwwpo2uxIagIhALe81CKQRl8polxJuOjNIIQdmuQyje8iauUpXyvFEzux"}]},"_npmUser":{"name":"boomarche","email":"kdinler@boomarche.com"},"directories":{},"maintainers":[{"name":"boomarche","email":"kdinler@boomarche.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/loupe_0.1.0-rc.1_1781516688006_0.6589651667654426"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-15T09:44:47.834Z","0.1.0-rc.1":"2026-06-15T09:44:48.131Z","modified":"2026-06-15T09:44:48.358Z"},"maintainers":[{"name":"boomarche","email":"kdinler@boomarche.com"}],"description":"Open AI-cited code locations in Neovide — tabs, quickfix list, highlighted ranges.","readme":"# loupe\n\nOpen the code locations an AI cites — `file:line`, ranges, many at once — in a\n[Neovide](https://neovide.dev) window: distinct files as tabs, every location in a\nquickfix list, the current range highlighted. Navigate by key or click. Cross-platform\n(macOS, Windows, Linux), driven over Neovim's RPC (no fragile keystroke injection).\n\n```\nloupe src/main.cpp:23 src/main.cpp:88 src/util.cpp:10-24\n```\n\n→ opens `main.cpp` and `util.cpp` as tabs, lists all three locations in a quickfix\npane, highlights `main.cpp:23`. Step through them with the keys below or from the\nterminal.\n\n> **Status:** macOS is verified end-to-end. Windows and Linux are implemented but\n> still being verified — they're available on the `@next` prerelease tag\n> (`npm i -g @boomarche/loupe@next`). The stable `latest` tag will land once\n> Windows is confirmed.\n\n## Install\n\n```sh\nnpm install -g @boomarche/loupe\n```\n\nYou also need **Neovim** and **Neovide** on PATH (loupe detects them and prints the\nright hint if missing):\n\n- macOS: `brew install neovim && brew install --cask neovide`\n- Windows: `winget install Neovim.Neovim && winget install Neovide.Neovide`\n- Linux: your package manager / the Neovide release AppImage\n\nloupe never auto-installs anything.\n\n## Usage\n\n```sh\nloupe <ref> [<ref> ...]   # open locations: file, file:line, file:line:col, file:start-end\nloupe next                # step to the next location (highlight + tab follow)\nloupe prev                # step to the previous location\nloupe list                # focus the quickfix pane and print the list\n```\n\nRefs resolve relative to the current directory. Colons and spaces in paths are safe.\nA missing file is skipped with a warning; all-missing is an error.\n\n### In-editor keys\n\n| Action | macOS | Windows / Linux |\n|---|---|---|\n| Next / previous location | `Cmd ↓` / `Cmd ↑` (or `Ctrl`) | `Ctrl ↓` / `Ctrl ↑` (or `Alt`) |\n| Jump to a file's tab | `Cmd 1`…`Cmd 9` (or `Ctrl`) | `Ctrl 1`…`9` (or `Alt`) |\n| Zoom in / out / reset | `Cmd =` / `Cmd -` / `Cmd 0` (or `Ctrl`) | `Ctrl =` / `Ctrl -` / `Ctrl 0` (or `Alt`) |\n| Step (Neovim-native) | `]q` / `[q` | `]q` / `[q` |\n| Jump to a quickfix entry | `Enter` or double-click | `Enter` or double-click |\n\nThe shortcut bar is shown as a header on the quickfix pane.\n\n## Per-session windows\n\nEach Claude Code session gets its **own** Neovide window, keyed on\n`$CLAUDE_SESSION_ID` and titled `loupe: <short-id>`, so concurrent sessions never\nshare a window. A plain terminal uses a shared `default` window. Override the key\nwith `LOUPE_SESSION=<name>`.\n\nThe window is loupe-managed (a display surface): running `loupe <refs>` again resets\nits tabs, so don't rely on it for unsaved manual edits.\n\n## Use it with Claude Code\n\nAdd to your `CLAUDE.md` so the agent surfaces locations as it cites them:\n\n> When you cite concrete code locations (`file:line` / `file:start-end`), also run\n> `loupe <all the refs>` in one call so I can see them. Navigate yourself with the\n> keys above, or ask me to `loupe next` / `prev` while explaining.\n\n## Environment\n\n- `LOUPE_SESSION=<key>` — override the per-session window key.\n- `LOUPE_DRY_RUN=1` — print the Neovim commands instead of running them (used in tests).\n\n## Develop\n\n```sh\nnpm install\nnpm run build\nnpm test          # unit (refs/session parsing, dry-run command contract)\nnpm run test:int  # headless-nvim integration (quickfix, highlight, switchbuf, isolation)\n```\n\nState lives under `~/.local/state/loupe/<session>/` (macOS/Linux) or\n`%LOCALAPPDATA%\\loupe\\<session>\\` (Windows). loupe drives Neovim via\n`nvim --server <addr> --remote-expr \"v:lua.Loupe.*\"` — the editor runs the code,\nnothing is \"typed,\" so there's no keystroke-injection class of bug.\n","readmeFilename":"README.md","_rev":"1-f13cb6e88e46a808616ed616976d7edd"}