OpenCode插件 - mimocode-compose -已开源,来自MiMoCode的Compose智能体移植

开源地址:https://gitee.com/opencode-plugin/mimocode-compose

使用方式:
1、clone 到自己的目录

git clone https://gitee.com/opencode-plugin/mimocode-compose

npm install

2、将项目目录 agent/compose.md 复制到 ~/.config/opencode/agents/compose.md

(windows用户复制到:%USERPROFILE%/.config/opencode/agents/compose.md)

3、OpenCode配置文件中注册插件:目录写自己 clone 后的目录
%USERPROFILE%\.config\opencode\opencode.json

移植后的代码审核由 8044 大佬推荐的免费的Minimax-M3 执行
有没有用M3的自己去拿 免费活动到 6 月 17 日 - iFlow 补给站 - 心流AI交流社区

移植审核结果:

# mimocode-compose 项目 Review 报告

> **核心结论**:项目结构清晰,技能资源 1:1 字节级还原,构建可重复。相对官方源码做了正确的"插件化简化"和"中文化适配",并新增了 `resource` 参数扩展。

| 维度       | 评分                                     |
| ---------- | ---------------------------------------- |
| 资源完整性 | ⭐⭐⭐⭐⭐(44/44 字节一致)                  |
| 代码质量   | ⭐⭐⭐⭐(简洁清晰,仅 3 处小瑕疵)          |
| 架构合理性 | ⭐⭐⭐⭐⭐(正确处理了"插件层"的能力边界)    |
| 可维护性   | ⭐⭐⭐⭐⭐(`upstream-sync-guide.md` 极佳)   |
| 文档质量   | ⭐⭐⭐⭐(README + 同步手册 + 代码注释齐全) |
| **综合**   | **高质量的移植项目**                     |

---

## 一、技能资源完整性

通过 SHA256 哈希校验:**44 个技能文件全部与官方 `.bundle/` 字节完全一致**。

| 维度       | 官方 (MiMo-Code)                                             | 下游 (mimocode-compose) | 结果     |
| ---------- | ------------------------------------------------------------ | ----------------------- | -------- |
| 技能目录数 | 15 个                                                        | 15 个                   | 一致     |
| 总文件数   | 44 个                                                        | 44 个                   | 一致     |
| 字节哈希   | —                                                            | —                       | 全部相同 |
| 关键文件   | `debug/condition-based-waiting-example.ts` (5054 B)、`debug/find-polluter.sh`、`brainstorm/scripts/server.cjs`、`new-skill/graphviz-conventions.dot` 等非 .md 资源 | 全部存在                | 一致     |

> 经验证,`dist/skills/debug/condition-based-waiting-example.ts` 与 `src/` 和 `upstream/.bundle/` 哈希完全相同 (`40AE5EBE497FDF31...`),**它是 `copy-skills.cjs` 复制的资源**,不是 tsc 编译产物(被 `tsconfig.json` 的 `exclude` 正确屏蔽)。

---

## 二、核心源码改造质量

### 2.1 `src/index.ts` — 插件入口(54 行)

- **官方对应**:`tool/skill.ts`(76 行)+ `session/prompt.ts` L451-463(注入 `compose_skills` 块)
- **改造点**:删除了上游的 `<compose_skills>` 块注入(因插件模型没有 prompt.ts),改为注册 `skill` 工具直接读取文件
- **增强**:新增 `resource` 参数(用于加载 `implementer-prompt.md` 等子文件),这是上游没有的能力
- **event hook**:监听 `session.created`(排除子会话)触发自动 dream/distill,与上游 `session/prompt.ts` L2253-2287 行为一致

> 评价:插件无法注入系统提示,所以把"动态注入"降级为"工具按需加载",是合理的取舍。

### 2.2 `src/skills.ts` — 技能加载(54 行)

- **官方对应**:`extract.ts`(85 行)+ `bundle.macro.ts`(30 行),编译期内联到二进制,运行时解压到 `~/.mimocode/compose/<version>/skills/`
- **改造点**:改为 `__dirname/skills/` 直接读磁盘(因为技能文件已随插件发布到 `dist/skills/`)
- **缺失能力**:未实现 `composeSkillsBlock()`(用于生成 XML 注入块),但插件模型确实用不到
- **未使用导入**:`relative` 被 import 但未使用(无副作用)

> 评价:去掉了 Effect + Bun macro + gray-matter frontmatter 解析这一整套重型设施,**用最小代码完成等价功能**,符合"最小化代码"哲学。

### 2.3 `src/auto-dream.ts` — 自进化触发(73 → 82 行)

| 项目                                | 上游                                      | 下游                                               | 一致性     |
| ----------------------------------- | ----------------------------------------- | -------------------------------------------------- | ---------- |
| 默认 dream 间隔                     | 7 天                                      | 7 天                                               | 一致       |
| 默认 distill 间隔                   | 30 天                                     | 30 天                                              | 一致       |
| 状态存储                            | SQLite(`SessionTable.title` 查询)       | JSON 文件(`~/.mimocode-compose/state.json`)      | 行为等价   |
| 间隔判定                            | `now - lastRun.time_created < intervalMs` | `now - entry.lastRun < intervalDays * DAY_MS`      | 等价       |
| "项目太年轻" 检查                   | 有                                        | 缺失(注释说明插件无 project start time 查询能力) | 可接受     |
| `MIN_SPAWN_GAP_MS` 10s 限流         | 有                                        | **已补回**(见第六节)                             | 一致       |
| 自动 spawn session                  | 能做到                                    | 受限(已在代码注释里说明)                         | 受限       |
| `DREAM_TASK` / `DISTILL_TITLE` 常量 | 有                                        | 缺失                                               | 简化可接受 |

### 2.4 `scripts/copy-skills.cjs` — 构建期复制(22 行)

简洁可靠,递归复制 `src/skills/` → `dist/skills/`,正确处理嵌套子目录。

### 2.5 `tsconfig.json` — 编译配置

`src/skills/**/*.ts` 这条 exclude 是必要的(防止 `condition-based-waiting-example.ts` 被 tsc 编译报错),但 `copy-skills.cjs` 仍会把它作为资源复制到 `dist/skills/`,**最终结果正确**。

---

## 三、命令/Agent 模板的中文化适配

| 文件                  | 上游                                   | 下游   | 评价                                                         |
| --------------------- | -------------------------------------- | ------ | ------------------------------------------------------------ |
| `agent/compose.md`    | `session/prompt/compose.txt`(115 行) | 118 行 | 完整翻译 + Agent frontmatter 包装,覆盖了上游的全部 12 个小节 |
| `commands/dream.md`   | `agent/prompt/dream.txt`(155 行)     | 161 行 | 完整翻译,含 5 个 Phase                                      |
| `commands/distill.md` | `agent/prompt/distill.txt`(199 行)   | 147 行 | 完整翻译,含 6 个 Phase                                      |

翻译质量良好,技术术语(`HARD-GATE`、`HEADLESS`、`MEMORY.md`、`checkpoint.md`)保留原文。

---

## 四、上游"灵魂"特性 vs 插件实现的取舍

| 上游特性                      | 插件能力           | 差异原因                       | 评价              |
| ----------------------------- | ------------------ | ------------------------------ | ----------------- |
| HTTP API `/agent` / `/skill`  | 无                 | 插件只是 SDK 层扩展            | 不需要            |
| ACP 协议                      | 无                 | 插件层无法实现协议 server      | 不需要            |
| 内置 `compose` agent          | 用户手动复制       | 插件不能注册 agent 类型        | 已在 README 说明  |
| `<compose_skills>` XML 注入   | 无                 | 插件不能修改系统 prompt        | 用 skill 工具替代 |
| `extractComposeBundle` 提取   | 改为随插件发布     | 插件就是发布载体               | 更直接            |
| Bun macro 内联                | 改为运行时 fs 读取 | Bun 宏无法在 OpenCode 进程使用 | 合理              |
| Effect + SQLite 查询          | 改为 JSON 文件     | 插件不应依赖内部存储           | 简化合理          |
| `DREAM_TASK` / `DISTILL_TASK` | 缺失               | 插件不能 spawn session         | 可接受            |

整体而言,**"插件能做的全做、不能做的明确说明限制"**这一原则贯彻得很好。

---

## 五、额外亮点

1. **`docs/upstream-sync-guide.md`(239 行)**:详细的上游同步手册,包含文件映射表、PowerShell diff 脚本、5 种更新场景的工作流。**这是项目的优秀资产**,能极大降低后续维护成本。
2. **构建脚本顺序**:`tsc && node scripts/copy-skills.cjs`,先编译 TypeScript,再复制技能资源,逻辑正确。
3. **错误吞咽**:`checkAutoDream` / `checkAutoDistill` 的 try/catch 设计为永远不抛错,符合"插件崩溃不能影响 OpenCode 主流程"的原则。

---

## 六、建议清单(可选)

### 6.1 建议改

无。当前 PR 已处理完所有"建议改"级别的问题。

### 6.2 锦上添花

1. 添加一个简单的 smoke test,验证 `loadSkill('compose:plan')` 能正确返回 15 个 SKILL.md 之一
2. `agent/compose.md` 的描述可考虑加上"中文化"提示(避免用户期望英文环境时困惑)
3. 考虑把 `dist/` 加入 `.gitignore` 并设置 `"prepare": "npm run build"` 确保发布前总构建

---

## 七、构建状态验证

清理后重新构建,dist 产物:

- 12 个编译产物(`.js` / `.d.ts` / `.map` × 3 个源文件)
- 44 个技能资源(与 upstream `.bundle/` 字节相同)
- **共 56 个文件,与上游能力完全等价**

```
$ npm run build
> tsc && node scripts/copy-skills.cjs
(无错误,无警告)
```

---

## 八、参考

- 上游源码:`MiMo-Code\packages\opencode\src\skill\compose\`
- 同步手册:`mimocode-compose\docs\upstream-sync-guide.md`

Compose 智能体 官方定义里它是一个编排器,可以调用子智能体,15个技能是它的专有技能(是通过插件注入的),并不是全局的,因此不会影响其它智能体的上下文(15个工具的定义),通过 TAB键 切换,不会与 OMO 冲突(OMO的4个依然在)

Compose 智能体 专有的编排技能,这些技能不显示在 <available_skills> 列表中

1 个赞

mimocode在每次任务后在对话窗口自动补全指令建议,真是贴心棉袄啊

赞赞赞 :+1:

简直就是牛逼 :star_struck:

呐呐,免费的接口你也可以加上 MiMo Code Free 公共节点 - 完整使用方法

协议(两步)

第一步:Bootstrap 获取临时 JWT


POST https://api.xiaomimimo.com/api/free-ai/bootstrap
Content-Type: application/json

{
  "client": "<sha256(hostname|platform|arch|cpu|username)>"
}
→ 返回 {"jwt": "eyJhbG..."}


第二步:调用对话


POST https://api.xiaomimimo.com/api/free-ai/openai/chat
Content-Type: application/json
X-Mimo-Source: mimocode-cli-free          ← 没这个 403!
x-session-affinity: ses_<24位随机字符>
Accept: text/event-stream
Authorization: Bearer <第一步的jwt>

{
  "model": "mimo-auto",
  "messages": [...],
  "stream": true
}


可用模型
| 模型 ID   | 名称                  |
|-----------|-----------------------|
| mimo-auto | MiMo Auto(推理模型) |

关键细节
- X-Mimo-Source: mimocode-cli-free — 必须带,否则 403
- JWT 有效期约 50 分钟(自动刷新)
- 必须用 SSE 流式(stream: true + Accept: text/event-stream)
- 系统提示自动注入 MiMoCode 身份
- 完全免费,无需 API Key

Python 示例

python
import requests, hashlib, random, string

Bootstrap
client = hashlib.sha256("host|linux|x64|cpu|user".encode()).hexdigest()
jwt = requests.post("https://api.xiaomimimo.com/api/free-ai/bootstrap",
    json={"client": client}).json()["jwt"]

Chat
session = "ses_" + "".join(random.choices(string.ascii_lowercase + string.digits, k=24))
resp = requests.post("https://api.xiaomimimo.com/api/free-ai/openai/chat",
    headers={
        "Content-Type": "application/json",
        "X-Mimo-Source": "mimocode-cli-free",
        "x-session-affinity": session,
        "Accept": "text/event-stream",
        "Authorization": f"Bearer {jwt}"
    },
    json={"model": "mimo-auto", "messages": [{"role": "user", "content": "你好"}], "stream": True},
    stream=True)

for line in resp.iter_lines(decode_unicode=True):
    if line: print(line)

有没有已经安装插件的兄弟,用起来怎么样啊?怎么看不到使用反馈啊

前两天一直报429,群里都炸了,我自己做的插件一直报403,加了你说的请求头也没用,逻辑完全和官方源码一样,不知道是哪里的问题,今天官方把免费通道关了


原来这个通道是要这样:ctrl+p设置-连接连接服务商–免费通道

import requests, hashlib, random, string, os, getpass, platform

=== Bootstrap 获取 JWT ===

hostname = platform.node() or “unknown-host”
plat = platform.system().lower() # e.g. “linux”, “windows”, “darwin”
arch = platform.machine() # e.g. “x86_64”, “AMD64”, “aarch64”
cpu = platform.processor() or “unknown-cpu”
username = getpass.getuser() or “unknown-user”

seed = f"{hostname}|{plat}|{arch}|{cpu}|{username}"
client = hashlib.sha256(seed.encode()).hexdigest()

print(f"指纹种子: {seed}“)
print(f"客户端指纹: {client}”)

resp = requests.post(
https://api.xiaomimimo.com/api/free-ai/bootstrap”,
headers={“Content-Type”: “application/json”},
json={“client”: client}
)
print(f"Bootstrap 状态码: {resp.status_code}“)
jwt = resp.json().get(“jwt”)
if not jwt:
print(“:cross_mark: Bootstrap 失败:”, resp.text)
exit(1)
print(f":white_check_mark: JWT 获取成功: {jwt[:30]}…”)

=== Chat 请求 ===

session = “ses_” + “”.join(random.choices(string.ascii_lowercase + string.digits, k=24))

:warning: 关键:必须包含 MiMoCode 系统提示,否则 403!

messages = [
{
“role”: “system”,
“content”: “You are MiMoCode, an interactive CLI tool that helps users with software engineering tasks.”
},
{
“role”: “user”,
“content”: “你好,请用一句话介绍你自己”
}
]

resp = requests.post(
https://api.xiaomimimo.com/api/free-ai/openai/chat”,
headers={
“Content-Type”: “application/json”,
“X-Mimo-Source”: “mimocode-cli-free”,
“x-session-affinity”: session,
“Accept”: “text/event-stream”,
“Authorization”: f"Bearer {jwt}"
},
json={
“model”: “mimo-auto”,
“messages”: messages,
“stream”: True
},
stream=True
)
resp.encoding = “utf-8” # 修复中文编码

print(f"\nChat 状态码: {resp.status_code}“)
if resp.status_code != 200:
print(f":cross_mark: 请求失败: {resp.text}”)
exit(1)

import json

print(“\n— 思考过程 —”)
reasoning = “”
answer = “”
for line in resp.iter_lines(decode_unicode=True):
if not line or not line.startswith("data: "):
continue
payload = line[6:]
if payload.strip() == “[DONE]”:
break
try:
chunk = json.loads(payload)
delta = chunk[“choices”][0][“delta”]
if delta.get(“reasoning_content”):
reasoning += delta[“reasoning_content”]
if delta.get(“content”):
answer += delta[“content”]
except (json.JSONDecodeError, KeyError, IndexError):
continue

print(reasoning)
print(“\n— 最终回答 —”)
print(answer) 自己建一个 Python脚本或者发给 ai工具告诉他插入这个供应商,他会给你弄好,这个是完整的对话脚本 py+sequests 公共节点还能用

1 个赞

非常感谢!我试试

这个JWT认证是拿一次的,你要改成50分钟或者40分钟自动刷新,这个不用说应该都会写

https://github.com/yinianhuakai000/mimocode-auth,试试这个,opencode插件,我在用。/connect,mimocode auth就完事了。

1 个赞

哈哈,我这两天忙都没时间整,有大佬搞好了也是真不错的,省时间了

关闭了免费窗口吗 现在这个插件还能用吗

可以用: