@doidor/agentrig 0.10.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/core/fix.ts"],"names":[],"mappings":"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"}
@@ -39,17 +39,63 @@ export function baseVars(repoRoot) {
39
39
  REPO_NAME: basename(repoRoot),
40
40
  };
41
41
  }
42
- /** Build the skills-inventory markdown block from the manifest (deterministic, no agent). */
43
- export function skillsInventory(manifest) {
44
- const lines = [];
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
- lines.push(`- \`${m[1]}\`${desc ? ` — ${desc}` : ""}`);
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/core/install.ts"],"names":[],"mappings":"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"}
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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"}
@@ -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
@@ -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;AAmBpD,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"}
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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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "agentrig-manifest/1",
3
- "knowledgeVersion": "0.5.0",
3
+ "knowledgeVersion": "0.6.0",
4
4
  "description": "Declares which best-practice artifacts AgentRig installs into a target repo and where. `src` is relative to the knowledge/ root; `dest` is relative to the target repo root. `kind`: file | dir | template. Templates contain {{PLACEHOLDERS}} the agent fills from its investigation; deterministic installs substitute known values and leave the rest for the agent.",
5
5
  "artifacts": [
6
6
  {
@@ -44,7 +44,7 @@ See `.agentrig/context.md` for the full, agent-authored investigation of this re
44
44
  - **Agent roles & models:** `.agentrig/agents/` (triager, developer, reviewer, judge — each on a
45
45
  varied model; reviewer differs from developer on purpose). See `.agentrig/agents/README.md` to add
46
46
  new agent types.
47
- - **Skills (procedural memory):** `.agents/skills/`
47
+ - **Skills (procedural memory):** `.agents/skills/` (the block below is auto-populated on `agentrig compile` / `update` by walking this directory — both AgentRig-bundled and user-added skills appear)
48
48
  <!-- AGENTRIG:skills-inventory:start -->
49
49
  {{SKILLS_INVENTORY}}
50
50
  <!-- AGENTRIG:skills-inventory:end -->
@@ -350,10 +350,11 @@
350
350
  {
351
351
  "id": "agents-skills-inventory",
352
352
  "principle": 12,
353
- "title": "AGENTS.md lists the installed skills",
354
- "type": "file-contains",
353
+ "title": "AGENTS.md skills-inventory block is POPULATED (not just present) with every installed skill",
354
+ "type": "marker-populated",
355
355
  "path": "AGENTS.md",
356
- "patterns": ["AGENTRIG:skills-inventory"],
356
+ "marker": "skills-inventory",
357
+ "enumerateDir": ".agents/skills",
357
358
  "layer": "completeness",
358
359
  "weight": 1
359
360
  },
@@ -177,6 +177,30 @@ function scoreCheck(c) {
177
177
  if (src && dst && !hasPath(adj, src, dst)) problems.push(`no path ${src}→${dst}`);
178
178
  return problems.length === 0 ? { score: 1, evidence: "" } : { score: 0.5, evidence: problems.join("; ") };
179
179
  }
180
+ case "marker-populated": {
181
+ // Mirror of src/core/audit.ts: assert AGENTRIG:<name> block in `path` is populated.
182
+ const p = c.path, name = c.marker || "";
183
+ const text = read(p);
184
+ if (text == null) return { score: 0, evidence: `missing ${p}` };
185
+ const esc = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
186
+ const pair = new RegExp(`<!--\\s*AGENTRIG:${esc}:start\\s*-->([\\s\\S]*?)<!--\\s*AGENTRIG:${esc}:end\\s*-->`);
187
+ const m = text.match(pair);
188
+ if (!m) return { score: 0, evidence: `marker pair AGENTRIG:${name} missing from ${p}` };
189
+ const body = m[1].trim();
190
+ if (!body || /\{\{[A-Z_]+\}\}/.test(body)) {
191
+ return { score: 0, evidence: `AGENTRIG:${name} block is empty or has unfilled placeholders` };
192
+ }
193
+ const enumerateDir = c.enumerateDir;
194
+ if (enumerateDir) {
195
+ const abs = rel(enumerateDir);
196
+ if (!existsSync(abs) || !statSync(abs).isDirectory()) return { score: 1, evidence: "" };
197
+ const required = readdirSync(abs).filter((e) => !e.startsWith(".") && !e.startsWith("_"));
198
+ const missing = required.filter((entry) => !body.includes(entry));
199
+ if (missing.length === 0) return { score: 1, evidence: "" };
200
+ return { score: 0.5, evidence: `block missing entries from ${enumerateDir}: ${missing.join(", ")}` };
201
+ }
202
+ return { score: 1, evidence: "" };
203
+ }
180
204
  case "quality-probe": {
181
205
  const probe = c.probe, p = c.path;
182
206
  if (probe === "no-unfilled-placeholders") {
@@ -217,7 +241,7 @@ function scoreCheck(c) {
217
241
  let j;
218
242
  try { j = JSON.parse(text); } catch (e) { return { score: 0, evidence: `${p} not valid JSON: ${e.message}` }; }
219
243
  const checks = j.checks || [];
220
- const known = new Set(["path-exists","file-contains","dir-min","frontmatter-keys","frontmatter-keys-all","roles-distinct-models","roles-distinct-families","state-machine-dag","quality-probe"]);
244
+ const known = new Set(["path-exists","file-contains","dir-min","frontmatter-keys","frontmatter-keys-all","roles-distinct-models","roles-distinct-families","state-machine-dag","quality-probe","marker-populated"]);
221
245
  const ids = checks.map((x) => x.id);
222
246
  const dupIds = ids.filter((id, i) => id && ids.indexOf(id) !== i);
223
247
  const badTypes = checks.filter((x) => !known.has(x.type));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doidor/agentrig",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "AgentRig — an agentic meta-harness. A CLI that investigates a repository and installs (and evaluates) a best-practice agent harness.",
5
5
  "type": "module",
6
6
  "bin": {