@agents-inc/cli 0.85.0 → 0.87.0
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/CHANGELOG.md +20 -0
- package/dist/{chunk-6VGBO6SZ.js → chunk-5M6Q5UQO.js} +2 -2
- package/dist/chunk-5UJJQFET.js +564 -0
- package/dist/chunk-5UJJQFET.js.map +1 -0
- package/dist/{chunk-TXW257CU.js → chunk-7FFNNDJQ.js} +181 -202
- package/dist/chunk-7FFNNDJQ.js.map +1 -0
- package/dist/{chunk-YJ2URWF7.js → chunk-B6MYECV6.js} +2 -2
- package/dist/{chunk-G2MINRWX.js → chunk-C5IYJ42F.js} +2 -2
- package/dist/{chunk-7UZUDHP7.js → chunk-CXWBVBDM.js} +2 -2
- package/dist/{chunk-CYPCJ536.js → chunk-FBZR46GC.js} +92 -92
- package/dist/chunk-FBZR46GC.js.map +1 -0
- package/dist/{chunk-LTFGEVTM.js → chunk-HH3AWXF4.js} +3 -3
- package/dist/{chunk-2XVLQDNI.js → chunk-HSLVCKVQ.js} +3 -3
- package/dist/{chunk-TAQGYJIS.js → chunk-HZ2IBXVQ.js} +3 -3
- package/dist/{chunk-LN76TJJP.js → chunk-HZQOFFKA.js} +10 -10
- package/dist/{chunk-W7LHI54P.js → chunk-I44YG6VI.js} +2 -2
- package/dist/{chunk-FT46LN7K.js → chunk-I5AZKNNL.js} +7 -8
- package/dist/chunk-I5AZKNNL.js.map +1 -0
- package/dist/chunk-J6PI73YV.js +68 -0
- package/dist/chunk-J6PI73YV.js.map +1 -0
- package/dist/{chunk-L7COG2EX.js → chunk-LZ7XQ3IU.js} +2 -2
- package/dist/{chunk-LMR7VAP3.js → chunk-MMTMXLI4.js} +2 -2
- package/dist/chunk-N6A7A4RA.js +16 -0
- package/dist/chunk-N6A7A4RA.js.map +1 -0
- package/dist/{chunk-WJKD6EGK.js → chunk-NUU3U43A.js} +5 -6
- package/dist/chunk-NUU3U43A.js.map +1 -0
- package/dist/{chunk-YYIWB42G.js → chunk-Q4DMIPZB.js} +2 -2
- package/dist/{chunk-YSLDMYWP.js → chunk-SGZOFIFF.js} +2 -2
- package/dist/{chunk-FKXD3EXJ.js → chunk-TMTUTUEV.js} +42 -228
- package/dist/chunk-TMTUTUEV.js.map +1 -0
- package/dist/{chunk-WCCWQ56J.js → chunk-UNEJKTLP.js} +3 -3
- package/dist/{chunk-ZGD7PLLC.js → chunk-ZOWRO7UQ.js} +3 -3
- package/dist/commands/build/marketplace.js +3 -3
- package/dist/commands/build/plugins.js +5 -5
- package/dist/commands/build/stack.js +5 -5
- package/dist/commands/compile.js +77 -171
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/index.js +5 -5
- package/dist/commands/config/path.js +4 -4
- package/dist/commands/config/show.js +5 -5
- package/dist/commands/diff.js +161 -167
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +68 -83
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +275 -209
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +206 -124
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +175 -144
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +58 -102
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +19 -16
- package/dist/commands/list.js +4 -4
- package/dist/commands/new/agent.js +124 -102
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +6 -6
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +328 -15
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +16 -24
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +166 -132
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +269 -189
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +238 -219
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +4 -4
- package/dist/components/skill-search/skill-search.js +2 -1
- package/dist/components/wizard/category-grid.test.js +4 -4
- package/dist/components/wizard/domain-selection.js +5 -5
- package/dist/components/wizard/help-modal.js +5 -5
- package/dist/components/wizard/source-grid.test.js +4 -4
- package/dist/components/wizard/stack-selection.js +5 -5
- package/dist/components/wizard/step-agents.js +5 -5
- package/dist/components/wizard/step-agents.test.js +5 -5
- package/dist/components/wizard/step-build.js +5 -5
- package/dist/components/wizard/step-build.test.js +5 -5
- package/dist/components/wizard/step-confirm.test.js +4 -4
- package/dist/components/wizard/step-settings.js +4 -4
- package/dist/components/wizard/step-settings.test.js +7 -7
- package/dist/components/wizard/step-sources.js +5 -5
- package/dist/components/wizard/step-sources.test.js +5 -5
- package/dist/components/wizard/step-stack.js +6 -6
- package/dist/components/wizard/step-stack.test.js +6 -6
- package/dist/components/wizard/wizard-layout.js +6 -6
- package/dist/components/wizard/wizard.js +14 -14
- package/dist/hooks/init.js +19 -16
- package/dist/hooks/init.js.map +1 -1
- package/dist/{loader-GT2A7R7U.js → loader-GSEGPK64.js} +3 -3
- package/dist/{source-loader-TNQW4P47.js → source-loader-OGFTIRIX.js} +4 -4
- package/dist/{source-manager-INRXRFJE.js → source-manager-FMMDDVZA.js} +4 -4
- package/dist/stores/wizard-store.js +4 -4
- package/dist/stores/wizard-store.test.js +4 -4
- package/package.json +1 -1
- package/dist/chunk-AABH2HSE.js +0 -340
- package/dist/chunk-AABH2HSE.js.map +0 -1
- package/dist/chunk-CYPCJ536.js.map +0 -1
- package/dist/chunk-FKXD3EXJ.js.map +0 -1
- package/dist/chunk-FT46LN7K.js.map +0 -1
- package/dist/chunk-TXW257CU.js.map +0 -1
- package/dist/chunk-WJKD6EGK.js.map +0 -1
- /package/dist/{chunk-6VGBO6SZ.js.map → chunk-5M6Q5UQO.js.map} +0 -0
- /package/dist/{chunk-YJ2URWF7.js.map → chunk-B6MYECV6.js.map} +0 -0
- /package/dist/{chunk-G2MINRWX.js.map → chunk-C5IYJ42F.js.map} +0 -0
- /package/dist/{chunk-7UZUDHP7.js.map → chunk-CXWBVBDM.js.map} +0 -0
- /package/dist/{chunk-LTFGEVTM.js.map → chunk-HH3AWXF4.js.map} +0 -0
- /package/dist/{chunk-2XVLQDNI.js.map → chunk-HSLVCKVQ.js.map} +0 -0
- /package/dist/{chunk-TAQGYJIS.js.map → chunk-HZ2IBXVQ.js.map} +0 -0
- /package/dist/{chunk-LN76TJJP.js.map → chunk-HZQOFFKA.js.map} +0 -0
- /package/dist/{chunk-W7LHI54P.js.map → chunk-I44YG6VI.js.map} +0 -0
- /package/dist/{chunk-L7COG2EX.js.map → chunk-LZ7XQ3IU.js.map} +0 -0
- /package/dist/{chunk-LMR7VAP3.js.map → chunk-MMTMXLI4.js.map} +0 -0
- /package/dist/{chunk-YYIWB42G.js.map → chunk-Q4DMIPZB.js.map} +0 -0
- /package/dist/{chunk-YSLDMYWP.js.map → chunk-SGZOFIFF.js.map} +0 -0
- /package/dist/{chunk-WCCWQ56J.js.map → chunk-UNEJKTLP.js.map} +0 -0
- /package/dist/{chunk-ZGD7PLLC.js.map → chunk-ZOWRO7UQ.js.map} +0 -0
- /package/dist/{loader-GT2A7R7U.js.map → loader-GSEGPK64.js.map} +0 -0
- /package/dist/{source-loader-TNQW4P47.js.map → source-loader-OGFTIRIX.js.map} +0 -0
- /package/dist/{source-manager-INRXRFJE.js.map → source-manager-FMMDDVZA.js.map} +0 -0
package/dist/commands/doctor.js
CHANGED
|
@@ -1,26 +1,30 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
detectProject,
|
|
4
|
+
loadSource
|
|
5
|
+
} from "../chunk-5UJJQFET.js";
|
|
6
|
+
import "../chunk-N6A7A4RA.js";
|
|
7
|
+
import "../chunk-FBZR46GC.js";
|
|
2
8
|
import {
|
|
3
9
|
discoverLocalSkills,
|
|
4
10
|
getStackSkillIds,
|
|
5
|
-
loadProjectConfig,
|
|
6
|
-
loadSkillsMatrixFromSource,
|
|
7
11
|
validateProjectConfig
|
|
8
|
-
} from "../chunk-
|
|
9
|
-
import "../chunk-
|
|
12
|
+
} from "../chunk-TMTUTUEV.js";
|
|
13
|
+
import "../chunk-B6MYECV6.js";
|
|
10
14
|
import {
|
|
11
15
|
matrix
|
|
12
16
|
} from "../chunk-ANXHMG32.js";
|
|
13
17
|
import {
|
|
14
18
|
BaseCommand,
|
|
15
19
|
EXIT_CODES
|
|
16
|
-
} from "../chunk-
|
|
20
|
+
} from "../chunk-MMTMXLI4.js";
|
|
17
21
|
import {
|
|
18
22
|
directoryExists,
|
|
19
23
|
fileExists,
|
|
20
24
|
getErrorMessage,
|
|
21
25
|
glob,
|
|
22
26
|
setVerbose
|
|
23
|
-
} from "../chunk-
|
|
27
|
+
} from "../chunk-NUU3U43A.js";
|
|
24
28
|
import "../chunk-6XWHJHNZ.js";
|
|
25
29
|
import {
|
|
26
30
|
CLAUDE_DIR,
|
|
@@ -39,33 +43,44 @@ init_esm_shims();
|
|
|
39
43
|
import { Flags } from "@oclif/core";
|
|
40
44
|
import os from "os";
|
|
41
45
|
import path from "path";
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (!loaded) {
|
|
46
|
+
function checkConfigValid(config) {
|
|
47
|
+
if (!config) {
|
|
45
48
|
return {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
result: {
|
|
50
|
+
status: "fail",
|
|
51
|
+
message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} not found`,
|
|
52
|
+
details: [`Run '${CLI_BIN_NAME} init' to create a configuration`]
|
|
53
|
+
},
|
|
54
|
+
config: null
|
|
49
55
|
};
|
|
50
56
|
}
|
|
51
|
-
const validation = validateProjectConfig(
|
|
57
|
+
const validation = validateProjectConfig(config);
|
|
52
58
|
if (!validation.valid) {
|
|
53
59
|
return {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
60
|
+
result: {
|
|
61
|
+
status: "fail",
|
|
62
|
+
message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} has errors`,
|
|
63
|
+
details: validation.errors
|
|
64
|
+
},
|
|
65
|
+
config: null
|
|
57
66
|
};
|
|
58
67
|
}
|
|
59
68
|
if (validation.warnings.length > 0) {
|
|
60
69
|
return {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
70
|
+
result: {
|
|
71
|
+
status: "warn",
|
|
72
|
+
message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} has warnings`,
|
|
73
|
+
details: validation.warnings
|
|
74
|
+
},
|
|
75
|
+
config
|
|
64
76
|
};
|
|
65
77
|
}
|
|
66
78
|
return {
|
|
67
|
-
|
|
68
|
-
|
|
79
|
+
result: {
|
|
80
|
+
status: "pass",
|
|
81
|
+
message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} is valid`
|
|
82
|
+
},
|
|
83
|
+
config
|
|
69
84
|
};
|
|
70
85
|
}
|
|
71
86
|
async function checkSkillsResolved(config, matrix2, projectDir) {
|
|
@@ -168,7 +183,7 @@ async function checkNoOrphans(config, projectDir) {
|
|
|
168
183
|
}
|
|
169
184
|
async function checkSourceReachable(sourceFlag, projectDir) {
|
|
170
185
|
try {
|
|
171
|
-
const result = await
|
|
186
|
+
const { sourceResult: result } = await loadSource({
|
|
172
187
|
sourceFlag,
|
|
173
188
|
projectDir
|
|
174
189
|
});
|
|
@@ -275,6 +290,7 @@ function formatTips(results) {
|
|
|
275
290
|
}
|
|
276
291
|
return tips;
|
|
277
292
|
}
|
|
293
|
+
var SKIP_RESULT = { status: "skip", message: "Skipped (config invalid)" };
|
|
278
294
|
var Doctor = class _Doctor extends BaseCommand {
|
|
279
295
|
static summary = "Diagnose common configuration issues";
|
|
280
296
|
static description = `Run diagnostic checks on your ${DEFAULT_BRANDING.NAME} configuration to identify issues with config validity, skill resolution, agent compilation, and source connectivity.`;
|
|
@@ -298,81 +314,50 @@ var Doctor = class _Doctor extends BaseCommand {
|
|
|
298
314
|
const { flags } = await this.parse(_Doctor);
|
|
299
315
|
setVerbose(flags.verbose);
|
|
300
316
|
const projectDir = process.cwd();
|
|
317
|
+
this.printHeader();
|
|
318
|
+
const results = await this.runAllChecks(projectDir, flags);
|
|
319
|
+
this.printResults(results);
|
|
320
|
+
if (results.some((r) => r.status === "fail")) {
|
|
321
|
+
this.exit(EXIT_CODES.ERROR);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
printHeader() {
|
|
301
325
|
this.log("");
|
|
302
326
|
this.log(`${DEFAULT_BRANDING.NAME} Doctor`);
|
|
303
327
|
this.log("");
|
|
304
328
|
this.log(" Checking configuration health...");
|
|
305
329
|
this.log("");
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
if (configResult.status !== "fail") {
|
|
312
|
-
const loaded = await loadProjectConfig(projectDir);
|
|
313
|
-
config = loaded?.config ?? null;
|
|
314
|
-
}
|
|
330
|
+
}
|
|
331
|
+
async runAllChecks(projectDir, flags) {
|
|
332
|
+
const detected = await detectProject(projectDir);
|
|
333
|
+
const { result: configResult, config } = checkConfigValid(detected?.config ?? null);
|
|
334
|
+
this.logCheck("Config Valid", configResult, flags.verbose);
|
|
315
335
|
const sourceResult = await checkSourceReachable(flags.source, projectDir);
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
formatCheckLine("Skills Resolved", skipResult, flags.verbose).forEach(
|
|
329
|
-
(line) => this.log(line)
|
|
330
|
-
);
|
|
331
|
-
}
|
|
332
|
-
if (config) {
|
|
333
|
-
const agentsResult = await checkAgentsCompiled(config, projectDir);
|
|
334
|
-
results.push(agentsResult);
|
|
335
|
-
formatCheckLine("Agents Compiled", agentsResult, flags.verbose).forEach(
|
|
336
|
-
(line) => this.log(line)
|
|
337
|
-
);
|
|
338
|
-
} else {
|
|
339
|
-
const skipResult = {
|
|
340
|
-
status: "skip",
|
|
341
|
-
message: "Skipped (config invalid)"
|
|
342
|
-
};
|
|
343
|
-
results.push(skipResult);
|
|
344
|
-
formatCheckLine("Agents Compiled", skipResult, flags.verbose).forEach(
|
|
345
|
-
(line) => this.log(line)
|
|
346
|
-
);
|
|
347
|
-
}
|
|
348
|
-
if (config) {
|
|
349
|
-
const orphansResult = await checkNoOrphans(config, projectDir);
|
|
350
|
-
results.push(orphansResult);
|
|
351
|
-
formatCheckLine("No Orphans", orphansResult, flags.verbose).forEach((line) => this.log(line));
|
|
352
|
-
} else {
|
|
353
|
-
const skipResult = {
|
|
354
|
-
status: "skip",
|
|
355
|
-
message: "Skipped (config invalid)"
|
|
356
|
-
};
|
|
357
|
-
results.push(skipResult);
|
|
358
|
-
formatCheckLine("No Orphans", skipResult, flags.verbose).forEach((line) => this.log(line));
|
|
336
|
+
const skillsResult = config ? await checkSkillsResolved(config, matrix, projectDir) : SKIP_RESULT;
|
|
337
|
+
this.logCheck("Skills Resolved", skillsResult, flags.verbose);
|
|
338
|
+
const agentsResult = config ? await checkAgentsCompiled(config, projectDir) : SKIP_RESULT;
|
|
339
|
+
this.logCheck("Agents Compiled", agentsResult, flags.verbose);
|
|
340
|
+
const orphansResult = config ? await checkNoOrphans(config, projectDir) : SKIP_RESULT;
|
|
341
|
+
this.logCheck("No Orphans", orphansResult, flags.verbose);
|
|
342
|
+
this.logCheck("Source Reachable", sourceResult, flags.verbose);
|
|
343
|
+
return [configResult, skillsResult, agentsResult, orphansResult, sourceResult];
|
|
344
|
+
}
|
|
345
|
+
logCheck(name, result, verbose) {
|
|
346
|
+
for (const line of formatCheckLine(name, result, verbose)) {
|
|
347
|
+
this.log(line);
|
|
359
348
|
}
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
(line) => this.log(line)
|
|
363
|
-
);
|
|
349
|
+
}
|
|
350
|
+
printResults(results) {
|
|
364
351
|
this.log("");
|
|
365
352
|
this.log(formatSummary(results));
|
|
366
353
|
const tips = formatTips(results);
|
|
367
354
|
if (tips.length > 0) {
|
|
368
355
|
this.log("");
|
|
369
|
-
|
|
356
|
+
for (const tip of tips) {
|
|
357
|
+
this.log(tip);
|
|
358
|
+
}
|
|
370
359
|
}
|
|
371
360
|
this.log("");
|
|
372
|
-
const hasErrors = results.some((r) => r.status === "fail");
|
|
373
|
-
if (hasErrors) {
|
|
374
|
-
this.exit(EXIT_CODES.ERROR);
|
|
375
|
-
}
|
|
376
361
|
}
|
|
377
362
|
};
|
|
378
363
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/doctor.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport os from \"os\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { loadProjectConfig, validateProjectConfig } from \"../lib/configuration\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { discoverLocalSkills } from \"../lib/skills\";\nimport { getStackSkillIds } from \"../lib/stacks\";\nimport type { AgentName, MergedSkillsMatrix, ProjectConfig, SkillId } from \"../types\";\nimport { fileExists, glob, directoryExists } from \"../utils/fs\";\nimport {\n CLAUDE_DIR,\n CLAUDE_SRC_DIR,\n CLI_BIN_NAME,\n DEFAULT_BRANDING,\n STANDARD_FILES,\n} from \"../consts\";\nimport { setVerbose } from \"../utils/logger\";\n\ntype CheckResult = {\n status: \"pass\" | \"fail\" | \"warn\" | \"skip\";\n message: string;\n details?: string[];\n};\n\nasync function checkConfigValid(projectDir: string): Promise<CheckResult> {\n const loaded = await loadProjectConfig(projectDir);\n\n if (!loaded) {\n return {\n status: \"fail\",\n message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} not found`,\n details: [`Run '${CLI_BIN_NAME} init' to create a configuration`],\n };\n }\n\n const validation = validateProjectConfig(loaded.config);\n\n if (!validation.valid) {\n return {\n status: \"fail\",\n message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} has errors`,\n details: validation.errors,\n };\n }\n\n if (validation.warnings.length > 0) {\n return {\n status: \"warn\",\n message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} has warnings`,\n details: validation.warnings,\n };\n }\n\n return {\n status: \"pass\",\n message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} is valid`,\n };\n}\n\nasync function checkSkillsResolved(\n config: ProjectConfig,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): Promise<CheckResult> {\n const uniqueSkills = config.stack ? getStackSkillIds(config.stack) : [];\n\n if (uniqueSkills.length === 0) {\n return {\n status: \"pass\",\n message: \"No skills configured\",\n };\n }\n\n const localResult = await discoverLocalSkills(projectDir);\n const globalResult = projectDir !== os.homedir() ? await discoverLocalSkills(os.homedir()) : null;\n const localSkillIds = new Set([\n ...(localResult?.skills.map((s) => s.id) ?? []),\n ...(globalResult?.skills.map((s) => s.id) ?? []),\n ]);\n\n const missingSkills: string[] = [];\n for (const skillId of uniqueSkills) {\n const inMatrix = skillId in matrix.skills;\n const inLocal = localSkillIds.has(skillId);\n if (!inMatrix && !inLocal) {\n missingSkills.push(skillId);\n }\n }\n\n if (missingSkills.length > 0) {\n return {\n status: \"fail\",\n message: `${uniqueSkills.length - missingSkills.length}/${uniqueSkills.length} skills found`,\n details: missingSkills.map((s) => `- ${s} (not found)`),\n };\n }\n\n return {\n status: \"pass\",\n message: `${uniqueSkills.length}/${uniqueSkills.length} skills found`,\n };\n}\n\nasync function checkAgentsCompiled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const agents = config.agents ?? [];\n\n if (agents.length === 0) {\n return {\n status: \"pass\",\n message: \"No agents configured\",\n };\n }\n\n const projectAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const globalAgentsDir = path.join(os.homedir(), CLAUDE_DIR, \"agents\");\n const missingAgents: string[] = [];\n\n for (const agent of agents) {\n // Check scope-appropriate directory for the agent\n const agentsDir = agent.scope === \"global\" ? globalAgentsDir : projectAgentsDir;\n const agentPath = path.join(agentsDir, `${agent.name}.md`);\n if (!(await fileExists(agentPath))) {\n missingAgents.push(agent.name);\n }\n }\n\n if (missingAgents.length > 0) {\n return {\n status: \"warn\",\n message: `${missingAgents.length} agent${missingAgents.length === 1 ? \"\" : \"s\"} need${missingAgents.length === 1 ? \"s\" : \"\"} recompilation`,\n details: missingAgents.map((a) => `- ${a} (missing)`),\n };\n }\n\n return {\n status: \"pass\",\n message: `${agents.length}/${agents.length} agents compiled`,\n };\n}\n\nasync function checkNoOrphans(config: ProjectConfig, projectDir: string): Promise<CheckResult> {\n const projectAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const globalAgentsDir = path.join(os.homedir(), CLAUDE_DIR, \"agents\");\n\n const projectExists = await directoryExists(projectAgentsDir);\n const globalExists = projectDir !== os.homedir() && (await directoryExists(globalAgentsDir));\n\n if (!projectExists && !globalExists) {\n return {\n status: \"pass\",\n message: \"No agents directory\",\n };\n }\n\n const projectMdFiles = projectExists ? await glob(\"*.md\", projectAgentsDir) : [];\n const globalMdFiles = globalExists ? await glob(\"*.md\", globalAgentsDir) : [];\n const mdFiles = [...new Set([...projectMdFiles, ...globalMdFiles])];\n const configAgentNames: Set<string> = new Set((config.agents ?? []).map((a) => a.name));\n\n const orphanedFiles: string[] = [];\n for (const file of mdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n if (!configAgentNames.has(agentName)) {\n orphanedFiles.push(agentName);\n }\n }\n\n if (orphanedFiles.length > 0) {\n return {\n status: \"warn\",\n message: `${orphanedFiles.length} orphaned agent file${orphanedFiles.length === 1 ? \"\" : \"s\"}`,\n details: orphanedFiles.map((f) => `- ${f}.md (not in config)`),\n };\n }\n\n return {\n status: \"pass\",\n message: \"No orphaned agent files\",\n };\n}\n\nasync function checkSourceReachable(\n sourceFlag: string | undefined,\n projectDir: string,\n): Promise<CheckResult> {\n try {\n const result = await loadSkillsMatrixFromSource({\n sourceFlag,\n projectDir,\n });\n\n const skillCount = Object.keys(matrix.skills).length;\n const sourceLabel = result.isLocal ? \"local\" : \"remote\";\n\n return {\n status: \"pass\",\n message: `Connected to ${sourceLabel}: ${result.sourcePath}`,\n details: [`${skillCount} skills available`],\n };\n } catch (error) {\n const message = getErrorMessage(error);\n return {\n status: \"fail\",\n message: \"Failed to load source\",\n details: [message],\n };\n }\n}\n\nconst CHECK_WIDTH = 20;\n\nfunction formatCheckName(name: string): string {\n return name.padEnd(CHECK_WIDTH);\n}\n\nfunction formatStatus(status: CheckResult[\"status\"]): string {\n switch (status) {\n case \"pass\":\n return \"\\u2713\"; // ✓\n case \"fail\":\n return \"\\u2717\"; // ✗\n case \"warn\":\n return \"!\";\n case \"skip\":\n return \"-\";\n default:\n return \"?\";\n }\n}\n\nfunction formatCheckLine(name: string, result: CheckResult, verbose: boolean): string[] {\n const statusIcon = formatStatus(result.status);\n const nameFormatted = formatCheckName(name);\n const lines: string[] = [];\n\n lines.push(` ${nameFormatted}${statusIcon} ${result.message}`);\n\n const shouldShowDetails =\n result.details &&\n result.details.length > 0 &&\n (verbose || result.status === \"fail\" || result.status === \"warn\");\n\n if (shouldShowDetails) {\n for (const detail of result.details!) {\n lines.push(` ${\" \".repeat(CHECK_WIDTH)} ${detail}`);\n }\n }\n\n return lines;\n}\n\nfunction formatSummary(results: CheckResult[]): string {\n let passed = 0;\n let warnings = 0;\n let errors = 0;\n\n for (const result of results) {\n switch (result.status) {\n case \"pass\":\n passed++;\n break;\n case \"warn\":\n warnings++;\n break;\n case \"fail\":\n errors++;\n break;\n // skip doesn't count\n default:\n break;\n }\n }\n\n const parts: string[] = [];\n parts.push(`${passed} passed`);\n\n if (warnings > 0) {\n parts.push(`${warnings} warning${warnings === 1 ? \"\" : \"s\"}`);\n } else {\n parts.push(`0 warnings`);\n }\n\n if (errors > 0) {\n parts.push(`${errors} error${errors === 1 ? \"\" : \"s\"}`);\n } else {\n parts.push(`0 errors`);\n }\n\n return ` Summary: ${parts.join(\", \")}`;\n}\n\nfunction formatTips(results: CheckResult[]): string[] {\n const hasAgentWarning = results.some(\n (r) => r.status === \"warn\" && r.message.includes(\"recompilation\"),\n );\n const hasConfigError = results.some((r) => r.status === \"fail\" && r.message.includes(\"config\"));\n const hasSkillError = results.some(\n (r) => r.status === \"fail\" && r.message.includes(\"skills found\"),\n );\n\n const tips: string[] = [];\n\n if (hasAgentWarning) {\n tips.push(` Tip: Run '${CLI_BIN_NAME} compile' to generate missing agent files`);\n }\n if (hasConfigError) {\n tips.push(` Tip: Run '${CLI_BIN_NAME} init' to create or fix configuration`);\n }\n if (hasSkillError) {\n tips.push(\" Tip: Check skill IDs in config match available skills\");\n }\n\n return tips;\n}\n\nexport default class Doctor extends BaseCommand {\n static summary = \"Diagnose common configuration issues\";\n\n static description = `Run diagnostic checks on your ${DEFAULT_BRANDING.NAME} configuration to identify issues with config validity, skill resolution, agent compilation, and source connectivity.`;\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --verbose\",\n \"<%= config.bin %> <%= command.id %> --source /path/to/marketplace\",\n ];\n\n static flags = {\n source: Flags.string({\n char: \"s\",\n description: \"Skills source path or URL\",\n }),\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Show detailed output\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Doctor);\n\n setVerbose(flags.verbose);\n\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Doctor`);\n this.log(\"\");\n this.log(\" Checking configuration health...\");\n this.log(\"\");\n\n const results: CheckResult[] = [];\n\n const configResult = await checkConfigValid(projectDir);\n results.push(configResult);\n formatCheckLine(\"Config Valid\", configResult, flags.verbose).forEach((line) => this.log(line));\n\n let config: ProjectConfig | null = null;\n\n if (configResult.status !== \"fail\") {\n const loaded = await loadProjectConfig(projectDir);\n config = loaded?.config ?? null;\n }\n\n const sourceResult = await checkSourceReachable(flags.source, projectDir);\n\n // loadSkillsMatrixFromSource (called by checkSourceReachable) populates the matrix automatically\n if (config) {\n const skillsResult = await checkSkillsResolved(config, matrix, projectDir);\n results.push(skillsResult);\n formatCheckLine(\"Skills Resolved\", skillsResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n } else {\n const skipResult: CheckResult = {\n status: \"skip\",\n message: \"Skipped (config invalid)\",\n };\n results.push(skipResult);\n formatCheckLine(\"Skills Resolved\", skipResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n }\n\n if (config) {\n const agentsResult = await checkAgentsCompiled(config, projectDir);\n results.push(agentsResult);\n formatCheckLine(\"Agents Compiled\", agentsResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n } else {\n const skipResult: CheckResult = {\n status: \"skip\",\n message: \"Skipped (config invalid)\",\n };\n results.push(skipResult);\n formatCheckLine(\"Agents Compiled\", skipResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n }\n\n if (config) {\n const orphansResult = await checkNoOrphans(config, projectDir);\n results.push(orphansResult);\n formatCheckLine(\"No Orphans\", orphansResult, flags.verbose).forEach((line) => this.log(line));\n } else {\n const skipResult: CheckResult = {\n status: \"skip\",\n message: \"Skipped (config invalid)\",\n };\n results.push(skipResult);\n formatCheckLine(\"No Orphans\", skipResult, flags.verbose).forEach((line) => this.log(line));\n }\n\n results.push(sourceResult);\n formatCheckLine(\"Source Reachable\", sourceResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n\n this.log(\"\");\n this.log(formatSummary(results));\n\n const tips = formatTips(results);\n if (tips.length > 0) {\n this.log(\"\");\n tips.forEach((tip) => this.log(tip));\n }\n\n this.log(\"\");\n\n const hasErrors = results.some((r) => r.status === \"fail\");\n if (hasErrors) {\n this.exit(EXIT_CODES.ERROR);\n }\n }\n}\n"],"mappings":"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","names":["matrix"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/doctor.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport os from \"os\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { validateProjectConfig } from \"../lib/configuration\";\nimport { loadSource, detectProject } from \"../lib/operations\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { discoverLocalSkills } from \"../lib/skills\";\nimport { getStackSkillIds } from \"../lib/stacks\";\nimport type { MergedSkillsMatrix, ProjectConfig } from \"../types\";\nimport { fileExists, glob, directoryExists } from \"../utils/fs\";\nimport {\n CLAUDE_DIR,\n CLAUDE_SRC_DIR,\n CLI_BIN_NAME,\n DEFAULT_BRANDING,\n STANDARD_FILES,\n} from \"../consts\";\nimport { setVerbose } from \"../utils/logger\";\n\ntype CheckResult = {\n status: \"pass\" | \"fail\" | \"warn\" | \"skip\";\n message: string;\n details?: string[];\n};\n\ntype ConfigCheckOutput = {\n result: CheckResult;\n config: ProjectConfig | null;\n};\n\nfunction checkConfigValid(config: ProjectConfig | null): ConfigCheckOutput {\n if (!config) {\n return {\n result: {\n status: \"fail\",\n message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} not found`,\n details: [`Run '${CLI_BIN_NAME} init' to create a configuration`],\n },\n config: null,\n };\n }\n\n const validation = validateProjectConfig(config);\n\n if (!validation.valid) {\n return {\n result: {\n status: \"fail\",\n message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} has errors`,\n details: validation.errors,\n },\n config: null,\n };\n }\n\n if (validation.warnings.length > 0) {\n return {\n result: {\n status: \"warn\",\n message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} has warnings`,\n details: validation.warnings,\n },\n config,\n };\n }\n\n return {\n result: {\n status: \"pass\",\n message: `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS} is valid`,\n },\n config,\n };\n}\n\nasync function checkSkillsResolved(\n config: ProjectConfig,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): Promise<CheckResult> {\n const uniqueSkills = config.stack ? getStackSkillIds(config.stack) : [];\n\n if (uniqueSkills.length === 0) {\n return {\n status: \"pass\",\n message: \"No skills configured\",\n };\n }\n\n const localResult = await discoverLocalSkills(projectDir);\n const globalResult = projectDir !== os.homedir() ? await discoverLocalSkills(os.homedir()) : null;\n const localSkillIds = new Set([\n ...(localResult?.skills.map((s) => s.id) ?? []),\n ...(globalResult?.skills.map((s) => s.id) ?? []),\n ]);\n\n const missingSkills: string[] = [];\n for (const skillId of uniqueSkills) {\n const inMatrix = skillId in matrix.skills;\n const inLocal = localSkillIds.has(skillId);\n if (!inMatrix && !inLocal) {\n missingSkills.push(skillId);\n }\n }\n\n if (missingSkills.length > 0) {\n return {\n status: \"fail\",\n message: `${uniqueSkills.length - missingSkills.length}/${uniqueSkills.length} skills found`,\n details: missingSkills.map((s) => `- ${s} (not found)`),\n };\n }\n\n return {\n status: \"pass\",\n message: `${uniqueSkills.length}/${uniqueSkills.length} skills found`,\n };\n}\n\nasync function checkAgentsCompiled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const agents = config.agents ?? [];\n\n if (agents.length === 0) {\n return {\n status: \"pass\",\n message: \"No agents configured\",\n };\n }\n\n const projectAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const globalAgentsDir = path.join(os.homedir(), CLAUDE_DIR, \"agents\");\n const missingAgents: string[] = [];\n\n for (const agent of agents) {\n // Check scope-appropriate directory for the agent\n const agentsDir = agent.scope === \"global\" ? globalAgentsDir : projectAgentsDir;\n const agentPath = path.join(agentsDir, `${agent.name}.md`);\n if (!(await fileExists(agentPath))) {\n missingAgents.push(agent.name);\n }\n }\n\n if (missingAgents.length > 0) {\n return {\n status: \"warn\",\n message: `${missingAgents.length} agent${missingAgents.length === 1 ? \"\" : \"s\"} need${missingAgents.length === 1 ? \"s\" : \"\"} recompilation`,\n details: missingAgents.map((a) => `- ${a} (missing)`),\n };\n }\n\n return {\n status: \"pass\",\n message: `${agents.length}/${agents.length} agents compiled`,\n };\n}\n\nasync function checkNoOrphans(config: ProjectConfig, projectDir: string): Promise<CheckResult> {\n const projectAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const globalAgentsDir = path.join(os.homedir(), CLAUDE_DIR, \"agents\");\n\n const projectExists = await directoryExists(projectAgentsDir);\n const globalExists = projectDir !== os.homedir() && (await directoryExists(globalAgentsDir));\n\n if (!projectExists && !globalExists) {\n return {\n status: \"pass\",\n message: \"No agents directory\",\n };\n }\n\n const projectMdFiles = projectExists ? await glob(\"*.md\", projectAgentsDir) : [];\n const globalMdFiles = globalExists ? await glob(\"*.md\", globalAgentsDir) : [];\n const mdFiles = [...new Set([...projectMdFiles, ...globalMdFiles])];\n const configAgentNames: Set<string> = new Set((config.agents ?? []).map((a) => a.name));\n\n const orphanedFiles: string[] = [];\n for (const file of mdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n if (!configAgentNames.has(agentName)) {\n orphanedFiles.push(agentName);\n }\n }\n\n if (orphanedFiles.length > 0) {\n return {\n status: \"warn\",\n message: `${orphanedFiles.length} orphaned agent file${orphanedFiles.length === 1 ? \"\" : \"s\"}`,\n details: orphanedFiles.map((f) => `- ${f}.md (not in config)`),\n };\n }\n\n return {\n status: \"pass\",\n message: \"No orphaned agent files\",\n };\n}\n\nasync function checkSourceReachable(\n sourceFlag: string | undefined,\n projectDir: string,\n): Promise<CheckResult> {\n try {\n const { sourceResult: result } = await loadSource({\n sourceFlag,\n projectDir,\n });\n\n const skillCount = Object.keys(matrix.skills).length;\n const sourceLabel = result.isLocal ? \"local\" : \"remote\";\n\n return {\n status: \"pass\",\n message: `Connected to ${sourceLabel}: ${result.sourcePath}`,\n details: [`${skillCount} skills available`],\n };\n } catch (error) {\n const message = getErrorMessage(error);\n return {\n status: \"fail\",\n message: \"Failed to load source\",\n details: [message],\n };\n }\n}\n\nconst CHECK_WIDTH = 20;\n\nfunction formatCheckName(name: string): string {\n return name.padEnd(CHECK_WIDTH);\n}\n\nfunction formatStatus(status: CheckResult[\"status\"]): string {\n switch (status) {\n case \"pass\":\n return \"\\u2713\"; // ✓\n case \"fail\":\n return \"\\u2717\"; // ✗\n case \"warn\":\n return \"!\";\n case \"skip\":\n return \"-\";\n default:\n return \"?\";\n }\n}\n\nfunction formatCheckLine(name: string, result: CheckResult, verbose: boolean): string[] {\n const statusIcon = formatStatus(result.status);\n const nameFormatted = formatCheckName(name);\n const lines: string[] = [];\n\n lines.push(` ${nameFormatted}${statusIcon} ${result.message}`);\n\n const shouldShowDetails =\n result.details &&\n result.details.length > 0 &&\n (verbose || result.status === \"fail\" || result.status === \"warn\");\n\n if (shouldShowDetails) {\n for (const detail of result.details!) {\n lines.push(` ${\" \".repeat(CHECK_WIDTH)} ${detail}`);\n }\n }\n\n return lines;\n}\n\nfunction formatSummary(results: CheckResult[]): string {\n let passed = 0;\n let warnings = 0;\n let errors = 0;\n\n for (const result of results) {\n switch (result.status) {\n case \"pass\":\n passed++;\n break;\n case \"warn\":\n warnings++;\n break;\n case \"fail\":\n errors++;\n break;\n // skip doesn't count\n default:\n break;\n }\n }\n\n const parts: string[] = [];\n parts.push(`${passed} passed`);\n\n if (warnings > 0) {\n parts.push(`${warnings} warning${warnings === 1 ? \"\" : \"s\"}`);\n } else {\n parts.push(`0 warnings`);\n }\n\n if (errors > 0) {\n parts.push(`${errors} error${errors === 1 ? \"\" : \"s\"}`);\n } else {\n parts.push(`0 errors`);\n }\n\n return ` Summary: ${parts.join(\", \")}`;\n}\n\nfunction formatTips(results: CheckResult[]): string[] {\n const hasAgentWarning = results.some(\n (r) => r.status === \"warn\" && r.message.includes(\"recompilation\"),\n );\n const hasConfigError = results.some((r) => r.status === \"fail\" && r.message.includes(\"config\"));\n const hasSkillError = results.some(\n (r) => r.status === \"fail\" && r.message.includes(\"skills found\"),\n );\n\n const tips: string[] = [];\n\n if (hasAgentWarning) {\n tips.push(` Tip: Run '${CLI_BIN_NAME} compile' to generate missing agent files`);\n }\n if (hasConfigError) {\n tips.push(` Tip: Run '${CLI_BIN_NAME} init' to create or fix configuration`);\n }\n if (hasSkillError) {\n tips.push(\" Tip: Check skill IDs in config match available skills\");\n }\n\n return tips;\n}\n\nconst SKIP_RESULT: CheckResult = { status: \"skip\", message: \"Skipped (config invalid)\" };\n\nexport default class Doctor extends BaseCommand {\n static summary = \"Diagnose common configuration issues\";\n\n static description = `Run diagnostic checks on your ${DEFAULT_BRANDING.NAME} configuration to identify issues with config validity, skill resolution, agent compilation, and source connectivity.`;\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --verbose\",\n \"<%= config.bin %> <%= command.id %> --source /path/to/marketplace\",\n ];\n\n static flags = {\n source: Flags.string({\n char: \"s\",\n description: \"Skills source path or URL\",\n }),\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Show detailed output\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Doctor);\n setVerbose(flags.verbose);\n const projectDir = process.cwd();\n\n this.printHeader();\n const results = await this.runAllChecks(projectDir, flags);\n this.printResults(results);\n\n if (results.some((r) => r.status === \"fail\")) {\n this.exit(EXIT_CODES.ERROR);\n }\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Doctor`);\n this.log(\"\");\n this.log(\" Checking configuration health...\");\n this.log(\"\");\n }\n\n private async runAllChecks(\n projectDir: string,\n flags: { source?: string; verbose: boolean },\n ): Promise<CheckResult[]> {\n const detected = await detectProject(projectDir);\n const { result: configResult, config } = checkConfigValid(detected?.config ?? null);\n this.logCheck(\"Config Valid\", configResult, flags.verbose);\n\n // loadSource (called by checkSourceReachable) populates the matrix automatically\n const sourceResult = await checkSourceReachable(flags.source, projectDir);\n\n const skillsResult = config\n ? await checkSkillsResolved(config, matrix, projectDir)\n : SKIP_RESULT;\n this.logCheck(\"Skills Resolved\", skillsResult, flags.verbose);\n\n const agentsResult = config ? await checkAgentsCompiled(config, projectDir) : SKIP_RESULT;\n this.logCheck(\"Agents Compiled\", agentsResult, flags.verbose);\n\n const orphansResult = config ? await checkNoOrphans(config, projectDir) : SKIP_RESULT;\n this.logCheck(\"No Orphans\", orphansResult, flags.verbose);\n\n this.logCheck(\"Source Reachable\", sourceResult, flags.verbose);\n\n return [configResult, skillsResult, agentsResult, orphansResult, sourceResult];\n }\n\n private logCheck(name: string, result: CheckResult, verbose: boolean): void {\n for (const line of formatCheckLine(name, result, verbose)) {\n this.log(line);\n }\n }\n\n private printResults(results: CheckResult[]): void {\n this.log(\"\");\n this.log(formatSummary(results));\n\n const tips = formatTips(results);\n if (tips.length > 0) {\n this.log(\"\");\n for (const tip of tips) {\n this.log(tip);\n }\n }\n\n this.log(\"\");\n }\n}\n"],"mappings":"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","names":["matrix"]}
|