vigiles 16.0.1 → 16.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.
- package/dist/core/compile.js +17 -0
- package/dist/core/spec.d.ts +19 -0
- package/package.json +1 -1
package/dist/core/compile.js
CHANGED
|
@@ -654,6 +654,14 @@ function renderSkillFrontmatter(spec, profile = "claude-code") {
|
|
|
654
654
|
// ambiguous scalar, so the restriction was lost on the CC round-trip. (#107)
|
|
655
655
|
fm.push(`allowed-tools: [${spec.tools.join(", ")}]`);
|
|
656
656
|
}
|
|
657
|
+
if (spec.disallowedTools && spec.disallowedTools.length > 0) {
|
|
658
|
+
// 🔴 `disallowed-tools`, HYPHENATED — that is a skill's fence. A subagent's
|
|
659
|
+
// key is `disallowedTools:` (camelCase) and a different reader parses it, so
|
|
660
|
+
// writing the agent spelling here emits a key nothing looks at: inert, and
|
|
661
|
+
// inert in the direction that reads as protection. Same class as the #107
|
|
662
|
+
// defect two lines up, where `tools:` on a skill silently lost the contract.
|
|
663
|
+
fm.push(`disallowed-tools: [${spec.disallowedTools.join(", ")}]`);
|
|
664
|
+
}
|
|
657
665
|
}
|
|
658
666
|
fm.push("", "---");
|
|
659
667
|
return fm.join("\n");
|
|
@@ -779,6 +787,15 @@ function compileSkill(spec, options = {}) {
|
|
|
779
787
|
errors.push({ type: "purity-violation", message: v.message });
|
|
780
788
|
}
|
|
781
789
|
}
|
|
790
|
+
// A fence entry that is a close typo of a real tool blocks NOTHING while reading
|
|
791
|
+
// as protection — the same high-precision check a subagent's `disallowedTools`
|
|
792
|
+
// gets. Skipped without a dialect, like the purity check above, because the tool
|
|
793
|
+
// catalog is what a typo is measured against.
|
|
794
|
+
if (spec.disallowedTools && options.dialect) {
|
|
795
|
+
for (const issue of (0, tool_contract_js_1.disallowedToolIssues)(spec.disallowedTools, options.dialect)) {
|
|
796
|
+
errors.push({ type: "unknown-tool", message: issue.message });
|
|
797
|
+
}
|
|
798
|
+
}
|
|
782
799
|
const sections = renderSkillSections(spec);
|
|
783
800
|
// Over-long inline code blocks are WARNINGS, not errors — they don't block
|
|
784
801
|
// compilation (so adoption always compiles), just nudge toward file().
|
package/dist/core/spec.d.ts
CHANGED
|
@@ -448,6 +448,25 @@ export interface SkillSpec {
|
|
|
448
448
|
* against that floor — compile rejects a tool looser than the declared level.
|
|
449
449
|
*/
|
|
450
450
|
readonly tools?: readonly string[];
|
|
451
|
+
/**
|
|
452
|
+
* Tools this skill may NEVER use — rendered to the `disallowed-tools:`
|
|
453
|
+
* frontmatter key (hyphenated for skills; a subagent's key is `disallowedTools:`,
|
|
454
|
+
* and they are read by different parsers, so the spelling is not interchangeable).
|
|
455
|
+
*
|
|
456
|
+
* 🔴 This is NOT the symmetric twin of `tools` and the asymmetry is the whole
|
|
457
|
+
* reason it exists. `allowed-tools:` on a skill is a PRE-APPROVAL — it waives the
|
|
458
|
+
* permission prompt for what it lists and removes nothing from the pool, so a
|
|
459
|
+
* skill that declares only `Read` can still call `Bash`. `disallowed-tools:` is
|
|
460
|
+
* the only key measured to actually take a tool away. A skill without it inherits
|
|
461
|
+
* every tool the session grants, which is why `audit` reports each such skill as
|
|
462
|
+
* holding all three lethal-trifecta legs — including skills whose `tools` list
|
|
463
|
+
* looks tightly scoped.
|
|
464
|
+
*
|
|
465
|
+
* Entries are checked like a subagent's: a close typo of a real tool name blocks
|
|
466
|
+
* nothing and is reported, because a fence with a misspelled name reads as
|
|
467
|
+
* protection while granting everything.
|
|
468
|
+
*/
|
|
469
|
+
readonly disallowedTools?: readonly string[];
|
|
451
470
|
/**
|
|
452
471
|
* Declare this skill's purity floor — compile rejects a tool contract looser
|
|
453
472
|
* than it. `"pure"` allows only read-only tools; `"bounded"` also allows
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vigiles",
|
|
3
|
-
"version": "16.0
|
|
3
|
+
"version": "16.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",
|