planr 1.6.0 → 1.7.1
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 +46 -22
- package/docs/ARCHITECTURE.md +12 -1
- package/docs/RELEASE.md +37 -7
- package/docs/SWITCHLOOM_COMPATIBILITY.md +46 -0
- package/docs/contracts/EVAL_CONTRACT_V1.md +2072 -0
- package/docs/documentation/CONTRACT.md +7 -7
- package/docs/documentation/COVERAGE.md +5 -3
- package/docs/documentation/INFORMATION_ARCHITECTURE.md +5 -2
- package/docs/fixtures/mcp-contract.json +12 -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 +5 -1
- package/plugins/planr/.claude-plugin/plugin.json +1 -1
- package/plugins/planr/.codex-plugin/plugin.json +1 -1
- package/plugins/planr/agents/planr-worker.md +1 -1
- package/plugins/planr/skills/planr-goal/SKILL.md +21 -49
- package/plugins/planr/skills/planr-loop/SKILL.md +28 -94
- package/plugins/planr/skills/planr-loop/agents/planr-worker.md +1 -1
- package/plugins/planr/skills/planr-loop/references/host-dispatch.md +10 -0
- package/plugins/planr/skills/planr-loop/references/recovery-and-verification.md +24 -0
- package/plugins/planr/skills/planr-task-graph/SKILL.md +21 -190
- package/docs/CI.md +0 -54
- package/docs/CLAUDE_CODE.md +0 -52
- package/docs/CLI_REFERENCE.md +0 -160
- package/docs/CODEX.md +0 -56
- package/docs/CURSOR.md +0 -114
- package/docs/EXAMPLE_WEBAPP.md +0 -103
- package/docs/GOALS.md +0 -175
- package/docs/HANDOFFS_AND_STORIES.md +0 -121
- package/docs/HOOKS.md +0 -34
- package/docs/IMPORT.md +0 -21
- package/docs/INSTALL.md +0 -115
- package/docs/MCP_CONTRACT.md +0 -73
- package/docs/MCP_GUIDE.md +0 -40
- package/docs/MODEL_ROUTING.md +0 -33
- package/docs/NPM.md +0 -40
- package/docs/OPERATING_MODEL.md +0 -250
- package/docs/ROUTING_BUNDLES.md +0 -15
- package/docs/SECURITY.md +0 -8
- package/docs/SKILLS.md +0 -261
- package/docs/TASK_GRAPH_MODEL.md +0 -272
- package/docs/TESTING.md +0 -87
- package/docs/TROUBLESHOOTING.md +0 -30
- package/docs/planr-spec/ADRS.md +0 -160
- package/docs/planr-spec/AI_SPEC.md +0 -138
- package/docs/planr-spec/ANALYTICS_OBSERVABILITY_SPEC.md +0 -124
- package/docs/planr-spec/API_AND_DATA_MODEL.md +0 -517
- package/docs/planr-spec/BACKEND_IMPLEMENTATION_SPEC.md +0 -178
- package/docs/planr-spec/CLIENT_IMPLEMENTATION_SPEC.md +0 -119
- package/docs/planr-spec/DESIGN_SYSTEM_SPEC.md +0 -102
- package/docs/planr-spec/PRODUCT_SPEC.md +0 -193
- package/docs/planr-spec/QA_ACCEPTANCE_TESTS.md +0 -146
- package/docs/planr-spec/README.md +0 -67
- package/docs/planr-spec/REFERENCES.md +0 -29
- package/docs/planr-spec/RELEASE_READINESS.md +0 -95
- package/docs/planr-spec/SAFETY_PRIVACY_SECURITY.md +0 -169
- package/docs/planr-spec/TASKS.md +0 -932
- package/docs/planr-spec/TECH_ARCHITECTURE.md +0 -143
- package/docs/planr-spec/UX_FLOWS.md +0 -235
- package/docs/release-candidates/planr-v1.5.2.md +0 -164
- /package/docs/{planr-spec → contracts}/V1_1_DIFFERENTIATION_CONTRACT.md +0 -0
package/docs/SKILLS.md
DELETED
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
# Planr Skills
|
|
2
|
-
|
|
3
|
-
Planr ships agent-facing skill templates under `plugins/planr/skills/`.
|
|
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 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
|
-
|
|
7
|
-
## Install As Plugin (preferred)
|
|
8
|
-
|
|
9
|
-
Codex:
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
codex plugin marketplace add instructa/planr
|
|
13
|
-
# then install "planr" from the plugin directory picker, or:
|
|
14
|
-
codex plugin add planr@planr
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
Claude Code:
|
|
18
|
-
|
|
19
|
-
```text
|
|
20
|
-
/plugin marketplace add instructa/planr
|
|
21
|
-
/plugin install planr@planr
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
Skills are namespaced in Claude Code: `/planr:planr`, `/planr:planr-loop`. The plugin also registers the `planr-worker` and `planr-reviewer` subagents from the plugin's `agents/` directory.
|
|
25
|
-
|
|
26
|
-
Cursor: pending marketplace review; `planr install cursor` provides the identical component set today — it writes the skills to `.cursor/skills/`, the subagents to `.cursor/agents/`, and the MCP config in one command (see below and [Cursor](CURSOR.md)).
|
|
27
|
-
|
|
28
|
-
opencode: no plugin yet; use `planr mcp` as an MCP server (below). A JS plugin wrapping the CLI as custom tools is a possible follow-up.
|
|
29
|
-
|
|
30
|
-
## Included Skills
|
|
31
|
-
|
|
32
|
-
Entry points (what users invoke):
|
|
33
|
-
|
|
34
|
-
- `planr`: master router. One entry point for any request; reads live map state and dispatches to the right skill. Users do not need to remember skill names.
|
|
35
|
-
- `planr-goal`: goal prep compiler for long-running runs. Turns a broad goal into a checked plan, a linked map, and a durable goal contract (`planr context --tag goal-contract`), then prints the starter command for the host's loop driver (Codex/Claude Code `/goal`, or manual re-dispatch). Prep only — see [Long-Running Goals](GOALS.md).
|
|
36
|
-
- `planr-loop`: autonomous closing loop. Drives one feature to verified completion — work, live verification, independent review, fix items — until the map is clean or the iteration budget runs out. Ships subagent templates under `plugins/planr/skills/planr-loop/agents/`.
|
|
37
|
-
|
|
38
|
-
Capability skills (dispatched by the loop's live-verification step):
|
|
39
|
-
|
|
40
|
-
- `planr-verify-web`: proves a web feature runs in a browser. Discovers the host's existing browser capability (browser skill, browser MCP, `npx playwright`, HTTP checks as last resort), records the choice as a `capability` context, and logs replayable evidence. Ships no browser tooling itself.
|
|
41
|
-
|
|
42
|
-
Stage skills (what the router and loop dispatch to; also directly invocable):
|
|
43
|
-
|
|
44
|
-
- `planr-task-graph`: active task graph coordination with plans, parent gates, map items, picks, runtime state, approvals, logs, reviews, handoffs, stories, and recovery.
|
|
45
|
-
- `planr-plan`: product and build planning.
|
|
46
|
-
- `planr-work`: one picked item to evidence-backed completion.
|
|
47
|
-
- `planr-review`: findings-first review gates.
|
|
48
|
-
- `planr-status`: honest read-only status.
|
|
49
|
-
- `planr-summary`: evidence-backed summaries.
|
|
50
|
-
|
|
51
|
-
## Cheat Sheet
|
|
52
|
-
|
|
53
|
-
Default usage needs one public entry point:
|
|
54
|
-
|
|
55
|
-
```text
|
|
56
|
-
$planr any request -> routed to the right stage skill from live map state
|
|
57
|
-
```
|
|
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
|
-
The stage order the router follows for a new app:
|
|
62
|
-
|
|
63
|
-
```text
|
|
64
|
-
$planr-plan idea -> product plan -> build plan
|
|
65
|
-
$planr-task-graph build plan -> map -> dependencies -> critical lane
|
|
66
|
-
$planr-work pick one ready item -> implement -> log evidence -> request review
|
|
67
|
-
$planr-review audit evidence -> complete or create fix work
|
|
68
|
-
$planr-work pick generated fix work when review finds issues
|
|
69
|
-
$planr-status report honest state, blockers, and next ready work
|
|
70
|
-
$planr-summary summarize completed scope with evidence
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
Example first prompt for a Habit Tracker:
|
|
74
|
-
|
|
75
|
-
```text
|
|
76
|
-
Use $planr.
|
|
77
|
-
|
|
78
|
-
Create a production-ready Habit Tracker web app plan. Include habits, daily check-ins,
|
|
79
|
-
streaks, weekly overview, local-first persistence, tests, privacy, and release readiness.
|
|
80
|
-
Create the product plan, split an MVP build plan, check it, then build the Planr map.
|
|
81
|
-
Do not implement yet. End with the build plan id, critical lane, and first ready items.
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
Example autonomous feature loop (two separate prompts):
|
|
85
|
-
|
|
86
|
-
```text
|
|
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).
|
|
91
|
-
|
|
92
|
-
Goal: ship the weekly overview feature. DONE when every in-scope map item is closed with
|
|
93
|
-
log evidence, all reviews are closed complete, and a live verification log shows the
|
|
94
|
-
overview rendering real check-in data in the browser. Iteration budget: 10.
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
Example single implementation step (human-in-the-loop):
|
|
98
|
-
|
|
99
|
-
```text
|
|
100
|
-
Use $planr-work.
|
|
101
|
-
|
|
102
|
-
Pick exactly one ready Habit Tracker item. Implement only that item, keep Planr runtime
|
|
103
|
-
state current, log changed files and real verification commands, then request review.
|
|
104
|
-
Do not close the item until review is complete.
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Two Journeys: New Project vs. Existing Project
|
|
108
|
-
|
|
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.
|
|
110
|
-
|
|
111
|
-
### Journey 1 — start a project from an idea
|
|
112
|
-
|
|
113
|
-
Initialize once per repository, then hand the idea to the router:
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
planr project init "Habit Tracker" --client all
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
```text
|
|
120
|
-
Use $planr.
|
|
121
|
-
|
|
122
|
-
Create a production-ready Habit Tracker web app plan. Create the product plan,
|
|
123
|
-
split an MVP build plan, check it, then build the Planr map. Do not implement yet.
|
|
124
|
-
```
|
|
125
|
-
|
|
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.
|
|
127
|
-
|
|
128
|
-
### Journey 2 — mid-project: add a feature, refactor, or fix
|
|
129
|
-
|
|
130
|
-
Never re-run `project init`; the project and map already exist. Every new scope — a feature like an auth system, a refactor, a non-trivial fix — gets its own feature-scoped plan on the same map:
|
|
131
|
-
|
|
132
|
-
```text
|
|
133
|
-
Use $planr.
|
|
134
|
-
|
|
135
|
-
Add an auth system (email+password, sessions, protected routes) to this app.
|
|
136
|
-
Create a feature plan for it, record what existing code it builds on, split a
|
|
137
|
-
narrow build slice, check it, and extend the map with linked items. Do not implement yet.
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
What the router does with that, and why:
|
|
141
|
-
|
|
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.
|
|
143
|
-
2. `$planr-task-graph` extends the existing map: new items, plus `blocks` links to anything already on the map that must land first.
|
|
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.
|
|
145
|
-
|
|
146
|
-
Or autonomous in two prompts:
|
|
147
|
-
|
|
148
|
-
```text
|
|
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).
|
|
153
|
-
|
|
154
|
-
Goal: ship an auth system (email+password, sessions, protected routes).
|
|
155
|
-
DONE when every auth map item is closed with log evidence, all reviews are closed
|
|
156
|
-
complete, and a live verification log shows login and a protected route working
|
|
157
|
-
in the browser. Iteration budget: 10.
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
Rules that hold in both journeys:
|
|
161
|
-
|
|
162
|
-
- No map items without a checked build plan — even a small fix gets a minimal slice (`plan new` -> `plan split` with a tiny scope). This keeps closure evidence and reviews attached to a contract.
|
|
163
|
-
- Plans accumulate: `planr plan list` shows the project's history of scopes; the map stays the single live source of item status.
|
|
164
|
-
- Status, review, and summary requests (`$planr-status`, `$planr-review`, `$planr-summary`) work the same at any point in either journey.
|
|
165
|
-
|
|
166
|
-
## Loop Roles
|
|
167
|
-
|
|
168
|
-
`planr-loop` keeps maker and checker separate. Hosts with subagents get dedicated roles that are prompted with skills, not hand-written prompts.
|
|
169
|
-
|
|
170
|
-
The CLI provisions the role files automatically — no manual copying:
|
|
171
|
-
|
|
172
|
-
```bash
|
|
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
|
|
175
|
-
planr install claude # provisions Claude's independent roles
|
|
176
|
-
planr install cursor # provisions Cursor's independent roles and skills
|
|
177
|
-
```
|
|
178
|
-
|
|
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.
|
|
180
|
-
|
|
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.
|
|
182
|
-
|
|
183
|
-
## Install For Codex
|
|
184
|
-
|
|
185
|
-
Install the Codex plugin for all ten workflow skills, then initialize and install the project integration:
|
|
186
|
-
|
|
187
|
-
```bash
|
|
188
|
-
codex plugin marketplace add instructa/planr
|
|
189
|
-
codex plugin add planr@planr
|
|
190
|
-
planr project init "Example Product" --client codex
|
|
191
|
-
planr install codex
|
|
192
|
-
planr doctor --client codex
|
|
193
|
-
```
|
|
194
|
-
|
|
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.
|
|
196
|
-
|
|
197
|
-
## Install For Claude Code
|
|
198
|
-
|
|
199
|
-
Install the Claude Code plugin for all ten workflow skills and its plugin worker/reviewer agents, then install the project integration:
|
|
200
|
-
|
|
201
|
-
```text
|
|
202
|
-
/plugin marketplace add instructa/planr
|
|
203
|
-
/plugin install planr@planr
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
```bash
|
|
207
|
-
planr project init "Example Product" --client claude
|
|
208
|
-
planr install claude
|
|
209
|
-
planr doctor --client claude
|
|
210
|
-
```
|
|
211
|
-
|
|
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.
|
|
213
|
-
|
|
214
|
-
## Install For Cursor
|
|
215
|
-
|
|
216
|
-
One command wires everything — MCP, the skills, and the subagent roles:
|
|
217
|
-
|
|
218
|
-
```bash
|
|
219
|
-
planr project init "Example Product" --client cursor
|
|
220
|
-
planr install cursor
|
|
221
|
-
```
|
|
222
|
-
|
|
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).
|
|
224
|
-
|
|
225
|
-
## MCP-Only Clients
|
|
226
|
-
|
|
227
|
-
Any MCP-capable coding agent can run:
|
|
228
|
-
|
|
229
|
-
```bash
|
|
230
|
-
planr mcp
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
Use these commands for setup text without editing global config:
|
|
234
|
-
|
|
235
|
-
```bash
|
|
236
|
-
planr prompt mcp --client all
|
|
237
|
-
planr prompt cli --client all
|
|
238
|
-
planr prompt http --client all
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
## What The Skills Do
|
|
242
|
-
|
|
243
|
-
The skills are client-neutral and use only Planr-owned commands:
|
|
244
|
-
|
|
245
|
-
```bash
|
|
246
|
-
planr project show --json
|
|
247
|
-
planr plan new "App idea"
|
|
248
|
-
planr map build --from <plan-id>
|
|
249
|
-
planr pick --json
|
|
250
|
-
planr done <item-id> --summary "..." --files a --files b --cmd "..." --review --next
|
|
251
|
-
planr review close <review-id> --verdict complete --close-target
|
|
252
|
-
planr approval list --open
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
The granular commands (`log add`, `review request`, `close`, `pick heartbeat`) remain available; `done` chains them with identical evidence.
|
|
256
|
-
|
|
257
|
-
See also:
|
|
258
|
-
|
|
259
|
-
- [Operating Model](OPERATING_MODEL.md)
|
|
260
|
-
- [Task Graph Model](TASK_GRAPH_MODEL.md)
|
|
261
|
-
- [Handoffs And Stories](HANDOFFS_AND_STORIES.md)
|
package/docs/TASK_GRAPH_MODEL.md
DELETED
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
# Planr Task Graph Model
|
|
2
|
-
|
|
3
|
-
Planr's map is a local dependency-aware graph for coding-agent work. It exists so agents can coordinate without relying on ad hoc chat history.
|
|
4
|
-
|
|
5
|
-
## Core Objects
|
|
6
|
-
|
|
7
|
-
- Project: repository-level Planr workspace.
|
|
8
|
-
- Plan: Markdown product or build package.
|
|
9
|
-
- Item: one unit of live work in the map.
|
|
10
|
-
- Link: relationship between items.
|
|
11
|
-
- Pick: atomic claim of a ready item by one worker session.
|
|
12
|
-
- Log: durable proof of implementation, verification, review, or handoff.
|
|
13
|
-
- Review: an item that blocks target closure until it is closed.
|
|
14
|
-
- Context: searchable discovery or decision.
|
|
15
|
-
- Recovery: explicit preview/apply operation for stale, timed-out, or retryable work.
|
|
16
|
-
|
|
17
|
-
## State Authority
|
|
18
|
-
|
|
19
|
-
The SQLite database is authoritative for:
|
|
20
|
-
|
|
21
|
-
- item status;
|
|
22
|
-
- links and readiness;
|
|
23
|
-
- picks and ownership;
|
|
24
|
-
- reviews and closure gates;
|
|
25
|
-
- contexts and logs;
|
|
26
|
-
- artifacts and events as they become public product surfaces.
|
|
27
|
-
|
|
28
|
-
Markdown plans are authoritative for scope and acceptance criteria. They do not override map state.
|
|
29
|
-
|
|
30
|
-
## Item Readiness
|
|
31
|
-
|
|
32
|
-
Readiness is derived from state and links:
|
|
33
|
-
|
|
34
|
-
- an item may become ready when its blocking upstream items are closed;
|
|
35
|
-
- picked items are owned by one worker session;
|
|
36
|
-
- requesting a review moves a picked or running item to `in_review` (ownership kept) so the wait state is visible instead of masquerading as active work;
|
|
37
|
-
- closed items can unlock downstream items;
|
|
38
|
-
- open review items block target closure;
|
|
39
|
-
- cancelled items should not silently unlock unrelated work.
|
|
40
|
-
|
|
41
|
-
The status lifecycle for work items is `pending -> ready -> picked -> running -> in_review -> closed` (with `blocked`, `failed`, `cancelled`, and `closed_partial` as branch states). `in_review` items still accept evidence logs and heartbeats from their owner, are excluded from new picks, and close either through `review close --verdict complete --close-target` or an explicit `planr close` after the review completes. Findings keep the target `in_review`: the follow-up review gates the same target until the chain settles.
|
|
42
|
-
|
|
43
|
-
Use:
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
planr map show --json
|
|
47
|
-
planr map lane --critical
|
|
48
|
-
planr map pressure
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Links
|
|
52
|
-
|
|
53
|
-
Create explicit order:
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
planr item create "Design API" --description "Define endpoints and data ownership."
|
|
57
|
-
planr item create "Implement API" --description "Build endpoints after design is closed."
|
|
58
|
-
planr link add <design-item> <implementation-item> --type blocks
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Use `blocks` for hard ordering. Use softer link types only when the product contract for that type is documented and tested.
|
|
62
|
-
|
|
63
|
-
Structured output always keeps that canonical `blocks` kind. Human rendering adds
|
|
64
|
-
current satisfaction state without mutating it: an upstream `closed` or
|
|
65
|
-
`closed_partial` item renders as dim `blocks✓` in the compact tree and neutral `then`
|
|
66
|
-
in the human-only diagram. Open, failed, and cancelled upstream items still render as
|
|
67
|
-
red `blocks`; cancellation does not satisfy readiness.
|
|
68
|
-
|
|
69
|
-
## Picking
|
|
70
|
-
|
|
71
|
-
Picking is the concurrency boundary:
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
planr pick --json
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
One ready item should be picked by one worker. The pick output is one flat work packet — item, links, logs, runtime, recovery, conditions, recall context, and a `remaining` progress snapshot, each fact exactly once; empty collections are omitted. Picked work records `worker_id`, `pick_token`, `picked_at`, and `last_heartbeat_at`. Worker identity is stable per client, host, and user, so heartbeats keep working across the many short-lived processes of an agent session. Agents should export `PLANR_WORKER_ID` (an explicit identity such as `maker-1` or `checker-1`) for the whole session, so picks, logs, and heartbeats attribute to the agent instead of `client:host:user`. Parallel workers on the same machine must set `PLANR_WORKER_ID` (or `PLANR_SESSION_ID`) to distinct values. Evidence written via `log add` or `done` by the owner refreshes the heartbeat automatically; the explicit runtime commands cover long silent stretches:
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
planr pick heartbeat [item-id]
|
|
81
|
-
planr pick progress <item-id> --percent 42 --note "running focused tests"
|
|
82
|
-
planr pick pause <item-id> --note "waiting for review input"
|
|
83
|
-
planr pick resume <item-id>
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
If two workers race, the database must allow only one winner. If the owner disappears, inspect stale claims and reset intentionally:
|
|
87
|
-
|
|
88
|
-
```bash
|
|
89
|
-
planr pick stale --older-than-seconds 900
|
|
90
|
-
planr pick stale --older-than-seconds 900 --release
|
|
91
|
-
planr recover sweep --older-than-seconds 900
|
|
92
|
-
planr recover sweep --older-than-seconds 900 --apply
|
|
93
|
-
planr pick release <item-id> --force
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
Use forced release only when the operator intentionally transfers ownership. Use `recover sweep --apply` for the broader recovery path that also requeues timed-out picked work and retryable failed work.
|
|
97
|
-
|
|
98
|
-
## Approvals
|
|
99
|
-
|
|
100
|
-
Approvals are explicit human gates on an item:
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
planr approval request <item-id> --reason "needs release approval"
|
|
104
|
-
planr approval deny <item-id> --by "qa" --comment "missing evidence"
|
|
105
|
-
planr approval approve <item-id> --by "qa" --comment "evidence accepted"
|
|
106
|
-
planr approval list --open
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
An item with `requested` or `denied` approval status cannot close. `map preview --close <item-id>` reports whether approval blocks closure before the mutation is attempted.
|
|
110
|
-
|
|
111
|
-
## Reviews And Fix Chains
|
|
112
|
-
|
|
113
|
-
Request review after evidence exists:
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
planr review request <item-id>
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
A clean review can close:
|
|
120
|
-
|
|
121
|
-
```bash
|
|
122
|
-
planr review close <review-id> --verdict complete
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
Findings create follow-up work:
|
|
126
|
-
|
|
127
|
-
```bash
|
|
128
|
-
planr review close <review-id> \
|
|
129
|
-
--verdict not-complete \
|
|
130
|
-
--findings "specific actionable finding"
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
The target item may close only when required review items are closed.
|
|
134
|
-
|
|
135
|
-
Every `review close` records a derived `review_mode`: the closing reviewer identity is compared against the target item's lease holder and recorded as `single_agent` (same identity), `independent` (different identity), or `unattributed` (no recorded maker). The mode lands in the close response, review log, artifact, and event — independence is proven by recorded identity, not declared by a note. `unattributed` should be rare: `done` adopts a never-picked ready item (the lease is written retroactively under the current worker), so every completion path records a maker. When it does appear, the close output explains that the target carried no lease.
|
|
136
|
-
|
|
137
|
-
## Evidence
|
|
138
|
-
|
|
139
|
-
Logs make closure auditable:
|
|
140
|
-
|
|
141
|
-
```bash
|
|
142
|
-
planr log add --item <item-id> \
|
|
143
|
-
--summary "Implemented parser hardening" \
|
|
144
|
-
--files src/parser.rs,tests/parser.rs \
|
|
145
|
-
--cmd "cargo test parser"
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
Use multiple `--cmd` or `--tests` values when more than one verification command matters. `--cmd` records what was executed; `--tests` records test commands/results specifically — both are evidence fields, not gates.
|
|
149
|
-
|
|
150
|
-
Live verification evidence (browser runs, smoke tests against a running app) uses `--kind verification`:
|
|
151
|
-
|
|
152
|
-
```bash
|
|
153
|
-
planr log add --item <item-id> --kind verification \
|
|
154
|
-
--summary "Verified upload flow in browser: video plays after publish" \
|
|
155
|
-
--cmd "agent-browser snapshot http://localhost:3000/watch/1"
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
`plan audit` checks for verification logs when a goal contract exists. Log persistent evidence, not transient states: a failure that you immediately fix belongs in the final log's narrative, not as a standalone failure log.
|
|
159
|
-
|
|
160
|
-
Settling commands (`done`, `close`, `review close`) report what they `unlocked` — every item that became ready because of that settlement — plus the item's `post_condition` and an evidence hint when downstream work depends on an item closed without `--cmd`/`--tests`.
|
|
161
|
-
|
|
162
|
-
## Graph Inspection
|
|
163
|
-
|
|
164
|
-
Coding agents use the compact default tree or `map show --json`. They must not
|
|
165
|
-
invoke the diagram renderer. The boxed workflow diagram is exclusively for a
|
|
166
|
-
person scanning the graph shape and current state:
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
planr map show
|
|
170
|
-
planr map show --view diagram
|
|
171
|
-
planr map show --plan <plan-id> --view diagram
|
|
172
|
-
planr map show --plan <plan-id> --view diagram --full
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
The default diagram keeps every box to at most two content lines in
|
|
176
|
-
`ICON ITEM-ID → TITLE` form. It still labels readiness-blocking routes, joins,
|
|
177
|
-
disconnected components, and cycles. Active dependencies use `blocks`; satisfied
|
|
178
|
-
dependencies use neutral `then`. Add `--full` for the previous verbose node
|
|
179
|
-
layout with status words, complete wrapped titles, critical items, downstream
|
|
180
|
-
pressure, and active workers. It is only a human renderer: coding agents do not
|
|
181
|
-
invoke it, the SQLite map
|
|
182
|
-
remains authoritative, the default `map show` view stays `tree`, and `--json`
|
|
183
|
-
returns the same projection regardless of diagram detail.
|
|
184
|
-
|
|
185
|
-
Human map states are colorized automatically on an interactive terminal while
|
|
186
|
-
retaining their symbols and words. `--no-color`, `NO_COLOR`, `TERM=dumb`, pipes,
|
|
187
|
-
and JSON stay plain.
|
|
188
|
-
|
|
189
|
-
For a person to observe an agent live, use a second terminal:
|
|
190
|
-
|
|
191
|
-
```bash
|
|
192
|
-
# terminal A: agent/worker continues to pick, log, review, and close work
|
|
193
|
-
# terminal B:
|
|
194
|
-
planr map watch --plan <plan-id>
|
|
195
|
-
planr map watch --plan <plan-id> --until-settled
|
|
196
|
-
planr map watch --plan <plan-id> --full
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
`map watch` is human-only; coding agents must not invoke it. Watch defaults to
|
|
200
|
-
the condensed diagram, polls once per second, and redraws only
|
|
201
|
-
after a canonical graph change. `--full`, `--view tree`, `--interval-ms`, and
|
|
202
|
-
`--no-clear` are available for detailed, compact-tree, or append-only
|
|
203
|
-
observation. It records no graph events. Agents use `map show --json` or the
|
|
204
|
-
local `/v1/events/stream` SSE endpoint instead.
|
|
205
|
-
Machine consumers should use JSON snapshots or the local
|
|
206
|
-
`/v1/events/stream` SSE endpoint.
|
|
207
|
-
|
|
208
|
-
Use critical lane for ordering risk:
|
|
209
|
-
|
|
210
|
-
```bash
|
|
211
|
-
planr map lane --critical
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
Use pressure for bottlenecks:
|
|
215
|
-
|
|
216
|
-
```bash
|
|
217
|
-
planr map pressure
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
Use trace for handoff:
|
|
221
|
-
|
|
222
|
-
```bash
|
|
223
|
-
planr trace item <item-id>
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
The trace should be enough for a new agent to recover the current item, linked logs, and linked blockers.
|
|
227
|
-
|
|
228
|
-
Use status, lookahead, and close preview before sequencing or closure:
|
|
229
|
-
|
|
230
|
-
```bash
|
|
231
|
-
planr map status
|
|
232
|
-
planr map lookahead <item-id>
|
|
233
|
-
planr map preview --close <item-id>
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
These commands expose readiness, downstream unlocks, closure blockers, approval requirements, open reviews, and manual conditions before mutating graph state.
|
|
237
|
-
|
|
238
|
-
## Review Evidence
|
|
239
|
-
|
|
240
|
-
Review evidence is item-scoped proof, not a dump of the whole repository:
|
|
241
|
-
|
|
242
|
-
```bash
|
|
243
|
-
planr review evidence <item-id>
|
|
244
|
-
planr review evidence <item-id> --pr-url https://example.invalid/pr/123
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
Planr reports Git branch, commit, dirty state, files named by item logs/artifacts, unrelated dirty files, and optional PR URL context. It does not inline source file content by default.
|
|
248
|
-
|
|
249
|
-
## Packages
|
|
250
|
-
|
|
251
|
-
Packages preserve reusable graph context outside the live database:
|
|
252
|
-
|
|
253
|
-
```bash
|
|
254
|
-
planr export --include-plans --include-logs --template-name "Release checklist" --tag release --out planr-package.json
|
|
255
|
-
planr import planr-package.json --preview
|
|
256
|
-
planr import planr-package.json --confirm
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
Package import is preview-first and confirmed explicitly. Imported packages restore items, links, contexts, logs, plan file snapshots, and review artifacts into the current map.
|
|
260
|
-
|
|
261
|
-
## Graph Adaptation
|
|
262
|
-
|
|
263
|
-
Planr supports graph adaptation without relying on chat-only replanning:
|
|
264
|
-
|
|
265
|
-
- use `item breakdown` for decomposition;
|
|
266
|
-
- use `item insert --preview` before rewiring linked work and `--confirm` to apply;
|
|
267
|
-
- use `item amend` for future-work context;
|
|
268
|
-
- use `item replan --preview` before replacing pending child work and `--confirm` to apply;
|
|
269
|
-
- use `link add` and `link remove` for dependency changes;
|
|
270
|
-
- use `map preview --close`, `map unlocks`, `map lookahead`, and `map status` before closing or sequencing work;
|
|
271
|
-
- use `item cancel --preview` before cancellation;
|
|
272
|
-
- use `trace item` and logs for recovery.
|
package/docs/TESTING.md
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# Testing
|
|
2
|
-
|
|
3
|
-
Planr has two test layers plus a release-grade V1.1 verification ladder.
|
|
4
|
-
|
|
5
|
-
## In-Repo Tests
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
cargo fmt --check
|
|
9
|
-
cargo clippy --all-targets -- -D warnings
|
|
10
|
-
cargo test
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Focused V1.1 checks should be run when their surfaces change:
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
cargo test recovery_sweep -- --nocapture
|
|
17
|
-
cargo test local_review_workspace -- --nocapture
|
|
18
|
-
cargo test review_evidence -- --nocapture
|
|
19
|
-
cargo test template_export_import -- --nocapture
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Consumer E2E Project
|
|
23
|
-
|
|
24
|
-
The standalone consumer suite is a maintainer-local project that is not part of this repository. On maintainer machines it lives at:
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
~/projects/planr-test
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
Contributors without that project should rely on the in-repo suite (`cargo test`), which covers the same CLI, MCP, and HTTP surfaces.
|
|
31
|
-
|
|
32
|
-
Run against the local native binary:
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
cd ~/projects/planr
|
|
36
|
-
cargo build --release
|
|
37
|
-
cd ~/projects/planr-test
|
|
38
|
-
npm test
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
Run through the npm package wrapper:
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
cd ~/projects/planr
|
|
45
|
-
npm link
|
|
46
|
-
cd ~/projects/planr-test
|
|
47
|
-
npm link planr
|
|
48
|
-
npm run test:npm-planr
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
The consumer suite exercises every public command group and subcommand, MCP stdio, local HTTP/SSE, import/export, review gates, install helpers, and generated plan files.
|
|
52
|
-
|
|
53
|
-
## V1.1 Release Verification
|
|
54
|
-
|
|
55
|
-
Before calling V1.1 complete, run the full in-repo and consumer ladder:
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
cargo fmt --check
|
|
59
|
-
cargo test
|
|
60
|
-
cargo clippy --all-targets -- -D warnings
|
|
61
|
-
scripts/build-release.sh
|
|
62
|
-
(cd dist && shasum -a 256 -c SHA256SUMS)
|
|
63
|
-
(cd dist/planr-1.0.0 && shasum -a 256 -c SHA256SUMS)
|
|
64
|
-
npm pack --dry-run
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
Installer changes also require:
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
/Users/kregenrek/.agents/skills/shellck/scripts/run_shellck.sh scripts/install.sh
|
|
71
|
-
PREFIX="$(mktemp -d)" PLANR_DOWNLOAD=1 PLANR_RELEASE_BASE_URL="file://$PWD/dist" scripts/install.sh
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Live behavior must be proved with:
|
|
75
|
-
|
|
76
|
-
- a fresh consumer project at `~/projects/planr-test`;
|
|
77
|
-
- MCP stdio contract checks against `docs/fixtures/mcp-contract.json`;
|
|
78
|
-
- localhost HTTP/SSE checks and the browser review workspace at `/review`;
|
|
79
|
-
- recovery sweep checks for stale, timed-out, and retryable work;
|
|
80
|
-
- Git/PR review evidence checks that do not inline source content;
|
|
81
|
-
- package export/import checks for templates, logs, plan files, and review artifacts;
|
|
82
|
-
- prompt output checks for CLI, MCP, and HTTP setup text;
|
|
83
|
-
- a forbidden-reference scrub across public repo files.
|
|
84
|
-
|
|
85
|
-
## Contract Fixtures
|
|
86
|
-
|
|
87
|
-
`docs/fixtures/mcp-contract.json` is checked by the Rust E2E suite against live MCP stdio responses, install dry-runs, and the CLI reference. Update the fixture and `docs/MCP_CONTRACT.md` together when adding or removing MCP tools, resources, prompts, or install snippets.
|
package/docs/TROUBLESHOOTING.md
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# Troubleshooting
|
|
2
|
-
|
|
3
|
-
## No Ready Items
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
planr map show --json
|
|
7
|
-
planr map pressure
|
|
8
|
-
planr trace item <item-id>
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## MCP Client Cannot See Tools
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
planr doctor --client all
|
|
15
|
-
planr install codex --dry-run
|
|
16
|
-
planr install claude --dry-run
|
|
17
|
-
planr install cursor --dry-run
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## A Planr Command Appears To Hang
|
|
21
|
-
|
|
22
|
-
Planr bounds every database wait: `busy_timeout` is 5 seconds, and no command loops indefinitely — SQLite contention resolves or errors within that bound (a parallel first-pick storm is regression-tested). If a command still appears hung inside an agent-host tool call, the wait is almost certainly outside Planr: host tool harnesses that stop draining the child's stdout block the process on a full pipe, which looks exactly like a hang and works on retry. Kill and re-run the command; if it reproduces outside the host harness (plain terminal), capture a stack (`lldb -p <pid>` then `bt all`) and file it with the output — that would be a Planr bug we want.
|
|
23
|
-
|
|
24
|
-
## Database Or Import Issues
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
planr project show --json
|
|
28
|
-
planr import /path/to/repo --json
|
|
29
|
-
planr export --include-plans --include-logs --out planr-debug.json
|
|
30
|
-
```
|