Files
oh-my-opencode/src/AGENTS.md
T
YeonGyu-Kim 9f6d0d2281 docs(agents-md): refresh hierarchical knowledge base for v4.1.2
- Bump root AGENTS.md header: 2026-05-14 → 2026-05-15, commit 5ffbe0e2453a740636, release v4.1.1 → v4.1.2
- Update file counts: 2034 (1337+697) → 2041 (1340+701), LOC ~292k → ~294k
- Fix STRUCTURE: openclaw lives at src/openclaw/ (not src/features/); list more accurate feature modules in the parenthetical
- Clarify interactive_bash gate: tmux binary on PATH via isInteractiveBashEnabled() (not 'tmux enabled')
- Fix docs/reference/features.md hook counts: Tool Guard 14→16, Total base 52→54, total with team-mode 59→61
- Bump 'Generated' date on all 43 subdir AGENTS.md files to 2026-05-15
- Preserve promptAsync injection cautions verbatim (per request)
2026-05-15 13:48:11 +09:00

6.4 KiB
Raw Blame History

src/ — Plugin Source

Generated: 2026-05-15

OVERVIEW

Entry index.ts orchestrates a 7-step initialization. Total: 1340 source files + 701 tests across the directories below. Cross-cutting helpers live in shared/; module boundaries are established by 122 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 10 OpenCode hook handlers wired into Hooks
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/ 102 19,660 11 agent factories + dynamic prompt builder yes
hooks/ 581 78,030 ~52 lifecycle hooks across 58 dirs yes
tools/ 314 44,768 16 tool dirs producing 2039 tools yes
features/ 400 70,934 20 feature modules (team-mode, background-agent, boulder-state, etc.) yes
shared/ 278 32,847 Cross-cutting utilities, barrel-exported yes
cli/ 158 17,812 Commander.js CLI: install, run, doctor, mcp-oauth, boulder yes
plugin/ 56 12,390 10 OpenCode hook handlers + hook composition yes
config/ 41 2,340 30 Zod v4 schema files yes
plugin-handlers/ 27 5,841 6-phase config loading pipeline yes
openclaw/ 26 3,293 Bidirectional Discord/Telegram/HTTP integration yes
__tests__/ 22 275 Plugin-level integration tests + perf fixtures
mcp/ 7 205 3 built-in remote MCPs yes
testing/ 2 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.