{"_id":"@dreki-gg/pi-pr-canvas","_rev":"4-7886f9ec377385dbfb1a46578499258a","name":"@dreki-gg/pi-pr-canvas","dist-tags":{"latest":"1.7.0"},"versions":{"1.6.0":{"name":"@dreki-gg/pi-pr-canvas","version":"1.6.0","keywords":["pi-package","pi","github","pull-request","canvas","review"],"author":{"name":"Juan Albarran","email":"jalbarrandev@gmail.com"},"license":"MIT","_id":"@dreki-gg/pi-pr-canvas@1.6.0","maintainers":[{"name":"jalbarrang","email":"jalbarrandev@gmail.com"}],"homepage":"https://github.com/dreki-gg/pi-extensions#readme","bugs":{"url":"https://github.com/dreki-gg/pi-extensions/issues"},"pi":{"extensions":["./extensions/pr-canvas"]},"dist":{"shasum":"734390ae1371a6fec62e20f165db1fee62a63f92","tarball":"https://registry.npmjs.org/@dreki-gg/pi-pr-canvas/-/pi-pr-canvas-1.6.0.tgz","fileCount":1652,"integrity":"sha512-3b8sAtWLGYpb/ncEv2NWn/PjbnDgLoOOzQt6Ml+R+x5bumO/ve6jGYopt8JxIa2K0JzTMO4tBIPkqCIvxhQ1qg==","signatures":[{"sig":"MEUCIEq7QPU11gEC8zPQjUjc219OI1i92DS3GFfzfr7zb4zkAiEA+r0abhvRGY1SzdvXErwDDGvCbe9lc9EIPEtmY2J4BSI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27252213},"type":"module","gitHead":"c48ed25bbb6c9b5441dd1fa2184e5b59313f02f0","scripts":{"dev":"cd app && npx vinxi dev","lint":"oxlint extensions test","test":"bun test","build":"cd app && npx vinxi build","format":"oxfmt --write extensions test","typecheck":"tsc --noEmit","format:check":"oxfmt --check extensions test"},"_npmUser":{"name":"jalbarrang","email":"jalbarrandev@gmail.com"},"repository":{"url":"git+https://github.com/dreki-gg/pi-extensions.git","type":"git","directory":"packages/pr-canvas"},"_npmVersion":"11.12.1","description":"Visual GitHub Pull Request canvas for pi — generate a self-contained HTML overview of any PR with file tree, diffs, CI checks, comments, and AI-powered mind map","directories":{},"_nodeVersion":"24.12.0","dependencies":{"ws":"^8.18.0","effect":"^3.12.0"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.43.0","oxlint":"^1.58.0","@types/ws":"^8.5.0","typescript":"^6.0.0","@types/node":"24"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pi-pr-canvas_1.6.0_1780120977723_0.6594909435893448","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Deprecated and unmaintained — no replacement"},"1.6.1":{"name":"@dreki-gg/pi-pr-canvas","version":"1.6.1","keywords":["pi-package","pi","github","pull-request","canvas","review"],"author":{"name":"Juan Albarran","email":"jalbarrandev@gmail.com"},"license":"MIT","_id":"@dreki-gg/pi-pr-canvas@1.6.1","maintainers":[{"name":"jalbarrang","email":"jalbarrandev@gmail.com"}],"homepage":"https://github.com/dreki-gg/pi-extensions#readme","bugs":{"url":"https://github.com/dreki-gg/pi-extensions/issues"},"pi":{"extensions":["./extensions/pr-canvas"]},"dist":{"shasum":"12d33194e3051de15d7f149f1d325c42ab716a57","tarball":"https://registry.npmjs.org/@dreki-gg/pi-pr-canvas/-/pi-pr-canvas-1.6.1.tgz","fileCount":33,"integrity":"sha512-P0kbHNq5dIW3kjgTNET4n8x7Dh8aKEbmmkuBjThB4J7zzGV/khcivp4gKQAL5QSDGZ+HvBk8KOIE+Fq1SU+S2Q==","signatures":[{"sig":"MEQCIHQvVWxr0BhyK4rNqhQqXkUKU5pPTfXvXdI62+XzwT/SAiAVlsZXOrhN9afErM1/taVn6vhLnkRmkJMieKoJHl1jEw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dreki-gg%2fpi-pr-canvas@1.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":127948},"type":"module","gitHead":"524efa3c9a28291a578d820c460c6637b200fb02","scripts":{"dev":"cd app && npx vinxi dev","lint":"oxlint extensions test","test":"bun test","build":"cd app && npx vinxi build","format":"oxfmt --write extensions test","typecheck":"tsc --noEmit","format:check":"oxfmt --check extensions test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:06be81f9-b7f8-4d10-8611-420bfc096cc5"}},"repository":{"url":"git+https://github.com/dreki-gg/pi-extensions.git","type":"git","directory":"packages/pr-canvas"},"_npmVersion":"11.13.0","description":"Visual GitHub Pull Request canvas for pi — generate a self-contained HTML overview of any PR with file tree, diffs, CI checks, comments, and AI-powered mind map","directories":{},"_nodeVersion":"24.16.0","dependencies":{"ws":"^8.18.0","effect":"^3.12.0"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.43.0","oxlint":"^1.58.0","@types/ws":"^8.5.0","typescript":"^6.0.0","@types/node":"24"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pi-pr-canvas_1.6.1_1781383165162_0.8447985453777891","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Deprecated and unmaintained — no replacement"},"1.7.0":{"name":"@dreki-gg/pi-pr-canvas","version":"1.7.0","keywords":["pi-package","pi","github","pull-request","canvas","review"],"author":{"name":"Juan Albarran","email":"jalbarrandev@gmail.com"},"license":"MIT","_id":"@dreki-gg/pi-pr-canvas@1.7.0","maintainers":[{"name":"jalbarrang","email":"jalbarrandev@gmail.com"}],"homepage":"https://github.com/dreki-gg/pi-extensions#readme","bugs":{"url":"https://github.com/dreki-gg/pi-extensions/issues"},"pi":{"extensions":["./extensions/pr-canvas"]},"dist":{"shasum":"f10eb1bace8f0aa647752a2f71433da6d423a3b9","tarball":"https://registry.npmjs.org/@dreki-gg/pi-pr-canvas/-/pi-pr-canvas-1.7.0.tgz","fileCount":34,"integrity":"sha512-SMo50OI5plQS7OpNbj0seOMBOGlrY16WLciXSpnn6LB4DtjbeL1Ax4ZfM5DMzh6yY2CU7rCNZXi0gjAK2EuI3A==","signatures":[{"sig":"MEQCIDwhDGH1MX2chxyn+9cqWHYo/3myLbybRd4zrixt+XZNAiBMjAXoUnqIKyt3ajlLdzdS/MYBwEVlwhP8WWyYLBoJ7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dreki-gg%2fpi-pr-canvas@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":129390},"type":"module","gitHead":"2a5c2d4c52118fec134f8400cb76a86dd1e2ddf2","scripts":{"dev":"cd app && npx vinxi dev","lint":"oxlint extensions test","test":"bun test","build":"cd app && npx vinxi build","format":"oxfmt --write extensions test","typecheck":"tsc --noEmit","format:check":"oxfmt --check extensions test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:06be81f9-b7f8-4d10-8611-420bfc096cc5"}},"repository":{"url":"git+https://github.com/dreki-gg/pi-extensions.git","type":"git","directory":"packages/pr-canvas"},"_npmVersion":"11.13.0","description":"Visual GitHub Pull Request canvas for pi — generate a self-contained HTML overview of any PR with file tree, diffs, CI checks, comments, and AI-powered mind map","directories":{},"_nodeVersion":"24.16.0","dependencies":{"ws":"^8.18.0","effect":"^3.12.0"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.43.0","oxlint":"^1.58.0","@types/ws":"^8.5.0","typescript":"^6.0.0","@types/node":"24"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pi-pr-canvas_1.7.0_1781575288147_0.19297261308504443","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Deprecated and unmaintained — no replacement"}},"time":{"created":"2026-05-30T06:02:57.545Z","modified":"2026-06-25T02:46:43.118Z","1.6.0":"2026-05-30T06:02:58.059Z","1.6.1":"2026-06-13T20:39:25.291Z","1.7.0":"2026-06-16T02:01:28.358Z"},"bugs":{"url":"https://github.com/dreki-gg/pi-extensions/issues"},"author":{"name":"Juan Albarran","email":"jalbarrandev@gmail.com"},"license":"MIT","homepage":"https://github.com/dreki-gg/pi-extensions#readme","keywords":["pi-package","pi","github","pull-request","canvas","review"],"repository":{"url":"git+https://github.com/dreki-gg/pi-extensions.git","type":"git","directory":"packages/pr-canvas"},"description":"Visual GitHub Pull Request canvas for pi — generate a self-contained HTML overview of any PR with file tree, diffs, CI checks, comments, and AI-powered mind map","maintainers":[{"name":"jalbarrang","email":"jalbarrandev@gmail.com"}],"readme":"# @dreki-gg/pi-pr-canvas\n\nInteractive GitHub Pull Request canvas for [pi](https://github.com/earendil-works/pi).\n\nA local web application that gives you a complete mental model of any PR — with interactive diffs, file tree, Pi-model review synthesis with heuristic fallback, CI checks, comments, and an AI chat assistant. Powered by SolidStart, Effect, and Pierre.\n\n## Prerequisites\n\n- [GitHub CLI (`gh`)](https://cli.github.com/) installed and authenticated (`gh auth login`)\n- Node.js 18+\n\n## Installation\n\n```bash\npi install @dreki-gg/pi-pr-canvas\n```\n\n## Usage\n\n```\n/pr-canvas start              # Start the server and open the dashboard\n/pr-canvas stop               # Stop the server\n/pr-canvas open [number]      # Open a specific PR or the dashboard\n/pr-canvas status             # Show server status\n```\n\nThe web UI runs at `http://localhost:3000` with a WebSocket bridge on port `3001`.\n\n## Architecture\n\n```\n┌─────────────────┐     WebSocket      ┌──────────────────────┐\n│   SolidStart    │ ◄─────────────────► │     Pi Extension     │\n│   (Web UI)      │      Messages:      │    (ws-bridge.ts)    │\n│  localhost:3000  │   pr:list/data      │                      │\n│                 │   ai:chat           │  Uses:               │\n│  • @pierre/diffs│   pr:subscribe      │  • pi.exec('gh')     │\n│  • @pierre/trees│                     │  • Effect services   │\n│  • AI Chat      │                     │  • Schema validation │\n└─────────────────┘                     └──────────────────────┘\n```\n\n### How it works\n\n1. `/pr-canvas start` launches a WebSocket bridge + SolidStart server\n2. The web UI connects to Pi via WebSocket for all data\n3. Pi fetches PR data using `gh` CLI and validates with Effect Schema\n4. Diffs render via [@pierre/diffs](https://diffs.com/) with syntax highlighting\n5. File tree renders via [@pierre/trees](https://trees.software/) with git status\n6. AI review synthesis and chat use Pi's current model when available, with deterministic heuristics as a fallback\n\n## Canvas Sections\n\n| Section | Description |\n|---------|-------------|\n| **Overview** | Title, description, author, branch, state, labels, stats |\n| **File Tree** | Interactive tree with git status badges (A/M/D/R) |\n| **Mind Map** | Semantic grouping of changes (feature, refactor, fix, test, etc.) |\n| **Diff Preview** | Syntax-highlighted diffs with split/unified toggle |\n| **CI Checks** | Status of all CI checks (pass/fail/pending) |\n| **Comments** | PR comments, reviews, and inline discussion threads |\n| **Review Summary** | Pi-model synthesis when available, otherwise deterministic purpose, impact, highlights, hot-spots, and open questions |\n\n## Tech Stack\n\n- **[SolidStart](https://start.solidjs.com/)** — Fullstack framework (SSR + file-based routing)\n- **[Effect](https://effect.website/)** v3 — Typed errors, Schema validation, service layers\n- **[@pierre/diffs](https://diffs.com/)** — Diff rendering with Shiki syntax highlighting\n- **[@pierre/trees](https://trees.software/)** — File tree with git status\n- **WebSocket** — Real-time bridge between Pi and the web UI\n\n## Development\n\n```bash\n# Run the SolidStart dev server (hot reload)\ncd packages/pr-canvas && bun run dev\n\n# Run tests\nbun test\n\n# Typecheck extension code\nbun run typecheck\n\n# Build for production\nbun run build\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}