@slowcook-ai/cli 0.19.0-alpha.8 → 0.19.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 (194) hide show
  1. package/AGENTS.md +240 -0
  2. package/REPORTING.md +193 -0
  3. package/dist/cli.js +78 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/brand/index.d.ts +26 -0
  6. package/dist/commands/brand/index.d.ts.map +1 -0
  7. package/dist/commands/brand/index.js +257 -0
  8. package/dist/commands/brand/index.js.map +1 -0
  9. package/dist/commands/brew/agent.d.ts +7 -2
  10. package/dist/commands/brew/agent.d.ts.map +1 -1
  11. package/dist/commands/brew/agent.js +9 -0
  12. package/dist/commands/brew/agent.js.map +1 -1
  13. package/dist/commands/brew/halt.d.ts +26 -0
  14. package/dist/commands/brew/halt.d.ts.map +1 -1
  15. package/dist/commands/brew/halt.js.map +1 -1
  16. package/dist/commands/brew/index.d.ts.map +1 -1
  17. package/dist/commands/brew/index.js +142 -18
  18. package/dist/commands/brew/index.js.map +1 -1
  19. package/dist/commands/brew/pair-navigator.d.ts +119 -0
  20. package/dist/commands/brew/pair-navigator.d.ts.map +1 -0
  21. package/dist/commands/brew/pair-navigator.js +187 -0
  22. package/dist/commands/brew/pair-navigator.js.map +1 -0
  23. package/dist/commands/budget/index.d.ts +2 -0
  24. package/dist/commands/budget/index.d.ts.map +1 -0
  25. package/dist/commands/budget/index.js +252 -0
  26. package/dist/commands/budget/index.js.map +1 -0
  27. package/dist/commands/chef/drift-fix.d.ts +33 -4
  28. package/dist/commands/chef/drift-fix.d.ts.map +1 -1
  29. package/dist/commands/chef/drift-fix.js +417 -29
  30. package/dist/commands/chef/drift-fix.js.map +1 -1
  31. package/dist/commands/chef/index.js +13 -3
  32. package/dist/commands/chef/index.js.map +1 -1
  33. package/dist/commands/chef/orchestrate.d.ts +1 -1
  34. package/dist/commands/chef/orchestrate.d.ts.map +1 -1
  35. package/dist/commands/chef/orchestrate.js +32 -9
  36. package/dist/commands/chef/orchestrate.js.map +1 -1
  37. package/dist/commands/dev-env/config.d.ts +57 -0
  38. package/dist/commands/dev-env/config.d.ts.map +1 -0
  39. package/dist/commands/dev-env/config.js +96 -0
  40. package/dist/commands/dev-env/config.js.map +1 -0
  41. package/dist/commands/dev-env/index.d.ts +27 -0
  42. package/dist/commands/dev-env/index.d.ts.map +1 -0
  43. package/dist/commands/dev-env/index.js +226 -0
  44. package/dist/commands/dev-env/index.js.map +1 -0
  45. package/dist/commands/dev-env/init.d.ts +28 -0
  46. package/dist/commands/dev-env/init.d.ts.map +1 -0
  47. package/dist/commands/dev-env/init.js +135 -0
  48. package/dist/commands/dev-env/init.js.map +1 -0
  49. package/dist/commands/docs/index.d.ts +16 -0
  50. package/dist/commands/docs/index.d.ts.map +1 -0
  51. package/dist/commands/docs/index.js +127 -0
  52. package/dist/commands/docs/index.js.map +1 -0
  53. package/dist/commands/eval/index.d.ts +54 -0
  54. package/dist/commands/eval/index.d.ts.map +1 -0
  55. package/dist/commands/eval/index.js +294 -0
  56. package/dist/commands/eval/index.js.map +1 -0
  57. package/dist/commands/extract/index.d.ts.map +1 -1
  58. package/dist/commands/extract/index.js +23 -1
  59. package/dist/commands/extract/index.js.map +1 -1
  60. package/dist/commands/garnish/index.d.ts +56 -0
  61. package/dist/commands/garnish/index.d.ts.map +1 -0
  62. package/dist/commands/garnish/index.js +281 -0
  63. package/dist/commands/garnish/index.js.map +1 -0
  64. package/dist/commands/garnish/trailer.d.ts +79 -0
  65. package/dist/commands/garnish/trailer.d.ts.map +1 -0
  66. package/dist/commands/garnish/trailer.js +118 -0
  67. package/dist/commands/garnish/trailer.js.map +1 -0
  68. package/dist/commands/init/index.d.ts.map +1 -1
  69. package/dist/commands/init/index.js +33 -0
  70. package/dist/commands/init/index.js.map +1 -1
  71. package/dist/commands/init/mock-vite.d.ts +54 -0
  72. package/dist/commands/init/mock-vite.d.ts.map +1 -0
  73. package/dist/commands/init/mock-vite.js +613 -0
  74. package/dist/commands/init/mock-vite.js.map +1 -0
  75. package/dist/commands/init/mock.d.ts +6 -0
  76. package/dist/commands/init/mock.d.ts.map +1 -1
  77. package/dist/commands/init/mock.js +20 -4
  78. package/dist/commands/init/mock.js.map +1 -1
  79. package/dist/commands/init/plan.d.ts +26 -1
  80. package/dist/commands/init/plan.d.ts.map +1 -1
  81. package/dist/commands/init/plan.js +41 -3
  82. package/dist/commands/init/plan.js.map +1 -1
  83. package/dist/commands/init/templates.d.ts.map +1 -1
  84. package/dist/commands/init/templates.js +12 -4
  85. package/dist/commands/init/templates.js.map +1 -1
  86. package/dist/commands/knowledge-add.d.ts +52 -0
  87. package/dist/commands/knowledge-add.d.ts.map +1 -0
  88. package/dist/commands/knowledge-add.js +232 -0
  89. package/dist/commands/knowledge-add.js.map +1 -0
  90. package/dist/commands/map/emit-typeorm.d.ts +117 -0
  91. package/dist/commands/map/emit-typeorm.d.ts.map +1 -0
  92. package/dist/commands/map/emit-typeorm.js +341 -0
  93. package/dist/commands/map/emit-typeorm.js.map +1 -0
  94. package/dist/commands/map/index.d.ts +18 -0
  95. package/dist/commands/map/index.d.ts.map +1 -1
  96. package/dist/commands/map/index.js +28 -0
  97. package/dist/commands/map/index.js.map +1 -1
  98. package/dist/commands/plate/agent.d.ts +7 -0
  99. package/dist/commands/plate/agent.d.ts.map +1 -1
  100. package/dist/commands/plate/agent.js +1 -1
  101. package/dist/commands/plate/agent.js.map +1 -1
  102. package/dist/commands/plate/index.d.ts.map +1 -1
  103. package/dist/commands/plate/index.js +6 -0
  104. package/dist/commands/plate/index.js.map +1 -1
  105. package/dist/commands/recon/index.d.ts +16 -3
  106. package/dist/commands/recon/index.d.ts.map +1 -1
  107. package/dist/commands/recon/index.js +267 -16
  108. package/dist/commands/recon/index.js.map +1 -1
  109. package/dist/commands/recon/migration-gate.d.ts +59 -0
  110. package/dist/commands/recon/migration-gate.d.ts.map +1 -0
  111. package/dist/commands/recon/migration-gate.js +131 -0
  112. package/dist/commands/recon/migration-gate.js.map +1 -0
  113. package/dist/commands/recon/reuse.d.ts +32 -0
  114. package/dist/commands/recon/reuse.d.ts.map +1 -1
  115. package/dist/commands/recon/reuse.js +66 -0
  116. package/dist/commands/recon/reuse.js.map +1 -1
  117. package/dist/commands/recon/stale-stubs.d.ts +65 -0
  118. package/dist/commands/recon/stale-stubs.d.ts.map +1 -0
  119. package/dist/commands/recon/stale-stubs.js +84 -0
  120. package/dist/commands/recon/stale-stubs.js.map +1 -0
  121. package/dist/commands/refine/agent.d.ts +23 -0
  122. package/dist/commands/refine/agent.d.ts.map +1 -1
  123. package/dist/commands/refine/agent.js +245 -15
  124. package/dist/commands/refine/agent.js.map +1 -1
  125. package/dist/commands/refine/brownfield-answer.d.ts +81 -0
  126. package/dist/commands/refine/brownfield-answer.d.ts.map +1 -0
  127. package/dist/commands/refine/brownfield-answer.js +231 -0
  128. package/dist/commands/refine/brownfield-answer.js.map +1 -0
  129. package/dist/commands/refine/context.d.ts +27 -1
  130. package/dist/commands/refine/context.d.ts.map +1 -1
  131. package/dist/commands/refine/context.js +438 -6
  132. package/dist/commands/refine/context.js.map +1 -1
  133. package/dist/commands/refine/git-attention.d.ts +123 -0
  134. package/dist/commands/refine/git-attention.d.ts.map +1 -0
  135. package/dist/commands/refine/git-attention.js +378 -0
  136. package/dist/commands/refine/git-attention.js.map +1 -0
  137. package/dist/commands/refine/history-index.d.ts +66 -0
  138. package/dist/commands/refine/history-index.d.ts.map +1 -1
  139. package/dist/commands/refine/history-index.js +195 -8
  140. package/dist/commands/refine/history-index.js.map +1 -1
  141. package/dist/commands/refine/index.d.ts.map +1 -1
  142. package/dist/commands/refine/index.js +105 -18
  143. package/dist/commands/refine/index.js.map +1 -1
  144. package/dist/commands/refine/multifurcate.d.ts +129 -0
  145. package/dist/commands/refine/multifurcate.d.ts.map +1 -0
  146. package/dist/commands/refine/multifurcate.js +247 -0
  147. package/dist/commands/refine/multifurcate.js.map +1 -0
  148. package/dist/commands/refine/proposals-synth.d.ts +50 -1
  149. package/dist/commands/refine/proposals-synth.d.ts.map +1 -1
  150. package/dist/commands/refine/proposals-synth.js +199 -35
  151. package/dist/commands/refine/proposals-synth.js.map +1 -1
  152. package/dist/commands/refine/spec-yaml.d.ts +214 -1210
  153. package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
  154. package/dist/commands/refine/spec-yaml.js +10 -0
  155. package/dist/commands/refine/spec-yaml.js.map +1 -1
  156. package/dist/commands/refresh-knowledge.d.ts +139 -0
  157. package/dist/commands/refresh-knowledge.d.ts.map +1 -0
  158. package/dist/commands/refresh-knowledge.js +1029 -0
  159. package/dist/commands/refresh-knowledge.js.map +1 -0
  160. package/dist/commands/run-mock/index.d.ts.map +1 -1
  161. package/dist/commands/run-mock/index.js +135 -22
  162. package/dist/commands/run-mock/index.js.map +1 -1
  163. package/dist/commands/testgen/agent.d.ts +13 -0
  164. package/dist/commands/testgen/agent.d.ts.map +1 -1
  165. package/dist/commands/testgen/agent.js +137 -11
  166. package/dist/commands/testgen/agent.js.map +1 -1
  167. package/dist/commands/upsert-agent-docs.d.ts +48 -0
  168. package/dist/commands/upsert-agent-docs.d.ts.map +1 -0
  169. package/dist/commands/upsert-agent-docs.js +298 -0
  170. package/dist/commands/upsert-agent-docs.js.map +1 -0
  171. package/dist/commands/vibe/agent.d.ts +7 -0
  172. package/dist/commands/vibe/agent.d.ts.map +1 -1
  173. package/dist/commands/vibe/agent.js +2 -2
  174. package/dist/commands/vibe/agent.js.map +1 -1
  175. package/dist/commands/vibe/index.d.ts.map +1 -1
  176. package/dist/commands/vibe/index.js +7 -1
  177. package/dist/commands/vibe/index.js.map +1 -1
  178. package/dist/cost-store.d.ts +52 -0
  179. package/dist/cost-store.d.ts.map +1 -0
  180. package/dist/cost-store.js +108 -0
  181. package/dist/cost-store.js.map +1 -0
  182. package/dist/lib/budget.d.ts +73 -0
  183. package/dist/lib/budget.d.ts.map +1 -0
  184. package/dist/lib/budget.js +225 -0
  185. package/dist/lib/budget.js.map +1 -0
  186. package/dist/lib/mock-shape.d.ts +29 -0
  187. package/dist/lib/mock-shape.d.ts.map +1 -0
  188. package/dist/lib/mock-shape.js +77 -0
  189. package/dist/lib/mock-shape.js.map +1 -0
  190. package/dist/lib/read-only.d.ts +22 -0
  191. package/dist/lib/read-only.d.ts.map +1 -0
  192. package/dist/lib/read-only.js +34 -0
  193. package/dist/lib/read-only.js.map +1 -0
  194. package/package.json +17 -12
@@ -0,0 +1,252 @@
1
+ /**
2
+ * 0.19.0-α.35 (sc#66 follow-up) — `slowcook budget` subcommand.
3
+ *
4
+ * slowcook budget # show config + month-to-date spend
5
+ * slowcook budget set --monthly 50 # set monthly_budget_usd
6
+ * slowcook budget set --monthly 50 --start-day 15 --story 10
7
+ * slowcook budget rm # delete config (disables gauge)
8
+ *
9
+ * Writes/reads `.brewing/budget.yaml`. Idempotent: `set` merges into
10
+ * existing config; absent flags keep their current values; missing
11
+ * monthly_budget_usd on a brand-new config defaults nothing (must be
12
+ * supplied at least once).
13
+ */
14
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ import YAML from "yaml";
17
+ import { loadBudgetConfig, aggregateMonthSpend, aggregateSpendSince, currentPeriodStart, classifyBudgetStatus, } from "../../lib/budget.js";
18
+ function parseArgs(argv) {
19
+ const args = { cwd: process.cwd(), action: "show" };
20
+ const positional = [];
21
+ for (let i = 0; i < argv.length; i++) {
22
+ const arg = argv[i];
23
+ const next = argv[i + 1];
24
+ if (arg === "--cwd" && next) {
25
+ args.cwd = next;
26
+ i++;
27
+ }
28
+ else if (arg === "--monthly" && next) {
29
+ args.monthly = Number(next);
30
+ i++;
31
+ }
32
+ else if (arg === "--start-day" && next) {
33
+ args.startDay = Number(next);
34
+ i++;
35
+ }
36
+ else if (arg === "--story" && next) {
37
+ args.story = Number(next);
38
+ i++;
39
+ }
40
+ else if (arg === "--credit" && next) {
41
+ args.credit = Number(next);
42
+ i++;
43
+ }
44
+ else if (arg === "--credit-baseline" && next) {
45
+ args.creditBaselineAt = next;
46
+ i++;
47
+ }
48
+ else if (arg === "--help" || arg === "-h") {
49
+ printHelp();
50
+ process.exit(0);
51
+ }
52
+ else if (arg && !arg.startsWith("--")) {
53
+ positional.push(arg);
54
+ }
55
+ }
56
+ const verb = positional[0];
57
+ if (verb === "set" || verb === "rm")
58
+ args.action = verb;
59
+ else if (verb && verb !== "show") {
60
+ throw new Error(`Unknown budget action: ${verb}. Use show | set | rm.`);
61
+ }
62
+ return args;
63
+ }
64
+ function printHelp() {
65
+ console.log(`
66
+ slowcook budget — manage the project budget(s) for the fuel gauge
67
+
68
+ Two independent gauges, both optional, both opt-in:
69
+
70
+ monthly_budget_usd A per-period cap that resets each month.
71
+ credit_balance_usd A non-recurring credit deposit (e.g. you topped
72
+ up $25 on Anthropic and DON'T have auto-recharge);
73
+ the gauge subtracts ALL-TIME spend from this.
74
+
75
+ Usage:
76
+ slowcook budget Show current config + spend
77
+ slowcook budget set --monthly <usd> Set the monthly cap
78
+ slowcook budget set --monthly 50 --start-day 15 Non-1st reset day
79
+ slowcook budget set --credit <usd> Track a one-shot deposit
80
+ slowcook budget set --story <usd> Optional per-story ceiling
81
+ slowcook budget rm Delete .brewing/budget.yaml
82
+
83
+ Flags:
84
+ --monthly <usd> Monthly budget in USD. Resets each period.
85
+ --start-day <1-31> Calendar day the monthly budget resets. Default 1.
86
+ --credit <usd> One-shot credit deposit. Captures the date of set as
87
+ a baseline; spend tracked from there. Re-run to top up.
88
+ --story <usd> Optional per-story informational ceiling.
89
+ --cwd <path> Project root. Defaults to current working dir.
90
+
91
+ When set, every refine comment appends:
92
+ ⛽ Project this month: $X of $Y (monthly cap)
93
+ 🪙 Anthropic credit: $X of $Y (credit balance)
94
+
95
+ Both fire ⚠️ at 80% and 🛑 at 95%.
96
+
97
+ Top-up workflow (no auto-recharge):
98
+ $ slowcook budget set --credit 25 # at the start of $25 deposit
99
+ ... burn through credit ...
100
+ $ slowcook budget set --credit 50 # after topping up to $50 (new baseline)
101
+ `);
102
+ }
103
+ function configPath(cwd) {
104
+ return join(cwd, ".brewing", "budget.yaml");
105
+ }
106
+ function fmtUsd(n) {
107
+ return `$${n.toFixed(2)}`;
108
+ }
109
+ export async function budget(argv) {
110
+ let parsed;
111
+ try {
112
+ parsed = parseArgs(argv);
113
+ }
114
+ catch (e) {
115
+ console.error(e.message);
116
+ process.exit(2);
117
+ }
118
+ if (parsed.action === "rm") {
119
+ const p = configPath(parsed.cwd);
120
+ if (!existsSync(p)) {
121
+ console.log(`No .brewing/budget.yaml — nothing to remove.`);
122
+ return;
123
+ }
124
+ unlinkSync(p);
125
+ console.log(`Removed ${p}. Fuel gauge now disabled.`);
126
+ return;
127
+ }
128
+ if (parsed.action === "set") {
129
+ // Merge into existing config; allow updating individual fields.
130
+ let existing = null;
131
+ try {
132
+ existing = loadBudgetConfig(parsed.cwd);
133
+ }
134
+ catch (e) {
135
+ console.error(`Existing config is invalid — fix or rm first: ${e.message}`);
136
+ process.exit(2);
137
+ }
138
+ const monthly = parsed.monthly ?? existing?.monthly_budget_usd;
139
+ if (monthly !== undefined && (!Number.isFinite(monthly) || monthly <= 0)) {
140
+ console.error(`--monthly must be a positive number, got ${parsed.monthly}`);
141
+ process.exit(2);
142
+ }
143
+ const startDay = parsed.startDay ?? existing?.monthly_start_day ?? 1;
144
+ if (!Number.isInteger(startDay) || startDay < 1 || startDay > 31) {
145
+ console.error(`--start-day must be an integer 1-31, got ${parsed.startDay}`);
146
+ process.exit(2);
147
+ }
148
+ const story = parsed.story ?? existing?.story_budget_usd;
149
+ if (story !== undefined && (!Number.isFinite(story) || story <= 0)) {
150
+ console.error(`--story must be a positive number, got ${parsed.story}`);
151
+ process.exit(2);
152
+ }
153
+ // Credit handling — a fresh --credit captures "now" as the
154
+ // baseline. Re-running --credit (top-up) refreshes the baseline so
155
+ // the gauge tracks ONLY spend from the new deposit forward.
156
+ let credit = existing?.credit_balance_usd;
157
+ let creditBaselineAt = existing?.credit_baseline_at;
158
+ if (parsed.credit !== undefined) {
159
+ if (!Number.isFinite(parsed.credit) || parsed.credit <= 0) {
160
+ console.error(`--credit must be a positive number, got ${parsed.credit}`);
161
+ process.exit(2);
162
+ }
163
+ credit = parsed.credit;
164
+ creditBaselineAt = parsed.creditBaselineAt ?? new Date().toISOString();
165
+ }
166
+ if (monthly === undefined && credit === undefined) {
167
+ console.error(`Set at least one of --monthly or --credit. Try: slowcook budget set --credit 25`);
168
+ process.exit(2);
169
+ }
170
+ const next = {
171
+ schema_version: 1,
172
+ monthly_start_day: startDay,
173
+ ...(monthly !== undefined ? { monthly_budget_usd: monthly } : {}),
174
+ ...(story !== undefined ? { story_budget_usd: story } : {}),
175
+ ...(credit !== undefined ? { credit_balance_usd: credit } : {}),
176
+ ...(creditBaselineAt !== undefined ? { credit_baseline_at: creditBaselineAt } : {}),
177
+ };
178
+ const p = configPath(parsed.cwd);
179
+ mkdirSync(join(parsed.cwd, ".brewing"), { recursive: true });
180
+ writeFileSync(p, YAML.stringify(next, { lineWidth: 0 }), "utf8");
181
+ const verb = existing ? "Updated" : "Wrote";
182
+ console.log(`${verb} ${p}`);
183
+ console.log(readFileSync(p, "utf8"));
184
+ return;
185
+ }
186
+ // show
187
+ let config;
188
+ try {
189
+ config = loadBudgetConfig(parsed.cwd);
190
+ }
191
+ catch (e) {
192
+ console.error(`Config at ${configPath(parsed.cwd)} is invalid: ${e.message}`);
193
+ process.exit(2);
194
+ }
195
+ if (!config) {
196
+ console.log(`No .brewing/budget.yaml — fuel gauge disabled.`);
197
+ console.log(`Set one with: slowcook budget set --credit 25 (one-shot deposit)`);
198
+ console.log(` or: slowcook budget set --monthly 50 (recurring cap)`);
199
+ return;
200
+ }
201
+ const now = new Date();
202
+ console.log(`Config: ${configPath(parsed.cwd)}`);
203
+ if (config.monthly_budget_usd !== undefined) {
204
+ console.log(` monthly_budget_usd: ${fmtUsd(config.monthly_budget_usd)}`);
205
+ console.log(` monthly_start_day: ${config.monthly_start_day}`);
206
+ }
207
+ if (config.story_budget_usd !== undefined) {
208
+ console.log(` story_budget_usd: ${fmtUsd(config.story_budget_usd)}`);
209
+ }
210
+ if (config.credit_balance_usd !== undefined) {
211
+ console.log(` credit_balance_usd: ${fmtUsd(config.credit_balance_usd)}`);
212
+ console.log(` credit_baseline_at: ${config.credit_baseline_at ?? "(unset)"}`);
213
+ }
214
+ console.log(``);
215
+ if (config.monthly_budget_usd !== undefined) {
216
+ const period = currentPeriodStart(config, now);
217
+ const spend = aggregateMonthSpend(parsed.cwd, config, now);
218
+ const status = classifyBudgetStatus(spend.usd, config.monthly_budget_usd);
219
+ const pct = Math.round((spend.usd / config.monthly_budget_usd) * 100);
220
+ const icon = status === "halt" ? "🛑" : status === "warn" ? "⚠️" : "⛽";
221
+ console.log(`Period start: ${period.toISOString().slice(0, 10)}`);
222
+ console.log(`${icon} Spent this period: ${fmtUsd(spend.usd)} of ${fmtUsd(config.monthly_budget_usd)} (${pct}%)`);
223
+ console.log(` ${spend.entryCount} entr${spend.entryCount === 1 ? "y" : "ies"} across ${spend.storyCount} stor${spend.storyCount === 1 ? "y" : "ies"}.`);
224
+ if (status === "warn") {
225
+ console.log(` ⚠️ approaching monthly budget — consider topping up.`);
226
+ }
227
+ else if (status === "halt") {
228
+ console.log(` 🛑 over budget — agents will halt without the override-budget label.`);
229
+ }
230
+ console.log(``);
231
+ }
232
+ if (config.credit_balance_usd !== undefined && config.credit_baseline_at) {
233
+ const baseline = new Date(config.credit_baseline_at);
234
+ const spend = aggregateSpendSince(parsed.cwd, baseline);
235
+ const status = classifyBudgetStatus(spend.usd, config.credit_balance_usd);
236
+ const remaining = Math.max(0, config.credit_balance_usd - spend.usd);
237
+ const pctLeft = Math.max(0, 100 - Math.round((spend.usd / config.credit_balance_usd) * 100));
238
+ const icon = status === "halt" ? "🛑" : status === "warn" ? "⚠️" : "🪙";
239
+ console.log(`Credit baseline: ${config.credit_baseline_at.slice(0, 10)}`);
240
+ console.log(`${icon} Anthropic credit: ${fmtUsd(remaining)} of ${fmtUsd(config.credit_balance_usd)} remaining (${pctLeft}%)`);
241
+ console.log(` Spent ${fmtUsd(spend.usd)} since baseline. ${spend.entryCount} entr${spend.entryCount === 1 ? "y" : "ies"}.`);
242
+ if (status === "warn") {
243
+ console.log(` ⚠️ approaching empty — top up at https://console.anthropic.com/settings/billing.`);
244
+ console.log(` Then: slowcook budget set --credit <new-total> # captures fresh baseline`);
245
+ }
246
+ else if (status === "halt") {
247
+ console.log(` 🛑 credit nearly exhausted — pipeline will halt on 402 imminently.`);
248
+ console.log(` Top up + re-run: slowcook budget set --credit <new-total>`);
249
+ }
250
+ }
251
+ }
252
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/budget/index.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,17 @@
8
8
  * ChefVerdict, applies edits surgically, validates, commits, posts an
9
9
  * audit comment.
10
10
  *
11
- * Frozen surface (HARD): never edits tests/, vitest.config.*,
12
- * .brewing/{auto-gen}/. If a fix requires test edits → escalates to PM
13
- * via a two-option pm_comment (option B = `testgen --regenerate`).
11
+ * Frozen surface (HARD): tests/integration/, tests/schema/,
12
+ * tests/acceptance/ (spec-contract assertions) + .brewing/auto-gen/,
13
+ * .brewing/code-map.*, .brewing/recon-result.json, .brewing/history-
14
+ * index.json (slowcook-managed artifacts). If a fix requires an
15
+ * ASSERTION change → escalates to PM via pm_comment (option B =
16
+ * testgen --regenerate).
17
+ *
18
+ * NOT frozen (α.54 — chef owns test infrastructure):
19
+ * tests/helpers/, vitest.config.*, playwright.config.*, package.json
20
+ * (devDeps), tsconfig.json, setup files. Chef can fix the runner
21
+ * machinery freehand.
14
22
  *
15
23
  * Ledger at .brewing/chef/<story-id>.json tracks moves + cost. Cycle
16
24
  * detection + budget cap enforce convergence.
@@ -21,6 +29,8 @@
21
29
  * --trigger mock_isolation_check_failed \
22
30
  * --trigger-detail "Relative import resolves to a non-existent file..."
23
31
  */
32
+ import { type ChefVerdict } from "@slowcook-ai/llm-anthropic";
33
+ export declare function isFrozenPath(path: string): boolean;
24
34
  /**
25
35
  * Parse a vitest-style test runner output to extract the failing test
26
36
  * files. Brew agent halts include the runner's stdout/stderr; chef
@@ -60,5 +70,24 @@ export declare function collectImportedSourceFiles(testContents: Record<string,
60
70
  * different `exists` predicate).
61
71
  */
62
72
  export declare function resolveImportToFile(importPath: string, testFile: string, repoRoot: string, exists: (p: string) => boolean): string | null;
63
- export declare function chefDrift(argv: string[], _cliVersion: string): Promise<void>;
73
+ export declare function chefDrift(argv: string[], cliVersion: string): Promise<void>;
74
+ /**
75
+ * α.53 — extract whatever signal we can from a malformed chef JSON.
76
+ *
77
+ * The model often returns valid prose (`"rationale": "long sentence about
78
+ * what's wrong"`) but the JSON envelope breaks if the rationale runs past
79
+ * Anthropic's max-tokens midstring or contains an unescaped quote.
80
+ *
81
+ * Strategy:
82
+ * 1. Look for ```json fence — strip it.
83
+ * 2. Try a quick "auto-close unterminated string" repair: count
84
+ * unescaped quotes; if odd, append a closing quote + `}` and retry
85
+ * JSON.parse.
86
+ * 3. If still broken, regex-extract the `"rationale"` field value up
87
+ * to wherever it terminates (literal quote or end of buffer).
88
+ * 4. Build a pm_question verdict with the recovered rationale plus a
89
+ * bookkeeping note about the parse failure. Empty edits, no
90
+ * next-dispatch — the PM is the next step.
91
+ */
92
+ export declare function recoverChefVerdictFromMalformedJson(rawText: string, parseError: string, storyId: string, issueNumber: number): ChefVerdict;
64
93
  //# sourceMappingURL=drift-fix.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"drift-fix.d.ts","sourceRoot":"","sources":["../../../src/commands/chef/drift-fix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAiEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IACjD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,CA0BA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAgBzG;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,GAC7B,MAAM,GAAG,IAAI,CAsBf;AA0YD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0WlF"}
1
+ {"version":3,"file":"drift-fix.d.ts","sourceRoot":"","sources":["../../../src/commands/chef/drift-fix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAKH,OAAO,EAIL,KAAK,WAAW,EAEjB,MAAM,4BAA4B,CAAC;AAqGpC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQlD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IACjD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,CA0BA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CA+BzG;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,GAC7B,MAAM,GAAG,IAAI,CA4Bf;AA+dD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAidjF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,WAAW,CA4Db"}