{"id":47605254,"url":"https://github.com/ofershap/cursor-plan-preview","last_synced_at":"2026-04-01T19:09:49.336Z","repository":{"id":345501348,"uuid":"1186131951","full_name":"ofershap/cursor-plan-preview","owner":"ofershap","description":"Visual plan preview and team sharing for Cursor's plan mode. CPR — X-ray your plans before you build.","archived":false,"fork":false,"pushed_at":"2026-03-19T17:44:25.000Z","size":913,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-20T03:19:38.914Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ofershap.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"ofershap"}},"created_at":"2026-03-19T09:53:30.000Z","updated_at":"2026-03-19T17:44:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ofershap/cursor-plan-preview","commit_stats":null,"previous_names":["ofershap/cursor-plan-preview"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ofershap/cursor-plan-preview","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ofershap%2Fcursor-plan-preview","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ofershap%2Fcursor-plan-preview/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ofershap%2Fcursor-plan-preview/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ofershap%2Fcursor-plan-preview/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ofershap","download_url":"https://codeload.github.com/ofershap/cursor-plan-preview/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ofershap%2Fcursor-plan-preview/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291090,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-01T19:09:48.638Z","updated_at":"2026-04-01T19:09:49.327Z","avatar_url":"https://github.com/ofershap.png","language":"TypeScript","funding_links":["https://github.com/sponsors/ofershap"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.svg\" alt=\"cursor-plan-preview\" width=\"120\" height=\"120\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003ecursor-plan-preview\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eYour agent writes a plan. But your team has no idea what it's about to build.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  The bottleneck in agentic development isn't writing code anymore. It's getting the plan right.\u003cbr\u003e\n  A bad plan burns tokens, wastes hours, and ships the wrong thing. Team review before execution isn't optional.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Visual plan review for Cursor. Annotate inline, share with your team,\u003cbr\u003e\n  get feedback back to the agent. No backend, no accounts.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://ofershap.github.io/cursor-plan-preview/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Live_Preview-22c55e?style=for-the-badge\u0026logoColor=white\" alt=\"Live Preview\" /\u003e\u003c/a\u003e\n  \u0026nbsp;\n  \u003ca href=\"#quick-start\"\u003e\u003cimg src=\"https://img.shields.io/badge/Install-3b82f6?style=for-the-badge\u0026logoColor=white\" alt=\"Install\" /\u003e\u003c/a\u003e\n  \u0026nbsp;\n  \u003ca href=\"#how-it-works\"\u003e\u003cimg src=\"https://img.shields.io/badge/How_It_Works-8b5cf6?style=for-the-badge\u0026logoColor=white\" alt=\"How It Works\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/ofershap/cursor-plan-preview/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/ofershap/cursor-plan-preview?style=social\" alt=\"GitHub stars\" /\u003e\u003c/a\u003e\n  \u0026nbsp;\n  \u003ca href=\"https://www.npmjs.com/package/cursor-plan-preview\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/cursor-plan-preview.svg\" alt=\"npm version\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/cursor-plan-preview\"\u003e\u003cimg src=\"https://img.shields.io/npm/dm/cursor-plan-preview.svg\" alt=\"npm downloads\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ofershap/cursor-plan-preview/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/ofershap/cursor-plan-preview/actions/workflows/ci.yml/badge.svg\" alt=\"CI\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.typescriptlang.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/TypeScript-strict-blue\" alt=\"TypeScript\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"License: MIT\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://makeapullrequest.com\"\u003e\u003cimg src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg\" alt=\"PRs Welcome\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Your Agent Plans in the Dark\n\nCursor's plan mode generates a detailed implementation plan - files to change, architecture decisions, task breakdown. You approve it, the agent starts building. Your teammates find out when the PR lands. Or when something breaks.\n\nThere's no review step. No \"hey, before you build this, can you check if this makes sense?\" moment.\n\nCPR puts the plan in front of your team before a single line of code is written.\n\n1. Agent creates a plan, you run `cursor-plan-preview plan-preview-and-share`\n2. Plan opens in a browser UI — you annotate inline (delete, replace, comment, insert)\n3. Click **Share Plan** → URL copied with everything encoded in the hash\n4. Teammate opens the URL, adds their own annotations, shares back\n5. You export the feedback, the agent reads it on the next prompt\n\nNo accounts. No backend. The URL contains everything.\n\n## Quick Start\n\n```bash\nnpx cursor-plan-preview --setup\n```\n\nThis installs a Cursor rule and a `/plan-preview-and-share` slash command.\n\nAfter the agent creates a plan, preview and share it — type `/plan-preview-and-share` in Cursor chat, or run in terminal:\n\n```bash\nnpx cursor-plan-preview plan-preview-and-share\n```\n\nAuto-detects the latest plan from `~/.cursor/plans/` and opens it in your browser. To preview a specific file:\n\n```bash\nnpx cursor-plan-preview plan-preview-and-share path/to/plan.md\n```\n\n## How It Works\n\n```\nAgent generates plan  -\u003e  saved to ~/.cursor/plans/\n                              |\n              You run: cursor-plan-preview plan-preview-and-share\n                              |\n                    Plan opens in browser UI\n                              |\n              You annotate + click Share Plan  -\u003e  URL copied\n                              |\n              Teammate opens URL  -\u003e  adds annotations\n                              |\n              You click Export Feedback  -\u003e  -feedback.md written\n                              |\n              Agent reads feedback  -\u003e  adjusts plan before building\n```\n\n## What You Can Annotate\n\nSelect any text in the plan to pick an annotation type:\n\n|                             |                                      |\n| --------------------------- | ------------------------------------ |\n| **Delete** (scissors)       | Mark text for removal                |\n| **Replace** (arrows)        | Suggest replacement text             |\n| **Comment** (speech bubble) | Add a note to specific text          |\n| **Insert** (plus)           | Add new text at a point              |\n| **Global Note**             | Add a note not tied to specific text |\n\nAnnotations show as color-coded highlights in the plan body. The sidebar lists all annotations with a count badge.\n\n## Sharing\n\nPlans under ~8KB compressed get encoded entirely in the URL hash. Nothing leaves the browser. Your teammate opens the link and everything decodes client-side.\n\nFor larger plans, run `cursor-plan-preview plan-preview-and-share` locally and share your screen, or copy the plan body into a Slack thread.\n\n## The Feedback Loop\n\nAfter teammates annotate and share back:\n\n1. Open the annotated URL\n2. Click **Export Feedback**\n3. A `*-feedback.md` file appears in `~/.cursor/plans/`\n4. The installed Cursor rule tells the agent to check for feedback before building\n5. Agent summarizes annotations and asks if you want to incorporate them\n\n## What Gets Installed\n\n`npx cursor-plan-preview --setup` installs one file:\n\n| File                                               | What it does                                                                        |\n| -------------------------------------------------- | ----------------------------------------------------------------------------------- |\n| `~/.cursor/rules/plan-preview.mdc`                 | Agent rule: suggests `plan-preview-and-share` after every plan, checks for feedback |\n| `~/.cursor/skills/plan-preview-and-share/SKILL.md` | `/plan-preview-and-share` slash command in Cursor chat                              |\n\nTo remove everything:\n\n```bash\nnpx cursor-plan-preview --uninstall\n```\n\n## Commands\n\n```bash\ncursor-plan-preview plan-preview-and-share [file]  # open latest (or specific) plan in preview UI\ncursor-plan-preview list               # show recent plans from ~/.cursor/plans/\ncursor-plan-preview --setup            # install Cursor rule\ncursor-plan-preview --uninstall        # remove Cursor rule + legacy hook entries\n```\n\n## Architecture\n\n```\ncursor-plan-preview/\n├── src/\n│   ├── cli.ts          CLI entry (plan-preview-and-share, list, setup, uninstall)\n│   ├── server.ts       Local HTTP server (plan API + static files)\n│   ├── parser.ts       Plan file parser (YAML frontmatter + markdown)\n│   └── utils.ts        Shared utilities\n├── ui/\n│   └── src/\n│       ├── App.tsx     Review UI (React 19 + marked)\n│       └── utils/\n│           └── sharing.ts  Deflate + base64 URL encoding\n└── agent-config/\n    ├── setup.mjs       --setup handler\n    └── cursor/rules/   Cursor rule for feedback loop\n```\n\n## Tech Stack\n\n|              |                                                                                                                                     |\n| ------------ | ----------------------------------------------------------------------------------------------------------------------------------- |\n| **Language** | ![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6?logo=typescript\u0026logoColor=white)                                |\n| **UI**       | ![React](https://img.shields.io/badge/React_19-61DAFB?logo=react\u0026logoColor=black)                                                   |\n| **Markdown** | ![marked](https://img.shields.io/badge/marked-GFM-yellow)                                                                           |\n| **Bundler**  | ![tsup](https://img.shields.io/badge/tsup-ESM-yellow) + ![Vite](https://img.shields.io/badge/Vite-646CFF?logo=vite\u0026logoColor=white) |\n| **Testing**  | ![Vitest](https://img.shields.io/badge/Vitest-6E9F18?logo=vitest\u0026logoColor=white)                                                   |\n| **CI**       | ![GitHub Actions](https://img.shields.io/badge/GitHub_Actions-2088FF?logo=githubactions\u0026logoColor=white)                            |\n\n## Contributing\n\nContributions welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for setup and guidelines.\n\n## Author\n\n[![Made by ofershap](https://gitshow.dev/api/card/ofershap)](https://gitshow.dev/ofershap)\n\n[![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-0A66C2?style=flat\u0026logo=linkedin\u0026logoColor=white)](https://linkedin.com/in/ofershap)\n[![GitHub](https://img.shields.io/badge/GitHub-Follow-181717?style=flat\u0026logo=github\u0026logoColor=white)](https://github.com/ofershap)\n\n---\n\nIf this helped you, [star the repo](https://github.com/ofershap/cursor-plan-preview), [open an issue](https://github.com/ofershap/cursor-plan-preview/issues) if something breaks.\n\n## License\n\n[MIT](LICENSE) \u0026copy; [Ofer Shapira](https://github.com/ofershap)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fofershap%2Fcursor-plan-preview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fofershap%2Fcursor-plan-preview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fofershap%2Fcursor-plan-preview/lists"}