@vibe-agent-toolkit/cli 0.1.15-rc.3 → 0.1.15-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 (78) hide show
  1. package/dist/bin.js +18 -0
  2. package/dist/bin.js.map +1 -1
  3. package/dist/commands/audit-settings.d.ts +18 -0
  4. package/dist/commands/audit-settings.d.ts.map +1 -0
  5. package/dist/commands/audit-settings.js +284 -0
  6. package/dist/commands/audit-settings.js.map +1 -0
  7. package/dist/commands/audit.d.ts +1 -0
  8. package/dist/commands/audit.d.ts.map +1 -1
  9. package/dist/commands/audit.js +59 -6
  10. package/dist/commands/audit.js.map +1 -1
  11. package/dist/commands/build.d.ts +15 -0
  12. package/dist/commands/build.d.ts.map +1 -0
  13. package/dist/commands/build.js +92 -0
  14. package/dist/commands/build.js.map +1 -0
  15. package/dist/commands/claude/build.d.ts +14 -0
  16. package/dist/commands/claude/build.d.ts.map +1 -0
  17. package/dist/commands/claude/build.js +252 -0
  18. package/dist/commands/claude/build.js.map +1 -0
  19. package/dist/commands/claude/claude-config.d.ts +20 -0
  20. package/dist/commands/claude/claude-config.d.ts.map +1 -0
  21. package/dist/commands/claude/claude-config.js +20 -0
  22. package/dist/commands/claude/claude-config.js.map +1 -0
  23. package/dist/commands/claude/index.d.ts +8 -0
  24. package/dist/commands/claude/index.d.ts.map +1 -0
  25. package/dist/commands/claude/index.js +38 -0
  26. package/dist/commands/claude/index.js.map +1 -0
  27. package/dist/commands/claude/verify.d.ts +13 -0
  28. package/dist/commands/claude/verify.d.ts.map +1 -0
  29. package/dist/commands/claude/verify.js +215 -0
  30. package/dist/commands/claude/verify.js.map +1 -0
  31. package/dist/commands/doctor.js +1 -1
  32. package/dist/commands/doctor.js.map +1 -1
  33. package/dist/commands/install.d.ts +1 -0
  34. package/dist/commands/install.d.ts.map +1 -1
  35. package/dist/commands/install.js +33 -1
  36. package/dist/commands/install.js.map +1 -1
  37. package/dist/commands/phase-utils.d.ts +48 -0
  38. package/dist/commands/phase-utils.d.ts.map +1 -0
  39. package/dist/commands/phase-utils.js +61 -0
  40. package/dist/commands/phase-utils.js.map +1 -0
  41. package/dist/commands/skills/install.d.ts +1 -0
  42. package/dist/commands/skills/install.d.ts.map +1 -1
  43. package/dist/commands/skills/install.js +57 -2
  44. package/dist/commands/skills/install.js.map +1 -1
  45. package/dist/commands/skills/list.js +2 -2
  46. package/dist/commands/skills/list.js.map +1 -1
  47. package/dist/commands/skills/uninstall.d.ts.map +1 -1
  48. package/dist/commands/skills/uninstall.js +1 -1
  49. package/dist/commands/skills/uninstall.js.map +1 -1
  50. package/dist/commands/verify.d.ts +16 -0
  51. package/dist/commands/verify.d.ts.map +1 -0
  52. package/dist/commands/verify.js +84 -0
  53. package/dist/commands/verify.js.map +1 -0
  54. package/dist/index.d.ts +1 -2
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +1 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/utils/config-loader.d.ts +7 -3
  59. package/dist/utils/config-loader.d.ts.map +1 -1
  60. package/dist/utils/config-loader.js +11 -5
  61. package/dist/utils/config-loader.js.map +1 -1
  62. package/dist/utils/resource-loader.d.ts +1 -2
  63. package/dist/utils/resource-loader.d.ts.map +1 -1
  64. package/dist/utils/resource-loader.js +1 -11
  65. package/dist/utils/resource-loader.js.map +1 -1
  66. package/dist/utils/user-context-scanner.d.ts.map +1 -1
  67. package/dist/utils/user-context-scanner.js +1 -1
  68. package/dist/utils/user-context-scanner.js.map +1 -1
  69. package/docs/index.md +1 -0
  70. package/package.json +12 -13
  71. package/dist/schemas/config.d.ts +0 -1122
  72. package/dist/schemas/config.d.ts.map +0 -1
  73. package/dist/schemas/config.js +0 -141
  74. package/dist/schemas/config.js.map +0 -1
  75. package/dist/utils/claude-paths.d.ts +0 -32
  76. package/dist/utils/claude-paths.d.ts.map +0 -1
  77. package/dist/utils/claude-paths.js +0 -34
  78. package/dist/utils/claude-paths.js.map +0 -1
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `vat build` — top-level build orchestration
3
+ *
4
+ * Builds everything the project describes, in dependency order:
5
+ * 1. vat skills build (portable dist/skills/ output)
6
+ * 2. vat claude build (Claude plugin artifacts)
7
+ */
8
+ import { Command } from 'commander';
9
+ export interface BuildCommandOptions {
10
+ only?: string;
11
+ marketplace?: string;
12
+ debug?: boolean;
13
+ }
14
+ export declare function createBuildTopLevelCommand(): Command;
15
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,0BAA0B,IAAI,OAAO,CAsCpD"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * `vat build` — top-level build orchestration
3
+ *
4
+ * Builds everything the project describes, in dependency order:
5
+ * 1. vat skills build (portable dist/skills/ output)
6
+ * 2. vat claude build (Claude plugin artifacts)
7
+ */
8
+ import { spawnSync } from 'node:child_process';
9
+ import { Command } from 'commander';
10
+ import { handleCommandError } from '../utils/command-error.js';
11
+ import { writeYamlOutput } from '../utils/output.js';
12
+ import { buildClaudePhaseArgs, createPhaseContext } from './phase-utils.js';
13
+ export function createBuildTopLevelCommand() {
14
+ const command = new Command('build');
15
+ command
16
+ .description('Build all project artifacts in dependency order (skills → claude plugins)')
17
+ .option('--only <phase>', 'Build only a specific phase: skills, claude')
18
+ .option('--marketplace <name>', 'Build specific marketplace only (claude phase)')
19
+ .option('--debug', 'Enable debug logging')
20
+ .action(buildTopLevelCommand)
21
+ .addHelpText('after', `
22
+ Description:
23
+ Builds all project artifacts in dependency order. Equivalent to running
24
+ vat skills build followed by vat claude build.
25
+
26
+ Phases:
27
+ skills → builds dist/skills/ from package.json vat.skills (platform-agnostic)
28
+ claude → wraps dist/skills/ into Claude plugin structure (requires skills phase)
29
+
30
+ Output:
31
+ YAML summary for each phase → stdout
32
+ Build progress → stderr
33
+
34
+ Exit Codes:
35
+ 0 - All phases completed successfully
36
+ 1 - Build error
37
+ 2 - System error
38
+
39
+ Examples:
40
+ $ vat build # Build everything
41
+ $ vat build --only skills # Build portable skills only
42
+ $ vat build --only claude # Build Claude artifacts only (skills must be pre-built)
43
+ $ vat build --marketplace acme # Build specific marketplace
44
+ `);
45
+ return command;
46
+ }
47
+ function buildPhaseList(options) {
48
+ const { only } = options;
49
+ const phases = [];
50
+ if (!only || only === 'skills') {
51
+ phases.push({ name: 'skills', args: ['skills', 'build'] });
52
+ }
53
+ if (!only || only === 'claude') {
54
+ phases.push({ name: 'claude', args: buildClaudePhaseArgs('build', options) });
55
+ }
56
+ return phases;
57
+ }
58
+ async function buildTopLevelCommand(options) {
59
+ const phases = buildPhaseList(options);
60
+ const { logger, startTime, binPath } = createPhaseContext(options.debug, phases, options.only, 'skills, claude');
61
+ try {
62
+ logger.info(`🔨 vat build (phases: ${phases.map((p) => p.name).join(' → ')})`);
63
+ for (const phase of phases) {
64
+ logger.info(`\n▶ Phase: ${phase.name}`);
65
+ const result = spawnSync(process.execPath, [binPath, ...phase.args], {
66
+ stdio: ['inherit', 'inherit', 'inherit'],
67
+ });
68
+ if (result.status !== 0) {
69
+ const duration = Date.now() - startTime;
70
+ writeYamlOutput({
71
+ status: 'error',
72
+ error: `Phase '${phase.name}' failed with exit code ${result.status ?? 'unknown'}`,
73
+ phase: phase.name,
74
+ duration: `${duration}ms`,
75
+ });
76
+ process.exit(result.status ?? 1);
77
+ }
78
+ }
79
+ const duration = Date.now() - startTime;
80
+ logger.info(`\n✅ Build complete`);
81
+ writeYamlOutput({
82
+ status: 'success',
83
+ phasesCompleted: phases.map((p) => p.name),
84
+ duration: `${duration}ms`,
85
+ });
86
+ process.exit(0);
87
+ }
88
+ catch (error) {
89
+ handleCommandError(error, logger, startTime, 'Build');
90
+ }
91
+ }
92
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `vat claude build` — generate Claude plugin marketplace artifacts
3
+ *
4
+ * Reads vibe-agent-toolkit.config.yaml → claude.marketplaces and package.json → vat.skills.
5
+ * Wraps pre-built dist/skills/ output into Claude plugin directory structure.
6
+ * Generates plugin.json and marketplace.json metadata files.
7
+ */
8
+ import { Command } from 'commander';
9
+ export interface ClaudeBuildCommandOptions {
10
+ marketplace?: string;
11
+ debug?: boolean;
12
+ }
13
+ export declare function createBuildCommand(): Command;
14
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAgBD,wBAAgB,kBAAkB,IAAI,OAAO,CA0C5C"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * `vat claude build` — generate Claude plugin marketplace artifacts
3
+ *
4
+ * Reads vibe-agent-toolkit.config.yaml → claude.marketplaces and package.json → vat.skills.
5
+ * Wraps pre-built dist/skills/ output into Claude plugin directory structure.
6
+ * Generates plugin.json and marketplace.json metadata files.
7
+ */
8
+ import { existsSync } from 'node:fs';
9
+ import { cp, mkdir, writeFile } from 'node:fs/promises';
10
+ import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
11
+ import { Command } from 'commander';
12
+ import { handleCommandError } from '../../utils/command-error.js';
13
+ import { createLogger } from '../../utils/logger.js';
14
+ import { writeYamlOutput } from '../../utils/output.js';
15
+ import { readPackageJson } from '../skills/shared.js';
16
+ import { loadClaudeProjectConfig } from './claude-config.js';
17
+ export function createBuildCommand() {
18
+ const command = new Command('build');
19
+ command
20
+ .description('Generate Claude plugin marketplace artifacts from pre-built skills')
21
+ .option('--marketplace <name>', 'Build specific marketplace only')
22
+ .option('--debug', 'Enable debug logging')
23
+ .action(buildCommand)
24
+ .addHelpText('after', `
25
+ Description:
26
+ Reads vibe-agent-toolkit.config.yaml and package.json to build Claude plugin
27
+ artifacts from pre-built dist/skills/ output. Must run vat skills build first.
28
+
29
+ For each inline marketplace (skips file: entries):
30
+ - Matches skill selectors against vat.skills names (exact or glob)
31
+ - Copies dist/skills/<name>/ into plugin directory structure
32
+ - Generates plugin.json and marketplace.json
33
+
34
+ Source-layout (file:) marketplaces are skipped (they are verified, not built).
35
+
36
+ Output paths (defaults, overridable via config):
37
+ dist/plugins/<plugin-name>/ ← plugin directory
38
+ dist/.claude-plugin/marketplace.json ← marketplace catalog
39
+
40
+ Output:
41
+ YAML summary → stdout
42
+ Build progress → stderr
43
+
44
+ Exit Codes:
45
+ 0 - Build successful
46
+ 1 - Build error (missing skills, invalid config)
47
+ 2 - System error
48
+
49
+ Example:
50
+ $ vat skills build && vat claude build # Build skills then wrap for Claude
51
+ $ vat claude build --marketplace acme # Build specific marketplace
52
+ `);
53
+ return command;
54
+ }
55
+ async function buildCommand(options) {
56
+ const logger = createLogger(options.debug ? { debug: true } : {});
57
+ const startTime = Date.now();
58
+ try {
59
+ const { configPath, configDir, claudeConfig } = await loadClaudeProjectConfig();
60
+ if (!claudeConfig?.marketplaces || Object.keys(claudeConfig.marketplaces).length === 0) {
61
+ writeYamlOutput({
62
+ status: 'success',
63
+ message: 'No claude.marketplaces configured — nothing to build',
64
+ duration: `${Date.now() - startTime}ms`,
65
+ });
66
+ process.exit(0);
67
+ }
68
+ // Read package.json for skill definitions
69
+ const packageJson = await readPackageJson(configDir);
70
+ const vatSkills = packageJson.vat?.skills ?? [];
71
+ logger.info(`📦 Building Claude plugin artifacts`);
72
+ logger.info(` Config: ${configPath}`);
73
+ logger.info(` Skills available: ${vatSkills.length}`);
74
+ const results = [];
75
+ const marketplaces = claudeConfig.marketplaces;
76
+ for (const name of Object.keys(marketplaces)) {
77
+ const mpConfig = marketplaces[name];
78
+ // Skip if --marketplace filter specified and doesn't match
79
+ if (options.marketplace && options.marketplace !== name) {
80
+ continue;
81
+ }
82
+ logger.info(`\n🏪 Building marketplace: ${name}`);
83
+ const result = await buildMarketplace(name, mpConfig, vatSkills, configDir, logger);
84
+ results.push(result);
85
+ if (result.status === 'error') {
86
+ logger.error(` ❌ Failed: ${result.reason ?? 'unknown error'}`);
87
+ const duration = Date.now() - startTime;
88
+ writeYamlOutput({
89
+ status: 'error',
90
+ error: result.reason ?? 'Build failed',
91
+ marketplace: name,
92
+ duration: `${duration}ms`,
93
+ });
94
+ process.exit(1);
95
+ }
96
+ }
97
+ const duration = Date.now() - startTime;
98
+ const totalPlugins = results.flatMap((r) => r.plugins).length;
99
+ const totalSkills = results.flatMap((r) => r.plugins).flatMap((p) => p.skillsCopied).length;
100
+ writeYamlOutput({
101
+ status: 'success',
102
+ marketplacesBuilt: results.filter((r) => r.status === 'built').length,
103
+ pluginsBuilt: totalPlugins,
104
+ skillsPackaged: totalSkills,
105
+ marketplaces: results.map((r) => ({
106
+ name: r.name,
107
+ status: r.status,
108
+ ...(r.reason ? { reason: r.reason } : {}),
109
+ ...(r.marketplaceJsonPath ? { marketplaceJson: r.marketplaceJsonPath } : {}),
110
+ plugins: r.plugins.map((p) => ({
111
+ name: p.pluginName,
112
+ dir: p.pluginDir,
113
+ skills: p.skillsCopied,
114
+ })),
115
+ })),
116
+ duration: `${duration}ms`,
117
+ });
118
+ process.exit(0);
119
+ }
120
+ catch (error) {
121
+ handleCommandError(error, logger, startTime, 'ClaudeBuild');
122
+ }
123
+ }
124
+ async function buildMarketplace(name, config, vatSkills, configDir, logger) {
125
+ // Source-layout (file:) marketplaces are skipped — verify only, not built
126
+ if (config.file) {
127
+ logger.info(` Skipping (source-layout file: ${config.file})`);
128
+ return { name, status: 'skipped', reason: 'source-layout (file: only — use vat claude verify)', plugins: [] };
129
+ }
130
+ // Resolve skill selectors against vat.skills
131
+ const selectedSkills = resolveSkillSelectors(config.skills ?? [], vatSkills);
132
+ logger.info(` Matched ${selectedSkills.length} skill(s): ${selectedSkills.map((s) => s.name).join(', ')}`);
133
+ // Determine output paths
134
+ const pluginsDir = config.output?.pluginsDir
135
+ ? resolveRelativePath(config.output.pluginsDir, configDir)
136
+ : join(configDir, 'dist', 'plugins');
137
+ const marketplaceJsonPath = config.output?.marketplaceJson
138
+ ? resolveRelativePath(config.output.marketplaceJson, configDir)
139
+ : join(configDir, 'dist', '.claude-plugin', 'marketplace.json');
140
+ const plugins = [];
141
+ const pluginEntries = [];
142
+ const pluginDefs = config.plugins ?? [{ name, skills: '*' }];
143
+ for (const pluginDef of pluginDefs) {
144
+ // Determine which skills go into this plugin
145
+ const pluginSkills = pluginDef.skills === '*' || pluginDef.skills === undefined
146
+ ? selectedSkills
147
+ : selectedSkills.filter((s) => Array.isArray(pluginDef.skills) ? pluginDef.skills.includes(s.name) : true);
148
+ const pluginResult = await buildPlugin(pluginDef.name, pluginSkills, configDir, pluginsDir, logger);
149
+ plugins.push(pluginResult);
150
+ // Build plugin entry for marketplace.json.
151
+ // `source` is required by the Claude marketplace format — use a relative path from
152
+ // the marketplace.json location to the plugin directory so the artifact is portable
153
+ // regardless of where the npm package is installed.
154
+ const pluginDir = join(pluginsDir, pluginDef.name);
155
+ const relativeSource = relative(dirname(marketplaceJsonPath), pluginDir);
156
+ pluginEntries.push({
157
+ name: pluginDef.name,
158
+ source: relativeSource,
159
+ ...(pluginDef.version ? { version: pluginDef.version } : {}),
160
+ skills: pluginResult.skillsCopied.map((skillName) => `skills/${skillName}`),
161
+ });
162
+ }
163
+ // Generate marketplace.json
164
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved from config
165
+ await mkdir(dirname(marketplaceJsonPath), { recursive: true });
166
+ const marketplace = {
167
+ name,
168
+ ...(config.owner ? { owner: config.owner } : {}),
169
+ ...(config.metadata ? { metadata: config.metadata } : {}),
170
+ plugins: pluginEntries,
171
+ };
172
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved from config
173
+ await writeFile(marketplaceJsonPath, JSON.stringify(marketplace, null, 2));
174
+ logger.info(` ✅ marketplace.json → ${marketplaceJsonPath}`);
175
+ return {
176
+ name,
177
+ status: 'built',
178
+ plugins,
179
+ marketplaceJsonPath,
180
+ };
181
+ }
182
+ async function buildPlugin(pluginName, skills, configDir, pluginsDir, logger) {
183
+ const pluginDir = join(pluginsDir, pluginName);
184
+ const skillsCopied = [];
185
+ logger.info(` 📦 Building plugin: ${pluginName}`);
186
+ for (const skill of skills) {
187
+ const skillDistPath = resolveRelativePath(skill.path, configDir);
188
+ // Verify skill is built
189
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved from config
190
+ if (!existsSync(skillDistPath)) {
191
+ throw new Error(`Skill "${skill.name}" not built at ${skillDistPath}. ` +
192
+ `Run: vat skills build (or vat build to build everything)`);
193
+ }
194
+ // Copy skill into plugin directory structure
195
+ const destPath = join(pluginDir, 'skills', skill.name);
196
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved paths
197
+ await mkdir(destPath, { recursive: true });
198
+ await cp(skillDistPath, destPath, { recursive: true });
199
+ skillsCopied.push(skill.name);
200
+ logger.info(` ✅ ${skill.name} → skills/${skill.name}`);
201
+ }
202
+ // Generate plugin.json
203
+ const pluginJsonDir = join(pluginDir, '.claude-plugin');
204
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved paths
205
+ await mkdir(pluginJsonDir, { recursive: true });
206
+ const pluginJson = {
207
+ name: pluginName,
208
+ skills: skillsCopied.map((skillName) => `skills/${skillName}`),
209
+ };
210
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved paths
211
+ await writeFile(join(pluginJsonDir, 'plugin.json'), JSON.stringify(pluginJson, null, 2));
212
+ logger.info(` ✅ .claude-plugin/plugin.json`);
213
+ return { pluginName, pluginDir, skillsCopied };
214
+ }
215
+ /**
216
+ * Resolve skill selectors (exact names or glob patterns) against available skills.
217
+ * Supports exact name match and simple glob suffix like "acme-*".
218
+ */
219
+ function resolveSkillSelectors(selectors, availableSkills) {
220
+ if (selectors.length === 0) {
221
+ return availableSkills;
222
+ }
223
+ const matched = new Set();
224
+ for (const selector of selectors) {
225
+ for (const skill of availableSkills) {
226
+ if (matchesSelector(skill.name, selector)) {
227
+ matched.add(skill.name);
228
+ }
229
+ }
230
+ }
231
+ return availableSkills.filter((s) => matched.has(s.name));
232
+ }
233
+ /**
234
+ * Check if a skill name matches a selector.
235
+ * Supports exact match and simple glob patterns (prefix*, suffix*, *contains*).
236
+ */
237
+ function matchesSelector(skillName, selector) {
238
+ if (selector === '*') {
239
+ return true;
240
+ }
241
+ // Convert simple glob to regex: replace * with .*
242
+ // eslint-disable-next-line security/detect-non-literal-regexp -- selector is from project config, bounded by name format
243
+ const regex = new RegExp(`^${selector.replaceAll('*', '.*')}$`);
244
+ return regex.test(skillName);
245
+ }
246
+ function resolveRelativePath(filePath, baseDir) {
247
+ if (isAbsolute(filePath)) {
248
+ return filePath;
249
+ }
250
+ return resolve(baseDir, filePath);
251
+ }
252
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/claude/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Shared config loading utilities for `vat claude` subcommands.
3
+ */
4
+ import { type ClaudeConfig } from '@vibe-agent-toolkit/resources';
5
+ export interface LoadedClaudeConfig {
6
+ configPath: string;
7
+ configDir: string;
8
+ claudeConfig: ClaudeConfig;
9
+ }
10
+ /**
11
+ * Find, parse, and return the claude: section of the project config.
12
+ * Throws if the config file cannot be found or parsed.
13
+ * Returns null for claudeConfig when the claude: section is absent.
14
+ */
15
+ export declare function loadClaudeProjectConfig(): Promise<{
16
+ configPath: string;
17
+ configDir: string;
18
+ claudeConfig: ClaudeConfig | undefined;
19
+ }>;
20
+ //# sourceMappingURL=claude-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-config.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/claude-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAmC,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAEnG,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;CACxC,CAAC,CAUD"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Shared config loading utilities for `vat claude` subcommands.
3
+ */
4
+ import { dirname } from 'node:path';
5
+ import { findConfigFile, parseConfigFile } from '@vibe-agent-toolkit/resources';
6
+ /**
7
+ * Find, parse, and return the claude: section of the project config.
8
+ * Throws if the config file cannot be found or parsed.
9
+ * Returns null for claudeConfig when the claude: section is absent.
10
+ */
11
+ export async function loadClaudeProjectConfig() {
12
+ const configPath = await findConfigFile();
13
+ if (!configPath) {
14
+ throw new Error('No vibe-agent-toolkit.config.yaml found. Run from a project directory.');
15
+ }
16
+ const config = await parseConfigFile(configPath);
17
+ const configDir = dirname(configPath);
18
+ return { configPath, configDir, claudeConfig: config.claude };
19
+ }
20
+ //# sourceMappingURL=claude-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-config.js","sourceRoot":"","sources":["../../../src/commands/claude/claude-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAqB,MAAM,+BAA+B,CAAC;AAQnG;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAK3C,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;IAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEtC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAChE,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Claude command group
3
+ *
4
+ * Commands for building and verifying Claude plugin marketplace artifacts
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function createClaudeCommand(): Command;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,mBAAmB,IAAI,OAAO,CAkC7C"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Claude command group
3
+ *
4
+ * Commands for building and verifying Claude plugin marketplace artifacts
5
+ */
6
+ import { Command } from 'commander';
7
+ import { createBuildCommand } from './build.js';
8
+ import { createVerifyCommand } from './verify.js';
9
+ export function createClaudeCommand() {
10
+ const command = new Command('claude');
11
+ command
12
+ .description('Build and verify Claude plugin marketplace artifacts')
13
+ .helpCommand(false)
14
+ .addHelpText('after', `
15
+ Description:
16
+ Commands for working with Claude Code plugin marketplaces and plugin.json artifacts.
17
+ Reads claude: section from vibe-agent-toolkit.config.yaml.
18
+
19
+ Examples:
20
+ $ vat claude build # Generate plugin artifacts from pre-built skills
21
+ $ vat claude verify # Validate marketplace.json and plugin.json files
22
+ $ vat claude verify --marketplace lfa # Verify a specific marketplace
23
+
24
+ Workflow:
25
+ 1. Configure: Add claude: section to vibe-agent-toolkit.config.yaml
26
+ 2. Build: vat skills build (build portable skills first)
27
+ 3. Package: vat claude build (wrap skills into Claude plugin format)
28
+ 4. Verify: vat claude verify (validate generated artifacts)
29
+
30
+ Or use the top-level commands:
31
+ $ vat build # Runs skills build then claude build
32
+ $ vat verify # Validates everything (resources, skills, claude)
33
+ `);
34
+ command.addCommand(createBuildCommand());
35
+ command.addCommand(createVerifyCommand());
36
+ return command;
37
+ }
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/claude/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtC,OAAO;SACJ,WAAW,CAAC,sDAAsD,CAAC;SACnE,WAAW,CAAC,KAAK,CAAC;SAClB,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;CAmBL,CACI,CAAC;IAEJ,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAE1C,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `vat claude verify` — validate Claude plugin marketplace artifacts
3
+ *
4
+ * Validates existing marketplace.json, plugin.json, and managed-settings.json files
5
+ * against their schemas. Does not build anything — validates what exists.
6
+ */
7
+ import { Command } from 'commander';
8
+ export interface ClaudeVerifyCommandOptions {
9
+ marketplace?: string;
10
+ debug?: boolean;
11
+ }
12
+ export declare function createVerifyCommand(): Command;
13
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/verify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAgBD,wBAAgB,mBAAmB,IAAI,OAAO,CAoC7C"}