oh-my-claudecode 0.2.8 → 0.2.10

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 (131) hide show
  1. package/README.md +170 -68
  2. package/commands/cthulhu.md +9 -1
  3. package/commands/invoke-shub.md +8 -2
  4. package/commands/shoggoth.md +15 -25
  5. package/commands/yog-sothoth.md +18 -25
  6. package/dist/agents/render.d.ts +11 -0
  7. package/dist/agents/render.d.ts.map +1 -0
  8. package/dist/agents/render.js +69 -0
  9. package/dist/agents/render.js.map +1 -0
  10. package/dist/cli/dashboard.d.ts +12 -0
  11. package/dist/cli/dashboard.d.ts.map +1 -0
  12. package/dist/cli/dashboard.js +58 -0
  13. package/dist/cli/dashboard.js.map +1 -0
  14. package/dist/cli/doctor.d.ts +11 -0
  15. package/dist/cli/doctor.d.ts.map +1 -1
  16. package/dist/cli/doctor.js +203 -34
  17. package/dist/cli/doctor.js.map +1 -1
  18. package/dist/cli/index.js +72 -3
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/cli/install.d.ts +6 -0
  21. package/dist/cli/install.d.ts.map +1 -1
  22. package/dist/cli/install.js +211 -44
  23. package/dist/cli/install.js.map +1 -1
  24. package/dist/cli/lint.d.ts +26 -0
  25. package/dist/cli/lint.d.ts.map +1 -0
  26. package/dist/cli/lint.js +86 -0
  27. package/dist/cli/lint.js.map +1 -0
  28. package/dist/cli/stats.d.ts +56 -0
  29. package/dist/cli/stats.d.ts.map +1 -0
  30. package/dist/cli/stats.js +198 -0
  31. package/dist/cli/stats.js.map +1 -0
  32. package/dist/cli/sync.d.ts +44 -0
  33. package/dist/cli/sync.d.ts.map +1 -0
  34. package/dist/cli/sync.js +154 -0
  35. package/dist/cli/sync.js.map +1 -0
  36. package/dist/config/schema.d.ts +337 -331
  37. package/dist/config/schema.d.ts.map +1 -1
  38. package/dist/config/schema.js +14 -10
  39. package/dist/config/schema.js.map +1 -1
  40. package/dist/features/block-summarizer/index.js +1 -0
  41. package/dist/features/block-summarizer/index.js.map +1 -1
  42. package/dist/features/yith-archive/config.d.ts.map +1 -1
  43. package/dist/features/yith-archive/config.js +11 -15
  44. package/dist/features/yith-archive/config.js.map +1 -1
  45. package/dist/features/yith-archive/eval/schemas.d.ts +2 -2
  46. package/dist/features/yith-archive/functions/migrate.d.ts.map +1 -1
  47. package/dist/features/yith-archive/functions/migrate.js +7 -3
  48. package/dist/features/yith-archive/functions/migrate.js.map +1 -1
  49. package/dist/features/yith-archive/functions/opencode-import.d.ts.map +1 -1
  50. package/dist/features/yith-archive/functions/opencode-import.js +54 -27
  51. package/dist/features/yith-archive/functions/opencode-import.js.map +1 -1
  52. package/dist/features/yith-archive/functions/smart-search.js.map +1 -1
  53. package/dist/features/yith-archive/functions/temporal-graph.d.ts.map +1 -1
  54. package/dist/features/yith-archive/functions/temporal-graph.js +1 -0
  55. package/dist/features/yith-archive/functions/temporal-graph.js.map +1 -1
  56. package/dist/features/yith-archive/providers/embedding/local.d.ts +16 -5
  57. package/dist/features/yith-archive/providers/embedding/local.d.ts.map +1 -1
  58. package/dist/features/yith-archive/providers/embedding/local.js +29 -11
  59. package/dist/features/yith-archive/providers/embedding/local.js.map +1 -1
  60. package/dist/features/yith-archive/state/fake-sdk.d.ts.map +1 -1
  61. package/dist/features/yith-archive/state/fake-sdk.js.map +1 -1
  62. package/dist/features/yith-archive/state/reranker.d.ts.map +1 -1
  63. package/dist/features/yith-archive/state/reranker.js +9 -2
  64. package/dist/features/yith-archive/state/reranker.js.map +1 -1
  65. package/dist/features/yith-archive/state/vector-index.d.ts.map +1 -1
  66. package/dist/features/yith-archive/state/vector-index.js +1 -0
  67. package/dist/features/yith-archive/state/vector-index.js.map +1 -1
  68. package/dist/hooks/agent-sync.d.ts +16 -0
  69. package/dist/hooks/agent-sync.d.ts.map +1 -0
  70. package/dist/hooks/agent-sync.js +42 -0
  71. package/dist/hooks/agent-sync.js.map +1 -0
  72. package/dist/hooks/comment-checker.d.ts +1 -1
  73. package/dist/hooks/comment-checker.d.ts.map +1 -1
  74. package/dist/hooks/comment-checker.js +10 -0
  75. package/dist/hooks/comment-checker.js.map +1 -1
  76. package/dist/hooks/cthulhu-auto.d.ts +1 -1
  77. package/dist/hooks/cthulhu-auto.d.ts.map +1 -1
  78. package/dist/hooks/cthulhu-auto.js +77 -8
  79. package/dist/hooks/cthulhu-auto.js.map +1 -1
  80. package/dist/hooks/cthulhu-preflight.d.ts.map +1 -1
  81. package/dist/hooks/cthulhu-preflight.js +6 -5
  82. package/dist/hooks/cthulhu-preflight.js.map +1 -1
  83. package/dist/hooks/design-detector-hook.d.ts +6 -5
  84. package/dist/hooks/design-detector-hook.d.ts.map +1 -1
  85. package/dist/hooks/design-detector-hook.js +27 -8
  86. package/dist/hooks/design-detector-hook.js.map +1 -1
  87. package/dist/hooks/index.d.ts +2 -1
  88. package/dist/hooks/index.d.ts.map +1 -1
  89. package/dist/hooks/index.js +43 -0
  90. package/dist/hooks/index.js.map +1 -1
  91. package/dist/hooks/web-research-hook.d.ts +6 -5
  92. package/dist/hooks/web-research-hook.d.ts.map +1 -1
  93. package/dist/hooks/web-research-hook.js +30 -9
  94. package/dist/hooks/web-research-hook.js.map +1 -1
  95. package/dist/hooks/write-guard.d.ts +1 -1
  96. package/dist/hooks/write-guard.d.ts.map +1 -1
  97. package/dist/hooks/write-guard.js +10 -0
  98. package/dist/hooks/write-guard.js.map +1 -1
  99. package/dist/hooks/yith-capture.d.ts +9 -3
  100. package/dist/hooks/yith-capture.d.ts.map +1 -1
  101. package/dist/hooks/yith-capture.js +43 -14
  102. package/dist/hooks/yith-capture.js.map +1 -1
  103. package/dist/index.d.ts +12 -5
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +13 -5
  106. package/dist/index.js.map +1 -1
  107. package/dist/linters/type-safety-ast.d.ts.map +1 -1
  108. package/dist/linters/type-safety-ast.js +42 -24
  109. package/dist/linters/type-safety-ast.js.map +1 -1
  110. package/dist/shared/ascii-logo.d.ts +24 -0
  111. package/dist/shared/ascii-logo.d.ts.map +1 -0
  112. package/dist/shared/ascii-logo.js +77 -0
  113. package/dist/shared/ascii-logo.js.map +1 -0
  114. package/dist/shared/model-resolution.d.ts +19 -6
  115. package/dist/shared/model-resolution.d.ts.map +1 -1
  116. package/dist/shared/model-resolution.js +25 -12
  117. package/dist/shared/model-resolution.js.map +1 -1
  118. package/package.json +9 -6
  119. package/tui/dashboard.tsx +504 -0
  120. package/tui/data.ts +180 -0
  121. package/tui/theme.ts +51 -0
  122. package/tui/tsconfig.json +15 -0
  123. package/tui/wizard.tsx +219 -0
  124. package/dist/plugin-handlers/config-handler.d.ts +0 -21
  125. package/dist/plugin-handlers/config-handler.d.ts.map +0 -1
  126. package/dist/plugin-handlers/config-handler.js +0 -33
  127. package/dist/plugin-handlers/config-handler.js.map +0 -1
  128. package/dist/plugin-handlers/index.d.ts +0 -2
  129. package/dist/plugin-handlers/index.d.ts.map +0 -1
  130. package/dist/plugin-handlers/index.js +0 -2
  131. package/dist/plugin-handlers/index.js.map +0 -1
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  >
11
11
  > **The agentic operations system for [Claude Code](https://claude.ai/code).**
12
12
 
13
- oh-my-claudecode (OMC) turns a raw Claude Code session into a fully-orchestrated agentic environment. Instead of typing to a single model that loses its mind between sessions, you talk to **Cthulhu** — a primary orchestrator that plans, delegates to ten specialized Elder God subagents, remembers what it learned last time via a persistent archive, and trims its own context between delegations so long sessions stay sharp. It is opinionated, integrated, and end-to-end: one install, one command, every piece wired into every other piece.
13
+ oh-my-claudecode (OMC) turns a raw Claude Code session into a fully-orchestrated agentic environment. Instead of typing to a single model that loses its mind between sessions, you talk to **Cthulhu** — a primary orchestrator that plans, delegates to eleven specialized Elder God subagents, remembers what it learned last time via a persistent archive, and trims its own context between delegations so long sessions stay sharp. The specialists are real Claude Code subagents — the installer renders them into `~/.claude/agents/`, so `Agent(subagent_type: "shoggoth")` resolves natively. It is opinionated, integrated, and end-to-end: one install, one command, every piece wired into every other piece.
14
14
 
15
15
  ---
16
16
 
@@ -34,7 +34,7 @@ OMC's three pillars address each problem directly.
34
34
  │ │ ORCHESTRATION │ │ MEMORY │ │ CONTEXT │ │
35
35
  │ │ │ │ │ │ DISCIPLINE │ │
36
36
  │ │ Cthulhu + │ │ Yith Archive │ │ Block │ │
37
- │ │ 10 Elder God │ │ cross-session │ │ Summarizer │ │
37
+ │ │ 11 Elder God │ │ cross-session │ │ Summarizer │ │
38
38
  │ │ specialists │ │ persistent │ │ in-session │ │
39
39
  │ │ intent gate │ │ retrieval │ │ trimming │ │
40
40
  │ │ delegation │ │ │ │ │ │
@@ -56,18 +56,18 @@ These aren't three plugins you pick and choose. They're one integrated system th
56
56
 
57
57
  | Capability | What it does |
58
58
  |---|---|
59
- | **11 Elder God agents** | Cthulhu orchestrator + 10 specialists (search, advisory, planning, review, docs, autonomy, vision, etc.) |
59
+ | **12 Elder God agents** | Cthulhu orchestrator + 11 specialists (search, advisory, planning, review, docs, autonomy, vision, design). Installed as native Claude Code subagents in `~/.claude/agents/` by `oh-my-claudecode sync` — spawnable via the Agent tool, customizable via config. |
60
60
  | **Yith Archive** | Persistent cross-session memory with retrieval-based injection. Dozens of memory primitives: remember, search, consolidate, evict, crystallize, reflect, temporal graph, pattern extraction, and more. Exposed to Claude Code as a stdio MCP server with 7 tools. |
61
61
  | **Work-packet protocol** | LLM-requiring memory ops (consolidate, summarize, reflect, etc.) run in sessions with no API key — each function has a state-machine variant that emits prompts for the parent agent to execute with its own subscription auth. |
62
62
  | **Block Summarizer** | In-session delegation summarization with on-disk block archive |
63
- | **8 lifecycle hooks** | Auto-activation, memory redirect, continuous Yith capture, todo enforcement, completion loops, code-quality checks, rule injection, write guards |
63
+ | **11 lifecycle hooks** | Auto-activation, agent sync, memory redirect, continuous Yith capture (session start + every turn), todo enforcement, completion loops, code-quality checks, rule injection, write guards, research/design routing |
64
64
  | **10 slash commands** | Direct-invoke any mode or flow from the Claude Code chat bar |
65
65
  | **Intent gate** | Every user message is classified and routed before Cthulhu acts |
66
66
  | **Work plan system** | Multi-step planning flow with interview → scope → plan → review before execution |
67
67
  | **3-level config** | Defaults → user (`~/.claude/oh-my-claudecode.jsonc`) → project (`.claude/...`) with Zod validation and partial parsing |
68
68
  | **Background agent manager** | Circuit breaker, concurrency limits, task lifecycle tracking |
69
69
  | **Project activation** | `.elder-gods/` marker directory opts a project into Cthulhu mode — unrelated repos stay default Claude Code |
70
- | **Installer + doctor** | Interactive wizard, health diagnostics, agent listing |
70
+ | **Installer + doctor + dashboard** | OpenTUI install wizard, health diagnostics, and a full-screen stats/settings dashboard (`oh-my-claudecode dashboard`) |
71
71
  | **CI/CD** | GitHub Actions publishing pipeline with auto-bump, tag, release, and npm push |
72
72
 
73
73
  ## Installation
@@ -76,19 +76,26 @@ These aren't three plugins you pick and choose. They're one integrated system th
76
76
  npx oh-my-claudecode install
77
77
  ```
78
78
 
79
- The installer asks a few questions and then:
79
+ When [Bun](https://bun.sh) is installed, the questions come as a full-screen
80
+ OpenTUI wizard; otherwise plain prompts collect the same choices. The
81
+ installer then:
80
82
 
81
83
  1. Drops hook scripts into `~/.claude/hooks/`
82
84
  2. Registers them in `~/.claude/settings.json`
83
- 3. Registers the Yith Archive MCP server in `~/.claude.json`
85
+ 3. Registers the Yith Archive MCP server in `~/.claude.json`
84
86
  4. Copies slash command definitions to `~/.claude/commands/`
85
87
  5. Creates `~/.claude/oh-my-claudecode.jsonc` with sensible defaults
86
- 6. Leaves your existing Claude Code config intact (backup is made)
88
+ 6. Renders all 12 agent definitions into `~/.claude/agents/` (same as `oh-my-claudecode sync`)
89
+ 7. Downloads the local embedding model (~137 MB, progress bar) into `~/.oh-my-claudecode/models/` and verifies it with a probe embedding (opt-out `--no-model`)
90
+ 8. Installs a background ingestion cron (every 6h, opt-out) so the memory archive stays current even when Claude Code is closed
91
+ 9. Raises Claude Code's transcript retention (`cleanupPeriodDays: 365`, opt-out) so session history is never deleted before it's ingested
92
+ 10. Leaves your existing Claude Code config intact (backup is made)
87
93
 
88
94
  Non-interactive install (for CI or scripts):
89
95
 
90
96
  ```bash
91
- npx oh-my-claudecode install --no-tui
97
+ npx oh-my-claudecode install --no-tui # accept all defaults
98
+ npx oh-my-claudecode install --no-cron --no-retention # skip the durability extras
92
99
  ```
93
100
 
94
101
  ### Requirements
@@ -97,7 +104,13 @@ npx oh-my-claudecode install --no-tui
97
104
  - Node.js 20 or newer
98
105
  - `~/.claude/` directory writable
99
106
  - (Optional for Yith Archive summarization/consolidation) `ANTHROPIC_API_KEY` in `~/.oh-my-claudecode/yith/.env` or as an environment variable
100
- - (Optional for semantic memory retrieval) `@xenova/transformers` install with `npm install @xenova/transformers` if you want embedding-backed search instead of BM25-only
107
+ - (Optional for the `dashboard` TUI and the graphical install wizard) [Bun](https://bun.sh) — `npm install -g bun`. Everything else works without it.
108
+
109
+ Semantic memory retrieval needs nothing extra: `@huggingface/transformers` ships
110
+ as a bundled dependency and the local embedding model is downloaded during
111
+ install. If `npm install` fails inside `sharp` on a machine with a system-wide
112
+ libvips (some Arch/CachyOS setups), retry with
113
+ `SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install -g oh-my-claudecode`.
101
114
 
102
115
  ## Quick tour — what a session looks like
103
116
 
@@ -117,19 +130,26 @@ On your next session in the same project, steps 4 and the initial memory injecti
117
130
 
118
131
  ## Agent Roster
119
132
 
120
- | Elder God | Model | Mode | Role |
121
- |-----------|-------|------|------|
122
- | **Cthulhu** | Opus | primary | Main orchestrator — intent gate, delegation, parallel execution, verification |
123
- | **Nyarlathotep** | Opus | subagent | Deep autonomous worker — end-to-end goal execution |
124
- | **Azathoth** | Opus | primary | First-message planner — initial context sweep and routing |
125
- | **Shub-Niggurath** | Opus | primary | Strategic planner — interview → scope → plan → Tsathoggua review |
126
- | **Yog-Sothoth** | Opus | subagent | Architecture/debug advisor — read-only, high-reasoning consultation |
127
- | **Hastur** | Sonnet | subagent | Lightweight sub-orchestrator for bounded tasks |
128
- | **Ithaqua** | Sonnet | subagent | Pre-planning consultant — intent classification, anti-slop guardrails |
129
- | **Tsathoggua** | Sonnet | subagent | Work plan reviewer blocker-finder, not perfectionist |
130
- | **Dagon** | Sonnet | subagent | External documentation and GitHub source research |
131
- | **The Deep One** | Sonnet | subagent | Vision agent images, screenshots, diagrams |
132
- | **Shoggoth** | Haiku | subagent | Fast parallel codebase search |
133
+ Every agent below is installed as a real Claude Code subagent file in
134
+ `~/.claude/agents/<name>.md` — spawn any of them with the Agent tool
135
+ (`subagent_type: "<name>"`). `oh-my-claudecode sync` regenerates the files
136
+ from your config; the `agent-sync` hook re-runs it automatically at session
137
+ start so config edits land in the next session.
138
+
139
+ | Elder God | Model tier | Role |
140
+ |-----------|-----------|------|
141
+ | **Cthulhu** | Opus | Main orchestrator — intent gate, delegation, parallel execution, verification |
142
+ | **Nyarlathotep** | Opus | Deep autonomous workerend-to-end goal execution |
143
+ | **Azathoth** | Opus | First-message planner initial context sweep and routing |
144
+ | **Shub-Niggurath** | Opus | Strategic planner interview scope plan → Tsathoggua review |
145
+ | **Yog-Sothoth** | Opus | Architecture/debug advisor read-only, high-reasoning consultation |
146
+ | **Nodens** | Opus | Frontend design specialist — intent → spec → impl → polish, vision-capable |
147
+ | **Hastur** | Sonnet | Lightweight sub-orchestrator for bounded tasks |
148
+ | **Ithaqua** | Sonnet | Pre-planning consultant — intent classification, anti-slop guardrails |
149
+ | **Tsathoggua** | Sonnet | Work plan reviewer — blocker-finder, not perfectionist |
150
+ | **Dagon** | Sonnet | External documentation and GitHub source research |
151
+ | **The Deep One** | Sonnet | Vision agent — images, screenshots, diagrams |
152
+ | **Shoggoth** | Haiku | Fast parallel codebase search |
133
153
 
134
154
  ## Agent Behavior Enhancements (v0.2.6)
135
155
 
@@ -137,14 +157,17 @@ v0.2.6 introduces three orthogonal agent behavior improvements, all enabled by d
137
157
 
138
158
  ### Web Research Enforcement
139
159
 
140
- Agents automatically trigger web search when they encounter queries about:
160
+ When a conversation involves date-sensitive knowledge, the `web-research-detector`
161
+ PreToolUse hook detects it and injects a directive to spawn a **background Dagon
162
+ research agent** (Agent tool, `subagent_type: "dagon"`, `run_in_background: true`)
163
+ before answering — so current information lands in the context window instead of
164
+ a stale training-data guess. Trigger patterns include:
165
+
141
166
  - **Version checks**: "v1.0", "Node 18", "2024", "latest"
142
167
  - **API updates and breaking changes**: "what changed", "deprecated", "breaking"
143
168
  - **Framework release schedules**: "Next.js 15 coming soon", "LTS version"
144
- - **Security vulnerabilities**: CVE references, vulnerability announcements
145
- - **Package management**: npm audit patterns, outdated dependencies
146
169
 
147
- Powered by the PreToolUse hook which detects these patterns and injects a Dagon background research agent prompt before the user's message reaches the main orchestrator. Results are available in the context window for the agent to reference.
170
+ Active only in OMC-activated projects (`.elder-gods/` present).
148
171
 
149
172
  **Default**: Enabled
150
173
 
@@ -160,14 +183,19 @@ Powered by the PreToolUse hook which detects these patterns and injects a Dagon
160
183
 
161
184
  ### TypeScript Type Safety Linting
162
185
 
163
- Automatic validation enforces type safety across the codebase:
164
- - **Bans `any` types** — forces explicit typing or `unknown` with type guards
165
- - **Unsafe casts** — flags `as any` and `as unknown` patterns
166
- - **Missing return types** — detects functions without explicit return type annotations
167
- - **@ts-ignore without reason** — requires inline comments explaining suppression
168
- - **Auto-fix support** — safe violations can be fixed automatically via pre-commit hook
186
+ `oh-my-claudecode lint` is an AST-based type-safety linter:
187
+ - **Bans `any` types** — forces explicit typing or `unknown` with type guards (error)
188
+ - **Unsafe casts** — flags `as any` and `as unknown` (error); structured narrowing casts are allowed
189
+ - **Missing return types** — functions without explicit return type annotations (warn)
190
+ - **@ts-ignore without reason** — requires inline comments explaining suppression (warn)
191
+ - **Auto-fix support** — `lint --fix` repairs the mechanical violations (`: any` `: unknown`, `as any` → `as unknown`, bare `@ts-ignore` → reasoned)
192
+ - **Reasoned escape hatch** — a `@ts-safety: <reason>` comment on the violating line acknowledges an intentional exception
169
193
 
170
- The linter runs at pre-commit time and blocks unsafe code from entering the repository. Type safety metrics are exported for CI/CD dashboards to track compliance over time.
194
+ Run it at pre-commit time to block unsafe code from entering the repository
195
+ (`oh-my-claudecode lint --staged` exits 1 on errors — this repo's own
196
+ `.husky/pre-commit` does exactly that), and export metrics for CI/CD
197
+ dashboards with `lint --metrics <path>` (score percentage, issue counts by
198
+ rule, trend-comparable JSON snapshots).
171
199
 
172
200
  **Default**: Enabled
173
201
 
@@ -183,14 +211,19 @@ The linter runs at pre-commit time and blocks unsafe code from entering the repo
183
211
 
184
212
  ### Nodens — Design Specialization Agent
185
213
 
186
- A dedicated design agent routes UI/component design tasks and provides:
187
- - **Accessibility automation**: WCAG compliance testing, keyboard navigation, screen reader support via Axe-core
188
- - **Responsive design**: Automatically generates component variants for multiple breakpoints
189
- - **Playwright test generation**: Creates visual regression and interaction tests
190
- - **Figma integration**: Extracts design tokens (colors, typography, spacing) from Figma files
191
- - **Vision capability**: Analyzes screenshots and design mockups with Claude Opus
214
+ Nodens is a real Claude Code subagent (installed at `~/.claude/agents/nodens.md`,
215
+ Opus tier) with a design-first system prompt covering:
216
+ - **Accessibility**: WCAG compliance checks, keyboard navigation, screen-reader
217
+ support run via Axe-core/tooling through its Bash access
218
+ - **Responsive design**: component variants across breakpoints
219
+ - **Playwright test generation**: visual regression and interaction tests
220
+ - **Figma awareness**: design-token extraction (colors, typography, spacing)
221
+ - **Vision capability**: analyzes screenshots and design mockups (Opus tier)
192
222
 
193
- When design-related queries are detected (via the design-detector hook), they are automatically routed to Nodens instead of the general orchestrator. Nodens has a design-first system prompt and specialized tools for component generation, accessibility testing, and design token management.
223
+ When design-related queries are detected, the design-detector hook injects a
224
+ routing directive telling the session to delegate the task to Nodens
225
+ (`Agent` tool, `subagent_type: "nodens"`) instead of handling the design
226
+ inline. Active only in OMC-activated projects.
194
227
 
195
228
  **Default**: Enabled
196
229
 
@@ -283,11 +316,34 @@ work-packet loop. Either:
283
316
 
284
317
  - Open Claude Code and run `/necronomicon-bind` — uses your
285
318
  subscription auth via the MCP work-packet protocol.
286
- - Or install a cron entry that spawns `claude -p` on an interval:
287
- ```bash
288
- oh-my-claudecode bind --install-cron --interval 1h
289
- ```
290
- The cron tick drives compression unattended. No API key needed.
319
+ - Or rely on the ingestion cron (installed by default during
320
+ `oh-my-claudecode install`; reinstall or retune with
321
+ `oh-my-claudecode bind --install-cron --interval 6h`). The cron tick
322
+ ingests new transcripts and drives compression unattended via
323
+ `claude -p`. No API key needed.
324
+
325
+ ### Capture durability
326
+
327
+ Three mechanisms guarantee session history reaches the archive before
328
+ Claude Code's transcript cleanup can delete it:
329
+
330
+ 1. **Session hooks** — `yith-capture` ingests at session start, after
331
+ every assistant turn, immediately before context compaction, and when
332
+ a session ends (`/clear`, exit) — so neither forced compaction nor a
333
+ manual clear can lose anything: the full pre-compaction transcript is
334
+ already in the archive, and the post-compact/post-clear session can
335
+ recall it with `yith_search`. Compression drains when the queue passes
336
+ 20 observations or any observation sits raw for 24 hours.
337
+ 2. **Background cron** — the default 6-hour `bind --resume` tick captures
338
+ even when Claude Code never opens.
339
+ 3. **Retention raise** — the installer sets `cleanupPeriodDays: 365` in
340
+ Claude Code's settings (with your consent) so the deletion window can
341
+ never outrun ingestion.
342
+
343
+ Every successful transcript ingestion stamps a health beacon
344
+ (`~/.oh-my-claudecode/yith/.last-bind-success`). `oh-my-claudecode doctor`
345
+ and the Cthulhu session preflight warn when the beacon is stale, the CLI is
346
+ missing, or the cron is gone — capture can't silently break.
291
347
 
292
348
  ### Work-packet protocol — LLM ops without an API key
293
349
 
@@ -336,7 +392,8 @@ Yith Archive reads its own variables from `~/.oh-my-claudecode/yith/.env` (or th
336
392
  | Variable | Purpose |
337
393
  |---|---|
338
394
  | `ANTHROPIC_API_KEY` | LLM calls for summarization, consolidation, reflection |
339
- | `EMBEDDING_PROVIDER` | `xenova` for local embeddings, unset for BM25-only |
395
+ | `EMBEDDING_PROVIDER` | `local` (default install pins it) or an explicit hosted opt-in: `gemini`/`openai`/`voyage`/`cohere`/`openrouter` with the matching API key. Ambient API keys in your shell are deliberately ignored — your session history never routes through a hosted API unless you ask. |
396
+ | `YITH_MODEL_CACHE` | Where the local model lives (default `~/.oh-my-claudecode/models`) |
340
397
  | `AUTO_FORGET_ENABLED` | `false` to disable background eviction sweeps |
341
398
  | `CONSOLIDATION_ENABLED` | `false` to disable automatic memory consolidation |
342
399
  | `YITH_GRAPH_WEIGHT` | Weight of graph retrieval in hybrid search (default `0.3`) |
@@ -390,18 +447,21 @@ After installation these are available in Claude Code sessions:
390
447
 
391
448
  ## Lifecycle Hooks
392
449
 
393
- 8 hooks are installed into Claude Code's `settings.json`. They provide the connective tissue between OMC's subsystems and the live session.
394
-
395
- | Hook | Event | Description |
396
- |------|-------|-------------|
397
- | `cthulhu-auto` | SessionStart | Auto-activate Cthulhu orchestrator mode when `.elder-gods/` is present in the project |
398
- | `memory-override` | SessionStart | Redirect persistent memory writes from Claude Code's built-in auto-memory to Yith Archive |
399
- | `yith-capture` | Stop | Continuous Yith ingestion after every assistant turn, spawns a background `bind --resume --claude-only` to pull new transcript lines into the archive, and occasionally spawns `claude -p` to drain pending compression when the queue grows past threshold. Debounced; non-blocking; fail-safe. |
400
- | `todo-continuation` | Stop | Inject a reminder to continue if incomplete todos exist when stopping |
401
- | `elder-loop` | Stop | Self-referential completion loop keeps running until the promise is met |
402
- | `comment-checker` | PostToolUse | Warn when AI-slop comments are introduced (comments that explain obvious code) |
403
- | `rules-injector` | PreToolUse | Auto-inject `.elder-gods/rules/*.md` into every agent's context |
404
- | `write-guard` | PreToolUse | Warn when `Write` is used on an existing file (suggest `Edit` instead) |
450
+ 11 hooks are installed into Claude Code's `settings.json`. They provide the connective tissue between OMC's subsystems and the live session. Hooks marked **scoped** only act in OMC-activated projects (`.elder-gods/` present) — unrelated repos keep stock Claude Code behavior. `yith-capture` and `agent-sync` are deliberately global: memory capture and agent freshness apply machine-wide.
451
+
452
+ | Hook | Event | Scope | Description |
453
+ |------|-------|-------|-------------|
454
+ | `cthulhu-auto` | SessionStart | scoped | Auto-activate Cthulhu orchestrator mode; reports Necronomicon binding state and capture health |
455
+ | `memory-override` | SessionStart | scoped | Redirect persistent memory writes from Claude Code's built-in auto-memory to Yith Archive |
456
+ | `agent-sync` | SessionStart | global | Re-render `~/.claude/agents/` (and project-level overrides) in the background so config edits land in the next session |
457
+ | `yith-capture` | SessionStart + Stop + PreCompact + SessionEnd | global | Continuous Yith ingestion — at session start, after every assistant turn, immediately before context compaction, and when the session ends (`/clear`, exit), spawns a background `bind --resume --claude-only` to pull new transcript lines into the archive, and spawns `claude -p` to drain pending compression when the queue passes 20 observations or sits raw for 24h. PreCompact/SessionEnd bypass the debounce. Non-blocking; fail-safe. |
458
+ | `todo-continuation` | Stop | global | Inject a reminder to continue if incomplete todos exist when stopping |
459
+ | `elder-loop` | Stop | self-gating | Self-referential completion loop acts only while a loop you started via `/elder-loop` is active |
460
+ | `comment-checker` | PostToolUse | scoped | Warn when AI-slop comments are introduced (comments that explain obvious code) |
461
+ | `rules-injector` | PreToolUse | scoped | Auto-inject `.elder-gods/rules/*.md` into every agent's context |
462
+ | `write-guard` | PreToolUse | scoped | Warn when `Write` is used on an existing file (suggest `Edit` instead) |
463
+ | `web-research-detector` | PreToolUse | scoped | Detect date-sensitive queries and direct a background Dagon research spawn |
464
+ | `design-detector` | PreToolUse | scoped | Detect design/frontend tasks and direct routing to Nodens |
405
465
 
406
466
  Disable specific hooks via config:
407
467
 
@@ -429,6 +489,14 @@ Turn auto-activation off globally with:
429
489
 
430
490
  Config file: `~/.claude/oh-my-claudecode.jsonc` (user-level) and/or `.claude/oh-my-claudecode.jsonc` (project-level). Project config overrides user config for scalar and object fields. Array fields like `disabled_*` are unioned across levels.
431
491
 
492
+ Agent settings are applied by `oh-my-claudecode sync` (run automatically at
493
+ install and by the `agent-sync` hook at session start): user-level config
494
+ renders into `~/.claude/agents/`, and project-level agent overrides render
495
+ into the project's `.claude/agents/`, where they shadow the user-level agent
496
+ of the same name. One limitation: an agent can be disabled machine-wide
497
+ (`disabled_agents` at user level) but not per-project — Claude Code's project
498
+ agents shadow, they don't remove.
499
+
432
500
  ```jsonc
433
501
  {
434
502
  // Override models for specific agents
@@ -464,13 +532,14 @@ Config file: `~/.claude/oh-my-claudecode.jsonc` (user-level) and/or `.claude/oh-
464
532
 
465
533
  ### Available models
466
534
 
467
- Only Claude models are supported:
535
+ Only Claude models are supported. Agent definitions use the tier aliases
536
+ `opus` / `sonnet` / `haiku` — Claude Code resolves each alias to the current
537
+ model of that tier at runtime, so installed agents never go stale when a new
538
+ model ships. To pin an exact snapshot, set a full `claude-*` model ID in the
539
+ agent's `model` field instead; it passes through verbatim.
468
540
 
469
- | Short Alias | Full Model ID |
470
- |-------------|--------------|
471
- | `opus` | `claude-opus-4-6` |
472
- | `sonnet` | `claude-sonnet-4-6` |
473
- | `haiku` | `claude-haiku-4-5` |
541
+ After editing config, run `oh-my-claudecode sync` (or just start a new
542
+ session — the `agent-sync` hook re-renders automatically).
474
543
 
475
544
  ## Project-Level Setup
476
545
 
@@ -511,6 +580,34 @@ Use `/invoke-shub` to start the planning flow:
511
580
 
512
581
  Use `/old-ones-init` to generate `AGENTS.md` files at the root and in key subdirectories. These give every agent project context at a glance, without repeated exploration and without consuming tool-budget on re-discovery.
513
582
 
583
+ ## Dashboard
584
+
585
+ ```bash
586
+ oh-my-claudecode dashboard
587
+ ```
588
+
589
+ A full-screen control panel rendered with [OpenTUI](https://opentui.com) (the
590
+ terminal UI engine behind opencode) — gruvbox dark soft, a colorized ASCII
591
+ wordmark splash, and a calm editorial layout: health is a one-line verdict,
592
+ detail is opt-in. Four tabs:
593
+
594
+ - **Overview** — archive counts (memories, observations, sessions, pending
595
+ compression), embedding provider and model-cache size, capture health with
596
+ last-ingest age, disk usage, and binding-ritual phase states
597
+ - **Doctor** — the verdict plus only the checks that need attention
598
+ (`a` reveals the full suite)
599
+ - **Agents** — the Elder God roster with model tier, category, cost, and
600
+ install state
601
+ - **Settings** — toggle the three pillars, individual hooks, and individual
602
+ agents with the keyboard; changes write `~/.claude/oh-my-claudecode.jsonc`
603
+ and re-sync agents automatically
604
+
605
+ Keys: `←→`/`1-4` tabs · `↑↓` select · `enter` toggle · `a` all checks ·
606
+ `r` refresh · `q` quit.
607
+ Requires Bun (`npm install -g bun`) for OpenTUI's native renderer — the
608
+ command tells you exactly that if Bun is missing. `oh-my-claudecode stats
609
+ [--json]` prints the same data headlessly.
610
+
514
611
  ## Diagnostics
515
612
 
516
613
  ```bash
@@ -523,17 +620,23 @@ Checks:
523
620
  - `settings.json` present
524
621
  - All hook scripts installed
525
622
  - Hooks registered in settings
623
+ - Agent definitions installed and in sync with config
526
624
  - Slash commands installed
527
625
  - Plugin config valid
626
+ - Yith archive boots; MCP server registered in `~/.claude.json`
627
+ - Background ingestion cron installed
628
+ - Capture health — when transcript ingestion last succeeded
629
+ - Transcript retention window (`cleanupPeriodDays`) high enough that history can't be deleted before ingestion
528
630
 
529
631
  ## Project Structure
530
632
 
531
633
  ```
532
634
  oh-my-claudecode/
533
635
  ├── src/
534
- │ ├── agents/ # 11 Elder God agent definitions + builder
636
+ │ ├── agents/ # 12 Elder God agent definitions + builder + markdown renderer
535
637
  │ ├── config/ # Zod schema — full type system
536
638
  │ ├── hooks/ # Lifecycle hook scripts and configs
639
+ │ ├── linters/ # AST type-safety linter (lint CLI engine)
537
640
  │ ├── features/
538
641
  │ │ ├── yith-archive/ # Persistent cross-session memory (~14k LOC)
539
642
  │ │ │ ├── functions/ # 40+ memory primitives
@@ -547,9 +650,8 @@ oh-my-claudecode/
547
650
  │ │ ├── background-agent/ # BackgroundManager (circuit breaker, concurrency)
548
651
  │ │ ├── skill-loader/ # Discovers user skills from .claude/skills/
549
652
  │ │ └── mcp-manager/ # Skill-scoped MCP lifecycle
550
- │ ├── plugin-handlers/ # 5-phase config pipeline
551
653
  │ ├── shared/ # Logging, deep-merge, model resolution
552
- │ └── cli/ # Installer, doctor, list-agents
654
+ │ └── cli/ # Installer, sync, doctor, lint, bind, list-agents
553
655
  ├── commands/ # Markdown slash commands (installed to ~/.claude/commands/)
554
656
  ├── CHANGELOG.md # Release history
555
657
  ├── LICENSE # MIT
@@ -42,6 +42,9 @@ Use the Agent tool with these subagent_type values:
42
42
  | Nyarlathotep | "nyarlathotep" | End-to-end autonomous execution |
43
43
  | Shub-Niggurath | "shub-niggurath" | Strategic planning (interview → plan → tsathoggua review) |
44
44
  | The Deep One | "the-deep-one" | Image/screenshot/diagram analysis |
45
+ | Nodens | "nodens" | Frontend/UI design and component work |
46
+
47
+ If a spawn fails with "Agent type not found", the agent definitions are missing — tell the user to run `oh-my-claudecode sync` and continue inline for now.
45
48
 
46
49
  ## Operating Mode
47
50
 
@@ -52,7 +55,12 @@ For the current request from the user:
52
55
  3. **Act accordingly**:
53
56
  - Trivial → direct tools
54
57
  - Exploratory → parallel Shoggoth agents (run_in_background=true)
55
- - Implementation plandelegate or execute
58
+ - Implementation, small (single file, obvious change) todos, then execute directly
59
+ - Implementation, substantial (2+ files, new feature, refactor, unclear scope) → the
60
+ pipeline is MANDATORY: spawn "shub-niggurath" to write a plan into `.elder-gods/plans/`,
61
+ spawn "tsathoggua" to review it, fix any blockers, then execute the approved plan,
62
+ delegating to specialists per its steps
63
+ - Design/UI work → delegate to "nodens"
56
64
  - Ambiguous → one clarifying question
57
65
 
58
66
  Begin now.
@@ -20,7 +20,8 @@ First, create the `.elder-gods/plans/` directory if it doesn't exist.
20
20
  Then, survey the codebase:
21
21
  - Read AGENTS.md or CLAUDE.md if present
22
22
  - Identify the area of the codebase relevant to the user's request
23
- - Find existing patterns to follow
23
+ - Find existing patterns to follow (spawn parallel `subagent_type: "shoggoth"` agents
24
+ via the Agent tool when the area is unfamiliar)
24
25
 
25
26
  Then ask the user:
26
27
  1. What is the exact goal? (one sentence)
@@ -29,4 +30,9 @@ Then ask the user:
29
30
  4. How do we verify it's done? (specific test/command)
30
31
  5. Any other constraints?
31
32
 
32
- After receiving answers, create the work plan and proceed with Tsathoggua review.
33
+ After receiving answers, write the work plan to `.elder-gods/plans/[task-name].md`,
34
+ then spawn a real reviewer: Agent tool, `subagent_type: "tsathoggua"`, with the plan
35
+ path and a pointer to the surveyed files. Tsathoggua returns OKAY or REJECT with at
36
+ most 3 blocking issues — fix blockers and re-review until OKAY, then hand off to
37
+ Cthulhu for execution. If a spawn fails with "Agent type not found", tell the user
38
+ to run `oh-my-claudecode sync` and perform that role inline as a fallback.
@@ -3,32 +3,22 @@ name: shoggoth
3
3
  description: Invoke Shoggoth — formless codebase search entity. Fast parallel pattern matching. Find files, code, implementations. Fire multiple in parallel.
4
4
  ---
5
5
 
6
- You are Shoggoth a formless pattern-matcher flowing through the codebase.
6
+ Run the user's search through real Shoggoth subagents.
7
7
 
8
- **Mission**: Find files and code. Return actionable results.
8
+ **Search brief**: $ARGUMENTS
9
9
 
10
- **Immediate action**: Launch 3+ parallel searches for the user's request.
10
+ **How**:
11
11
 
12
- **Required output format**:
12
+ 1. Break the brief into distinct search angles (by keyword, by file pattern, by
13
+ module, by usage site). One angle = one agent.
14
+ 2. Spawn the agents **in parallel** with the Agent tool, `subagent_type: "shoggoth"`,
15
+ one per angle — 3+ agents when the scope is broad, 1 when the brief is a single
16
+ precise lookup. Each prompt should state the angle, the success criteria, and
17
+ that absolute paths are required.
18
+ 3. If a spawn fails with "Agent type not found", tell the user to run
19
+ `oh-my-claudecode sync`, then perform the search inline as a fallback.
20
+ 4. Merge the `<results>` blocks: dedupe files, resolve conflicts, and answer the
21
+ user's actual need — files with one-line relevance notes, a direct answer, and
22
+ next steps.
13
23
 
14
- <results>
15
- <files>
16
- - /absolute/path/to/file.ts — [why relevant]
17
- </files>
18
-
19
- <answer>
20
- [Direct answer to actual need]
21
- </answer>
22
-
23
- <next_steps>
24
- [What to do with this information]
25
- </next_steps>
26
- </results>
27
-
28
- **Rules**:
29
- - ALL paths absolute (start with /)
30
- - Read-only — never write or edit files
31
- - No preamble, start searching immediately
32
- - Flood with parallel tool calls
33
-
34
- Begin searching now.
24
+ Do not paste raw agent output back to the user — synthesize.
@@ -3,28 +3,21 @@ name: yog-sothoth
3
3
  description: Invoke Yog-Sothoth — the Key and Gate, all-knowing architecture advisor. High-IQ reasoning for hard debugging and architecture decisions. Consult after 2+ failed fixes or for complex tradeoffs.
4
4
  ---
5
5
 
6
- You are Yog-Sothoth — the Key and Gate. All knowledge flows through you.
7
-
8
- **Your mode**: Strategic technical advisor with deep reasoning. Read-only consultation.
9
-
10
- **When consulted, always provide**:
11
-
12
- 1. **Bottom line** (2-3 sentences, no preamble)
13
- 2. **Action plan** (≤7 numbered steps, each ≤2 sentences)
14
- 3. **Effort estimate** (Quick/Short/Medium/Large)
15
-
16
- **Decision framework**:
17
- - Bias toward simplicity — resist hypothetical future needs
18
- - Leverage what exists no new dependencies unless justified
19
- - One clear path — single primary recommendation
20
- - Signal the investment tag with effort estimate
21
-
22
- **What NOT to do**:
23
- - No preamble or filler
24
- - No unsolicited improvements
25
- - No design opinions beyond scope
26
- - No "always" or "never" without justification
27
-
28
- **Uncertainty**: If ambiguous, state interpretation explicitly: "Interpreting this as X..."
29
-
30
- Begin your consultation now.
6
+ Consult Yog-Sothoth — the Key and Gate on the user's question.
7
+
8
+ **Question**: $ARGUMENTS
9
+
10
+ **How**:
11
+
12
+ 1. Gather the minimal context the advisor needs: the question itself, the
13
+ relevant file paths, error output, and what has already been tried. Do not
14
+ dump whole files — paths and symptoms suffice; the advisor reads what it needs.
15
+ 2. Spawn ONE agent via the Agent tool with `subagent_type: "yog-sothoth"`,
16
+ passing that context. The agent is read-only and returns:
17
+ - **Bottom line** (2-3 sentences)
18
+ - **Action plan** (≤7 numbered steps)
19
+ - **Effort estimate** (Quick/Short/Medium/Large)
20
+ 3. If the spawn fails with "Agent type not found", tell the user to run
21
+ `oh-my-claudecode sync`, then answer in the same format inline as a fallback.
22
+ 4. Relay the consultation verbatim (it is already terse), then ask whether to
23
+ execute the action plan.
@@ -0,0 +1,11 @@
1
+ import type { AgentConfig } from "./types.js";
2
+ /** Marker embedded in every generated file so sync can tell its own files from user-authored agents. */
3
+ export declare const GENERATED_MARKER = "generated-by: oh-my-claudecode";
4
+ /**
5
+ * Convert an AgentConfig tools map into the frontmatter allow-list string.
6
+ * Returns null when the agent should inherit all tools (no real denials).
7
+ */
8
+ export declare function frontmatterTools(tools: AgentConfig["tools"]): string | null;
9
+ /** Render one agent definition as a Claude Code agent markdown file. */
10
+ export declare function renderAgentMarkdown(config: AgentConfig, version: string): string;
11
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/agents/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAkC7C,wGAAwG;AACxG,eAAO,MAAM,gBAAgB,mCAAmC,CAAA;AAEhE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAU3E;AAOD,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAiBhF"}
@@ -0,0 +1,69 @@
1
+ import { resolveModel } from "../shared/model-resolution.js";
2
+ /**
3
+ * Renders AgentConfig objects into Claude Code custom-agent markdown files
4
+ * (the `~/.claude/agents/*.md` format: YAML frontmatter with name /
5
+ * description / tools / model, body = system prompt).
6
+ *
7
+ * This is the bridge that turns the in-repo agent definitions into agents
8
+ * Claude Code can actually spawn via `Agent(subagent_type: "<name>")`.
9
+ */
10
+ /**
11
+ * Tool names Claude Code can grant to a subagent via the frontmatter
12
+ * `tools:` allow-list. AgentConfig uses a deny-style map, so we convert:
13
+ * allow-list = universe minus denied. Agents that deny nothing omit the
14
+ * field entirely and inherit every tool (including future ones).
15
+ */
16
+ const TOOL_UNIVERSE = [
17
+ "Bash",
18
+ "Glob",
19
+ "Grep",
20
+ "Read",
21
+ "Edit",
22
+ "Write",
23
+ "WebFetch",
24
+ "WebSearch",
25
+ "TodoWrite",
26
+ "Task",
27
+ ];
28
+ /** AgentConfig calls the subagent-spawning tool "Agent"; frontmatter calls it "Task". */
29
+ const TOOL_NAME_MAP = { Agent: "Task" };
30
+ /** Marker embedded in every generated file so sync can tell its own files from user-authored agents. */
31
+ export const GENERATED_MARKER = "generated-by: oh-my-claudecode";
32
+ /**
33
+ * Convert an AgentConfig tools map into the frontmatter allow-list string.
34
+ * Returns null when the agent should inherit all tools (no real denials).
35
+ */
36
+ export function frontmatterTools(tools) {
37
+ if (!tools)
38
+ return null;
39
+ const denied = new Set(Object.entries(tools)
40
+ .filter(([, allowed]) => allowed === false)
41
+ .map(([name]) => TOOL_NAME_MAP[name] ?? name));
42
+ const allowed = TOOL_UNIVERSE.filter((t) => !denied.has(t));
43
+ if (allowed.length === TOOL_UNIVERSE.length)
44
+ return null;
45
+ return allowed.join(", ");
46
+ }
47
+ /** Collapse a description to a single YAML-safe line. */
48
+ function oneLine(text) {
49
+ return text.replace(/\s+/g, " ").trim();
50
+ }
51
+ /** Render one agent definition as a Claude Code agent markdown file. */
52
+ export function renderAgentMarkdown(config, version) {
53
+ const lines = ["---"];
54
+ lines.push(`name: ${config.name}`);
55
+ lines.push(`description: ${JSON.stringify(oneLine(config.description))}`);
56
+ const tools = frontmatterTools(config.tools);
57
+ if (tools)
58
+ lines.push(`tools: ${tools}`);
59
+ lines.push(`model: ${resolveModel(config.model)}`);
60
+ lines.push("---");
61
+ lines.push("");
62
+ lines.push(`<!-- ${GENERATED_MARKER} v${version} — regenerated by \`oh-my-claudecode sync\`. ` +
63
+ `Do not edit by hand: customize via ~/.claude/oh-my-claudecode.jsonc instead. -->`);
64
+ lines.push("");
65
+ lines.push(config.prompt.trim());
66
+ lines.push("");
67
+ return lines.join("\n");
68
+ }
69
+ //# sourceMappingURL=render.js.map