@doidor/agentrig 0.5.3
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/LICENSE +21 -0
- package/README.md +224 -0
- package/dist/agent/claude.js +125 -0
- package/dist/agent/claude.js.map +1 -0
- package/dist/agent/copilot.js +147 -0
- package/dist/agent/copilot.js.map +1 -0
- package/dist/agent/index.js +17 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/provider.js +10 -0
- package/dist/agent/provider.js.map +1 -0
- package/dist/cli.js +169 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/compile.js +42 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/dashboard.js +35 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.js +40 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/eval.js +178 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/init.js +100 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/update.js +176 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/core/activity.js +80 -0
- package/dist/core/activity.js.map +1 -0
- package/dist/core/audit.js +112 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/compile.js +250 -0
- package/dist/core/compile.js.map +1 -0
- package/dist/core/fsutil.js +45 -0
- package/dist/core/fsutil.js.map +1 -0
- package/dist/core/install.js +97 -0
- package/dist/core/install.js.map +1 -0
- package/dist/core/knowledge.js +34 -0
- package/dist/core/knowledge.js.map +1 -0
- package/dist/core/logger.js +31 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/paths.js +22 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/setupsteps.js +72 -0
- package/dist/core/setupsteps.js.map +1 -0
- package/dist/core/state.js +19 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/surfaces.js +62 -0
- package/dist/core/surfaces.js.map +1 -0
- package/dist/prompts/index.js +117 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/version.js +26 -0
- package/dist/version.js.map +1 -0
- package/knowledge/PRINCIPLES.md +106 -0
- package/knowledge/manifest.json +247 -0
- package/knowledge/templates/AGENTS.md +66 -0
- package/knowledge/templates/AGENTS.package.example.md +19 -0
- package/knowledge/templates/agents/README.md +33 -0
- package/knowledge/templates/agents/developer.md +7 -0
- package/knowledge/templates/agents/developer.yml +7 -0
- package/knowledge/templates/agents/judge.md +6 -0
- package/knowledge/templates/agents/judge.yml +6 -0
- package/knowledge/templates/agents/reviewer.md +6 -0
- package/knowledge/templates/agents/reviewer.yml +7 -0
- package/knowledge/templates/agents/triager.md +8 -0
- package/knowledge/templates/agents/triager.yml +8 -0
- package/knowledge/templates/dashboard/dashboard.mjs +261 -0
- package/knowledge/templates/eval/RUBRIC.md +94 -0
- package/knowledge/templates/eval/axes.json +56 -0
- package/knowledge/templates/eval/checks.json +304 -0
- package/knowledge/templates/eval/sandbox/eval-rules.md +23 -0
- package/knowledge/templates/eval/scenarios/README.md +24 -0
- package/knowledge/templates/eval/scenarios/add-small-feature.md +28 -0
- package/knowledge/templates/eval/scenarios/fix-failing-test.md +27 -0
- package/knowledge/templates/eval/scenarios/review-catches-bug.md +30 -0
- package/knowledge/templates/eval/score.mjs +257 -0
- package/knowledge/templates/eval/static-audit.mjs +112 -0
- package/knowledge/templates/harness/ORCHESTRATION.md +53 -0
- package/knowledge/templates/harness/state-machine.yml +105 -0
- package/knowledge/templates/mcp/mcp.json +12 -0
- package/knowledge/templates/rules/README.md +32 -0
- package/knowledge/templates/rules/code-review.md +26 -0
- package/knowledge/templates/rules/coding-standards.md +15 -0
- package/knowledge/templates/rules/no-debug-logging.md +16 -0
- package/knowledge/templates/rules/security.md +23 -0
- package/knowledge/templates/scripts/repair-worktrees.sh +124 -0
- package/knowledge/templates/skills/fix-ci/SKILL.md +17 -0
- package/knowledge/templates/skills/harness-eval/SKILL.md +83 -0
- package/knowledge/templates/skills/self-verify/SKILL.md +25 -0
- package/knowledge/templates/skills/skill-authoring/SKILL.md +35 -0
- package/knowledge/templates/skills/skill-improver/SKILL.md +23 -0
- package/knowledge/templates/skills/verify-loop/SKILL.md +35 -0
- package/knowledge/templates/wiki/README.md +23 -0
- package/knowledge/templates/wiki/_TEMPLATE.md +16 -0
- package/knowledge/templates/wiki/index.md +29 -0
- package/knowledge/templates/wiki/troubleshooting.md +14 -0
- package/package.json +70 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { setVerbose, log, color } from "./core/logger.js";
|
|
4
|
+
import { initCommand } from "./commands/init.js";
|
|
5
|
+
import { updateCommand } from "./commands/update.js";
|
|
6
|
+
import { evalCommand } from "./commands/eval.js";
|
|
7
|
+
import { doctorCommand } from "./commands/doctor.js";
|
|
8
|
+
import { dashboardCommand } from "./commands/dashboard.js";
|
|
9
|
+
import { compileCommand } from "./commands/compile.js";
|
|
10
|
+
import pkg from "./version.js";
|
|
11
|
+
const BOOLEAN_FLAGS = new Set([
|
|
12
|
+
"dry-run",
|
|
13
|
+
"diff",
|
|
14
|
+
"skip-agent",
|
|
15
|
+
"static",
|
|
16
|
+
"dynamic",
|
|
17
|
+
"rubric",
|
|
18
|
+
"json",
|
|
19
|
+
"no-tasks",
|
|
20
|
+
"verbose",
|
|
21
|
+
"yes",
|
|
22
|
+
"help",
|
|
23
|
+
"version",
|
|
24
|
+
]);
|
|
25
|
+
function parseArgs(argv) {
|
|
26
|
+
const positionals = [];
|
|
27
|
+
const flags = {};
|
|
28
|
+
let command;
|
|
29
|
+
for (let i = 0; i < argv.length; i++) {
|
|
30
|
+
const a = argv[i];
|
|
31
|
+
if (a.startsWith("--")) {
|
|
32
|
+
const key = a.slice(2);
|
|
33
|
+
const next = argv[i + 1];
|
|
34
|
+
if (!BOOLEAN_FLAGS.has(key) && next !== undefined && !next.startsWith("-")) {
|
|
35
|
+
flags[key] = next;
|
|
36
|
+
i++;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
flags[key] = true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (a.startsWith("-")) {
|
|
43
|
+
for (const ch of a.slice(1))
|
|
44
|
+
flags[ch] = true;
|
|
45
|
+
}
|
|
46
|
+
else if (command === undefined) {
|
|
47
|
+
command = a;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
positionals.push(a);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { command, positionals, flags };
|
|
54
|
+
}
|
|
55
|
+
const HELP = `${color.bold("agentrig")} — an agentic meta-harness (a harness of harnesses)
|
|
56
|
+
|
|
57
|
+
${color.bold("Usage:")} agentrig <command> [path] [options]
|
|
58
|
+
|
|
59
|
+
${color.bold("Commands:")}
|
|
60
|
+
init [path] Investigate the repo and install a best-practice agent harness
|
|
61
|
+
update [path] Re-sync the latest best practices into an existing harness
|
|
62
|
+
--diff show how your preserved files differ from canonical
|
|
63
|
+
compile [path] Project AGENTS.md + rules into every agent surface (local + remote):
|
|
64
|
+
copilot-instructions, .github/instructions, CLAUDE.md, .cursor/rules,
|
|
65
|
+
MCP, and copilot-setup-steps.yml
|
|
66
|
+
eval [path] Evaluate the harness itself (defaults to the full agentic, harness-on run)
|
|
67
|
+
--static fast deterministic structural audit, no model (use in CI)
|
|
68
|
+
--rubric print what's evaluated (rubric axes, issue codes, scenarios)
|
|
69
|
+
--scenario <id> run one scenario only (e.g. fix-failing-test)
|
|
70
|
+
--variant <name> label this run (default 'harness'; use 'baseline' for harness-OFF)
|
|
71
|
+
--timeout <min> absolute cap per agent turn (default 45)
|
|
72
|
+
doctor [path] Quick health check (installed? agent reachable? score?)
|
|
73
|
+
dashboard [path] Show agent roster, live GitHub tasks, harness score, and evals
|
|
74
|
+
--html [file] write a self-contained HTML dashboard
|
|
75
|
+
--no-tasks skip live GitHub lookups (offline)
|
|
76
|
+
|
|
77
|
+
${color.bold("Options:")}
|
|
78
|
+
--model <id> Model to use for agentic steps (e.g. claude-sonnet-4.5, gpt-5)
|
|
79
|
+
--dry-run Show what would happen without writing or calling the model
|
|
80
|
+
--skip-agent Install/update the canonical harness without the agentic steps
|
|
81
|
+
--static (eval) deterministic audit only
|
|
82
|
+
--dynamic (eval) run dynamic behavioral eval
|
|
83
|
+
--json Machine-readable output (eval/doctor/dashboard)
|
|
84
|
+
--min <pct> (eval --static) exit non-zero if Harness Score < pct
|
|
85
|
+
--html [file] (dashboard) write an HTML page instead of terminal output
|
|
86
|
+
--no-tasks (dashboard) skip live GitHub task lookups
|
|
87
|
+
--verbose Verbose logging
|
|
88
|
+
-h, --help Show this help
|
|
89
|
+
-v, --version Show version
|
|
90
|
+
|
|
91
|
+
${color.bold("Environment:")}
|
|
92
|
+
AGENTRIG_PROVIDER Agent backend (default: copilot)
|
|
93
|
+
|
|
94
|
+
${color.dim("Best practices live in this package's knowledge/ directory — edit them and run `agentrig update`.")}`;
|
|
95
|
+
async function main() {
|
|
96
|
+
const { command, positionals, flags } = parseArgs(process.argv.slice(2));
|
|
97
|
+
if (flags.version || flags.v || command === "version") {
|
|
98
|
+
console.log(pkg.version);
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
if (flags.help || flags.h || command === "help") {
|
|
102
|
+
console.log(HELP);
|
|
103
|
+
return 0;
|
|
104
|
+
}
|
|
105
|
+
if (!command) {
|
|
106
|
+
console.log(HELP);
|
|
107
|
+
return 1;
|
|
108
|
+
}
|
|
109
|
+
setVerbose(Boolean(flags.verbose));
|
|
110
|
+
const repoRoot = resolve(positionals[0] ?? ".");
|
|
111
|
+
const model = typeof flags.model === "string" ? flags.model : undefined;
|
|
112
|
+
try {
|
|
113
|
+
switch (command) {
|
|
114
|
+
case "init":
|
|
115
|
+
return await initCommand(repoRoot, {
|
|
116
|
+
dryRun: Boolean(flags["dry-run"]),
|
|
117
|
+
...(model ? { model } : {}),
|
|
118
|
+
yes: Boolean(flags.yes),
|
|
119
|
+
verbose: Boolean(flags.verbose),
|
|
120
|
+
skipAgent: Boolean(flags["skip-agent"]),
|
|
121
|
+
});
|
|
122
|
+
case "update":
|
|
123
|
+
return await updateCommand(repoRoot, {
|
|
124
|
+
dryRun: Boolean(flags["dry-run"]),
|
|
125
|
+
diff: Boolean(flags.diff),
|
|
126
|
+
...(model ? { model } : {}),
|
|
127
|
+
verbose: Boolean(flags.verbose),
|
|
128
|
+
skipAgent: Boolean(flags["skip-agent"]),
|
|
129
|
+
});
|
|
130
|
+
case "eval": {
|
|
131
|
+
// Default to the full agentic, harness-on dynamic eval; `--static` for the fast no-model audit.
|
|
132
|
+
const mode = flags.static ? "static" : "dynamic";
|
|
133
|
+
return await evalCommand(repoRoot, {
|
|
134
|
+
mode,
|
|
135
|
+
json: Boolean(flags.json),
|
|
136
|
+
rubric: Boolean(flags.rubric),
|
|
137
|
+
...(model ? { model } : {}),
|
|
138
|
+
...(flags.min != null ? { min: Number(flags.min) } : {}),
|
|
139
|
+
...(typeof flags.scenario === "string" ? { scenario: flags.scenario } : {}),
|
|
140
|
+
...(typeof flags.variant === "string" ? { variant: flags.variant } : {}),
|
|
141
|
+
...(flags.timeout != null ? { timeoutMinutes: Number(flags.timeout) } : {}),
|
|
142
|
+
verbose: Boolean(flags.verbose),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
case "doctor":
|
|
146
|
+
return await doctorCommand(repoRoot, { json: Boolean(flags.json) });
|
|
147
|
+
case "compile":
|
|
148
|
+
return compileCommand(repoRoot, { json: Boolean(flags.json) });
|
|
149
|
+
case "dashboard":
|
|
150
|
+
return dashboardCommand(repoRoot, {
|
|
151
|
+
json: Boolean(flags.json),
|
|
152
|
+
noTasks: Boolean(flags["no-tasks"]),
|
|
153
|
+
...(flags.html != null ? { html: flags.html } : {}),
|
|
154
|
+
});
|
|
155
|
+
default:
|
|
156
|
+
log.error(`Unknown command: ${command}`);
|
|
157
|
+
console.log(`\n${HELP}`);
|
|
158
|
+
return 1;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
log.error(err.message);
|
|
163
|
+
if (flags.verbose)
|
|
164
|
+
console.error(err);
|
|
165
|
+
return 1;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
main().then((code) => process.exit(code));
|
|
169
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,GAAG,MAAM,cAAc,CAAC;AAQ/B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,SAAS;IACT,MAAM;IACN,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,MAAM;IACN,UAAU;IACV,SAAS;IACT,KAAK;IACL,MAAM;IACN,SAAS;CACV,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,KAAK,GAAqC,EAAE,CAAC;IACnD,IAAI,OAA2B,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3E,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAClB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;QAChD,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,GAAG,CAAC,CAAC;QACd,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;;EAEpC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;;EAEpB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;EAkBvB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;;;;;;;;;;;;;;EActB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;;;EAG1B,KAAK,CAAC,GAAG,CAAC,mGAAmG,CAAC,EAAE,CAAC;AAEnH,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzE,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAExE,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM;gBACT,OAAO,MAAM,WAAW,CAAC,QAAQ,EAAE;oBACjC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACjC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;oBACvB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC/B,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;iBACxC,CAAC,CAAC;YACL,KAAK,QAAQ;gBACX,OAAO,MAAM,aAAa,CAAC,QAAQ,EAAE;oBACnC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACjC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;oBACzB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC/B,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;iBACxC,CAAC,CAAC;YACL,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,gGAAgG;gBAChG,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;gBACjD,OAAO,MAAM,WAAW,CAAC,QAAQ,EAAE;oBACjC,IAAI;oBACJ,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;oBACzB,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC7B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxD,GAAG,CAAC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3E,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3E,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;iBAChC,CAAC,CAAC;YACL,CAAC;YACD,KAAK,QAAQ;gBACX,OAAO,MAAM,aAAa,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtE,KAAK,SAAS;gBACZ,OAAO,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjE,KAAK,WAAW;gBACd,OAAO,gBAAgB,CAAC,QAAQ,EAAE;oBAChC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;oBACzB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBACnC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpD,CAAC,CAAC;YACL;gBACE,GAAG,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACzB,OAAO,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { isInstalled } from "../core/state.js";
|
|
2
|
+
import { compileSurfaces } from "../core/compile.js";
|
|
3
|
+
import { validateSetupSteps } from "../core/setupsteps.js";
|
|
4
|
+
import { color, log } from "../core/logger.js";
|
|
5
|
+
/** Re-project the canonical source (AGENTS.md + rules) into every agent surface, local and remote. */
|
|
6
|
+
export function compileCommand(repoRoot, options) {
|
|
7
|
+
if (!isInstalled(repoRoot)) {
|
|
8
|
+
log.error("No AgentRig harness here. Run `agentrig init` first.");
|
|
9
|
+
return 1;
|
|
10
|
+
}
|
|
11
|
+
const result = compileSurfaces(repoRoot);
|
|
12
|
+
const setup = validateSetupSteps(repoRoot);
|
|
13
|
+
if (options.json) {
|
|
14
|
+
console.log(JSON.stringify({ ...result, setupSteps: setup }, null, 2));
|
|
15
|
+
return setup.ok ? 0 : 1;
|
|
16
|
+
}
|
|
17
|
+
log.info(color.bold("AgentRig — compiling agent surfaces\n"));
|
|
18
|
+
for (const p of result.generated)
|
|
19
|
+
log.info(` ${color.green("✚")} ${p}`);
|
|
20
|
+
for (const s of result.skipped)
|
|
21
|
+
log.info(color.dim(` · ${s.path} — ${s.reason}`));
|
|
22
|
+
log.ok(`\nprojected ${result.generated.length} file(s) for local + remote agents`);
|
|
23
|
+
renderSetupValidation(setup);
|
|
24
|
+
log.info(color.dim(" Commit these so web/remote agents (GitHub Copilot) and other CLIs benefit too."));
|
|
25
|
+
return setup.ok ? 0 : 1;
|
|
26
|
+
}
|
|
27
|
+
/** Print the copilot-setup-steps.yml validation result. */
|
|
28
|
+
export function renderSetupValidation(setup) {
|
|
29
|
+
if (!setup.present)
|
|
30
|
+
return;
|
|
31
|
+
if (setup.ok && setup.warnings.length === 0) {
|
|
32
|
+
log.ok(`copilot-setup-steps.yml is valid (checked: ${setup.checkedWith.join(", ")})`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
for (const e of setup.errors)
|
|
36
|
+
log.error(`copilot-setup-steps.yml: ${e}`);
|
|
37
|
+
for (const w of setup.warnings)
|
|
38
|
+
log.warn(`copilot-setup-steps.yml: ${w}`);
|
|
39
|
+
if (!setup.ok)
|
|
40
|
+
log.info(color.dim(" GitHub also validates this workflow on push (Actions tab)."));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAM/C,sGAAsG;AACtG,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAuB;IACtE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAClE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnF,GAAG,CAAC,EAAE,CAAC,eAAe,MAAM,CAAC,SAAS,CAAC,MAAM,oCAAoC,CAAC,CAAC;IACnF,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC,CAAC;IACxG,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,qBAAqB,CAAC,KAA4C;IAChF,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO;IAC3B,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,EAAE,CAAC,8CAA8C,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtF,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM;QAAE,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ;QAAE,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;AACrG,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import { join } from "../core/fsutil.js";
|
|
4
|
+
import { isInstalled } from "../core/state.js";
|
|
5
|
+
import { log } from "../core/logger.js";
|
|
6
|
+
/**
|
|
7
|
+
* Render the harness dashboard. The real implementation is the dependency-free
|
|
8
|
+
* `.agentrig/dashboard/dashboard.mjs` installed in the repo (so it also runs without the global
|
|
9
|
+
* CLI); this command is a thin convenience wrapper that forwards flags.
|
|
10
|
+
*/
|
|
11
|
+
export function dashboardCommand(repoRoot, options) {
|
|
12
|
+
const script = join(repoRoot, ".agentrig", "dashboard", "dashboard.mjs");
|
|
13
|
+
if (!existsSync(script)) {
|
|
14
|
+
if (!isInstalled(repoRoot)) {
|
|
15
|
+
log.error("No AgentRig harness here. Run `agentrig init` first.");
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
log.error("Dashboard not installed. Run `agentrig update` to add it.");
|
|
19
|
+
}
|
|
20
|
+
return 1;
|
|
21
|
+
}
|
|
22
|
+
const passthrough = [];
|
|
23
|
+
if (options.json)
|
|
24
|
+
passthrough.push("--json");
|
|
25
|
+
if (options.noTasks)
|
|
26
|
+
passthrough.push("--no-tasks");
|
|
27
|
+
if (options.html) {
|
|
28
|
+
passthrough.push("--html");
|
|
29
|
+
if (typeof options.html === "string")
|
|
30
|
+
passthrough.push(options.html);
|
|
31
|
+
}
|
|
32
|
+
const result = spawnSync(process.execPath, [script, ...passthrough], { stdio: "inherit" });
|
|
33
|
+
return result.status ?? 0;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAQxC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,OAAyB;IAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IACzE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,IAAI;QAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,OAAO;QAAE,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3B,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;YAAE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3F,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { auditHarness } from "../core/audit.js";
|
|
2
|
+
import { readState, isInstalled } from "../core/state.js";
|
|
3
|
+
import { validateSetupSteps } from "../core/setupsteps.js";
|
|
4
|
+
import { color, log } from "../core/logger.js";
|
|
5
|
+
import { getProvider } from "../agent/index.js";
|
|
6
|
+
/** Quick health check: is a harness installed, is the agent reachable, and what is the score. */
|
|
7
|
+
export async function doctorCommand(repoRoot, options) {
|
|
8
|
+
const installed = isInstalled(repoRoot);
|
|
9
|
+
const state = readState(repoRoot);
|
|
10
|
+
const report = auditHarness(repoRoot);
|
|
11
|
+
const setup = validateSetupSteps(repoRoot);
|
|
12
|
+
const provider = getProvider();
|
|
13
|
+
const pre = await provider.preflight();
|
|
14
|
+
if (options.json) {
|
|
15
|
+
console.log(JSON.stringify({
|
|
16
|
+
installed,
|
|
17
|
+
knowledgeVersion: state?.knowledgeVersion ?? null,
|
|
18
|
+
harnessScore: report.harnessScore,
|
|
19
|
+
setupSteps: setup,
|
|
20
|
+
agent: { provider: provider.name, ...pre },
|
|
21
|
+
}, null, 2));
|
|
22
|
+
return installed && pre.ok ? 0 : 1;
|
|
23
|
+
}
|
|
24
|
+
log.info(color.bold("AgentRig — doctor\n"));
|
|
25
|
+
log.info(` harness installed : ${installed ? color.green("yes") : color.red("no")}`);
|
|
26
|
+
if (state)
|
|
27
|
+
log.info(` knowledge version : ${state.knowledgeVersion}`);
|
|
28
|
+
log.info(` harness score : ${report.harnessScore}%`);
|
|
29
|
+
const setupStatus = !setup.present
|
|
30
|
+
? color.dim("not present")
|
|
31
|
+
: setup.ok
|
|
32
|
+
? color.green(setup.warnings.length ? `valid (${setup.warnings.length} warning)` : "valid")
|
|
33
|
+
: color.red(`${setup.errors.length} error(s)`);
|
|
34
|
+
log.info(` setup-steps.yml : ${setupStatus}`);
|
|
35
|
+
log.info(` agent (${provider.name}) : ${pre.ok ? color.green(pre.detail) : color.red(pre.detail)}`);
|
|
36
|
+
if (!installed)
|
|
37
|
+
log.info(color.dim("\n Run `agentrig init` to install a harness."));
|
|
38
|
+
return installed && pre.ok ? 0 : 1;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import { auditHarness } from "../core/audit.js";
|
|
4
|
+
import { join } from "../core/fsutil.js";
|
|
5
|
+
import { isInstalled } from "../core/state.js";
|
|
6
|
+
import { color, log } from "../core/logger.js";
|
|
7
|
+
import { ActivityMonitor } from "../core/activity.js";
|
|
8
|
+
import { getProvider } from "../agent/index.js";
|
|
9
|
+
import { AgentTimeoutError } from "../agent/provider.js";
|
|
10
|
+
import { buildDynamicEvalPrompt, SYSTEM_MESSAGE } from "../prompts/index.js";
|
|
11
|
+
/** Print what the dynamic eval measures: rubric types/axes/issue-codes + installed scenarios. */
|
|
12
|
+
export function renderRubric(repoRoot, asJson) {
|
|
13
|
+
const axesPath = join(repoRoot, ".agentrig", "eval", "axes.json");
|
|
14
|
+
const scenariosDir = join(repoRoot, ".agentrig", "eval", "scenarios");
|
|
15
|
+
if (!existsSync(axesPath)) {
|
|
16
|
+
log.error("No rubric found (.agentrig/eval/axes.json). Run `agentrig init` first.");
|
|
17
|
+
return 1;
|
|
18
|
+
}
|
|
19
|
+
const axes = JSON.parse(readFileSync(axesPath, "utf8"));
|
|
20
|
+
const scenarios = [];
|
|
21
|
+
if (existsSync(scenariosDir)) {
|
|
22
|
+
for (const f of readdirSync(scenariosDir)) {
|
|
23
|
+
if (!f.endsWith(".md") || f === "README.md")
|
|
24
|
+
continue;
|
|
25
|
+
const fm = readFileSync(join(scenariosDir, f), "utf8");
|
|
26
|
+
const get = (k) => (fm.match(new RegExp(`^${k}:\\s*(.+)$`, "m")) || [])[1]?.trim() ?? "";
|
|
27
|
+
scenarios.push({ id: get("id") || f.replace(/\.md$/, ""), type: get("type") || "run", scope: get("scope") || "" });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (asJson) {
|
|
31
|
+
console.log(JSON.stringify({ passThreshold: axes.passThreshold, tiers: axes.tiers, types: axes.types, scenarios }, null, 2));
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
log.info(color.bold("AgentRig — what the dynamic eval measures\n"));
|
|
35
|
+
log.info(color.dim(` Source of truth: .agentrig/eval/axes.json + RUBRIC.md + scenarios/. Tiers ${(axes.tiers || [0, 0.5, 1]).join("/")}, pass ≥ ${axes.passThreshold}.\n`));
|
|
36
|
+
for (const [type, def] of Object.entries(axes.types)) {
|
|
37
|
+
log.info(` ${color.bold(type.toUpperCase())} — ${def.label}`);
|
|
38
|
+
for (const [cat, axesMap] of Object.entries(def.categories)) {
|
|
39
|
+
log.info(` ${color.cyan(cat)}`);
|
|
40
|
+
for (const [axis, codes] of Object.entries(axesMap)) {
|
|
41
|
+
log.info(` ${axis.padEnd(20)} ${color.dim(`codes: ${codes.join(", ")}`)}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
log.info(`\n ${color.bold("Scenarios")} (.agentrig/eval/scenarios/):`);
|
|
46
|
+
for (const s of scenarios)
|
|
47
|
+
log.info(` ${s.id.padEnd(22)} ${color.dim(`[${s.type}${s.scope ? ", " + s.scope : ""}]`)}`);
|
|
48
|
+
log.info(color.dim("\n Run them: agentrig eval --dynamic [--scenario <id>]"));
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
/** Best-effort current git HEAD sha of the repo (for replayable run metadata). */
|
|
52
|
+
function gitHead(repoRoot) {
|
|
53
|
+
const res = spawnSync("git", ["-C", repoRoot, "rev-parse", "HEAD"], { encoding: "utf8" });
|
|
54
|
+
return res.status === 0 ? res.stdout.trim() : null;
|
|
55
|
+
}
|
|
56
|
+
export function renderAudit(report) {
|
|
57
|
+
log.info(color.bold("AgentRig — harness audit"));
|
|
58
|
+
log.info(color.dim(` checks source: ${report.source}\n`));
|
|
59
|
+
for (const r of [...report.results].sort((a, b) => a.principle - b.principle || a.id.localeCompare(b.id))) {
|
|
60
|
+
const tag = r.score === 1 ? color.green("PASS") : r.score === 0.5 ? color.yellow("PART") : color.red("FAIL");
|
|
61
|
+
log.info(` [${tag}] P${r.principle} ${r.title}`);
|
|
62
|
+
if (r.evidence)
|
|
63
|
+
log.info(color.dim(` ↳ ${r.evidence}`));
|
|
64
|
+
}
|
|
65
|
+
const full = report.results.filter((r) => r.score === 1).length;
|
|
66
|
+
const scoreColor = report.harnessScore >= 80 ? color.green : report.harnessScore >= 50 ? color.yellow : color.red;
|
|
67
|
+
log.info(`\n ${color.bold("Harness Score")}: ${scoreColor(`${report.harnessScore}%`)} (${full}/${report.results.length} full credit)`);
|
|
68
|
+
}
|
|
69
|
+
export async function evalCommand(repoRoot, options) {
|
|
70
|
+
if (options.rubric) {
|
|
71
|
+
return renderRubric(repoRoot, Boolean(options.json));
|
|
72
|
+
}
|
|
73
|
+
if (options.mode === "static") {
|
|
74
|
+
const report = auditHarness(repoRoot);
|
|
75
|
+
if (options.json) {
|
|
76
|
+
console.log(JSON.stringify(report, null, 2));
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
if (!isInstalled(repoRoot)) {
|
|
80
|
+
log.warn("No AgentRig harness detected here (auditing against canonical checks anyway).");
|
|
81
|
+
log.warn("Run `agentrig init` to install one.\n");
|
|
82
|
+
}
|
|
83
|
+
renderAudit(report);
|
|
84
|
+
}
|
|
85
|
+
if (options.min != null && report.harnessScore < options.min) {
|
|
86
|
+
log.error(`Harness Score ${report.harnessScore}% is below required ${options.min}%`);
|
|
87
|
+
return 1;
|
|
88
|
+
}
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
// Dynamic: drive the harness behavioral eval through the agent.
|
|
92
|
+
if (!isInstalled(repoRoot)) {
|
|
93
|
+
log.error("No harness installed. Run `agentrig init` before `agentrig eval --dynamic`.");
|
|
94
|
+
return 1;
|
|
95
|
+
}
|
|
96
|
+
const provider = getProvider();
|
|
97
|
+
const pre = await provider.preflight();
|
|
98
|
+
if (!pre.ok) {
|
|
99
|
+
log.error(`Agent unavailable: ${pre.detail}`);
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
log.ok(`agent ready (${pre.detail})`);
|
|
103
|
+
const scopeLabel = options.scenario ? `scenario "${options.scenario}"` : "all scenarios";
|
|
104
|
+
const variant = options.variant ?? "harness";
|
|
105
|
+
// Create a per-run artifacts directory + meta.json (CLI-owned; the agent fills diff/output).
|
|
106
|
+
const runId = `run-${new Date().toISOString().replace(/[:.]/g, "-")}`;
|
|
107
|
+
const artifactsDirAbs = join(repoRoot, ".agentrig", "eval", "results", "runs", runId);
|
|
108
|
+
const artifactsDirRel = join(".agentrig", "eval", "results", "runs", runId);
|
|
109
|
+
mkdirSync(artifactsDirAbs, { recursive: true });
|
|
110
|
+
const startedAt = new Date().toISOString();
|
|
111
|
+
const meta = {
|
|
112
|
+
runId,
|
|
113
|
+
startedAt,
|
|
114
|
+
provider: provider.name,
|
|
115
|
+
model: options.model ?? null,
|
|
116
|
+
scenario: options.scenario ?? "all",
|
|
117
|
+
variant,
|
|
118
|
+
gitHead: gitHead(repoRoot),
|
|
119
|
+
};
|
|
120
|
+
writeFileSync(join(artifactsDirAbs, "meta.json"), JSON.stringify(meta, null, 2));
|
|
121
|
+
log.step(`running dynamic harness evaluation — ${scopeLabel}${variant ? ` [variant: ${variant}]` : ""} (this calls the model)…`);
|
|
122
|
+
log.info(color.dim(` Run ${runId}; scores + artifacts under ${artifactsDirRel}/`));
|
|
123
|
+
log.info(color.dim(" Live activity below; this can take many minutes.\n"));
|
|
124
|
+
const monitor = new ActivityMonitor().start();
|
|
125
|
+
const conversationOptions = {
|
|
126
|
+
cwd: repoRoot,
|
|
127
|
+
systemMessage: SYSTEM_MESSAGE,
|
|
128
|
+
onEvent: monitor.handle,
|
|
129
|
+
...(options.model ? { model: options.model } : {}),
|
|
130
|
+
...(options.timeoutMinutes ? { maxMs: options.timeoutMinutes * 60 * 1000 } : {}),
|
|
131
|
+
};
|
|
132
|
+
const convo = await provider.startConversation(conversationOptions);
|
|
133
|
+
let timedOut = false;
|
|
134
|
+
try {
|
|
135
|
+
const summary = await convo.send(buildDynamicEvalPrompt(options.scenario, { runId, artifactsDir: artifactsDirRel, ...(variant ? { variant } : {}) }));
|
|
136
|
+
monitor.stop();
|
|
137
|
+
log.info("\n" + summary);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
monitor.stop();
|
|
141
|
+
if (err instanceof AgentTimeoutError) {
|
|
142
|
+
timedOut = true;
|
|
143
|
+
log.warn(`agent stopped: ${err.message}.`);
|
|
144
|
+
log.warn("Any scenarios that finished were still saved — showing them below.");
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
throw err;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
monitor.stop();
|
|
152
|
+
await convo.end();
|
|
153
|
+
}
|
|
154
|
+
// Finalize the run metadata.
|
|
155
|
+
const finishedAt = new Date().toISOString();
|
|
156
|
+
meta.finishedAt = finishedAt;
|
|
157
|
+
meta.durationMs = Date.parse(finishedAt) - Date.parse(startedAt);
|
|
158
|
+
meta.timedOut = timedOut;
|
|
159
|
+
meta.artifacts = readdirSync(artifactsDirAbs).filter((f) => f !== "meta.json");
|
|
160
|
+
writeFileSync(join(artifactsDirAbs, "meta.json"), JSON.stringify(meta, null, 2));
|
|
161
|
+
// Always surface whatever was saved, even on timeout.
|
|
162
|
+
log.info("");
|
|
163
|
+
renderSavedDynamicResults(repoRoot);
|
|
164
|
+
log.info(color.dim(`\n Run artifacts: ${artifactsDirRel}/ (meta.json + any diff/output the run saved)`));
|
|
165
|
+
log.info(color.dim(" Re-run a single scenario with: agentrig eval --dynamic --scenario <id>"));
|
|
166
|
+
log.info(color.dim(" Raise the cap with: --timeout <minutes>"));
|
|
167
|
+
return timedOut ? 1 : 0;
|
|
168
|
+
}
|
|
169
|
+
/** Run the installed score.mjs aggregator and print its report (best-effort). */
|
|
170
|
+
function renderSavedDynamicResults(repoRoot) {
|
|
171
|
+
const scoreScript = join(repoRoot, ".agentrig", "eval", "score.mjs");
|
|
172
|
+
if (!existsSync(scoreScript))
|
|
173
|
+
return;
|
|
174
|
+
const res = spawnSync(process.execPath, [scoreScript, "report"], { encoding: "utf8" });
|
|
175
|
+
if (res.stdout)
|
|
176
|
+
process.stdout.write(res.stdout);
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { writeState, readState } from "../core/state.js";
|
|
2
|
+
import { loadManifest } from "../core/knowledge.js";
|
|
3
|
+
import { install, baseVars } from "../core/install.js";
|
|
4
|
+
import { linkSurfaces } from "../core/surfaces.js";
|
|
5
|
+
import { compileSurfaces } from "../core/compile.js";
|
|
6
|
+
import { validateSetupSteps } from "../core/setupsteps.js";
|
|
7
|
+
import { auditHarness } from "../core/audit.js";
|
|
8
|
+
import { color, log } from "../core/logger.js";
|
|
9
|
+
import { ActivityMonitor } from "../core/activity.js";
|
|
10
|
+
import { getProvider } from "../agent/index.js";
|
|
11
|
+
import { buildInvestigatePrompt, buildTailorPrompt, SYSTEM_MESSAGE } from "../prompts/index.js";
|
|
12
|
+
import { renderAudit } from "./eval.js";
|
|
13
|
+
import { renderSetupValidation } from "./compile.js";
|
|
14
|
+
import pkg from "../version.js";
|
|
15
|
+
export async function initCommand(repoRoot, options) {
|
|
16
|
+
const manifest = loadManifest();
|
|
17
|
+
const provider = getProvider();
|
|
18
|
+
log.info(color.bold(`AgentRig — initializing harness in ${repoRoot}\n`));
|
|
19
|
+
if (options.dryRun) {
|
|
20
|
+
const { plan } = install(repoRoot, manifest, { dryRun: true });
|
|
21
|
+
log.step("dry run — would install:");
|
|
22
|
+
for (const item of plan)
|
|
23
|
+
log.info(` ${color.dim(`P${item.principle}`)} ${item.dest} (${item.kind})`);
|
|
24
|
+
log.info("\n Agent prompts that would run:");
|
|
25
|
+
log.info(color.dim(" 1) investigate → .agentrig/context.md"));
|
|
26
|
+
log.info(color.dim(" 2) tailor AGENTS.md / rules / scenarios to the repo"));
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
// Phase 1 (optional): agentic investigation, keeping one conversation for context continuity.
|
|
30
|
+
let convo = null;
|
|
31
|
+
let monitor = null;
|
|
32
|
+
if (!options.skipAgent) {
|
|
33
|
+
const pre = await provider.preflight();
|
|
34
|
+
if (!pre.ok) {
|
|
35
|
+
log.error(`Agent unavailable: ${pre.detail}`);
|
|
36
|
+
log.warn("Re-run with --skip-agent to install the canonical harness without tailoring.");
|
|
37
|
+
return 1;
|
|
38
|
+
}
|
|
39
|
+
log.ok(`agent ready (${pre.detail})`);
|
|
40
|
+
log.step("investigating the repository…");
|
|
41
|
+
monitor = new ActivityMonitor().start();
|
|
42
|
+
convo = await provider.startConversation({
|
|
43
|
+
cwd: repoRoot,
|
|
44
|
+
...(options.model ? { model: options.model } : {}),
|
|
45
|
+
systemMessage: SYSTEM_MESSAGE,
|
|
46
|
+
onEvent: monitor.handle,
|
|
47
|
+
});
|
|
48
|
+
const investigation = await convo.send(buildInvestigatePrompt());
|
|
49
|
+
monitor.stop();
|
|
50
|
+
log.ok("investigation written to .agentrig/context.md");
|
|
51
|
+
if (options.verbose)
|
|
52
|
+
log.info(color.dim(investigation));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
log.warn("--skip-agent: installing canonical harness without repo-specific tailoring.");
|
|
56
|
+
}
|
|
57
|
+
// Phase 2: deterministic install of the canonical harness (guarantees a baseline + passing audit).
|
|
58
|
+
log.step("installing canonical harness artifacts…");
|
|
59
|
+
const { installed } = install(repoRoot, manifest, { vars: baseVars(repoRoot) });
|
|
60
|
+
log.ok(`installed ${installed.length} artifacts`);
|
|
61
|
+
// Mirror the canonical source to every vendor surface (.claude/.copilot/.opencode/.codex).
|
|
62
|
+
const surfaces = linkSurfaces(repoRoot);
|
|
63
|
+
if (surfaces.created.length)
|
|
64
|
+
log.ok(`linked surfaces: ${surfaces.created.join(", ")} → .agents`);
|
|
65
|
+
// Phase 3 (optional): agent tailors the installed files to the repo.
|
|
66
|
+
if (convo) {
|
|
67
|
+
log.step("tailoring the harness to this repository…");
|
|
68
|
+
monitor?.start();
|
|
69
|
+
const summary = await convo.send(buildTailorPrompt(manifest));
|
|
70
|
+
monitor?.stop();
|
|
71
|
+
log.ok("tailoring complete");
|
|
72
|
+
if (options.verbose)
|
|
73
|
+
log.info(color.dim(summary));
|
|
74
|
+
await convo.end();
|
|
75
|
+
}
|
|
76
|
+
// Phase 4: project the canonical source into every agent surface (local + remote).
|
|
77
|
+
const compiled = compileSurfaces(repoRoot);
|
|
78
|
+
log.ok(`compiled ${compiled.generated.length} agent-surface file(s) (Copilot, Claude, Cursor, MCP, setup-steps)`);
|
|
79
|
+
renderSetupValidation(validateSetupSteps(repoRoot));
|
|
80
|
+
// Record state.
|
|
81
|
+
const now = new Date().toISOString();
|
|
82
|
+
const prev = readState(repoRoot);
|
|
83
|
+
const state = {
|
|
84
|
+
agentrigVersion: pkg.version,
|
|
85
|
+
knowledgeVersion: manifest.knowledgeVersion,
|
|
86
|
+
provider: provider.name,
|
|
87
|
+
...(options.model ? { model: options.model } : {}),
|
|
88
|
+
createdAt: prev?.createdAt ?? now,
|
|
89
|
+
updatedAt: now,
|
|
90
|
+
installed,
|
|
91
|
+
};
|
|
92
|
+
writeState(repoRoot, state);
|
|
93
|
+
log.ok("wrote .agentrig/state.json");
|
|
94
|
+
// Verify with the static audit.
|
|
95
|
+
log.info("");
|
|
96
|
+
renderAudit(auditHarness(repoRoot));
|
|
97
|
+
log.info(color.dim("\n Next: review AGENTS.md, then run `agentrig eval --static` anytime."));
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|