Update various modules to use centralized constants from plugin-identity:
- get-local-version/formatter: Use PUBLISHED_PACKAGE_NAME
- run/session-resolver: Use PUBLISHED_PACKAGE_NAME
- background-agent/task-poller: Use PUBLISHED_PACKAGE_NAME
- mcp-oauth/provider: Use PUBLISHED_PACKAGE_NAME
- auto-update-checker/constants: Use ACCEPTED_PACKAGE_NAMES
- comment-checker/downloader: Use PUBLISHED_PACKAGE_NAME
- legacy-plugin-toast/hook: Use PLUGIN_NAME
- shared/data-path: Use CACHE_DIR_NAME
- shared/external-plugin-detector: Use ACCEPTED_PACKAGE_NAMES
- shared/logger: Use LOG_FILENAME
- tools/ast-grep/downloader: Use PUBLISHED_PACKAGE_NAME
- tools/call-omo-agent/tools: Use PUBLISHED_PACKAGE_NAME
- tools/delegate-task/category-resolver: Use PUBLISHED_PACKAGE_NAME
- tools/grep/constants: Use PUBLISHED_PACKAGE_NAME
- tools/grep/downloader: Use PUBLISHED_PACKAGE_NAME
- tools/lsp/lsp-client-wrapper: Use PUBLISHED_PACKAGE_NAME
🤖 Generated with assistance of OhMyOpenCode
Update doctor checks to use centralized constants from plugin-identity:
- PACKAGE_NAME now references PUBLISHED_PACKAGE_NAME
- System check uses PLUGIN_NAME and LEGACY_PLUGIN_NAME for plugin
registration validation and legacy name detection
- Formatters updated for consistency
🤖 Generated with assistance of OhMyOpenCode
Update CLI installer to show oh-my-opencode (published name) instead
of oh-my-openagent (plugin name) in usage instructions.
🤖 Generated with assistance of OhMyOpenCode
Update systemLoadedVersion check to detect installs under both
oh-my-opencode and oh-my-openagent package names. Adds package
candidate selection logic for dual-published packages.
🤖 Generated with assistance of OhMyOpenCode
Update writeOmoConfig to detect and migrate legacy config files before
writing. Adds logic to handle oh-my-opencode.json -> oh-my-openagent.json
migration with proper path resolution and fallback handling.
🤖 Generated with assistance of OhMyOpenCode
Add CONFIG_BASENAME and LEGACY_CONFIG_BASENAME constants to support
migrating from oh-my-opencode.json to oh-my-openagent.json naming.
🤖 Generated with assistance of OhMyOpenCode
Extract hardcoded GPT apply_patch permission logic into a reusable module
to ensure consistent behavior across all agents. This prevents GPT models
from using the unreliable apply_patch tool while allowing other models.
- Add gpt-apply-patch-guard.ts with GPT_APPLY_PATCH_GUIDANCE and getGptApplyPatchPermission
- Update Hephaestus agent to use centralized permission logic
- Update Sisyphus-Junior agent to use centralized permission logic
- Update all GPT prompt builders to reference shared guidance constant
🤖 Generated with assistance of OhMyOpenCode
When a hook returns exit code 2 (deny) or 1 (ask), previously accumulated
modifiedInput and common fields from earlier allow hooks were discarded.
Now all exit paths (exit code and JSON) include accumulated state.
When a hook returns 'allow' with updatedInput or common fields
(suppressOutput, systemMessage, etc.), these values were silently
dropped. Now they are accumulated across hooks and included in the
final result, matching Claude Code's behavior where allow hooks can
still modify tool input and set metadata.
Revert the create-hooks.ts change — claudeCodeHooks is already created
in createTransformHooks() with proper config and contextCollector.
The previous commit overwrote it with a degraded instance (empty config,
no contextCollector).
Add 8 unit tests for executePreToolUseHooks covering:
- null/empty config handling
- exit code 2 (deny) and 1 (ask) behavior
- multiple merged hooks: allow continues to next hook (the actual bug)
- deny short-circuits remaining hooks
- modifiedInput propagation between hooks
TDD verified: tests fail with original code, pass with fix.
When multiple hook sources are merged (global ~/.claude/settings.json +
project .claude/settings.json), a global catch-all hook returning 'allow'
caused early return before project-level hooks could execute.
Only 'deny' and 'ask' decisions should short-circuit. 'allow' should
continue processing remaining hooks so project-specific guards (e.g.,
file budget enforcement) get a chance to block.
createClaudeCodeHooksHook() was fully implemented but never instantiated
in createHooks(). All .claude/settings.json hooks (PreToolUse, PostToolUse,
Stop, UserPromptSubmit) were silently skipped because hooks.claudeCodeHooks
was always undefined (optional chaining masked the issue).
Add claudeCodeHooks creation to createHooks() using the existing
isHookEnabled('claude-code-hooks') gate and safeCreateHook wrapper.
Note: This is a necessary fix but may require additional debugging for
full hook execution — the dispatch/stdin format compatibility between
OpenCode and Claude Code hook scripts needs runtime verification.
Fixes#3297