projectstore-codex 0.0.1 → 0.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/.codex-plugin/plugin.json +48 -0
  2. package/README.md +15 -7
  3. package/bin/projectstore-codex.mjs +88 -0
  4. package/hooks/hooks.json +59 -0
  5. package/node_modules/projectstore/.claude-plugin/marketplace.json +40 -0
  6. package/node_modules/projectstore/.claude-plugin/plugin.json +23 -0
  7. package/node_modules/projectstore/.mcp.json +14 -0
  8. package/node_modules/projectstore/AGENTS.md +26 -0
  9. package/node_modules/projectstore/LICENSE +21 -0
  10. package/node_modules/projectstore/README.md +284 -0
  11. package/node_modules/projectstore/agents/archaeologist.md +76 -0
  12. package/node_modules/projectstore/agents/clerk.md +93 -0
  13. package/node_modules/projectstore/agents/critic.md +94 -0
  14. package/node_modules/projectstore/agents/librarian.md +81 -0
  15. package/node_modules/projectstore/agents/planner.md +80 -0
  16. package/node_modules/projectstore/agents/reviewer.md +98 -0
  17. package/node_modules/projectstore/bin/projectstore.mjs +7 -0
  18. package/node_modules/projectstore/commands/adr.md +57 -0
  19. package/node_modules/projectstore/commands/agents.md +180 -0
  20. package/node_modules/projectstore/commands/bind.md +128 -0
  21. package/node_modules/projectstore/commands/codemap.md +50 -0
  22. package/node_modules/projectstore/commands/concept.md +17 -0
  23. package/node_modules/projectstore/commands/doctor.md +166 -0
  24. package/node_modules/projectstore/commands/epic.md +40 -0
  25. package/node_modules/projectstore/commands/graph.md +56 -0
  26. package/node_modules/projectstore/commands/kanban.md +40 -0
  27. package/node_modules/projectstore/commands/meeting.md +17 -0
  28. package/node_modules/projectstore/commands/reconcile.md +73 -0
  29. package/node_modules/projectstore/commands/research.md +17 -0
  30. package/node_modules/projectstore/commands/review.md +89 -0
  31. package/node_modules/projectstore/commands/runbook.md +17 -0
  32. package/node_modules/projectstore/commands/scaffold.md +23 -0
  33. package/node_modules/projectstore/commands/search.md +22 -0
  34. package/node_modules/projectstore/commands/spec.md +91 -0
  35. package/node_modules/projectstore/commands/status.md +27 -0
  36. package/node_modules/projectstore/commands/statusline.md +46 -0
  37. package/node_modules/projectstore/commands/story.md +113 -0
  38. package/node_modules/projectstore/docs/extending.md +172 -0
  39. package/node_modules/projectstore/docs/getting-started.md +133 -0
  40. package/node_modules/projectstore/docs/harnesses.md +163 -0
  41. package/node_modules/projectstore/docs/how-it-works.md +263 -0
  42. package/node_modules/projectstore/docs/images/loop-light.svg +94 -0
  43. package/node_modules/projectstore/docs/images/loop.svg +93 -0
  44. package/node_modules/projectstore/docs/images/statusline-hud.png +0 -0
  45. package/node_modules/projectstore/docs/images/team-light.svg +79 -0
  46. package/node_modules/projectstore/docs/images/team.svg +79 -0
  47. package/node_modules/projectstore/harnesses/claude-code.json +483 -0
  48. package/node_modules/projectstore/harnesses/codex.json +332 -0
  49. package/node_modules/projectstore/hooks/hooks.json +59 -0
  50. package/node_modules/projectstore/hooks/pre-compact.mjs +121 -0
  51. package/node_modules/projectstore/hooks/session-rules.mjs +63 -0
  52. package/node_modules/projectstore/hooks/session-start.mjs +301 -0
  53. package/node_modules/projectstore/hooks/session-stop.mjs +84 -0
  54. package/node_modules/projectstore/package.json +70 -0
  55. package/node_modules/projectstore/scaffold/checklists.json +88 -0
  56. package/node_modules/projectstore/scaffold/headings.json +171 -0
  57. package/node_modules/projectstore/scaffold/layouts/engineering.json +85 -0
  58. package/node_modules/projectstore/scripts/binding.mjs +165 -0
  59. package/node_modules/projectstore/scripts/build-adapters.mjs +264 -0
  60. package/node_modules/projectstore/scripts/cli.mjs +595 -0
  61. package/node_modules/projectstore/scripts/codemap.mjs +99 -0
  62. package/node_modules/projectstore/scripts/diff-refs.mjs +127 -0
  63. package/node_modules/projectstore/scripts/doctor.mjs +2127 -0
  64. package/node_modules/projectstore/scripts/draft.mjs +261 -0
  65. package/node_modules/projectstore/scripts/graph.mjs +219 -0
  66. package/node_modules/projectstore/scripts/harness.mjs +608 -0
  67. package/node_modules/projectstore/scripts/install-harness.mjs +1387 -0
  68. package/node_modules/projectstore/scripts/kanban.mjs +174 -0
  69. package/node_modules/projectstore/scripts/lib.mjs +3085 -0
  70. package/node_modules/projectstore/scripts/mcp.mjs +391 -0
  71. package/node_modules/projectstore/scripts/portable-registration.mjs +198 -0
  72. package/node_modules/projectstore/scripts/provenance.mjs +375 -0
  73. package/node_modules/projectstore/scripts/query.mjs +490 -0
  74. package/node_modules/projectstore/scripts/reconcile.mjs +422 -0
  75. package/node_modules/projectstore/scripts/statusline-launcher.mjs +141 -0
  76. package/node_modules/projectstore/scripts/statusline.mjs +253 -0
  77. package/node_modules/projectstore/scripts/story-section.mjs +209 -0
  78. package/node_modules/projectstore/scripts/surfaces.mjs +421 -0
  79. package/node_modules/projectstore/scripts/tokens.mjs +449 -0
  80. package/node_modules/projectstore/scripts/touch-session.mjs +336 -0
  81. package/node_modules/projectstore/scripts/version-guard.mjs +255 -0
  82. package/node_modules/projectstore/scripts/worktree.mjs +109 -0
  83. package/node_modules/projectstore/skills/projectstore-decision-detector/SKILL.md +40 -0
  84. package/node_modules/projectstore/skills/projectstore-peer-reviewer/SKILL.md +38 -0
  85. package/node_modules/projectstore/skills/projectstore-story-completion/SKILL.md +50 -0
  86. package/node_modules/projectstore/skills/projectstore-vault-communication/SKILL.md +96 -0
  87. package/node_modules/projectstore/templates/claude-md-block.md.tmpl +26 -0
  88. package/node_modules/projectstore/templates/de/adr.md.tmpl +67 -0
  89. package/node_modules/projectstore/templates/de/concept.md.tmpl +43 -0
  90. package/node_modules/projectstore/templates/de/epic.md.tmpl +59 -0
  91. package/node_modules/projectstore/templates/de/folder-readme.md.tmpl +14 -0
  92. package/node_modules/projectstore/templates/de/kanban.md.tmpl +36 -0
  93. package/node_modules/projectstore/templates/de/meeting.md.tmpl +38 -0
  94. package/node_modules/projectstore/templates/de/research.md.tmpl +47 -0
  95. package/node_modules/projectstore/templates/de/runbook.md.tmpl +53 -0
  96. package/node_modules/projectstore/templates/de/spec.md.tmpl +64 -0
  97. package/node_modules/projectstore/templates/de/story.md.tmpl +76 -0
  98. package/node_modules/projectstore/templates/de/strings.json +6 -0
  99. package/node_modules/projectstore/templates/en/adr.md.tmpl +67 -0
  100. package/node_modules/projectstore/templates/en/concept.md.tmpl +43 -0
  101. package/node_modules/projectstore/templates/en/epic.md.tmpl +59 -0
  102. package/node_modules/projectstore/templates/en/folder-readme.md.tmpl +14 -0
  103. package/node_modules/projectstore/templates/en/kanban.md.tmpl +36 -0
  104. package/node_modules/projectstore/templates/en/meeting.md.tmpl +38 -0
  105. package/node_modules/projectstore/templates/en/research.md.tmpl +47 -0
  106. package/node_modules/projectstore/templates/en/runbook.md.tmpl +53 -0
  107. package/node_modules/projectstore/templates/en/spec.md.tmpl +64 -0
  108. package/node_modules/projectstore/templates/en/story.md.tmpl +76 -0
  109. package/node_modules/projectstore/templates/en/strings.json +6 -0
  110. package/node_modules/projectstore/templates/es/adr.md.tmpl +67 -0
  111. package/node_modules/projectstore/templates/es/concept.md.tmpl +43 -0
  112. package/node_modules/projectstore/templates/es/epic.md.tmpl +59 -0
  113. package/node_modules/projectstore/templates/es/folder-readme.md.tmpl +14 -0
  114. package/node_modules/projectstore/templates/es/kanban.md.tmpl +36 -0
  115. package/node_modules/projectstore/templates/es/meeting.md.tmpl +38 -0
  116. package/node_modules/projectstore/templates/es/research.md.tmpl +47 -0
  117. package/node_modules/projectstore/templates/es/runbook.md.tmpl +53 -0
  118. package/node_modules/projectstore/templates/es/spec.md.tmpl +64 -0
  119. package/node_modules/projectstore/templates/es/story.md.tmpl +76 -0
  120. package/node_modules/projectstore/templates/es/strings.json +6 -0
  121. package/node_modules/projectstore/templates/fr/adr.md.tmpl +67 -0
  122. package/node_modules/projectstore/templates/fr/concept.md.tmpl +43 -0
  123. package/node_modules/projectstore/templates/fr/epic.md.tmpl +59 -0
  124. package/node_modules/projectstore/templates/fr/folder-readme.md.tmpl +14 -0
  125. package/node_modules/projectstore/templates/fr/kanban.md.tmpl +36 -0
  126. package/node_modules/projectstore/templates/fr/meeting.md.tmpl +38 -0
  127. package/node_modules/projectstore/templates/fr/research.md.tmpl +47 -0
  128. package/node_modules/projectstore/templates/fr/runbook.md.tmpl +53 -0
  129. package/node_modules/projectstore/templates/fr/spec.md.tmpl +64 -0
  130. package/node_modules/projectstore/templates/fr/story.md.tmpl +76 -0
  131. package/node_modules/projectstore/templates/fr/strings.json +6 -0
  132. package/node_modules/projectstore/templates/ru/adr.md.tmpl +67 -0
  133. package/node_modules/projectstore/templates/ru/concept.md.tmpl +43 -0
  134. package/node_modules/projectstore/templates/ru/epic.md.tmpl +59 -0
  135. package/node_modules/projectstore/templates/ru/folder-readme.md.tmpl +14 -0
  136. package/node_modules/projectstore/templates/ru/kanban.md.tmpl +36 -0
  137. package/node_modules/projectstore/templates/ru/meeting.md.tmpl +38 -0
  138. package/node_modules/projectstore/templates/ru/research.md.tmpl +47 -0
  139. package/node_modules/projectstore/templates/ru/runbook.md.tmpl +53 -0
  140. package/node_modules/projectstore/templates/ru/spec.md.tmpl +64 -0
  141. package/node_modules/projectstore/templates/ru/story.md.tmpl +76 -0
  142. package/node_modules/projectstore/templates/ru/strings.json +6 -0
  143. package/node_modules/projectstore/templates/zh/adr.md.tmpl +67 -0
  144. package/node_modules/projectstore/templates/zh/concept.md.tmpl +43 -0
  145. package/node_modules/projectstore/templates/zh/epic.md.tmpl +59 -0
  146. package/node_modules/projectstore/templates/zh/folder-readme.md.tmpl +14 -0
  147. package/node_modules/projectstore/templates/zh/kanban.md.tmpl +36 -0
  148. package/node_modules/projectstore/templates/zh/meeting.md.tmpl +38 -0
  149. package/node_modules/projectstore/templates/zh/research.md.tmpl +47 -0
  150. package/node_modules/projectstore/templates/zh/runbook.md.tmpl +53 -0
  151. package/node_modules/projectstore/templates/zh/spec.md.tmpl +64 -0
  152. package/node_modules/projectstore/templates/zh/story.md.tmpl +76 -0
  153. package/node_modules/projectstore/templates/zh/strings.json +6 -0
  154. package/package.json +36 -14
  155. package/plugin.json +53 -0
  156. package/skills/projectstore-adr/SKILL.md +76 -0
  157. package/skills/projectstore-agents/SKILL.md +50 -0
  158. package/skills/projectstore-archaeologist/SKILL.md +109 -0
  159. package/skills/projectstore-bind/SKILL.md +44 -0
  160. package/skills/projectstore-clerk/SKILL.md +126 -0
  161. package/skills/projectstore-codemap/SKILL.md +69 -0
  162. package/skills/projectstore-concept/SKILL.md +36 -0
  163. package/skills/projectstore-critic/SKILL.md +127 -0
  164. package/skills/projectstore-decision-detector/SKILL.md +59 -0
  165. package/skills/projectstore-doctor/SKILL.md +33 -0
  166. package/skills/projectstore-epic/SKILL.md +59 -0
  167. package/skills/projectstore-graph/SKILL.md +75 -0
  168. package/skills/projectstore-kanban/SKILL.md +60 -0
  169. package/skills/projectstore-librarian/SKILL.md +114 -0
  170. package/skills/projectstore-meeting/SKILL.md +36 -0
  171. package/skills/projectstore-peer-reviewer/SKILL.md +57 -0
  172. package/skills/projectstore-planner/SKILL.md +113 -0
  173. package/skills/projectstore-reconcile/SKILL.md +92 -0
  174. package/skills/projectstore-research/SKILL.md +36 -0
  175. package/skills/projectstore-review/SKILL.md +108 -0
  176. package/skills/projectstore-reviewer/SKILL.md +131 -0
  177. package/skills/projectstore-runbook/SKILL.md +36 -0
  178. package/skills/projectstore-scaffold/SKILL.md +42 -0
  179. package/skills/projectstore-search/SKILL.md +41 -0
  180. package/skills/projectstore-spec/SKILL.md +110 -0
  181. package/skills/projectstore-status/SKILL.md +47 -0
  182. package/skills/projectstore-statusline/SKILL.md +29 -0
  183. package/skills/projectstore-story/SKILL.md +132 -0
  184. package/skills/projectstore-story-completion/SKILL.md +69 -0
  185. package/skills/projectstore-vault-communication/SKILL.md +115 -0
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "projectstore",
3
+ "version": "0.28.1",
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
+ "author": {
6
+ "name": "Evgenii Konev",
7
+ "email": "ekonev@smartandpoint.com",
8
+ "url": "https://github.com/SmartAndPoint"
9
+ },
10
+ "homepage": "https://github.com/SmartAndPoint/ProjectStore#readme",
11
+ "repository": "git+https://github.com/SmartAndPoint/ProjectStore.git",
12
+ "license": "MIT",
13
+ "keywords": [
14
+ "project-management",
15
+ "adr",
16
+ "epics",
17
+ "stories",
18
+ "kanban",
19
+ "obsidian",
20
+ "markdown",
21
+ "knowledge-base",
22
+ "engineering-process",
23
+ "claude-code",
24
+ "codex",
25
+ "agentic",
26
+ "ai-agents"
27
+ ],
28
+ "skills": "./skills/",
29
+ "interface": {
30
+ "displayName": "ProjectStore",
31
+ "shortDescription": "Versioned project memory for developer teams and agents.",
32
+ "longDescription": "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.",
33
+ "developerName": "SmartAndPoint",
34
+ "category": "Developer Tools",
35
+ "capabilities": [
36
+ "Project memory",
37
+ "Architecture decisions",
38
+ "Planning",
39
+ "Peer review"
40
+ ],
41
+ "websiteURL": "https://github.com/SmartAndPoint/ProjectStore#readme",
42
+ "defaultPrompt": [
43
+ "Show the current ProjectStore status and work in progress.",
44
+ "Capture this technical decision as a ProjectStore ADR.",
45
+ "Plan the next ProjectStore story, then review the implementation."
46
+ ]
47
+ }
48
+ }
package/README.md CHANGED
@@ -1,19 +1,27 @@
1
1
  # projectstore-codex
2
2
 
3
- **This is a reserved name, not a product.** Install [`projectstore`](https://www.npmjs.com/package/projectstore) instead:
3
+ The Codex installer for [ProjectStore](https://github.com/SmartAndPoint/ProjectStore). It ships a canonical portable `plugin.json`, rendered namespaced workflow skills, lifecycle hooks, and the ProjectStore core pinned at the exact same version and bundled inside the tarball.
4
+
5
+ From a terminal in your project:
4
6
 
5
7
  ```sh
6
- npm install projectstore
8
+ npx projectstore-codex install --project "$PWD"
7
9
  ```
8
10
 
9
- Codex installs the very same `projectstore` package through a marketplace entry. This name is reserved so it cannot be taken and made to look official.
11
+ The installer previews every mutation, stages a stable local marketplace under `CODEX_HOME`, asks Codex's own CLI to install the plugin, and verifies the materialised cache by version and payload digest. Restart Codex, approve the ProjectStore hooks when prompted, then run `$projectstore-bind <vault-path>`. Codex picks up hook changes late: a release that changes hooks may take effect only in the session after next.
12
+
13
+ Upgrade with `npx projectstore-codex@<version> upgrade --project "$PWD"`. Project uninstall leaves the user-global Codex plugin in place; `uninstall --global` is the explicit machine-wide removal.
14
+
15
+ Codex support is **experimental**: see [`docs/harnesses.md`](https://github.com/SmartAndPoint/ProjectStore/blob/main/docs/harnesses.md) for what has been measured and what has not. Hooks start `node` from the Codex process's own `PATH`, so start Codex from a terminal where `node` resolves.
10
16
 
11
- ProjectStore ships as **one package carrying every harness's manifest** —
12
- Claude Code, Codex, opencode and an MCP server all install the same tree. That
13
- decision is recorded in the project's architecture decision records.
17
+ To exercise the same npx path from a checkout, against a built tarball:
18
+
19
+ ```sh
20
+ npm run shells:build -- --only projectstore-codex --dev --out dist
21
+ npx --package "./dist/projectstore-codex-$(node -p 'require("./package.json").version').tgz" projectstore-codex install --project "$PWD"
22
+ ```
14
23
 
15
24
  - Source: https://github.com/SmartAndPoint/ProjectStore
16
25
  - Issues: https://github.com/SmartAndPoint/ProjectStore/issues
17
- - Author: Evgenii Konev (SmartAndPoint)
18
26
 
19
27
  MIT licensed.
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env node
2
+ // projectstore-codex — the Codex distribution shell of projectstore.
3
+ // RENDERED by packaging/shells.mjs from its template: edit the template, then
4
+ // `node packaging/shells.mjs --write`. A hand edit here fails --check.
5
+ //
6
+ // A shell is a bin and a pin, never logic (the layout spec, contract 10): this
7
+ // file locates the core the tarball bundles and execs it with
8
+ // `--harness codex` inserted after a verb that takes it. Every other
9
+ // argument passes through, so `projectstore-codex <verb> …` is exactly
10
+ // `projectstore <verb> --harness codex …` — the same preview, the
11
+ // same files, the same exit code. Naming the shell is the confirmation the
12
+ // core's install gate asks for, exactly as naming --harness is.
13
+ import { existsSync } from "node:fs";
14
+ import { spawnSync } from "node:child_process";
15
+ import { constants as osConstants } from "node:os";
16
+ import { resolve, dirname } from "node:path";
17
+ import { fileURLToPath } from "node:url";
18
+
19
+ const SHELL = "projectstore-codex";
20
+ const HARNESS = "codex";
21
+ // The verbs of the core's table that declare --harness (rendered from
22
+ // scripts/cli.mjs; the packaging test pins it). Any other verb — doctor,
23
+ // status, search, --version — passes through untouched: the core refuses an
24
+ // option a verb does not declare, so a blanket insert would break `doctor`.
25
+ const HARNESS_VERBS = new Set(["plan","install","uninstall","upgrade","agents"]);
26
+
27
+ // The bundled core, by path — never by package resolution: a hoisted or global
28
+ // copy at another version is exactly the pairing the pin exists to prevent,
29
+ // and the core's file layout is not an API (the shells ADR, decision 5).
30
+ const root = resolve(dirname(fileURLToPath(import.meta.url)), "..");
31
+ const CANDIDATES = [
32
+ resolve(root, "node_modules", "projectstore", "bin", "projectstore.mjs"), // bundled — the release shape
33
+ resolve(root, "core", "bin", "projectstore.mjs"), // vendored — the shells ADR's fallback
34
+ ];
35
+
36
+ // Inserts --harness after the verb (the first positional) when that verb takes
37
+ // it; refuses another harness; never duplicates one already given. Scans up to
38
+ // a bare "--". A verb that is not the first positional (`--project x install`)
39
+ // is left alone: the core then asks for --harness itself, a usage error, never
40
+ // a wrong write.
41
+ function fixHarness(argv) {
42
+ const stop = argv.indexOf("--");
43
+ const scan = stop === -1 ? argv : argv.slice(0, stop);
44
+ const given = [];
45
+ const dangling = { error: `\`--harness\` is given without a value — this shell fixes it to ${HARNESS}; drop the flag` };
46
+ for (let i = 0; i < scan.length; i++) {
47
+ if (scan[i] === "--harness") {
48
+ const v = scan[i + 1];
49
+ if (v === undefined || v.startsWith("-")) return dangling;
50
+ given.push(v); i++;
51
+ } else if (scan[i].startsWith("--harness=")) {
52
+ const v = scan[i].slice("--harness=".length);
53
+ if (!v) return dangling;
54
+ given.push(v);
55
+ }
56
+ }
57
+ const other = given.find((g) => g !== HARNESS);
58
+ if (other !== undefined) return { error: `installs for ${HARNESS} only — \`--harness ${other}\` names another harness. Run that harness's shell, or the core: npx projectstore <verb> --harness ${other} …` };
59
+ if (given.length) return { argv }; // named already: pass through, never twice (the core's option repeats)
60
+ const at = scan.findIndex((a) => !a.startsWith("-"));
61
+ if (at === -1 || !HARNESS_VERBS.has(scan[at])) return { argv };
62
+ return { argv: [...argv.slice(0, at + 1), "--harness", HARNESS, ...argv.slice(at + 1)] };
63
+ }
64
+
65
+ const core = CANDIDATES.find((p) => existsSync(p));
66
+ if (!core) {
67
+ process.stderr.write(`${SHELL}: the bundled core is missing — looked at:\n${CANDIDATES.map((c) => " " + c).join("\n")}\n`);
68
+ process.exitCode = 2;
69
+ } else {
70
+ const fixed = fixHarness(process.argv.slice(2));
71
+ if (fixed.error) {
72
+ process.stderr.write(`${SHELL}: ${fixed.error}\n`);
73
+ process.exitCode = 2;
74
+ } else {
75
+ // stdio inherited: the core's install gate asks on a terminal and refuses
76
+ // without one, so the child must see the real stdin and stdout. No
77
+ // timeout — the child waits on a human at the preview. exitCode, not
78
+ // exit(): the core's own bin says why (a pending write on a pipe).
79
+ const r = spawnSync(process.execPath, [core, ...fixed.argv], {
80
+ stdio: "inherit",
81
+ env: { ...process.env, PROJECTSTORE_DISTRIBUTION_ROOT: root },
82
+ });
83
+ if (r.error) process.stderr.write(`${SHELL}: ${r.error.message}\n`);
84
+ // A signal is relayed the shell way (128 + its number): Ctrl-C at the
85
+ // preview is 130 here as it would be on the core itself.
86
+ process.exitCode = r.status ?? (r.signal ? 128 + (osConstants.signals[r.signal] || 0) : 2);
87
+ }
88
+ }
@@ -0,0 +1,59 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "type": "command",
8
+ "command": "node \"${PLUGIN_ROOT}/node_modules/projectstore/hooks/session-start.mjs\""
9
+ },
10
+ {
11
+ "type": "command",
12
+ "command": "node \"${PLUGIN_ROOT}/node_modules/projectstore/hooks/session-rules.mjs\""
13
+ }
14
+ ]
15
+ }
16
+ ],
17
+ "PreToolUse": [
18
+ {
19
+ "hooks": [
20
+ {
21
+ "type": "command",
22
+ "command": "node \"${PLUGIN_ROOT}/node_modules/projectstore/scripts/touch-session.mjs\""
23
+ }
24
+ ]
25
+ }
26
+ ],
27
+ "PostToolUse": [
28
+ {
29
+ "matcher": "apply_patch",
30
+ "hooks": [
31
+ {
32
+ "type": "command",
33
+ "command": "node \"${PLUGIN_ROOT}/node_modules/projectstore/scripts/touch-session.mjs\""
34
+ }
35
+ ]
36
+ }
37
+ ],
38
+ "Stop": [
39
+ {
40
+ "hooks": [
41
+ {
42
+ "type": "command",
43
+ "command": "node \"${PLUGIN_ROOT}/node_modules/projectstore/hooks/session-stop.mjs\""
44
+ }
45
+ ]
46
+ }
47
+ ],
48
+ "PreCompact": [
49
+ {
50
+ "hooks": [
51
+ {
52
+ "type": "command",
53
+ "command": "node \"${PLUGIN_ROOT}/node_modules/projectstore/hooks/pre-compact.mjs\""
54
+ }
55
+ ]
56
+ }
57
+ ]
58
+ }
59
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
3
+ "name": "SmartAndPoint",
4
+ "description": "Claude Code plugins by SmartAndPoint.",
5
+ "owner": {
6
+ "name": "Evgenii Konev",
7
+ "email": "ekonev@smartandpoint.com",
8
+ "url": "https://github.com/SmartAndPoint"
9
+ },
10
+ "plugins": [
11
+ {
12
+ "name": "projectstore",
13
+ "displayName": "projectstore",
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",
16
+ "author": {
17
+ "name": "Evgenii Konev",
18
+ "email": "ekonev@smartandpoint.com",
19
+ "url": "https://github.com/SmartAndPoint"
20
+ },
21
+ "category": "productivity",
22
+ "homepage": "https://github.com/SmartAndPoint/ProjectStore",
23
+ "tags": [
24
+ "obsidian",
25
+ "markdown",
26
+ "adr",
27
+ "epics",
28
+ "stories",
29
+ "kanban",
30
+ "knowledge-base",
31
+ "engineering-process",
32
+ "llm-wiki"
33
+ ],
34
+ "source": {
35
+ "source": "github",
36
+ "repo": "SmartAndPoint/ProjectStore"
37
+ }
38
+ }
39
+ ]
40
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "projectstore",
3
+ "displayName": "projectstore",
4
+ "version": "0.28.1",
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
+ "author": {
7
+ "name": "Evgenii Konev @ SmartAndPoint",
8
+ "email": "ekonev@smartandpoint.com",
9
+ "url": "https://github.com/SmartAndPoint"
10
+ },
11
+ "homepage": "https://github.com/SmartAndPoint/ProjectStore",
12
+ "repository": "https://github.com/SmartAndPoint/ProjectStore",
13
+ "license": "MIT",
14
+ "keywords": [
15
+ "project-management",
16
+ "adr",
17
+ "epics",
18
+ "kanban",
19
+ "obsidian",
20
+ "markdown",
21
+ "engineering-process"
22
+ ]
23
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "mcpServers": {
3
+ "projectstore": {
4
+ "type": "stdio",
5
+ "command": "node",
6
+ "args": [
7
+ "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs",
8
+ "mcp",
9
+ "--project",
10
+ "${CLAUDE_PROJECT_DIR}"
11
+ ]
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,26 @@
1
+ <!-- projectstore:agents v4 (managed by projectstore — edit outside markers) -->
2
+ ## projectstore agents
3
+
4
+ - **A feature-sized request opens a vault artifact before it opens an editor.**
5
+ Analysis → placement (which epic, which story) → an ADR and/or spec when the
6
+ "how" is non-trivial → `projectstore:critic` → only then implementation →
7
+ `projectstore:reviewer`. "Feature-sized" is not a judgement about how the
8
+ request was phrased — it is about what the work touches: if you are about to
9
+ write across several source files, open the story first.
10
+ - **Report instruction conflicts; do not arbitrate them.** If a session-level or
11
+ harness-level instruction contradicts this block, say so and ask which wins.
12
+ Resolving it silently is how the contradiction becomes invisible to the person
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
+ where `<name>` is the **bare** agent name (`critic` for `projectstore:critic`),
17
+ and pass it as the spawn's model parameter. No key — pass nothing.
18
+ - After authoring or revising any vault artifact (ADR/research/epic/story) or
19
+ design proposal: run the `projectstore:critic` agent on it before treating it final.
20
+ - Before implementing an epic/story: consult `projectstore:planner` — it plans
21
+ against how prior epics map to the codebase (`code_refs`).
22
+ - After writing code, before commit / story-done: run `projectstore:reviewer` —
23
+ it verifies the diff actually closes the story's acceptance criteria.
24
+ - When discussing vault contents, reference artifacts by their frontmatter
25
+ `title:` (with their parent epic), never by session-invented shorthand.
26
+ <!-- /projectstore:agents -->
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 SmartAndPoint
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,284 @@
1
+ # ProjectStore
2
+
3
+ > Not a memory plugin. ProjectStore is how your AI agent runs the *project* — decisions, specs, epics, stories and a kanban board as plain markdown in git — so the next agent, the next model, or you in six months know exactly **why** everything is the way it is.
4
+
5
+ [![release](https://img.shields.io/github/v/release/SmartAndPoint/ProjectStore?label=release)](https://github.com/SmartAndPoint/ProjectStore/releases) [![license](https://img.shields.io/github/license/SmartAndPoint/ProjectStore?label=license)](./LICENSE) [![Star on GitHub](https://img.shields.io/badge/%E2%AD%90-star_us-yellow?logo=github)](https://github.com/SmartAndPoint/ProjectStore/stargazers)
6
+
7
+ A project workflow plugin for [Claude Code](https://claude.com/claude-code) and [OpenAI Codex](https://developers.openai.com/codex/) (experimental). Both are released together at one version, and each installs with one command.
8
+
9
+ ---
10
+
11
+ ## Two months of agents, and nobody knows why
12
+
13
+ Agents write code fast. They re-decide settled questions even faster: every fresh session arrives empty, makes its own architectural call, and commits under its own assumptions. Two months later you have noodle code — every strand reviews fine on its own, and each was written under a different theory of the project. Ask *"why is this a queue and not a cron job?"* and nobody can answer. The agent that decided is long gone.
14
+
15
+ The fix is not a smarter agent. It is a loop with verification in it.
16
+
17
+ ## The loop
18
+
19
+ 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.
20
+
21
+ <picture>
22
+ <source media="(prefers-color-scheme: dark)" srcset="docs/images/loop.svg">
23
+ <img alt="The ProjectStore loop: task → artifact → critic (verify) → backlog → planner → implement → reviewer (verify) → done → views regenerate" src="docs/images/loop-light.svg">
24
+ </picture>
25
+
26
+ 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.
27
+ 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.
28
+ 3. The fixed artifact lands in the **backlog**; the kanban regenerates itself.
29
+ 4. An agent picks up a story. A **planner** reads how earlier epics actually landed in the code and says where this change belongs.
30
+ 5. A **reviewer** matches the diff against the story's acceptance criteria — per criterion, with evidence — before anything gets called done.
31
+ 6. **Done.** Board, link graph and code map regenerate. The next session starts oriented instead of guessing.
32
+
33
+ Mechanisms hold this together, not discipline: an agent that starts coding with no story open gets nudged, artifacts are not final before review, and a deterministic `doctor` checks the mechanical consistency with zero AI involved. Every *verify* step is a separate fresh-context agent with no stake in the draft it is judging.
34
+
35
+ We build ProjectStore with ProjectStore. The feature that names your session went through exactly this loop — including a critic pass that killed the design's central claim, and a reviewer pass that caught a bug which would have shipped the feature silently dead for every real user.
36
+
37
+ ## What lands on disk
38
+
39
+ Say *"let's go with Postgres, not Mongo — we need transactions"*, approve the draft, and a real file lands:
40
+
41
+ ```markdown
42
+ ---
43
+ title: "Use Postgres for primary storage"
44
+ status: accepted
45
+ date: 2026-07-03
46
+ ---
47
+ ## Context
48
+ We need ACID transactions for order processing...
49
+ ## Decision
50
+ Postgres 16 as the primary store...
51
+ ## Alternatives Considered
52
+ ### MongoDB — rejected because...
53
+ ```
54
+
55
+ Six months later, *"why Postgres?"* has an answer with a date and the alternatives you rejected. Stories work the same way — status in frontmatter, board generated from it — and your status line always shows what *this* session is working on:
56
+
57
+ ![projectstore status line: the 📚 epic › story line sitting above an existing oh-my-claudecode HUD](docs/images/statusline-hud.png)
58
+
59
+ Open the vault in [Obsidian](https://obsidian.md) and you get the graph view and the board for free. Don't use Obsidian? Everything renders on GitHub and in any editor.
60
+
61
+ ## Install — one message
62
+
63
+ Open Claude Code in your project and say:
64
+
65
+ > Install the projectstore plugin from https://github.com/SmartAndPoint/ProjectStore and set it up for this project.
66
+
67
+ That's the whole setup. Claude adds the marketplace, installs the plugin, and walks you through binding a vault, scaffolding it and wiring the status line — every step previewed, nothing written without your Yes.
68
+
69
+ **On Codex**, run one command from a terminal in your project:
70
+
71
+ ```
72
+ npx projectstore-codex install --project "$PWD"
73
+ ```
74
+
75
+ Then restart Codex, approve the ProjectStore hooks when it asks, and run `$projectstore-bind ~/Documents/my-project-vault`. Codex support is newer and still labelled experimental: [`docs/harnesses.md`](./docs/harnesses.md#codex) says what has been verified and what has not. A project can be worked from both agents: they share the binding in `.projectstore/`, and each keeps its own overlay and session state beside it ([running both over one project](./docs/harnesses.md#running-both-over-one-project)).
76
+
77
+ <details>
78
+ <summary>Prefer to type it yourself?</summary>
79
+
80
+ ```
81
+ /plugin marketplace add SmartAndPoint/ProjectStore
82
+ /plugin install projectstore@SmartAndPoint
83
+ /reload-plugins
84
+ /projectstore:bind ~/Documents/my-project-vault
85
+ ```
86
+
87
+ One switch worth flipping: Claude Code does **not** auto-update third-party plugins by default — `/plugin` → **Marketplaces** → **SmartAndPoint** → toggle **auto-update** on. If you skip it, `/projectstore:doctor` will remind you later with the exact setting.
88
+
89
+ Contributors: `git clone` this repo, then `claude --plugin-dir ./ProjectStore`.
90
+
91
+ **Or from npm, in one command** — from a terminal, not inside a Claude Code session:
92
+
93
+ ```
94
+ npx projectstore-claude install --project "$PWD"
95
+ ```
96
+
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
+
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
102
+ the exact bundled core. It stages a stable marketplace under `CODEX_HOME`,
103
+ drives `codex plugin marketplace add` and `codex plugin add`, then reads the
104
+ installation back and verifies its version and payload digest. Restart Codex,
105
+ approve the hooks, and run `$projectstore-bind <vault-path>`. For later
106
+ releases, `npx projectstore-codex@<version> upgrade --project "$PWD"`. Because
107
+ Codex's plugin registry is user-global, ordinary uninstall removes only the
108
+ project's agents block; `uninstall --global` is the explicit machine-wide
109
+ removal. Codex is **experimental** until a live session has exercised every
110
+ surface it installs; [`docs/harnesses.md`](./docs/harnesses.md) says what has
111
+ been measured and what has not. From a checkout, the same npx path runs against
112
+ a built tarball:
113
+
114
+ ```sh
115
+ npm run shells:build -- --only projectstore-codex --dev --out dist
116
+ npx --package "./dist/projectstore-codex-$(node -p 'require("./package.json").version').tgz" projectstore-codex install --project "$PWD"
117
+ ```
118
+
119
+ The package also carries a `bin`. Without a session — in CI, or in a shell — the same core answers token-free, with a `--json` envelope on every verb:
120
+
121
+ ```
122
+ npx projectstore doctor --json
123
+ npx projectstore install --harness claude-code # the low-level form the shell runs: previews, then writes the agents block and the status line; naming the harness is the confirmation, there is no --yes
124
+ npx projectstore reconcile --write --only kanban
125
+ ```
126
+
127
+ Reads too — the same facts the agents get over MCP:
128
+
129
+ ```
130
+ npx projectstore status --json
131
+ npx projectstore search "entry rule" --kind spec
132
+ npx projectstore show adr/README.md --section index
133
+ npx projectstore graph neighbors epics/PS-CORE/epic.md
134
+ npx projectstore codemap --for scripts/lib.mjs
135
+ ```
136
+
137
+ The same eight reads are an MCP server. The plugin registers it through its own `.mcp.json`, so a Claude Code session has `status`, `search`, `get_artifact`, `neighbors`, `lineage`, `code_refs`, `orientation` and `doctor` as tools with no shell; every tool result is the CLI's `--json` for the same arguments. Elsewhere:
138
+
139
+ ```
140
+ npx projectstore mcp --project "$PWD"
141
+ ```
142
+
143
+ Binding, too — naming the vault is the confirmation, and changing it needs `--rebind`:
144
+
145
+ ```
146
+ npx projectstore bind ~/vaults/my-project
147
+ npx projectstore init ~/vaults/new-project --language ru
148
+ ```
149
+
150
+ `projectstore-claude`, `projectstore-codex` and `projectstore-opencode` are this package's per-harness shells — the core pinned and bundled, the harness fixed. The Claude Code and Codex shells are published at the core's version; Codex stays labelled experimental until a live run has exercised every surface it installs ([`docs/harnesses.md`](./docs/harnesses.md)). The opencode shell publishes after its plugin root is rendered. The other `projectstore-*` names are reserved placeholders pointing back here. One source package, one version, N tarballs.
151
+ </details>
152
+
153
+ ## Upgrading
154
+
155
+ `/plugin update` (or auto-update) and a restart, then one command per project
156
+ bound before 0.28. What an existing project sees afterwards, and why:
157
+
158
+ - **The project's files move to `.projectstore/`.** `.claude/projectstore.json`
159
+ and `.claude/.projectstore/` become `.projectstore/projectstore.json`,
160
+ `.projectstore/harness/claude-code.json` and `.projectstore/state/`. Nothing
161
+ breaks before you move them: every reader falls back to the old paths through
162
+ 0.29, and the startup line names the command until the move is done. Close
163
+ every Claude Code session in the project, run that command from a terminal,
164
+ then restart. The command depends on how you installed:
165
+ - **From the git marketplace** (every 0.27.x install): the installed copy's
166
+ own `bin/projectstore.mjs`, with its path spelled out in the startup line —
167
+ `node "<plugin cache>/bin/projectstore.mjs" upgrade --harness claude-code --no-register --project "$PWD"`.
168
+ `--no-register` leaves your plugin registration as it is.
169
+ - **From npm**: `npx projectstore-claude@<version> upgrade --no-register --project "$PWD"`.
170
+
171
+ Both forms move only the project's files, so neither touches your plugin
172
+ registration. The same run re-stamps the status-line launcher at its new path
173
+ and re-registers the agents block, whose template is now v4. A plain
174
+ `npx projectstore-claude upgrade` on a git-marketplace install does more: it
175
+ also registers the plugin from npm for this checkout and turns the
176
+ git-marketplace copy off here, so `/plugin update` stops reaching the
177
+ checkout. The 0.28.0-rc.1 and rc.2 startup lines named that shell form
178
+ (`npx projectstore-claude@<version> upgrade`, without `--no-register`), so on
179
+ those, update first and run what the new startup line names. If it already
180
+ happened,
181
+ `npx projectstore-claude@<version> uninstall --surface plugin --project "$PWD"`
182
+ (0.28.0 or later) turns the git-marketplace copy back on. That copy must be 0.28 or later — an
183
+ older one reads a moved project as unbound — so update it first if it is not.
184
+ Restart, then run
185
+ `/projectstore:doctor --fix` in the new session, which re-stamps the status
186
+ line against that copy.
187
+ - **The status line keeps rendering.** A launcher written by an earlier version
188
+ still works, but it carries no file stamp and its embedded fallback root is
189
+ frozen at the old version; the move above re-stamps it. Nothing rewrites that
190
+ file behind your back any more: first wiring and refresh are `install`'s,
191
+ behind a preview.
192
+ - **`/projectstore:status` and `/projectstore:search` answer differently:**
193
+ facts from artifact frontmatter and the derived views' freshness instead
194
+ of an `mtime` walk; a literal, bounded, grouped search instead of a shell
195
+ `grep`. Every other command prints what it printed before.
196
+ - **`/projectstore:doctor` has new lines** — the state of each installed
197
+ surface, a version-drift check across plugin versions, and one permanent
198
+ info line saying the MCP read tools are registered. Its exit code now
199
+ carries the verdict (1 = findings), so a red Bash result is findings, not
200
+ a crash.
201
+ - **The plugin registers an MCP server** (eight read-only tools over the
202
+ vault). Claude Code may ask you to approve it once.
203
+ - **The agents block stays where Claude Code reads it.** In a project with an
204
+ `AGENTS.md`, the block goes there and `CLAUDE.md` carries a one-line
205
+ `@AGENTS.md` import; otherwise the block goes into `CLAUDE.md`. A project with
206
+ an `AGENTS.md` and no `CLAUDE.md` now gains that one-line `CLAUDE.md`.
207
+ - **The passive skills are published under the `projectstore-` prefix**
208
+ (`projectstore-decision-detector`, `projectstore-peer-reviewer`,
209
+ `projectstore-story-completion`, `projectstore-vault-communication`). Nothing
210
+ in a project names them; only a skill listing shows the new names.
211
+ - **Rolling back** to 0.27.x before the move: everything keeps working, since
212
+ 0.27.x still reads the old layout. It rewrites the status-line launcher in its
213
+ own form, as it always did; coming forward again, the startup line names the
214
+ move once more, and the move re-stamps the launcher. If a session already
215
+ re-stamped the status line or re-registered the agents block before the move
216
+ (rc.2's `/projectstore:doctor --fix` did both), 0.27.x reports a foreign
217
+ status line and a v4 block and leaves both alone — unless you run its
218
+ `/projectstore:agents register`, which rewrites the block; the status line
219
+ still renders, and the move settles both.
220
+ - **Rolling back** to 0.27.x after the move: 0.27.x looks for its binding under
221
+ `.claude/`, finds none and offers `bind`. Do not accept. A re-bind writes
222
+ `.claude/projectstore.json` again, and 0.28's `install` and `upgrade` refuse
223
+ while two bindings exist. To come forward again, delete
224
+ `.claude/projectstore.json`, then run the command the startup line names
225
+ once more: a 0.27.x session writes its welcome marker back under `.claude/`.
226
+ - **Installed from npm?** Then `/plugin update` has nothing to fetch: the
227
+ registration is refreshed by the package itself — from a terminal outside
228
+ the session, `npx projectstore-claude@<version> upgrade --project "$PWD"`
229
+ rewrites the local marketplace and runs the host's
230
+ `plugin update` for this checkout. `/projectstore:doctor` says when the
231
+ registration is behind the package, and names that command.
232
+
233
+ ## When an agent starts a task, it can find its way
234
+
235
+ Two generated views exist for exactly that moment. `graph.md` holds every artifact's links, typed, in both directions — one grep returns a document's whole neighborhood. `code-map.md` answers where the code for each epic actually lives, so new code lands where the old code already is. And before any architectural choice, the agent is pointed at the ADR index first — which is how settled questions stay settled.
236
+
237
+ ## Teams: many humans, many agents
238
+
239
+ <picture>
240
+ <source media="(prefers-color-scheme: dark)" srcset="docs/images/team.svg">
241
+ <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">
242
+ </picture>
243
+
244
+ 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.
245
+
246
+ Parallel sessions coordinate too: each registers itself, sessions warn each other on the same vault, every status line shows only its own work — and once a session's writing settles on an epic or a document, it gets offered a name to be addressed by. Measured before shipping: roughly one offer per session; the naive "rename on every change" fired 37 times in the worst recorded session, which is why it doesn't do that.
247
+
248
+ ## What it costs — measured, not promised
249
+
250
+ Running the loop is not free, and we will not pretend otherwise. On this very repository — the worst case we know, since here the tool builds itself and every change goes through the full loop — vault work measures **22.5% of total spend**. On a typical project, budget **10–15% of your weekly limit**.
251
+
252
+ What you get for it: a project manager and a systems analyst who never forget to file, made of the same agent you already pay for. The artifacts are not notes-to-self — they are the working backlog, the review record and the decision log of the project.
253
+
254
+ And they are the exit door. The vault is plain markdown in git — no server, no proprietary format, nothing to export. Move to Codex, Gemini or DeepSeek tomorrow and the project continues: the orientation a new agent needs is already on disk, so you spend no tokens re-teaching a model what the project is and why.
255
+
256
+ ## Fact sheet
257
+
258
+ **20 commands** · **6 agents** — critic, planner, reviewer, librarian, archaeologist (the advisors: read-only, fresh-context) and clerk (the sole write-capable one — it executes approved writes, post-gate, and composes nothing) · **6 languages** — en, ru, es, de, fr, zh · zero runtime dependencies
259
+
260
+ The deep dive — real session files, measured payloads, how every mechanism works and where its limits are: [docs/how-it-works.md](./docs/how-it-works.md).
261
+
262
+ ## Philosophy
263
+
264
+ 1. **Markdown + git is the source of truth.** No proprietary format. The plugin can disappear; your project's decisions remain.
265
+ 2. **Obsidian is a view, not a dependency.** Files render on GitHub, in any editor, in `cat`.
266
+ 3. **The agent is a methodologist, not a database.** Skills nudge, commands gate, humans approve.
267
+ 4. **Layouts are opinionated.** v1 ships `engineering`; community adds `data-analytics`, `product`, `chatbot`, `library`.
268
+ 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.
269
+
270
+ ## Uninstalling
271
+
272
+ `/plugin uninstall projectstore@SmartAndPoint` for a Claude git-marketplace install; `npx projectstore-claude uninstall --project "$PWD"` for its npm registration. For Codex, `npx projectstore-codex uninstall --project "$PWD"` removes only project-owned wiring; add `--global` only to remove the user-global Codex plugin and marketplace. Your vault is yours — plain markdown, untouched. One leftover of a host-managed plugin path can be the agents block in `CLAUDE.md`/`AGENTS.md`; remove it with the harness's agents unregister skill, or delete everything between `<!-- projectstore:agents … -->` and `<!-- /projectstore:agents -->` by hand. `uninstall` leaves a block that lives in `AGENTS.md`, because that file is read by other coding agents too, and removes the `CLAUDE.md` import when that file holds nothing else; `uninstall --surface agents_block` removes the block as well.
273
+
274
+ ## Extending
275
+
276
+ See [`docs/extending.md`](./docs/extending.md) for adding layouts, templates, and skills, and [`docs/harnesses.md`](./docs/harnesses.md) for which coding agents projectstore runs on — what "experimental" means there, and what adding one takes.
277
+
278
+ ## Contributing
279
+
280
+ 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).
281
+
282
+ ## License
283
+
284
+ MIT — see [`LICENSE`](./LICENSE).