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

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 (171) hide show
  1. package/README.md +4 -3
  2. package/dist/bin/vat +1 -1
  3. package/dist/bin/vat.js +1 -1
  4. package/dist/bin/vat.js.map +1 -1
  5. package/dist/bin.js +2 -4
  6. package/dist/bin.js.map +1 -1
  7. package/dist/commands/agent/help.d.ts.map +1 -1
  8. package/dist/commands/agent/help.js +2 -4
  9. package/dist/commands/agent/help.js.map +1 -1
  10. package/dist/commands/audit/hierarchical-output.d.ts +6 -2
  11. package/dist/commands/audit/hierarchical-output.d.ts.map +1 -1
  12. package/dist/commands/audit/hierarchical-output.js +93 -50
  13. package/dist/commands/audit/hierarchical-output.js.map +1 -1
  14. package/dist/commands/audit-settings.d.ts +35 -0
  15. package/dist/commands/audit-settings.d.ts.map +1 -1
  16. package/dist/commands/audit-settings.js +121 -51
  17. package/dist/commands/audit-settings.js.map +1 -1
  18. package/dist/commands/audit.d.ts +63 -1
  19. package/dist/commands/audit.d.ts.map +1 -1
  20. package/dist/commands/audit.js +329 -187
  21. package/dist/commands/audit.js.map +1 -1
  22. package/dist/commands/build.d.ts.map +1 -1
  23. package/dist/commands/build.js +47 -18
  24. package/dist/commands/build.js.map +1 -1
  25. package/dist/commands/claude/marketplace/license-utils.d.ts +39 -2
  26. package/dist/commands/claude/marketplace/license-utils.d.ts.map +1 -1
  27. package/dist/commands/claude/marketplace/license-utils.js +114 -68
  28. package/dist/commands/claude/marketplace/license-utils.js.map +1 -1
  29. package/dist/commands/claude/marketplace/publish.js +5 -4
  30. package/dist/commands/claude/marketplace/publish.js.map +1 -1
  31. package/dist/commands/claude/marketplace/validate.d.ts.map +1 -1
  32. package/dist/commands/claude/marketplace/validate.js +13 -19
  33. package/dist/commands/claude/marketplace/validate.js.map +1 -1
  34. package/dist/commands/claude/org/skills.d.ts +21 -0
  35. package/dist/commands/claude/org/skills.d.ts.map +1 -1
  36. package/dist/commands/claude/org/skills.js +107 -30
  37. package/dist/commands/claude/org/skills.js.map +1 -1
  38. package/dist/commands/claude/plugin/build.d.ts +94 -1
  39. package/dist/commands/claude/plugin/build.d.ts.map +1 -1
  40. package/dist/commands/claude/plugin/build.js +307 -106
  41. package/dist/commands/claude/plugin/build.js.map +1 -1
  42. package/dist/commands/claude/plugin/install.d.ts.map +1 -1
  43. package/dist/commands/claude/plugin/install.js +7 -2
  44. package/dist/commands/claude/plugin/install.js.map +1 -1
  45. package/dist/commands/claude/plugin/marketplace-json.d.ts +36 -0
  46. package/dist/commands/claude/plugin/marketplace-json.d.ts.map +1 -0
  47. package/dist/commands/claude/plugin/marketplace-json.js +34 -0
  48. package/dist/commands/claude/plugin/marketplace-json.js.map +1 -0
  49. package/dist/commands/claude/plugin/plugin-json-merge.d.ts +30 -1
  50. package/dist/commands/claude/plugin/plugin-json-merge.d.ts.map +1 -1
  51. package/dist/commands/claude/plugin/plugin-json-merge.js +92 -14
  52. package/dist/commands/claude/plugin/plugin-json-merge.js.map +1 -1
  53. package/dist/commands/claude/plugin/tree-copy.d.ts +10 -3
  54. package/dist/commands/claude/plugin/tree-copy.d.ts.map +1 -1
  55. package/dist/commands/claude/plugin/tree-copy.js +0 -1
  56. package/dist/commands/claude/plugin/tree-copy.js.map +1 -1
  57. package/dist/commands/claude/plugin/uninstall.d.ts.map +1 -1
  58. package/dist/commands/claude/plugin/uninstall.js +10 -2
  59. package/dist/commands/claude/plugin/uninstall.js.map +1 -1
  60. package/dist/commands/corpus/runner.d.ts.map +1 -1
  61. package/dist/commands/corpus/runner.js +15 -26
  62. package/dist/commands/corpus/runner.js.map +1 -1
  63. package/dist/commands/doctor.d.ts +57 -8
  64. package/dist/commands/doctor.d.ts.map +1 -1
  65. package/dist/commands/doctor.js +142 -67
  66. package/dist/commands/doctor.js.map +1 -1
  67. package/dist/commands/phase-utils.d.ts +62 -2
  68. package/dist/commands/phase-utils.d.ts.map +1 -1
  69. package/dist/commands/phase-utils.js +74 -2
  70. package/dist/commands/phase-utils.js.map +1 -1
  71. package/dist/commands/rag/help.d.ts.map +1 -1
  72. package/dist/commands/rag/help.js +2 -4
  73. package/dist/commands/rag/help.js.map +1 -1
  74. package/dist/commands/resources/help.d.ts.map +1 -1
  75. package/dist/commands/resources/help.js +2 -4
  76. package/dist/commands/resources/help.js.map +1 -1
  77. package/dist/commands/resources/index.d.ts.map +1 -1
  78. package/dist/commands/resources/index.js +13 -6
  79. package/dist/commands/resources/index.js.map +1 -1
  80. package/dist/commands/resources/validate.d.ts +19 -0
  81. package/dist/commands/resources/validate.d.ts.map +1 -1
  82. package/dist/commands/resources/validate.js +89 -24
  83. package/dist/commands/resources/validate.js.map +1 -1
  84. package/dist/commands/skill/review.d.ts.map +1 -1
  85. package/dist/commands/skill/review.js +33 -20
  86. package/dist/commands/skill/review.js.map +1 -1
  87. package/dist/commands/skill/test/configure.d.ts.map +1 -1
  88. package/dist/commands/skill/test/configure.js +1 -1
  89. package/dist/commands/skill/test/configure.js.map +1 -1
  90. package/dist/commands/skill/test/run.d.ts +29 -2
  91. package/dist/commands/skill/test/run.d.ts.map +1 -1
  92. package/dist/commands/skill/test/run.js +67 -19
  93. package/dist/commands/skill/test/run.js.map +1 -1
  94. package/dist/commands/skills/build.d.ts +51 -0
  95. package/dist/commands/skills/build.d.ts.map +1 -1
  96. package/dist/commands/skills/build.js +94 -86
  97. package/dist/commands/skills/build.js.map +1 -1
  98. package/dist/commands/skills/install.d.ts.map +1 -1
  99. package/dist/commands/skills/install.js +79 -25
  100. package/dist/commands/skills/install.js.map +1 -1
  101. package/dist/commands/skills/list.d.ts.map +1 -1
  102. package/dist/commands/skills/list.js +9 -5
  103. package/dist/commands/skills/list.js.map +1 -1
  104. package/dist/commands/skills/package.d.ts +2 -0
  105. package/dist/commands/skills/package.d.ts.map +1 -1
  106. package/dist/commands/skills/package.js +61 -42
  107. package/dist/commands/skills/package.js.map +1 -1
  108. package/dist/commands/skills/skill-discovery.d.ts +7 -0
  109. package/dist/commands/skills/skill-discovery.d.ts.map +1 -1
  110. package/dist/commands/skills/skill-discovery.js +14 -4
  111. package/dist/commands/skills/skill-discovery.js.map +1 -1
  112. package/dist/commands/skills/validate.d.ts +38 -0
  113. package/dist/commands/skills/validate.d.ts.map +1 -1
  114. package/dist/commands/skills/validate.js +125 -70
  115. package/dist/commands/skills/validate.js.map +1 -1
  116. package/dist/commands/validate.d.ts.map +1 -1
  117. package/dist/commands/validate.js +11 -5
  118. package/dist/commands/validate.js.map +1 -1
  119. package/dist/commands/verify.d.ts.map +1 -1
  120. package/dist/commands/verify.js +76 -28
  121. package/dist/commands/verify.js.map +1 -1
  122. package/dist/skill-resolution/classify.d.ts +7 -2
  123. package/dist/skill-resolution/classify.d.ts.map +1 -1
  124. package/dist/skill-resolution/classify.js +7 -2
  125. package/dist/skill-resolution/classify.js.map +1 -1
  126. package/dist/skill-resolution/resolve-skill-reference.d.ts +10 -8
  127. package/dist/skill-resolution/resolve-skill-reference.d.ts.map +1 -1
  128. package/dist/skill-resolution/resolve-skill-reference.js +62 -23
  129. package/dist/skill-resolution/resolve-skill-reference.js.map +1 -1
  130. package/dist/skill-resolution/types.d.ts +3 -2
  131. package/dist/skill-resolution/types.d.ts.map +1 -1
  132. package/dist/utils/config-loader.d.ts.map +1 -1
  133. package/dist/utils/config-loader.js +0 -2
  134. package/dist/utils/config-loader.js.map +1 -1
  135. package/dist/utils/help-loader.d.ts +16 -0
  136. package/dist/utils/help-loader.d.ts.map +1 -1
  137. package/dist/utils/help-loader.js +31 -1
  138. package/dist/utils/help-loader.js.map +1 -1
  139. package/dist/utils/issue-anchor.d.ts +26 -0
  140. package/dist/utils/issue-anchor.d.ts.map +1 -0
  141. package/dist/utils/issue-anchor.js +39 -0
  142. package/dist/utils/issue-anchor.js.map +1 -0
  143. package/dist/utils/issue-rendering.d.ts +61 -0
  144. package/dist/utils/issue-rendering.d.ts.map +1 -0
  145. package/dist/utils/issue-rendering.js +135 -0
  146. package/dist/utils/issue-rendering.js.map +1 -0
  147. package/dist/utils/output.d.ts +26 -4
  148. package/dist/utils/output.d.ts.map +1 -1
  149. package/dist/utils/output.js +27 -6
  150. package/dist/utils/output.js.map +1 -1
  151. package/dist/utils/project-root-policy.d.ts +2 -2
  152. package/dist/utils/project-root-policy.js +2 -2
  153. package/dist/utils/skill-packaging-config.d.ts +15 -6
  154. package/dist/utils/skill-packaging-config.d.ts.map +1 -1
  155. package/dist/utils/skill-packaging-config.js +23 -5
  156. package/dist/utils/skill-packaging-config.js.map +1 -1
  157. package/dist/utils/validate-help-files.d.ts +3 -2
  158. package/dist/utils/validate-help-files.d.ts.map +1 -1
  159. package/dist/utils/validate-help-files.js +48 -5
  160. package/dist/utils/validate-help-files.js.map +1 -1
  161. package/dist/utils/verdict-helpers.d.ts +10 -2
  162. package/dist/utils/verdict-helpers.d.ts.map +1 -1
  163. package/dist/utils/verdict-helpers.js +13 -3
  164. package/dist/utils/verdict-helpers.js.map +1 -1
  165. package/docs/audit.md +40 -14
  166. package/docs/doctor.md +46 -10
  167. package/docs/index.md +1 -1
  168. package/docs/resources.md +24 -8
  169. package/docs/skill-test.md +47 -3
  170. package/docs/skills.md +28 -6
  171. package/package.json +12 -12
package/docs/audit.md CHANGED
@@ -183,9 +183,9 @@ detection strategy doc, workstream B).
183
183
  status: success
184
184
  summary:
185
185
  filesScanned: 42
186
- success: 40
187
- warnings: 2
188
- errors: 0
186
+ filesPassed: 40
187
+ filesWithWarnings: 2
188
+ filesWithErrors: 0
189
189
  marketplaces: 2
190
190
  standalonePlugins: 3
191
191
  standaloneSkills: 5
@@ -313,31 +313,57 @@ Warnings indicate potential issues but don't prevent usage:
313
313
  Structured YAML report for programmatic parsing:
314
314
 
315
315
  ```yaml
316
+ root: /abs/path/to/scan/root # The ONE absolute path in the document
316
317
  status: success | warning | error
317
318
  summary:
318
319
  filesScanned: number
319
- success: number # Files with no issues
320
- warnings: number # Files with warnings only
321
- errors: number # Files with errors
322
- issues:
323
- errors: number # Total error count across all files
324
- warnings: number # Total warning count across all files
325
- info: number # Total info count across all files
320
+ filesPassed: number # Files with no ACTIONABLE issues (info-only counts as passed)
321
+ filesWithWarnings: number # Files whose worst actionable severity is warning
322
+ filesWithErrors: number # Files carrying at least one error
323
+ issueCounts: # FINDINGS, not files — same field name and meaning
324
+ errors: number # as the `issueCounts` on each entry below
325
+ warnings: number
326
+ info: number
326
327
  duration: "123ms"
327
328
  files:
328
- - path: /path/to/resource
329
+ - path: plugins/my-plugin # relative to `root`
329
330
  status: success | warning | error
330
331
  type: plugin | marketplace | registry | skill
331
- issues: []
332
+ issues:
333
+ - location: plugins/my-plugin/.claude-plugin/plugin.json # relative to `root`
332
334
  ```
333
335
 
336
+ #### One stated root, and everything relative to it
337
+
338
+ `root` is the invocation scan root and the only absolute path a report contains.
339
+ Every `path` and every issue `location` beneath it is forward-slashed and
340
+ relative to that root, so:
341
+
342
+ - `join(root, path)` and `join(root, location)` name real files — a consumer
343
+ never has to guess, or reimplement, the base a value was written against.
344
+ - A `location` identifies a file uniquely across the whole document, even when a
345
+ run spans several projects that share internal layout (two `plugins/plugin-a`
346
+ directories under different parents cannot collapse to one string).
347
+ - Nothing but `root` can leak the developer's or CI runner's home directory.
348
+
349
+ The scan root is an ANCHOR, not a validation-policy boundary. Per-skill
350
+ packaging rules still come from each skill's nearest-ancestor
351
+ `vibe-agent-toolkit.config.yaml` (configs do not compose); that discovery has no
352
+ say in how a path is spelled.
353
+
354
+ `--user` scans three sibling directories (`plugins/`, `skills/`,
355
+ `marketplaces/`), so its `root` is their shared Claude config dir
356
+ (`$CLAUDE_CONFIG_DIR`, else `~/.claude`). A URL audit omits `root`: the clone
357
+ lives in a random tempdir that nothing downstream can resolve, so the provenance
358
+ header states the base instead and paths are relative to the cloned repo.
359
+
334
360
  ### Standard Error (stderr)
335
361
 
336
- Human-readable error messages and logs:
362
+ Human-readable error messages and logs. Paths are root-relative here too:
337
363
 
338
364
  ```
339
365
  ERROR: Audit failed: 2 file(s) with errors
340
- ERROR: /path/to/skill.md:
366
+ ERROR: skills/my-skill/SKILL.md:
341
367
  ERROR: [SKILL_MISSING_NAME] name field is required in frontmatter
342
368
  ERROR: at: line 1
343
369
  ERROR: fix: Add 'name: skill-name' to frontmatter
package/docs/doctor.md CHANGED
@@ -21,13 +21,24 @@ providing actionable suggestions for any problems found.
21
21
  7. CLI build status (when running from VAT source tree)
22
22
 
23
23
  **Options:**
24
- - `--verbose` - Show all checks (including passing ones)
24
+ - `--verbose` - Show all checks (including passing and skipped ones)
25
+
26
+ **Check outcomes:**
27
+
28
+ | Icon | Outcome | Meaning |
29
+ |------|---------|---------|
30
+ | ✅ | `pass` | The check ran and the thing is fine |
31
+ | ❌ | `fail` | The check ran and the thing is wrong — the only outcome that affects the exit code |
32
+ | ❓ | `undetermined` | The check could not reach an answer (registry unreachable, file unreadable). **Nothing was verified** — this is not a pass |
33
+ | ⏭️ | `skipped` | The check does not apply here (e.g. a VAT-source-tree-only check outside the source tree) |
25
34
 
26
35
  **Exit Codes:**
27
- - `0` - All checks passed
36
+ - `0` - No check failed (an undetermined check is reported in the output, not fatal)
28
37
  - `1` - One or more checks failed
29
38
 
30
- **Output:** Human-friendly formatted text with emojis
39
+ **Output:** Human-friendly formatted text with emojis. The summary always prints the
40
+ full outcome distribution and, when the concise view hides checks, how many it hid —
41
+ so the counts can never contradict the list above them.
31
42
 
32
43
  ## Usage Examples
33
44
 
@@ -39,17 +50,34 @@ Check all diagnostic items and show only failures:
39
50
  vat doctor
40
51
  ```
41
52
 
42
- Output when all checks pass:
53
+ Output when all checks pass (the concise view prints no check blocks, and says so):
43
54
  ```
44
55
  🩺 vat doctor
45
56
 
46
57
  Running diagnostic checks...
47
58
 
48
- 📊 Results: 7/7 checks passed
59
+ 📊 Results: 7 checks — 7 passed, 0 failed, 0 undetermined, 0 skipped
60
+ 7 not shown (nothing to report) — re-run with --verbose to see every check.
49
61
 
50
62
  ✨ All checks passed! Your vat setup looks healthy.
51
63
  ```
52
64
 
65
+ Output when a check could not be determined (here: the npm registry was unreachable):
66
+ ```
67
+ 🩺 vat doctor
68
+
69
+ Running diagnostic checks...
70
+
71
+ ❓ vat version
72
+ Unable to check for updates: not found: npm
73
+
74
+ 📊 Results: 7 checks — 6 passed, 0 failed, 1 undetermined, 0 skipped
75
+ 6 not shown (nothing to report) — re-run with --verbose to see every check.
76
+
77
+ ❓ Nothing failed, but 1 check(s) could not be determined — that is not the same as healthy.
78
+ ```
79
+ Exit code is still `0` — nothing failed — but the run is *not* reported as healthy.
80
+
53
81
  ### Verbose Mode
54
82
 
55
83
  Show all checks including passing ones:
@@ -85,7 +113,7 @@ Running diagnostic checks...
85
113
  ✅ CLI build status
86
114
  Build is up to date (v0.1.0)
87
115
 
88
- 📊 Results: 7/7 checks passed
116
+ 📊 Results: 7 checks — 7 passed, 0 failed, 0 undetermined, 0 skipped
89
117
 
90
118
  ✨ All checks passed! Your vat setup looks healthy.
91
119
  ```
@@ -110,7 +138,8 @@ Output:
110
138
 
111
139
  Running diagnostic checks...
112
140
 
113
- 📊 Results: 7/7 checks passed
141
+ 📊 Results: 7 checks — 7 passed, 0 failed, 0 undetermined, 0 skipped
142
+ 7 not shown (nothing to report) — re-run with --verbose to see every check.
114
143
 
115
144
  ✨ All checks passed! Your vat setup looks healthy.
116
145
  ```
@@ -250,14 +279,20 @@ fi
250
279
  ### VAT Version Check
251
280
 
252
281
  - **Purpose:** Inform about available updates (advisory only)
253
- - **Always passes:** This check never fails
282
+ - **Never fails:** an available update is a `pass` with a suggestion
283
+ - **Undetermined:** if the npm registry cannot be reached, the outcome is
284
+ `undetermined` (❓), not `pass` — doctor did not verify that you are current
254
285
  - **Suggestion:** Shows upgrade command if update available
255
286
 
256
287
  ### CLI Build Status Check
257
288
 
258
289
  - **When:** Only runs when in VAT source tree
259
290
  - **Purpose:** Ensure CLI build matches source version (for VAT developers)
260
- - **Skipped:** When running installed VAT globally
291
+ - **Skipped (⏭️):** When running installed VAT globally, or when no project root
292
+ was detected — the check does not apply
293
+ - **Undetermined (❓):** When the version files exist but cannot be read or
294
+ parsed. Doctor cannot tell whether the build is stale, which is different from
295
+ the check not applying
261
296
  - **Fix:** Run `bun run build` in VAT source directory
262
297
 
263
298
  ## Requirements
@@ -278,4 +313,5 @@ for terminology.
278
313
  - Run `vat doctor` before reporting issues to verify environment
279
314
  - Use `--verbose` flag when debugging to see all check details
280
315
  - Doctor checks can be run from any subdirectory in your project
281
- - Exit code 0 means all checks passed (useful for scripts)
316
+ - Exit code 0 means no check *failed*; read the counts line to see whether any
317
+ check was undetermined (useful for scripts)
package/docs/index.md CHANGED
@@ -102,7 +102,7 @@ Diagnose vat setup and environment health
102
102
 
103
103
  **Exit codes:**
104
104
 
105
- - `0` - All checks passed
105
+ - `0` - No check failed (a check that could not be determined is reported as ❓, not fatal)
106
106
  - `1` - One or more checks failed
107
107
 
108
108
  **Creates/modifies:** None (read-only diagnostics)
package/docs/resources.md CHANGED
@@ -117,20 +117,25 @@ vat resources validate docs/
117
117
  ```bash
118
118
  vat resources validate docs/
119
119
 
120
- # stderr:
121
- # docs/README.md:15:25: Link target not found: ./missing.md
122
- # docs/guide.md:42:10: Broken anchor: #non-existent-section
120
+ # stderr: (file:line:column: severity: message — only `error` fails the run)
121
+ # docs/README.md:15:25: error: Link target not found: ./missing.md
122
+ # docs/guide.md:42:10: error: Broken anchor: #non-existent-section
123
123
 
124
124
  # stdout:
125
125
  # ---
126
126
  # status: failed
127
127
  # errorsFound: 2
128
- # errors:
128
+ # filesWithErrors: 2
129
+ # issueCounts: { errors: 2, warnings: 0, info: 0 }
130
+ # issueSummary: { LINK_BROKEN_FILE: 1, LINK_BROKEN_ANCHOR: 1 }
131
+ # issues:
129
132
  # - file: docs/README.md
130
- # line: 15
131
- # column: 25
132
- # type: broken-link
133
- # message: Link target not found: ./missing.md
133
+ # issues:
134
+ # - line: 15
135
+ # column: 25
136
+ # code: LINK_BROKEN_FILE
137
+ # severity: error
138
+ # message: Link target not found: ./missing.md
134
139
  # duration: 456ms
135
140
  # ---
136
141
  ```
@@ -182,6 +187,17 @@ resources:
182
187
  FRONTMATTER_SCHEMA_ERROR: error
183
188
  ```
184
189
 
190
+ **Dot-directories are scanned.** `**` traverses path segments beginning with a
191
+ dot, so the default `**/*.md` reaches `.claude/`, `.github/` and the like — as do
192
+ your own patterns. Visibility is decided by git and by `exclude`, never by a
193
+ leading dot. To keep a dotted tree out of the scan, exclude it by name:
194
+
195
+ ```yaml
196
+ resources:
197
+ exclude:
198
+ - ".claude/worktrees/**"
199
+ ```
200
+
185
201
  ## Integration with vibe-validate
186
202
 
187
203
  The test-format error output (stderr) integrates seamlessly with vibe-validate:
@@ -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
@@ -22,9 +22,9 @@ skills:
22
22
  LINK_TO_NAVIGATION_FILE: ignore # this skill links to READMEs on purpose
23
23
  ALLOW_EXPIRED: error # zero-tolerance expiry
24
24
  allow:
25
- PACKAGED_UNREFERENCED_FILE:
25
+ LINK_TO_GITIGNORED_FILE:
26
26
  - paths: ["templates/runtime.json"]
27
- reason: "consumed programmatically at runtime"
27
+ reason: "generated at install time, deliberately untracked"
28
28
  expires: "2026-09-30"
29
29
  SKILL_LENGTH_EXCEEDS_RECOMMENDED:
30
30
  - reason: "whole-skill concern; paths defaults to ['**/*']"
@@ -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.7",
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.7",
45
+ "@vibe-agent-toolkit/agent-schema": "0.1.41-rc.7",
46
+ "@vibe-agent-toolkit/agent-skills": "0.1.41-rc.7",
47
+ "@vibe-agent-toolkit/claude-marketplace": "0.1.41-rc.7",
48
+ "@vibe-agent-toolkit/discovery": "0.1.41-rc.7",
49
+ "@vibe-agent-toolkit/gateway-mcp": "0.1.41-rc.7",
50
+ "@vibe-agent-toolkit/rag": "0.1.41-rc.7",
51
+ "@vibe-agent-toolkit/rag-lancedb": "0.1.41-rc.7",
52
+ "@vibe-agent-toolkit/resources": "0.1.41-rc.7",
53
+ "@vibe-agent-toolkit/utils": "0.1.41-rc.7",
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.7",
69
69
  "rimraf": "^6.0.1",
70
70
  "typescript": "^5.7.3",
71
71
  "vitest": "^3.2.4"