{"id":50111362,"url":"https://github.com/winsonwq/opencode-hook-inspector","last_synced_at":"2026-05-23T12:32:03.876Z","repository":{"id":354144525,"uuid":"1222348870","full_name":"winsonwq/opencode-hook-inspector","owner":"winsonwq","description":"Monitor and debug OpenCode hooks with an interactive CLI. Supports context injection for session compaction.","archived":false,"fork":false,"pushed_at":"2026-04-27T10:00:18.000Z","size":29,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-27T11:22:14.986Z","etag":null,"topics":["cli","debugger","developer-tools","hook","inspector","opencode"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/opencode-hook-inspector","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/winsonwq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"agents.md","dco":null,"cla":null}},"created_at":"2026-04-27T09:23:54.000Z","updated_at":"2026-04-27T10:00:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/winsonwq/opencode-hook-inspector","commit_stats":null,"previous_names":["winsonwq/opencode-hook-inspector"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/winsonwq/opencode-hook-inspector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winsonwq%2Fopencode-hook-inspector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winsonwq%2Fopencode-hook-inspector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winsonwq%2Fopencode-hook-inspector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winsonwq%2Fopencode-hook-inspector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/winsonwq","download_url":"https://codeload.github.com/winsonwq/opencode-hook-inspector/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winsonwq%2Fopencode-hook-inspector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33396573,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T04:15:53.637Z","status":"ssl_error","status_checked_at":"2026-05-23T04:15:53.242Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","debugger","developer-tools","hook","inspector","opencode"],"created_at":"2026-05-23T12:31:58.132Z","updated_at":"2026-05-23T12:32:03.869Z","avatar_url":"https://github.com/winsonwq.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OHI - OpenCode Hook Inspector\n\n实时监控和调试 OpenCode hooks 的交互式 CLI 工具。\n\n## 安装\n\n```bash\nnpm install -g opencode-hook-inspector\n```\n\n安装时会自动链接插件到 OpenCode。\n\n## 快速开始\n\n```bash\n# 启动调试器\nohi\n\n# 新开终端启动 OpenCode\nopencode\n```\n\n## 配置文件\n\nOHI 支持配置文件来预设 hooks 的输出修改。配置文件按以下顺序加载（后者覆盖前者）：\n\n1. `~/.ohi/config.json` - 全局配置\n2. `.ohi.json` - 本地配置（当前目录）\n3. `.ohi/config.json` - 项目配置\n\n### 示例配置\n\n```json\n{\n  \"version\": \"1.0\",\n  \"hooks\": {\n    \"chat.params\": {\n      \"temperature\": 0.7,\n      \"topP\": 0.9\n    },\n    \"experimental.session.compacting\": {\n      \"context\": [\n        \"You are a helpful coding assistant.\",\n        \"Always write clean, well-documented code.\"\n      ]\n    },\n    \"experimental.chat.system.transform\": {\n      \"system\": [\n        \"You are a coding expert.\",\n        \"When writing code, always include comments.\"\n      ]\n    }\n  }\n}\n```\n\n详见 [`.ohi.example.json`](.ohi.example.json)\n\n## 功能说明\n\n### 监控模式\n\n运行后，所有 OpenCode hook 事件都会被捕获并实时显示：\n\n```\n[10:30:15] [HOOK] [session.idle] CALLED\n  INPUT:\n    { sessionId: \"abc123\", status: \"idle\" }\n────────────────────────────────────────────────────────────\n```\n\n### Permission 交互控制\n\n当 `permission.asked` 事件触发时（通过 `event` hook），OHI 会显示交互提示：\n\n```\n[15:21:00] [HOOK] [permission.asked] CALLED\n  🔐 Permission Request - external_directory\n\n  Patterns:\n    - /Users/aqiu/Downloads/*\n\n  Choose a reply:\n\n    [1] Once    - Allow this time only\n    [2] Always  - Always allow for this permission\n    [3] Reject  - Deny this request\n    [4] Ask     - Let OpenCode ask normally (default)\n\n  \u003e 1\n  [Replying: ONCE]\n\n  ── Queued 5 hook(s) during prompt ──\n```\n\n### 上下文注入\n\n当 `experimental.session.compacting` hook 触发时，可以注入额外的上下文：\n\n```\n[10:30:15] [HOOK] [experimental.session.compacting] CALLED\n  Context items: 12\n\n  💡 Context injection available\n\n  Enter context to inject (empty to skip, \"cancel\" to abort):\n\n  \u003e remember to add error handling\n  [Injecting] \"remember to add error handling\"\n```\n\n## Hook 参考\n\n### 通用 Hooks（仅监控）\n\n| Hook | 说明 |\n|------|------|\n| `event` | 通用事件捕获器，接收所有 SSE 事件 |\n| `shell.env` | Shell 环境变量 |\n| `tool.execute.before` | 工具执行前 |\n\n### 可通过配置文件修改的 Hooks\n\n| Hook | Output 可修改 | 说明 |\n|------|--------------|------|\n| `chat.message` | `message`, `parts` | 修改聊天消息 |\n| `chat.params` | `temperature`, `topP`, `topK`, `maxOutputTokens`, `options` | LLM 参数 |\n| `chat.headers` | `headers` | HTTP 请求头 |\n| `command.execute.before` | `parts` | 命令执行 |\n| `tool.execute.before` | `args` | 工具参数 |\n| `tool.execute.after` | `title`, `output`, `metadata` | 工具执行结果 |\n| `tool.definition` | `description`, `parameters` | 工具定义 |\n| `experimental.session.compacting` | `context[]`, `prompt` | Session 压缩 |\n| `experimental.chat.messages.transform` | `messages[]` | 消息历史 |\n| `experimental.chat.system.transform` | `system[]` | System prompt |\n| `experimental.compaction.autocontinue` | `enabled` | 自动继续 |\n| `experimental.text.complete` | `text` | 文本补全 |\n\n### Permission Hooks\n\n| Hook | 类型 | 说明 |\n|------|------|------|\n| `permission.asked` | SSE 事件 | 权限请求事件（通过 `event` hook 接收） |\n| `permission.ask` | Dedicated Hook | 权限拦截（可控制输出，但 OpenCode 暂未调用） |\n\n### 技术细节\n\n**关键发现**：`event` hook 接收的 SSE 事件只有观察性质，无法直接修改 `output`。\n\n对于 `permission.asked`，OHI 通过 OpenCode Client API 实现控制：\n\n```typescript\nawait opencodeClient.postSessionIdPermissionsPermissionId({\n  path: { id: sessionId, permissionID: permissionId },\n  body: { response: \"once\" }\n});\n```\n\n## 命令\n\n| 命令 | 描述 |\n|------|------|\n| `ohi` | 启动调试器 |\n| `ohi unlink` | 移除插件 |\n| `ohi --help` | 显示帮助 |\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `OHI_SOCKET` | `/tmp/ohi.sock` | Unix Socket 路径 |\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwinsonwq%2Fopencode-hook-inspector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwinsonwq%2Fopencode-hook-inspector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwinsonwq%2Fopencode-hook-inspector/lists"}