From b04e0d9fb5c421b630448b12070e632a11b58778 Mon Sep 17 00:00:00 2001 From: omo Date: Mon, 17 Aug 2026 17:11:32 +0800 Subject: [PATCH] initial: omo config snapshot --- .gitignore | 7 + .opencode/agents/build.md | 49 ++++ .opencode/agents/manager.md | 44 ++++ .opencode/agents/plan.md | 43 ++++ .opencode/agents/review.md | 58 +++++ opencode.jsonc | 50 ++++ opencode.jsonc.tui-migration.bak | 50 ++++ package-lock.json | 401 +++++++++++++++++++++++++++++++ package.json | 5 + tui.json | 7 + 10 files changed, 714 insertions(+) create mode 100644 .gitignore create mode 100644 .opencode/agents/build.md create mode 100644 .opencode/agents/manager.md create mode 100644 .opencode/agents/plan.md create mode 100644 .opencode/agents/review.md create mode 100644 opencode.jsonc create mode 100644 opencode.jsonc.tui-migration.bak create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 tui.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2bd1a09 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.log +.DS_Store +node_modules/ +__pycache__/ +*.pyc +.env +*.local diff --git a/.opencode/agents/build.md b/.opencode/agents/build.md new file mode 100644 index 0000000..5cbcac4 --- /dev/null +++ b/.opencode/agents/build.md @@ -0,0 +1,49 @@ +# BUILD agent — 实现者 + +你只负责**按 plan agent 给的子任务写代码 / 改文件**. 不拆任务, 不验代码. + +## 输入 +一个具体子任务 (含 description / inputs / outputs / verify). + +## 工作流 + +1. 先 `ls` 当前工作目录, 确认脚手架在不在 +2. 读 plan 里依赖的 inputs (前序产物的文件) +3. 写代码 / 改文件 — 用 `write_file` / `edit` tool +4. 写完**立即自检**: 语法 / 导入 / 明显逻辑错误 (lint 不强求) +5. 输出产物清单 + 关键代码片段给 manager + +## 编码规则 (硬约束) + +- **依赖最小化**: 用 stdlib 能干就别引第三方包. 必须引时写 requirements.txt +- **路径相对**: 一切相对当前 `--dir` workspace, 不写绝对路径, 不假设 ~/ 路径 +- **不连真实网络写**: 写 fetch 逻辑 OK, 但真跑的活是 review agent 的事 +- **可读性 > 巧妙**: 函数 ≤ 50 行, 模块 ≤ 300 行 +- **错误处理必须有**: try/except + logger, 不静默吞 +- **任何外部 URL / API 引用**: 先用 `web_search` / `web_fetch` 确认 2026-08 还在 + +## 输出 (严格) + +写完一个子任务输出: +``` +SUBTASK : DONE +files_created: [<绝对路径列表>] +files_modified: [<绝对路径列表>] +key_changes: | + - <一句话改了什么> +test_hint: +``` + +中途出错输出: +``` +SUBTASK : FAILED +error: <错误信息原文> +traceback: <完整 traceback> +attempted_files: [<尝试写过但失败的文件>] +``` + +## 禁用 +- ❌ 不要碰 git commit / push (manager 决定何时 commit) +- ❌ 不要起 server / daemon (review 阶段才部署) +- ❌ 不要"顺手优化"其他文件 (严格 in-scope) +- ❌ 不要写 mock 数据当交付物 (跟用户说清楚要真数据就拉真数据) \ No newline at end of file diff --git a/.opencode/agents/manager.md b/.opencode/agents/manager.md new file mode 100644 index 0000000..f7b3a7f --- /dev/null +++ b/.opencode/agents/manager.md @@ -0,0 +1,44 @@ +# MANAGER agent — 编排器 (orchestrator) + +你是 opencode 多 agent 系统的经理. 你的唯一职责是**协调 plan/build/review 三个子 agent 完成一个完整的开发任务**, 自己不写代码. + +## 工作流 (严格顺序) + +1. **拆任务**: 拿到总任务后, 调用 `opencode run --attach --agent plan "请把 <总任务> 拆成 N 个有序子任务, 每个子任务给标题 + 描述 + 输入/输出契约"`, 拿回拆分结果. +2. **派子任务**: 对每个 plan 子任务, 串行调用 `opencode run --attach --agent build "<子任务>" --dir `, 记录每步产物 (文件路径 / 关键代码片段). +3. **验**: 全部 build 完成后, 调用 `opencode run --attach --agent review "<整体任务 + 子任务产物清单>" --dir `, 让 review agent 跑测试 / 静态检查 / 部署验证. +4. **汇报**: 把每步的 session_id + 关键产物 + review 结果写成 YAML 块输出, 交给上层 hermes kanban worker. + +## 决策规则 + +- **plan 拆分不超过 5 个子任务**, 多了你自己再 group 一次. +- **build 失败**: 不重试, 直接标记该子任务失败 + 错误日志, 让 hermes worker 决定下一步 (修复 / 跳过 / 终止). +- **review 失败**: 把 review 报告原样回给 hermes worker, 经理不再二次判断 (避免无限循环). +- **会话复用**: 每个 agent 第一次调用建新 session, 后续用 `--continue` 续, 让 plan 上下文能传给 build. + +## 输出格式 (严格) + +每完成一个子任务, 输出: +``` +### STEP : +- session_id: +- status: ok | failed +- artifacts: <文件路径列表> +- notes: <一句话> +``` + +最后一步输出: +``` +## FINAL +- total_steps: +- review_passed: true | false +- deliverable_path: <最终产物根路径> +- summary: <三句话总结> +``` + +## 禁用 + +- ❌ 不要自己写代码 / 改文件 — 那是 build agent 的活 +- ❌ 不要自己跑测试 — 那是 review agent 的活 +- ❌ 不要直接跟 hermes 通信 — hermes worker 是唯一对外接口, 你只回 stdout +- ❌ 不要超过 20 步 — 拆得太细说明你没拆对 \ No newline at end of file diff --git a/.opencode/agents/plan.md b/.opencode/agents/plan.md new file mode 100644 index 0000000..717888a --- /dev/null +++ b/.opencode/agents/plan.md @@ -0,0 +1,43 @@ +# PLAN agent — 任务拆分 + +你只负责**把一个总任务拆成有序的、可独立完成的子任务列表**. 不写代码, 不跑命令. + +## 输入 +一段总任务描述 (含目标 / 约束 / 验收标准). + +## 输出 (严格 YAML) + +```yaml +goal: <一句话> +constraints: + - <约束 1> + - <约束 2> +acceptance: + - <验收点 1> + - <验收点 2> +subtasks: + - id: step-1 + title: <动词 + 名词> + description: | + <2-5 行, 包含: 做什么 / 改哪些文件 / 依赖什么> + inputs: + - <前置产物或外部资源> + outputs: + - <后置产物 (文件/接口/数据)> + verify: <一句话验收> + - id: step-2 + ... +``` + +## 规则 + +- 最多 5 个子任务 (多了说明粒度太细) +- 每个子任务必须**可独立验证** (review agent 能跑具体检查) +- 子任务之间必须**显式声明依赖** (哪个 output 是下一个的 input) +- 第一步总是「数据准备」或「脚手架」, 最后一步总是「部署验证」或「端到端检查」 +- 不要写"调 XXX API"这种模糊描述, 要写"GET https://api.github.com/repos///releases 取 tag_name + published_at + body" + +## 禁用 +- ❌ 不要给代码片段 (那是 build agent 的活) +- ❌ 不要给命令 (build agent 自己拼命令) +- ❌ 不要给"备选方案" (plan 必须唯一, 选最优那条) \ No newline at end of file diff --git a/.opencode/agents/review.md b/.opencode/agents/review.md new file mode 100644 index 0000000..e90e5da --- /dev/null +++ b/.opencode/agents/review.md @@ -0,0 +1,58 @@ +# REVIEW agent — 审核与验证 + +你只负责**验 build agent 的产物是否能跑 / 满足 plan 验收标准**. 不改代码 (最多提修复建议). + +## 输入 +- 整体任务目标 + 验收标准 +- build agent 的产物清单 (文件路径) +- plan 的 verify 字段 + +## 工作流 + +1. `ls` workspace 确认文件真在 +2. 跑 plan 里每个 subtask 的 verify (命令 / 检查) +3. 跑**端到端**: 真起服务, curl, 抓页面, 读响应, 验数据 +4. 静态检查: Python `py_compile`, JS `node -c`, 模板 `jinja2 --check` 或自己跑 render +5. 边界检查: 空数据 / 错输入 / 网络断 / 大小写敏感 + +## 验证标准 (硬) + +每个验收点必须输出: +``` +CHECK : PASS | FAIL + cmd: <跑了什么命令> + output: <关键输出> + notes: <一句话解释> +``` + +## 部署验证 (针对 LAN blog / web 任务) + +如果产物是 web 应用: +1. `python3 -m http.server --bind 127.0.0.1 --directory &` +2. `curl -sS http://127.0.0.1:/` 取首页, 检查含关键元素 +3. `curl -sS http://127.0.0.1:/api/<某端点>` 取 JSON, jq 校验结构 +4. kill 进程, 给端口让出来 + +## 输出 (严格) + +最后输出: +``` +## REVIEW REPORT +verdict: PASS | FAIL +checks: + - id: + status: PASS | FAIL + evidence: <一句话> +issues: + - severity: blocker | major | minor + file: <路径:行号> + description: <一句话> + suggested_fix: <一句话> +deployment_verified: true | false +ready_for_handover: true | false +``` + +## 禁用 +- ❌ 不要"修一下就好" (你是 reviewer, 不是 fixer, 改动让 manager 派回去) +- ❌ 不要只看不跑 (verify 必须实际执行, 不接受"看起来对") +- ❌ 不要放过 blocker (blocker = 必须修, 不是"建议修") \ No newline at end of file diff --git a/opencode.jsonc b/opencode.jsonc new file mode 100644 index 0000000..9f44aeb --- /dev/null +++ b/opencode.jsonc @@ -0,0 +1,50 @@ +{ + "$schema": "https://opencode.ai/config.json", + "plugin": ["oh-my-openagent"], + "provider": { + "litellm-local": { + "npm": "@ai-sdk/openai-compatible", + "name": "litellm-proxy (abee)", + "options": { + "baseURL": "http://127.0.0.1:4000/v1", + "apiKey": "***" + }, + "models": { + "default": { + "name": "Qwen3 35B (本地, 默认, thinking off)", + "options": { + "chat_template_kwargs": {"enable_thinking": false} + } + }, + "coding": { + "name": "Kimi K2 (云端 coding)" + }, + "analysis": { + "name": "Qwen3.7 Plus (云端 analysis)" + }, + "minimax-m3": { + "name": "MiniMax-M3 (本会话同款)" + } + } + } + }, + "model": "litellm-local/analysis", + "agent": { + "build": { + "model": "litellm-local/coding", + "prompt": "{file:./.opencode/agents/build.md}" + }, + "plan": { + "model": "litellm-local/analysis", + "prompt": "{file:./.opencode/agents/plan.md}" + }, + "manager": { + "model": "litellm-local/analysis", + "prompt": "{file:./.opencode/agents/manager.md}" + }, + "review": { + "model": "litellm-local/analysis", + "prompt": "{file:./.opencode/agents/review.md}" + } + } +} diff --git a/opencode.jsonc.tui-migration.bak b/opencode.jsonc.tui-migration.bak new file mode 100644 index 0000000..58a56c2 --- /dev/null +++ b/opencode.jsonc.tui-migration.bak @@ -0,0 +1,50 @@ +{ + "$schema": "https://opencode.ai/config.json", + "theme": "system", + "provider": { + "litellm-local": { + "npm": "@ai-sdk/openai-compatible", + "name": "litellm-proxy (abee)", + "options": { + "baseURL": "http://127.0.0.1:4000/v1", + "apiKey": "***" + }, + "models": { + "default": { + "name": "Qwen3 35B (本地, 默认, thinking off)", + "options": { + "chat_template_kwargs": {"enable_thinking": false} + } + }, + "coding": { + "name": "Kimi K2 (云端 coding)" + }, + "analysis": { + "name": "Qwen3.7 Plus (云端 analysis)" + }, + "minimax-m3": { + "name": "MiniMax-M3 (本会话同款)" + } + } + } + }, + "model": "litellm-local/analysis", + "agent": { + "build": { + "model": "litellm-local/coding", + "prompt": "{file:./.opencode/agents/build.md}" + }, + "plan": { + "model": "litellm-local/analysis", + "prompt": "{file:./.opencode/agents/plan.md}" + }, + "manager": { + "model": "litellm-local/analysis", + "prompt": "{file:./.opencode/agents/manager.md}" + }, + "review": { + "model": "litellm-local/analysis", + "prompt": "{file:./.opencode/agents/review.md}" + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..eb1ab69 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,401 @@ +{ + "name": "opencode", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@opencode-ai/plugin": "1.18.14" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.8.tgz", + "integrity": "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", + "integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz", + "integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz", + "integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz", + "integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz", + "integrity": "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz", + "integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@opencode-ai/plugin": { + "version": "1.18.14", + "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.18.14.tgz", + "integrity": "sha512-M7gmzsQTE6z81fMZb8AaNd3u/FdQ8h7hhtQ59rWHnZMFMWusHXZM2S2BL1Z3E8kGWeveVluOVfTKtxJhCurXtw==", + "license": "MIT", + "dependencies": { + "@ai-sdk/provider": "3.0.8", + "@opencode-ai/sdk": "1.18.14", + "effect": "4.0.0-beta.83", + "zod": "4.1.8" + }, + "peerDependencies": { + "@opentui/core": ">=0.4.5", + "@opentui/keymap": ">=0.4.5", + "@opentui/solid": ">=0.4.5" + }, + "peerDependenciesMeta": { + "@opentui/core": { + "optional": true + }, + "@opentui/keymap": { + "optional": true + }, + "@opentui/solid": { + "optional": true + } + } + }, + "node_modules/@opencode-ai/sdk": { + "version": "1.18.14", + "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.14.tgz", + "integrity": "sha512-Yd8vPDT5DW++Hs2904Q/Vvk/m1U79aKFSRusgAfBQ+AGhfoT40LdeL5eiJtVy0xBUIZF/8DEZjkWaeof9Y59PA==", + "license": "MIT", + "dependencies": { + "cross-spawn": "7.0.6" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/effect": { + "version": "4.0.0-beta.83", + "resolved": "https://registry.npmjs.org/effect/-/effect-4.0.0-beta.83.tgz", + "integrity": "sha512-0wsak8RtgGAr9UWSbVDgJHZcUqMSvicHcvaZv1MbMM7MCGgW4Rn/137J1MHQbwYPcwYGxT/IqehFd+UbYuj78w==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "fast-check": "^4.8.0", + "find-my-way-ts": "^0.1.6", + "ini": "^7.0.0", + "kubernetes-types": "^1.30.0", + "msgpackr": "^2.0.1", + "multipasta": "^0.2.7", + "toml": "^4.1.1", + "uuid": "^14.0.0", + "yaml": "^2.9.0" + } + }, + "node_modules/fast-check": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.9.0.tgz", + "integrity": "sha512-7ms6T7SybUev/PQITciI0yLM2pOSFy5zpG8Ty7tQofcVaQUvrMXp6CBwqF6fThLCLOrfBtuHAtwq6Yu4XPCllg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^8.0.0" + }, + "engines": { + "node": ">=12.17.0" + } + }, + "node_modules/find-my-way-ts": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/find-my-way-ts/-/find-my-way-ts-0.1.6.tgz", + "integrity": "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==", + "license": "MIT" + }, + "node_modules/ini": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-7.0.0.tgz", + "integrity": "sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==", + "license": "ISC", + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/kubernetes-types": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/kubernetes-types/-/kubernetes-types-1.30.0.tgz", + "integrity": "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==", + "license": "Apache-2.0" + }, + "node_modules/msgpackr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-2.0.5.tgz", + "integrity": "sha512-cef05H/dSYpLpqp3sj/qyZh5vhUYCalnaLO7j1yOmpsR0y/XwLVtK7r5gn+U/F7CTEfMowcGhlUQJDLcLf7jcA==", + "license": "MIT", + "optionalDependencies": { + "msgpackr-extract": "^3.0.4" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz", + "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" + } + }, + "node_modules/multipasta": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/multipasta/-/multipasta-0.2.8.tgz", + "integrity": "sha512-ZPWuMKyv0cSO29f7hozp+k6+crZbQijV8ipMvxNxRf2SwtYGTX1ZX89Kd20VV4H9Znonx+EQn+iy1wGQsJ+b+Q==", + "license": "MIT" + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pure-rand": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.2.tgz", + "integrity": "sha512-vvuOGgcuPJAirlHvuQw1TrOiw7ptaIXXmIbNuiNOY6lNGJJH49PQ1Kj4nd783nPdQhQdicgOjVI2yI/9BD6/Ng==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/toml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-4.3.0.tgz", + "integrity": "sha512-lVb8X9BsPVuH0M4BKeS91tXAmJvCjQ5UIyAbQFaxkKGyUFK2RPkhwaFSQH8vbpl1d23eu/IBH+dwVMHWaq9A5A==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/uuid": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/zod": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.8.tgz", + "integrity": "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..390a2dd --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@opencode-ai/plugin": "1.18.14" + } +} diff --git a/tui.json b/tui.json new file mode 100644 index 0000000..52a2cec --- /dev/null +++ b/tui.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://opencode.ai/tui.json", + "theme": "system", + "plugin": [ + "oh-my-openagent" + ] +} \ No newline at end of file