projectstore-claude 0.30.11 → 0.30.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,7 +12,7 @@
12
12
  "name": "projectstore",
13
13
  "displayName": "projectstore",
14
14
  "description": "📚 Your agent runs the project through a verified loop: task → artifact (ADR · spec · epic · story) → adversarial critic → backlog → planner → reviewer → done. Plain markdown in an Obsidian-friendly vault, every write approved by you — and any model can pick the project up tomorrow.",
15
- "version": "0.30.11",
15
+ "version": "0.30.13",
16
16
  "author": {
17
17
  "name": "Evgenii Konev",
18
18
  "email": "ekonev@smartandpoint.com",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "projectstore",
3
3
  "displayName": "projectstore",
4
- "version": "0.30.11",
4
+ "version": "0.30.13",
5
5
  "description": "Your agent runs the project through a verified loop: task → artifact (ADR / spec / epic / story) → adversarial critic → backlog → planner → reviewer → done. Plain markdown in git — any model can pick the project up tomorrow.",
6
6
  "author": {
7
7
  "name": "Evgenii Konev @ SmartAndPoint",
@@ -85,8 +85,17 @@ generic best practice — cite the real files and patterns you found.
85
85
  8. **Proposed `code_refs`** — the paths/globs this epic (and story) will own once
86
86
  implemented, ready for `/projectstore:codemap set`. You PROPOSE; the command
87
87
  writes after approval.
88
+ 9. **Open questions** — at most five decisions the user must make that the
89
+ code and the vault cannot answer, the one that changes the plan most
90
+ first. One per line:
91
+ `Q<n>. <the question> Options: (a) … (b) … Recommend (b): <why>`, with two to four options. The
92
+ recommendation is one of the options, so it can be recorded as the answer
93
+ when the user skips the question. "None" is the normal case. With more than
94
+ five, return five, say how many you left out, and say the story is
95
+ probably too big: suggest how to split it. You ask the user nothing; the
96
+ plan step puts these to the user in one round.
88
97
 
89
98
  Rules: be concrete and cite real paths / symbols; if the task is ambiguous or has
90
- two plausible homes, say so and recommend one with the tradeoff. No code
99
+ two plausible homes, say so in Open questions (item 9) and recommend one with the tradeoff. No code
91
100
  generation beyond tiny illustrative snippets. You are read-only — never write
92
101
  code or vault files.
@@ -46,6 +46,17 @@ that is a 🔴 finding: the story is covered by a spec, new or existing, and
46
46
  `no_spec` is removed before it closes. There is no way to silence this.
47
47
  Otherwise check that the reason still matches what the diff did.
48
48
 
49
+ **An Independent test line.** A story may carry one optional line under
50
+ Description, `**Independent test:**` (translated as Unabhängiger Test, Prueba
51
+ independiente, Test indépendant, Независимая проверка or 独立测试; in any
52
+ locale, the bold line right under the Description comment): one sentence on how the story is checked on its own. It is filled when
53
+ text follows the label outside the comment. When it is filled, the matrix gets
54
+ one line for it: `— evidence:` with the command run and what was seen, or
55
+ `not run — <why>` (it needs a host, a network, a release or a person: name
56
+ which). With neither, that is a 🟡 should-fix, never a 🔴: the line is a hint,
57
+ not a gate, and it never holds a story open. With no line, or only its
58
+ placeholder, say nothing about it.
59
+
49
60
  ## Phase 0 — Pre-commitment
50
61
  From the story + file list, predict the 3-5 most likely gaps ("AC #3 needs an
51
62
  error path the diff doesn't touch"; "touches a cache — invalidation risk"). Write
@@ -97,7 +108,9 @@ say so plainly.
97
108
  Format each evidence value so it can be persisted verbatim into the story
98
109
  file at close: `— evidence: <test | command | file:line>` (a test may be
99
110
  named by its contract token, `[example#3]`, which doctor checks) — the close gate
100
- (`/projectstore:story close`) copies your matrix into the checkboxes.
111
+ (`/projectstore:story close`) copies your matrix into the checkboxes. A
112
+ filled Independent test line gets its own line here, so the close can copy
113
+ it into the Final Summary's tests executed.
101
114
  3. **Findings** — severity-rated: `🔴 blocker` / `🟡 should-fix` / `🟢 nit`; each
102
115
  with file:line, confidence, why it matters, and a specific fix.
103
116
  4. **Proposed `code_refs`** — computed, not recalled: run
@@ -50,6 +50,13 @@ the two cannot collide).
50
50
  line with `variant: test` before the preview, the way `--spec` fills
51
51
  `specs:`. The critic then reviews the story against `story.test`.
52
52
 
53
+ 3b. **The Independent test line** (optional, under Description; its label is
54
+ translated in each locale). When the conversation already says how this
55
+ story is checked on its own (a command to run and what to see), write
56
+ that sentence in place of the line's comment. Otherwise leave the
57
+ placeholder as it is and invent nothing: it is a hint, not a gate. Quote
58
+ the line in the preview.
59
+
53
60
  4. **Preview**: path + first ~25 lines.
54
61
 
55
62
  5. **Approval** via AskUserQuestion: Yes / Edit / No.
@@ -58,8 +65,9 @@ the two cannot collide).
58
65
 
59
66
  6. **Post-approval race re-check** (Layer 1): re-run `draft.mjs story <epic-id> "<title>"` (the same stripped arguments as step 3) and re-read its `collision` field — an exact-name `test -e` cannot see normalized cross-era collisions (`story-006-foo.md` vs `story-foo.md`). If `collision` is non-null, surface it as a topic collision (`"<identity>" already exists as <with>`), and ask: extend the existing story, pick a different slug (`-2` is a deliberate distinct identity), or cancel. Render `warnings` entries as `⚠️` lines in the preview too.
60
67
 
61
- 7. **On Yes** (path free): Write the file you previewed, with the step-2 and
62
- step-3a edits (`specs:`, `variant: test`), not the re-run's raw draft.
68
+ 7. **On Yes** (path free): Write the file you previewed, with the step-2,
69
+ step-3a and step-3b edits (`specs:`, `variant: test`, the Independent test
70
+ line), not the re-run's raw draft.
63
71
 
64
72
  8. **Suggest next**: "Now decompose the work in the `Decomposition` section, or run `/projectstore:kanban` to refresh the board. Before implementation: `/projectstore:story plan <story>`."
65
73
 
@@ -92,15 +100,39 @@ the two cannot collide).
92
100
  `plan_updated_at` / `closed_at` — stamped unconditionally; the
93
101
  `lifecycle_gates` key gates checks, never data).
94
102
 
103
+ 2a. **(plan only) Open questions, one round.** Before writing the plan,
104
+ collect the open questions: the planner's "Open questions" when it ran,
105
+ else your own; do not start the planner here. Keep only decisions the
106
+ user must make; skip what the conversation, or an earlier
107
+ `### Clarifications` in this plan, already settled. None is the normal
108
+ case: then ask nothing and write nothing. Keep at most five, the one that
109
+ changes the plan most first; with more, keep five, say how many were
110
+ dropped, and suggest splitting the story; when the planner says it left questions out, say so in the same round, with its split suggestion. Each question has two to four
111
+ options and one recommended option. Put them to the user in one round:
112
+ one call of AskUserQuestion for up to four questions; with five, or where
113
+ the harness has no question tool, one plain-text message with the
114
+ questions numbered. Ask once per gate run: the Edit in step 4 and the
115
+ re-check in step 5 never ask again. A skipped question, or every question
116
+ of a dismissed call, takes its recommendation, marked `(assumed)`. Record
117
+ the round under `### Clarifications`, last in the plan: a line with
118
+ today's date, then one bullet per question with its answer; a later plan
119
+ run appends its own dated line to the same subsection. An answer that changes a
120
+ contract of the covering spec says which one, and the spec is amended
121
+ the way it records its other amendments before the code is written.
122
+
95
123
  3. **Fill the section content** in the returned `content` before preview:
96
124
  - `plan` — write the Implementation Plan. When the story's `specs:` names a
97
125
  covering spec, the plan is a THIN ROUTE through that spec's behavioral
98
126
  contracts: which contracts, in what order, which files. Consult the
99
- planner agent's output if one ran. Do not restate the spec.
127
+ planner agent's output if one ran. Do not restate the spec. End the plan
128
+ with the step 2a round, when there was one.
100
129
  - `close` — write the Final Summary (what changed / why / tests executed /
101
130
  risks & follow-ups), and update the Acceptance Criteria checkboxes with
102
131
  evidence suffixes: `- [x] <criterion> — evidence: <test | command | file:line>`.
103
132
  Check a box ONLY with real evidence (reviewer output, test run, command).
133
+ When the story's Independent test line is filled, in the Final Summary's
134
+ tests executed, say whether the Independent test ran and how (the command
135
+ and what was seen), or why not; the story closes either way.
104
136
 
105
137
  4. **Preview** path + notes + the changed sections. **Approval** via
106
138
  AskUserQuestion: Yes / Edit / No.
@@ -104,6 +104,23 @@ the ones a production vault hits.
104
104
  The story has `variant: test` in its frontmatter and follows every other
105
105
  story rule: the plan and close gates, evidence, the board.
106
106
 
107
+ ## A story with no spec: the Independent test line
108
+
109
+ Most stories have no covering spec, so no scenario tells them how they are
110
+ checked. The story template has one optional line under Description for
111
+ that: one sentence on how the story is checked on its own, a command to run
112
+ and what to see.
113
+
114
+ ```markdown
115
+ **Independent test:** run `npm test` with a fixture vault whose index has a
116
+ stale row, and see doctor report the folder.
117
+ ```
118
+
119
+ It is a hint, not a gate. `/projectstore:story` fills it only when the
120
+ conversation already says how; otherwise the placeholder stays, or you delete
121
+ it. When the line is filled, the reviewer reports whether that test ran, and
122
+ the close reports it in the Final Summary. Doctor never reads it.
123
+
107
124
  ## A contract no test can cover
108
125
 
109
126
  Some contracts are checked on a real host after install, or by a person.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectstore",
3
- "version": "0.30.11",
3
+ "version": "0.30.13",
4
4
  "description": "Your agent runs the project through a verified loop: task → artifact (ADR / spec / epic / story) → adversarial critic → backlog → planner → reviewer → done. Plain markdown in git — any model can pick the project up tomorrow.",
5
5
  "keywords": [
6
6
  "project-management",
@@ -34,6 +34,8 @@ plan_updated_at: null
34
34
 
35
35
  <!-- Welches Problem löst diese Story? Wer ist der Nutzer? -->
36
36
 
37
+ **Unabhängiger Test:** <!-- Optional. Ein Satz dazu, wie diese Story für sich geprüft wird: ein Kommando und was man sieht. Lösche die Zeile, wenn es keinen gibt. -->
38
+
37
39
  ## Zerlegung
38
40
 
39
41
  <!-- Granulare Checkliste konkreter Aufgaben. Jeder Punkt klein genug für eine Sitzung. -->
@@ -34,6 +34,8 @@ plan_updated_at: null
34
34
 
35
35
  <!-- What problem does this story solve? Who is the user? -->
36
36
 
37
+ **Independent test:** <!-- Optional. One sentence on how this story is checked on its own: a command to run and what to see. Delete the line if there is none. -->
38
+
37
39
  ## Decomposition
38
40
 
39
41
  <!-- Granular checklist of concrete tasks. Each item should be small enough to complete in a session. -->
@@ -34,6 +34,8 @@ plan_updated_at: null
34
34
 
35
35
  <!-- ¿Qué problema resuelve esta historia? ¿Quién es el usuario? -->
36
36
 
37
+ **Prueba independiente:** <!-- Opcional. Una frase sobre cómo se comprueba esta historia por sí sola: un comando y lo que se ve. Borra la línea si no hay ninguna. -->
38
+
37
39
  ## Descomposición
38
40
 
39
41
  <!-- Checklist granular de tareas concretas. Cada punto, lo bastante pequeño para cerrarlo en una sesión. -->
@@ -34,6 +34,8 @@ plan_updated_at: null
34
34
 
35
35
  <!-- Quel problème cette story résout-elle ? Qui est l'utilisateur ? -->
36
36
 
37
+ **Test indépendant :** <!-- Facultatif. Une phrase sur la façon de vérifier cette story seule : une commande à lancer et ce qu'on voit. Supprime la ligne s'il n'y en a pas. -->
38
+
37
39
  ## Décomposition
38
40
 
39
41
  <!-- Checklist granulaire de tâches concrètes. Chaque point assez petit pour tenir dans une session. -->
@@ -34,6 +34,8 @@ plan_updated_at: null
34
34
 
35
35
  <!-- Какую проблему решает эта история? Кто пользователь? -->
36
36
 
37
+ **Независимая проверка:** <!-- Необязательно. Одно предложение о том, как проверить эту стори отдельно: какую команду запустить и что увидеть. Удали строку, если такой проверки нет. -->
38
+
37
39
  ## Декомпозиция
38
40
 
39
41
  <!-- Гранулярный чеклист конкретных задач. Каждый пункт — достаточно мал, чтобы закрыть за одну сессию. -->
@@ -34,6 +34,8 @@ plan_updated_at: null
34
34
 
35
35
  <!-- 这个 story 解决什么问题?用户是谁? -->
36
36
 
37
+ **独立测试:** <!-- 可选。一句话说明如何单独验证这个 story:运行什么命令、看到什么结果。没有就删掉这一行。 -->
38
+
37
39
  ## 任务分解
38
40
 
39
41
  <!-- 具体任务的细颗粒清单。每一条都小到能在一次会话内做完。 -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectstore-claude",
3
- "version": "0.30.11",
3
+ "version": "0.30.13",
4
4
  "description": "projectstore for Claude Code: the core pinned and bundled, the harness fixed. A release artifact; the way in is npx projectstore setup",
5
5
  "keywords": [
6
6
  "projectstore",
@@ -37,7 +37,7 @@
37
37
  "README.md"
38
38
  ],
39
39
  "dependencies": {
40
- "projectstore": "=0.30.11"
40
+ "projectstore": "=0.30.13"
41
41
  },
42
42
  "bundleDependencies": [
43
43
  "projectstore"