oh-my-claudecode 0.1.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 (160) hide show
  1. package/README.md +281 -0
  2. package/bin/oh-my-claudecode.js +5 -0
  3. package/dist/agents/azathoth.d.ts +19 -0
  4. package/dist/agents/azathoth.d.ts.map +1 -0
  5. package/dist/agents/azathoth.js +105 -0
  6. package/dist/agents/azathoth.js.map +1 -0
  7. package/dist/agents/builtin-agents.d.ts +18 -0
  8. package/dist/agents/builtin-agents.d.ts.map +1 -0
  9. package/dist/agents/builtin-agents.js +141 -0
  10. package/dist/agents/builtin-agents.js.map +1 -0
  11. package/dist/agents/cthulhu.d.ts +21 -0
  12. package/dist/agents/cthulhu.d.ts.map +1 -0
  13. package/dist/agents/cthulhu.js +368 -0
  14. package/dist/agents/cthulhu.js.map +1 -0
  15. package/dist/agents/dagon.d.ts +17 -0
  16. package/dist/agents/dagon.d.ts.map +1 -0
  17. package/dist/agents/dagon.js +190 -0
  18. package/dist/agents/dagon.js.map +1 -0
  19. package/dist/agents/hastur.d.ts +18 -0
  20. package/dist/agents/hastur.d.ts.map +1 -0
  21. package/dist/agents/hastur.js +92 -0
  22. package/dist/agents/hastur.js.map +1 -0
  23. package/dist/agents/index.d.ts +14 -0
  24. package/dist/agents/index.d.ts.map +1 -0
  25. package/dist/agents/index.js +13 -0
  26. package/dist/agents/index.js.map +1 -0
  27. package/dist/agents/ithaqua.d.ts +19 -0
  28. package/dist/agents/ithaqua.d.ts.map +1 -0
  29. package/dist/agents/ithaqua.js +254 -0
  30. package/dist/agents/ithaqua.js.map +1 -0
  31. package/dist/agents/nyarlathotep.d.ts +18 -0
  32. package/dist/agents/nyarlathotep.d.ts.map +1 -0
  33. package/dist/agents/nyarlathotep.js +129 -0
  34. package/dist/agents/nyarlathotep.js.map +1 -0
  35. package/dist/agents/shoggoth.d.ts +17 -0
  36. package/dist/agents/shoggoth.d.ts.map +1 -0
  37. package/dist/agents/shoggoth.js +123 -0
  38. package/dist/agents/shoggoth.js.map +1 -0
  39. package/dist/agents/shub-niggurath.d.ts +18 -0
  40. package/dist/agents/shub-niggurath.d.ts.map +1 -0
  41. package/dist/agents/shub-niggurath.js +164 -0
  42. package/dist/agents/shub-niggurath.js.map +1 -0
  43. package/dist/agents/the-deep-one.d.ts +17 -0
  44. package/dist/agents/the-deep-one.d.ts.map +1 -0
  45. package/dist/agents/the-deep-one.js +114 -0
  46. package/dist/agents/the-deep-one.js.map +1 -0
  47. package/dist/agents/tsathoggua.d.ts +19 -0
  48. package/dist/agents/tsathoggua.d.ts.map +1 -0
  49. package/dist/agents/tsathoggua.js +177 -0
  50. package/dist/agents/tsathoggua.js.map +1 -0
  51. package/dist/agents/types.d.ts +61 -0
  52. package/dist/agents/types.d.ts.map +1 -0
  53. package/dist/agents/types.js +2 -0
  54. package/dist/agents/types.js.map +1 -0
  55. package/dist/agents/yog-sothoth.d.ts +17 -0
  56. package/dist/agents/yog-sothoth.d.ts.map +1 -0
  57. package/dist/agents/yog-sothoth.js +147 -0
  58. package/dist/agents/yog-sothoth.js.map +1 -0
  59. package/dist/cli/doctor.d.ts +2 -0
  60. package/dist/cli/doctor.d.ts.map +1 -0
  61. package/dist/cli/doctor.js +105 -0
  62. package/dist/cli/doctor.js.map +1 -0
  63. package/dist/cli/index.d.ts +2 -0
  64. package/dist/cli/index.d.ts.map +1 -0
  65. package/dist/cli/index.js +53 -0
  66. package/dist/cli/index.js.map +1 -0
  67. package/dist/cli/install.d.ts +5 -0
  68. package/dist/cli/install.d.ts.map +1 -0
  69. package/dist/cli/install.js +179 -0
  70. package/dist/cli/install.js.map +1 -0
  71. package/dist/config/index.d.ts +3 -0
  72. package/dist/config/index.d.ts.map +1 -0
  73. package/dist/config/index.js +2 -0
  74. package/dist/config/index.js.map +1 -0
  75. package/dist/config/schema.d.ts +7406 -0
  76. package/dist/config/schema.d.ts.map +1 -0
  77. package/dist/config/schema.js +197 -0
  78. package/dist/config/schema.js.map +1 -0
  79. package/dist/features/background-agent/index.d.ts +58 -0
  80. package/dist/features/background-agent/index.d.ts.map +1 -0
  81. package/dist/features/background-agent/index.js +113 -0
  82. package/dist/features/background-agent/index.js.map +1 -0
  83. package/dist/features/mcp-manager/index.d.ts +40 -0
  84. package/dist/features/mcp-manager/index.d.ts.map +1 -0
  85. package/dist/features/mcp-manager/index.js +71 -0
  86. package/dist/features/mcp-manager/index.js.map +1 -0
  87. package/dist/features/skill-loader/index.d.ts +37 -0
  88. package/dist/features/skill-loader/index.d.ts.map +1 -0
  89. package/dist/features/skill-loader/index.js +81 -0
  90. package/dist/features/skill-loader/index.js.map +1 -0
  91. package/dist/hooks/comment-checker.d.ts +18 -0
  92. package/dist/hooks/comment-checker.d.ts.map +1 -0
  93. package/dist/hooks/comment-checker.js +75 -0
  94. package/dist/hooks/comment-checker.js.map +1 -0
  95. package/dist/hooks/elder-loop.d.ts +26 -0
  96. package/dist/hooks/elder-loop.d.ts.map +1 -0
  97. package/dist/hooks/elder-loop.js +84 -0
  98. package/dist/hooks/elder-loop.js.map +1 -0
  99. package/dist/hooks/index.d.ts +20 -0
  100. package/dist/hooks/index.d.ts.map +1 -0
  101. package/dist/hooks/index.js +73 -0
  102. package/dist/hooks/index.js.map +1 -0
  103. package/dist/hooks/rules-injector.d.ts +12 -0
  104. package/dist/hooks/rules-injector.d.ts.map +1 -0
  105. package/dist/hooks/rules-injector.js +52 -0
  106. package/dist/hooks/rules-injector.js.map +1 -0
  107. package/dist/hooks/todo-continuation.d.ts +25 -0
  108. package/dist/hooks/todo-continuation.d.ts.map +1 -0
  109. package/dist/hooks/todo-continuation.js +74 -0
  110. package/dist/hooks/todo-continuation.js.map +1 -0
  111. package/dist/hooks/write-guard.d.ts +11 -0
  112. package/dist/hooks/write-guard.d.ts.map +1 -0
  113. package/dist/hooks/write-guard.js +39 -0
  114. package/dist/hooks/write-guard.js.map +1 -0
  115. package/dist/index.d.ts +36 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +35 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/plugin-config.d.ts +22 -0
  120. package/dist/plugin-config.d.ts.map +1 -0
  121. package/dist/plugin-config.js +133 -0
  122. package/dist/plugin-config.js.map +1 -0
  123. package/dist/plugin-handlers/config-handler.d.ts +21 -0
  124. package/dist/plugin-handlers/config-handler.d.ts.map +1 -0
  125. package/dist/plugin-handlers/config-handler.js +33 -0
  126. package/dist/plugin-handlers/config-handler.js.map +1 -0
  127. package/dist/plugin-handlers/index.d.ts +2 -0
  128. package/dist/plugin-handlers/index.d.ts.map +1 -0
  129. package/dist/plugin-handlers/index.js +2 -0
  130. package/dist/plugin-handlers/index.js.map +1 -0
  131. package/dist/shared/deep-merge.d.ts +6 -0
  132. package/dist/shared/deep-merge.d.ts.map +1 -0
  133. package/dist/shared/deep-merge.js +30 -0
  134. package/dist/shared/deep-merge.js.map +1 -0
  135. package/dist/shared/index.d.ts +5 -0
  136. package/dist/shared/index.d.ts.map +1 -0
  137. package/dist/shared/index.js +5 -0
  138. package/dist/shared/index.js.map +1 -0
  139. package/dist/shared/log.d.ts +3 -0
  140. package/dist/shared/log.d.ts.map +1 -0
  141. package/dist/shared/log.js +22 -0
  142. package/dist/shared/log.js.map +1 -0
  143. package/dist/shared/model-resolution.d.ts +15 -0
  144. package/dist/shared/model-resolution.d.ts.map +1 -0
  145. package/dist/shared/model-resolution.js +46 -0
  146. package/dist/shared/model-resolution.js.map +1 -0
  147. package/dist/shared/parse-jsonc.d.ts +6 -0
  148. package/dist/shared/parse-jsonc.d.ts.map +1 -0
  149. package/dist/shared/parse-jsonc.js +14 -0
  150. package/dist/shared/parse-jsonc.js.map +1 -0
  151. package/package.json +42 -0
  152. package/skills/cancel-elder-loop.md +22 -0
  153. package/skills/cthulhu.md +45 -0
  154. package/skills/elder-loop.md +39 -0
  155. package/skills/exorcise-ai-slop.md +45 -0
  156. package/skills/invoke-shub.md +32 -0
  157. package/skills/old-ones-init.md +47 -0
  158. package/skills/session-handoff.md +57 -0
  159. package/skills/shoggoth.md +34 -0
  160. package/skills/yog-sothoth.md +30 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Write Guard Hook
3
+ *
4
+ * Mapped from: write-existing-file-guard
5
+ *
6
+ * Warns when Write is used on an existing file (should use Edit instead).
7
+ * Prevents accidental full-file overwrites when only a portion should change.
8
+ */
9
+ export const WRITE_GUARD_HOOK_SCRIPT = `#!/usr/bin/env bash
10
+ # oh-my-claudecode: Write Guard PreToolUse Hook
11
+ # Fires before Write — warns if writing to an existing file.
12
+
13
+ set -euo pipefail
14
+
15
+ TOOL_NAME="\${CLAUDE_TOOL_NAME:-}"
16
+ FILE_PATH="\${CLAUDE_TOOL_INPUT_FILE_PATH:-}"
17
+
18
+ if [ "$TOOL_NAME" != "Write" ] || [ -z "$FILE_PATH" ]; then
19
+ exit 0
20
+ fi
21
+
22
+ if [ -f "$FILE_PATH" ]; then
23
+ echo "[WRITE GUARD] Warning: Write tool used on existing file: $FILE_PATH"
24
+ echo "Consider using Edit instead to preserve unintended changes."
25
+ echo "If you intend to fully replace this file, proceed."
26
+ fi
27
+ `;
28
+ export function getWriteGuardHookConfig() {
29
+ return {
30
+ matcher: "Write",
31
+ hooks: [
32
+ {
33
+ type: "command",
34
+ command: "~/.claude/hooks/write-guard.sh",
35
+ },
36
+ ],
37
+ };
38
+ }
39
+ //# sourceMappingURL=write-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-guard.js","sourceRoot":"","sources":["../../src/hooks/write-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;CAkBtC,CAAA;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,gCAAgC;aAC1C;SACF;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * oh-my-claudecode — Elder Gods Agentic Harness for Claude Code
3
+ *
4
+ * Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn.
5
+ *
6
+ * This is the main plugin entry point. It exports:
7
+ * - Agent configs for all 11 Elder God agents
8
+ * - Hook definitions for lifecycle behaviors
9
+ * - Config loading and merging utilities
10
+ * - The ClaudeCodePlugin descriptor used by the installer
11
+ *
12
+ * The 11 Elder God agents:
13
+ *
14
+ * | Elder God | Source Agent | Model | Role |
15
+ * |-----------------|----------------|--------|-------------------------|
16
+ * | Cthulhu | Sisyphus | Opus | Main orchestrator |
17
+ * | Nyarlathotep | Hephaestus | Opus | Deep autonomous worker |
18
+ * | Azathoth | Atlas | Opus | First-message planner |
19
+ * | Shub-Niggurath | Prometheus | Opus | Strategic planner |
20
+ * | Yog-Sothoth | Oracle | Opus | Architecture advisor |
21
+ * | Hastur | Sisyphus-Jr | Sonnet | Lightweight orchestrator|
22
+ * | Ithaqua | Metis | Sonnet | Pre-planning consultant |
23
+ * | Tsathoggua | Momus | Sonnet | Quality reviewer |
24
+ * | Dagon | Librarian | Sonnet | Documentation search |
25
+ * | The Deep One | Multimodal | Sonnet | Vision agent |
26
+ * | Shoggoth | Explore | Haiku | Fast codebase search |
27
+ */
28
+ export { loadPluginConfig, mergeConfigs, loadConfigFromPath } from "./plugin-config.js";
29
+ export { buildBuiltinAgents, AGENT_METADATA_MAP } from "./agents/builtin-agents.js";
30
+ export { getEnabledHooks, buildHooksConfig, ALL_HOOK_DEFINITIONS } from "./hooks/index.js";
31
+ export { applyConfig } from "./plugin-handlers/config-handler.js";
32
+ export type { OhMyClaudeCodeConfig, AgentOverrides, HookName, BuiltinAgentName, BuiltinCommandName, BuiltinSkillName, McpName, ClaudeModel, } from "./config/index.js";
33
+ export type { AgentConfig, AgentMode, AgentPromptMetadata, AvailableAgent, AvailableSkill, AvailableCategory, } from "./agents/types.js";
34
+ export { createCthulhuAgent, createYogSothothAgent, createShoggothAgent, createDagonAgent, createTsathoggua, createIthaquaAgent, createHasturAgent, createNyarlathotepAgent, createAzathothAgent, createShubNiggurathAgent, createDeepOneAgent, } from "./agents/index.js";
35
+ export { MODELS, resolveModel, resolveAgentModel } from "./shared/model-resolution.js";
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AACnF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAEjE,YAAY,EACV,oBAAoB,EACpB,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,EACP,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B,YAAY,EACV,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,35 @@
1
+ /**
2
+ * oh-my-claudecode — Elder Gods Agentic Harness for Claude Code
3
+ *
4
+ * Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn.
5
+ *
6
+ * This is the main plugin entry point. It exports:
7
+ * - Agent configs for all 11 Elder God agents
8
+ * - Hook definitions for lifecycle behaviors
9
+ * - Config loading and merging utilities
10
+ * - The ClaudeCodePlugin descriptor used by the installer
11
+ *
12
+ * The 11 Elder God agents:
13
+ *
14
+ * | Elder God | Source Agent | Model | Role |
15
+ * |-----------------|----------------|--------|-------------------------|
16
+ * | Cthulhu | Sisyphus | Opus | Main orchestrator |
17
+ * | Nyarlathotep | Hephaestus | Opus | Deep autonomous worker |
18
+ * | Azathoth | Atlas | Opus | First-message planner |
19
+ * | Shub-Niggurath | Prometheus | Opus | Strategic planner |
20
+ * | Yog-Sothoth | Oracle | Opus | Architecture advisor |
21
+ * | Hastur | Sisyphus-Jr | Sonnet | Lightweight orchestrator|
22
+ * | Ithaqua | Metis | Sonnet | Pre-planning consultant |
23
+ * | Tsathoggua | Momus | Sonnet | Quality reviewer |
24
+ * | Dagon | Librarian | Sonnet | Documentation search |
25
+ * | The Deep One | Multimodal | Sonnet | Vision agent |
26
+ * | Shoggoth | Explore | Haiku | Fast codebase search |
27
+ */
28
+ export { loadPluginConfig, mergeConfigs, loadConfigFromPath } from "./plugin-config.js";
29
+ export { buildBuiltinAgents, AGENT_METADATA_MAP } from "./agents/builtin-agents.js";
30
+ export { getEnabledHooks, buildHooksConfig, ALL_HOOK_DEFINITIONS } from "./hooks/index.js";
31
+ export { applyConfig } from "./plugin-handlers/config-handler.js";
32
+ // Individual agent creators
33
+ export { createCthulhuAgent, createYogSothothAgent, createShoggothAgent, createDagonAgent, createTsathoggua, createIthaquaAgent, createHasturAgent, createNyarlathotepAgent, createAzathothAgent, createShubNiggurathAgent, createDeepOneAgent, } from "./agents/index.js";
34
+ export { MODELS, resolveModel, resolveAgentModel } from "./shared/model-resolution.js";
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AACnF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAsBjE,4BAA4B;AAC5B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA"}
@@ -0,0 +1,22 @@
1
+ import { type OhMyClaudeCodeConfig } from "./config/schema.js";
2
+ /** Parse config partially — skip invalid sections instead of failing entirely */
3
+ export declare function parseConfigPartially(rawConfig: Record<string, unknown>): OhMyClaudeCodeConfig | null;
4
+ /** Detect config file at a base directory, preferring .jsonc over .json */
5
+ export declare function detectConfigFile(baseDir: string): {
6
+ path: string;
7
+ exists: boolean;
8
+ };
9
+ /** Load and parse a config file from a given path */
10
+ export declare function loadConfigFromPath(configPath: string): OhMyClaudeCodeConfig | null;
11
+ /** Deep merge two configs, with array keys unioned and objects recursively merged */
12
+ export declare function mergeConfigs(base: OhMyClaudeCodeConfig, override: OhMyClaudeCodeConfig): OhMyClaudeCodeConfig;
13
+ /**
14
+ * Load and merge plugin config from:
15
+ * 1. User-level (~/.claude/oh-my-claudecode.json[c])
16
+ * 2. Project-level (.claude/oh-my-claudecode.json[c])
17
+ *
18
+ * Project config overrides user config for scalar/object fields.
19
+ * Array fields (disabled_*) are unioned.
20
+ */
21
+ export declare function loadPluginConfig(projectDirectory: string): OhMyClaudeCodeConfig;
22
+ //# sourceMappingURL=plugin-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-config.d.ts","sourceRoot":"","sources":["../src/plugin-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAgB1F,iFAAiF;AACjF,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,oBAAoB,GAAG,IAAI,CA6B7B;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAanF;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CA4BlF;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAC1B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,oBAAoB,GAC7B,oBAAoB,CAoBtB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,oBAAoB,CA6B/E"}
@@ -0,0 +1,133 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { OhMyClaudeCodeConfigSchema } from "./config/schema.js";
4
+ import { deepMerge, parseJsonc, log } from "./shared/index.js";
5
+ const CONFIG_BASENAME = "oh-my-claudecode";
6
+ const LEGACY_BASENAME = "elder-gods";
7
+ const PARTIAL_STRING_ARRAY_KEYS = new Set([
8
+ "disabled_mcps",
9
+ "disabled_agents",
10
+ "disabled_skills",
11
+ "disabled_hooks",
12
+ "disabled_commands",
13
+ "disabled_tools",
14
+ "mcp_env_allowlist",
15
+ ]);
16
+ /** Parse config partially — skip invalid sections instead of failing entirely */
17
+ export function parseConfigPartially(rawConfig) {
18
+ const fullResult = OhMyClaudeCodeConfigSchema.safeParse(rawConfig);
19
+ if (fullResult.success)
20
+ return fullResult.data;
21
+ const partial = {};
22
+ for (const key of Object.keys(rawConfig)) {
23
+ if (PARTIAL_STRING_ARRAY_KEYS.has(key)) {
24
+ const val = rawConfig[key];
25
+ if (Array.isArray(val) && val.every(v => typeof v === "string")) {
26
+ partial[key] = val;
27
+ }
28
+ continue;
29
+ }
30
+ const result = OhMyClaudeCodeConfigSchema.safeParse({ [key]: rawConfig[key] });
31
+ if (result.success) {
32
+ const parsed = result.data;
33
+ if (parsed[key] !== undefined) {
34
+ partial[key] = parsed[key];
35
+ }
36
+ }
37
+ else {
38
+ log(`Config section "${key}" is invalid — skipping`, {
39
+ errors: result.error.issues.map(i => `${i.path.join(".")}: ${i.message}`),
40
+ });
41
+ }
42
+ }
43
+ return partial;
44
+ }
45
+ /** Detect config file at a base directory, preferring .jsonc over .json */
46
+ export function detectConfigFile(baseDir) {
47
+ const candidates = [
48
+ path.join(baseDir, `${CONFIG_BASENAME}.jsonc`),
49
+ path.join(baseDir, `${CONFIG_BASENAME}.json`),
50
+ path.join(baseDir, `${LEGACY_BASENAME}.jsonc`),
51
+ path.join(baseDir, `${LEGACY_BASENAME}.json`),
52
+ ];
53
+ for (const candidate of candidates) {
54
+ if (fs.existsSync(candidate)) {
55
+ return { path: candidate, exists: true };
56
+ }
57
+ }
58
+ return { path: path.join(baseDir, `${CONFIG_BASENAME}.json`), exists: false };
59
+ }
60
+ /** Load and parse a config file from a given path */
61
+ export function loadConfigFromPath(configPath) {
62
+ try {
63
+ if (!fs.existsSync(configPath))
64
+ return null;
65
+ const content = fs.readFileSync(configPath, "utf-8");
66
+ const rawConfig = parseJsonc(content);
67
+ const result = OhMyClaudeCodeConfigSchema.safeParse(rawConfig);
68
+ if (result.success) {
69
+ log(`Config loaded from ${configPath}`);
70
+ return result.data;
71
+ }
72
+ log(`Config validation errors in ${configPath}`, {
73
+ errors: result.error.issues.map(i => `${i.path.join(".")}: ${i.message}`),
74
+ });
75
+ const partial = parseConfigPartially(rawConfig);
76
+ if (partial) {
77
+ log(`Partial config loaded from ${configPath}`);
78
+ return partial;
79
+ }
80
+ return null;
81
+ }
82
+ catch (err) {
83
+ log(`Error loading config from ${configPath}`, { error: String(err) });
84
+ return null;
85
+ }
86
+ }
87
+ /** Deep merge two configs, with array keys unioned and objects recursively merged */
88
+ export function mergeConfigs(base, override) {
89
+ return {
90
+ ...base,
91
+ ...override,
92
+ agents: deepMerge(base.agents, override.agents),
93
+ categories: deepMerge(base.categories, override.categories),
94
+ disabled_agents: [...new Set([...(base.disabled_agents ?? []), ...(override.disabled_agents ?? [])])],
95
+ disabled_mcps: [...new Set([...(base.disabled_mcps ?? []), ...(override.disabled_mcps ?? [])])],
96
+ disabled_hooks: [...new Set([...(base.disabled_hooks ?? []), ...(override.disabled_hooks ?? [])])],
97
+ disabled_commands: [...new Set([...(base.disabled_commands ?? []), ...(override.disabled_commands ?? [])])],
98
+ disabled_skills: [...new Set([...(base.disabled_skills ?? []), ...(override.disabled_skills ?? [])])],
99
+ disabled_tools: [...new Set([...(base.disabled_tools ?? []), ...(override.disabled_tools ?? [])])],
100
+ mcp_env_allowlist: [...new Set([...(base.mcp_env_allowlist ?? []), ...(override.mcp_env_allowlist ?? [])])],
101
+ };
102
+ }
103
+ /**
104
+ * Load and merge plugin config from:
105
+ * 1. User-level (~/.claude/oh-my-claudecode.json[c])
106
+ * 2. Project-level (.claude/oh-my-claudecode.json[c])
107
+ *
108
+ * Project config overrides user config for scalar/object fields.
109
+ * Array fields (disabled_*) are unioned.
110
+ */
111
+ export function loadPluginConfig(projectDirectory) {
112
+ // User-level config
113
+ const userConfigDir = path.join(process.env.HOME ?? process.env.USERPROFILE ?? "~", ".claude");
114
+ const userDetected = detectConfigFile(userConfigDir);
115
+ const userConfig = userDetected.exists ? loadConfigFromPath(userDetected.path) : null;
116
+ // Project-level config
117
+ const projectConfigDir = path.join(projectDirectory, ".claude");
118
+ const projectDetected = detectConfigFile(projectConfigDir);
119
+ const projectConfig = projectDetected.exists ? loadConfigFromPath(projectDetected.path) : null;
120
+ // Start from user config (or Zod defaults)
121
+ let config = userConfig ?? OhMyClaudeCodeConfigSchema.parse({});
122
+ // Layer project config on top
123
+ if (projectConfig) {
124
+ config = mergeConfigs(config, projectConfig);
125
+ }
126
+ log("Final merged plugin config", {
127
+ disabled_agents: config.disabled_agents,
128
+ disabled_hooks: config.disabled_hooks,
129
+ disabled_mcps: config.disabled_mcps,
130
+ });
131
+ return config;
132
+ }
133
+ //# sourceMappingURL=plugin-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-config.js","sourceRoot":"","sources":["../src/plugin-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,0BAA0B,EAA6B,MAAM,oBAAoB,CAAA;AAC1F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAE9D,MAAM,eAAe,GAAG,kBAAkB,CAAA;AAC1C,MAAM,eAAe,GAAG,YAAY,CAAA;AAEpC,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC;IACxC,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;IAChB,mBAAmB;CACpB,CAAC,CAAA;AAEF,iFAAiF;AACjF,MAAM,UAAU,oBAAoB,CAClC,SAAkC;IAElC,MAAM,UAAU,GAAG,0BAA0B,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAClE,IAAI,UAAU,CAAC,OAAO;QAAE,OAAO,UAAU,CAAC,IAAI,CAAA;IAE9C,MAAM,OAAO,GAA4B,EAAE,CAAA;IAE3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,IAAI,yBAAyB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;YAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;YACpB,CAAC;YACD,SAAQ;QACV,CAAC;QAED,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC9E,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,CAAC,IAA+B,CAAA;YACrD,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,mBAAmB,GAAG,yBAAyB,EAAE;gBACnD,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC1E,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,OAA+B,CAAA;AACxC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,eAAe,QAAQ,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,eAAe,OAAO,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,eAAe,QAAQ,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,eAAe,OAAO,CAAC;KAC9C,CAAA;IACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,eAAe,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC/E,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAA;QAE3C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACpD,MAAM,SAAS,GAAG,UAAU,CAA0B,OAAO,CAAC,CAAA;QAE9D,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAC9D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,GAAG,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAA;YACvC,OAAO,MAAM,CAAC,IAAI,CAAA;QACpB,CAAC;QAED,GAAG,CAAC,+BAA+B,UAAU,EAAE,EAAE;YAC/C,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SAC1E,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAA;QAC/C,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAA;YAC/C,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,6BAA6B,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACtE,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAC1B,IAA0B,EAC1B,QAA8B;IAE9B,OAAO;QACL,GAAG,IAAI;QACP,GAAG,QAAQ;QACX,MAAM,EAAE,SAAS,CACf,IAAI,CAAC,MAAiC,EACtC,QAAQ,CAAC,MAAiC,CACT;QACnC,UAAU,EAAE,SAAS,CACnB,IAAI,CAAC,UAAqC,EAC1C,QAAQ,CAAC,UAAqC,CACT;QACvC,eAAe,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACrG,aAAa,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/F,cAAc,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClG,iBAAiB,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3G,eAAe,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACrG,cAAc,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClG,iBAAiB,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;KAC5G,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,gBAAwB;IACvD,oBAAoB;IACpB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,EAClD,SAAS,CACV,CAAA;IACD,MAAM,YAAY,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAA;IACpD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAErF,uBAAuB;IACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAA;IAC/D,MAAM,eAAe,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAA;IAC1D,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAE9F,2CAA2C;IAC3C,IAAI,MAAM,GAAyB,UAAU,IAAI,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAErF,8BAA8B;IAC9B,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC9C,CAAC;IAED,GAAG,CAAC,4BAA4B,EAAE;QAChC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { OhMyClaudeCodeConfig } from "../config/schema.js";
2
+ import type { AvailableSkill, AvailableCategory } from "../agents/types.js";
3
+ export interface ConfigHandlerDeps {
4
+ pluginConfig: OhMyClaudeCodeConfig;
5
+ projectDirectory: string;
6
+ }
7
+ /**
8
+ * Applies the full 5-phase config pipeline:
9
+ * Phase 1: providers
10
+ * Phase 2: plugin components (skills, categories)
11
+ * Phase 3: agents — build and register all Elder God agents
12
+ * Phase 4: tools — register/disable tools
13
+ * Phase 5: commands — register built-in commands
14
+ *
15
+ * Returns agent configs for consumption by the plugin host.
16
+ */
17
+ export declare function applyConfig(deps: ConfigHandlerDeps, discoveredSkills?: AvailableSkill[]): Promise<{
18
+ agents: Record<string, object>;
19
+ availableCategories: AvailableCategory[];
20
+ }>;
21
+ //# sourceMappingURL=config-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-handler.d.ts","sourceRoot":"","sources":["../../src/plugin-handlers/config-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAE3E,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,oBAAoB,CAAA;IAClC,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,iBAAiB,EACvB,gBAAgB,GAAE,cAAc,EAAO,GACtC,OAAO,CAAC;IACT,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,mBAAmB,EAAE,iBAAiB,EAAE,CAAA;CACzC,CAAC,CAuBD"}
@@ -0,0 +1,33 @@
1
+ import { buildBuiltinAgents } from "../agents/builtin-agents.js";
2
+ import { log } from "../shared/log.js";
3
+ /**
4
+ * Applies the full 5-phase config pipeline:
5
+ * Phase 1: providers
6
+ * Phase 2: plugin components (skills, categories)
7
+ * Phase 3: agents — build and register all Elder God agents
8
+ * Phase 4: tools — register/disable tools
9
+ * Phase 5: commands — register built-in commands
10
+ *
11
+ * Returns agent configs for consumption by the plugin host.
12
+ */
13
+ export async function applyConfig(deps, discoveredSkills = []) {
14
+ const { pluginConfig } = deps;
15
+ // Phase 2: resolve categories
16
+ const availableCategories = Object.entries(pluginConfig.categories ?? {})
17
+ .filter(([, cfg]) => !cfg?.disable)
18
+ .map(([name, cfg]) => ({
19
+ name,
20
+ description: cfg?.description ?? name,
21
+ }));
22
+ // Phase 3: build agents
23
+ const agents = buildBuiltinAgents({
24
+ disabledAgents: pluginConfig.disabled_agents ?? [],
25
+ agentOverrides: pluginConfig.agents ?? {},
26
+ discoveredSkills,
27
+ availableCategories,
28
+ useTaskSystem: pluginConfig.cthulhu_agent?.use_task_system ?? false,
29
+ });
30
+ log("[config-handler] Agents registered", { count: Object.keys(agents).length, names: Object.keys(agents) });
31
+ return { agents, availableCategories };
32
+ }
33
+ //# sourceMappingURL=config-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-handler.js","sourceRoot":"","sources":["../../src/plugin-handlers/config-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAQtC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAuB,EACvB,mBAAqC,EAAE;IAKvC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;IAE7B,8BAA8B;IAC9B,MAAM,mBAAmB,GAAwB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,IAAI,EAAE,CAAC;SAC3F,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACrB,IAAI;QACJ,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,IAAI;KACtC,CAAC,CAAC,CAAA;IAEL,wBAAwB;IACxB,MAAM,MAAM,GAAG,kBAAkB,CAAC;QAChC,cAAc,EAAE,YAAY,CAAC,eAAe,IAAI,EAAE;QAClD,cAAc,EAAE,YAAY,CAAC,MAAM,IAAI,EAAE;QACzC,gBAAgB;QAChB,mBAAmB;QACnB,aAAa,EAAE,YAAY,CAAC,aAAa,EAAE,eAAe,IAAI,KAAK;KACpE,CAAC,CAAA;IAEF,GAAG,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAE5G,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAA;AACxC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { applyConfig } from "./config-handler.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin-handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { applyConfig } from "./config-handler.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin-handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Deep merges two objects. Arrays are NOT merged — override replaces base.
3
+ * Objects are recursively merged.
4
+ */
5
+ export declare function deepMerge<T extends Record<string, unknown>>(base: T | undefined, override: T | undefined): T | undefined;
6
+ //# sourceMappingURL=deep-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-merge.d.ts","sourceRoot":"","sources":["../../src/shared/deep-merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,IAAI,EAAE,CAAC,GAAG,SAAS,EACnB,QAAQ,EAAE,CAAC,GAAG,SAAS,GACtB,CAAC,GAAG,SAAS,CA6Bf"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Deep merges two objects. Arrays are NOT merged — override replaces base.
3
+ * Objects are recursively merged.
4
+ */
5
+ export function deepMerge(base, override) {
6
+ if (!base && !override)
7
+ return undefined;
8
+ if (!base)
9
+ return override;
10
+ if (!override)
11
+ return base;
12
+ const result = { ...base };
13
+ for (const key of Object.keys(override)) {
14
+ const baseVal = base[key];
15
+ const overrideVal = override[key];
16
+ if (baseVal !== null &&
17
+ overrideVal !== null &&
18
+ typeof baseVal === "object" &&
19
+ typeof overrideVal === "object" &&
20
+ !Array.isArray(baseVal) &&
21
+ !Array.isArray(overrideVal)) {
22
+ result[key] = deepMerge(baseVal, overrideVal);
23
+ }
24
+ else {
25
+ result[key] = overrideVal;
26
+ }
27
+ }
28
+ return result;
29
+ }
30
+ //# sourceMappingURL=deep-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-merge.js","sourceRoot":"","sources":["../../src/shared/deep-merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,IAAmB,EACnB,QAAuB;IAEvB,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAA;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAA;IAC1B,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAE1B,MAAM,MAAM,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAA;IAEnD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACzB,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;QAEjC,IACE,OAAO,KAAK,IAAI;YAChB,WAAW,KAAK,IAAI;YACpB,OAAO,OAAO,KAAK,QAAQ;YAC3B,OAAO,WAAW,KAAK,QAAQ;YAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACvB,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAC3B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,OAAkC,EAClC,WAAsC,CACvC,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,MAAW,CAAA;AACpB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { log, warn } from "./log.js";
2
+ export { deepMerge } from "./deep-merge.js";
3
+ export { parseJsonc } from "./parse-jsonc.js";
4
+ export { resolveModel, resolveAgentModel, MODELS, DEFAULT_AGENT_MODELS, MODEL_FALLBACK_CHAINS } from "./model-resolution.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { log, warn } from "./log.js";
2
+ export { deepMerge } from "./deep-merge.js";
3
+ export { parseJsonc } from "./parse-jsonc.js";
4
+ export { resolveModel, resolveAgentModel, MODELS, DEFAULT_AGENT_MODELS, MODEL_FALLBACK_CHAINS } from "./model-resolution.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare function log(message: string, data?: unknown): void;
2
+ export declare function warn(message: string, data?: unknown): void;
3
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/shared/log.ts"],"names":[],"mappings":"AAEA,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAQzD;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAO1D"}
@@ -0,0 +1,22 @@
1
+ const DEBUG = process.env.ELDER_GODS_DEBUG === "1" || process.env.ELDER_GODS_DEBUG === "true";
2
+ export function log(message, data) {
3
+ if (!DEBUG)
4
+ return;
5
+ const ts = new Date().toISOString();
6
+ if (data !== undefined) {
7
+ console.error(`[oh-my-claudecode ${ts}] ${message}`, JSON.stringify(data, null, 2));
8
+ }
9
+ else {
10
+ console.error(`[oh-my-claudecode ${ts}] ${message}`);
11
+ }
12
+ }
13
+ export function warn(message, data) {
14
+ const ts = new Date().toISOString();
15
+ if (data !== undefined) {
16
+ console.error(`[oh-my-claudecode WARN ${ts}] ${message}`, JSON.stringify(data, null, 2));
17
+ }
18
+ else {
19
+ console.error(`[oh-my-claudecode WARN ${ts}] ${message}`);
20
+ }
21
+ }
22
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/shared/log.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,MAAM,CAAA;AAE7F,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,IAAc;IACjD,IAAI,CAAC,KAAK;QAAE,OAAM;IAClB,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,OAAO,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACrF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,OAAO,EAAE,CAAC,CAAA;IACtD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe,EAAE,IAAc;IAClD,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,OAAO,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAC1F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,OAAO,EAAE,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ClaudeModel } from "../config/schema.js";
2
+ /** Canonical model IDs for Claude Code */
3
+ export declare const MODELS: {
4
+ readonly OPUS: "claude-opus-4-6";
5
+ readonly SONNET: "claude-sonnet-4-6";
6
+ readonly HAIKU: "claude-haiku-4-5";
7
+ };
8
+ /** Resolve a short alias or canonical ID to a full model string */
9
+ export declare function resolveModel(model: string | undefined): string;
10
+ /** Default model for each agent tier */
11
+ export declare const DEFAULT_AGENT_MODELS: Record<string, string>;
12
+ /** Fallback chain for each tier if primary model fails */
13
+ export declare const MODEL_FALLBACK_CHAINS: Record<string, string[]>;
14
+ export declare function resolveAgentModel(agentName: string, overrideModel: ClaudeModel | undefined, systemDefaultModel: string | undefined): string;
15
+ //# sourceMappingURL=model-resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-resolution.d.ts","sourceRoot":"","sources":["../../src/shared/model-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,0CAA0C;AAC1C,eAAO,MAAM,MAAM;;;;CAIT,CAAA;AAEV,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQ9D;AAED,wCAAwC;AACxC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAevD,CAAA;AAED,0DAA0D;AAC1D,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAI1D,CAAA;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,WAAW,GAAG,SAAS,EACtC,kBAAkB,EAAE,MAAM,GAAG,SAAS,GACrC,MAAM,CAGR"}
@@ -0,0 +1,46 @@
1
+ /** Canonical model IDs for Claude Code */
2
+ export const MODELS = {
3
+ OPUS: "claude-opus-4-6",
4
+ SONNET: "claude-sonnet-4-6",
5
+ HAIKU: "claude-haiku-4-5",
6
+ };
7
+ /** Resolve a short alias or canonical ID to a full model string */
8
+ export function resolveModel(model) {
9
+ if (!model)
10
+ return MODELS.SONNET;
11
+ const aliases = {
12
+ opus: MODELS.OPUS,
13
+ sonnet: MODELS.SONNET,
14
+ haiku: MODELS.HAIKU,
15
+ };
16
+ return aliases[model] ?? model;
17
+ }
18
+ /** Default model for each agent tier */
19
+ export const DEFAULT_AGENT_MODELS = {
20
+ // Opus-tier: primary orchestrators and deep reasoners
21
+ cthulhu: MODELS.OPUS,
22
+ nyarlathotep: MODELS.OPUS,
23
+ azathoth: MODELS.OPUS,
24
+ "shub-niggurath": MODELS.OPUS,
25
+ "yog-sothoth": MODELS.OPUS,
26
+ // Sonnet-tier: mid-complexity specialists
27
+ hastur: MODELS.SONNET,
28
+ ithaqua: MODELS.SONNET,
29
+ tsathoggua: MODELS.SONNET,
30
+ dagon: MODELS.SONNET,
31
+ "the-deep-one": MODELS.SONNET,
32
+ // Haiku-tier: fast pattern matchers
33
+ shoggoth: MODELS.HAIKU,
34
+ };
35
+ /** Fallback chain for each tier if primary model fails */
36
+ export const MODEL_FALLBACK_CHAINS = {
37
+ [MODELS.OPUS]: [MODELS.SONNET, MODELS.HAIKU],
38
+ [MODELS.SONNET]: [MODELS.HAIKU],
39
+ [MODELS.HAIKU]: [],
40
+ };
41
+ export function resolveAgentModel(agentName, overrideModel, systemDefaultModel) {
42
+ if (overrideModel)
43
+ return resolveModel(overrideModel);
44
+ return DEFAULT_AGENT_MODELS[agentName] ?? systemDefaultModel ?? MODELS.SONNET;
45
+ }
46
+ //# sourceMappingURL=model-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-resolution.js","sourceRoot":"","sources":["../../src/shared/model-resolution.ts"],"names":[],"mappings":"AAEA,0CAA0C;AAC1C,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,iBAAiB;IACvB,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE,kBAAkB;CACjB,CAAA;AAEV,mEAAmE;AACnE,MAAM,UAAU,YAAY,CAAC,KAAyB;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC,MAAM,CAAA;IAChC,MAAM,OAAO,GAA2B;QACtC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAA;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAA;AAChC,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC,IAAI;IACpB,YAAY,EAAE,MAAM,CAAC,IAAI;IACzB,QAAQ,EAAE,MAAM,CAAC,IAAI;IACrB,gBAAgB,EAAE,MAAM,CAAC,IAAI;IAC7B,aAAa,EAAE,MAAM,CAAC,IAAI;IAC1B,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,UAAU,EAAE,MAAM,CAAC,MAAM;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM;IAC7B,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC,KAAK;CACvB,CAAA;AAED,0DAA0D;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAA6B;IAC7D,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;IAC5C,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;IAC/B,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;CACnB,CAAA;AAED,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,aAAsC,EACtC,kBAAsC;IAEtC,IAAI,aAAa;QAAE,OAAO,YAAY,CAAC,aAAa,CAAC,CAAA;IACrD,OAAO,oBAAoB,CAAC,SAAS,CAAC,IAAI,kBAAkB,IAAI,MAAM,CAAC,MAAM,CAAA;AAC/E,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Parse JSON with comments (JSONC). Strips line comments (//) and block comments
3
+ * and trailing commas before parsing.
4
+ */
5
+ export declare function parseJsonc<T = unknown>(content: string): T;
6
+ //# sourceMappingURL=parse-jsonc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-jsonc.d.ts","sourceRoot":"","sources":["../../src/shared/parse-jsonc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAQ1D"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Parse JSON with comments (JSONC). Strips line comments (//) and block comments
3
+ * and trailing commas before parsing.
4
+ */
5
+ export function parseJsonc(content) {
6
+ // Remove line comments
7
+ let stripped = content.replace(/\/\/[^\n]*/g, "");
8
+ // Remove block comments
9
+ stripped = stripped.replace(/\/\*[\s\S]*?\*\//g, "");
10
+ // Remove trailing commas before } or ]
11
+ stripped = stripped.replace(/,\s*([\]}])/g, "$1");
12
+ return JSON.parse(stripped);
13
+ }
14
+ //# sourceMappingURL=parse-jsonc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-jsonc.js","sourceRoot":"","sources":["../../src/shared/parse-jsonc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAc,OAAe;IACrD,uBAAuB;IACvB,IAAI,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;IACjD,wBAAwB;IACxB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAA;IACpD,uCAAuC;IACvC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAM,CAAA;AAClC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "oh-my-claudecode",
3
+ "version": "0.1.0",
4
+ "description": "Cthulhu-themed agentic harness for Claude Code — 11 Elder God agents, lifecycle hooks, skill system, and multi-tier orchestration.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "exports": {
8
+ ".": "./dist/index.js",
9
+ "./cli": "./dist/cli/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "bin",
14
+ "skills"
15
+ ],
16
+ "bin": {
17
+ "oh-my-claudecode": "./bin/oh-my-claudecode.js"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsc --watch",
22
+ "install-plugin": "bun src/cli/index.ts install",
23
+ "doctor": "bun src/cli/index.ts doctor"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/ragingstar2063/oh-my-claudecode.git"
28
+ },
29
+ "keywords": ["claude-code", "claude", "ai-agents", "cthulhu", "agentic", "orchestration"],
30
+ "license": "MIT",
31
+ "dependencies": {
32
+ "commander": "^12.0.0",
33
+ "zod": "^3.24.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^22.0.0",
37
+ "typescript": "^5.5.0"
38
+ },
39
+ "engines": {
40
+ "node": ">=20.0.0"
41
+ }
42
+ }