Files
oh-my-opencode/src/AGENTS.md
T
YeonGyu-Kim 330e437f08 docs(agents): regenerate hierarchical AGENTS.md for 2026-05-20
Sync the AGENTS.md hierarchy to current code state:

Drift fixes in 11 existing files
- Root: 2026-05-20 commit 39aadbf9f, ~2167 TS files, 120 barrel index.ts,
  57 src/hooks dirs, 297 (179 non-test) src/shared files, 11 OpenCode hook
  handlers in plugin-interface.ts, packages list adds ast-grep-mcp + rules-core,
  first-prompt-watchdog 206 LOC, parent-wake-notifier 587 LOC
- src/AGENTS.md: file counts, plugin-interface handler count
- src/shared/AGENTS.md: title + counts 278/170 -> 297/179
- src/hooks/AGENTS.md: 57 dirs, note unwired WIP (task-reminder,
  hashline-edit-diff-enhancer)
- src/features/AGENTS.md: module map with NON-TEST counts + sub-AGENTS.md
  column, 7 modules without sub-doc
- src/features/background-agent/AGENTS.md: add 12 newer files (parent-wake-
  notifier 587 LOC, loop-detector, error-classifier, fallback-retry-handler,
  process-cleanup, subagent-spawn-limits, session-status-classifier,
  compaction-aware-message-resolver, etc.)
- src/plugin/AGENTS.md: 11 handlers, add system-transform.ts + command-
  execute-before.ts + build-team-idle-wake-hint-client.ts
- src/config/AGENTS.md: note schema/internal/permission.ts
- src/cli/AGENTS.md: 8 commands including 'version'
- src/plugin-handlers/AGENTS.md, packages/web/AGENTS.md: date bump

New AGENTS.md in 4 directories
- packages/AGENTS.md: index of 15 packages (11 platform binaries + 2 MCP
  packages + rules-core + web), role map, conventions
- docs/AGENTS.md: WHERE TO LOOK table for 19 docs across 6 subdirs
- .opencode/AGENTS.md: 5 skills + 4 slash commands + relationship to .agents/
- .agents/AGENTS.md: superset migration target (9 skills + 4 commands)
2026-05-20 17:18:44 +09:00

7.2 KiB

src/ — Plugin Source

Generated: 2026-05-20

OVERVIEW

Entry index.ts orchestrates a 7-step initialization. Total: ~1314 source files + 730 tests across the directories below. Cross-cutting helpers live in shared/; module boundaries are established by 120 barrel index.ts files.

KEY FILES

File Purpose
index.ts Plugin entry; default-exports pluginModule: PluginModule with { id, server }
plugin-config.ts JSONC parse, multi-level merge (user + walked project), Zod v4 validation, migration
plugin-state.ts createModelCacheState() — model resolution cache shared across handlers
plugin-interface.ts 11 OpenCode hook handlers wired into Hooks (the 12th + 13th — experimental.session.compacting + experimental.compaction.autocontinue — are wired in src/testing/create-plugin-module.ts)
create-managers.ts TmuxSessionManager, BackgroundManager, SkillMcpManager, ConfigHandler
create-tools.ts SkillContext + AvailableCategories + ToolRegistry composition
create-hooks.ts 5-tier composition: createCoreHooks() + createContinuationHooks() + createSkillHooks()
create-runtime-tmux-config.ts isTmuxIntegrationEnabled() + createRuntimeTmuxConfig()

INITIALIZATION (7 STEPS)

serverPlugin(input, options)
  1. installAgentSortShim()        # patches Array.prototype.{toSorted,sort} for canonical agent ordering
  2. initConfigContext()           # detects opencode-vs-openagent config layout
  3. detectExternalSkillPlugin()   # warn if conflicting plugin loaded
  4. injectServerAuthIntoClient()  # wire auth headers into shared SDK client
  5. loadPluginConfig()            # walk project + user JSONC → Zod safeParse → migrate
  6a. initializeOpenClaw()         # if openclaw config present (start reply-listener daemon)
  6b. checkTeamModeDependencies()  # if team_mode.enabled (verify git, tmux, ensure ~/.omo/teams/)
  7. createManagers/Tools/Hooks/PluginInterface

CONFIG LOADING (Phase pipeline)

loadPluginConfig(directory, ctx)
  1. User: ~/.config/opencode/oh-my-openagent.jsonc (legacy: oh-my-opencode.jsonc)
  2. Walked configs: <pwd up to $HOME>/.opencode/oh-my-openagent.jsonc
  3. mergeConfigs(user, walked)
     - agents/categories/claude_code: deepMerge (recursive, prototype-pollution safe)
     - disabled_*: Set union
     - mcp_env_allowlist: user-only (security)
     - others: override replaces
  4. Zod safeParse → defaults for omitted fields
  5. migrateConfigFile() → idempotent via _migrations tracking + timestamped backups

HOOK COMPOSITION (5-tier)

Counts verified from each composer's return object. Numbers in brackets show counts when team_mode.enabled.

createHooks()
  ├─→ createCoreHooks()
  │   ├─ createSessionHooks()     # 24: contextWindowMonitor, preemptiveCompaction, sessionRecovery,
  │   │                             sessionNotification, thinkMode, modelFallback,
  │   │                             anthropicContextWindowLimitRecovery, autoUpdateChecker,
  │   │                             agentUsageReminder, nonInteractiveEnv, interactiveBashSession,
  │   │                             ralphLoop, editErrorRecovery, delegateTaskRetry, startWork,
  │   │                             prometheusMdOnly, sisyphusJuniorNotepad, noSisyphusGpt,
  │   │                             noHephaestusNonGpt, questionLabelTruncator, taskResumeInfo,
  │   │                             anthropicEffort, runtimeFallback, legacyPluginToast
  │   ├─ createToolGuardHooks()   # 16 [+1 with team-mode]: commentChecker, toolOutputTruncator,
  │   │                             directoryAgentsInjector, directoryReadmeInjector,
  │   │                             emptyTaskResponseDetector, rulesInjector, tasksTodowriteDisabler,
  │   │                             writeExistingFileGuard, bashFileReadGuard, hashlineReadEnhancer,
  │   │                             jsonErrorRecovery, readImageResizer, todoDescriptionOverride,
  │   │                             webfetchRedirectGuard, fsyncSkipWarning [+ teamToolGating]
  │   └─ createTransformHooks()   # 5 [+2 with team-mode]: claudeCodeHooks, keywordDetector,
  │                                  contextInjectorMessagesTransform, thinkingBlockValidator,
  │                                  toolPairValidator [+ teamModeStatusInjector, teamMailboxInjector]
  ├─→ createContinuationHooks()   # 7: stopContinuationGuard, compactionContextInjector,
  │                                  compactionTodoPreserver, todoContinuationEnforcer (boulder),
  │                                  unstableAgentBabysitter, backgroundNotificationHook, atlasHook
  └─→ createSkillHooks()          # 2: categorySkillReminder, autoSlashCommand

  Direct event handlers (src/plugin/event.ts, when team_mode.enabled): +4
    team-idle-wake-hint, team-lead-orphan-handler,
    team-member-error-handler, team-member-status-handler

Total: 54 base, 61 with team-mode. Each tier produces an object whose values are (input, output) => void handlers; the matching OpenCode handler invokes them in registration order via safeHook() wrappers.

SUBSYSTEM INVENTORY

Subdir Files (.ts) LOC Purpose Has AGENTS.md
agents/ 104 ~20k 11 agent factories + dynamic prompt builder yes (+ atlas, hephaestus, prometheus, sisyphus, sisyphus-junior, builtin-agents)
hooks/ 596 ~78k ~52 lifecycle hooks across 57 dirs yes (+ atlas, anthropic-context-window-limit-recovery, auto-update-checker, claude-code-hooks, comment-checker, compaction-context-injector, keyword-detector, ralph-loop, rules-injector, runtime-fallback, session-recovery, todo-continuation-enforcer)
tools/ 317 ~45k 13 native tool dirs (+1 shared utilities dir); LSP + AST-grep moved to built-in MCPs yes (+ background-task, call-omo-agent, delegate-task, hashline-edit, look-at, skill)
features/ 404 ~71k 20 feature modules (team-mode, background-agent, boulder-state, etc.) yes (+ 11 sub-AGENTS.md including builtin-skills, team-mode, background-agent, claude-code-*)
shared/ 297 ~33k Cross-cutting utilities (179 non-test), barrel-exported yes
cli/ 158 ~18k Commander.js CLI: install, run, doctor, mcp-oauth, boulder yes (+ config-manager, doctor, run)
plugin/ 58 ~12k 10 OpenCode hook handlers + hook composition yes
config/ 41 ~2k 30 Zod v4 schema files yes
plugin-handlers/ 27 ~6k 6-phase config loading pipeline yes
openclaw/ 26 ~3k Bidirectional Discord/Telegram/HTTP integration yes
__tests__/ 22 ~300 Plugin-level integration tests + perf fixtures
mcp/ 8 ~260 5 built-in MCPs (3 remote + local stdio lsp + ast_grep) yes
testing/ 3 ~225 Test utilities

NOTES

  • plugin-interface.ts is the only layer that talks to OpenCode's Plugin API. Every other file goes through it.
  • Reach for shared/ before adding helpers anywhere else — duplicate utilities WILL be flagged in review.
  • Path aliases are forbidden. Use relative imports within a module, barrel imports across modules.