@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.
- package/README.md +67 -4
- package/dist/bin.js +15 -12
- package/dist/bin.js.map +1 -1
- package/dist/commands/agent/index.d.ts.map +1 -1
- package/dist/commands/agent/index.js +0 -37
- package/dist/commands/agent/index.js.map +1 -1
- package/dist/commands/audit/cache-detector.d.ts +32 -0
- package/dist/commands/audit/cache-detector.d.ts.map +1 -0
- package/dist/commands/audit/cache-detector.js +68 -0
- package/dist/commands/audit/cache-detector.js.map +1 -0
- package/dist/commands/audit/hierarchical-output.d.ts +41 -0
- package/dist/commands/audit/hierarchical-output.d.ts.map +1 -0
- package/dist/commands/audit/hierarchical-output.js +267 -0
- package/dist/commands/audit/hierarchical-output.js.map +1 -0
- package/dist/commands/audit.d.ts +18 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +386 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/doctor.d.ts +106 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +499 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/resources/scan.d.ts.map +1 -1
- package/dist/commands/resources/scan.js +8 -0
- package/dist/commands/resources/scan.js.map +1 -1
- package/dist/utils/config-loader.d.ts +6 -0
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +18 -0
- package/dist/utils/config-loader.js.map +1 -1
- package/docs/audit.md +446 -0
- package/docs/doctor.md +268 -0
- package/docs/index.md +32 -0
- package/package.json +11 -8
- package/dist/commands/agent/audit.d.ts +0 -9
- package/dist/commands/agent/audit.d.ts.map +0 -1
- package/dist/commands/agent/audit.js +0 -139
- 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,
|
|
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;
|
|
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"}
|