oh-my-claudecode 0.2.8 → 0.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +170 -68
- package/commands/cthulhu.md +9 -1
- package/commands/invoke-shub.md +8 -2
- package/commands/shoggoth.md +15 -25
- package/commands/yog-sothoth.md +18 -25
- package/dist/agents/render.d.ts +11 -0
- package/dist/agents/render.d.ts.map +1 -0
- package/dist/agents/render.js +69 -0
- package/dist/agents/render.js.map +1 -0
- package/dist/cli/dashboard.d.ts +12 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +58 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/doctor.d.ts +11 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +163 -9
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.js +72 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/install.d.ts +6 -0
- package/dist/cli/install.d.ts.map +1 -1
- package/dist/cli/install.js +211 -44
- package/dist/cli/install.js.map +1 -1
- package/dist/cli/lint.d.ts +26 -0
- package/dist/cli/lint.d.ts.map +1 -0
- package/dist/cli/lint.js +86 -0
- package/dist/cli/lint.js.map +1 -0
- package/dist/cli/stats.d.ts +56 -0
- package/dist/cli/stats.d.ts.map +1 -0
- package/dist/cli/stats.js +197 -0
- package/dist/cli/stats.js.map +1 -0
- package/dist/cli/sync.d.ts +44 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +154 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/config/schema.d.ts +337 -331
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +14 -10
- package/dist/config/schema.js.map +1 -1
- package/dist/features/block-summarizer/index.js +1 -0
- package/dist/features/block-summarizer/index.js.map +1 -1
- package/dist/features/yith-archive/config.d.ts.map +1 -1
- package/dist/features/yith-archive/config.js +11 -15
- package/dist/features/yith-archive/config.js.map +1 -1
- package/dist/features/yith-archive/eval/schemas.d.ts +2 -2
- package/dist/features/yith-archive/functions/migrate.d.ts.map +1 -1
- package/dist/features/yith-archive/functions/migrate.js +7 -3
- package/dist/features/yith-archive/functions/migrate.js.map +1 -1
- package/dist/features/yith-archive/functions/opencode-import.d.ts.map +1 -1
- package/dist/features/yith-archive/functions/opencode-import.js +54 -27
- package/dist/features/yith-archive/functions/opencode-import.js.map +1 -1
- package/dist/features/yith-archive/functions/smart-search.js.map +1 -1
- package/dist/features/yith-archive/functions/temporal-graph.d.ts.map +1 -1
- package/dist/features/yith-archive/functions/temporal-graph.js +1 -0
- package/dist/features/yith-archive/functions/temporal-graph.js.map +1 -1
- package/dist/features/yith-archive/providers/embedding/local.d.ts +16 -5
- package/dist/features/yith-archive/providers/embedding/local.d.ts.map +1 -1
- package/dist/features/yith-archive/providers/embedding/local.js +29 -11
- package/dist/features/yith-archive/providers/embedding/local.js.map +1 -1
- package/dist/features/yith-archive/state/fake-sdk.d.ts.map +1 -1
- package/dist/features/yith-archive/state/fake-sdk.js.map +1 -1
- package/dist/features/yith-archive/state/reranker.d.ts.map +1 -1
- package/dist/features/yith-archive/state/reranker.js +9 -2
- package/dist/features/yith-archive/state/reranker.js.map +1 -1
- package/dist/features/yith-archive/state/vector-index.d.ts.map +1 -1
- package/dist/features/yith-archive/state/vector-index.js +1 -0
- package/dist/features/yith-archive/state/vector-index.js.map +1 -1
- package/dist/hooks/agent-sync.d.ts +16 -0
- package/dist/hooks/agent-sync.d.ts.map +1 -0
- package/dist/hooks/agent-sync.js +42 -0
- package/dist/hooks/agent-sync.js.map +1 -0
- package/dist/hooks/comment-checker.d.ts +1 -1
- package/dist/hooks/comment-checker.d.ts.map +1 -1
- package/dist/hooks/comment-checker.js +10 -0
- package/dist/hooks/comment-checker.js.map +1 -1
- package/dist/hooks/cthulhu-auto.d.ts +1 -1
- package/dist/hooks/cthulhu-auto.d.ts.map +1 -1
- package/dist/hooks/cthulhu-auto.js +77 -8
- package/dist/hooks/cthulhu-auto.js.map +1 -1
- package/dist/hooks/cthulhu-preflight.d.ts.map +1 -1
- package/dist/hooks/cthulhu-preflight.js +6 -5
- package/dist/hooks/cthulhu-preflight.js.map +1 -1
- package/dist/hooks/design-detector-hook.d.ts +6 -5
- package/dist/hooks/design-detector-hook.d.ts.map +1 -1
- package/dist/hooks/design-detector-hook.js +27 -8
- package/dist/hooks/design-detector-hook.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +43 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/web-research-hook.d.ts +6 -5
- package/dist/hooks/web-research-hook.d.ts.map +1 -1
- package/dist/hooks/web-research-hook.js +30 -9
- package/dist/hooks/web-research-hook.js.map +1 -1
- package/dist/hooks/write-guard.d.ts +1 -1
- package/dist/hooks/write-guard.d.ts.map +1 -1
- package/dist/hooks/write-guard.js +10 -0
- package/dist/hooks/write-guard.js.map +1 -1
- package/dist/hooks/yith-capture.d.ts +9 -3
- package/dist/hooks/yith-capture.d.ts.map +1 -1
- package/dist/hooks/yith-capture.js +43 -14
- package/dist/hooks/yith-capture.js.map +1 -1
- package/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/dist/linters/type-safety-ast.d.ts.map +1 -1
- package/dist/linters/type-safety-ast.js +42 -24
- package/dist/linters/type-safety-ast.js.map +1 -1
- package/dist/shared/ascii-logo.d.ts +24 -0
- package/dist/shared/ascii-logo.d.ts.map +1 -0
- package/dist/shared/ascii-logo.js +77 -0
- package/dist/shared/ascii-logo.js.map +1 -0
- package/dist/shared/model-resolution.d.ts +19 -6
- package/dist/shared/model-resolution.d.ts.map +1 -1
- package/dist/shared/model-resolution.js +25 -12
- package/dist/shared/model-resolution.js.map +1 -1
- package/package.json +9 -6
- package/tui/dashboard.tsx +504 -0
- package/tui/data.ts +178 -0
- package/tui/theme.ts +51 -0
- package/tui/tsconfig.json +15 -0
- package/tui/wizard.tsx +219 -0
- package/dist/plugin-handlers/config-handler.d.ts +0 -21
- package/dist/plugin-handlers/config-handler.d.ts.map +0 -1
- package/dist/plugin-handlers/config-handler.js +0 -33
- package/dist/plugin-handlers/config-handler.js.map +0 -1
- package/dist/plugin-handlers/index.d.ts +0 -2
- package/dist/plugin-handlers/index.d.ts.map +0 -1
- package/dist/plugin-handlers/index.js +0 -2
- 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
|
|
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
|
-
│ │
|
|
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
|
-
| **
|
|
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
|
-
| **
|
|
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** |
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
|
127
|
-
|
|
128
|
-
| **
|
|
129
|
-
| **
|
|
130
|
-
| **
|
|
131
|
-
| **
|
|
132
|
-
| **
|
|
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 worker — end-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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
164
|
-
- **Bans `any` types** — forces explicit typing or `unknown` with type guards
|
|
165
|
-
- **Unsafe casts** — flags `as any` and `as unknown`
|
|
166
|
-
- **Missing return types** —
|
|
167
|
-
- **@ts-ignore without reason** — requires inline comments explaining suppression
|
|
168
|
-
- **Auto-fix support** —
|
|
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
|
-
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
- **
|
|
189
|
-
|
|
190
|
-
- **
|
|
191
|
-
- **
|
|
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
|
|
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
|
|
287
|
-
|
|
288
|
-
oh-my-claudecode bind --install-cron --interval
|
|
289
|
-
|
|
290
|
-
|
|
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` | `
|
|
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
|
-
|
|
394
|
-
|
|
395
|
-
| Hook | Event | Description |
|
|
396
|
-
|
|
397
|
-
| `cthulhu-auto` | SessionStart | Auto-activate Cthulhu orchestrator mode
|
|
398
|
-
| `memory-override` | SessionStart | Redirect persistent memory writes from Claude Code's built-in auto-memory to Yith Archive |
|
|
399
|
-
| `
|
|
400
|
-
| `
|
|
401
|
-
| `
|
|
402
|
-
| `
|
|
403
|
-
| `
|
|
404
|
-
| `
|
|
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
|
-
|
|
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/ #
|
|
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
|
package/commands/cthulhu.md
CHANGED
|
@@ -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
|
|
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.
|
package/commands/invoke-shub.md
CHANGED
|
@@ -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,
|
|
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.
|
package/commands/shoggoth.md
CHANGED
|
@@ -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
|
-
|
|
6
|
+
Run the user's search through real Shoggoth subagents.
|
|
7
7
|
|
|
8
|
-
**
|
|
8
|
+
**Search brief**: $ARGUMENTS
|
|
9
9
|
|
|
10
|
-
**
|
|
10
|
+
**How**:
|
|
11
11
|
|
|
12
|
-
|
|
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
|
-
|
|
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.
|
package/commands/yog-sothoth.md
CHANGED
|
@@ -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
|
-
|
|
7
|
-
|
|
8
|
-
**
|
|
9
|
-
|
|
10
|
-
**
|
|
11
|
-
|
|
12
|
-
1.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|