@vibe-agent-toolkit/agent-skills 0.1.42 → 0.2.0-rc.10

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 (322) hide show
  1. package/README.md +5 -5
  2. package/dist/builder.d.ts.map +1 -1
  3. package/dist/builder.js +7 -17
  4. package/dist/builder.js.map +1 -1
  5. package/dist/content-type-routing.d.ts +32 -0
  6. package/dist/content-type-routing.d.ts.map +1 -1
  7. package/dist/content-type-routing.js +23 -0
  8. package/dist/content-type-routing.js.map +1 -1
  9. package/dist/files-config.d.ts +34 -1
  10. package/dist/files-config.d.ts.map +1 -1
  11. package/dist/files-config.js +277 -39
  12. package/dist/files-config.js.map +1 -1
  13. package/dist/fs-attribution.d.ts +45 -0
  14. package/dist/fs-attribution.d.ts.map +1 -0
  15. package/dist/fs-attribution.js +57 -0
  16. package/dist/fs-attribution.js.map +1 -0
  17. package/dist/import.d.ts.map +1 -1
  18. package/dist/import.js +0 -4
  19. package/dist/import.js.map +1 -1
  20. package/dist/index.d.ts +13 -8
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +25 -7
  23. package/dist/index.js.map +1 -1
  24. package/dist/inventory/detectors/declared-but-missing.d.ts +1 -1
  25. package/dist/inventory/detectors/declared-but-missing.d.ts.map +1 -1
  26. package/dist/inventory/detectors/marketplace-source-missing.d.ts +1 -1
  27. package/dist/inventory/detectors/marketplace-source-missing.d.ts.map +1 -1
  28. package/dist/inventory/detectors/present-but-undeclared.d.ts +1 -1
  29. package/dist/inventory/detectors/present-but-undeclared.d.ts.map +1 -1
  30. package/dist/inventory/detectors/reference-target-missing.d.ts +1 -1
  31. package/dist/inventory/detectors/reference-target-missing.d.ts.map +1 -1
  32. package/dist/inventory/index.d.ts +1 -1
  33. package/dist/inventory/index.d.ts.map +1 -1
  34. package/dist/inventory/index.js +1 -1
  35. package/dist/inventory/index.js.map +1 -1
  36. package/dist/inventory/serialize.d.ts +4 -4
  37. package/dist/inventory/serialize.d.ts.map +1 -1
  38. package/dist/inventory/serialize.js +6 -6
  39. package/dist/inventory/serialize.js.map +1 -1
  40. package/dist/inventory/types.d.ts +8 -0
  41. package/dist/inventory/types.d.ts.map +1 -1
  42. package/dist/inventory/types.js.map +1 -1
  43. package/dist/link-graph-members.d.ts +18 -0
  44. package/dist/link-graph-members.d.ts.map +1 -0
  45. package/dist/link-graph-members.js +18 -0
  46. package/dist/link-graph-members.js.map +1 -0
  47. package/dist/parsers/frontmatter-parser.d.ts.map +1 -1
  48. package/dist/parsers/frontmatter-parser.js +30 -6
  49. package/dist/parsers/frontmatter-parser.js.map +1 -1
  50. package/dist/plugin-distribution-layout.d.ts +70 -6
  51. package/dist/plugin-distribution-layout.d.ts.map +1 -1
  52. package/dist/plugin-distribution-layout.js +84 -11
  53. package/dist/plugin-distribution-layout.js.map +1 -1
  54. package/dist/post-build-checks.d.ts +38 -1
  55. package/dist/post-build-checks.d.ts.map +1 -1
  56. package/dist/post-build-checks.js +68 -17
  57. package/dist/post-build-checks.js.map +1 -1
  58. package/dist/projection/skill-extent.d.ts +247 -0
  59. package/dist/projection/skill-extent.d.ts.map +1 -0
  60. package/dist/projection/skill-extent.js +560 -0
  61. package/dist/projection/skill-extent.js.map +1 -0
  62. package/dist/schemas/agent-skill-frontmatter.js +1 -1
  63. package/dist/schemas/agent-skill-frontmatter.js.map +1 -1
  64. package/dist/schemas/allowed-tools.d.ts +31 -0
  65. package/dist/schemas/allowed-tools.d.ts.map +1 -0
  66. package/dist/schemas/allowed-tools.js +88 -0
  67. package/dist/schemas/allowed-tools.js.map +1 -0
  68. package/dist/schemas/index.d.ts +1 -0
  69. package/dist/schemas/index.d.ts.map +1 -1
  70. package/dist/schemas/index.js +1 -0
  71. package/dist/schemas/index.js.map +1 -1
  72. package/dist/schemas/installed-plugins-registry.d.ts.map +1 -1
  73. package/dist/schemas/installed-plugins-registry.js +7 -1
  74. package/dist/schemas/installed-plugins-registry.js.map +1 -1
  75. package/dist/schemas/marketplace-manifest.d.ts.map +1 -1
  76. package/dist/schemas/marketplace-manifest.js +17 -6
  77. package/dist/schemas/marketplace-manifest.js.map +1 -1
  78. package/dist/skill-identity.d.ts +18 -3
  79. package/dist/skill-identity.d.ts.map +1 -1
  80. package/dist/skill-identity.js +25 -6
  81. package/dist/skill-identity.js.map +1 -1
  82. package/dist/skill-packager.d.ts +144 -20
  83. package/dist/skill-packager.d.ts.map +1 -1
  84. package/dist/skill-packager.js +447 -105
  85. package/dist/skill-packager.js.map +1 -1
  86. package/dist/skill-source/content-hash.d.ts.map +1 -1
  87. package/dist/skill-source/content-hash.js +21 -10
  88. package/dist/skill-source/content-hash.js.map +1 -1
  89. package/dist/skill-source/fetch-cache.d.ts.map +1 -1
  90. package/dist/skill-source/fetch-cache.js +0 -5
  91. package/dist/skill-source/fetch-cache.js.map +1 -1
  92. package/dist/skill-source/git-clone.d.ts +1 -1
  93. package/dist/skill-source/git-clone.d.ts.map +1 -1
  94. package/dist/skill-source/git-clone.js +10 -10
  95. package/dist/skill-source/git-clone.js.map +1 -1
  96. package/dist/skill-source/sources/url-source.d.ts.map +1 -1
  97. package/dist/skill-source/sources/url-source.js +2 -2
  98. package/dist/skill-source/sources/url-source.js.map +1 -1
  99. package/dist/skill-source/stage.d.ts.map +1 -1
  100. package/dist/skill-source/stage.js +0 -6
  101. package/dist/skill-source/stage.js.map +1 -1
  102. package/dist/skill-test/baseline-delta.d.ts +1575 -0
  103. package/dist/skill-test/baseline-delta.d.ts.map +1 -0
  104. package/dist/skill-test/baseline-delta.js +272 -0
  105. package/dist/skill-test/baseline-delta.js.map +1 -0
  106. package/dist/skill-test/baseline-integrity.d.ts +944 -0
  107. package/dist/skill-test/baseline-integrity.d.ts.map +1 -0
  108. package/dist/skill-test/baseline-integrity.js +3090 -0
  109. package/dist/skill-test/baseline-integrity.js.map +1 -0
  110. package/dist/skill-test/build-hook.d.ts +3 -2
  111. package/dist/skill-test/build-hook.d.ts.map +1 -1
  112. package/dist/skill-test/build-hook.js +4 -5
  113. package/dist/skill-test/build-hook.js.map +1 -1
  114. package/dist/skill-test/configure-writer.js +1 -1
  115. package/dist/skill-test/configure-writer.js.map +1 -1
  116. package/dist/skill-test/declared-env.d.ts +5 -4
  117. package/dist/skill-test/declared-env.d.ts.map +1 -1
  118. package/dist/skill-test/declared-env.js +8 -9
  119. package/dist/skill-test/declared-env.js.map +1 -1
  120. package/dist/skill-test/eval-executor.d.ts +21 -5
  121. package/dist/skill-test/eval-executor.d.ts.map +1 -1
  122. package/dist/skill-test/eval-executor.js +6 -6
  123. package/dist/skill-test/eval-executor.js.map +1 -1
  124. package/dist/skill-test/eval-fragment.d.ts +106 -28
  125. package/dist/skill-test/eval-fragment.d.ts.map +1 -1
  126. package/dist/skill-test/eval-fragment.js +78 -16
  127. package/dist/skill-test/eval-fragment.js.map +1 -1
  128. package/dist/skill-test/eval-grader.d.ts +65 -7
  129. package/dist/skill-test/eval-grader.d.ts.map +1 -1
  130. package/dist/skill-test/eval-grader.js +263 -64
  131. package/dist/skill-test/eval-grader.js.map +1 -1
  132. package/dist/skill-test/eval-inputs.d.ts +110 -8
  133. package/dist/skill-test/eval-inputs.d.ts.map +1 -1
  134. package/dist/skill-test/eval-inputs.js +177 -22
  135. package/dist/skill-test/eval-inputs.js.map +1 -1
  136. package/dist/skill-test/eval-lint.d.ts +17 -4
  137. package/dist/skill-test/eval-lint.d.ts.map +1 -1
  138. package/dist/skill-test/eval-lint.js +22 -9
  139. package/dist/skill-test/eval-lint.js.map +1 -1
  140. package/dist/skill-test/eval-suite-isolation.d.ts.map +1 -1
  141. package/dist/skill-test/eval-suite-isolation.js +8 -5
  142. package/dist/skill-test/eval-suite-isolation.js.map +1 -1
  143. package/dist/skill-test/evals-template.d.ts +1 -1
  144. package/dist/skill-test/evals-template.d.ts.map +1 -1
  145. package/dist/skill-test/evals-template.js +1 -3
  146. package/dist/skill-test/evals-template.js.map +1 -1
  147. package/dist/skill-test/executor-prompt.d.ts +15 -7
  148. package/dist/skill-test/executor-prompt.d.ts.map +1 -1
  149. package/dist/skill-test/executor-prompt.js +10 -7
  150. package/dist/skill-test/executor-prompt.js.map +1 -1
  151. package/dist/skill-test/failure-reason.d.ts +113 -0
  152. package/dist/skill-test/failure-reason.d.ts.map +1 -0
  153. package/dist/skill-test/failure-reason.js +124 -0
  154. package/dist/skill-test/failure-reason.js.map +1 -0
  155. package/dist/skill-test/fragment-merge.d.ts +3 -20
  156. package/dist/skill-test/fragment-merge.d.ts.map +1 -1
  157. package/dist/skill-test/fragment-merge.js +67 -8
  158. package/dist/skill-test/fragment-merge.js.map +1 -1
  159. package/dist/skill-test/grader-prompt.d.ts +29 -9
  160. package/dist/skill-test/grader-prompt.d.ts.map +1 -1
  161. package/dist/skill-test/grader-prompt.js +264 -68
  162. package/dist/skill-test/grader-prompt.js.map +1 -1
  163. package/dist/skill-test/grader-text.d.ts +145 -0
  164. package/dist/skill-test/grader-text.d.ts.map +1 -0
  165. package/dist/skill-test/grader-text.js +410 -0
  166. package/dist/skill-test/grader-text.js.map +1 -0
  167. package/dist/skill-test/grading-adapter.d.ts +38 -2
  168. package/dist/skill-test/grading-adapter.d.ts.map +1 -1
  169. package/dist/skill-test/grading-adapter.js +57 -9
  170. package/dist/skill-test/grading-adapter.js.map +1 -1
  171. package/dist/skill-test/grading-schema.d.ts +160 -5
  172. package/dist/skill-test/grading-schema.d.ts.map +1 -1
  173. package/dist/skill-test/grading-schema.js +66 -7
  174. package/dist/skill-test/grading-schema.js.map +1 -1
  175. package/dist/skill-test/harness-location.d.ts +3 -2
  176. package/dist/skill-test/harness-location.d.ts.map +1 -1
  177. package/dist/skill-test/harness-location.js +5 -16
  178. package/dist/skill-test/harness-location.js.map +1 -1
  179. package/dist/skill-test/index.d.ts +2 -2
  180. package/dist/skill-test/index.d.ts.map +1 -1
  181. package/dist/skill-test/index.js +2 -2
  182. package/dist/skill-test/index.js.map +1 -1
  183. package/dist/skill-test/lock.d.ts +58 -1
  184. package/dist/skill-test/lock.d.ts.map +1 -1
  185. package/dist/skill-test/lock.js +78 -6
  186. package/dist/skill-test/lock.js.map +1 -1
  187. package/dist/skill-test/pipeline.d.ts +19 -1
  188. package/dist/skill-test/pipeline.d.ts.map +1 -1
  189. package/dist/skill-test/pipeline.js +21 -10
  190. package/dist/skill-test/pipeline.js.map +1 -1
  191. package/dist/skill-test/preflight.d.ts +1 -1
  192. package/dist/skill-test/preflight.d.ts.map +1 -1
  193. package/dist/skill-test/preflight.js +59 -16
  194. package/dist/skill-test/preflight.js.map +1 -1
  195. package/dist/skill-test/prompt-invariants.d.ts +4 -2
  196. package/dist/skill-test/prompt-invariants.d.ts.map +1 -1
  197. package/dist/skill-test/prompt-invariants.js +5 -4
  198. package/dist/skill-test/prompt-invariants.js.map +1 -1
  199. package/dist/skill-test/run-harness.d.ts +665 -85
  200. package/dist/skill-test/run-harness.d.ts.map +1 -1
  201. package/dist/skill-test/run-harness.js +1522 -237
  202. package/dist/skill-test/run-harness.js.map +1 -1
  203. package/dist/skill-test/staging.d.ts +20 -8
  204. package/dist/skill-test/staging.d.ts.map +1 -1
  205. package/dist/skill-test/staging.js +25 -18
  206. package/dist/skill-test/staging.js.map +1 -1
  207. package/dist/skill-test/tier-plan.d.ts +1 -1
  208. package/dist/skill-test/tier-plan.js +1 -1
  209. package/dist/skill-test/tool-eval-schema.d.ts +6 -6
  210. package/dist/skill-test/tool-eval-schema.js +2 -2
  211. package/dist/skill-test/vendor-manifest.d.ts +2 -1
  212. package/dist/skill-test/vendor-manifest.d.ts.map +1 -1
  213. package/dist/skill-test/vendor-manifest.js +10 -10
  214. package/dist/skill-test/vendor-manifest.js.map +1 -1
  215. package/dist/test-input.d.ts +59 -8
  216. package/dist/test-input.d.ts.map +1 -1
  217. package/dist/test-input.js +64 -19
  218. package/dist/test-input.js.map +1 -1
  219. package/dist/validators/agent-instruction-presence.d.ts +1 -1
  220. package/dist/validators/agent-instruction-presence.d.ts.map +1 -1
  221. package/dist/validators/agent-instruction-presence.js +45 -2
  222. package/dist/validators/agent-instruction-presence.js.map +1 -1
  223. package/dist/validators/bundled-resource-link-detection.d.ts +6 -4
  224. package/dist/validators/bundled-resource-link-detection.d.ts.map +1 -1
  225. package/dist/validators/bundled-resource-link-detection.js +39 -39
  226. package/dist/validators/bundled-resource-link-detection.js.map +1 -1
  227. package/dist/validators/compat-detectors.d.ts +18 -1
  228. package/dist/validators/compat-detectors.d.ts.map +1 -1
  229. package/dist/validators/compat-detectors.js +47 -20
  230. package/dist/validators/compat-detectors.js.map +1 -1
  231. package/dist/validators/cross-skill-dependency-detection.d.ts +1 -1
  232. package/dist/validators/cross-skill-dependency-detection.d.ts.map +1 -1
  233. package/dist/validators/cross-skill-dependency-detection.js +1 -1
  234. package/dist/validators/cross-skill-dependency-detection.js.map +1 -1
  235. package/dist/validators/description-style-detection.d.ts +1 -1
  236. package/dist/validators/description-style-detection.d.ts.map +1 -1
  237. package/dist/validators/description-style-detection.js +1 -1
  238. package/dist/validators/description-style-detection.js.map +1 -1
  239. package/dist/validators/format-detection.d.ts +3 -0
  240. package/dist/validators/format-detection.d.ts.map +1 -1
  241. package/dist/validators/format-detection.js +41 -26
  242. package/dist/validators/format-detection.js.map +1 -1
  243. package/dist/validators/frontmatter-validation.d.ts +1 -1
  244. package/dist/validators/frontmatter-validation.d.ts.map +1 -1
  245. package/dist/validators/frontmatter-validation.js +2 -2
  246. package/dist/validators/frontmatter-validation.js.map +1 -1
  247. package/dist/validators/imperative-body-detection.d.ts +1 -1
  248. package/dist/validators/imperative-body-detection.d.ts.map +1 -1
  249. package/dist/validators/imperative-body-detection.js +1 -1
  250. package/dist/validators/imperative-body-detection.js.map +1 -1
  251. package/dist/validators/index.d.ts +1 -1
  252. package/dist/validators/index.d.ts.map +1 -1
  253. package/dist/validators/kebab-case-detection.d.ts +1 -1
  254. package/dist/validators/kebab-case-detection.d.ts.map +1 -1
  255. package/dist/validators/kebab-case-detection.js +1 -1
  256. package/dist/validators/kebab-case-detection.js.map +1 -1
  257. package/dist/validators/marketplace-validator.d.ts.map +1 -1
  258. package/dist/validators/marketplace-validator.js +7 -2
  259. package/dist/validators/marketplace-validator.js.map +1 -1
  260. package/dist/validators/mcp-tool-qualification.d.ts +158 -0
  261. package/dist/validators/mcp-tool-qualification.d.ts.map +1 -0
  262. package/dist/validators/mcp-tool-qualification.js +467 -0
  263. package/dist/validators/mcp-tool-qualification.js.map +1 -0
  264. package/dist/validators/packaged-size-limit.d.ts +296 -0
  265. package/dist/validators/packaged-size-limit.d.ts.map +1 -0
  266. package/dist/validators/packaged-size-limit.js +492 -0
  267. package/dist/validators/packaged-size-limit.js.map +1 -0
  268. package/dist/validators/packaging-validator.d.ts +149 -10
  269. package/dist/validators/packaging-validator.d.ts.map +1 -1
  270. package/dist/validators/packaging-validator.js +371 -55
  271. package/dist/validators/packaging-validator.js.map +1 -1
  272. package/dist/validators/plugin-hosted-shape.d.ts +4 -2
  273. package/dist/validators/plugin-hosted-shape.d.ts.map +1 -1
  274. package/dist/validators/plugin-hosted-shape.js +6 -7
  275. package/dist/validators/plugin-hosted-shape.js.map +1 -1
  276. package/dist/validators/plugin-recommended-fields.d.ts +1 -1
  277. package/dist/validators/plugin-recommended-fields.d.ts.map +1 -1
  278. package/dist/validators/plugin-recommended-fields.js +1 -1
  279. package/dist/validators/plugin-recommended-fields.js.map +1 -1
  280. package/dist/validators/referenced-path-missing.d.ts +211 -0
  281. package/dist/validators/referenced-path-missing.d.ts.map +1 -0
  282. package/dist/validators/referenced-path-missing.js +378 -0
  283. package/dist/validators/referenced-path-missing.js.map +1 -0
  284. package/dist/validators/registry-validator.d.ts.map +1 -1
  285. package/dist/validators/registry-validator.js +1 -2
  286. package/dist/validators/registry-validator.js.map +1 -1
  287. package/dist/validators/rule-engine/index.d.ts +1 -1
  288. package/dist/validators/rule-engine/rule-context.d.ts +20 -3
  289. package/dist/validators/rule-engine/rule-context.d.ts.map +1 -1
  290. package/dist/validators/rule-engine/rule-context.js +3 -1
  291. package/dist/validators/rule-engine/rule-context.js.map +1 -1
  292. package/dist/validators/rule-engine/rule-engine.d.ts +2 -2
  293. package/dist/validators/rule-engine/rule-engine.d.ts.map +1 -1
  294. package/dist/validators/rule-engine/rule-engine.js +52 -13
  295. package/dist/validators/rule-engine/rule-engine.js.map +1 -1
  296. package/dist/validators/skill-validator.d.ts.map +1 -1
  297. package/dist/validators/skill-validator.js +91 -54
  298. package/dist/validators/skill-validator.js.map +1 -1
  299. package/dist/validators/source-only-codes.js +1 -1
  300. package/dist/validators/source-only-codes.js.map +1 -1
  301. package/dist/validators/types.d.ts +21 -1
  302. package/dist/validators/types.d.ts.map +1 -1
  303. package/dist/validators/unified-validator.d.ts.map +1 -1
  304. package/dist/validators/unified-validator.js +4 -5
  305. package/dist/validators/unified-validator.js.map +1 -1
  306. package/dist/validators/validation-rules.d.ts +4 -4
  307. package/dist/validators/validation-rules.d.ts.map +1 -1
  308. package/dist/validators/validation-rules.js +9 -38
  309. package/dist/validators/validation-rules.js.map +1 -1
  310. package/dist/validators/walker-to-issues.d.ts +9 -3
  311. package/dist/validators/walker-to-issues.d.ts.map +1 -1
  312. package/dist/validators/walker-to-issues.js +64 -19
  313. package/dist/validators/walker-to-issues.js.map +1 -1
  314. package/dist/walk-link-graph.d.ts +64 -5
  315. package/dist/walk-link-graph.d.ts.map +1 -1
  316. package/dist/walk-link-graph.js +376 -92
  317. package/dist/walk-link-graph.js.map +1 -1
  318. package/package.json +14 -22
  319. package/dist/skill-test/exit-codes.d.ts +0 -97
  320. package/dist/skill-test/exit-codes.d.ts.map +0 -1
  321. package/dist/skill-test/exit-codes.js +0 -141
  322. package/dist/skill-test/exit-codes.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"vendor-manifest.js","sourceRoot":"","sources":["../../src/skill-test/vendor-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vendor-manifest.js","sourceRoot":"","sources":["../../src/skill-test/vendor-manifest.ts"],"names":[],"mappings":"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"}
@@ -25,9 +25,51 @@
25
25
  * This module is the ONE definition of where a skill's test input lives, shared by
26
26
  * every packaging lane, so no lane can answer the question differently.
27
27
  */
28
- import { type ValidationIssue } from '@vibe-agent-toolkit/agent-schema';
29
28
  import type { SkillPackagingConfig } from '@vibe-agent-toolkit/resources';
29
+ import { type ValidationIssue } from '@vibe-agent-toolkit/schema';
30
30
  import { type SkillFileEntry } from './files-config.js';
31
+ /**
32
+ * Answers "does this skill root carry the conventional suite at
33
+ * `<skill-root>/evals/evals.json`?" — see {@link conventionalSuiteProbe} for the
34
+ * one that memoizes, and for why its lifetime is the RUN and not longer.
35
+ */
36
+ export type ConventionalSuiteProbe = (skillDir: string) => boolean;
37
+ /**
38
+ * A probe for "does this skill carry the conventional suite at
39
+ * `<skill-root>/evals/evals.json`?", answering each directory from the filesystem
40
+ * at most once.
41
+ *
42
+ * The one filesystem touch in this module, and the reason the default convention can
43
+ * be honored without guessing from a directory name. Everything else here is pure
44
+ * path math over a config.
45
+ *
46
+ * Deduplicated because {@link resolveTestInputDirs} asks the question once for the
47
+ * subject and once per entry in `projectSkills` — and a package that keeps its
48
+ * skills in ONE directory (VAT's own `vat-development-agents` keeps thirteen there)
49
+ * makes every one of those the same question about the same path.
50
+ *
51
+ * SCOPE: one RUN, not one call. Every lane here loops over the project's skills and
52
+ * hands each of them the same project-wide `projectSkills`, so a probe scoped to the
53
+ * CALL re-asks S questions per skill and S² per run about the same S paths — and the
54
+ * memo hides that inside one call while doing nothing across the loop. Measured with
55
+ * the lab on a 103-skill adopter, `vat resources validate`: 10,815 probes over 103
56
+ * distinct paths, ~105 repeats each, and exactly 50% of that command's 21,648 user
57
+ * filesystem calls. Run-scoped it is ~103, and the command's total ~10,900.
58
+ *
59
+ * It survived because VAT's own tree cannot show it: measured on `vat audit .`, 14
60
+ * probes over 2 DISTINCT paths — 2² = 4 is invisible next to the constant factor, and
61
+ * "14 probes" reads like a rounding error rather than a complexity class. Only a tree
62
+ * with a large S separates O(S) from O(S²) here.
63
+ *
64
+ * The memo is created per run and dies with it. It deliberately is NOT module-level,
65
+ * and widening it to the run does not weaken that: this module's answer is a snapshot
66
+ * of the filesystem, and a run is the longest window over which the lanes already
67
+ * assume one snapshot — they take `projectSkills` (the project's whole skill set and
68
+ * its configs) once per run and answer every skill from it. A cache outliving the run
69
+ * would keep answering for a tree that has since changed — in a long-lived process,
70
+ * and across every later test in the same worker.
71
+ */
72
+ export declare function conventionalSuiteProbe(): ConventionalSuiteProbe;
31
73
  /** One skill's eval-suite declaration, as the PROJECT config states it. */
32
74
  export interface DeclaredEvalSuite {
33
75
  /** Absolute path to that skill's root directory (the dir holding its SKILL.md). */
@@ -46,7 +88,7 @@ export interface DeclaredEvalSuite {
46
88
  * the walker bundled it — with no exclusion and no `PACKAGED_TEST_INPUT` receipt,
47
89
  * because nothing under the subject's config named that path.
48
90
  *
49
- * Observed ACTIVE on a 90-skill adopter (2026-07-30, `vat skills build`): a built
91
+ * Observed ACTIVE on a 90-skill adopter (`vat skills build`): a built
50
92
  * bundle contained a file byte-identical to a DIFFERENT skill's real eval suite,
51
93
  * carried under that bundle's own subtree. The answer key shipped. A basename
52
94
  * collision between two such suites does not save anyone — a FILENAME_COLLISION is
@@ -69,12 +111,18 @@ export interface DeclaredEvalSuite {
69
111
  * SCOPE OF THE CROSS-SKILL HALF — another skill's suite dir travels to this build only
70
112
  * when it lies INSIDE that skill's own directory. A `test.evals` pointing at a SHARED
71
113
  * directory already strips that whole directory from the declaring skill's bundle
72
- * (issue #166); honouring it project-wide would turn one skill's over-broad
114
+ * (by design); honouring it project-wide would turn one skill's over-broad
73
115
  * declaration into a project-wide strip of a directory no single skill owns. The
74
116
  * declaring skill's own build is unchanged — the `config`/`skillDir` pair above is
75
117
  * still taken at face value — so this narrows nothing that worked before.
118
+ *
119
+ * `hasConventionalSuite` is the RUN's probe (see {@link conventionalSuiteProbe}),
120
+ * and it is REQUIRED for the same reason `projectSkills` is: a defaulted `probe?`
121
+ * would let every existing caller keep the per-call scope silently, which is the
122
+ * exact no-op this file already shipped once. A lane with no run to scope to calls
123
+ * `conventionalSuiteProbe()` at its own call site, where the narrowing is visible.
76
124
  */
77
- export declare function resolveTestInputDirs(config: Pick<SkillPackagingConfig, 'test'>, skillDir: string, projectSkills: readonly DeclaredEvalSuite[]): string[];
125
+ export declare function resolveTestInputDirs(config: Pick<SkillPackagingConfig, 'test'>, skillDir: string, projectSkills: readonly DeclaredEvalSuite[], hasConventionalSuite: ConventionalSuiteProbe): string[];
78
126
  /**
79
127
  * Exclude rules that drop any link into declared test input from the bundle.
80
128
  *
@@ -116,11 +164,14 @@ export declare function partitionTestInputFileEntries(filesConfig: readonly Skil
116
164
  * agree. The packager is the authority on what ships; this is how the read-only
117
165
  * lanes borrow its answer instead of guessing.
118
166
  *
119
- * `projectSkills` is forwarded to {@link resolveTestInputDirs}, so a `files:` entry
120
- * pointing at ANOTHER skill's declared suite is dropped here too. Required for the
121
- * same reason it is required there — see that function's note on the no-op default.
167
+ * `projectSkills` and `hasConventionalSuite` are forwarded to
168
+ * {@link resolveTestInputDirs}, so a `files:` entry pointing at ANOTHER skill's
169
+ * declared suite is dropped here too. Both are required for the same reason they are
170
+ * required there — see that function's note on the no-op default. This is the seam
171
+ * the measured quadratic ran through: `vat resources validate` calls this once per
172
+ * discovered skill, so the run's probe has to arrive from the caller's loop.
122
173
  */
123
- export declare function packagedFileEntries(config: Pick<SkillPackagingConfig, 'files' | 'test'>, skillDir: string, projectRoot: string, projectSkills: readonly DeclaredEvalSuite[]): SkillFileEntry[];
174
+ export declare function packagedFileEntries(config: Pick<SkillPackagingConfig, 'files' | 'test'>, skillDir: string, projectRoot: string, projectSkills: readonly DeclaredEvalSuite[], hasConventionalSuite: ConventionalSuiteProbe): SkillFileEntry[];
124
175
  /** A `PACKAGED_TEST_INPUT` receipt per dropped `files:` entry — a warning, not a failure. */
125
176
  export declare function testInputFileEntryIssues(dropped: readonly SkillFileEntry[]): ValidationIssue[];
126
177
  /** The shape of a walker exclusion this module needs: where it pointed, and from what link. */
@@ -1 +1 @@
1
- {"version":3,"file":"test-input.d.ts","sourceRoot":"","sources":["../src/test-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAG1E,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA0DxD,2EAA2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,EAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,SAAS,iBAAiB,EAAE,GAC1C,MAAM,EAAE,CAQV;AA2BD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,WAAW,EAAE,MAAM,GAClB,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAO/B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,SAAS,cAAc,EAAE,EACtC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B;IAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,CAWvD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,OAAO,GAAG,MAAM,CAAC,EACpD,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,SAAS,iBAAiB,EAAE,GAC1C,cAAc,EAAE,CAMlB;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,eAAe,EAAE,CAU9F;AAED,+FAA+F;AAC/F,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,WAAW,EAAE,MAAM,EACnB,YAAY,GAAE,MAAoB,GACjC,eAAe,EAAE,CAsBnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,2EAA2E;IAC3E,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,eAAe,EAAE,CAW5F"}
1
+ {"version":3,"file":"test-input.d.ts","sourceRoot":"","sources":["../src/test-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxD;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,sBAAsB,IAAI,sBAAsB,CAU/D;AA6CD,2EAA2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,EAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,SAAS,iBAAiB,EAAE,EAC3C,oBAAoB,EAAE,sBAAsB,GAC3C,MAAM,EAAE,CAQV;AA2BD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,WAAW,EAAE,MAAM,GAClB,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAO/B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,SAAS,cAAc,EAAE,EACtC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B;IAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,CAWvD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,OAAO,GAAG,MAAM,CAAC,EACpD,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,SAAS,iBAAiB,EAAE,EAC3C,oBAAoB,EAAE,sBAAsB,GAC3C,cAAc,EAAE,CAMlB;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,eAAe,EAAE,CAU9F;AAED,+FAA+F;AAC/F,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,WAAW,EAAE,MAAM,EACnB,YAAY,GAAE,MAAoB,GACjC,eAAe,EAAE,CAsBnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,2EAA2E;IAC3E,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,eAAe,EAAE,CAW5F"}
@@ -27,19 +27,55 @@
27
27
  */
28
28
  import { existsSync } from 'node:fs';
29
29
  import { dirname } from 'node:path';
30
- import { isGlob, issueLocation, safePath, staticGlobBase, toForwardSlash } from '@vibe-agent-toolkit/utils';
30
+ import { isGlob, issueLocation, relativeEscapesRoot, safePath, staticGlobBase, toForwardSlash, toForwardSlashAnyPlatform } from '@vibe-agent-toolkit/utils';
31
31
  import { DEFAULT_EVALS_SUBPATH } from './skill-test/eval-suite-isolation.js';
32
32
  import { materializeIssue } from './validators/rule-engine/index.js';
33
33
  /**
34
- * Does this skill carry the conventional suite at `<skill-root>/evals/evals.json`?
34
+ * A probe for "does this skill carry the conventional suite at
35
+ * `<skill-root>/evals/evals.json`?", answering each directory from the filesystem
36
+ * at most once.
35
37
  *
36
38
  * The one filesystem touch in this module, and the reason the default convention can
37
39
  * be honored without guessing from a directory name. Everything else here is pure
38
40
  * path math over a config.
41
+ *
42
+ * Deduplicated because {@link resolveTestInputDirs} asks the question once for the
43
+ * subject and once per entry in `projectSkills` — and a package that keeps its
44
+ * skills in ONE directory (VAT's own `vat-development-agents` keeps thirteen there)
45
+ * makes every one of those the same question about the same path.
46
+ *
47
+ * SCOPE: one RUN, not one call. Every lane here loops over the project's skills and
48
+ * hands each of them the same project-wide `projectSkills`, so a probe scoped to the
49
+ * CALL re-asks S questions per skill and S² per run about the same S paths — and the
50
+ * memo hides that inside one call while doing nothing across the loop. Measured with
51
+ * the lab on a 103-skill adopter, `vat resources validate`: 10,815 probes over 103
52
+ * distinct paths, ~105 repeats each, and exactly 50% of that command's 21,648 user
53
+ * filesystem calls. Run-scoped it is ~103, and the command's total ~10,900.
54
+ *
55
+ * It survived because VAT's own tree cannot show it: measured on `vat audit .`, 14
56
+ * probes over 2 DISTINCT paths — 2² = 4 is invisible next to the constant factor, and
57
+ * "14 probes" reads like a rounding error rather than a complexity class. Only a tree
58
+ * with a large S separates O(S) from O(S²) here.
59
+ *
60
+ * The memo is created per run and dies with it. It deliberately is NOT module-level,
61
+ * and widening it to the run does not weaken that: this module's answer is a snapshot
62
+ * of the filesystem, and a run is the longest window over which the lanes already
63
+ * assume one snapshot — they take `projectSkills` (the project's whole skill set and
64
+ * its configs) once per run and answer every skill from it. A cache outliving the run
65
+ * would keep answering for a tree that has since changed — in a long-lived process,
66
+ * and across every later test in the same worker.
39
67
  */
40
- function hasConventionalSuite(skillDir) {
41
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- skillDir is VAT's own resolved skill directory
42
- return existsSync(safePath.resolve(skillDir, DEFAULT_EVALS_SUBPATH));
68
+ export function conventionalSuiteProbe() {
69
+ const answers = new Map();
70
+ return (skillDir) => {
71
+ const suitePath = safePath.resolve(skillDir, DEFAULT_EVALS_SUBPATH);
72
+ const cached = answers.get(suitePath);
73
+ if (cached !== undefined)
74
+ return cached;
75
+ const found = existsSync(suitePath);
76
+ answers.set(suitePath, found);
77
+ return found;
78
+ };
43
79
  }
44
80
  /** True when `candidate` is inside (or equal to) `dir`. Both are absolute. */
45
81
  function isInside(candidate, dir) {
@@ -69,7 +105,7 @@ function isInside(candidate, dir) {
69
105
  * root `evals/` holding no `evals.json`. Guessing from the name alone would silently
70
106
  * drop an author's unrelated directory out of their own bundle.
71
107
  */
72
- function declaredTestInputDirs(config, skillDir) {
108
+ function declaredTestInputDirs(config, skillDir, hasConventionalSuite) {
73
109
  if (config.test === undefined && !hasConventionalSuite(skillDir))
74
110
  return [];
75
111
  const subpath = config.test?.evals ?? DEFAULT_EVALS_SUBPATH;
@@ -91,7 +127,7 @@ function declaredTestInputDirs(config, skillDir) {
91
127
  * the walker bundled it — with no exclusion and no `PACKAGED_TEST_INPUT` receipt,
92
128
  * because nothing under the subject's config named that path.
93
129
  *
94
- * Observed ACTIVE on a 90-skill adopter (2026-07-30, `vat skills build`): a built
130
+ * Observed ACTIVE on a 90-skill adopter (`vat skills build`): a built
95
131
  * bundle contained a file byte-identical to a DIFFERENT skill's real eval suite,
96
132
  * carried under that bundle's own subtree. The answer key shipped. A basename
97
133
  * collision between two such suites does not save anyone — a FILENAME_COLLISION is
@@ -114,15 +150,21 @@ function declaredTestInputDirs(config, skillDir) {
114
150
  * SCOPE OF THE CROSS-SKILL HALF — another skill's suite dir travels to this build only
115
151
  * when it lies INSIDE that skill's own directory. A `test.evals` pointing at a SHARED
116
152
  * directory already strips that whole directory from the declaring skill's bundle
117
- * (issue #166); honouring it project-wide would turn one skill's over-broad
153
+ * (by design); honouring it project-wide would turn one skill's over-broad
118
154
  * declaration into a project-wide strip of a directory no single skill owns. The
119
155
  * declaring skill's own build is unchanged — the `config`/`skillDir` pair above is
120
156
  * still taken at face value — so this narrows nothing that worked before.
157
+ *
158
+ * `hasConventionalSuite` is the RUN's probe (see {@link conventionalSuiteProbe}),
159
+ * and it is REQUIRED for the same reason `projectSkills` is: a defaulted `probe?`
160
+ * would let every existing caller keep the per-call scope silently, which is the
161
+ * exact no-op this file already shipped once. A lane with no run to scope to calls
162
+ * `conventionalSuiteProbe()` at its own call site, where the narrowing is visible.
121
163
  */
122
- export function resolveTestInputDirs(config, skillDir, projectSkills) {
123
- const dirs = new Set(declaredTestInputDirs(config, skillDir));
164
+ export function resolveTestInputDirs(config, skillDir, projectSkills, hasConventionalSuite) {
165
+ const dirs = new Set(declaredTestInputDirs(config, skillDir, hasConventionalSuite));
124
166
  for (const skill of projectSkills) {
125
- for (const dir of declaredTestInputDirs(skill.config, skill.skillDir)) {
167
+ for (const dir of declaredTestInputDirs(skill.config, skill.skillDir, hasConventionalSuite)) {
126
168
  if (isInside(dir, skill.skillDir))
127
169
  dirs.add(dir);
128
170
  }
@@ -145,7 +187,7 @@ function projectRelativeTestInputDirs(testInputDirs, projectRoot) {
145
187
  const inside = [];
146
188
  for (const dir of testInputDirs) {
147
189
  const rel = toForwardSlash(safePath.relative(projectRoot, dir));
148
- if (rel === '' || rel.startsWith('../'))
190
+ if (rel === '' || relativeEscapesRoot(rel))
149
191
  continue;
150
192
  inside.push(dir);
151
193
  }
@@ -208,18 +250,21 @@ export function partitionTestInputFileEntries(filesConfig, projectRoot, testInpu
208
250
  * agree. The packager is the authority on what ships; this is how the read-only
209
251
  * lanes borrow its answer instead of guessing.
210
252
  *
211
- * `projectSkills` is forwarded to {@link resolveTestInputDirs}, so a `files:` entry
212
- * pointing at ANOTHER skill's declared suite is dropped here too. Required for the
213
- * same reason it is required there — see that function's note on the no-op default.
253
+ * `projectSkills` and `hasConventionalSuite` are forwarded to
254
+ * {@link resolveTestInputDirs}, so a `files:` entry pointing at ANOTHER skill's
255
+ * declared suite is dropped here too. Both are required for the same reason they are
256
+ * required there — see that function's note on the no-op default. This is the seam
257
+ * the measured quadratic ran through: `vat resources validate` calls this once per
258
+ * discovered skill, so the run's probe has to arrive from the caller's loop.
214
259
  */
215
- export function packagedFileEntries(config, skillDir, projectRoot, projectSkills) {
216
- return partitionTestInputFileEntries(config.files ?? [], projectRoot, resolveTestInputDirs(config, skillDir, projectSkills)).kept;
260
+ export function packagedFileEntries(config, skillDir, projectRoot, projectSkills, hasConventionalSuite) {
261
+ return partitionTestInputFileEntries(config.files ?? [], projectRoot, resolveTestInputDirs(config, skillDir, projectSkills, hasConventionalSuite)).kept;
217
262
  }
218
263
  /** A `PACKAGED_TEST_INPUT` receipt per dropped `files:` entry — a warning, not a failure. */
219
264
  export function testInputFileEntryIssues(dropped) {
220
265
  return dropped.map((entry) => materializeIssue('PACKAGED_TEST_INPUT', {
221
- location: toForwardSlash(entry.dest),
222
- message: `files: entry "${toForwardSlash(entry.source)} -> ${toForwardSlash(entry.dest)}" points into ` +
266
+ location: toForwardSlashAnyPlatform(entry.dest),
267
+ message: `files: entry "${toForwardSlashAnyPlatform(entry.source)} -> ${toForwardSlashAnyPlatform(entry.dest)}" points into ` +
223
268
  `declared test input (some skill's test.evals) and was NOT packaged — test input, ` +
224
269
  `including the expected_output answer key, never ships to consumers.`,
225
270
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"test-input.js","sourceRoot":"","sources":["../src/test-input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-input.js","sourceRoot":"","sources":["../src/test-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAG5J,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AASrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC3C,OAAO,CAAC,QAAgB,EAAW,EAAE;QACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAS,QAAQ,CAAC,SAAiB,EAAE,GAAW;IAC9C,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAS,qBAAqB,CAC5B,MAA0C,EAC1C,QAAgB,EAChB,oBAA4C;IAE5C,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,qBAAqB,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,kFAAkF;IAClF,8EAA8E;IAC9E,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9C,CAAC;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAA0C,EAC1C,QAAgB,EAChB,aAA2C,EAC3C,oBAA4C;IAE5C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACpF,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,KAAK,MAAM,GAAG,IAAI,qBAAqB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC5F,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,4BAA4B,CACnC,aAAgC,EAChC,WAAmB;IAEnB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;QAChE,IAAI,GAAG,KAAK,EAAE,IAAI,mBAAmB,CAAC,GAAG,CAAC;YAAE,SAAS;QACrD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,aAAgC,EAChC,WAAmB;IAEnB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,4BAA4B,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,CAAC;QAC3E,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;QAChE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,6BAA6B,CAC3C,WAAsC,EACtC,WAAmB,EACnB,aAAgC;IAEhC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC/E,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QACrF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1E,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;YAC1E,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAoD,EACpD,QAAgB,EAChB,WAAmB,EACnB,aAA2C,EAC3C,oBAA4C;IAE5C,OAAO,6BAA6B,CAClC,MAAM,CAAC,KAAK,IAAI,EAAE,EAClB,WAAW,EACX,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAC5E,CAAC,IAAI,CAAC;AACT,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC3B,gBAAgB,CAAC,qBAAqB,EAAE;QACtC,QAAQ,EAAE,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/C,OAAO,EACL,iBAAiB,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB;YACpH,mFAAmF;YACnF,qEAAqE;KACxE,CAAC,CACH,CAAC;AACJ,CAAC;AAUD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAoC,EACpC,aAAgC,EAChC,WAAmB,EACnB,eAAuB,WAAW;IAElC,MAAM,YAAY,GAAG,4BAA4B,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC9E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAAE,SAAS;QACnE,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAS;QACjC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnB,MAAM,CAAC,IAAI,CACT,gBAAgB,CAAC,qBAAqB,EAAE;YACtC,QAAQ;YACR,OAAO,EACL,SAAS,GAAG,CAAC,QAAQ,IAAI,QAAQ,kDAAkD;gBACnF,qFAAqF;gBACrF,sFAAsF;gBACtF,mCAAmC;SACtC,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAWD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACvE,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7D,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACrC,gBAAgB,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CACxE,CAAC;AACJ,CAAC"}
@@ -14,7 +14,7 @@
14
14
  * tree-copies are three routes into a bundle, and only the first is visible to
15
15
  * the walker.
16
16
  */
17
- import { type ValidationIssue } from '@vibe-agent-toolkit/agent-schema';
17
+ import { type ValidationIssue } from '@vibe-agent-toolkit/schema';
18
18
  /**
19
19
  * Report every repo-internal agent-instruction file present in a distributed
20
20
  * tree.
@@ -1 +1 @@
1
- {"version":3,"file":"agent-instruction-presence.d.ts","sourceRoot":"","sources":["../../src/validators/agent-instruction-presence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAcxE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,eAAe,EAAE,CA8BnB"}
1
+ {"version":3,"file":"agent-instruction-presence.d.ts","sourceRoot":"","sources":["../../src/validators/agent-instruction-presence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAelE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,eAAe,EAAE,CA0CnB"}
@@ -15,7 +15,8 @@
15
15
  * the walker.
16
16
  */
17
17
  import { existsSync } from 'node:fs';
18
- import { crawlDirectorySync, issueLocation, safePath } from '@vibe-agent-toolkit/utils';
18
+ import { issueLocation, safePath, transientRefusalClause } from '@vibe-agent-toolkit/utils';
19
+ import { crawlDirectorySync } from '@vibe-agent-toolkit/utils/crawl';
19
20
  import { normalizeRelPath } from '../files-config.js';
20
21
  import { materializeIssue } from './rule-engine/index.js';
21
22
  import { AGENT_INSTRUCTION_FILE_PATTERNS, toAnyDepthGlobs } from './validation-rules.js';
@@ -47,7 +48,6 @@ const INCLUDE_GLOBS = toAnyDepthGlobs(AGENT_INSTRUCTION_FILE_PATTERNS);
47
48
  * dest must not launder its whole subtree (see {@link explicitFilesConfigDests}).
48
49
  */
49
50
  export function detectPackagedAgentInstructionFiles(rootDir, locationRoot, declaredDests) {
50
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- rootDir is a validated build-output path
51
51
  if (!existsSync(rootDir))
52
52
  return [];
53
53
  const declared = new Set(declaredDests.map((d) => normalizeRelPath(d)));
@@ -55,6 +55,15 @@ export function detectPackagedAgentInstructionFiles(rootDir, locationRoot, decla
55
55
  // subject is BUILT output, which normally lives under a gitignored `dist/`
56
56
  // that the crawler's defaults would skip entirely — the scan would pass by
57
57
  // scanning nothing.
58
+ //
59
+ // `unreadable` DEGRADES rather than stops: this detector is a backstop
60
+ // appended to a larger report (audit, verify, build), and one directory it
61
+ // cannot list must not destroy every finding beside it. The gap is not
62
+ // dropped either — each refusal becomes a `SCAN_PATH_UNREADABLE` finding
63
+ // below, anchored like the others, so a reader sees exactly which subtree
64
+ // this pass never saw. The crawler used to hand back the shorter list here
65
+ // with nothing said; that was the defect, not the throw.
66
+ const refusals = [];
58
67
  const files = crawlDirectorySync({
59
68
  baseDir: rootDir,
60
69
  include: INCLUDE_GLOBS,
@@ -62,6 +71,7 @@ export function detectPackagedAgentInstructionFiles(rootDir, locationRoot, decla
62
71
  absolute: true,
63
72
  filesOnly: true,
64
73
  respectGitignore: false,
74
+ unreadable: { degrade: (refusal) => refusals.push(refusal) },
65
75
  });
66
76
  const issues = [];
67
77
  for (const file of files) {
@@ -74,6 +84,39 @@ export function detectPackagedAgentInstructionFiles(rootDir, locationRoot, decla
74
84
  const location = issueLocation(file, locationRoot);
75
85
  issues.push(materializeIssue('PACKAGED_AGENT_INSTRUCTION_FILE', { location, detail: location }));
76
86
  }
87
+ for (const refusal of refusals) {
88
+ issues.push(unlistableDirectoryIssue(refusal, locationRoot));
89
+ }
77
90
  return issues;
78
91
  }
92
+ /**
93
+ * The finding for one directory this pass could not list.
94
+ *
95
+ * `SCAN_PATH_UNREADABLE` is the registry's existing code for exactly this shape
96
+ * ("was not scanned; findings from every readable sibling are still reported"),
97
+ * kept at its default `warning` — a second code for the same gap on a second
98
+ * lane would only split the count a reader greps for. The detail names the
99
+ * errno, which is what distinguishes a permissions problem from a descriptor
100
+ * shortage, and the location is anchored against `locationRoot` like every
101
+ * other finding here — `.` rather than `''` when the scanned tree itself
102
+ * refused, for the same reason `unreadablePathResult` in the audit command
103
+ * gives: an empty location reached the report as `location: ""` and rendered
104
+ * the detail as a bare `": EACCES …"`.
105
+ *
106
+ * ⚠️ Callers that ALSO walk this tree themselves (the audit command's
107
+ * directory scan) will meet the same refusal twice. That overlap is theirs to
108
+ * collapse, keyed on what this issue carries — code and location — because
109
+ * only the caller knows which of its lanes reached the directory; see
110
+ * `dedupeUnreadablePathResults` in the audit command.
111
+ */
112
+ function unlistableDirectoryIssue(refusal, locationRoot) {
113
+ const location = issueLocation(refusal.directory, locationRoot) || '.';
114
+ const clause = refusal.transient
115
+ ? `${transientRefusalClause(refusal.code)} — re-run before investigating anything`
116
+ : `listing was refused with ${refusal.code}`;
117
+ return materializeIssue('SCAN_PATH_UNREADABLE', {
118
+ location,
119
+ detail: `${location}: ${clause}; every agent-instruction file beneath it is unreported`,
120
+ });
121
+ }
79
122
  //# sourceMappingURL=agent-instruction-presence.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-instruction-presence.js","sourceRoot":"","sources":["../../src/validators/agent-instruction-presence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAExF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,+BAA+B,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEzF;;;GAGG;AACH,MAAM,aAAa,GAAG,eAAe,CAAC,+BAA+B,CAAC,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,mCAAmC,CACjD,OAAe,EACf,YAAoB,EACpB,aAAgC;IAEhC,+GAA+G;IAC/G,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAExE,8EAA8E;IAC9E,2EAA2E;IAC3E,2EAA2E;IAC3E,oBAAoB;IACpB,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,KAAK;KACxB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,gFAAgF;QAChF,qEAAqE;QACrE,2EAA2E;QAC3E,4EAA4E;QAC5E,IAAI,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAAE,SAAS;QAC/E,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,iCAAiC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"agent-instruction-presence.js","sourceRoot":"","sources":["../../src/validators/agent-instruction-presence.ts"],"names":[],"mappings":"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"}
@@ -27,12 +27,14 @@
27
27
  * or when link traversal reached it. Fenced code blocks are deliberately NOT
28
28
  * parsed out: that approach was tried and rejected as too fragile.
29
29
  */
30
- import { type ValidationIssue } from '@vibe-agent-toolkit/agent-schema';
30
+ import { type ValidationIssue } from '@vibe-agent-toolkit/schema';
31
31
  /**
32
- * @param skillPath Absolute path to SKILL.md
33
- * @param skillDir Absolute path to the skill directory (typically dirname(skillPath))
32
+ * @param body The SKILL.md text the caller already holds — the validator read it
33
+ * once at its entry, and a second best-effort read here used to turn a refused
34
+ * read into an empty body, i.e. into "nothing mentions these files"
35
+ * @param skillDir Absolute path to the skill directory
34
36
  * @param linkedFiles Absolute paths of files reached during BFS link traversal
35
37
  * @param locationRoot Root the emitted `location` is expressed relative to
36
38
  */
37
- export declare function detectBundledResourceWithoutLinks(skillPath: string, skillDir: string, linkedFiles: readonly string[], locationRoot: string): ValidationIssue[];
39
+ export declare function detectBundledResourceWithoutLinks(body: string, skillDir: string, linkedFiles: readonly string[], locationRoot: string): ValidationIssue[];
38
40
  //# sourceMappingURL=bundled-resource-link-detection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bundled-resource-link-detection.d.ts","sourceRoot":"","sources":["../../src/validators/bundled-resource-link-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAOH,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAC;AA4EvF;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CAgCnB"}
1
+ {"version":3,"file":"bundled-resource-link-detection.d.ts","sourceRoot":"","sources":["../../src/validators/bundled-resource-link-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AA6EjF;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CA8BnB"}
@@ -27,11 +27,9 @@
27
27
  * or when link traversal reached it. Fenced code blocks are deliberately NOT
28
28
  * parsed out: that approach was tried and rejected as too fragile.
29
29
  */
30
- /* eslint-disable security/detect-non-literal-fs-filename -- skill paths validated upstream */
31
- import { existsSync, readFileSync, readdirSync } from 'node:fs';
32
- import { dirname } from 'node:path';
33
- import { CODE_REGISTRY } from '@vibe-agent-toolkit/agent-schema';
34
- import { issueLocation, safePath } from '@vibe-agent-toolkit/utils';
30
+ import { readdirSync } from 'node:fs';
31
+ import { CODE_REGISTRY } from '@vibe-agent-toolkit/schema';
32
+ import { direntKindFollowingSync, FollowedWalk, isPathAbsentError, issueLocation, safePath } from '@vibe-agent-toolkit/utils';
35
33
  import { CLAUDE_WEB_REFERENCES_SUBDIR, TARGET_SUBDIR_CATEGORIES } from '../content-type-routing.js';
36
34
  /**
37
35
  * Subdirectories a packaged skill may bundle resources into.
@@ -46,37 +44,39 @@ const BUNDLED_SUBDIRS = [
46
44
  ];
47
45
  /** How many dead file names the message spells out before summarising. */
48
46
  const MAX_LISTED_FILES = 5;
49
- /** Read SKILL.md content (best-effort) — empty string if unreadable. */
50
- function readSkillContent(skillPath) {
51
- try {
52
- return readFileSync(skillPath, 'utf-8');
53
- }
54
- catch {
55
- return '';
56
- }
57
- }
58
47
  /**
59
48
  * Every file under `dir`, recursively, as paths relative to `baseDir`
60
- * (forward-slash normalised by safePath). Empty when `dir` is absent,
61
- * unreadable, or contains no files.
49
+ * (forward-slash normalised by safePath). Empty when `dir` is absent or
50
+ * contains no files. A directory that is there and REFUSED throws: `[]` is
51
+ * this check's "nothing bundled, nothing to say", and a listing the OS would
52
+ * not hand over has not established that.
62
53
  */
63
- function listFilesRelative(dir, baseDir) {
64
- if (!existsSync(dir))
65
- return [];
66
- const found = [];
54
+ function listFilesRelative(dir, baseDir, walk) {
55
+ let entries;
67
56
  try {
68
- for (const entry of readdirSync(dir, { withFileTypes: true })) {
69
- const child = safePath.join(dir, entry.name);
70
- if (entry.isFile()) {
71
- found.push(safePath.relative(baseDir, child));
72
- }
73
- else if (entry.isDirectory()) {
74
- found.push(...listFilesRelative(child, baseDir));
75
- }
76
- }
57
+ entries = readdirSync(dir, { withFileTypes: true });
58
+ }
59
+ catch (error) {
60
+ if (isPathAbsentError(error))
61
+ return [];
62
+ throw error;
77
63
  }
78
- catch {
79
- return [];
64
+ const guard = walk ?? new FollowedWalk();
65
+ if (walk === undefined)
66
+ guard.enter(dir);
67
+ const found = [];
68
+ for (const entry of entries) {
69
+ const child = safePath.join(dir, entry.name);
70
+ // Followed: a linked resource is a bundled resource for link purposes. A
71
+ // link back into the tree is refused by the walk guard, not recursed.
72
+ const kind = direntKindFollowingSync(dir, entry);
73
+ if (kind === 'file') {
74
+ found.push(safePath.relative(baseDir, child));
75
+ }
76
+ else if (kind === 'directory') {
77
+ guard.enter(child);
78
+ found.push(...listFilesRelative(child, baseDir, guard));
79
+ }
80
80
  }
81
81
  return found;
82
82
  }
@@ -102,22 +102,22 @@ function summariseFiles(relPaths) {
102
102
  return hidden > 0 ? `${shown} (and ${hidden} more)` : shown;
103
103
  }
104
104
  /**
105
- * @param skillPath Absolute path to SKILL.md
106
- * @param skillDir Absolute path to the skill directory (typically dirname(skillPath))
105
+ * @param body The SKILL.md text the caller already holds — the validator read it
106
+ * once at its entry, and a second best-effort read here used to turn a refused
107
+ * read into an empty body, i.e. into "nothing mentions these files"
108
+ * @param skillDir Absolute path to the skill directory
107
109
  * @param linkedFiles Absolute paths of files reached during BFS link traversal
108
110
  * @param locationRoot Root the emitted `location` is expressed relative to
109
111
  */
110
- export function detectBundledResourceWithoutLinks(skillPath, skillDir, linkedFiles, locationRoot) {
112
+ export function detectBundledResourceWithoutLinks(body, skillDir, linkedFiles, locationRoot) {
111
113
  const issues = [];
112
- const body = readSkillContent(skillPath);
113
- const baseDir = skillDir.length > 0 ? skillDir : dirname(skillPath);
114
114
  const linked = new Set(linkedFiles.map((f) => safePath.resolve(f)));
115
115
  for (const sub of BUNDLED_SUBDIRS) {
116
- const subPath = safePath.join(baseDir, sub);
117
- const bundled = listFilesRelative(subPath, baseDir);
116
+ const subPath = safePath.join(skillDir, sub);
117
+ const bundled = listFilesRelative(subPath, skillDir);
118
118
  if (bundled.length === 0)
119
119
  continue;
120
- const unreferenced = bundled.filter((rel) => !bodyMentionsFile(body, rel) && !linkedFilesCoverFile(linked, safePath.join(baseDir, rel)));
120
+ const unreferenced = bundled.filter((rel) => !bodyMentionsFile(body, rel) && !linkedFilesCoverFile(linked, safePath.join(skillDir, rel)));
121
121
  if (unreferenced.length === 0)
122
122
  continue;
123
123
  const entry = CODE_REGISTRY.SKILL_REFERENCES_BUT_NO_LINKS;
@@ -1 +1 @@
1
- {"version":3,"file":"bundled-resource-link-detection.js","sourceRoot":"","sources":["../../src/validators/bundled-resource-link-detection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bundled-resource-link-detection.js","sourceRoot":"","sources":["../../src/validators/bundled-resource-link-detection.ts"],"names":[],"mappings":"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"}
@@ -9,12 +9,29 @@
9
9
  * Pattern IDs MUST be registered in PATTERN_REGISTRY (assertPatternRegistered
10
10
  * is called against every emitted record).
11
11
  */
12
- import { type ValidationIssue } from '@vibe-agent-toolkit/agent-schema';
12
+ import { type ValidationIssue } from '@vibe-agent-toolkit/schema';
13
13
  import type { EvidenceRecord, Observation } from '../evidence/index.js';
14
14
  export interface DetectorOutput {
15
15
  evidence: EvidenceRecord[];
16
16
  observations: Observation[];
17
17
  }
18
+ /**
19
+ * The `allowed-tools:` declarations a SKILL.md carries and the 1-based line of
20
+ * the key; `{ tools: [], line: 0 }` when the key is absent or the frontmatter
21
+ * does not parse (the skill validator names that file
22
+ * `SKILL_MISSING_FRONTMATTER` on the same run — nothing is read out of it here).
23
+ *
24
+ * 🚩 This used to be a hand parser that saw ONLY the `[…]` flow form and split
25
+ * it on commas. Claude Code's documented spelling is space-separated, and a
26
+ * block sequence is valid YAML, so `allowed-tools: Read Bash` and a `- Bash`
27
+ * list both read as NO declaration and the local-shell capability reported
28
+ * clean over them. The value now goes through the same `parseFrontmatter` the
29
+ * validator uses and the same `allowedToolsOf` the settings-compat checker uses.
30
+ */
31
+ export declare function allowedToolsDeclarations(content: string): {
32
+ tools: string[];
33
+ line: number;
34
+ };
18
35
  export declare function collectLocalShellEvidence(content: string, filePath: string, locationRoot: string): EvidenceRecord[];
19
36
  export declare function collectExternalCLIEvidence(content: string, filePath: string, locationRoot: string): EvidenceRecord[];
20
37
  export declare function collectBrowserAuthEvidence(content: string, filePath: string, locationRoot: string): EvidenceRecord[];
@@ -1 +1 @@
1
- {"version":3,"file":"compat-detectors.d.ts","sourceRoot":"","sources":["../../src/validators/compat-detectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAiC,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEvG,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA2BxE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AA6CD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,cAAc,EAAE,CAkDlB;AASD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,cAAc,EAAE,CA6BlB;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,cAAc,EAAE,CAgBlB;AAQD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,WAAW,EAAE,CAKrF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAWtF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,cAAc,CAQhB"}
1
+ {"version":3,"file":"compat-detectors.d.ts","sourceRoot":"","sources":["../../src/validators/compat-detectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAiC,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAEjG,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA8BxE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AA6BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAgB3F;AAYD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,cAAc,EAAE,CAkDlB;AASD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,cAAc,EAAE,CA6BlB;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,cAAc,EAAE,CAgBlB;AAQD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,WAAW,EAAE,CAKrF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAWtF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,cAAc,CAQhB"}