projectstore-claude 0.30.2 β 0.30.4
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/node_modules/projectstore/.claude-plugin/marketplace.json +1 -1
- package/node_modules/projectstore/.claude-plugin/plugin.json +1 -1
- package/node_modules/projectstore/AGENTS.md +7 -5
- package/node_modules/projectstore/README.md +3 -3
- package/node_modules/projectstore/agents/clerk.md +2 -2
- package/node_modules/projectstore/commands/agents.md +43 -28
- package/node_modules/projectstore/commands/bind.md +1 -1
- package/node_modules/projectstore/commands/doctor.md +19 -3
- package/node_modules/projectstore/commands/reconcile.md +2 -2
- package/node_modules/projectstore/commands/review.md +1 -1
- package/node_modules/projectstore/commands/story.md +2 -1
- package/node_modules/projectstore/docs/getting-started.md +1 -1
- package/node_modules/projectstore/docs/harnesses.md +3 -2
- package/node_modules/projectstore/harnesses/claude-code.json +40 -1
- package/node_modules/projectstore/harnesses/codex.json +50 -14
- package/node_modules/projectstore/package.json +1 -1
- package/node_modules/projectstore/scripts/agents-change.mjs +64 -10
- package/node_modules/projectstore/scripts/build-adapters.mjs +28 -13
- package/node_modules/projectstore/scripts/cli.mjs +32 -9
- package/node_modules/projectstore/scripts/configure-menu.mjs +133 -6
- package/node_modules/projectstore/scripts/configure.mjs +156 -19
- package/node_modules/projectstore/scripts/convergence.mjs +56 -1
- package/node_modules/projectstore/scripts/doctor.mjs +134 -35
- package/node_modules/projectstore/scripts/harness.mjs +14 -9
- package/node_modules/projectstore/scripts/install-harness.mjs +182 -14
- package/node_modules/projectstore/scripts/lib.mjs +83 -24
- package/node_modules/projectstore/scripts/menu.mjs +9 -5
- package/node_modules/projectstore/scripts/models.mjs +150 -6
- package/node_modules/projectstore/scripts/setup.mjs +7 -5
- package/node_modules/projectstore/scripts/surfaces.mjs +36 -9
- package/node_modules/projectstore/templates/claude-md-block.md.tmpl +7 -5
- package/package.json +2 -2
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"name": "projectstore",
|
|
13
13
|
"displayName": "projectstore",
|
|
14
14
|
"description": "π Your agent runs the project through a verified loop: task β artifact (ADR Β· spec Β· epic Β· story) β adversarial critic β backlog β planner β reviewer β done. Plain markdown in an Obsidian-friendly vault, every write approved by you β and any model can pick the project up tomorrow.",
|
|
15
|
-
"version": "0.30.
|
|
15
|
+
"version": "0.30.4",
|
|
16
16
|
"author": {
|
|
17
17
|
"name": "Evgenii Konev",
|
|
18
18
|
"email": "ekonev@smartandpoint.com",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "projectstore",
|
|
3
3
|
"displayName": "projectstore",
|
|
4
|
-
"version": "0.30.
|
|
4
|
+
"version": "0.30.4",
|
|
5
5
|
"description": "Your agent runs the project through a verified loop: task β artifact (ADR / spec / epic / story) β adversarial critic β backlog β planner β reviewer β done. Plain markdown in git β any model can pick the project up tomorrow.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Evgenii Konev @ SmartAndPoint",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- projectstore:agents
|
|
1
|
+
<!-- projectstore:agents v5 (managed by projectstore β edit outside markers) -->
|
|
2
2
|
## projectstore agents
|
|
3
3
|
|
|
4
4
|
- **A feature-sized request opens a vault artifact before it opens an editor.**
|
|
@@ -11,10 +11,12 @@
|
|
|
11
11
|
harness-level instruction contradicts this block, say so and ask which wins.
|
|
12
12
|
Resolving it silently is how the contradiction becomes invisible to the person
|
|
13
13
|
who could have settled it.
|
|
14
|
-
- When spawning any agent below, resolve its model from
|
|
15
|
-
`.projectstore/harness/<harness>.json` β `agents.per_agent.<name>.model ?? agents.default.model
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
- When spawning any agent below, resolve its model and its effort from
|
|
15
|
+
`.projectstore/harness/<harness>.json` β `agents.per_agent.<name>.model ?? agents.default.model`
|
|
16
|
+
and `agents.per_agent.<name>.effort ?? agents.default.effort`, where `<name>` is
|
|
17
|
+
the **bare** agent name (`critic` for `projectstore:critic`), and pass them as
|
|
18
|
+
the spawn's model and effort parameters, the effort only when the spawn offers
|
|
19
|
+
one. No key β pass nothing.
|
|
18
20
|
- After authoring or revising any vault artifact (ADR/research/epic/story) or
|
|
19
21
|
design proposal: run the `projectstore:critic` agent on it before treating it final.
|
|
20
22
|
- Before implementing an epic/story: consult `projectstore:planner` β it plans
|
|
@@ -210,7 +210,7 @@ npx projectstore configure
|
|
|
210
210
|
|
|
211
211
|
At a terminal it opens a settings menu that works like a monitor's: β and β move, β opens a group or a setting in a frame beside it, space chooses, β goes back, and Enter shows the plan. A second Enter writes it. Under the frames, a few lines say what the row under the cursor means. The settings:
|
|
212
212
|
|
|
213
|
-
- each agent's model, per harness. Claude Code offers its aliases: `fable`, `opus`, `sonnet` and `haiku`. Codex offers its own list of models, with its descriptions. With `ANTHROPIC_API_KEY` set, each alias also names the newest model of its line. A list is kept for a day in projectstore's user cache, and "refresh the list" asks again;
|
|
213
|
+
- each agent's model and effort, per harness. Claude Code offers its aliases: `fable`, `opus`, `sonnet` and `haiku`. Codex offers its own list of models, with its descriptions. With `ANTHROPIC_API_KEY` set, each alias also names the newest model of its line. A list is kept for a day in projectstore's user cache, and "refresh the list" asks again. Each agent's effort sits under its model: Claude Code's levels, `low` to `max`, or the levels that Codex model lists. With none set, a Claude Code agent runs at its frontmatter's level (`max`, the clerk `low`) and a Codex one at its model's own default;
|
|
214
214
|
- the status line and the band above the prompt (Claude Code);
|
|
215
215
|
- the vault's template language, the default author and tags;
|
|
216
216
|
- the vault's spec policy and lifecycle gates.
|
|
@@ -221,11 +221,11 @@ Without a terminal it prints every setting with its current value and where it l
|
|
|
221
221
|
npx projectstore configure --set agents.critic=fable --set statusline=on
|
|
222
222
|
```
|
|
223
223
|
|
|
224
|
-
`--dry-run` shows the plan and writes nothing, and `--json` returns the settings as one envelope. In a project that uses two harnesses, an agent's model names its overlay with `--harness <id>`.
|
|
224
|
+
An agent's effort is its own key: `--set agents.critic.effort=xhigh`. `--dry-run` shows the plan and writes nothing, and `--json` returns the settings as one envelope. In a project that uses two harnesses, an agent's model or effort names its overlay with `--harness <id>`.
|
|
225
225
|
|
|
226
226
|
Each setting has exactly one writer, and the plan says which file it changes:
|
|
227
227
|
|
|
228
|
-
- **The agents' models** live in `.projectstore/harness/<harness>.json`. That file is committed, so a change there is a team change.
|
|
228
|
+
- **The agents' models and efforts** live in `.projectstore/harness/<harness>.json`. That file is committed, so a change there is a team change.
|
|
229
229
|
- **The status line, the band, the language and the other binding keys** live in `.projectstore/projectstore.json`, which stays on this machine.
|
|
230
230
|
- **The spec policy and the lifecycle gates** live in the vault's `.projectstore.json`, which commits with the vault. Setting `spec_policy=required` records when it took effect; stories closed before then are exempt.
|
|
231
231
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: clerk
|
|
3
|
-
description: Sonnet (
|
|
3
|
+
description: Sonnet (low-effort) write ceremony executor for projectstore vaults β the roster's sole write-capable agent, and its least autonomous. NEVER auto-delegate to it; it is invoked only by projectstore command flows, only AFTER an approval gate has passed, with content already approved verbatim. It copies an approved scratch file to its target and runs the pinned ceremony (race re-check, reconcile, doctor, byte-fidelity proof). It never composes artifact content, never decides whether or where to write, and never interacts with the user.
|
|
4
4
|
model: sonnet
|
|
5
|
-
effort:
|
|
5
|
+
effort: low
|
|
6
6
|
tools: Read, Grep, Glob, Bash, Write
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Manage bundled-agent integration in this project β register/unregister the routing block in CLAUDE.md/AGENTS.md, inspect state, or configure which model its agents
|
|
2
|
+
description: Manage bundled-agent integration in this project β register/unregister the routing block in CLAUDE.md/AGENTS.md, inspect state, or configure which model each of its agents runs on and at what effort.
|
|
3
3
|
argument-hint: "<register | unregister | status | configure>"
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -12,7 +12,10 @@ subcommand (`.projectstore/projectstore.json`; else point to `/projectstore:bind
|
|
|
12
12
|
1. **Ask** via AskUserQuestion: "Register projectstore's agents in
|
|
13
13
|
CLAUDE.md/AGENTS.md so every session routes to them (critic after
|
|
14
14
|
authoring artifacts, planner before implementing, reviewer before commit)?
|
|
15
|
-
[Yes / No]". On No, stop.
|
|
15
|
+
[Yes / No]". On No, stop. When the block is already there marked newer
|
|
16
|
+
than this copy's template (doctor's info, or `status` showing
|
|
17
|
+
`ours-newer`), name both numbers in the question: registering writes this
|
|
18
|
+
copy's older block over the one marked vN.
|
|
16
19
|
2. **Run the verb** and print its output verbatim:
|
|
17
20
|
```bash
|
|
18
21
|
node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" install --harness claude-code --surface agents_block --project "${CLAUDE_PROJECT_DIR}"
|
|
@@ -53,21 +56,21 @@ subcommand (`.projectstore/projectstore.json`; else point to `/projectstore:bind
|
|
|
53
56
|
|
|
54
57
|
Run `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" plan --json --surface agents_block --project "${CLAUDE_PROJECT_DIR}"`
|
|
55
58
|
and report each item's `state` from `result.items[]` β the bin wraps the plan in its envelope (`ours-current`, `ours-stale` with its reason,
|
|
56
|
-
`ours-absent`, or a refusal). Then:
|
|
59
|
+
`ours-newer` β marked above this copy's template: install, upgrade and setup leave it, and a named run such as `register` writes this copy's over it β `ours-absent`, or a refusal). Then:
|
|
57
60
|
|
|
58
61
|
- Block: present in which file, marker version vs the installed template, agent
|
|
59
62
|
names vs the layout roster.
|
|
60
63
|
- Model: run `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents show --json --project "${CLAUDE_PROJECT_DIR}"`
|
|
61
64
|
and report `result.resolved` β per roster agent, the model the verb would
|
|
62
65
|
pass and its `source` (`per_agent`, `default`, or `null`: the agent's own
|
|
63
|
-
frontmatter), resolved by the verb over the active harness's overlay
|
|
66
|
+
frontmatter), and the effort with its `effort_source` the same way, resolved by the verb over the active harness's overlay
|
|
64
67
|
(`result.path`) so nothing here re-derives it; `result.unknown` (configured
|
|
65
68
|
names no roster agent carries β nothing runs under them), `result.rejected`
|
|
66
69
|
(keys the overlay may not carry) and `result.agents_in_binding` (a pre-0.28
|
|
67
70
|
leftover; point at `upgrade`), and
|
|
68
71
|
whether `CLAUDE_CODE_SUBAGENT_MODEL` is set (it overrides everything) and
|
|
69
|
-
whether `CLAUDE_CODE_EFFORT_LEVEL` is set (
|
|
70
|
-
|
|
72
|
+
whether `CLAUDE_CODE_EFFORT_LEVEL` is set (it outranks every configured effort
|
|
73
|
+
and the frontmatter: with it set, the spawn offers no effort parameter). **Warn when
|
|
71
74
|
`result.resolved.clerk.model` is anything but `sonnet` or `haiku`** (that
|
|
72
75
|
literal pair is the rule, so it is never re-derived; an unknown custom id also
|
|
73
76
|
warns, with "verify it is cheap"): the clerk transcribes approved
|
|
@@ -79,7 +82,7 @@ and report each item's `state` from `result.items[]` β the bin wraps the plan
|
|
|
79
82
|
and point at `configure` to clean them up β do not present them as the active
|
|
80
83
|
configuration, because they are not.
|
|
81
84
|
|
|
82
|
-
## `configure` β model per invocation, recorded in config (ADR-008)
|
|
85
|
+
## `configure` β model and effort per invocation, recorded in config (ADR-008; the effort ADR)
|
|
83
86
|
|
|
84
87
|
> **Why there are no override copies here.** ADR-003 wrote
|
|
85
88
|
> `<project>/.claude/agents/<name>.md` believing an equal `name:` shadows the
|
|
@@ -97,14 +100,15 @@ and report each item's `state` from `result.items[]` β the bin wraps the plan
|
|
|
97
100
|
effort. The one exception is the clerk, which only transcribes approved
|
|
98
101
|
content β it stays cheap regardless of the preset."* Options: keep bundled default (`opus`) / `fable` / `sonnet` /
|
|
99
102
|
custom model ID (free-form). Offer the current session's model as a hint
|
|
100
|
-
option β you know what you are running on.
|
|
101
|
-
|
|
103
|
+
option β you know what you are running on. Then ask the effort for the
|
|
104
|
+
preset β `low` / `medium` / `high` / `xhigh` / `max`, or "leave it to the
|
|
105
|
+
frontmatter" (`max`) β see step 5. **`inherit` is no longer offered**: it meant "follow the session's
|
|
102
106
|
model", and that cannot be expressed per invocation β passing nothing falls
|
|
103
107
|
through to the bundled `model: opus`, not to the session. A user who wants
|
|
104
108
|
session-follow behaviour should pick their session's model explicitly, or set
|
|
105
109
|
`CLAUDE_CODE_SUBAGENT_MODEL=inherit`, which does mean exactly that.
|
|
106
|
-
2. **Optional follow-up**: "configure individually?" β per-agent model
|
|
107
|
-
roster agent. Skippable.
|
|
110
|
+
2. **Optional follow-up**: "configure individually?" β per-agent model and
|
|
111
|
+
effort for each roster agent. Skippable.
|
|
108
112
|
3. **Apply**: after the AskUserQuestion, run the verb and print its output β
|
|
109
113
|
`node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents configure --harness claude-code --default <model> [--agent <name>=<model> β¦] --project "${CLAUDE_PROJECT_DIR}"`
|
|
110
114
|
(naming the harness is the confirmation; the verb writes
|
|
@@ -120,24 +124,31 @@ and report each item's `state` from `result.items[]` β the bin wraps the plan
|
|
|
120
124
|
the emptied block. A name outside the layout's roster is a usage error
|
|
121
125
|
naming the roster β a model written under a name no agent carries would
|
|
122
126
|
never run. That file is the whole output of this command β **never write
|
|
123
|
-
an agent copy into `.claude/agents/`**.
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
127
|
+
an agent copy into `.claude/agents/`**. `agents configure` keeps every
|
|
128
|
+
effort the overlay holds; `--reset` drops them with the models.
|
|
129
|
+
**Efforts** chosen in steps 1β2 are written by `configure`, the one verb
|
|
130
|
+
with effort keys β preview first, then apply after the same approval:
|
|
131
|
+
`node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" configure --set agents.default.effort=<level> [--set agents.<name>.effort=<level> β¦] --harness claude-code --dry-run --project "${CLAUDE_PROJECT_DIR}"`,
|
|
132
|
+
then the same command without `--dry-run`. `-` as the level clears one. A
|
|
133
|
+
default effort with no clerk effort named pins the clerk's effort to `low`
|
|
134
|
+
and says so, as a default model pins its model: the clerk transcribes.
|
|
128
135
|
4. **Migrate away from copies**: if `.claude/agents/` holds copies carrying
|
|
129
136
|
`# source: projectstore vβ¦`, they are pre-ADR-008 leftovers that override
|
|
130
137
|
nothing. Offer to delete them **one approval per file** (matching `/projectstore:doctor --fix`), project scope only β a copy in `~/.claude/agents/` needs a manual removal, and you should say so rather than implying this command will handle it.
|
|
131
138
|
Copies WITHOUT the provenance marker are user-authored β never touch them,
|
|
132
139
|
never mention deleting them.
|
|
133
|
-
5. **Effort
|
|
134
|
-
`effort
|
|
135
|
-
|
|
136
|
-
`
|
|
137
|
-
|
|
140
|
+
5. **Effort rides the spawn, like the model.** The overlay's
|
|
141
|
+
`agents.per_agent.<name>.effort ?? agents.default.effort` is passed as the
|
|
142
|
+
spawn's effort parameter; with none, the bundled agents run at their
|
|
143
|
+
frontmatter's `effort: max`, and the clerk at its `effort: low`. A level outside `low`, `medium`, `high`,
|
|
144
|
+
`xhigh`, `max` is written with a warning and refused by the spawn. Do not
|
|
145
|
+
write a copy to achieve an effort.
|
|
138
146
|
6. **Honesty notes to print**: an org `availableModels` allowlist silently
|
|
139
147
|
downgrades excluded models; the `CLAUDE_CODE_SUBAGENT_MODEL` env var
|
|
140
|
-
overrides everything configured here, per-invocation parameter included
|
|
148
|
+
overrides everything configured here, per-invocation parameter included;
|
|
149
|
+
`CLAUDE_CODE_EFFORT_LEVEL` overrides every configured effort, and a
|
|
150
|
+
`maxEffortLevel` setting or an organization's effort cap still limits the
|
|
151
|
+
level an agent runs at.
|
|
141
152
|
`/projectstore:doctor` validates config shape and reports leftover copies β
|
|
142
153
|
not entitlement, and not whether a given spawn actually passed the model.
|
|
143
154
|
7. **No restart is needed** β nothing about the agent list changed. The model
|
|
@@ -154,16 +165,17 @@ node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents model <name> --json --p
|
|
|
154
165
|
```
|
|
155
166
|
|
|
156
167
|
and passes `result.model` as the spawn's model parameter β `null` means pass
|
|
157
|
-
nothing, the agent's own frontmatter decides.
|
|
158
|
-
|
|
168
|
+
nothing, the agent's own frontmatter decides β and `result.effort` as its
|
|
169
|
+
effort parameter when it is not `null` and the spawn offers one. The verb applies
|
|
170
|
+
`agents.per_agent.<name>.model ?? agents.default.model ?? null` (and the same
|
|
171
|
+
two terms for `effort`) over
|
|
159
172
|
`<project>/.projectstore/harness/<harness>.json` (the active harness's
|
|
160
173
|
overlay); besides the agents block itself (harness-neutral prose with no bin
|
|
161
174
|
to call β it states the rule as a file read, deliberately), nothing else
|
|
162
175
|
restates that rule. Never guess a model.
|
|
163
176
|
|
|
164
177
|
`agents.default` is optional and often absent (a per-agent-only config is normal);
|
|
165
|
-
the resolution must tolerate that
|
|
166
|
-
leftover: ignore it.
|
|
178
|
+
the resolution must tolerate that, and so must an effort set without a model.
|
|
167
179
|
|
|
168
180
|
**Coverage, stated honestly.** This reaches spawns made by this plugin's commands
|
|
169
181
|
and spawns a session makes while following the registration block. It does *not*
|
|
@@ -174,7 +186,10 @@ path, at the cost of applying to every subagent on the machine.
|
|
|
174
186
|
|
|
175
187
|
## Notes
|
|
176
188
|
|
|
177
|
-
-
|
|
189
|
+
- `/plugin uninstall` removes these commands but NOT the block β run
|
|
178
190
|
`unregister` first, or delete everything between the
|
|
179
|
-
`<!-- projectstore:agents -->` markers by hand.
|
|
191
|
+
`<!-- projectstore:agents -->` markers by hand. From a terminal in the
|
|
192
|
+
project, the package's bare `uninstall` removes the block too. A one-harness
|
|
193
|
+
`--harness` run keeps a block in `AGENTS.md` that another harness still
|
|
194
|
+
reads; `uninstall --surface agents_block` removes it outright.
|
|
180
195
|
- Never write any file without AskUserQuestion approval.
|
|
@@ -111,7 +111,7 @@ Steps:
|
|
|
111
111
|
|
|
112
112
|
8. **Agent registration** (v0.13, ADR-002): ask via AskUserQuestion β "Register projectstore's agents in CLAUDE.md/AGENTS.md so every session routes to them (critic after authoring artifacts, planner before implementing, reviewer before commit)? [Yes (Recommended) / No]". On Yes, run `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" install --harness claude-code --surface agents_block --project "${CLAUDE_PROJECT_DIR}"` and print its output (it renders from the layout's roster, migrates rather than duplicates, previews every write, and applies because the harness is named). On a rebind where a block already exists the verb reports it current or replaces it in place β do not re-ask blindly.
|
|
113
113
|
|
|
114
|
-
9. **Agent model preset** (v0.13, ADR-003; mechanism per ADR-008): ask via AskUserQuestion β include this line in the question text: *"These agents don't write code β they are critics, planners, and reviewers; they perform best on strong models at high effort."* Options: **Keep bundled default β opus** (Recommended) / **fable** / **sonnet**. Do not offer `inherit` β it cannot be expressed per invocation (see `commands/agents.md`). Do not
|
|
114
|
+
9. **Agent model preset** (v0.13, ADR-003; mechanism per ADR-008): ask via AskUserQuestion β include this line in the question text: *"These agents don't write code β they are critics, planners, and reviewers; they perform best on strong models at high effort."* Options: **Keep bundled default β opus** (Recommended) / **fable** / **sonnet**. Do not offer `inherit` β it cannot be expressed per invocation (see `commands/agents.md`). Do not ask effort here β until one is set, the bundled agents run at their frontmatter's `max`, and the clerk at `low`. Free-form model IDs, per-agent tuning and each agent's effort live in `/projectstore:agents configure` β mention it. A non-default choice runs the `configure` apply flow from `commands/agents.md`, which writes the config only β **never an agent copy**. Skippable.
|
|
115
115
|
|
|
116
116
|
10. **Print summary**: confirm the bind, list the layout's folders, suggest next commands (`/projectstore:status`, `/projectstore:adr "<first decision>"`, `/projectstore:epic <ID> "<title>"`).
|
|
117
117
|
|
|
@@ -42,6 +42,10 @@ You are running projectstore diagnostics (ADR-005: umbrella doctor).
|
|
|
42
42
|
the verb adds the import. For another harness the finding names its own
|
|
43
43
|
`--harness`; relay that command. Never Edit or Write the block yourself β
|
|
44
44
|
the verb is its only writer (install spec, contract 6).
|
|
45
|
+
- `agents-block` **info** that the block is "marked vN, newer than this
|
|
46
|
+
copy's vM" β **report only.** Install, upgrade and setup leave such a block as it is (install spec, contract 6 as amended
|
|
47
|
+
2026-10-14). Relay the finding and its command verbatim; run it only if
|
|
48
|
+
the user asks, because it writes this copy's older block over the one marked vN.
|
|
45
49
|
- `statusline` issues β offer running `/projectstore:statusline on|off`,
|
|
46
50
|
which installs or removes the entry and the launcher behind a preview
|
|
47
51
|
(the SessionStart hook only refreshes an entry that already exists), and
|
|
@@ -106,13 +110,21 @@ You are running projectstore diagnostics (ADR-005: umbrella doctor).
|
|
|
106
110
|
verbatim, run from a terminal outside this session.
|
|
107
111
|
- `overlay-forbidden-key` / `overlay-unparseable` (issue) β
|
|
108
112
|
`.projectstore/harness/<id>.json` carries a key an overlay may not (only
|
|
109
|
-
`agents.default.model
|
|
113
|
+
`agents.default.model`, `agents.default.effort`,
|
|
114
|
+
`agents.per_agent.<name>.model` and `agents.per_agent.<name>.effort` are
|
|
115
|
+
read) or is
|
|
110
116
|
not JSON. Print the finding. A key inside the agents block goes away on the
|
|
111
117
|
next `/projectstore:agents configure` write; a key outside it, and a parse
|
|
112
118
|
error, are the user's to edit β never rewrite the file yourself.
|
|
113
119
|
- `overlay-unknown-agent` (warn) β the overlay configures a name no roster
|
|
114
120
|
agent carries (a typo, or a newer package's agent): nothing runs under it.
|
|
115
|
-
Point at `/projectstore:agents configure` with the roster's names
|
|
121
|
+
Point at `/projectstore:agents configure` with the roster's names; a name
|
|
122
|
+
outside the roster is refused by both writers, so removing one is
|
|
123
|
+
`agents configure --reset` or the user's own edit of the file.
|
|
124
|
+
- `overlay-unknown-effort` (warn) β the overlay sets an effort the harness's
|
|
125
|
+
levels lack (a typo, or a leftover such as `Max`): a spawn may refuse it.
|
|
126
|
+
Point at `/projectstore:agents configure`, which writes efforts through
|
|
127
|
+
`configure --set agents.<name>.effort=<level>`; `-` clears one.
|
|
116
128
|
- `plugin-registration` (info) β nothing to repair; it names where the npm
|
|
117
129
|
registration loads from. As an **issue** β stale, or two enabled copies β
|
|
118
130
|
print the finding and relay its command verbatim (the package runner's
|
|
@@ -128,7 +140,11 @@ You are running projectstore diagnostics (ADR-005: umbrella doctor).
|
|
|
128
140
|
- `harness` (info) β nothing to repair; it names what `install` can target.
|
|
129
141
|
- `mcp` β the plugin-bundled `.mcp.json` is missing or does not launch
|
|
130
142
|
`bin/projectstore.mjs mcp`: the install is incomplete β the fix is the
|
|
131
|
-
|
|
143
|
+
update for the channel this copy was installed through (`/plugin update`
|
|
144
|
+
for a git-marketplace copy; for the npm registration, the package's
|
|
145
|
+
`upgrade` from a terminal in the project, outside this session β the
|
|
146
|
+
`plugin-registration` finding spells the command), never a hand-written
|
|
147
|
+
file.
|
|
132
148
|
- `override-copies` β a copy carrying the provenance marker overrides nothing
|
|
133
149
|
(ADR-008): offer to **delete** it (approval-gated, one prompt per file), and
|
|
134
150
|
say that `/projectstore:agents configure` now records the model in
|
|
@@ -38,8 +38,8 @@ You are reconciling the vault's derived views with their source of truth (frontm
|
|
|
38
38
|
content is authored by the context-holder, the write ceremony by a clerk").
|
|
39
39
|
When the approved set contains two or more targets, hand steps 6-7 to
|
|
40
40
|
`projectstore:clerk`: pass the exact selector list from step 4's preview and
|
|
41
|
-
the expectation that doctor ends clean. **Model (ADR-008)**: resolve
|
|
42
|
-
|
|
41
|
+
the expectation that doctor ends clean. **Model and effort (ADR-008)**: resolve
|
|
42
|
+
them with `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents model clerk --json --project "${CLAUDE_PROJECT_DIR}"` and pass `result.model` as the spawn's model parameter (`null` β pass nothing), and `result.effort` as its effort parameter when it is not `null` and the spawn offers one;
|
|
43
43
|
missing key, `inherit`, or unreadable config β pass nothing and let the
|
|
44
44
|
agent's own frontmatter decide; never guess a model. The clerk applies
|
|
45
45
|
through the core exactly as step 6 specifies and reports per target. A single
|
|
@@ -64,7 +64,7 @@ You are running a peer review on a projectstore artifact.
|
|
|
64
64
|
|
|
65
65
|
Set the agent description to: `Peer-review of {{kind}} artifact at {{path}}`. Pass it as a foreground task (you need the result to continue).
|
|
66
66
|
|
|
67
|
-
**Model (ADR-008)**: resolve
|
|
67
|
+
**Model and effort (ADR-008)**: resolve them with `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents model critic --json --project "${CLAUDE_PROJECT_DIR}"` and pass `result.model` as the spawn's model parameter (`null` β pass nothing), and `result.effort` as its effort parameter when it is not `null` and the spawn offers one. Missing key, `inherit`, or unreadable config β pass nothing and let the agent's own frontmatter decide; never guess a model. This is the only way the configured model and effort reach the agent β there are no override copies (`/projectstore:agents configure`). When falling back to `oh-my-claudecode:critic` or `general-purpose`, pass the same model and effort.
|
|
68
68
|
|
|
69
69
|
7. **Show findings**: print the agent's report verbatim. Number is its number.
|
|
70
70
|
|
|
@@ -80,7 +80,8 @@ the two cannot collide).
|
|
|
80
80
|
files with different jobs: the scratch is what gets copied to the target;
|
|
81
81
|
the baseline is what `--check` compares against. Handing `--check` the
|
|
82
82
|
scratch makes it report drift on every run.
|
|
83
|
-
- **Model (ADR-008)**: resolve
|
|
83
|
+
- **Model and effort (ADR-008)**: resolve them with `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents model clerk --json --project "${CLAUDE_PROJECT_DIR}"` and pass `result.model` as the spawn's model parameter (`null` β pass nothing),
|
|
84
|
+
and `result.effort` as its effort parameter when it is not `null` and the spawn offers one.
|
|
84
85
|
Missing key, `inherit`, or unreadable config β pass nothing and let the
|
|
85
86
|
agent's own frontmatter decide; never guess a model.
|
|
86
87
|
- Capture doctor's summary line (`node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" doctor
|
|
@@ -97,7 +97,7 @@ After setup, every setting is one command away, from a terminal in your project:
|
|
|
97
97
|
npx projectstore configure
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
-
At a terminal it opens a settings menu: each agent's model, the status line and the band, the template language, and the vault's spec policy and lifecycle gates. β and β move, β opens, space chooses, β goes back, and Enter shows one plan; a second Enter writes it. A model is chosen from its harness's list: Claude Code's aliases, or Codex's own models. Without a terminal it prints the settings with their values and the file each one lives in. From a script or an agent, name the change; naming it is the confirmation:
|
|
100
|
+
At a terminal it opens a settings menu: each agent's model and effort, the status line and the band, the template language, and the vault's spec policy and lifecycle gates. β and β move, β opens, space chooses, β goes back, and Enter shows one plan; a second Enter writes it. A model is chosen from its harness's list: Claude Code's aliases, or Codex's own models. Without a terminal it prints the settings with their values and the file each one lives in. From a script or an agent, name the change; naming it is the confirmation:
|
|
101
101
|
|
|
102
102
|
```
|
|
103
103
|
npx projectstore configure --set language=de --set lifecycle_gates=on
|
|
@@ -138,8 +138,9 @@ What is known, and how:
|
|
|
138
138
|
- **Roles are rendered as orchestration skills.** Codex spawns subagents through
|
|
139
139
|
its collaboration tool, not by loading a plugin's `agents/` directory. The
|
|
140
140
|
six ProjectStore roles therefore ship as namespaced skills that resolve their
|
|
141
|
-
configured model through the core and ask Codex to spawn the role
|
|
142
|
-
|
|
141
|
+
configured model and effort through the core and ask Codex to spawn the role
|
|
142
|
+
with them. With no effort configured, a role spawned on a configured model
|
|
143
|
+
runs at that model's own default level.
|
|
143
144
|
- **Multi-file edits reach the activity log and entry rule when their paths
|
|
144
145
|
are absolute.** Codex's `apply_patch` carries paths inside
|
|
145
146
|
`tool_input.command`; the shared extractor reads every `Add`, `Update`,
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
{
|
|
50
50
|
"env": "CLAUDE_CODE_EFFORT_LEVEL",
|
|
51
51
|
"kind": "effort",
|
|
52
|
-
"beats": "agent frontmatter"
|
|
52
|
+
"beats": "the spawn's effort parameter and agent frontmatter: with it set, the Agent tool offers no effort parameter at all (measured 2026-10-14, 2.1.296)"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"env": "CLAUDE_CODE_SUBAGENT_MODEL",
|
|
@@ -534,6 +534,45 @@
|
|
|
534
534
|
"cheap_model": "sonnet",
|
|
535
535
|
"cheap_model_evidence": "measured",
|
|
536
536
|
"cheap_model_reason": "The model the clerk is pinned to when a strong default would otherwise lift it (ADR-008). A literal here, in the one file allowed to name a harness's vocabulary; it used to be a literal in scripts/cli.mjs, which made `agents configure --harness codex` write an Anthropic model name into a Codex overlay. MEASURED in the sense that matters: this is the model the clerk has been running on since ADR-008, in this repository, and tests/overlay.test.mjs asserts the pin end to end.",
|
|
537
|
+
"effort": {
|
|
538
|
+
"spawn_param": "effort",
|
|
539
|
+
"spawn_param_evidence": "measured",
|
|
540
|
+
"spawn_param_reason": "The Agent tool's `effort` parameter, an enum of the five levels below, in the tool schema Claude Code 2.1.296 gave a session on 2026-10-14 (documented from 2.1.292). A plugin agent with `effort: max` in its frontmatter, spawned with `effort: \"xhigh\"`, ran every request at xhigh; spawned with none, at max (subagent transcripts). An off-enum level fails the tool's schema and no subagent starts. So the overlay's effort is passed here, as the model is (the ADR \"Agent effort is passed at spawn beside the model, from the overlay, in each harness's own levels\", decision 2).",
|
|
541
|
+
"levels": [
|
|
542
|
+
{
|
|
543
|
+
"id": "low",
|
|
544
|
+
"description": "The fastest and cheapest: little thinking before an answer."
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
"id": "medium",
|
|
548
|
+
"description": "Balances speed and depth: thinks where the task needs it."
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
"id": "high",
|
|
552
|
+
"description": "Thinks longer before answering, for harder work."
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
"id": "xhigh",
|
|
556
|
+
"description": "Extended thinking for hard reviews, plans and designs."
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
"id": "max",
|
|
560
|
+
"description": "The most thinking Claude Code allows: the level the bundled agents' frontmatter names, the clerk's excepted."
|
|
561
|
+
}
|
|
562
|
+
],
|
|
563
|
+
"levels_reason": "The Agent tool's enum, measured. Claude Code lowers a level a model does not support to the highest one it does (documented), so one list serves every alias and no catalog is read.",
|
|
564
|
+
"strict": true,
|
|
565
|
+
"strict_reason": "The spawn takes these levels and nothing else: an off-enum level (ultra) failed the Agent tool's schema and no subagent started (measured 2026-10-14, 2.1.296). So a level off this list is written with a note that the spawn refuses it.",
|
|
566
|
+
"unset": {
|
|
567
|
+
"value": "frontmatter",
|
|
568
|
+
"row": "use frontmatter",
|
|
569
|
+
"model_default": false,
|
|
570
|
+
"reason": "With no effort passed, the agent runs at its frontmatter's effort β max for every bundled agent but the clerk, which runs at low β whatever model is passed (transcripts of 2026-10-11/12)."
|
|
571
|
+
},
|
|
572
|
+
"cheap": "low",
|
|
573
|
+
"cheap_evidence": "chosen",
|
|
574
|
+
"cheap_reason": "The clerk's level, in its frontmatter and as its pin under a default effort (the effort ADR, decision 6): it copies an approved file and runs a pinned ceremony. Chosen by the maintainer on 2026-10-14 (\"ΠΊΠ»Π΅ΡΠΊΠ° Π΄Π° Π½Π° Π»ΠΎΡ\"), as on Codex."
|
|
575
|
+
},
|
|
537
576
|
"models": {
|
|
538
577
|
"spawn_takes": "alias",
|
|
539
578
|
"spawn_takes_evidence": "measured",
|
|
@@ -339,25 +339,61 @@
|
|
|
339
339
|
"update_instructions": "From a terminal in the project, run `npx projectstore@<version> upgrade --harness codex` and restart Codex afterwards, so the new skills and hooks are loaded. The run fetches the shell at that version, atomically replaces its stable source, and `codex plugin add projectstore@projectstore-npx` materialises the new version; this was measured across two dev builds on codex-cli 0.153.4.",
|
|
340
340
|
"agent_translation": {
|
|
341
341
|
"carries_model": false,
|
|
342
|
-
"carries_model_reason": "The surface projectstore ships β a plugin's agents/ entry β carries no model on Codex: surfaces.agents is supported:false because no route from a plugin's agents/ directory to collaborationspawn_agent has been found (measured). Codex DOES have a definition file that carries model and effort, recorded below, but it is project- or user-scoped and not plugin-shippable, so contract 12 holds as written: what we ship cannot carry a model. Was true here until 2026-09-08, which contradicted both contract 12 and this file's own agents row.",
|
|
342
|
+
"carries_model_reason": "The surface projectstore ships β a plugin's agents/ entry β carries no model on Codex: surfaces.agents is supported:false because no route from a plugin's agents/ directory to collaborationspawn_agent has been found (measured). Codex DOES have a definition file that carries model and effort, recorded below, but it is project- or user-scoped and not plugin-shippable, so contract 12 holds as written: what we ship cannot carry a model. Was true here until 2026-09-08, which contradicted both contract 12 and this file's own agents row. What the plugin's role skills pass instead is a value at spawn: `spawn_agent` takes `model` and `reasoning_effort` (measured 2026-10-14, effort block below).",
|
|
343
343
|
"definition_file": ".codex/agents/<name>.toml",
|
|
344
344
|
"definition_file_evidence": "documented",
|
|
345
|
-
"definition_file_reason": "Codex agent definitions are TOML under .codex/agents/ (project) or ~/.codex/agents/ (personal) and accept `model`, `model_reasoning_effort`, `sandbox_mode` and `mcp_servers`. Documented at learn.chatgpt.com/docs/agent-configuration/subagents, read 2026-09-08; NOT measured, and not reachable from a plugin
|
|
345
|
+
"definition_file_reason": "Codex agent definitions are TOML under .codex/agents/ (project) or ~/.codex/agents/ (personal) and accept `model`, `model_reasoning_effort`, `sandbox_mode` and `mcp_servers`. Documented at learn.chatgpt.com/docs/agent-configuration/subagents, read 2026-09-08; NOT measured, and not reachable from a plugin. Not used: the spawn carries model and effort, so no definition is rendered (the ADR \"Agent effort is passed at spawn beside the model, from the overlay, in each harness's own levels\", alternative A).",
|
|
346
346
|
"cheap_model": "gpt-5.6-luna",
|
|
347
347
|
"cheap_model_evidence": "chosen",
|
|
348
348
|
"cheap_model_reason": "CHOSEN, not measured: the verified plugin session exercised the rendered skill surface, not this optional model pin. It reaches a user's overlay β `agents configure --harness codex` writes it as the clerk's pin β so if the id is wrong the failure is at spawn time, on the harness, not here. The transcriber's model. gpt-5.6-luna at $0.20/$1.20 per Mtok is the cost tier gpt-5.6-sol ($4/$20) is twenty times above, and the clerk composes nothing: it copies an approved file and runs a pinned ceremony (ADR-008). Chosen 2026-09-08 from the published model list, by the same reasoning that pins the clerk to the cheap tier on Claude Code.",
|
|
349
|
-
"
|
|
350
|
-
"
|
|
351
|
-
"
|
|
352
|
-
"
|
|
353
|
-
"
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
349
|
+
"effort": {
|
|
350
|
+
"spawn_param": "reasoning_effort",
|
|
351
|
+
"spawn_param_evidence": "measured",
|
|
352
|
+
"spawn_param_reason": "`collaboration.spawn_agent` takes `reasoning_effort` beside `model`. Measured on codex-cli 0.162.1, 2026-10-14: a parent on gpt-5.6-sol at xhigh spawned gpt-5.6-luna at low, and the child's first turn_context reads gpt-5.6-luna, low. An effort with no model ran the parent's model at that effort.",
|
|
353
|
+
"levels": [
|
|
354
|
+
{
|
|
355
|
+
"id": "low",
|
|
356
|
+
"description": "Fast responses with lighter reasoning."
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"id": "medium",
|
|
360
|
+
"description": "Balances speed and reasoning depth for everyday tasks."
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
"id": "high",
|
|
364
|
+
"description": "Greater reasoning depth for complex problems."
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
"id": "xhigh",
|
|
368
|
+
"description": "Extra high reasoning depth for complex problems."
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
"id": "max",
|
|
372
|
+
"description": "Maximum reasoning depth for the hardest problems."
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
"id": "ultra",
|
|
376
|
+
"description": "Maximum reasoning with automatic task delegation; not every model takes it."
|
|
377
|
+
}
|
|
378
|
+
],
|
|
379
|
+
"levels_reason": "The floor, offered when the agent's model is not in a list that names its own levels: every level Codex's catalog listed on 2026-10-14, in its own words. Not every model takes every level (gpt-5.6-luna stops at max), which is why a listed model's own levels win.",
|
|
380
|
+
"catalog": {
|
|
381
|
+
"list": "supported_reasoning_levels",
|
|
382
|
+
"id": "effort",
|
|
383
|
+
"description": "description",
|
|
384
|
+
"default": "default_reasoning_level",
|
|
385
|
+
"reason": "Fields of a model entry in Codex's own catalog (models_cache.json, `codex debug models`), measured 2026-10-14 on codex-cli 0.162.1: each model lists the levels it takes as { effort, description } and names its default."
|
|
386
|
+
},
|
|
387
|
+
"unset": {
|
|
388
|
+
"value": "Codex decides",
|
|
389
|
+
"row": "let Codex decide",
|
|
390
|
+
"model_default": true,
|
|
391
|
+
"reason": "With no effort passed and a model passed, the child runs at that model's own default level, not the parent's: gpt-5.6-sol ran at low under an xhigh parent (measured 2026-10-14; Codex's subagents documentation says the same). With no model passed either, Codex's [agents] default, then the parent's effort (documented)."
|
|
392
|
+
},
|
|
393
|
+
"cheap": "low",
|
|
394
|
+
"cheap_evidence": "chosen",
|
|
395
|
+
"cheap_reason": "The clerk's level under a default effort (the ADR \"Agent effort is passed at spawn beside the model, from the overlay, in each harness's own levels\", decision 6): it copies an approved file and runs a pinned ceremony. Chosen by the maintainer on 2026-09-08 with its model: gpt-5.6-luna at the lowest level."
|
|
396
|
+
},
|
|
361
397
|
"models": {
|
|
362
398
|
"spawn_takes": "id",
|
|
363
399
|
"spawn_takes_evidence": "documented",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "projectstore",
|
|
3
|
-
"version": "0.30.
|
|
3
|
+
"version": "0.30.4",
|
|
4
4
|
"description": "Your agent runs the project through a verified loop: task β artifact (ADR / spec / epic / story) β adversarial critic β backlog β planner β reviewer β done. Plain markdown in git β any model can pick the project up tomorrow.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"project-management",
|