@vibe-agent-toolkit/cli 0.1.0 → 0.1.1

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 (37) hide show
  1. package/README.md +67 -4
  2. package/dist/bin.js +15 -12
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/agent/index.d.ts.map +1 -1
  5. package/dist/commands/agent/index.js +0 -37
  6. package/dist/commands/agent/index.js.map +1 -1
  7. package/dist/commands/audit/cache-detector.d.ts +32 -0
  8. package/dist/commands/audit/cache-detector.d.ts.map +1 -0
  9. package/dist/commands/audit/cache-detector.js +68 -0
  10. package/dist/commands/audit/cache-detector.js.map +1 -0
  11. package/dist/commands/audit/hierarchical-output.d.ts +41 -0
  12. package/dist/commands/audit/hierarchical-output.d.ts.map +1 -0
  13. package/dist/commands/audit/hierarchical-output.js +267 -0
  14. package/dist/commands/audit/hierarchical-output.js.map +1 -0
  15. package/dist/commands/audit.d.ts +18 -0
  16. package/dist/commands/audit.d.ts.map +1 -0
  17. package/dist/commands/audit.js +386 -0
  18. package/dist/commands/audit.js.map +1 -0
  19. package/dist/commands/doctor.d.ts +106 -0
  20. package/dist/commands/doctor.d.ts.map +1 -0
  21. package/dist/commands/doctor.js +499 -0
  22. package/dist/commands/doctor.js.map +1 -0
  23. package/dist/commands/resources/scan.d.ts.map +1 -1
  24. package/dist/commands/resources/scan.js +8 -0
  25. package/dist/commands/resources/scan.js.map +1 -1
  26. package/dist/utils/config-loader.d.ts +6 -0
  27. package/dist/utils/config-loader.d.ts.map +1 -1
  28. package/dist/utils/config-loader.js +18 -0
  29. package/dist/utils/config-loader.js.map +1 -1
  30. package/docs/audit.md +446 -0
  31. package/docs/doctor.md +268 -0
  32. package/docs/index.md +32 -0
  33. package/package.json +11 -8
  34. package/dist/commands/agent/audit.d.ts +0 -9
  35. package/dist/commands/agent/audit.d.ts.map +0 -1
  36. package/dist/commands/agent/audit.js +0 -139
  37. package/dist/commands/agent/audit.js.map +0 -1
@@ -0,0 +1,499 @@
1
+ /**
2
+ * Doctor Command
3
+ *
4
+ * Diagnoses common issues with vat setup:
5
+ * - Environment checks (Node.js version, git)
6
+ * - Configuration validation
7
+ * - Version checks
8
+ */
9
+ import { existsSync, readFileSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { getToolVersion } from '@vibe-agent-toolkit/utils';
12
+ import * as semver from 'semver';
13
+ import { findConfigPath, loadConfig } from '../utils/config-loader.js';
14
+ // Constants for check names and URLs
15
+ const CHECK_NAME_NODE_VERSION = 'Node.js version';
16
+ const NODEJS_INSTALL_URL = 'Install Node.js: https://nodejs.org/';
17
+ const CHECK_NAME_GIT_INSTALLED = 'Git installed';
18
+ const GIT_INSTALL_URL = 'Install Git: https://git-scm.com/';
19
+ const CHECK_NAME_GIT_REPOSITORY = 'Git repository';
20
+ const CHECK_NAME_CONFIG_FILE = 'Configuration file';
21
+ const CHECK_NAME_CONFIG_VALID = 'Configuration valid';
22
+ const CREATE_CONFIG_SUGGESTION = 'Create vibe-agent-toolkit.config.yaml in project root';
23
+ const CHECK_NAME_VAT_VERSION = 'vat version';
24
+ const CHECK_NAME_CLI_BUILD_STATUS = 'CLI build status';
25
+ /**
26
+ * Check Node.js version meets requirements
27
+ */
28
+ export function checkNodeVersion() {
29
+ try {
30
+ const version = getToolVersion('node');
31
+ if (!version) {
32
+ return {
33
+ name: CHECK_NAME_NODE_VERSION,
34
+ passed: false,
35
+ message: 'Not detected',
36
+ suggestion: NODEJS_INSTALL_URL,
37
+ };
38
+ }
39
+ const majorVersion = Number.parseInt(version.replace('v', '').split('.')[0] ?? '');
40
+ if (Number.isNaN(majorVersion)) {
41
+ return {
42
+ name: CHECK_NAME_NODE_VERSION,
43
+ passed: false,
44
+ message: `Failed to parse version: "${version}"`,
45
+ suggestion: NODEJS_INSTALL_URL,
46
+ };
47
+ }
48
+ return majorVersion >= 20
49
+ ? {
50
+ name: CHECK_NAME_NODE_VERSION,
51
+ passed: true,
52
+ message: `${version} (meets requirement: >=20.0.0)`,
53
+ }
54
+ : {
55
+ name: CHECK_NAME_NODE_VERSION,
56
+ passed: false,
57
+ message: `${version} is too old. Node.js 20+ required.`,
58
+ suggestion: 'Upgrade Node.js: https://nodejs.org/ or use nvm',
59
+ };
60
+ }
61
+ catch (error) {
62
+ const errorMessage = error instanceof Error ? error.message : String(error);
63
+ return {
64
+ name: CHECK_NAME_NODE_VERSION,
65
+ passed: false,
66
+ message: `Failed to detect: ${errorMessage}`,
67
+ suggestion: NODEJS_INSTALL_URL,
68
+ };
69
+ }
70
+ }
71
+ /**
72
+ * Check if git is installed
73
+ */
74
+ export function checkGitInstalled() {
75
+ try {
76
+ const version = getToolVersion('git');
77
+ if (!version) {
78
+ return {
79
+ name: CHECK_NAME_GIT_INSTALLED,
80
+ passed: false,
81
+ message: 'Git is not installed',
82
+ suggestion: GIT_INSTALL_URL,
83
+ };
84
+ }
85
+ return {
86
+ name: CHECK_NAME_GIT_INSTALLED,
87
+ passed: true,
88
+ message: version,
89
+ };
90
+ }
91
+ catch (error) {
92
+ const errorMessage = error instanceof Error ? error.message : String(error);
93
+ return {
94
+ name: CHECK_NAME_GIT_INSTALLED,
95
+ passed: false,
96
+ message: `Git is not installed: ${errorMessage}`,
97
+ suggestion: GIT_INSTALL_URL,
98
+ };
99
+ }
100
+ }
101
+ /**
102
+ * Check if current directory is a git repository
103
+ */
104
+ export function checkGitRepository() {
105
+ try {
106
+ // Walk up directory tree looking for .git
107
+ let currentDir = process.cwd();
108
+ let previousDir = '';
109
+ // Loop until we reach root (works on both Unix / and Windows C:\)
110
+ while (currentDir !== previousDir) {
111
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- Dynamic path walking is required for git repo detection
112
+ if (existsSync(join(currentDir, '.git'))) {
113
+ return {
114
+ name: CHECK_NAME_GIT_REPOSITORY,
115
+ passed: true,
116
+ message: 'Current directory is a git repository',
117
+ };
118
+ }
119
+ previousDir = currentDir;
120
+ currentDir = join(currentDir, '..');
121
+ }
122
+ return {
123
+ name: CHECK_NAME_GIT_REPOSITORY,
124
+ passed: false,
125
+ message: 'Current directory is not a git repository',
126
+ suggestion: 'Run: git init',
127
+ };
128
+ }
129
+ catch (error) {
130
+ const errorMessage = error instanceof Error ? error.message : String(error);
131
+ return {
132
+ name: CHECK_NAME_GIT_REPOSITORY,
133
+ passed: false,
134
+ message: `Error checking git repository: ${errorMessage}`,
135
+ suggestion: 'Run: git init',
136
+ };
137
+ }
138
+ }
139
+ /**
140
+ * Check if configuration file exists
141
+ *
142
+ * Uses findConfigPath() to walk up directory tree.
143
+ */
144
+ export function checkConfigFile() {
145
+ try {
146
+ const configPath = findConfigPath();
147
+ if (configPath) {
148
+ return {
149
+ name: CHECK_NAME_CONFIG_FILE,
150
+ passed: true,
151
+ message: `Found: ${configPath}`,
152
+ };
153
+ }
154
+ else {
155
+ return {
156
+ name: CHECK_NAME_CONFIG_FILE,
157
+ passed: false,
158
+ message: 'Configuration file not found',
159
+ suggestion: CREATE_CONFIG_SUGGESTION,
160
+ };
161
+ }
162
+ }
163
+ catch (error) {
164
+ const errorMessage = error instanceof Error ? error.message : String(error);
165
+ return {
166
+ name: CHECK_NAME_CONFIG_FILE,
167
+ passed: false,
168
+ message: `Error checking configuration: ${errorMessage}`,
169
+ suggestion: CREATE_CONFIG_SUGGESTION,
170
+ };
171
+ }
172
+ }
173
+ /**
174
+ * Check if configuration is valid
175
+ */
176
+ export function checkConfigValid() {
177
+ try {
178
+ const configPath = findConfigPath();
179
+ if (!configPath) {
180
+ return {
181
+ name: CHECK_NAME_CONFIG_VALID,
182
+ passed: false,
183
+ message: 'Configuration file not found',
184
+ suggestion: CREATE_CONFIG_SUGGESTION,
185
+ };
186
+ }
187
+ try {
188
+ loadConfig(configPath);
189
+ return {
190
+ name: CHECK_NAME_CONFIG_VALID,
191
+ passed: true,
192
+ message: 'Configuration is valid',
193
+ };
194
+ }
195
+ catch (error) {
196
+ const errorMessage = error instanceof Error ? error.message : String(error);
197
+ return {
198
+ name: CHECK_NAME_CONFIG_VALID,
199
+ passed: false,
200
+ message: `Configuration contains errors: ${errorMessage}`,
201
+ suggestion: 'Fix YAML syntax or schema errors in vibe-agent-toolkit.config.yaml',
202
+ };
203
+ }
204
+ }
205
+ catch (error) {
206
+ const errorMessage = error instanceof Error ? error.message : String(error);
207
+ return {
208
+ name: CHECK_NAME_CONFIG_VALID,
209
+ passed: false,
210
+ message: `Failed to check configuration: ${errorMessage}`,
211
+ suggestion: 'Check configuration file',
212
+ };
213
+ }
214
+ }
215
+ /**
216
+ * Default version checker - uses npm registry
217
+ */
218
+ const defaultVersionChecker = {
219
+ async fetchLatestVersion() {
220
+ const { safeExecSync } = await import('@vibe-agent-toolkit/utils');
221
+ const version = safeExecSync('npm', ['view', 'vibe-agent-toolkit', 'version'], {
222
+ encoding: 'utf8',
223
+ stdio: 'pipe',
224
+ });
225
+ return version.trim();
226
+ },
227
+ };
228
+ /**
229
+ * Check if vat version is up to date (advisory only)
230
+ */
231
+ export async function checkVatVersion(versionChecker = defaultVersionChecker) {
232
+ try {
233
+ // Get current version from package.json
234
+ const packageJsonPath = new URL('../../package.json', import.meta.url);
235
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- Package.json path is trusted static import
236
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
237
+ const currentVersion = packageJson.version;
238
+ // Fetch latest version from npm registry
239
+ try {
240
+ const latestVersion = await versionChecker.fetchLatestVersion();
241
+ const isOutdated = semver.lt(currentVersion, latestVersion);
242
+ if (currentVersion === latestVersion) {
243
+ return {
244
+ name: CHECK_NAME_VAT_VERSION,
245
+ passed: true,
246
+ message: `Current: ${currentVersion} — up to date`,
247
+ };
248
+ }
249
+ else if (isOutdated) {
250
+ return {
251
+ name: CHECK_NAME_VAT_VERSION,
252
+ passed: true, // Advisory only
253
+ message: `Current: ${currentVersion}, Latest: ${latestVersion} available`,
254
+ suggestion: 'Upgrade: npm install -g vibe-agent-toolkit@latest',
255
+ };
256
+ }
257
+ else {
258
+ return {
259
+ name: CHECK_NAME_VAT_VERSION,
260
+ passed: true,
261
+ message: `Current: ${currentVersion} (ahead of npm: ${latestVersion})`,
262
+ };
263
+ }
264
+ }
265
+ catch (npmError) {
266
+ const errorMessage = npmError instanceof Error ? npmError.message : String(npmError);
267
+ return {
268
+ name: CHECK_NAME_VAT_VERSION,
269
+ passed: true,
270
+ message: `Unable to check for updates: ${errorMessage}`,
271
+ };
272
+ }
273
+ }
274
+ catch (error) {
275
+ const errorMessage = error instanceof Error ? error.message : String(error);
276
+ return {
277
+ name: CHECK_NAME_VAT_VERSION,
278
+ passed: true,
279
+ message: `Unable to determine version: ${errorMessage}`,
280
+ };
281
+ }
282
+ }
283
+ /**
284
+ * Find project root by walking up directory tree
285
+ */
286
+ function findProjectRoot() {
287
+ let currentDir = process.cwd();
288
+ let previousDir = '';
289
+ // Loop until we reach root (works on both Unix / and Windows C:\)
290
+ while (currentDir !== previousDir) {
291
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- Dynamic path walking is required for project root detection
292
+ const hasConfig = existsSync(join(currentDir, 'vibe-agent-toolkit.config.yaml'));
293
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- Dynamic path walking is required for project root detection
294
+ const hasGit = existsSync(join(currentDir, '.git'));
295
+ if (hasConfig || hasGit) {
296
+ return currentDir;
297
+ }
298
+ previousDir = currentDir;
299
+ currentDir = join(currentDir, '..');
300
+ }
301
+ return null;
302
+ }
303
+ /**
304
+ * Detect if running in VAT source tree
305
+ */
306
+ function isVatSourceTree() {
307
+ try {
308
+ const projectRoot = findProjectRoot();
309
+ if (!projectRoot)
310
+ return false;
311
+ const cliPackagePath = join(projectRoot, 'packages/cli/package.json');
312
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- Dynamic path for VAT source detection
313
+ if (!existsSync(cliPackagePath))
314
+ return false;
315
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- Dynamic path for VAT source detection
316
+ const pkg = JSON.parse(readFileSync(cliPackagePath, 'utf8'));
317
+ return pkg.name === '@vibe-agent-toolkit/cli';
318
+ }
319
+ catch {
320
+ return false;
321
+ }
322
+ }
323
+ /**
324
+ * Check if CLI build is in sync with source code (development mode only)
325
+ */
326
+ export function checkCliBuildSync() {
327
+ try {
328
+ if (!isVatSourceTree()) {
329
+ return {
330
+ name: CHECK_NAME_CLI_BUILD_STATUS,
331
+ passed: true,
332
+ message: 'Skipped (not in VAT source tree)',
333
+ };
334
+ }
335
+ const projectRoot = findProjectRoot();
336
+ if (!projectRoot) {
337
+ return {
338
+ name: CHECK_NAME_CLI_BUILD_STATUS,
339
+ passed: true,
340
+ message: 'Skipped',
341
+ };
342
+ }
343
+ // Get running version
344
+ const runningPackagePath = new URL('../../package.json', import.meta.url);
345
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- Static import path is safe
346
+ const runningPackage = JSON.parse(readFileSync(runningPackagePath, 'utf8'));
347
+ const runningVersion = runningPackage.version;
348
+ // Get source version
349
+ const sourcePackagePath = join(projectRoot, 'packages/cli/package.json');
350
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- Project root path construction
351
+ const sourcePackage = JSON.parse(readFileSync(sourcePackagePath, 'utf8'));
352
+ const sourceVersion = sourcePackage.version;
353
+ if (runningVersion !== sourceVersion) {
354
+ return {
355
+ name: CHECK_NAME_CLI_BUILD_STATUS,
356
+ passed: false,
357
+ message: `Build is stale: running v${runningVersion}, source v${sourceVersion}`,
358
+ suggestion: 'Rebuild packages: bun run build',
359
+ };
360
+ }
361
+ return {
362
+ name: CHECK_NAME_CLI_BUILD_STATUS,
363
+ passed: true,
364
+ message: `Build is up to date (v${runningVersion})`,
365
+ };
366
+ }
367
+ catch {
368
+ return {
369
+ name: CHECK_NAME_CLI_BUILD_STATUS,
370
+ passed: true,
371
+ message: 'Skipped (could not determine build status)',
372
+ };
373
+ }
374
+ }
375
+ /**
376
+ * Run all doctor checks
377
+ *
378
+ * @param options - Doctor options
379
+ * @returns Doctor result
380
+ */
381
+ export async function runDoctor(options = {}) {
382
+ const { verbose = false, versionChecker } = options;
383
+ // 1. Detect project context
384
+ const currentDir = process.cwd();
385
+ const projectRoot = findProjectRoot();
386
+ const configPath = findConfigPath();
387
+ const projectContext = {
388
+ currentDir,
389
+ projectRoot,
390
+ configPath,
391
+ };
392
+ // 2. Run all checks (mix of sync and async)
393
+ const checks = [
394
+ await checkVatVersion(versionChecker),
395
+ checkNodeVersion(),
396
+ checkGitInstalled(),
397
+ checkGitRepository(),
398
+ checkConfigFile(),
399
+ checkConfigValid(),
400
+ checkCliBuildSync(),
401
+ ];
402
+ // 3. Filter output based on verbose mode
403
+ const displayChecks = verbose
404
+ ? checks
405
+ : checks.filter(c => !c.passed || c.suggestion);
406
+ // 4. Calculate summary
407
+ const allPassed = checks.every(c => c.passed);
408
+ const totalChecks = checks.length;
409
+ const passedChecks = checks.filter(c => c.passed).length;
410
+ return {
411
+ allPassed,
412
+ checks: displayChecks,
413
+ totalChecks,
414
+ passedChecks,
415
+ projectContext,
416
+ };
417
+ }
418
+ /**
419
+ * Main command handler for Commander.js
420
+ */
421
+ export function doctorCommand(program) {
422
+ program
423
+ .command('doctor')
424
+ .description('Diagnose vat setup and environment')
425
+ .option('--verbose', 'Show all checks including passing ones')
426
+ .addHelpText('after', `
427
+ When to run:
428
+ • Before starting development (ensure environment is ready)
429
+ • After installing or updating vat
430
+ • When debugging setup issues
431
+ • In CI/CD pipelines (validate build environment)
432
+
433
+ Exit Codes:
434
+ 0 - All checks passed
435
+ 1 - One or more checks failed (see output for suggested fixes)
436
+
437
+ Example:
438
+ $ vat doctor # Check environment, show only issues
439
+ $ vat doctor --verbose # Show all checks including passing ones
440
+
441
+ More details: vat --help --verbose or see packages/cli/docs/doctor.md
442
+ `)
443
+ .action(async function () {
444
+ // Check both command-level and parent (global) options for --verbose flag
445
+ const localOptions = this.opts();
446
+ const parentOptions = this.parent?.opts();
447
+ const options = {
448
+ verbose: localOptions.verbose ?? parentOptions?.verbose ?? false,
449
+ };
450
+ try {
451
+ const result = await runDoctor(options);
452
+ displayResults(result);
453
+ }
454
+ catch (error) {
455
+ console.error('❌ Doctor check failed:');
456
+ console.error(error instanceof Error ? error.message : String(error));
457
+ process.exit(1);
458
+ }
459
+ });
460
+ }
461
+ /**
462
+ * Display doctor results in human-friendly format
463
+ */
464
+ function displayResults(result) {
465
+ console.log('🩺 vat doctor\n');
466
+ // Show project context if in subdirectory
467
+ const { currentDir, projectRoot, configPath } = result.projectContext;
468
+ const isSubdirectory = projectRoot && projectRoot !== currentDir;
469
+ if (isSubdirectory) {
470
+ console.log('📍 Project Context');
471
+ console.log(` Current directory: ${currentDir}`);
472
+ console.log(` Project root: ${projectRoot}`);
473
+ if (configPath) {
474
+ console.log(` Configuration: ${configPath}`);
475
+ }
476
+ console.log('');
477
+ }
478
+ console.log('Running diagnostic checks...\n');
479
+ // Show checks
480
+ for (const check of result.checks) {
481
+ const icon = check.passed ? '✅' : '❌';
482
+ console.log(`${icon} ${check.name}`);
483
+ console.log(` ${check.message}`);
484
+ if (check.suggestion) {
485
+ console.log(` 💡 ${check.suggestion}`);
486
+ }
487
+ console.log('');
488
+ }
489
+ // Summary
490
+ console.log(`📊 Results: ${result.passedChecks}/${result.totalChecks} checks passed\n`);
491
+ if (result.allPassed) {
492
+ console.log('✨ All checks passed! Your vat setup looks healthy.');
493
+ }
494
+ else {
495
+ console.log('⚠️ Some checks failed. See suggestions above to fix.');
496
+ process.exit(1);
497
+ }
498
+ }
499
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/commands/resources/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAiDf"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/commands/resources/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA0Df"}
@@ -25,16 +25,24 @@ export async function scanCommand(pathArg, options) {
25
25
  return count;
26
26
  };
27
27
  const totalHeadings = allResources.reduce((sum, resource) => sum + countHeadings(resource.headings), 0);
28
+ // Get duplicate statistics
29
+ const duplicates = registry.getDuplicates();
30
+ const duplicateFileCount = duplicates.reduce((sum, group) => sum + group.length, 0);
31
+ const uniqueResources = registry.getUniqueByChecksum();
28
32
  // Output results as YAML
29
33
  writeYamlOutput({
30
34
  status: 'success',
31
35
  filesScanned: stats.totalResources,
36
+ uniqueFiles: uniqueResources.length,
37
+ duplicateGroups: duplicates.length,
38
+ duplicateFiles: duplicateFileCount,
32
39
  linksFound: stats.totalLinks,
33
40
  anchorsFound: totalHeadings,
34
41
  files: allResources.map(resource => ({
35
42
  path: resource.filePath,
36
43
  links: resource.links.length,
37
44
  anchors: countHeadings(resource.headings),
45
+ checksum: resource.checksum,
38
46
  })),
39
47
  duration: `${duration}ms`,
40
48
  });
@@ -1 +1 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/commands/resources/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAM1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA2B,EAC3B,OAAoB;IAEpB,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,qCAAqC;QACrC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,oBAAoB;QACpB,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;QAIhD,MAAM,aAAa,GAAG,CAAC,QAA+B,EAAU,EAAE;YAChE,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrB,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACzD,CAAC,CACF,CAAC;QAEF,yBAAyB;QACzB,eAAe,CAAC;YACd,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,KAAK,CAAC,cAAc;YAClC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,aAAa;YAC3B,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBACvB,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;gBAC5B,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAC1C,CAAC,CAAC;YACH,QAAQ,EAAE,GAAG,QAAQ,IAAI;SAC1B,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/commands/resources/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAM1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA2B,EAC3B,OAAoB;IAEpB,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,qCAAqC;QACrC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,oBAAoB;QACpB,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;QAIhD,MAAM,aAAa,GAAG,CAAC,QAA+B,EAAU,EAAE;YAChE,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrB,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACzD,CAAC,CACF,CAAC;QAEF,2BAA2B;QAC3B,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpF,MAAM,eAAe,GAAG,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QAEvD,yBAAyB;QACzB,eAAe,CAAC;YACd,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,KAAK,CAAC,cAAc;YAClC,WAAW,EAAE,eAAe,CAAC,MAAM;YACnC,eAAe,EAAE,UAAU,CAAC,MAAM;YAClC,cAAc,EAAE,kBAAkB;YAClC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,aAAa;YAC3B,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBACvB,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;gBAC5B,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B,CAAC,CAAC;YACH,QAAQ,EAAE,GAAG,QAAQ,IAAI;SAC1B,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
@@ -2,6 +2,12 @@
2
2
  * Configuration file loading and validation
3
3
  */
4
4
  import { type ProjectConfig } from '../schemas/config.js';
5
+ /**
6
+ * Find configuration file by walking up directory tree
7
+ * @param startDir - Starting directory (defaults to cwd)
8
+ * @returns Path to config file, or null if not found
9
+ */
10
+ export declare function findConfigPath(startDir?: string): string | null;
5
11
  /**
6
12
  * Load and validate project configuration
7
13
  * @param projectRoot - Project root directory
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI/F;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA6B7D"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI/F;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc/D;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA6B7D"}
@@ -6,6 +6,24 @@ import { join } from 'node:path';
6
6
  import * as yaml from 'js-yaml';
7
7
  import { ProjectConfigSchema, DEFAULT_CONFIG } from '../schemas/config.js';
8
8
  const CONFIG_FILENAME = 'vibe-agent-toolkit.config.yaml';
9
+ /**
10
+ * Find configuration file by walking up directory tree
11
+ * @param startDir - Starting directory (defaults to cwd)
12
+ * @returns Path to config file, or null if not found
13
+ */
14
+ export function findConfigPath(startDir) {
15
+ let currentDir = startDir ?? process.cwd();
16
+ const root = '/';
17
+ while (currentDir !== root) {
18
+ const configPath = join(currentDir, CONFIG_FILENAME);
19
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- Dynamic path walking is required for config file search
20
+ if (existsSync(configPath)) {
21
+ return configPath;
22
+ }
23
+ currentDir = join(currentDir, '..');
24
+ }
25
+ return null;
26
+ }
9
27
  /**
10
28
  * Load and validate project configuration
11
29
  * @param projectRoot - Project root directory
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAC;AAE/F,MAAM,eAAe,GAAG,gCAAgC,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAEtD,uHAAuH;IACvH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,uHAAuH;QACvH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElC,2BAA2B;QAC3B,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAErD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CACtD,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAC;AAE/F,MAAM,eAAe,GAAG,gCAAgC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAiB;IAC9C,IAAI,UAAU,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,GAAG,CAAC;IAEjB,OAAO,UAAU,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QACrD,8HAA8H;QAC9H,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAEtD,uHAAuH;IACvH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,uHAAuH;QACvH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElC,2BAA2B;QAC3B,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAErD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CACtD,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}