@wildorder/nightshift 0.4.0 → 0.6.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.
- package/dist/author.d.ts +3 -0
- package/dist/author.d.ts.map +1 -1
- package/dist/author.js +169 -18
- package/dist/author.js.map +1 -1
- package/dist/ci-init.d.ts +51 -0
- package/dist/ci-init.d.ts.map +1 -0
- package/dist/ci-init.js +274 -0
- package/dist/ci-init.js.map +1 -0
- package/dist/cli.js +99 -11
- package/dist/cli.js.map +1 -1
- package/dist/decide.d.ts.map +1 -1
- package/dist/decide.js +1 -1
- package/dist/decide.js.map +1 -1
- package/dist/exit-codes.d.ts +44 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +49 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/findings.d.ts +3 -21
- package/dist/findings.d.ts.map +1 -1
- package/dist/findings.js +0 -7
- package/dist/findings.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/program-branch.d.ts +65 -0
- package/dist/program-branch.d.ts.map +1 -0
- package/dist/program-branch.js +123 -0
- package/dist/program-branch.js.map +1 -0
- package/dist/publish.d.ts +105 -0
- package/dist/publish.d.ts.map +1 -0
- package/dist/publish.js +549 -0
- package/dist/publish.js.map +1 -0
- package/dist/report-path.d.ts +7 -0
- package/dist/report-path.d.ts.map +1 -0
- package/dist/report-path.js +10 -0
- package/dist/report-path.js.map +1 -0
- package/dist/review-pass.d.ts +64 -0
- package/dist/review-pass.d.ts.map +1 -0
- package/dist/review-pass.js +370 -0
- package/dist/review-pass.js.map +1 -0
- package/dist/run-program.d.ts +18 -0
- package/dist/run-program.d.ts.map +1 -1
- package/dist/run-program.js +369 -28
- package/dist/run-program.js.map +1 -1
- package/dist/run-publish.d.ts +41 -0
- package/dist/run-publish.d.ts.map +1 -0
- package/dist/run-publish.js +33 -0
- package/dist/run-publish.js.map +1 -0
- package/package.json +4 -3
- package/skills/plan-program/SKILL.md +14 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-pass.d.ts","sourceRoot":"","sources":["../src/review-pass.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA0CxD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,qFAAqF;IACrF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAID,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAoC9D;AAgFD,qFAAqF;AACrF,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,kBAAkB,CAUzE;AAED,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,MAAM,MAAM,UAAU,GAClB,WAAW,GACX,aAAa,GACb,gBAAgB,GAChB,aAAa,CAAC;AAElB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,OAAO,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC5E,2FAA2F;IAC3F,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7E;AAMD,4EAA4E;AAC5E,wBAAgB,qBAAqB,IAAI,iBAAiB,CAWzD;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CA+E5B;AA4BD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,IAAI,CAAC;CACjB;AAcD,gGAAgG;AAChG,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,WAAW,EAAE,CAuCf;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,iBAAiB,GACzB,MAAM,EAAE,CAmDV"}
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { countBySeverity, fingerprint, FINDING_CATEGORIES, SEVERITY_ORDER, } from "./findings.js";
|
|
3
|
+
import { decisionFingerprint } from "./decision.js";
|
|
4
|
+
/**
|
|
5
|
+
* The shared foundation both review passes (spec critique, test critique)
|
|
6
|
+
* stand on: the ```findings block contract and parser, severity routing,
|
|
7
|
+
* bounded-round bookkeeping, ledger conversion for residual findings, and
|
|
8
|
+
* the run-report renderer. Neither pass is wired here — see WS-02 and
|
|
9
|
+
* WS-03. Everything in this module fails open: no path throws on reviewer
|
|
10
|
+
* misbehavior, malformed input, or a missing reviewer.
|
|
11
|
+
*/
|
|
12
|
+
const evidenceSchema = z.discriminatedUnion("kind", [
|
|
13
|
+
z.object({
|
|
14
|
+
kind: z.literal("location"),
|
|
15
|
+
file: z.string().min(1),
|
|
16
|
+
startLine: z.number(),
|
|
17
|
+
endLine: z.number().optional(),
|
|
18
|
+
excerpt: z.string().optional(),
|
|
19
|
+
}),
|
|
20
|
+
z.object({
|
|
21
|
+
kind: z.literal("concern"),
|
|
22
|
+
named: z.string().min(1),
|
|
23
|
+
detail: z.string().optional(),
|
|
24
|
+
}),
|
|
25
|
+
z.object({
|
|
26
|
+
kind: z.literal("measurement"),
|
|
27
|
+
metric: z.enum(["lineCount", "fileCount"]),
|
|
28
|
+
value: z.number(),
|
|
29
|
+
}),
|
|
30
|
+
]);
|
|
31
|
+
const findingSchema = z.object({
|
|
32
|
+
severity: z.enum(SEVERITY_ORDER),
|
|
33
|
+
category: z.enum(FINDING_CATEGORIES),
|
|
34
|
+
code: z.string().optional(),
|
|
35
|
+
subject: z.string().min(1),
|
|
36
|
+
message: z.string().min(1),
|
|
37
|
+
evidence: z.array(evidenceSchema),
|
|
38
|
+
workstreamId: z.string().optional(),
|
|
39
|
+
file: z.string().optional(),
|
|
40
|
+
});
|
|
41
|
+
const BLOCK_PATTERN = /```findings[^\S\r\n]*\r?\n([\s\S]*?)```/gu;
|
|
42
|
+
/** Every fenced ```findings block in an agent's output, in order. */
|
|
43
|
+
export function extractFindings(output) {
|
|
44
|
+
const parsed = { findings: [], errors: [] };
|
|
45
|
+
for (const match of output.matchAll(BLOCK_PATTERN)) {
|
|
46
|
+
const body = match[1]?.trim();
|
|
47
|
+
if (body === undefined || body === "")
|
|
48
|
+
continue;
|
|
49
|
+
let json;
|
|
50
|
+
try {
|
|
51
|
+
json = JSON.parse(body);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
parsed.errors.push(`findings block is not valid JSON: ${error.message}`);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (!Array.isArray(json)) {
|
|
58
|
+
parsed.errors.push("findings block is not a JSON array");
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
json.forEach((element, index) => {
|
|
62
|
+
const result = findingSchema.safeParse(element);
|
|
63
|
+
if (!result.success) {
|
|
64
|
+
const issues = result.error.issues
|
|
65
|
+
.map((issue) => `${issue.path.join(".") || "(root)"}: ${issue.message}`)
|
|
66
|
+
.join("; ");
|
|
67
|
+
parsed.errors.push(`findings[${index}] has the wrong shape: ${issues}`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
parsed.findings.push(toFinding(result.data));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return parsed;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* `exactOptionalPropertyTypes` distinguishes an absent key from a key
|
|
77
|
+
* explicitly set to `undefined`; Zod's `.optional()` output allows the
|
|
78
|
+
* latter, `Finding`'s optional fields do not. Rebuild each finding (and its
|
|
79
|
+
* evidence) with the key omitted rather than set to `undefined`.
|
|
80
|
+
*/
|
|
81
|
+
function toFinding(parsed) {
|
|
82
|
+
return {
|
|
83
|
+
severity: parsed.severity,
|
|
84
|
+
category: parsed.category,
|
|
85
|
+
...(parsed.code === undefined ? {} : { code: parsed.code }),
|
|
86
|
+
subject: parsed.subject,
|
|
87
|
+
message: parsed.message,
|
|
88
|
+
evidence: parsed.evidence.map(toEvidence),
|
|
89
|
+
...(parsed.workstreamId === undefined ? {} : { workstreamId: parsed.workstreamId }),
|
|
90
|
+
...(parsed.file === undefined ? {} : { file: parsed.file }),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function toEvidence(parsed) {
|
|
94
|
+
if (parsed.kind === "location") {
|
|
95
|
+
return {
|
|
96
|
+
kind: "location",
|
|
97
|
+
file: parsed.file,
|
|
98
|
+
startLine: parsed.startLine,
|
|
99
|
+
...(parsed.endLine === undefined ? {} : { endLine: parsed.endLine }),
|
|
100
|
+
...(parsed.excerpt === undefined ? {} : { excerpt: parsed.excerpt }),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (parsed.kind === "concern") {
|
|
104
|
+
return {
|
|
105
|
+
kind: "concern",
|
|
106
|
+
named: parsed.named,
|
|
107
|
+
...(parsed.detail === undefined ? {} : { detail: parsed.detail }),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return { kind: "measurement", metric: parsed.metric, value: parsed.value };
|
|
111
|
+
}
|
|
112
|
+
const CONTRACT = `
|
|
113
|
+
## Findings (how to report review results)
|
|
114
|
+
|
|
115
|
+
End your reply with one fenced block containing a JSON array of findings —
|
|
116
|
+
plural, because a review typically raises more than one:
|
|
117
|
+
|
|
118
|
+
\`\`\`findings
|
|
119
|
+
[
|
|
120
|
+
{
|
|
121
|
+
"severity": "major",
|
|
122
|
+
"category": "test-quality",
|
|
123
|
+
"subject": "SC-06 token refresh",
|
|
124
|
+
"message": "No test exercises the refresh path; a stub that returns a fixed token passes the suite.",
|
|
125
|
+
"evidence": [{ "kind": "location", "file": "test/auth.test.ts", "startLine": 40 }],
|
|
126
|
+
"workstreamId": "WS-03"
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
\`\`\`
|
|
130
|
+
|
|
131
|
+
Fields:
|
|
132
|
+
- \`severity\`: one of ${SEVERITY_ORDER.join(", ")}. Blocker and major findings
|
|
133
|
+
are routed to the decision ledger for the human to see; minor and advisory
|
|
134
|
+
findings are reported only.
|
|
135
|
+
- \`category\`: one of ${FINDING_CATEGORIES.join(", ")}.
|
|
136
|
+
- \`subject\`: a short, stable noun phrase naming what the finding is about.
|
|
137
|
+
Reuse the same subject across rounds if you are re-raising the same issue —
|
|
138
|
+
identity is built from this field, not from your wording.
|
|
139
|
+
- \`message\`: the finding itself, in prose.
|
|
140
|
+
- \`evidence\`: an array of \`{ kind: "location", file, startLine, endLine?,
|
|
141
|
+
excerpt? }\`, \`{ kind: "concern", named, detail? }\`, or \`{ kind:
|
|
142
|
+
"measurement", metric: "lineCount" | "fileCount", value }\`.
|
|
143
|
+
- \`workstreamId\` and \`file\`: optional context.
|
|
144
|
+
|
|
145
|
+
Raise nothing and the block may be omitted entirely — an empty review is not
|
|
146
|
+
an error.
|
|
147
|
+
`.trim();
|
|
148
|
+
/** The ```findings block-format instructions, composed into every reviewer brief. */
|
|
149
|
+
export function findingsContract() {
|
|
150
|
+
return CONTRACT;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* blocker -> "decision-oneway" (a decision recorded reversible:false — a one-way door)
|
|
154
|
+
* major -> "decision" (an ordinary reversible, risk-accepted decision)
|
|
155
|
+
* minor -> "report" (the run report only)
|
|
156
|
+
* advisory -> "report"
|
|
157
|
+
*/
|
|
158
|
+
export function findingDestination(severity) {
|
|
159
|
+
switch (severity) {
|
|
160
|
+
case "blocker":
|
|
161
|
+
return "decision-oneway";
|
|
162
|
+
case "major":
|
|
163
|
+
return "decision";
|
|
164
|
+
case "minor":
|
|
165
|
+
case "advisory":
|
|
166
|
+
return "report";
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
export const REVIEW_ROUND_CAP = 2; // charter says two or three; a constant, never a config key
|
|
170
|
+
function emptySeverityCounts() {
|
|
171
|
+
return countBySeverity([]);
|
|
172
|
+
}
|
|
173
|
+
/** The pass a stage records when no reviewerAgent is configured (SC-08). */
|
|
174
|
+
export function reviewerAbsentOutcome() {
|
|
175
|
+
return {
|
|
176
|
+
ran: false,
|
|
177
|
+
roundsRun: 0,
|
|
178
|
+
stopReason: "no-reviewer",
|
|
179
|
+
open: [],
|
|
180
|
+
resolved: [],
|
|
181
|
+
errors: [],
|
|
182
|
+
writerNotes: [],
|
|
183
|
+
severityCounts: emptySeverityCounts(),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export async function runReviewPass(options) {
|
|
187
|
+
const cap = options.cap ?? REVIEW_ROUND_CAP;
|
|
188
|
+
const seen = new Set();
|
|
189
|
+
const latest = new Map();
|
|
190
|
+
const errors = [];
|
|
191
|
+
const writerNotes = [];
|
|
192
|
+
let priorOpen = [];
|
|
193
|
+
let round = 1;
|
|
194
|
+
for (;;) {
|
|
195
|
+
const result = await options.review(round, priorOpen);
|
|
196
|
+
errors.push(...result.errors);
|
|
197
|
+
if (!result.ran) {
|
|
198
|
+
if (round === 1) {
|
|
199
|
+
return {
|
|
200
|
+
ran: false,
|
|
201
|
+
roundsRun: 0,
|
|
202
|
+
stopReason: "reviewer-error",
|
|
203
|
+
open: [],
|
|
204
|
+
resolved: [],
|
|
205
|
+
errors,
|
|
206
|
+
writerNotes,
|
|
207
|
+
severityCounts: emptySeverityCounts(),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
return finish({
|
|
211
|
+
ran: true,
|
|
212
|
+
roundsRun: round - 1,
|
|
213
|
+
stopReason: "reviewer-error",
|
|
214
|
+
open: priorOpen,
|
|
215
|
+
errors,
|
|
216
|
+
writerNotes,
|
|
217
|
+
seen,
|
|
218
|
+
latest,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
for (const finding of result.findings) {
|
|
222
|
+
latest.set(fingerprint(finding), finding);
|
|
223
|
+
}
|
|
224
|
+
const roundFingerprints = new Set(result.findings.map((f) => fingerprint(f)));
|
|
225
|
+
const newFingerprints = [...roundFingerprints].filter((fp) => !seen.has(fp));
|
|
226
|
+
if (newFingerprints.length === 0) {
|
|
227
|
+
return finish({
|
|
228
|
+
ran: true,
|
|
229
|
+
roundsRun: round,
|
|
230
|
+
stopReason: "converged",
|
|
231
|
+
open: result.findings,
|
|
232
|
+
errors,
|
|
233
|
+
writerNotes,
|
|
234
|
+
seen,
|
|
235
|
+
latest,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
if (round === cap) {
|
|
239
|
+
return finish({
|
|
240
|
+
ran: true,
|
|
241
|
+
roundsRun: round,
|
|
242
|
+
stopReason: "cap-reached",
|
|
243
|
+
open: result.findings,
|
|
244
|
+
errors,
|
|
245
|
+
writerNotes,
|
|
246
|
+
seen,
|
|
247
|
+
latest,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
for (const fp of newFingerprints)
|
|
251
|
+
seen.add(fp);
|
|
252
|
+
const response = await options.respond(round, result.findings);
|
|
253
|
+
if (response.note !== undefined)
|
|
254
|
+
writerNotes.push(response.note);
|
|
255
|
+
priorOpen = result.findings;
|
|
256
|
+
round += 1;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function finish(args) {
|
|
260
|
+
const openFingerprints = new Set(args.open.map((f) => fingerprint(f)));
|
|
261
|
+
const resolved = [...args.latest.values()].filter((finding) => !openFingerprints.has(fingerprint(finding)));
|
|
262
|
+
return {
|
|
263
|
+
ran: args.ran,
|
|
264
|
+
roundsRun: args.roundsRun,
|
|
265
|
+
stopReason: args.stopReason,
|
|
266
|
+
open: args.open,
|
|
267
|
+
resolved,
|
|
268
|
+
errors: args.errors,
|
|
269
|
+
writerNotes: args.writerNotes,
|
|
270
|
+
severityCounts: countBySeverity([...args.latest.values()]),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function evidenceSummary(finding) {
|
|
274
|
+
const first = finding.evidence[0];
|
|
275
|
+
if (!first)
|
|
276
|
+
return "";
|
|
277
|
+
if (first.kind === "location") {
|
|
278
|
+
return ` (${first.file}:${first.startLine})`;
|
|
279
|
+
}
|
|
280
|
+
if (first.kind === "concern") {
|
|
281
|
+
return ` (${first.named})`;
|
|
282
|
+
}
|
|
283
|
+
return ` (${first.metric}: ${first.value})`;
|
|
284
|
+
}
|
|
285
|
+
/** Blocker/major findings -> decision-recorded events; minor/advisory dropped (report-only). */
|
|
286
|
+
export function findingsToLedgerEvents(options) {
|
|
287
|
+
const events = [];
|
|
288
|
+
for (const finding of options.findings) {
|
|
289
|
+
const destination = findingDestination(finding.severity);
|
|
290
|
+
if (destination === "report")
|
|
291
|
+
continue;
|
|
292
|
+
const decision = {
|
|
293
|
+
title: `Reviewer finding: ${finding.subject}`,
|
|
294
|
+
context: `${finding.category} — ${finding.message}${evidenceSummary(finding)}`,
|
|
295
|
+
options: [
|
|
296
|
+
{
|
|
297
|
+
label: "proceed",
|
|
298
|
+
description: "Accept the risk and proceed; the finding is recorded here for review.",
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
label: "fix-now",
|
|
302
|
+
description: "Roll back to the anchor commit and address the finding before continuing.",
|
|
303
|
+
},
|
|
304
|
+
],
|
|
305
|
+
chosen: "proceed",
|
|
306
|
+
rationale: `An independent reviewer raised this ${finding.severity} finding and the pass proceeded at its bound; routed here for ratify-or-escalate.`,
|
|
307
|
+
reversible: destination !== "decision-oneway",
|
|
308
|
+
};
|
|
309
|
+
events.push({
|
|
310
|
+
kind: "decision-recorded",
|
|
311
|
+
at: options.now().toISOString(),
|
|
312
|
+
id: decisionFingerprint(options.workstreamId, decision),
|
|
313
|
+
workstream: options.workstreamId,
|
|
314
|
+
decision,
|
|
315
|
+
...(options.baseCommit === undefined ? {} : { baseCommit: options.baseCommit }),
|
|
316
|
+
decidedBy: "implementer",
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
return events;
|
|
320
|
+
}
|
|
321
|
+
function describeSubjects(findings) {
|
|
322
|
+
return findings.map((finding) => finding.subject).join(", ");
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* A human-facing summary of one completed (or absent) pass, for the run
|
|
326
|
+
* report. `label` is the pass name the stage supplies ("Spec critique",
|
|
327
|
+
* "Test critique"). Returns markdown lines; the caller splices them under
|
|
328
|
+
* its own section heading.
|
|
329
|
+
*/
|
|
330
|
+
export function renderPassReport(label, outcome) {
|
|
331
|
+
if (outcome.stopReason === "no-reviewer") {
|
|
332
|
+
return [
|
|
333
|
+
`**${label}:** disabled — no reviewer is configured, and the pass was`,
|
|
334
|
+
"not substituted with the implementer or skipped silently.",
|
|
335
|
+
];
|
|
336
|
+
}
|
|
337
|
+
if (outcome.stopReason === "reviewer-error" && !outcome.ran) {
|
|
338
|
+
return [
|
|
339
|
+
`**${label}:** the reviewer produced no readable findings, so the pass`,
|
|
340
|
+
"did not run; the run proceeded without it.",
|
|
341
|
+
];
|
|
342
|
+
}
|
|
343
|
+
const lines = [];
|
|
344
|
+
const roundWord = outcome.roundsRun === 1 ? "round" : "rounds";
|
|
345
|
+
if (outcome.stopReason === "converged") {
|
|
346
|
+
lines.push(`**${label}:** converged after ${outcome.roundsRun} ${roundWord}.`);
|
|
347
|
+
}
|
|
348
|
+
else if (outcome.stopReason === "cap-reached") {
|
|
349
|
+
lines.push(`**${label}:** ran ${outcome.roundsRun} ${roundWord} and hit the round cap; the reviewer was still finding new issues.`);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
lines.push(`**${label}:** ran ${outcome.roundsRun} ${roundWord}; the reviewer did not produce a further readable read, so the last verified round stands.`);
|
|
353
|
+
}
|
|
354
|
+
const counts = outcome.severityCounts;
|
|
355
|
+
lines.push(`Findings raised: ${counts.blocker} blocker, ${counts.major} major, ${counts.minor} minor, ${counts.advisory} advisory.`);
|
|
356
|
+
if (outcome.resolved.length > 0) {
|
|
357
|
+
lines.push(`Fixed: ${describeSubjects(outcome.resolved)}.`);
|
|
358
|
+
}
|
|
359
|
+
if (outcome.open.length > 0) {
|
|
360
|
+
lines.push(`Still open: ${describeSubjects(outcome.open)}.`);
|
|
361
|
+
if (outcome.writerNotes.length > 0) {
|
|
362
|
+
lines.push(`Writer's notes: ${outcome.writerNotes.join(" | ")}`);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
lines.push("No open findings remain.");
|
|
367
|
+
}
|
|
368
|
+
return lines;
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=review-pass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-pass.js","sourceRoot":"","sources":["../src/review-pass.ts"],"names":[],"mappings":"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"}
|
package/dist/run-program.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type AgentRunner, type VerifyRunner } from "./agent-runner.js";
|
|
2
2
|
import type { NightshiftConfig } from "./config.js";
|
|
3
3
|
import { type DecisionRecord } from "./decision-ledger.js";
|
|
4
|
+
import { type ReviewPassOutcome } from "./review-pass.js";
|
|
4
5
|
import { type Workstream } from "./manifest.js";
|
|
5
6
|
/**
|
|
6
7
|
* Git operations the runner needs, injectable so tests drive a real
|
|
@@ -11,8 +12,19 @@ import { type Workstream } from "./manifest.js";
|
|
|
11
12
|
export interface GitOps {
|
|
12
13
|
isRepository(cwd: string): Promise<boolean>;
|
|
13
14
|
currentCommit(cwd: string): Promise<string | undefined>;
|
|
15
|
+
/** The checked-out branch name; undefined when HEAD is detached. */
|
|
16
|
+
currentBranch(cwd: string): Promise<string | undefined>;
|
|
14
17
|
/** Stages everything and commits; undefined result means nothing to commit. */
|
|
15
18
|
commitAll(cwd: string, message: string): Promise<string | undefined>;
|
|
19
|
+
/**
|
|
20
|
+
* Stages only the given repo-relative paths and commits them, leaving
|
|
21
|
+
* every other modified file untouched in the tree. Undefined result means
|
|
22
|
+
* nothing to commit — identical to commitAll. Prefer this wherever the
|
|
23
|
+
* runner knows the paths it wrote; commitAll's whole-tree sweep is only
|
|
24
|
+
* for the build stage, where the agent's file set is not knowable in
|
|
25
|
+
* advance.
|
|
26
|
+
*/
|
|
27
|
+
commitPaths(cwd: string, message: string, paths: string[]): Promise<string | undefined>;
|
|
16
28
|
diffSince(cwd: string, commit: string): Promise<string>;
|
|
17
29
|
/** Repo-relative paths with uncommitted changes (staged or not). */
|
|
18
30
|
dirtyPaths(cwd: string): Promise<string[]>;
|
|
@@ -33,6 +45,8 @@ export interface RunProgramOptions {
|
|
|
33
45
|
git?: GitOps;
|
|
34
46
|
log?: (line: string) => void;
|
|
35
47
|
now?: () => Date;
|
|
48
|
+
/** Skips the default-branch and wrong-branch preconditions. */
|
|
49
|
+
force?: boolean;
|
|
36
50
|
}
|
|
37
51
|
export type WorkstreamOutcome = {
|
|
38
52
|
status: "complete";
|
|
@@ -55,6 +69,10 @@ export interface WorkstreamResult {
|
|
|
55
69
|
decisionIds: string[];
|
|
56
70
|
/** Decision blocks the agent garbled; surfaced, never fatal. */
|
|
57
71
|
decisionErrors: string[];
|
|
72
|
+
/** The test-critique pass for this workstream; absent when the build never verified. */
|
|
73
|
+
testCritique?: ReviewPassOutcome;
|
|
74
|
+
/** True when the reviewer saw a diff clipped for length in at least one round. */
|
|
75
|
+
testCritiqueDiffClipped?: boolean;
|
|
58
76
|
}
|
|
59
77
|
export interface RunProgramResult {
|
|
60
78
|
programId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-program.d.ts","sourceRoot":"","sources":["../src/run-program.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"run-program.d.ts","sourceRoot":"","sources":["../src/run-program.ts"],"names":[],"mappings":"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"}
|