110b1e3d2d
* refactor(keyword-detector): split constants into domain-specific modules * feat(shared): add requiresAnyModel and isAnyFallbackModelAvailable * feat(config): add hephaestus to agent schemas * feat(agents): add Hephaestus autonomous deep worker * feat(cli): update model-fallback for hephaestus support * feat(plugin): add hephaestus to config handler with ordering * test(delegate-task): update tests for hephaestus agent * docs: update AGENTS.md files for hephaestus * docs: add hephaestus to READMEs * chore: regenerate config schema * fix(delegate-task): bypass requiresModel check when user provides explicit config * docs(hephaestus): add 4-part context structure for explore/librarian prompts * docs: fix review comments from cubic (non-breaking changes) - Move Hephaestus from Primary Agents to Subagents (uses own fallback chain) - Fix Hephaestus fallback chain documentation (claude-opus-4-5 → gemini-3-pro) - Add settings.local.json to claude-code-hooks config sources - Fix delegate_task parameters in ultrawork prompt (agent→subagent_type, background→run_in_background, add load_skills) - Update line counts in AGENTS.md (index.ts: 788, manager.ts: 1440) * docs: fix additional documentation inconsistencies from oracle review - Fix delegate_task parameters in Background Agents example (docs/features.md) - Fix Hephaestus fallback chain in root AGENTS.md to match model-requirements.ts * docs: clarify Hephaestus has no fallback (requires gpt-5.2-codex only) Hephaestus uses requiresModel constraint - it only activates when gpt-5.2-codex is available. The fallback chain in code is unreachable, so documentation should not mention fallbacks. * fix(hephaestus): remove unreachable fallback chain entries Hephaestus has requiresModel: gpt-5.2-codex which means the agent only activates when that specific model is available. The fallback entries (claude-opus-4-5, gemini-3-pro) were unreachable and misleading. --------- Co-authored-by: justsisyphus <justsisyphus@users.noreply.github.com>
2.2 KiB
2.2 KiB
CLAUDE CODE HOOKS COMPATIBILITY
OVERVIEW
Full Claude Code settings.json hook compatibility layer. Intercepts OpenCode events to execute external scripts/commands.
Config Sources (priority): .claude/settings.json (project) > ~/.claude/settings.json (global)
STRUCTURE
claude-code-hooks/
├── index.ts # Main factory (401 lines)
├── config.ts # Loads ~/.claude/settings.json
├── config-loader.ts # Extended config (disabledHooks)
├── pre-tool-use.ts # PreToolUse executor
├── post-tool-use.ts # PostToolUse executor
├── user-prompt-submit.ts # UserPromptSubmit executor
├── stop.ts # Stop hook executor (with active state tracking)
├── pre-compact.ts # PreCompact executor
├── transcript.ts # Tool use recording
├── tool-input-cache.ts # Pre→post input caching
└── types.ts # Hook & IO type definitions
HOOK LIFECYCLE
| Event | Timing | Can Block | Context Provided |
|---|---|---|---|
| PreToolUse | Before tool exec | Yes | sessionId, toolName, toolInput, cwd |
| PostToolUse | After tool exec | Warn | + toolOutput, transcriptPath |
| UserPromptSubmit | On message send | Yes | sessionId, prompt, parts, cwd |
| Stop | Session idle/end | Inject | sessionId, parentSessionId, cwd |
| PreCompact | Before summarize | No | sessionId, cwd |
CONFIG SOURCES
Priority (highest first):
.claude/settings.local.json(Project-local, git-ignored).claude/settings.json(Project)~/.claude/settings.json(Global user)
HOOK EXECUTION
- Matchers: Hooks filter by tool name or event type via regex/glob.
- Commands: Executed via subprocess with env vars (
$SESSION_ID,$TOOL_NAME). - Exit Codes:
0: Pass (Success)1: Warn (Continue with system message)2: Block (Abort operation/prompt)
ANTI-PATTERNS
- Heavy PreToolUse: Runs before EVERY tool; keep logic light to avoid latency.
- Blocking non-critical: Prefer PostToolUse warnings for non-fatal issues.
- Direct state mutation: Use
updatedInputin PreToolUse instead of side effects. - Ignoring Exit Codes: Ensure scripts return
2to properly block sensitive tools.