projectstore-claude 0.30.12 โ†’ 0.30.14

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.12",
15
+ "version": "0.30.14",
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.12",
4
+ "version": "0.30.14",
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.
@@ -100,11 +100,32 @@ the two cannot collide).
100
100
  `plan_updated_at` / `closed_at` โ€” stamped unconditionally; the
101
101
  `lifecycle_gates` key gates checks, never data).
102
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
+
103
123
  3. **Fill the section content** in the returned `content` before preview:
104
124
  - `plan` โ€” write the Implementation Plan. When the story's `specs:` names a
105
125
  covering spec, the plan is a THIN ROUTE through that spec's behavioral
106
126
  contracts: which contracts, in what order, which files. Consult the
107
- 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.
108
129
  - `close` โ€” write the Final Summary (what changed / why / tests executed /
109
130
  risks & follow-ups), and update the Acceptance Criteria checkboxes with
110
131
  evidence suffixes: `- [x] <criterion> โ€” evidence: <test | command | file:line>`.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectstore",
3
- "version": "0.30.12",
3
+ "version": "0.30.14",
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",
@@ -24,9 +24,10 @@
24
24
  // false "1 call/turn" for every turn (each record holds โ‰ค1 tool_use).
25
25
  //
26
26
  // COST is computed at current API list prices (PRICING below) with the cache
27
- // multipliers: read 0.1ร— input, 5m write 1.25ร—, 1h write 2ร— (the usage records
28
- // carry the 5m/1h split). Under a subscription plan these dollars are a proxy
29
- // for rate-limit consumption, not an invoice โ€” the RATIOS hold either way.
27
+ // multipliers: read 0.1ร— input unless the model has its own read rate, 5m
28
+ // write 1.25ร—, 1h write 2ร— (the usage records carry the 5m/1h split). Under
29
+ // a subscription plan these dollars are a proxy for rate-limit consumption,
30
+ // not an invoice โ€” the RATIOS hold either way.
30
31
  // Historical price changes are not modeled; everything is priced at today's
31
32
  // list. Unknown models are priced at 0 and reported.
32
33
  //
@@ -94,28 +95,36 @@ const STAGE_OF = {
94
95
  };
95
96
  const STAGE_ORDER = ["authoring", "critique", "planning", "code-review", "curation", "upkeep", "other"];
96
97
 
97
- // USD per MTok [input, output], API list prices as of 2026-08-04 (Fable 5.1 added 2026-09-02)
98
- // (platform.claude.com pricing docs). Cache multipliers applied on top of
99
- // the input rate.
98
+ // USD per MTok [input, output, cache read?], API list prices as of 2026-11-10
99
+ // (platform.claude.com pricing docs). The third value is the cache-read rate
100
+ // where it is not 0.1ร— input (Fable 5.1 and 5.2: 0.025ร—; Opus 5.5 and
101
+ // Sonnet 5.5: 0.05ร—); writes stay 1.25ร— / 2ร— input. The `--json` output
102
+ // carries these arrays as they are, with two or three values.
100
103
  export const PRICING = {
101
- "claude-fable-5-1": [10, 50],
104
+ "claude-fable-5-2": [8, 40, 0.2],
105
+ "claude-fable-5-1": [10, 50, 0.25],
102
106
  "claude-fable-5": [10, 50],
107
+ "claude-opus-5-5": [4, 20, 0.2],
103
108
  "claude-opus-5": [5, 25],
104
109
  "claude-opus-4-8": [5, 25],
105
110
  "claude-opus-4-7": [5, 25],
106
- "claude-sonnet-5": [2, 10], // intro pricing through 2026-08-31; sticker is [3, 15]
111
+ "claude-sonnet-5-5": [2, 10, 0.1],
112
+ "claude-sonnet-5": [2, 10],
107
113
  "claude-sonnet-4-6": [3, 15],
114
+ // reads at the default 0.1ร— ($0.01); prompts up to 100K, beyond [0.5, 2.5] (not modeled)
115
+ "claude-haiku-5-5": [0.1, 0.5],
108
116
  "claude-haiku-4-5": [1, 5],
109
117
  };
110
118
 
111
119
  // Transcripts carry variant ids ("claude-haiku-4-5-20251001", "opus",
112
120
  // "claude-opus-5[1m]") โ€” normalize before the PRICING lookup so they don't
113
- // silently price at $0.
121
+ // silently price at $0. A bare alias names the newest model of its line, so
122
+ // an old record written as "haiku" prices at today's Haiku, not the one that ran.
114
123
  const MODEL_ALIASES = {
115
- fable: "claude-fable-5-1",
116
- opus: "claude-opus-5",
117
- sonnet: "claude-sonnet-5",
118
- haiku: "claude-haiku-4-5",
124
+ fable: "claude-fable-5-2",
125
+ opus: "claude-opus-5-5",
126
+ sonnet: "claude-sonnet-5-5",
127
+ haiku: "claude-haiku-5-5",
119
128
  };
120
129
 
121
130
  export function normModel(model) {
@@ -126,9 +135,9 @@ export function normModel(model) {
126
135
  export function rowCost(row) {
127
136
  const p = PRICING[normModel(row.model)];
128
137
  if (!p) return 0;
129
- const [inP, outP] = p;
138
+ const [inP, outP, readP = 0.1 * inP] = p;
130
139
  return (
131
- (row.input * inP + row.cw5m * 1.25 * inP + row.cw1h * 2 * inP + row.cacheRead * 0.1 * inP + row.output * outP) / 1e6
140
+ (row.input * inP + row.cw5m * 1.25 * inP + row.cw1h * 2 * inP + row.cacheRead * readP + row.output * outP) / 1e6
132
141
  );
133
142
  }
134
143
 
@@ -359,7 +368,7 @@ const n = (v) => v.toLocaleString("en-US");
359
368
 
360
369
  // `t/turn` โ€” avg distinct tool calls per tool-using turn (batching level; 1.0
361
370
  // means fully sequential). `cost` โ€” USD at current list prices; cache reads
362
- // bill at 0.1ร— input, so token counts and dollars rank differently.
371
+ // bill at a small fraction of input, so token counts and dollars rank differently.
363
372
  const usd = (v) => `$${v.toFixed(2)}`;
364
373
 
365
374
  function table(groups, label, { runs = false } = {}) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectstore-claude",
3
- "version": "0.30.12",
3
+ "version": "0.30.14",
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.12"
40
+ "projectstore": "=0.30.14"
41
41
  },
42
42
  "bundleDependencies": [
43
43
  "projectstore"