@minko-ai/minko 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/README.md +577 -2
  2. package/assets/mascot-preview.png +0 -0
  3. package/assets/mascot-preview.txt +46 -0
  4. package/assets/mascot-source.png +0 -0
  5. package/assets/skills/README.md +21 -0
  6. package/assets/skills/brainstorming/LICENSE +21 -0
  7. package/assets/skills/brainstorming/SKILL.md +316 -0
  8. package/assets/skills/buddhist-method/LICENSE +21 -0
  9. package/assets/skills/buddhist-method/SKILL.md +137 -0
  10. package/assets/skills/buddhist-method/references/ariyasacca-debug.md +57 -0
  11. package/assets/skills/buddhist-method/references/extended-principles.md +100 -0
  12. package/assets/skills/code-humanizer/LICENSE +21 -0
  13. package/assets/skills/code-humanizer/SKILL.md +174 -0
  14. package/assets/skills/code-review/LICENSE +21 -0
  15. package/assets/skills/code-review/SKILL.md +232 -0
  16. package/assets/skills/code-review/reference/angular.md +768 -0
  17. package/assets/skills/code-review/reference/architecture-review-guide.md +472 -0
  18. package/assets/skills/code-review/reference/c.md +890 -0
  19. package/assets/skills/code-review/reference/code-quality-universal.md +488 -0
  20. package/assets/skills/code-review/reference/code-review-best-practices.md +136 -0
  21. package/assets/skills/code-review/reference/common-bugs-checklist.md +302 -0
  22. package/assets/skills/code-review/reference/cpp.md +893 -0
  23. package/assets/skills/code-review/reference/cross-cutting/async-concurrency-patterns.md +515 -0
  24. package/assets/skills/code-review/reference/cross-cutting/error-handling-principles.md +492 -0
  25. package/assets/skills/code-review/reference/cross-cutting/n-plus-one-queries.md +309 -0
  26. package/assets/skills/code-review/reference/cross-cutting/sql-injection-prevention.md +308 -0
  27. package/assets/skills/code-review/reference/cross-cutting/xss-prevention.md +264 -0
  28. package/assets/skills/code-review/reference/csharp.md +525 -0
  29. package/assets/skills/code-review/reference/css-less-sass.md +661 -0
  30. package/assets/skills/code-review/reference/dart.md +670 -0
  31. package/assets/skills/code-review/reference/django.md +985 -0
  32. package/assets/skills/code-review/reference/fastapi.md +580 -0
  33. package/assets/skills/code-review/reference/go.md +993 -0
  34. package/assets/skills/code-review/reference/java.md +409 -0
  35. package/assets/skills/code-review/reference/java8.md +586 -0
  36. package/assets/skills/code-review/reference/kotlin.md +1018 -0
  37. package/assets/skills/code-review/reference/nestjs.md +593 -0
  38. package/assets/skills/code-review/reference/performance-review-guide.md +816 -0
  39. package/assets/skills/code-review/reference/php.md +684 -0
  40. package/assets/skills/code-review/reference/python.md +1073 -0
  41. package/assets/skills/code-review/reference/qt.md +757 -0
  42. package/assets/skills/code-review/reference/react.md +871 -0
  43. package/assets/skills/code-review/reference/ruby.md +964 -0
  44. package/assets/skills/code-review/reference/rust.md +846 -0
  45. package/assets/skills/code-review/reference/security-review-guide.md +494 -0
  46. package/assets/skills/code-review/reference/svelte.md +1064 -0
  47. package/assets/skills/code-review/reference/swift.md +936 -0
  48. package/assets/skills/code-review/reference/typescript.md +1016 -0
  49. package/assets/skills/code-review/reference/vue.md +924 -0
  50. package/assets/skills/code-review/reference/zig.md +440 -0
  51. package/assets/skills/cyclomatic-complexity/LICENSE +201 -0
  52. package/assets/skills/cyclomatic-complexity/SKILL.md +69 -0
  53. package/assets/skills/five-whys/LICENSE +21 -0
  54. package/assets/skills/five-whys/SKILL.md +247 -0
  55. package/assets/skills/five-whys/examples/performance-regression.md +161 -0
  56. package/assets/skills/five-whys/examples/production-incident.md +134 -0
  57. package/assets/skills/five-whys/references/software-patterns.md +284 -0
  58. package/assets/skills/five-whys/references/toyota-origins.md +257 -0
  59. package/assets/skills/systematic-debugging/LICENSE +21 -0
  60. package/assets/skills/systematic-debugging/SKILL.md +283 -0
  61. package/assets/skills/test-driven-development/LICENSE +21 -0
  62. package/assets/skills/test-driven-development/SKILL.md +330 -0
  63. package/assets/skills/verification-before-completion/LICENSE +21 -0
  64. package/assets/skills/verification-before-completion/SKILL.md +120 -0
  65. package/assets/skills/vibe-sec/LICENSE +201 -0
  66. package/assets/skills/vibe-sec/SKILL.md +758 -0
  67. package/assets/skills/writing-plans/LICENSE +21 -0
  68. package/assets/skills/writing-plans/SKILL.md +204 -0
  69. package/bin/minko.js +2 -2
  70. package/dist/agent/approvalTokens.js +224 -0
  71. package/dist/agent/branchLock.js +315 -0
  72. package/dist/agent/compact.js +182 -0
  73. package/dist/agent/context.js +183 -0
  74. package/dist/agent/cron.js +326 -0
  75. package/dist/agent/hooks.js +211 -0
  76. package/dist/agent/lanes.js +511 -0
  77. package/dist/agent/loop.js +337 -0
  78. package/dist/agent/memory.js +159 -0
  79. package/dist/agent/permissions.js +71 -0
  80. package/dist/agent/plan.js +118 -0
  81. package/dist/agent/prompt.js +120 -0
  82. package/dist/agent/subagent.js +67 -0
  83. package/dist/agent/tasks.js +449 -0
  84. package/dist/agent/transcript.js +62 -0
  85. package/dist/agent/workerStore.js +172 -0
  86. package/dist/agent/workerTypes.js +1 -0
  87. package/dist/agent/workers.js +503 -0
  88. package/dist/cli/app.js +261 -0
  89. package/dist/cli/argv.js +206 -0
  90. package/dist/cli/commandsCommand.js +12 -0
  91. package/dist/cli/configCommand.js +170 -0
  92. package/dist/cli/doctorCommand.js +112 -0
  93. package/dist/cli/exportCommand.js +85 -0
  94. package/dist/cli/forkCommand.js +24 -0
  95. package/dist/cli/linkCommand.js +272 -0
  96. package/dist/cli/loginCommand.js +69 -0
  97. package/dist/cli/mcpLoginCommand.js +68 -0
  98. package/dist/cli/pluginCommand.js +113 -0
  99. package/dist/cli/powerCommand.js +174 -0
  100. package/dist/cli/promptFooter.js +74 -0
  101. package/dist/cli/relayCommand.js +38 -0
  102. package/dist/cli/sandboxCommand.js +31 -0
  103. package/dist/cli/serveCommand.js +104 -0
  104. package/dist/cli/statusCommand.js +120 -0
  105. package/dist/cli/tui.js +1104 -0
  106. package/dist/commands/registry.js +99 -0
  107. package/dist/config/paths.js +81 -0
  108. package/dist/config/store.js +605 -0
  109. package/dist/index.js +199 -0
  110. package/dist/link/protocol.js +159 -0
  111. package/dist/link/relay.js +184 -0
  112. package/dist/link/server.js +566 -0
  113. package/dist/link/tunnel.js +90 -0
  114. package/dist/lsp/client.js +340 -0
  115. package/dist/lsp/tool.js +177 -0
  116. package/dist/mcp/client.js +469 -0
  117. package/dist/mcp/httpClient.js +191 -0
  118. package/dist/mcp/server.js +206 -0
  119. package/dist/mcp/tools.js +173 -0
  120. package/dist/oauth/device.js +111 -0
  121. package/dist/oauth/store.js +56 -0
  122. package/dist/plugins/loader.js +291 -0
  123. package/dist/plugins/market.js +98 -0
  124. package/dist/providers/anthropic.js +279 -0
  125. package/dist/providers/factory.js +109 -0
  126. package/dist/providers/openai.js +182 -0
  127. package/dist/providers/retry.js +95 -0
  128. package/dist/providers/sse.js +67 -0
  129. package/dist/providers/types.js +10 -0
  130. package/dist/rag/embeddings.js +171 -0
  131. package/dist/rag/index.js +373 -0
  132. package/dist/rag/server.js +167 -0
  133. package/dist/rag/tool.js +148 -0
  134. package/dist/sandbox/index.js +55 -0
  135. package/dist/sdk/server.js +150 -0
  136. package/dist/sdk/session.js +104 -0
  137. package/dist/session/liveness.js +148 -0
  138. package/dist/session/recorder.js +49 -0
  139. package/dist/session/store.js +171 -0
  140. package/dist/skills/index.js +428 -0
  141. package/dist/theme.js +30 -0
  142. package/dist/tools/fs.js +195 -0
  143. package/dist/tools/notebook.js +109 -0
  144. package/dist/tools/registry.js +32 -0
  145. package/dist/tools/search.js +130 -0
  146. package/dist/tools/shell.js +200 -0
  147. package/dist/tools/structured.js +83 -0
  148. package/dist/tools/types.js +1 -0
  149. package/dist/ui/ansi.js +135 -0
  150. package/dist/ui/banner.js +103 -0
  151. package/dist/ui/input.js +49 -0
  152. package/dist/ui/inputModel.js +113 -0
  153. package/dist/ui/keyboard.js +142 -0
  154. package/dist/ui/mascot.js +34 -0
  155. package/dist/ui/mascotData.js +96 -0
  156. package/dist/ui/md.js +183 -0
  157. package/dist/ui/screen.js +49 -0
  158. package/dist/ui/spinner.js +52 -0
  159. package/dist/ui/transcript.js +287 -0
  160. package/dist/util/clipboard.js +53 -0
  161. package/dist/util/errors.js +50 -0
  162. package/dist/util/version.js +12 -0
  163. package/dist/web/fetch.js +168 -0
  164. package/dist/web/search.js +97 -0
  165. package/package.json +45 -36
  166. package/src/agent/loop.ts +0 -159
  167. package/src/agent/prompt.ts +0 -45
  168. package/src/cli/app.ts +0 -396
  169. package/src/cli/argv.ts +0 -139
  170. package/src/cli/configCommand.ts +0 -175
  171. package/src/config/paths.ts +0 -20
  172. package/src/config/store.ts +0 -149
  173. package/src/index.ts +0 -120
  174. package/src/providers/anthropic.ts +0 -215
  175. package/src/providers/openai.ts +0 -158
  176. package/src/providers/sse.ts +0 -57
  177. package/src/providers/types.ts +0 -59
  178. package/src/session/store.ts +0 -125
  179. package/src/theme.ts +0 -41
  180. package/src/tools/fs.ts +0 -143
  181. package/src/tools/registry.ts +0 -19
  182. package/src/tools/shell.ts +0 -120
  183. package/src/tools/types.ts +0 -26
  184. package/src/ui/ansi.ts +0 -110
  185. package/src/ui/banner.ts +0 -39
  186. package/src/ui/input.ts +0 -54
  187. package/src/ui/md.ts +0 -160
  188. package/src/ui/spinner.ts +0 -58
  189. package/src/util/errors.ts +0 -48
package/README.md CHANGED
@@ -26,6 +26,39 @@ minko config --preset anthropic --api-key sk-ant-xxxx
26
26
  minko config --list
27
27
  ```
28
28
 
29
+ ## 服务商矩阵与 fallback
30
+
31
+ `minko config` 内置这些预设:
32
+
33
+ | 预设 | 类型 | 默认地址 |
34
+ | --- | --- | --- |
35
+ | DeepSeek | OpenAI 兼容 | `https://api.deepseek.com` |
36
+ | Claude | Anthropic | `https://api.anthropic.com` |
37
+ | OpenAI | OpenAI 兼容 | `https://api.openai.com/v1` |
38
+ | xAI | OpenAI 兼容 | `https://api.x.ai/v1` |
39
+ | DashScope / Qwen | OpenAI 兼容 | `https://dashscope.aliyuncs.com/compatible-mode/v1` |
40
+ | Kimi | OpenAI 兼容 | `https://api.moonshot.cn/v1` |
41
+ | OpenRouter | OpenAI 兼容 | `https://openrouter.ai/api/v1` |
42
+ | Ollama(本地) | OpenAI 兼容 | `http://127.0.0.1:11434/v1`,无需 Key |
43
+
44
+ 也可以配置任意 OpenAI / Anthropic 兼容地址。本地 `localhost` / `127.0.0.1` 服务允许空 API Key,
45
+ OpenAI 兼容请求不会发送空的 `Authorization`。
46
+
47
+ 失败切换链:
48
+
49
+ ```json
50
+ {
51
+ "active": "deepseek",
52
+ "providers": { "...": "..." },
53
+ "fallbackProviders": ["claude-backup", "openai"],
54
+ "modelAliases": { "fast": "deepseek-chat" }
55
+ }
56
+ ```
57
+
58
+ - 主服务商重试耗尽后按顺序切换;401/403/429/5xx 和网络错误会触发,400 不切换;
59
+ - 每次切换会在终端显示提示;`minko status` 显示 fallback 链;
60
+ - `modelAliases` 可自定义别名;Anthropic 还内置 `sonnet` / `opus` / `haiku` 短名。
61
+
29
62
  ## 用法
30
63
 
31
64
  ```bash
@@ -35,6 +68,16 @@ minko -p "总结 README" # 一次性输出,适合管道
35
68
  minko -c # 继续当前目录最近一次会话
36
69
  minko -r <会话id> # 继续指定会话
37
70
  minko sessions # 列出保存的会话
71
+ minko fork <id> [名字] # 复制会话分支(id 可以是 latest)
72
+ minko login # OAuth 设备码登录
73
+ minko status # 查看配置、模型、会话、插件状态
74
+ minko doctor # 检查运行环境与配置
75
+ minko export latest --out chat.md # 导出会话(md/json)
76
+ minko rag --port 8787 # 启动本地 RAG HTTP 服务
77
+ minko mcp-server # 把只读工具暴露为 MCP stdio server
78
+ minko mcp-login <server> # 远程 MCP server 的 OAuth 登录
79
+ minko sdk # 启动 NDJSON JSON-RPC SDK
80
+ minko commands [--json] # slash command 元数据
38
81
  minko --auto "..." # 不再逐条确认(危险)
39
82
  ```
40
83
 
@@ -45,12 +88,24 @@ minko --auto "..." # 不再逐条确认(危险)
45
88
  | `/help` | 帮助 |
46
89
  | `/new` | 新会话 |
47
90
  | `/clear` | 清空上下文 |
91
+ | `/compact [n]` | 把较早对话折叠成摘要,保留最近 n 条(默认 4) |
92
+ | `/plan` | 切换只读计划模式 |
93
+ | `/todos` | 查看当前待办清单 |
94
+ | `/fork [名字]` | 从当前会话复制一个分支 |
48
95
  | `/model <id>` | 临时切换模型 |
49
96
  | `/sessions` | 最近会话 |
50
97
  | `/exit` | 退出 |
51
98
 
99
+ 在会话里输入 `/help` 查看完整命令列表(按会话/上下文/状态/工具/设置分组,支持别名与拼写建议)。
100
+ 其余命令:`/status`、`/usage`、`/workers`、`/tasks`、`/crons`、`/lanes`、`/approvals`、
101
+ `/plugins`、`/skills`、`/memory`、`/sandbox`、`/export [路径]`。
102
+
52
103
  `Ctrl+C` 中断当前回复,再按一次退出。
53
104
 
105
+ 终端界面里,思考过程会先以灰色斜体流式显示,结束后折叠成一行耗时;工具调用显示为
106
+ `● run_shell npm test · 1.4s · 472 B` 这样的单行状态,连续同名工具会合并成 `×N`,
107
+ 输出只保留末尾几行。按 `Ctrl+O` 展开/收起这些详情;回答、思考和工具调用按实际发生的顺序交错出现。
108
+
54
109
  ## 工具与确认
55
110
 
56
111
  | 工具 | 说明 | 确认 |
@@ -60,18 +115,538 @@ minko --auto "..." # 不再逐条确认(危险)
60
115
  | `write_file` | 写文件(工作区内直接写) | 工作区外需要 |
61
116
  | `run_shell` | 在电脑上执行命令 | 每次需要 |
62
117
 
118
+ 另外还有 `notebook_edit`(编辑 .ipynb 的 replace / insert / delete)和
119
+ `structured_output`(按 JSON Schema 子集校验并输出结构化结果)。
120
+
63
121
  确认时可选 `y` 允许一次、`a` 本会话总是允许、`n` 拒绝。
64
122
  `--auto` 跳过所有确认,只建议在可信目录里用。
65
123
 
124
+ ## 权限规则
125
+
126
+ 在 `~/.minko/config.json` 增加:
127
+
128
+ ```json
129
+ {
130
+ "permissions": {
131
+ "deny": ["run_shell(rm -rf*)", "write_file(.git/*)"],
132
+ "ask": ["run_shell(git push*)"],
133
+ "allow": ["read_file", "write_file(src/*)"]
134
+ }
135
+ }
136
+ ```
137
+
138
+ 规则格式为 `工具名` 或 `工具名(匹配内容)`。`*` / `?` 是通配符;没有通配符时按前缀匹配。
139
+ 匹配对象:`run_shell` 用命令,文件工具用路径,其他工具用 JSON 参数。优先级 **deny > ask > allow**;
140
+ `ask` 即使加了 `--auto` 也会走确认;`allow` 不能绕过 `readonly` / `workspace` 模式。
141
+
142
+ ## Hooks
143
+
144
+ ```json
145
+ {
146
+ "hooks": {
147
+ "PreToolUse": [
148
+ { "matcher": "run_shell", "hooks": [{ "command": "node scripts/audit.js" }] }
149
+ ],
150
+ "PostToolUse": ["echo checked"],
151
+ "PostToolUseFailure": []
152
+ }
153
+ }
154
+ ```
155
+
156
+ hook 从 stdin 收到 `{ event, tool_name, tool_input, tool_output?, is_error }`,向 stdout 输出 JSON:
157
+
158
+ ```json
159
+ { "continue": false, "reason": "blocked" }
160
+ { "systemMessage": "lint passed" }
161
+ { "hookSpecificOutput": {
162
+ "permissionDecision": "allow|deny|ask",
163
+ "permissionDecisionReason": "why",
164
+ "updatedInput": { "command": "改写后的参数" },
165
+ "additionalContext": "给模型的额外说明"
166
+ } }
167
+ ```
168
+
169
+ 非 JSON 的 stdout 会作为消息追加到工具结果;命令非零退出视为 hook 失败并阻止工具执行。
170
+ `matcher` 支持 `*`、逗号或 `|` 分隔的工具名。
171
+
172
+ ## 长会话与重试
173
+
174
+ - 上下文超过约 100k token 时,较早的对话会自动折叠成摘要,保留最近 4 条;摘要随会话保存。
175
+ - 发送前会估算这一次请求的大小;超过约 40 万 token 时先强制压缩较早内容再继续,压缩后仍超限才停止本轮。判断依据是当前请求,不是整个任务的累计用量。
176
+ - 429 / 5xx / 网络错误自动重试(指数退避,尊重 `Retry-After`);400 / 401 / 403 不重试。
177
+ - 服务端判定请求超长时,会逐步压缩较早内容后重试。
178
+ - Anthropic 协议会在 system、tools 和对话末尾设置 `cache_control` 缓存断点;网关不支持缓存时自动退回普通请求。终端统计会显示缓存命中的 token 数。
179
+ - 项目内的 `MINKO.md` / `AGENTS.md` / `CLAUDE.md`、`.minko/rules/*.md` 和 git 状态会自动进入上下文(单文件 16KB、总量 32KB 上限)。
180
+
181
+ ## MCP 工具
182
+
183
+ 在 `~/.minko/config.json` 里声明 MCP server:
184
+
185
+ ```json
186
+ {
187
+ "mcpServers": {
188
+ "filesystem": {
189
+ "command": "npx",
190
+ "args": ["-y", "@modelcontextprotocol/server-filesystem", "C:/work"]
191
+ }
192
+ }
193
+ }
194
+ ```
195
+
196
+ 启动 `minko` 或 `minko serve` 时会自动连接(stdio + JSON-RPC)。工具名形如
197
+ `mcp__filesystem__read_file`,和内置工具一样参与权限规则;默认需要确认(MCP 没有统一的
198
+ 只读标记),可用 `permissions.allow: ["mcp__filesystem__read_file"]` 放行。
199
+ 某个 server 启动失败只会打印错误,不影响内置工具和其他 server。
200
+
201
+ ## 子任务
202
+
203
+ 内置 `agent` 工具:模型可以启动一个独立上下文的只读子任务,只能使用
204
+ `read_file` / `list_dir` / `search_files`,完成后把结论返回主对话。
205
+ 子任务不能写文件、不能执行命令,也不能再启动子任务。
206
+
207
+ ## 计划模式与待办
208
+
209
+ - `enter_plan_mode` 进入只读计划模式:只能读文件、列目录、搜索和启动只读子任务;
210
+ 写文件、执行命令、MCP 写工具都会被拒绝。计划完成后用 `exit_plan_mode` 提交,需要用户确认。
211
+ - `todo_write` 维护多步骤清单(pending / in_progress / completed),随会话保存。
212
+ - 终端里用 `/plan` 手动切换计划模式,`/todos` 查看当前清单。
213
+
214
+ ## RAG 检索
215
+
216
+ 内置 `retrieve_context` 工具,在本地给工作区建索引:
217
+
218
+ - 默认 BM25 关键词检索:英文按单词、中文按二元词切分,支持文件名命中;
219
+ - 配置 embeddings 后自动变成「关键词 + 语义」混合检索;
220
+ - 自动跳过 `node_modules`、`.git`、`dist` 等目录,二进制文件、锁文件,以及 `.env` / `*.pem` 等敏感文件;
221
+ - 默认最多索引 3000 个文件、单文件 256KB,索引缓存 30 秒;传 `refresh: true` 强制重建;
222
+ - 返回 `file:line` 和片段;计划模式、子任务里都可以用。
223
+
224
+ 开启语义检索(OpenAI 兼容 embeddings):
225
+
226
+ ```json
227
+ {
228
+ "rag": {
229
+ "embeddings": {
230
+ "enabled": true,
231
+ "baseUrl": "https://api.openai.com/v1",
232
+ "model": "text-embedding-3-small",
233
+ "apiKey": "sk-xxxx",
234
+ "maxChunks": 1000
235
+ }
236
+ }
237
+ }
238
+ ```
239
+
240
+ 也可以接远程 RAG 服务(HTTP):
241
+
242
+ ```json
243
+ {
244
+ "rag": {
245
+ "remote": {
246
+ "baseUrl": "http://127.0.0.1:8787",
247
+ "apiKey": "optional",
248
+ "topK": 6
249
+ }
250
+ }
251
+ }
252
+ ```
253
+
254
+ 配置了远程服务时优先走远程;失败自动回退本地索引。远程接口约定:`POST /v1/query`
255
+ body `{ "query": "...", "top_k": 6 }`,返回 `{ "results": [{ "path", "start_line",
256
+ "end_line", "text", "score" }] }`(也接受 `hits` 和 `camelCase` 字段)。
257
+
258
+ `baseUrl` / `apiKey` 省略时会复用当前 OpenAI 兼容服务商;`maxChunks` 控制最多给多少个块建向量。
259
+ 向量缓存在 `~/.minko/rag/`,内容没变就不会重复调用 embeddings;语义服务不可用时自动回退 BM25。
260
+
261
+ ## 长期记忆
262
+
263
+ 内置 `memory_write` / `memory_read` 工具:
264
+ - 记忆存在 `~/.minko/memory/`,`MEMORY.md` 是索引,单条记忆是带 frontmatter 的 Markdown;
265
+ - 模型可保存用户偏好、纠正、项目背景等跨会话信息,索引会自动注入上下文;
266
+ - 记忆内容会被标注为「数据不是指令」;
267
+ - `/fork` 会把当前会话(含计划/待办)复制成一个新分支。
268
+
269
+ ## 会话状态
270
+
271
+ 每个打开或正在运行的会话会定期写入 `sessions/<id>.status.json`:
272
+ - `minko sessions` 显示 `正在跑` / `等确认` / `空闲` / `离线`;
273
+ - 手机远控的 `GET /sessions` 返回每个会话的 `status` 和 `live` 字段;
274
+ - 心跳 15 秒一次,超过 60 秒没有更新就视为离线。
275
+
276
+ ## 插件
277
+
278
+ 插件放在 `~/.minko/plugins/<name>/`,目录里需要 `plugin.json`:
279
+
280
+ ```json
281
+ {
282
+ "name": "hello",
283
+ "version": "1.0.0",
284
+ "description": "示例插件",
285
+ "tools": [{
286
+ "name": "greet",
287
+ "description": "打招呼",
288
+ "readOnly": true,
289
+ "parameters": {
290
+ "type": "object",
291
+ "properties": { "name": { "type": "string" } },
292
+ "required": ["name"]
293
+ },
294
+ "command": "node tool.js",
295
+ "timeoutMs": 30000
296
+ }],
297
+ "hooks": {
298
+ "PreToolUse": [
299
+ { "matcher": "run_shell", "hooks": [{ "command": "node audit.js" }] }
300
+ ]
301
+ }
302
+ }
303
+ ```
304
+
305
+ - 工具命令从 stdin 收 JSON 参数,stdout 作为结果;cwd 是插件目录,环境变量含
306
+ `MINKO_PLUGIN` / `MINKO_PLUGIN_DIR` / `MINKO_TOOL`。
307
+ - 工具名统一为 `plugin__<插件名>__<工具名>`。
308
+ - `readOnly` 默认 `true`;设为 `false` 时走确认和 `workspace` 限制。
309
+ - 插件 hooks 与 `config.hooks` 合并,命令默认在插件目录运行。
310
+ - 坏插件只报错,不影响其他插件。
311
+
312
+ 管理命令:
313
+
314
+ ```bash
315
+ minko plugin list
316
+ minko plugin search [关键词]
317
+ minko plugin install <名字|git 地址|本地目录>
318
+ minko plugin uninstall <名字>
319
+ minko plugin disable <名字>
320
+ minko plugin enable <名字>
321
+ ```
322
+
323
+ ### 插件市场
324
+
325
+ 配置 `plugins.registryUrl` 指向 JSON 索引:
326
+
327
+ ```json
328
+ {
329
+ "plugins": {
330
+ "registryUrl": "https://plugins.example/index.json"
331
+ }
332
+ }
333
+ ```
334
+
335
+ 索引格式:
336
+
337
+ ```json
338
+ {
339
+ "plugins": [
340
+ { "name": "hello", "version": "1.0.0", "description": "...", "git": "https://github.com/you/hello" }
341
+ ]
342
+ }
343
+ ```
344
+
345
+ `plugin search` 按名称/描述过滤;`plugin install <名字>` 从索引找到 git 地址,
346
+ `git clone --depth 1` 后复制到 `~/.minko/plugins/<name>`。需要本机安装 git。
347
+
348
+ ## LSP 代码导航
349
+
350
+ 内置 `lsp` 工具,支持 `definition` / `references` / `hover` / `symbols`(文件符号)。
351
+ 语言服务器按需启动并复用,退出时关闭。
352
+
353
+ 默认命令:
354
+
355
+ | 语言 | 命令 |
356
+ | --- | --- |
357
+ | TypeScript / JavaScript | `typescript-language-server --stdio` |
358
+ | Python | `pyright-langserver --stdio` |
359
+ | Rust | `rust-analyzer` |
360
+ | Go | `gopls` |
361
+
362
+ 可在 `~/.minko/config.json` 覆盖:
363
+
364
+ ```json
365
+ {
366
+ "lsp": {
367
+ "servers": {
368
+ "typescript": { "command": "typescript-language-server", "args": ["--stdio"] },
369
+ "python": { "command": "pyright-langserver", "args": ["--stdio"] }
370
+ }
371
+ }
372
+ }
373
+ ```
374
+
375
+ 没装对应语言服务器时会返回安装提示,不影响其他工具。
376
+
377
+ ## 后台 worker 与团队
378
+
379
+ 内置一组后台编排工具:
380
+
381
+ - `worker_create` 启动一个后台 worker,立即返回 id;`allow_write: true` 时允许
382
+ `write_file` / `edit_file`,每次写入都需要确认,写入 worker 串行运行;
383
+ - `worker_wait` 等结果,`worker_list` / `worker_get` 查看状态,`worker_stop` 停止;
384
+ - `team_create` 一次创建最多 8 个 worker 并行调查,`team_wait` 收集全部结果;
385
+ - 只读 worker 只能读文件/列目录/搜索/检索,不能写文件或执行命令;写入 worker 也不能执行 shell;
386
+ - 默认最多 2 个 worker 同时跑,单个 5 分钟超时;输出上限 8KB。
387
+
388
+ worker 在进程内运行:交互模式关闭时全部停止;一次性模式在本轮结束时停止未完成的任务;
389
+ 后台服务(`minko serve`)里跨会话共享。手机远控中的写入 worker 只有在 `power: full` 时才会被批准。
390
+
391
+ worker 记录和完整对话会持久化到 `~/.minko/workers/`:
392
+ - 元数据 `<id>.json`,对话 `<id>.messages.jsonl`;
393
+ - 进程重启后仍可查看历史;上次进程里还在 running/queued 的 worker 会被标记为 stopped;
394
+ - 手机接口:
395
+ - `GET /workers` 列出 worker;
396
+ - `GET /workers/<id>` 返回元数据和对话;
397
+ - `POST /workers/<id>/stop` 停止当前进程里仍在运行的 worker;
398
+ - `GET /sessions` 额外返回 `workers: { total, active }`。
399
+
400
+ ## Git worktree lane
401
+
402
+ 在 git 仓库里可以给写入 worker 一个独立分支和目录:
403
+
404
+ - `lane_create`:创建 `minko/lane-<id>` 分支和 worktree,启动写入 worker;
405
+ - `lane_wait` / `lane_status`:等待并查看状态;
406
+ - `lane_diff`:查看 git 状态、差异统计和 diff;
407
+ - `lane_close`:停止 worker 并删除 worktree(`keep_branch: true` 保留分支供手动合并);
408
+ - `lane_merge`:自动提交 lane 里的改动并合并到当前分支:
409
+ - `strategy: merge | squash | ff`,默认 `merge --no-ff`;
410
+ - 主工作区有未提交改动时拒绝,除非 `allow_dirty: true`;
411
+ - 冲突会自动 `merge --abort` 并保留 lane;
412
+ - 成功后清理 worktree、删除分支并释放锁;合并操作需要确认。
413
+
414
+ lane 不会改动主工作区;计划模式下不能创建 lane 或合并。
415
+
416
+ ## 任务板与定时任务
417
+
418
+ - `task_create` / `task_start` / `task_list` / `task_get` / `task_output` / `task_stop` / `task_update`:
419
+ 持久化任务板,任务启动后对应一个后台 worker;
420
+ - 任务记录在 `~/.minko/tasks/`,进程重启后仍可查看,失去 worker 的 running 任务会标记为 failed;
421
+ - `cron_create` / `cron_list` / `cron_run` / `cron_delete`:按分钟间隔定时启动只读 worker;
422
+ - 定时任务在 TUI 和 `minko serve` 常驻期间自动检查;一次性模式用 `cron_run` 手动触发;
423
+ - 同一个 cron 上一次 worker 还在运行时不会重复启动;
424
+ - 定时任务记录在 `~/.minko/cron/`。
425
+
426
+ ## 分支锁与分支状态
427
+
428
+ - `branch_lock` / `branch_unlock` / `branch_locks`:跨进程的分支锁,存在 `~/.minko/locks/`;
429
+ 另一个 holder 持锁时会被拒绝,超过 30 分钟的锁可被替换;
430
+ - `branch_status`:当前分支、上游、领先/落后提交数、分支锁状态;
431
+ - git worktree lane 创建时会自动加锁,关闭时释放。
432
+
433
+ ## 手机审批
434
+
435
+ 流式请求(`?stream=1`,默认)遇到需要确认的工具时,SSE 会先发:
436
+
437
+ ```text
438
+ event: approval_request
439
+ data: { "id": "...", "tool": "run_shell", "title": "执行命令", "detail": "...", "danger": "exec" }
440
+ ```
441
+
442
+ 手机调用下面的接口批准或拒绝,之后会收到 `approval_resolved` 并继续执行:
443
+
444
+ ```http
445
+ POST /sessions/<id>/approve
446
+ Authorization: Bearer <token>
447
+ Content-Type: application/json
448
+
449
+ { "id": "<approval id>", "allow": true }
450
+ ```
451
+
452
+ 120 秒未处理会自动拒绝;SSE 连接断开也会拒绝。非流式请求(`?stream=0`)无法交互,
453
+ 需要确认的操作默认拒绝。等待审批期间,`GET /sessions` 的状态是 `waiting_approval`。
454
+
455
+ ## Web 工具
456
+
457
+ - `web_fetch`:抓取 http/https 页面并转成可读文本;HTML 会去掉脚本和样式,响应上限 2MB、超时 20 秒。
458
+ - `web_search`:请求 HTML 搜索页,返回标题、链接和摘要;默认 DuckDuckGo,可用
459
+ `web.searchUrl` 换成自建或兼容的搜索页。
460
+
461
+ ```json
462
+ { "web": { "searchUrl": "https://html.duckduckgo.com/html/" } }
463
+ ```
464
+
465
+ 网页内容会被当作数据而不是指令。
466
+
467
+ ## OAuth 登录
468
+
469
+ 支持通用 OAuth 2.0 设备码流程(RFC 8628)。在 `~/.minko/config.json` 配置:
470
+
471
+ ```json
472
+ {
473
+ "oauth": {
474
+ "deviceAuthorizationUrl": "https://id.example/device",
475
+ "tokenUrl": "https://id.example/token",
476
+ "clientId": "your-client-id",
477
+ "scopes": ["openid", "profile"],
478
+ "provider": "gateway",
479
+ "name": "work"
480
+ }
481
+ }
482
+ ```
483
+
484
+ 运行 `minko login`,按提示打开 URL 并输入代码。成功后:
485
+
486
+ - 令牌保存在 `~/.minko/oauth.json`(`0600`);
487
+ - `oauth.provider`(或当前激活服务商)的 `apiKey` 更新为 access token,并设置 `auth: "bearer"`;
488
+ - Anthropic 兼容网关会改用 `Authorization: Bearer`,而不是 `x-api-key`。
489
+
490
+ ## Docker 沙箱
491
+
492
+ 开启后 `run_shell` 在容器里执行,当前工作目录挂载到 `/workspace`:
493
+
494
+ ```json
495
+ {
496
+ "sandbox": {
497
+ "mode": "docker",
498
+ "image": "node:22",
499
+ "network": false,
500
+ "allowFallback": false,
501
+ "extraArgs": ["--memory=1g"]
502
+ }
503
+ }
504
+ ```
505
+
506
+ - 默认 `--network none`,容器内无法联网;
507
+ - Docker 不可用时默认拒绝执行(fail closed);`allowFallback: true` 才回退普通 shell;
508
+ - `minko sandbox` 查看状态;`minko doctor` 会检查 Docker 可用性。
509
+
510
+ ## 审批令牌
511
+
512
+ - `approval_create` 创建有限次数、会过期的审批令牌;令牌按工具名 + 命令/路径模式匹配;
513
+ - 创建令牌本身需要用户确认;deny 规则和 readonly/workspace 限制仍然优先;
514
+ - 匹配到有效令牌时,工具调用直接通过并扣减次数,不再弹确认;
515
+ - `approval_list` / `approval_revoke` 查看和撤销;
516
+ - 令牌存在 `~/.minko/approvals/`;
517
+ - 手机接口:`GET /approvals`、`POST /approvals`、`DELETE /approvals/<id>`。
518
+
519
+ ## RAG 服务
520
+
521
+ `minko rag --port 8787 [--host 127.0.0.1]` 启动本地 HTTP 服务:
522
+
523
+ - `GET /health`
524
+ - `GET /v1/stats`
525
+ - `POST /v1/query` `{ "query": "...", "top_k": 6, "root": "可选子目录" }`
526
+ - `POST /v1/rebuild`
527
+ - `GET /` 一个简单的查询页面
528
+
529
+ 返回格式与 `rag.remote` 客户端兼容(`results[].path/start_line/end_line/text/score`)。
530
+ `root` 必须位于服务启动目录内;默认只监听本机。
531
+
532
+ ## MCP server
533
+
534
+ `minko mcp-server` 把 Minko 的只读工具通过 stdio MCP 暴露给其他 agent,使用
535
+ newline-delimited JSON-RPC:
536
+
537
+ - `initialize` / `notifications/initialized`
538
+ - `tools/list` / `tools/call`
539
+ - `shutdown` / `exit`
540
+
541
+ 默认只暴露只读工具:`read_file`、`list_dir`、`search_files`、`retrieve_context`、
542
+ `lsp`、`web_fetch`、`web_search`;不暴露 `write_file`、`run_shell`。
543
+ MCP client 可配置 `command: "minko", args: ["mcp-server"]`。
544
+
545
+ MCP resources:
546
+
547
+ - 客户端会为每个 server 生成 `mcp__<server>__list_resources` 和
548
+ `mcp__<server>__read_resource`;
549
+ - 同时支持 prompts 与 resource templates:
550
+ `mcp__<server>__list_prompts`、`mcp__<server>__get_prompt`、
551
+ `mcp__<server>__list_resource_templates`;
552
+ - `minko mcp-server` 通过 `resources/list` 暴露工作区里的 `MINKO.md`、`AGENTS.md`、
553
+ `CLAUDE.md`、`README.md`、`package.json` 和项目技能文件,`resources/read` 只能读取
554
+ 工作目录内的文件;
555
+ - `prompts/list` 把项目技能暴露为 prompts,`prompts/get` 返回技能正文;
556
+ `resources/templates/list` 提供 `file://{path}` 模板。
557
+
558
+ ### 远程 MCP + OAuth
559
+
560
+ ```json
561
+ {
562
+ "mcpServers": {
563
+ "remote": {
564
+ "url": "https://mcp.example/rpc",
565
+ "token": "可选,已有的 Bearer token",
566
+ "oauth": {
567
+ "deviceAuthorizationUrl": "https://id.example/device",
568
+ "tokenUrl": "https://id.example/token",
569
+ "clientId": "client-id",
570
+ "scopes": ["mcp.read"]
571
+ }
572
+ }
573
+ }
574
+ }
575
+ ```
576
+
577
+ - 配置 `url` 时使用 Streamable HTTP 客户端,支持 JSON 和 SSE 响应、`Mcp-Session-Id` 和 Bearer 鉴权;
578
+ - `minko mcp-login remote` 走 OAuth 设备码流程,把 token 写回配置,并保存为
579
+ `~/.minko/oauth.json` 里的 `mcp:remote`;
580
+ - 目前没有自动 refresh,token 过期后重新运行 `mcp-login`。
581
+
582
+ ## SDK
583
+
584
+ `minko sdk` 通过 stdin/stdout 收发 NDJSON JSON-RPC 2.0,方法:
585
+
586
+ - `initialize`
587
+ - `session.create` `{ cwd?, model? }`
588
+ - `session.list` / `session.get` `{ session }` / `session.delete` `{ session }`
589
+ - `chat` `{ session, text, approval?: "ask" | "auto" }`
590
+ - `shutdown` / `exit`
591
+
592
+ `chat` 执行期间会输出 `minko.event` 通知(text / reasoning / tool_start / tool_end /
593
+ notice / done),并在结束时返回文本、usage 和会话信息。默认 `ask` 会拒绝需要确认的操作;
594
+ 需要无人值守时传 `approval: "auto"`。
595
+
596
+ ## 技能包(Skills)
597
+
598
+ Minko 读取 Agent Skills 规范(`SKILL.md` + YAML frontmatter)的技能包,并兼容 Claude Code 与 Codex 的目录约定:
599
+
600
+ | 来源 | 位置 | 优先级 |
601
+ | --- | --- | --- |
602
+ | 内置 | 随 Minko 打包(`assets/skills`) | 最低,可被覆盖 |
603
+ | Claude Code 用户级 | `~/.claude/skills/` | |
604
+ | Codex 用户级 | `~/.agents/skills/`(也兼容 `~/.codex/skills/`) | |
605
+ | Minko 用户级 | `~/.minko/skills/` | |
606
+ | 项目级 | 从 git 根目录到 cwd 的 `.claude/skills`、`.agents/skills`、`.minko/skills` | 最高,同目录下 `.minko` 优先 |
607
+
608
+ 同名技能按上表从低到高覆盖;离 cwd 更近的项目技能优先。
609
+
610
+ ```md
611
+ ---
612
+ name: review
613
+ description: 审查代码;在用户要求评审改动时使用。
614
+ license: MIT
615
+ allowed-tools: Read Grep Bash
616
+ ---
617
+ 检查 {{args}} 的改动,列出风险。
618
+ ```
619
+
620
+ - 解析 `name` / `description` / `license` / `compatibility` / `allowed-tools` / `metadata`,支持 `|`、`>` 多行描述和引号;
621
+ - 目录内的 `references/`、`scripts/`、`assets/` 会在加载时列为参考文件,可用 `read_file` 读取或 `run_shell` 执行;
622
+ - `skill_list` 列出全部技能及来源,`skill` 加载完整说明;
623
+ - `{{args}}` 和 `$ARGUMENTS` 会被调用参数替换;
624
+ - 内置技能:`code-review`、`systematic-debugging`、`test-driven-development`、`verification-before-completion`、`five-whys`、`buddhist-method`、`cyclomatic-complexity`、`vibe-sec`、`code-humanizer`、`brainstorming`、`writing-plans`(来源与许可见 `assets/skills/README.md`);
625
+ - 会话里可以用 `/skills` 查看;技能内容会标注为“任务指导”,不能覆盖系统安全规则。
626
+
66
627
  ## 数据位置
67
628
 
68
629
  ```
69
630
  ~/.minko/
70
631
  config.json 模型与服务地址(含 API Key)
71
632
  sessions/*.jsonl 会话记录
633
+ sessions/*.status.json 会话运行状态
634
+ memory/ 长期记忆
635
+ skills/ 用户技能包
636
+ plugins/ 插件
637
+ rag/*.json embeddings 向量缓存
638
+ oauth.json OAuth 令牌
639
+ workers/ worker 元数据与对话
640
+ tasks/ 任务板
641
+ cron/ 定时任务
642
+ locks/ 分支锁
643
+ approvals/ 审批令牌
644
+ lanes/ git worktree lane 状态
72
645
  ```
73
646
 
74
- 删除会话直接删对应文件;`minko sessions` 可查 id。
647
+ 会话按消息增量落盘:每个 assistant / tool 消息产生后立即保存,进程崩溃或 `Ctrl+C`
648
+ 之后仍能续接;加载旧会话时会自动补齐未返回结果的工具调用。删除会话直接删对应文件;
649
+ `minko sessions` 可查 id。
75
650
 
76
651
  ## 手机远控(规划中)
77
652
 
@@ -80,7 +655,7 @@ minko --auto "..." # 不再逐条确认(危险)
80
655
  ## 开发
81
656
 
82
657
  ```bash
83
- npm test # node:test,49 条
658
+ npm test # node:test,310 条
84
659
  npm run typecheck
85
660
  node bin/minko.js --help
86
661
  ```
Binary file
@@ -0,0 +1,46 @@
1
+ palette: #171b34 x35 #7ff7ba x7 #9a88dc x16 #b9aaf0 x14 #cfc4e7 x33 #fef6e6 x42
2
+ frame 0
3
+ ▄█▀▀
4
+ ▄███▄▄ ▄
5
+ ████████████
6
+ ▀███████████▄
7
+ ███████████▀
8
+ ▀████████████
9
+ ██████████▀▀
10
+ ▀ ▀██▀███▀
11
+ frame 1
12
+ ▄█▀▀
13
+ ▄███▄▄ ▄
14
+ ████████████
15
+ ▀███████████▄
16
+ ███████████▀
17
+ ▀████████████
18
+ ██████████▀▀
19
+ ▀ ▀██▀███▀
20
+ frame 2
21
+ ▄█▀▀
22
+ ▄███▄▄ ▄
23
+ ████████████
24
+ ▀███████████▄
25
+ ███████████▀
26
+ ▀████████████
27
+ ██████████▀▀
28
+ ▀ ▀██▀███▀
29
+ frame 3
30
+ ▄▄▄
31
+ ▄██
32
+ ██████▄▄▄█▄▄
33
+ ████████████
34
+ ████████████
35
+ ███████████▄▄
36
+ ▄███████████▀
37
+ █▀████████
38
+ frame 4
39
+ ▄█▀▀
40
+ ▄███▄▄ ▄
41
+ ████████████
42
+ ▀███████████▄
43
+ ███████████▀
44
+ ▀████████████
45
+ ██████████▀▀
46
+ ▀ ▀██▀███▀
Binary file