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

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 (33) hide show
  1. package/dist/post-build-checks.js +3 -3
  2. package/dist/post-build-checks.js.map +1 -1
  3. package/dist/skill-packager.d.ts +13 -0
  4. package/dist/skill-packager.d.ts.map +1 -1
  5. package/dist/skill-packager.js +66 -21
  6. package/dist/skill-packager.js.map +1 -1
  7. package/dist/skill-test/run-harness.d.ts.map +1 -1
  8. package/dist/skill-test/run-harness.js +17 -1
  9. package/dist/skill-test/run-harness.js.map +1 -1
  10. package/dist/test-input.d.ts.map +1 -1
  11. package/dist/test-input.js +30 -7
  12. package/dist/test-input.js.map +1 -1
  13. package/dist/validators/packaging-validator.d.ts +12 -1
  14. package/dist/validators/packaging-validator.d.ts.map +1 -1
  15. package/dist/validators/packaging-validator.js +53 -20
  16. package/dist/validators/packaging-validator.js.map +1 -1
  17. package/dist/validators/rule-engine/rule-context.d.ts +17 -0
  18. package/dist/validators/rule-engine/rule-context.d.ts.map +1 -1
  19. package/dist/validators/rule-engine/rule-context.js +2 -0
  20. package/dist/validators/rule-engine/rule-context.js.map +1 -1
  21. package/dist/validators/rule-engine/rule-engine.d.ts.map +1 -1
  22. package/dist/validators/rule-engine/rule-engine.js +28 -0
  23. package/dist/validators/rule-engine/rule-engine.js.map +1 -1
  24. package/dist/validators/skill-validator.js +2 -2
  25. package/dist/validators/skill-validator.js.map +1 -1
  26. package/dist/validators/walker-to-issues.d.ts.map +1 -1
  27. package/dist/validators/walker-to-issues.js +11 -0
  28. package/dist/validators/walker-to-issues.js.map +1 -1
  29. package/dist/walk-link-graph.d.ts +38 -4
  30. package/dist/walk-link-graph.d.ts.map +1 -1
  31. package/dist/walk-link-graph.js +292 -84
  32. package/dist/walk-link-graph.js.map +1 -1
  33. package/package.json +6 -6
@@ -8,11 +8,33 @@
8
8
  * Non-markdown assets (images, JSON, etc.) won't be in the registry and still
9
9
  * require `existsSync()` checks — this is acceptable since the goal is eliminating
10
10
  * redundant I/O for markdown files that are already parsed.
11
+ *
12
+ * ## Membership is not traversability
13
+ *
14
+ * A registry MEMBER is a file VAT has parsed: its links are known, so the
15
+ * packager's rewriter can reach inside it and repoint them at bundled copies. A
16
+ * ROUTABLE file is one the walker walks THROUGH — it enqueues that file's link
17
+ * targets as further bundle members. Routing is markdown-only
18
+ * ({@link isRoutable}); HTML is "a leaf we can read, not a door we walk
19
+ * through".
20
+ *
21
+ * These used to be the same thing, by accident: any link target that
22
+ * `getResourceById` found was queued, so a registry's include globs silently
23
+ * WERE the routability policy. The two production registries disagreed as a
24
+ * result. `crawlAndResolveRegistry` includes HTML, so `vat audit` and
25
+ * post-build validation walked THROUGH a bundled page and counted its targets
26
+ * as bundled; the packager's `createProjectRegistry` is markdown-only, so at
27
+ * walk time the same page was an opaque asset and its targets were dropped.
28
+ * Same tree, two answers to "is HTML a door" — and audit's answer described a
29
+ * bundle the build never produced.
30
+ *
31
+ * Links out of a non-routable member are not silently dropped: each one whose
32
+ * target the walk never bundled by some other route is reported as a
33
+ * `non-routable-source` exclusion (`LINK_FROM_NON_ROUTABLE_FILE`).
11
34
  */
12
- import { existsSync, statSync } from 'node:fs';
13
35
  import { basename, dirname } from 'node:path';
14
- import { isLocalFileLink, resolveLocalHref } from '@vibe-agent-toolkit/resources';
15
- import { isGitIgnored, toForwardSlash, safePath } from '@vibe-agent-toolkit/utils';
36
+ import { isLocalFileLink, parserKindForPath, resolveLocalHref } from '@vibe-agent-toolkit/resources';
37
+ import { FsLookupCache, isGitIgnored, toForwardSlash, safePath } from '@vibe-agent-toolkit/utils';
16
38
  import picomatch from 'picomatch';
17
39
  import { isAgentInstructionBasename, isNavigationBasename } from './validators/validation-rules.js';
18
40
  // ============================================================================
@@ -69,15 +91,28 @@ function makeExclusion(targetPath, sourcePath, targetExists, reason, link, match
69
91
  };
70
92
  }
71
93
  /**
72
- * Check if a target path is a not-yet-materialized deferred build artifact, and
73
- * record it in the deferred set if so. Must run BEFORE any statSync / directory
74
- * check to avoid blowing up on missing paths.
94
+ * Build the pass-1′ row for one link target.
95
+ *
96
+ * The two syscalls come from {@link FsLookupCache.probe}, which memoizes them
97
+ * across links, so repeated calls for the same path are free of I/O.
98
+ */
99
+ function fillPathFacts(targetPath, options, state) {
100
+ const { exists, isDirectory } = state.pathProbe.probe(targetPath);
101
+ return {
102
+ exists,
103
+ isDirectory,
104
+ insideProject: !isOutsideProject(targetPath, options.projectRoot),
105
+ };
106
+ }
107
+ /**
108
+ * Check if a target path is a not-yet-materialized deferred build artifact.
109
+ * Must run BEFORE any directory check to avoid classifying a missing path.
75
110
  *
76
111
  * This check is gated on the target NOT existing on disk: it classifies the
77
112
  * "hasn't been built yet" half of the deferred-artifact lifecycle. An
78
113
  * existing real file at a covered files: dest (or source) is NOT deferred by
79
114
  * THIS check — it falls through to the directory-target check and beyond.
80
- * The gitignore branch further down in {@link checkExclusions} carries its
115
+ * The gitignore branch further down ({@link classifyGitignored}) carries its
81
116
  * OWN, unconditional `deferredArtifacts` exemption (existing or not) for the
82
117
  * "already built, and gitignored as expected" half — see the comment there.
83
118
  * So an existing-but-gitignored covered path still ends up classified as
@@ -85,17 +120,12 @@ function makeExclusion(targetPath, sourcePath, targetExists, reason, link, match
85
120
  * existing-and-NOT-gitignored covered path (or an uncovered path) reaches
86
121
  * normal handling. {@link DeferredArtifacts.covers} does the exact-OR-
87
122
  * directory-prefix membership test (pure, no filesystem access); the
88
- * existence answer is supplied by the caller, which probes the target once
89
- * for the whole classifier.
123
+ * existence answer comes from the target's pass-1′ row.
90
124
  *
91
125
  * @returns true if the path was classified as deferred
92
126
  */
93
- function checkDeferred(targetPath, targetExists, deferredArtifacts, deferredAssetSet) {
94
- if (deferredArtifacts.covers(targetPath) && !targetExists) {
95
- deferredAssetSet.add(toForwardSlash(targetPath));
96
- return true;
97
- }
98
- return false;
127
+ function checkDeferred(targetPath, targetExists, deferredArtifacts) {
128
+ return deferredArtifacts.covers(targetPath) && !targetExists;
99
129
  }
100
130
  /**
101
131
  * Does the walker refuse to bundle this target because it is a repo-internal
@@ -141,8 +171,8 @@ function refusesAgentInstructionFile(targetPath, options) {
141
171
  return !declaredSources.has(toForwardSlash(safePath.relative(options.projectRoot, targetPath)));
142
172
  }
143
173
  /**
144
- * Record a gitignored target as either a leak or an exempted `files:` build
145
- * artifact — the caller always excludes it from the walk either way; only
174
+ * Classify a target already known to be gitignored as either a leak or an
175
+ * exempted `files:` build artifact — the walk excludes it either way; only
146
176
  * the record differs.
147
177
  *
148
178
  * A files:-declared DEST is exempt from the leak rule EVEN WHEN it already
@@ -161,18 +191,13 @@ function refusesAgentInstructionFile(targetPath, options) {
161
191
  * coverage must NOT exempt it. An uncovered path, or a path covered only via
162
192
  * `sourcePaths`, still reports the leak normally.
163
193
  */
164
- function recordGitignoredTarget(targetPath, sourcePath, link, deferredArtifacts, excludedReferences, deferredAssetSet) {
165
- if (deferredArtifacts?.coversDest(targetPath)) {
166
- deferredAssetSet.add(toForwardSlash(targetPath));
167
- return;
168
- }
169
- // `targetExists: true` is not an assumption here — the caller only reaches
170
- // this function for a target it has already stat'ed and found present.
171
- excludedReferences.push(makeExclusion(targetPath, sourcePath, true, 'gitignored', link));
194
+ function classifyGitignoredTarget(targetPath, deferredArtifacts) {
195
+ return deferredArtifacts?.coversDest(targetPath)
196
+ ? { kind: 'deferred' }
197
+ : { kind: 'excluded', reason: 'gitignored' };
172
198
  }
173
199
  /**
174
- * The gitignore branch of {@link checkExclusions}, extracted to keep that
175
- * classifier within its cognitive-complexity budget.
200
+ * The `files:`-dest exemption for a target already known to be gitignored.
176
201
  *
177
202
  * GATED ON EXISTENCE, and the gate is the point. A path that is not there
178
203
  * cannot leak anything, and neither ignore oracle can be trusted to say so:
@@ -187,69 +212,118 @@ function recordGitignoredTarget(targetPath, sourcePath, link, deferredArtifacts,
187
212
  * Prefer the pre-populated GitTracker when the caller plumbed one through: it
188
213
  * answers in O(1) against the active set, no `git check-ignore` spawn.
189
214
  *
190
- * @returns true if the target was recorded (as a leak, or as an exempted
191
- * `files:` build artifact) and the caller should stop classifying
215
+ * **Memoized per walk**, so a target named by many documents costs one answer
216
+ * rather than one per reference. The memo cannot change the answer: both
217
+ * oracles are pure functions of the tree, and the memo's lifetime is one walk.
218
+ *
219
+ * ⛔ **Measured on VAT's own tree, 2026-08-09, and the result is a NEGATIVE —
220
+ * do not sell this as a performance win.** Counting asks vs. memo misses in the
221
+ * built lane: `vat audit .` = 3 asks / 2 distinct, `vat skills build` = 0 / 0,
222
+ * `vat inventory .` = 0 / 0. **One** oracle call avoided across all three.
223
+ *
224
+ * The reason is structural, not incidental: this branch is LAST in the cascade,
225
+ * so a target only reaches it after surviving all seven earlier discriminators
226
+ * *and* existing on disk. Nearly every link target is classified before then —
227
+ * bundled markdown, a directory, a navigation file, a pattern match. The memo's
228
+ * real justification is therefore **shape, not speed**: it is what lets the
229
+ * oracle read sit outside {@link classifyExclusion} so that function can be a
230
+ * pure predicate over the row. Any future claim of a spawn-count win needs its
231
+ * own measurement on a corpus where this branch is actually hot.
232
+ *
233
+ * Two further bounds, so nobody reads more into it than it does:
234
+ *
235
+ * - **The collapse is within-ONE-walk fan-in only.** `collectLinkedFiles` calls
236
+ * {@link walkLinkGraph} once per skill, so a target shared across skills is
237
+ * still asked about once per skill. That per-walk lifetime is exactly what
238
+ * makes the memo safe against `packageSkill` writing `dist/` between skills,
239
+ * so it is a deliberate ceiling, not a missed optimization.
240
+ * - **Not every repeat was a subprocess.** {@link isGitIgnored} settles "is
241
+ * there a repository here?" from the filesystem and returns early when there
242
+ * is none, so on a tree with no `.git` ancestor the repeats were ancestor
243
+ * walks rather than `git check-ignore` spawns. Inside a real repository they
244
+ * were spawns.
245
+ *
246
+ * @returns whether the target is gitignored
192
247
  */
193
- function checkGitignored(targetPath, sourcePath, targetExists, link, options, excludedReferences, deferredAssetSet) {
194
- if (!targetExists) {
195
- return false;
196
- }
248
+ function readGitignored(targetPath, options, state) {
249
+ const cached = state.gitignoreFacts.get(targetPath);
250
+ if (cached !== undefined)
251
+ return cached;
197
252
  const isIgnored = options.gitTracker === undefined
198
253
  ? isGitIgnored(targetPath, options.projectRoot)
199
254
  : options.gitTracker.isIgnoredByActiveSet(targetPath);
200
- if (!isIgnored) {
201
- return false;
202
- }
203
- recordGitignoredTarget(targetPath, sourcePath, link, options.deferredArtifacts, excludedReferences, deferredAssetSet);
204
- return true;
255
+ state.gitignoreFacts.set(targetPath, isIgnored);
256
+ return isIgnored;
205
257
  }
206
258
  /**
207
- * Check if a target path should be excluded for structural reasons
208
- * (deferred build artifact, directory, outside project, navigation file, or
209
- * pattern match).
259
+ * The `exists` × `isDirectory` corner of the cascade — the only place the row's
260
+ * three-state `isDirectory` is read.
210
261
  *
211
- * @returns true if the link was excluded or deferred (caller should skip to next link)
262
+ * `null` means *no answer about the kind*: the path is present to `existsSync`
263
+ * and unstattable anyway (a permissions problem, or a change racing the two
264
+ * calls). The classifier can say nothing about WHAT the target is — but it can
265
+ * say that the target is there and could not be read, and that is the report.
266
+ *
267
+ * ✅ **This used to skip silently, and that was D6 in the spec's deferred-fixes
268
+ * ledger — now fixed.** `{ kind: 'skipped' }` recorded nothing at all, so an
269
+ * unreadable link target vanished from the report entirely: no exclusion, no
270
+ * bundling, no issue. It survived the pass-1′ refactor only because that
271
+ * refactor was held to byte-identical output (it is what the pre-refactor
272
+ * `catch { return true }` did). Meanwhile the resources lane turned the
273
+ * IDENTICAL class of read failure into a `RESOURCE_UNREADABLE` finding, so one
274
+ * unreadable file got two answers depending on which lane found it. It is now
275
+ * an `unreadable-target` exclusion, which the verdict engine reports as
276
+ * `LINK_TARGET_UNREADABLE` — the resources code's skill-packaging sibling.
277
+ *
278
+ * @returns a verdict when the path's kind decides the outcome, else `undefined`
279
+ */
280
+ function classifyPathKind(facts) {
281
+ if (!facts.exists)
282
+ return undefined;
283
+ if (facts.isDirectory === true)
284
+ return { kind: 'excluded', reason: 'directory-target' };
285
+ if (facts.isDirectory === null)
286
+ return { kind: 'excluded', reason: 'unreadable-target' };
287
+ return undefined;
288
+ }
289
+ /**
290
+ * The first-match-wins exclusion cascade, as a **pure function of the pass-1′
291
+ * row**. No filesystem access, no walk-state mutation, no recording.
292
+ *
293
+ * ⚠️ **The order IS the behaviour.** This is a cascade, not a set of
294
+ * independent predicates: a directory that is also pattern-matched is reported
295
+ * as `directory-target`, and rewriting it as `reasons.find(...)` over
296
+ * independently-evaluated conditions would silently repick which reason wins.
297
+ * Every branch below sits exactly where it sat when the classifier did its own
298
+ * I/O inline; only the source of the facts changed.
299
+ *
300
+ * The one branch that is not a column is the last one — see
301
+ * {@link readGitignored} for why the gitignore oracle is demand-read at the
302
+ * point the cascade reaches it rather than filled for every row.
303
+ *
304
+ * @returns the verdict, or `undefined` when nothing excludes the target
212
305
  */
213
- function checkExclusions(targetPath, sourcePath, link, options, excludeMatchers, excludedReferences, deferredAssetSet) {
214
- // ONE existence probe for the whole classifier. Several branches below are
215
- // meaningful only for a target that is actually there, and one of them
216
- // (gitignore) is actively WRONG without it — see the comment on that branch.
217
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- Path from parsed markdown
218
- const targetExists = existsSync(targetPath);
306
+ function classifyExclusion(targetPath, options, excludeMatchers, facts) {
219
307
  // The deferred check is the FIRST discriminator: a not-yet-materialized target
220
308
  // must be classified before any check that would read it off disk.
221
- if (options.deferredArtifacts && checkDeferred(targetPath, targetExists, options.deferredArtifacts, deferredAssetSet)) {
222
- return true;
309
+ if (options.deferredArtifacts && checkDeferred(targetPath, facts.exists, options.deferredArtifacts)) {
310
+ return { kind: 'deferred' };
223
311
  }
224
312
  // Check if target is a directory
225
- if (targetExists) {
226
- try {
227
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- Path from parsed markdown
228
- if (statSync(targetPath).isDirectory()) {
229
- excludedReferences.push(makeExclusion(targetPath, sourcePath, targetExists, 'directory-target', link));
230
- return true;
231
- }
232
- }
233
- catch {
234
- // statSync failure = skip
235
- return true;
236
- }
237
- }
313
+ const kindVerdict = classifyPathKind(facts);
314
+ if (kindVerdict)
315
+ return kindVerdict;
238
316
  // Check project boundary
239
- if (isOutsideProject(targetPath, options.projectRoot)) {
240
- excludedReferences.push(makeExclusion(targetPath, sourcePath, targetExists, 'outside-project', link));
241
- return true;
242
- }
317
+ if (!facts.insideProject)
318
+ return { kind: 'excluded', reason: 'outside-project' };
243
319
  // Check navigation file exclusion
244
320
  if (options.excludeNavigationFiles && isNavigationBasename(basename(targetPath))) {
245
- excludedReferences.push(makeExclusion(targetPath, sourcePath, targetExists, 'navigation-file', link));
246
- return true;
321
+ return { kind: 'excluded', reason: 'navigation-file' };
247
322
  }
248
323
  // Repo-internal agent-instruction files — see {@link refusesAgentInstructionFile}
249
324
  // for why they cannot travel, and for the explicit-`files:` escape hatch.
250
325
  if (refusesAgentInstructionFile(targetPath, options)) {
251
- excludedReferences.push(makeExclusion(targetPath, sourcePath, targetExists, 'agent-instruction-file', link));
252
- return true;
326
+ return { kind: 'excluded', reason: 'agent-instruction-file' };
253
327
  }
254
328
  // Check for cross-skill SKILL.md links — a SKILL.md is a skill definition marker,
255
329
  // not a resource. Bundling another skill's SKILL.md creates duplicate skill definitions
@@ -260,21 +334,78 @@ function checkExclusions(targetPath, sourcePath, link, options, excludeMatchers,
260
334
  // prevents re-traversal, and the duplicate-definition risk does not apply to the
261
335
  // current skill itself.
262
336
  if (basename(targetPath) === 'SKILL.md') {
263
- if (safePath.resolve(targetPath) !== safePath.resolve(options.skillRootPath)) {
264
- excludedReferences.push(makeExclusion(targetPath, sourcePath, targetExists, 'skill-definition', link));
265
- }
266
- return true;
337
+ return safePath.resolve(targetPath) === safePath.resolve(options.skillRootPath)
338
+ ? { kind: 'skipped' }
339
+ : { kind: 'excluded', reason: 'skill-definition' };
267
340
  }
268
341
  // Check exclude patterns (relative to projectRoot)
269
342
  const relativePath = toForwardSlash(safePath.relative(options.projectRoot, targetPath));
270
343
  const matchedExclude = excludeMatchers.find((m) => m.isMatch(relativePath));
271
344
  if (matchedExclude) {
272
- excludedReferences.push(makeExclusion(targetPath, sourcePath, targetExists, 'pattern-matched', link, matchedExclude.rule));
273
- return true;
345
+ return { kind: 'excluded', reason: 'pattern-matched', matchedRule: matchedExclude.rule };
346
+ }
347
+ // Falls through to the cascade's final branch, which is the one that needs an
348
+ // oracle rather than a column — see {@link classifyGitignored}.
349
+ return undefined;
350
+ }
351
+ /**
352
+ * The cascade's LAST branch, kept out of {@link classifyExclusion} so that
353
+ * function can stay a pure function of the row.
354
+ *
355
+ * Its position at the end is not an implementation detail — it is why the
356
+ * demand-read is safe. Every earlier discriminator has already declined, so the
357
+ * set of paths this asks the oracle about is exactly the set the shipped
358
+ * classifier asked about, link for link.
359
+ *
360
+ * Existence-gated, and the gate is the point: a path that is not there cannot
361
+ * leak anything, and neither oracle can be trusted to say so — see
362
+ * {@link readGitignored}.
363
+ */
364
+ function classifyGitignored(targetPath, options, facts, state) {
365
+ if (!facts.exists)
366
+ return undefined;
367
+ if (!readGitignored(targetPath, options, state))
368
+ return undefined;
369
+ return classifyGitignoredTarget(targetPath, options.deferredArtifacts);
370
+ }
371
+ /**
372
+ * Apply a verdict to the walk state — the only place the classifier's decision
373
+ * becomes a mutation.
374
+ *
375
+ * @returns true if the caller should stop processing this link
376
+ */
377
+ function applyExclusionVerdict(verdict, targetPath, sourcePath, link, facts, state) {
378
+ switch (verdict.kind) {
379
+ case 'deferred': {
380
+ state.deferredAssetSet.add(toForwardSlash(targetPath));
381
+ return true;
382
+ }
383
+ case 'excluded': {
384
+ state.excludedReferences.push(makeExclusion(targetPath, sourcePath, facts.exists, verdict.reason, link, verdict.matchedRule));
385
+ return true;
386
+ }
387
+ case 'skipped': {
388
+ return true;
389
+ }
274
390
  }
275
- // Check if the file is gitignored (prevents leaking data from ignored
276
- // directories) — existence-gated; see {@link checkGitignored}.
277
- return checkGitignored(targetPath, sourcePath, targetExists, link, options, excludedReferences, deferredAssetSet);
391
+ }
392
+ /**
393
+ * Check if a target path should be excluded for structural reasons
394
+ * (deferred build artifact, directory, outside project, navigation file, or
395
+ * pattern match).
396
+ *
397
+ * Pass 1′ fills the row, pass 4 judges it, and the recording is a third step —
398
+ * the three used to be one interleaved function that stat'ed paths mid-cascade.
399
+ *
400
+ * @returns true if the link was excluded or deferred (caller should skip to next link)
401
+ */
402
+ function checkExclusions(targetPath, sourcePath, link, options, excludeMatchers, state) {
403
+ const facts = fillPathFacts(targetPath, options, state);
404
+ const verdict = classifyExclusion(targetPath, options, excludeMatchers, facts)
405
+ ?? classifyGitignored(targetPath, options, facts, state);
406
+ if (verdict === undefined)
407
+ return false;
408
+ return applyExclusionVerdict(verdict, targetPath, sourcePath, link, facts, state);
278
409
  }
279
410
  /**
280
411
  * Process a single local_file link during the graph walk.
@@ -292,7 +423,7 @@ function processLink(link, currentResource, currentDepth, registry, options, exc
292
423
  // Resolve the target path from the link href
293
424
  const targetPath = resolveHrefToPath(hrefWithoutAnchor, currentResource.filePath, options.projectRoot);
294
425
  // Check structural exclusions (deferred, directory, boundary, navigation, pattern, gitignore)
295
- if (checkExclusions(targetPath, currentResource.filePath, link, options, excludeMatchers, state.excludedReferences, state.deferredAssetSet)) {
426
+ if (checkExclusions(targetPath, currentResource.filePath, link, options, excludeMatchers, state)) {
296
427
  return;
297
428
  }
298
429
  // Try to find the target in the registry (markdown files)
@@ -301,9 +432,13 @@ function processLink(link, currentResource, currentDepth, registry, options, exc
301
432
  : registry.getResource(targetPath);
302
433
  if (targetResource) {
303
434
  processRegistryResource(targetResource, targetPath, currentResource.filePath, link, currentDepth, options, state);
304
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- Path from parsed markdown
435
+ // Straight to the probe, not through `fillPathFacts`: this site wants one
436
+ // column, and building a whole row to read it would compute an
437
+ // `insideProject` the caller immediately discards. The probe memo is what
438
+ // makes it free — this used to be a second `existsSync` of the identical
439
+ // path in the same tick.
305
440
  }
306
- else if (existsSync(targetPath)) {
441
+ else if (state.pathProbe.probe(targetPath).exists) {
307
442
  // Not in registry — non-markdown asset that exists on disk
308
443
  state.bundledAssetSet.add(toForwardSlash(targetPath));
309
444
  }
@@ -314,9 +449,65 @@ function processLink(link, currentResource, currentDepth, registry, options, exc
314
449
  }
315
450
  }
316
451
  /**
317
- * Process a registry resource link: check depth, cycle, and either bundle or exclude.
452
+ * Is this file one the walker walks THROUGH, enqueuing its link targets as
453
+ * further bundle members?
454
+ *
455
+ * Routing is markdown-only. HTML may be a registry member — parsed, links
456
+ * known, reachable by the rewriter — without being a door: the decision is
457
+ * "a leaf we can read, not a door we walk through", and it is spec-backed
458
+ * (Anthropic's skill guidance is markdown throughout, and VAT's own stance docs
459
+ * mention HTML nowhere).
460
+ *
461
+ * Keyed on {@link parserKindForPath} rather than a local extension test, so
462
+ * VAT keeps ONE parser discriminator: a format that gains a parser gains a
463
+ * routability answer in the same edit.
464
+ */
465
+ function isRoutable(filePath) {
466
+ return parserKindForPath(filePath) === 'markdown';
467
+ }
468
+ /**
469
+ * Record every local-file link out of a bundled non-routable member as a
470
+ * candidate `non-routable-source` exclusion.
471
+ *
472
+ * Without this the targets simply vanish: `SKILL.md → guide.html →
473
+ * diagram.svg` bundles the HTML, never looks inside it, and ships a bundled
474
+ * page whose `<img src>` points at a file that is not there. A silent drop
475
+ * becomes a reported one.
476
+ */
477
+ function recordUnfollowedLinks(member, options, state) {
478
+ for (const link of member.links) {
479
+ if (!isLocalFileLink(link.type))
480
+ continue;
481
+ const hrefWithoutAnchor = link.href.split('#')[0] ?? link.href;
482
+ if (hrefWithoutAnchor === '')
483
+ continue;
484
+ const targetPath = resolveHrefToPath(hrefWithoutAnchor, member.filePath, options.projectRoot);
485
+ const targetExists = state.pathProbe.probe(targetPath).exists;
486
+ state.unfollowedFromNonRoutable.push(makeExclusion(targetPath, member.filePath, targetExists, 'non-routable-source', link));
487
+ }
488
+ }
489
+ /**
490
+ * Process a registry resource link: check routability, depth, cycle, and either
491
+ * bundle or exclude.
318
492
  */
319
493
  function processRegistryResource(targetResource, targetPath, sourcePath, link, currentDepth, options, state) {
494
+ // A non-routable member is a leaf, and leaves are bundled on the same terms
495
+ // as plain assets — which bypass `maxDepth` entirely. Checking routability
496
+ // BEFORE depth is what makes adding HTML to a registry a pure gain: the file
497
+ // still travels exactly as it did when it was an unparsed asset, it is merely
498
+ // parsed now so the rewriter can reach its links. Applying the depth limit
499
+ // here instead would silently DROP HTML that a markdown-only registry shipped.
500
+ if (!isRoutable(targetResource.filePath)) {
501
+ if (state.visitedResourceIds.has(targetResource.id)) {
502
+ return;
503
+ }
504
+ state.visitedResourceIds.add(targetResource.id);
505
+ state.bundledResourceMap.set(targetResource.id, targetResource);
506
+ // `maxBundledDepth` describes how far the walk ROUTED. A leaf does not
507
+ // extend that, any more than a bundled PNG does.
508
+ recordUnfollowedLinks(targetResource, options, state);
509
+ return;
510
+ }
320
511
  // Check depth limit. A registry resource came from a disk crawl, so it
321
512
  // exists by construction — `targetExists: true` is a fact here, not a guess.
322
513
  if (currentDepth >= options.maxDepth) {
@@ -374,6 +565,9 @@ export function walkLinkGraph(skillResourceId, registry, options) {
374
565
  excludedReferences: [],
375
566
  maxBundledDepth: 0,
376
567
  queue: [[skillResource, 0]],
568
+ unfollowedFromNonRoutable: [],
569
+ pathProbe: options.pathProbe ?? new FsLookupCache(),
570
+ gitignoreFacts: new Map(),
377
571
  };
378
572
  while (state.queue.length > 0) {
379
573
  const entry = state.queue.shift();
@@ -387,6 +581,20 @@ export function walkLinkGraph(skillResourceId, registry, options) {
387
581
  }
388
582
  }
389
583
  }
584
+ // Promote only the unfollowed links whose targets the walk never bundled by
585
+ // any other route. Deferred artifacts count as accounted-for: the target will
586
+ // exist once the build materializes it, which is the same reason they are not
587
+ // `missing-target`.
588
+ const bundledPaths = new Set([
589
+ ...state.bundledAssetSet,
590
+ ...state.deferredAssetSet,
591
+ ...[...state.bundledResourceMap.values()].map(r => toForwardSlash(r.filePath)),
592
+ ]);
593
+ for (const unfollowed of state.unfollowedFromNonRoutable) {
594
+ if (!bundledPaths.has(toForwardSlash(unfollowed.path))) {
595
+ state.excludedReferences.push(unfollowed);
596
+ }
597
+ }
390
598
  return {
391
599
  bundledResources: [...state.bundledResourceMap.values()],
392
600
  bundledAssets: [...state.bundledAssetSet],
@@ -1 +1 @@
1
- {"version":3,"file":"walk-link-graph.js","sourceRoot":"","sources":["../src/walk-link-graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"walk-link-graph.js","sourceRoot":"","sources":["../src/walk-link-graph.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibe-agent-toolkit/agent-skills",
3
- "version": "0.1.42",
3
+ "version": "0.2.0-rc.2",
4
4
  "description": "Build, validate, and package agent skills in the Agent Skills format",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -19,7 +19,7 @@
19
19
  "README.md"
20
20
  ],
21
21
  "scripts": {
22
- "build": "tsc --build && bun run generate:schemas",
22
+ "build": "tsx ../dev-tools/src/tsc-clean-build.ts --build && bun run generate:schemas",
23
23
  "build:watch": "tsc --build --watch",
24
24
  "clean": "rm -rf dist *.tsbuildinfo schemas/",
25
25
  "generate:schemas": "tsx scripts/generate-json-schemas.ts",
@@ -30,10 +30,10 @@
30
30
  "typecheck": "tsc --noEmit"
31
31
  },
32
32
  "dependencies": {
33
- "@vibe-agent-toolkit/agent-config": "0.1.42",
34
- "@vibe-agent-toolkit/agent-schema": "0.1.42",
35
- "@vibe-agent-toolkit/resources": "0.1.42",
36
- "@vibe-agent-toolkit/utils": "0.1.42",
33
+ "@vibe-agent-toolkit/agent-config": "0.2.0-rc.2",
34
+ "@vibe-agent-toolkit/agent-schema": "0.2.0-rc.2",
35
+ "@vibe-agent-toolkit/resources": "0.2.0-rc.2",
36
+ "@vibe-agent-toolkit/utils": "0.2.0-rc.2",
37
37
  "adm-zip": "^0.6.0",
38
38
  "glob": "^10.3.10",
39
39
  "picomatch": "^4.0.3",