vigiles 15.4.1 → 16.0.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.
@@ -51,8 +51,31 @@ export interface ClaudeCodeToolVocabulary extends ToolVocabulary {
51
51
  export declare function agent<const P extends AuthoredPurity | undefined = undefined>(spec: AgentSpecInput<P, ClaudeCodeToolVocabulary>): AgentSpec;
52
52
  /**
53
53
  * Define a Claude Code skill with the purity floor enforced AT COMPILE TIME
54
- * against the Claude Code tool catalog. Identical to the core `skill()` at
55
- * runtime; the typed `tools` constraint is the only difference.
54
+ * against the Claude Code tool catalog. Identical to the core
55
+ * `experimental_skill()` at runtime; the typed `tools` constraint is the only
56
+ * difference.
57
+ *
58
+ * Carries the same `.input` / `.step` helpers as the core builder, and it must:
59
+ * those two stopped being standalone exports when the helper vocabulary moved
60
+ * onto the skill builder, so an author who picked this door would otherwise have
61
+ * no way to reach them. Before the move they came from `vigiles/spec` — a second
62
+ * import for one skill, which is the asymmetry this closes rather than a cost it
63
+ * introduces.
64
+ *
65
+ * @experimental
66
+ */
67
+ declare function skillSpec<const P extends AuthoredPurity | undefined = undefined>(spec: SkillSpecInput<P, ClaudeCodeToolVocabulary>): SkillSpec;
68
+ /**
69
+ * @experimental
56
70
  */
57
- export declare function experimental_skill<const P extends AuthoredPurity | undefined = undefined>(spec: SkillSpecInput<P, ClaudeCodeToolVocabulary>): SkillSpec;
71
+ export declare const experimental_skill: typeof skillSpec & {
72
+ input: (name: string, hint: string, opts?: {
73
+ required?: boolean;
74
+ }) => import("../../core/spec.js").SkillInput;
75
+ step: (instr: string | import("../../core/spec.js").InstructionFragment[], opts?: {
76
+ gate?: import("../../core/spec.js").Gate;
77
+ retry?: number;
78
+ }) => import("../../core/spec.js").SkillStep;
79
+ };
80
+ export {};
58
81
  //# sourceMappingURL=typed-spec.d.ts.map
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.experimental_skill = void 0;
3
4
  exports.agent = agent;
4
- exports.experimental_skill = experimental_skill;
5
5
  /**
6
6
  * Typed Claude Code authoring surface — the compile-time half of the purity
7
7
  * contract, bound to the Claude Code tool vocabulary.
@@ -46,10 +46,27 @@ function agent(spec) {
46
46
  }
47
47
  /**
48
48
  * Define a Claude Code skill with the purity floor enforced AT COMPILE TIME
49
- * against the Claude Code tool catalog. Identical to the core `skill()` at
50
- * runtime; the typed `tools` constraint is the only difference.
49
+ * against the Claude Code tool catalog. Identical to the core
50
+ * `experimental_skill()` at runtime; the typed `tools` constraint is the only
51
+ * difference.
52
+ *
53
+ * Carries the same `.input` / `.step` helpers as the core builder, and it must:
54
+ * those two stopped being standalone exports when the helper vocabulary moved
55
+ * onto the skill builder, so an author who picked this door would otherwise have
56
+ * no way to reach them. Before the move they came from `vigiles/spec` — a second
57
+ * import for one skill, which is the asymmetry this closes rather than a cost it
58
+ * introduces.
59
+ *
60
+ * @experimental
51
61
  */
52
- function experimental_skill(spec) {
62
+ function skillSpec(spec) {
53
63
  return (0, spec_js_1.experimental_skill)(spec);
54
64
  }
65
+ /**
66
+ * @experimental
67
+ */
68
+ exports.experimental_skill = Object.assign(skillSpec, {
69
+ input: spec_js_1.experimental_skill.input,
70
+ step: spec_js_1.experimental_skill.step,
71
+ });
55
72
  //# sourceMappingURL=typed-spec.js.map
@@ -399,12 +399,21 @@ export interface SkillStep {
399
399
  /** Max attempts to satisfy the gate before the step fails (default 1). */
400
400
  readonly retry?: number;
401
401
  }
402
- /** Declare a skill input (compiles to argument-hint + an Arguments entry). */
403
- export declare function input(name: string, hint: string, opts?: {
402
+ /**
403
+ * Declare a skill input (compiles to argument-hint + an Arguments entry).
404
+ *
405
+ * Deliberately NOT a standalone export — reached as `experimental_skill.input`.
406
+ * The reason is on `experimental_skill` below.
407
+ */
408
+ declare function input(name: string, hint: string, opts?: {
404
409
  required?: boolean;
405
410
  }): SkillInput;
406
- /** Declare a gated pipeline step. */
407
- export declare function step(instr: string | InstructionFragment[], opts?: {
411
+ /**
412
+ * Declare a gated pipeline step.
413
+ *
414
+ * Deliberately NOT a standalone export — reached as `experimental_skill.step`.
415
+ */
416
+ declare function step(instr: string | InstructionFragment[], opts?: {
408
417
  gate?: Gate;
409
418
  retry?: number;
410
419
  }): SkillStep;
@@ -504,9 +513,32 @@ export type SkillSpecInput<P extends AuthoredPurity | undefined, V extends ToolV
504
513
  * DIFFERENT function — a `Check<Trace>` taking an id string, asking whether a
505
514
  * skill fired. This one authors a skill; that one observes one.
506
515
  *
516
+ * Its helper vocabulary hangs off it — `experimental_skill.input(…)` and
517
+ * `experimental_skill.step(…)` — rather than being exported beside it. Both are
518
+ * used ONLY by skill specs (measured: zero uses in agent/claude specs, against
519
+ * `cmd`/`file`/`ref`/`result`, which are shared and therefore stay top-level).
520
+ * Hanging them here makes the experimental marking STRUCTURAL for the whole
521
+ * family: you cannot reach `input()` without naming `experimental_skill` first.
522
+ * The prefix convention alone could not do that — it is a habit, and it had
523
+ * already leaked once when `skill()` shipped stable-named against its own docs.
524
+ *
525
+ * Honest limit: `const { input } = experimental_skill` strips the marker again
526
+ * inside one file. What the shape actually guarantees is narrower and still
527
+ * worth having — an unmarked name never crosses the package boundary.
528
+ *
529
+ * `Object.assign` rather than `export namespace`: the latter is banned by this
530
+ * repo's own lint (`no-namespace: error`, inherited from strict-type-checked).
531
+ *
532
+ * @experimental
533
+ */
534
+ declare function skillSpec<const P extends AuthoredPurity | undefined = undefined, V extends ToolVocabulary = OpenToolVocabulary>(spec: SkillSpecInput<P, V>): SkillSpec;
535
+ /**
507
536
  * @experimental
508
537
  */
509
- export declare function experimental_skill<const P extends AuthoredPurity | undefined = undefined, V extends ToolVocabulary = OpenToolVocabulary>(spec: SkillSpecInput<P, V>): SkillSpec;
538
+ export declare const experimental_skill: typeof skillSpec & {
539
+ input: typeof input;
540
+ step: typeof step;
541
+ };
510
542
  /**
511
543
  * A subagent definition (compiles to `agents/<name>.md`). Unlike a skill —
512
544
  * reference material the model reads on activation — a subagent is a *delegated
package/dist/core/spec.js CHANGED
@@ -10,7 +10,7 @@
10
10
  * guidance() — prose only, no mechanical enforcement
11
11
  */
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.BUILTIN_LINTERS = void 0;
13
+ exports.experimental_skill = exports.BUILTIN_LINTERS = void 0;
14
14
  exports.enforce = enforce;
15
15
  exports.guidance = guidance;
16
16
  exports.guard = guard;
@@ -24,9 +24,6 @@ exports.instructions = instructions;
24
24
  exports.experimental_effect = experimental_effect;
25
25
  exports.claude = claude;
26
26
  exports.project = project;
27
- exports.input = input;
28
- exports.step = step;
29
- exports.experimental_skill = experimental_skill;
30
27
  exports.agent = agent;
31
28
  exports.result = result;
32
29
  exports.delegate = delegate;
@@ -222,11 +219,20 @@ function claude(spec) {
222
219
  function project(role) {
223
220
  return { _ref: "role", role };
224
221
  }
225
- /** Declare a skill input (compiles to argument-hint + an Arguments entry). */
222
+ /**
223
+ * Declare a skill input (compiles to argument-hint + an Arguments entry).
224
+ *
225
+ * Deliberately NOT a standalone export — reached as `experimental_skill.input`.
226
+ * The reason is on `experimental_skill` below.
227
+ */
226
228
  function input(name, hint, opts = {}) {
227
229
  return { name, hint, required: opts.required };
228
230
  }
229
- /** Declare a gated pipeline step. */
231
+ /**
232
+ * Declare a gated pipeline step.
233
+ *
234
+ * Deliberately NOT a standalone export — reached as `experimental_skill.step`.
235
+ */
230
236
  function step(instr, opts = {}) {
231
237
  return { do: instr, gate: opts.gate, retry: opts.retry };
232
238
  }
@@ -245,11 +251,31 @@ function step(instr, opts = {}) {
245
251
  * DIFFERENT function — a `Check<Trace>` taking an id string, asking whether a
246
252
  * skill fired. This one authors a skill; that one observes one.
247
253
  *
254
+ * Its helper vocabulary hangs off it — `experimental_skill.input(…)` and
255
+ * `experimental_skill.step(…)` — rather than being exported beside it. Both are
256
+ * used ONLY by skill specs (measured: zero uses in agent/claude specs, against
257
+ * `cmd`/`file`/`ref`/`result`, which are shared and therefore stay top-level).
258
+ * Hanging them here makes the experimental marking STRUCTURAL for the whole
259
+ * family: you cannot reach `input()` without naming `experimental_skill` first.
260
+ * The prefix convention alone could not do that — it is a habit, and it had
261
+ * already leaked once when `skill()` shipped stable-named against its own docs.
262
+ *
263
+ * Honest limit: `const { input } = experimental_skill` strips the marker again
264
+ * inside one file. What the shape actually guarantees is narrower and still
265
+ * worth having — an unmarked name never crosses the package boundary.
266
+ *
267
+ * `Object.assign` rather than `export namespace`: the latter is banned by this
268
+ * repo's own lint (`no-namespace: error`, inherited from strict-type-checked).
269
+ *
248
270
  * @experimental
249
271
  */
250
- function experimental_skill(spec) {
272
+ function skillSpec(spec) {
251
273
  return { _specType: "skill", ...spec };
252
274
  }
275
+ /**
276
+ * @experimental
277
+ */
278
+ exports.experimental_skill = Object.assign(skillSpec, { input, step });
253
279
  /**
254
280
  * Define a subagent specification (compiles to `agents/<name>.md`).
255
281
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vigiles",
3
- "version": "15.4.1",
3
+ "version": "16.0.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",
@@ -89,6 +89,7 @@
89
89
  "test:types": "npm run build && tsc --noEmit -p test/types/tsconfig.json",
90
90
  "api:report": "npm run build && node scripts/api-extractor.mjs --local",
91
91
  "api:check": "npm run build && node scripts/api-extractor.mjs",
92
+ "check": "node scripts/check.mjs",
92
93
  "docs:check": "npm run build && node scripts/check-doc-imports.mjs . docs README.md",
93
94
  "exports:check": "npm run build && node scripts/check-export-prefixes.mjs .",
94
95
  "experimental:check": "npm run api:check && node scripts/check-experimental-naming.mjs",
@@ -98,6 +99,7 @@
98
99
  "@eslint/js": "^10.0.1",
99
100
  "@jackchuka/mdschema": "^0.12.8",
100
101
  "@microsoft/api-extractor": "^7.58.9",
102
+ "@semantic-release/commit-analyzer": "^13.0.1",
101
103
  "@types/js-yaml": "^4.0.9",
102
104
  "@types/markdown-it": "^14.1.2",
103
105
  "@types/minimatch": "^5.1.2",
@@ -105,6 +107,7 @@
105
107
  "@typescript-eslint/eslint-plugin": "^8.58.0",
106
108
  "@typescript-eslint/parser": "^8.58.0",
107
109
  "@vitest/coverage-v8": "^4.1.8",
110
+ "conventional-changelog-conventionalcommits": "^10.3.0",
108
111
  "eslint": "^10.1.0",
109
112
  "eslint-import-resolver-typescript": "^4.4.5",
110
113
  "eslint-plugin-boundaries": "^6.0.2",