@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.
Files changed (110) hide show
  1. package/README.md +228 -0
  2. package/dist/backup.d.ts +6 -0
  3. package/dist/backup.js +37 -0
  4. package/dist/backup.js.map +1 -0
  5. package/dist/cli.d.ts +4 -0
  6. package/dist/cli.js +63 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/aliases.d.ts +2 -0
  9. package/dist/commands/aliases.js +141 -0
  10. package/dist/commands/aliases.js.map +1 -0
  11. package/dist/commands/catalog.d.ts +3 -0
  12. package/dist/commands/catalog.js +103 -0
  13. package/dist/commands/catalog.js.map +1 -0
  14. package/dist/commands/core.d.ts +2 -0
  15. package/dist/commands/core.js +111 -0
  16. package/dist/commands/core.js.map +1 -0
  17. package/dist/commands/doctor.d.ts +3 -0
  18. package/dist/commands/doctor.js +72 -0
  19. package/dist/commands/doctor.js.map +1 -0
  20. package/dist/commands/index.d.ts +9 -0
  21. package/dist/commands/index.js +26 -0
  22. package/dist/commands/index.js.map +1 -0
  23. package/dist/commands/mcp.d.ts +2 -0
  24. package/dist/commands/mcp.js +128 -0
  25. package/dist/commands/mcp.js.map +1 -0
  26. package/dist/commands/mode.d.ts +2 -0
  27. package/dist/commands/mode.js +73 -0
  28. package/dist/commands/mode.js.map +1 -0
  29. package/dist/commands/persona.d.ts +2 -0
  30. package/dist/commands/persona.js +70 -0
  31. package/dist/commands/persona.js.map +1 -0
  32. package/dist/commands/run.d.ts +2 -0
  33. package/dist/commands/run.js +50 -0
  34. package/dist/commands/run.js.map +1 -0
  35. package/dist/commands/utils.d.ts +4 -0
  36. package/dist/commands/utils.js +28 -0
  37. package/dist/commands/utils.js.map +1 -0
  38. package/dist/commands/validate.d.ts +2 -0
  39. package/dist/commands/validate.js +56 -0
  40. package/dist/commands/validate.js.map +1 -0
  41. package/dist/config.d.ts +33 -0
  42. package/dist/config.js +433 -0
  43. package/dist/config.js.map +1 -0
  44. package/dist/constants.d.ts +3 -0
  45. package/dist/constants.js +7 -0
  46. package/dist/constants.js.map +1 -0
  47. package/dist/doctor/checks.d.ts +18 -0
  48. package/dist/doctor/checks.js +100 -0
  49. package/dist/doctor/checks.js.map +1 -0
  50. package/dist/doctor/fix.d.ts +6 -0
  51. package/dist/doctor/fix.js +99 -0
  52. package/dist/doctor/fix.js.map +1 -0
  53. package/dist/doctor/index.d.ts +4 -0
  54. package/dist/doctor/index.js +21 -0
  55. package/dist/doctor/index.js.map +1 -0
  56. package/dist/doctor/report.d.ts +3 -0
  57. package/dist/doctor/report.js +21 -0
  58. package/dist/doctor/report.js.map +1 -0
  59. package/dist/doctor/types.d.ts +16 -0
  60. package/dist/doctor/types.js +3 -0
  61. package/dist/doctor/types.js.map +1 -0
  62. package/dist/fs-utils.d.ts +4 -0
  63. package/dist/fs-utils.js +31 -0
  64. package/dist/fs-utils.js.map +1 -0
  65. package/dist/mcp.d.ts +21 -0
  66. package/dist/mcp.js +222 -0
  67. package/dist/mcp.js.map +1 -0
  68. package/dist/operations.d.ts +108 -0
  69. package/dist/operations.js +388 -0
  70. package/dist/operations.js.map +1 -0
  71. package/dist/paths.d.ts +12 -0
  72. package/dist/paths.js +41 -0
  73. package/dist/paths.js.map +1 -0
  74. package/dist/project-init.d.ts +8 -0
  75. package/dist/project-init.js +92 -0
  76. package/dist/project-init.js.map +1 -0
  77. package/dist/prompts.d.ts +9 -0
  78. package/dist/prompts.js +157 -0
  79. package/dist/prompts.js.map +1 -0
  80. package/dist/registry/aliases.d.ts +16 -0
  81. package/dist/registry/aliases.js +347 -0
  82. package/dist/registry/aliases.js.map +1 -0
  83. package/dist/registry/builtins.d.ts +8 -0
  84. package/dist/registry/builtins.js +188 -0
  85. package/dist/registry/builtins.js.map +1 -0
  86. package/dist/registry/index.d.ts +4 -0
  87. package/dist/registry/index.js +21 -0
  88. package/dist/registry/index.js.map +1 -0
  89. package/dist/registry/loader.d.ts +16 -0
  90. package/dist/registry/loader.js +655 -0
  91. package/dist/registry/loader.js.map +1 -0
  92. package/dist/registry/types.d.ts +79 -0
  93. package/dist/registry/types.js +3 -0
  94. package/dist/registry/types.js.map +1 -0
  95. package/dist/runtime/alias-dispatch.d.ts +10 -0
  96. package/dist/runtime/alias-dispatch.js +119 -0
  97. package/dist/runtime/alias-dispatch.js.map +1 -0
  98. package/dist/runtime/compat.d.ts +6 -0
  99. package/dist/runtime/compat.js +23 -0
  100. package/dist/runtime/compat.js.map +1 -0
  101. package/dist/runtime/context.d.ts +23 -0
  102. package/dist/runtime/context.js +59 -0
  103. package/dist/runtime/context.js.map +1 -0
  104. package/dist/runtime/index.d.ts +4 -0
  105. package/dist/runtime/index.js +21 -0
  106. package/dist/runtime/index.js.map +1 -0
  107. package/dist/runtime/workflow.d.ts +18 -0
  108. package/dist/runtime/workflow.js +45 -0
  109. package/dist/runtime/workflow.js.map +1 -0
  110. 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":";;AA+BA,0CAmGC;AAED,gDASC;AA7ID,sCAAuD;AACvD,0CAAwD;AACxD,gCAAwF;AACxF,oCAAyC;AACzC,wCAAsE;AACtE,0CAKqB;AACrB,wCAAgD;AAoBzC,KAAK,UAAU,eAAe,CAAC,UAAyB,EAAE;IAC/D,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,IAAA,qBAAU,EAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,IAAA,mBAAU,EAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAY,EAAC;QAClC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM,EAAE,qBAAqB,UAAU,CAAC,UAAU,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,wBAAa,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,UAAwB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,MAAM,EAAE,+BAA+B,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,IAAA,8BAAoB,EAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAC9E,MAAM,cAAc,GAAG,IAAA,4BAAkB,GAAE,CAAC;IAC5C,KAAK,MAAM,UAAU,IAAI,cAAc,EAAE,CAAC;QACxC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CACT,KAAK,CACH,WAAW,UAAU,UAAU,EAC/B,MAAM,EACN,wBAAwB,UAAU,QAAQ,UAAU,CAAC,aAAa,GAAG,EACrE,IAAI,CACL,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,IAAA,4BAAkB,EAAC,MAAM,CAAC,CAAC;IACnD,IAAI,eAAe,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;QACzF,MAAM,CAAC,IAAI,CACT,KAAK,CACH,8BAA8B,EAC9B,MAAM,EACN,iBAAiB,eAAe,CAAC,WAAW,sCAAsC,+BAAoB,IAAI,EAC1G,IAAI,EACJ,iCAAiC,CAClC,CACF,CAAC;IACJ,CAAC;IACD,IAAI,eAAe,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;QAClG,MAAM,CAAC,IAAI,CACT,KAAK,CACH,iCAAiC,EACjC,MAAM,EACN,oBAAoB,eAAe,CAAC,cAAc,sCAAsC,kCAAuB,IAAI,EACnH,IAAI,EACJ,oCAAoC,CACrC,CACF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,aAAa,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CACT,KAAK,CACH,oBAAoB,aAAa,CAAC,IAAI,EAAE,EACxC,aAAa,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAClD,aAAa,CAAC,OAAO,EACrB,KAAK,EACL,aAAa,CAAC,IAAI,CACnB,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,oBAAoB,GAAG,IAAA,2BAAgB,EAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjE,KAAK,MAAM,aAAa,IAAI,oBAAoB,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CACT,KAAK,CACH,oBAAoB,aAAa,CAAC,IAAI,EAAE,EACxC,aAAa,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAClD,aAAa,CAAC,OAAO,EACrB,KAAK,EACL,aAAa,CAAC,IAAI,CACnB,CACF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAC/E,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IAE1B,OAAO;QACL,MAAM,EAAE;YACN,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC;YACpD,MAAM;SACP;QACD,OAAO,EAAE;YACP,MAAM;YACN,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,aAAa,EAAE,UAAU,CAAC,aAAa;SACxC;KACF,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,kBAAkB,CACtC,MAAiB,EACjB,mBAA4B;IAE5B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC/D,OAAO;QACL,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC;QACpD,MAAM;KACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAiB,EAAE,mBAA4B;IACzE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,IAAA,8BAAwB,EAAC,MAAM,CAAC,CAAC;IAEpD,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,kBAAkB,GAAG,IAAA,2BAAqB,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpE,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,IAAI,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED,IAAI,mBAAmB,EAAE,CAAC;QACxB,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,MAAM,IAAA,mBAAa,EAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACvE,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CACT,KAAK,CACH,OAAO,MAAM,CAAC,IAAI,eAAe,EACjC,MAAM,EACN,GAAG,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAClD,KAAK,EACL,eAAe,MAAM,CAAC,IAAI,EAAE,CAC7B,CACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,KAAK,CACZ,EAAU,EACV,KAA2B,EAC3B,OAAe,EACf,OAAgB,EAChB,IAAa;IAEb,OAAO;QACL,EAAE;QACF,KAAK;QACL,OAAO;QACP,OAAO;QACP,IAAI;KACL,CAAC;AACJ,CAAC"}
@@ -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,4 @@
1
+ export * from "./types";
2
+ export * from "./checks";
3
+ export * from "./fix";
4
+ export * from "./report";
@@ -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,3 @@
1
+ import type { DoctorReport } from "./types";
2
+ export declare function formatDoctorReport(report: DoctorReport): string;
3
+ export declare function formatDoctorReportJson(report: DoctorReport): string;
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -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;
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}