{"_id":"@5n7/clv","_rev":"5-a5511a12852191bfc5b7df984b19060f","name":"@5n7/clv","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@5n7/clv","version":"0.1.0","_id":"@5n7/clv@0.1.0","maintainers":[{"name":"5n7","email":"iamshunta@gmail.com"}],"bin":{"clv":"dist/cli.js"},"dist":{"shasum":"1ac360ef8fefb900ffcbe9282b6b0a582e01913e","tarball":"https://registry.npmjs.org/@5n7/clv/-/clv-0.1.0.tgz","fileCount":4,"integrity":"sha512-gs6E340m3rSvgVUpKQ2oNvJN3AsTh6+muUuhixGaXh7RhXDrOnuLM8lcIKUHkEzkwzPG2w5suR17BxuPE4j0vQ==","signatures":[{"sig":"MEYCIQDWb9eDbr7aB+/HTGjBYTOeikXjMFH1w1RAPm6gXgTU4QIhAOxVxkF1M7JQgxqVjUIfmyNQYNJIAVOjm9qdj5MyyHk/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15605690},"type":"module","gitHead":"47a349d2632f5c869c5e47bc92d70e15913a2994","scripts":{"fmt":"dprint fmt","lint":"oxlint","test":"bun test","build":"bun run build:web && bun run build:cli","dev:web":"vite --config src/web/vite.config.ts","prepare":"test -f dist/cli.js || bun run build","build:cli":"bun build src/cli/index.ts --target=bun --outfile=dist/cli.js --minify","build:web":"vite build --config src/web/vite.config.ts","dev:serve":"bun src/cli/index.ts examples --port 7421 --no-open","fmt:check":"dprint check","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p src/web/tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"5n7","email":"iamshunta@gmail.com"},"_npmVersion":"11.12.1","description":"`clv` turns Markdown that Claude Code writes into a rich, live preview you can read in any browser. Claude embeds small JSON blocks (`` ```clv:<type> ``) in its review or explanation output; `clv` parses them, validates each against a schema, and renders ","directories":{},"_nodeVersion":"24.15.0","dependencies":{"cac":"^7.0.0","zod":"^4.1.12","clsx":"^2.1.1","react":"^19.2.0","shiki":"^3.13.0","marked":"^16.4.0","mermaid":"^11.12.0","recharts":"^3.2.1","react-dom":"^19.2.0","remark-gfm":"^4.0.1","lucide-react":"^0.577.0","@xyflow/react":"^12.8.6","@dagrejs/dagre":"^1.1.4","react-markdown":"^10.1.0","tailwind-merge":"^3.3.1","@git-diff-view/file":"^0.0.34","@git-diff-view/react":"^0.0.34","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","@tanstack/react-table":"^8.21.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.13","postcss":"^8.5.6","@types/bun":"latest","tailwindcss":"^3.4.18","@types/react":"^19.2.0","autoprefixer":"^10.4.21","@types/react-dom":"^19.2.0","@vitejs/plugin-react":"^6.0.2","vite-plugin-singlefile":"^2.3.3","@fontsource/ibm-plex-sans":"^5.2.6","@fontsource/ibm-plex-serif":"^5.2.6","@fontsource/jetbrains-mono":"^5.2.7"},"peerDependencies":{"dprint":"^0.54.0","oxlint":"^1.65.0","typescript":"^5.6"},"_npmOperationalInternal":{"tmp":"tmp/clv_0.1.0_1779511282511_0.9655660684437013","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@5n7/clv","version":"0.2.0","_id":"@5n7/clv@0.2.0","maintainers":[{"name":"5n7","email":"iamshunta@gmail.com"}],"bin":{"clv":"dist/cli.js"},"dist":{"shasum":"26192bb253717a736fb25db2892b60356bcb4a53","tarball":"https://registry.npmjs.org/@5n7/clv/-/clv-0.2.0.tgz","fileCount":4,"integrity":"sha512-ny7F3K5LF1SBGZDQF94rkN3SX4XwNksCShvBcl+R3zTnlAARFFJITFLCnHzin0rhwA5hX6hQQv0ZaUv/dvXYlg==","signatures":[{"sig":"MEUCIQCCwMkJ5DeSNKYeYOPHeP0gFSHlgzZJBZYGxhz4zhzSgAIgXGcalEOSMTUmfoDJj1RjoE2SWMXN31KGsRzjRh4nUT0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15618211},"type":"module","gitHead":"40e7f23fe4d50d4b4304ee5c5b03901c39fbcb8c","scripts":{"fmt":"dprint fmt","lint":"oxlint","test":"bun test","build":"bun run build:web && bun run build:cli","dev:web":"vite --config src/web/vite.config.ts","prepare":"test -f dist/cli.js || bun run build","build:cli":"bun build src/cli/index.ts --target=bun --outfile=dist/cli.js --minify","build:web":"vite build --config src/web/vite.config.ts","dev:serve":"bun src/cli/index.ts examples --port 7421 --no-open","fmt:check":"dprint check","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p src/web/tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"5n7","email":"iamshunta@gmail.com"},"_npmVersion":"11.12.1","description":"![clv rendering a Claude Code PR review in the browser](docs/screenshot.png)","directories":{},"_nodeVersion":"24.15.0","dependencies":{"cac":"^7.0.0","zod":"^4.1.12","clsx":"^2.1.1","react":"^19.2.0","shiki":"^3.13.0","marked":"^16.4.0","mermaid":"^11.12.0","recharts":"^3.2.1","react-dom":"^19.2.0","remark-gfm":"^4.0.1","lucide-react":"^0.577.0","@xyflow/react":"^12.8.6","@dagrejs/dagre":"^1.1.4","react-markdown":"^10.1.0","tailwind-merge":"^3.3.1","@git-diff-view/file":"^0.0.34","@git-diff-view/react":"^0.0.34","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","@tanstack/react-table":"^8.21.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.13","postcss":"^8.5.6","@types/bun":"latest","tailwindcss":"^3.4.18","@types/react":"^19.2.0","autoprefixer":"^10.4.21","@types/react-dom":"^19.2.0","@vitejs/plugin-react":"^6.0.2","vite-plugin-singlefile":"^2.3.3","@fontsource/ibm-plex-sans":"^5.2.6","@fontsource/ibm-plex-serif":"^5.2.6","@fontsource/jetbrains-mono":"^5.2.7"},"peerDependencies":{"dprint":"^0.54.0","oxlint":"^1.65.0","typescript":"^5.6"},"_npmOperationalInternal":{"tmp":"tmp/clv_0.2.0_1779532033809_0.043926209791273374","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@5n7/clv","version":"0.2.1","_id":"@5n7/clv@0.2.1","maintainers":[{"name":"5n7","email":"iamshunta@gmail.com"}],"homepage":"https://github.com/5n7/clv#readme","bugs":{"url":"https://github.com/5n7/clv/issues"},"bin":{"clv":"dist/cli.js"},"dist":{"shasum":"271b8134d35660002a7d4b639f59d2dc100e2cb9","tarball":"https://registry.npmjs.org/@5n7/clv/-/clv-0.2.1.tgz","fileCount":5,"integrity":"sha512-OJxWJpIf/SPd6SPtGEOtSvlWvjJnbgz4Qjx3safU9/EEYaXmrKRNlotS+c41D2rBccqIFgSOKXdAM1aCBMPbjA==","signatures":[{"sig":"MEYCIQD3+K5l/DwUhJsPRTAjIzihSU8tLPfrk2pfttwjMu+CKwIhAJkt82/o8wiii1YEynGLVfiRSVYTAODm0VVXz6R/MBKI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15635443},"type":"module","gitHead":"d8ab0a92da52e3bf29cee53e4fb14746dfcc0bf2","scripts":{"fmt":"dprint fmt","lint":"oxlint","test":"bun test","build":"bun run build:web && bun run build:cli","dev:web":"vite --config src/web/vite.config.ts","prepare":"test -f dist/cli.js || bun run build","build:cli":"bun build src/cli/index.ts --target=bun --outfile=dist/cli.js --minify","build:web":"vite build --config src/web/vite.config.ts","dev:serve":"bun src/cli/index.ts examples --port 7421 --no-open","fmt:check":"dprint check","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p src/web/tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"5n7","email":"iamshunta@gmail.com"},"repository":{"url":"git+https://github.com/5n7/clv.git","type":"git"},"_npmVersion":"11.12.1","description":"![clv rendering a Claude Code PR review in the browser](https://raw.githubusercontent.com/5n7/clv/main/docs/screenshot.png)","directories":{},"_nodeVersion":"24.15.0","dependencies":{"cac":"^7.0.0","zod":"^4.1.12","clsx":"^2.1.1","react":"^19.2.0","shiki":"^3.13.0","marked":"^16.4.0","mermaid":"^11.12.0","recharts":"^3.2.1","react-dom":"^19.2.0","remark-gfm":"^4.0.1","lucide-react":"^0.577.0","@xyflow/react":"^12.8.6","@dagrejs/dagre":"^1.1.4","react-markdown":"^10.1.0","tailwind-merge":"^3.3.1","@git-diff-view/file":"^0.0.34","@git-diff-view/react":"^0.0.34","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","@tanstack/react-table":"^8.21.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.13","postcss":"^8.5.6","@types/bun":"latest","tailwindcss":"^3.4.18","@types/react":"^19.2.0","autoprefixer":"^10.4.21","@types/react-dom":"^19.2.0","@vitejs/plugin-react":"^6.0.2","vite-plugin-singlefile":"^2.3.3","@fontsource/ibm-plex-sans":"^5.2.6","@fontsource/ibm-plex-serif":"^5.2.6","@fontsource/jetbrains-mono":"^5.2.7"},"peerDependencies":{"dprint":"^0.54.0","oxlint":"^1.65.0","typescript":"^5.6"},"_npmOperationalInternal":{"tmp":"tmp/clv_0.2.1_1779584262657_0.8511613417789485","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@5n7/clv","version":"0.3.0","_id":"@5n7/clv@0.3.0","maintainers":[{"name":"5n7","email":"iamshunta@gmail.com"}],"homepage":"https://github.com/5n7/clv#readme","bugs":{"url":"https://github.com/5n7/clv/issues"},"bin":{"clv":"dist/cli.js"},"dist":{"shasum":"e45840d5ff7f2b573e707eaf9a9d20e898da0648","tarball":"https://registry.npmjs.org/@5n7/clv/-/clv-0.3.0.tgz","fileCount":5,"integrity":"sha512-aw8F/dR4cLIdjMYBhMFxBhEvptsECZ3k0SOdykFQMy02q2iys2uBHVYXy608lNjhn7W3ZwIyaO9Ep/VXv3h6fw==","signatures":[{"sig":"MEUCIQDDyABGTwkE1hYT8bpwToizZMBydQm6katgPlGBkFEtdgIgBzigbKwY7i76D45gPOFXb5jMUbRPFthMbOP9k2FJG0k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19256734},"type":"module","gitHead":"920d7feb56f8e7f1d47c65b0af28d01da76c28f9","scripts":{"fmt":"dprint fmt","lint":"oxlint","test":"bun test","build":"bun run build:web && bun run build:cli","dev:web":"vite --config src/web/vite.config.ts","prepare":"test -f dist/cli.js || bun run build","build:cli":"bun build src/cli/index.ts --target=bun --outfile=dist/cli.js --minify","build:web":"vite build --config src/web/vite.config.ts","dev:serve":"bun src/cli/index.ts examples --port 7421 --no-open","fmt:check":"dprint check","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p src/web/tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"5n7","email":"iamshunta@gmail.com"},"repository":{"url":"git+https://github.com/5n7/clv.git","type":"git"},"_npmVersion":"11.12.1","description":"![clv rendering a Claude Code PR review in the browser](https://raw.githubusercontent.com/5n7/clv/main/docs/screenshot.png)","directories":{},"_nodeVersion":"24.15.0","dependencies":{"cac":"^7.0.0","zod":"^4.1.12","clsx":"^2.1.1","katex":"^0.16.22","react":"^19.2.0","shiki":"^3.13.0","marked":"^16.4.0","mermaid":"^11.12.0","recharts":"^3.2.1","react-dom":"^19.2.0","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","rehype-slug":"^6.0.0","remark-math":"^6.0.0","lucide-react":"^0.577.0","rehype-katex":"^7.0.1","@xyflow/react":"^12.8.6","@dagrejs/dagre":"^1.1.4","react-markdown":"^10.1.0","tailwind-merge":"^3.3.1","rehype-sanitize":"^6.0.0","@git-diff-view/file":"^0.0.34","@git-diff-view/react":"^0.0.34","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","@tanstack/react-table":"^8.21.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.13","postcss":"^8.5.6","@types/bun":"latest","tailwindcss":"^3.4.18","@types/react":"^19.2.0","autoprefixer":"^10.4.21","@types/react-dom":"^19.2.0","@vitejs/plugin-react":"^6.0.2","vite-plugin-singlefile":"^2.3.3","@fontsource/ibm-plex-sans":"^5.2.6","@fontsource/ibm-plex-serif":"^5.2.6","@fontsource/jetbrains-mono":"^5.2.7"},"peerDependencies":{"dprint":"^0.54.0","oxlint":"^1.65.0","typescript":"^5.6"},"_npmOperationalInternal":{"tmp":"tmp/clv_0.3.0_1780644637510_0.6450480500049234","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@5n7/clv","version":"0.4.0","type":"module","repository":{"type":"git","url":"git+https://github.com/5n7/clv.git"},"homepage":"https://github.com/5n7/clv#readme","bugs":{"url":"https://github.com/5n7/clv/issues"},"bin":{"clv":"dist/cli.js"},"publishConfig":{"access":"public"},"scripts":{"build":"bun run build:web && bun run build:cli","build:cli":"bun build src/cli/index.ts --target=bun --outfile=dist/cli.js --minify","build:web":"vite build --config src/web/vite.config.ts","dev:serve":"bun src/cli/index.ts examples --port 7421 --no-open","dev:web":"vite --config src/web/vite.config.ts","fmt":"dprint fmt","fmt:check":"dprint check","lint":"oxlint","prepare":"test -f dist/cli.js || bun run build","prepublishOnly":"bun run build","test":"bun test","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p src/web/tsconfig.json --noEmit"},"dependencies":{"@dagrejs/dagre":"^1.1.4","@git-diff-view/file":"^0.0.34","@git-diff-view/react":"^0.0.34","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","@tanstack/react-table":"^8.21.3","@xyflow/react":"^12.8.6","cac":"^7.0.0","class-variance-authority":"^0.7.1","clsx":"^2.1.1","katex":"^0.16.22","lucide-react":"^0.577.0","marked":"^16.4.0","mermaid":"^11.12.0","react":"^19.2.0","react-dom":"^19.2.0","react-markdown":"^10.1.0","recharts":"^3.2.1","rehype-katex":"^7.0.1","rehype-raw":"^7.0.0","rehype-sanitize":"^6.0.0","rehype-slug":"^6.0.0","remark-gfm":"^4.0.1","remark-math":"^6.0.0","shiki":"^3.13.0","tailwind-merge":"^3.3.1","zod":"^4.1.12"},"devDependencies":{"@fontsource/ibm-plex-sans":"^5.2.6","@fontsource/ibm-plex-serif":"^5.2.6","@fontsource/jetbrains-mono":"^5.2.7","@types/bun":"latest","@types/react":"^19.2.0","@types/react-dom":"^19.2.0","@vitejs/plugin-react":"^6.0.2","autoprefixer":"^10.4.21","postcss":"^8.5.6","tailwindcss":"^3.4.18","vite":"^8.0.13","vite-plugin-singlefile":"^2.3.3"},"peerDependencies":{"dprint":"^0.54.0","oxlint":"^1.65.0","typescript":"^5.6"},"gitHead":"7184fe27aa0a3d846b29e243ce5aa9c4f6e364f4","_id":"@5n7/clv@0.4.0","description":"![clv rendering a Claude Code PR review in the browser](https://raw.githubusercontent.com/5n7/clv/main/docs/screenshot.png)","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-FO3+ASf0qaabltDmB0RAv3FcO+uTT/Q5wtMGtLc2ml2CPA7ColGbxYGZuL8vFqTDCruixiWJ+qILP5fh0JJtUQ==","shasum":"97689f76a18311b97c154bbea4099f46750c76e8","tarball":"https://registry.npmjs.org/@5n7/clv/-/clv-0.4.0.tgz","fileCount":5,"unpackedSize":19260352,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC4KjQf8ub6SBrJ7KCVdBxe6Uh9vARUsdlsTddEsazoMwIhAJDFk6EQ2MPq6uy+Szdxd18xoRKKG3GOvt9gbgAXlsNq"}]},"_npmUser":{"name":"5n7","email":"iamshunta@gmail.com"},"directories":{},"maintainers":[{"name":"5n7","email":"iamshunta@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/clv_0.4.0_1780657569058_0.3359344226410148"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-23T04:41:22.325Z","modified":"2026-06-05T11:06:09.463Z","0.1.0":"2026-05-23T04:41:22.745Z","0.2.0":"2026-05-23T10:27:14.092Z","0.2.1":"2026-05-24T00:57:43.002Z","0.3.0":"2026-06-05T07:30:37.763Z","0.4.0":"2026-06-05T11:06:09.361Z"},"bugs":{"url":"https://github.com/5n7/clv/issues"},"homepage":"https://github.com/5n7/clv#readme","repository":{"type":"git","url":"git+https://github.com/5n7/clv.git"},"description":"![clv rendering a Claude Code PR review in the browser](https://raw.githubusercontent.com/5n7/clv/main/docs/screenshot.png)","maintainers":[{"name":"5n7","email":"iamshunta@gmail.com"}],"readme":"# clv\n\n![clv rendering a Claude Code PR review in the browser](https://raw.githubusercontent.com/5n7/clv/main/docs/screenshot.png)\n\n`clv` turns Markdown that Claude Code writes into a rich, live preview you can read in any browser. Claude embeds small JSON blocks (`` ```clv:<type> ``) in its review or explanation output; `clv` parses them, validates each against a schema, and renders them as callouts, annotated code, diffs, charts, dependency graphs, step-by-step walkthroughs, and more.\n\n- **Live preview** — `clv review.md` opens the document in your browser and live-reloads it on every save, preserving scroll position.\n- **Multi-file** — point `clv` at several files or a directory and navigate them from a sidebar (flat/tree view, filename/heading-title toggle, search) at one localhost address. Files are grouped by their GitHub `owner/repo` automatically, or under a name you pass with `-g`/`--group`. Hover a file row or group header for a `×` that closes it (dropping it from the session, never deleting it from disk).\n- **Background daemon** — re-running `clv` adds files to the already-running session instead of starting a new server; the open files are persisted and restored on restart.\n- **Static export** — `clv --output out.html` writes a single self-contained HTML file (all JS, CSS, fonts, and images inlined; no network calls). Open it offline, email it, or commit it.\n- **Graceful** — unknown or malformed blocks render as a clearly marked fallback instead of failing the whole document.\n\n## Usage\n\nThe npm package is published as `@5n7/clv`, but the command it installs is `clv`. Run it ad hoc with `bunx`, or install it globally for repeated use:\n\n```bash\n# One-off, no install:\nbunx @5n7/clv review.md\n\n# Or install globally; the command is then `clv`:\nbun add -g @5n7/clv\nclv review.md\n```\n\nThe examples below use `bunx @5n7/clv`; if you have installed globally, drop the `bunx` and call `clv` directly.\n\n```bash\n# Open a file in your browser with live reload\nbunx @5n7/clv review.md\n\n# Open every Markdown file in a directory (recurse with -R)\nbunx @5n7/clv docs/\nbunx @5n7/clv -R docs/\n\n# Add more files to the already-running session\nbunx @5n7/clv notes.md design.md\n\n# Local development against this repo\nbun run src/cli/index.ts review.md\n```\n\n`clv <paths...>` starts (or reuses) a background live preview server on `localhost:7421` and opens your browser to it. The paths may be files or directories; `clv` watches them and live-reloads the browser whenever a file changes, preserving scroll position. When more than one file is open, a sidebar lets you navigate between them and the active file is reflected in the URL (`?file=<id>`). Files are organized into collapsible sidebar groups: by default each file is grouped by the GitHub `owner/repo` of the repository its own directory belongs to (files outside any repo fall under `\"default\"`), so opening files from several repos keeps them visually separated. Pass `-g`/`--group <name>` to put the files from that invocation under an explicit name instead. Hovering a file row or group header reveals a `×` that closes it — removing the file (or every file in the group) from the session. Nothing is deleted from disk, and the removal is persisted, so a closed file does not reappear when the daemon restarts.\n\nThe server runs as a detached daemon and outlives the command that launched it. Re-running `clv` with new paths registers them into the running session rather than spawning a second server, and the open files are persisted so they reappear if the daemon is restarted.\n\n`--theme` and `--watch`/`--no-watch` are fixed when the daemon starts and apply for its whole lifetime. Re-running `clv` with different values only registers the new paths — it does not re-theme or toggle watching the running daemon (you'll get a notice when the value you pass is ignored). Run `clv shutdown` and start again to change them.\n\n```bash\n# Inspect the running daemon (port, pid, file count)\nbunx @5n7/clv status\n\n# Stop the daemon\nbunx @5n7/clv shutdown\n```\n\nRun `clv doc` to print the full showcase document (all 14 block types) to stdout, or `clv doc <block>` (e.g. `clv doc callout`) to print a single block's schema and a worked example — handy for learning the block format or piping into a file. A file literally named `doc` is shadowed by the subcommand; use `./doc` or `clv doc.md` to preview such a file.\n\n### Static export\n\nTo produce a single self-contained HTML file instead of starting a server, pass `--output`. This converts the Markdown and writes the file without opening a browser:\n\n```bash\n# Write one self-contained HTML file (no server, no browser)\nbunx @5n7/clv review.md --output review.html\n\n# Pipe Claude Code's output straight in\nclaude -p \"review this PR\" | bunx @5n7/clv --output review.html\n```\n\nA piped document with no `--output` is rendered to a temporary file and opened directly, so the bare pipe still works as a one-shot view:\n\n```bash\n# View a piped document once, without a server\nclaude -p \"review this PR\" | bunx @5n7/clv\n```\n\n### CLI options\n\n| Flag                          | Default | Description                                                                                                                                                                              |\n| ----------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `<paths...>`                  | stdin   | Markdown files or directories to serve. Reads standard input when omitted.                                                                                                               |\n| `doc [block]`                 | —       | Print clv format help to stdout and exit: no block = full showcase (all 14 types); `doc <block>` = one block's schema + example. Must be the first argument; shadows a file named `doc`. |\n| `status`                      | —       | Show the running clv daemon (port, pid, files) and exit. Must be the first argument; targets `--port` (default `7421`); shadows a file named `status`.                                   |\n| `shutdown`                    | —       | Stop the running clv daemon and exit. Must be the first argument; targets `--port` (default `7421`); shadows a file named `shutdown`.                                                    |\n| `--output <path>`             | —       | Static export: write HTML to `<path>` and exit (no server, no browser).                                                                                                                  |\n| `--port <number>`             | `7421`  | Live preview server port.                                                                                                                                                                |\n| `-w`, `--watch`               | on      | Watch files and live-reload. On by default; use `--no-watch` to disable.                                                                                                                 |\n| `--no-watch`                  | —       | Disable file watching / live-reload.                                                                                                                                                     |\n| `-R`, `--recursive`           | false   | Recurse into subdirectories when a directory is given.                                                                                                                                   |\n| `-g`, `--group <name>`        | auto    | Group files under `<name>` in the sidebar. When omitted, each file is grouped by the GitHub `owner/repo` of its own repo, else `\"default\"`.                                              |\n| `--no-open`                   | false   | Do not auto-launch the browser.                                                                                                                                                          |\n| `--title <string>`            | `\"clv\"` | HTML `<title>`.                                                                                                                                                                          |\n| `--theme <auto\\|light\\|dark>` | `auto`  | Color scheme. `auto` follows `prefers-color-scheme`.                                                                                                                                     |\n| `--strict`                    | false   | With `--output` (static export): exit 1 if any block fails validation (default: render fallback and continue). Ignored in live preview mode.                                             |\n| `-h`, `--help`                | —       | Print usage and exit.                                                                                                                                                                    |\n| `-v`, `--version`             | —       | Print version and exit.                                                                                                                                                                  |\n\n## Block catalog\n\nEach block is a fenced code block whose info string is `clv:<type>` with an optional attribute list, and whose body is a single JSON object:\n\n````markdown\n```clv:callout title=\"N+1 detected\"\n{ \"kind\": \"warning\", \"body\": \"ListOrders issues one query per row.\" }\n```\n````\n\nHeader attributes (`title=\"…\"` etc.) are merged into the payload; on conflict the JSON body wins. The body must be plain JSON — no comments, no trailing commas. Every block also accepts the optional fields `title`, `collapsed`, and `id`. For Mermaid you may use a bare `` ```mermaid `` fence instead of `clv:mermaid`; the whole body is the diagram source.\n\n| Type            | What it renders                                                                                          |\n| --------------- | -------------------------------------------------------------------------------------------------------- |\n| `clv:callout`   | Colored alert (info / tip / warning / danger / critical) with a Markdown body.                           |\n| `clv:chart`     | Bar, line, area, pie, or scatter chart over tabular data.                                                |\n| `clv:checklist` | Quality-gate list with pass / fail / na / skip status and a tally bar.                                   |\n| `clv:code`      | Syntax-highlighted code with per-line severity annotations and highlighted lines.                        |\n| `clv:diff`      | Before/after code diff (split or unified).                                                               |\n| `clv:findings`  | Review findings grouped by severity; each can link to a `clv:code` block.                                |\n| `clv:graph`     | Node/edge diagram (dependency graph, call graph) with dagre layout.                                      |\n| `clv:metrics`   | Grid of KPI cards with deltas and up / down / neutral trends.                                            |\n| `clv:mermaid`   | Mermaid diagram.                                                                                         |\n| `clv:steps`     | Step player with Prev/Next, keyboard nav, and dots; each step is Markdown plus an optional nested block. |\n| `clv:table`     | Sortable data table; columns can be syntax-highlighted.                                                  |\n| `clv:tabs`      | Tabbed panels; each tab is Markdown or a nested block.                                                   |\n| `clv:timeline`  | Numbered vertical rail of phases/events, each with a severity.                                           |\n| `clv:tree`      | Changed-file tree with per-file status badges and optional anchors.                                      |\n\nSee [`examples/review.clv.md`](https://github.com/5n7/clv/blob/main/examples/review.clv.md) for a document that exercises all 14 types plus a deliberate unknown-block fallback. Copy [`docs/output-style-clv.md`](https://github.com/5n7/clv/blob/main/docs/output-style-clv.md) into `CLAUDE.md` or `~/.claude/output-styles/` so Claude emits valid blocks; that file has the full schema for each type.\n\n## Self-contained output\n\n`--output` produces a single HTML file that embeds bundled JS, CSS, WOFF2 fonts (IBM Plex Sans/Serif, JetBrains Mono), and the document JSON (`window.__CLV_DATA__`). It makes no network requests at runtime. The live preview server serves the same React viewer, but fetches documents over an HTTP API and pushes updates over a WebSocket so the page reloads as you edit.\n\nDesign tokens use CSS `oklch()` and `color-mix()`. You need a recent browser (Chrome/Edge 111+, Safari 16.4+, Firefox 113+). Older browsers render but colors may degrade.\n\n## Implementation notes\n\n- **Graph:** uses [`@xyflow/react`](https://reactflow.dev) v12 with `@dagrejs/dagre` layout. `layout: \"force\"` falls back to dagre; `layout: \"manual\"` uses per-node `x`/`y` only when every node provides them, otherwise dagre.\n- **Markdown:** prose fields are rendered with `react-markdown` in the browser.\n\n## Known limitations\n\nWhen a finding's context link targets a `clv:code` block nested inside `clv:tabs` or `clv:steps`, only the active tab or current step is mounted, so the hash jump may be a no-op until the user opens that tab or step. The inline snippet shown when a finding is expanded is unaffected.\n\n## Build from source\n\nRequires [Bun](https://bun.sh).\n\n```bash\nbun install\nbun run build   # web SPA (dist/template.html), then CLI bundle (dist/cli.js)\n```\n\n`build:web` runs Vite with `vite-plugin-singlefile`; `build:cli` bundles `src/cli/index.ts` and text-imports the template so the CLI has no runtime file dependency. The published package ships `dist/` only.\n\nFor UI work without the CLI:\n\n```bash\nbun run dev:web   # Vite dev server; sample document in dev-data.ts\n```\n\nOther scripts: `bun run fmt`, `bun run fmt:check`, `bunx oxlint`.\n","readmeFilename":"README.md"}