@doidor/agentrig 0.9.0 → 0.11.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/README.md +88 -33
- package/dist/agent/copilot.js +46 -5
- package/dist/agent/copilot.js.map +1 -1
- package/dist/cli.js +44 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/compile.js +3 -0
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.js +115 -8
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/eval-dynamic.js +316 -0
- package/dist/commands/eval-dynamic.js.map +1 -0
- package/dist/commands/eval-scaffold.js +173 -0
- package/dist/commands/eval-scaffold.js.map +1 -0
- package/dist/commands/eval.js +184 -55
- package/dist/commands/eval.js.map +1 -1
- package/dist/commands/fix.js +52 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/update.js +182 -16
- package/dist/commands/update.js.map +1 -1
- package/dist/core/audit.js +269 -9
- package/dist/core/audit.js.map +1 -1
- package/dist/core/compile.js +5 -1
- package/dist/core/compile.js.map +1 -1
- package/dist/core/fix.js +108 -0
- package/dist/core/fix.js.map +1 -0
- package/dist/core/install.js +50 -4
- package/dist/core/install.js.map +1 -1
- package/dist/core/markers.js +85 -0
- package/dist/core/markers.js.map +1 -0
- package/dist/core/model-family.js +31 -0
- package/dist/core/model-family.js.map +1 -0
- package/dist/core/scenario-runner.js +298 -0
- package/dist/core/scenario-runner.js.map +1 -0
- package/dist/core/state.js +11 -0
- package/dist/core/state.js.map +1 -1
- package/dist/core/validate.js +129 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/prompts/index.js +121 -30
- package/dist/prompts/index.js.map +1 -1
- package/knowledge/PRINCIPLES.md +2 -2
- package/knowledge/manifest.json +16 -1
- package/knowledge/templates/AGENTS.md +8 -7
- package/knowledge/templates/agents/README.md +4 -4
- package/knowledge/templates/agents/developer.yml +1 -1
- package/knowledge/templates/agents/judge.yml +1 -1
- package/knowledge/templates/agents/reviewer.yml +1 -1
- package/knowledge/templates/agents/triager.yml +5 -4
- package/knowledge/templates/dashboard/dashboard.mjs +12 -5
- package/knowledge/templates/eval/RUBRIC.md +87 -64
- package/knowledge/templates/eval/axes.json +25 -25
- package/knowledge/templates/eval/calibration/README.md +54 -0
- package/knowledge/templates/eval/calibration/review/seed-correct.yml +43 -0
- package/knowledge/templates/eval/calibration/run/seed-correct.yml +35 -0
- package/knowledge/templates/eval/calibration/run/seed-no-verify.yml +34 -0
- package/knowledge/templates/eval/checks.json +92 -14
- package/knowledge/templates/eval/scenarios/add-small-feature/README.md +17 -0
- package/knowledge/templates/eval/scenarios/add-small-feature/fixture/SPEC.md +25 -0
- package/knowledge/templates/eval/scenarios/add-small-feature/fixture/package.json +9 -0
- package/knowledge/templates/eval/scenarios/add-small-feature/fixture/src/slugify.js +5 -0
- package/knowledge/templates/eval/scenarios/add-small-feature/fixture/tests/feature.test.js +31 -0
- package/knowledge/templates/eval/scenarios/add-small-feature/judge_brief.md +25 -0
- package/knowledge/templates/eval/scenarios/add-small-feature/oracle.yml +41 -0
- package/knowledge/templates/eval/scenarios/add-small-feature/prompt.md +17 -0
- package/knowledge/templates/eval/scenarios/add-small-feature/scenario.yml +22 -0
- package/knowledge/templates/eval/scenarios/fix-failing-test/README.md +18 -0
- package/knowledge/templates/eval/scenarios/fix-failing-test/fixture/package.json +9 -0
- package/knowledge/templates/eval/scenarios/fix-failing-test/fixture/src/math.js +13 -0
- package/knowledge/templates/eval/scenarios/fix-failing-test/fixture/tests/add.test.js +7 -0
- package/knowledge/templates/eval/scenarios/fix-failing-test/fixture/tests/divide.test.js +11 -0
- package/knowledge/templates/eval/scenarios/fix-failing-test/fixture/tests/multiply.test.js +7 -0
- package/knowledge/templates/eval/scenarios/fix-failing-test/judge_brief.md +20 -0
- package/knowledge/templates/eval/scenarios/fix-failing-test/oracle.yml +33 -0
- package/knowledge/templates/eval/scenarios/fix-failing-test/prompt.md +12 -0
- package/knowledge/templates/eval/scenarios/fix-failing-test/scenario.yml +23 -0
- package/knowledge/templates/eval/scenarios/review-catches-bug/README.md +17 -0
- package/knowledge/templates/eval/scenarios/review-catches-bug/fixture/baseline/package.json +6 -0
- package/knowledge/templates/eval/scenarios/review-catches-bug/fixture/baseline/src/format.js +4 -0
- package/knowledge/templates/eval/scenarios/review-catches-bug/fixture/baseline/src/pagination.js +7 -0
- package/knowledge/templates/eval/scenarios/review-catches-bug/fixture/change/src/format.js +6 -0
- package/knowledge/templates/eval/scenarios/review-catches-bug/fixture/change/src/pagination.js +7 -0
- package/knowledge/templates/eval/scenarios/review-catches-bug/judge_brief.md +38 -0
- package/knowledge/templates/eval/scenarios/review-catches-bug/oracle.yml +29 -0
- package/knowledge/templates/eval/scenarios/review-catches-bug/prompt.md +33 -0
- package/knowledge/templates/eval/scenarios/review-catches-bug/scenario.yml +23 -0
- package/knowledge/templates/eval/score.mjs +368 -42
- package/knowledge/templates/eval/static-audit.mjs +228 -17
- package/knowledge/templates/harness/state-machine.yml +18 -12
- package/knowledge/templates/skills/harness-eval/SKILL.md +59 -54
- package/knowledge/templates/skills/log-gotcha/SKILL.md +68 -0
- package/knowledge/templates/skills/self-verify/SKILL.md +32 -8
- package/package.json +4 -3
- package/knowledge/templates/eval/scenarios/README.md +0 -24
- package/knowledge/templates/eval/scenarios/add-small-feature.md +0 -28
- package/knowledge/templates/eval/scenarios/fix-failing-test.md +0 -27
- package/knowledge/templates/eval/scenarios/review-catches-bug.md +0 -30
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { existsSync, readFileSync, mkdirSync, writeFileSync, statSync, readdirSync, cpSync, rmSync } from "node:fs";
|
|
2
|
+
import { join, resolve, relative } from "node:path";
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import YAML from "yaml";
|
|
6
|
+
import { sameFamily } from "./model-family.js";
|
|
7
|
+
export function locateScenario(repoRoot, id) {
|
|
8
|
+
const root = resolve(repoRoot, ".agentrig", "eval", "scenarios", id);
|
|
9
|
+
if (!existsSync(root) || !statSync(root).isDirectory())
|
|
10
|
+
return null;
|
|
11
|
+
return {
|
|
12
|
+
root,
|
|
13
|
+
scenarioYml: join(root, "scenario.yml"),
|
|
14
|
+
promptMd: join(root, "prompt.md"),
|
|
15
|
+
oracleYml: join(root, "oracle.yml"),
|
|
16
|
+
fixtureDir: join(root, "fixture"),
|
|
17
|
+
readmeMd: join(root, "README.md"),
|
|
18
|
+
judgeBriefMd: existsSync(join(root, "judge_brief.md")) ? join(root, "judge_brief.md") : null,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function listScenarios(repoRoot) {
|
|
22
|
+
const dir = resolve(repoRoot, ".agentrig", "eval", "scenarios");
|
|
23
|
+
if (!existsSync(dir))
|
|
24
|
+
return [];
|
|
25
|
+
const out = [];
|
|
26
|
+
for (const entry of readdirSync(dir)) {
|
|
27
|
+
if (entry.startsWith(".") || entry.startsWith("_"))
|
|
28
|
+
continue;
|
|
29
|
+
const abs = join(dir, entry);
|
|
30
|
+
if (!statSync(abs).isDirectory())
|
|
31
|
+
continue;
|
|
32
|
+
if (existsSync(join(abs, "scenario.yml")))
|
|
33
|
+
out.push(entry);
|
|
34
|
+
}
|
|
35
|
+
return out.sort();
|
|
36
|
+
}
|
|
37
|
+
export function loadScenario(paths) {
|
|
38
|
+
if (!existsSync(paths.scenarioYml)) {
|
|
39
|
+
throw new Error(`scenario.yml missing in ${paths.root}`);
|
|
40
|
+
}
|
|
41
|
+
// Accept both plain YAML and "--- ... ---" frontmatter-style wrappers (for consistency
|
|
42
|
+
// with skill files). Strip the wrapper before parsing so we get a single document.
|
|
43
|
+
let text = readFileSync(paths.scenarioYml, "utf8").trim();
|
|
44
|
+
if (text.startsWith("---")) {
|
|
45
|
+
const end = text.indexOf("\n---", 3);
|
|
46
|
+
if (end > 0)
|
|
47
|
+
text = text.slice(4, end).trim();
|
|
48
|
+
}
|
|
49
|
+
const fm = YAML.parse(text);
|
|
50
|
+
if (!fm?.id)
|
|
51
|
+
throw new Error(`scenario.yml in ${paths.root} missing required 'id'`);
|
|
52
|
+
return fm;
|
|
53
|
+
}
|
|
54
|
+
export function loadOracle(paths) {
|
|
55
|
+
if (!existsSync(paths.oracleYml))
|
|
56
|
+
return { checks: [] };
|
|
57
|
+
const spec = YAML.parse(readFileSync(paths.oracleYml, "utf8"));
|
|
58
|
+
return { checks: Array.isArray(spec?.checks) ? spec.checks : [] };
|
|
59
|
+
}
|
|
60
|
+
/** Seed a throwaway worktree from a scenario fixture and `git init` it so we can take diffs.
|
|
61
|
+
*
|
|
62
|
+
* Layouts supported:
|
|
63
|
+
* 1. `fixture/` directly — single baseline commit.
|
|
64
|
+
* 2. `fixture/baseline/` (+ optional `fixture/change/`) — for review scenarios:
|
|
65
|
+
* commit baseline first, then overlay change as a second commit so the producer
|
|
66
|
+
* reviewer sees a real `HEAD vs HEAD~1` diff.
|
|
67
|
+
*/
|
|
68
|
+
export function seedWorktree(fixtureDir, runId, scenarioId) {
|
|
69
|
+
if (!existsSync(fixtureDir))
|
|
70
|
+
throw new Error(`fixture missing: ${fixtureDir}`);
|
|
71
|
+
const wt = join(tmpdir(), "agentrig-eval", runId, scenarioId);
|
|
72
|
+
if (existsSync(wt))
|
|
73
|
+
rmSync(wt, { recursive: true, force: true });
|
|
74
|
+
mkdirSync(wt, { recursive: true });
|
|
75
|
+
const baselineDir = join(fixtureDir, "baseline");
|
|
76
|
+
const changeDir = join(fixtureDir, "change");
|
|
77
|
+
const hasBaselineLayout = existsSync(baselineDir) && statSync(baselineDir).isDirectory();
|
|
78
|
+
if (hasBaselineLayout) {
|
|
79
|
+
cpSync(baselineDir, wt, { recursive: true });
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
cpSync(fixtureDir, wt, { recursive: true });
|
|
83
|
+
}
|
|
84
|
+
// Make it a git repo so we can diff the agent's work against the fixture baseline.
|
|
85
|
+
spawnSync("git", ["init", "-q"], { cwd: wt });
|
|
86
|
+
spawnSync("git", ["config", "user.email", "eval@agentrig.local"], { cwd: wt });
|
|
87
|
+
spawnSync("git", ["config", "user.name", "AgentRig Eval"], { cwd: wt });
|
|
88
|
+
spawnSync("git", ["add", "-A"], { cwd: wt });
|
|
89
|
+
spawnSync("git", ["commit", "-q", "-m", "fixture baseline"], { cwd: wt });
|
|
90
|
+
// For the two-commit layout, overlay `change/` and commit again.
|
|
91
|
+
if (hasBaselineLayout && existsSync(changeDir) && statSync(changeDir).isDirectory()) {
|
|
92
|
+
cpSync(changeDir, wt, { recursive: true, force: true });
|
|
93
|
+
spawnSync("git", ["add", "-A"], { cwd: wt });
|
|
94
|
+
spawnSync("git", ["commit", "-q", "-m", "fixture change (under review)"], { cwd: wt });
|
|
95
|
+
}
|
|
96
|
+
return wt;
|
|
97
|
+
}
|
|
98
|
+
/** Capture the unified diff (vs baseline) the producer left in the worktree. */
|
|
99
|
+
export function captureDiff(worktree) {
|
|
100
|
+
// git diff HEAD picks up tracked + staged changes; we also need to include untracked files.
|
|
101
|
+
spawnSync("git", ["add", "-A"], { cwd: worktree });
|
|
102
|
+
const res = spawnSync("git", ["diff", "--cached"], { cwd: worktree, encoding: "utf8" });
|
|
103
|
+
return res.stdout || "";
|
|
104
|
+
}
|
|
105
|
+
export function parseDiffStats(diff) {
|
|
106
|
+
const files = new Map();
|
|
107
|
+
let cur = null;
|
|
108
|
+
for (const line of diff.split(/\r?\n/)) {
|
|
109
|
+
const fileHeader = line.match(/^\+\+\+ b\/(.+)$/);
|
|
110
|
+
if (fileHeader) {
|
|
111
|
+
const path = fileHeader[1];
|
|
112
|
+
cur = files.get(path) ?? { path, added: 0, removed: 0 };
|
|
113
|
+
files.set(path, cur);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (!cur)
|
|
117
|
+
continue;
|
|
118
|
+
if (line.startsWith("+") && !line.startsWith("+++"))
|
|
119
|
+
cur.added++;
|
|
120
|
+
else if (line.startsWith("-") && !line.startsWith("---"))
|
|
121
|
+
cur.removed++;
|
|
122
|
+
}
|
|
123
|
+
return [...files.values()];
|
|
124
|
+
}
|
|
125
|
+
/** Run the deterministic oracle. Returns one result per check.
|
|
126
|
+
* `env` is merged into the child process environment for `cmd`-type checks —
|
|
127
|
+
* the scenario-runner uses this to inject `AGENTRIG_CLI` for the dogfood scenario.
|
|
128
|
+
*/
|
|
129
|
+
export function runOracle(worktree, oracle, env = {}) {
|
|
130
|
+
const diff = captureDiff(worktree);
|
|
131
|
+
const stats = parseDiffStats(diff);
|
|
132
|
+
const out = [];
|
|
133
|
+
for (const c of oracle.checks) {
|
|
134
|
+
out.push(runOracleCheck(worktree, c, diff, stats, env));
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
function runOracleCheck(worktree, c, diff, stats, env) {
|
|
139
|
+
switch (c.type) {
|
|
140
|
+
case "cmd": {
|
|
141
|
+
if (!c.cmd)
|
|
142
|
+
return { id: c.id, axis: c.axis, score: 0, evidence: "cmd: missing" };
|
|
143
|
+
// Scrub NODE_TEST_CONTEXT: when the runner is itself executed inside `node --test`
|
|
144
|
+
// (which the unit tests do), nested `node --test` invocations from oracle cmd
|
|
145
|
+
// checks see that env var and behave as silent subprocesses. Delete it so the
|
|
146
|
+
// oracle's nested tests run as a fresh, independent test process.
|
|
147
|
+
const childEnv = { ...process.env, ...env };
|
|
148
|
+
delete childEnv.NODE_TEST_CONTEXT;
|
|
149
|
+
const res = spawnSync(c.cmd, {
|
|
150
|
+
cwd: worktree,
|
|
151
|
+
shell: true,
|
|
152
|
+
encoding: "utf8",
|
|
153
|
+
timeout: 120_000,
|
|
154
|
+
env: childEnv,
|
|
155
|
+
});
|
|
156
|
+
const wantZero = c.expect !== "exit_nonzero";
|
|
157
|
+
const ok = wantZero ? res.status === 0 : res.status !== 0;
|
|
158
|
+
const tail = (res.stdout + res.stderr).split(/\r?\n/).filter(Boolean).slice(-3).join(" | ");
|
|
159
|
+
return ok
|
|
160
|
+
? { id: c.id, axis: c.axis, score: 1, evidence: "" }
|
|
161
|
+
: { id: c.id, axis: c.axis, score: 0, evidence: `exit=${res.status}${tail ? `: ${tail}` : ""}` };
|
|
162
|
+
}
|
|
163
|
+
case "diff_stats": {
|
|
164
|
+
const totalAdded = stats.reduce((s, x) => s + x.added, 0);
|
|
165
|
+
const totalRemoved = stats.reduce((s, x) => s + x.removed, 0);
|
|
166
|
+
const problems = [];
|
|
167
|
+
if (c.max_added_lines != null && totalAdded > c.max_added_lines)
|
|
168
|
+
problems.push(`added ${totalAdded} > ${c.max_added_lines}`);
|
|
169
|
+
if (c.max_removed_lines != null && totalRemoved > c.max_removed_lines)
|
|
170
|
+
problems.push(`removed ${totalRemoved} > ${c.max_removed_lines}`);
|
|
171
|
+
if (c.max_files != null && stats.length > c.max_files)
|
|
172
|
+
problems.push(`touched ${stats.length} files > ${c.max_files}`);
|
|
173
|
+
return problems.length === 0
|
|
174
|
+
? { id: c.id, axis: c.axis, score: 1, evidence: "" }
|
|
175
|
+
: { id: c.id, axis: c.axis, score: 0.5, evidence: problems.join("; ") };
|
|
176
|
+
}
|
|
177
|
+
case "diff_files": {
|
|
178
|
+
const touched = stats.map((s) => s.path);
|
|
179
|
+
const problems = [];
|
|
180
|
+
if (c.allowed) {
|
|
181
|
+
const extras = touched.filter((p) => !c.allowed.some((a) => matchGlob(p, a)));
|
|
182
|
+
if (extras.length)
|
|
183
|
+
problems.push(`unexpected files: ${extras.join(", ")}`);
|
|
184
|
+
}
|
|
185
|
+
if (c.forbidden) {
|
|
186
|
+
const hits = touched.filter((p) => c.forbidden.some((a) => matchGlob(p, a)));
|
|
187
|
+
if (hits.length)
|
|
188
|
+
problems.push(`touched forbidden: ${hits.join(", ")}`);
|
|
189
|
+
}
|
|
190
|
+
return problems.length === 0
|
|
191
|
+
? { id: c.id, axis: c.axis, score: 1, evidence: "" }
|
|
192
|
+
: { id: c.id, axis: c.axis, score: 0, evidence: problems.join("; ") };
|
|
193
|
+
}
|
|
194
|
+
case "file_contains": {
|
|
195
|
+
if (!c.path || !c.pattern)
|
|
196
|
+
return { id: c.id, axis: c.axis, score: 0, evidence: "missing path/pattern" };
|
|
197
|
+
const abs = join(worktree, c.path);
|
|
198
|
+
if (!existsSync(abs))
|
|
199
|
+
return { id: c.id, axis: c.axis, score: 0, evidence: `missing ${c.path}` };
|
|
200
|
+
const text = readFileSync(abs, "utf8");
|
|
201
|
+
return new RegExp(c.pattern).test(text)
|
|
202
|
+
? { id: c.id, axis: c.axis, score: 1, evidence: "" }
|
|
203
|
+
: { id: c.id, axis: c.axis, score: 0, evidence: `pattern not found in ${c.path}` };
|
|
204
|
+
}
|
|
205
|
+
case "file_missing": {
|
|
206
|
+
if (!c.path)
|
|
207
|
+
return { id: c.id, axis: c.axis, score: 0, evidence: "missing path" };
|
|
208
|
+
return existsSync(join(worktree, c.path))
|
|
209
|
+
? { id: c.id, axis: c.axis, score: 0, evidence: `${c.path} still present` }
|
|
210
|
+
: { id: c.id, axis: c.axis, score: 1, evidence: "" };
|
|
211
|
+
}
|
|
212
|
+
default:
|
|
213
|
+
return { id: c.id, axis: c.axis, score: 0, evidence: `unknown oracle check type "${c.type}"` };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/** Trivial glob: supports `*` (single segment) and `**` (any segments). No regex pass-through. */
|
|
217
|
+
function matchGlob(path, pattern) {
|
|
218
|
+
if (pattern === path)
|
|
219
|
+
return true;
|
|
220
|
+
const escaped = pattern
|
|
221
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
222
|
+
.replace(/\*\*/g, "::DOUBLE::")
|
|
223
|
+
.replace(/\*/g, "[^/]*")
|
|
224
|
+
.replace(/::DOUBLE::/g, ".*");
|
|
225
|
+
return new RegExp("^" + escaped + "$").test(path);
|
|
226
|
+
}
|
|
227
|
+
/** Aggregate oracle results into per-axis scores (when an axis has multiple checks, min wins). */
|
|
228
|
+
export function oracleAxisScores(results) {
|
|
229
|
+
const byAxis = new Map();
|
|
230
|
+
for (const r of results) {
|
|
231
|
+
if (!byAxis.has(r.axis))
|
|
232
|
+
byAxis.set(r.axis, []);
|
|
233
|
+
byAxis.get(r.axis).push(r);
|
|
234
|
+
}
|
|
235
|
+
const out = [];
|
|
236
|
+
for (const [axis, rs] of byAxis) {
|
|
237
|
+
const score = Math.min(...rs.map((r) => r.score));
|
|
238
|
+
const evidence = rs.filter((r) => r.score < 1).map((r) => `${r.id}: ${r.evidence}`).join("; ");
|
|
239
|
+
out.push({ axis, score, evidence });
|
|
240
|
+
}
|
|
241
|
+
return out;
|
|
242
|
+
}
|
|
243
|
+
/** Convert oracle output into the --axis flag form score.mjs save expects. */
|
|
244
|
+
export function oracleAxesToFlags(scores, type) {
|
|
245
|
+
const codeMap = {
|
|
246
|
+
run: {
|
|
247
|
+
correctness: "OQ-CORRECT-WRONG",
|
|
248
|
+
scope: "OQ-SCOPE-UNRELATED",
|
|
249
|
+
tests: "OQ-TESTS-BROKEN",
|
|
250
|
+
clarity: "OQ-CLARITY-COMPLEXITY",
|
|
251
|
+
self_verification: "AB-VERIFY-SKIPPED",
|
|
252
|
+
gate_compliance: "AB-GATE-SKIPPED",
|
|
253
|
+
tool_discipline: "AB-TOOLS-OVERLIMIT",
|
|
254
|
+
escalation: "AB-ESCALATE-NONE",
|
|
255
|
+
memory: "LT-MEMORY-NOLOG",
|
|
256
|
+
regression_risk: "LT-REGRESS-UNTESTED",
|
|
257
|
+
maintainability: "LT-MAINTAIN-DEBT",
|
|
258
|
+
},
|
|
259
|
+
spec: {
|
|
260
|
+
clarity: "SP-CLARITY-VAGUE",
|
|
261
|
+
acceptance_criteria: "SP-AC-MISSING",
|
|
262
|
+
scope_bounded: "SP-SCOPE-TOOBIG",
|
|
263
|
+
testability: "SP-TEST-NOORACLE",
|
|
264
|
+
context: "SP-CONTEXT-MISSING",
|
|
265
|
+
},
|
|
266
|
+
review: {
|
|
267
|
+
finding_correctness: "RV-FIND-WRONG",
|
|
268
|
+
severity_calibration: "RV-SEV-UNDER",
|
|
269
|
+
false_positive_rate: "RV-FP-NOISE",
|
|
270
|
+
coverage: "RV-COV-MISSEDBUG",
|
|
271
|
+
actionability: "RV-ACT-VAGUE",
|
|
272
|
+
independence: "RV-IND-SAMEMODEL",
|
|
273
|
+
blocking_decision: "RV-BLOCK-WRONGFAIL",
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
const codes = codeMap[type] ?? {};
|
|
277
|
+
return scores.map((s) => {
|
|
278
|
+
if (s.score === 1)
|
|
279
|
+
return `${s.axis}=1.0`;
|
|
280
|
+
const code = codes[s.axis] ?? "";
|
|
281
|
+
const ev = s.evidence.replace(/:/g, ";").slice(0, 200) || "oracle check failed";
|
|
282
|
+
return `${s.axis}=${s.score}:${code}:${ev}`;
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
/** Re-export for the eval command to enforce producer ≠ judge family at run time. */
|
|
286
|
+
export { sameFamily };
|
|
287
|
+
/** Convenience: pretty-print a relative path (for log lines that mention worktree files). */
|
|
288
|
+
export function relPath(repoRoot, abs) {
|
|
289
|
+
return relative(repoRoot, abs) || abs;
|
|
290
|
+
}
|
|
291
|
+
/** Persist a per-scenario artifact bundle next to a run's meta.json. */
|
|
292
|
+
export function saveArtifacts(artifactsDir, scenarioId, kv) {
|
|
293
|
+
mkdirSync(artifactsDir, { recursive: true });
|
|
294
|
+
for (const [name, content] of Object.entries(kv)) {
|
|
295
|
+
writeFileSync(join(artifactsDir, `${scenarioId}.${name}`), content);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=scenario-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenario-runner.js","sourceRoot":"","sources":["../../src/core/scenario-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/core/state.js
CHANGED
|
@@ -16,4 +16,15 @@ export function writeState(repoRoot, state) {
|
|
|
16
16
|
export function isInstalled(repoRoot) {
|
|
17
17
|
return existsSync(statePath(repoRoot));
|
|
18
18
|
}
|
|
19
|
+
/** Get the last-recorded reconciliation decision for a given repo-relative path. */
|
|
20
|
+
export function lastReconciliationFor(state, dest) {
|
|
21
|
+
if (!state?.reconciled)
|
|
22
|
+
return null;
|
|
23
|
+
// The list is append-only, so the last matching entry wins.
|
|
24
|
+
for (let i = state.reconciled.length - 1; i >= 0; i--) {
|
|
25
|
+
if (state.reconciled[i].dest === dest)
|
|
26
|
+
return state.reconciled[i];
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
19
30
|
//# sourceMappingURL=state.js.map
|
package/dist/core/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAuCpD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAElD,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,KAAoB;IAC/D,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IACvC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB,CAAC,KAA2B,EAAE,IAAY;IAC7E,IAAI,CAAC,KAAK,EAAE,UAAU;QAAE,OAAO,IAAI,CAAC;IACpC,4DAA4D;IAC5D,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACtD,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { populateAgentsMarkers } from "./markers.js";
|
|
5
|
+
/**
|
|
6
|
+
* Static allowlist of Copilot SDK model ids. This is the OFFLINE fallback only — when the
|
|
7
|
+
* provider is reachable, `validateModelIds` prefers `provider.listModels()` (the canonical source).
|
|
8
|
+
* The list mirrors what `CopilotClient.listModels()` returned as of knowledge 0.5.x — bump it when
|
|
9
|
+
* the SDK roster shifts. Missing-from-this-list is treated as "unknown" only when no live registry
|
|
10
|
+
* was provided, so a partly stale allowlist degrades to a warning, not a hard failure.
|
|
11
|
+
*/
|
|
12
|
+
const STATIC_MODEL_ALLOWLIST = new Set([
|
|
13
|
+
"auto",
|
|
14
|
+
"claude-haiku-4.5",
|
|
15
|
+
"claude-opus-4.5",
|
|
16
|
+
"claude-opus-4.6",
|
|
17
|
+
"claude-opus-4.7",
|
|
18
|
+
"claude-opus-4.7-1m-internal",
|
|
19
|
+
"claude-opus-4.7-high",
|
|
20
|
+
"claude-opus-4.7-xhigh",
|
|
21
|
+
"claude-opus-4.8",
|
|
22
|
+
"claude-sonnet-4.5",
|
|
23
|
+
"claude-sonnet-4.6",
|
|
24
|
+
"gemini-3.1-pro-preview",
|
|
25
|
+
"gemini-3.5-flash",
|
|
26
|
+
"gpt-5-mini",
|
|
27
|
+
"gpt-5.3-codex",
|
|
28
|
+
"gpt-5.4",
|
|
29
|
+
"gpt-5.4-mini",
|
|
30
|
+
"gpt-5.5",
|
|
31
|
+
"mai-code-1-flash-internal",
|
|
32
|
+
]);
|
|
33
|
+
/** Recursively collect every `.yml`/`.yaml` file under `dir` as repo-relative paths. */
|
|
34
|
+
function listYamlFiles(repoRoot, dir) {
|
|
35
|
+
const out = [];
|
|
36
|
+
const walk = (abs) => {
|
|
37
|
+
if (!existsSync(abs))
|
|
38
|
+
return;
|
|
39
|
+
if (statSync(abs).isFile()) {
|
|
40
|
+
if (/\.ya?ml$/.test(abs))
|
|
41
|
+
out.push(relative(repoRoot, abs));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!statSync(abs).isDirectory())
|
|
45
|
+
return;
|
|
46
|
+
for (const entry of readdirSync(abs)) {
|
|
47
|
+
if (entry.startsWith(".") || entry === "node_modules")
|
|
48
|
+
continue;
|
|
49
|
+
walk(join(abs, entry));
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
walk(join(repoRoot, dir));
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse every YAML file the harness owns and report syntax errors. Used by `agentrig update` so
|
|
57
|
+
* a broken `.agentrig/harness/state-machine.yml` (preserved from a prior install) is surfaced
|
|
58
|
+
* instead of silently rolling forward to the next refresh.
|
|
59
|
+
*
|
|
60
|
+
* Uses `parseAllDocuments` because some shipped templates (scenario.yml) intentionally use
|
|
61
|
+
* multi-document YAML — a single `parse` would reject the trailing `---` as "multiple documents"
|
|
62
|
+
* even when each individual document is valid.
|
|
63
|
+
*/
|
|
64
|
+
export function validateYaml(repoRoot, dirs = [".agentrig"]) {
|
|
65
|
+
const findings = [];
|
|
66
|
+
for (const dir of dirs) {
|
|
67
|
+
for (const rel of listYamlFiles(repoRoot, dir)) {
|
|
68
|
+
const abs = join(repoRoot, rel);
|
|
69
|
+
const docs = YAML.parseAllDocuments(readFileSync(abs, "utf8"));
|
|
70
|
+
const errors = docs.flatMap((d) => d.errors).filter(Boolean);
|
|
71
|
+
if (errors.length) {
|
|
72
|
+
findings.push({ path: rel, error: errors.map((e) => e.message).join("; ") });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return findings;
|
|
77
|
+
}
|
|
78
|
+
/** Extract the `model:` value from a role yaml. Returns null if the key is missing/blank. */
|
|
79
|
+
function extractModel(text) {
|
|
80
|
+
const m = text.match(/^\s*model\s*:\s*(.+?)\s*$/m);
|
|
81
|
+
return m ? m[1].trim().replace(/^["']|["']$/g, "") : null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check that every `.agentrig/agents/*.yml`'s `model:` value is recognized by the active provider
|
|
85
|
+
* (when `liveRegistry` is supplied) or the static allowlist (offline fallback). Returns one
|
|
86
|
+
* finding per role with an unknown model id.
|
|
87
|
+
*/
|
|
88
|
+
export function validateModelIds(repoRoot, liveRegistry) {
|
|
89
|
+
const dir = join(repoRoot, ".agentrig", "agents");
|
|
90
|
+
if (!existsSync(dir))
|
|
91
|
+
return [];
|
|
92
|
+
const registry = liveRegistry && liveRegistry.length ? new Set(liveRegistry) : STATIC_MODEL_ALLOWLIST;
|
|
93
|
+
const findings = [];
|
|
94
|
+
for (const entry of readdirSync(dir)) {
|
|
95
|
+
if (!entry.endsWith(".yml"))
|
|
96
|
+
continue;
|
|
97
|
+
const rel = join(".agentrig", "agents", entry);
|
|
98
|
+
const value = extractModel(readFileSync(join(dir, entry), "utf8"));
|
|
99
|
+
if (!value || value === "auto")
|
|
100
|
+
continue;
|
|
101
|
+
if (registry.has(value))
|
|
102
|
+
continue;
|
|
103
|
+
// "Did you mean…" — closest by leading segment.
|
|
104
|
+
const prefix = value.split(/[-.]/)[0].toLowerCase();
|
|
105
|
+
const near = [...registry].filter((id) => id.toLowerCase().startsWith(prefix)).sort();
|
|
106
|
+
findings.push({ path: rel, value, suggestions: near.slice(0, 4) });
|
|
107
|
+
}
|
|
108
|
+
return findings;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Run the marker populator in a dry mode that doesn't touch the filesystem, just to report any
|
|
112
|
+
* `AGENTRIG:<name>` blocks the user has added that no populator knows how to handle. Useful as
|
|
113
|
+
* an A2 probe; harmless when the populator already ran.
|
|
114
|
+
*/
|
|
115
|
+
export function validateMarkers(repoRoot) {
|
|
116
|
+
// populateAgentsMarkers is idempotent — calling it twice in one update doesn't matter, and
|
|
117
|
+
// the returned `skipped` list is exactly what we want here.
|
|
118
|
+
const report = populateAgentsMarkers(repoRoot);
|
|
119
|
+
return report.skipped.map((name) => ({ name }));
|
|
120
|
+
}
|
|
121
|
+
/** One-shot helper used by `update` + `doctor`. */
|
|
122
|
+
export function runValidation(repoRoot, liveRegistry) {
|
|
123
|
+
const yaml = validateYaml(repoRoot);
|
|
124
|
+
const models = validateModelIds(repoRoot, liveRegistry);
|
|
125
|
+
return { yaml, models, hasBlockers: yaml.length > 0 || models.length > 0 };
|
|
126
|
+
}
|
|
127
|
+
/** Expose for fix.ts (avoids a circular dep with state.ts). */
|
|
128
|
+
export { STATIC_MODEL_ALLOWLIST };
|
|
129
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"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"}
|