openmatrix 0.1.66 → 0.1.68

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.
@@ -68,9 +68,7 @@ export declare class AgentRunner {
68
68
  */
69
69
  buildExecutionPrompt(task: Task): Promise<string>;
70
70
  /**
71
- * 构建累积上下文 - 从已完成任务中提取共享信息
72
- *
73
- * 读取所有已完成任务的 context.md,为当前 Agent 提供前序 Agent 的决策和知识
71
+ * 构建累积上下文 - 从全局 context.md 读取前序 Agent 的决策和知识
74
72
  */
75
73
  private buildAccumulatedContext;
76
74
  /**
@@ -168,43 +168,22 @@ ${agentPrompt.instructions}
168
168
 
169
169
  1. 完成任务后,更新任务状态文件: \`.openmatrix/tasks/${task.id}/task.json\`
170
170
  2. 将执行结果写入: \`.openmatrix/tasks/${task.id}/artifacts/result.md\`
171
- 3. 将上下文摘要写入: \`.openmatrix/tasks/${task.id}/context.md\` (供后续 Agent 读取)
172
- 4. 如需审批,创建审批请求: \`.openmatrix/approvals/\` 目录
171
+ 3. 如需审批,创建审批请求: \`.openmatrix/approvals/\` 目录
172
+
173
+ 注意: 任务完成后,由 Skill 调用 \`openmatrix complete\` 并传入 --summary 参数,
174
+ 该摘要会自动追加到全局 \`.openmatrix/context.md\` 供后续 Agent 参考。
173
175
  `;
174
176
  }
175
177
  /**
176
- * 构建累积上下文 - 从已完成任务中提取共享信息
177
- *
178
- * 读取所有已完成任务的 context.md,为当前 Agent 提供前序 Agent 的决策和知识
178
+ * 构建累积上下文 - 从全局 context.md 读取前序 Agent 的决策和知识
179
179
  */
180
180
  async buildAccumulatedContext(currentTask) {
181
181
  const omPath = path.join(process.cwd(), '.openmatrix');
182
- const tasksDir = path.join(omPath, 'tasks');
182
+ const contextFile = path.join(omPath, 'context.md');
183
183
  try {
184
- // 异步检查目录是否存在
185
- try {
186
- await fs.access(tasksDir);
187
- }
188
- catch {
189
- return '';
190
- }
191
- const contextParts = [];
192
- // 异步读取目录
193
- const taskDirs = (await fs.readdir(tasksDir)).filter(name => name.startsWith('TASK-'));
194
- for (const taskId of taskDirs) {
195
- const contextFile = path.join(tasksDir, taskId, 'context.md');
196
- try {
197
- const content = await fs.readFile(contextFile, 'utf-8');
198
- const trimmed = content.trim();
199
- if (trimmed) {
200
- contextParts.push(`### ${taskId}\n${trimmed}`);
201
- }
202
- }
203
- catch {
204
- // 文件不存在或读取失败,跳过
205
- }
206
- }
207
- if (contextParts.length === 0)
184
+ const content = await fs.readFile(contextFile, 'utf-8');
185
+ const trimmed = content.trim();
186
+ if (!trimmed)
208
187
  return '';
209
188
  return `
210
189
  ## 前序 Agent 共享上下文 (Agent Memory)
@@ -212,7 +191,7 @@ ${agentPrompt.instructions}
212
191
  以下是之前执行的 Agent 留下的上下文信息,包含它们的决策、发现和注意事项。
213
192
  你应该基于这些信息来工作,避免重复犯错或与已有决策冲突。
214
193
 
215
- ${contextParts.join('\n\n')}
194
+ ${trimmed}
216
195
  `;
217
196
  }
218
197
  catch {
@@ -46,6 +46,7 @@ exports.completeCommand = new commander_1.Command('complete')
46
46
  .option('--success', '标记为成功完成 (默认)', true)
47
47
  .option('--failed', '标记为失败')
48
48
  .option('--output <text>', '执行结果摘要')
49
+ .option('--summary <text>', 'Agent 执行摘要 (写入 context.md)')
49
50
  .option('--error <text>', '错误信息 (失败时)')
50
51
  .action(async (taskId, options) => {
51
52
  const basePath = process.cwd();
@@ -101,27 +102,27 @@ exports.completeCommand = new commander_1.Command('complete')
101
102
  currentPhase: allDone ? 'completed' : 'execution',
102
103
  ...(allDone ? { completedAt: now } : {})
103
104
  });
104
- // 5. 写入 context.md (Agent Memory)
105
+ // 5. 追加写入全局 context.md (Agent Memory)
105
106
  if (isSuccess) {
106
- const taskDir = path.join(omPath, 'tasks', taskId);
107
- const contextFile = path.join(taskDir, 'context.md');
108
- try {
109
- await fs.mkdir(taskDir, { recursive: true });
110
- const contextContent = `## 任务:${task.id} ${task.title}
111
-
112
- ### 关键决策
113
- - [待补充]
114
-
115
- ### 创建/修改的文件
116
- - [待补充]
117
-
118
- ### 重要发现
119
- - [待补充]
107
+ const contextFile = path.join(omPath, 'context.md');
108
+ const timestamp = new Date().toISOString();
109
+ // 构建上下文内容
110
+ const summary = options.summary || '任务已完成';
111
+ const contextEntry = `## ${taskId} ${task.title}
112
+ - 时间: ${timestamp}
113
+ - 摘要: ${summary}
120
114
 
121
- ### 对后续任务的建议
122
- - [待补充]
123
115
  `;
124
- await fs.writeFile(contextFile, contextContent, 'utf-8');
116
+ try {
117
+ // 追加写入全局 context.md
118
+ let existingContent = '';
119
+ try {
120
+ existingContent = await fs.readFile(contextFile, 'utf-8');
121
+ }
122
+ catch {
123
+ // 文件不存在,创建新文件
124
+ }
125
+ await fs.writeFile(contextFile, existingContent + contextEntry, 'utf-8');
125
126
  }
126
127
  catch {
127
128
  // 忽略写入错误
package/dist/cli/index.js CHANGED
@@ -1,7 +1,42 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
3
36
  Object.defineProperty(exports, "__esModule", { value: true });
4
37
  const commander_1 = require("commander");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
5
40
  const status_js_1 = require("./commands/status.js");
6
41
  const start_js_1 = require("./commands/start.js");
7
42
  const approve_js_1 = require("./commands/approve.js");
@@ -18,11 +53,21 @@ const brainstorm_js_1 = require("./commands/brainstorm.js");
18
53
  const research_js_1 = require("./commands/research.js");
19
54
  const complete_js_1 = require("./commands/complete.js");
20
55
  const step_js_1 = require("./commands/step.js");
56
+ // 读取 package.json 版本
57
+ let version = '0.0.0';
58
+ try {
59
+ const packageJsonPath = path.join(__dirname, '..', '..', 'package.json');
60
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
61
+ version = packageJson.version;
62
+ }
63
+ catch {
64
+ // 忽略错误
65
+ }
21
66
  const program = new commander_1.Command();
22
67
  program
23
68
  .name('openmatrix')
24
69
  .description('AI Agent Task Orchestration System - 多 Agent 任务编排系统')
25
- .version('0.1.0');
70
+ .version(version);
26
71
  // 添加命令
27
72
  program.addCommand(status_js_1.statusCommand);
28
73
  program.addCommand(start_js_1.startCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmatrix",
3
- "version": "0.1.66",
3
+ "version": "0.1.68",
4
4
  "description": "AI Agent task orchestration system with Claude Code Skills integration",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/skills/start.md CHANGED
@@ -13,9 +13,9 @@ description: 启动新的任务执行周期
13
13
  ```
14
14
  Step 1: 初始化 .openmatrix 目录
15
15
  Step 2: 解析任务输入(文件或描述)
16
- Step 3: 智能分析,动态决定是否需要交互问答
17
- Step 4: 如需问答 → AskUserQuestion(可跳过简单任务)
18
- Step 5: 展示执行计划 + 确认执行模式
16
+ Step 3: 智能分析任务类型
17
+ Step 4: 必选问题(质量等级、E2E、执行模式)← 不可跳过
18
+ Step 5: 可选问题(仅复杂任务)+ 展示执行计划
19
19
  Step 6: AI 提取 goals,生成 plan
20
20
  Step 7: 写入 .openmatrix/tasks-input.json ← 必须完成
21
21
  Step 8: 调用 openmatrix start --tasks-json ← 必须完成,不可跳过
@@ -26,13 +26,19 @@ Step 10: 逐个执行 subagentTasks(调用 Agent 工具) ← 只有这步
26
26
  **违反以下任一规则将导致任务执行失败:**
27
27
 
28
28
  ❌ **禁止在 Step 8 之前写任何业务代码** — 所有代码必须在 Step 10 通过 Agent 执行
29
+ ❌ **禁止跳过 Step 4 必选问题** — 质量等级、执行模式必须由用户选择
29
30
  ❌ **禁止跳过 Step 8** — 必须调用 CLI,不能用其他方式代替
30
31
  ❌ **禁止自行规划 Phase** — 任务由 CLI 的 TaskPlanner 拆分,AI 只提取 goals
31
32
  ❌ **禁止用 Bash/npm/write 直接写业务代码** — 业务代码只能通过 Step 10 的 Agent 执行
32
33
  </MANDATORY-EXECUTION-ORDER>
33
34
 
34
35
  <objective>
35
- 解析任务文档,智能推断配置,仅对不确定的问题交互问答,确认后通过 CLI 拆分任务并执行。
36
+ 解析任务文档,通过必选问答确定质量等级、E2E测试、执行模式,确认后通过 CLI 拆分任务并执行。
37
+
38
+ ⚠️ **Step 4 必选问题不可跳过** — 必须让用户选择:
39
+ 1. 质量等级 (strict/balanced/fast)
40
+ 2. E2E 测试 (当选择 strict/balanced 时必问)
41
+ 3. 执行模式 (全自动/关键节点确认/每阶段确认)
36
42
  </objective>
37
43
 
38
44
  <process>
@@ -71,38 +77,72 @@ openmatrix start --init-only
71
77
 
72
78
  ### Step 3: 智能分析
73
79
 
74
- 根据任务内容判断是否需要交互问答:
80
+ 根据任务内容判断是否需要额外问题(质量等级、执行模式、E2E 始终必选):
75
81
 
76
- | 任务类型 | 跳过问题 | 默认配置 |
82
+ | 任务类型 | 额外问题 | 默认配置 |
77
83
  |---------|---------|---------|
78
- | Bug 修复 / 小改动 | 跳过所有 | fast + 最小文档 |
79
- | 新功能开发 | 正常询问 | balanced |
80
- | 重构 | 跳过 E2E | balanced |
81
- | 测试编写 | 跳过文档 | 无需文档 |
84
+ | Bug 修复 / 小改动 | 跳过复杂度问题 | fast |
85
+ | 新功能开发 | 询问技术栈等 | balanced |
86
+ | 重构 | 跳过 E2E 相关 | balanced |
87
+ | 测试编写 | 跳过文档相关 | 无需文档 |
88
+
89
+ ### Step 4: 必选问题(所有任务都必须回答)
90
+
91
+ **⚠️ 以下问题为必选,不可跳过:**
92
+
93
+ #### 4.1 质量等级(必选)
94
+
95
+ ```typescript
96
+ AskUserQuestion({
97
+ questions: [
98
+ {
99
+ question: "选择质量等级(决定测试覆盖、Lint、安全扫描等要求):",
100
+ header: "质量等级",
101
+ options: [
102
+ { label: "strict", description: "TDD + >80%覆盖率 + 严格Lint + 安全扫描 — 生产级代码" },
103
+ { label: "balanced (推荐)", description: ">60%覆盖率 + Lint + 安全扫描 — 日常开发" },
104
+ { label: "fast", description: "无质量门禁 — 快速原型/验证" }
105
+ ],
106
+ multiSelect: false
107
+ }
108
+ ]
109
+ })
110
+ ```
82
111
 
83
- ### Step 4: 交互问答(仅对复杂任务)
112
+ #### 4.2 E2E 测试(当质量等级为 strict 或 balanced 时必选)
84
113
 
85
- 如果需要确认配置,使用 AskUserQuestion 一次询问多个问题:
114
+ 如果用户选择了 `strict` 或 `balanced`,继续询问:
86
115
 
87
116
  ```typescript
88
117
  AskUserQuestion({
89
118
  questions: [
90
119
  {
91
- question: "选择质量级别:",
92
- header: "质量",
120
+ question: "是否启用端到端 (E2E) 测试?(适用于 Web/Mobile/GUI 项目,耗时较长)",
121
+ header: "E2E 测试",
93
122
  options: [
94
- { label: "strict", description: "TDD + >80%覆盖率 + Lint + 安全扫描" },
95
- { label: "balanced", description: ">60%覆盖率 + Lint + 安全扫描" },
96
- { label: "fast", description: "无质量门禁" }
123
+ { label: "启用 E2E 测试", description: "使用 Playwright/Cypress 等框架进行端到端测试" },
124
+ { label: "不启用 (推荐)", description: "仅进行单元测试和集成测试,节省时间" }
97
125
  ],
98
126
  multiSelect: false
99
- },
127
+ }
128
+ ]
129
+ })
130
+ ```
131
+
132
+ **注意:** 如果用户选择 `fast` 质量等级,跳过 E2E 问题(fast 模式不启用 E2E)。
133
+
134
+ #### 4.3 执行模式(必选)
135
+
136
+ ```typescript
137
+ AskUserQuestion({
138
+ questions: [
100
139
  {
101
- question: "是否启用 E2E 测试? (Web/Mobile/GUI 项目推荐)",
102
- header: "E2E",
140
+ question: "选择执行模式(控制 AI 执行过程中的审批节点):",
141
+ header: "执行模式",
103
142
  options: [
104
- { label: "跳过 (推荐)", description: "E2E 测试耗时较长,大多数项目不需要" },
105
- { label: "启用", description: "适合 Web 应用 (Playwright/Cypress)、Mobile (Appium/Detox)" }
143
+ { label: "全自动执行 (推荐)", description: "全自动执行,无需人工审批,遇到阻塞自动 Meeting" },
144
+ { label: "关键节点确认", description: "plan/merge/deploy 时暂停确认" },
145
+ { label: "每阶段确认", description: "每个阶段(develop/verify/accept)完成后暂停" }
106
146
  ],
107
147
  multiSelect: false
108
148
  }
@@ -110,7 +150,14 @@ AskUserQuestion({
110
150
  })
111
151
  ```
112
152
 
113
- ### Step 5: 展示计划 + 确认模式
153
+ ### Step 5: 可选问题(仅复杂任务)
154
+
155
+ 根据任务类型,可能需要额外询问:
156
+
157
+ - 技术栈偏好
158
+ - 文档级别
159
+ - 风险评估
160
+ - 验收标准
114
161
 
115
162
  展示 AI 生成的执行计划:
116
163
 
@@ -121,27 +168,9 @@ AskUserQuestion({
121
168
  📊 统计
122
169
  Goals: N 个(将生成 N个开发 + N个测试 + 审查)
123
170
  质量级别: xxx
171
+ E2E 测试: 启用/不启用
124
172
  ```
125
173
 
126
- 使用 AskUserQuestion 确认执行模式:
127
-
128
- ```typescript
129
- AskUserQuestion({
130
- questions: [{
131
- question: "请选择执行模式:",
132
- header: "执行模式",
133
- options: [
134
- { label: "全自动执行 (推荐)", description: "无需确认,自动完成,阻塞任务 (Meeting) 留到最后统一处理" },
135
- { label: "关键节点确认", description: "plan/merge 时暂停确认" },
136
- { label: "每阶段确认", description: "每个阶段完成后暂停" }
137
- ],
138
- multiSelect: false
139
- ]
140
- })
141
- ```
142
-
143
- **默认进入 BYPASS 模式(全自动执行),用户可选其他模式。**
144
-
145
174
  ### Step 6: AI 提取 goals + 生成 plan
146
175
 
147
176
  从任务描述中提取:
@@ -203,7 +232,8 @@ CLI 返回 JSON 中 `subagentTasks` 数组包含待执行任务。
203
232
  **文件持久化循环(防止上下文压缩丢失状态):**
204
233
  ```bash
205
234
  # 每个 Agent 完成后执行:
206
- openmatrix complete TASK-XXX --success # 标记完成 + 更新统计(含自动 git commit)
235
+ # --summary 传入执行摘要,自动追加到全局 context.md
236
+ openmatrix complete TASK-XXX --success --summary "决策: xxx; 文件: xxx"
207
237
 
208
238
  # 提交验证(防止 commit 静默失败):
209
239
  git status --porcelain # 检查是否有未提交的文件
@@ -229,26 +259,15 @@ Agent({
229
259
  每个 Agent 完成后:
230
260
  1. **标记完成并更新统计(必须执行):**
231
261
  ```bash
232
- openmatrix complete TASK-XXX --success
262
+ # --summary 参数传入 Agent 执行摘要,自动追加到全局 context.md
263
+ openmatrix complete TASK-XXX --success --summary "关键决策: xxx; 创建文件: xxx"
233
264
  ```
234
- 2. **保存 Agent 上下文** — 将执行结果摘要写入 `.openmatrix/tasks/TASK-XXX/context.md`,格式如下:
235
265
 
236
- ```markdown
237
- ## 任务: TASK-XXX 任务标题
266
+ 2. **全局上下文文件** — 所有任务的上下文累积在 `.openmatrix/context.md`:
267
+ - 每次任务完成后,通过 `--summary` 参数追加写入
268
+ - 后续 Agent 可读取此文件了解前序任务的决策和发现
238
269
 
239
- ### 关键决策
240
- - [做出的重要决策]
241
-
242
- ### 创建/修改的文件
243
- - `path/to/file1.ts` - 简述用途
244
- - `path/to/file2.ts` - 简述用途
245
-
246
- ### 重要发现
247
- - [发现的问题、模式、注意事项]
248
-
249
- ### 对后续任务的建议
250
- - [下一个 Agent 应该注意什么]
251
- ```
270
+ 3. Git 自动提交(必须使用下方统一提交格式)
252
271
 
253
272
  3. Git 自动提交(必须使用下方统一提交格式)
254
273
  4. **获取下一个任务(防止上下文压缩丢失):**
@@ -260,6 +279,50 @@ openmatrix step --json
260
279
  如果返回 `status: "blocked"` → 有阻塞任务,处理 Meeting
261
280
  5. 检查审批点(auto 模式自动批准,其他模式按配置暂停)
262
281
 
282
+ 6. **审批点处理(根据执行模式):**
283
+
284
+ 根据用户选择的执行模式处理审批:
285
+
286
+ | 执行模式 | 审批点 | 处理方式 |
287
+ |---------|--------|---------|
288
+ | 全自动执行 | 无 | 自动批准所有操作 |
289
+ | 关键节点确认 | plan, merge, deploy | 到达审批点时暂停,交互式确认 |
290
+ | 每阶段确认 | develop, verify, accept | 每个阶段完成后暂停,交互式确认 |
291
+
292
+ **交互式审批流程(非全自动模式):**
293
+
294
+ 当到达审批点时,使用 `openmatrix approve --list` 查看待审批项,然后通过 AskUserQuestion 请求用户确认:
295
+
296
+ ```typescript
297
+ // 检查是否有待审批项
298
+ // 通过 CLI: openmatrix approve --list --json
299
+
300
+ AskUserQuestion({
301
+ questions: [
302
+ {
303
+ question: "审批请求: [审批类型]
304
+
305
+ [审批内容摘要]
306
+
307
+ 是否批准?",
308
+ header: "审批",
309
+ options: [
310
+ { label: "批准", description: "同意继续执行" },
311
+ { label: "拒绝", description: "拒绝并停止执行" },
312
+ { label: "查看详情", description: "查看完整审批内容后再决定" }
313
+ ],
314
+ multiSelect: false
315
+ }
316
+ ]
317
+ })
318
+ ```
319
+
320
+ 用户选择后,执行对应命令:
321
+ - 批准: `openmatrix approve <approval-id> --approve`
322
+ - 拒绝: `openmatrix approve <approval-id> --reject`
323
+ - 查看详情: 读取 `.openmatrix/approvals/<approval-id>.json` 并展示完整内容
324
+
325
+
263
326
  **Agent 上下文共享机制 (Agent Memory):**
264
327
 
265
328
  每个 Agent 执行时会自动接收前序 Agent 的上下文信息(通过 `context.md` 文件)。