oh-my-opencode-cohub 1.3.0 → 1.5.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/dist/context/engine.d.ts +5 -0
- package/dist/context/engine.d.ts.map +1 -1
- package/dist/context/extractor.d.ts.map +1 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +245 -73
- package/dist/prompts/orchestrator.d.ts +1 -1
- package/dist/prompts/orchestrator.d.ts.map +1 -1
- package/dist/rule-injector.d.ts +31 -0
- package/dist/rule-injector.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/context/engine.d.ts
CHANGED
|
@@ -28,6 +28,11 @@ export declare class ContextEngine {
|
|
|
28
28
|
* 返回替换后的完整文本,或 null(无标记或未找到上下文)。
|
|
29
29
|
*/
|
|
30
30
|
consumeMarkedContext(messageText: string): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* 格式化上下文详情(文件、决策、错误、依赖),不含主标题。
|
|
33
|
+
* 用于在 tool.execute.before 中直接追加到子代理 prompt。
|
|
34
|
+
*/
|
|
35
|
+
formatContextDetails(contextId: string): string;
|
|
31
36
|
/**
|
|
32
37
|
* Phase C: 捕获子代理结果。
|
|
33
38
|
* 读取子 session 的最终输出 → 提取关键信息 → 存入 dependencyCache。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/context/engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAe,aAAa,EAAoB,MAAM,SAAS,CAAC;AAI7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEzD,qBAAa,aAAa;IACxB,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,CAAkC;IAClD,sBAAsB;IACtB,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAU9D;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAYtD;;OAEG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE;QAAE,QAAQ,EAAE,eAAe,CAAA;KAAE,GAClC,OAAO,CAAC,IAAI,CAAC;IAgChB;;;;OAIG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiBxD;;;OAGG;IACG,aAAa,CACjB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAuChB;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIvC;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe;IAI/C;;OAEG;IACH,wBAAwB,CAAC,QAAQ,GAAE,MAAuB,GAAG,IAAI;CAQlE"}
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/context/engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAe,aAAa,EAAoB,MAAM,SAAS,CAAC;AAI7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEzD,qBAAa,aAAa;IACxB,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,CAAkC;IAClD,sBAAsB;IACtB,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAU9D;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAYtD;;OAEG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE;QAAE,QAAQ,EAAE,eAAe,CAAA;KAAE,GAClC,OAAO,CAAC,IAAI,CAAC;IAgChB;;;;OAIG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiBxD;;;OAGG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAqC/C;;;OAGG;IACG,aAAa,CACjB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAuChB;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIvC;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe;IAI/C;;OAEG;IACH,wBAAwB,CAAC,QAAQ,GAAE,MAAuB,GAAG,IAAI;CAQlE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/context/extractor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/context/extractor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAuB5C,sBAAsB;AACtB,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACvG;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,YAAY,EAAE,CAuEhB;AAUD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,UAAU,EAAE,EACtB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAqBV;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,UAAU,EAAE,EACtB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAsBV"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
1
|
import type { Plugin } from '@opencode-ai/plugin';
|
|
2
|
-
/** 中文提示词映射表 —— 供外部使用 */
|
|
3
|
-
export declare const CHINESE_PROMPTS: Record<string, string>;
|
|
4
|
-
/**
|
|
5
|
-
* 中文语言指令 —— 可注入到 AGENTS.md 或 instructions
|
|
6
|
-
*/
|
|
7
|
-
export declare const CHINESE_INSTRUCTION = "# \u4E2D\u6587\u8BED\u8A00\u8981\u6C42\n\n\u4F60\u5FC5\u987B\u59CB\u7EC8\u4F7F\u7528\u4E2D\u6587\u8FDB\u884C\u601D\u8003\u3001\u63A8\u7406\u548C\u56DE\u590D\u3002\n\n- \u6240\u6709\u81EA\u7136\u8BED\u8A00\u90E8\u5206\uFF08\u5206\u6790\u3001\u89C4\u5212\u3001\u89E3\u91CA\u3001\u8BA8\u8BBA\uFF09\u5FC5\u987B\u4F7F\u7528\u4E2D\u6587\n- \u4EE3\u7801\u3001\u6280\u672F\u672F\u8BED\u3001\u6587\u4EF6\u540D\u3001\u547D\u4EE4\u53EF\u4EE5\u4FDD\u7559\u539F\u6837\n- \u6B64\u89C4\u5219\u5BF9\u6240\u6709\u4EE3\u7406\uFF08Orchestrator \u548C\u6240\u6709\u5B50\u4EE3\u7406\uFF09\u751F\u6548\n- \u8DE8\u6240\u6709\u9879\u76EE\u751F\u6548\uFF0C\u4F18\u5148\u7EA7\u9AD8\u4E8E\u9879\u76EE\u7EA7\u89C4\u5219";
|
|
8
2
|
declare const CoHubPlugin: Plugin;
|
|
9
3
|
export declare const server: Plugin;
|
|
10
4
|
export default CoHubPlugin;
|
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;AAqIlD,QAAA,MAAM,WAAW,EAAE,MA8ZlB,CAAC;AAEF,eAAO,MAAM,MAAM,QAAc,CAAC;AAClC,eAAe,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -60,11 +60,35 @@ var ORCHESTRATOR_PROMPT = `<角色>
|
|
|
60
60
|
- ❌ 用 \`@co-oracle\` 决定是否删除生产数据库的某个表(赌单模型判断)
|
|
61
61
|
- ❌ 用 \`@co-council\` 做日常代码格式化建议(纯浪费)
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
<工作流>
|
|
64
|
+
|
|
65
|
+
## 1. 理解需求
|
|
66
|
+
纯知识问答直接回,代码需求继续。
|
|
67
|
+
|
|
68
|
+
## 2. 信息收集(委派子代理)
|
|
69
|
+
@co-explorer 搜索定位 → @co-librarian 外部研究 → @co-observer 多媒体。并行启动,不动手。
|
|
70
|
+
|
|
71
|
+
## 3. 制定方案
|
|
72
|
+
综合信息→子任务分解→委派对象→并行策略→todowrite 记录→用户确认。
|
|
73
|
+
|
|
74
|
+
## 4. 调度执行
|
|
75
|
+
清晰文件范围+背景启动+追踪不重复+协调冲突。委派指令用中文。
|
|
76
|
+
|
|
77
|
+
## 5. 验证(全部委派)
|
|
78
|
+
@co-fixer 编译测试 → @co-oracle 代码审查 → @co-designer UI审查。发现问题重新委派。
|
|
79
|
+
**效率原则**:多文件修改全部完成后一次性编译验证,不要每改一个文件就跑一次。
|
|
80
|
+
|
|
81
|
+
</工作流>
|
|
82
|
+
|
|
83
|
+
<critical_rules>
|
|
64
84
|
|
|
65
85
|
## 硬性规则——不可违反
|
|
66
86
|
|
|
87
|
+
<rule priority="1" name="先方案后执行">
|
|
67
88
|
### 规则 1:理解需求后必须先输出方案
|
|
89
|
+
|
|
90
|
+
**⚠️ 长会话警告:这是最容易被遗忘的规则。无论会话多长、已经执行了多少步、之前分析过什么,每次收到新需求时,必须重新从头执行:分析需求 → 输出方案 → todowrite 创建任务 → 等待用户确认 → 委派执行。禁止"前面分析过了这次直接改"、"改着改着就忘了"。**
|
|
91
|
+
|
|
68
92
|
收到需求后(涉及代码或文件修改时),**禁止立即执行**。必须先分析需求,输出可验证的任务分解方案,包含:
|
|
69
93
|
(纯信息性问题可直接回答,无需方案。)
|
|
70
94
|
- 子任务列表及其依赖关系
|
|
@@ -73,8 +97,11 @@ var ORCHESTRATOR_PROMPT = `<角色>
|
|
|
73
97
|
- 验证步骤
|
|
74
98
|
|
|
75
99
|
方案要具体到文件和操作粒度。用 \`todowrite\` 创建任务列表。
|
|
100
|
+
</rule>
|
|
76
101
|
|
|
102
|
+
<rule priority="2" name="必须委派">
|
|
77
103
|
### 规则 2:所有工具操作必须委派——无例外
|
|
104
|
+
|
|
78
105
|
**Orchestrator 禁止使用任何文件/代码操作工具**(read、grep、glob、ast_grep_search、bash、edit、write 等),**仅允许使用调度工具**(task、todowrite)。
|
|
79
106
|
- 读取文件、搜索代码、查看 git diff → 委派 @co-explorer
|
|
80
107
|
- 代码编辑、写入、删除(无论多小) → 委派 @co-fixer
|
|
@@ -82,30 +109,37 @@ var ORCHESTRATOR_PROMPT = `<角色>
|
|
|
82
109
|
- 运行构建、测试、lint 等命令 → 委派 @co-fixer/@co-explorer
|
|
83
110
|
- 代码审查、架构分析、文案审查 → 委派 @co-oracle
|
|
84
111
|
- **不要拿"委派开销大""就一行代码"当借口自己操作。**
|
|
112
|
+
</rule>
|
|
85
113
|
|
|
114
|
+
<rule priority="3" name="并行优先">
|
|
86
115
|
### 规则 3:并行优先
|
|
87
116
|
分析任务依赖后,最大程度并行化——独立任务同时启动。
|
|
117
|
+
</rule>
|
|
88
118
|
|
|
89
|
-
|
|
90
|
-
|
|
119
|
+
<rule priority="4" name="状态锁">
|
|
120
|
+
### 规则 4:todowrite 状态锁
|
|
91
121
|
|
|
92
|
-
|
|
93
|
-
|
|
122
|
+
每次委派 @co-fixer 进行代码修改前,必须确认当前会话的状态:
|
|
123
|
+
- 检查 todowrite:是否存在至少一个标题包含"方案"或"计划"、且状态为 \`completed\` 的任务?
|
|
124
|
+
- 如果没有 → 说明尚未制定方案 → **必须先制定方案,禁止直接委派 @co-fixer 修改代码**
|
|
125
|
+
- todowrite 是外部状态存储,不依赖你的记忆。有疑问时,先查看 todowrite 当前状态。
|
|
126
|
+
- 降级策略:如果 todowrite 不可用(工具报错、状态丢失),通过对话历史确认——本次会话中是否已向用户输出方案并获明确确认?如确认则视为"方案已完成"。
|
|
127
|
+
</rule>
|
|
94
128
|
|
|
95
|
-
|
|
96
|
-
@co-explorer 搜索定位 → @co-librarian 外部研究 → @co-observer 多媒体。并行启动,不动手。
|
|
129
|
+
</critical_rules>
|
|
97
130
|
|
|
98
|
-
|
|
99
|
-
|
|
131
|
+
<自检清单>
|
|
132
|
+
**每次回复用户或调用工具前,必须在思考中逐条确认(这是硬性要求,不可跳过):**
|
|
100
133
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
## 5. 验证(全部委派)
|
|
105
|
-
@co-fixer 编译测试 → @co-oracle 代码审查 → @co-designer UI审查。发现问题重新委派。
|
|
106
|
-
**效率原则**:多文件修改全部完成后一次性编译验证,不要每改一个文件就跑一次。
|
|
134
|
+
□ **本轮需要修改代码或文件吗?**
|
|
135
|
+
→ 纯分析 / 问答 / 审查 / 探索信息 → 不需要方案,直接处理
|
|
136
|
+
→ 需要修改代码或文件 → **必须先输出方案 → todowrite → 等待用户确认** → 才可委派执行
|
|
107
137
|
|
|
108
|
-
|
|
138
|
+
□ **准备委派 @co-fixer 修改代码吗?**
|
|
139
|
+
→ 先确认 todowrite 中有 completed 的方案任务(标题含"方案"或"计划")
|
|
140
|
+
→ 没有 → **立即停下来,先制定方案**
|
|
141
|
+
→ todowrite 不可用时,通过对话历史确认是否已获用户方案确认
|
|
142
|
+
</自检清单>
|
|
109
143
|
`;
|
|
110
144
|
|
|
111
145
|
// src/prompts/oracle.ts
|
|
@@ -632,6 +666,38 @@ class TaskTracker {
|
|
|
632
666
|
}
|
|
633
667
|
}
|
|
634
668
|
|
|
669
|
+
// src/rule-injector.ts
|
|
670
|
+
class RuleInjector {
|
|
671
|
+
counters = new Map;
|
|
672
|
+
INTERVAL = 5;
|
|
673
|
+
MAX_ENTRIES = 200;
|
|
674
|
+
REMINDER = `
|
|
675
|
+
|
|
676
|
+
[系统规则提醒 — 第{N}轮]
|
|
677
|
+
` + `⚠️ 需要改代码?→ 先在本轮输出方案 → todowrite → 等用户确认
|
|
678
|
+
` + `⚠️ 要委派 @co-fixer?→ 先确认 todowrite 有 completed 的方案
|
|
679
|
+
` + "先检查上面两条,再决定下一步。";
|
|
680
|
+
tick(sessionID) {
|
|
681
|
+
const count = (this.counters.get(sessionID) ?? 0) + 1;
|
|
682
|
+
this.counters.set(sessionID, count);
|
|
683
|
+
if (this.counters.size > this.MAX_ENTRIES) {
|
|
684
|
+
const firstKey = this.counters.keys().next().value;
|
|
685
|
+
if (firstKey)
|
|
686
|
+
this.counters.delete(firstKey);
|
|
687
|
+
}
|
|
688
|
+
if (count % this.INTERVAL === 0) {
|
|
689
|
+
return this.REMINDER.replace("{N}", String(count));
|
|
690
|
+
}
|
|
691
|
+
return null;
|
|
692
|
+
}
|
|
693
|
+
cleanup(sessionID) {
|
|
694
|
+
this.counters.delete(sessionID);
|
|
695
|
+
}
|
|
696
|
+
get activeSessionCount() {
|
|
697
|
+
return this.counters.size;
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
|
|
635
701
|
// src/context/types.ts
|
|
636
702
|
var DEFAULT_CONTEXT_CONFIG = {
|
|
637
703
|
strategy: {
|
|
@@ -657,6 +723,48 @@ var DEFAULT_CONTEXT_CONFIG = {
|
|
|
657
723
|
};
|
|
658
724
|
|
|
659
725
|
// src/context/extractor.ts
|
|
726
|
+
var KNOWN_EXTENSIONS = new Set([
|
|
727
|
+
"ts",
|
|
728
|
+
"tsx",
|
|
729
|
+
"js",
|
|
730
|
+
"jsx",
|
|
731
|
+
"mjs",
|
|
732
|
+
"cjs",
|
|
733
|
+
"json",
|
|
734
|
+
"md",
|
|
735
|
+
"mdx",
|
|
736
|
+
"css",
|
|
737
|
+
"scss",
|
|
738
|
+
"less",
|
|
739
|
+
"html",
|
|
740
|
+
"htm",
|
|
741
|
+
"py",
|
|
742
|
+
"rs",
|
|
743
|
+
"go",
|
|
744
|
+
"java",
|
|
745
|
+
"cpp",
|
|
746
|
+
"c",
|
|
747
|
+
"h",
|
|
748
|
+
"hpp",
|
|
749
|
+
"rb",
|
|
750
|
+
"php",
|
|
751
|
+
"swift",
|
|
752
|
+
"kt",
|
|
753
|
+
"scala",
|
|
754
|
+
"yml",
|
|
755
|
+
"yaml",
|
|
756
|
+
"toml",
|
|
757
|
+
"xml",
|
|
758
|
+
"sql",
|
|
759
|
+
"env",
|
|
760
|
+
"sh",
|
|
761
|
+
"bash",
|
|
762
|
+
"ps1",
|
|
763
|
+
"dockerfile",
|
|
764
|
+
"gitignore",
|
|
765
|
+
"editorconfig"
|
|
766
|
+
]);
|
|
767
|
+
var FILE_PATH_RE = /`?((?:[A-Za-z]:[\\\/]|\.{1,2}[\\\/]|~\/|\/|[\w-]+[\\\/])[\w\-\.\\\/]+\.\w{1,10})`?/g;
|
|
660
768
|
function extractRelevantFiles(messages, maxFiles, windowSize) {
|
|
661
769
|
const recent = messages.slice(-windowSize);
|
|
662
770
|
const fileMap = new Map;
|
|
@@ -668,6 +776,22 @@ function extractRelevantFiles(messages, maxFiles, windowSize) {
|
|
|
668
776
|
if (path && !fileMap.has(path)) {
|
|
669
777
|
fileMap.set(path, { path, summary: "" });
|
|
670
778
|
}
|
|
779
|
+
for (const value of Object.values(args)) {
|
|
780
|
+
if (typeof value !== "string")
|
|
781
|
+
continue;
|
|
782
|
+
let match;
|
|
783
|
+
FILE_PATH_RE.lastIndex = 0;
|
|
784
|
+
while ((match = FILE_PATH_RE.exec(value)) !== null) {
|
|
785
|
+
const rawPath = match[1];
|
|
786
|
+
const ext = rawPath.split(".").pop()?.toLowerCase();
|
|
787
|
+
if (!ext || !KNOWN_EXTENSIONS.has(ext))
|
|
788
|
+
continue;
|
|
789
|
+
const cleanPath = rawPath.replace(/^`|`$/g, "");
|
|
790
|
+
if (!fileMap.has(cleanPath)) {
|
|
791
|
+
fileMap.set(cleanPath, { path: cleanPath, summary: "" });
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
}
|
|
671
795
|
}
|
|
672
796
|
if (part.type === "tool_result" && part.tool_result) {
|
|
673
797
|
const tr = part.tool_result;
|
|
@@ -689,6 +813,20 @@ function extractRelevantFiles(messages, maxFiles, windowSize) {
|
|
|
689
813
|
}
|
|
690
814
|
}
|
|
691
815
|
}
|
|
816
|
+
if (typeof part.text === "string") {
|
|
817
|
+
let match;
|
|
818
|
+
FILE_PATH_RE.lastIndex = 0;
|
|
819
|
+
while ((match = FILE_PATH_RE.exec(part.text)) !== null) {
|
|
820
|
+
const rawPath = match[1];
|
|
821
|
+
const ext = rawPath.split(".").pop()?.toLowerCase();
|
|
822
|
+
if (!ext || !KNOWN_EXTENSIONS.has(ext))
|
|
823
|
+
continue;
|
|
824
|
+
const cleanPath = rawPath.replace(/^`|`$/g, "");
|
|
825
|
+
if (!fileMap.has(cleanPath)) {
|
|
826
|
+
fileMap.set(cleanPath, { path: cleanPath, summary: "" });
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
}
|
|
692
830
|
}
|
|
693
831
|
}
|
|
694
832
|
return Array.from(fileMap.values()).slice(0, maxFiles);
|
|
@@ -873,6 +1011,40 @@ class ContextEngine {
|
|
|
873
1011
|
this.registry.delete(contextId);
|
|
874
1012
|
return result;
|
|
875
1013
|
}
|
|
1014
|
+
formatContextDetails(contextId) {
|
|
1015
|
+
const context = this.registry.get(contextId);
|
|
1016
|
+
if (!context)
|
|
1017
|
+
return "";
|
|
1018
|
+
const parts = [];
|
|
1019
|
+
if (context.relevantFiles.length > 0) {
|
|
1020
|
+
parts.push("### \uD83D\uDCC1 相关文件");
|
|
1021
|
+
for (const file of context.relevantFiles) {
|
|
1022
|
+
parts.push(`- \`${file.path}\`` + (file.summary ? ` — ${file.summary}` : ""));
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
if (context.decisions.length > 0) {
|
|
1026
|
+
parts.push("### \uD83D\uDCA1 前置决策");
|
|
1027
|
+
for (const d of context.decisions) {
|
|
1028
|
+
parts.push(`- ${d}`);
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
if (context.errors.length > 0) {
|
|
1032
|
+
parts.push("### ⚠️ 近期错误");
|
|
1033
|
+
for (const e of context.errors) {
|
|
1034
|
+
parts.push(`- ${e}`);
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
if (context.dependencies.length > 0) {
|
|
1038
|
+
parts.push("### \uD83D\uDCE6 依赖结果");
|
|
1039
|
+
for (const dep of context.dependencies) {
|
|
1040
|
+
parts.push(`- **${dep.agent}**: ${dep.keyOutput}`);
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
return parts.length > 0 ? `
|
|
1044
|
+
` + parts.join(`
|
|
1045
|
+
`) + `
|
|
1046
|
+
` : "";
|
|
1047
|
+
}
|
|
876
1048
|
async captureResult(childSessionId, alias, agent) {
|
|
877
1049
|
if (!this.config.dependencyPropagation)
|
|
878
1050
|
return;
|
|
@@ -920,13 +1092,6 @@ class ContextEngine {
|
|
|
920
1092
|
}
|
|
921
1093
|
}
|
|
922
1094
|
|
|
923
|
-
// src/context/strategy.ts
|
|
924
|
-
function resolveStrategy(agentType, defaults, override) {
|
|
925
|
-
if (override)
|
|
926
|
-
return override;
|
|
927
|
-
return defaults[agentType] ?? "none";
|
|
928
|
-
}
|
|
929
|
-
|
|
930
1095
|
// src/config/loader.ts
|
|
931
1096
|
import * as fs from "node:fs";
|
|
932
1097
|
import * as path from "node:path";
|
|
@@ -1288,20 +1453,6 @@ function createCouncilTool(ctx, councilManager) {
|
|
|
1288
1453
|
import * as fs2 from "node:fs";
|
|
1289
1454
|
import * as path2 from "node:path";
|
|
1290
1455
|
import * as os2 from "node:os";
|
|
1291
|
-
var CHINESE_PROMPTS = {
|
|
1292
|
-
"co-orchestrator": ORCHESTRATOR_PROMPT,
|
|
1293
|
-
"co-oracle": ORACLE_PROMPT,
|
|
1294
|
-
"co-librarian": LIBRARIAN_PROMPT,
|
|
1295
|
-
"co-explorer": EXPLORER_PROMPT,
|
|
1296
|
-
"co-designer": DESIGNER_PROMPT,
|
|
1297
|
-
"co-fixer": FIXER_PROMPT,
|
|
1298
|
-
"co-observer": OBSERVER_PROMPT,
|
|
1299
|
-
"co-council": COUNCIL_PROMPT,
|
|
1300
|
-
"co-rule-user": RULE_USER_PROMPT,
|
|
1301
|
-
"co-rule-project": RULE_PROJECT_PROMPT,
|
|
1302
|
-
"co-rule-app": RULE_APP_PROMPT,
|
|
1303
|
-
"co-planner": PLANNER_PROMPT
|
|
1304
|
-
};
|
|
1305
1456
|
function loadFileOverrides(projectDir) {
|
|
1306
1457
|
const overrides = {};
|
|
1307
1458
|
const agentNames = [
|
|
@@ -1354,7 +1505,6 @@ ${append}`;
|
|
|
1354
1505
|
}
|
|
1355
1506
|
return base;
|
|
1356
1507
|
}
|
|
1357
|
-
var CHINESE_INSTRUCTION = CHINESE_LANGUAGE_INSTRUCTION;
|
|
1358
1508
|
var CoHubPlugin = async (input, options) => {
|
|
1359
1509
|
const projectDir = input.directory || process.cwd();
|
|
1360
1510
|
const fileOverrides = loadFileOverrides(projectDir);
|
|
@@ -1364,6 +1514,7 @@ var CoHubPlugin = async (input, options) => {
|
|
|
1364
1514
|
}
|
|
1365
1515
|
const promptOverrides = { ...configOverrides, ...fileOverrides };
|
|
1366
1516
|
const tracker = new TaskTracker;
|
|
1517
|
+
const ruleInjector = new RuleInjector;
|
|
1367
1518
|
const STATE_DIR = path2.join(os2.homedir(), ".local", "share", "opencode", "storage", "oh-my-opencode-cohub");
|
|
1368
1519
|
const STATE_FILE = path2.join(STATE_DIR, "tracker-state.json");
|
|
1369
1520
|
function syncTrackerState(sessionId) {
|
|
@@ -1587,24 +1738,43 @@ var CoHubPlugin = async (input, options) => {
|
|
|
1587
1738
|
});
|
|
1588
1739
|
syncTrackerState(input2.sessionID ?? "");
|
|
1589
1740
|
if (subagentType) {
|
|
1590
|
-
const strategy =
|
|
1741
|
+
const strategy = typeof args.context_override === "string" ? args.context_override : contextEngine.getStrategy(subagentType);
|
|
1591
1742
|
if (strategy !== "none") {
|
|
1592
|
-
|
|
1593
|
-
console.error("[CONTEXT-DEBUG] before hook: output.args type=", typeof output.args, "isNull=", output.args === null);
|
|
1594
|
-
const contextId = contextEngine.registerContext({
|
|
1595
|
-
description
|
|
1596
|
-
});
|
|
1743
|
+
const contextId = contextEngine.registerContext({ description });
|
|
1597
1744
|
output.args ??= {};
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1745
|
+
const contextBlock = `
|
|
1746
|
+
|
|
1747
|
+
### \uD83D\uDCCB 任务上下文 (CoHub 自动注入)
|
|
1748
|
+
` + "**当前任务**: " + description + `
|
|
1749
|
+
`;
|
|
1750
|
+
const targetField = typeof output.args.prompt === "string" ? "prompt" : "description";
|
|
1751
|
+
output.args[targetField] = (targetField === "prompt" ? output.args.prompt : description) + contextBlock;
|
|
1752
|
+
await contextEngine.fillContextAsync(contextId, input2.sessionID, {
|
|
1602
1753
|
strategy
|
|
1603
|
-
})
|
|
1754
|
+
});
|
|
1755
|
+
const details = contextEngine.formatContextDetails(contextId);
|
|
1756
|
+
if (details) {
|
|
1757
|
+
output.args[targetField] += details;
|
|
1758
|
+
}
|
|
1759
|
+
const finalPrompt = typeof output.args?.prompt === "string" ? output.args.prompt : "";
|
|
1760
|
+
fs2.appendFileSync("C:\\Users\\14023\\AppData\\Local\\Temp\\opencode\\ctx-diag.log", JSON.stringify({
|
|
1761
|
+
time: new Date().toISOString(),
|
|
1762
|
+
session: input2.sessionID?.slice(0, 20) ?? "?",
|
|
1763
|
+
subagent: subagentType,
|
|
1764
|
+
strategy,
|
|
1765
|
+
targetField,
|
|
1766
|
+
hasDetails: !!details,
|
|
1767
|
+
detailsLen: details ? details.length : 0,
|
|
1768
|
+
detailsPreview: details ? details.replace(/\n/g, "\\n").slice(0, 200) : "",
|
|
1769
|
+
promptEnd: finalPrompt.slice(-120)
|
|
1770
|
+
}) + `
|
|
1771
|
+
`);
|
|
1604
1772
|
}
|
|
1605
1773
|
}
|
|
1606
1774
|
}
|
|
1607
|
-
} catch {
|
|
1775
|
+
} catch (err) {
|
|
1776
|
+
console.warn("[oh-my-opencode-cohub] tool.execute.before hook 失败:", err);
|
|
1777
|
+
}
|
|
1608
1778
|
},
|
|
1609
1779
|
"tool.execute.after": async (input2, output) => {
|
|
1610
1780
|
try {
|
|
@@ -1635,34 +1805,36 @@ var CoHubPlugin = async (input, options) => {
|
|
|
1635
1805
|
if (job) {
|
|
1636
1806
|
contextEngine.captureResult(sessionId, job.alias, job.agent);
|
|
1637
1807
|
}
|
|
1638
|
-
} else if (e.type === "session.deleted"
|
|
1808
|
+
} else if (e.type === "session.deleted") {
|
|
1809
|
+
tracker.updateByChildSessionId(sessionId, "errored");
|
|
1810
|
+
syncTrackerState(tracker.currentParentSessionId);
|
|
1811
|
+
ruleInjector.cleanup(sessionId);
|
|
1812
|
+
} else if (e.type === "session.error") {
|
|
1639
1813
|
tracker.updateByChildSessionId(sessionId, "errored");
|
|
1640
1814
|
syncTrackerState(tracker.currentParentSessionId);
|
|
1641
1815
|
}
|
|
1642
1816
|
} catch {}
|
|
1643
1817
|
},
|
|
1644
|
-
"
|
|
1818
|
+
"chat.message": async (input2, output) => {
|
|
1645
1819
|
try {
|
|
1646
|
-
if (
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
const hasMarker = /CONTEXT:ID=/.test(part.text);
|
|
1656
|
-
if (hasMarker) {
|
|
1657
|
-
console.error("[CONTEXT-DEBUG] transform: FOUND marker in user msg, text preview=", part.text.slice(0, 200));
|
|
1658
|
-
}
|
|
1659
|
-
const replaced = contextEngine.consumeMarkedContext(part.text);
|
|
1660
|
-
if (replaced !== null) {
|
|
1661
|
-
console.error("[CONTEXT-DEBUG] transform: marker REPLACED, new text preview=", part.text.slice(0, 200));
|
|
1662
|
-
}
|
|
1820
|
+
if (input2.agent !== "co-orchestrator")
|
|
1821
|
+
return;
|
|
1822
|
+
const reminder = ruleInjector.tick(input2.sessionID);
|
|
1823
|
+
if (reminder && output.parts && Array.isArray(output.parts)) {
|
|
1824
|
+
for (let j = output.parts.length - 1;j >= 0; j--) {
|
|
1825
|
+
const part = output.parts[j];
|
|
1826
|
+
if (part.type === "text") {
|
|
1827
|
+
part.text += reminder;
|
|
1828
|
+
break;
|
|
1663
1829
|
}
|
|
1664
1830
|
}
|
|
1665
1831
|
}
|
|
1832
|
+
} catch (err) {
|
|
1833
|
+
console.warn("[oh-my-opencode-cohub] chat.message hook 失败:", err);
|
|
1834
|
+
}
|
|
1835
|
+
},
|
|
1836
|
+
"experimental.chat.messages.transform": async (_input, output) => {
|
|
1837
|
+
try {
|
|
1666
1838
|
const board = tracker.getBoardText();
|
|
1667
1839
|
if (board && output.messages && Array.isArray(output.messages)) {
|
|
1668
1840
|
for (let i = output.messages.length - 1;i >= 0; i--) {
|
|
@@ -1681,7 +1853,9 @@ var CoHubPlugin = async (input, options) => {
|
|
|
1681
1853
|
}
|
|
1682
1854
|
}
|
|
1683
1855
|
}
|
|
1684
|
-
} catch {
|
|
1856
|
+
} catch (err) {
|
|
1857
|
+
console.warn("[oh-my-opencode-cohub] messages.transform hook 失败:", err);
|
|
1858
|
+
}
|
|
1685
1859
|
},
|
|
1686
1860
|
"experimental.chat.system.transform": async (_input, output) => {
|
|
1687
1861
|
output.system.push(CHINESE_LANGUAGE_INSTRUCTION);
|
|
@@ -1696,7 +1870,5 @@ var server = CoHubPlugin;
|
|
|
1696
1870
|
var src_default = CoHubPlugin;
|
|
1697
1871
|
export {
|
|
1698
1872
|
server,
|
|
1699
|
-
src_default as default
|
|
1700
|
-
CHINESE_PROMPTS,
|
|
1701
|
-
CHINESE_INSTRUCTION
|
|
1873
|
+
src_default as default
|
|
1702
1874
|
};
|
|
@@ -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\u552F\u4E00\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/* \u7EA6\u675F\u3002\u59D4\u6D3E\uFF1A\u65B9\u6848\u9700\u5BF9\u7167\u5B89\u5168/\u6D4B\u8BD5/\u6570\u636E\u5E93\u7B49\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\u5355\u89C6\u89D2\uFF09\uFF0C`@co-council` = \u591A\u6A21\u578B\u80CC\u4E66\u7684\u5171\u8BC6\uFF08\u6162\u3001\u8D35\u3001\u591A\u89C6\u89D2\uFF09\u3002\n\n| \u7EF4\u5EA6 | @co-oracle | @co-council |\n|------|-----------|-------------|\n| \u6A21\u5F0F | \u5355\u6A21\u578B\u6DF1\u5EA6\u63A8\u7406 | \u591A\u6A21\u578B\u5E76\u884C\u5171\u8BC6 |\n| \u9002\u7528\u573A\u666F | \u9519\u4E86\u8FD8\u80FD\u6539\u7684\u51B3\u7B56 | \u9519\u4E86\u5C31\u5B8C\u4E86\u7684\u51B3\u7B56 |\n| \u5178\u578B\u7528\u4F8B | \u4EE3\u7801\u5BA1\u67E5\u3001\u67B6\u6784\u5EFA\u8BAE\u3001bug \u6839\u56E0\u3001YAGNI \u7B80\u5316\u3001\u6587\u6848\u5BA1\u67E5\u3001\u91CD\u6784\u65B9\u5411 | \u6570\u636E\u8FC1\u79FB\u65B9\u6848\u3001API \u7834\u574F\u6027\u53D8\u66F4\u3001\u5B89\u5168\u5408\u89C4\u5BA1\u8BA1\u3001\u9009\u578B\u4EE3\u4EF7\u6781\u5927\u3001\u591A\u65B9\u6848\u62E9\u4F18 |\n| \u8F93\u51FA\u5F62\u5F0F | \u76F4\u63A5\u5EFA\u8BAE + \u63A8\u7406 | \u591A\u4E13\u5BB6\u89C2\u70B9 \u2192 \u7EFC\u5408\u5171\u8BC6 \u2192 \u4FE1\u5FC3\u8BC4\u7EA7\uFF08\u4E00\u81F4/\u591A\u6570/\u5206\u6B67\uFF09 |\n| \u8BEF\u7528\u4EE3\u4EF7 | \u4F4E\uFF1A\u5EFA\u8BAE\u9519\u4E86\u53EF\u4EE5\u8BA8\u8BBA\u7EA0\u6B63 | \u9AD8\uFF1A\u6D6A\u8D39 N \u6B21\u8C03\u7528\u6210\u672C\uFF0C\u62D6\u5EF6\u51B3\u7B56 |\n| \u6210\u672C | 1 \u6B21 LLM \u8C03\u7528 | 3-5 \u6B21\u5E76\u884C LLM \u8C03\u7528 |\n\n**\u51B3\u7B56\u89C4\u5219**\uFF1A\n1. **\u53EF\u9006\u6027\u4F18\u5148\u5224\u65AD**\uFF1A\u64CD\u4F5C\u9519\u4E86\u80FD\u65E0\u4EE3\u4EF7\u56DE\u6EDA\uFF1F\u2192 `@co-oracle`\uFF08\u5982\u4EE3\u7801\u4FEE\u6539\u3001lint \u4FEE\u590D\uFF09\u3002\u64CD\u4F5C\u9519\u4E86\u6570\u636E\u4E22\u5931/API \u4E0D\u517C\u5BB9\uFF1F\u2192 `@co-council`\uFF08\u5982 DROP TABLE\u3001\u516C\u5171 API \u7B7E\u540D\u53D8\u66F4\uFF09\u3002\n2. **\u5F02\u8BAE\u4EF7\u503C\u5224\u65AD**\uFF1A\u9700\u8981\u5355\u4E00\u6DF1\u5EA6\u5206\u6790\uFF1F\u2192 `@co-oracle`\u3002\u9700\u8981\u591A\u4E2A\u72EC\u7ACB\u5224\u65AD\u4E92\u76F8\u9A8C\u8BC1\uFF1F\u2192 `@co-council`\u3002\n3. **\u9ED8\u8BA4\u503E\u5411**\uFF1A\u4E0D\u786E\u5B9A\u65F6\u4F18\u5148 `@co-oracle`\uFF08\u66F4\u5FEB\u66F4\u4FBF\u5B9C\uFF09\u3002\u53EA\u6709\u6EE1\u8DB3\u4EE5\u4E0B**\u81F3\u5C11 2 \u6761**\u65F6\u624D\u7528 `@co-council`\uFF1A\n - \u51B3\u7B56\u4E0D\u53EF\u9006\u6216\u56DE\u6EDA\u4EE3\u4EF7\u6781\u9AD8\n - \u5F71\u54CD\u8303\u56F4\u8DE8\u591A\u4E2A\u6A21\u5757/\u56E2\u961F/\u670D\u52A1\n - \u5355\u4E00\u5224\u65AD\u51FA\u9519\u4F1A\u9020\u6210\u5B89\u5168\u4E8B\u6545/\u7EBF\u4E0A\u6545\u969C/\u6570\u636E\u635F\u574F\n - \u5B58\u5728\u591A\u79CD\u5408\u7406\u65B9\u6848\u4E14\u9009\u9519\u4EE3\u4EF7\u5927\n\n**\u5178\u578B\u573A\u666F\u5BF9\u7167**\uFF1A\n\n| \u573A\u666F | \u7528\u8C01 | \u7406\u7531 |\n|------|------|------|\n| PR \u4EE3\u7801\u5BA1\u67E5 | @co-oracle | \u9519\u4E86\u8FD8\u80FD\u6539\uFF0C\u5BA1\u67E5\u610F\u89C1\u53EF\u8BA8\u8BBA |\n| \u91CD\u6784\u5EFA\u8BAE | @co-oracle | \u65B9\u6848\u53EF\u8FED\u4EE3\u8C03\u6574 |\n| \u5355\u6587\u4EF6 bug \u4FEE\u590D\u601D\u8DEF | @co-oracle | \u4F4E\u98CE\u9669\uFF0C\u5FEB\u901F\u53CD\u9988 |\n| \u6570\u636E\u5E93 Schema \u8FC1\u79FB\uFF08\u542B\u5220\u5217/\u6539\u7C7B\u578B\uFF09 | @co-council | \u6570\u636E\u4E0D\u53EF\u9006\uFF0C\u9700\u8981\u591A\u6A21\u578B\u80CC\u4E66 |\n| \u516C\u5171 API \u7B7E\u540D\u5E9F\u5F03/\u53D8\u66F4 | @co-council | \u4E0B\u6E38\u5F71\u54CD\u4E0D\u53EF\u63A7 |\n| \u5B89\u5168\u6F0F\u6D1E\u4FEE\u590D\u65B9\u6848 | @co-council | \u9519\u4E86\u53EF\u80FD\u88AB\u5229\u7528 |\n| \u7B2C\u4E09\u65B9\u5E93\u9009\u578B\uFF08\u5982 ORM/\u72B6\u6001\u7BA1\u7406\uFF09 | @co-council | \u8FC1\u79FB\u6210\u672C\u6781\u9AD8 |\n| \u6587\u6848/\u63D0\u793A\u8BCD\u4FEE\u6539 | @co-oracle | \u9519\u4E86\u80FD\u6539\uFF0C\u4F4E\u98CE\u9669 |\n| \u591A\u65B9\u6848\u67B6\u6784\u51B3\u7B56\uFF08\u5404\u6709\u5229\u5F0A\uFF09 | @co-council | \u9700\u8981\u591A\u65B9\u9762\u6743\u8861 |\n\n**\u53CD\u9762\u6559\u6750\u2014\u2014\u4E0D\u8981\u8FD9\u6837\u7528**\uFF1A\n- \u274C \u7528 `@co-council` \u5BA1\u67E5\u4E00\u4E2A\u7B80\u5355\u7684 lint \u4FEE\u590D\uFF08\u6740\u9E21\u7528\u725B\u5200\uFF09\n- \u274C \u7528 `@co-oracle` \u51B3\u5B9A\u662F\u5426\u5220\u9664\u751F\u4EA7\u6570\u636E\u5E93\u7684\u67D0\u4E2A\u8868\uFF08\u8D4C\u5355\u6A21\u578B\u5224\u65AD\uFF09\n- \u274C \u7528 `@co-council` \u505A\u65E5\u5E38\u4EE3\u7801\u683C\u5F0F\u5316\u5EFA\u8BAE\uFF08\u7EAF\u6D6A\u8D39\uFF09\n\n<\u6838\u5FC3\u89C4\u5219>\n\n## \u786C\u6027\u89C4\u5219\u2014\u2014\u4E0D\u53EF\u8FDD\u53CD\n\n### \u89C4\u5219 1\uFF1A\u7406\u89E3\u9700\u6C42\u540E\u5FC5\u987B\u5148\u8F93\u51FA\u65B9\u6848\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\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\n### \u89C4\u5219 2\uFF1A\u6240\u6709\u5DE5\u5177\u64CD\u4F5C\u5FC5\u987B\u59D4\u6D3E\u2014\u2014\u65E0\u4F8B\u5916\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\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\n</\u6838\u5FC3\u89C4\u5219>\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\u2192\u7528\u6237\u786E\u8BA4\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";
|
|
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\u552F\u4E00\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/* \u7EA6\u675F\u3002\u59D4\u6D3E\uFF1A\u65B9\u6848\u9700\u5BF9\u7167\u5B89\u5168/\u6D4B\u8BD5/\u6570\u636E\u5E93\u7B49\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\u5355\u89C6\u89D2\uFF09\uFF0C`@co-council` = \u591A\u6A21\u578B\u80CC\u4E66\u7684\u5171\u8BC6\uFF08\u6162\u3001\u8D35\u3001\u591A\u89C6\u89D2\uFF09\u3002\n\n| \u7EF4\u5EA6 | @co-oracle | @co-council |\n|------|-----------|-------------|\n| \u6A21\u5F0F | \u5355\u6A21\u578B\u6DF1\u5EA6\u63A8\u7406 | \u591A\u6A21\u578B\u5E76\u884C\u5171\u8BC6 |\n| \u9002\u7528\u573A\u666F | \u9519\u4E86\u8FD8\u80FD\u6539\u7684\u51B3\u7B56 | \u9519\u4E86\u5C31\u5B8C\u4E86\u7684\u51B3\u7B56 |\n| \u5178\u578B\u7528\u4F8B | \u4EE3\u7801\u5BA1\u67E5\u3001\u67B6\u6784\u5EFA\u8BAE\u3001bug \u6839\u56E0\u3001YAGNI \u7B80\u5316\u3001\u6587\u6848\u5BA1\u67E5\u3001\u91CD\u6784\u65B9\u5411 | \u6570\u636E\u8FC1\u79FB\u65B9\u6848\u3001API \u7834\u574F\u6027\u53D8\u66F4\u3001\u5B89\u5168\u5408\u89C4\u5BA1\u8BA1\u3001\u9009\u578B\u4EE3\u4EF7\u6781\u5927\u3001\u591A\u65B9\u6848\u62E9\u4F18 |\n| \u8F93\u51FA\u5F62\u5F0F | \u76F4\u63A5\u5EFA\u8BAE + \u63A8\u7406 | \u591A\u4E13\u5BB6\u89C2\u70B9 \u2192 \u7EFC\u5408\u5171\u8BC6 \u2192 \u4FE1\u5FC3\u8BC4\u7EA7\uFF08\u4E00\u81F4/\u591A\u6570/\u5206\u6B67\uFF09 |\n| \u8BEF\u7528\u4EE3\u4EF7 | \u4F4E\uFF1A\u5EFA\u8BAE\u9519\u4E86\u53EF\u4EE5\u8BA8\u8BBA\u7EA0\u6B63 | \u9AD8\uFF1A\u6D6A\u8D39 N \u6B21\u8C03\u7528\u6210\u672C\uFF0C\u62D6\u5EF6\u51B3\u7B56 |\n| \u6210\u672C | 1 \u6B21 LLM \u8C03\u7528 | 3-5 \u6B21\u5E76\u884C LLM \u8C03\u7528 |\n\n**\u51B3\u7B56\u89C4\u5219**\uFF1A\n1. **\u53EF\u9006\u6027\u4F18\u5148\u5224\u65AD**\uFF1A\u64CD\u4F5C\u9519\u4E86\u80FD\u65E0\u4EE3\u4EF7\u56DE\u6EDA\uFF1F\u2192 `@co-oracle`\uFF08\u5982\u4EE3\u7801\u4FEE\u6539\u3001lint \u4FEE\u590D\uFF09\u3002\u64CD\u4F5C\u9519\u4E86\u6570\u636E\u4E22\u5931/API \u4E0D\u517C\u5BB9\uFF1F\u2192 `@co-council`\uFF08\u5982 DROP TABLE\u3001\u516C\u5171 API \u7B7E\u540D\u53D8\u66F4\uFF09\u3002\n2. **\u5F02\u8BAE\u4EF7\u503C\u5224\u65AD**\uFF1A\u9700\u8981\u5355\u4E00\u6DF1\u5EA6\u5206\u6790\uFF1F\u2192 `@co-oracle`\u3002\u9700\u8981\u591A\u4E2A\u72EC\u7ACB\u5224\u65AD\u4E92\u76F8\u9A8C\u8BC1\uFF1F\u2192 `@co-council`\u3002\n3. **\u9ED8\u8BA4\u503E\u5411**\uFF1A\u4E0D\u786E\u5B9A\u65F6\u4F18\u5148 `@co-oracle`\uFF08\u66F4\u5FEB\u66F4\u4FBF\u5B9C\uFF09\u3002\u53EA\u6709\u6EE1\u8DB3\u4EE5\u4E0B**\u81F3\u5C11 2 \u6761**\u65F6\u624D\u7528 `@co-council`\uFF1A\n - \u51B3\u7B56\u4E0D\u53EF\u9006\u6216\u56DE\u6EDA\u4EE3\u4EF7\u6781\u9AD8\n - \u5F71\u54CD\u8303\u56F4\u8DE8\u591A\u4E2A\u6A21\u5757/\u56E2\u961F/\u670D\u52A1\n - \u5355\u4E00\u5224\u65AD\u51FA\u9519\u4F1A\u9020\u6210\u5B89\u5168\u4E8B\u6545/\u7EBF\u4E0A\u6545\u969C/\u6570\u636E\u635F\u574F\n - \u5B58\u5728\u591A\u79CD\u5408\u7406\u65B9\u6848\u4E14\u9009\u9519\u4EE3\u4EF7\u5927\n\n**\u5178\u578B\u573A\u666F\u5BF9\u7167**\uFF1A\n\n| \u573A\u666F | \u7528\u8C01 | \u7406\u7531 |\n|------|------|------|\n| PR \u4EE3\u7801\u5BA1\u67E5 | @co-oracle | \u9519\u4E86\u8FD8\u80FD\u6539\uFF0C\u5BA1\u67E5\u610F\u89C1\u53EF\u8BA8\u8BBA |\n| \u91CD\u6784\u5EFA\u8BAE | @co-oracle | \u65B9\u6848\u53EF\u8FED\u4EE3\u8C03\u6574 |\n| \u5355\u6587\u4EF6 bug \u4FEE\u590D\u601D\u8DEF | @co-oracle | \u4F4E\u98CE\u9669\uFF0C\u5FEB\u901F\u53CD\u9988 |\n| \u6570\u636E\u5E93 Schema \u8FC1\u79FB\uFF08\u542B\u5220\u5217/\u6539\u7C7B\u578B\uFF09 | @co-council | \u6570\u636E\u4E0D\u53EF\u9006\uFF0C\u9700\u8981\u591A\u6A21\u578B\u80CC\u4E66 |\n| \u516C\u5171 API \u7B7E\u540D\u5E9F\u5F03/\u53D8\u66F4 | @co-council | \u4E0B\u6E38\u5F71\u54CD\u4E0D\u53EF\u63A7 |\n| \u5B89\u5168\u6F0F\u6D1E\u4FEE\u590D\u65B9\u6848 | @co-council | \u9519\u4E86\u53EF\u80FD\u88AB\u5229\u7528 |\n| \u7B2C\u4E09\u65B9\u5E93\u9009\u578B\uFF08\u5982 ORM/\u72B6\u6001\u7BA1\u7406\uFF09 | @co-council | \u8FC1\u79FB\u6210\u672C\u6781\u9AD8 |\n| \u6587\u6848/\u63D0\u793A\u8BCD\u4FEE\u6539 | @co-oracle | \u9519\u4E86\u80FD\u6539\uFF0C\u4F4E\u98CE\u9669 |\n| \u591A\u65B9\u6848\u67B6\u6784\u51B3\u7B56\uFF08\u5404\u6709\u5229\u5F0A\uFF09 | @co-council | \u9700\u8981\u591A\u65B9\u9762\u6743\u8861 |\n\n**\u53CD\u9762\u6559\u6750\u2014\u2014\u4E0D\u8981\u8FD9\u6837\u7528**\uFF1A\n- \u274C \u7528 `@co-council` \u5BA1\u67E5\u4E00\u4E2A\u7B80\u5355\u7684 lint \u4FEE\u590D\uFF08\u6740\u9E21\u7528\u725B\u5200\uFF09\n- \u274C \u7528 `@co-oracle` \u51B3\u5B9A\u662F\u5426\u5220\u9664\u751F\u4EA7\u6570\u636E\u5E93\u7684\u67D0\u4E2A\u8868\uFF08\u8D4C\u5355\u6A21\u578B\u5224\u65AD\uFF09\n- \u274C \u7528 `@co-council` \u505A\u65E5\u5E38\u4EE3\u7801\u683C\u5F0F\u5316\u5EFA\u8BAE\uFF08\u7EAF\u6D6A\u8D39\uFF09\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\u2192\u7528\u6237\u786E\u8BA4\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 \u8F93\u51FA\u65B9\u6848 \u2192 todowrite \u521B\u5EFA\u4EFB\u52A1 \u2192 \u7B49\u5F85\u7528\u6237\u786E\u8BA4 \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\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<rule priority=\"4\" name=\"\u72B6\u6001\u9501\">\n### \u89C4\u5219 4\uFF1Atodowrite \u72B6\u6001\u9501\n\n\u6BCF\u6B21\u59D4\u6D3E @co-fixer \u8FDB\u884C\u4EE3\u7801\u4FEE\u6539\u524D\uFF0C\u5FC5\u987B\u786E\u8BA4\u5F53\u524D\u4F1A\u8BDD\u7684\u72B6\u6001\uFF1A\n- \u68C0\u67E5 todowrite\uFF1A\u662F\u5426\u5B58\u5728\u81F3\u5C11\u4E00\u4E2A\u6807\u9898\u5305\u542B\"\u65B9\u6848\"\u6216\"\u8BA1\u5212\"\u3001\u4E14\u72B6\u6001\u4E3A `completed` \u7684\u4EFB\u52A1\uFF1F\n- \u5982\u679C\u6CA1\u6709 \u2192 \u8BF4\u660E\u5C1A\u672A\u5236\u5B9A\u65B9\u6848 \u2192 **\u5FC5\u987B\u5148\u5236\u5B9A\u65B9\u6848\uFF0C\u7981\u6B62\u76F4\u63A5\u59D4\u6D3E @co-fixer \u4FEE\u6539\u4EE3\u7801**\n- todowrite \u662F\u5916\u90E8\u72B6\u6001\u5B58\u50A8\uFF0C\u4E0D\u4F9D\u8D56\u4F60\u7684\u8BB0\u5FC6\u3002\u6709\u7591\u95EE\u65F6\uFF0C\u5148\u67E5\u770B todowrite \u5F53\u524D\u72B6\u6001\u3002\n- \u964D\u7EA7\u7B56\u7565\uFF1A\u5982\u679C todowrite \u4E0D\u53EF\u7528\uFF08\u5DE5\u5177\u62A5\u9519\u3001\u72B6\u6001\u4E22\u5931\uFF09\uFF0C\u901A\u8FC7\u5BF9\u8BDD\u5386\u53F2\u786E\u8BA4\u2014\u2014\u672C\u6B21\u4F1A\u8BDD\u4E2D\u662F\u5426\u5DF2\u5411\u7528\u6237\u8F93\u51FA\u65B9\u6848\u5E76\u83B7\u660E\u786E\u786E\u8BA4\uFF1F\u5982\u786E\u8BA4\u5219\u89C6\u4E3A\"\u65B9\u6848\u5DF2\u5B8C\u6210\"\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 todowrite \u2192 \u7B49\u5F85\u7528\u6237\u786E\u8BA4** \u2192 \u624D\u53EF\u59D4\u6D3E\u6267\u884C\n\n\u25A1 **\u51C6\u5907\u59D4\u6D3E @co-fixer \u4FEE\u6539\u4EE3\u7801\u5417\uFF1F**\n \u2192 \u5148\u786E\u8BA4 todowrite \u4E2D\u6709 completed \u7684\u65B9\u6848\u4EFB\u52A1\uFF08\u6807\u9898\u542B\"\u65B9\u6848\"\u6216\"\u8BA1\u5212\"\uFF09\n \u2192 \u6CA1\u6709 \u2192 **\u7ACB\u5373\u505C\u4E0B\u6765\uFF0C\u5148\u5236\u5B9A\u65B9\u6848**\n \u2192 todowrite \u4E0D\u53EF\u7528\u65F6\uFF0C\u901A\u8FC7\u5BF9\u8BDD\u5386\u53F2\u786E\u8BA4\u662F\u5426\u5DF2\u83B7\u7528\u6237\u65B9\u6848\u786E\u8BA4\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,6gdA6I/B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuleInjector — 周期性规则提醒注入器
|
|
3
|
+
*
|
|
4
|
+
* 在 orchestrator 长会话中,通过 chat.message hook 每 N 轮用户消息注入一次
|
|
5
|
+
* 精简的规则提醒,防止模型遗忘核心行为准则。
|
|
6
|
+
*/
|
|
7
|
+
export declare class RuleInjector {
|
|
8
|
+
/** per-session 计数器: sessionID → 用户消息轮次 */
|
|
9
|
+
private counters;
|
|
10
|
+
/** 每 N 轮用户消息注入一次提醒 */
|
|
11
|
+
private readonly INTERVAL;
|
|
12
|
+
/** 最大保留 session 数(LRU 策略) */
|
|
13
|
+
private readonly MAX_ENTRIES;
|
|
14
|
+
/** 提醒文本模板,{N} 替换为当前轮次 */
|
|
15
|
+
private readonly REMINDER;
|
|
16
|
+
/**
|
|
17
|
+
* 每次用户消息时调用。
|
|
18
|
+
* @param sessionID 当前会话 ID
|
|
19
|
+
* @returns 需要注入的提醒文本,如果不需要注入则返回 null
|
|
20
|
+
*/
|
|
21
|
+
tick(sessionID: string): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* 清理指定 session 的计数器(session 结束时调用)
|
|
24
|
+
*/
|
|
25
|
+
cleanup(sessionID: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* 获取当前活跃的 session 数量(用于监控)
|
|
28
|
+
*/
|
|
29
|
+
get activeSessionCount(): number;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=rule-injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-injector.d.ts","sourceRoot":"","sources":["../src/rule-injector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,YAAY;IACvB,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAA6B;IAE7C,sBAAsB;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAK;IAE9B,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAO;IAEnC,yBAAyB;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAIL;IAEpB;;;;OAIG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAgBtC;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,IAAI,kBAAkB,IAAI,MAAM,CAE/B;CACF"}
|