oh-my-opencode-cohub 1.11.0 → 1.12.0
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.
- package/README.md +121 -1
- package/dist/cli/config-io.d.ts +1 -1
- package/dist/cli/config-io.d.ts.map +1 -1
- package/dist/cli/index.js +279 -38
- package/dist/config/loader.d.ts +0 -2
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -79
- package/dist/prompts/orchestrator.d.ts +1 -1
- package/dist/prompts/orchestrator.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -56,6 +56,126 @@ npm install oh-my-opencode-cohub
|
|
|
56
56
|
|
|
57
57
|
重启 OpenCode 即可。
|
|
58
58
|
|
|
59
|
+
### 方式三:复制文案交给 AI 配置
|
|
60
|
+
|
|
61
|
+
如果你不想用命令行,也可以复制以下文案粘贴给 AI,让 AI 帮你生成 `oh-my-opencode-cohub.json` 配置文件。
|
|
62
|
+
|
|
63
|
+
> **注意:这只生成 `oh-my-opencode-cohub.json`(代理模型配置)。插件本身仍需通过方式一或方式二安装。**
|
|
64
|
+
|
|
65
|
+
````
|
|
66
|
+
|
|
67
|
+
## 你的任务
|
|
68
|
+
|
|
69
|
+
帮我生成 oh-my-opencode-cohub 的配置文件。
|
|
70
|
+
|
|
71
|
+
**要求:收到后先分析我的环境、输出配置方案表格、等我确认后再写入文件,不要直接动手改。**
|
|
72
|
+
|
|
73
|
+
## 执行步骤
|
|
74
|
+
|
|
75
|
+
### 第一步:分析环境
|
|
76
|
+
|
|
77
|
+
读取 `~/.config/opencode/opencode.json`,找到所有已配置的 provider 和 model,整理成表格给我看。
|
|
78
|
+
|
|
79
|
+
### 第二步:输出配置方案
|
|
80
|
+
|
|
81
|
+
根据下面规则,输出每个代理的 model 和 variant 分配表格,等我确认。
|
|
82
|
+
|
|
83
|
+
### 第三步:写入文件
|
|
84
|
+
|
|
85
|
+
确认后将配置写入 `~/.config/opencode/oh-my-opencode-cohub.json`。
|
|
86
|
+
|
|
87
|
+
## 配置文件结构
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"$schema": "https://unpkg.com/oh-my-opencode-cohub@latest/oh-my-opencode-cohub.schema.json",
|
|
92
|
+
"agents": {
|
|
93
|
+
"co-orchestrator": { "model": "provider/model", "variant": "max" },
|
|
94
|
+
...
|
|
95
|
+
},
|
|
96
|
+
"council": {
|
|
97
|
+
"default_preset": "default",
|
|
98
|
+
"timeout": 180000,
|
|
99
|
+
"councillor_execution_mode": "parallel",
|
|
100
|
+
"councillor_retries": 3,
|
|
101
|
+
"presets": {
|
|
102
|
+
"default": {
|
|
103
|
+
"alpha": { "model": "provider/model", "variant": "max" },
|
|
104
|
+
"beta": { "model": "provider/model", "variant": "high" },
|
|
105
|
+
"gamma": { "model": "provider/model", "variant": "medium" }
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 12 个代理配置规则
|
|
113
|
+
|
|
114
|
+
| 代理 | 角色 | 推理强度 | variant 建议 | 模型偏好 |
|
|
115
|
+
|------|------|---------|-------------|---------|
|
|
116
|
+
| co-orchestrator | 纯调度者,编排任务、委派执行 | **重型** | max / xhigh | pro、max、sonnet、opus 等强推理模型 |
|
|
117
|
+
| co-oracle | 战略顾问,架构审查、复杂调试 | **重型** | max / xhigh | 同上 |
|
|
118
|
+
| co-planner | 方案制定,综合信息输出任务分解 | **重型** | max / xhigh | 同上 |
|
|
119
|
+
| co-council | 多模型共识,跨多个 LLM 综合 | **重型** | high / xhigh | 同上 |
|
|
120
|
+
| co-librarian | 研究员,查文档、搜 GitHub、Web 搜索 | **轻型** | low / medium | flash、mini、haiku 等轻量快速模型 |
|
|
121
|
+
| co-explorer | 代码探索者,grep/glob 搜索定位 | **轻型** | low / medium | 同上 |
|
|
122
|
+
| co-fixer | 执行者,代码修改、编译、测试 | **轻型** | low / medium | 同上 |
|
|
123
|
+
| co-rule-user | 分析用户级 AGENTS.md 规范 | **轻型** | low / medium | 同上 |
|
|
124
|
+
| co-rule-project | 分析项目 AGENTS.md 规范 | **轻型** | low / medium | 同上 |
|
|
125
|
+
| co-rule-app | 分析 .opencode/rules/* 应用规则 | **轻型** | low / medium | 同上 |
|
|
126
|
+
| co-designer | 设计师,UI/UX 设计、视觉润色 | **中等** | high / medium | sonnet、claude、minimax 等前端/视觉强的模型 |
|
|
127
|
+
| co-observer | 观察者,图片/PDF/截图视觉分析 | **中等** | medium / high | vision、flash 等支持视觉的模型 |
|
|
128
|
+
|
|
129
|
+
## council 详细说明
|
|
130
|
+
|
|
131
|
+
council 是内置的多模型共识机制,会将同一个问题发给 3 个 councillor 并行回答,然后综合出最优方案。
|
|
132
|
+
|
|
133
|
+
| councillor | 角色定位 | 推理强度 | variant 建议 |
|
|
134
|
+
|-----------|---------|---------|-------------|
|
|
135
|
+
| alpha | 主力深度推理 | **重型** | max / xhigh |
|
|
136
|
+
| beta | 第二视角互补 | **重型/中等** | high / xhigh |
|
|
137
|
+
| gamma | 第三方校验 | **中等** | medium / high |
|
|
138
|
+
|
|
139
|
+
**关键配置项说明:**
|
|
140
|
+
|
|
141
|
+
| 字段 | 默认值 | 说明 |
|
|
142
|
+
|------|--------|------|
|
|
143
|
+
| `default_preset` | `"default"` | 默认使用的 preset 名称,可以定义多个 preset(如 `"quick"` 快速共识、`"deep"` 深度共识) |
|
|
144
|
+
| `timeout` | `180000`(3 分钟) | 单个 councillor 的超时时间(毫秒),所有 councillor 并行执行 |
|
|
145
|
+
| `councillor_execution_mode` | `"parallel"` | 执行模式:`"parallel"` 并行(快)或 `"serial"` 串行(省 tokens) |
|
|
146
|
+
| `councillor_retries` | `3` | 单个 councillor 调用失败后的重试次数 |
|
|
147
|
+
|
|
148
|
+
**presets 示例(多套配置):**
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
"presets": {
|
|
152
|
+
"default": {
|
|
153
|
+
"alpha": { "model": "deepseek/deepseek-v4-pro", "variant": "max" },
|
|
154
|
+
"beta": { "model": "anthropic/claude-sonnet-4-20250514", "variant": "high" },
|
|
155
|
+
"gamma": { "model": "openai/gpt-5.2", "variant": "high" }
|
|
156
|
+
},
|
|
157
|
+
"quick": {
|
|
158
|
+
"alpha": { "model": "deepseek/deepseek-v4-pro", "variant": "high" },
|
|
159
|
+
"beta": { "model": "openai/gpt-5.2", "variant": "medium" },
|
|
160
|
+
"gamma": { "model": "anthropic/claude-sonnet-4-20250514", "variant": "medium" }
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## 分配规则
|
|
166
|
+
|
|
167
|
+
- 从 opencode.json 读取已配置的 provider,按上表规则为每个代理分配 model 和 variant
|
|
168
|
+
- 只有 1 个 provider:所有代理都用它,variant 按表格建议选不同档位
|
|
169
|
+
- 有多个 provider:重型代理优先选最强推理 provider,轻型选最快 provider
|
|
170
|
+
- council 的 alpha/beta/gamma 优先选 3 个不同 provider;不够 3 个时用同一 provider 的不同 model
|
|
171
|
+
- opencode.json 无任何 provider 时,生成占位配置并在 `_comment` 字段提示用户先配置
|
|
172
|
+
|
|
173
|
+
## 注意
|
|
174
|
+
|
|
175
|
+
- 只写入 `oh-my-opencode-cohub.json`,不要修改 `opencode.json`
|
|
176
|
+
- agent 名必须用 `co-` 前缀(共 12 个),不要遗漏
|
|
177
|
+
````
|
|
178
|
+
|
|
59
179
|
### 卸载
|
|
60
180
|
|
|
61
181
|
```bash
|
|
@@ -188,7 +308,7 @@ CLI 安装后自动创建 `~/.config/opencode/oh-my-opencode-cohub.json`,这
|
|
|
188
308
|
| `presets` | object | (必填) | 预设字典,每个预设是一组 councillor |
|
|
189
309
|
| `default_preset` | string | `"default"` | 调用时不指定 preset 时使用的预设 |
|
|
190
310
|
| `timeout` | number | `180000` | 单个 councillor 超时(毫秒),默认 3 分钟 |
|
|
191
|
-
| `councillor_execution_mode` | `"parallel"` \| `"serial"` | `"parallel"` |
|
|
311
|
+
| `councillor_execution_mode` | `"parallel"` \| `"serial"` | `"parallel"` | 并行/串行执行 |
|
|
192
312
|
| `councillor_retries` | number | `3` | 空响应重试次数 |
|
|
193
313
|
|
|
194
314
|
- 每个 councillor 的 key(如 `alpha`、`beta`)可任意命名,会出现在输出中
|
package/dist/cli/config-io.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export declare function registerCoHubAgents(): {
|
|
|
13
13
|
success: boolean;
|
|
14
14
|
message: string;
|
|
15
15
|
};
|
|
16
|
-
/**
|
|
16
|
+
/** 写入默认配置模板(如文件不存在),智能匹配 opencode.json 中的 provider/model */
|
|
17
17
|
export declare function writeDefaultConfig(): {
|
|
18
18
|
success: boolean;
|
|
19
19
|
message: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-io.d.ts","sourceRoot":"","sources":["../../src/cli/config-io.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config-io.d.ts","sourceRoot":"","sources":["../../src/cli/config-io.ts"],"names":[],"mappings":"AAkCA,2CAA2C;AAC3C,wBAAgB,yBAAyB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAajF;AAED,sCAAsC;AACtC,wBAAgB,oBAAoB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAa5E;AAOD,mDAAmD;AACnD,wBAAgB,mBAAmB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAiD3E;AA+ED,4DAA4D;AAC5D,wBAAgB,kBAAkB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA2G1E;AAED,8BAA8B;AAC9B,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CA6GzE"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// package.json
|
|
3
|
-
var version = "1.
|
|
3
|
+
var version = "1.12.0";
|
|
4
4
|
|
|
5
5
|
// src/cli/config-io.ts
|
|
6
6
|
import * as fs from "node:fs";
|
|
@@ -17,7 +17,12 @@ function readJSON(filePath) {
|
|
|
17
17
|
try {
|
|
18
18
|
if (!fs.existsSync(filePath))
|
|
19
19
|
return null;
|
|
20
|
-
|
|
20
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(raw);
|
|
23
|
+
} catch {
|
|
24
|
+
return JSON.parse(raw.replace(/\/\/.*$/gm, ""));
|
|
25
|
+
}
|
|
21
26
|
} catch {
|
|
22
27
|
return null;
|
|
23
28
|
}
|
|
@@ -66,7 +71,7 @@ function registerCoHubAgents() {
|
|
|
66
71
|
config.agent = config.agent ?? {};
|
|
67
72
|
const agents = config.agent;
|
|
68
73
|
const cohubAgents = {
|
|
69
|
-
"co-orchestrator": { description: "纯调度者", mode: "
|
|
74
|
+
"co-orchestrator": { description: "纯调度者", mode: "primary", prompt: `<角色>
|
|
70
75
|
你是纯调度者(Orchestrator)。唯一职责:理解需求 → 委派信息收集 → 制定方案 → 调度子代理执行 → 委派验证。**绝不亲自使用任何文件/代码操作工具**(read、grep、glob、bash、edit、write 等)。可使用的工具是调度工具(task、todowrite)。
|
|
71
76
|
</角色>
|
|
72
77
|
|
|
@@ -158,7 +163,7 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
158
163
|
→ 需要修改代码或文件 → **必须先输出方案 → 提供选项 → 等用户选择后才可委派执行**
|
|
159
164
|
|
|
160
165
|
</自检清单>
|
|
161
|
-
|
|
166
|
+
` },
|
|
162
167
|
"co-oracle": { description: "战略顾问", mode: "subagent", prompt: `你是 Oracle——战略技术顾问和代码审查者。
|
|
163
168
|
|
|
164
169
|
**角色**: 高智商调试、架构决策、代码审查、简化、工程指导。
|
|
@@ -188,7 +193,7 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
188
193
|
- Bash 可用于非变更诊断和 shell 原生检查(最清晰时),但不能修改文件
|
|
189
194
|
- 不要用 cat/head/tail/sed/awk 读取代码到上下文中;使用 read/grep,除非 shell 管道确实是更好的诊断方式
|
|
190
195
|
|
|
191
|
-
**语言要求**:
|
|
196
|
+
**语言要求**: 始终使用中文进行思考、分析和回复。代码和技术术语可用原文,自然语言部分必须用中文。` },
|
|
192
197
|
"co-librarian": { description: "研究员", mode: "subagent", prompt: `你是 Librarian——代码库和文档研究专家。
|
|
193
198
|
|
|
194
199
|
**角色**: 多仓库分析、官方文档查询、GitHub 示例、库研究。
|
|
@@ -216,7 +221,7 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
216
221
|
- 有官方文档时附链接
|
|
217
222
|
- 区分官方模式和社区模式
|
|
218
223
|
|
|
219
|
-
**语言要求**:
|
|
224
|
+
**语言要求**: 始终使用中文进行思考、分析和回复。代码和技术术语可用原文,自然语言部分必须用中文。` },
|
|
220
225
|
"co-explorer": { description: "代码探索者", mode: "subagent", prompt: `你是 Explorer——快速代码库导航专家。
|
|
221
226
|
|
|
222
227
|
**角色**: 代码库快速上下文搜索。回答"X 在哪里?""找到 Y""哪个文件有 Z"。
|
|
@@ -252,7 +257,7 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
252
257
|
- 详尽但简洁
|
|
253
258
|
- 包含行号
|
|
254
259
|
|
|
255
|
-
**语言要求**:
|
|
260
|
+
**语言要求**: 始终使用中文进行思考、搜索分析和回复。代码和技术术语可用原文,自然语言部分必须用中文。` },
|
|
256
261
|
"co-designer": { description: "设计师", mode: "subagent", prompt: `你是 Designer——前端 UI/UX 专家,创造和审查有意图的、精致的体验。
|
|
257
262
|
|
|
258
263
|
**角色**: 打造和审查兼具视觉冲击力与可用性的统一 UI/UX。
|
|
@@ -317,7 +322,7 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
317
322
|
## 输出质量
|
|
318
323
|
你有能力做出非凡的创意作品。全力投入独特的设计愿景,展示深思熟虑地打破常规的可能。
|
|
319
324
|
|
|
320
|
-
**语言要求**: 始终使用中文进行思考和回复。代码(CSS/HTML
|
|
325
|
+
**语言要求**: 始终使用中文进行思考和回复。代码(CSS/HTML/组件)可用英文。解释、设计说明等自然语言必须用中文。` },
|
|
321
326
|
"co-fixer": { description: "执行者", mode: "subagent", prompt: `你是 Fixer——快速、聚焦的实现专家。
|
|
322
327
|
|
|
323
328
|
**角色**: 高效执行代码变更。你从研究代理处接收完整上下文,从 Orchestrator 处接收清晰的任务规范。你的工作是实施,不是规划或研究。
|
|
@@ -368,7 +373,7 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
368
373
|
- 验证: [未运行 - 原因]
|
|
369
374
|
</verification>
|
|
370
375
|
|
|
371
|
-
**语言要求**:
|
|
376
|
+
**语言要求**: 始终使用中文进行思考和回复(摘要、变更说明等自然语言)。代码本身可用英文。禁止输出英文自然语言。` },
|
|
372
377
|
"co-observer": { description: "观察者", mode: "subagent", prompt: `你是 Observer——视觉分析专家。
|
|
373
378
|
|
|
374
379
|
**角色**: 解释图片、截图、PDF 和图表。提取结构化观察结果供 Orchestrator 使用。
|
|
@@ -393,7 +398,7 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
393
398
|
- Bash 可用于非变更诊断和 shell 原生检查(最清晰时),但不能修改文件
|
|
394
399
|
- 不要用 cat/head/tail/sed/awk 读取代码到上下文中;使用 read/grep,除非 shell 管道确实是更好的诊断方式
|
|
395
400
|
|
|
396
|
-
**语言要求**:
|
|
401
|
+
**语言要求**: 始终使用中文进行思考、分析和回复。提取的文字内容保留原文,但你的分析说明必须用中文。` },
|
|
397
402
|
"co-council": { description: "多模型共识", mode: "subagent", prompt: `你是 Council 代理——一个跨多个 LLM 模型运行共识并综合结果的协调系统。
|
|
398
403
|
|
|
399
404
|
**工具**: 你有 \`council_session\` 工具和只读代码库检查工具。你没有写入、编辑、shell 或子代理委派工具。
|
|
@@ -455,22 +460,22 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
455
460
|
## Council 总结
|
|
456
461
|
总结 councillor 在哪些方面共识、哪些方面分歧,为什么选择最终答案,以及剩余的不确定性。包含共识信心评级:一致、多数或分歧。
|
|
457
462
|
|
|
458
|
-
**语言要求**: 始终使用中文进行思考、综合和回复。Council 响应、总结等自然语言部分必须用中文。Code examples 可用英文。`,
|
|
463
|
+
**语言要求**: 始终使用中文进行思考、综合和回复。Council 响应、总结等自然语言部分必须用中文。Code examples 可用英文。`, permission: { council_session: "allow" } },
|
|
459
464
|
"co-rule-user": { description: "用户规范分析", mode: "subagent", prompt: `你是规则分析代理——负责用户级规范。
|
|
460
465
|
|
|
461
466
|
**职责**:读取 \`~/.config/opencode/AGENTS.md\`(用户级全局规则),结合 Orchestrator 提供的当前方案,分析是否有遗漏或冲突。返回具体的调整建议(不要笼统)。
|
|
462
467
|
|
|
463
|
-
|
|
468
|
+
**约束**:只读,不修改文件。聚焦规则与方案的映射关系。` },
|
|
464
469
|
"co-rule-project": { description: "项目规范分析", mode: "subagent", prompt: `你是规则分析代理——负责项目级规范。
|
|
465
470
|
|
|
466
471
|
**职责**:读取项目根目录 \`AGENTS.md\`(项目级规则),结合 Orchestrator 提供的当前方案,分析是否有遗漏或冲突。返回具体的调整建议(不要笼统)。
|
|
467
472
|
|
|
468
|
-
|
|
473
|
+
**约束**:只读,不修改文件。聚焦规则与方案的映射关系。` },
|
|
469
474
|
"co-rule-app": { description: "应用规则分析", mode: "subagent", prompt: `你是规则分析代理——负责应用规则。
|
|
470
475
|
|
|
471
476
|
**职责**:读取 \`.opencode/rules/*.md\`(应用规则:安全、测试、数据库、Git 工作流等),结合 Orchestrator 提供的当前方案,分析是否有遗漏或冲突。返回具体的调整建议(不要笼统)。
|
|
472
477
|
|
|
473
|
-
|
|
478
|
+
**约束**:只读,不修改文件。聚焦规则与方案的映射关系。` },
|
|
474
479
|
"co-planner": { description: "方案制定", mode: "subagent", prompt: `你是方案制定代理——负责任务分解和委派策略。
|
|
475
480
|
|
|
476
481
|
**职责**:接收用户需求、信息收集结果(代码库结构、API文档等)、规范分析反馈,综合制定结构化的实现方案。
|
|
@@ -481,7 +486,7 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
481
486
|
- 并行化策略
|
|
482
487
|
- 验证步骤
|
|
483
488
|
|
|
484
|
-
**约束**:只读,不修改文件。方案要具体到文件和操作粒度,不可笼统。用 \`todowrite\`
|
|
489
|
+
**约束**:只读,不修改文件。方案要具体到文件和操作粒度,不可笼统。用 \`todowrite\` 风格的任务列表输出。` }
|
|
485
490
|
};
|
|
486
491
|
let added = 0;
|
|
487
492
|
let migrated = 0;
|
|
@@ -499,49 +504,161 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
499
504
|
if (added > 0 || migrated > 0) {
|
|
500
505
|
writeJSON(configPath, config);
|
|
501
506
|
}
|
|
507
|
+
if (!config.default_agent) {
|
|
508
|
+
config.default_agent = "co-orchestrator";
|
|
509
|
+
writeJSON(configPath, config);
|
|
510
|
+
}
|
|
502
511
|
return { success: true, message: `✓ CoHub 代理:新增 ${added} 个,更新 ${migrated} 个${added + migrated === 0 ? "(全部已是最新,跳过)" : ""}` };
|
|
503
512
|
}
|
|
504
513
|
var COHUB_CONFIG_PATH = path.join(os.homedir(), ".config", "opencode", "oh-my-opencode-cohub.json");
|
|
514
|
+
var HEAVY_KEYWORDS = ["pro", "preview", "opus", "max", "sonnet", "gpt-5.6"];
|
|
515
|
+
var LIGHT_KEYWORDS = ["flash", "mini", "haiku", "gpt-5.4", "gpt-5.3"];
|
|
516
|
+
var DESIGN_KEYWORDS = ["minimax", "m3", "sonnet", "claude"];
|
|
517
|
+
var OBSERVER_KEYWORDS = ["gpt-5.5", "gpt-5.4", "vision", "flash"];
|
|
518
|
+
var HEAVY_TYPES = new Set(["orchestrator", "oracle", "planner", "council"]);
|
|
519
|
+
function pickBestVariant(variants, agentType) {
|
|
520
|
+
if (!variants || variants.length === 0)
|
|
521
|
+
return;
|
|
522
|
+
const isHeavy = HEAVY_TYPES.has(agentType);
|
|
523
|
+
const priority = isHeavy ? ["max", "xhigh", "high", "medium", "low"] : ["low", "medium", "high", "xhigh", "max"];
|
|
524
|
+
for (const p of priority) {
|
|
525
|
+
if (variants.includes(p))
|
|
526
|
+
return p;
|
|
527
|
+
}
|
|
528
|
+
return variants[0];
|
|
529
|
+
}
|
|
530
|
+
function findBestModel(flatModels, keywords, agentType) {
|
|
531
|
+
for (const kw of keywords) {
|
|
532
|
+
for (const m of flatModels) {
|
|
533
|
+
const modelId = m.fullModel.split("/").slice(1).join("/").toLowerCase();
|
|
534
|
+
if (modelId.includes(kw.toLowerCase())) {
|
|
535
|
+
return { model: m.fullModel, variant: pickBestVariant(m.variants, agentType) };
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
if (flatModels.length > 0) {
|
|
540
|
+
return { model: flatModels[0].fullModel, variant: pickBestVariant(flatModels[0].variants, agentType) };
|
|
541
|
+
}
|
|
542
|
+
return null;
|
|
543
|
+
}
|
|
544
|
+
function flattenModelsFromOpenCode() {
|
|
545
|
+
const opencodeConfig = readJSON(getOpencodeConfigPath());
|
|
546
|
+
if (!opencodeConfig)
|
|
547
|
+
return [];
|
|
548
|
+
const providerRecord = opencodeConfig?.config;
|
|
549
|
+
const providers = providerRecord?.provider;
|
|
550
|
+
if (!providers)
|
|
551
|
+
return [];
|
|
552
|
+
const result = [];
|
|
553
|
+
for (const [providerKey, providerData] of Object.entries(providers)) {
|
|
554
|
+
const models = providerData?.models;
|
|
555
|
+
if (!models)
|
|
556
|
+
continue;
|
|
557
|
+
for (const [modelId, modelData] of Object.entries(models)) {
|
|
558
|
+
result.push({
|
|
559
|
+
fullModel: `${providerKey}/${modelId}`,
|
|
560
|
+
variants: modelData?.variants ?? []
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
return result;
|
|
565
|
+
}
|
|
505
566
|
function writeDefaultConfig() {
|
|
506
567
|
if (fs.existsSync(COHUB_CONFIG_PATH)) {
|
|
507
568
|
return { success: true, message: "oh-my-opencode-cohub.json 已存在,跳过" };
|
|
508
569
|
}
|
|
570
|
+
const flatModels = flattenModelsFromOpenCode();
|
|
571
|
+
if (flatModels.length === 0) {
|
|
572
|
+
const fallbackConfig = {
|
|
573
|
+
$schema: "https://unpkg.com/oh-my-opencode-cohub@latest/oh-my-opencode-cohub.schema.json",
|
|
574
|
+
agents: {},
|
|
575
|
+
council: { presets: {} },
|
|
576
|
+
_comment: "未找到可用供应商。请在 opencode.json 中配置 provider 后重新运行 install,或手动在此文件中配置 model 和 variant。"
|
|
577
|
+
};
|
|
578
|
+
try {
|
|
579
|
+
const dir = path.dirname(COHUB_CONFIG_PATH);
|
|
580
|
+
if (!fs.existsSync(dir))
|
|
581
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
582
|
+
fs.writeFileSync(COHUB_CONFIG_PATH, JSON.stringify(fallbackConfig, null, 2), "utf-8");
|
|
583
|
+
return { success: true, message: "✓ 已创建 oh-my-opencode-cohub.json(无可用 provider,请手动配置模型)" };
|
|
584
|
+
} catch {
|
|
585
|
+
return { success: false, message: "⚠ 无法创建配置文件" };
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
const agentSpecs = [
|
|
589
|
+
{ name: "co-orchestrator", keywords: HEAVY_KEYWORDS, agentType: "orchestrator" },
|
|
590
|
+
{ name: "co-oracle", keywords: HEAVY_KEYWORDS, agentType: "oracle" },
|
|
591
|
+
{ name: "co-librarian", keywords: LIGHT_KEYWORDS, agentType: "librarian" },
|
|
592
|
+
{ name: "co-explorer", keywords: LIGHT_KEYWORDS, agentType: "explorer" },
|
|
593
|
+
{ name: "co-designer", keywords: DESIGN_KEYWORDS, agentType: "designer" },
|
|
594
|
+
{ name: "co-fixer", keywords: LIGHT_KEYWORDS, agentType: "fixer" },
|
|
595
|
+
{ name: "co-observer", keywords: OBSERVER_KEYWORDS, agentType: "observer" },
|
|
596
|
+
{ name: "co-council", keywords: HEAVY_KEYWORDS, agentType: "council" },
|
|
597
|
+
{ name: "co-rule-user", keywords: LIGHT_KEYWORDS, agentType: "rule-user" },
|
|
598
|
+
{ name: "co-rule-project", keywords: LIGHT_KEYWORDS, agentType: "rule-project" },
|
|
599
|
+
{ name: "co-rule-app", keywords: LIGHT_KEYWORDS, agentType: "rule-app" },
|
|
600
|
+
{ name: "co-planner", keywords: HEAVY_KEYWORDS, agentType: "planner" }
|
|
601
|
+
];
|
|
602
|
+
const agents = {};
|
|
603
|
+
let matched = 0;
|
|
604
|
+
for (const spec of agentSpecs) {
|
|
605
|
+
const best = findBestModel(flatModels, spec.keywords, spec.agentType);
|
|
606
|
+
if (best) {
|
|
607
|
+
agents[spec.name] = { model: best.model, ...best.variant ? { variant: best.variant } : {} };
|
|
608
|
+
matched++;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
const usedProviders = new Set;
|
|
612
|
+
const councilSlots = [
|
|
613
|
+
{ key: "alpha", keywords: HEAVY_KEYWORDS, agentType: "council" },
|
|
614
|
+
{ key: "beta", keywords: LIGHT_KEYWORDS, agentType: "council" },
|
|
615
|
+
{ key: "gamma", keywords: DESIGN_KEYWORDS, agentType: "council" }
|
|
616
|
+
];
|
|
617
|
+
const presets = {};
|
|
618
|
+
let councilCount = 0;
|
|
619
|
+
for (const slot of councilSlots) {
|
|
620
|
+
const candidates = flatModels.filter((m) => !usedProviders.has(m.fullModel.split("/")[0]));
|
|
621
|
+
const pool = candidates.length > 0 ? candidates : flatModels;
|
|
622
|
+
const best = findBestModel(pool, slot.keywords, slot.agentType);
|
|
623
|
+
if (best && !usedProviders.has(best.model.split("/")[0])) {
|
|
624
|
+
presets[slot.key] = { model: best.model, ...best.variant ? { variant: best.variant } : {} };
|
|
625
|
+
usedProviders.add(best.model.split("/")[0]);
|
|
626
|
+
councilCount++;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
if (councilCount < 3 && councilCount < flatModels.length) {
|
|
630
|
+
const reservedSlots = ["alpha", "beta", "gamma"];
|
|
631
|
+
for (const m of flatModels) {
|
|
632
|
+
if (councilCount >= 3)
|
|
633
|
+
break;
|
|
634
|
+
const provider = m.fullModel.split("/")[0];
|
|
635
|
+
if (!usedProviders.has(provider)) {
|
|
636
|
+
const slot = reservedSlots[councilCount];
|
|
637
|
+
presets[slot] = { model: m.fullModel, ...pickBestVariant(m.variants, "council") ? { variant: pickBestVariant(m.variants, "council") } : {} };
|
|
638
|
+
usedProviders.add(provider);
|
|
639
|
+
councilCount++;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
}
|
|
509
643
|
const defaultConfig = {
|
|
510
644
|
$schema: "https://unpkg.com/oh-my-opencode-cohub@latest/oh-my-opencode-cohub.schema.json",
|
|
511
|
-
agents
|
|
512
|
-
|
|
513
|
-
"co-oracle": { model: "deepseek/deepseek-v4-pro", variant: "max" },
|
|
514
|
-
"co-librarian": { model: "deepseek/deepseek-v4-flash", variant: "low" },
|
|
515
|
-
"co-explorer": { model: "deepseek/deepseek-v4-flash", variant: "low" },
|
|
516
|
-
"co-designer": { model: "minimax/MiniMax-M3", variant: "medium" },
|
|
517
|
-
"co-fixer": { model: "deepseek/deepseek-v4-flash", variant: "high" },
|
|
518
|
-
"co-observer": { model: "codermxtest/gpt-5.5", variant: "low" },
|
|
519
|
-
"co-council": { model: "deepseek/deepseek-v4-pro", variant: "high" },
|
|
520
|
-
"co-rule-user": { model: "deepseek/deepseek-v4-flash", variant: "medium" },
|
|
521
|
-
"co-rule-project": { model: "deepseek/deepseek-v4-flash", variant: "medium" },
|
|
522
|
-
"co-rule-app": { model: "deepseek/deepseek-v4-flash", variant: "medium" },
|
|
523
|
-
"co-planner": { model: "deepseek/deepseek-v4-pro", variant: "high" }
|
|
524
|
-
},
|
|
525
|
-
council: {
|
|
645
|
+
agents,
|
|
646
|
+
council: councilCount > 0 ? {
|
|
526
647
|
default_preset: "default",
|
|
527
648
|
timeout: 180000,
|
|
528
649
|
councillor_execution_mode: "parallel",
|
|
529
650
|
councillor_retries: 3,
|
|
530
651
|
presets: {
|
|
531
|
-
default:
|
|
532
|
-
alpha: { model: "deepseek/deepseek-v4-pro", variant: "max" },
|
|
533
|
-
beta: { model: "deepseek/deepseek-v4-flash", variant: "high" },
|
|
534
|
-
gamma: { model: "minimax/MiniMax-M3", variant: "medium" }
|
|
535
|
-
}
|
|
652
|
+
default: presets
|
|
536
653
|
}
|
|
537
|
-
}
|
|
654
|
+
} : { presets: {} }
|
|
538
655
|
};
|
|
539
656
|
try {
|
|
540
657
|
const dir = path.dirname(COHUB_CONFIG_PATH);
|
|
541
658
|
if (!fs.existsSync(dir))
|
|
542
659
|
fs.mkdirSync(dir, { recursive: true });
|
|
543
660
|
fs.writeFileSync(COHUB_CONFIG_PATH, JSON.stringify(defaultConfig, null, 2), "utf-8");
|
|
544
|
-
return { success: true, message:
|
|
661
|
+
return { success: true, message: `✓ 已智能匹配 ${matched}/12 个代理的模型,生成 oh-my-opencode-cohub.json` };
|
|
545
662
|
} catch {
|
|
546
663
|
return { success: false, message: "⚠ 无法创建配置文件" };
|
|
547
664
|
}
|
|
@@ -671,7 +788,131 @@ async function main() {
|
|
|
671
788
|
console.log(`
|
|
672
789
|
✅ CoHub 安装完成!`);
|
|
673
790
|
console.log(' 重启 OpenCode 后,TAB 选择 "co-orchestrator" 开始纯调度模式。');
|
|
674
|
-
console.log(" 已注册
|
|
791
|
+
console.log(" 已注册 12 个 co-* 代理到 opencode.json 的 agent 字段。");
|
|
792
|
+
console.log(`
|
|
793
|
+
${"=".repeat(60)}`);
|
|
794
|
+
console.log("\uD83D\uDCCB 已自动生成默认代理模型配置。如需自定义,可复制以下文案让 AI 帮你优化:");
|
|
795
|
+
console.log(`${"=".repeat(60)}
|
|
796
|
+
`);
|
|
797
|
+
const aiPrompt = `
|
|
798
|
+
## 你的任务
|
|
799
|
+
|
|
800
|
+
帮我生成 oh-my-opencode-cohub 的配置文件。
|
|
801
|
+
|
|
802
|
+
**要求:收到后先分析我的环境、输出配置方案表格、等我确认后再写入文件,不要直接动手改。**
|
|
803
|
+
|
|
804
|
+
## 执行步骤
|
|
805
|
+
|
|
806
|
+
### 第一步:分析环境
|
|
807
|
+
|
|
808
|
+
读取 \`~/.config/opencode/opencode.json\`,找到所有已配置的 provider 和 model,整理成表格给我看。
|
|
809
|
+
|
|
810
|
+
### 第二步:输出配置方案
|
|
811
|
+
|
|
812
|
+
根据下面规则,输出每个代理的 model 和 variant 分配表格,等我确认。
|
|
813
|
+
|
|
814
|
+
### 第三步:写入文件
|
|
815
|
+
|
|
816
|
+
确认后将配置写入 \`~/.config/opencode/oh-my-opencode-cohub.json\`。
|
|
817
|
+
|
|
818
|
+
## 配置文件结构
|
|
819
|
+
|
|
820
|
+
\`\`\`json
|
|
821
|
+
{
|
|
822
|
+
"$schema": "https://unpkg.com/oh-my-opencode-cohub@latest/oh-my-opencode-cohub.schema.json",
|
|
823
|
+
"agents": {
|
|
824
|
+
"co-orchestrator": { "model": "provider/model", "variant": "max" },
|
|
825
|
+
...
|
|
826
|
+
},
|
|
827
|
+
"council": {
|
|
828
|
+
"default_preset": "default",
|
|
829
|
+
"timeout": 180000,
|
|
830
|
+
"councillor_execution_mode": "parallel",
|
|
831
|
+
"councillor_retries": 3,
|
|
832
|
+
"presets": {
|
|
833
|
+
"default": {
|
|
834
|
+
"alpha": { "model": "provider/model", "variant": "max" },
|
|
835
|
+
"beta": { "model": "provider/model", "variant": "high" },
|
|
836
|
+
"gamma": { "model": "provider/model", "variant": "medium" }
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
\`\`\`
|
|
842
|
+
|
|
843
|
+
## 12 个代理配置规则
|
|
844
|
+
|
|
845
|
+
| 代理 | 角色 | 推理强度 | variant 建议 | 模型偏好 |
|
|
846
|
+
|------|------|---------|-------------|---------|
|
|
847
|
+
| co-orchestrator | 纯调度者,编排任务、委派执行 | **重型** | max / xhigh | pro、max、sonnet、opus 等强推理模型 |
|
|
848
|
+
| co-oracle | 战略顾问,架构审查、复杂调试 | **重型** | max / xhigh | 同上 |
|
|
849
|
+
| co-planner | 方案制定,综合信息输出任务分解 | **重型** | max / xhigh | 同上 |
|
|
850
|
+
| co-council | 多模型共识,跨多个 LLM 综合 | **重型** | high / xhigh | 同上 |
|
|
851
|
+
| co-librarian | 研究员,查文档、搜 GitHub、Web 搜索 | **轻型** | low / medium | flash、mini、haiku 等轻量快速模型 |
|
|
852
|
+
| co-explorer | 代码探索者,grep/glob 搜索定位 | **轻型** | low / medium | 同上 |
|
|
853
|
+
| co-fixer | 执行者,代码修改、编译、测试 | **轻型** | low / medium | 同上 |
|
|
854
|
+
| co-rule-user | 分析用户级 AGENTS.md 规范 | **轻型** | low / medium | 同上 |
|
|
855
|
+
| co-rule-project | 分析项目 AGENTS.md 规范 | **轻型** | low / medium | 同上 |
|
|
856
|
+
| co-rule-app | 分析 .opencode/rules/* 应用规则 | **轻型** | low / medium | 同上 |
|
|
857
|
+
| co-designer | 设计师,UI/UX 设计、视觉润色 | **中等** | high / medium | sonnet、claude、minimax 等前端/视觉强的模型 |
|
|
858
|
+
| co-observer | 观察者,图片/PDF/截图视觉分析 | **中等** | medium / high | vision、flash 等支持视觉的模型 |
|
|
859
|
+
|
|
860
|
+
## council 详细说明
|
|
861
|
+
|
|
862
|
+
council 是内置的多模型共识机制,会将同一个问题发给 3 个 councillor 并行回答,然后综合出最优方案。
|
|
863
|
+
|
|
864
|
+
| councillor | 角色定位 | 推理强度 | variant 建议 |
|
|
865
|
+
|-----------|---------|---------|-------------|
|
|
866
|
+
| alpha | 主力深度推理 | **重型** | max / xhigh |
|
|
867
|
+
| beta | 第二视角互补 | **轻型/中等** | high |
|
|
868
|
+
| gamma | 第三方校验 | **中等** | medium / high |
|
|
869
|
+
|
|
870
|
+
**关键配置项说明:**
|
|
871
|
+
|
|
872
|
+
| 字段 | 默认值 | 说明 |
|
|
873
|
+
|------|--------|------|
|
|
874
|
+
| \`default_preset\` | \`"default"\` | 默认使用的 preset 名称,可以定义多个 preset(如 \`"quick"\` 快速共识、\`"deep"\` 深度共识) |
|
|
875
|
+
| \`timeout\` | \`180000\`(3 分钟) | 单个 councillor 的超时时间(毫秒),所有 councillor 并行执行 |
|
|
876
|
+
| \`councillor_execution_mode\` | \`"parallel"\` | 执行模式:\`"parallel"\` 并行(快)或 \`"serial"\` 串行(省 tokens) |
|
|
877
|
+
| \`councillor_retries\` | \`3\` | 单个 councillor 调用失败后的重试次数 |
|
|
878
|
+
|
|
879
|
+
**presets 示例(多套配置):**
|
|
880
|
+
|
|
881
|
+
\`\`\`json
|
|
882
|
+
"presets": {
|
|
883
|
+
"default": {
|
|
884
|
+
"alpha": { "model": "deepseek/deepseek-v4-pro", "variant": "max" },
|
|
885
|
+
"beta": { "model": "anthropic/claude-sonnet-4-20250514", "variant": "high" },
|
|
886
|
+
"gamma": { "model": "openai/gpt-5.2", "variant": "high" }
|
|
887
|
+
},
|
|
888
|
+
"quick": {
|
|
889
|
+
"alpha": { "model": "deepseek/deepseek-v4-pro", "variant": "high" },
|
|
890
|
+
"beta": { "model": "openai/gpt-5.2", "variant": "medium" },
|
|
891
|
+
"gamma": { "model": "anthropic/claude-sonnet-4-20250514", "variant": "medium" }
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
\`\`\`
|
|
895
|
+
|
|
896
|
+
## 分配规则
|
|
897
|
+
|
|
898
|
+
- 从 opencode.json 读取已配置的 provider,按上表规则为每个代理分配 model 和 variant
|
|
899
|
+
- 只有 1 个 provider:所有代理都用它,variant 按表格建议选不同档位
|
|
900
|
+
- 有多个 provider:重型代理优先选最强推理 provider,轻型选最快 provider
|
|
901
|
+
- council 的 alpha/beta/gamma 优先选 3 个不同 provider;不够 3 个时用同一 provider 的不同 model
|
|
902
|
+
- opencode.json 无任何 provider 时,生成占位配置并在 \`_comment\` 字段提示用户先配置
|
|
903
|
+
|
|
904
|
+
## 注意
|
|
905
|
+
|
|
906
|
+
- 只写入 \`oh-my-opencode-cohub.json\`,不要修改 \`opencode.json\`
|
|
907
|
+
- agent 名必须用 \`co-\` 前缀(共 12 个),不要遗漏
|
|
908
|
+
`;
|
|
909
|
+
const lines = aiPrompt.trim().split(`
|
|
910
|
+
`);
|
|
911
|
+
for (const line of lines) {
|
|
912
|
+
console.log(line);
|
|
913
|
+
}
|
|
914
|
+
console.log(`
|
|
915
|
+
${"=".repeat(60)}`);
|
|
675
916
|
} else if (command === "uninstall") {
|
|
676
917
|
console.log(`\uD83E\uDDF9 CoHub 卸载中...
|
|
677
918
|
`);
|
package/dist/config/loader.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,uBAAuB;AACvB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IAClD,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,oBAAoB;AACpB,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC;AAKD,aAAa;AACb,wBAAgB,eAAe,IAAI,WAAW,CAQ7C;AAED,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,uBAAuB;AACvB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IAClD,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,oBAAoB;AACpB,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC;AAKD,aAAa;AACb,wBAAgB,eAAe,IAAI,WAAW,CAQ7C;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAyHlD,QAAA,MAAM,WAAW,EAAE,MA6flB,CAAC;AAEF,eAAO,MAAM,MAAM,QAAc,CAAC;AAClC,eAAe,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/prompts/orchestrator.ts
|
|
2
2
|
var ORCHESTRATOR_PROMPT = `<角色>
|
|
3
|
-
你是纯调度者(Orchestrator)。唯一职责:理解需求 → 委派信息收集 →
|
|
3
|
+
你是纯调度者(Orchestrator)。唯一职责:理解需求 → 委派信息收集 → 委派方案制定 → 审核方案 → 调度执行 → 委派验证。**绝不亲自使用任何文件/代码操作工具**(read、grep、glob、bash、edit、write 等)。可使用的工具是调度工具(task、todowrite)。
|
|
4
4
|
</角色>
|
|
5
5
|
|
|
6
6
|
<子代理>
|
|
@@ -31,19 +31,19 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
31
31
|
纯知识问答直接回,代码需求继续。
|
|
32
32
|
|
|
33
33
|
## 2. 信息收集(委派子代理)
|
|
34
|
-
@co-explorer 搜索定位 → @co-librarian 外部研究 → @co-observer
|
|
35
|
-
|
|
36
|
-
## 3. 制定方案
|
|
37
|
-
综合信息→子任务分解→委派对象→并行策略→todowrite 记录。**方案末尾必须提供选项供用户选择**(如:A. 立即执行 / B. 修改方案 / C. 取消),等待用户回复后再进入调度执行。
|
|
38
|
-
|
|
39
|
-
## 4. 调度执行
|
|
40
|
-
清晰文件范围+背景启动+追踪不重复+协调冲突。委派指令用中文。
|
|
34
|
+
@co-explorer 搜索定位 → @co-librarian 外部研究 → @co-observer 多媒体。并行启动,不动手。收集完成后汇总各子代理结果 → 进入步骤3 委派 @co-planner 制定方案。
|
|
41
35
|
|
|
42
36
|
**规则分析并行策略**:需要对照 \`.opencode/rules/*.md\` 时,不要只派发一个 @co-rule-app。策略如下:
|
|
43
37
|
1. 先用 \`glob\`(委派 @co-explorer)列出 \`.opencode/rules/\` 下的所有 .md 文件
|
|
44
38
|
2. 按每 1-2 个文件分一组,并行派发多个 @co-rule-app 实例
|
|
45
39
|
3. 每个实例的 prompt 中明确指定它负责的规则文件列表(如 \`请分析 rules/A.md 和 rules/B.md\`)
|
|
46
|
-
4. 所有实例完成后,由 Orchestrator
|
|
40
|
+
4. 所有实例完成后,由 Orchestrator 汇总各实例返回的建议,作为 @co-planner 的输入之一。
|
|
41
|
+
|
|
42
|
+
## 3. 制定方案(委派 @co-planner)
|
|
43
|
+
将信息收集结果(代码库结构、API文档、规范分析等)汇总后委派给 @co-planner 制定结构化方案。收到 @co-planner 的方案后,orchestrator 审核(检查需求覆盖度、委派对象合理性、并行策略可行性),补充修正后,用 \`todowrite\` 创建正式任务列表。**方案末尾必须提供选项供用户选择**(如:A. 立即执行 / B. 修改方案 / C. 取消),等待用户回复后再进入调度执行。
|
|
44
|
+
|
|
45
|
+
## 4. 调度执行
|
|
46
|
+
清晰文件范围+背景启动+追踪不重复+协调冲突。委派指令用中文。
|
|
47
47
|
|
|
48
48
|
## 5. 验证(全部委派)
|
|
49
49
|
@co-fixer 编译测试 → @co-oracle 代码审查 → @co-designer UI审查。发现问题重新委派。
|
|
@@ -58,9 +58,9 @@ orchestrator 委派时可参考上述原则。不确定时,co-oracle 自身会
|
|
|
58
58
|
<rule priority="1" name="先方案后执行">
|
|
59
59
|
### 规则 1:理解需求后必须先输出方案
|
|
60
60
|
|
|
61
|
-
**⚠️ 长会话警告:这是最容易被遗忘的规则。无论会话多长、已经执行了多少步、之前分析过什么,每次收到新需求时,必须重新从头执行:分析需求 →
|
|
61
|
+
**⚠️ 长会话警告:这是最容易被遗忘的规则。无论会话多长、已经执行了多少步、之前分析过什么,每次收到新需求时,必须重新从头执行:分析需求 → 委派 @co-planner 制定方案 → 审核 → todowrite → 提供选项供用户选择 → 委派执行。禁止"前面分析过了这次直接改"、"改着改着就忘了"。**
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
收到需求后(涉及代码或文件修改时),**禁止立即执行**。必须先分析需求,委派 @co-planner 制定方案,orchestrator 审核后输出可验证的任务分解方案,**末尾提供选项(如"立即执行 / 修改方案")供用户决定**。方案包含:
|
|
64
64
|
(纯信息性问题可直接回答,无需方案。)
|
|
65
65
|
- 子任务列表及其依赖关系
|
|
66
66
|
- 每个子任务的委派对象(@co-explorer / @co-librarian / @co-fixer / @co-designer / @co-oracle / @co-observer)
|
|
@@ -1561,50 +1561,6 @@ function createCouncilTool(ctx, councilManager) {
|
|
|
1561
1561
|
import * as fs3 from "node:fs";
|
|
1562
1562
|
import * as path3 from "node:path";
|
|
1563
1563
|
import * as os3 from "node:os";
|
|
1564
|
-
function syncAgentConfigToOpencode(userConfig) {
|
|
1565
|
-
const agents = userConfig.agents;
|
|
1566
|
-
if (!agents)
|
|
1567
|
-
return;
|
|
1568
|
-
const opencodePath = path3.join(os3.homedir(), ".config", "opencode", "opencode.json");
|
|
1569
|
-
let opencodeConfig;
|
|
1570
|
-
try {
|
|
1571
|
-
if (!fs3.existsSync(opencodePath))
|
|
1572
|
-
return;
|
|
1573
|
-
const raw = fs3.readFileSync(opencodePath, "utf-8");
|
|
1574
|
-
opencodeConfig = JSON.parse(raw);
|
|
1575
|
-
} catch (err) {
|
|
1576
|
-
appendLog("sync", "opencode.json 读取或解析失败,跳过同步", err);
|
|
1577
|
-
return;
|
|
1578
|
-
}
|
|
1579
|
-
const agentSection = opencodeConfig.agent;
|
|
1580
|
-
if (!agentSection)
|
|
1581
|
-
return;
|
|
1582
|
-
let changed = false;
|
|
1583
|
-
for (const [agentName, override] of Object.entries(agents)) {
|
|
1584
|
-
const agentEntry = agentSection[agentName];
|
|
1585
|
-
if (!agentEntry || typeof agentEntry !== "object" || Array.isArray(agentEntry))
|
|
1586
|
-
continue;
|
|
1587
|
-
if (override.model && agentEntry.model !== override.model) {
|
|
1588
|
-
agentEntry.model = override.model;
|
|
1589
|
-
changed = true;
|
|
1590
|
-
}
|
|
1591
|
-
if (override.variant && agentEntry.variant !== override.variant) {
|
|
1592
|
-
agentEntry.variant = override.variant;
|
|
1593
|
-
changed = true;
|
|
1594
|
-
}
|
|
1595
|
-
}
|
|
1596
|
-
if (changed) {
|
|
1597
|
-
try {
|
|
1598
|
-
const tmpPath = opencodePath + ".tmp";
|
|
1599
|
-
fs3.writeFileSync(tmpPath, JSON.stringify(opencodeConfig, null, 2) + `
|
|
1600
|
-
`);
|
|
1601
|
-
fs3.renameSync(tmpPath, opencodePath);
|
|
1602
|
-
appendLog("sync", "已将 oh-my-opencode-cohub.json 的 agent model/variant 同步到 opencode.json", null);
|
|
1603
|
-
} catch (err) {
|
|
1604
|
-
appendLog("sync", "同步 opencode.json 失败", err);
|
|
1605
|
-
}
|
|
1606
|
-
}
|
|
1607
|
-
}
|
|
1608
1564
|
function loadFileOverrides(projectDir) {
|
|
1609
1565
|
const overrides = {};
|
|
1610
1566
|
const agentNames = [
|
|
@@ -1691,7 +1647,7 @@ var CoHubPlugin = async (input, options) => {
|
|
|
1691
1647
|
if (!fs3.existsSync(STATE_DIR)) {
|
|
1692
1648
|
fs3.mkdirSync(STATE_DIR, { recursive: true });
|
|
1693
1649
|
}
|
|
1694
|
-
const configs = agents.map((a) => {
|
|
1650
|
+
const configs = agents.filter((a) => a.config.model).map((a) => {
|
|
1695
1651
|
const modelStr = a.config.model;
|
|
1696
1652
|
const parts = modelStr.split("/");
|
|
1697
1653
|
const provider = parts.length > 1 ? parts[0] : "default";
|
|
@@ -1710,42 +1666,40 @@ var CoHubPlugin = async (input, options) => {
|
|
|
1710
1666
|
const agents = [
|
|
1711
1667
|
{
|
|
1712
1668
|
name: "co-orchestrator",
|
|
1713
|
-
config: { mode: "primary",
|
|
1669
|
+
config: { mode: "primary", prompt: ORCHESTRATOR_PROMPT }
|
|
1714
1670
|
},
|
|
1715
1671
|
{
|
|
1716
1672
|
name: "co-oracle",
|
|
1717
|
-
config: { mode: "subagent",
|
|
1673
|
+
config: { mode: "subagent", temperature: 0.1, prompt: ORACLE_PROMPT }
|
|
1718
1674
|
},
|
|
1719
1675
|
{
|
|
1720
1676
|
name: "co-librarian",
|
|
1721
|
-
config: { mode: "subagent",
|
|
1677
|
+
config: { mode: "subagent", prompt: LIBRARIAN_PROMPT }
|
|
1722
1678
|
},
|
|
1723
1679
|
{
|
|
1724
1680
|
name: "co-explorer",
|
|
1725
|
-
config: { mode: "subagent",
|
|
1681
|
+
config: { mode: "subagent", prompt: EXPLORER_PROMPT }
|
|
1726
1682
|
},
|
|
1727
1683
|
{
|
|
1728
1684
|
name: "co-designer",
|
|
1729
|
-
config: { mode: "subagent",
|
|
1685
|
+
config: { mode: "subagent", prompt: DESIGNER_PROMPT }
|
|
1730
1686
|
},
|
|
1731
1687
|
{
|
|
1732
1688
|
name: "co-fixer",
|
|
1733
1689
|
mode: "subagent",
|
|
1734
1690
|
description: "执行者——代码修改、构建、测试",
|
|
1735
|
-
config: { mode: "subagent",
|
|
1691
|
+
config: { mode: "subagent", prompt: FIXER_PROMPT }
|
|
1736
1692
|
},
|
|
1737
1693
|
{
|
|
1738
1694
|
name: "co-observer",
|
|
1739
1695
|
description: "观察者——图片/PDF/截图视觉分析",
|
|
1740
|
-
config: { mode: "subagent",
|
|
1696
|
+
config: { mode: "subagent", prompt: OBSERVER_PROMPT }
|
|
1741
1697
|
},
|
|
1742
1698
|
{
|
|
1743
1699
|
name: "co-council",
|
|
1744
1700
|
description: "多模型共识——并行 LLM 综合",
|
|
1745
1701
|
config: {
|
|
1746
1702
|
mode: "subagent",
|
|
1747
|
-
model: "deepseek/deepseek-v4-pro",
|
|
1748
|
-
variant: "high",
|
|
1749
1703
|
prompt: COUNCIL_PROMPT,
|
|
1750
1704
|
permission: { council_session: "allow" }
|
|
1751
1705
|
}
|
|
@@ -1753,22 +1707,22 @@ var CoHubPlugin = async (input, options) => {
|
|
|
1753
1707
|
{
|
|
1754
1708
|
name: "co-rule-user",
|
|
1755
1709
|
description: "用户规范分析——~/.config/opencode/AGENTS.md",
|
|
1756
|
-
config: { mode: "subagent",
|
|
1710
|
+
config: { mode: "subagent", prompt: RULE_USER_PROMPT }
|
|
1757
1711
|
},
|
|
1758
1712
|
{
|
|
1759
1713
|
name: "co-rule-project",
|
|
1760
1714
|
description: "项目规范分析——项目 AGENTS.md",
|
|
1761
|
-
config: { mode: "subagent",
|
|
1715
|
+
config: { mode: "subagent", prompt: RULE_PROJECT_PROMPT }
|
|
1762
1716
|
},
|
|
1763
1717
|
{
|
|
1764
1718
|
name: "co-rule-app",
|
|
1765
1719
|
description: "应用规则分析——.opencode/rules/*.md",
|
|
1766
|
-
config: { mode: "subagent",
|
|
1720
|
+
config: { mode: "subagent", prompt: RULE_APP_PROMPT }
|
|
1767
1721
|
},
|
|
1768
1722
|
{
|
|
1769
1723
|
name: "co-planner",
|
|
1770
1724
|
description: "方案制定——综合需求+信息+规范输出任务分解",
|
|
1771
|
-
config: { mode: "subagent",
|
|
1725
|
+
config: { mode: "subagent", prompt: PLANNER_PROMPT }
|
|
1772
1726
|
}
|
|
1773
1727
|
];
|
|
1774
1728
|
const userConfig = loadCoHubConfig();
|
|
@@ -1785,7 +1739,7 @@ var CoHubPlugin = async (input, options) => {
|
|
|
1785
1739
|
}
|
|
1786
1740
|
}
|
|
1787
1741
|
}
|
|
1788
|
-
|
|
1742
|
+
syncAgentConfig();
|
|
1789
1743
|
for (const agent of agents) {
|
|
1790
1744
|
const override = fileOverrides[agent.name];
|
|
1791
1745
|
if (override) {
|
|
@@ -1805,11 +1759,7 @@ var CoHubPlugin = async (input, options) => {
|
|
|
1805
1759
|
councillor_execution_mode: "parallel",
|
|
1806
1760
|
councillor_retries: 3,
|
|
1807
1761
|
presets: {
|
|
1808
|
-
default: {
|
|
1809
|
-
alpha: { model: "deepseek/deepseek-v4-pro", variant: "max" },
|
|
1810
|
-
beta: { model: "deepseek/deepseek-v4-flash", variant: "high" },
|
|
1811
|
-
gamma: { model: "minimax/MiniMax-M3", variant: "medium" }
|
|
1812
|
-
}
|
|
1762
|
+
default: {}
|
|
1813
1763
|
}
|
|
1814
1764
|
};
|
|
1815
1765
|
const contextConfig = userConfig.context ?? {};
|
|
@@ -1817,7 +1767,6 @@ var CoHubPlugin = async (input, options) => {
|
|
|
1817
1767
|
const councilConfig = userConfig.council ?? DEFAULT_COUNCIL_CONFIG;
|
|
1818
1768
|
const councilManager = new CouncilManager(input.client, input.directory, councilConfig);
|
|
1819
1769
|
const councilTools = createCouncilTool(input, councilManager);
|
|
1820
|
-
syncAgentConfig();
|
|
1821
1770
|
function extractChildSessionId(output) {
|
|
1822
1771
|
if (!output || typeof output !== "object")
|
|
1823
1772
|
return;
|
|
@@ -1918,7 +1867,7 @@ var CoHubPlugin = async (input, options) => {
|
|
|
1918
1867
|
` + "**当前任务**: " + description + `
|
|
1919
1868
|
`;
|
|
1920
1869
|
const targetField = typeof output.args.prompt === "string" ? "prompt" : "description";
|
|
1921
|
-
output.args[targetField] = (targetField === "prompt" ? output.args.prompt : description) + contextBlock;
|
|
1870
|
+
output.args[targetField] = ((targetField === "prompt" ? output.args.prompt : description) ?? "") + contextBlock;
|
|
1922
1871
|
await contextEngine.fillContextAsync(contextId, input2.sessionID, {
|
|
1923
1872
|
strategy
|
|
1924
1873
|
});
|
|
@@ -2003,6 +1952,20 @@ var CoHubPlugin = async (input, options) => {
|
|
|
2003
1952
|
try {
|
|
2004
1953
|
if (!output.messages || !Array.isArray(output.messages))
|
|
2005
1954
|
return;
|
|
1955
|
+
if (output.messages) {
|
|
1956
|
+
for (let d = 0;d < output.messages.length; d++) {
|
|
1957
|
+
const msg = output.messages[d];
|
|
1958
|
+
const parts = msg.parts;
|
|
1959
|
+
if (!parts || !Array.isArray(parts) || parts.length === 0) {
|
|
1960
|
+
appendLog("messages.transform", `⚠️ 消息[${d}] role=${msg.info?.role ?? "?"} parts为空`);
|
|
1961
|
+
} else {
|
|
1962
|
+
const hasTextPart = parts.some((p) => p.type === "text");
|
|
1963
|
+
if (!hasTextPart && msg.info?.role === "user") {
|
|
1964
|
+
appendLog("messages.transform", `⚠️ 消息[${d}] role=user parts无text类型, types=[${parts.map((p) => p.type).join(",")}]`);
|
|
1965
|
+
}
|
|
1966
|
+
}
|
|
1967
|
+
}
|
|
1968
|
+
}
|
|
2006
1969
|
let lastUserMsg;
|
|
2007
1970
|
let sessionID;
|
|
2008
1971
|
for (let i = output.messages.length - 1;i >= 0; i--) {
|
|
@@ -2015,8 +1978,13 @@ var CoHubPlugin = async (input, options) => {
|
|
|
2015
1978
|
}
|
|
2016
1979
|
if (!lastUserMsg)
|
|
2017
1980
|
return;
|
|
2018
|
-
if (!lastUserMsg.parts || !Array.isArray(lastUserMsg.parts))
|
|
2019
|
-
|
|
1981
|
+
if (!lastUserMsg.parts || !Array.isArray(lastUserMsg.parts) || lastUserMsg.parts.length === 0) {
|
|
1982
|
+
lastUserMsg.parts = [{ type: "text", text: " " }];
|
|
1983
|
+
appendLog("messages.transform", `⚠️ lastUserMsg parts为空,已推入占位text part (session=${sessionID?.slice(0, 20) ?? "?"})`);
|
|
1984
|
+
} else if (!lastUserMsg.parts.some((p) => p.type === "text")) {
|
|
1985
|
+
lastUserMsg.parts.push({ type: "text", text: " " });
|
|
1986
|
+
appendLog("messages.transform", `⚠️ lastUserMsg parts无text类型,已推入占位text part (session=${sessionID?.slice(0, 20) ?? "?"})`);
|
|
1987
|
+
}
|
|
2020
1988
|
const board = tracker.getBoardText();
|
|
2021
1989
|
if (board) {
|
|
2022
1990
|
for (let j = lastUserMsg.parts.length - 1;j >= 0; j--) {
|
|
@@ -2038,6 +2006,45 @@ var CoHubPlugin = async (input, options) => {
|
|
|
2038
2006
|
}
|
|
2039
2007
|
}
|
|
2040
2008
|
}
|
|
2009
|
+
{
|
|
2010
|
+
let userContent = "";
|
|
2011
|
+
for (const p of lastUserMsg.parts ?? []) {
|
|
2012
|
+
if (p.type === "text")
|
|
2013
|
+
userContent += p.text ?? "";
|
|
2014
|
+
}
|
|
2015
|
+
if (!userContent.trim()) {
|
|
2016
|
+
for (const p of lastUserMsg.parts ?? []) {
|
|
2017
|
+
if (p.type === "text") {
|
|
2018
|
+
p.text = " ";
|
|
2019
|
+
break;
|
|
2020
|
+
}
|
|
2021
|
+
}
|
|
2022
|
+
appendLog("messages.transform", `⚠️ 注入后 content 为空,已设空格占位 (session=${sessionID?.slice(0, 20) ?? "?"})`);
|
|
2023
|
+
}
|
|
2024
|
+
}
|
|
2025
|
+
for (let i = 0;i < output.messages.length; i++) {
|
|
2026
|
+
const msg = output.messages[i];
|
|
2027
|
+
const parts = msg.parts ?? [];
|
|
2028
|
+
let totalText = "";
|
|
2029
|
+
for (const p of parts) {
|
|
2030
|
+
if (p.type === "text" && p.text)
|
|
2031
|
+
totalText += p.text;
|
|
2032
|
+
}
|
|
2033
|
+
if (!totalText.trim() && parts.length > 0) {
|
|
2034
|
+
let found = false;
|
|
2035
|
+
for (const p of parts) {
|
|
2036
|
+
if (p.type === "text") {
|
|
2037
|
+
p.text = " ";
|
|
2038
|
+
found = true;
|
|
2039
|
+
break;
|
|
2040
|
+
}
|
|
2041
|
+
}
|
|
2042
|
+
if (!found) {
|
|
2043
|
+
parts.push({ type: "text", text: " " });
|
|
2044
|
+
}
|
|
2045
|
+
appendLog("messages.transform", `⚠️ 消息[${i}] role=${msg.info?.role ?? "?"} content为空,已设占位 (session=${sessionID?.slice(0, 20) ?? "?"})`);
|
|
2046
|
+
}
|
|
2047
|
+
}
|
|
2041
2048
|
} catch (err) {
|
|
2042
2049
|
appendLog("messages.transform", "hook 失败", err);
|
|
2043
2050
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const ORCHESTRATOR_PROMPT = "<\u89D2\u8272>\n\u4F60\u662F\u7EAF\u8C03\u5EA6\u8005\uFF08Orchestrator\uFF09\u3002\u552F\u4E00\u804C\u8D23\uFF1A\u7406\u89E3\u9700\u6C42 \u2192 \u59D4\u6D3E\u4FE1\u606F\u6536\u96C6 \u2192 \u5236\u5B9A\u65B9\u6848 \u2192 \u8C03\u5EA6\u5B50\u4EE3\u7406\u6267\u884C \u2192 \u59D4\u6D3E\u9A8C\u8BC1\u3002**\u7EDD\u4E0D\u4EB2\u81EA\u4F7F\u7528\u4EFB\u4F55\u6587\u4EF6/\u4EE3\u7801\u64CD\u4F5C\u5DE5\u5177**\uFF08read\u3001grep\u3001glob\u3001bash\u3001edit\u3001write \u7B49\uFF09\u3002\u53EF\u4F7F\u7528\u7684\u5DE5\u5177\u662F\u8C03\u5EA6\u5DE5\u5177\uFF08task\u3001todowrite\uFF09\u3002\n</\u89D2\u8272>\n\n<\u5B50\u4EE3\u7406>\n\n@co-explorer - \u53EA\u8BFB\u3002Grep/Glob/AST \u641C\u7D22\u5B9A\u4F4D\u3002\u59D4\u6D3E\uFF1A\u53D1\u73B0\u4EE3\u7801\u5E93\u5185\u5BB9\u65F6\u3002\n@co-librarian - \u53EA\u8BFB+Web\u3002\u5B98\u65B9\u6587\u6863/API/GitHub \u7814\u7A76\u3002\u59D4\u6D3E\uFF1A\u4E0D\u719F\u6089\u7684\u5E93/\u8FB9\u7F18\u60C5\u51B5\u3002\n@co-oracle - \u53EA\u8BFB\u3002\u67B6\u6784\u51B3\u7B56/\u4EE3\u7801\u5BA1\u67E5/YAGNI \u7B80\u5316/\u590D\u6742\u8C03\u8BD5\u3002\u59D4\u6D3E\uFF1A\u9AD8\u98CE\u9669\u51B3\u7B56/\u53CD\u590D bug/\u5B89\u5168\u5BA1\u67E5\u3002\n@co-designer - \u8BFB\u5199\u3002UI/UX \u8BBE\u8BA1/\u89C6\u89C9\u6DA6\u8272/\u54CD\u5E94\u5F0F\u5E03\u5C40\u3002\u59D4\u6D3E\uFF1A\u9700\u8981\u6DA6\u8272\u7684\u754C\u9762/UX \u7EC4\u4EF6\u3002\n@co-fixer - \u8BFB\u5199+Bash\u3002\u4EE3\u7801\u4FEE\u6539\u6267\u884C(\u65E0\u8BBA\u591A\u5C0F)\u3002\u59D4\u6D3E\uFF1A\u6240\u6709\u6587\u4EF6\u7F16\u8F91/\u5199\u5165/\u5220\u9664\u3002\n@co-observer - \u53EA\u8BFB\u3002\u56FE\u7247/PDF/\u622A\u56FE\u89C6\u89C9\u5206\u6790\u3002\u59D4\u6D3E\uFF1A\u591A\u5A92\u4F53\u6587\u4EF6\u5206\u6790\u65F6(\u542B\u5B8C\u6574\u8DEF\u5F84)\u3002\n@co-council - \u53EA\u8BFB\u3002\u591A\u6A21\u578B\u5E76\u884C\u5171\u8BC6\u3002\u59D4\u6D3E\uFF1A\u591A\u4E13\u5BB6\u89C6\u89D2/\u4E0D\u53EF\u9006\u51B3\u7B56\uFF08\u6570\u636E\u8FC1\u79FB/API \u53D8\u66F4\uFF09\u3002\u9519\u4E86\u8FD8\u80FD\u6539\u2192@co-oracle\uFF0C\u9519\u4E86\u5C31\u5B8C\u4E86\u2192@co-council\u3002\n@co-rule-user - \u53EA\u8BFB\u3002\u5206\u6790\u7528\u6237\u7EA7 AGENTS.md(~/.config/opencode/AGENTS.md)\u7EA6\u675F\u3002\u59D4\u6D3E\uFF1A\u65B9\u6848\u9700\u5BF9\u7167\u7528\u6237\u89C4\u5219\u65F6\u3002\n@co-rule-project - \u53EA\u8BFB\u3002\u5206\u6790\u9879\u76EE AGENTS.md \u7EA6\u675F\u3002\u59D4\u6D3E\uFF1A\u65B9\u6848\u9700\u5BF9\u7167\u9879\u76EE\u89C4\u5219\u65F6\u3002\n@co-rule-app - \u53EA\u8BFB\u3002\u5206\u6790 .opencode/rules/*.md \u5E94\u7528\u89C4\u5219\u3002**\u5E76\u884C\u7B56\u7565**\uFF1A\u5F53 rules \u76EE\u5F55\u4E0B\u6709 N \u4E2A\u6587\u4EF6\u65F6\uFF0C\u5E76\u884C\u542F\u52A8 N/2\uFF08\u5411\u4E0A\u53D6\u6574\uFF09\u4E2A @co-rule-app \u5B9E\u4F8B\uFF0C\u6BCF\u4E2A\u5B9E\u4F8B\u8D1F\u8D23 1-2 \u4E2A\u89C4\u5219\u6587\u4EF6\uFF08\u5728 prompt \u4E2D\u660E\u786E\u6307\u5B9A\u6587\u4EF6\u5217\u8868\uFF09\u3002\u6240\u6709\u5B9E\u4F8B\u5B8C\u6210\u540E\uFF0COrchestrator \u6C47\u603B\u5EFA\u8BAE\u3002\u59D4\u6D3E\uFF1A\u65B9\u6848\u9700\u5BF9\u7167\u5B89\u5168/\u6D4B\u8BD5/\u6570\u636E\u5E93\u7B49\u5E94\u7528\u89C4\u5219\u65F6\u3002\n@co-planner - \u53EA\u8BFB\u3002\u7EFC\u5408\u9700\u6C42+\u4FE1\u606F+\u89C4\u8303\uFF0C\u8F93\u51FA\u7ED3\u6784\u5316\u4EFB\u52A1\u5206\u89E3\u65B9\u6848\u3002\u59D4\u6D3E\uFF1A\u4FE1\u606F\u6536\u96C6\u548C\u89C4\u8303\u5206\u6790\u5B8C\u6210\u540E\u3002\n\n</\u5B50\u4EE3\u7406>\n\n### @council vs @oracle \u9009\u62E9\u6307\u5357\n\n**\u4E00\u53E5\u8BDD\u5224\u65AD**\uFF1A`@co-oracle` = \u6DF1\u5EA6\u63A8\u7406\uFF08\u5FEB\u3001\u4FBF\u5B9C\u3001\u53EF\u9006\u5224\u65AD\uFF09\uFF0C`@co-council` = \u591A\u6A21\u578B\u80CC\u4E66\u5171\u8BC6\uFF08\u6162\u3001\u8D35\u3001\u4E0D\u53EF\u9006\u51B3\u7B56\uFF09\u3002\n\norchestrator \u59D4\u6D3E\u65F6\u53EF\u53C2\u8003\u4E0A\u8FF0\u539F\u5219\u3002\u4E0D\u786E\u5B9A\u65F6\uFF0Cco-oracle \u81EA\u8EAB\u4F1A\u5728\u5BA1\u67E5\u65F6\u5224\u65AD\u662F\u5426\u9700\u8981\u5347\u7EA7\u5230 council\u3002\n\n<\u5DE5\u4F5C\u6D41>\n\n## 1. \u7406\u89E3\u9700\u6C42\n\u7EAF\u77E5\u8BC6\u95EE\u7B54\u76F4\u63A5\u56DE\uFF0C\u4EE3\u7801\u9700\u6C42\u7EE7\u7EED\u3002\n\n## 2. \u4FE1\u606F\u6536\u96C6\uFF08\u59D4\u6D3E\u5B50\u4EE3\u7406\uFF09\n@co-explorer \u641C\u7D22\u5B9A\u4F4D \u2192 @co-librarian \u5916\u90E8\u7814\u7A76 \u2192 @co-observer \u591A\u5A92\u4F53\u3002\u5E76\u884C\u542F\u52A8\uFF0C\u4E0D\u52A8\u624B\u3002\n\n## 3. \u5236\u5B9A\u65B9\u6848\n\u7EFC\u5408\u4FE1\u606F\u2192\u5B50\u4EFB\u52A1\u5206\u89E3\u2192\u59D4\u6D3E\u5BF9\u8C61\u2192\u5E76\u884C\u7B56\u7565\u2192todowrite \u8BB0\u5F55\u3002**\u65B9\u6848\u672B\u5C3E\u5FC5\u987B\u63D0\u4F9B\u9009\u9879\u4F9B\u7528\u6237\u9009\u62E9**\uFF08\u5982\uFF1AA. \u7ACB\u5373\u6267\u884C / B. \u4FEE\u6539\u65B9\u6848 / C. \u53D6\u6D88\uFF09\uFF0C\u7B49\u5F85\u7528\u6237\u56DE\u590D\u540E\u518D\u8FDB\u5165\u8C03\u5EA6\u6267\u884C\u3002\n\n## 4. \u8C03\u5EA6\u6267\u884C\n\u6E05\u6670\u6587\u4EF6\u8303\u56F4+\u80CC\u666F\u542F\u52A8+\u8FFD\u8E2A\u4E0D\u91CD\u590D+\u534F\u8C03\u51B2\u7A81\u3002\u59D4\u6D3E\u6307\u4EE4\u7528\u4E2D\u6587\u3002\n\n**\u89C4\u5219\u5206\u6790\u5E76\u884C\u7B56\u7565**\uFF1A\u9700\u8981\u5BF9\u7167 `.opencode/rules/*.md` \u65F6\uFF0C\u4E0D\u8981\u53EA\u6D3E\u53D1\u4E00\u4E2A @co-rule-app\u3002\u7B56\u7565\u5982\u4E0B\uFF1A\n1. \u5148\u7528 `glob`\uFF08\u59D4\u6D3E @co-explorer\uFF09\u5217\u51FA `.opencode/rules/` \u4E0B\u7684\u6240\u6709 .md \u6587\u4EF6\n2. \u6309\u6BCF 1-2 \u4E2A\u6587\u4EF6\u5206\u4E00\u7EC4\uFF0C\u5E76\u884C\u6D3E\u53D1\u591A\u4E2A @co-rule-app \u5B9E\u4F8B\n3. \u6BCF\u4E2A\u5B9E\u4F8B\u7684 prompt \u4E2D\u660E\u786E\u6307\u5B9A\u5B83\u8D1F\u8D23\u7684\u89C4\u5219\u6587\u4EF6\u5217\u8868\uFF08\u5982 `\u8BF7\u5206\u6790 rules/A.md \u548C rules/B.md`\uFF09\n4. \u6240\u6709\u5B9E\u4F8B\u5B8C\u6210\u540E\uFF0C\u7531 Orchestrator \u6C47\u603B\u5404\u5B9E\u4F8B\u8FD4\u56DE\u7684\u5EFA\u8BAE\uFF0C\u7EDF\u4E00\u7EB3\u5165\u65B9\u6848\n\n## 5. \u9A8C\u8BC1\uFF08\u5168\u90E8\u59D4\u6D3E\uFF09\n@co-fixer \u7F16\u8BD1\u6D4B\u8BD5 \u2192 @co-oracle \u4EE3\u7801\u5BA1\u67E5 \u2192 @co-designer UI\u5BA1\u67E5\u3002\u53D1\u73B0\u95EE\u9898\u91CD\u65B0\u59D4\u6D3E\u3002\n**\u6548\u7387\u539F\u5219**\uFF1A\u591A\u6587\u4EF6\u4FEE\u6539\u5168\u90E8\u5B8C\u6210\u540E\u4E00\u6B21\u6027\u7F16\u8BD1\u9A8C\u8BC1\uFF0C\u4E0D\u8981\u6BCF\u6539\u4E00\u4E2A\u6587\u4EF6\u5C31\u8DD1\u4E00\u6B21\u3002\n\n</\u5DE5\u4F5C\u6D41>\n\n<critical_rules>\n\n## \u786C\u6027\u89C4\u5219\u2014\u2014\u4E0D\u53EF\u8FDD\u53CD\n\n<rule priority=\"1\" name=\"\u5148\u65B9\u6848\u540E\u6267\u884C\">\n### \u89C4\u5219 1\uFF1A\u7406\u89E3\u9700\u6C42\u540E\u5FC5\u987B\u5148\u8F93\u51FA\u65B9\u6848\n\n**\u26A0\uFE0F \u957F\u4F1A\u8BDD\u8B66\u544A\uFF1A\u8FD9\u662F\u6700\u5BB9\u6613\u88AB\u9057\u5FD8\u7684\u89C4\u5219\u3002\u65E0\u8BBA\u4F1A\u8BDD\u591A\u957F\u3001\u5DF2\u7ECF\u6267\u884C\u4E86\u591A\u5C11\u6B65\u3001\u4E4B\u524D\u5206\u6790\u8FC7\u4EC0\u4E48\uFF0C\u6BCF\u6B21\u6536\u5230\u65B0\u9700\u6C42\u65F6\uFF0C\u5FC5\u987B\u91CD\u65B0\u4ECE\u5934\u6267\u884C\uFF1A\u5206\u6790\u9700\u6C42 \u2192 \u8F93\u51FA\u65B9\u6848 \u2192 todowrite \u2192 \u63D0\u4F9B\u9009\u9879\u4F9B\u7528\u6237\u9009\u62E9 \u2192 \u59D4\u6D3E\u6267\u884C\u3002\u7981\u6B62\"\u524D\u9762\u5206\u6790\u8FC7\u4E86\u8FD9\u6B21\u76F4\u63A5\u6539\"\u3001\"\u6539\u7740\u6539\u7740\u5C31\u5FD8\u4E86\"\u3002**\n\n\u6536\u5230\u9700\u6C42\u540E\uFF08\u6D89\u53CA\u4EE3\u7801\u6216\u6587\u4EF6\u4FEE\u6539\u65F6\uFF09\uFF0C**\u7981\u6B62\u7ACB\u5373\u6267\u884C**\u3002\u5FC5\u987B\u5148\u5206\u6790\u9700\u6C42\uFF0C\u8F93\u51FA\u53EF\u9A8C\u8BC1\u7684\u4EFB\u52A1\u5206\u89E3\u65B9\u6848\uFF0C**\u672B\u5C3E\u63D0\u4F9B\u9009\u9879\uFF08\u5982\"\u7ACB\u5373\u6267\u884C / \u4FEE\u6539\u65B9\u6848\"\uFF09\u4F9B\u7528\u6237\u51B3\u5B9A**\u3002\u65B9\u6848\u5305\u542B\uFF1A\n\uFF08\u7EAF\u4FE1\u606F\u6027\u95EE\u9898\u53EF\u76F4\u63A5\u56DE\u7B54\uFF0C\u65E0\u9700\u65B9\u6848\u3002\uFF09\n- \u5B50\u4EFB\u52A1\u5217\u8868\u53CA\u5176\u4F9D\u8D56\u5173\u7CFB\n- \u6BCF\u4E2A\u5B50\u4EFB\u52A1\u7684\u59D4\u6D3E\u5BF9\u8C61\uFF08@co-explorer / @co-librarian / @co-fixer / @co-designer / @co-oracle / @co-observer\uFF09\n- \u5E76\u884C\u5316\u7B56\u7565\uFF08\u54EA\u4E9B\u4EFB\u52A1\u53EF\u540C\u65F6\u6267\u884C\uFF09\n- \u9A8C\u8BC1\u6B65\u9AA4\n\n\u65B9\u6848\u8981\u5177\u4F53\u5230\u6587\u4EF6\u548C\u64CD\u4F5C\u7C92\u5EA6\u3002\u7528 `todowrite` \u521B\u5EFA\u4EFB\u52A1\u5217\u8868\u3002\n</rule>\n\n<rule priority=\"2\" name=\"\u5FC5\u987B\u59D4\u6D3E\">\n### \u89C4\u5219 2\uFF1A\u6240\u6709\u5DE5\u5177\u64CD\u4F5C\u5FC5\u987B\u59D4\u6D3E\u2014\u2014\u65E0\u4F8B\u5916\n\n**Orchestrator \u7981\u6B62\u4F7F\u7528\u4EFB\u4F55\u6587\u4EF6/\u4EE3\u7801\u64CD\u4F5C\u5DE5\u5177**\uFF08read\u3001grep\u3001glob\u3001ast_grep_search\u3001bash\u3001edit\u3001write \u7B49\uFF09\uFF0C**\u4EC5\u5141\u8BB8\u4F7F\u7528\u8C03\u5EA6\u5DE5\u5177**\uFF08task\u3001todowrite\uFF09\u3002\n- \u8BFB\u53D6\u6587\u4EF6\u3001\u641C\u7D22\u4EE3\u7801\u3001\u67E5\u770B git diff \u2192 \u59D4\u6D3E @co-explorer\n- \u4EE3\u7801\u7F16\u8F91\u3001\u5199\u5165\u3001\u5220\u9664\uFF08\u65E0\u8BBA\u591A\u5C0F\uFF09 \u2192 \u59D4\u6D3E @co-fixer\n- UI/UX \u76F8\u5173\u7F16\u8F91 \u2192 \u59D4\u6D3E @co-designer\n- \u8FD0\u884C\u6784\u5EFA\u3001\u6D4B\u8BD5\u3001lint \u7B49\u547D\u4EE4 \u2192 \u59D4\u6D3E @co-fixer/@co-explorer\n- \u4EE3\u7801\u5BA1\u67E5\u3001\u67B6\u6784\u5206\u6790\u3001\u6587\u6848\u5BA1\u67E5 \u2192 \u59D4\u6D3E @co-oracle\n- **\u4E0D\u8981\u62FF\"\u59D4\u6D3E\u5F00\u9500\u5927\"\"\u5C31\u4E00\u884C\u4EE3\u7801\"\u5F53\u501F\u53E3\u81EA\u5DF1\u64CD\u4F5C\u3002**\n</rule>\n\n<rule priority=\"3\" name=\"\u5E76\u884C\u4F18\u5148\">\n### \u89C4\u5219 3\uFF1A\u5E76\u884C\u4F18\u5148\n\u5206\u6790\u4EFB\u52A1\u4F9D\u8D56\u540E\uFF0C\u6700\u5927\u7A0B\u5EA6\u5E76\u884C\u5316\u2014\u2014\u72EC\u7ACB\u4EFB\u52A1\u540C\u65F6\u542F\u52A8\u3002\n</rule>\n\n</critical_rules>\n\n<\u81EA\u68C0\u6E05\u5355>\n**\u6BCF\u6B21\u56DE\u590D\u7528\u6237\u6216\u8C03\u7528\u5DE5\u5177\u524D\uFF0C\u5FC5\u987B\u5728\u601D\u8003\u4E2D\u9010\u6761\u786E\u8BA4\uFF08\u8FD9\u662F\u786C\u6027\u8981\u6C42\uFF0C\u4E0D\u53EF\u8DF3\u8FC7\uFF09\uFF1A**\n\n\u25A1 **\u672C\u8F6E\u9700\u8981\u4FEE\u6539\u4EE3\u7801\u6216\u6587\u4EF6\u5417\uFF1F**\n \u2192 \u7EAF\u5206\u6790 / \u95EE\u7B54 / \u5BA1\u67E5 / \u63A2\u7D22\u4FE1\u606F \u2192 \u4E0D\u9700\u8981\u65B9\u6848\uFF0C\u76F4\u63A5\u5904\u7406\n \u2192 \u9700\u8981\u4FEE\u6539\u4EE3\u7801\u6216\u6587\u4EF6 \u2192 **\u5FC5\u987B\u5148\u8F93\u51FA\u65B9\u6848 \u2192 \u63D0\u4F9B\u9009\u9879 \u2192 \u7B49\u7528\u6237\u9009\u62E9\u540E\u624D\u53EF\u59D4\u6D3E\u6267\u884C**\n\n</\u81EA\u68C0\u6E05\u5355>\n";
|
|
1
|
+
export declare const ORCHESTRATOR_PROMPT = "<\u89D2\u8272>\n\u4F60\u662F\u7EAF\u8C03\u5EA6\u8005\uFF08Orchestrator\uFF09\u3002\u552F\u4E00\u804C\u8D23\uFF1A\u7406\u89E3\u9700\u6C42 \u2192 \u59D4\u6D3E\u4FE1\u606F\u6536\u96C6 \u2192 \u59D4\u6D3E\u65B9\u6848\u5236\u5B9A \u2192 \u5BA1\u6838\u65B9\u6848 \u2192 \u8C03\u5EA6\u6267\u884C \u2192 \u59D4\u6D3E\u9A8C\u8BC1\u3002**\u7EDD\u4E0D\u4EB2\u81EA\u4F7F\u7528\u4EFB\u4F55\u6587\u4EF6/\u4EE3\u7801\u64CD\u4F5C\u5DE5\u5177**\uFF08read\u3001grep\u3001glob\u3001bash\u3001edit\u3001write \u7B49\uFF09\u3002\u53EF\u4F7F\u7528\u7684\u5DE5\u5177\u662F\u8C03\u5EA6\u5DE5\u5177\uFF08task\u3001todowrite\uFF09\u3002\n</\u89D2\u8272>\n\n<\u5B50\u4EE3\u7406>\n\n@co-explorer - \u53EA\u8BFB\u3002Grep/Glob/AST \u641C\u7D22\u5B9A\u4F4D\u3002\u59D4\u6D3E\uFF1A\u53D1\u73B0\u4EE3\u7801\u5E93\u5185\u5BB9\u65F6\u3002\n@co-librarian - \u53EA\u8BFB+Web\u3002\u5B98\u65B9\u6587\u6863/API/GitHub \u7814\u7A76\u3002\u59D4\u6D3E\uFF1A\u4E0D\u719F\u6089\u7684\u5E93/\u8FB9\u7F18\u60C5\u51B5\u3002\n@co-oracle - \u53EA\u8BFB\u3002\u67B6\u6784\u51B3\u7B56/\u4EE3\u7801\u5BA1\u67E5/YAGNI \u7B80\u5316/\u590D\u6742\u8C03\u8BD5\u3002\u59D4\u6D3E\uFF1A\u9AD8\u98CE\u9669\u51B3\u7B56/\u53CD\u590D bug/\u5B89\u5168\u5BA1\u67E5\u3002\n@co-designer - \u8BFB\u5199\u3002UI/UX \u8BBE\u8BA1/\u89C6\u89C9\u6DA6\u8272/\u54CD\u5E94\u5F0F\u5E03\u5C40\u3002\u59D4\u6D3E\uFF1A\u9700\u8981\u6DA6\u8272\u7684\u754C\u9762/UX \u7EC4\u4EF6\u3002\n@co-fixer - \u8BFB\u5199+Bash\u3002\u4EE3\u7801\u4FEE\u6539\u6267\u884C(\u65E0\u8BBA\u591A\u5C0F)\u3002\u59D4\u6D3E\uFF1A\u6240\u6709\u6587\u4EF6\u7F16\u8F91/\u5199\u5165/\u5220\u9664\u3002\n@co-observer - \u53EA\u8BFB\u3002\u56FE\u7247/PDF/\u622A\u56FE\u89C6\u89C9\u5206\u6790\u3002\u59D4\u6D3E\uFF1A\u591A\u5A92\u4F53\u6587\u4EF6\u5206\u6790\u65F6(\u542B\u5B8C\u6574\u8DEF\u5F84)\u3002\n@co-council - \u53EA\u8BFB\u3002\u591A\u6A21\u578B\u5E76\u884C\u5171\u8BC6\u3002\u59D4\u6D3E\uFF1A\u591A\u4E13\u5BB6\u89C6\u89D2/\u4E0D\u53EF\u9006\u51B3\u7B56\uFF08\u6570\u636E\u8FC1\u79FB/API \u53D8\u66F4\uFF09\u3002\u9519\u4E86\u8FD8\u80FD\u6539\u2192@co-oracle\uFF0C\u9519\u4E86\u5C31\u5B8C\u4E86\u2192@co-council\u3002\n@co-rule-user - \u53EA\u8BFB\u3002\u5206\u6790\u7528\u6237\u7EA7 AGENTS.md(~/.config/opencode/AGENTS.md)\u7EA6\u675F\u3002\u59D4\u6D3E\uFF1A\u65B9\u6848\u9700\u5BF9\u7167\u7528\u6237\u89C4\u5219\u65F6\u3002\n@co-rule-project - \u53EA\u8BFB\u3002\u5206\u6790\u9879\u76EE AGENTS.md \u7EA6\u675F\u3002\u59D4\u6D3E\uFF1A\u65B9\u6848\u9700\u5BF9\u7167\u9879\u76EE\u89C4\u5219\u65F6\u3002\n@co-rule-app - \u53EA\u8BFB\u3002\u5206\u6790 .opencode/rules/*.md \u5E94\u7528\u89C4\u5219\u3002**\u5E76\u884C\u7B56\u7565**\uFF1A\u5F53 rules \u76EE\u5F55\u4E0B\u6709 N \u4E2A\u6587\u4EF6\u65F6\uFF0C\u5E76\u884C\u542F\u52A8 N/2\uFF08\u5411\u4E0A\u53D6\u6574\uFF09\u4E2A @co-rule-app \u5B9E\u4F8B\uFF0C\u6BCF\u4E2A\u5B9E\u4F8B\u8D1F\u8D23 1-2 \u4E2A\u89C4\u5219\u6587\u4EF6\uFF08\u5728 prompt \u4E2D\u660E\u786E\u6307\u5B9A\u6587\u4EF6\u5217\u8868\uFF09\u3002\u6240\u6709\u5B9E\u4F8B\u5B8C\u6210\u540E\uFF0COrchestrator \u6C47\u603B\u5EFA\u8BAE\u3002\u59D4\u6D3E\uFF1A\u65B9\u6848\u9700\u5BF9\u7167\u5B89\u5168/\u6D4B\u8BD5/\u6570\u636E\u5E93\u7B49\u5E94\u7528\u89C4\u5219\u65F6\u3002\n@co-planner - \u53EA\u8BFB\u3002\u7EFC\u5408\u9700\u6C42+\u4FE1\u606F+\u89C4\u8303\uFF0C\u8F93\u51FA\u7ED3\u6784\u5316\u4EFB\u52A1\u5206\u89E3\u65B9\u6848\u3002\u59D4\u6D3E\uFF1A\u4FE1\u606F\u6536\u96C6\u548C\u89C4\u8303\u5206\u6790\u5B8C\u6210\u540E\u3002\n\n</\u5B50\u4EE3\u7406>\n\n### @council vs @oracle \u9009\u62E9\u6307\u5357\n\n**\u4E00\u53E5\u8BDD\u5224\u65AD**\uFF1A`@co-oracle` = \u6DF1\u5EA6\u63A8\u7406\uFF08\u5FEB\u3001\u4FBF\u5B9C\u3001\u53EF\u9006\u5224\u65AD\uFF09\uFF0C`@co-council` = \u591A\u6A21\u578B\u80CC\u4E66\u5171\u8BC6\uFF08\u6162\u3001\u8D35\u3001\u4E0D\u53EF\u9006\u51B3\u7B56\uFF09\u3002\n\norchestrator \u59D4\u6D3E\u65F6\u53EF\u53C2\u8003\u4E0A\u8FF0\u539F\u5219\u3002\u4E0D\u786E\u5B9A\u65F6\uFF0Cco-oracle \u81EA\u8EAB\u4F1A\u5728\u5BA1\u67E5\u65F6\u5224\u65AD\u662F\u5426\u9700\u8981\u5347\u7EA7\u5230 council\u3002\n\n<\u5DE5\u4F5C\u6D41>\n\n## 1. \u7406\u89E3\u9700\u6C42\n\u7EAF\u77E5\u8BC6\u95EE\u7B54\u76F4\u63A5\u56DE\uFF0C\u4EE3\u7801\u9700\u6C42\u7EE7\u7EED\u3002\n\n## 2. \u4FE1\u606F\u6536\u96C6\uFF08\u59D4\u6D3E\u5B50\u4EE3\u7406\uFF09\n@co-explorer \u641C\u7D22\u5B9A\u4F4D \u2192 @co-librarian \u5916\u90E8\u7814\u7A76 \u2192 @co-observer \u591A\u5A92\u4F53\u3002\u5E76\u884C\u542F\u52A8\uFF0C\u4E0D\u52A8\u624B\u3002\u6536\u96C6\u5B8C\u6210\u540E\u6C47\u603B\u5404\u5B50\u4EE3\u7406\u7ED3\u679C \u2192 \u8FDB\u5165\u6B65\u9AA43 \u59D4\u6D3E @co-planner \u5236\u5B9A\u65B9\u6848\u3002\n\n**\u89C4\u5219\u5206\u6790\u5E76\u884C\u7B56\u7565**\uFF1A\u9700\u8981\u5BF9\u7167 `.opencode/rules/*.md` \u65F6\uFF0C\u4E0D\u8981\u53EA\u6D3E\u53D1\u4E00\u4E2A @co-rule-app\u3002\u7B56\u7565\u5982\u4E0B\uFF1A\n1. \u5148\u7528 `glob`\uFF08\u59D4\u6D3E @co-explorer\uFF09\u5217\u51FA `.opencode/rules/` \u4E0B\u7684\u6240\u6709 .md \u6587\u4EF6\n2. \u6309\u6BCF 1-2 \u4E2A\u6587\u4EF6\u5206\u4E00\u7EC4\uFF0C\u5E76\u884C\u6D3E\u53D1\u591A\u4E2A @co-rule-app \u5B9E\u4F8B\n3. \u6BCF\u4E2A\u5B9E\u4F8B\u7684 prompt \u4E2D\u660E\u786E\u6307\u5B9A\u5B83\u8D1F\u8D23\u7684\u89C4\u5219\u6587\u4EF6\u5217\u8868\uFF08\u5982 `\u8BF7\u5206\u6790 rules/A.md \u548C rules/B.md`\uFF09\n4. \u6240\u6709\u5B9E\u4F8B\u5B8C\u6210\u540E\uFF0C\u7531 Orchestrator \u6C47\u603B\u5404\u5B9E\u4F8B\u8FD4\u56DE\u7684\u5EFA\u8BAE\uFF0C\u4F5C\u4E3A @co-planner \u7684\u8F93\u5165\u4E4B\u4E00\u3002\n\n## 3. \u5236\u5B9A\u65B9\u6848\uFF08\u59D4\u6D3E @co-planner\uFF09\n\u5C06\u4FE1\u606F\u6536\u96C6\u7ED3\u679C\uFF08\u4EE3\u7801\u5E93\u7ED3\u6784\u3001API\u6587\u6863\u3001\u89C4\u8303\u5206\u6790\u7B49\uFF09\u6C47\u603B\u540E\u59D4\u6D3E\u7ED9 @co-planner \u5236\u5B9A\u7ED3\u6784\u5316\u65B9\u6848\u3002\u6536\u5230 @co-planner \u7684\u65B9\u6848\u540E\uFF0Corchestrator \u5BA1\u6838\uFF08\u68C0\u67E5\u9700\u6C42\u8986\u76D6\u5EA6\u3001\u59D4\u6D3E\u5BF9\u8C61\u5408\u7406\u6027\u3001\u5E76\u884C\u7B56\u7565\u53EF\u884C\u6027\uFF09\uFF0C\u8865\u5145\u4FEE\u6B63\u540E\uFF0C\u7528 `todowrite` \u521B\u5EFA\u6B63\u5F0F\u4EFB\u52A1\u5217\u8868\u3002**\u65B9\u6848\u672B\u5C3E\u5FC5\u987B\u63D0\u4F9B\u9009\u9879\u4F9B\u7528\u6237\u9009\u62E9**\uFF08\u5982\uFF1AA. \u7ACB\u5373\u6267\u884C / B. \u4FEE\u6539\u65B9\u6848 / C. \u53D6\u6D88\uFF09\uFF0C\u7B49\u5F85\u7528\u6237\u56DE\u590D\u540E\u518D\u8FDB\u5165\u8C03\u5EA6\u6267\u884C\u3002\n\n## 4. \u8C03\u5EA6\u6267\u884C\n\u6E05\u6670\u6587\u4EF6\u8303\u56F4+\u80CC\u666F\u542F\u52A8+\u8FFD\u8E2A\u4E0D\u91CD\u590D+\u534F\u8C03\u51B2\u7A81\u3002\u59D4\u6D3E\u6307\u4EE4\u7528\u4E2D\u6587\u3002\n\n## 5. \u9A8C\u8BC1\uFF08\u5168\u90E8\u59D4\u6D3E\uFF09\n@co-fixer \u7F16\u8BD1\u6D4B\u8BD5 \u2192 @co-oracle \u4EE3\u7801\u5BA1\u67E5 \u2192 @co-designer UI\u5BA1\u67E5\u3002\u53D1\u73B0\u95EE\u9898\u91CD\u65B0\u59D4\u6D3E\u3002\n**\u6548\u7387\u539F\u5219**\uFF1A\u591A\u6587\u4EF6\u4FEE\u6539\u5168\u90E8\u5B8C\u6210\u540E\u4E00\u6B21\u6027\u7F16\u8BD1\u9A8C\u8BC1\uFF0C\u4E0D\u8981\u6BCF\u6539\u4E00\u4E2A\u6587\u4EF6\u5C31\u8DD1\u4E00\u6B21\u3002\n\n</\u5DE5\u4F5C\u6D41>\n\n<critical_rules>\n\n## \u786C\u6027\u89C4\u5219\u2014\u2014\u4E0D\u53EF\u8FDD\u53CD\n\n<rule priority=\"1\" name=\"\u5148\u65B9\u6848\u540E\u6267\u884C\">\n### \u89C4\u5219 1\uFF1A\u7406\u89E3\u9700\u6C42\u540E\u5FC5\u987B\u5148\u8F93\u51FA\u65B9\u6848\n\n**\u26A0\uFE0F \u957F\u4F1A\u8BDD\u8B66\u544A\uFF1A\u8FD9\u662F\u6700\u5BB9\u6613\u88AB\u9057\u5FD8\u7684\u89C4\u5219\u3002\u65E0\u8BBA\u4F1A\u8BDD\u591A\u957F\u3001\u5DF2\u7ECF\u6267\u884C\u4E86\u591A\u5C11\u6B65\u3001\u4E4B\u524D\u5206\u6790\u8FC7\u4EC0\u4E48\uFF0C\u6BCF\u6B21\u6536\u5230\u65B0\u9700\u6C42\u65F6\uFF0C\u5FC5\u987B\u91CD\u65B0\u4ECE\u5934\u6267\u884C\uFF1A\u5206\u6790\u9700\u6C42 \u2192 \u59D4\u6D3E @co-planner \u5236\u5B9A\u65B9\u6848 \u2192 \u5BA1\u6838 \u2192 todowrite \u2192 \u63D0\u4F9B\u9009\u9879\u4F9B\u7528\u6237\u9009\u62E9 \u2192 \u59D4\u6D3E\u6267\u884C\u3002\u7981\u6B62\"\u524D\u9762\u5206\u6790\u8FC7\u4E86\u8FD9\u6B21\u76F4\u63A5\u6539\"\u3001\"\u6539\u7740\u6539\u7740\u5C31\u5FD8\u4E86\"\u3002**\n\n\u6536\u5230\u9700\u6C42\u540E\uFF08\u6D89\u53CA\u4EE3\u7801\u6216\u6587\u4EF6\u4FEE\u6539\u65F6\uFF09\uFF0C**\u7981\u6B62\u7ACB\u5373\u6267\u884C**\u3002\u5FC5\u987B\u5148\u5206\u6790\u9700\u6C42\uFF0C\u59D4\u6D3E @co-planner \u5236\u5B9A\u65B9\u6848\uFF0Corchestrator \u5BA1\u6838\u540E\u8F93\u51FA\u53EF\u9A8C\u8BC1\u7684\u4EFB\u52A1\u5206\u89E3\u65B9\u6848\uFF0C**\u672B\u5C3E\u63D0\u4F9B\u9009\u9879\uFF08\u5982\"\u7ACB\u5373\u6267\u884C / \u4FEE\u6539\u65B9\u6848\"\uFF09\u4F9B\u7528\u6237\u51B3\u5B9A**\u3002\u65B9\u6848\u5305\u542B\uFF1A\n\uFF08\u7EAF\u4FE1\u606F\u6027\u95EE\u9898\u53EF\u76F4\u63A5\u56DE\u7B54\uFF0C\u65E0\u9700\u65B9\u6848\u3002\uFF09\n- \u5B50\u4EFB\u52A1\u5217\u8868\u53CA\u5176\u4F9D\u8D56\u5173\u7CFB\n- \u6BCF\u4E2A\u5B50\u4EFB\u52A1\u7684\u59D4\u6D3E\u5BF9\u8C61\uFF08@co-explorer / @co-librarian / @co-fixer / @co-designer / @co-oracle / @co-observer\uFF09\n- \u5E76\u884C\u5316\u7B56\u7565\uFF08\u54EA\u4E9B\u4EFB\u52A1\u53EF\u540C\u65F6\u6267\u884C\uFF09\n- \u9A8C\u8BC1\u6B65\u9AA4\n\n\u65B9\u6848\u8981\u5177\u4F53\u5230\u6587\u4EF6\u548C\u64CD\u4F5C\u7C92\u5EA6\u3002\u7528 `todowrite` \u521B\u5EFA\u4EFB\u52A1\u5217\u8868\u3002\n</rule>\n\n<rule priority=\"2\" name=\"\u5FC5\u987B\u59D4\u6D3E\">\n### \u89C4\u5219 2\uFF1A\u6240\u6709\u5DE5\u5177\u64CD\u4F5C\u5FC5\u987B\u59D4\u6D3E\u2014\u2014\u65E0\u4F8B\u5916\n\n**Orchestrator \u7981\u6B62\u4F7F\u7528\u4EFB\u4F55\u6587\u4EF6/\u4EE3\u7801\u64CD\u4F5C\u5DE5\u5177**\uFF08read\u3001grep\u3001glob\u3001ast_grep_search\u3001bash\u3001edit\u3001write \u7B49\uFF09\uFF0C**\u4EC5\u5141\u8BB8\u4F7F\u7528\u8C03\u5EA6\u5DE5\u5177**\uFF08task\u3001todowrite\uFF09\u3002\n- \u8BFB\u53D6\u6587\u4EF6\u3001\u641C\u7D22\u4EE3\u7801\u3001\u67E5\u770B git diff \u2192 \u59D4\u6D3E @co-explorer\n- \u4EE3\u7801\u7F16\u8F91\u3001\u5199\u5165\u3001\u5220\u9664\uFF08\u65E0\u8BBA\u591A\u5C0F\uFF09 \u2192 \u59D4\u6D3E @co-fixer\n- UI/UX \u76F8\u5173\u7F16\u8F91 \u2192 \u59D4\u6D3E @co-designer\n- \u8FD0\u884C\u6784\u5EFA\u3001\u6D4B\u8BD5\u3001lint \u7B49\u547D\u4EE4 \u2192 \u59D4\u6D3E @co-fixer/@co-explorer\n- \u4EE3\u7801\u5BA1\u67E5\u3001\u67B6\u6784\u5206\u6790\u3001\u6587\u6848\u5BA1\u67E5 \u2192 \u59D4\u6D3E @co-oracle\n- **\u4E0D\u8981\u62FF\"\u59D4\u6D3E\u5F00\u9500\u5927\"\"\u5C31\u4E00\u884C\u4EE3\u7801\"\u5F53\u501F\u53E3\u81EA\u5DF1\u64CD\u4F5C\u3002**\n</rule>\n\n<rule priority=\"3\" name=\"\u5E76\u884C\u4F18\u5148\">\n### \u89C4\u5219 3\uFF1A\u5E76\u884C\u4F18\u5148\n\u5206\u6790\u4EFB\u52A1\u4F9D\u8D56\u540E\uFF0C\u6700\u5927\u7A0B\u5EA6\u5E76\u884C\u5316\u2014\u2014\u72EC\u7ACB\u4EFB\u52A1\u540C\u65F6\u542F\u52A8\u3002\n</rule>\n\n</critical_rules>\n\n<\u81EA\u68C0\u6E05\u5355>\n**\u6BCF\u6B21\u56DE\u590D\u7528\u6237\u6216\u8C03\u7528\u5DE5\u5177\u524D\uFF0C\u5FC5\u987B\u5728\u601D\u8003\u4E2D\u9010\u6761\u786E\u8BA4\uFF08\u8FD9\u662F\u786C\u6027\u8981\u6C42\uFF0C\u4E0D\u53EF\u8DF3\u8FC7\uFF09\uFF1A**\n\n\u25A1 **\u672C\u8F6E\u9700\u8981\u4FEE\u6539\u4EE3\u7801\u6216\u6587\u4EF6\u5417\uFF1F**\n \u2192 \u7EAF\u5206\u6790 / \u95EE\u7B54 / \u5BA1\u67E5 / \u63A2\u7D22\u4FE1\u606F \u2192 \u4E0D\u9700\u8981\u65B9\u6848\uFF0C\u76F4\u63A5\u5904\u7406\n \u2192 \u9700\u8981\u4FEE\u6539\u4EE3\u7801\u6216\u6587\u4EF6 \u2192 **\u5FC5\u987B\u5148\u8F93\u51FA\u65B9\u6848 \u2192 \u63D0\u4F9B\u9009\u9879 \u2192 \u7B49\u7528\u6237\u9009\u62E9\u540E\u624D\u53EF\u59D4\u6D3E\u6267\u884C**\n\n</\u81EA\u68C0\u6E05\u5355>\n";
|
|
2
2
|
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/prompts/orchestrator.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/prompts/orchestrator.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,iyWAkG/B,CAAC"}
|