@vibe-agent-toolkit/cli 0.1.41-rc.7 → 0.1.41
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.
- package/dist/bin/vat +24 -1
- package/dist/bin/vat.js +24 -1
- package/dist/bin/vat.js.map +1 -1
- package/dist/bin.js +23 -2
- package/dist/bin.js.map +1 -1
- package/dist/commands/agent/list.d.ts +11 -0
- package/dist/commands/agent/list.d.ts.map +1 -1
- package/dist/commands/agent/list.js +30 -11
- package/dist/commands/agent/list.js.map +1 -1
- package/dist/commands/audit/distributed-tree.d.ts +172 -0
- package/dist/commands/audit/distributed-tree.d.ts.map +1 -0
- package/dist/commands/audit/distributed-tree.js +319 -0
- package/dist/commands/audit/distributed-tree.js.map +1 -0
- package/dist/commands/audit.d.ts +69 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +525 -174
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/build.d.ts +14 -0
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +103 -26
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/claude/marketplace/git-publish.d.ts.map +1 -1
- package/dist/commands/claude/marketplace/git-publish.js +21 -3
- package/dist/commands/claude/marketplace/git-publish.js.map +1 -1
- package/dist/commands/claude/marketplace/validate.d.ts +125 -0
- package/dist/commands/claude/marketplace/validate.d.ts.map +1 -1
- package/dist/commands/claude/marketplace/validate.js +251 -44
- package/dist/commands/claude/marketplace/validate.js.map +1 -1
- package/dist/commands/claude/org/stubs.d.ts +9 -1
- package/dist/commands/claude/org/stubs.d.ts.map +1 -1
- package/dist/commands/claude/org/stubs.js +11 -3
- package/dist/commands/claude/org/stubs.js.map +1 -1
- package/dist/commands/claude/plugin/build.d.ts +34 -4
- package/dist/commands/claude/plugin/build.d.ts.map +1 -1
- package/dist/commands/claude/plugin/build.js +187 -16
- package/dist/commands/claude/plugin/build.js.map +1 -1
- package/dist/commands/claude/plugin/plugin-files.d.ts.map +1 -1
- package/dist/commands/claude/plugin/plugin-files.js +6 -2
- package/dist/commands/claude/plugin/plugin-files.js.map +1 -1
- package/dist/commands/claude/plugin/plugin-json-merge.d.ts.map +1 -1
- package/dist/commands/claude/plugin/plugin-json-merge.js +15 -0
- package/dist/commands/claude/plugin/plugin-json-merge.js.map +1 -1
- package/dist/commands/claude/plugin/tree-copy.d.ts +40 -0
- package/dist/commands/claude/plugin/tree-copy.d.ts.map +1 -1
- package/dist/commands/claude/plugin/tree-copy.js +100 -4
- package/dist/commands/claude/plugin/tree-copy.js.map +1 -1
- package/dist/commands/corpus/report.d.ts +22 -4
- package/dist/commands/corpus/report.d.ts.map +1 -1
- package/dist/commands/corpus/report.js +1 -0
- package/dist/commands/corpus/report.js.map +1 -1
- package/dist/commands/corpus/runner.d.ts +16 -1
- package/dist/commands/corpus/runner.d.ts.map +1 -1
- package/dist/commands/corpus/runner.js +40 -22
- package/dist/commands/corpus/runner.js.map +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/inventory.d.ts +2 -0
- package/dist/commands/inventory.d.ts.map +1 -1
- package/dist/commands/inventory.js +45 -4
- package/dist/commands/inventory.js.map +1 -1
- package/dist/commands/phase-utils.d.ts +183 -14
- package/dist/commands/phase-utils.d.ts.map +1 -1
- package/dist/commands/phase-utils.js +294 -29
- package/dist/commands/phase-utils.js.map +1 -1
- package/dist/commands/positional-args.d.ts +36 -0
- package/dist/commands/positional-args.d.ts.map +1 -0
- package/dist/commands/positional-args.js +52 -0
- package/dist/commands/positional-args.js.map +1 -0
- package/dist/commands/rag/query-command.d.ts +40 -0
- package/dist/commands/rag/query-command.d.ts.map +1 -1
- package/dist/commands/rag/query-command.js +47 -20
- package/dist/commands/rag/query-command.js.map +1 -1
- package/dist/commands/resources/index.d.ts.map +1 -1
- package/dist/commands/resources/index.js +27 -9
- package/dist/commands/resources/index.js.map +1 -1
- package/dist/commands/resources/scan.d.ts +37 -0
- package/dist/commands/resources/scan.d.ts.map +1 -1
- package/dist/commands/resources/scan.js +47 -32
- package/dist/commands/resources/scan.js.map +1 -1
- package/dist/commands/resources/validate.d.ts +136 -1
- package/dist/commands/resources/validate.d.ts.map +1 -1
- package/dist/commands/resources/validate.js +105 -66
- package/dist/commands/resources/validate.js.map +1 -1
- package/dist/commands/skill/review-checklist.d.ts.map +1 -1
- package/dist/commands/skill/review-checklist.js +5 -0
- package/dist/commands/skill/review-checklist.js.map +1 -1
- package/dist/commands/skill/review.d.ts.map +1 -1
- package/dist/commands/skill/review.js +7 -3
- package/dist/commands/skill/review.js.map +1 -1
- package/dist/commands/skill/test/run.d.ts +1 -1
- package/dist/commands/skill/test/run.d.ts.map +1 -1
- package/dist/commands/skill/test/run.js +8 -6
- package/dist/commands/skill/test/run.js.map +1 -1
- package/dist/commands/skills/build.d.ts +349 -11
- package/dist/commands/skills/build.d.ts.map +1 -1
- package/dist/commands/skills/build.js +901 -97
- package/dist/commands/skills/build.js.map +1 -1
- package/dist/commands/skills/command-helpers.d.ts +6 -10
- package/dist/commands/skills/command-helpers.d.ts.map +1 -1
- package/dist/commands/skills/command-helpers.js +6 -22
- package/dist/commands/skills/command-helpers.js.map +1 -1
- package/dist/commands/skills/list.d.ts +18 -0
- package/dist/commands/skills/list.d.ts.map +1 -1
- package/dist/commands/skills/list.js +41 -15
- package/dist/commands/skills/list.js.map +1 -1
- package/dist/commands/skills/package.d.ts +15 -0
- package/dist/commands/skills/package.d.ts.map +1 -1
- package/dist/commands/skills/package.js +30 -20
- package/dist/commands/skills/package.js.map +1 -1
- package/dist/commands/skills/scope-guard.d.ts +64 -0
- package/dist/commands/skills/scope-guard.d.ts.map +1 -0
- package/dist/commands/skills/scope-guard.js +86 -0
- package/dist/commands/skills/scope-guard.js.map +1 -0
- package/dist/commands/skills/validate-command.d.ts.map +1 -1
- package/dist/commands/skills/validate-command.js +41 -7
- package/dist/commands/skills/validate-command.js.map +1 -1
- package/dist/commands/skills/validate.d.ts +44 -3
- package/dist/commands/skills/validate.d.ts.map +1 -1
- package/dist/commands/skills/validate.js +217 -53
- package/dist/commands/skills/validate.js.map +1 -1
- package/dist/commands/validate.d.ts +18 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +89 -68
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/verify.d.ts +113 -6
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +440 -123
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/skill-resolution/index.d.ts +1 -1
- package/dist/skill-resolution/index.d.ts.map +1 -1
- package/dist/skill-resolution/index.js +1 -1
- package/dist/skill-resolution/index.js.map +1 -1
- package/dist/skill-resolution/packaging-config.d.ts +15 -2
- package/dist/skill-resolution/packaging-config.d.ts.map +1 -1
- package/dist/skill-resolution/packaging-config.js +39 -2
- package/dist/skill-resolution/packaging-config.js.map +1 -1
- package/dist/utils/command-error.d.ts +34 -1
- package/dist/utils/command-error.d.ts.map +1 -1
- package/dist/utils/command-error.js +32 -1
- package/dist/utils/command-error.js.map +1 -1
- package/dist/utils/help-loader.d.ts +6 -2
- package/dist/utils/help-loader.d.ts.map +1 -1
- package/dist/utils/help-loader.js +9 -16
- package/dist/utils/help-loader.js.map +1 -1
- package/dist/utils/issue-rendering.d.ts +130 -0
- package/dist/utils/issue-rendering.d.ts.map +1 -1
- package/dist/utils/issue-rendering.js +147 -0
- package/dist/utils/issue-rendering.js.map +1 -1
- package/dist/utils/issue-severity.d.ts +51 -0
- package/dist/utils/issue-severity.d.ts.map +1 -0
- package/dist/utils/issue-severity.js +63 -0
- package/dist/utils/issue-severity.js.map +1 -0
- package/dist/utils/output.d.ts +54 -5
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +111 -17
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/relativize-paths.d.ts +45 -0
- package/dist/utils/relativize-paths.d.ts.map +1 -0
- package/dist/utils/relativize-paths.js +67 -0
- package/dist/utils/relativize-paths.js.map +1 -0
- package/dist/utils/resource-loader.d.ts +21 -2
- package/dist/utils/resource-loader.d.ts.map +1 -1
- package/dist/utils/resource-loader.js +85 -11
- package/dist/utils/resource-loader.js.map +1 -1
- package/dist/utils/skill-packaging-config.d.ts +22 -1
- package/dist/utils/skill-packaging-config.d.ts.map +1 -1
- package/dist/utils/skill-packaging-config.js +26 -0
- package/dist/utils/skill-packaging-config.js.map +1 -1
- package/dist/utils/verdict-helpers.d.ts +4 -3
- package/dist/utils/verdict-helpers.d.ts.map +1 -1
- package/dist/utils/verdict-helpers.js +6 -13
- package/dist/utils/verdict-helpers.js.map +1 -1
- package/dist/version.d.ts +22 -2
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +31 -2
- package/dist/version.js.map +1 -1
- package/docs/index.md +12 -0
- package/docs/rag.md +9 -4
- package/docs/resources.md +30 -14
- package/docs/skills.md +25 -7
- package/package.json +12 -12
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Is this tree repository SOURCE, or an artifact somebody published?"
|
|
3
|
+
*
|
|
4
|
+
* `vat audit` needs an answer before it can run the presence-side detectors —
|
|
5
|
+
* `PACKAGED_AGENT_INSTRUCTION_FILE` above all — because the same `CLAUDE.md`
|
|
6
|
+
* means opposite things on the two sides of that line. Sitting beside a source
|
|
7
|
+
* `SKILL.md` in a working repo it is ordinary repo guidance that ships nowhere;
|
|
8
|
+
* sitting in a built bundle or an installed plugin it demonstrably travelled to
|
|
9
|
+
* a consumer.
|
|
10
|
+
*
|
|
11
|
+
* ## The discriminator this replaced, and why it was wrong
|
|
12
|
+
*
|
|
13
|
+
* The first answer was "does the project's `vibe-agent-toolkit.config.yaml`
|
|
14
|
+
* declare this SKILL.md, matched by absolute path?" — no match meant the tree
|
|
15
|
+
* had been handed to us. Two ordinary cases falsify that inference, and both
|
|
16
|
+
* were observed on adopter fixtures:
|
|
17
|
+
*
|
|
18
|
+
* - **A repo that has not adopted VAT at all** has no config, so nothing is
|
|
19
|
+
* declared. `vat audit` on a fresh repo is the first command a new user runs,
|
|
20
|
+
* and it greeted them with a warning whose first remedy is "remove the file,
|
|
21
|
+
* or move it outside the directory that is packaged" — about guidance that
|
|
22
|
+
* ships nowhere.
|
|
23
|
+
* - **An adopting repo whose `include` globs do not enumerate every skill
|
|
24
|
+
* directory in the tree** — drafts, vendored copies, test fixtures. Not being
|
|
25
|
+
* named by a glob is not evidence of publication.
|
|
26
|
+
*
|
|
27
|
+
* ## What replaced it
|
|
28
|
+
*
|
|
29
|
+
* Two observable facts about where the file actually LIVES, in this order:
|
|
30
|
+
*
|
|
31
|
+
* 1. **Inside a Claude install root** (`plugins/`, `skills/`, `marketplaces/`
|
|
32
|
+
* under `$CLAUDE_CONFIG_DIR` or `~/.claude`) — the directories whose entire
|
|
33
|
+
* purpose is holding artifacts an installer put there. This clause wins over
|
|
34
|
+
* the git test below, and it must: Claude Code installs a marketplace by
|
|
35
|
+
* `git clone`, so an installed tree's files are TRACKED SOURCE — of somebody
|
|
36
|
+
* else's repository. For a git-distributed plugin, tracked source *is* what
|
|
37
|
+
* ships, which is precisely how a scaffold template like Anthropic's
|
|
38
|
+
* `dataverse` `templates/CLAUDE.md` reaches every consumer. Judging that tree
|
|
39
|
+
* by tracked-ness would silence the dominant audited population.
|
|
40
|
+
*
|
|
41
|
+
* Both halves of that sentence are statements about somebody else's product,
|
|
42
|
+
* and clause 1 outranking clause 2 rests on them. No test in this repo can
|
|
43
|
+
* contradict either — they can only be re-read:
|
|
44
|
+
*
|
|
45
|
+
* @vendor-claim reviewed=2026-08-02 verify=Install a marketplace with /plugin marketplace add and confirm ~/.claude/plugins/marketplaces/<name> is a git working copy; confirm dataverse still ships templates/CLAUDE.md
|
|
46
|
+
*
|
|
47
|
+
* 2. **Not git-visible source** — the `SKILL.md` is gitignored, or it lies
|
|
48
|
+
* outside any git repository. A built `dist/` bundle is gitignored; an
|
|
49
|
+
* unpacked tarball is outside a repo; a working tree's skill is neither.
|
|
50
|
+
*
|
|
51
|
+
* Neither clause consults the project's config, and neither is CONDITIONAL on it:
|
|
52
|
+
* `vat audit` asks this question in its config-aware lane exactly as it does in
|
|
53
|
+
* its wild one. The config-declaration test was not merely replaced inside this
|
|
54
|
+
* module — it also had to stop gating whether this module is reached, or it
|
|
55
|
+
* survives at the caller in its purest form, where it can only suppress.
|
|
56
|
+
*
|
|
57
|
+
* Untracked-but-not-ignored is deliberately SOURCE, not "distributed": that is
|
|
58
|
+
* a skill the author has written and not yet committed, and treating authoring
|
|
59
|
+
* in progress as a distribution artifact would make the first audit of a new
|
|
60
|
+
* skill the loudest one. `GitTracker`'s active set (`git ls-files --cached
|
|
61
|
+
* --others --exclude-standard`) answers exactly this three-way question in O(1),
|
|
62
|
+
* which is why this module reuses it rather than adding a second git-status path.
|
|
63
|
+
*
|
|
64
|
+
* Deliberately NOT inferred from a `dist/` path substring or from a bundle's
|
|
65
|
+
* frontmatter `name`: both assert a cause the code cannot observe, and adopter
|
|
66
|
+
* output directories vary. Location under an install root is not that kind of
|
|
67
|
+
* guess — it is the same directory constant the `--user` scan itself is defined
|
|
68
|
+
* by, resolved from {@link getClaudeUserPaths}.
|
|
69
|
+
*
|
|
70
|
+
* ## Known limits, both deliberate
|
|
71
|
+
*
|
|
72
|
+
* - A skill the author writes IN PLACE under `~/.claude/skills/` and keeps in a
|
|
73
|
+
* dotfiles repo is reported, because it is indistinguishable by location from
|
|
74
|
+
* an installed one. The install root is what a consumer's Claude reads from;
|
|
75
|
+
* a skill living there is being consumed either way.
|
|
76
|
+
* - A third-party skills repo audited by `vat audit <git-url>` is a clone, so
|
|
77
|
+
* its skills read as source and stay silent. That is consistent: auditing
|
|
78
|
+
* somebody's repo source is the same situation as auditing your own. A
|
|
79
|
+
* third-party *plugin* still reports, because the plugin lane crawls the whole
|
|
80
|
+
* plugin tree independently of this classifier.
|
|
81
|
+
*
|
|
82
|
+
* ## When git cannot be consulted
|
|
83
|
+
*
|
|
84
|
+
* Clause 2 is only as good as git's willingness to answer, and `gitLsFiles`
|
|
85
|
+
* returns the same `null` for a missing binary, a corrupt `.git` and an
|
|
86
|
+
* unreadable one. That `null` used to arrive here as "not ignored" — i.e. source,
|
|
87
|
+
* i.e. silence — so the detector switched itself off and the run still reported
|
|
88
|
+
* `status: success` with nothing to indicate why. This module therefore has a
|
|
89
|
+
* third answer, `'indeterminate'`, and reports it (see
|
|
90
|
+
* {@link distributedTreeFindings}) rather than guessing in either direction.
|
|
91
|
+
*/
|
|
92
|
+
import { detectPackagedAgentInstructionFiles, materializeIssue } from '@vibe-agent-toolkit/agent-skills';
|
|
93
|
+
import { getClaudeUserPaths } from '@vibe-agent-toolkit/claude-marketplace';
|
|
94
|
+
import { gitFindRoot, GitTracker, issueLocation, normalizePath, safePath, toForwardSlash, } from '@vibe-agent-toolkit/utils';
|
|
95
|
+
/** Cache of (gitRoot → initialized GitTracker) to avoid re-spawning ls-files. */
|
|
96
|
+
const gitTrackerCache = new Map();
|
|
97
|
+
/**
|
|
98
|
+
* Get (or build) the pre-populated tracker for one git root.
|
|
99
|
+
*
|
|
100
|
+
* Shared with `resolveScanContext` in audit.ts so a run pays for `git ls-files`
|
|
101
|
+
* once per repository, whether the caller wants scan-time gitignore filtering or
|
|
102
|
+
* the provenance answer below.
|
|
103
|
+
*/
|
|
104
|
+
export async function getOrCreateGitTracker(gitRoot) {
|
|
105
|
+
const cached = gitTrackerCache.get(gitRoot);
|
|
106
|
+
if (cached !== undefined) {
|
|
107
|
+
return cached;
|
|
108
|
+
}
|
|
109
|
+
const tracker = new GitTracker(gitRoot);
|
|
110
|
+
await tracker.initialize();
|
|
111
|
+
gitTrackerCache.set(gitRoot, tracker);
|
|
112
|
+
return tracker;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Cache of (canonical SKILL.md path → verdict).
|
|
116
|
+
*
|
|
117
|
+
* The walk asks the same question about the same skill twice: once to decide
|
|
118
|
+
* whether this skill's crawl OWNS the subtree below it (see
|
|
119
|
+
* {@link crawlOwnsSubtree}) and once when the crawl runs. Both answers derive
|
|
120
|
+
* from filesystem and git state, which is fixed for the duration of one audit —
|
|
121
|
+
* so it is memoized rather than re-derived, and cleared alongside the tracker it
|
|
122
|
+
* is derived from, which is what every reset path already calls.
|
|
123
|
+
*/
|
|
124
|
+
const provenanceCache = new Map();
|
|
125
|
+
/** Clear the per-root tracker cache (see `resetAuditCaches`). */
|
|
126
|
+
export function resetGitTrackerCache() {
|
|
127
|
+
gitTrackerCache.clear();
|
|
128
|
+
provenanceCache.clear();
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* The silent verdict, spelled once.
|
|
132
|
+
*
|
|
133
|
+
* Three call sites now test for it — the two clauses that return it and
|
|
134
|
+
* {@link crawlOwnsSubtree}, which is defined as "not this" — and a verdict
|
|
135
|
+
* literal that drifts in one of them fails open.
|
|
136
|
+
*/
|
|
137
|
+
const REPO_SOURCE = 'repo-source';
|
|
138
|
+
/**
|
|
139
|
+
* One canonical, forward-slashed spelling of a path — symlinks resolved, and on a
|
|
140
|
+
* case-insensitive filesystem (macOS, NTFS) the case as it is stored on disk.
|
|
141
|
+
*
|
|
142
|
+
* Every comparison in this module goes through it, and both sides of every
|
|
143
|
+
* comparison do, because two unrelated defects follow from comparing paths as the
|
|
144
|
+
* caller happened to spell them:
|
|
145
|
+
*
|
|
146
|
+
* - `~/.claude` is very often a SYMLINK into a dotfiles checkout. Auditing that
|
|
147
|
+
* checkout by its real path missed the install-root clause entirely: the same
|
|
148
|
+
* physical files, two verdicts, decided by which spelling was typed.
|
|
149
|
+
* - `GitTracker`'s active set is keyed by exact string while the `existsSync`
|
|
150
|
+
* qualifier beside it is case-INsensitive, so `<repo>/Skills/demo/SKILL.md`
|
|
151
|
+
* read as "absent from the set and present on disk" ⇒ ignored ⇒ distributed:
|
|
152
|
+
* a false finding against tracked source, reachable by tab-completion.
|
|
153
|
+
*
|
|
154
|
+
* Canonicalising the SKILL.md before deriving the git root is what keeps the
|
|
155
|
+
* second fix honest — the tracker's own keys are built from the root it is given,
|
|
156
|
+
* so a canonical lookup against a non-canonical root would miss every time.
|
|
157
|
+
*/
|
|
158
|
+
function canonicalPath(filePath) {
|
|
159
|
+
return toForwardSlash(normalizePath(safePath.resolve(filePath)));
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* True when `absolutePath` is `root` or lies beneath it.
|
|
163
|
+
*
|
|
164
|
+
* Both sides are put through {@link toForwardSlash} first: a Windows caller can
|
|
165
|
+
* hand us a backslash path, and a prefix test across mixed separators reports a
|
|
166
|
+
* sibling directory as "outside" — the exact shape that would quietly turn this
|
|
167
|
+
* whole clause off on one platform.
|
|
168
|
+
*
|
|
169
|
+
* Exported because `audit.ts` asks the same containment question of the same
|
|
170
|
+
* kind of path when deciding which crawl owns a subtree; a second spelling of a
|
|
171
|
+
* prefix test is how the separator bug gets reintroduced on one side only.
|
|
172
|
+
*/
|
|
173
|
+
export function isWithin(root, absolutePath) {
|
|
174
|
+
const normalizedRoot = toForwardSlash(root);
|
|
175
|
+
const normalizedPath = toForwardSlash(absolutePath);
|
|
176
|
+
return normalizedPath === normalizedRoot || normalizedPath.startsWith(`${normalizedRoot}/`);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Is this path inside one of the directories Claude installs packages INTO?
|
|
180
|
+
*
|
|
181
|
+
* Resolved per call, never memoized at module load: `CLAUDE_CONFIG_DIR` is an
|
|
182
|
+
* environment variable the operator (and every test fixture) is entitled to
|
|
183
|
+
* change between runs, and a cached answer would describe the wrong machine.
|
|
184
|
+
*/
|
|
185
|
+
function isUnderClaudeInstallRoot(canonicalAbsolutePath) {
|
|
186
|
+
const { pluginsDir, skillsDir, marketplacesDir } = getClaudeUserPaths();
|
|
187
|
+
// marketplacesDir is nested under pluginsDir; listed anyway so the set reads as
|
|
188
|
+
// the three install destinations rather than as an accident of layout.
|
|
189
|
+
return [pluginsDir, skillsDir, marketplacesDir].some((dir) => isWithin(canonicalPath(dir), canonicalAbsolutePath));
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Classify the tree holding `skillMdPath`. See this module's header for the
|
|
193
|
+
* reasoning behind each clause and the order they are applied in.
|
|
194
|
+
*/
|
|
195
|
+
export async function classifyScannedSkillTree(skillMdPath) {
|
|
196
|
+
const absolute = canonicalPath(skillMdPath);
|
|
197
|
+
const memoized = provenanceCache.get(absolute);
|
|
198
|
+
if (memoized !== undefined) {
|
|
199
|
+
return memoized;
|
|
200
|
+
}
|
|
201
|
+
const verdict = await classifyUncached(absolute);
|
|
202
|
+
provenanceCache.set(absolute, verdict);
|
|
203
|
+
return verdict;
|
|
204
|
+
}
|
|
205
|
+
/** {@link classifyScannedSkillTree}'s clauses, on an already-canonical path. */
|
|
206
|
+
async function classifyUncached(absolute) {
|
|
207
|
+
if (isUnderClaudeInstallRoot(absolute)) {
|
|
208
|
+
return 'distributed';
|
|
209
|
+
}
|
|
210
|
+
const gitRoot = gitFindRoot(safePath.resolve(absolute, '..'));
|
|
211
|
+
if (gitRoot === null) {
|
|
212
|
+
return 'distributed';
|
|
213
|
+
}
|
|
214
|
+
const tracker = await getOrCreateGitTracker(gitRoot);
|
|
215
|
+
// Fail CLOSED. `isIgnoredByActiveSet` cannot distinguish "git says this file is
|
|
216
|
+
// tracked" from "git was never asked", and both come back `false` ⇒
|
|
217
|
+
// `'repo-source'` ⇒ silence. So the detector used to switch itself off — with a
|
|
218
|
+
// green status and no diagnostic — whenever `git` was missing from `PATH` or the
|
|
219
|
+
// repository's `.git` was corrupt or unreadable. Ask whether git answered before
|
|
220
|
+
// reading anything into its answer.
|
|
221
|
+
if (!tracker.isUsable()) {
|
|
222
|
+
return 'indeterminate';
|
|
223
|
+
}
|
|
224
|
+
return tracker.isIgnoredByActiveSet(absolute) ? 'distributed' : REPO_SOURCE;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Will a crawl rooted at this SKILL.md's directory actually report the WHOLE
|
|
228
|
+
* subtree beneath it — nested skills included?
|
|
229
|
+
*
|
|
230
|
+
* The question the directory walk needs before it descends, and it is not the
|
|
231
|
+
* same as "is there a SKILL.md here". {@link distributedTreeFindings} matches at
|
|
232
|
+
* any depth, so a distributed (or unclassifiable) skill's crawl covers every
|
|
233
|
+
* descendant and they must stand down or one file is counted once per ancestor.
|
|
234
|
+
* A `repo-source` skill's crawl does not run at all, so standing its descendants
|
|
235
|
+
* down would convert a double count into silence — and provenance is NOT
|
|
236
|
+
* monotone down a tree: a gitignored bundle can sit inside a tracked source
|
|
237
|
+
* skill, and a scan rooted above `<claudeDir>/skills` reaches an install root
|
|
238
|
+
* from outside one.
|
|
239
|
+
*/
|
|
240
|
+
export async function crawlOwnsSubtree(skillMdPath) {
|
|
241
|
+
return (await classifyScannedSkillTree(skillMdPath)) !== REPO_SOURCE;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* The tree's own directory, spelled as a location a reader can act on.
|
|
245
|
+
*
|
|
246
|
+
* `issueLocation` is `path.relative`, so it answers `''` when the subject IS the
|
|
247
|
+
* anchor — and that is not an exotic case here, it is the ORDINARY
|
|
248
|
+
* `vat audit <bundle-path>` invocation: the audited target and the tree are the
|
|
249
|
+
* same directory. `''` then reached the report as `location: ""` and, interpolated
|
|
250
|
+
* into the detail below, produced `( (1 agent-instruction file(s) …))` — an empty
|
|
251
|
+
* positional part that reads as a rendering bug. `.` is that same directory
|
|
252
|
+
* spelled as something a consumer can open, resolve and glob.
|
|
253
|
+
*
|
|
254
|
+
* Fixed HERE rather than inside `issueLocation` deliberately. `issueLocation` is
|
|
255
|
+
* a relativizer shared by ~20 producers, and only its CALLER knows whether "the
|
|
256
|
+
* anchor root itself" is a subject its findings can have; for the producers that
|
|
257
|
+
* anchor a file against a containing directory, subject-equals-anchor cannot
|
|
258
|
+
* happen at all. The sibling `Location: (validation.allow.<CODE>)` findings look
|
|
259
|
+
* like this defect and are NOT it: those are `ALLOW_UNUSED`/`ALLOW_EXPIRED` meta
|
|
260
|
+
* issues that carry no `location` whatsoever (only a `field` pointing into the
|
|
261
|
+
* project config), which `formatIssueAnchor` renders as `(field)` on purpose.
|
|
262
|
+
*
|
|
263
|
+
* @see `anchoredPath` in `agent-skills/src/files-config.ts` and the `|| '.'` in
|
|
264
|
+
* `cli/src/commands/claude/plugin/plugin-files.ts` — the same fallback, spelled
|
|
265
|
+
* twice already. Consolidating all three into one utils-level helper is a wider
|
|
266
|
+
* change than this fix.
|
|
267
|
+
*/
|
|
268
|
+
function treeLocation(treeRoot, locationRoot) {
|
|
269
|
+
return issueLocation(treeRoot, locationRoot) || '.';
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* The agent-instruction files present in a skill's own directory, when that
|
|
273
|
+
* directory is a distributed tree. Empty otherwise — including when the caller
|
|
274
|
+
* says a plugin lane already owns this subtree.
|
|
275
|
+
*
|
|
276
|
+
* `[]` declared dests, from BOTH callers, including the config-aware one that does
|
|
277
|
+
* hold a `files:` block. The parameter takes skill-OUTPUT-relative dests, and the
|
|
278
|
+
* tree crawled here is not an output tree — it is wherever the SKILL.md lives, so
|
|
279
|
+
* a `dest` and a path relative to this root are two different coordinate systems.
|
|
280
|
+
* Feeding dests in would exempt by accidental basename agreement and mislabel it
|
|
281
|
+
* as intent. `vat verify` is the lane that maps a built bundle back to the config
|
|
282
|
+
* that produced it, with both sides in output coordinates, and it applies the
|
|
283
|
+
* explicit-`files:` exemption there — which is what
|
|
284
|
+
* `PACKAGED_AGENT_INSTRUCTION_FILE`'s own remediation already tells readers.
|
|
285
|
+
*
|
|
286
|
+
* @param crawlTree `false` when a plugin lane already crawled this subtree.
|
|
287
|
+
* REQUIRED and never defaulted, because the wrong answer is silent in both
|
|
288
|
+
* directions: a skill nested inside a plugin is already crawled by
|
|
289
|
+
* `validatePlugin` at any depth, so crawling again reports one file twice,
|
|
290
|
+
* while omitting it for a standalone bundle is the blindness this pass exists
|
|
291
|
+
* to end.
|
|
292
|
+
*/
|
|
293
|
+
export async function distributedTreeFindings(skillPath, locationRoot, crawlTree) {
|
|
294
|
+
if (!crawlTree)
|
|
295
|
+
return [];
|
|
296
|
+
const provenance = await classifyScannedSkillTree(skillPath);
|
|
297
|
+
if (provenance === REPO_SOURCE)
|
|
298
|
+
return [];
|
|
299
|
+
const treeRoot = safePath.resolve(skillPath, '..');
|
|
300
|
+
const present = detectPackagedAgentInstructionFiles(treeRoot, locationRoot, []);
|
|
301
|
+
if (provenance === 'distributed')
|
|
302
|
+
return present;
|
|
303
|
+
// Provenance is unknown. Report the unknown, not the files: calling them
|
|
304
|
+
// packaged would assert that they travelled to a consumer, which is exactly the
|
|
305
|
+
// fact that could not be established. And say nothing at all when the tree holds
|
|
306
|
+
// none — with nothing to classify, no answer was lost, and a healthy git would
|
|
307
|
+
// have been silent here too. That keeps the notice proportional to the actual
|
|
308
|
+
// ambiguity instead of warning once per skill across a git-less container.
|
|
309
|
+
if (present.length === 0)
|
|
310
|
+
return [];
|
|
311
|
+
const location = treeLocation(treeRoot, locationRoot);
|
|
312
|
+
return [
|
|
313
|
+
materializeIssue('TREE_PROVENANCE_INDETERMINATE', {
|
|
314
|
+
location,
|
|
315
|
+
detail: `${location} (${present.length} agent-instruction file(s) found, unclassified)`,
|
|
316
|
+
}),
|
|
317
|
+
];
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=distributed-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distributed-tree.js","sourceRoot":"","sources":["../../../src/commands/audit/distributed-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FG;AAGH,OAAO,EAAE,mCAAmC,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzG,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EACL,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACb,QAAQ,EACR,cAAc,GACf,MAAM,2BAA2B,CAAC;AAEnC,iFAAiF;AACjF,MAAM,eAAe,GAA4B,IAAI,GAAG,EAAE,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAe;IACzD,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3B,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,eAAe,GAAqC,IAAI,GAAG,EAAE,CAAC;AAEpE,iEAAiE;AACjE,MAAM,UAAU,oBAAoB;IAClC,eAAe,CAAC,KAAK,EAAE,CAAC;IACxB,eAAe,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC;AAeD;;;;;;GAMG;AACH,MAAM,WAAW,GAAwB,aAAa,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAS,aAAa,CAAC,QAAgB;IACrC,OAAO,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,YAAoB;IACzD,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IACpD,OAAO,cAAc,KAAK,cAAc,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,cAAc,GAAG,CAAC,CAAC;AAC9F,CAAC;AAED;;;;;;GAMG;AACH,SAAS,wBAAwB,CAAC,qBAA6B;IAC7D,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,kBAAkB,EAAE,CAAC;IACxE,gFAAgF;IAChF,uEAAuE;IACvE,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3D,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,qBAAqB,CAAC,CACpD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,WAAmB;IAChE,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACjD,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gFAAgF;AAChF,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IAC9C,IAAI,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACrD,gFAAgF;IAChF,oEAAoE;IACpE,gFAAgF;IAChF,iFAAiF;IACjF,iFAAiF;IACjF,oCAAoC;IACpC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QACxB,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,OAAO,CAAC,MAAM,wBAAwB,CAAC,WAAW,CAAC,CAAC,KAAK,WAAW,CAAC;AACvE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAS,YAAY,CAAC,QAAgB,EAAE,YAAoB;IAC1D,OAAO,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,GAAG,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAiB,EACjB,YAAoB,EACpB,SAAkB;IAElB,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,MAAM,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,UAAU,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAE1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,mCAAmC,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IAChF,IAAI,UAAU,KAAK,aAAa;QAAE,OAAO,OAAO,CAAC;IAEjD,yEAAyE;IACzE,gFAAgF;IAChF,iFAAiF;IACjF,+EAA+E;IAC/E,8EAA8E;IAC9E,2EAA2E;IAC3E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtD,OAAO;QACL,gBAAgB,CAAC,+BAA+B,EAAE;YAChD,QAAQ;YACR,MAAM,EAAE,GAAG,QAAQ,KAAK,OAAO,CAAC,MAAM,iDAAiD;SACxF,CAAC;KACH,CAAC;AACJ,CAAC"}
|
package/dist/commands/audit.d.ts
CHANGED
|
@@ -31,6 +31,32 @@ export interface VATProjectContext {
|
|
|
31
31
|
* Top-level command: vat audit [path]
|
|
32
32
|
*/
|
|
33
33
|
export declare function createAuditCommand(): Command;
|
|
34
|
+
/**
|
|
35
|
+
* Which of the Claude install roots a `--user` run actually walks.
|
|
36
|
+
*
|
|
37
|
+
* The three roots read as siblings and are NOT: `marketplacesDir` is
|
|
38
|
+
* `<claudeDir>/plugins/marketplaces`, i.e. INSIDE `pluginsDir`. A recursive walk
|
|
39
|
+
* of `plugins/` already reaches every installed marketplace, so scanning
|
|
40
|
+
* `marketplaces/` afterwards audited each marketplace-installed plugin and skill
|
|
41
|
+
* a SECOND time, in a second result, under the identical `path:`. On one real
|
|
42
|
+
* machine that turned 7 distinct agent-instruction files into 12 reported rows —
|
|
43
|
+
* and it inflates every finding class, not one code, because the whole subject
|
|
44
|
+
* is re-audited rather than one detector re-firing.
|
|
45
|
+
*
|
|
46
|
+
* The containment test is `isWithin`, the same one the provenance classifier
|
|
47
|
+
* uses, so "inside" means the same thing on both sides and on Windows.
|
|
48
|
+
*
|
|
49
|
+
* Gated on `recursive`, and that is not defensive dressing: under
|
|
50
|
+
* `--no-recursive` a walk of `plugins/` stops at its top level and never reaches
|
|
51
|
+
* `marketplaces/`, so dropping the nested root there would replace a double
|
|
52
|
+
* count with no coverage at all.
|
|
53
|
+
*
|
|
54
|
+
* Pure, and exported for that reason: the shape of the defect is "the list of
|
|
55
|
+
* roots was wrong", which is assertable as a list.
|
|
56
|
+
*
|
|
57
|
+
* @internal Exported for unit testing only — not part of the public CLI API.
|
|
58
|
+
*/
|
|
59
|
+
export declare function userScanTargets(candidates: readonly string[], recursive: boolean): string[];
|
|
34
60
|
/**
|
|
35
61
|
* The invocation scan root: the ONE base every `path` and `location` in a
|
|
36
62
|
* report is expressed relative to.
|
|
@@ -78,6 +104,11 @@ export declare function getValidationResults(scanPath: string, recursive: boolea
|
|
|
78
104
|
* Non-plugin results are skipped silently.
|
|
79
105
|
* When effectiveSettings is provided, also runs settings conflict detection.
|
|
80
106
|
*
|
|
107
|
+
* `locationRoot` is the invocation scan root: the ONE base every emitted
|
|
108
|
+
* evidence `location.file` is relative to. One audit run spans many plugin
|
|
109
|
+
* directories, so anchoring evidence at each plugin would mix coordinate
|
|
110
|
+
* systems in a single document.
|
|
111
|
+
*
|
|
81
112
|
* When vatContext is provided, config-layer `targets` declarations are
|
|
82
113
|
* threaded through to the analyzer so `vat audit .` inside a VAT project
|
|
83
114
|
* matches `vat skills validate` verdicts. See
|
|
@@ -85,7 +116,7 @@ export declare function getValidationResults(scanPath: string, recursive: boolea
|
|
|
85
116
|
*
|
|
86
117
|
* @internal Exported for integration testing only — not part of the public CLI API.
|
|
87
118
|
*/
|
|
88
|
-
export declare function runCompatAnalysis(results: ValidationResult[], logger: ReturnType<typeof createLogger>, effectiveSettings?: EffectiveSettings, vatContext?: VATProjectContext | null): Promise<Map<string, CompatibilityResult>>;
|
|
119
|
+
export declare function runCompatAnalysis(results: ValidationResult[], logger: ReturnType<typeof createLogger>, locationRoot: string, effectiveSettings?: EffectiveSettings, vatContext?: VATProjectContext | null): Promise<Map<string, CompatibilityResult>>;
|
|
89
120
|
declare function calculateSummary(results: ValidationResult[], startTime: number, compatMap: Map<string, CompatibilityResult> | undefined, verbose: boolean, root: string): {
|
|
90
121
|
files: (ValidationResult & {
|
|
91
122
|
compatibility?: CompatibilityResult;
|
|
@@ -96,6 +127,43 @@ declare function calculateSummary(results: ValidationResult[], startTime: number
|
|
|
96
127
|
duration: string;
|
|
97
128
|
root: string;
|
|
98
129
|
};
|
|
130
|
+
/**
|
|
131
|
+
* The stderr findings report for a set of audit results — the HUMAN channel.
|
|
132
|
+
*
|
|
133
|
+
* Deliberately NOT the YAML document. `vat audit` publishes a machine-readable
|
|
134
|
+
* report on stdout that CI and tooling parse, and that document carries every
|
|
135
|
+
* finding at every verbosity; this stream is read by a person, and on a 90-skill
|
|
136
|
+
* corpus it printed 26,480 lines, 3,480 of them occurrences of a single
|
|
137
|
+
* high-cardinality warning code. The two channels answer different questions, so
|
|
138
|
+
* only this one collapses.
|
|
139
|
+
*
|
|
140
|
+
* Which findings render in full is not decided here — it is
|
|
141
|
+
* {@link issuesToRenderAtVerbosity}, shared with the other findings-reporting
|
|
142
|
+
* verbs so `vat audit`, `vat skills validate` and `vat skills build` cannot drift
|
|
143
|
+
* onto three answers again. Errors always render; warnings and info collapse
|
|
144
|
+
* unless `verbose`; allow-listed findings never render.
|
|
145
|
+
*
|
|
146
|
+
* The severity breakdown on each file's heading is load-bearing, not decoration.
|
|
147
|
+
* For a warning-only file at default verbosity that heading is the ENTIRE report
|
|
148
|
+
* for that file, so dropping the counts would turn the collapse into silence —
|
|
149
|
+
* the failure direction `issue-rendering.ts` exists to prevent. The trailing
|
|
150
|
+
* line names the collapsed total and both ways to see it, for the same reason.
|
|
151
|
+
*
|
|
152
|
+
* That trailing line points at THIS audit's YAML report, deliberately — do not
|
|
153
|
+
* broaden it back into a claim about "the YAML report" in general. It is only
|
|
154
|
+
* true of the verbs that emit full `issues:` arrays, and which verbs those are
|
|
155
|
+
* has changed: `vat skills build` now publishes them too, so the sentence is
|
|
156
|
+
* shared rather than re-spelled (see `formatCollapsedFindingsHint`, which takes
|
|
157
|
+
* the report name for exactly this reason). Any verb that publishes counts alone
|
|
158
|
+
* must still not use it — there, it would send a CI consumer to a document that
|
|
159
|
+
* cannot answer the question.
|
|
160
|
+
*
|
|
161
|
+
* Pure: takes results, returns lines. It reads `issues` and never rewrites it,
|
|
162
|
+
* because `runAuditAtPath` builds the YAML document from the very same array.
|
|
163
|
+
*
|
|
164
|
+
* @internal Exported for unit testing only — not part of the public CLI API.
|
|
165
|
+
*/
|
|
166
|
+
export declare function formatAuditFindingsLines(results: readonly ValidationResult[], root: string, verbose: boolean): string[];
|
|
99
167
|
/**
|
|
100
168
|
* Reset all module-level audit caches. Must be called at the start of every
|
|
101
169
|
* independent audit invocation so in-process callers (CLI entrypoint AND
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|