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.
- package/.codex-plugin/plugin.json +48 -0
- package/README.md +15 -7
- package/bin/projectstore-codex.mjs +88 -0
- package/hooks/hooks.json +59 -0
- package/node_modules/projectstore/.claude-plugin/marketplace.json +40 -0
- package/node_modules/projectstore/.claude-plugin/plugin.json +23 -0
- package/node_modules/projectstore/.mcp.json +14 -0
- package/node_modules/projectstore/AGENTS.md +26 -0
- package/node_modules/projectstore/LICENSE +21 -0
- package/node_modules/projectstore/README.md +284 -0
- package/node_modules/projectstore/agents/archaeologist.md +76 -0
- package/node_modules/projectstore/agents/clerk.md +93 -0
- package/node_modules/projectstore/agents/critic.md +94 -0
- package/node_modules/projectstore/agents/librarian.md +81 -0
- package/node_modules/projectstore/agents/planner.md +80 -0
- package/node_modules/projectstore/agents/reviewer.md +98 -0
- package/node_modules/projectstore/bin/projectstore.mjs +7 -0
- package/node_modules/projectstore/commands/adr.md +57 -0
- package/node_modules/projectstore/commands/agents.md +180 -0
- package/node_modules/projectstore/commands/bind.md +128 -0
- package/node_modules/projectstore/commands/codemap.md +50 -0
- package/node_modules/projectstore/commands/concept.md +17 -0
- package/node_modules/projectstore/commands/doctor.md +166 -0
- package/node_modules/projectstore/commands/epic.md +40 -0
- package/node_modules/projectstore/commands/graph.md +56 -0
- package/node_modules/projectstore/commands/kanban.md +40 -0
- package/node_modules/projectstore/commands/meeting.md +17 -0
- package/node_modules/projectstore/commands/reconcile.md +73 -0
- package/node_modules/projectstore/commands/research.md +17 -0
- package/node_modules/projectstore/commands/review.md +89 -0
- package/node_modules/projectstore/commands/runbook.md +17 -0
- package/node_modules/projectstore/commands/scaffold.md +23 -0
- package/node_modules/projectstore/commands/search.md +22 -0
- package/node_modules/projectstore/commands/spec.md +91 -0
- package/node_modules/projectstore/commands/status.md +27 -0
- package/node_modules/projectstore/commands/statusline.md +46 -0
- package/node_modules/projectstore/commands/story.md +113 -0
- package/node_modules/projectstore/docs/extending.md +172 -0
- package/node_modules/projectstore/docs/getting-started.md +133 -0
- package/node_modules/projectstore/docs/harnesses.md +163 -0
- package/node_modules/projectstore/docs/how-it-works.md +263 -0
- package/node_modules/projectstore/docs/images/loop-light.svg +94 -0
- package/node_modules/projectstore/docs/images/loop.svg +93 -0
- package/node_modules/projectstore/docs/images/statusline-hud.png +0 -0
- package/node_modules/projectstore/docs/images/team-light.svg +79 -0
- package/node_modules/projectstore/docs/images/team.svg +79 -0
- package/node_modules/projectstore/harnesses/claude-code.json +483 -0
- package/node_modules/projectstore/harnesses/codex.json +332 -0
- package/node_modules/projectstore/hooks/hooks.json +59 -0
- package/node_modules/projectstore/hooks/pre-compact.mjs +121 -0
- package/node_modules/projectstore/hooks/session-rules.mjs +63 -0
- package/node_modules/projectstore/hooks/session-start.mjs +301 -0
- package/node_modules/projectstore/hooks/session-stop.mjs +84 -0
- package/node_modules/projectstore/package.json +70 -0
- package/node_modules/projectstore/scaffold/checklists.json +88 -0
- package/node_modules/projectstore/scaffold/headings.json +171 -0
- package/node_modules/projectstore/scaffold/layouts/engineering.json +85 -0
- package/node_modules/projectstore/scripts/binding.mjs +165 -0
- package/node_modules/projectstore/scripts/build-adapters.mjs +264 -0
- package/node_modules/projectstore/scripts/cli.mjs +595 -0
- package/node_modules/projectstore/scripts/codemap.mjs +99 -0
- package/node_modules/projectstore/scripts/diff-refs.mjs +127 -0
- package/node_modules/projectstore/scripts/doctor.mjs +2127 -0
- package/node_modules/projectstore/scripts/draft.mjs +261 -0
- package/node_modules/projectstore/scripts/graph.mjs +219 -0
- package/node_modules/projectstore/scripts/harness.mjs +608 -0
- package/node_modules/projectstore/scripts/install-harness.mjs +1387 -0
- package/node_modules/projectstore/scripts/kanban.mjs +174 -0
- package/node_modules/projectstore/scripts/lib.mjs +3085 -0
- package/node_modules/projectstore/scripts/mcp.mjs +391 -0
- package/node_modules/projectstore/scripts/portable-registration.mjs +198 -0
- package/node_modules/projectstore/scripts/provenance.mjs +375 -0
- package/node_modules/projectstore/scripts/query.mjs +490 -0
- package/node_modules/projectstore/scripts/reconcile.mjs +422 -0
- package/node_modules/projectstore/scripts/statusline-launcher.mjs +141 -0
- package/node_modules/projectstore/scripts/statusline.mjs +253 -0
- package/node_modules/projectstore/scripts/story-section.mjs +209 -0
- package/node_modules/projectstore/scripts/surfaces.mjs +421 -0
- package/node_modules/projectstore/scripts/tokens.mjs +449 -0
- package/node_modules/projectstore/scripts/touch-session.mjs +336 -0
- package/node_modules/projectstore/scripts/version-guard.mjs +255 -0
- package/node_modules/projectstore/scripts/worktree.mjs +109 -0
- package/node_modules/projectstore/skills/projectstore-decision-detector/SKILL.md +40 -0
- package/node_modules/projectstore/skills/projectstore-peer-reviewer/SKILL.md +38 -0
- package/node_modules/projectstore/skills/projectstore-story-completion/SKILL.md +50 -0
- package/node_modules/projectstore/skills/projectstore-vault-communication/SKILL.md +96 -0
- package/node_modules/projectstore/templates/claude-md-block.md.tmpl +26 -0
- package/node_modules/projectstore/templates/de/adr.md.tmpl +67 -0
- package/node_modules/projectstore/templates/de/concept.md.tmpl +43 -0
- package/node_modules/projectstore/templates/de/epic.md.tmpl +59 -0
- package/node_modules/projectstore/templates/de/folder-readme.md.tmpl +14 -0
- package/node_modules/projectstore/templates/de/kanban.md.tmpl +36 -0
- package/node_modules/projectstore/templates/de/meeting.md.tmpl +38 -0
- package/node_modules/projectstore/templates/de/research.md.tmpl +47 -0
- package/node_modules/projectstore/templates/de/runbook.md.tmpl +53 -0
- package/node_modules/projectstore/templates/de/spec.md.tmpl +64 -0
- package/node_modules/projectstore/templates/de/story.md.tmpl +76 -0
- package/node_modules/projectstore/templates/de/strings.json +6 -0
- package/node_modules/projectstore/templates/en/adr.md.tmpl +67 -0
- package/node_modules/projectstore/templates/en/concept.md.tmpl +43 -0
- package/node_modules/projectstore/templates/en/epic.md.tmpl +59 -0
- package/node_modules/projectstore/templates/en/folder-readme.md.tmpl +14 -0
- package/node_modules/projectstore/templates/en/kanban.md.tmpl +36 -0
- package/node_modules/projectstore/templates/en/meeting.md.tmpl +38 -0
- package/node_modules/projectstore/templates/en/research.md.tmpl +47 -0
- package/node_modules/projectstore/templates/en/runbook.md.tmpl +53 -0
- package/node_modules/projectstore/templates/en/spec.md.tmpl +64 -0
- package/node_modules/projectstore/templates/en/story.md.tmpl +76 -0
- package/node_modules/projectstore/templates/en/strings.json +6 -0
- package/node_modules/projectstore/templates/es/adr.md.tmpl +67 -0
- package/node_modules/projectstore/templates/es/concept.md.tmpl +43 -0
- package/node_modules/projectstore/templates/es/epic.md.tmpl +59 -0
- package/node_modules/projectstore/templates/es/folder-readme.md.tmpl +14 -0
- package/node_modules/projectstore/templates/es/kanban.md.tmpl +36 -0
- package/node_modules/projectstore/templates/es/meeting.md.tmpl +38 -0
- package/node_modules/projectstore/templates/es/research.md.tmpl +47 -0
- package/node_modules/projectstore/templates/es/runbook.md.tmpl +53 -0
- package/node_modules/projectstore/templates/es/spec.md.tmpl +64 -0
- package/node_modules/projectstore/templates/es/story.md.tmpl +76 -0
- package/node_modules/projectstore/templates/es/strings.json +6 -0
- package/node_modules/projectstore/templates/fr/adr.md.tmpl +67 -0
- package/node_modules/projectstore/templates/fr/concept.md.tmpl +43 -0
- package/node_modules/projectstore/templates/fr/epic.md.tmpl +59 -0
- package/node_modules/projectstore/templates/fr/folder-readme.md.tmpl +14 -0
- package/node_modules/projectstore/templates/fr/kanban.md.tmpl +36 -0
- package/node_modules/projectstore/templates/fr/meeting.md.tmpl +38 -0
- package/node_modules/projectstore/templates/fr/research.md.tmpl +47 -0
- package/node_modules/projectstore/templates/fr/runbook.md.tmpl +53 -0
- package/node_modules/projectstore/templates/fr/spec.md.tmpl +64 -0
- package/node_modules/projectstore/templates/fr/story.md.tmpl +76 -0
- package/node_modules/projectstore/templates/fr/strings.json +6 -0
- package/node_modules/projectstore/templates/ru/adr.md.tmpl +67 -0
- package/node_modules/projectstore/templates/ru/concept.md.tmpl +43 -0
- package/node_modules/projectstore/templates/ru/epic.md.tmpl +59 -0
- package/node_modules/projectstore/templates/ru/folder-readme.md.tmpl +14 -0
- package/node_modules/projectstore/templates/ru/kanban.md.tmpl +36 -0
- package/node_modules/projectstore/templates/ru/meeting.md.tmpl +38 -0
- package/node_modules/projectstore/templates/ru/research.md.tmpl +47 -0
- package/node_modules/projectstore/templates/ru/runbook.md.tmpl +53 -0
- package/node_modules/projectstore/templates/ru/spec.md.tmpl +64 -0
- package/node_modules/projectstore/templates/ru/story.md.tmpl +76 -0
- package/node_modules/projectstore/templates/ru/strings.json +6 -0
- package/node_modules/projectstore/templates/zh/adr.md.tmpl +67 -0
- package/node_modules/projectstore/templates/zh/concept.md.tmpl +43 -0
- package/node_modules/projectstore/templates/zh/epic.md.tmpl +59 -0
- package/node_modules/projectstore/templates/zh/folder-readme.md.tmpl +14 -0
- package/node_modules/projectstore/templates/zh/kanban.md.tmpl +36 -0
- package/node_modules/projectstore/templates/zh/meeting.md.tmpl +38 -0
- package/node_modules/projectstore/templates/zh/research.md.tmpl +47 -0
- package/node_modules/projectstore/templates/zh/runbook.md.tmpl +53 -0
- package/node_modules/projectstore/templates/zh/spec.md.tmpl +64 -0
- package/node_modules/projectstore/templates/zh/story.md.tmpl +76 -0
- package/node_modules/projectstore/templates/zh/strings.json +6 -0
- package/package.json +36 -14
- package/plugin.json +53 -0
- package/skills/projectstore-adr/SKILL.md +76 -0
- package/skills/projectstore-agents/SKILL.md +50 -0
- package/skills/projectstore-archaeologist/SKILL.md +109 -0
- package/skills/projectstore-bind/SKILL.md +44 -0
- package/skills/projectstore-clerk/SKILL.md +126 -0
- package/skills/projectstore-codemap/SKILL.md +69 -0
- package/skills/projectstore-concept/SKILL.md +36 -0
- package/skills/projectstore-critic/SKILL.md +127 -0
- package/skills/projectstore-decision-detector/SKILL.md +59 -0
- package/skills/projectstore-doctor/SKILL.md +33 -0
- package/skills/projectstore-epic/SKILL.md +59 -0
- package/skills/projectstore-graph/SKILL.md +75 -0
- package/skills/projectstore-kanban/SKILL.md +60 -0
- package/skills/projectstore-librarian/SKILL.md +114 -0
- package/skills/projectstore-meeting/SKILL.md +36 -0
- package/skills/projectstore-peer-reviewer/SKILL.md +57 -0
- package/skills/projectstore-planner/SKILL.md +113 -0
- package/skills/projectstore-reconcile/SKILL.md +92 -0
- package/skills/projectstore-research/SKILL.md +36 -0
- package/skills/projectstore-review/SKILL.md +108 -0
- package/skills/projectstore-reviewer/SKILL.md +131 -0
- package/skills/projectstore-runbook/SKILL.md +36 -0
- package/skills/projectstore-scaffold/SKILL.md +42 -0
- package/skills/projectstore-search/SKILL.md +41 -0
- package/skills/projectstore-spec/SKILL.md +110 -0
- package/skills/projectstore-status/SKILL.md +47 -0
- package/skills/projectstore-statusline/SKILL.md +29 -0
- package/skills/projectstore-story/SKILL.md +132 -0
- package/skills/projectstore-story-completion/SKILL.md +69 -0
- package/skills/projectstore-vault-communication/SKILL.md +115 -0
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Harness capability manifest — Claude Code. This is the SOURCE layout (generation spec, contract 2): the plugin's own commands/, agents/, skills/ and hooks/hooks.json are already in Claude Code's shapes, so nothing is emitted for it (emit: false). The manifest still exists in full because the portability lint reads every harness's vocabulary, and a token only Claude Code understands is only detectable as unmapped in another harness's tree if Claude Code's own names are written down somewhere. It carries no `lint` block and an empty `rewrites` because linting runs over emitted trees only. Shape contributed by Maxim Podreshetnikov (PR #13); `verified`, `output_channels`, `scope_reason`, `root_placeholder_literal` and `agent_overrides` are the spec's additions.",
|
|
3
|
+
"id": "claude-code",
|
|
4
|
+
"display_name": "Claude Code",
|
|
5
|
+
"emit": false,
|
|
6
|
+
"source_layout": true,
|
|
7
|
+
"output_dir": null,
|
|
8
|
+
"docs": "https://code.claude.com/docs",
|
|
9
|
+
"verified": {
|
|
10
|
+
"session": "the shipped plugin's own hooks, run continuously in this repository under Claude Code 2.1.163+ — not one session but daily operation; each output_channels row cites where the fact is observed",
|
|
11
|
+
"date": "2026-09-04"
|
|
12
|
+
},
|
|
13
|
+
"install": {
|
|
14
|
+
"mechanism": "the package's own registration through its distribution shell, or the built-in plugin marketplace",
|
|
15
|
+
"shell": "projectstore-claude",
|
|
16
|
+
"shell_reason": "the distribution shell that installs this harness from npm (the layout ADR decision 6; the shells ADR): `npx projectstore-claude install --project <dir>` is the core's `install --harness claude-code`, with the core pinned at the same version and bundled inside the shell's tarball. Data, not `projectstore-<id>`: the id is claude-code and the reserved, published name is projectstore-claude. Every command a finding or a deferred reason names is built from this key (harness.mjs packageCommand).",
|
|
17
|
+
"why_not_scripted": "Two channels. `npx projectstore-claude install --project <dir>` registers the plugin for that project from the npm package itself — the shell bundles the core and fixes the harness; the core's low-level form is `npx projectstore install --harness claude-code --project <dir>` — through a local marketplace under the Claude home, driven by Claude Code's own `claude plugin` CLI. `/plugin install projectstore@SmartAndPoint` installs it from the git marketplace. `/plugin` lists and toggles either. Upgrading the npm registration is `npx projectstore-claude@<version> upgrade --project <dir>` — that is also the pin.",
|
|
18
|
+
"steps": [
|
|
19
|
+
"npx projectstore-claude install --project \"$PWD\" (npm; registers the plugin for this project — the shell runs the core's install with the harness fixed)",
|
|
20
|
+
"/plugin marketplace add SmartAndPoint/ProjectStore && /plugin install projectstore@SmartAndPoint (git marketplace, user-wide)",
|
|
21
|
+
"restart Claude Code"
|
|
22
|
+
],
|
|
23
|
+
"notes": [
|
|
24
|
+
"Git marketplace only: auto-update is OFF by default for third-party plugins: /plugin -> Marketplaces -> SmartAndPoint -> toggle auto-update. The npm registration updates when you run `npx projectstore-claude upgrade --project <dir>`.",
|
|
25
|
+
"Pin a git-marketplace release with: /plugin marketplace add SmartAndPoint/ProjectStore#<tag>; pin the npm registration with npx projectstore-claude@<version>.",
|
|
26
|
+
"Two enabled copies of the plugin (git marketplace and npm) in one checkout would load twice; the npm registration silences the other one for that checkout only (settings.local.json), and says so in its preview.",
|
|
27
|
+
"From a checkout instead: claude --plugin-dir ./ProjectStore",
|
|
28
|
+
"The npm registration is per checkout (local scope) and per machine; a fresh clone or a new worktree runs the install command again. It must run from a terminal outside a Claude Code session: the host CLI and a live session both rewrite settings files."
|
|
29
|
+
],
|
|
30
|
+
"docs": "https://github.com/SmartAndPoint/ProjectStore#install--one-message"
|
|
31
|
+
},
|
|
32
|
+
"runtime": {
|
|
33
|
+
"detect_env": [
|
|
34
|
+
"CLAUDE_PLUGIN_ROOT",
|
|
35
|
+
"CLAUDE_PROJECT_DIR",
|
|
36
|
+
"CLAUDE_CONFIG_DIR"
|
|
37
|
+
],
|
|
38
|
+
"project_dir_env": "CLAUDE_PROJECT_DIR",
|
|
39
|
+
"plugin_root_env": "CLAUDE_PLUGIN_ROOT",
|
|
40
|
+
"home_env": "CLAUDE_CONFIG_DIR",
|
|
41
|
+
"home_default": ".claude",
|
|
42
|
+
"harness_dir": ".claude",
|
|
43
|
+
"harness_dir_reason": "the harness's own directory in a project: how it is detected, where its settings live — never where projectstore's config is (the layout ADR, 2026-09-06: that is <project>/.projectstore/, one for every harness)",
|
|
44
|
+
"agent_overrides": [
|
|
45
|
+
{
|
|
46
|
+
"env": "CLAUDE_CODE_EFFORT_LEVEL",
|
|
47
|
+
"kind": "effort",
|
|
48
|
+
"beats": "agent frontmatter"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"env": "CLAUDE_CODE_SUBAGENT_MODEL",
|
|
52
|
+
"kind": "model",
|
|
53
|
+
"beats": "every projectstore model configuration, per-invocation parameter included"
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"session_env": [
|
|
57
|
+
"CLAUDECODE"
|
|
58
|
+
],
|
|
59
|
+
"session_env_reason": "set to 1 in every Bash tool of a live session (measured 2026-09-05, 2.1.261); detect_env names the variables a hook or plugin process receives, which a Bash tool does not — the two questions differ.",
|
|
60
|
+
"overlay": "claude-code",
|
|
61
|
+
"overlay_reason": "the file under <project>/.projectstore/harness/ that carries this harness's agents block — the models, per agent, that plugin surfaces pass per invocation (ADR-008; the layout ADR decision 3)"
|
|
62
|
+
},
|
|
63
|
+
"tools": {
|
|
64
|
+
"write_tools": [
|
|
65
|
+
"Write",
|
|
66
|
+
"Edit",
|
|
67
|
+
"MultiEdit",
|
|
68
|
+
"NotebookEdit"
|
|
69
|
+
],
|
|
70
|
+
"path_fields": [
|
|
71
|
+
"file_path",
|
|
72
|
+
"notebook_path",
|
|
73
|
+
"path"
|
|
74
|
+
],
|
|
75
|
+
"patch_envelope_field": null,
|
|
76
|
+
"approval_tool": "AskUserQuestion",
|
|
77
|
+
"write_tool_name": "the Write tool",
|
|
78
|
+
"edit_tool_name": "the Edit tool",
|
|
79
|
+
"known_non_write_tools": [
|
|
80
|
+
"Bash",
|
|
81
|
+
"Read",
|
|
82
|
+
"Grep",
|
|
83
|
+
"Glob",
|
|
84
|
+
"LS",
|
|
85
|
+
"WebFetch",
|
|
86
|
+
"WebSearch",
|
|
87
|
+
"Task",
|
|
88
|
+
"TodoWrite"
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
"hooks": {
|
|
92
|
+
"config_file": "hooks/hooks.json",
|
|
93
|
+
"events": {
|
|
94
|
+
"SessionStart": "SessionStart",
|
|
95
|
+
"PreToolUse": "PreToolUse",
|
|
96
|
+
"PostToolUse": "PostToolUse",
|
|
97
|
+
"Stop": "Stop",
|
|
98
|
+
"PreCompact": "PreCompact"
|
|
99
|
+
},
|
|
100
|
+
"unsupported_events": [],
|
|
101
|
+
"matchers": {
|
|
102
|
+
"write": "Edit|Write|MultiEdit|NotebookEdit"
|
|
103
|
+
},
|
|
104
|
+
"root_placeholder": "${CLAUDE_PLUGIN_ROOT}",
|
|
105
|
+
"root_placeholder_literal": false,
|
|
106
|
+
"_root_placeholder_literal_comment": "true = the harness passes the placeholder through as literal text and the installer must substitute an absolute path; false = the harness expands it. Claude Code expands ${CLAUDE_PLUGIN_ROOT}, so false. Measured value for Codex comes from the spike."
|
|
107
|
+
},
|
|
108
|
+
"output_channels": {
|
|
109
|
+
"_comment": "Per-event output channels (generation spec, contract 17). `fields` are the hookSpecificOutput keys the event honours; `system_message` is the top-level systemMessage; `decision` names the decision object where one exists. `evidence` is `measured` only where this repository's own hooks observe the fact, `documented` where the Claude Code hooks reference says so and we never emit it.",
|
|
110
|
+
"SessionStart": {
|
|
111
|
+
"fields": [
|
|
112
|
+
"additionalContext"
|
|
113
|
+
],
|
|
114
|
+
"system_message": true,
|
|
115
|
+
"decision": null,
|
|
116
|
+
"evidence": "measured",
|
|
117
|
+
"note": "hooks/session-start.mjs emits additionalContext and systemMessage in one object; the ~10,000-character cap on additionalContext was measured (vault story: SessionStart context exceeds the hook output cap)."
|
|
118
|
+
},
|
|
119
|
+
"PreToolUse": {
|
|
120
|
+
"fields": [
|
|
121
|
+
"permissionDecision",
|
|
122
|
+
"permissionDecisionReason",
|
|
123
|
+
"updatedInput",
|
|
124
|
+
"additionalContext"
|
|
125
|
+
],
|
|
126
|
+
"system_message": true,
|
|
127
|
+
"decision": "permissionDecision",
|
|
128
|
+
"evidence": "measured",
|
|
129
|
+
"note": "systemMessage measured — scripts/touch-session.mjs uses it for the pointer nudge and the name offer. additionalContext and permissionDecision (allow|deny|ask) are documented; projectstore never emits them. A separate PermissionRequest event carries its own decision object."
|
|
130
|
+
},
|
|
131
|
+
"PostToolUse": {
|
|
132
|
+
"fields": [
|
|
133
|
+
"additionalContext"
|
|
134
|
+
],
|
|
135
|
+
"system_message": null,
|
|
136
|
+
"decision": null,
|
|
137
|
+
"evidence": "measured",
|
|
138
|
+
"note": "scripts/touch-session.mjs — the entry-rule reminder's primary carrier (entry-rule spec, contract 14)."
|
|
139
|
+
},
|
|
140
|
+
"PostToolUseFailure": {
|
|
141
|
+
"fields": [
|
|
142
|
+
"additionalContext"
|
|
143
|
+
],
|
|
144
|
+
"system_message": null,
|
|
145
|
+
"decision": null,
|
|
146
|
+
"evidence": "documented",
|
|
147
|
+
"note": "Hooks reference; not registered by projectstore."
|
|
148
|
+
},
|
|
149
|
+
"PostToolBatch": {
|
|
150
|
+
"fields": [
|
|
151
|
+
"additionalContext"
|
|
152
|
+
],
|
|
153
|
+
"system_message": null,
|
|
154
|
+
"decision": null,
|
|
155
|
+
"evidence": "documented",
|
|
156
|
+
"note": "Hooks reference; not registered by projectstore."
|
|
157
|
+
},
|
|
158
|
+
"UserPromptSubmit": {
|
|
159
|
+
"fields": [
|
|
160
|
+
"additionalContext"
|
|
161
|
+
],
|
|
162
|
+
"system_message": null,
|
|
163
|
+
"decision": null,
|
|
164
|
+
"evidence": "documented",
|
|
165
|
+
"note": "Hooks reference; not registered by projectstore."
|
|
166
|
+
},
|
|
167
|
+
"Stop": {
|
|
168
|
+
"fields": [
|
|
169
|
+
"additionalContext"
|
|
170
|
+
],
|
|
171
|
+
"system_message": null,
|
|
172
|
+
"decision": "block",
|
|
173
|
+
"evidence": "measured",
|
|
174
|
+
"min_version": "2.1.163",
|
|
175
|
+
"note": "additionalContext on Stop CONTINUES the turn (2.1.163 changelog) — hooks/session-stop.mjs runs a create-then-emit election because of it. Below 2.1.163 only decision:block + reason exists."
|
|
176
|
+
},
|
|
177
|
+
"SubagentStop": {
|
|
178
|
+
"fields": [
|
|
179
|
+
"additionalContext"
|
|
180
|
+
],
|
|
181
|
+
"system_message": null,
|
|
182
|
+
"decision": "block",
|
|
183
|
+
"evidence": "documented",
|
|
184
|
+
"note": "Same channel as Stop per the 2.1.163 changelog; not registered by projectstore — a subagent is the actor that cannot open a story."
|
|
185
|
+
},
|
|
186
|
+
"PreCompact": {
|
|
187
|
+
"fields": [],
|
|
188
|
+
"system_message": true,
|
|
189
|
+
"decision": null,
|
|
190
|
+
"evidence": "measured",
|
|
191
|
+
"note": "Measured NEGATIVELY: an output object containing additionalContext is rejected whole, taking systemMessage down with it (hooks/pre-compact.mjs; vault story: PreCompact survival packet targets a channel PreCompact does not have). Only top-level decision/reason and systemMessage exist."
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
"surfaces": {
|
|
195
|
+
"commands": {
|
|
196
|
+
"supported": true,
|
|
197
|
+
"kind": "host",
|
|
198
|
+
"dir": "commands",
|
|
199
|
+
"file": "<name>.md",
|
|
200
|
+
"format": "command-md",
|
|
201
|
+
"invocation": "/projectstore:<name>",
|
|
202
|
+
"scope": "user",
|
|
203
|
+
"scope_reason": "Claude Code loads commands from the plugin installation itself, not from a per-project directory.",
|
|
204
|
+
"registered_by": "plugin"
|
|
205
|
+
},
|
|
206
|
+
"agents": {
|
|
207
|
+
"supported": true,
|
|
208
|
+
"kind": "host",
|
|
209
|
+
"dir": "agents",
|
|
210
|
+
"file": "<name>.md",
|
|
211
|
+
"format": "agent-md",
|
|
212
|
+
"invocation": "projectstore:<name>",
|
|
213
|
+
"scope": "user",
|
|
214
|
+
"scope_reason": "Claude Code loads agents from the plugin installation itself, not from a per-project directory.",
|
|
215
|
+
"registered_by": "plugin"
|
|
216
|
+
},
|
|
217
|
+
"skills": {
|
|
218
|
+
"supported": true,
|
|
219
|
+
"kind": "host",
|
|
220
|
+
"dir": "skills",
|
|
221
|
+
"file": "<name>/SKILL.md",
|
|
222
|
+
"format": "skill-md",
|
|
223
|
+
"scope": "user",
|
|
224
|
+
"scope_reason": "Claude Code loads skills from the plugin installation itself, not from a per-project directory.",
|
|
225
|
+
"registered_by": "plugin",
|
|
226
|
+
"frontmatter_required": [
|
|
227
|
+
"name",
|
|
228
|
+
"description"
|
|
229
|
+
],
|
|
230
|
+
"frontmatter_reason": "`description` is what Claude Code matches a skill on; `name` was added 2026-09-08 because Codex's documentation requires it and this is the tree both harnesses load until the generator renders one per harness. Harmless here, required there.",
|
|
231
|
+
"invocation": null,
|
|
232
|
+
"invocation_reason": "UNMEASURED. Claude Code activates a skill from its description rather than from a form the user types; there is no explicit call syntax to record, and null says that rather than leaving the key out and reading as forgotten.",
|
|
233
|
+
"unrendered_source": false,
|
|
234
|
+
"unrendered_source_reason": "This IS the source tree (source_layout: true), so there is nothing to render and no foreign vocabulary to leak into it."
|
|
235
|
+
},
|
|
236
|
+
"hooks": {
|
|
237
|
+
"supported": true,
|
|
238
|
+
"kind": "host",
|
|
239
|
+
"dir": "hooks",
|
|
240
|
+
"file": "hooks.json",
|
|
241
|
+
"format": "hooks-json",
|
|
242
|
+
"scope": "user",
|
|
243
|
+
"scope_reason": "Claude Code loads the plugin's hooks.json from the plugin installation itself; per-project hooks live in settings, which projectstore does not write.",
|
|
244
|
+
"registered_by": "plugin"
|
|
245
|
+
},
|
|
246
|
+
"agents_block": {
|
|
247
|
+
"supported": true,
|
|
248
|
+
"kind": "shared",
|
|
249
|
+
"format": "markdown-block",
|
|
250
|
+
"scope": "project",
|
|
251
|
+
"scope_reason": "Claude Code reads CLAUDE.md from the project root; AGENTS.md is the cross-tool convention, bridged by an @AGENTS.md import (ADR-002 decision 3).",
|
|
252
|
+
"files": [
|
|
253
|
+
"AGENTS.md",
|
|
254
|
+
"CLAUDE.md"
|
|
255
|
+
],
|
|
256
|
+
"reads_natively": "CLAUDE.md",
|
|
257
|
+
"reads_natively_reason": "The file this harness reads BY ITSELF. `files` is the block's placement preference and conflates two things: AGENTS.md is first because it is the cross-tool convention, but Claude Code reaches it only through the @AGENTS.md import WE install — remove the bridge and the block is invisible. So installing for this harness must leave CLAUDE.md present: holding the block when it lands here, holding the import when it lands in AGENTS.md. Measured 2026-09-09: a project with an AGENTS.md and no CLAUDE.md took the block into AGENTS.md and created no bridge, so the harness that ran the install could not see it.",
|
|
258
|
+
"source": "templates/claude-md-block.md.tmpl",
|
|
259
|
+
"marker": {
|
|
260
|
+
"open": "<!-- projectstore:agents v",
|
|
261
|
+
"close": "<!-- /projectstore:agents -->"
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
"statusline": {
|
|
265
|
+
"supported": true,
|
|
266
|
+
"kind": "shared",
|
|
267
|
+
"format": "json-entry",
|
|
268
|
+
"scope": "project",
|
|
269
|
+
"scope_reason": "The statusLine slot is per project and not plugin-declarable (ADR-006); our entry lives in settings.local.json, which is machine-specific.",
|
|
270
|
+
"file": ".claude/settings.local.json",
|
|
271
|
+
"marker": {
|
|
272
|
+
"pointer": "statusLine.command",
|
|
273
|
+
"predicate": "statusLineIsOurWiring"
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
"statusline_launcher": {
|
|
277
|
+
"supported": true,
|
|
278
|
+
"kind": "exclusive",
|
|
279
|
+
"format": "mjs",
|
|
280
|
+
"scope": "project",
|
|
281
|
+
"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.",
|
|
282
|
+
"file": ".projectstore/state/claude-code/statusline.mjs",
|
|
283
|
+
"source": "scripts/statusline-launcher.mjs",
|
|
284
|
+
"condition": "plugin_cache_install",
|
|
285
|
+
"file_reason": "the harness's generated runtime files live under .projectstore/state/<harness id>/ (layout ADR decision 4); the 0.27.x path .claude/.projectstore/statusline.mjs is read as ours through 0.29",
|
|
286
|
+
"legacy_file": ".claude/.projectstore/statusline.mjs"
|
|
287
|
+
},
|
|
288
|
+
"mcp": {
|
|
289
|
+
"supported": true,
|
|
290
|
+
"kind": "host",
|
|
291
|
+
"dir": ".",
|
|
292
|
+
"file": ".mcp.json",
|
|
293
|
+
"scope": "plugin",
|
|
294
|
+
"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.",
|
|
295
|
+
"launch": {
|
|
296
|
+
"cwd": "project",
|
|
297
|
+
"project_dir_in_env": true,
|
|
298
|
+
"expands_measured": [
|
|
299
|
+
"args",
|
|
300
|
+
"env"
|
|
301
|
+
],
|
|
302
|
+
"expands_inferred": [
|
|
303
|
+
"command"
|
|
304
|
+
],
|
|
305
|
+
"default_syntax": "${VAR:-default}",
|
|
306
|
+
"unset_placeholder_in_env": "literal",
|
|
307
|
+
"unset_placeholder_in_args": "inferred literal — the server refuses a --project still carrying a dollar-brace placeholder",
|
|
308
|
+
"entrypoint": "sdk-cli (headless -p), plugin loaded with --plugin-dir; the marketplace install and an interactive session are A9's",
|
|
309
|
+
"protocol_era": "initialize",
|
|
310
|
+
"protocol_version_seen": "2025-11-25",
|
|
311
|
+
"shutdown_signal": "SIGINT",
|
|
312
|
+
"evidence": "measured",
|
|
313
|
+
"client": "claude 2.1.261",
|
|
314
|
+
"date": "2026-09-05"
|
|
315
|
+
},
|
|
316
|
+
"registered_by": "plugin"
|
|
317
|
+
},
|
|
318
|
+
"mcp_project_entry": {
|
|
319
|
+
"supported": false,
|
|
320
|
+
"kind": "shared",
|
|
321
|
+
"format": "json-entry",
|
|
322
|
+
"scope": "project",
|
|
323
|
+
"scope_reason": "A project-root .mcp.json registers the server with an absolute --project for a host that does not expand placeholders (MCP ADR, decision 6); per project because the server binds to one.",
|
|
324
|
+
"file": ".mcp.json",
|
|
325
|
+
"marker": {
|
|
326
|
+
"pointer": "mcpServers.projectstore"
|
|
327
|
+
},
|
|
328
|
+
"why_unsupported": "the plugin-bundled registration already binds per project in Claude Code; this row is for hosts without plugin MCP and lands with their adapters (roadmap B3/C3)"
|
|
329
|
+
},
|
|
330
|
+
"plugin": {
|
|
331
|
+
"supported": true,
|
|
332
|
+
"kind": "registration",
|
|
333
|
+
"format": "host-plugin-registration",
|
|
334
|
+
"scope": "local",
|
|
335
|
+
"scope_reason": "Claude Code registers a plugin per scope (user, project, local, managed). The registration carries a machine-absolute path and an enablement, so it lands in the checkout's settings.local.json — the same machine-specific file the status line uses — never in the committed settings.json and never in the user's own settings (install spec contract 4′, 2026-09-05). Local scope is per checkout: a worktree registers again.",
|
|
336
|
+
"condition": "npm_package_root",
|
|
337
|
+
"marketplace_name": "projectstore-npm",
|
|
338
|
+
"plugin_name": "projectstore",
|
|
339
|
+
"dir": [
|
|
340
|
+
"projectstore",
|
|
341
|
+
"marketplace"
|
|
342
|
+
],
|
|
343
|
+
"plugin_subdir": "projectstore",
|
|
344
|
+
"manifest": ".claude-plugin/marketplace.json",
|
|
345
|
+
"provenance_key": "projectstore",
|
|
346
|
+
"registry": {
|
|
347
|
+
"installed": [
|
|
348
|
+
"plugins",
|
|
349
|
+
"installed_plugins.json"
|
|
350
|
+
],
|
|
351
|
+
"marketplaces": [
|
|
352
|
+
"plugins",
|
|
353
|
+
"known_marketplaces.json"
|
|
354
|
+
],
|
|
355
|
+
"user_settings": [
|
|
356
|
+
"settings.json"
|
|
357
|
+
],
|
|
358
|
+
"project_settings": [
|
|
359
|
+
"settings.local.json"
|
|
360
|
+
],
|
|
361
|
+
"cache_dir": [
|
|
362
|
+
"plugins",
|
|
363
|
+
"cache"
|
|
364
|
+
],
|
|
365
|
+
"enabled_pointer": "enabledPlugins",
|
|
366
|
+
"known_pointer": "extraKnownMarketplaces",
|
|
367
|
+
"install_path_layout": "<cache_dir>/<marketplace>/<plugin>/<version>"
|
|
368
|
+
},
|
|
369
|
+
"cli": {
|
|
370
|
+
"bin": "claude",
|
|
371
|
+
"verified": {
|
|
372
|
+
"version": "2.1.261",
|
|
373
|
+
"date": "2026-09-05",
|
|
374
|
+
"evidence": "measured in a sandboxed CLAUDE_CONFIG_DIR with two projects",
|
|
375
|
+
"notes": [
|
|
376
|
+
"plugin.json wins over the marketplace entry's version",
|
|
377
|
+
"--scope local writes only <project>/.claude/settings.local.json (extraKnownMarketplaces, enabledPlugins) and one registry row per project carrying projectPath",
|
|
378
|
+
"`plugin update <id> --scope local -y` swaps that project's row in place after the directory is rewritten; without --scope it looks at user scope and fails",
|
|
379
|
+
"`plugin uninstall --scope local -y` removes only the calling project's row and enablement",
|
|
380
|
+
"`marketplace remove` (any scope) empties known_marketplaces.json AND every project's rows for that marketplace — run only when no other project uses it; the project's own extraKnownMarketplaces entry is removed by install itself",
|
|
381
|
+
"`plugin validate` warns about the unknown `projectstore` field and exits 0",
|
|
382
|
+
"-y accepts a marketplace-declared command; this marketplace declares none",
|
|
383
|
+
"the project of a --scope local command is the process cwd; there is no --project flag",
|
|
384
|
+
"a live session marks its Bash environment with CLAUDECODE=1 (not the plugin-root or project-dir variables, which reach hooks only); the registration defers on that marker",
|
|
385
|
+
"`plugin update` at an unchanged version answers \"already at the latest version\" and copies nothing, even after `marketplace update`: a same-version content refresh is uninstall + install"
|
|
386
|
+
]
|
|
387
|
+
},
|
|
388
|
+
"commands": {
|
|
389
|
+
"validate": [
|
|
390
|
+
"plugin",
|
|
391
|
+
"validate",
|
|
392
|
+
"{dir}"
|
|
393
|
+
],
|
|
394
|
+
"marketplace_add": [
|
|
395
|
+
"plugin",
|
|
396
|
+
"marketplace",
|
|
397
|
+
"add",
|
|
398
|
+
"{dir}",
|
|
399
|
+
"--scope",
|
|
400
|
+
"local"
|
|
401
|
+
],
|
|
402
|
+
"marketplace_update": [
|
|
403
|
+
"plugin",
|
|
404
|
+
"marketplace",
|
|
405
|
+
"update",
|
|
406
|
+
"{marketplace}"
|
|
407
|
+
],
|
|
408
|
+
"marketplace_remove": [
|
|
409
|
+
"plugin",
|
|
410
|
+
"marketplace",
|
|
411
|
+
"remove",
|
|
412
|
+
"{marketplace}",
|
|
413
|
+
"--scope",
|
|
414
|
+
"local"
|
|
415
|
+
],
|
|
416
|
+
"install": [
|
|
417
|
+
"plugin",
|
|
418
|
+
"install",
|
|
419
|
+
"{id}",
|
|
420
|
+
"--scope",
|
|
421
|
+
"local",
|
|
422
|
+
"-y"
|
|
423
|
+
],
|
|
424
|
+
"update": [
|
|
425
|
+
"plugin",
|
|
426
|
+
"update",
|
|
427
|
+
"{id}",
|
|
428
|
+
"--scope",
|
|
429
|
+
"local",
|
|
430
|
+
"-y"
|
|
431
|
+
],
|
|
432
|
+
"uninstall": [
|
|
433
|
+
"plugin",
|
|
434
|
+
"uninstall",
|
|
435
|
+
"{id}",
|
|
436
|
+
"--scope",
|
|
437
|
+
"local",
|
|
438
|
+
"-y"
|
|
439
|
+
],
|
|
440
|
+
"disable": [
|
|
441
|
+
"plugin",
|
|
442
|
+
"disable",
|
|
443
|
+
"{other}",
|
|
444
|
+
"--scope",
|
|
445
|
+
"local"
|
|
446
|
+
],
|
|
447
|
+
"enable": [
|
|
448
|
+
"plugin",
|
|
449
|
+
"enable",
|
|
450
|
+
"{other}",
|
|
451
|
+
"--scope",
|
|
452
|
+
"local"
|
|
453
|
+
]
|
|
454
|
+
}
|
|
455
|
+
},
|
|
456
|
+
"condition_reason": "any root that is not the host's own plugin cache — the npm package under npx, a global install, a dev checkout — registers; a session running from the cache never registers a second copy of itself."
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
"capabilities": {
|
|
460
|
+
"statusline": true,
|
|
461
|
+
"interactive_approval_tool": true,
|
|
462
|
+
"permission_decision_hook": "PreToolUse",
|
|
463
|
+
"subagent_tool_allowlist": true,
|
|
464
|
+
"subagent_model_per_invocation": true
|
|
465
|
+
},
|
|
466
|
+
"rewrites": [],
|
|
467
|
+
"update_instructions": [
|
|
468
|
+
"**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-claude upgrade --project <dir>`). To get notified of new releases (v0.7+):",
|
|
469
|
+
"1. Open `/plugin` → **Marketplaces** tab.",
|
|
470
|
+
"2. Find **SmartAndPoint**.",
|
|
471
|
+
"3. Toggle **auto-update** on.",
|
|
472
|
+
"",
|
|
473
|
+
"Without it, you would run `/plugin marketplace update SmartAndPoint` manually. See https://github.com/SmartAndPoint/ProjectStore#upgrading for details.",
|
|
474
|
+
"",
|
|
475
|
+
"**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 outside the session: for a git-marketplace install, the installed copy's own `bin/projectstore.mjs upgrade --harness claude-code --no-register --project <dir>`, which leaves the registration as it is; for the npm registration, `npx projectstore-claude@<version> upgrade --no-register --project <dir>`. 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 shell form without `--no-register` (`npx projectstore-claude@<version> upgrade`), 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."
|
|
476
|
+
],
|
|
477
|
+
"agent_translation": {
|
|
478
|
+
"carries_model": true,
|
|
479
|
+
"cheap_model": "sonnet",
|
|
480
|
+
"cheap_model_evidence": "measured",
|
|
481
|
+
"cheap_model_reason": "The model the clerk is pinned to when a strong default would otherwise lift it (ADR-008). A literal here, in the one file allowed to name a harness's vocabulary; it used to be a literal in scripts/cli.mjs, which made `agents configure --harness codex` write an Anthropic model name into a Codex overlay. MEASURED in the sense that matters: this is the model the clerk has been running on since ADR-008, in this repository, and tests/overlay.test.mjs asserts the pin end to end."
|
|
482
|
+
}
|
|
483
|
+
}
|