projectstore-claude 0.28.1 โ†’ 0.28.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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.28.1",
15
+ "version": "0.28.2",
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.28.1",
4
+ "version": "0.28.2",
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",
@@ -97,8 +97,8 @@ npx projectstore-claude install --project "$PWD"
97
97
  The same tree is published to npm as [`projectstore`](https://www.npmjs.com/package/projectstore) โ€” one source package carrying every harness's manifest โ€” and `projectstore-claude` is its Claude Code shell: the core pinned at the same version and bundled inside, the harness fixed, so the one command has the same shape on every harness. It registers the plugin with Claude Code: it writes a small local marketplace of its own under your Claude home, then drives `claude plugin marketplace add` / `plugin install` **at local scope**, so the registration lands in this checkout's `.claude/settings.local.json` and nowhere else. Every host command is printed before it runs; naming the harness is the confirmation. Restart Claude Code afterwards. A git-marketplace copy already enabled for the checkout is silenced there (not globally) so the plugin does not load twice; `uninstall` turns it back on. Pin or upgrade with `npx projectstore-claude@<version> upgrade --project "$PWD"` โ€” the version you name is the version you run. The core's low-level form, `npx projectstore <verb> --harness claude-code โ€ฆ`, is exactly what the shell runs. bun works the same on the packed bin.
98
98
 
99
99
  **Codex has its own shell with the same one-command shape:**
100
- `npx projectstore-codex install --project "$PWD"`. It carries a canonical
101
- portable manifest, namespaced workflow and role skills, lifecycle hooks, and
100
+ `npx projectstore-codex install --project "$PWD"`. It carries a Codex
101
+ plugin manifest, namespaced workflow and role skills, lifecycle hooks, and
102
102
  the exact bundled core. It stages a stable marketplace under `CODEX_HOME`,
103
103
  drives `codex plugin marketplace add` and `codex plugin add`, then reads the
104
104
  installation back and verifies its version and payload digest. Restart Codex,
@@ -45,14 +45,15 @@ model names and those are harness-specific โ€” is
45
45
 
46
46
  ## Codex
47
47
 
48
- Experimental, measured on `codex-cli 0.153.4`. The initial spike captured 759
48
+ Experimental, measured on `codex-cli 0.153.4` and, for hook loading, 0.160.0.
49
+ The initial spike captured 759
49
50
  hook firings. The 2026-09-30 gate then built the npm shell from a packed core,
50
51
  passed Codex's plugin validator, installed and upgraded it through an isolated
51
52
  `CODEX_HOME`, verified the materialised cache by version and digest, and loaded
52
53
  the `projectstore-status` skill in a fresh Codex session. The validator (the
53
54
  plugin-creator skill's `validate_plugin.py`) reads only
54
- `.codex-plugin/plugin.json`. The canonical root `plugin.json` was validated
55
- separately on 2026-10-04, against the schema it declares (Agent Plugins 1.0.0).
55
+ `.codex-plugin/plugin.json`, which from 0.28.2 is the shell's only manifest
56
+ (below).
56
57
 
57
58
  That run exercised one skill, not every installed surface, so `verified` stays
58
59
  `null`. The hooks are the reason it matters. On 2026-10-03 the first real
@@ -63,7 +64,8 @@ was all the user saw. The core had taken the shell's root for its own. That is
63
64
  fixed, and the suite now runs every rendered hook from the built shell. A live
64
65
  Codex session firing them from an installed release is still owed.
65
66
 
66
- How 0.153.4 starts a hook was read from its source, not measured: under the
67
+ How 0.153.4 starts a hook was read from its source; on 0.160.0 it was seen
68
+ once, with the hook's `$0` reading `/bin/zsh` and `node` found. Under the
67
69
  session's shell as `<shell> -c`, with the environment the Codex process had when
68
70
  it built the session's hooks. `$SHELL -lc` (or `/bin/sh -lc`) is the fallback
69
71
  when the hooks are built without exactly one ready local environment. So a hook
@@ -93,16 +95,27 @@ npx --package "./dist/projectstore-codex-$(node -p 'require("./package.json").ve
93
95
 
94
96
  What is known, and how:
95
97
 
96
- - **Hooks are rendered; their live firing from an installed release is not
97
- yet observed.** The canonical portable `plugin.json` selects
98
- `./hooks/hooks.json` through `extensions.com.openai`; the compatibility
99
- `.codex-plugin/plugin.json` stays inside the current ingestion schema. Five
98
+ - **Hooks load from Codex's default file, so the shell carries no root
99
+ `plugin.json`.** `.codex-plugin/plugin.json` is its only manifest and names
100
+ no hooks, so Codex falls back to `hooks/hooks.json`. 0.28.1, and every
101
+ build from a checkout since rc.3, also carried a root Agent Plugins
102
+ `plugin.json`, with the hooks under `extensions.com.openai`. Codex picks
103
+ that manifest first, and since openai/codex#37027 (merged 2026-08-05; in
104
+ `codex-cli` 0.153.4 and 0.160.0 alike) it loads no hooks from that format.
105
+ So no hook of ours loaded from those builds on any Codex measured here
106
+ (0.153.4, 0.160.0). On the maintainer's machine
107
+ on 2026-10-04, `/hooks` listed none of ours; with that file renamed away in
108
+ the installed cache, it listed all six, and the app server's `hooks/list`
109
+ gives 0 for 0.28.1's root and 6 for 0.28.2's. Five
100
110
  events: `SessionStart`, `PreToolUse`, `PostToolUse`, `Stop`, `PreCompact`.
101
111
  Of the 759 captured firings, 757 came from the earlier inline form, across
102
112
  `SessionStart`, `UserPromptSubmit`, `PreToolUse`, `PostToolUse` and `Stop`,
103
113
  and 2 from a file-site `hooks/hooks.json` with an absolute `node` path.
104
- `PreCompact` has never been observed firing on Codex, and neither has the
105
- `${PLUGIN_ROOT}` form selected through `extensions.com.openai`. The hook process
114
+ That live `codex-cli` 0.160.0 session ran on a hand-edited 0.28.1 cache, not
115
+ an installed release. Our SessionStart and PreCompact were observed in it. A
116
+ throwaway recorder saw PreToolUse, PostToolUse and Stop fire, but ours on
117
+ PostToolUse, matched to `apply_patch`, still awaits a write. SessionStart ran
118
+ on the session's first message, not when the window opened. The hook process
106
119
  receives `PLUGIN_ROOT` in its environment, naming the shell's root with the
107
120
  core beneath it in `node_modules/projectstore/`, and **no project-directory
108
121
  variable at all**. The project comes from the payload's `cwd`, which every
@@ -1,5 +1,5 @@
1
1
  {
2
- "_comment": "Harness capability manifest โ€” Codex. The committed adapters/codex tree renders the source commands, roles, passive skills and hooks into Codex vocabulary. Measurements began with 759 captured hook firings on 2026-09-07/08; the complete built shell, isolated marketplace install, upgrade, validator and fresh-session skill load passed on codex-cli 0.153.4 on 2026-09-30. The validator reads only .codex-plugin/plugin.json; the canonical root plugin.json was validated separately on 2026-10-04 against the schema it declares (Agent Plugins 1.0.0).",
2
+ "_comment": "Harness capability manifest โ€” Codex. The committed adapters/codex tree renders the source commands, roles, passive skills and hooks into Codex vocabulary. Measurements began with 759 captured hook firings on 2026-09-07/08; the complete built shell, isolated marketplace install, upgrade, validator and fresh-session skill load passed on codex-cli 0.153.4 on 2026-09-30. The validator reads only .codex-plugin/plugin.json, which from 0.28.2 is the shell's one manifest: Codex picks a root Agent Plugins plugin.json first and has loaded no hooks from that format since openai/codex#37027 (merged 2026-08-05).",
3
3
  "id": "codex",
4
4
  "display_name": "Codex",
5
5
  "emit": true,
@@ -54,7 +54,7 @@
54
54
  },
55
55
  "hooks": {
56
56
  "config_file": "hooks/hooks.json",
57
- "config_file_reason": "The canonical portable plugin.json selects ./hooks/hooks.json under extensions.com.openai; the compatibility manifest selects the same root-relative file. This keeps one rendered hook definition for both loaders. The legacy inline form fired 757 events across five event types; the file-selected portable form is gated by the compatibility matrix and fresh-session run.",
57
+ "config_file_reason": "Codex's default hooks file. A legacy .codex-plugin/plugin.json with no `hooks` key falls back to hooks/hooks.json (DEFAULT_HOOKS_CONFIG_FILE in codex-rs/core-plugins/src/loader.rs at rust-v0.160.0), so the manifest names no hooks at all. The shell ships no root Agent Plugins plugin.json. Codex picks that manifest first and then loads no hooks from it, a runtime boundary since openai/codex#37027 (loader.rs:955 at rust-v0.153.4, 952-962 at rust-v0.160.0). With one, the maintainer's codex-cli 0.160.0 listed none of ours in /hooks on 2026-10-04; with the file renamed away in the installed cache, it listed all six. The app-server's hooks/list agrees: 0 for 0.28.1's root, 6 for 0.28.2's. The spike's inline form fired 757 events across five event types.",
58
58
  "events": {
59
59
  "SessionStart": "SessionStart",
60
60
  "PreToolUse": "PreToolUse",
@@ -192,7 +192,7 @@
192
192
  "supported": true,
193
193
  "kind": "host",
194
194
  "scope": "user",
195
- "scope_reason": "Selected by canonical plugin.json and the compatibility manifest, then loaded with the plugin; trust is granted per hook, machine-wide, and cannot be silenced per checkout."
195
+ "scope_reason": "Loaded with the plugin from its default hooks/hooks.json, which .codex-plugin/plugin.json leaves to Codex by naming no hooks; trust is granted per hook, machine-wide, and cannot be silenced per checkout."
196
196
  },
197
197
  "mcp": {
198
198
  "supported": false,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectstore",
3
- "version": "0.28.1",
3
+ "version": "0.28.2",
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",
@@ -68,10 +68,16 @@ export function collectShells(root = ROOT) {
68
68
  if (typeof json.version !== "string" || !json.version) return { error: `${rel}: no version found where one is required` };
69
69
  const pluginVersions = [];
70
70
  if (name === "projectstore-codex") {
71
- for (const manifest of ["plugin.json", ".codex-plugin/plugin.json"]) {
71
+ // A root plugin.json is an Agent Plugins manifest Codex picks first, and
72
+ // Codex loads no hooks from that format (openai/codex#37027, merged
73
+ // 2026-08-05): every hook goes missing.
74
+ if (existsSync(resolve(root, SHELLS_DIR, name, "plugin.json"))) {
75
+ return { error: `${SHELLS_DIR}/${name}/plugin.json: refused โ€” Codex picks a root Agent Plugins manifest first and loads no hooks from it (openai/codex#37027; codex-rs/core-plugins/src/loader.rs); the shell's manifest is .codex-plugin/plugin.json alone` };
76
+ }
77
+ for (const manifest of [".codex-plugin/plugin.json"]) {
72
78
  const manifestRel = `${SHELLS_DIR}/${name}/${manifest}`;
73
79
  const manifestAbs = resolve(root, manifestRel);
74
- if (!existsSync(manifestAbs)) return { error: `${manifestRel}: missing โ€” the Codex shell carries both canonical and compatibility manifests` };
80
+ if (!existsSync(manifestAbs)) return { error: `${manifestRel}: missing โ€” the Codex shell's one manifest` };
75
81
  let parsed;
76
82
  try { parsed = JSON.parse(readFileSync(manifestAbs, "utf8")); } catch (e) { return { error: `${manifestRel}: ${e.message}` }; }
77
83
  if (typeof parsed.version !== "string" || !parsed.version) return { error: `${manifestRel}: no version found where one is required` };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectstore-claude",
3
- "version": "0.28.1",
3
+ "version": "0.28.2",
4
4
  "description": "Installs projectstore for Claude Code from npm: the core pinned and bundled, the harness fixed โ€” npx projectstore-claude install --project \"$PWD\".",
5
5
  "keywords": [
6
6
  "projectstore",
@@ -37,7 +37,7 @@
37
37
  "README.md"
38
38
  ],
39
39
  "dependencies": {
40
- "projectstore": "=0.28.1"
40
+ "projectstore": "=0.28.2"
41
41
  },
42
42
  "bundleDependencies": [
43
43
  "projectstore"