openmatrix 0.1.58 → 0.1.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -76,7 +76,7 @@
76
76
  | 0 | 交互问答 | **第一个问题选质量级别** |
77
77
  | 1 | 任务规划 | Planner Agent 生成计划 |
78
78
  | 2 | 任务执行 | strict/balanced/fast 三种模式 |
79
- | 3 | 质量门禁 | 6 道质量门禁验证 |
79
+ | 3 | 质量门禁 | 7 道质量门禁验证 |
80
80
  | 4 | AI 验收 | Reviewer Agent 最终确认 |
81
81
  | 5 | Meeting | 阻塞不中断,最后处理并**重新执行** |
82
82
  | 6 | 最终报告 | 质量评分 + 产出文件 |
@@ -194,7 +194,7 @@ ls ~/.claude/commands/om/
194
194
  OpenMatrix TDD (strict):
195
195
  🧪 测试阶段: 先写测试 (RED - 测试必须失败)
196
196
  ✨ 开发阶段: 再写代码 (GREEN - 测试必须通过)
197
- ✅ 验证阶段: 6道质量门禁
197
+ ✅ 验证阶段: 7道质量门禁
198
198
  🎉 验收阶段: AI Reviewer 最终确认
199
199
 
200
200
  结果: 第一次就写对,无需返工
@@ -231,7 +231,7 @@ Accept 阶段由 Reviewer Agent 执行:
231
231
  ```
232
232
  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
233
233
  │ TDD │────▶│ Develop │────▶│ Verify │────▶│ Accept │
234
- │ 🧪 RED │ │ ✨ GREEN│ │ ✅ 6门禁│ │ 🎉 AI │
234
+ │ 🧪 RED │ │ ✨ GREEN│ │ ✅ 7门禁│ │ 🎉 AI │
235
235
  └─────────┘ └─────────┘ └─────────┘ └─────────┘
236
236
  ```
237
237
 
@@ -252,6 +252,7 @@ Accept 阶段由 Reviewer Agent 执行:
252
252
  |------|------|
253
253
  | `/om` | **默认入口** - 直接输入任务描述即可启动 |
254
254
  | `/om:brainstorm` | 🧠 **头脑风暴** - 先探索需求和设计,再执行任务 |
255
+ | `/om:research` | 📚 **领域调研** - AI 驱动的领域调研和问题探索 |
255
256
  | `/om:start` | 启动新任务 (第一个问题选质量级别) |
256
257
  | `/om:auto` | 🚀 **全自动执行** - 无阻塞、无确认、直接完成 |
257
258
  | `/check` | 🔍 **项目检查** - 自动检测可改进点并提供升级建议 |
@@ -489,6 +490,9 @@ cd openmatrix && npm install && npm run build && npm test
489
490
  - [x] Agent 上下文共享 (Agent Memory)
490
491
  - [x] Task 子目录结构 + Phase 结果持久化
491
492
  - [x] 执行循环持久化 (`openmatrix step`/`complete` 防上下文压缩丢失)
493
+ - [x] `/om:research` AI 驱动领域调研
494
+ - [x] Git 自动提交 (任务完成后自动 commit)
495
+ - [x] Brainstorm/Start 智能状态检测
492
496
  - [ ] VSCode 扩展
493
497
  - [ ] CI/CD 集成
494
498
 
@@ -52,102 +52,102 @@ class ResearcherAgent {
52
52
  buildDynamicResearchPrompt(task) {
53
53
  // 从任务描述中提取领域和角色信息
54
54
  const { domain, role, focus } = this.extractResearchContext(task.description);
55
- return `
56
- # 调研任务
57
-
58
- ## 研究领域
59
- ${domain}
60
-
61
- ## 角色定位
62
- ${role}
63
-
64
- ## 研究方向
65
- ${focus}
66
-
67
- ## 原始任务描述
68
- ${task.description}
69
-
70
- ## 调研步骤
71
-
72
- 1. **搜索资料**
73
- - 使用 WebSearch 搜索领域核心概念
74
- - 搜索行业标准、最佳实践
75
- - 搜索主流技术方案和开源项目
76
- - 搜索常见挑战和解决方案
77
-
78
- 2. **分析整理**
79
- - 功能对比
80
- - 性能特点
81
- - 社区生态
82
- - 学习曲线
83
- - 适用场景
84
-
85
- 3. **总结发现**
86
- - 关键信息提炼
87
- - 优缺点分析
88
- - 决策建议
89
-
90
- ## 输出格式
91
-
92
- \`\`\`markdown
93
- # ${domain} 调研报告
94
-
95
- ## 核心发现
96
-
97
- [3-5 个关键发现,每个用一句话概括]
98
-
99
- 1. ...
100
- 2. ...
101
- 3. ...
102
-
103
- ## 详细分析
104
-
105
- ### 发现 1: [标题]
106
- - **描述**: ...
107
- - **关键点**:
108
- - ...
109
- - **注意事项**: ...
110
-
111
- ### 发现 2: [标题]
112
- ...
113
-
114
- ## 行业最佳实践
115
-
116
- 1. ...
117
- 2. ...
118
- 3. ...
119
-
120
- ## 关键决策点
121
-
122
- [用户需要做出的关键决策]
123
-
124
- 1. **决策 1**: [决策描述]
125
- - 选项 A: ... (适用场景)
126
- - 选项 B: ... (适用场景)
127
- - 建议: ...
128
-
129
- 2. **决策 2**: ...
130
-
131
- ## 推荐方案
132
-
133
- **首选方案**: ...
134
-
135
- **理由**:
136
- 1. ...
137
- 2. ...
138
-
139
- **备选方案**: ...
140
-
141
- ## 参考资料
142
-
143
- 1. [标题](链接)
144
- 2. [标题](链接)
145
- \`\`\`
146
-
147
- ## 开始调研
148
-
149
- 请使用 WebSearch 和 WebFetch 工具搜索相关信息。
150
- 至少搜索 5 个相关关键词,覆盖官方文档、社区讨论、技术博客等维度。
55
+ return `
56
+ # 调研任务
57
+
58
+ ## 研究领域
59
+ ${domain}
60
+
61
+ ## 角色定位
62
+ ${role}
63
+
64
+ ## 研究方向
65
+ ${focus}
66
+
67
+ ## 原始任务描述
68
+ ${task.description}
69
+
70
+ ## 调研步骤
71
+
72
+ 1. **搜索资料**
73
+ - 使用 WebSearch 搜索领域核心概念
74
+ - 搜索行业标准、最佳实践
75
+ - 搜索主流技术方案和开源项目
76
+ - 搜索常见挑战和解决方案
77
+
78
+ 2. **分析整理**
79
+ - 功能对比
80
+ - 性能特点
81
+ - 社区生态
82
+ - 学习曲线
83
+ - 适用场景
84
+
85
+ 3. **总结发现**
86
+ - 关键信息提炼
87
+ - 优缺点分析
88
+ - 决策建议
89
+
90
+ ## 输出格式
91
+
92
+ \`\`\`markdown
93
+ # ${domain} 调研报告
94
+
95
+ ## 核心发现
96
+
97
+ [3-5 个关键发现,每个用一句话概括]
98
+
99
+ 1. ...
100
+ 2. ...
101
+ 3. ...
102
+
103
+ ## 详细分析
104
+
105
+ ### 发现 1: [标题]
106
+ - **描述**: ...
107
+ - **关键点**:
108
+ - ...
109
+ - **注意事项**: ...
110
+
111
+ ### 发现 2: [标题]
112
+ ...
113
+
114
+ ## 行业最佳实践
115
+
116
+ 1. ...
117
+ 2. ...
118
+ 3. ...
119
+
120
+ ## 关键决策点
121
+
122
+ [用户需要做出的关键决策]
123
+
124
+ 1. **决策 1**: [决策描述]
125
+ - 选项 A: ... (适用场景)
126
+ - 选项 B: ... (适用场景)
127
+ - 建议: ...
128
+
129
+ 2. **决策 2**: ...
130
+
131
+ ## 推荐方案
132
+
133
+ **首选方案**: ...
134
+
135
+ **理由**:
136
+ 1. ...
137
+ 2. ...
138
+
139
+ **备选方案**: ...
140
+
141
+ ## 参考资料
142
+
143
+ 1. [标题](链接)
144
+ 2. [标题](链接)
145
+ \`\`\`
146
+
147
+ ## 开始调研
148
+
149
+ 请使用 WebSearch 和 WebFetch 工具搜索相关信息。
150
+ 至少搜索 5 个相关关键词,覆盖官方文档、社区讨论、技术博客等维度。
151
151
  `;
152
152
  }
153
153
  /**
@@ -110,8 +110,9 @@ exports.completeCommand = new commander_1.Command('complete')
110
110
  if (commitResult.success) {
111
111
  console.error(`✅ Git 提交成功: ${commitResult.commitHash}`);
112
112
  }
113
- else if (commitResult.message !== 'No changes to commit') {
114
- console.error(`⚠️ Git 提交跳过: ${commitResult.message || commitResult.error}`);
113
+ else {
114
+ const reason = commitResult.message || commitResult.error || 'Unknown reason';
115
+ console.error(`⚠️ Git 提交跳过: ${reason}`);
115
116
  }
116
117
  }
117
118
  catch (error) {
@@ -1,9 +1,44 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.GitCommitManager = void 0;
4
37
  // src/orchestrator/git-commit-manager.ts
5
38
  const child_process_1 = require("child_process");
6
39
  const util_1 = require("util");
40
+ const path = __importStar(require("path"));
41
+ const fs = __importStar(require("fs/promises"));
7
42
  const execAsync = (0, util_1.promisify)(child_process_1.exec);
8
43
  /**
9
44
  * GitCommitManager - Git 自动提交管理器
@@ -211,16 +246,24 @@ class GitCommitManager {
211
246
  const commitMessage = this.generateCommitMessage(fullInfo);
212
247
  // 添加所有文件
213
248
  await execAsync('git add -A', { cwd: this.repoPath });
214
- // 执行提交
215
- const { stdout } = await execAsync(`git commit -m "${commitMessage.replace(/"/g, '\\"')}"`, { cwd: this.repoPath });
216
- // 提取 commit hash
217
- const hashMatch = stdout.match(/\[.+?\s+([a-f0-9]+)\]/);
218
- const commitHash = hashMatch ? hashMatch[1] : undefined;
219
- return {
220
- success: true,
221
- commitHash,
222
- message: `Committed ${files.length} files`
223
- };
249
+ // 使用临时文件传递 commit message(避免 Windows 下多行消息转义问题)
250
+ const tmpFile = path.join(this.repoPath, '.git', 'COMMIT_MSG_TMP');
251
+ await fs.writeFile(tmpFile, commitMessage, 'utf-8');
252
+ try {
253
+ const { stdout } = await execAsync(`git commit -F "${tmpFile}"`, { cwd: this.repoPath });
254
+ // 提取 commit hash
255
+ const hashMatch = stdout.match(/\[.+?\s+([a-f0-9]+)\]/);
256
+ const commitHash = hashMatch ? hashMatch[1] : undefined;
257
+ return {
258
+ success: true,
259
+ commitHash,
260
+ message: `Committed ${files.length} files`
261
+ };
262
+ }
263
+ finally {
264
+ // 清理临时文件
265
+ await fs.unlink(tmpFile).catch(() => { });
266
+ }
224
267
  }
225
268
  catch (error) {
226
269
  return {
@@ -709,8 +709,8 @@ ACCEPT_FAILED
709
709
  phaseStatus: 'completed',
710
710
  completedAt: now
711
711
  });
712
- // 自动提交代码
713
- if (this.runId) {
712
+ // 自动提交代码(始终尝试,不依赖 runId 是否为空)
713
+ {
714
714
  try {
715
715
  const commitResult = await this.gitCommitManager.commit({
716
716
  taskId: task.id,
@@ -723,8 +723,9 @@ ACCEPT_FAILED
723
723
  if (commitResult.success) {
724
724
  console.log(`✅ Git 提交成功: ${commitResult.commitHash}`);
725
725
  }
726
- else if (commitResult.message !== 'No changes to commit') {
727
- console.log(`⚠️ Git 提交跳过: ${commitResult.message || commitResult.error}`);
726
+ else {
727
+ const reason = commitResult.message || commitResult.error || 'Unknown reason';
728
+ console.log(`⚠️ Git 提交跳过: ${reason}`);
728
729
  }
729
730
  }
730
731
  catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmatrix",
3
- "version": "0.1.58",
3
+ "version": "0.1.59",
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/auto.md CHANGED
@@ -131,7 +131,13 @@ CLI 返回的 JSON 中 `subagentTasks` 数组包含每个待执行任务:
131
131
  **文件持久化循环(防止上下文压缩丢失状态):**
132
132
  ```bash
133
133
  # 每个 Agent 完成后执行:
134
- openmatrix complete TASK-XXX --success # 标记完成 + 更新统计
134
+ openmatrix complete TASK-XXX --success # 标记完成 + 更新统计(含自动 git commit)
135
+
136
+ # 提交验证(防止 commit 静默失败):
137
+ git status --porcelain # 检查是否有未提交的文件
138
+ # 如果有未提交文件 → 必须手动提交:
139
+ git add -A && git commit -m "feat: (TASK-XXX) 任务标题"
140
+
135
141
  openmatrix step --json # 获取下一个任务 + 检查是否全部完成
136
142
  ```
137
143
  `openmatrix step` 从磁盘读取真实状态,不依赖上下文记忆。