projectstore-claude 0.30.5 โ†’ 0.30.7

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.
Files changed (45) hide show
  1. package/node_modules/projectstore/.claude-plugin/marketplace.json +2 -2
  2. package/node_modules/projectstore/.claude-plugin/plugin.json +6 -2
  3. package/node_modules/projectstore/.mcp.json +1 -2
  4. package/node_modules/projectstore/README.md +65 -17
  5. package/node_modules/projectstore/agents/archaeologist.md +1 -1
  6. package/node_modules/projectstore/agents/librarian.md +1 -1
  7. package/node_modules/projectstore/agents/planner.md +1 -1
  8. package/node_modules/projectstore/commands/doctor.md +14 -11
  9. package/node_modules/projectstore/commands/reconcile.md +1 -1
  10. package/node_modules/projectstore/commands/review.md +2 -2
  11. package/node_modules/projectstore/commands/story.md +1 -1
  12. package/node_modules/projectstore/docs/getting-started.md +3 -4
  13. package/node_modules/projectstore/docs/harnesses.md +1 -1
  14. package/node_modules/projectstore/docs/images/icon.png +0 -0
  15. package/node_modules/projectstore/harnesses/claude-code.json +60 -33
  16. package/node_modules/projectstore/hooks/hooks.json +6 -6
  17. package/node_modules/projectstore/hooks/session-start.mjs +55 -24
  18. package/node_modules/projectstore/package.json +11 -12
  19. package/node_modules/projectstore/scripts/binding.mjs +1 -1
  20. package/node_modules/projectstore/scripts/build-adapters.mjs +45 -4
  21. package/node_modules/projectstore/scripts/cli.mjs +74 -1373
  22. package/node_modules/projectstore/scripts/configure-menu.mjs +9 -7
  23. package/node_modules/projectstore/scripts/configure.mjs +0 -1
  24. package/node_modules/projectstore/scripts/convergence.mjs +59 -16
  25. package/node_modules/projectstore/scripts/doctor.mjs +184 -32
  26. package/node_modules/projectstore/scripts/harness.mjs +34 -3
  27. package/node_modules/projectstore/scripts/install-handlers.mjs +925 -0
  28. package/node_modules/projectstore/scripts/install-harness.mjs +129 -2081
  29. package/node_modules/projectstore/scripts/install-layout.mjs +453 -0
  30. package/node_modules/projectstore/scripts/install-preview.mjs +747 -0
  31. package/node_modules/projectstore/scripts/lib.mjs +167 -68
  32. package/node_modules/projectstore/scripts/mcp-server.mjs +33 -0
  33. package/node_modules/projectstore/scripts/mcp.mjs +60 -60
  34. package/node_modules/projectstore/scripts/model-spec.mjs +25 -0
  35. package/node_modules/projectstore/scripts/models.mjs +26 -120
  36. package/node_modules/projectstore/scripts/query.mjs +7 -6
  37. package/node_modules/projectstore/scripts/read-verbs.mjs +277 -0
  38. package/node_modules/projectstore/scripts/setup.mjs +62 -12
  39. package/node_modules/projectstore/scripts/statusline-launcher.mjs +36 -3
  40. package/node_modules/projectstore/scripts/surfaces.mjs +18 -5
  41. package/node_modules/projectstore/scripts/verbs.mjs +1202 -0
  42. package/node_modules/projectstore/scripts/version-guard.mjs +18 -6
  43. package/package.json +3 -3
  44. package/node_modules/projectstore/docs/images/loop-light.svg +0 -94
  45. package/node_modules/projectstore/docs/images/team-light.svg +0 -79
@@ -12,14 +12,14 @@
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.5",
15
+ "version": "0.30.7",
16
16
  "author": {
17
17
  "name": "Evgenii Konev",
18
18
  "email": "ekonev@smartandpoint.com",
19
19
  "url": "https://github.com/SmartAndPoint"
20
20
  },
21
21
  "category": "productivity",
22
- "homepage": "https://github.com/SmartAndPoint/ProjectStore",
22
+ "homepage": "https://projectstore.dev",
23
23
  "tags": [
24
24
  "obsidian",
25
25
  "markdown",
@@ -1,15 +1,19 @@
1
1
  {
2
2
  "name": "projectstore",
3
3
  "displayName": "projectstore",
4
- "version": "0.30.5",
4
+ "version": "0.30.7",
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",
8
8
  "email": "ekonev@smartandpoint.com",
9
9
  "url": "https://github.com/SmartAndPoint"
10
10
  },
11
- "homepage": "https://github.com/SmartAndPoint/ProjectStore",
11
+ "homepage": "https://projectstore.dev",
12
12
  "repository": "https://github.com/SmartAndPoint/ProjectStore",
13
+ "icon": "./docs/images/icon.png",
14
+ "documentationUrl": "https://github.com/SmartAndPoint/ProjectStore#readme",
15
+ "supportUrl": "https://github.com/SmartAndPoint/ProjectStore/issues",
16
+ "privacyPolicyUrl": "https://projectstore.dev/privacy/",
13
17
  "license": "MIT",
14
18
  "types": "./hooks/band-state.d.ts",
15
19
  "keywords": [
@@ -4,8 +4,7 @@
4
4
  "type": "stdio",
5
5
  "command": "node",
6
6
  "args": [
7
- "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs",
8
- "mcp",
7
+ "${CLAUDE_PLUGIN_ROOT}/scripts/mcp-server.mjs",
9
8
  "--project",
10
9
  "${CLAUDE_PROJECT_DIR}"
11
10
  ]
@@ -33,10 +33,7 @@ Decision logs, validators, session-start orientation and independent review each
33
33
 
34
34
  The thing that makes agentic coding work โ€” the loop Claude Code's own creator keeps pointing at โ€” is *gather context, act, verify, repeat*. ProjectStore runs that loop one level up: over the project, not just the code.
35
35
 
36
- <picture>
37
- <source media="(prefers-color-scheme: dark)" srcset="docs/images/loop.svg">
38
- <img alt="The ProjectStore loop: task โ†’ artifact โ†’ critic (verify) โ†’ backlog โ†’ planner โ†’ implement โ†’ reviewer (verify) โ†’ done โ†’ views regenerate" src="docs/images/loop-light.svg">
39
- </picture>
36
+ ![The ProjectStore loop: task โ†’ artifact โ†’ critic (verify) โ†’ backlog โ†’ planner โ†’ implement โ†’ reviewer (verify) โ†’ done โ†’ views regenerate](docs/images/loop.svg)
40
37
 
41
38
  1. **You hand the agent a task.** It opens an artifact before it opens an editor: an ADR if something needs deciding, an epic and stories for the work, a spec when the "how" is non-trivial.
42
39
  2. **A fresh-context critic attacks the artifact.** Expect *revise* โ€” on this repo it has yet to pass anything on the first try, and that is the point.
@@ -197,9 +194,25 @@ npx projectstore init ~/vaults/new-project --language ru
197
194
  npx projectstore scaffold --write
198
195
  ```
199
196
 
200
- `projectstore-claude`, `projectstore-codex` and `projectstore-opencode` are release artifacts: per-harness packages that carry the core, pinned at the same version and bundled, with the harness fixed. Nobody needs to type their names. Setup fetches the Codex one, which carries the Codex plugin; the Claude Code one is published at the core's version too; the opencode one publishes after its plugin root is rendered. The other `projectstore-*` names are reserved placeholders pointing back here. One source package, one version, N tarballs. How a release builds and publishes them, and how to run a checkout's own build: [`packaging/README.md`](./packaging/README.md).
197
+ `projectstore-claude`, `projectstore-codex` and `projectstore-opencode` are release artifacts: per-harness packages that carry the core, pinned at the same version and bundled, with the harness fixed. Nobody needs to type their names. Setup fetches the Codex one, which carries the Codex plugin; the Claude Code one is published at the core's version too; the opencode one publishes after its plugin root is rendered. The other `projectstore-*` names are reserved placeholders pointing back here. One source package, one version, N tarballs. How a release builds and publishes them, and how to run a checkout's own build: [`packaging/README.md`](https://github.com/SmartAndPoint/ProjectStore/blob/main/packaging/README.md).
201
198
  </details>
202
199
 
200
+ ## Installed from Anthropic's directory
201
+
202
+ If you added ProjectStore from Anthropic's plugin directory, it is already installed: it comes through your claude.ai account, Claude Code loads it as `projectstore@synced`, and no `npx` step is needed. Bind a vault in a Claude Code session in your project:
203
+
204
+ ```
205
+ /projectstore:bind ~/Documents/my-project-vault
206
+ ```
207
+
208
+ Updates come from claude.ai: when a new version is published, Claude Code downloads it at its next start and asks you to run `/reload-plugins` in the session. The upgrade commands below are for the other ways to install, and this copy needs none of them. To turn it off or remove it:
209
+
210
+ - **Off for your account on this machine**: `/plugin` โ†’ **Installed**, then turn off `projectstore@synced`.
211
+ - **Off for one project only**: set `"projectstore@synced": false` under `enabledPlugins` in that project's `.claude/settings.local.json`, or in its committed `.claude/settings.json` to keep it out for everyone who opens the project.
212
+ - **Removed**: on claude.ai, where it was added.
213
+
214
+ What the directory itself reports about a copy installed this way: [What Anthropic's directory reports](#what-anthropics-directory-reports).
215
+
203
216
  ## Configure
204
217
 
205
218
  Setup asks only what a first install needs. Everything after it is one command, from a terminal in your project:
@@ -210,7 +223,7 @@ npx projectstore configure
210
223
 
211
224
  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
225
 
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;
226
+ - 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, kept for a day in projectstore's user cache; "refresh the list" asks Codex 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
227
  - the status line and the band above the prompt (Claude Code);
215
228
  - the vault's template language, the default author and tags;
216
229
  - the vault's spec policy and lifecycle gates.
@@ -239,7 +252,7 @@ Installed with setup or from npm: from a terminal in your project, name the vers
239
252
  npx projectstore@<version> upgrade
240
253
  ```
241
254
 
242
- It upgrades every agent the project uses โ€” each one whose own directory (`.claude/`, `.codex/`) or `.projectstore/state/<id>/` is there โ€” in one plan, and fetches the Codex plugin at the same version. `npx projectstore setup` converges a project the same way and asks its questions again. Installed from the git marketplace in a Claude Code session: `/plugin update` (or auto-update) and a restart.
255
+ It upgrades every agent the project uses โ€” each one whose own directory (`.claude/`, `.codex/`) or `.projectstore/state/<id>/` is there โ€” in one plan, and fetches the Codex plugin at the same version. `npx projectstore setup` converges a project the same way and asks its questions again. Installed from the git marketplace: in a Claude Code session, open `/plugin manage` and choose **Update now** on projectstore (or let auto-update do it), then run `/reload-plugins` to load it; from a terminal, `claude plugin update projectstore@SmartAndPoint` and a restart do the same.
243
256
 
244
257
  A bare upgrade selects agents by those directories, so on Codex name it, which upgrades Codex even in a project where no Codex session has run yet:
245
258
 
@@ -281,7 +294,7 @@ A project bound before 0.28 needs one more command. What an existing project see
281
294
  its new path and re-registers the agents block, whose template is now v4. An
282
295
  upgrade without `--no-register` on a git-marketplace install does more: it
283
296
  also registers the plugin from npm for this checkout and turns the
284
- git-marketplace copy off here, so `/plugin update` stops reaching the
297
+ git-marketplace copy off here, so that copy's updates stop reaching the
285
298
  checkout. The 0.28.0-rc.1 and rc.2 startup lines named that form, without
286
299
  `--no-register`, so on those, update first and run what the new startup line
287
300
  names. If it already happened, this turns the git-marketplace copy back on
@@ -337,8 +350,8 @@ A project bound before 0.28 needs one more command. What an existing project see
337
350
  while two bindings exist. To come forward again, delete
338
351
  `.claude/projectstore.json`, then run the command the startup line names
339
352
  once more: a 0.27.x session writes its welcome marker back under `.claude/`.
340
- - **Installed from npm?** Then `/plugin update` has nothing to fetch: the
341
- package itself refreshes the registration. The upgrade at the top of this
353
+ - **Installed from npm?** Then Claude Code's plugin update has nothing to
354
+ fetch: the package itself refreshes the registration. The upgrade at the top of this
342
355
  section, run from a terminal outside the session, rewrites the local
343
356
  marketplace and runs the host's `plugin update` for this checkout.
344
357
  `/projectstore:doctor` says when the registration is behind the package, and
@@ -350,10 +363,7 @@ Two generated views exist for exactly that moment. `graph.md` holds every artifa
350
363
 
351
364
  ## Teams: many humans, many agents
352
365
 
353
- <picture>
354
- <source media="(prefers-color-scheme: dark)" srcset="docs/images/team.svg">
355
- <img alt="Team setup: several developers, each with their own agent, bind to one vault in its own git repo; ADRs and specs are reviewed as merge requests" src="docs/images/team-light.svg">
356
- </picture>
366
+ ![Team setup: several developers, each with their own agent, bind to one vault in its own git repo; ADRs and specs are reviewed as merge requests](docs/images/team.svg)
357
367
 
358
368
  Put the vault in its own repository. Every teammate installs ProjectStore, binds to the same vault, and contributes through the same approval gates. ADRs and specs get reviewed like code โ€” as merge requests, except what's under review is the *reasoning*. A teammate without an agent reviews on GitHub or in Obsidian: it is all just markdown.
359
369
 
@@ -381,6 +391,42 @@ The deep dive โ€” real session files, measured payloads, how every mechanism wor
381
391
  4. **Layouts are opinionated.** v1 ships `engineering`; community adds `data-analytics`, `product`, `chatbot`, `library`.
382
392
  5. **One brain per project, not per person.** The vault travels with the repo. Karpathy's [LLM Wiki](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f) is its personal-research counterpart.
383
393
 
394
+ ## What ProjectStore runs, writes, sends and fetches
395
+
396
+ ProjectStore has no server, no account and no telemetry. It collects nothing about you, your project or your vault, and it reads no credential from your environment. Its own code makes two requests, the ones under "What it sends and fetches" below, and each one is made by a command you run, never by a hook. One program it runs makes a request of its own: Codex's model command, which refreshes Codex's catalog with your Codex login. This list covers everything in the package, and a [test](https://github.com/SmartAndPoint/ProjectStore/blob/main/tests/disclosure.test.mjs) fails when a shipped module that starts a program or makes a request is not accounted for here.
397
+
398
+ ### What it runs
399
+
400
+ - **Node.js.** The hooks, the MCP server, the status line and the `projectstore` command are Node.js scripts in the plugin. They start other scripts of the plugin through the same Node. When setup keeps a project on its git-marketplace copy, it runs that copy's own `bin/projectstore.mjs` to read the copy's plan and, once you confirm, to apply it.
401
+ - **git**, on this machine only. ProjectStore never commits, pushes, pulls or fetches. The SessionStart hook runs `git rev-parse` in a project that is not bound, to see whether it is a worktree of a bound checkout; no other hook starts a program. Bind, init and setup run `git rev-parse --show-toplevel` to find the repository and `git init` to give a new vault its own repository. They run `git config --get user.name` to propose the default author; the binding keeps it, and each new artifact names it as its author. Doctor runs `git check-ignore` and `git ls-files` to check what git ignores and tracks, and `git diff --name-only` and `git log` to see what has changed. The reviewer's list of the files a story touched comes from `git diff` and `git log` too. The reviewer and archaeologist agents read the project's git history (`git status` and `git diff` or `git log` among others) through the agent's own tools, as any command the agent runs.
402
+ - **The agent CLIs, `claude` and `codex`.** Setup, install, upgrade and uninstall run their plugin commands, such as `plugin marketplace add` and `plugin install` to register ProjectStore or `plugin uninstall` to remove it. Each one runs after you confirm the plan, which shows it verbatim. The model menu of `configure` also runs `codex debug models` to read Codex's model list, which Codex refreshes over the network with its own login.
403
+ - **npm**, from setup, install and upgrade only. They run `npm config get registry` to learn which registry your npm uses. When they set up Codex, they also run `npm install` with `--ignore-scripts` to fetch the `projectstore-codex` package at the running version into a folder in ProjectStore's cache, because the Codex plugin ships in that package. No install script of that package runs.
404
+ - **The band above the prompt** (Claude Code) is a module that runs inside Claude Code's own process, not in Node. It reads the binding, the session's pointer and its epic's files, and writes a heartbeat under `.projectstore/state/sessions/` while it draws; it starts no program and makes no request.
405
+ - **Your own status line.** When ProjectStore's status line is on and your project's `.claude/settings.json` or your user `settings.json` already names a status line command, ProjectStore runs that command through your shell on every render, passes it the status data Claude Code gives a status line on its standard input, and shows what it prints under its own line.
406
+
407
+ The package also ships `scripts/version-guard.mjs`, which runs `npm pack --dry-run` as the release's own check. The plugin never runs it.
408
+
409
+ ### What it writes
410
+
411
+ Opening a project that is not bound writes nothing into it: the first-run welcome is remembered in the user cache below. Every other write in a project comes from a command you run, or from the hooks and the status line once the project is bound.
412
+
413
+ - **In a bound project**: `.projectstore/`, with the binding (`projectstore.json`, machine-local and git-ignored), the agents' models (`harness/`, meant to be committed), `state/` (each session's state, the band's heartbeat, the welcome marker and the status line's launcher, machine-local) and its own `.gitignore`; the agents block between the `projectstore:agents` markers in `AGENTS.md` and `CLAUDE.md`; and `.claude/settings.local.json`, which gets the status line only when you turn it on, and this checkout's plugin registration when setup or install registers the npm copy, or turns the git-marketplace copy off here, through Claude Code's own CLI.
414
+ - **In the vault**: the artifacts, each one after you approve it; the views generated from them (the kanban, the folder indexes, the code map and the graph); `.projectstore.json`, the vault's own settings; and `.projectstore/sessions/`, one small git-ignored file per session with its id, start time, project path, host name, process id and the vault files it read or edited last, with the tool and the time. A session's file is deleted at the next session start once it has been inactive for 24 hours. A new vault also gets its own git repository.
415
+ - **In your home directory**: `~/.cache/projectstore/`, or `$XDG_CACHE_HOME/projectstore/` when that is set. It holds the newest version the npm registry named (`registry.json`, kept for 24 hours), the model lists (`models/`, kept for a day: model names, labels, descriptions and families, never a key), which agent has shown its first-run welcome in a project that is not bound (`welcomed/`, one marker per agent for the machine), and the Codex package while a run installs it (`fetch/`, removed when the run ends). Setup and install from npm also write a folder of their own, `projectstore/`, under Claude Code's home (`~/.claude`, or `$CLAUDE_CONFIG_DIR`) or Codex's (`~/.codex`, or `$CODEX_HOME`), holding the marketplace the agent installs ProjectStore from, and the agent's own CLI records the plugin in that agent's plugin registry.
416
+
417
+ ProjectStore never changes Claude Code's or Codex's permission settings.
418
+
419
+ ### What it sends and fetches
420
+
421
+ - **The npm registry**, `https://registry.npmjs.org/` or the registry your npm is set to. One `GET <registry>/projectstore` request with no credentials and a 2-second limit asks for the newest release. Setup, install and upgrade make it when they run from npm (npx or a global install) or from a git checkout. They never make it from the copy that Claude Code or Codex loads, and never in a dry run. The answer is kept for 24 hours, and `PROJECTSTORE_NO_UPDATE_CHECK=1` turns the request off.
422
+ - **The Codex package.** The `npm install` above fetches `projectstore-codex` from the registry your npm is set to, with npm's own settings, only when setup, install or upgrade sets up Codex.
423
+
424
+ ProjectStore's own code sends nothing else: the hooks, the MCP server, the band and the status line open no connection. Two programs it runs may connect on their own. When the model menu reads Codex's list, `codex debug models` refreshes Codex's catalog with your Codex login. The status line command you had before is yours, and it runs as you set it.
425
+
426
+ ### What Anthropic's directory reports
427
+
428
+ For a copy added from Anthropic's plugin directory, Claude collects usage figures, not ProjectStore, and shows them to the maintainer on the directory's **Usage** tab ([Track published plugin usage](https://claude.com/docs/connectors/building/after-publishing#track-published-plugin-usage)): installs, active accounts and retention, with installs by surface and by where they came from; the share of accounts on each version; how often each skill, command, agent, hook and MCP server is used; load errors by Claude Code version, and the MCP server's tool calls, error rate and latency; and the listing's views, install clicks and installs. The maintainer sees these as totals across accounts, computed once a day. A copy installed with npx, npm or the git marketplace is not counted.
429
+
384
430
  ## Uninstalling
385
431
 
386
432
  From a terminal in your project:
@@ -448,15 +494,17 @@ See [`docs/extending.md`](./docs/extending.md) for adding layouts, templates, an
448
494
 
449
495
  Issues and discussions: https://github.com/SmartAndPoint/ProjectStore/issues. PRs welcome โ€” adding a layout is a good first contribution (see `scaffold/layouts/engineering.json` for the format).
450
496
 
451
- The published package has no dependencies; the linter and the formatter are dev-only, pinned in `package-lock.json`. Every pull request runs the tests, ESLint and Prettier:
497
+ The published package has no dependencies. The linter and the formatter are dev-only and live in a package of their own, `tools/lint/`, pinned in its `package-lock.json`. The repository root has no lockfile, because Claude Code installs whatever a lockfile at a plugin's root names into every user's copy. Every pull request runs the tests, ESLint and Prettier:
452
498
 
453
499
  ```sh
454
500
  npm test # Node 20+, no install needed
455
- npm ci # once, for the lint tools (Node 20.19+, 22.13+ or 24+)
501
+ npm run lint:setup # once per checkout, for the lint tools (Node 20.19+, 22.13+ or 24+)
456
502
  npm run lint
457
503
  npm run format # rewrites; npm run format:check only reports
458
504
  ```
459
505
 
506
+ Editors find the config at the root; point their tool path at the pinned copies โ€” in VS Code, `"eslint.nodePath": "tools/lint/node_modules"` and `"prettier.prettierPath": "tools/lint/node_modules/prettier"`.
507
+
460
508
  One formatting-only commit is listed in `.git-blame-ignore-revs`. GitHub skips it in blame by itself; a local clone needs this once:
461
509
 
462
510
  ```sh
@@ -469,7 +517,7 @@ A branch opened before that commit rebases in two steps, so that the lint fixes
469
517
  git rebase <the commit before it>
470
518
  ```
471
519
 
472
- Then onto the formatting commit itself, where every conflict is formatting only: take your side, format the file with `npx prettier --write <file>` and `git add` it, then continue.
520
+ Then onto the formatting commit itself, where every conflict is formatting only: take your side, format the file with `npm run format` and `git add` it, then continue.
473
521
 
474
522
  ```sh
475
523
  git rebase --onto <it> <the commit before it>
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: archaeologist
3
- description: Opus (max-effort) decision archaeologist for brownfield onboarding. Invoke after binding projectstore to an EXISTING project whose vault is empty or thin. Scans the codebase + git history for decisions that were made but never written down โ€” stack choices, architectural shapes, conventions, migration inflection points โ€” and PROPOSES backfill ADRs/concepts with evidence (file:line, commits). Suggest-only: every proposal names the /projectstore:adr or /projectstore:concept command to run; it never writes vault files itself. Read-only, deduplicates against existing artifacts first.
3
+ description: "Opus (max-effort) decision archaeologist for brownfield onboarding. Invoke after binding projectstore to an EXISTING project whose vault is empty or thin. Scans the codebase + git history for decisions that were made but never written down โ€” stack choices, architectural shapes, conventions, migration inflection points โ€” and PROPOSES backfill ADRs/concepts with evidence (file:line, commits). Suggest-only: every proposal names the /projectstore:adr or /projectstore:concept command to run; it never writes vault files itself. Read-only, deduplicates against existing artifacts first."
4
4
  model: opus
5
5
  effort: max
6
6
  tools: Read, Grep, Glob, Bash
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: librarian
3
- description: Opus (max-effort) semantic vault curator for projectstore vaults. Invoke periodically, before releases, or after heavy vault growth โ€” AFTER running /projectstore:doctor (doctor catches mechanical drift; librarian catches SEMANTIC drift that no deterministic rule can). Finds duplicate or contradicting artifacts (research vs an accepted ADR), missing wiki-links between related ADRs/epics/research, misplaced or misnamed files, and archive candidates. Read-only, suggest-only, no sycophancy: it reports concrete curation proposals; every fix goes through the normal approval-gated commands.
3
+ description: "Opus (max-effort) semantic vault curator for projectstore vaults. Invoke periodically, before releases, or after heavy vault growth โ€” AFTER running /projectstore:doctor (doctor catches mechanical drift; librarian catches SEMANTIC drift that no deterministic rule can). Finds duplicate or contradicting artifacts (research vs an accepted ADR), missing wiki-links between related ADRs/epics/research, misplaced or misnamed files, and archive candidates. Read-only, suggest-only, no sycophancy: it reports concrete curation proposals; every fix goes through the normal approval-gated commands."
4
4
  model: opus
5
5
  effort: max
6
6
  tools: Read, Grep, Glob, Bash
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: planner
3
- description: Opus (max-effort) EPIC-IMPLEMENTATION planner for projectstore-bound projects โ€” a narrow, vault-aware role, NOT a general software planner. Invoke BEFORE implementing an epic/story. Reads the vault (epics and their code_refs โ€” how prior epics landed in the codebase as modules/adapters/packages) plus the code itself, and returns a placement plan consistent with that mapping: where the change belongs, what to reuse, conventions to match, pitfalls, ordered steps, and a proposed code_refs footprint. Read-only: it plans and proposes; it never writes code or vault files.
3
+ description: "Opus (max-effort) EPIC-IMPLEMENTATION planner for projectstore-bound projects โ€” a narrow, vault-aware role, NOT a general software planner. Invoke BEFORE implementing an epic/story. Reads the vault (epics and their code_refs โ€” how prior epics landed in the codebase as modules/adapters/packages) plus the code itself, and returns a placement plan consistent with that mapping: where the change belongs, what to reuse, conventions to match, pitfalls, ordered steps, and a proposed code_refs footprint. Read-only: it plans and proposes; it never writes code or vault files."
4
4
  model: opus
5
5
  effort: max
6
6
  tools: Read, Grep, Glob, Bash, WebFetch
@@ -32,7 +32,7 @@ You are running projectstore diagnostics (ADR-005: umbrella doctor).
32
32
  binding, leaves the vault shared and unchanged, carries no session state.
33
33
  Do not offer a fresh `bind <vault-path>` here โ€” binding a second vault by
34
34
  hand is exactly what this finding exists to prevent.
35
- - `vault-git` โ†’ offer `git init` (+ optional first commit) inside the vault.
35
+ - `vault-git` โ†’ offer `git init` inside the vault.
36
36
  - `gitignore` โ†’ offer appending the missing entries via Edit.
37
37
  - `agents-block` duplicate or stale โ†’ show the finding, then (after approval)
38
38
  run `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" install --harness claude-code --surface agents_block --project "${CLAUDE_PROJECT_DIR}"`
@@ -69,9 +69,10 @@ You are running projectstore diagnostics (ADR-005: umbrella doctor).
69
69
  it if it is yours, or delete it yourself to let `install` take the name.
70
70
  The verbs refuse it in code; this clause is the belt.
71
71
  - `version-drift` โ†’ report only: name both versions and where each was
72
- read; the fix is the host's update path (`/plugin update` for a git-marketplace
73
- copy; for the npm registration, the package's `upgrade` from a terminal
74
- in the project โ€” the `plugin-registration` finding spells the command),
72
+ read; the fix is the host's update path (for a git-marketplace copy,
73
+ open `/plugin manage` and choose **Update now** on projectstore; for
74
+ the npm registration, the package's `upgrade` from a terminal in the
75
+ project โ€” the `plugin-registration` finding spells the command),
75
76
  not ours.
76
77
  - `layout-legacy` (warn; the startup line carries it as an offer) โ†’ the project
77
78
  still holds the pre-0.28 layout (`.claude/projectstore.json`,
@@ -138,11 +139,13 @@ You are running projectstore diagnostics (ADR-005: umbrella doctor).
138
139
  host registry naming our marketplace elsewhere. Print the finding verbatim;
139
140
  the user moves or removes it.
140
141
  - `harness` (info) โ†’ nothing to repair; it names what `install` can target.
141
- - `mcp` โ†’ the plugin-bundled `.mcp.json` is missing or does not launch
142
- `bin/projectstore.mjs mcp`: the install is incomplete โ€” the fix is the
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
142
+ - `mcp` โ†’ the plugin-bundled `.mcp.json` is missing, does not launch
143
+ `scripts/mcp-server.mjs`, or launches it from a plugin root without the
144
+ file: the install is incomplete โ€” the fix is the
145
+ update for the channel this copy was installed through (for a
146
+ git-marketplace copy, open `/plugin manage` and choose **Update now** on
147
+ projectstore; for the npm registration, the package's `upgrade` from a
148
+ terminal in the project, outside this session โ€” the
146
149
  `plugin-registration` finding spells the command), never a hand-written
147
150
  file.
148
151
  - `override-copies` โ†’ a copy carrying the provenance marker overrides nothing
@@ -154,8 +157,8 @@ You are running projectstore diagnostics (ADR-005: umbrella doctor).
154
157
  - `auto-update` off โ†’ offer adding `extraKnownMarketplaces.<marketplace>.autoUpdate: true`
155
158
  to `~/.claude/settings.json` (Edit with diff preview + approval โ€” this is the
156
159
  user's global settings file), or point at `/plugin` โ†’ Marketplaces โ†’ toggle.
157
- For "newer version available" โ†’ tell the user to run
158
- `/plugin marketplace update <marketplace>` and `/reload-plugins` themselves.
160
+ For "newer version available" โ†’ tell the user to open `/plugin manage` and
161
+ choose **Update now** on projectstore, then run `/reload-plugins` themselves.
159
162
 
160
163
  **Boundary (ADR-005)**: `--fix` never repairs vault-side findings. For those,
161
164
  point at `/projectstore:kanban` (board regen) and `/projectstore:reconcile`
@@ -39,7 +39,7 @@ You are reconciling the vault's derived views with their source of truth (frontm
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
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;
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, verbatim โ€” never substitute the model you are running on (`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
@@ -23,7 +23,7 @@ You are running a peer review on a projectstore artifact.
23
23
 
24
24
  5. **Gather domain context**: read the vault's top-level `README.md` and the folder README of the artifact's parent (e.g. `adr/README.md`). Keep both short โ€” they're context for the critic, not the focus.
25
25
 
26
- 6. **Spawn the critic agent**. Prefer this plugin's own `projectstore:critic` (purpose-built fresh-context critic, no sycophancy). If unavailable, fall back to `oh-my-claudecode:critic`, then `general-purpose`. Use this exact prompt template:
26
+ 6. **Spawn the critic agent**. Prefer this plugin's own `projectstore:critic` (purpose-built fresh-context critic, no sycophancy). If unavailable, fall back to `general-purpose`. Use this exact prompt template:
27
27
 
28
28
  ```
29
29
  You are a critic-mode reviewer. You have ONLY the artifact and the
@@ -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 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.
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, verbatim โ€” never substitute the model you are running on (`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 `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,7 @@ 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 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),
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, verbatim โ€” never substitute the model you are running on (`null` โ†’ pass nothing),
84
84
  and `result.effort` as its effort parameter when it is not `null` and the spawn offers one.
85
85
  Missing key, `inherit`, or unreadable config โ†’ pass nothing and let the
86
86
  agent's own frontmatter decide; never guess a model.
@@ -14,7 +14,7 @@ The next two sections are the other ways in: a checkout, for contributors, and t
14
14
 
15
15
  ## From a checkout
16
16
 
17
- For contributors working on projectstore itself. Clone it; [Running a checkout's build](../packaging/README.md#running-a-checkouts-build) covers the packed form.
17
+ For contributors working on projectstore itself. Clone it; [Running a checkout's build](https://github.com/SmartAndPoint/ProjectStore/blob/main/packaging/README.md#running-a-checkouts-build) covers the packed form.
18
18
 
19
19
  ```bash
20
20
  git clone https://github.com/SmartAndPoint/ProjectStore.git ~/Projects/SmartAndPoint/ProjectStore
@@ -172,11 +172,10 @@ Installed with setup or from npm: from a terminal in your project, name the vers
172
172
  npx projectstore@<version> upgrade
173
173
  ```
174
174
 
175
- Installed from the git marketplace, in a Claude Code session:
175
+ Installed from the git marketplace: in a Claude Code session, open `/plugin manage` and choose **Update now** on projectstore, then run `/reload-plugins` to load it. Or, from a terminal, then restart Claude Code:
176
176
 
177
177
  ```
178
- /plugin marketplace update SmartAndPoint
179
- /reload-plugins
178
+ claude plugin update projectstore@SmartAndPoint
180
179
  ```
181
180
 
182
181
  Or enable auto-update once (`/plugin` โ†’ **Marketplaces** โ†’ **SmartAndPoint** โ†’ toggle **auto-update**) and Claude Code will detect new releases at startup.
@@ -93,7 +93,7 @@ Installation is user-global because Codex stores marketplace registrations and
93
93
  plugin caches in `CODEX_HOME`; the agents block in `AGENTS.md` remains
94
94
  project-local. Ordinary uninstall leaves the global plugin in place; add
95
95
  `--global` only when you mean to remove it for every project. A checkout's own
96
- build runs through the same flow: [`packaging/README.md`](../packaging/README.md#running-a-checkouts-build)
96
+ build runs through the same flow: [`packaging/README.md`](https://github.com/SmartAndPoint/ProjectStore/blob/main/packaging/README.md#running-a-checkouts-build)
97
97
  has the tarball loop.
98
98
 
99
99
  `npx projectstore configure` changes Codex's settings as it does Claude Code's.
@@ -297,7 +297,7 @@
297
297
  "kind": "exclusive",
298
298
  "format": "mjs",
299
299
  "scope": "project",
300
- "scope_reason": "The launcher resolves the currently installed plugin on every render, so the wired command carries no version; it is written only when the plugin runs from the marketplace cache โ€” a dev checkout is wired directly.",
300
+ "scope_reason": "The launcher resolves the currently installed plugin on every render, so the wired command carries no version; it is written only when the plugin runs from a host install โ€” the marketplace cache, or the folder Claude Code syncs a claude.ai copy into (registry.synced_dir), whose path may change or vanish โ€” a dev checkout is wired directly. The condition key keeps its name, plugin_cache_install.",
301
301
  "file": ".projectstore/state/claude-code/statusline.mjs",
302
302
  "source": "scripts/statusline-launcher.mjs",
303
303
  "condition": "plugin_cache_install",
@@ -309,6 +309,8 @@
309
309
  "kind": "host",
310
310
  "dir": ".",
311
311
  "file": ".mcp.json",
312
+ "entry": "scripts/mcp-server.mjs",
313
+ "entry_reason": "The script .mcp.json runs, under the plugin root, with --project and the host's project directory as its only arguments. It lives under scripts/, never bin/ (a plugin's top-level bin/ is on the host's Bash PATH), and imports nothing from cli.mjs, so the server's imports reach no install verb (PS-DIRECTORY, the story \"The MCP server's entry reaches no install verb through a read-verb runner that shares the CLI's verb tableโ€ฆ\"; the MCP ADR's decision 1 as amended). The CLI's `mcp` verb serves the same way, for a host without a plugin channel.",
312
314
  "scope": "plugin",
313
315
  "scope_reason": "Claude Code loads a plugin's .mcp.json from the plugin installation itself and expands ${CLAUDE_PLUGIN_ROOT} and ${CLAUDE_PROJECT_DIR} in it per session, so the one shipped file binds each server to one project (MCP ADR decision 6, amended 2026-09-05); nothing is installed and nothing is derived โ€” the host kind install-harness skips, which the install spec's contract 0 does not yet name.",
314
316
  "launch": {
@@ -383,7 +385,44 @@
383
385
  ],
384
386
  "enabled_pointer": "enabledPlugins",
385
387
  "known_pointer": "extraKnownMarketplaces",
386
- "install_path_layout": "<cache_dir>/<marketplace>/<plugin>/<version>"
388
+ "install_path_layout": "<cache_dir>/<marketplace>/<plugin>/<version>",
389
+ "synced_dir": [
390
+ "plugins",
391
+ "synced"
392
+ ],
393
+ "synced_origin": "synced",
394
+ "sync_setting": "syncClaudeAiPlugins",
395
+ "trash_dir": [
396
+ "plugins",
397
+ ".trash"
398
+ ],
399
+ "synced_reason": "A plugin on the person's claude.ai account (added from Anthropic's directory, or turned on by their organization) loads as <plugin>@synced, with no marketplace and no install record, and its files sit in <synced_dir>/<bucket>/<plugin>/ (code.claude.com/docs/en/plugins/loading, \"Plugins synced from claude.ai\"; the bucket layout measured 2026-10-15, undocumented). installChannel answers \"synced\" for a root there from the path alone; the copy's version is read from its own .claude-plugin/plugin.json, never from the bucket's manifest.json, whose version is claude.ai's string. It is on unless a settings file sets <plugin>@synced to false, and an enabled copy of the same name from any other origin loads over it (the loading reference, \"Name conflicts\", item 5). With sync_setting false in the user's settings, Claude Code moves the synced copies to trash_dir at its next start and stops loading them. CLAUDE_CODE_PLUGIN_CACHE_DIR moves the whole plugins root and is not read: a known gap, as for cache_dir.",
400
+ "marketplaces_claudeai": [
401
+ "plugins",
402
+ "known_marketplaces_claudeai.json"
403
+ ],
404
+ "claudeai_prefix": "claudeai-",
405
+ "claudeai_reason": "A marketplace added from claude.ai is registered under a local name that starts with claudeai- and is recorded in known_marketplaces_claudeai.json instead of known_marketplaces.json (code.claude.com/docs/en/plugins/install, \"Add a marketplace from claude.ai\"; the loading reference, \"Find plugins on disk\"). It is added again from /plugin โ†’ Marketplaces, never by a source.",
406
+ "auto_update": {
407
+ "on": [
408
+ "claude-plugins-official",
409
+ "claude-code-marketplace",
410
+ "claude-code-plugins",
411
+ "anthropic-marketplace",
412
+ "anthropic-plugins",
413
+ "agent-skills",
414
+ "anthropic-agent-skills",
415
+ "life-sciences",
416
+ "claude-for-legal",
417
+ "claude-for-financial-services",
418
+ "financial-services-plugins",
419
+ "claude-tag-plugins"
420
+ ],
421
+ "on_prefix": [
422
+ "claudeai-"
423
+ ],
424
+ "reason": "Whether a marketplace auto-updates when neither its extraKnownMarketplaces entry in a settings file nor its registry entry sets autoUpdate (the loading reference, \"Which marketplaces and plugins auto-update\", read 2026-10-15): on for Anthropic's official marketplace names (code.claude.com/docs/en/plugins/security#official-marketplace-names) except knowledge-work-plugins and first-party-plugins, on for a marketplace added from claude.ai, off for every other marketplace."
425
+ }
387
426
  },
388
427
  "cli": {
389
428
  "bin": "claude",
@@ -507,18 +546,28 @@
507
546
  ],
508
547
  "by_channel": {
509
548
  "marketplace": {
510
- "line": "See /plugin โ†’ Marketplaces to enable auto-update.",
549
+ "line": "Updates come through the {marketplace} marketplace, whose auto-update is {auto_update} by default: /plugin โ†’ Marketplaces โ†’ {marketplace} turns it on or off.",
511
550
  "welcome": [
512
- "**About future updates**: Claude Code does NOT auto-update third-party marketplaces by default. To get notified of new releases (v0.7+):",
551
+ "**About future updates**: this copy comes from the **{marketplace}** marketplace. Claude Code updates it in the background while that marketplace's auto-update is on, and for {marketplace} auto-update is **{auto_update}** by default. To check it:",
513
552
  "1. Open `/plugin` โ†’ **Marketplaces** tab.",
514
- "2. Find **SmartAndPoint**.",
515
- "3. Toggle **auto-update** on.",
553
+ "2. Find **{marketplace}**.",
554
+ "3. Make sure **auto-update** is on.",
516
555
  "",
517
- "Without it, you'd run `/plugin marketplace update SmartAndPoint` manually. See https://github.com/SmartAndPoint/ProjectStore#upgrading for details."
556
+ "Without it, open `/plugin manage` and choose **Update now** on projectstore when a new version is out."
557
+ ]
558
+ },
559
+ "synced": {
560
+ "line": "Updates come from claude.ai: Claude Code downloads each new version at its next start, then asks for /reload-plugins. Off for your account on this machine: /plugin โ†’ Installed. Off for one project only: \"projectstore@synced\": false under enabledPlugins in that project's .claude/settings.local.json.",
561
+ "welcome": [
562
+ "**About future updates**: this copy comes from Anthropic's plugin directory, through your claude.ai account, and Claude Code loads it as `projectstore@synced`. Updates come from claude.ai: when a new version is published, Claude Code downloads it at its next start and asks you to run `/reload-plugins`.",
563
+ "",
564
+ "- **Off for your account on this machine**: `/plugin` โ†’ **Installed**, then turn off `projectstore@synced`.",
565
+ "- **Off for one project only**: set `\"projectstore@synced\": false` under `enabledPlugins` in that project's `.claude/settings.local.json`, or in its committed `.claude/settings.json` to keep it out for everyone who opens the project.",
566
+ "- **Removed**: on claude.ai, where it was added."
518
567
  ]
519
568
  }
520
569
  },
521
- "reason": "What the first-run welcome and its one-line notice say about updates (generation spec, contract 18): `line` ends the notice, `welcome` is the welcome's update block, and `{upgrade}` is filled with the core's upgrade for this harness at latest, so what is printed runs as printed. `by_channel` holds the text for a copy that loads from another channel, by installChannel's answer: a copy from the git marketplace is updated by Claude Code itself, so its welcome keeps the auto-update toggle; the npm registration and a checkout get the npm form. update_instructions is the long-form guidance; this is the part a session prints, kept here so no hook names a harness's update path."
570
+ "reason": "What the first-run welcome and its one-line notice say about updates (generation spec, contract 18): `line` ends the notice, `welcome` is the welcome's update block, and `{upgrade}` is filled with the core's upgrade for this harness at latest, so what is printed runs as printed. `by_channel` holds the text for a copy that loads from another channel, by installChannel's answer: a marketplace copy is updated by Claude Code itself, so its welcome names that marketplace's auto-update toggle, with `{marketplace}` filled from the copy's own path and `{auto_update}` with its default (on or off, registry.auto_update); a copy synced from claude.ai (Anthropic's directory) is updated by claude.ai and names no npm, upgrade or marketplace command, only the two ways to turn it off (the story \"A copy installed from Anthropic's directory is a channel the core knowsโ€ฆ\", PS-DIRECTORY); the npm registration and a checkout get the npm form. update_instructions is the long-form guidance; this is the part a session prints, kept here so no hook names a harness's update path."
522
571
  },
523
572
  "update_instructions": [
524
573
  "**About future updates**: installed from the git marketplace, Claude Code does NOT auto-update third-party marketplaces by default; an npm registration updates with `npx projectstore@<version> upgrade` from a terminal in the project. To get notified of new git-marketplace releases (v0.7+):",
@@ -526,7 +575,7 @@
526
575
  "2. Find **SmartAndPoint**.",
527
576
  "3. Toggle **auto-update** on.",
528
577
  "",
529
- "Without it, you would run `/plugin marketplace update SmartAndPoint` manually. See https://github.com/SmartAndPoint/ProjectStore#upgrading for details.",
578
+ "Without it, open `/plugin manage` and choose **Update now** on projectstore when a new version is out. See https://github.com/SmartAndPoint/ProjectStore#upgrading for details.",
530
579
  "",
531
580
  "**Upgrading from 0.27.x to 0.28**: restart after the update, then move the project's files to `.projectstore/` with the one command the first session names, run from a terminal in the project, outside the session. For a git-marketplace install it is the installed copy's own `bin/projectstore.mjs` with `upgrade --harness claude-code --no-register`, which leaves the registration as it is. For the npm registration it is `npx projectstore@<version> upgrade --harness claude-code --no-register` and nothing else. The same run re-stamps the status-line launcher, and until then every reader falls back to the old paths. `status` and `search` answer from artifact facts; `doctor` gains surface, version-drift and mcp lines and exits 1 on findings; the plugin registers an MCP server the host may ask you to approve once. On 0.28.0-rc.1 or rc.2, update first: their startup line named the form without `--no-register`, which also switches a git-marketplace install to npm for the checkout (the README's Upgrading section has the way back). Before the move, a rollback to 0.27.x keeps working and the move is the way forward again; after the move, 0.27.x reads the project as unbound."
532
581
  ],
@@ -600,30 +649,8 @@
600
649
  "description": "Follows the newest Haiku model: Claude Code resolves the alias when it starts the agent."
601
650
  }
602
651
  ],
603
- "static_reason": "The enum above, in the order the menu lists it. A line the catalog below reports that this list lacks is never offered: a Claude Code release that adds an alias is named with `--set`, with the warning, until this list learns it.",
604
- "catalogs": [
605
- {
606
- "kind": "http",
607
- "source": "the Anthropic API",
608
- "caption": "Anthropic API",
609
- "url": "https://api.anthropic.com/v1/models?limit=1000",
610
- "base_env": "ANTHROPIC_BASE_URL",
611
- "path": "/v1/models?limit=1000",
612
- "key_env": "ANTHROPIC_API_KEY",
613
- "key_header": "x-api-key",
614
- "headers": { "anthropic-version": "2023-06-01" },
615
- "fields": {
616
- "list": "data",
617
- "id": "id",
618
- "label": "display_name",
619
- "family": "line",
620
- "order": "created_at",
621
- "order_desc": true,
622
- "keep_when": { "lifecycle": "active" }
623
- },
624
- "reason": "Measured 2026-10-13: 14 models in 0.5โ€“0.7 s, each with id, display_name, created_at, line (fable, opus, sonnet, haiku) and lifecycle. `line` is the family an alias follows, so the newest active entry of a line is the best local account of what that alias starts; Claude Code resolves the alias itself. Read only when a model list opens with a stale cache, or on refresh, and only with ANTHROPIC_API_KEY set; ANTHROPIC_BASE_URL, when set, is the base the key belongs to."
625
- }
626
- ]
652
+ "static_reason": "The enum above, in the order the menu lists it. It is the whole list: Anthropic's model list takes a key, and ProjectStore reads no credential from the environment (the 0.30.7 story, PS-DIRECTORY), so no catalog is declared and the menu asks nothing. A Claude Code release that adds an alias is named with `--set`, with the warning, until this list learns it.",
653
+ "catalogs": []
627
654
  }
628
655
  }
629
656
  }
@@ -6,11 +6,11 @@
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/session-start.mjs"
9
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/session-start.mjs\""
10
10
  },
11
11
  {
12
12
  "type": "command",
13
- "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/session-rules.mjs"
13
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/session-rules.mjs\""
14
14
  }
15
15
  ]
16
16
  }
@@ -20,7 +20,7 @@
20
20
  "hooks": [
21
21
  {
22
22
  "type": "command",
23
- "command": "node ${CLAUDE_PLUGIN_ROOT}/scripts/touch-session.mjs"
23
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/touch-session.mjs\""
24
24
  }
25
25
  ]
26
26
  }
@@ -31,7 +31,7 @@
31
31
  "hooks": [
32
32
  {
33
33
  "type": "command",
34
- "command": "node ${CLAUDE_PLUGIN_ROOT}/scripts/touch-session.mjs"
34
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/touch-session.mjs\""
35
35
  }
36
36
  ]
37
37
  }
@@ -41,7 +41,7 @@
41
41
  "hooks": [
42
42
  {
43
43
  "type": "command",
44
- "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/session-stop.mjs"
44
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/session-stop.mjs\""
45
45
  }
46
46
  ]
47
47
  }
@@ -51,7 +51,7 @@
51
51
  "hooks": [
52
52
  {
53
53
  "type": "command",
54
- "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/pre-compact.mjs"
54
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/pre-compact.mjs\""
55
55
  }
56
56
  ]
57
57
  }