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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +4 -3
  2. package/dist/bin/vat +1 -1
  3. package/dist/bin/vat.js +1 -1
  4. package/dist/bin/vat.js.map +1 -1
  5. package/dist/commands/audit/hierarchical-output.d.ts +6 -2
  6. package/dist/commands/audit/hierarchical-output.d.ts.map +1 -1
  7. package/dist/commands/audit/hierarchical-output.js +93 -50
  8. package/dist/commands/audit/hierarchical-output.js.map +1 -1
  9. package/dist/commands/audit-settings.d.ts +35 -0
  10. package/dist/commands/audit-settings.d.ts.map +1 -1
  11. package/dist/commands/audit-settings.js +121 -51
  12. package/dist/commands/audit-settings.js.map +1 -1
  13. package/dist/commands/audit.d.ts +63 -1
  14. package/dist/commands/audit.d.ts.map +1 -1
  15. package/dist/commands/audit.js +329 -187
  16. package/dist/commands/audit.js.map +1 -1
  17. package/dist/commands/build.d.ts.map +1 -1
  18. package/dist/commands/build.js +47 -18
  19. package/dist/commands/build.js.map +1 -1
  20. package/dist/commands/claude/marketplace/license-utils.d.ts +39 -2
  21. package/dist/commands/claude/marketplace/license-utils.d.ts.map +1 -1
  22. package/dist/commands/claude/marketplace/license-utils.js +114 -68
  23. package/dist/commands/claude/marketplace/license-utils.js.map +1 -1
  24. package/dist/commands/claude/marketplace/publish.js +5 -4
  25. package/dist/commands/claude/marketplace/publish.js.map +1 -1
  26. package/dist/commands/claude/marketplace/validate.d.ts.map +1 -1
  27. package/dist/commands/claude/marketplace/validate.js +13 -19
  28. package/dist/commands/claude/marketplace/validate.js.map +1 -1
  29. package/dist/commands/claude/org/skills.d.ts +11 -3
  30. package/dist/commands/claude/org/skills.d.ts.map +1 -1
  31. package/dist/commands/claude/org/skills.js +70 -20
  32. package/dist/commands/claude/org/skills.js.map +1 -1
  33. package/dist/commands/claude/plugin/build.d.ts +93 -0
  34. package/dist/commands/claude/plugin/build.d.ts.map +1 -1
  35. package/dist/commands/claude/plugin/build.js +83 -39
  36. package/dist/commands/claude/plugin/build.js.map +1 -1
  37. package/dist/commands/claude/plugin/marketplace-json.d.ts +36 -0
  38. package/dist/commands/claude/plugin/marketplace-json.d.ts.map +1 -0
  39. package/dist/commands/claude/plugin/marketplace-json.js +34 -0
  40. package/dist/commands/claude/plugin/marketplace-json.js.map +1 -0
  41. package/dist/commands/claude/plugin/plugin-json-merge.d.ts +30 -1
  42. package/dist/commands/claude/plugin/plugin-json-merge.d.ts.map +1 -1
  43. package/dist/commands/claude/plugin/plugin-json-merge.js +92 -14
  44. package/dist/commands/claude/plugin/plugin-json-merge.js.map +1 -1
  45. package/dist/commands/claude/plugin/tree-copy.d.ts.map +1 -1
  46. package/dist/commands/claude/plugin/tree-copy.js +0 -1
  47. package/dist/commands/claude/plugin/tree-copy.js.map +1 -1
  48. package/dist/commands/corpus/runner.d.ts.map +1 -1
  49. package/dist/commands/corpus/runner.js +15 -26
  50. package/dist/commands/corpus/runner.js.map +1 -1
  51. package/dist/commands/doctor.d.ts +57 -8
  52. package/dist/commands/doctor.d.ts.map +1 -1
  53. package/dist/commands/doctor.js +142 -67
  54. package/dist/commands/doctor.js.map +1 -1
  55. package/dist/commands/phase-utils.d.ts +62 -2
  56. package/dist/commands/phase-utils.d.ts.map +1 -1
  57. package/dist/commands/phase-utils.js +74 -2
  58. package/dist/commands/phase-utils.js.map +1 -1
  59. package/dist/commands/resources/index.d.ts.map +1 -1
  60. package/dist/commands/resources/index.js +13 -6
  61. package/dist/commands/resources/index.js.map +1 -1
  62. package/dist/commands/resources/validate.d.ts.map +1 -1
  63. package/dist/commands/resources/validate.js +38 -24
  64. package/dist/commands/resources/validate.js.map +1 -1
  65. package/dist/commands/skill/review.d.ts.map +1 -1
  66. package/dist/commands/skill/review.js +33 -20
  67. package/dist/commands/skill/review.js.map +1 -1
  68. package/dist/commands/skills/build.d.ts +51 -0
  69. package/dist/commands/skills/build.d.ts.map +1 -1
  70. package/dist/commands/skills/build.js +91 -54
  71. package/dist/commands/skills/build.js.map +1 -1
  72. package/dist/commands/skills/package.d.ts +2 -0
  73. package/dist/commands/skills/package.d.ts.map +1 -1
  74. package/dist/commands/skills/package.js +61 -42
  75. package/dist/commands/skills/package.js.map +1 -1
  76. package/dist/commands/skills/skill-discovery.d.ts.map +1 -1
  77. package/dist/commands/skills/skill-discovery.js +9 -1
  78. package/dist/commands/skills/skill-discovery.js.map +1 -1
  79. package/dist/commands/skills/validate.d.ts +38 -0
  80. package/dist/commands/skills/validate.d.ts.map +1 -1
  81. package/dist/commands/skills/validate.js +125 -70
  82. package/dist/commands/skills/validate.js.map +1 -1
  83. package/dist/commands/validate.d.ts.map +1 -1
  84. package/dist/commands/validate.js +11 -5
  85. package/dist/commands/validate.js.map +1 -1
  86. package/dist/commands/verify.d.ts.map +1 -1
  87. package/dist/commands/verify.js +69 -26
  88. package/dist/commands/verify.js.map +1 -1
  89. package/dist/utils/config-loader.d.ts.map +1 -1
  90. package/dist/utils/config-loader.js +0 -2
  91. package/dist/utils/config-loader.js.map +1 -1
  92. package/dist/utils/issue-anchor.d.ts +26 -0
  93. package/dist/utils/issue-anchor.d.ts.map +1 -0
  94. package/dist/utils/issue-anchor.js +39 -0
  95. package/dist/utils/issue-anchor.js.map +1 -0
  96. package/dist/utils/issue-rendering.d.ts +61 -0
  97. package/dist/utils/issue-rendering.d.ts.map +1 -0
  98. package/dist/utils/issue-rendering.js +135 -0
  99. package/dist/utils/issue-rendering.js.map +1 -0
  100. package/dist/utils/output.d.ts +26 -4
  101. package/dist/utils/output.d.ts.map +1 -1
  102. package/dist/utils/output.js +27 -6
  103. package/dist/utils/output.js.map +1 -1
  104. package/dist/utils/project-root-policy.d.ts +2 -2
  105. package/dist/utils/project-root-policy.js +2 -2
  106. package/dist/utils/validate-help-files.d.ts +3 -2
  107. package/dist/utils/validate-help-files.d.ts.map +1 -1
  108. package/dist/utils/validate-help-files.js +48 -5
  109. package/dist/utils/validate-help-files.js.map +1 -1
  110. package/dist/utils/verdict-helpers.d.ts +10 -2
  111. package/dist/utils/verdict-helpers.d.ts.map +1 -1
  112. package/dist/utils/verdict-helpers.js +13 -3
  113. package/dist/utils/verdict-helpers.js.map +1 -1
  114. package/docs/audit.md +40 -14
  115. package/docs/doctor.md +46 -10
  116. package/docs/index.md +1 -1
  117. package/docs/resources.md +24 -8
  118. package/docs/skills.md +2 -2
  119. package/package.json +12 -12
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Rendering for the four `ValidationIssue` anchors.
3
+ *
4
+ * `location` / `line` / `field` are independent fields on the issue (see the
5
+ * anchor contract on `ValidationIssue` in `@vibe-agent-toolkit/agent-schema`).
6
+ * Splitting them apart in the producers only pays off if the renderers put
7
+ * them back together — a `line` that no output surface prints is a `line` that,
8
+ * from the user's side, was deleted. This is the one place that join happens,
9
+ * so every command spells an anchor the same way.
10
+ */
11
+ import type { ValidationIssue } from '@vibe-agent-toolkit/agent-schema';
12
+ /**
13
+ * Render an issue's anchor as a single human/tool-readable string.
14
+ *
15
+ * - `docs/guide.md` — file only
16
+ * - `docs/guide.md:24` — file + line, the `file:line` convention every editor
17
+ * and `grep -n` consumer already knows how to jump to
18
+ * - `SKILL.md (frontmatter.description)` — file + document-internal field
19
+ * - `(frontmatter.description)` — field with no known file (should not happen
20
+ * for skills-lane issues, but the renderer must not silently drop it)
21
+ *
22
+ * Returns `undefined` when the issue carries no anchor at all, so callers can
23
+ * skip the line entirely rather than print an empty label.
24
+ */
25
+ export declare function formatIssueAnchor(issue: ValidationIssue): string | undefined;
26
+ //# sourceMappingURL=issue-anchor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-anchor.d.ts","sourceRoot":"","sources":["../../src/utils/issue-anchor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAe5E"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Rendering for the four `ValidationIssue` anchors.
3
+ *
4
+ * `location` / `line` / `field` are independent fields on the issue (see the
5
+ * anchor contract on `ValidationIssue` in `@vibe-agent-toolkit/agent-schema`).
6
+ * Splitting them apart in the producers only pays off if the renderers put
7
+ * them back together — a `line` that no output surface prints is a `line` that,
8
+ * from the user's side, was deleted. This is the one place that join happens,
9
+ * so every command spells an anchor the same way.
10
+ */
11
+ /**
12
+ * Render an issue's anchor as a single human/tool-readable string.
13
+ *
14
+ * - `docs/guide.md` — file only
15
+ * - `docs/guide.md:24` — file + line, the `file:line` convention every editor
16
+ * and `grep -n` consumer already knows how to jump to
17
+ * - `SKILL.md (frontmatter.description)` — file + document-internal field
18
+ * - `(frontmatter.description)` — field with no known file (should not happen
19
+ * for skills-lane issues, but the renderer must not silently drop it)
20
+ *
21
+ * Returns `undefined` when the issue carries no anchor at all, so callers can
22
+ * skip the line entirely rather than print an empty label.
23
+ */
24
+ export function formatIssueAnchor(issue) {
25
+ const hasLocation = issue.location !== undefined && issue.location !== '';
26
+ const hasField = issue.field !== undefined && issue.field !== '';
27
+ if (!hasLocation && !hasField) {
28
+ return undefined;
29
+ }
30
+ let anchor = hasLocation ? issue.location : '';
31
+ if (issue.line !== undefined) {
32
+ anchor = `${anchor}:${String(issue.line)}`;
33
+ }
34
+ if (hasField) {
35
+ anchor = anchor === '' ? `(${issue.field})` : `${anchor} (${issue.field})`;
36
+ }
37
+ return anchor;
38
+ }
39
+ //# sourceMappingURL=issue-anchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-anchor.js","sourceRoot":"","sources":["../../src/utils/issue-anchor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAsB;IACtD,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE,CAAC;IAC1E,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;IACjE,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,MAAM,GAAG,WAAW,CAAC,CAAC,CAAE,KAAK,CAAC,QAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7C,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAe,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,KAAK,CAAC,KAAe,GAAG,CAAC;IACjG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Rendering for SETS of `ValidationIssue`s — the severity label, the set's
3
+ * heading, and the per-issue block.
4
+ *
5
+ * `issue-anchor.ts` answers "where is this issue?"; this module answers "what
6
+ * severity is it, and what is in this set?". Both exist because the answer has
7
+ * to be spelled identically by every command: two renderers that each invent
8
+ * their own severity prefix is exactly how `info` findings came to be printed
9
+ * as `[WARNING]` in `vat skills build` AND `vat claude plugin build`, and how a
10
+ * mixed set came to be labelled "post-build error(s)" wholesale.
11
+ *
12
+ * The failure mode these helpers exist to prevent is directional: every
13
+ * hand-rolled severity collapse in this codebase mapped the case it could not
14
+ * represent onto the REASSURING one (info ⇒ "warning", warnings ⇒ "all
15
+ * passed"). That is why none of it was ever reported — it produces silence, not
16
+ * a false alarm.
17
+ */
18
+ import { type SeverityCounts, type ValidationIssue } from '@vibe-agent-toolkit/agent-schema';
19
+ import type { PackageSkillResult } from '@vibe-agent-toolkit/agent-skills';
20
+ /** Render an issue's own severity as itself. */
21
+ export declare function severityLabel(severity: ValidationIssue['severity']): string;
22
+ /**
23
+ * The severity distribution in prose: `1 error, 2 warnings, 3 info`.
24
+ *
25
+ * Zero buckets are omitted so the phrase names only what is present. An
26
+ * all-zero set returns `no findings` rather than an empty string, because an
27
+ * empty string silently disappears into whatever sentence embeds it.
28
+ */
29
+ export declare function formatSeverityBreakdown(counts: SeverityCounts): string;
30
+ /**
31
+ * Heading for a set of issues: `3 post-build issues (1 error, 2 info)`.
32
+ *
33
+ * The breakdown is not decoration — it is the only part of the heading that
34
+ * cannot be wrong about a mixed set. `noun` qualifies the set ("post-build"),
35
+ * and is omitted entirely when empty.
36
+ */
37
+ export declare function formatIssueSetHeading(issues: readonly ValidationIssue[], noun?: string): string;
38
+ /**
39
+ * Render one issue as its own lines, each prefixed with `indent`.
40
+ *
41
+ * Returns an array rather than writing, so a caller can pick its own stream and
42
+ * a unit test can assert over every line without capturing output.
43
+ */
44
+ export declare function formatIssueLines(issue: ValidationIssue, indent?: string): string[];
45
+ /**
46
+ * Every post-build finding a `PackageSkillResult` carries, from BOTH channels.
47
+ *
48
+ * `hasErrors` is the OR of two independent sets — the packager's own framework
49
+ * run (`postBuildIssues`: link exclusions, unreferenced files, broken packaged
50
+ * links) and the full validation of the built tree (`postBuildValidation`). A
51
+ * renderer that walks only `postBuildIssues` therefore prints NOTHING for a
52
+ * build that failed purely on `postBuildValidation`: the user is told the build
53
+ * failed and shown no reason. Reading both is the whole point of this helper.
54
+ *
55
+ * `postBuildValidation.allErrors` is the full emitted set including `info`
56
+ * (see its doc comment — the name lies), so info findings survive here.
57
+ */
58
+ export declare function collectPostBuildIssues(result: PackageSkillResult): ValidationIssue[];
59
+ /** Sum severity counts across lanes (per-skill → per-plugin → per-run). */
60
+ export declare function sumSeverityCounts(counts: readonly SeverityCounts[]): SeverityCounts;
61
+ //# sourceMappingURL=issue-rendering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-rendering.d.ts","sourceRoot":"","sources":["../../src/utils/issue-rendering.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAiB3E,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,GAAG,MAAM,CAE3E;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAYtE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAKR;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,SAAK,GAAG,MAAM,EAAE,CAY9E;AAcD;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,eAAe,EAAE,CAapF;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,cAAc,CASnF"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Rendering for SETS of `ValidationIssue`s — the severity label, the set's
3
+ * heading, and the per-issue block.
4
+ *
5
+ * `issue-anchor.ts` answers "where is this issue?"; this module answers "what
6
+ * severity is it, and what is in this set?". Both exist because the answer has
7
+ * to be spelled identically by every command: two renderers that each invent
8
+ * their own severity prefix is exactly how `info` findings came to be printed
9
+ * as `[WARNING]` in `vat skills build` AND `vat claude plugin build`, and how a
10
+ * mixed set came to be labelled "post-build error(s)" wholesale.
11
+ *
12
+ * The failure mode these helpers exist to prevent is directional: every
13
+ * hand-rolled severity collapse in this codebase mapped the case it could not
14
+ * represent onto the REASSURING one (info ⇒ "warning", warnings ⇒ "all
15
+ * passed"). That is why none of it was ever reported — it produces silence, not
16
+ * a false alarm.
17
+ */
18
+ import { countBySeverity, } from '@vibe-agent-toolkit/agent-schema';
19
+ import { formatIssueAnchor } from './issue-anchor.js';
20
+ /**
21
+ * Uppercase label for a resolved severity.
22
+ *
23
+ * A total map, not an `=== 'error' ? … : …` ternary: the ternary is what
24
+ * rendered every non-error severity — `info` included — as `WARNING`.
25
+ */
26
+ const SEVERITY_LABELS = {
27
+ error: 'ERROR',
28
+ warning: 'WARNING',
29
+ info: 'INFO',
30
+ ignore: 'IGNORED',
31
+ };
32
+ /** Render an issue's own severity as itself. */
33
+ export function severityLabel(severity) {
34
+ return SEVERITY_LABELS[severity];
35
+ }
36
+ /**
37
+ * The severity distribution in prose: `1 error, 2 warnings, 3 info`.
38
+ *
39
+ * Zero buckets are omitted so the phrase names only what is present. An
40
+ * all-zero set returns `no findings` rather than an empty string, because an
41
+ * empty string silently disappears into whatever sentence embeds it.
42
+ */
43
+ export function formatSeverityBreakdown(counts) {
44
+ const parts = [];
45
+ if (counts.errors > 0) {
46
+ parts.push(`${counts.errors} error${counts.errors === 1 ? '' : 's'}`);
47
+ }
48
+ if (counts.warnings > 0) {
49
+ parts.push(`${counts.warnings} warning${counts.warnings === 1 ? '' : 's'}`);
50
+ }
51
+ if (counts.info > 0) {
52
+ parts.push(`${counts.info} info`);
53
+ }
54
+ return parts.length === 0 ? 'no findings' : parts.join(', ');
55
+ }
56
+ /**
57
+ * Heading for a set of issues: `3 post-build issues (1 error, 2 info)`.
58
+ *
59
+ * The breakdown is not decoration — it is the only part of the heading that
60
+ * cannot be wrong about a mixed set. `noun` qualifies the set ("post-build"),
61
+ * and is omitted entirely when empty.
62
+ */
63
+ export function formatIssueSetHeading(issues, noun) {
64
+ const qualifier = noun === undefined || noun === '' ? '' : `${noun} `;
65
+ const total = issues.length;
66
+ const breakdown = formatSeverityBreakdown(countBySeverity(issues));
67
+ return `${total} ${qualifier}issue${total === 1 ? '' : 's'} (${breakdown})`;
68
+ }
69
+ /**
70
+ * Render one issue as its own lines, each prefixed with `indent`.
71
+ *
72
+ * Returns an array rather than writing, so a caller can pick its own stream and
73
+ * a unit test can assert over every line without capturing output.
74
+ */
75
+ export function formatIssueLines(issue, indent = '') {
76
+ const lines = [
77
+ `${indent}[${severityLabel(issue.severity)}] [${String(issue.code)}] ${String(issue.message)}`,
78
+ ];
79
+ const anchor = formatIssueAnchor(issue);
80
+ if (anchor !== undefined) {
81
+ lines.push(`${indent} Location: ${anchor}`);
82
+ }
83
+ if (issue.fix) {
84
+ lines.push(`${indent} Fix: ${String(issue.fix)}`);
85
+ }
86
+ return lines;
87
+ }
88
+ /** Identity of an issue for de-duplication across the two post-build channels. */
89
+ function issueIdentity(issue) {
90
+ return [
91
+ issue.code,
92
+ issue.severity,
93
+ issue.location ?? '',
94
+ issue.line === undefined ? '' : String(issue.line),
95
+ issue.field ?? '',
96
+ issue.message,
97
+ ].join('\0');
98
+ }
99
+ /**
100
+ * Every post-build finding a `PackageSkillResult` carries, from BOTH channels.
101
+ *
102
+ * `hasErrors` is the OR of two independent sets — the packager's own framework
103
+ * run (`postBuildIssues`: link exclusions, unreferenced files, broken packaged
104
+ * links) and the full validation of the built tree (`postBuildValidation`). A
105
+ * renderer that walks only `postBuildIssues` therefore prints NOTHING for a
106
+ * build that failed purely on `postBuildValidation`: the user is told the build
107
+ * failed and shown no reason. Reading both is the whole point of this helper.
108
+ *
109
+ * `postBuildValidation.allErrors` is the full emitted set including `info`
110
+ * (see its doc comment — the name lies), so info findings survive here.
111
+ */
112
+ export function collectPostBuildIssues(result) {
113
+ const seen = new Set();
114
+ const merged = [];
115
+ for (const issue of [
116
+ ...(result.postBuildIssues ?? []),
117
+ ...(result.postBuildValidation?.allErrors ?? []),
118
+ ]) {
119
+ const identity = issueIdentity(issue);
120
+ if (seen.has(identity))
121
+ continue;
122
+ seen.add(identity);
123
+ merged.push(issue);
124
+ }
125
+ return merged;
126
+ }
127
+ /** Sum severity counts across lanes (per-skill → per-plugin → per-run). */
128
+ export function sumSeverityCounts(counts) {
129
+ return counts.reduce((acc, c) => ({
130
+ errors: acc.errors + c.errors,
131
+ warnings: acc.warnings + c.warnings,
132
+ info: acc.info + c.info,
133
+ }), { errors: 0, warnings: 0, info: 0 });
134
+ }
135
+ //# sourceMappingURL=issue-rendering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-rendering.js","sourceRoot":"","sources":["../../src/utils/issue-rendering.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,22 @@
3
3
  * YAML output on stdout, logs on stderr
4
4
  */
5
5
  /**
6
- * Write YAML output to stdout with document markers
6
+ * Write a single YAML document to stdout, opened with `---`.
7
+ *
8
+ * There is deliberately NO trailing marker. `---` OPENS a document in YAML; the
9
+ * end-of-document marker is `...`. Emitting `---` at the end therefore opened a
10
+ * second, empty document, so every command's stdout was a two-document stream and
11
+ * a plain `YAML.parse()` threw `Source contains multiple documents` — on output
12
+ * this CLI documents as "YAML summary → stdout (for programmatic parsing)".
13
+ *
14
+ * The repo's own test helper had already been written around it: `executeCli…`
15
+ * calls `parseAllDocuments(...)` and takes `docs[0]`, with a comment saying "to
16
+ * handle document markers". That workaround is what kept the defect invisible —
17
+ * every consumer that did the obvious thing instead got an exception.
18
+ *
19
+ * Dropping the trailer also makes this agree with the seven hand-rolled emit
20
+ * sites elsewhere in the CLI, none of which ever wrote one.
21
+ *
7
22
  * @param data - Data to serialize as YAML
8
23
  */
9
24
  export declare function writeYamlOutput(data: unknown): void;
@@ -13,8 +28,15 @@ export declare function writeYamlOutput(data: unknown): void;
13
28
  */
14
29
  export declare function flushStdout(): Promise<void>;
15
30
  /**
16
- * Write test-format error to stderr
17
- * Format: file:line:column: message
31
+ * Write a test-format finding to stderr.
32
+ *
33
+ * Format: `file:line:column: severity: message` — the GCC/ESLint-compact
34
+ * convention, which every editor and CI log scraper already parses.
35
+ *
36
+ * The severity is not decoration. Only `error` findings fail the run, so a
37
+ * reader who cannot see the severity cannot tell which lines of a long report
38
+ * they have to act on. Omitting it made an info-severity note byte-identical in
39
+ * shape to a build-breaking error.
18
40
  */
19
- export declare function writeTestFormatError(file: string, line: number, column: number, message: string): void;
41
+ export declare function writeTestFormatError(file: string, line: number, column: number, severity: string, message: string): void;
20
42
  //# sourceMappingURL=output.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAQnD;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAQjD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,IAAI,CAEN"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAOnD;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAQjD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,IAAI,CAEN"}
@@ -4,7 +4,22 @@
4
4
  */
5
5
  import * as yaml from 'yaml';
6
6
  /**
7
- * Write YAML output to stdout with document markers
7
+ * Write a single YAML document to stdout, opened with `---`.
8
+ *
9
+ * There is deliberately NO trailing marker. `---` OPENS a document in YAML; the
10
+ * end-of-document marker is `...`. Emitting `---` at the end therefore opened a
11
+ * second, empty document, so every command's stdout was a two-document stream and
12
+ * a plain `YAML.parse()` threw `Source contains multiple documents` — on output
13
+ * this CLI documents as "YAML summary → stdout (for programmatic parsing)".
14
+ *
15
+ * The repo's own test helper had already been written around it: `executeCli…`
16
+ * calls `parseAllDocuments(...)` and takes `docs[0]`, with a comment saying "to
17
+ * handle document markers". That workaround is what kept the defect invisible —
18
+ * every consumer that did the obvious thing instead got an exception.
19
+ *
20
+ * Dropping the trailer also makes this agree with the seven hand-rolled emit
21
+ * sites elsewhere in the CLI, none of which ever wrote one.
22
+ *
8
23
  * @param data - Data to serialize as YAML
9
24
  */
10
25
  export function writeYamlOutput(data) {
@@ -14,7 +29,6 @@ export function writeYamlOutput(data) {
14
29
  lineWidth: 120,
15
30
  aliasDuplicateObjects: false,
16
31
  }));
17
- process.stdout.write('---\n');
18
32
  }
19
33
  /**
20
34
  * Flush stdout before writing to stderr
@@ -31,10 +45,17 @@ export async function flushStdout() {
31
45
  });
32
46
  }
33
47
  /**
34
- * Write test-format error to stderr
35
- * Format: file:line:column: message
48
+ * Write a test-format finding to stderr.
49
+ *
50
+ * Format: `file:line:column: severity: message` — the GCC/ESLint-compact
51
+ * convention, which every editor and CI log scraper already parses.
52
+ *
53
+ * The severity is not decoration. Only `error` findings fail the run, so a
54
+ * reader who cannot see the severity cannot tell which lines of a long report
55
+ * they have to act on. Omitting it made an info-severity note byte-identical in
56
+ * shape to a build-breaking error.
36
57
  */
37
- export function writeTestFormatError(file, line, column, message) {
38
- process.stderr.write(`${file}:${line}:${column}: ${message}\n`);
58
+ export function writeTestFormatError(file, line, column, severity, message) {
59
+ process.stderr.write(`${file}:${line}:${column}: ${severity}: ${message}\n`);
39
60
  }
40
61
  //# sourceMappingURL=output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QACxC,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,GAAG;QACd,qBAAqB,EAAE,KAAK;KAC7B,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,IAAI,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,IAAY,EACZ,MAAc,EACd,OAAe;IAEf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QACxC,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,GAAG;QACd,qBAAqB,EAAE,KAAK;KAC7B,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,IAAI,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,IAAY,EACZ,MAAc,EACd,QAAgB,EAChB,OAAe;IAEf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,KAAK,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC;AAC/E,CAAC"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * CLI-boundary policy helpers for projectRoot resolution.
3
3
  *
4
- * Per docs/superpowers/specs/2026-05-17-root-model-and-leading-slash-design.md §7,
5
- * each command picks one of these to fulfill its declared policy:
4
+ * Root discovery belongs at the CLI boundary, not inside libraries. Each command
5
+ * picks exactly one of these to fulfill its declared policy:
6
6
  *
7
7
  * - `required` → {@link requireProjectRoot} — fails fast with a clear message.
8
8
  * - `loud-cwd` → {@link projectRootOrLoudCwd} — falls back to cwd with a stderr warning.
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * CLI-boundary policy helpers for projectRoot resolution.
3
3
  *
4
- * Per docs/superpowers/specs/2026-05-17-root-model-and-leading-slash-design.md §7,
5
- * each command picks one of these to fulfill its declared policy:
4
+ * Root discovery belongs at the CLI boundary, not inside libraries. Each command
5
+ * picks exactly one of these to fulfill its declared policy:
6
6
  *
7
7
  * - `required` → {@link requireProjectRoot} — fails fast with a clear message.
8
8
  * - `loud-cwd` → {@link projectRootOrLoudCwd} — falls back to cwd with a stderr warning.
@@ -6,9 +6,10 @@
6
6
  * rather than runtime errors when users request verbose help.
7
7
  */
8
8
  /**
9
- * Validate that all required help files exist
9
+ * Validate the help-docs directory in BOTH directions.
10
10
  *
11
- * @throws {Error} If any required help file is missing
11
+ * @throws {Error} If a required help file is missing, or a shipped doc is
12
+ * classified as neither command-served nor prose-only.
12
13
  */
13
14
  export declare function validateHelpFiles(): void;
14
15
  //# sourceMappingURL=validate-help-files.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-help-files.d.ts","sourceRoot":"","sources":["../../src/utils/validate-help-files.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAuBxC"}
1
+ {"version":3,"file":"validate-help-files.d.ts","sourceRoot":"","sources":["../../src/utils/validate-help-files.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0CH;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAkDxC"}
@@ -5,13 +5,17 @@
5
5
  * This provides "fail fast" behavior - missing help files cause build failure
6
6
  * rather than runtime errors when users request verbose help.
7
7
  */
8
- import { existsSync } from 'node:fs';
8
+ import { existsSync, readdirSync } from 'node:fs';
9
9
  import { dirname } from 'node:path';
10
10
  import { fileURLToPath, pathToFileURL } from 'node:url';
11
11
  import { safePath } from '@vibe-agent-toolkit/utils';
12
12
  /**
13
- * Required help documentation files
14
- * Each entry maps to a file in packages/cli/docs/
13
+ * Files `loadVerboseHelp()` is actually asked for by a command.
14
+ *
15
+ * This list must stay in step with the `loadVerboseHelp(...)` call sites —
16
+ * each entry is a document some `--help --verbose` path will read at runtime,
17
+ * and a missing one degrades to an in-band "Help Documentation Not Found" page
18
+ * that still exits 0.
15
19
  */
16
20
  const REQUIRED_HELP_FILES = [
17
21
  'index.md', // Root-level verbose help (vat --help --verbose)
@@ -20,9 +24,28 @@ const REQUIRED_HELP_FILES = [
20
24
  'agent.md', // Agent command verbose help (vat agent --help --verbose)
21
25
  ];
22
26
  /**
23
- * Validate that all required help files exist
27
+ * Shipped docs that NO command serves — reference pages, reached only by a
28
+ * prose link from `docs/index.md`, this repo's CLAUDE.md, or the README.
29
+ *
30
+ * Recorded explicitly because the forward check alone cannot see them: they are
31
+ * published in the npm package (`files: ["docs"]`) and read like verbose help,
32
+ * so an author can reasonably expect `vat audit --help --verbose` to print
33
+ * `audit.md` when in fact nothing does. Every file in `docs/` must be in this
34
+ * set or in {@link REQUIRED_HELP_FILES}, so adding a page forces the author to
35
+ * say which it is.
36
+ */
37
+ const PROSE_ONLY_HELP_FILES = new Set([
38
+ 'audit.md',
39
+ 'doctor.md',
40
+ 'mcp.md',
41
+ 'skills.md',
42
+ 'skill-test.md',
43
+ ]);
44
+ /**
45
+ * Validate the help-docs directory in BOTH directions.
24
46
  *
25
- * @throws {Error} If any required help file is missing
47
+ * @throws {Error} If a required help file is missing, or a shipped doc is
48
+ * classified as neither command-served nor prose-only.
26
49
  */
27
50
  export function validateHelpFiles() {
28
51
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -42,6 +65,26 @@ export function validateHelpFiles() {
42
65
  `These files must exist for verbose help (--help --verbose) to work.\n` +
43
66
  `Create them before building the CLI package.`);
44
67
  }
68
+ // Reverse direction: a doc nobody serves and nobody classified.
69
+ const required = new Set(REQUIRED_HELP_FILES);
70
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- docsDir is derived from this module's own location
71
+ const present = readdirSync(docsDir).filter(f => f.endsWith('.md'));
72
+ const unclassified = present.filter(f => !required.has(f) && !PROSE_ONLY_HELP_FILES.has(f));
73
+ if (unclassified.length > 0) {
74
+ const fileList = unclassified.map(f => ` - docs/${f}`).join('\n');
75
+ throw new Error(`Unclassified help documentation files:\n${fileList}\n\n` +
76
+ `Every file in packages/cli/docs/ ships in the npm package and must be\n` +
77
+ `either served by a command (add it to REQUIRED_HELP_FILES and call\n` +
78
+ `loadVerboseHelp('<name>') from that command's help path) or recorded as\n` +
79
+ `reference-only (add it to PROSE_ONLY_HELP_FILES). Without this, a page can\n` +
80
+ `be written, published, and never reachable from any --help --verbose.`);
81
+ }
82
+ const stalelyClassified = [...PROSE_ONLY_HELP_FILES].filter(f => !present.includes(f));
83
+ if (stalelyClassified.length > 0) {
84
+ throw new Error(`PROSE_ONLY_HELP_FILES lists files that no longer exist:\n` +
85
+ stalelyClassified.map(f => ` - docs/${f}`).join('\n') +
86
+ `\n\nRemove the stale entries.`);
87
+ }
45
88
  }
46
89
  /**
47
90
  * Run validation if this file is executed directly
@@ -1 +1 @@
1
- {"version":3,"file":"validate-help-files.js","sourceRoot":"","sources":["../../src/utils/validate-help-files.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD;;;GAGG;AACH,MAAM,mBAAmB,GAAG;IAC1B,UAAU,EAAO,iDAAiD;IAClE,cAAc,EAAG,kEAAkE;IACnF,QAAQ,EAAS,sDAAsD;IACvE,UAAU,EAAO,0DAA0D;CACnE,CAAC;AAEX;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEnD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClD,qHAAqH;QACrH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,IAAI,KAAK,CACb,+CAA+C,QAAQ,MAAM;YAC7D,uEAAuE;YACvE,8CAA8C,CAC/C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,IAAI,CAAC;QACH,iBAAiB,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAChD,OAAO,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"validate-help-files.js","sourceRoot":"","sources":["../../src/utils/validate-help-files.ts"],"names":[],"mappings":"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"}
@@ -27,8 +27,16 @@ export declare function verdictToIssue(verdict: Verdict, location: string): Vali
27
27
  * config-level targets only. Plugin-level and marketplace-level targets
28
28
  * are surfaced by the analyzer (`vat audit --compat`) which has its own
29
29
  * walk over plugin / marketplace manifests.
30
+ *
31
+ * Takes the skill's path plus the anchor root and re-bases internally rather
32
+ * than accepting a pre-rendered `location`. That is deliberate: when this took
33
+ * a caller-supplied location string, each of the four call sites got its own
34
+ * chance to answer "relative to what?" and three answered "absolute" — one
35
+ * `vat skill review --yaml` document ended up carrying two coordinate systems,
36
+ * and `vat skills validate` leaked a full home-directory path. Owning the
37
+ * re-base here makes that unrepresentable at every call site at once.
30
38
  */
31
- export declare function computeConfigVerdicts(observations: readonly Observation[], configTargets: ReadonlyArray<Target> | undefined, location: string): ValidationIssue[];
39
+ export declare function computeConfigVerdicts(observations: readonly Observation[], configTargets: ReadonlyArray<Target> | undefined, skillSourcePath: string, locationRoot: string): ValidationIssue[];
32
40
  /**
33
41
  * Mutate a PackagingValidationResult in place to include compat verdicts
34
42
  * derived from the result's observations and the configured targets.
@@ -37,5 +45,5 @@ export declare function computeConfigVerdicts(observations: readonly Observation
37
45
  * based on resolved severity (warning → activeWarnings; info stays only
38
46
  * in allErrors). Verdicts are not allow-filterable.
39
47
  */
40
- export declare function applyConfigVerdicts(result: PackagingValidationResult, configTargets: ReadonlyArray<Target> | undefined, skillSourcePath: string): void;
48
+ export declare function applyConfigVerdicts(result: PackagingValidationResult, configTargets: ReadonlyArray<Target> | undefined, skillSourcePath: string, locationRoot: string): void;
41
49
  //# sourceMappingURL=verdict-helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verdict-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/verdict-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,wCAAwC,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAUlF;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,EAChD,QAAQ,EAAE,MAAM,GACf,eAAe,EAAE,CAiBnB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,yBAAyB,EACjC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,EAChD,eAAe,EAAE,MAAM,GACtB,IAAI,CAgBN"}
1
+ {"version":3,"file":"verdict-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/verdict-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,wCAAwC,CAAC;AAGhD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAUlF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,EAChD,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CAkBnB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,yBAAyB,EACjC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,EAChD,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,IAAI,CAqBN"}
@@ -14,6 +14,7 @@
14
14
  */
15
15
  import { CODE_REGISTRY } from '@vibe-agent-toolkit/agent-schema';
16
16
  import { computeVerdicts, resolveEffectiveTargets, } from '@vibe-agent-toolkit/claude-marketplace';
17
+ import { issueLocation } from '@vibe-agent-toolkit/utils';
17
18
  /**
18
19
  * Convert a verdict into a ValidationIssue using CODE_REGISTRY for severity,
19
20
  * fix and reference. Pure function — no I/O.
@@ -36,8 +37,16 @@ export function verdictToIssue(verdict, location) {
36
37
  * config-level targets only. Plugin-level and marketplace-level targets
37
38
  * are surfaced by the analyzer (`vat audit --compat`) which has its own
38
39
  * walk over plugin / marketplace manifests.
40
+ *
41
+ * Takes the skill's path plus the anchor root and re-bases internally rather
42
+ * than accepting a pre-rendered `location`. That is deliberate: when this took
43
+ * a caller-supplied location string, each of the four call sites got its own
44
+ * chance to answer "relative to what?" and three answered "absolute" — one
45
+ * `vat skill review --yaml` document ended up carrying two coordinate systems,
46
+ * and `vat skills validate` leaked a full home-directory path. Owning the
47
+ * re-base here makes that unrepresentable at every call site at once.
39
48
  */
40
- export function computeConfigVerdicts(observations, configTargets, location) {
49
+ export function computeConfigVerdicts(observations, configTargets, skillSourcePath, locationRoot) {
41
50
  if (observations.length === 0) {
42
51
  return [];
43
52
  }
@@ -50,6 +59,7 @@ export function computeConfigVerdicts(observations, configTargets, location) {
50
59
  observations: [...observations],
51
60
  targets: effectiveTargets,
52
61
  });
62
+ const location = issueLocation(skillSourcePath, locationRoot);
53
63
  return verdicts.map(v => verdictToIssue(v, location));
54
64
  }
55
65
  /**
@@ -60,8 +70,8 @@ export function computeConfigVerdicts(observations, configTargets, location) {
60
70
  * based on resolved severity (warning → activeWarnings; info stays only
61
71
  * in allErrors). Verdicts are not allow-filterable.
62
72
  */
63
- export function applyConfigVerdicts(result, configTargets, skillSourcePath) {
64
- const verdictIssues = computeConfigVerdicts(result.observations, configTargets, skillSourcePath);
73
+ export function applyConfigVerdicts(result, configTargets, skillSourcePath, locationRoot) {
74
+ const verdictIssues = computeConfigVerdicts(result.observations, configTargets, skillSourcePath, locationRoot);
65
75
  if (verdictIssues.length === 0) {
66
76
  return;
67
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"verdict-helpers.js","sourceRoot":"","sources":["../../src/utils/verdict-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,aAAa,EAAwB,MAAM,kCAAkC,CAAC;AAKvF,OAAO,EACL,eAAe,EACf,uBAAuB,GAGxB,MAAM,wCAAwC,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,QAAgB;IAC/D,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,eAAe;QAC/B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ;QACR,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAAoC,EACpC,aAAgD,EAChD,QAAgB;IAEhB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;QAC/C,aAAa,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QAC3E,aAAa,EAAE,SAAS;QACxB,kBAAkB,EAAE,SAAS;KAC9B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,eAAe,CAAC;QAC/B,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC;QAC/B,OAAO,EAAE,gBAAgB;KAC1B,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiC,EACjC,aAAgD,EAChD,eAAuB;IAEvB,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;IACjG,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;IAC1B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"verdict-helpers.js","sourceRoot":"","sources":["../../src/utils/verdict-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,aAAa,EAAwB,MAAM,kCAAkC,CAAC;AAKvF,OAAO,EACL,eAAe,EACf,uBAAuB,GAGxB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,QAAgB;IAC/D,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,eAAe;QAC/B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ;QACR,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAAoC,EACpC,aAAgD,EAChD,eAAuB,EACvB,YAAoB;IAEpB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;QAC/C,aAAa,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QAC3E,aAAa,EAAE,SAAS;QACxB,kBAAkB,EAAE,SAAS;KAC9B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,eAAe,CAAC;QAC/B,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC;QAC/B,OAAO,EAAE,gBAAgB;KAC1B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,aAAa,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAC9D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiC,EACjC,aAAgD,EAChD,eAAuB,EACvB,YAAoB;IAEpB,MAAM,aAAa,GAAG,qBAAqB,CACzC,MAAM,CAAC,YAAY,EACnB,aAAa,EACb,eAAe,EACf,YAAY,CACb,CAAC;IACF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;IAC1B,CAAC;AACH,CAAC"}