projectstore-claude 0.30.4 → 0.30.6

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 (50) 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 -16
  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/how-it-works.md +7 -0
  15. package/node_modules/projectstore/docs/images/icon.png +0 -0
  16. package/node_modules/projectstore/harnesses/claude-code.json +61 -11
  17. package/node_modules/projectstore/harnesses/codex.json +45 -15
  18. package/node_modules/projectstore/hooks/band.tsx +19 -8
  19. package/node_modules/projectstore/hooks/hooks.json +6 -6
  20. package/node_modules/projectstore/hooks/session-start.mjs +55 -24
  21. package/node_modules/projectstore/hooks/session-stop.mjs +43 -20
  22. package/node_modules/projectstore/package.json +11 -12
  23. package/node_modules/projectstore/scripts/band-shared.mjs +17 -2
  24. package/node_modules/projectstore/scripts/band.mjs +20 -2
  25. package/node_modules/projectstore/scripts/binding.mjs +1 -1
  26. package/node_modules/projectstore/scripts/build-adapters.mjs +45 -4
  27. package/node_modules/projectstore/scripts/cli.mjs +74 -1373
  28. package/node_modules/projectstore/scripts/convergence.mjs +59 -16
  29. package/node_modules/projectstore/scripts/doctor.mjs +199 -36
  30. package/node_modules/projectstore/scripts/harness.mjs +88 -6
  31. package/node_modules/projectstore/scripts/install-handlers.mjs +925 -0
  32. package/node_modules/projectstore/scripts/install-harness.mjs +129 -2081
  33. package/node_modules/projectstore/scripts/install-layout.mjs +453 -0
  34. package/node_modules/projectstore/scripts/install-preview.mjs +747 -0
  35. package/node_modules/projectstore/scripts/lib.mjs +387 -107
  36. package/node_modules/projectstore/scripts/mcp-server.mjs +33 -0
  37. package/node_modules/projectstore/scripts/mcp.mjs +60 -60
  38. package/node_modules/projectstore/scripts/model-spec.mjs +24 -0
  39. package/node_modules/projectstore/scripts/models.mjs +6 -10
  40. package/node_modules/projectstore/scripts/query.mjs +7 -6
  41. package/node_modules/projectstore/scripts/read-verbs.mjs +277 -0
  42. package/node_modules/projectstore/scripts/setup.mjs +62 -12
  43. package/node_modules/projectstore/scripts/statusline-launcher.mjs +36 -3
  44. package/node_modules/projectstore/scripts/surfaces.mjs +18 -5
  45. package/node_modules/projectstore/scripts/touch-session.mjs +30 -15
  46. package/node_modules/projectstore/scripts/verbs.mjs +1202 -0
  47. package/node_modules/projectstore/scripts/version-guard.mjs +57 -7
  48. package/package.json +3 -3
  49. package/node_modules/projectstore/docs/images/loop-light.svg +0 -94
  50. package/node_modules/projectstore/docs/images/team-light.svg +0 -79
@@ -251,7 +251,39 @@ function renderRole(file) {
251
251
  const { data, body } = frontmatter(read(file), file);
252
252
  const role = file.split("/").pop().replace(/\.md$/, "");
253
253
  const name = renderedName("agents", role);
254
- const orchestration = `## Codex orchestration\n\nThis is a role-orchestration skill, not a native agent registration. Resolve the\nrole's model and effort by running:\n\n\`\`\`bash\nnode "\${PROJECTSTORE_CORE_ROOT}/bin/projectstore.mjs" agents model ${role} --json --project "$PWD"\n\`\`\`\n\nSpawn a collaboration agent for the bounded task. If the result names a model,\npass that model and use an empty or bounded context fork; otherwise inherit the\ncurrent model. If the result names an effort, pass it as \`${effortParam()}\`,\nwith or without a model; otherwise pass none. Give the spawned agent the role\ncontract below and the exact artifact/diff it must inspect. Wait for its final\nresult.\n\n## Role contract\n\n`;
254
+ // The spawn sentences name the fields and the value, verbatim: "if the
255
+ // result names a model, pass that model" let a parent read "that model" as
256
+ // its own, and pass it in 2 of 3 runs (the story "Codex role skills pass the
257
+ // model the core names, verbatim", PS-HARNESS). No example slug: the failure
258
+ // is a substituted model name, and an example is one more name to copy.
259
+ const orchestration = `## Codex orchestration
260
+
261
+ This is a role-orchestration skill, not a native agent registration. Resolve the
262
+ role's model and effort by running:
263
+
264
+ \`\`\`bash
265
+ node "\${PROJECTSTORE_CORE_ROOT}/bin/projectstore.mjs" agents model ${role} --json --project "$PWD"
266
+ \`\`\`
267
+
268
+ Spawn a collaboration agent for the bounded task. Its model and effort are the
269
+ two fields that command printed, \`result.model\` and \`result.effort\`, passed
270
+ verbatim:
271
+
272
+ - If \`result.model\` is a string, pass \`result.model\` exactly as \`model\`: the
273
+ string the command printed, even when it names the model you are running
274
+ on. Never substitute your own model for it. Use an empty or bounded context
275
+ fork.
276
+ - If \`result.model\` is \`null\`, pass no model at all, not even your own; the
277
+ agent inherits the current model.
278
+ - If \`result.effort\` is a string, pass it as \`${effortParam()}\`, verbatim,
279
+ with or without a model. If \`result.effort\` is \`null\`, pass none.
280
+
281
+ Give the spawned agent the role contract below and the exact artifact/diff it
282
+ must inspect. Wait for its final result.
283
+
284
+ ## Role contract
285
+
286
+ `;
255
287
  const description = (data.description || `Run the ProjectStore ${role} role in a fresh collaboration agent.`).replace(
256
288
  /^(?:Opus|Sonnet) \([a-z]+-effort\)\s+/,
257
289
  "",
@@ -267,14 +299,23 @@ export function renderHooks(manifest, root = ROOT) {
267
299
  if (!hasBand(manifest)) delete source.modules;
268
300
  const post = source.hooks?.PostToolUse || [];
269
301
  for (const group of post) if (group.matcher) group.matcher = (manifest.tools?.write_tools || []).join("|");
302
+ const sourceRoot = "${" + SOURCE.runtime.plugin_root_env + "}";
303
+ const targetRoot = "${" + manifest.runtime.plugin_root_env + "}";
304
+ // The source may write its root bare, quote the whole path ("${ROOT}/x") or
305
+ // quote the variable alone ("${ROOT}"/x): the host's two documentation pages
306
+ // show the last two. Codex keys hook trust to the rendered command text, so
307
+ // all three render the one command, and a re-quoted source cannot ask every
308
+ // Codex user to trust the hooks again (the story "Every hook command quotes
309
+ // its plugin root…", PS-DIRECTORY, decision 2).
310
+ const r = escapeRe(sourceRoot);
311
+ const sourceCommand = new RegExp(`^node (?:"${r}/([^"\\s]+)"|"${r}"/([^"\\s]+)|${r}/([^"\\s]+))$`);
270
312
  const rewrite = (value) => {
271
313
  if (Array.isArray(value)) return value.map(rewrite);
272
314
  if (value && typeof value === "object")
273
315
  return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, rewrite(v)]));
274
316
  if (typeof value !== "string") return value;
275
- const sourceRoot = "${" + SOURCE.runtime.plugin_root_env + "}";
276
- const targetRoot = "${" + manifest.runtime.plugin_root_env + "}";
277
- const command = value.startsWith(`node ${sourceRoot}/`) ? value.slice(`node ${sourceRoot}/`.length) : null;
317
+ const m = sourceCommand.exec(value);
318
+ const command = m ? m[1] || m[2] || m[3] : null;
278
319
  return command
279
320
  ? `node "${targetRoot}/node_modules/projectstore/${command}"`
280
321
  : value.replaceAll(sourceRoot, `${targetRoot}/node_modules/projectstore`);