@doidor/agentrig 0.10.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -6
- package/dist/cli.js +14 -1
- 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 +65 -3
- package/dist/commands/doctor.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 +33 -1
- 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/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 +54 -175
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/loader.js +36 -0
- package/dist/prompts/loader.js.map +1 -0
- package/dist/prompts/templates/dynamic-eval.md +5 -0
- package/dist/prompts/templates/investigate.md +19 -0
- package/dist/prompts/templates/judge.md +38 -0
- package/dist/prompts/templates/producer-baseline-note.md +1 -0
- package/dist/prompts/templates/producer-handoff-checklist.md +24 -0
- package/dist/prompts/templates/producer-harness-note.md +1 -0
- package/dist/prompts/templates/producer.md +10 -0
- package/dist/prompts/templates/scaffold-scenarios.md +56 -0
- package/dist/prompts/templates/system-message.md +5 -0
- package/dist/prompts/templates/tailor.md +38 -0
- package/dist/prompts/templates/update.md +14 -0
- package/knowledge/manifest.json +1 -1
- package/knowledge/templates/AGENTS.md +1 -1
- 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 +1 -1
- package/knowledge/templates/eval/checks.json +4 -3
- package/knowledge/templates/eval/static-audit.mjs +25 -1
- package/knowledge/templates/rules/coding-standards.md +1 -0
- package/knowledge/templates/skills/harness-eval/SKILL.md +4 -0
- package/knowledge/templates/skills/skill-authoring/SKILL.md +1 -1
- package/knowledge/templates/skills/skill-improver/SKILL.md +1 -1
- package/knowledge/templates/wiki/README.md +4 -8
- package/knowledge/templates/wiki/index.md +3 -8
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/core/fix.ts"],"names":[],"mappings":"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"}
|
package/dist/core/install.js
CHANGED
|
@@ -39,17 +39,63 @@ export function baseVars(repoRoot) {
|
|
|
39
39
|
REPO_NAME: basename(repoRoot),
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
|
-
/**
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Build the skills-inventory markdown block. Used both at install time (via `{{SKILLS_INVENTORY}}`
|
|
44
|
+
* template substitution) and later by the marker populator that refreshes AGENTS.md on `compile`
|
|
45
|
+
* and `update`.
|
|
46
|
+
*
|
|
47
|
+
* Source-of-truth precedence:
|
|
48
|
+
* 1) When `repoRoot` is provided AND `<repoRoot>/.agents/skills` exists, enumerate the
|
|
49
|
+
* directory on disk — this picks up user-added skills (e.g. project-specific markbook-*)
|
|
50
|
+
* alongside the AgentRig-bundled ones. Descriptions come from each skill's `SKILL.md`.
|
|
51
|
+
* 2) Otherwise (or as a fallback for missing SKILL.md descriptions), use the AgentRig manifest.
|
|
52
|
+
*
|
|
53
|
+
* The dual path keeps `agentrig init` deterministic (the freshly-installed repo doesn't have any
|
|
54
|
+
* user skills yet, so manifest entries are the right source) while letting `agentrig compile`
|
|
55
|
+
* and `update` produce a TRUE inventory of what's actually installed.
|
|
56
|
+
*/
|
|
57
|
+
export function skillsInventory(manifest, repoRoot) {
|
|
58
|
+
const descByName = new Map();
|
|
59
|
+
// Manifest-known skills come first (always available even before .agents/skills/ exists).
|
|
45
60
|
for (const artifact of manifest.artifacts) {
|
|
46
61
|
const m = /^\.agents\/skills\/([^/]+)$/.exec(artifact.dest);
|
|
47
62
|
if (!m)
|
|
48
63
|
continue;
|
|
64
|
+
const name = m[1];
|
|
49
65
|
const skillMd = readText(join(resolveSrc(artifact.src), "SKILL.md"));
|
|
50
66
|
const desc = skillMd ? extractFrontmatterValue(skillMd, "description") : null;
|
|
51
|
-
|
|
67
|
+
if (!descByName.has(name))
|
|
68
|
+
descByName.set(name, desc ?? "");
|
|
69
|
+
}
|
|
70
|
+
// On-disk enumeration: walk every direct child of `.agents/skills/` so user-added skills
|
|
71
|
+
// (not in the AgentRig manifest) show up too. Description preference: installed SKILL.md
|
|
72
|
+
// beats manifest fallback so descriptions stay accurate after a `skill-improver` edit.
|
|
73
|
+
let names;
|
|
74
|
+
const skillsDir = repoRoot ? join(repoRoot, ".agents", "skills") : null;
|
|
75
|
+
if (skillsDir && existsSync(skillsDir)) {
|
|
76
|
+
const onDisk = readdirSync(skillsDir).filter((entry) => {
|
|
77
|
+
if (entry.startsWith(".") || entry.startsWith("_"))
|
|
78
|
+
return false;
|
|
79
|
+
return statSync(join(skillsDir, entry)).isDirectory();
|
|
80
|
+
});
|
|
81
|
+
for (const name of onDisk) {
|
|
82
|
+
const skillMd = readText(join(skillsDir, name, "SKILL.md"));
|
|
83
|
+
const desc = skillMd ? extractFrontmatterValue(skillMd, "description") : null;
|
|
84
|
+
if (desc)
|
|
85
|
+
descByName.set(name, desc);
|
|
86
|
+
else if (!descByName.has(name))
|
|
87
|
+
descByName.set(name, "");
|
|
88
|
+
}
|
|
89
|
+
names = [...new Set([...onDisk, ...descByName.keys()])];
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
names = [...descByName.keys()];
|
|
52
93
|
}
|
|
94
|
+
names.sort();
|
|
95
|
+
const lines = names.map((name) => {
|
|
96
|
+
const desc = descByName.get(name) ?? "";
|
|
97
|
+
return `- \`${name}\`${desc ? ` — ${desc}` : ""}`;
|
|
98
|
+
});
|
|
53
99
|
return lines.length ? lines.join("\n") : "_(no skills installed)_";
|
|
54
100
|
}
|
|
55
101
|
function extractFrontmatterValue(text, key) {
|
package/dist/core/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/core/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAgC,MAAM,gBAAgB,CAAC;AAQ1E;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,GAAW,EAAE,IAAY,EAAE,IAAa,EAAE,KAAK,GAAG,IAAI;IAClG,MAAM,MAAM,GAAkB,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAEtD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAQ,EAAE;QAC1C,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACnB,IAAI,KAAK,EAAE,CAAC;gBACV,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtB,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnB,IAAI,IAAI;oBAAE,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC;AA4BD,2FAA2F;AAC3F,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,OAAO;QACL,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/core/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { loadManifest } from "./knowledge.js";
|
|
4
|
+
import { skillsInventory } from "./install.js";
|
|
5
|
+
/**
|
|
6
|
+
* Registry of marker populators. Add a new entry here when AGENTS.md grows a new auto-maintained
|
|
7
|
+
* block. Names match the marker token (`<!-- AGENTRIG:<name>:start -->`).
|
|
8
|
+
*
|
|
9
|
+
* Populators that have nothing to contribute (e.g. the agent-authored ones) MUST NOT be listed
|
|
10
|
+
* here; only deterministic, source-of-truth-derived sections belong. Anything not in this map is
|
|
11
|
+
* left untouched.
|
|
12
|
+
*/
|
|
13
|
+
const POPULATORS = {
|
|
14
|
+
"skills-inventory": (repoRoot) => skillsInventory(loadManifest(), repoRoot),
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Rewrite every populated AGENTRIG marker block in `text` from its registered populator. Returns
|
|
18
|
+
* the new text and a structured report. Markers without a populator are left alone — the AGENTS.md
|
|
19
|
+
* template ships many marker pairs that are intentionally agent-edited (context, dirmap, etc.).
|
|
20
|
+
*
|
|
21
|
+
* Marker blocks may legally nest (e.g. `skills-inventory` sits inside `harness`), so we MUST
|
|
22
|
+
* process them per-name with a regex that pairs `start`/`end` by the same name — a single global
|
|
23
|
+
* regex would let the outer block swallow the inner one.
|
|
24
|
+
*/
|
|
25
|
+
export function rewriteMarkers(repoRoot, text) {
|
|
26
|
+
const report = { updated: [], skipped: [], unchanged: [] };
|
|
27
|
+
const seen = new Set();
|
|
28
|
+
let working = text;
|
|
29
|
+
// First pass: rewrite every block we have a populator for. The per-name regex makes nesting safe.
|
|
30
|
+
for (const [name, populator] of Object.entries(POPULATORS)) {
|
|
31
|
+
const pair = new RegExp(`(<!--\\s*AGENTRIG:${escapeRegex(name)}:start\\s*-->)([\\s\\S]*?)(<!--\\s*AGENTRIG:${escapeRegex(name)}:end\\s*-->)`, "g");
|
|
32
|
+
let matched = false;
|
|
33
|
+
working = working.replace(pair, (_match, start, body, end) => {
|
|
34
|
+
matched = true;
|
|
35
|
+
const next = populator(repoRoot);
|
|
36
|
+
if (next == null)
|
|
37
|
+
return `${start}${body}${end}`;
|
|
38
|
+
// Sandwich the body with single newlines so the marker pair always reads as a block.
|
|
39
|
+
return `${start}\n${next}\n${end}`;
|
|
40
|
+
});
|
|
41
|
+
if (matched) {
|
|
42
|
+
seen.add(name);
|
|
43
|
+
const populated = populator(repoRoot);
|
|
44
|
+
if (populated == null)
|
|
45
|
+
report.unchanged.push(name);
|
|
46
|
+
else
|
|
47
|
+
report.updated.push(name);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Second pass: enumerate every marker name in the file so we can report the ones with no
|
|
51
|
+
// populator registered (callers may want to log or block on unknown markers later).
|
|
52
|
+
const allNames = new Set();
|
|
53
|
+
for (const m of text.matchAll(/<!--\s*AGENTRIG:([\w-]+):start\s*-->/g)) {
|
|
54
|
+
allNames.add(m[1]);
|
|
55
|
+
}
|
|
56
|
+
for (const name of allNames)
|
|
57
|
+
if (!seen.has(name))
|
|
58
|
+
report.skipped.push(name);
|
|
59
|
+
// The "updated" report is only meaningful when content actually changed.
|
|
60
|
+
if (working === text)
|
|
61
|
+
report.updated.length = 0;
|
|
62
|
+
return { text: working, report };
|
|
63
|
+
}
|
|
64
|
+
function escapeRegex(s) {
|
|
65
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Rewrite AGENTS.md in place using the registered populators. No-op when AGENTS.md doesn't exist
|
|
69
|
+
* or when nothing changed (file is not touched, so `git status` stays clean on idempotent calls).
|
|
70
|
+
*/
|
|
71
|
+
export function populateAgentsMarkers(repoRoot) {
|
|
72
|
+
const path = join(repoRoot, "AGENTS.md");
|
|
73
|
+
if (!existsSync(path))
|
|
74
|
+
return { updated: [], skipped: [], unchanged: [] };
|
|
75
|
+
const original = readFileSync(path, "utf8");
|
|
76
|
+
const { text, report } = rewriteMarkers(repoRoot, original);
|
|
77
|
+
if (text !== original)
|
|
78
|
+
writeFileSync(path, text);
|
|
79
|
+
return report;
|
|
80
|
+
}
|
|
81
|
+
/** Names of marker blocks that have a registered deterministic populator. */
|
|
82
|
+
export function populatedMarkerNames() {
|
|
83
|
+
return Object.keys(POPULATORS).sort();
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=markers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markers.js","sourceRoot":"","sources":["../../src/core/markers.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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"}
|
package/dist/prompts/index.js
CHANGED
|
@@ -1,85 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { substitute } from "../core/fsutil.js";
|
|
2
|
+
import { loadTemplate } from "./loader.js";
|
|
3
|
+
// All prompt copy lives in `./templates/*.md` (read at runtime via loadTemplate). The functions
|
|
4
|
+
// here only assemble dynamic data into those templates via `{{PLACEHOLDER}}` substitution and own
|
|
5
|
+
// any conditional logic — so prompt wording can be edited as plain markdown without touching TS.
|
|
6
|
+
export const SYSTEM_MESSAGE = loadTemplate("system-message.md");
|
|
6
7
|
export function buildInvestigatePrompt() {
|
|
7
|
-
return
|
|
8
|
-
|
|
9
|
-
Investigate the repository in your current working directory and write your findings to
|
|
10
|
-
\`.agentrig/context.md\` (create the file; create the .agentrig directory if needed).
|
|
11
|
-
|
|
12
|
-
Cover, with evidence from actual files:
|
|
13
|
-
1. **Purpose** — what this project is and who uses it (2-4 sentences).
|
|
14
|
-
2. **Stack** — languages, frameworks, runtimes, package manager(s).
|
|
15
|
-
3. **Commands** — the real install / build / test / lint commands (cite where you found them:
|
|
16
|
-
package.json scripts, Makefile, CI workflow, pyproject, go.mod, etc.). If a command does not
|
|
17
|
-
exist, say so explicitly rather than guessing.
|
|
18
|
-
4. **Layout** — a concise directory map of the most important folders and what they contain.
|
|
19
|
-
5. **Conventions** — notable coding conventions, testing patterns, and any "instructions are the
|
|
20
|
-
source of truth" docs (AGENTS.md, CONTRIBUTING, etc.).
|
|
21
|
-
6. **Risks for an autonomous agent** — protected areas, generated code, flaky tests, anything an
|
|
22
|
-
agent should be careful about.
|
|
23
|
-
|
|
24
|
-
Be thorough but factual. Do not modify any other files in this step. When done, reply with a short
|
|
25
|
-
confirmation and the exact install/build/test/lint commands you found.`;
|
|
8
|
+
return loadTemplate("investigate.md");
|
|
26
9
|
}
|
|
27
10
|
export function buildTailorPrompt(manifest) {
|
|
28
|
-
const artifactList = manifest.artifacts
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
${artifactList}
|
|
34
|
-
|
|
35
|
-
Using everything you learned in Task 1 (and \`.agentrig/context.md\`), make the harness
|
|
36
|
-
repo-specific. Edit **only** the files listed below.
|
|
37
|
-
|
|
38
|
-
1. **\`AGENTS.md\`** — replace every \`{{PLACEHOLDER}}\` and fill the content between the
|
|
39
|
-
\`<!-- AGENTRIG:...:start -->\` / \`:end\` markers:
|
|
40
|
-
- \`{{REPO_NAME}}\`, \`{{REPO_SUMMARY}}\` — name and a 2-3 sentence description.
|
|
41
|
-
- The \`commands\` block — the REAL install/build/test/lint commands you verified. If one
|
|
42
|
-
genuinely does not exist, write \`(none)\`.
|
|
43
|
-
- The \`dirmap\` block — a concise directory map.
|
|
44
|
-
Do NOT change anything between the \`critical-rules\` markers.
|
|
45
|
-
2. **\`.agents/rules/coding-standards.md\`** — replace the generic baseline with standards that
|
|
46
|
-
actually match this repo's language and conventions. Keep it to a short list of imperative
|
|
47
|
-
reflexes and keep the frontmatter \`globs\`/\`description\`.
|
|
48
|
-
3. **\`.agentrig/eval/scenarios/\`** — adjust the existing scenario files so the setup/success
|
|
49
|
-
criteria reference this repo's real test/build commands and structure. Do not remove the axis
|
|
50
|
-
lists.
|
|
51
|
-
4. **\`.github/workflows/copilot-setup-steps.yml\`** — author a REAL, repo-specific setup workflow so
|
|
52
|
-
the GitHub Copilot **cloud/coding agent** has a ready environment (don't leave a generic stub).
|
|
53
|
-
Base it on your investigation:
|
|
54
|
-
- A single job named EXACTLY \`copilot-setup-steps\` on \`runs-on: ubuntu-latest\`, with
|
|
55
|
-
\`permissions: contents: read\`, triggered by \`workflow_dispatch\` + \`push\`/\`pull_request\`
|
|
56
|
-
filtered to this file.
|
|
57
|
-
- Steps that install the ACTUAL toolchain + dependencies you found: correct language runtime(s)
|
|
58
|
-
and version(s) (from \`.nvmrc\`/\`.tool-versions\`/\`engines\`/\`go.mod\`/\`pyproject.toml\`), the
|
|
59
|
-
correct package manager and install command (e.g. \`npm ci\`/\`pnpm i --frozen-lockfile\`/
|
|
60
|
-
\`pip install -e .\`/\`go mod download\`), dependency caching, and any system packages or
|
|
61
|
-
\`services\` (databases, etc.) the build/tests need. Keep it to env setup — not the task itself.
|
|
62
|
-
If you cannot determine the stack confidently, leave the generated scaffold and note what's
|
|
63
|
-
missing.
|
|
64
|
-
|
|
65
|
-
Keep all YAML frontmatter and the AgentRig markers intact. Do not touch the state machine, role
|
|
66
|
-
files, MCP config, or the eval scripts. When finished, summarize exactly which files you changed.`;
|
|
11
|
+
const artifactList = manifest.artifacts
|
|
12
|
+
.map((a) => `- \`${a.dest}\` (principle ${a.principle})`)
|
|
13
|
+
.join("\n");
|
|
14
|
+
return substitute(loadTemplate("tailor.md"), { ARTIFACT_LIST: artifactList });
|
|
67
15
|
}
|
|
68
16
|
export function buildUpdatePrompt(changed) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
AgentRig refreshed these canonical artifacts to their latest version:
|
|
72
|
-
${changed.map((c) => `- \`${c}\``).join("\n")}
|
|
73
|
-
|
|
74
|
-
For each refreshed file, reconcile it with this repo:
|
|
75
|
-
- Preserve repo-specific content the team added (especially inside AgentRig markers in AGENTS.md and
|
|
76
|
-
in \`coding-standards.md\` and the scenarios).
|
|
77
|
-
- Adopt new structure, new sections, and new defaults from the canonical version.
|
|
78
|
-
- If there is a genuine conflict, prefer the new canonical structure but keep repo-specific facts
|
|
79
|
-
(commands, directory map, summary).
|
|
80
|
-
|
|
81
|
-
Re-read \`.agentrig/context.md\` first for repo context. Summarize what you merged and any conflicts
|
|
82
|
-
you resolved.`;
|
|
17
|
+
const changedList = changed.map((c) => `- \`${c}\``).join("\n");
|
|
18
|
+
return substitute(loadTemplate("update.md"), { CHANGED_LIST: changedList });
|
|
83
19
|
}
|
|
84
20
|
/**
|
|
85
21
|
* @deprecated Replaced by buildProducerPrompt + buildJudgePrompt in the P3 producer/judge
|
|
@@ -88,51 +24,33 @@ you resolved.`;
|
|
|
88
24
|
export function buildDynamicEvalPrompt(scenarioId, run) {
|
|
89
25
|
const scope = scenarioId
|
|
90
26
|
? `the single scenario \`.agentrig/eval/scenarios/${scenarioId}/\``
|
|
91
|
-
: "each scenario in
|
|
92
|
-
return
|
|
27
|
+
: "each scenario in `.agentrig/eval/scenarios/*/`";
|
|
28
|
+
return (substitute(loadTemplate("dynamic-eval.md"), {
|
|
29
|
+
SCOPE: scope,
|
|
30
|
+
RUN_ID: run?.runId ?? "n/a",
|
|
31
|
+
}) + "\n");
|
|
93
32
|
}
|
|
94
33
|
/** Producer prompt — handed to the agent running in the scenario worktree.
|
|
95
34
|
* Inlines the scenario's own prompt.md so the producer doesn't need to find it. */
|
|
96
35
|
export function buildProducerPrompt(scenarioPrompt, variant) {
|
|
97
36
|
const isBaseline = variant === "baseline";
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
//
|
|
102
|
-
//
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
- [ ] **Baseline captured.** Did you run the project's test command BEFORE editing related code,
|
|
117
|
-
and surface the result in your transcript? For a fix scenario: explicitly note the failing
|
|
118
|
-
test name and the error. For a feature scenario: note the suite was green.
|
|
119
|
-
*Bad:* "All tests pass."
|
|
120
|
-
*Good:* "baseline: \`npm test\` → 1 fail (divide-by-zero); after fix: 0 fails, all 4 tests pass."
|
|
121
|
-
|
|
122
|
-
- [ ] **After captured.** Did you re-run the full test command at the end and surface the new
|
|
123
|
-
state? The transition baseline → after is the evidence that your edit did what you claim.
|
|
124
|
-
|
|
125
|
-
- [ ] **Wiki entry committed for any non-obvious lesson.** If your work revealed something
|
|
126
|
-
surprising (silent failure, library default, framework quirk, AGENTS.md rule that almost
|
|
127
|
-
bit you), use the \`log-gotcha\` skill to write a \`.agents/wiki/<topic>.md\` entry IN THE
|
|
128
|
-
SAME DIFF. Acknowledging the lesson only in your summary is half-credit. Silent is zero.
|
|
129
|
-
Run \`git diff --cached --stat\` to confirm the wiki file is staged.
|
|
130
|
-
|
|
131
|
-
- [ ] **Diff is on-target.** \`git diff --stat\` should show only files you intentionally changed.
|
|
132
|
-
|
|
133
|
-
If you can't honestly check a box, fix it before replying — that's cheaper than a re-roll.
|
|
134
|
-
`;
|
|
135
|
-
return `# Scenario task\n${baselineNote}\nYour entire job is described below. Work inside the current directory (this is a\nthrowaway worktree dedicated to your trial). When done, simply finish — the\nscenario runner captures your diff, your transcript, and runs the deterministic\noracle automatically.\n\n---\n\n${scenarioPrompt}${handoffChecklist}\n`;
|
|
37
|
+
// baseline vs harness only differ by the variant note and the (harness-only) pre-handoff
|
|
38
|
+
// checklist. The checklist is the same one the self-verify and log-gotcha skills describe, but
|
|
39
|
+
// inlined at the END of the prompt (LLMs weight end-of-prompt instructions more heavily than
|
|
40
|
+
// buried skill bodies). The baseline variant deliberately omits it — that's what makes the
|
|
41
|
+
// harness-on vs baseline A/B measure something real.
|
|
42
|
+
const note = isBaseline
|
|
43
|
+
? loadTemplate("producer-baseline-note.md")
|
|
44
|
+
: loadTemplate("producer-harness-note.md");
|
|
45
|
+
const variantNote = `\n${note}\n`;
|
|
46
|
+
const handoffChecklist = isBaseline
|
|
47
|
+
? ""
|
|
48
|
+
: `\n\n---\n\n${loadTemplate("producer-handoff-checklist.md")}\n`;
|
|
49
|
+
return (substitute(loadTemplate("producer.md"), {
|
|
50
|
+
VARIANT_NOTE: variantNote,
|
|
51
|
+
SCENARIO_PROMPT: scenarioPrompt,
|
|
52
|
+
HANDOFF_CHECKLIST: handoffChecklist,
|
|
53
|
+
}) + "\n");
|
|
136
54
|
}
|
|
137
55
|
/** Judge prompt — handed to a DIFFERENT model than the producer. The judge runs in a
|
|
138
56
|
* dedicated cwd containing prompt.md, diff.patch, transcript.md, oracle.json, judge_brief.md.
|
|
@@ -141,68 +59,29 @@ export function buildJudgePrompt(ctx) {
|
|
|
141
59
|
const axesList = ctx.judgeAxes.length
|
|
142
60
|
? ctx.judgeAxes.map((a) => `- \`${a}\``).join("\n")
|
|
143
61
|
: "(no soft axes for this scenario — write an empty axes array)";
|
|
144
|
-
return
|
|
62
|
+
return (substitute(loadTemplate("judge.md"), {
|
|
63
|
+
SCENARIO: ctx.scenario,
|
|
64
|
+
TYPE: ctx.type,
|
|
65
|
+
RUBRIC_PATH: ctx.rubricPath,
|
|
66
|
+
AXES_LIST: axesList,
|
|
67
|
+
OUTPUT_JSON_PATH: ctx.outputJsonPath,
|
|
68
|
+
}) + "\n");
|
|
145
69
|
}
|
|
146
70
|
/** Scaffold-scenarios prompt — handed to an agent during `agentrig eval --scaffold`. The agent
|
|
147
71
|
* reads the repo investigation + the 3 generic scenarios as templates, then writes N new
|
|
148
72
|
* repo-tailored scenarios under .agentrig/eval/scenarios/. */
|
|
149
73
|
export function buildScaffoldScenariosPrompt(ctx) {
|
|
150
|
-
const examplesText = ctx.examples
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
\`\`\`
|
|
163
|
-
|
|
164
|
-
## What a scenario looks like (templates)
|
|
165
|
-
|
|
166
|
-
${examplesText}
|
|
167
|
-
|
|
168
|
-
## What to produce
|
|
169
|
-
|
|
170
|
-
For each new scenario:
|
|
171
|
-
|
|
172
|
-
1. Create a directory \`.agentrig/eval/scenarios/<id>/\` with an id that names a concrete
|
|
173
|
-
task in THIS repo's stack (e.g. \`fix-pytest-failure\`, \`refactor-typescript-module\`,
|
|
174
|
-
\`review-django-migration\`, \`add-cargo-feature\`). NO generic ids — \`fix-failing-test\` is taken.
|
|
175
|
-
2. Write \`scenario.yml\` with YAML frontmatter:
|
|
176
|
-
- \`id\`: matches the directory name
|
|
177
|
-
- \`type\`: one of \`run\` | \`spec\` | \`review\`
|
|
178
|
-
- \`scope\`: \`patch\` | \`feature\` | \`epic\`
|
|
179
|
-
- \`principle_focus\`: array of 1-3 principle numbers (1-12)
|
|
180
|
-
- \`oracle_axes\`: array of axis names (deterministic-scored)
|
|
181
|
-
- \`judge_axes\`: array of axis names (LLM-scored)
|
|
182
|
-
3. Write \`prompt.md\` — the exact task handed to the producer agent. NO ambiguity, NO "invent your own spec."
|
|
183
|
-
4. Build \`fixture/\` — a tiny synthetic mini-repo using THIS repo's actual stack:
|
|
184
|
-
- Use the **real** package manager (\`requirements.txt\` / \`go.mod\` / \`package.json\` / \`Cargo.toml\`)
|
|
185
|
-
- Use the **real** test runner (\`pytest\` / \`go test\` / \`vitest\` / \`cargo test\`)
|
|
186
|
-
- Keep it ≤10 files total; one file should be the planted defect / spec / patch under review
|
|
187
|
-
5. Write \`oracle.yml\` — deterministic checks (cmd, diff_stats, diff_files, file_contains, file_missing).
|
|
188
|
-
The \`cmd\` checks MUST use this repo's actual test command, not \`npm test\`.
|
|
189
|
-
6. Write \`README.md\` — 1-2 paragraphs describing what the scenario tests + what a defect looks like.
|
|
190
|
-
7. Write \`judge_brief.md\` (optional but recommended) — calibration hints for soft axes the
|
|
191
|
-
judge will score (e.g. "1.0 = wrote a wiki entry, 0.5 = mentioned in summary, 0 = silent").
|
|
192
|
-
|
|
193
|
-
## Hard constraints
|
|
194
|
-
|
|
195
|
-
- **DO NOT modify the existing generic scenarios** (\`fix-failing-test\`, \`add-small-feature\`,
|
|
196
|
-
\`review-catches-bug\`, \`agentrig-init-on-empty-repo\`). They stay as both templates AND running scenarios.
|
|
197
|
-
- **DO NOT touch any file outside \`.agentrig/eval/scenarios/\`.**
|
|
198
|
-
- **Axis names must come from the live registry.** Valid types: ${ctx.axesAvailable.types.join(", ")}.
|
|
199
|
-
Valid axis names (use only these): ${ctx.axesAvailable.axisNames.join(", ")}.
|
|
200
|
-
- The fixture's package manager + test runner must be **the same toolchain this repo uses**.
|
|
201
|
-
Check \`AGENTS.md\` for the install/test commands.
|
|
202
|
-
- Each oracle \`cmd\` must be runnable from inside the worktree (\`cwd: worktree, shell: true\`) without
|
|
203
|
-
any \`npm install\` / \`pip install\` / equivalent first — i.e., the fixture should be self-contained
|
|
204
|
-
or rely on stdlib only. If the test command needs deps, include a tiny dependency-free alternative.
|
|
205
|
-
|
|
206
|
-
When done, summarize each new scenario id, its type, and what defect or task it exercises.`;
|
|
74
|
+
const examplesText = ctx.examples
|
|
75
|
+
.map((e) => `### Example: \`${e.id}\`\n\n**scenario.yml**\n\`\`\`yaml\n${e.scenarioYml.trim()}\n\`\`\`\n\n**prompt.md** (first 800 chars)\n\`\`\`markdown\n${e.promptMd.slice(0, 800)}\n\`\`\`\n\n**oracle.yml**\n\`\`\`yaml\n${e.oracleYml.trim()}\n\`\`\``)
|
|
76
|
+
.join("\n\n");
|
|
77
|
+
const contextMd = ctx.contextMd.trim() ||
|
|
78
|
+
"(no context.md found — investigate the repo yourself before writing scenarios)";
|
|
79
|
+
return substitute(loadTemplate("scaffold-scenarios.md"), {
|
|
80
|
+
COUNT: String(ctx.count),
|
|
81
|
+
CONTEXT_MD: contextMd,
|
|
82
|
+
EXAMPLES_TEXT: examplesText,
|
|
83
|
+
AXIS_TYPES: ctx.axesAvailable.types.join(", "),
|
|
84
|
+
AXIS_NAMES: ctx.axesAvailable.axisNames.join(", "),
|
|
85
|
+
});
|
|
207
86
|
}
|
|
208
87
|
//# sourceMappingURL=index.js.map
|