vigiles 29.0.0 → 29.1.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.
@@ -781,7 +781,10 @@ function yamlScalar(value) {
781
781
  // A JSON string IS a YAML double-quoted scalar, escaping included.
782
782
  return JSON.stringify(value);
783
783
  }
784
- function renderSkillFrontmatter(spec, profile = "claude-code") {
784
+ function renderSkillFrontmatter(spec,
785
+ // Downstream of the SkillFrontmatterProfile alias (src/core/dialect.ts).
786
+ // eslint-disable-next-line local/no-harness-names -- goes away with that alias
787
+ profile = "claude-code") {
785
788
  const fm = [
786
789
  "---",
787
790
  `name: ${yamlScalar(spec.name)}`,
@@ -789,6 +792,8 @@ function renderSkillFrontmatter(spec, profile = "claude-code") {
789
792
  ];
790
793
  // The CC-only keys below are inert in a minimal (Codex/OpenCode) SKILL.md, so
791
794
  // they're omitted entirely under that profile.
795
+ // Downstream of the SkillFrontmatterProfile alias (src/core/dialect.ts).
796
+ // eslint-disable-next-line local/no-harness-names -- goes away with that alias
792
797
  if (profile === "claude-code") {
793
798
  if (spec.disableModelInvocation !== undefined) {
794
799
  fm.push(`disable-model-invocation: ${String(spec.disableModelInvocation)}`);
@@ -894,7 +899,10 @@ function compileSkill(spec, options = {}) {
894
899
  spec = (0, skill_normalize_js_1.foldLegacyPostcondition)(spec);
895
900
  const basePath = options.basePath ?? process.cwd();
896
901
  const specFile = options.specFile ?? "SKILL.md.spec.ts";
897
- const profile = options.dialect?.skillFrontmatter ?? "claude-code";
902
+ const profile =
903
+ // Downstream of the SkillFrontmatterProfile alias (src/core/dialect.ts).
904
+ // eslint-disable-next-line local/no-harness-names -- goes away with that alias
905
+ options.dialect?.skillFrontmatter ?? "claude-code";
898
906
  const errors = [];
899
907
  // Verify spec file naming
900
908
  if (!specFile.endsWith(".spec.ts")) {
@@ -285,6 +285,10 @@ exports.VigilesConfigError = VigilesConfigError;
285
285
  exports.REPLACED_KEYS = [
286
286
  {
287
287
  key: "harness",
288
+ // The literal OLD config text this migration notice quotes back at the user:
289
+ // a historical artefact, not a fact about a harness, so there is no port to
290
+ // read it off. This is the one exemption here that is not debt.
291
+ // eslint-disable-next-line local/no-harness-names -- quoted legacy config
288
292
  was: '"harness": ["claude-code", "codex"]',
289
293
  now: "a KEY per harness",
290
294
  },
@@ -298,6 +302,10 @@ exports.REPLACED_KEYS = [
298
302
  function replacedKeyMessage(present) {
299
303
  return (`.vigilesrc.json: ${present.map((k) => `"${k.key}"`).join(" and ")} ` +
300
304
  `${present.length === 1 ? "was" : "were"} replaced by one nested key, "harnesses".\n` +
305
+ // A worked EXAMPLE config in a diagnostic, and real debt: with a third
306
+ // adapter this sample goes stale, so it wants rendering from the adapter
307
+ // registry rather than two names typed out here.
308
+ // eslint-disable-next-line local/no-harness-names -- example config text
301
309
  ` Write: { "harnesses": { "claude-code": { "roots": [".ai"] }, "codex": {} } }\n` +
302
310
  present.map((k) => ` - ${k.was} → ${k.now}`).join("\n") +
303
311
  `\n The old harness ARRAY's order silently decided what got read: one order graded the ` +
@@ -545,6 +545,11 @@ const PREAPPROVAL_NOTE = "`allowed-tools:` does NOT fence a skill — it PRE-APP
545
545
  * omits them under `"minimal"`).
546
546
  */
547
547
  function dialectSupportsSkillFence(dialect) {
548
+ // Downstream of the SkillFrontmatterProfile alias (src/core/dialect.ts). This
549
+ // function is the clearest argument for fixing it there: it already HAS a
550
+ // capability name — "supports skill fence" — and reaches it by comparing an
551
+ // adapter name.
552
+ // eslint-disable-next-line local/no-harness-names -- goes away with that alias
548
553
  return dialect.skillFrontmatter === "claude-code";
549
554
  }
550
555
  /**
@@ -414,6 +414,10 @@ function unclaimedSurfaceFindings(paths, layouts, declared) {
414
414
  ...d,
415
415
  message: `${d.dir}/ holds ${plural(d.kind, d.count)} that no harness vigiles knows about reads, ` +
416
416
  `so none of it is in this grade. Three ways out: keep it where it is and say so in ` +
417
+ // A worked EXAMPLE config in a diagnostic, and real debt: it names a
418
+ // harness the repo being audited may not even target, while `layouts` is
419
+ // already in scope here and knows which one it does.
420
+ // eslint-disable-next-line local/no-harness-names -- example config text
417
421
  `.vigilesrc.json (\`{"harnesses":{"claude-code":{"roots":["${d.root === "" ? "." : d.root}"]}}}\` ` +
418
422
  `— see docs/configuration.md), audit it on its own ` +
419
423
  `(\`vigiles audit ${d.root === "" ? "." : d.root}\`), or move it somewhere a harness ` +
package/dist/scan.js CHANGED
@@ -40,7 +40,18 @@ const node_path_1 = require("node:path");
40
40
  // Claude Code default), and only the generic one takes the `ExcludeSet` that
41
41
  // makes `.vigilesrc.json#exclude` reach surface discovery.
42
42
  const plugin_loader_js_1 = require("./plugin-loader.js");
43
+ // 🔴 A FINDING, NOT A FORMALITY, and one nothing else in the repo could see: this
44
+ // module is listed as a harness-agnostic detector, yet it imports the Claude Code
45
+ // adapter to use as a DEFAULT (`scanPlugin`'s `dialect`/`layout` parameters, and
46
+ // four more sites below). `boundaries/dependencies` does not catch it because it
47
+ // deliberately leaves this file unclassified; the CC-literal rule does not catch
48
+ // it because `\.claude` needs the dot and this path spells `/claude-code/`.
49
+ // Keeping the CC default is the stated backwards-compatibility guarantee, so this
50
+ // is real debt with a known shape — the default belongs to the CALLER (the CLI
51
+ // already resolves an adapter), not to the detector.
52
+ // eslint-disable-next-line local/no-harness-names -- see above
43
53
  const layout_js_1 = require("./adapters/claude-code/layout.js");
54
+ // eslint-disable-next-line local/no-harness-names -- see above
44
55
  const dialect_js_1 = require("./adapters/claude-code/dialect.js");
45
56
  const plugin_loader_js_2 = require("./plugin-loader.js");
46
57
  const score_core_js_1 = require("./score-core.js");
@@ -76,6 +76,11 @@ const assert_never_js_1 = require("./core/assert-never.js");
76
76
  const ts_runner_caps_js_1 = require("./ts-runner-caps.js");
77
77
  const glob_1 = require("glob");
78
78
  const layout_js_1 = require("./core/layout.js");
79
+ // 🔴 Same finding as src/scan.ts: a module listed as a harness-agnostic detector
80
+ // importing the Claude Code adapter for a DEFAULT. Invisible to both existing
81
+ // fences — unclassified for `boundaries/dependencies`, and `\.claude` does not
82
+ // match `/claude-code/`. The default belongs to the caller, not the detector.
83
+ // eslint-disable-next-line local/no-harness-names -- see above
79
84
  const layout_js_2 = require("./adapters/claude-code/layout.js");
80
85
  const coverage_evidence_js_1 = require("./coverage-evidence.js");
81
86
  const coverage_artifact_js_1 = require("./coverage-artifact.js");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vigiles",
3
- "version": "29.0.0",
3
+ "version": "29.1.0",
4
4
  "description": "Audit, test and measure the harness your AI agent runs on — grade your CLAUDE.md / AGENTS.md, skills, subagents and hooks, run them against a scripted model, and measure whether they actually fire.",
5
5
  "keywords": [
6
6
  "claude-code",