@erenari/supercodex 0.2.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/README.md +228 -0
- package/dist/backup.d.ts +6 -0
- package/dist/backup.js +37 -0
- package/dist/backup.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +63 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/aliases.d.ts +2 -0
- package/dist/commands/aliases.js +141 -0
- package/dist/commands/aliases.js.map +1 -0
- package/dist/commands/catalog.d.ts +3 -0
- package/dist/commands/catalog.js +103 -0
- package/dist/commands/catalog.js.map +1 -0
- package/dist/commands/core.d.ts +2 -0
- package/dist/commands/core.js +111 -0
- package/dist/commands/core.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.js +72 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/index.d.ts +9 -0
- package/dist/commands/index.js +26 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/mcp.d.ts +2 -0
- package/dist/commands/mcp.js +128 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/mode.d.ts +2 -0
- package/dist/commands/mode.js +73 -0
- package/dist/commands/mode.js.map +1 -0
- package/dist/commands/persona.d.ts +2 -0
- package/dist/commands/persona.js +70 -0
- package/dist/commands/persona.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.js +50 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/utils.d.ts +4 -0
- package/dist/commands/utils.js +28 -0
- package/dist/commands/utils.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.js +56 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/config.d.ts +33 -0
- package/dist/config.js +433 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.js +7 -0
- package/dist/constants.js.map +1 -0
- package/dist/doctor/checks.d.ts +18 -0
- package/dist/doctor/checks.js +100 -0
- package/dist/doctor/checks.js.map +1 -0
- package/dist/doctor/fix.d.ts +6 -0
- package/dist/doctor/fix.js +99 -0
- package/dist/doctor/fix.js.map +1 -0
- package/dist/doctor/index.d.ts +4 -0
- package/dist/doctor/index.js +21 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/report.d.ts +3 -0
- package/dist/doctor/report.js +21 -0
- package/dist/doctor/report.js.map +1 -0
- package/dist/doctor/types.d.ts +16 -0
- package/dist/doctor/types.js +3 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/fs-utils.d.ts +4 -0
- package/dist/fs-utils.js +31 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/mcp.d.ts +21 -0
- package/dist/mcp.js +222 -0
- package/dist/mcp.js.map +1 -0
- package/dist/operations.d.ts +108 -0
- package/dist/operations.js +388 -0
- package/dist/operations.js.map +1 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.js +41 -0
- package/dist/paths.js.map +1 -0
- package/dist/project-init.d.ts +8 -0
- package/dist/project-init.js +92 -0
- package/dist/project-init.js.map +1 -0
- package/dist/prompts.d.ts +9 -0
- package/dist/prompts.js +157 -0
- package/dist/prompts.js.map +1 -0
- package/dist/registry/aliases.d.ts +16 -0
- package/dist/registry/aliases.js +347 -0
- package/dist/registry/aliases.js.map +1 -0
- package/dist/registry/builtins.d.ts +8 -0
- package/dist/registry/builtins.js +188 -0
- package/dist/registry/builtins.js.map +1 -0
- package/dist/registry/index.d.ts +4 -0
- package/dist/registry/index.js +21 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/loader.d.ts +16 -0
- package/dist/registry/loader.js +655 -0
- package/dist/registry/loader.js.map +1 -0
- package/dist/registry/types.d.ts +79 -0
- package/dist/registry/types.js +3 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/runtime/alias-dispatch.d.ts +10 -0
- package/dist/runtime/alias-dispatch.js +119 -0
- package/dist/runtime/alias-dispatch.js.map +1 -0
- package/dist/runtime/compat.d.ts +6 -0
- package/dist/runtime/compat.js +23 -0
- package/dist/runtime/compat.js.map +1 -0
- package/dist/runtime/context.d.ts +23 -0
- package/dist/runtime/context.js +59 -0
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +21 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/workflow.d.ts +18 -0
- package/dist/runtime/workflow.js +45 -0
- package/dist/runtime/workflow.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runDoctorChecks = runDoctorChecks;
|
|
4
|
+
exports.runMcpDoctorChecks = runMcpDoctorChecks;
|
|
5
|
+
const config_1 = require("../config");
|
|
6
|
+
const fs_utils_1 = require("../fs-utils");
|
|
7
|
+
const mcp_1 = require("../mcp");
|
|
8
|
+
const paths_1 = require("../paths");
|
|
9
|
+
const prompts_1 = require("../prompts");
|
|
10
|
+
const registry_1 = require("../registry");
|
|
11
|
+
const runtime_1 = require("../runtime");
|
|
12
|
+
async function runDoctorChecks(options = {}) {
|
|
13
|
+
const codexPaths = (0, paths_1.getCodexPaths)(options.codexHome);
|
|
14
|
+
const configExists = await (0, fs_utils_1.pathExists)(codexPaths.configPath);
|
|
15
|
+
const config = configExists ? await (0, config_1.loadConfig)(codexPaths.configPath) : {};
|
|
16
|
+
const issues = [];
|
|
17
|
+
const registry = await (0, registry_1.loadRegistry)({
|
|
18
|
+
codexHome: options.codexHome,
|
|
19
|
+
projectRoot: options.projectRoot
|
|
20
|
+
});
|
|
21
|
+
if (!configExists) {
|
|
22
|
+
issues.push(issue("config.missing", "warn", `Missing config at ${codexPaths.configPath}.`, true));
|
|
23
|
+
}
|
|
24
|
+
const supercodex = (0, fs_utils_1.isPlainObject)(config.supercodex) ? config.supercodex : null;
|
|
25
|
+
if (!supercodex) {
|
|
26
|
+
issues.push(issue("supercodex.missing", "warn", "Missing [supercodex] section.", true));
|
|
27
|
+
}
|
|
28
|
+
const installedPrompts = await (0, prompts_1.listInstalledPrompts)(codexPaths.promptPackDir);
|
|
29
|
+
const bundledPrompts = (0, prompts_1.listBundledPrompts)();
|
|
30
|
+
for (const promptName of bundledPrompts) {
|
|
31
|
+
if (!installedPrompts.includes(promptName)) {
|
|
32
|
+
issues.push(issue(`prompts.${promptName}.missing`, "warn", `Missing prompt file "${promptName}" in ${codexPaths.promptPackDir}.`, true));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const runtimeDefaults = (0, runtime_1.getRuntimeDefaults)(config);
|
|
36
|
+
if (runtimeDefaults.defaultMode && !registry.registry.modes[runtimeDefaults.defaultMode]) {
|
|
37
|
+
issues.push(issue("runtime.default_mode.invalid", "warn", `default_mode "${runtimeDefaults.defaultMode}" not found in registry (fallback: ${registry_1.BUILTIN_DEFAULT_MODE}).`, true, "supercodex.runtime.default_mode"));
|
|
38
|
+
}
|
|
39
|
+
if (runtimeDefaults.defaultPersona && !registry.registry.personas[runtimeDefaults.defaultPersona]) {
|
|
40
|
+
issues.push(issue("runtime.default_persona.invalid", "warn", `default_persona "${runtimeDefaults.defaultPersona}" not found in registry (fallback: ${registry_1.BUILTIN_DEFAULT_PERSONA}).`, true, "supercodex.runtime.default_persona"));
|
|
41
|
+
}
|
|
42
|
+
if (registry.issues.length > 0) {
|
|
43
|
+
for (const registryIssue of registry.issues) {
|
|
44
|
+
issues.push(issue(`registry.overlay.${registryIssue.path}`, registryIssue.level === "error" ? "error" : "warn", registryIssue.message, false, registryIssue.path));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const staticRegistryIssues = (0, registry_1.validateRegistry)(registry.registry);
|
|
48
|
+
for (const registryIssue of staticRegistryIssues) {
|
|
49
|
+
issues.push(issue(`registry.invalid.${registryIssue.path}`, registryIssue.level === "error" ? "error" : "warn", registryIssue.message, false, registryIssue.path));
|
|
50
|
+
}
|
|
51
|
+
const mcpIssues = await runMcpChecks(config, Boolean(options.mcpConnectivity));
|
|
52
|
+
issues.push(...mcpIssues);
|
|
53
|
+
return {
|
|
54
|
+
report: {
|
|
55
|
+
ok: !issues.some((entry) => entry.level === "error"),
|
|
56
|
+
issues
|
|
57
|
+
},
|
|
58
|
+
context: {
|
|
59
|
+
config,
|
|
60
|
+
configPath: codexPaths.configPath,
|
|
61
|
+
promptPackDir: codexPaths.promptPackDir
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async function runMcpDoctorChecks(config, includeConnectivity) {
|
|
66
|
+
const issues = await runMcpChecks(config, includeConnectivity);
|
|
67
|
+
return {
|
|
68
|
+
ok: !issues.some((entry) => entry.level === "error"),
|
|
69
|
+
issues
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
async function runMcpChecks(config, includeConnectivity) {
|
|
73
|
+
const issues = [];
|
|
74
|
+
const mcpServers = (0, mcp_1.listMcpServersFromConfig)(config);
|
|
75
|
+
for (const server of mcpServers) {
|
|
76
|
+
const validationMessages = (0, mcp_1.validateMcpDefinition)(server.definition);
|
|
77
|
+
for (const message of validationMessages) {
|
|
78
|
+
issues.push(issue(`mcp.${server.name}.invalid`, "error", message, false, `mcp_servers.${server.name}`));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (includeConnectivity) {
|
|
82
|
+
for (const server of mcpServers) {
|
|
83
|
+
const testResult = await (0, mcp_1.testMcpServer)(server.name, server.definition);
|
|
84
|
+
if (!testResult.ok) {
|
|
85
|
+
issues.push(issue(`mcp.${server.name}.connectivity`, "warn", `${server.name}: ${testResult.messages.join(" ")}`, false, `mcp_servers.${server.name}`));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return issues;
|
|
90
|
+
}
|
|
91
|
+
function issue(id, level, message, fixable, path) {
|
|
92
|
+
return {
|
|
93
|
+
id,
|
|
94
|
+
level,
|
|
95
|
+
message,
|
|
96
|
+
fixable,
|
|
97
|
+
path
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/doctor/checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { OperationOptions } from "../operations";
|
|
2
|
+
import type { DoctorFixResult, DoctorReport } from "./types";
|
|
3
|
+
export interface ApplyDoctorFixOptions extends OperationOptions {
|
|
4
|
+
doctorStatus?: "ok" | "issues";
|
|
5
|
+
}
|
|
6
|
+
export declare function applyDoctorFixes(report: DoctorReport, options?: ApplyDoctorFixOptions): Promise<DoctorFixResult>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyDoctorFixes = applyDoctorFixes;
|
|
4
|
+
const backup_1 = require("../backup");
|
|
5
|
+
const config_1 = require("../config");
|
|
6
|
+
const fs_utils_1 = require("../fs-utils");
|
|
7
|
+
const paths_1 = require("../paths");
|
|
8
|
+
const prompts_1 = require("../prompts");
|
|
9
|
+
async function applyDoctorFixes(report, options = {}) {
|
|
10
|
+
const issueIds = new Set(report.issues.filter((issue) => issue.fixable).map((issue) => issue.id));
|
|
11
|
+
const applied = [];
|
|
12
|
+
const skipped = [];
|
|
13
|
+
const paths = (0, paths_1.getCodexPaths)(options.codexHome);
|
|
14
|
+
const shouldApplyInstallPatch = hasIssuePrefix(issueIds, "config.missing") ||
|
|
15
|
+
hasIssuePrefix(issueIds, "supercodex.missing");
|
|
16
|
+
const shouldRepairPrompts = hasIssuePrefix(issueIds, "prompts.");
|
|
17
|
+
const shouldClearMode = issueIds.has("runtime.default_mode.invalid");
|
|
18
|
+
const shouldClearPersona = issueIds.has("runtime.default_persona.invalid");
|
|
19
|
+
const shouldWriteDoctorState = options.doctorStatus === "ok" || options.doctorStatus === "issues";
|
|
20
|
+
let nextConfig = (await (0, fs_utils_1.pathExists)(paths.configPath)) ? await (0, config_1.loadConfig)(paths.configPath) : {};
|
|
21
|
+
let configChanged = false;
|
|
22
|
+
if (shouldApplyInstallPatch) {
|
|
23
|
+
const merged = (0, config_1.mergeInstallConfig)(nextConfig, (0, config_1.createInstallSpec)(paths.promptPackDir), false);
|
|
24
|
+
nextConfig = merged.config;
|
|
25
|
+
configChanged = configChanged || merged.changed;
|
|
26
|
+
if (merged.changed) {
|
|
27
|
+
applied.push("install.patch");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const cleared = clearInvalidRuntimeDefaults(nextConfig, {
|
|
31
|
+
mode: shouldClearMode,
|
|
32
|
+
persona: shouldClearPersona
|
|
33
|
+
});
|
|
34
|
+
if (cleared > 0) {
|
|
35
|
+
configChanged = true;
|
|
36
|
+
applied.push("runtime.defaults");
|
|
37
|
+
}
|
|
38
|
+
if (shouldWriteDoctorState) {
|
|
39
|
+
const now = new Date().toISOString();
|
|
40
|
+
const supercodex = ensureChildTable(nextConfig, "supercodex");
|
|
41
|
+
const doctor = ensureChildTable(supercodex, "doctor");
|
|
42
|
+
const stateChanged = doctor.last_status !== options.doctorStatus || doctor.last_run_at !== now;
|
|
43
|
+
doctor.last_status = options.doctorStatus;
|
|
44
|
+
doctor.last_run_at = now;
|
|
45
|
+
if (stateChanged) {
|
|
46
|
+
configChanged = true;
|
|
47
|
+
applied.push("doctor.state");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (configChanged) {
|
|
51
|
+
await (0, backup_1.createTimestampedBackup)(paths.configPath, paths.home, options.now ?? new Date());
|
|
52
|
+
await (0, config_1.writeConfig)(paths.configPath, nextConfig);
|
|
53
|
+
}
|
|
54
|
+
if (shouldRepairPrompts || shouldApplyInstallPatch) {
|
|
55
|
+
const promptResult = await (0, prompts_1.installPromptPack)(paths.promptPackDir);
|
|
56
|
+
if (promptResult.changed) {
|
|
57
|
+
applied.push("prompts");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (applied.length === 0) {
|
|
61
|
+
skipped.push("No applicable fixable issues.");
|
|
62
|
+
}
|
|
63
|
+
return { applied, skipped };
|
|
64
|
+
}
|
|
65
|
+
function clearInvalidRuntimeDefaults(config, opts) {
|
|
66
|
+
if (!opts.mode && !opts.persona) {
|
|
67
|
+
return 0;
|
|
68
|
+
}
|
|
69
|
+
const supercodex = (0, fs_utils_1.isPlainObject)(config.supercodex) ? config.supercodex : null;
|
|
70
|
+
const runtime = supercodex && (0, fs_utils_1.isPlainObject)(supercodex.runtime) ? supercodex.runtime : null;
|
|
71
|
+
if (!runtime) {
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
let changed = 0;
|
|
75
|
+
if (opts.mode && Object.hasOwn(runtime, "default_mode")) {
|
|
76
|
+
delete runtime.default_mode;
|
|
77
|
+
changed += 1;
|
|
78
|
+
}
|
|
79
|
+
if (opts.persona && Object.hasOwn(runtime, "default_persona")) {
|
|
80
|
+
delete runtime.default_persona;
|
|
81
|
+
changed += 1;
|
|
82
|
+
}
|
|
83
|
+
return changed;
|
|
84
|
+
}
|
|
85
|
+
function ensureChildTable(parent, key) {
|
|
86
|
+
if (!(0, fs_utils_1.isPlainObject)(parent[key])) {
|
|
87
|
+
parent[key] = {};
|
|
88
|
+
}
|
|
89
|
+
return parent[key];
|
|
90
|
+
}
|
|
91
|
+
function hasIssuePrefix(issueIds, prefix) {
|
|
92
|
+
for (const issueId of issueIds) {
|
|
93
|
+
if (issueId.startsWith(prefix)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=fix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/doctor/fix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./checks"), exports);
|
|
19
|
+
__exportStar(require("./fix"), exports);
|
|
20
|
+
__exportStar(require("./report"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/doctor/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,2CAAyB;AACzB,wCAAsB;AACtB,2CAAyB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatDoctorReport = formatDoctorReport;
|
|
4
|
+
exports.formatDoctorReportJson = formatDoctorReportJson;
|
|
5
|
+
function formatDoctorReport(report) {
|
|
6
|
+
if (report.issues.length === 0) {
|
|
7
|
+
return "Doctor: no issues found.";
|
|
8
|
+
}
|
|
9
|
+
const lines = [];
|
|
10
|
+
lines.push(`Doctor: ${report.ok ? "ok" : "issues detected"}`);
|
|
11
|
+
for (const issue of report.issues) {
|
|
12
|
+
const pathPart = issue.path ? ` (${issue.path})` : "";
|
|
13
|
+
const fixablePart = issue.fixable ? " [fixable]" : "";
|
|
14
|
+
lines.push(`- [${issue.level}] ${issue.message}${pathPart}${fixablePart}`);
|
|
15
|
+
}
|
|
16
|
+
return lines.join("\n");
|
|
17
|
+
}
|
|
18
|
+
function formatDoctorReportJson(report) {
|
|
19
|
+
return JSON.stringify(report, null, 2);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/doctor/report.ts"],"names":[],"mappings":";;AAEA,gDAaC;AAED,wDAEC;AAjBD,SAAgB,kBAAkB,CAAC,MAAoB;IACrD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,0BAA0B,CAAC;IACpC,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC9D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,GAAG,QAAQ,GAAG,WAAW,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAgB,sBAAsB,CAAC,MAAoB;IACzD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type DoctorLevel = "info" | "warn" | "error";
|
|
2
|
+
export interface DoctorIssue {
|
|
3
|
+
id: string;
|
|
4
|
+
level: DoctorLevel;
|
|
5
|
+
message: string;
|
|
6
|
+
fixable: boolean;
|
|
7
|
+
path?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface DoctorReport {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
issues: DoctorIssue[];
|
|
12
|
+
}
|
|
13
|
+
export interface DoctorFixResult {
|
|
14
|
+
applied: string[];
|
|
15
|
+
skipped: string[];
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function pathExists(targetPath: string): Promise<boolean>;
|
|
2
|
+
export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
|
|
3
|
+
export declare function deepClone<T>(value: T): T;
|
|
4
|
+
export declare function deepEqual(a: unknown, b: unknown): boolean;
|
package/dist/fs-utils.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pathExists = pathExists;
|
|
4
|
+
exports.isPlainObject = isPlainObject;
|
|
5
|
+
exports.deepClone = deepClone;
|
|
6
|
+
exports.deepEqual = deepEqual;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const promises_1 = require("node:fs/promises");
|
|
9
|
+
const node_util_1 = require("node:util");
|
|
10
|
+
async function pathExists(targetPath) {
|
|
11
|
+
try {
|
|
12
|
+
await (0, promises_1.access)(targetPath, node_fs_1.constants.F_OK);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function isPlainObject(value) {
|
|
20
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
function deepClone(value) {
|
|
23
|
+
if (typeof globalThis.structuredClone === "function") {
|
|
24
|
+
return globalThis.structuredClone(value);
|
|
25
|
+
}
|
|
26
|
+
return JSON.parse(JSON.stringify(value));
|
|
27
|
+
}
|
|
28
|
+
function deepEqual(a, b) {
|
|
29
|
+
return (0, node_util_1.isDeepStrictEqual)(a, b);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=fs-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../src/fs-utils.ts"],"names":[],"mappings":";;AAIA,gCAOC;AAED,sCAEC;AAED,8BAMC;AAED,8BAEC;AA3BD,qCAAoC;AACpC,+CAA0C;AAC1C,yCAA8C;AAEvC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,IAAI,CAAC;QACH,MAAM,IAAA,iBAAM,EAAC,UAAU,EAAE,mBAAS,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAgB,SAAS,CAAI,KAAQ;IACnC,IAAI,OAAO,UAAU,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;QACrD,OAAO,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAM,CAAC;AAChD,CAAC;AAED,SAAgB,SAAS,CAAC,CAAU,EAAE,CAAU;IAC9C,OAAO,IAAA,6BAAiB,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { TomlTable } from "./config";
|
|
2
|
+
import type { CatalogEntry } from "./registry";
|
|
3
|
+
export type McpServerDefinition = Record<string, unknown>;
|
|
4
|
+
export interface McpConfiguredServer {
|
|
5
|
+
name: string;
|
|
6
|
+
definition: McpServerDefinition;
|
|
7
|
+
}
|
|
8
|
+
export interface McpTestResult {
|
|
9
|
+
name: string;
|
|
10
|
+
ok: boolean;
|
|
11
|
+
transport: "stdio" | "http" | "unknown";
|
|
12
|
+
messages: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare function parseEnvAssignments(values: string[]): Record<string, string>;
|
|
15
|
+
export declare function buildStdioServerDefinition(commandParts: string[], env?: Record<string, string>): McpServerDefinition;
|
|
16
|
+
export declare function buildHttpServerDefinition(url: string, env?: Record<string, string>): McpServerDefinition;
|
|
17
|
+
export declare function buildServerDefinitionFromCatalog(entry: CatalogEntry): McpServerDefinition;
|
|
18
|
+
export declare function listMcpServersFromConfig(config: TomlTable): McpConfiguredServer[];
|
|
19
|
+
export declare function getMcpServerFromConfig(config: TomlTable, name: string): McpConfiguredServer | null;
|
|
20
|
+
export declare function validateMcpDefinition(definition: McpServerDefinition): string[];
|
|
21
|
+
export declare function testMcpServer(name: string, definition: McpServerDefinition): Promise<McpTestResult>;
|
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseEnvAssignments = parseEnvAssignments;
|
|
4
|
+
exports.buildStdioServerDefinition = buildStdioServerDefinition;
|
|
5
|
+
exports.buildHttpServerDefinition = buildHttpServerDefinition;
|
|
6
|
+
exports.buildServerDefinitionFromCatalog = buildServerDefinitionFromCatalog;
|
|
7
|
+
exports.listMcpServersFromConfig = listMcpServersFromConfig;
|
|
8
|
+
exports.getMcpServerFromConfig = getMcpServerFromConfig;
|
|
9
|
+
exports.validateMcpDefinition = validateMcpDefinition;
|
|
10
|
+
exports.testMcpServer = testMcpServer;
|
|
11
|
+
const node_child_process_1 = require("node:child_process");
|
|
12
|
+
const fs_utils_1 = require("./fs-utils");
|
|
13
|
+
function parseEnvAssignments(values) {
|
|
14
|
+
const env = {};
|
|
15
|
+
for (const value of values) {
|
|
16
|
+
const separatorIndex = value.indexOf("=");
|
|
17
|
+
if (separatorIndex <= 0) {
|
|
18
|
+
throw new Error(`Invalid --env value "${value}". Expected KEY=VALUE.`);
|
|
19
|
+
}
|
|
20
|
+
const key = value.slice(0, separatorIndex).trim();
|
|
21
|
+
const envValue = value.slice(separatorIndex + 1);
|
|
22
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
|
|
23
|
+
throw new Error(`Invalid environment variable name "${key}".`);
|
|
24
|
+
}
|
|
25
|
+
env[key] = envValue;
|
|
26
|
+
}
|
|
27
|
+
return env;
|
|
28
|
+
}
|
|
29
|
+
function buildStdioServerDefinition(commandParts, env = {}) {
|
|
30
|
+
if (commandParts.length === 0) {
|
|
31
|
+
throw new Error("STDIO transport requires <command...>.");
|
|
32
|
+
}
|
|
33
|
+
const [command, ...args] = commandParts;
|
|
34
|
+
const definition = {
|
|
35
|
+
transport: "stdio",
|
|
36
|
+
command
|
|
37
|
+
};
|
|
38
|
+
if (args.length > 0) {
|
|
39
|
+
definition.args = args;
|
|
40
|
+
}
|
|
41
|
+
if (Object.keys(env).length > 0) {
|
|
42
|
+
definition.env = env;
|
|
43
|
+
}
|
|
44
|
+
return definition;
|
|
45
|
+
}
|
|
46
|
+
function buildHttpServerDefinition(url, env = {}) {
|
|
47
|
+
if (!url.trim()) {
|
|
48
|
+
throw new Error("HTTP transport requires a non-empty URL.");
|
|
49
|
+
}
|
|
50
|
+
let normalizedUrl;
|
|
51
|
+
try {
|
|
52
|
+
normalizedUrl = new URL(url).toString();
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new Error(`Invalid MCP HTTP URL "${url}".`);
|
|
56
|
+
}
|
|
57
|
+
const definition = {
|
|
58
|
+
transport: "http",
|
|
59
|
+
url: normalizedUrl
|
|
60
|
+
};
|
|
61
|
+
if (Object.keys(env).length > 0) {
|
|
62
|
+
definition.env = env;
|
|
63
|
+
}
|
|
64
|
+
return definition;
|
|
65
|
+
}
|
|
66
|
+
function buildServerDefinitionFromCatalog(entry) {
|
|
67
|
+
if (entry.transport === "stdio") {
|
|
68
|
+
return buildStdioServerDefinition([entry.command ?? "", ...(entry.args ?? [])], entry.env ?? {});
|
|
69
|
+
}
|
|
70
|
+
return buildHttpServerDefinition(entry.url ?? "", entry.env ?? {});
|
|
71
|
+
}
|
|
72
|
+
function listMcpServersFromConfig(config) {
|
|
73
|
+
if (!(0, fs_utils_1.isPlainObject)(config.mcp_servers)) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
const servers = config.mcp_servers;
|
|
77
|
+
return Object.keys(servers)
|
|
78
|
+
.sort()
|
|
79
|
+
.map((name) => ({
|
|
80
|
+
name,
|
|
81
|
+
definition: (0, fs_utils_1.isPlainObject)(servers[name]) ? servers[name] : {}
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
function getMcpServerFromConfig(config, name) {
|
|
85
|
+
if (!(0, fs_utils_1.isPlainObject)(config.mcp_servers)) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const servers = config.mcp_servers;
|
|
89
|
+
if (!(0, fs_utils_1.isPlainObject)(servers[name])) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
name,
|
|
94
|
+
definition: servers[name]
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function validateMcpDefinition(definition) {
|
|
98
|
+
const messages = [];
|
|
99
|
+
const transport = readTransport(definition);
|
|
100
|
+
if (!transport) {
|
|
101
|
+
messages.push("Missing transport (expected \"stdio\" or \"http\").");
|
|
102
|
+
return messages;
|
|
103
|
+
}
|
|
104
|
+
if (transport === "stdio") {
|
|
105
|
+
if (typeof definition.command !== "string" || !definition.command.trim()) {
|
|
106
|
+
messages.push("STDIO server is missing command.");
|
|
107
|
+
}
|
|
108
|
+
if (definition.args && !Array.isArray(definition.args)) {
|
|
109
|
+
messages.push("STDIO args must be an array of strings.");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (transport === "http") {
|
|
113
|
+
const rawUrl = typeof definition.url === "string" ? definition.url : "";
|
|
114
|
+
if (!rawUrl.trim()) {
|
|
115
|
+
messages.push("HTTP server is missing url.");
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
try {
|
|
119
|
+
// eslint-disable-next-line no-new
|
|
120
|
+
new URL(rawUrl);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
messages.push(`Invalid HTTP MCP URL "${rawUrl}".`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return messages;
|
|
128
|
+
}
|
|
129
|
+
async function testMcpServer(name, definition) {
|
|
130
|
+
const validationMessages = validateMcpDefinition(definition);
|
|
131
|
+
const transport = readTransport(definition) ?? "unknown";
|
|
132
|
+
if (validationMessages.length > 0) {
|
|
133
|
+
return {
|
|
134
|
+
name,
|
|
135
|
+
ok: false,
|
|
136
|
+
transport,
|
|
137
|
+
messages: validationMessages
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (transport === "stdio") {
|
|
141
|
+
const command = String(definition.command);
|
|
142
|
+
const available = await isCommandAvailable(command);
|
|
143
|
+
return {
|
|
144
|
+
name,
|
|
145
|
+
ok: available.ok,
|
|
146
|
+
transport,
|
|
147
|
+
messages: available.ok ? [`Command "${command}" is available.`] : [available.message]
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
if (transport === "http") {
|
|
151
|
+
const url = String(definition.url);
|
|
152
|
+
try {
|
|
153
|
+
const controller = new AbortController();
|
|
154
|
+
const timeout = setTimeout(() => controller.abort(), 2000);
|
|
155
|
+
try {
|
|
156
|
+
const response = await fetch(url, {
|
|
157
|
+
method: "GET",
|
|
158
|
+
signal: controller.signal
|
|
159
|
+
});
|
|
160
|
+
return {
|
|
161
|
+
name,
|
|
162
|
+
ok: response.ok || response.status === 405,
|
|
163
|
+
transport,
|
|
164
|
+
messages: response.ok || response.status === 405
|
|
165
|
+
? [`HTTP endpoint responded with status ${response.status}.`]
|
|
166
|
+
: [`HTTP endpoint responded with status ${response.status}.`]
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
clearTimeout(timeout);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
return {
|
|
175
|
+
name,
|
|
176
|
+
ok: false,
|
|
177
|
+
transport,
|
|
178
|
+
messages: [`HTTP request failed: ${error instanceof Error ? error.message : String(error)}`]
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
name,
|
|
184
|
+
ok: false,
|
|
185
|
+
transport,
|
|
186
|
+
messages: ['Unsupported transport. Expected "stdio" or "http".']
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function readTransport(definition) {
|
|
190
|
+
const transport = definition.transport;
|
|
191
|
+
if (transport === "stdio" || transport === "http") {
|
|
192
|
+
return transport;
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
async function isCommandAvailable(command) {
|
|
197
|
+
const lookupTool = process.platform === "win32" ? "where" : "which";
|
|
198
|
+
return new Promise((resolve) => {
|
|
199
|
+
const child = (0, node_child_process_1.spawn)(lookupTool, [command], { stdio: "ignore" });
|
|
200
|
+
child.once("error", (error) => {
|
|
201
|
+
resolve({
|
|
202
|
+
ok: false,
|
|
203
|
+
message: `Failed to execute ${lookupTool}: ${error.message}`
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
child.once("close", (code) => {
|
|
207
|
+
if (code === 0) {
|
|
208
|
+
resolve({
|
|
209
|
+
ok: true,
|
|
210
|
+
message: `Command "${command}" is available.`
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
resolve({
|
|
215
|
+
ok: false,
|
|
216
|
+
message: `Command "${command}" was not found in PATH.`
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|