@vibe-agent-toolkit/cli 0.1.33-rc.3 → 0.1.34-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 (35) hide show
  1. package/dist/commands/audit/hierarchical-output.js +2 -2
  2. package/dist/commands/audit/hierarchical-output.js.map +1 -1
  3. package/dist/commands/audit.d.ts +7 -0
  4. package/dist/commands/audit.d.ts.map +1 -1
  5. package/dist/commands/audit.js +127 -21
  6. package/dist/commands/audit.js.map +1 -1
  7. package/dist/commands/claude/plugin/build.d.ts +4 -3
  8. package/dist/commands/claude/plugin/build.d.ts.map +1 -1
  9. package/dist/commands/claude/plugin/build.js +178 -71
  10. package/dist/commands/claude/plugin/build.js.map +1 -1
  11. package/dist/commands/claude/plugin/plugin-files.d.ts +19 -0
  12. package/dist/commands/claude/plugin/plugin-files.d.ts.map +1 -0
  13. package/dist/commands/claude/plugin/plugin-files.js +53 -0
  14. package/dist/commands/claude/plugin/plugin-files.js.map +1 -0
  15. package/dist/commands/claude/plugin/plugin-json-merge.d.ts +29 -0
  16. package/dist/commands/claude/plugin/plugin-json-merge.d.ts.map +1 -0
  17. package/dist/commands/claude/plugin/plugin-json-merge.js +76 -0
  18. package/dist/commands/claude/plugin/plugin-json-merge.js.map +1 -0
  19. package/dist/commands/claude/plugin/plugin-validators.d.ts +13 -0
  20. package/dist/commands/claude/plugin/plugin-validators.d.ts.map +1 -0
  21. package/dist/commands/claude/plugin/plugin-validators.js +59 -0
  22. package/dist/commands/claude/plugin/plugin-validators.js.map +1 -0
  23. package/dist/commands/claude/plugin/tree-copy.d.ts +23 -0
  24. package/dist/commands/claude/plugin/tree-copy.d.ts.map +1 -0
  25. package/dist/commands/claude/plugin/tree-copy.js +68 -0
  26. package/dist/commands/claude/plugin/tree-copy.js.map +1 -0
  27. package/dist/commands/mcp/collections.d.ts.map +1 -1
  28. package/dist/commands/mcp/collections.js +3 -0
  29. package/dist/commands/mcp/collections.js.map +1 -1
  30. package/dist/utils/config-loader.d.ts +6 -0
  31. package/dist/utils/config-loader.d.ts.map +1 -1
  32. package/dist/utils/config-loader.js +13 -4
  33. package/dist/utils/config-loader.js.map +1 -1
  34. package/docs/audit.md +6 -0
  35. package/package.json +11 -11
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Build-time validators for plugin declarations.
3
+ *
4
+ * - verifyPluginDirCaseMatch: guards against macOS/Windows case-insensitive FS drift
5
+ * (plugin: "foo-bar" -> plugins/Foo-Bar/ locally would break on Linux CI).
6
+ * - verifyNoCaseCollidingPluginNames: rejects pairs whose toLowerCase() collides.
7
+ * - parsePluginJsonFiles: parse-only JSON validation of hooks.json + .mcp.json
8
+ * (deep schema validation is Claude runtime's job).
9
+ */
10
+ import { existsSync } from 'node:fs';
11
+ import { readFile, readdir } from 'node:fs/promises';
12
+ import { safePath } from '@vibe-agent-toolkit/utils';
13
+ export async function verifyPluginDirCaseMatch(projectRoot, pluginName) {
14
+ const pluginsBase = safePath.join(projectRoot, 'plugins');
15
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- controlled path
16
+ if (!existsSync(pluginsBase))
17
+ return;
18
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- controlled path
19
+ const entries = await readdir(pluginsBase, { withFileTypes: true });
20
+ const matchInsensitive = entries.find((e) => e.isDirectory() && e.name.toLowerCase() === pluginName.toLowerCase());
21
+ if (matchInsensitive && matchInsensitive.name !== pluginName) {
22
+ throw new Error(`Plugin "${pluginName}" declared in config, but on-disk directory is "plugins/${matchInsensitive.name}/". ` +
23
+ `Names must match exactly (case-sensitive). This check catches macOS/Windows case-insensitive FS drift ` +
24
+ `that would break on Linux CI. Rename the directory or the config entry to match.`);
25
+ }
26
+ }
27
+ export function verifyNoCaseCollidingPluginNames(names) {
28
+ const seen = new Map();
29
+ for (const name of names) {
30
+ const key = name.toLowerCase();
31
+ const prior = seen.get(key);
32
+ if (prior === name) {
33
+ throw new Error(`Plugin name "${name}" is declared more than once across marketplaces. ` +
34
+ `Plugin names must be globally unique within a repo; rename one.`);
35
+ }
36
+ if (prior && prior !== name) {
37
+ throw new Error(`Plugin names "${prior}" and "${name}" differ only in case. ` +
38
+ `They would collide on case-insensitive filesystems; rename one.`);
39
+ }
40
+ seen.set(key, name);
41
+ }
42
+ }
43
+ async function parseJsonFileIfPresent(path, label) {
44
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved path
45
+ if (!existsSync(path))
46
+ return;
47
+ try {
48
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved path
49
+ JSON.parse(await readFile(path, 'utf-8'));
50
+ }
51
+ catch (e) {
52
+ throw new Error(`${label} is not valid JSON: ${e.message}`);
53
+ }
54
+ }
55
+ export async function parsePluginJsonFiles(pluginSourceDir) {
56
+ await parseJsonFileIfPresent(safePath.join(pluginSourceDir, 'hooks', 'hooks.json'), 'hooks/hooks.json');
57
+ await parseJsonFileIfPresent(safePath.join(pluginSourceDir, '.mcp.json'), '.mcp.json');
58
+ }
59
+ //# sourceMappingURL=plugin-validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-validators.js","sourceRoot":"","sources":["../../../../src/commands/claude/plugin/plugin-validators.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,WAAmB,EACnB,UAAkB;IAElB,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1D,sFAAsF;IACtF,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO;IAErC,sFAAsF;IACtF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAC5E,CAAC;IACF,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CACb,WAAW,UAAU,2DAA2D,gBAAgB,CAAC,IAAI,MAAM;YACzG,wGAAwG;YACxG,kFAAkF,CACrF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAAwB;IACvE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,gBAAgB,IAAI,oDAAoD;gBACtE,iEAAiE,CACpE,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CACb,iBAAiB,KAAK,UAAU,IAAI,yBAAyB;gBAC3D,iEAAiE,CACpE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,IAAY,EAAE,KAAa;IAC/D,oFAAoF;IACpF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAC9B,IAAI,CAAC;QACH,oFAAoF;QACpF,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,uBAAwB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,eAAuB;IAChE,MAAM,sBAAsB,CAC1B,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,YAAY,CAAC,EACrD,kBAAkB,CACnB,CAAC;IACF,MAAM,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;AACzF,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Tree-copy stream for plugin build.
3
+ *
4
+ * Copies everything under <sourceDir> to <destDir>, except:
5
+ * - .claude-plugin/ (owned by plugin.json merge-write)
6
+ *
7
+ * Respects .gitignore via crawlDirectory (respectGitignore: true, the default).
8
+ * Returns counts keyed to the spec's YAML summary extension.
9
+ */
10
+ export interface TreeCopyOptions {
11
+ sourceDir: string;
12
+ destDir: string;
13
+ warn?: (message: string) => void;
14
+ }
15
+ export interface TreeCopyResult {
16
+ commandsCopied: number;
17
+ hooksCopied: number;
18
+ agentsCopied: number;
19
+ mcpCopied: number;
20
+ filesCopied: number;
21
+ }
22
+ export declare function treeCopyPlugin(options: TreeCopyOptions): Promise<TreeCopyResult>;
23
+ //# sourceMappingURL=tree-copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-copy.d.ts","sourceRoot":"","sources":["../../../../src/commands/claude/plugin/tree-copy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAYD,wBAAsB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAiDtF"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Tree-copy stream for plugin build.
3
+ *
4
+ * Copies everything under <sourceDir> to <destDir>, except:
5
+ * - .claude-plugin/ (owned by plugin.json merge-write)
6
+ *
7
+ * Respects .gitignore via crawlDirectory (respectGitignore: true, the default).
8
+ * Returns counts keyed to the spec's YAML summary extension.
9
+ */
10
+ import { existsSync } from 'node:fs';
11
+ import { copyFile, mkdir } from 'node:fs/promises';
12
+ import { dirname } from 'node:path';
13
+ import { crawlDirectory, safePath, toForwardSlash } from '@vibe-agent-toolkit/utils';
14
+ const EXCLUDE_PATTERNS = ['.claude-plugin/**'];
15
+ function classifyRelative(rel) {
16
+ if (rel.startsWith('commands/'))
17
+ return 'commandsCopied';
18
+ if (rel.startsWith('hooks/'))
19
+ return 'hooksCopied';
20
+ if (rel.startsWith('agents/'))
21
+ return 'agentsCopied';
22
+ if (rel === '.mcp.json')
23
+ return 'mcpCopied';
24
+ return undefined;
25
+ }
26
+ export async function treeCopyPlugin(options) {
27
+ const { sourceDir, destDir, warn } = options;
28
+ const result = {
29
+ commandsCopied: 0,
30
+ hooksCopied: 0,
31
+ agentsCopied: 0,
32
+ mcpCopied: 0,
33
+ filesCopied: 0,
34
+ };
35
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- sourceDir resolved from config
36
+ if (!existsSync(sourceDir)) {
37
+ return result;
38
+ }
39
+ const authorMarketplaceJson = safePath.join(sourceDir, '.claude-plugin', 'marketplace.json');
40
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- controlled path
41
+ if (existsSync(authorMarketplaceJson) && warn) {
42
+ warn(`Ignoring ${toForwardSlash(authorMarketplaceJson)}: marketplace.json is VAT-generated ` +
43
+ `at the marketplace level and cannot be supplied per-plugin.`);
44
+ }
45
+ const files = await crawlDirectory({
46
+ baseDir: sourceDir,
47
+ include: ['**/*'],
48
+ exclude: EXCLUDE_PATTERNS,
49
+ absolute: true,
50
+ filesOnly: true,
51
+ respectGitignore: true,
52
+ dot: true,
53
+ });
54
+ for (const absPath of files) {
55
+ const rel = toForwardSlash(safePath.relative(sourceDir, absPath));
56
+ const target = safePath.join(destDir, rel);
57
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- dest resolved from sourceDir+relative
58
+ await mkdir(dirname(target), { recursive: true });
59
+ await copyFile(absPath, target);
60
+ result.filesCopied += 1;
61
+ const bucket = classifyRelative(rel);
62
+ if (bucket) {
63
+ result[bucket] += 1;
64
+ }
65
+ }
66
+ return result;
67
+ }
68
+ //# sourceMappingURL=tree-copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-copy.js","sourceRoot":"","sources":["../../../../src/commands/claude/plugin/tree-copy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAgBrF,MAAM,gBAAgB,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAE/C,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACzD,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,aAAa,CAAC;IACnD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,cAAc,CAAC;IACrD,IAAI,GAAG,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAC5C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAwB;IAC3D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,MAAM,GAAmB;QAC7B,cAAc,EAAE,CAAC;QACjB,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;KACf,CAAC;IAEF,qGAAqG;IACrG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,qBAAqB,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAC7F,sFAAsF;IACtF,IAAI,UAAU,CAAC,qBAAqB,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9C,IAAI,CACF,YAAY,cAAc,CAAC,qBAAqB,CAAC,sCAAsC;YACrF,6DAA6D,CAChE,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC;QACjC,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,CAAC,MAAM,CAAC;QACjB,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,IAAI;QACtB,GAAG,EAAE,IAAI;KACV,CAAC,CAAC;IAEH,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3C,4GAA4G;QAC5G,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;QAExB,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/collections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAElF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC9C,iBAAiB,CAAC,EAAE,eAAe,CAAC;IACpC,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CASvF;AA4HD;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAOhF"}
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/collections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAElF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC9C,iBAAiB,CAAC,EAAE,eAAe,CAAC;IACpC,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CASvF;AA+HD;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAOhF"}
@@ -45,6 +45,9 @@ function buildImportPath(packagePart) {
45
45
  */
46
46
  async function loadCollectionModule(importPath, originalInput) {
47
47
  try {
48
+ // importPath is either a bare package specifier (e.g. '@scope/pkg/mcp-collections')
49
+ // or a `file://` URL produced by buildImportPath() — never a raw filesystem path.
50
+ // eslint-disable-next-line local/no-bare-dynamic-import-path -- resolved upstream in buildImportPath
48
51
  return (await import(importPath));
49
52
  }
50
53
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../../src/commands/mcp/collections.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../../src/commands/mcp/collections.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,12 @@ export declare function resetGoverningConfigCache(): void;
49
49
  *
50
50
  * Returns the parsed config plus the `configRoot` (directory that contained the
51
51
  * yaml), or `null` if no config is found anywhere up the tree.
52
+ *
53
+ * **Cache behavior:** Both successful loads and parse failures are cached
54
+ * (failures as `null`) so a broken config doesn't re-parse on every skill in
55
+ * the same scan. A test that edits a broken config into a good one between
56
+ * calls must invoke {@link resetGoverningConfigCache} to pick up the new
57
+ * state — the audit CLI entrypoint already does this via `resetAuditCaches()`.
52
58
  */
53
59
  export declare function findGoverningConfig(skillDir: string): {
54
60
  config: ProjectConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAMxF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc/D;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CA8BzE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAYD;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GACf;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyBtD"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAMxF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB/D;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CA8BzE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAYD;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GACf;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyBtD"}
@@ -5,7 +5,7 @@
5
5
  * - VAT_TEST_CONFIG: Override config file path for testing (absolute path)
6
6
  */
7
7
  import { readFileSync, existsSync } from 'node:fs';
8
- import { dirname } from 'node:path';
8
+ import { dirname, parse } from 'node:path';
9
9
  import { ProjectConfigSchema } from '@vibe-agent-toolkit/resources';
10
10
  import { safePath } from '@vibe-agent-toolkit/utils';
11
11
  import * as yaml from 'js-yaml';
@@ -16,15 +16,18 @@ const CONFIG_FILENAME = 'vibe-agent-toolkit.config.yaml';
16
16
  * @returns Path to config file, or null if not found
17
17
  */
18
18
  export function findConfigPath(startDir) {
19
- let currentDir = startDir ?? process.cwd();
20
- const root = '/';
19
+ let currentDir = safePath.resolve(startDir ?? process.cwd());
20
+ const root = parse(currentDir).root;
21
21
  while (currentDir !== root) {
22
22
  const configPath = safePath.join(currentDir, CONFIG_FILENAME);
23
23
  // eslint-disable-next-line security/detect-non-literal-fs-filename -- Dynamic path walking is required for config file search
24
24
  if (existsSync(configPath)) {
25
25
  return configPath;
26
26
  }
27
- currentDir = safePath.join(currentDir, '..');
27
+ const parent = dirname(currentDir);
28
+ if (parent === currentDir)
29
+ break; // safety: at filesystem root
30
+ currentDir = parent;
28
31
  }
29
32
  return null;
30
33
  }
@@ -103,6 +106,12 @@ export function resetGoverningConfigCache() {
103
106
  *
104
107
  * Returns the parsed config plus the `configRoot` (directory that contained the
105
108
  * yaml), or `null` if no config is found anywhere up the tree.
109
+ *
110
+ * **Cache behavior:** Both successful loads and parse failures are cached
111
+ * (failures as `null`) so a broken config doesn't re-parse on every skill in
112
+ * the same scan. A test that edits a broken config into a good one between
113
+ * calls must invoke {@link resetGoverningConfigCache} to pick up the new
114
+ * state — the audit CLI entrypoint already does this via `resetAuditCaches()`.
106
115
  */
107
116
  export function findGoverningConfig(skillDir) {
108
117
  const configPath = findConfigPath(skillDir);
@@ -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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"}
package/docs/audit.md CHANGED
@@ -61,6 +61,11 @@ Plugin directories contain a `.claude-plugin/plugin.json` manifest:
61
61
  my-plugin/
62
62
  ├── .claude-plugin/
63
63
  │ └── plugin.json # Plugin manifest
64
+ ├── commands/ # slash commands (optional)
65
+ ├── agents/ # subagents (optional)
66
+ ├── hooks/
67
+ │ └── hooks.json # hook registry (optional)
68
+ ├── .mcp.json # MCP server config (optional)
64
69
  └── skills/
65
70
  └── skill1.md
66
71
  ```
@@ -69,6 +74,7 @@ my-plugin/
69
74
  - `plugin.json` exists and is valid JSON
70
75
  - Schema validation against plugin manifest schema
71
76
  - Referenced skills exist
77
+ - `hooks/hooks.json` and `.mcp.json` parse as valid JSON when present (emits `PLUGIN_INVALID_JSON`)
72
78
 
73
79
  ### 2. Marketplace Directories
74
80
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibe-agent-toolkit/cli",
3
- "version": "0.1.33-rc.3",
3
+ "version": "0.1.34-rc.2",
4
4
  "description": "Command-line interface for vibe-agent-toolkit",
5
5
  "type": "module",
6
6
  "bin": {
@@ -41,16 +41,16 @@
41
41
  "//dependencies-note": "DO NOT add example agent packages or adopter packages here. Adopter packages (like vat-development-agents) depend on the CLI binary at build time — declaring them as deps creates a circular build dependency. They are built in a second turbo pass via package#task overrides in turbo.json.",
42
42
  "dependencies": {
43
43
  "@anthropic-ai/sdk": "^0.71.2",
44
- "@vibe-agent-toolkit/agent-config": "0.1.33-rc.3",
45
- "@vibe-agent-toolkit/agent-schema": "0.1.33-rc.3",
46
- "@vibe-agent-toolkit/agent-skills": "0.1.33-rc.3",
47
- "@vibe-agent-toolkit/claude-marketplace": "0.1.33-rc.3",
48
- "@vibe-agent-toolkit/discovery": "0.1.33-rc.3",
49
- "@vibe-agent-toolkit/gateway-mcp": "0.1.33-rc.3",
50
- "@vibe-agent-toolkit/rag": "0.1.33-rc.3",
51
- "@vibe-agent-toolkit/rag-lancedb": "0.1.33-rc.3",
52
- "@vibe-agent-toolkit/resources": "0.1.33-rc.3",
53
- "@vibe-agent-toolkit/utils": "0.1.33-rc.3",
44
+ "@vibe-agent-toolkit/agent-config": "0.1.34-rc.2",
45
+ "@vibe-agent-toolkit/agent-schema": "0.1.34-rc.2",
46
+ "@vibe-agent-toolkit/agent-skills": "0.1.34-rc.2",
47
+ "@vibe-agent-toolkit/claude-marketplace": "0.1.34-rc.2",
48
+ "@vibe-agent-toolkit/discovery": "0.1.34-rc.2",
49
+ "@vibe-agent-toolkit/gateway-mcp": "0.1.34-rc.2",
50
+ "@vibe-agent-toolkit/rag": "0.1.34-rc.2",
51
+ "@vibe-agent-toolkit/rag-lancedb": "0.1.34-rc.2",
52
+ "@vibe-agent-toolkit/resources": "0.1.34-rc.2",
53
+ "@vibe-agent-toolkit/utils": "0.1.34-rc.2",
54
54
  "adm-zip": "^0.5.16",
55
55
  "commander": "^12.1.0",
56
56
  "js-yaml": "^4.1.0",