@rsaglobaltech/specgate 0.22.3 → 0.24.0

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 (28) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/packages/core/src/domain/DoneVerification.js +21 -2
  3. package/dist/packages/core/src/domain/DoneVerification.js.map +1 -1
  4. package/dist/packages/core/test/unit/done-verification.test.js +18 -0
  5. package/dist/packages/core/test/unit/done-verification.test.js.map +1 -1
  6. package/dist/scripts/cli/commands/harness/RunCommand.js +50 -5
  7. package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
  8. package/dist/scripts/cli/commands/quality/CheckCommand.js +6 -0
  9. package/dist/scripts/cli/commands/quality/CheckCommand.js.map +1 -1
  10. package/dist/scripts/cli/commands/spec/DoneCommand.js +2 -1
  11. package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -1
  12. package/dist/scripts/cli/commands/spec/StudioCommand.js +31 -0
  13. package/dist/scripts/cli/commands/spec/StudioCommand.js.map +1 -1
  14. package/dist/scripts/harness/events.js +57 -0
  15. package/dist/scripts/harness/events.js.map +1 -1
  16. package/dist/scripts/lib/harness-events.js +32 -1
  17. package/dist/scripts/lib/harness-events.js.map +1 -1
  18. package/dist/scripts/lib/harness-guard.js +186 -0
  19. package/dist/scripts/lib/harness-guard.js.map +1 -0
  20. package/dist/scripts/lib/in-flight.js +17 -4
  21. package/dist/scripts/lib/in-flight.js.map +1 -1
  22. package/dist/scripts/lib/live-detail.js +345 -0
  23. package/dist/scripts/lib/live-detail.js.map +1 -0
  24. package/dist/scripts/lib/live-model.js +158 -9
  25. package/dist/scripts/lib/live-model.js.map +1 -1
  26. package/dist/scripts/lib/live-page.js +599 -67
  27. package/dist/scripts/lib/live-page.js.map +1 -1
  28. package/package.json +1 -1
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.requirementDetail = requirementDetail;
37
+ exports.liveMatrix = liveMatrix;
38
+ const fs = __importStar(require("node:fs"));
39
+ const path = __importStar(require("node:path"));
40
+ const harness_events_1 = require("./harness-events");
41
+ const ID = /^REQ-\d+$/;
42
+ const SKIP = new Set([
43
+ "node_modules",
44
+ ".git",
45
+ ".next",
46
+ "dist",
47
+ "build",
48
+ "coverage",
49
+ "test-results",
50
+ ".harness",
51
+ ".specgate",
52
+ "target",
53
+ ]);
54
+ const TEST_FILE = /(\.|-|_)(test|spec)\.[cm]?[jt]sx?$|Test\.(java|kt)$|_test\.(go|py)$|test_.*\.py$/;
55
+ const MAX_FILES = 4000;
56
+ function relative(projectDir, file) {
57
+ return path.relative(projectDir, file).split(path.sep).join("/");
58
+ }
59
+ function walk(dir, visit, budget = { left: MAX_FILES }) {
60
+ let entries = [];
61
+ try {
62
+ entries = fs.readdirSync(dir, { withFileTypes: true });
63
+ }
64
+ catch {
65
+ return;
66
+ }
67
+ for (const e of entries) {
68
+ if (budget.left <= 0)
69
+ return;
70
+ if (e.isDirectory()) {
71
+ if (!SKIP.has(e.name))
72
+ walk(path.join(dir, e.name), visit, budget);
73
+ }
74
+ else {
75
+ budget.left -= 1;
76
+ visit(path.join(dir, e.name));
77
+ }
78
+ }
79
+ }
80
+ function read(file) {
81
+ try {
82
+ return fs.readFileSync(file, "utf8");
83
+ }
84
+ catch {
85
+ return "";
86
+ }
87
+ }
88
+ /** The requirement's block in spec.md, a capability spec or an open change's delta. */
89
+ function findBlock(projectDir, id) {
90
+ const files = [path.join(projectDir, "spec.md")];
91
+ walk(path.join(projectDir, "docs", "specs"), (f) => {
92
+ const rel = relative(projectDir, f);
93
+ if (f.endsWith(".md") &&
94
+ !rel.includes("/changes/archive/") &&
95
+ path.basename(f) !== "DRAFTING.md")
96
+ files.push(f);
97
+ });
98
+ const head = new RegExp(`^(##|###\\s+Requirement:)\\s+${id}\\s+[—–-]\\s+(.+?)\\s*$`);
99
+ for (const file of files) {
100
+ const lines = read(file).replace(/\r\n/g, "\n").split("\n");
101
+ const at = lines.findIndex((l) => head.test(l));
102
+ if (at < 0)
103
+ continue;
104
+ const level = lines[at].startsWith("###") ? 3 : 2;
105
+ let end = lines.length;
106
+ for (let i = at + 1; i < lines.length; i++) {
107
+ const h = /^(#{1,3})\s/.exec(lines[i]);
108
+ if (h && h[1].length <= level) {
109
+ end = i;
110
+ break;
111
+ }
112
+ }
113
+ return { file, line: at + 1, title: head.exec(lines[at])[2], body: lines.slice(at + 1, end) };
114
+ }
115
+ return null;
116
+ }
117
+ function groupOf(rel) {
118
+ const parts = rel.split("/");
119
+ const at = parts.findIndex((p) => p === "changes" || p === "capabilities");
120
+ return at >= 0 && parts[at + 1] ? parts[at + 1].replace(/^draft-/, "") : "";
121
+ }
122
+ function attemptsOf(projectDir, id) {
123
+ const text = read(path.join(projectDir, harness_events_1.EVENTS_DIR, `${id}.jsonl`));
124
+ const events = [];
125
+ for (const line of text.split("\n")) {
126
+ if (!line.trim())
127
+ continue;
128
+ try {
129
+ events.push(JSON.parse(line));
130
+ }
131
+ catch {
132
+ /* a line being written */
133
+ }
134
+ }
135
+ // Each "attempt start" opens a new attempt, in the order they happened: a
136
+ // later run numbers its attempts from 1 again in the same file.
137
+ const runs = [];
138
+ for (const e of events) {
139
+ const n = Number(e.attempt) || 1;
140
+ const isStart = e.type === "attempt" && e.state === "start";
141
+ if (isStart || runs.length === 0 || runs[runs.length - 1][0] !== n)
142
+ runs.push([n, []]);
143
+ runs[runs.length - 1][1].push(e);
144
+ }
145
+ const attempts = runs.map(([attempt, list]) => {
146
+ const start = list.find((e) => e.type === "attempt" && e.state === "start") || list[0];
147
+ const end = list.find((e) => e.type === "attempt" && e.state === "end");
148
+ const gates = list
149
+ .filter((e) => e.type === "gate")
150
+ .map((e) => ({ stage: String(e.stage || ""), result: String(e.result || "") }));
151
+ const failed = gates.find((g) => g.result !== "pass");
152
+ const started = Number(start.t) || 0;
153
+ const last = Number((end || list[list.length - 1]).t) || started;
154
+ return {
155
+ attempt,
156
+ result: (end ? (end.result === "pass" ? "pass" : "fail") : "running"),
157
+ started,
158
+ duration: Math.max(0, last - started),
159
+ failedAt: failed ? failed.stage : null,
160
+ gates,
161
+ list,
162
+ };
163
+ });
164
+ const latest = attempts[attempts.length - 1];
165
+ const files = new Map();
166
+ for (const e of latest ? latest.list : []) {
167
+ if (e.type !== "step" || (e.kind !== "edit" && e.kind !== "write") || !e.target)
168
+ continue;
169
+ const f = files.get(String(e.target)) || { added: 0, removed: 0 };
170
+ f.added += Number(e.added) || 0;
171
+ f.removed += Number(e.removed) || 0;
172
+ files.set(String(e.target), f);
173
+ }
174
+ return {
175
+ attempts: attempts.map(({ list: _list, ...a }) => a),
176
+ files: [...files.entries()].map(([p, f]) => ({ path: p, ...f })),
177
+ };
178
+ }
179
+ function requirementDetail(projectDir, id) {
180
+ if (!ID.test(id))
181
+ return null;
182
+ const block = findBlock(projectDir, id);
183
+ const rel = block ? relative(projectDir, block.file) : "";
184
+ const body = block ? block.body : [];
185
+ const trace = body.find((l) => l.includes("specgate:trace")) || "";
186
+ const status = (/status="?([A-Za-z ]+?)"?(\s|-->)/.exec(trace) || [])[1] || "Draft";
187
+ const firstScenario = body.findIndex((l) => /^#{3,4}\s+Scenario:/.test(l));
188
+ const statement = (firstScenario >= 0 ? body.slice(0, firstScenario) : body)
189
+ .filter((l) => l.trim() && !l.includes("<!--") && !l.startsWith(">"))
190
+ .join(" ")
191
+ .replace(/\s+/g, " ")
192
+ .trim();
193
+ const scenarios = [];
194
+ for (const l of body) {
195
+ const s = /^#{3,4}\s+Scenario:\s+(SCN-[\w.]+)\s+[—–-]\s+(.+)$/.exec(l);
196
+ if (s)
197
+ scenarios.push({ id: s[1], title: s[2].trim(), steps: [] });
198
+ else if (scenarios.length && /^\s*-\s+(GIVEN|WHEN|THEN|AND|BUT)\b/i.test(l)) {
199
+ scenarios[scenarios.length - 1].steps.push(l.replace(/^\s*-\s+/, "").trim());
200
+ }
201
+ }
202
+ const named = new RegExp(`\\b${id}\\b`);
203
+ const features = [];
204
+ walk(path.join(projectDir, "features"), (f) => {
205
+ if (f.endsWith(".feature") && named.test(read(f)))
206
+ features.push(relative(projectDir, f));
207
+ });
208
+ const tests = [];
209
+ walk(projectDir, (f) => {
210
+ const r = relative(projectDir, f);
211
+ if (r.startsWith("docs/") || r.startsWith("features/"))
212
+ return;
213
+ if (TEST_FILE.test(path.basename(f)) && named.test(read(f)))
214
+ tests.push(r);
215
+ });
216
+ const assumptions = [];
217
+ if (block) {
218
+ // An open change keeps its assumptions beside its delta; a delivered
219
+ // requirement's are in the archived change that drafted it.
220
+ const changeDir = (/^(.*\/changes\/[^/]+)\//.exec(rel) || [])[1];
221
+ const sources = changeDir ? [path.join(projectDir, changeDir, "assumptions.md")] : [];
222
+ if (!changeDir) {
223
+ walk(path.join(projectDir, "docs", "specs", "changes", "archive"), (f) => {
224
+ if (path.basename(f) === "assumptions.md")
225
+ sources.push(f);
226
+ });
227
+ }
228
+ for (const source of sources) {
229
+ for (const row of read(source).split("\n")) {
230
+ const cells = row.split("|").map((c) => c.trim());
231
+ if (cells.length < 5 || !/^A\d+$/.test(cells[1]) || !named.test(cells[3] || ""))
232
+ continue;
233
+ assumptions.push({ id: cells[1], text: cells[2], status: cells[cells.length - 2] || "" });
234
+ }
235
+ }
236
+ }
237
+ const { attempts, files } = attemptsOf(projectDir, id);
238
+ return {
239
+ id,
240
+ title: block ? block.title : "",
241
+ status,
242
+ group: groupOf(rel),
243
+ statement,
244
+ source: block ? { file: rel, line: block.line } : null,
245
+ scenarios,
246
+ features,
247
+ tests,
248
+ assumptions,
249
+ attempts,
250
+ files,
251
+ };
252
+ }
253
+ /**
254
+ * The traceability matrix as it stands right now (REQ-181): delivered
255
+ * requirements as `specgate matrix` derives them, and those of open changes
256
+ * from their deltas, each scenario with its feature and the tests that name
257
+ * it. One walk of the project's test files serves every row.
258
+ */
259
+ function liveMatrix(projectDir) {
260
+ const testsNaming = new Map();
261
+ walk(projectDir, (f) => {
262
+ const r = relative(projectDir, f);
263
+ if (r.startsWith("docs/") || r.startsWith("features/") || !TEST_FILE.test(path.basename(f)))
264
+ return;
265
+ for (const m of read(f).matchAll(/\b(REQ-\d+|SCN-[\w.]+)\b/g)) {
266
+ if (!testsNaming.has(m[1]))
267
+ testsNaming.set(m[1], new Set());
268
+ testsNaming.get(m[1]).add(r);
269
+ }
270
+ });
271
+ const featureOf = new Map();
272
+ walk(path.join(projectDir, "features"), (f) => {
273
+ if (!f.endsWith(".feature"))
274
+ return;
275
+ for (const m of read(f).matchAll(/@(REQ-\d+)\b/g)) {
276
+ if (!featureOf.has(m[1]))
277
+ featureOf.set(m[1], relative(projectDir, f));
278
+ }
279
+ });
280
+ const testsFor = (req, scn) => [...new Set([...(testsNaming.get(scn) || []), ...(testsNaming.get(req) || [])])].sort();
281
+ const rows = [];
282
+ const seen = new Set();
283
+ const add = (row) => {
284
+ const key = row.requirement + "|" + row.scenario;
285
+ if (seen.has(key))
286
+ return;
287
+ seen.add(key);
288
+ rows.push(row);
289
+ };
290
+ // Every requirement block the specification holds: spec.md, capability
291
+ // specs, and open changes' deltas (never DRAFTING.md or the archive).
292
+ const files = [path.join(projectDir, "spec.md")];
293
+ walk(path.join(projectDir, "docs", "specs"), (f) => {
294
+ const rel = relative(projectDir, f);
295
+ if (f.endsWith(".md") &&
296
+ !rel.includes("/changes/archive/") &&
297
+ path.basename(f) !== "DRAFTING.md")
298
+ files.push(f);
299
+ });
300
+ const head = /^(?:##|###\s+Requirement:)\s+(REQ-\d+)\s+[—–-]\s+(.+?)\s*$/;
301
+ for (const file of files) {
302
+ const rel = relative(projectDir, file);
303
+ const inChange = rel.includes("/changes/");
304
+ const lines = read(file).replace(/\r\n/g, "\n").split("\n");
305
+ let current = null;
306
+ const flush = () => {
307
+ if (!current)
308
+ return;
309
+ const scns = current.scenarios.length ? current.scenarios : ["-"];
310
+ for (const scn of scns) {
311
+ add({
312
+ requirement: current.id,
313
+ title: current.title,
314
+ scenario: scn,
315
+ group: groupOf(rel) || (featureOf.get(current.id) || "").split("/")[1] || "",
316
+ feature: featureOf.get(current.id) || "",
317
+ tests: testsFor(current.id, scn),
318
+ status: current.status,
319
+ source: inChange ? "change" : "spec",
320
+ });
321
+ }
322
+ };
323
+ for (const l of lines) {
324
+ const h = head.exec(l);
325
+ if (h) {
326
+ flush();
327
+ current = { id: h[1], title: h[2], status: "Draft", scenarios: [] };
328
+ continue;
329
+ }
330
+ if (!current)
331
+ continue;
332
+ if (l.includes("specgate:trace")) {
333
+ const st = /status="?([A-Za-z ]+?)"?(\s|-->)/.exec(l);
334
+ if (st)
335
+ current.status = st[1];
336
+ }
337
+ const s = /^#{3,4}\s+Scenario:\s+(SCN-[\w.]+)/.exec(l);
338
+ if (s)
339
+ current.scenarios.push(s[1]);
340
+ }
341
+ flush();
342
+ }
343
+ return rows.sort((a, b) => a.requirement.localeCompare(b.requirement) || a.scenario.localeCompare(b.scenario));
344
+ }
345
+ //# sourceMappingURL=live-detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-detail.js","sourceRoot":"","sources":["../../../scripts/lib/live-detail.ts"],"names":[],"mappings":"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"}
@@ -33,12 +33,41 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.foldUsage = foldUsage;
36
37
  exports.foldRequirement = foldRequirement;
38
+ exports.requirementTitles = requirementTitles;
39
+ exports.readQueue = readQueue;
37
40
  exports.readLive = readLive;
38
41
  exports.liveSignature = liveSignature;
39
42
  const fs = __importStar(require("node:fs"));
40
43
  const path = __importStar(require("node:path"));
41
44
  const harness_events_1 = require("./harness-events");
45
+ /** Events about the agent's session rather than its work: not steps. */
46
+ const SESSION = new Set(["agent", "usage", "prompt"]);
47
+ const num = (v) => Number(v) || 0;
48
+ /** The usage lines of one attempt, folded. */
49
+ function foldUsage(events) {
50
+ const usages = events.filter((e) => e.type === "usage");
51
+ if (usages.length === 0)
52
+ return null;
53
+ const live = usages.filter((e) => e.final !== true);
54
+ const finals = usages.filter((e) => e.final === true);
55
+ const last = live[live.length - 1];
56
+ const sum = (k) => finals.reduce((a, e) => a + num(e[k]), 0);
57
+ const costs = finals.filter((e) => typeof e.cost === "number");
58
+ const turns = finals.filter((e) => typeof e.turns === "number");
59
+ return {
60
+ context: last ? num(last.context) : 0,
61
+ peak: Math.max(0, ...live.map((e) => num(e.context))),
62
+ window: Math.max(0, ...usages.map((e) => num(e.window))),
63
+ input: finals.length ? sum("input") : 0,
64
+ output: finals.length ? sum("output") : last ? num(last.output) : 0,
65
+ cacheRead: sum("cacheRead"),
66
+ cacheWrite: sum("cacheWrite"),
67
+ cost: costs.length ? costs.reduce((a, e) => a + num(e.cost), 0) : null,
68
+ turns: turns.length ? turns.reduce((a, e) => a + num(e.turns), 0) : null,
69
+ };
70
+ }
42
71
  const STEP_LIMIT = 50;
43
72
  function parse(lines) {
44
73
  const out = [];
@@ -58,14 +87,25 @@ function parse(lines) {
58
87
  function foldRequirement(req, events) {
59
88
  if (events.length === 0)
60
89
  return null;
61
- const attempt = Math.max(1, ...events.map((e) => Number(e.attempt) || 0));
62
- const mine = events.filter((e) => (Number(e.attempt) || attempt) === attempt);
90
+ // The last attempt is the one that started last, not the highest number: a
91
+ // new run counts from 1 again on the same events file (REQ-180).
92
+ const lastStart = events
93
+ .map((e) => e.type === "attempt" && e.state === "start")
94
+ .lastIndexOf(true);
95
+ const attempt = lastStart >= 0
96
+ ? Number(events[lastStart].attempt) || 1
97
+ : Math.max(1, ...events.map((e) => Number(e.attempt) || 0));
98
+ const mine = lastStart >= 0
99
+ ? events.slice(lastStart)
100
+ : events.filter((e) => (Number(e.attempt) || attempt) === attempt);
63
101
  const start = mine.find((e) => e.type === "attempt" && e.state === "start");
64
102
  const end = [...mine].reverse().find((e) => e.type === "attempt" && e.state === "end");
65
103
  const last = mine[mine.length - 1] || events[events.length - 1];
66
104
  const started = Number((start || mine[0] || last).t) || 0;
67
105
  const updated = Number(last.t) || started;
68
- const steps = mine.filter((e) => e.type !== "attempt");
106
+ const steps = mine.filter((e) => e.type !== "attempt" && !SESSION.has(String(e.type)));
107
+ const agentEv = [...mine].reverse().find((e) => e.type === "agent");
108
+ const promptEv = [...mine].reverse().find((e) => e.type === "prompt");
69
109
  const lastStep = [...steps].reverse().find((e) => e.type === "step" || e.type === "gate");
70
110
  const phase = end
71
111
  ? end.result === "pass"
@@ -86,6 +126,8 @@ function foldRequirement(req, events) {
86
126
  .find((e) => (e.kind === "test" || e.type === "gate") && (e.pass !== undefined || e.fail !== undefined));
87
127
  return {
88
128
  req,
129
+ title: "",
130
+ group: "",
89
131
  attempt,
90
132
  phase,
91
133
  state: end ? (end.result === "pass" ? "pass" : "fail") : "running",
@@ -95,6 +137,24 @@ function foldRequirement(req, events) {
95
137
  files,
96
138
  tests: lastTest ? { pass: Number(lastTest.pass) || 0, fail: Number(lastTest.fail) || 0 } : null,
97
139
  steps: steps.slice(-STEP_LIMIT).reverse(),
140
+ agent: agentEv
141
+ ? {
142
+ model: String(agentEv.model || ""),
143
+ version: String(agentEv.version || ""),
144
+ permission: String(agentEv.permission || ""),
145
+ tools: num(agentEv.tools),
146
+ }
147
+ : null,
148
+ usage: foldUsage(mine),
149
+ prompt: promptEv
150
+ ? {
151
+ role: String(promptEv.role || "agent"),
152
+ chars: num(promptEv.chars),
153
+ lines: num(promptEv.lines),
154
+ // About four characters a token: an estimate, and shown as one.
155
+ tokens: Math.round(num(promptEv.chars) / 4),
156
+ }
157
+ : null,
98
158
  };
99
159
  }
100
160
  function eventFiles(projectDir) {
@@ -110,9 +170,80 @@ function eventFiles(projectDir) {
110
170
  return [];
111
171
  }
112
172
  }
113
- /** Every requirement with events, the most recently active first. */
173
+ const TITLE = /^(?:##|###\s+Requirement:)\s+(REQ-\d+)\s+[—–-]\s+(.+?)\s*$/gm;
174
+ /**
175
+ * Requirement titles from spec.md and every markdown file under docs/specs —
176
+ * capability specs and open changes' deltas alike — so the live view can say
177
+ * what REQ-022 is (REQ-179). The first title found for an id wins.
178
+ */
179
+ function requirementTitles(projectDir) {
180
+ const titles = new Map();
181
+ const read = (file) => {
182
+ const parts = path.relative(projectDir, file).split(path.sep);
183
+ const at = parts.findIndex((p) => p === "changes" || p === "capabilities");
184
+ const group = at >= 0 && parts[at + 1] && parts[at + 1] !== "archive"
185
+ ? parts[at + 1].replace(/^draft-/, "")
186
+ : "";
187
+ let text = "";
188
+ try {
189
+ text = fs.readFileSync(file, "utf8");
190
+ }
191
+ catch {
192
+ return;
193
+ }
194
+ for (const m of text.matchAll(TITLE)) {
195
+ // A template's "<a short name>" is not a title.
196
+ if (!titles.has(m[1]) && !/[<>]/.test(m[2]))
197
+ titles.set(m[1], { title: m[2], group });
198
+ }
199
+ };
200
+ read(path.join(projectDir, "spec.md"));
201
+ const walk = (dir) => {
202
+ let entries = [];
203
+ try {
204
+ entries = fs.readdirSync(dir, { withFileTypes: true });
205
+ }
206
+ catch {
207
+ return;
208
+ }
209
+ for (const e of entries) {
210
+ const full = path.join(dir, e.name);
211
+ if (e.isDirectory())
212
+ walk(full);
213
+ // DRAFTING.md shows the format with an example requirement; it names none.
214
+ else if (e.name.endsWith(".md") && e.name !== "DRAFTING.md")
215
+ read(full);
216
+ }
217
+ };
218
+ walk(path.join(projectDir, "docs", "specs"));
219
+ return titles;
220
+ }
221
+ /** The run's queue and when it started, as the harness wrote it; empty when there is none. */
222
+ function readQueue(projectDir) {
223
+ try {
224
+ const q = JSON.parse(fs.readFileSync(path.join(projectDir, harness_events_1.EVENTS_DIR, harness_events_1.QUEUE_FILE), "utf8"));
225
+ const queue = Array.isArray(q.queue)
226
+ ? q.queue.filter((r) => typeof r === "string" && /^REQ-\d+$/.test(r))
227
+ : [];
228
+ return { t: num(q.t), queue };
229
+ }
230
+ catch {
231
+ return { t: 0, queue: [] };
232
+ }
233
+ }
234
+ /** Every requirement with events, the most recently active first; the run's queue and what it cost. */
114
235
  function readLive(projectDir) {
115
236
  const requirements = [];
237
+ const titles = requirementTitles(projectDir);
238
+ const { t: since, queue } = readQueue(projectDir);
239
+ const totals = {
240
+ input: 0,
241
+ output: 0,
242
+ cacheRead: 0,
243
+ cacheWrite: 0,
244
+ cost: null,
245
+ turns: 0,
246
+ };
116
247
  for (const file of eventFiles(projectDir)) {
117
248
  let text = "";
118
249
  try {
@@ -121,16 +252,34 @@ function readLive(projectDir) {
121
252
  catch {
122
253
  continue;
123
254
  }
124
- const folded = foldRequirement(path.basename(file, ".jsonl"), parse(text.split("\n")));
125
- if (folded)
126
- requirements.push(folded);
255
+ const events = parse(text.split("\n"));
256
+ // Every attempt of this run, not only the last: a retry is paid for too.
257
+ const run = foldUsage(events.filter((e) => num(e.t) >= since));
258
+ if (run) {
259
+ totals.input += run.input;
260
+ totals.output += run.output;
261
+ totals.cacheRead += run.cacheRead;
262
+ totals.cacheWrite += run.cacheWrite;
263
+ totals.turns += run.turns || 0;
264
+ if (run.cost !== null)
265
+ totals.cost = (totals.cost || 0) + run.cost;
266
+ }
267
+ const folded = foldRequirement(path.basename(file, ".jsonl"), events);
268
+ if (folded) {
269
+ const known = titles.get(folded.req);
270
+ requirements.push({
271
+ ...folded,
272
+ title: known ? known.title : "",
273
+ group: known ? known.group : "",
274
+ });
275
+ }
127
276
  }
128
277
  requirements.sort((a, b) => b.updated - a.updated);
129
- return { requirements };
278
+ return { requirements, queue, queueStarted: since, totals };
130
279
  }
131
280
  /** Changes whenever an event file is written: size and mtime of each. */
132
281
  function liveSignature(projectDir) {
133
- return eventFiles(projectDir)
282
+ return [...eventFiles(projectDir), path.join(projectDir, harness_events_1.EVENTS_DIR, harness_events_1.QUEUE_FILE)]
134
283
  .map((f) => {
135
284
  try {
136
285
  const st = fs.statSync(f);
@@ -1 +1 @@
1
- {"version":3,"file":"live-model.js","sourceRoot":"","sources":["../../../scripts/lib/live-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live-model.js","sourceRoot":"","sources":["../../../scripts/lib/live-model.ts"],"names":[],"mappings":"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"}