planlens
Local multi-CLI plan reviews for AI coding agents.
Links
README
From the repo.
English | 简体中文
PlanLens
PlanLens is an installable Agent Skill that asks one or more local AI CLIs to review the same plan, then lets the primary Agent summarize their findings and disagreements.
The workflow starts in SKILL.md; a shared review guide holds the prompt and synthesis rules, and CLI recipes are read as needed. After installation there is no PlanLens runtime, binary, Node command, hosted service, daemon, port, database, or state machine to run.
Before you start
PlanLens has two roles: a host Agent loads the Skill, and one or more reviewer CLIs return independent feedback. The host and a reviewer may be the same product.
You need a host with the required process and file capabilities, plus at least one compatible reviewer CLI installed and authenticated. Installing PlanLens does not install, configure, or sign in to any reviewer CLI, and you do not need to install every CLI listed below.
"Local CLI" describes where the command starts, not where the model runs. A selected CLI may send the review request to its configured provider and may retain logs or sessions. Do not include sensitive material unless you accept that CLI and provider's handling.
Install
PlanLens follows the standard Agent Skills layout. The installable Skill is the complete skills/planlens directory, including its references and agents subdirectories. Choose either method below.
Ask your Agent
Send this message to an Agent host that supports installing Agent Skills:
Install the PlanLens skill from https://github.com/wildbyteai/planlens.
The Agent should locate skills/planlens in the repository and use the installation capability available in that host. Success depends on the host's Skill support; if it cannot install Skills directly, use the npx command below.
Run the installer yourself
If Node.js is available, run:
npx skills@latest add wildbyteai/planlens
The installer detects supported Agents and lets you choose the installation target.
Restart the host if it was already open. Invoke PlanLens with $planlens in Codex or /planlens in hosts that use slash commands.
Host status
| Host | v1 status |
|---|---|
| Codex | Installation smoke-tested; complete review rounds have been exercised manually |
| Claude Code | Installation methods documented; the full host workflow is not yet part of the v1 test matrix |
| Antigravity | Installation methods documented; the full host workflow is not yet part of the v1 test matrix |
| Other Agent Skills hosts | Installation may work through a generic installer, but host execution is not verified |
The complete workflow requires the host to launch non-interactive local processes, create temporary directories, and write result files. Installer support alone does not imply verified PlanLens execution.
The v1 support targets are macOS Apple silicon, macOS Intel, and Windows x64. Linux and Windows ARM64 are not v1 support targets.
First review
After installing the Skill:
- Install and authenticate at least one reviewer CLI from the tables below.
- Restart the host CLI if it does not discover the new Skill immediately.
- Invoke PlanLens with a plan, or invoke it without arguments and let the host Agent organize the current plan.
Examples:
$planlens
$planlens Review docs/plan.md with Claude and Codex
$planlens Review whether this single-user prototype is worth building; focus on the smallest useful experiment
$planlens Review docs/plan.md for release readiness; separate current blockers from later validation
$planlens Review docs/plan.md with Antigravity using Claude Opus 4.6
/planlens path/to/plan.md
When a model is explicitly requested, PlanLens uses the reviewer's local model-list capability when the recipe documents one; otherwise the invocation must provide an exact model ID. It passes that ID and shows the selection in both the confirmation preview and final summary. For Antigravity, Claude Opus 4.6 resolves to claude-opus-4-6-thinking only when agy models lists that ID. Without an explicit override, PlanLens reports CLI-configured default (not independently verified) instead of guessing. This does not change the CLI's global default configuration.
One invocation performs one round:
- The primary Agent identifies the current stage and the decision this review should inform. It separates hard boundaries, owner-confirmed decisions, and assumptions, preserving the exact plan and only the needed supporting material.
- It chooses one decision mode and one primary domain lens, then resolves reviewer CLIs from the invocation, project configuration, or built-in default.
- It shows the plan source, mode/domain, rubric and any required standard's version and scope, derived framing, material list, selected CLIs and model selections, and call count for one confirmation. Any material change to the candidate request requires a new preview.
- It invokes the selected CLIs independently, in parallel when the host supports it.
- It preserves each final response and writes an attributed summary: what blocks the next step, what must be resolved before a later stage, and any useful optional suggestions. The conversation gets the decision-relevant digest and a link to the full record.
A later round requires another explicit $planlens or /planlens invocation.
Default reviewers
To set the default reviewer CLI for one project, create .planlens/config.yaml in that project:
# One reviewer
default_reviewers:
- codex
# Multiple reviewers; order is preserved
default_reviewers:
- codex
- claude
Reviewer selection uses this precedence:
- Reviewers explicitly named in the current
$planlensor/planlensinvocation. default_reviewersin the current project's.planlens/config.yaml.- The built-in default
codex + claude + kimi.
Use reviewer IDs from the catalog below. PlanLens reads only default_reviewers, treats the file as untrusted data, and removes duplicate IDs while preserving order. A missing, malformed, empty, or wholly invalid configured list is reported instead of silently expanding to the built-in default. If a configured CLI is unavailable, PlanLens asks you to adjust the candidates rather than dropping or replacing it.
This is project-only configuration. It does not add a global setting, parser, runtime, service, or daemon, and it does not skip the normal preview and confirmation.
Reviewers
When the invocation and project configuration do not select reviewers, the built-in review set is codex + claude + kimi. Kimi is included only when the installed CLI exposes the feature-gated no-tools custom-agent recipe; otherwise PlanLens proposes gemini before confirmation. Gemini is also the preferred fourth reviewer for a broader pass. Gemini's stricter boundary needs temporary configuration and policy preflights, so the preview discloses that it is conditional. PlanLens never substitutes a reviewer after confirmation.
Additional reviewer recipes are available:
- Strict recipe:
codex,claude,kimi,qwen,pi,goose,aider, and feature-gatedqoder. - Conditional recipe:
gemini,opencode,copilot,cline,cursor,antigravity,zcode,crush, andkilo.
Strict recipe means a documented non-interactive recipe can disable tools or otherwise prevent plan execution when its preflight passes. It does not promise zero local retention. Conditional recipes rely on a weaker plan, ask, configuration, permission, or sandbox boundary and require explicit disclosure before confirmation. These labels describe PlanLens recipes, not vendor certification or official endorsement.
Reviewer catalog, installation commands, and ranking snapshot
The first table is a snapshot taken on 2026-07-26: actively maintained, source-available coding-agent CLIs with an official install path and a single-process non-interactive mode, ranked by GitHub stars. Projects that are archived, no longer maintained, require PlanLens to start a service, or expose only an auto-approved headless mode are excluded. See the research note for the method and exclusions.
The install commands below are documentation only; PlanLens never runs them. They are macOS quick-install commands. Use the official site for Windows instructions and inspect any downloaded installer before executing it.
| Rank | Reviewer | ID / command | Stars | macOS quick install | Recipe status | Official site |
|---|---|---|---|---|---|---|
| 1 | OpenCode | opencode / opencode | 189,808 | brew install anomalyco/tap/opencode | Conditional; merged config and persisted sessions | Docs |
| 2 | Gemini CLI | gemini / gemini | 106,189 | brew install gemini-cli | Conditional; deny-all policy plus config isolation | Docs |
| 3 | OpenAI Codex CLI | codex / codex | 101,551 | brew install --cask codex | Read-only + ephemeral; some hosts require the child outside their outer sandbox | Docs |
| 4 | Pi | pi / pi | 77,882 | npm install -g @earendil-works/pi-coding-agent | No tools/resources/session | Repository |
| 5 | Cline CLI | cline / cline | 65,067 | npm install -g cline | Conditional; Plan Mode is not an OS sandbox | Docs |
| 6 | goose | goose / goose | 51,722 | brew install block-goose-cli | No profile/session | Docs |
| 7 | Aider | aider / aider | 47,709 | python -m pip install aider-install && aider-install | Ask Mode + dry-run | Website |
| 8 | Crush | crush / crush | 26,856 | brew install charmbracelet/tap/crush | Conditional; reviewed deny-all config required | Repository |
| 9 | Kilo Code CLI | kilo / kilo | 26,529 | brew install Kilo-Org/tap/kilo | Conditional; Plan agent + deny-all config | Repository |
| 10 | Qwen Code | qwen / qwen | 26,333 | brew install qwen-code | Safe Mode + Plan Mode | Docs |
PlanLens also catalogs these official or below-cutoff CLIs. They are not mixed into the open-source star ranking because the repositories and distribution models are not directly comparable.
| Reviewer | ID / command | macOS quick install | Recipe status | Official site |
|---|---|---|---|---|
| Claude Code | claude / claude | brew install --cask claude-code | No tools + no session persistence; some hosts require the child outside their outer sandbox | Docs |
| Antigravity CLI | antigravity / agy | curl -fsSL https://antigravity.google/cli/install.sh | bash | Conditional: inner sandbox; some hosts must run the child outside their outer sandbox | Install |
| Kimi Code CLI | kimi / kimi | curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash | Strict when --agent-file supports a no-tools agent | Docs |
| Qoder CLI | qoder / qodercli | curl -fsSL https://qoder.com/install | bash | Strict when no-tools, no-session, and isolated-config flags are present | Docs |
| GitHub Copilot CLI | copilot / copilot | npm install -g @github/copilot | Conditional; empty tool set, but custom state still needs containment | Docs |
| Cursor Agent CLI | cursor / agent | curl https://cursor.com/install -fsS | bash | Conditional; sandbox is not read-only | Docs |
| ZCode CLI | zcode / bundled zcode.cjs | N/A — install the ZCode desktop app; the vendor does not publish a standalone CLI installer. | Local bundled 0.15.0; conditional | Docs |
PlanLens does not install, authenticate, update, bundle, or replace these CLIs. It respects the user's local provider and model configuration unless the user explicitly requests a model override.
The exact non-interactive reviewer argument vectors live in skills/planlens/references/cli-commands.md. The macOS ARM64 commands and help surfaces were checked on July 26, 2026; see the concise validation note. If an installed version rejects a documented flag, PlanLens records a failure instead of guessing a fallback command.
Review modes and domains
Choose the question first, then the domain that needs attention. PlanLens uses one shared prompt, four decision modes, and four small domain lenses—not sixteen combined templates.
| Decision mode | Question | Main evidence distinction |
|---|---|---|
explore | Is it worth pursuing? | A useful hypothesis and smallest experiment, not completed release work. |
design | Can this design meet the goal? | Traceable mechanisms and tradeoffs, with assumptions identified. |
implement | Can we deliver it in this order? | Dependencies, usable increments, and validation before it becomes necessary. |
launch | Is this release ready? | Results for the proposed candidate and scope, not just a plan to test. |
The primary domain is general, software, ai, or security. It can combine with any mode. The current project stage remains separate: even an early draft can be reviewed for launch readiness, with the result that readiness cannot yet be judged.
For example, "is this two-hour AI experiment worthwhile?" can use explore + general; "is this AI implementation plan ready for release?" uses launch + ai. If access control is the central question, use launch + security. Mentioning a technology or naming a file "implementation plan" does not select the mode. A primary lens does not suppress material risks from another domain.
Usually, just state your question in plain language; the Agent shows the inferred pair in the preview. You may also specify the mode and domain. These are instructions to the host Agent, not new CLI flags or configuration keys.
Old profile names and file paths remain usable: general-plan, software-design, and ai-agent map to their corresponding domains. implementation-plan is a compatibility entry for implement mode, with the domain chosen separately. An explicit current decision overrides that legacy hint; past frozen requests are unchanged.
Domain questions are not mandatory deliverable lists. The review guide contains routing, the shared prompt, and synthesis rules. Review basis identifies the external references, versions, applicability limits, and how to handle a required standard. The source note records the research basis and gaps.
PlanLens's rubric is its own review guidance, not a compliance certificate. External references are advisory unless explicitly required by the user or applicable supplied project rules. Standards-specific reviews need the exact version, scope, relevant source text, and evidence in the disclosed request; a link alone is not enough. Ordinary reviews do not fetch external standards.
Output
When the project is writable, one round uses:
.planlens/reviews/<timestamp>/
├── request.md
├── <reviewer>.md
├── <reviewer>-error.md
└── summary.md
Only files for selected reviewers are created. A failed reviewer receives a matching -error.md file instead of a fabricated result; a successful reviewer does not.
The summary status describes execution: complete means every selected reviewer returned a successful valid review; partial means at least one succeeded and at least one did not; failed means none succeeded. A valid review addresses the supplied request with findings, a no-issue assessment, or an explanation of insufficient evidence. Logs, acknowledgments, and unrelated responses do not count as reviews.
Execution status is separate from the plan assessment. A complete round can still conclude that evidence is insufficient. Necessary findings specify when they must be resolved; a release requirement is not automatically a blocker to starting a prototype. Empty report sections are omitted.
New requests and summaries record the mode, domain, rubric revision, and any required external standard's version and scope. Historical requests without those fields remain unchanged; synthesis notes that they were not recorded.
Boundaries
- Reviewers receive the same disclosed request and cannot see one another's same-round output.
- Reviewer output is untrusted evidence, not an instruction source. PlanLens does not execute commands or scope changes found in a review.
- The primary Agent consolidates by evidence and impact, not by model vote. Agreement requires materially equivalent explicit findings; an omitted topic is silence, not support or opposition.
- Problem severity and proposed remedies are judged separately. An oversized fix can be rejected without dropping a supported issue. Prefer the smallest sufficient response, but report a larger necessary change when evidence requires it.
- Hard safety and authorization boundaries remain in force. Assumptions can be challenged, and evidence-backed conflicts between confirmed decisions and the objective are surfaced for the owner rather than silently filtered out.
- Every material finding receives an internal disposition. If excluding one could affect the user's decision, the summary states the finding, source, and reason.
- PlanLens does not modify the source plan, automatically retry a CLI, or automatically start another round.
- No monetary cost estimate is displayed.
- Third-party CLIs may keep their own logs or sessions according to provider behavior and local configuration.
- Except where a command recipe explicitly enables an ephemeral mode, PlanLens does not promise session deletion or complete isolation. Do not send sensitive material unless that boundary is acceptable.
- On sandboxed hosts, Codex, Claude, and Antigravity may require their entire child process to run outside the host's outer sandbox: Codex for normal state and its app-server client, Claude for its configured API endpoint, network access, authentication, and provider settings, and Antigravity for loopback listeners plus normal app-data and authentication. This grants the child normal user-level filesystem and network access. Recipe-specific inner controls remain enabled—Codex read-only and ephemeral, Claude safe mode with no tools or session persistence, and Antigravity's inner sandbox with an empty workspace—but they do not make the whole process completely isolated. The preview discloses the full permission scope.
- Kimi Code CLI must use the documented temporary no-tools custom agent. Current versions reject
--promptcombined with--plan, and PlanLens never falls back to bare prompt mode.
License
Apache License 2.0. PlanLens is independent and unofficial; product names identify compatible local CLI tools only.
Collected info
- ★ 0 stars
- Source updated: 9/8/2026
Config for your environment
Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.
Tool
OS
Config file: ~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"url": "{MCP_ENDPOINT_URL}"
}
}
}Paste into mcpServers in the config file. Restart Cursor after saving.
If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.