planr 1.5.0 → 1.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -7
- package/docs/ARCHITECTURE.md +2 -4
- package/docs/CLAUDE_CODE.md +2 -2
- package/docs/CLI_REFERENCE.md +0 -5
- package/docs/CODEX.md +3 -5
- package/docs/CURSOR.md +2 -2
- package/docs/EXAMPLE_WEBAPP.md +4 -5
- package/docs/GOALS.md +4 -6
- package/docs/INSTALL.md +3 -3
- package/docs/MCP_CONTRACT.md +6 -6
- package/docs/MODEL_ROUTING.md +2 -8
- package/docs/RELEASE.md +1 -1
- package/docs/ROUTING_BUNDLES.md +8 -25
- package/docs/SKILLS.md +33 -50
- package/docs/documentation/CONTRACT.md +164 -0
- package/docs/documentation/COVERAGE.md +91 -0
- package/docs/documentation/INFORMATION_ARCHITECTURE.md +147 -0
- package/docs/fixtures/mcp-contract.json +0 -3
- package/docs/release-candidates/planr-v1.5.2.md +164 -0
- package/npm/native/darwin-arm64/planr +0 -0
- package/npm/native/darwin-x86_64/planr +0 -0
- package/npm/native/linux-arm64/planr +0 -0
- package/npm/native/linux-x86_64/planr +0 -0
- package/package.json +25 -2
- package/plugins/planr/.claude-plugin/plugin.json +1 -1
- package/plugins/planr/.codex-plugin/plugin.json +2 -2
- package/plugins/planr/skills/planr-loop/SKILL.md +4 -3
package/README.md
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
Planr is a local-first planning and execution coordination tool for coding agents. It combines reviewable Markdown plans with a dependency-aware work map so Codex, Claude Code, Cursor, generic MCP clients, and human operators can drive the same work safely — from idea to verified completion.
|
|
6
6
|
|
|
7
|
+
[**View the Demo →**](https://x.com/kevinkern/status/2066957434564808884?s=20)
|
|
8
|
+
|
|
9
|
+
[**Documentation →**](https://planr.so/docs)
|
|
10
|
+
|
|
7
11
|
```text
|
|
8
12
|
idea -> product plan -> build plan -> map -> pick -> log -> review/evidence -> close
|
|
9
13
|
```
|
|
@@ -40,7 +44,7 @@ Or with the release installer:
|
|
|
40
44
|
curl -fsSL https://raw.githubusercontent.com/instructa/planr/main/scripts/install.sh | sh
|
|
41
45
|
```
|
|
42
46
|
|
|
43
|
-
Then initialize a project
|
|
47
|
+
Then initialize a project. When selected, Claude Code and Cursor also receive standalone project worker/reviewer roles; Codex workflow skills come from its plugin:
|
|
44
48
|
|
|
45
49
|
```bash
|
|
46
50
|
planr project init "My Product" --client all
|
|
@@ -50,7 +54,7 @@ Manual downloads, from-source builds, and client wiring details: [Install Guide]
|
|
|
50
54
|
|
|
51
55
|
## Install The Plugin (Skills)
|
|
52
56
|
|
|
53
|
-
The plugin under `plugins/planr` carries the ten Planr workflow skills. Optional model-routing
|
|
57
|
+
The plugin under `plugins/planr` carries the ten Planr workflow skills. Optional model-routing declarations live in repository-local files such as `.planr/agents.toml` and `.planr/policy.toml`; external tools may manage those files, but Planr does not install or invoke a routing engine. The `planr` CLI (above) is required separately.
|
|
54
58
|
|
|
55
59
|
<a id="install-plugin-codex"></a>
|
|
56
60
|
<details>
|
|
@@ -86,7 +90,7 @@ One command installs everything the plugin would carry:
|
|
|
86
90
|
|
|
87
91
|
```bash
|
|
88
92
|
planr install cursor # writes .cursor/mcp.json, .cursor/agents/, and .cursor/skills/
|
|
89
|
-
planr install cursor --no-mcp # skills and
|
|
93
|
+
planr install cursor --no-mcp # project skills, subagents, and hooks; no MCP config
|
|
90
94
|
```
|
|
91
95
|
|
|
92
96
|
The dry-run also prints a one-click `cursor://` deeplink for user-level MCP install. Marketplace listing is pending review. Multitasking with Cursor subagents: [Cursor guide](docs/CURSOR.md).
|
|
@@ -108,7 +112,7 @@ planr prompt cli
|
|
|
108
112
|
|
|
109
113
|
## Tell Your Agent
|
|
110
114
|
|
|
111
|
-
|
|
115
|
+
Remember one public entry point: `$planr`. It routes ordinary planning and status work from live Planr state. For long autonomous runs, use the explicit two-step workflow: `$planr-goal` prepares durable state, then `$planr-loop` executes the resulting plan.
|
|
112
116
|
|
|
113
117
|
Start a new product from an idea:
|
|
114
118
|
|
|
@@ -119,10 +123,13 @@ Create a production-ready Habit Tracker web app plan. Create the product plan,
|
|
|
119
123
|
split an MVP build plan, check it, then build the Planr map. Do not implement yet.
|
|
120
124
|
```
|
|
121
125
|
|
|
122
|
-
|
|
126
|
+
For a long autonomous run, prepare outside the driver first. The preparation result prints a real plan id; Codex or Claude Code then starts only the plan-bound loop driver:
|
|
123
127
|
|
|
124
128
|
```text
|
|
125
|
-
Use $planr-
|
|
129
|
+
Use $planr-goal to prepare an autonomous goal for the weekly overview feature.
|
|
130
|
+
|
|
131
|
+
/goal Use $planr-loop on plan <plan-id>. The loop contract is stored in planr
|
|
132
|
+
context (tag: goal-contract).
|
|
126
133
|
|
|
127
134
|
Goal: ship the weekly overview feature. DONE when every in-scope map item is closed
|
|
128
135
|
with log evidence, all reviews are closed complete, and a live verification log shows
|
|
@@ -133,7 +140,7 @@ Mid-project work (a new feature, refactor, or fix on an existing project) works
|
|
|
133
140
|
|
|
134
141
|
## What's new
|
|
135
142
|
|
|
136
|
-
- **1.5.
|
|
143
|
+
- **1.5.2 — Standalone core, optional Switchloom:** Planr consumes provider-neutral repository declarations and route evidence only; it works without any routing files, and requested-only routing metadata is not execution proof. Optional model-routing lifecycle is external, with [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) verified as the repository-local handoff outside Planr. Start with [Model Routing](docs/MODEL_ROUTING.md), [Switchloom](https://switchloom.ai), the [Switchloom repository](https://github.com/instructa/switchloom), its tagged [setup quickstart](https://github.com/instructa/switchloom/blob/v0.2.1/README.md#setup-from-the-website) and [lifecycle docs](https://github.com/instructa/switchloom/blob/v0.2.1/docs/preset-composition.md#repository-lifecycle-commands), and the [Changelog](CHANGELOG.md).
|
|
137
144
|
- **1.4.0 — Verified presets:** Added policy-driven composition, evaluation, signed registry evidence, and the public catalog. See the [1.4.0 release notes](https://github.com/instructa/planr/releases/tag/v1.4.0).
|
|
138
145
|
- **1.3.0 — Native host hooks:** Added automatic session-state injection and loop recovery for supported hosts. See the [Hooks guide](docs/HOOKS.md) and [1.3.0 release notes](https://github.com/instructa/planr/releases/tag/v1.3.0).
|
|
139
146
|
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -6,7 +6,7 @@ Planr V1 is a single Rust binary with explicit module ownership. The crate stays
|
|
|
6
6
|
|
|
7
7
|
- `src/`: the Rust CLI (module ownership below).
|
|
8
8
|
- `tests/e2e.rs`: real CLI, MCP, HTTP, import, review-gate, run-log, and concurrent-pick tests.
|
|
9
|
-
- `plugins/planr/`: the installable plugin payload — all ten skills, independent Claude/Cursor worker and reviewer role assets, and the per-host plugin manifests.
|
|
9
|
+
- `plugins/planr/`: the installable plugin payload — all ten skills, independent Claude/Cursor worker and reviewer role assets, and the per-host plugin manifests. Planr does not ship model-pinned Codex roles.
|
|
10
10
|
- `.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`: marketplace manifests pointing Codex and Claude Code at `plugins/planr`.
|
|
11
11
|
- `docs/`: user and contributor guides; `docs/planr-spec/` is the production specification package for Planr V1.
|
|
12
12
|
- `examples/real-world-flow.md`: executable real-world operator flow.
|
|
@@ -43,12 +43,10 @@ Planr V1 is a single Rust binary with explicit module ownership. The crate stays
|
|
|
43
43
|
- `src/usage_policy.rs`: provider-neutral Usage Policy v1 core. Owns strict `.planr/policy.toml` parsing, policy and task-contract vocabulary, materiality classification, budget/concurrency validation, and the pure five-way transition resolver; it contains no provider ids, host dispatch, or execution-permission behavior.
|
|
44
44
|
- `src/execution_policy.rs`: execution admission core. Owns per-role filesystem, network, tool/MCP, structured command, environment, hook, secret, and approval grants; permission-diff previews; bounded task-contract admission; fail-closed command grammar; and isolated write-scope concurrency. It never selects models or mutates graph state. `src/app/policy.rs` binds that pure decision to the current SQLite lease owner and pick token, and only treats an admission from that exact lease generation as authoritative.
|
|
45
45
|
- `src/route_audit.rs`: provider-neutral run-observation contract. Owns strict requested/resolved/effective route stages, model/effort/fork enforcement confidence, transition provenance, policy/binding versions, and per-dimension metering confidence. It rejects requested-only values in the effective stage rather than inferring host execution.
|
|
46
|
-
- `src/routing_bundle.rs`: provider-neutral RoutingBundle v1 contract and repository transaction boundary. Owns validation, hashes, signatures, allowlisted paths, conflict and symlink rejection, atomic apply, rollback, and application receipts.
|
|
47
|
-
- `planr-routing/`: independently buildable workspace package that owns model policies, host bindings, generated host artifacts, probes, evaluation, signing, registry data, and catalog publication.
|
|
48
46
|
- `src/app/agents.rs`: routing application boundary. Owns the `agents` and `item route` command handlers, the shared `*_value` JSON shapes reused by MCP, per-item route facts assembly, and registry-aware role content selection for installs.
|
|
49
47
|
- `src/app/agents_init.rs`: registry bootstrap boundary. Owns `planr agents init` — the static cost-tiering scaffold and, per the agent-pool plan, the flag-spec builder and interactive wizard.
|
|
50
48
|
- `src/integrations.rs`: agent-client integration descriptor boundary. Owns Codex, Claude Code, Cursor, MCP install metadata, MCP tool schemas, MCP resources, and MCP text response wrapping.
|
|
51
|
-
- `src/rolefiles.rs`: static host workflow roles and Cursor skill payloads. It does not select or pin models; generated routing artifacts
|
|
49
|
+
- `src/rolefiles.rs`: static host workflow roles and Cursor skill payloads. It does not select or pin models; externally generated routing artifacts stay outside Planr ownership.
|
|
52
50
|
- `src/util.rs`: small CLI-boundary utilities. Owns ids, timestamps, path helpers, output formatting, and safe file writes.
|
|
53
51
|
|
|
54
52
|
## Boundary Rules
|
package/docs/CLAUDE_CODE.md
CHANGED
|
@@ -38,7 +38,7 @@ planr install claude
|
|
|
38
38
|
planr doctor --client claude
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
Dry-run prints both project-scope `.mcp.json` content and the user-scope CLI form. The non-dry command writes
|
|
41
|
+
Dry-run prints both project-scope `.mcp.json` content and the optional user-scope CLI form. The non-dry command writes this repository's `.mcp.json`, standalone worker/reviewer roles, and additive fail-open session hooks. Workflow skills and plugin agents come from the Claude Code plugin. Use `--no-mcp` to omit `.mcp.json`, or `--no-hooks` to omit hook reconciliation.
|
|
42
42
|
|
|
43
43
|
Claude Code should treat Planr map state as authoritative and use Markdown plans as context.
|
|
44
44
|
|
|
@@ -49,4 +49,4 @@ planr review ingest <item-id> --from .planr/tmp/claude-review.json
|
|
|
49
49
|
planr review artifact <review-item-id>
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
Planr does not
|
|
52
|
+
Planr does not edit global Claude Code configuration. Project hooks live in `.claude/settings.json`, preserve foreign entries, and can be omitted with `--no-hooks`. The review item remains open until `planr review close` records the final verdict.
|
package/docs/CLI_REFERENCE.md
CHANGED
|
@@ -67,9 +67,6 @@ planr agents init [--force]
|
|
|
67
67
|
planr agents init --profile|--skill|--route|--default-route|--interactive
|
|
68
68
|
planr agents list [--json]
|
|
69
69
|
planr agents check
|
|
70
|
-
planr routing bundle inspect <bundle.json>
|
|
71
|
-
planr routing bundle preview <bundle.json>
|
|
72
|
-
planr routing bundle apply <bundle.json>
|
|
73
70
|
planr doctor [--client codex|claude|cursor|all]
|
|
74
71
|
planr install codex|claude|cursor [--dry-run] [--no-mcp] [--force] [--no-hooks]
|
|
75
72
|
planr prompt cli|mcp|http [--client codex|claude|cursor|all]
|
|
@@ -141,8 +138,6 @@ With `--json`, responses follow one convention so agents never guess where data
|
|
|
141
138
|
|
|
142
139
|
`policy show` and `policy check` inspect the provider-neutral Usage Policy v1 file (`.planr/policy.toml`). A missing policy is an explicit successful state that preserves existing advisory routing; a malformed or unsafe policy fails `check` with parser/field diagnostics and leaves enforcement unavailable. Usage Policy v1 fixes delegation depth at one and keeps retry, availability fallback, quality escalation, quota downgrade, and safety stop as distinct transition contracts. Its separate `execution` section declares bounded per-role filesystem, network, tool/MCP, structured command, environment, hook, secret-reference, and approval grants. `policy admit <request.json>` requires the picked item's current `item_id` and `pick_token`, authorizes the current worker as lease owner, evaluates a bounded task contract before delegation, previews any permission addition, records the decision and lease generation, rejects unclassified commands and destructive or out-of-scope work, permits overlapping readers, and admits concurrent writers only for disjoint scopes isolated in distinct worktrees. Released or recovered leases never inherit historical admitted scopes. MCP `planr_policy_show`, `planr_policy_check`, and `planr_policy_admit`, plus HTTP `POST /v1/policy/admit`, call the same admission service and return the same decision shape.
|
|
143
140
|
|
|
144
|
-
`routing bundle inspect|preview|apply` is Planr Core's only policy-package boundary. It accepts RoutingBundle v1, validates payload hashes, restricts targets to allowlisted repository-local paths, rejects traversal, symlinks, parent/child collisions, conflicts, and unsupported versions, and applies the validated set atomically. Signed bundles require both `--trusted-signer` and an external `--trusted-public-key-file`; a key embedded beside the content is never trusted. It never edits user configuration. Named policies, model ids, host bindings, evaluation, signing, and catalog operations are provided by the optional `planr-routing` package. See [Routing Bundles](ROUTING_BUNDLES.md).
|
|
145
|
-
|
|
146
141
|
`agents init` writes a provider-neutral `.planr/agents.toml` scaffold or compiles explicit profile and route flags. `agents list` and `agents check` inspect it, while pick packets carry the resolved opaque profile, host, model, effort, tier, skill, route chain, and matched selector. Full guide: [Model Routing](MODEL_ROUTING.md).
|
|
147
142
|
|
|
148
143
|
`log add` and `done` accept `--profile <id>` — the registry profile the run actually executed on (`PLANR_PROFILE` env is the fallback, so rendered role files can export it). They also accept `--route-audit <observation.json>` for the strict three-stage observation contract. A route audit records each stage's model, effort, and context-fork value with enforcement state (`verified`, `requested_only`, `estimated`, or `unavailable`), an evidence-source enum, typed transition plus reason, policy/binding ids and versions, and wall-time/tool/token/credit values with independent confidence. It is stored in run metadata, projected into its durable log and trace, and emits local route-stage/transition events. The profile remains backward compatible: when it differs from the item's declared route, Planr emits advisory `route_mismatch_observed`. Runs without commands/tests record neither a run nor a route observation. MCP `planr_log_add` and HTTP item log accept the same optional `route_observation` object.
|
package/docs/CODEX.md
CHANGED
|
@@ -22,15 +22,13 @@ $planr-goal <your goal>
|
|
|
22
22
|
|
|
23
23
|
The stop condition lives in Planr (`--tag goal-contract`), so a dead session resumes with the same starter line from zero chat context.
|
|
24
24
|
|
|
25
|
-
Optionally
|
|
25
|
+
Optionally prepare repository-local routing declarations before starting the driver. Planr reads `.planr/agents.toml` and `.planr/policy.toml`; external tools such as [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) own any generated roles, application, or uninstall lifecycle:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
planr
|
|
29
|
-
planr routing bundle preview routing-bundle.json
|
|
30
|
-
planr routing bundle apply routing-bundle.json
|
|
28
|
+
planr agents check
|
|
31
29
|
```
|
|
32
30
|
|
|
33
|
-
|
|
31
|
+
Follow any externally generated repository role instructions outside Planr, restart after role changes when your host requires it, and confirm child metadata reports the expected model, effort, role path, and context-fork behavior. Full workflow: [Long-Running Goals](GOALS.md).
|
|
34
32
|
|
|
35
33
|
## MCP
|
|
36
34
|
|
package/docs/CURSOR.md
CHANGED
|
@@ -19,13 +19,13 @@ Re-running the command refreshes `.cursor/mcp.json` but never overwrites edited
|
|
|
19
19
|
|
|
20
20
|
## Skills And Agents Only (No MCP)
|
|
21
21
|
|
|
22
|
-
The skills are CLI-first — they drive the `planr` binary directly through the terminal — so MCP is optional.
|
|
22
|
+
The skills are CLI-first — they drive the `planr` binary directly through the terminal — so MCP is optional. To install project subagents, skills, and the default hooks without MCP:
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
25
|
planr install cursor --no-mcp
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
This writes `.cursor/agents
|
|
28
|
+
This writes `.cursor/agents/`, `.cursor/skills/`, and the default project hooks, but no `.cursor/mcp.json` or deeplink. Add `--no-hooks` when hooks must also be skipped. Everything below works in this mode because the skills call the Planr CLI directly. `--no-mcp --dry-run` lists the roles and skills and states whether the non-dry run would reconcile hooks. For Claude Code the flag writes standalone project roles and hooks but no project skills; for Codex it writes hooks only. Their workflow skills come from their respective plugins.
|
|
29
29
|
|
|
30
30
|
## One-Click MCP Install
|
|
31
31
|
|
package/docs/EXAMPLE_WEBAPP.md
CHANGED
|
@@ -53,12 +53,11 @@ planr agents check
|
|
|
53
53
|
planr agents list
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
Alternatively, an external
|
|
56
|
+
Alternatively, an external routing tool such as [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) can manage repository-local declarations and host roles outside Planr. After that external lifecycle step, Planr still sees only provider-neutral declarations:
|
|
57
57
|
|
|
58
58
|
```bash
|
|
59
|
-
planr
|
|
60
|
-
planr
|
|
61
|
-
planr routing bundle apply routing-bundle.json
|
|
59
|
+
planr agents check
|
|
60
|
+
planr agents list --json
|
|
62
61
|
```
|
|
63
62
|
|
|
64
63
|
## 2. Tag items by use case
|
|
@@ -101,4 +100,4 @@ planr trace item <item-id>
|
|
|
101
100
|
|
|
102
101
|
A mismatch is recorded as advisory evidence instead of silently rewritten. Missing effective-host evidence stays unavailable and is never inferred from the registry.
|
|
103
102
|
|
|
104
|
-
One-off exceptions use `planr item route <id> --set <profile>`; `--clear` restores policy resolution. See [Model Routing](MODEL_ROUTING.md) and [Routing
|
|
103
|
+
One-off exceptions use `planr item route <id> --set <profile>`; `--clear` restores policy resolution. See [Model Routing](MODEL_ROUTING.md) and [External Routing Declarations](ROUTING_BUNDLES.md).
|
package/docs/GOALS.md
CHANGED
|
@@ -87,15 +87,13 @@ Iteration 1 reads the map and the stored contract: items already settled stay se
|
|
|
87
87
|
|
|
88
88
|
### Codex with `/goal`
|
|
89
89
|
|
|
90
|
-
Install the plugin
|
|
90
|
+
Install the plugin and initialize the repository. Optional routing declarations are repository-local and may be edited directly or managed by an external tool such as [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) before the run:
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
93
|
codex plugin marketplace add instructa/planr
|
|
94
94
|
codex plugin add planr@planr
|
|
95
95
|
planr project init "My Product"
|
|
96
|
-
planr
|
|
97
|
-
planr routing bundle preview routing-bundle.json
|
|
98
|
-
planr routing bundle apply routing-bundle.json
|
|
96
|
+
planr agents check
|
|
99
97
|
```
|
|
100
98
|
|
|
101
99
|
Then:
|
|
@@ -105,7 +103,7 @@ $planr-goal <your goal> # prep: plan, map, contract, starter command
|
|
|
105
103
|
/goal Use $planr-loop on plan <plan-id>. The loop contract is stored in planr context (tag: goal-contract).
|
|
106
104
|
```
|
|
107
105
|
|
|
108
|
-
When
|
|
106
|
+
When repository routing declarations exist, the `/goal` PM treats them as advisory dispatch input. The external routing owner decides exact models, effort, role names, fallback policy, and lifecycle; Planr only carries the resulting opaque route in pick packets and records observed evidence when workers provide it. Codex Automations use the same starter line.
|
|
109
107
|
|
|
110
108
|
### Claude Code
|
|
111
109
|
|
|
@@ -147,7 +145,7 @@ Any MCP-capable agent uses the same flow over `planr mcp`. Every session starts
|
|
|
147
145
|
|
|
148
146
|
A goal run has distinct roles with different intelligence needs. Planr represents those decisions as opaque profiles and routes; it does not choose providers, models, effort levels, fallback chains, or host-native role names.
|
|
149
147
|
|
|
150
|
-
An optional routing
|
|
148
|
+
An optional external routing tool can map planning, exploration, implementation, mechanical work, and independent review onto different cost or quality tiers. If [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) or another repository-local process writes routing declarations or host roles, follow that tool's generated instructions outside Planr and verify effective child metadata because declarations alone are not proof. The Core contract is documented in [Model Routing](MODEL_ROUTING.md).
|
|
151
149
|
|
|
152
150
|
## Coming From Other Goal Tools
|
|
153
151
|
|
package/docs/INSTALL.md
CHANGED
|
@@ -72,9 +72,9 @@ planr prompt cli --client codex
|
|
|
72
72
|
planr prompt http
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
-
`planr install
|
|
75
|
+
`planr install codex` writes a project MCP snippet and project hooks; its workflow skills come from the Codex plugin, and it writes no project roles or skills. `planr install claude` writes project `.mcp.json`, standalone worker/reviewer roles, and hooks; workflow skills come from the Claude Code plugin. `planr install cursor` writes project MCP, roles, all ten skills, and hooks, then prints an optional user-level MCP deeplink. Optional model pins come from repository-local routing declarations managed outside Planr. Dry-runs print the complete repository artifact and hook-reconciliation paths without writing them; no command silently edits global user configuration.
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
`--no-mcp` skips only the project MCP artifact. Codex then reconciles hooks only; Claude Code writes standalone project roles and hooks but no project skills; Cursor writes project roles, skills, and hooks. Add `--no-hooks` to skip hooks as well. The Codex and Claude Code plugins remain the owners of their workflow skills.
|
|
78
78
|
|
|
79
79
|
Runtime surfaces:
|
|
80
80
|
|
|
@@ -87,7 +87,7 @@ Open `http://127.0.0.1:7526/review` after `planr serve` for the local browser re
|
|
|
87
87
|
|
|
88
88
|
## Agent Skills And Plugin
|
|
89
89
|
|
|
90
|
-
The repository ships a plugin under `plugins/planr` for Codex and Claude Code that bundles
|
|
90
|
+
The repository ships a plugin under `plugins/planr` for Codex and Claude Code that bundles all ten workflow skills; Claude Code additionally registers plugin worker/reviewer agents. The Codex plugin does not register project agents. Cursor receives the ten skills and both project agents through `planr install cursor` (or its plugin manifest). Model-specific role files are optional repository-local artifacts owned by external routing lifecycle. The CLI above must be installed separately. See [Skills](SKILLS.md).
|
|
91
91
|
|
|
92
92
|
## From Source
|
|
93
93
|
|
package/docs/MCP_CONTRACT.md
CHANGED
|
@@ -42,7 +42,7 @@ Required groups:
|
|
|
42
42
|
- artifact add, list, and show
|
|
43
43
|
- event list and debug bundle preview
|
|
44
44
|
- trace item, log add, and log read (including three-stage route observations)
|
|
45
|
-
- provider-neutral
|
|
45
|
+
- provider-neutral agent registry reads and route overrides
|
|
46
46
|
- review annotate, ingest, artifact, evidence, and close
|
|
47
47
|
- item close, context create, and search
|
|
48
48
|
|
|
@@ -62,12 +62,12 @@ HTTP mirrors the same rule: `GET /v1/reviews/:id/artifact` is read-only; `POST /
|
|
|
62
62
|
|
|
63
63
|
## Install Contract
|
|
64
64
|
|
|
65
|
-
`planr install <client> --dry-run` prints
|
|
65
|
+
`planr install <client> --dry-run` prints the complete client-owned MCP, role, skill, and hook-reconciliation paths for Codex, Claude Code, and Cursor without writing them. Non-dry install writes only repository-local files, with this ownership contract:
|
|
66
66
|
|
|
67
|
-
- Codex: `.planr/integrations/codex-mcp.toml
|
|
68
|
-
- Claude Code: `.mcp.json
|
|
69
|
-
- Cursor: `.cursor/mcp.json
|
|
67
|
+
- Codex: the CLI writes `.planr/integrations/codex-mcp.toml` and `.codex/hooks.json`; the plugin owns all ten workflow skills; neither path writes Planr project roles or project skills
|
|
68
|
+
- Claude Code: the CLI writes `.mcp.json`, standalone `.claude/agents/` roles, and `.claude/settings.json` hooks, but no project skills; the plugin owns all ten workflow skills and its plugin agents
|
|
69
|
+
- Cursor: the CLI writes `.cursor/mcp.json`, both `.cursor/agents/` roles, all ten `.cursor/skills/` skill copies, and `.cursor/hooks.json`
|
|
70
70
|
|
|
71
71
|
The Cursor dry-run additionally prints a `cursor://anysphere.cursor-deeplink/mcp/install` link whose embedded config (`planr mcp`, no `--db`) is safe at user scope because each workspace resolves its own database. Planr does not edit global client configuration without a separate explicit operator action; the deeplink requires the operator to click it and confirm inside Cursor.
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
`--no-mcp` skips only the project MCP artifact: Codex reconciles hooks only; Claude Code writes standalone roles and hooks but no project skills; Cursor writes roles, all ten skills, and hooks. `--no-hooks` is the independent hook opt-out and can be combined with `--no-mcp`.
|
package/docs/MODEL_ROUTING.md
CHANGED
|
@@ -28,12 +28,6 @@ Resolution order is per-item override, work type, plan, then default route. Unkn
|
|
|
28
28
|
|
|
29
29
|
Workers may report observed routing with logs and route-audit evidence. Requested-only values never become effective proof; missing effective evidence remains explicitly unavailable.
|
|
30
30
|
|
|
31
|
-
Host-specific model policies
|
|
31
|
+
Host-specific model policies, generated repository roles, and uninstall/application lifecycle are external to Planr. [Switchloom](https://switchloom.ai) [v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) can manage repository-local routing artifacts from its [repository](https://github.com/instructa/switchloom), [setup quickstart](https://github.com/instructa/switchloom/blob/v0.2.1/README.md#setup-from-the-website), and [repository lifecycle docs](https://github.com/instructa/switchloom/blob/v0.2.1/docs/preset-composition.md#repository-lifecycle-commands), but Planr does not install, invoke, compile, apply, or uninstall Switchloom output. After an external tool or operator changes `.planr/agents.toml` or `.planr/policy.toml`, run `planr agents check` and capture observed route evidence through `planr log add` or `planr done`.
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
planr-routing compile balanced --host codex-openai --output routing-bundle.json
|
|
35
|
-
planr routing bundle preview routing-bundle.json
|
|
36
|
-
planr routing bundle apply routing-bundle.json
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Bundle application is restricted to the repository. Planr never edits user configuration such as `~/.codex/config.toml`. See [Routing Bundles](ROUTING_BUNDLES.md).
|
|
33
|
+
The hard boundary is provider-neutral: Planr consumes declarations and evidence; hosts and external routing tools decide whether any requested model, effort, role, or fallback actually ran. See [External Routing Declarations](ROUTING_BUNDLES.md).
|
package/docs/RELEASE.md
CHANGED
|
@@ -25,7 +25,7 @@ The script enforces, in order:
|
|
|
25
25
|
1. branch is `main`, worktree is clean, `CHANGELOG.md` already has a committed `## [x.y.z]` section, and the tag does not exist;
|
|
26
26
|
2. the version is written into all four manifests plus `Cargo.lock`;
|
|
27
27
|
3. gates: `cargo test` (includes the manifest drift guard in `tests/e2e.rs`), `npm pack --dry-run`, and `scripts/security-local.sh` (betterleaks + trivy leak gate);
|
|
28
|
-
4. one mechanical commit `release x.y.z: <summary>`,
|
|
28
|
+
4. one mechanical commit `release x.y.z: <summary>`, an annotated `vx.y.z` tag carrying that summary, and a single push of branch plus tag.
|
|
29
29
|
|
|
30
30
|
Two independent gates back the script:
|
|
31
31
|
|
package/docs/ROUTING_BUNDLES.md
CHANGED
|
@@ -1,32 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# External routing declarations
|
|
2
2
|
|
|
3
|
-
Planr Core is provider-neutral. It parses `.planr/agents.toml`, resolves routes into pick packets, records declared-versus-observed evidence, and
|
|
3
|
+
Planr Core is provider-neutral. It parses `.planr/agents.toml`, resolves routes into pick packets, records declared-versus-observed evidence, and checks `.planr/policy.toml`. It does not own a bundle format, catalog, compiler, signer, installer, or uninstaller.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
planr routing bundle inspect routing-bundle.json
|
|
7
|
-
planr routing bundle preview routing-bundle.json
|
|
8
|
-
planr routing bundle apply routing-bundle.json
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Core accepts only allowlisted repository-local targets, verifies payload hashes, rejects absolute paths, traversal, symlinks, parent/child target collisions, conflicts, unsupported versions, and invalid payloads, and applies the validated set atomically. It never writes user configuration or files outside the repository.
|
|
12
|
-
|
|
13
|
-
A signed bundle is accepted only with an independent trust anchor supplied to every inspect, preview, or apply call:
|
|
5
|
+
The current boundary is repository-local declaration plus evidence:
|
|
14
6
|
|
|
15
7
|
```bash
|
|
16
|
-
planr
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
planr agents init
|
|
9
|
+
planr agents check
|
|
10
|
+
planr agents list --json
|
|
19
11
|
```
|
|
20
12
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
The `planr-routing` workspace package owns all volatile opinions: named policies, exact model ids, host bindings, generated role and skill files, capability probes, evaluation scenarios, signing, registry data, and the website catalog. A normal flow is:
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
planr-routing policy list
|
|
27
|
-
planr-routing compile balanced --host codex-openai --output routing-bundle.json
|
|
28
|
-
planr routing bundle preview routing-bundle.json
|
|
29
|
-
planr routing bundle apply routing-bundle.json
|
|
30
|
-
```
|
|
13
|
+
External tools, including Switchloom v0.2.1, may create, update, apply, or uninstall repository-local routing artifacts. Those lifecycle operations happen outside Planr. Planr only consumes the resulting provider-neutral declarations and the route observations workers attach to logs.
|
|
31
14
|
|
|
32
|
-
|
|
15
|
+
Because declarations are advisory, requested model values never become proof by themselves. Strong evidence keeps requested, host-resolved, and effective execution separate in route observations, with `unavailable` used when the host cannot prove what ran.
|
package/docs/SKILLS.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Planr ships agent-facing skill templates under `plugins/planr/skills/`.
|
|
4
4
|
|
|
5
|
-
The repository ships an installable plugin under `plugins/planr` for Codex and Claude Code, while Cursor receives the same skills through `planr install cursor`. Marketplace manifests at the repo root (`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`) point at that subdirectory — Codex silently ignores marketplaces whose plugin source is the repo root itself. The shared package carries skills and Claude's independent workflow roles; optional model-specific host roles come
|
|
5
|
+
The repository ships an installable plugin under `plugins/planr` for Codex and Claude Code, while Cursor receives the same skills through `planr install cursor`. Marketplace manifests at the repo root (`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`) point at that subdirectory — Codex silently ignores marketplaces whose plugin source is the repo root itself. The shared package carries skills and Claude's independent workflow roles; optional model-specific host roles come from repository-local routing declarations managed outside Planr, never from Planr Core or static fallbacks. The `planr` CLI must be installed separately (`brew install instructa/tap/planr`).
|
|
6
6
|
|
|
7
7
|
## Install As Plugin (preferred)
|
|
8
8
|
|
|
@@ -50,14 +50,14 @@ Stage skills (what the router and loop dispatch to; also directly invocable):
|
|
|
50
50
|
|
|
51
51
|
## Cheat Sheet
|
|
52
52
|
|
|
53
|
-
Default usage needs
|
|
53
|
+
Default usage needs one public entry point:
|
|
54
54
|
|
|
55
55
|
```text
|
|
56
56
|
$planr any request -> routed to the right stage skill from live map state
|
|
57
|
-
$planr-loop one feature -> loop work/verify/review/fix until done or budget exhausted
|
|
58
|
-
$planr-goal broad goal -> plan + map + durable contract + starter for /goal or manual loops
|
|
59
57
|
```
|
|
60
58
|
|
|
59
|
+
`$planr-goal` and `$planr-loop` are advanced stage surfaces selected by the router. A long-running goal is always prepared first; only the resulting real plan id is passed to the loop driver.
|
|
60
|
+
|
|
61
61
|
The stage order the router follows for a new app:
|
|
62
62
|
|
|
63
63
|
```text
|
|
@@ -81,10 +81,13 @@ Create the product plan, split an MVP build plan, check it, then build the Planr
|
|
|
81
81
|
Do not implement yet. End with the build plan id, critical lane, and first ready items.
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
Example autonomous feature loop:
|
|
84
|
+
Example autonomous feature loop (two separate prompts):
|
|
85
85
|
|
|
86
86
|
```text
|
|
87
|
-
Use $planr-
|
|
87
|
+
Use $planr-goal to prepare an autonomous goal for the weekly overview feature.
|
|
88
|
+
|
|
89
|
+
/goal Use $planr-loop on plan <plan-id>. The loop contract is stored in planr
|
|
90
|
+
context (tag: goal-contract).
|
|
88
91
|
|
|
89
92
|
Goal: ship the weekly overview feature. DONE when every in-scope map item is closed with
|
|
90
93
|
log evidence, all reviews are closed complete, and a live verification log shows the
|
|
@@ -103,7 +106,7 @@ Do not close the item until review is complete.
|
|
|
103
106
|
|
|
104
107
|
## Two Journeys: New Project vs. Existing Project
|
|
105
108
|
|
|
106
|
-
Both journeys use the same entry point (`$planr`
|
|
109
|
+
Both journeys use the same public entry point (`$planr`). What differs is the state the router finds, and what kind of plan the work gets.
|
|
107
110
|
|
|
108
111
|
### Journey 1 — start a project from an idea
|
|
109
112
|
|
|
@@ -120,7 +123,7 @@ Create a production-ready Habit Tracker web app plan. Create the product plan,
|
|
|
120
123
|
split an MVP build plan, check it, then build the Planr map. Do not implement yet.
|
|
121
124
|
```
|
|
122
125
|
|
|
123
|
-
The router runs the full stage order: product plan -> build plan -> map
|
|
126
|
+
The router runs the full stage order: product plan -> build plan -> map. From there it can select `$planr-work`, or prepare a plan-bound `$planr-loop` run.
|
|
124
127
|
|
|
125
128
|
### Journey 2 — mid-project: add a feature, refactor, or fix
|
|
126
129
|
|
|
@@ -138,12 +141,15 @@ What the router does with that, and why:
|
|
|
138
141
|
|
|
139
142
|
1. `$planr-plan` creates a new plan scoped to the feature (`planr plan new "Auth system" ...`), not a new project. Refine notes capture constraints from the existing codebase; the build plan's "existing leverage" field records what is reused instead of rebuilt.
|
|
140
143
|
2. `$planr-task-graph` extends the existing map: new items, plus `blocks` links to anything already on the map that must land first.
|
|
141
|
-
3. Execution is identical to journey 1: `$planr-loop` for autonomous, `$planr-work` / `$planr-review` for human-in-the-loop.
|
|
144
|
+
3. Execution is identical to journey 1: a plan-bound `$planr-loop` for autonomous work, or `$planr-work` / `$planr-review` for human-in-the-loop.
|
|
142
145
|
|
|
143
|
-
Or autonomous in
|
|
146
|
+
Or autonomous in two prompts:
|
|
144
147
|
|
|
145
148
|
```text
|
|
146
|
-
Use $planr-
|
|
149
|
+
Use $planr-goal to prepare an autonomous goal for the auth system.
|
|
150
|
+
|
|
151
|
+
/goal Use $planr-loop on plan <plan-id>. The loop contract is stored in planr
|
|
152
|
+
context (tag: goal-contract).
|
|
147
153
|
|
|
148
154
|
Goal: ship an auth system (email+password, sessions, protected routes).
|
|
149
155
|
DONE when every auth map item is closed with log evidence, all reviews are closed
|
|
@@ -164,69 +170,46 @@ Rules that hold in both journeys:
|
|
|
164
170
|
The CLI provisions the role files automatically — no manual copying:
|
|
165
171
|
|
|
166
172
|
```bash
|
|
167
|
-
planr project init "My Product" --client all # writes
|
|
168
|
-
planr agents init #
|
|
173
|
+
planr project init "My Product" --client all # writes standalone Claude and Cursor roles; Codex has no project roles
|
|
174
|
+
planr agents init # writes the provider-neutral .planr/agents.toml registry; it does not generate Codex roles
|
|
169
175
|
planr install claude # provisions Claude's independent roles
|
|
170
176
|
planr install cursor # provisions Cursor's independent roles and skills
|
|
171
177
|
```
|
|
172
178
|
|
|
173
|
-
Optional project-scoped model-routing files are
|
|
179
|
+
Optional project-scoped model-routing files are repository-local declarations. They may be edited directly or managed by an external tool such as [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1); Core workflow skills remain host-neutral, and Planr does not install, invoke, apply, or uninstall external routing artifacts.
|
|
174
180
|
|
|
175
181
|
Dispatches stay one line: `Use $planr-work on item <id>` and `Use $planr-review on item <id>`. The map and logs are the loop memory, so any iteration can resume from zero context.
|
|
176
182
|
|
|
177
183
|
## Install For Codex
|
|
178
184
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
mkdir -p ~/.codex/skills
|
|
183
|
-
cp -R plugins/planr/skills/* ~/.codex/skills/
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
If Planr was installed from an npm package that includes `skills/`, copy from the package location instead:
|
|
187
|
-
|
|
188
|
-
```bash
|
|
189
|
-
PLANR_PKG="$(npm root -g)/planr"
|
|
190
|
-
mkdir -p ~/.codex/skills
|
|
191
|
-
cp -R "$PLANR_PKG"/plugins/planr/skills/* ~/.codex/skills/
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
Do not present `npx planr` as the primary install path until the npm artifact ships platform-native Planr binaries. Today the normal user path is the GitHub Release installer; npm is a development and consumer-test wrapper.
|
|
195
|
-
|
|
196
|
-
Then run Codex from a repository where `planr` is installed and initialized:
|
|
185
|
+
Install the Codex plugin for all ten workflow skills, then initialize and install the project integration:
|
|
197
186
|
|
|
198
187
|
```bash
|
|
188
|
+
codex plugin marketplace add instructa/planr
|
|
189
|
+
codex plugin add planr@planr
|
|
199
190
|
planr project init "Example Product" --client codex
|
|
191
|
+
planr install codex
|
|
200
192
|
planr doctor --client codex
|
|
201
193
|
```
|
|
202
194
|
|
|
203
|
-
Codex
|
|
204
|
-
|
|
205
|
-
```bash
|
|
206
|
-
planr install codex --dry-run
|
|
207
|
-
planr prompt mcp --client codex
|
|
208
|
-
```
|
|
195
|
+
The CLI writes the project MCP snippet and hooks. It does not copy project skills or agents; those skills are plugin-owned, and Codex has no Planr project-agent contract. `--no-mcp` leaves hooks only, while `--no-mcp --no-hooks` writes neither integration artifact.
|
|
209
196
|
|
|
210
197
|
## Install For Claude Code
|
|
211
198
|
|
|
212
|
-
Claude Code
|
|
199
|
+
Install the Claude Code plugin for all ten workflow skills and its plugin worker/reviewer agents, then install the project integration:
|
|
213
200
|
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
cp plugins/planr/agents/*.md .claude/agents/
|
|
201
|
+
```text
|
|
202
|
+
/plugin marketplace add instructa/planr
|
|
203
|
+
/plugin install planr@planr
|
|
218
204
|
```
|
|
219
205
|
|
|
220
|
-
Then add MCP and the Planr workflow prompt to project instructions when needed:
|
|
221
|
-
|
|
222
206
|
```bash
|
|
223
207
|
planr project init "Example Product" --client claude
|
|
224
|
-
planr install claude
|
|
225
|
-
planr
|
|
226
|
-
planr prompt cli --client claude
|
|
208
|
+
planr install claude
|
|
209
|
+
planr doctor --client claude
|
|
227
210
|
```
|
|
228
211
|
|
|
229
|
-
|
|
212
|
+
The CLI writes project-scoped `.mcp.json`, standalone project worker/reviewer roles, and hooks. It does not copy project skills. `--no-mcp` retains the standalone roles and hooks; add `--no-hooks` to omit hooks.
|
|
230
213
|
|
|
231
214
|
## Install For Cursor
|
|
232
215
|
|
|
@@ -237,7 +220,7 @@ planr project init "Example Product" --client cursor
|
|
|
237
220
|
planr install cursor
|
|
238
221
|
```
|
|
239
222
|
|
|
240
|
-
`planr install cursor` writes `.cursor/mcp.json`, copies the ten skills to `.cursor/skills/`, provisions `.cursor/agents/planr-worker.md` and `planr-reviewer.md`, and prints a one-click deeplink for user-level MCP install.
|
|
223
|
+
`planr install cursor` writes `.cursor/mcp.json`, copies the ten skills to `.cursor/skills/`, provisions `.cursor/agents/planr-worker.md` and `planr-reviewer.md`, reconciles hooks, and prints a one-click deeplink for user-level MCP install. `planr install cursor --no-mcp` retains the agents, skills, and hooks while omitting MCP; add `--no-hooks` to omit hooks. Invoke the public router with `/planr` in Agent chat, and dispatch subagents with `/planr-worker` and `/planr-reviewer`. Use `planr serve --port 7526` and `planr prompt http --client cursor` if a Cursor workflow should inspect the local HTTP/review workspace. Subagent multitasking and worktree guidance: [Cursor](CURSOR.md).
|
|
241
224
|
|
|
242
225
|
## MCP-Only Clients
|
|
243
226
|
|