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.
@@ -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;AAE5C,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,CAwChB;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"}
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;
@@ -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;AAyClD,wBAAwB;AACxB,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAalD,CAAC;AAwEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,wrBAA+B,CAAC;AAEhE,QAAA,MAAM,WAAW,EAAE,MAuYlB,CAAC;AAEF,eAAO,MAAM,MAAM,QAAc,CAAC;AAClC,eAAe,WAAW,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
- ## 1. 理解需求
93
- 纯知识问答直接回,代码需求继续。
122
+ 每次委派 @co-fixer 进行代码修改前,必须确认当前会话的状态:
123
+ - 检查 todowrite:是否存在至少一个标题包含"方案"或"计划"、且状态为 \`completed\` 的任务?
124
+ - 如果没有 → 说明尚未制定方案 → **必须先制定方案,禁止直接委派 @co-fixer 修改代码**
125
+ - todowrite 是外部状态存储,不依赖你的记忆。有疑问时,先查看 todowrite 当前状态。
126
+ - 降级策略:如果 todowrite 不可用(工具报错、状态丢失),通过对话历史确认——本次会话中是否已向用户输出方案并获明确确认?如确认则视为"方案已完成"。
127
+ </rule>
94
128
 
95
- ## 2. 信息收集(委派子代理)
96
- @co-explorer 搜索定位 → @co-librarian 外部研究 → @co-observer 多媒体。并行启动,不动手。
129
+ </critical_rules>
97
130
 
98
- ## 3. 制定方案
99
- 综合信息→子任务分解→委派对象→并行策略→todowrite 记录→用户确认。
131
+ <自检清单>
132
+ **每次回复用户或调用工具前,必须在思考中逐条确认(这是硬性要求,不可跳过):**
100
133
 
101
- ## 4. 调度执行
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 = resolveStrategy(subagentType, contextEngine.getStrategy(subagentType) !== undefined ? { [subagentType]: contextEngine.getStrategy(subagentType) } : contextConfig.strategy ?? {}, typeof args.context_override === "string" ? args.context_override : undefined);
1741
+ const strategy = typeof args.context_override === "string" ? args.context_override : contextEngine.getStrategy(subagentType);
1591
1742
  if (strategy !== "none") {
1592
- console.error("[CONTEXT-DEBUG] before hook: strategy=", strategy, "agent=", subagentType);
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
- output.args.description = description + contextEngine.formatMarker(contextId);
1599
- console.error("[CONTEXT-DEBUG] before hook: marker appended, contextId=", contextId);
1600
- console.error("[CONTEXT-DEBUG] before hook: description preview=", output.args.description.slice(-80));
1601
- contextEngine.fillContextAsync(contextId, input2.sessionID, {
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
- }).catch(() => {});
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" || e.type === "session.error") {
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
- "experimental.chat.messages.transform": async (_input, output) => {
1818
+ "chat.message": async (input2, output) => {
1645
1819
  try {
1646
- if (output.messages && Array.isArray(output.messages)) {
1647
- const userMsgs = output.messages.filter((m) => m.info?.role === "user");
1648
- console.error("[CONTEXT-DEBUG] transform: total messages=", output.messages.length, "user messages=", userMsgs.length);
1649
- for (const msg of output.messages) {
1650
- if (msg.info.role !== "user")
1651
- continue;
1652
- for (const part of msg.parts ?? []) {
1653
- if (part.type !== "text" || !part.text)
1654
- continue;
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,0nWA2G/B,CAAC"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode-cohub",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/Mr-cjf/oh-my-opencode-cohub.git"