@vibe-agent-toolkit/cli 0.1.41-rc.5 → 0.1.41-rc.6

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.
Files changed (76) hide show
  1. package/dist/bin.js +2 -4
  2. package/dist/bin.js.map +1 -1
  3. package/dist/commands/agent/help.d.ts.map +1 -1
  4. package/dist/commands/agent/help.js +2 -4
  5. package/dist/commands/agent/help.js.map +1 -1
  6. package/dist/commands/claude/org/skills.d.ts +13 -0
  7. package/dist/commands/claude/org/skills.d.ts.map +1 -1
  8. package/dist/commands/claude/org/skills.js +57 -30
  9. package/dist/commands/claude/org/skills.js.map +1 -1
  10. package/dist/commands/claude/plugin/build.d.ts +1 -1
  11. package/dist/commands/claude/plugin/build.d.ts.map +1 -1
  12. package/dist/commands/claude/plugin/build.js +239 -82
  13. package/dist/commands/claude/plugin/build.js.map +1 -1
  14. package/dist/commands/claude/plugin/install.d.ts.map +1 -1
  15. package/dist/commands/claude/plugin/install.js +7 -2
  16. package/dist/commands/claude/plugin/install.js.map +1 -1
  17. package/dist/commands/claude/plugin/tree-copy.d.ts +10 -3
  18. package/dist/commands/claude/plugin/tree-copy.d.ts.map +1 -1
  19. package/dist/commands/claude/plugin/tree-copy.js.map +1 -1
  20. package/dist/commands/claude/plugin/uninstall.d.ts.map +1 -1
  21. package/dist/commands/claude/plugin/uninstall.js +10 -2
  22. package/dist/commands/claude/plugin/uninstall.js.map +1 -1
  23. package/dist/commands/rag/help.d.ts.map +1 -1
  24. package/dist/commands/rag/help.js +2 -4
  25. package/dist/commands/rag/help.js.map +1 -1
  26. package/dist/commands/resources/help.d.ts.map +1 -1
  27. package/dist/commands/resources/help.js +2 -4
  28. package/dist/commands/resources/help.js.map +1 -1
  29. package/dist/commands/resources/validate.d.ts +19 -0
  30. package/dist/commands/resources/validate.d.ts.map +1 -1
  31. package/dist/commands/resources/validate.js +51 -0
  32. package/dist/commands/resources/validate.js.map +1 -1
  33. package/dist/commands/skill/test/configure.d.ts.map +1 -1
  34. package/dist/commands/skill/test/configure.js +1 -1
  35. package/dist/commands/skill/test/configure.js.map +1 -1
  36. package/dist/commands/skill/test/run.d.ts +29 -2
  37. package/dist/commands/skill/test/run.d.ts.map +1 -1
  38. package/dist/commands/skill/test/run.js +67 -19
  39. package/dist/commands/skill/test/run.js.map +1 -1
  40. package/dist/commands/skills/build.d.ts.map +1 -1
  41. package/dist/commands/skills/build.js +3 -32
  42. package/dist/commands/skills/build.js.map +1 -1
  43. package/dist/commands/skills/install.d.ts.map +1 -1
  44. package/dist/commands/skills/install.js +79 -25
  45. package/dist/commands/skills/install.js.map +1 -1
  46. package/dist/commands/skills/list.d.ts.map +1 -1
  47. package/dist/commands/skills/list.js +9 -5
  48. package/dist/commands/skills/list.js.map +1 -1
  49. package/dist/commands/skills/skill-discovery.d.ts +7 -0
  50. package/dist/commands/skills/skill-discovery.d.ts.map +1 -1
  51. package/dist/commands/skills/skill-discovery.js +5 -3
  52. package/dist/commands/skills/skill-discovery.js.map +1 -1
  53. package/dist/commands/verify.d.ts.map +1 -1
  54. package/dist/commands/verify.js +7 -2
  55. package/dist/commands/verify.js.map +1 -1
  56. package/dist/skill-resolution/classify.d.ts +7 -2
  57. package/dist/skill-resolution/classify.d.ts.map +1 -1
  58. package/dist/skill-resolution/classify.js +7 -2
  59. package/dist/skill-resolution/classify.js.map +1 -1
  60. package/dist/skill-resolution/resolve-skill-reference.d.ts +10 -8
  61. package/dist/skill-resolution/resolve-skill-reference.d.ts.map +1 -1
  62. package/dist/skill-resolution/resolve-skill-reference.js +62 -23
  63. package/dist/skill-resolution/resolve-skill-reference.js.map +1 -1
  64. package/dist/skill-resolution/types.d.ts +3 -2
  65. package/dist/skill-resolution/types.d.ts.map +1 -1
  66. package/dist/utils/help-loader.d.ts +16 -0
  67. package/dist/utils/help-loader.d.ts.map +1 -1
  68. package/dist/utils/help-loader.js +31 -1
  69. package/dist/utils/help-loader.js.map +1 -1
  70. package/dist/utils/skill-packaging-config.d.ts +15 -6
  71. package/dist/utils/skill-packaging-config.d.ts.map +1 -1
  72. package/dist/utils/skill-packaging-config.js +23 -5
  73. package/dist/utils/skill-packaging-config.js.map +1 -1
  74. package/docs/skill-test.md +47 -3
  75. package/docs/skills.md +26 -4
  76. package/package.json +12 -12
@@ -1 +1 @@
1
- {"version":3,"file":"help-loader.js","sourceRoot":"","sources":["../../src/utils/help-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,mCAAmC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEtD,wCAAwC;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,qHAAqH;QACrH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sCAAsC;QACtC,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO;;0BAEe,QAAQ;;EAEhC,YAAY;;;CAGb,CAAC;IACA,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"help-loader.js","sourceRoot":"","sources":["../../src/utils/help-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,mCAAmC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEtD,wCAAwC;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,qHAAqH;QACrH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sCAAsC;QACtC,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO;;0BAEe,QAAQ;;EAEhC,YAAY;;;CAGb,CAAC;IACA,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC;IACtF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,IAAI,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,4EAA4E;YAC5E,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;QACtE,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,19 +1,28 @@
1
1
  /**
2
2
  * Shared helper for merging skill packaging config from VAT config YAML.
3
3
  *
4
- * Both `vat skills validate` and `vat skill review` need to merge
5
- * `skills.defaults` with per-skill overrides (`skills.config.<name>`) and
6
- * strip undefined values so the result satisfies `exactOptionalPropertyTypes`.
7
- * Centralized here so both call sites agree on semantics and we don't
8
- * duplicate the merge logic.
4
+ * Every lane that reasons about a skill — `vat skills build`, `vat skills validate`,
5
+ * `vat skill review`, `vat audit`, and the Claude plugin build — merges
6
+ * `skills.defaults` with per-skill overrides (`skills.config.<name>`) through THIS
7
+ * function, so no two lanes can disagree about a skill's effective config.
8
+ *
9
+ * Most fields are a shallow override: a per-skill value replaces the default
10
+ * outright. `files:` is the exception — see below.
9
11
  */
10
- import type { SkillPackagingConfig } from '@vibe-agent-toolkit/agent-skills';
12
+ import { type SkillPackagingConfig } from '@vibe-agent-toolkit/agent-skills';
11
13
  /**
12
14
  * Merge defaults with per-skill overrides, dropping undefined values.
13
15
  *
14
16
  * Zod-inferred optional types surface explicit `undefined` which is not
15
17
  * assignable to optional-but-not-undefined properties — this helper strips
16
18
  * those so the returned config is type-clean.
19
+ *
20
+ * `files:` merges ADDITIVELY (defaults ∪ per-skill, per-skill winning on a
21
+ * duplicate dest) rather than being replaced, because a default `files:` entry is
22
+ * a project-wide artifact every skill needs, not a value a skill overrides by
23
+ * declaring one of its own. This was previously implemented only inside
24
+ * `vat skills build`, so the read-only lanes saw a DIFFERENT effective config than
25
+ * the build did — the exact class of divergence this module exists to prevent.
17
26
  */
18
27
  export declare function mergeSkillPackagingConfig(defaults: Record<string, unknown> | undefined, perSkillOverrides: Record<string, unknown> | undefined): SkillPackagingConfig;
19
28
  //# sourceMappingURL=skill-packaging-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-packaging-config.d.ts","sourceRoot":"","sources":["../../src/utils/skill-packaging-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAE7E;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC7C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACrD,oBAAoB,CAStB"}
1
+ {"version":3,"file":"skill-packaging-config.d.ts","sourceRoot":"","sources":["../../src/utils/skill-packaging-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAoB,KAAK,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAE/F;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC7C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACrD,oBAAoB,CAmBtB"}
@@ -1,18 +1,28 @@
1
1
  /**
2
2
  * Shared helper for merging skill packaging config from VAT config YAML.
3
3
  *
4
- * Both `vat skills validate` and `vat skill review` need to merge
5
- * `skills.defaults` with per-skill overrides (`skills.config.<name>`) and
6
- * strip undefined values so the result satisfies `exactOptionalPropertyTypes`.
7
- * Centralized here so both call sites agree on semantics and we don't
8
- * duplicate the merge logic.
4
+ * Every lane that reasons about a skill — `vat skills build`, `vat skills validate`,
5
+ * `vat skill review`, `vat audit`, and the Claude plugin build — merges
6
+ * `skills.defaults` with per-skill overrides (`skills.config.<name>`) through THIS
7
+ * function, so no two lanes can disagree about a skill's effective config.
8
+ *
9
+ * Most fields are a shallow override: a per-skill value replaces the default
10
+ * outright. `files:` is the exception — see below.
9
11
  */
12
+ import { mergeFilesConfig } from '@vibe-agent-toolkit/agent-skills';
10
13
  /**
11
14
  * Merge defaults with per-skill overrides, dropping undefined values.
12
15
  *
13
16
  * Zod-inferred optional types surface explicit `undefined` which is not
14
17
  * assignable to optional-but-not-undefined properties — this helper strips
15
18
  * those so the returned config is type-clean.
19
+ *
20
+ * `files:` merges ADDITIVELY (defaults ∪ per-skill, per-skill winning on a
21
+ * duplicate dest) rather than being replaced, because a default `files:` entry is
22
+ * a project-wide artifact every skill needs, not a value a skill overrides by
23
+ * declaring one of its own. This was previously implemented only inside
24
+ * `vat skills build`, so the read-only lanes saw a DIFFERENT effective config than
25
+ * the build did — the exact class of divergence this module exists to prevent.
16
26
  */
17
27
  export function mergeSkillPackagingConfig(defaults, perSkillOverrides) {
18
28
  const merged = { ...defaults, ...perSkillOverrides };
@@ -22,6 +32,14 @@ export function mergeSkillPackagingConfig(defaults, perSkillOverrides) {
22
32
  packagingConfig[key] = value;
23
33
  }
24
34
  }
35
+ const defaultFiles = defaults?.['files'];
36
+ const perSkillFiles = perSkillOverrides?.['files'];
37
+ if (defaultFiles !== undefined || perSkillFiles !== undefined) {
38
+ const mergedFiles = mergeFilesConfig(defaultFiles, perSkillFiles);
39
+ if (mergedFiles.length > 0) {
40
+ packagingConfig.files = mergedFiles;
41
+ }
42
+ }
25
43
  return packagingConfig;
26
44
  }
27
45
  //# sourceMappingURL=skill-packaging-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-packaging-config.js","sourceRoot":"","sources":["../../src/utils/skill-packaging-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAA6C,EAC7C,iBAAsD;IAEtD,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACrD,MAAM,eAAe,GAAyB,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACvB,eAA2C,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"skill-packaging-config.js","sourceRoot":"","sources":["../../src/utils/skill-packaging-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAA6B,MAAM,kCAAkC,CAAC;AAE/F;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAA6C,EAC7C,iBAAsD;IAEtD,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACrD,MAAM,eAAe,GAAyB,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACvB,eAA2C,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,EAAE,CAAC,OAAO,CAAkC,CAAC;IAC1E,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC,OAAO,CAAkC,CAAC;IACpF,IAAI,YAAY,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAC9D,MAAM,WAAW,GAAG,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAClE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,eAAe,CAAC,KAAK,GAAG,WAAW,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC"}
@@ -64,14 +64,14 @@ Every field is optional; an omitted knob falls back to its default.
64
64
  | `maxBudgetUsd` | number > 0 | none | `--max-budget-usd <n>` | Hard USD budget cap passed to the CLI. |
65
65
  | `timeout` | integer, **seconds** | scales with eval count: ~`2min + 2min/eval`, floored at 5min, capped at 1h | `--timeout <s>` | Wall-clock timeout. An explicit value always overrides the scaled default. |
66
66
  | `stall` | integer, **seconds** | none | `--stall <s>` | Stall watchdog — kill the spawn after this long with no stream output. |
67
- | `evals` | string (path) | bootstrapped suite | `--evals <path>` | Path to `evals.json`, **relative to the skill source**. |
67
+ | `evals` | string (path or npm specifier) | auto-detected `evals/evals.json` (see below) | `--evals <path>` | Which `evals.json` to grade against. `test.evals` resolves **relative to the skill source**; `--evals` resolves **relative to the current directory**. Either may be absolute, and either may be an npm bare specifier. An explicit value always wins over the default convention. |
68
68
  | `auth` | `inherit` \| `subscription` \| `api-key` \| `auto` | `inherit` | `--auth <mode>` | Auth mechanism for the spawned session. |
69
69
  | `requireAuth` | `subscription` \| `api-key` | none | `--require-auth <mech>` | Fail-fast guard: preflight exits `2` if the effective mechanism isn't this. |
70
70
  | `baseline` | boolean | `false` | `--baseline` | Run the opt-in with/without A/B skill-lift comparison. |
71
71
  | `skillCreator` | source descriptor | `{ vendored: true }` | — | Source for the vendored skill-creator rubric. |
72
72
  | `with` | array of source descriptors | none | `--with name=<src>` | **Required** companion skills staged alongside the subject, invocable by it. |
73
73
  | `optional` | array of source descriptors | none | `--with-optional name=<src>` | **Optional** companions — skipped with a warning if unresolvable. |
74
- | `env` | map string→string | none | `--env KEY=VALUE` | Env vars injected into the **executor** spawn. Values interpolate `${fixturesDir}`, `${stagedSkillDir}`, `${harnessRoot}`, `${resultsDir}`. Protected names (PATH, auth, model, admin) cannot be overridden. |
74
+ | `env` | map string→string | none | `--env KEY=VALUE` | Env vars injected into the **executor** spawn. Values interpolate `${fixturesDir}`, `${stagedSkillDir}`, `${harnessRoot}`, `${resultsDir}`. `${fixturesDir}` is **per-eval** — it names that eval's own staged workspace (`fixtures/` under the executor's working directory), so the eval must declare input `files`; using it on an eval without them fails the run (exit 2). Protected names (PATH, auth, model, admin) cannot be overridden. |
75
75
  | `passEnv` | array of strings | none | `--pass-env KEY` | Names of host env vars to forward to the executor spawn if present. Protected names are ignored with a warning. |
76
76
  | `build` | string (shell command) | none | — | Command run **once, before staging**, to generate build artifacts. Runs with `cwd` = config root. A non-zero exit aborts the run (exit `2`). |
77
77
 
@@ -94,6 +94,50 @@ unbuilt source only when the failure is non-destructive. Each declared skill bui
94
94
  Staging the same name twice across the subject, `--with`, and `--with-optional` is a
95
95
  duplicate-name error (exit `2`).
96
96
 
97
+ ### The default eval-suite convention
98
+
99
+ **You do not need a `test:` block to have an eval suite.** If a skill has a file at:
100
+
101
+ ```
102
+ <skill-source-dir>/evals/evals.json
103
+ ```
104
+
105
+ VAT treats that as the skill's suite — the same path `vat skill test run` has always defaulted to. Two things follow from it, and they are deliberately the same two things an explicit `test:` block would give you:
106
+
107
+ 1. `vat skill test run <skill>` finds and runs the suite.
108
+ 2. **The suite directory is excluded from packaged output.** It holds the `expected_output` / `expectations` answer key, so shipping it would both publish the answers and let a skill under test read its own key.
109
+
110
+ This is **auto-detection, not a requirement**. It is keyed on the suite *file* existing:
111
+
112
+ | On disk | Treated as a suite? |
113
+ |---|---|
114
+ | `<skill>/evals/evals.json` | **Yes** — run by the harness, excluded from the bundle |
115
+ | `<skill>/evals/` with no `evals.json` | No — ordinary content, ships normally |
116
+ | `<skill>/docs/evals/…` (any other location named `evals`) | No — ordinary content, ships normally |
117
+ | No `evals/` directory at all | No — nothing happens, no error, no warning |
118
+
119
+ A skill with no suite is completely unaffected: it packages exactly as it would have, with no error and nothing excluded. The convention never makes evals mandatory.
120
+
121
+ **Set `test.evals` explicitly** when your suite lives anywhere else — a shared directory, a per-skill subdirectory (VAT's own repo uses `evals/<skill-name>/evals.json`), or outside the skill tree. An explicit path always overrides the convention.
122
+
123
+ > Both lanes honor this. Before it was shared, the harness auto-detected the suite while the packager did not, so a skill relying on the default had its answer key published even though the harness was protecting it.
124
+
125
+ ### Testing a skill you did not author
126
+
127
+ A correctly packaged skill ships **no** eval suite — the suite is the answer key, and excluding it from the bundle is the whole point of the convention above. So for any skill you install rather than write, there is nothing in its tree to grade against, and you have to supply the suite yourself:
128
+
129
+ ```bash
130
+ vat skill test run npm:@vendor/their-skill \
131
+ --evals ./our-audit-corpus/their-skill.json \
132
+ --i-understand-this-runs-skill-code
133
+ ```
134
+
135
+ `--evals` resolves against the directory you run it from, so the path means what you typed. It may point anywhere — including outside the skill's tree entirely, which is the normal case here. It also accepts an npm bare specifier (`--evals @acme/skill-evals/their-skill.json`), honoring that package's `exports` map, so a shared corpus can be distributed as a package.
136
+
137
+ The suite is never copied into anything the executor can reach. Each eval's declared input `files` are resolved relative to the **suite's** directory and staged into that eval's own workspace, so fixtures travel with the suite rather than with the skill.
138
+
139
+ > **On sensitive fixtures.** `workspaces/` and `results/` are created `0700`, so a fixture that was never in your repo is not left readable by other local users. That is necessary but **not** sufficient: `grading.json` quotes the executor transcript verbatim as evidence, so anything the skill *reads out of* a fixture is written into `results/` as text — and `results/` survives `--keep` by design. Treat the harness output as being as sensitive as the fixtures you feed it.
140
+
97
141
  ## Global knobs (top-level `test:`)
98
142
 
99
143
  | Config key | Type | Default | CLI flag | Purpose |
@@ -109,7 +153,7 @@ duplicate-name error (exit `2`).
109
153
  | `--no-build` | Stage existing `dist` instead of building. Errors if absent for the subject or a **required** companion; an optional companion falls back to raw source with a warning. |
110
154
  | `--refresh` | Force a full re-stage, ignoring existing staged content. |
111
155
  | `--keep` | Keep the harness directory after the run (needed to inspect `results/`). |
112
- | `--dry-run` | Assemble the command without spawning Claude. Note this **skips the build**, so it does not preview `files:` injection. |
156
+ | `--dry-run` | Build and stage exactly as a real run would, then stop without spawning Claude — no session, no tokens. It **does build** (when `--i-understand-this-runs-skill-code` is passed), because the question a dry run answers is "what happens if I drop this flag", and a preview built from a stale `dist/` answers it wrongly. **Without** the acknowledgement it does not build — building runs the repo's `test.build` hook, an arbitrary shell command — so it falls back to an existing `dist/` and warns it may be stale. `--no-build` skips the build either way. |
113
157
  | `--out <dir>` / `--workdir <dir>` | Override the harness output / working directory. |
114
158
  | `--allow-eval-failure` | Opt out of fail-closed: exit `0` even when an eval fails. For interactive iteration. |
115
159
  | `--allow-unverified-skill-source` | Skip the vendored manifest integrity check. |
package/docs/skills.md CHANGED
@@ -315,14 +315,22 @@ for terminology.
315
315
 
316
316
  **What it does:**
317
317
  1. Resolves the source (local directory, ZIP, .tgz, or npm package)
318
- 2. Discovers one or more skills inside the source
318
+ 2. Discovers one or more skill directories inside the source
319
319
  3. Pre-validates every skill with `validateSkill()` — zero files written if validation fails
320
- 4. Builds an install plan, detecting conflicts before touching the filesystem
321
- 5. Copies skill(s) to the resolved platform directory (all-or-nothing semantics)
322
- 6. Emits a YAML summary on stdout
320
+ 4. Reads each skill's declared name, which is the name it installs under
321
+ 5. Builds an install plan, detecting conflicts before touching the filesystem
322
+ 6. Copies skill(s) to the resolved platform directory (all-or-nothing semantics)
323
+ 7. Emits a YAML summary on stdout
323
324
 
324
325
  Both `--target` and `--scope` are **required** — there are no defaults.
325
326
 
327
+ **Installed name:** a skill installs under the `name` its `SKILL.md` frontmatter
328
+ declares — the same identity `vat skills build` and the plugin build key on — not
329
+ the name of the directory it came from. A ZIP or npm source has no meaningful
330
+ directory name to use. If two skills in one source declare the same name, the
331
+ whole install fails rather than one silently overwriting the other. Use `--name`
332
+ to override (single-skill sources only).
333
+
326
334
  **Supported Sources:**
327
335
  - **Local directory:** `./path/to/skill-dir` — must contain `SKILL.md` at root or in subdirectories
328
336
  - **Local ZIP file:** `./path/to/skill.zip` — extracted to a temp directory, then installed
@@ -354,6 +362,16 @@ Both `--target` and `--scope` are **required** — there are no defaults.
354
362
  | `windsurf` | `~/.codeium/windsurf/skills/` | `.windsurf/skills/` |
355
363
  | `agents` | `~/.agents/skills/` | `.agents/skills/` |
356
364
 
365
+ These paths were last reviewed against vendor conventions on 2026-04-08 and are
366
+ not verified at build or test time — the tests assert the table's shape, never
367
+ that a path is where a platform actually looks. If a vendor moves its convention,
368
+ installs land somewhere unread and every VAT check still passes. Re-check the
369
+ vendor's documentation before relying on a non-`claude` target.
370
+
371
+ **Visibility:** VAT's own inspection commands are Claude-scoped — `vat skills
372
+ list --user` and `vat audit --user` read `~/.claude` only. A skill installed to
373
+ any other target lands correctly but is invisible to them.
374
+
357
375
  **Exit Codes:**
358
376
  - `0` - Install successful (or dry-run complete)
359
377
  - `1` - Install error (validation failed, conflict without `--force`, source not found, bad target/scope)
@@ -438,6 +456,10 @@ for terminology.
438
456
  2. Reports validation status for each skill
439
457
  3. Shows skill metadata (name, description, path)
440
458
 
459
+ The reported `name` is the one the skill's frontmatter declares — matching what
460
+ `vat skills install` would install it as — falling back to the directory name
461
+ only when the `SKILL.md` declares none.
462
+
441
463
  **Modes:**
442
464
 
443
465
  **Project mode (default):**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibe-agent-toolkit/cli",
3
- "version": "0.1.41-rc.5",
3
+ "version": "0.1.41-rc.6",
4
4
  "description": "Command-line interface for vibe-agent-toolkit",
5
5
  "type": "module",
6
6
  "bin": {
@@ -41,16 +41,16 @@
41
41
  "//dependencies-note": "DO NOT add example agent packages or adopter packages here. Adopter packages (like vat-development-agents) depend on the CLI binary at build time — declaring them as deps creates a circular build dependency. They are built in a second turbo pass via package#task overrides in turbo.json.",
42
42
  "dependencies": {
43
43
  "@anthropic-ai/sdk": "^0.71.2",
44
- "@vibe-agent-toolkit/agent-config": "0.1.41-rc.5",
45
- "@vibe-agent-toolkit/agent-schema": "0.1.41-rc.5",
46
- "@vibe-agent-toolkit/agent-skills": "0.1.41-rc.5",
47
- "@vibe-agent-toolkit/claude-marketplace": "0.1.41-rc.5",
48
- "@vibe-agent-toolkit/discovery": "0.1.41-rc.5",
49
- "@vibe-agent-toolkit/gateway-mcp": "0.1.41-rc.5",
50
- "@vibe-agent-toolkit/rag": "0.1.41-rc.5",
51
- "@vibe-agent-toolkit/rag-lancedb": "0.1.41-rc.5",
52
- "@vibe-agent-toolkit/resources": "0.1.41-rc.5",
53
- "@vibe-agent-toolkit/utils": "0.1.41-rc.5",
44
+ "@vibe-agent-toolkit/agent-config": "0.1.41-rc.6",
45
+ "@vibe-agent-toolkit/agent-schema": "0.1.41-rc.6",
46
+ "@vibe-agent-toolkit/agent-skills": "0.1.41-rc.6",
47
+ "@vibe-agent-toolkit/claude-marketplace": "0.1.41-rc.6",
48
+ "@vibe-agent-toolkit/discovery": "0.1.41-rc.6",
49
+ "@vibe-agent-toolkit/gateway-mcp": "0.1.41-rc.6",
50
+ "@vibe-agent-toolkit/rag": "0.1.41-rc.6",
51
+ "@vibe-agent-toolkit/rag-lancedb": "0.1.41-rc.6",
52
+ "@vibe-agent-toolkit/resources": "0.1.41-rc.6",
53
+ "@vibe-agent-toolkit/utils": "0.1.41-rc.6",
54
54
  "adm-zip": "^0.6.0",
55
55
  "commander": "^12.1.0",
56
56
  "picomatch": "^4.0.3",
@@ -65,7 +65,7 @@
65
65
  "@types/picomatch": "^4.0.2",
66
66
  "@types/semver": "^7.7.1",
67
67
  "@types/tar": "^6.1.13",
68
- "@vibe-agent-toolkit/dev-tools": "0.1.41-rc.5",
68
+ "@vibe-agent-toolkit/dev-tools": "0.1.41-rc.6",
69
69
  "rimraf": "^6.0.1",
70
70
  "typescript": "^5.7.3",
71
71
  "vitest": "^3.2.4"