openmatrix 0.1.56 → 0.1.57
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 +24 -0
- package/dist/agents/impl/researcher-agent.d.ts +10 -1
- package/dist/agents/impl/researcher-agent.js +163 -41
- package/dist/cli/commands/brainstorm.js +47 -3
- package/dist/cli/commands/research.d.ts +2 -0
- package/dist/cli/commands/research.js +270 -0
- package/dist/cli/commands/start.js +5 -1
- package/dist/cli/index.js +2 -0
- package/dist/orchestrator/phase-executor.js +14 -0
- package/dist/storage/state-manager.d.ts +16 -0
- package/dist/storage/state-manager.js +58 -6
- package/dist/types/index.d.ts +36 -0
- package/package.json +1 -1
- package/skills/brainstorm.md +86 -20
- package/skills/om.md +47 -101
- package/skills/openmatrix.md +97 -190
- package/skills/research.md +258 -0
- package/skills/start.md +33 -9
|
@@ -164,7 +164,11 @@ async function handleTasksJson(options, stateManager, state, omPath) {
|
|
|
164
164
|
};
|
|
165
165
|
// 解析质量配置
|
|
166
166
|
const qualityLevel = tasksInput.quality || options.quality || 'balanced';
|
|
167
|
-
const qualityConfig = index_js_1.QUALITY_PRESETS[qualityLevel.toLowerCase()] || index_js_1.QUALITY_PRESETS.balanced;
|
|
167
|
+
const qualityConfig = { ...(index_js_1.QUALITY_PRESETS[qualityLevel.toLowerCase()] || index_js_1.QUALITY_PRESETS.balanced) };
|
|
168
|
+
// E2E 测试覆盖(用户在 Skill 问答中选择启用)
|
|
169
|
+
if (tasksInput.e2eTests) {
|
|
170
|
+
qualityConfig.e2eTests = true;
|
|
171
|
+
}
|
|
168
172
|
if (!options.json) {
|
|
169
173
|
console.log(`\n📋 任务: ${parsedTask.title}`);
|
|
170
174
|
console.log(` 目标: ${parsedTask.goals.join(', ')}`);
|
package/dist/cli/index.js
CHANGED
|
@@ -15,6 +15,7 @@ const check_js_1 = require("./commands/check.js");
|
|
|
15
15
|
const check_gitignore_js_1 = require("./commands/check-gitignore.js");
|
|
16
16
|
const analyze_js_1 = require("./commands/analyze.js");
|
|
17
17
|
const brainstorm_js_1 = require("./commands/brainstorm.js");
|
|
18
|
+
const research_js_1 = require("./commands/research.js");
|
|
18
19
|
const complete_js_1 = require("./commands/complete.js");
|
|
19
20
|
const step_js_1 = require("./commands/step.js");
|
|
20
21
|
const program = new commander_1.Command();
|
|
@@ -38,5 +39,6 @@ program.addCommand(check_js_1.checkCommand);
|
|
|
38
39
|
program.addCommand(check_gitignore_js_1.checkGitignoreCommand);
|
|
39
40
|
program.addCommand(analyze_js_1.analyzeCommand);
|
|
40
41
|
program.addCommand(brainstorm_js_1.brainstormCommand);
|
|
42
|
+
program.addCommand(research_js_1.researchCommand);
|
|
41
43
|
// 默认帮助
|
|
42
44
|
program.parse();
|
|
@@ -702,6 +702,13 @@ ACCEPT_FAILED
|
|
|
702
702
|
updates.status = 'completed';
|
|
703
703
|
}
|
|
704
704
|
await this.stateManager.updateTask(task.id, updates);
|
|
705
|
+
// 持久化 Phase 结果到磁盘
|
|
706
|
+
await this.stateManager.savePhaseResult(task.id, phase, {
|
|
707
|
+
success: true,
|
|
708
|
+
output: result.output,
|
|
709
|
+
phaseStatus: 'completed',
|
|
710
|
+
completedAt: now
|
|
711
|
+
});
|
|
705
712
|
// 自动提交代码
|
|
706
713
|
if (this.runId) {
|
|
707
714
|
try {
|
|
@@ -740,6 +747,13 @@ ACCEPT_FAILED
|
|
|
740
747
|
status: 'failed',
|
|
741
748
|
error: result.error || `${phase} phase failed`
|
|
742
749
|
});
|
|
750
|
+
// 持久化失败结果
|
|
751
|
+
await this.stateManager.savePhaseResult(task.id, phase, {
|
|
752
|
+
success: false,
|
|
753
|
+
error: result.error || `${phase} phase failed`,
|
|
754
|
+
phaseStatus: 'failed',
|
|
755
|
+
failedAt: now
|
|
756
|
+
});
|
|
743
757
|
return {
|
|
744
758
|
phase,
|
|
745
759
|
success: false,
|
|
@@ -17,6 +17,22 @@ export declare class StateManager {
|
|
|
17
17
|
getTask(taskId: string): Promise<Task | null>;
|
|
18
18
|
updateTask(taskId: string, updates: Partial<Task>): Promise<void>;
|
|
19
19
|
listTasks(): Promise<Task[]>;
|
|
20
|
+
/**
|
|
21
|
+
* 保存 Phase 结果到任务子目录
|
|
22
|
+
*/
|
|
23
|
+
savePhaseResult(taskId: string, phase: string, result: Record<string, unknown>): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* 读取 Phase 结果
|
|
26
|
+
*/
|
|
27
|
+
getPhaseResult(taskId: string, phase: string): Promise<Record<string, unknown> | null>;
|
|
28
|
+
/**
|
|
29
|
+
* 保存 Agent 上下文到 context.md
|
|
30
|
+
*/
|
|
31
|
+
saveTaskContext(taskId: string, content: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* 读取 Agent 上下文
|
|
34
|
+
*/
|
|
35
|
+
getTaskContext(taskId: string): Promise<string | null>;
|
|
20
36
|
private updateTaskStatistics;
|
|
21
37
|
private generateRunId;
|
|
22
38
|
private generateTaskId;
|
|
@@ -74,7 +74,9 @@ class StateManager {
|
|
|
74
74
|
createdAt: now,
|
|
75
75
|
updatedAt: now
|
|
76
76
|
};
|
|
77
|
-
await this.store.writeJson(`tasks/${taskId}.json`, task);
|
|
77
|
+
await this.store.writeJson(`tasks/${taskId}/task.json`, task);
|
|
78
|
+
// Create artifacts subdirectory
|
|
79
|
+
await this.store.ensureDir(`tasks/${taskId}/artifacts`);
|
|
78
80
|
// Update statistics
|
|
79
81
|
const state = await this.getState();
|
|
80
82
|
await this.updateState({
|
|
@@ -87,7 +89,12 @@ class StateManager {
|
|
|
87
89
|
return task;
|
|
88
90
|
}
|
|
89
91
|
async getTask(taskId) {
|
|
90
|
-
|
|
92
|
+
// Try subdirectory structure first, fall back to flat file
|
|
93
|
+
let task = await this.store.readJson(`tasks/${taskId}/task.json`);
|
|
94
|
+
if (!task) {
|
|
95
|
+
task = await this.store.readJson(`tasks/${taskId}.json`);
|
|
96
|
+
}
|
|
97
|
+
return task;
|
|
91
98
|
}
|
|
92
99
|
async updateTask(taskId, updates) {
|
|
93
100
|
const task = await this.getTask(taskId);
|
|
@@ -99,22 +106,67 @@ class StateManager {
|
|
|
99
106
|
...updates,
|
|
100
107
|
updatedAt: new Date().toISOString()
|
|
101
108
|
};
|
|
102
|
-
|
|
109
|
+
// Always write to subdirectory structure
|
|
110
|
+
await this.store.writeJson(`tasks/${taskId}/task.json`, updatedTask);
|
|
103
111
|
// Update statistics if status changed
|
|
104
112
|
if (updates.status && updates.status !== oldStatus) {
|
|
105
113
|
await this.updateTaskStatistics(oldStatus, updates.status);
|
|
106
114
|
}
|
|
107
115
|
}
|
|
108
116
|
async listTasks() {
|
|
109
|
-
const files = await this.store.listFiles('tasks');
|
|
110
117
|
const tasks = [];
|
|
111
|
-
|
|
112
|
-
|
|
118
|
+
// Read from subdirectory structure: tasks/TASK-XXX/task.json
|
|
119
|
+
const dirs = await this.store.listDirs('tasks');
|
|
120
|
+
for (const dir of dirs) {
|
|
121
|
+
const task = await this.store.readJson(`tasks/${dir}/task.json`);
|
|
113
122
|
if (task)
|
|
114
123
|
tasks.push(task);
|
|
115
124
|
}
|
|
125
|
+
// Also check flat files (backward compat)
|
|
126
|
+
const files = await this.store.listFiles('tasks');
|
|
127
|
+
for (const file of files) {
|
|
128
|
+
if (!file.endsWith('.json'))
|
|
129
|
+
continue;
|
|
130
|
+
const task = await this.store.readJson(`tasks/${file}`);
|
|
131
|
+
if (task) {
|
|
132
|
+
// Avoid duplicate if already found in subdirectory
|
|
133
|
+
if (!tasks.some(t => t.id === task.id)) {
|
|
134
|
+
tasks.push(task);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
116
138
|
return tasks.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
117
139
|
}
|
|
140
|
+
// ============ Task Artifact Methods ============
|
|
141
|
+
/**
|
|
142
|
+
* 保存 Phase 结果到任务子目录
|
|
143
|
+
*/
|
|
144
|
+
async savePhaseResult(taskId, phase, result) {
|
|
145
|
+
await this.store.writeJson(`tasks/${taskId}/${phase}.json`, {
|
|
146
|
+
taskId,
|
|
147
|
+
phase,
|
|
148
|
+
timestamp: new Date().toISOString(),
|
|
149
|
+
...result
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 读取 Phase 结果
|
|
154
|
+
*/
|
|
155
|
+
async getPhaseResult(taskId, phase) {
|
|
156
|
+
return await this.store.readJson(`tasks/${taskId}/${phase}.json`);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 保存 Agent 上下文到 context.md
|
|
160
|
+
*/
|
|
161
|
+
async saveTaskContext(taskId, content) {
|
|
162
|
+
await this.store.writeMarkdown(`tasks/${taskId}/context.md`, content);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* 读取 Agent 上下文
|
|
166
|
+
*/
|
|
167
|
+
async getTaskContext(taskId) {
|
|
168
|
+
return await this.store.readMarkdown(`tasks/${taskId}/context.md`);
|
|
169
|
+
}
|
|
118
170
|
async updateTaskStatistics(oldStatus, newStatus) {
|
|
119
171
|
const state = await this.getState();
|
|
120
172
|
const stats = { ...state.statistics };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export type TaskStatus = 'pending' | 'scheduled' | 'in_progress' | 'blocked' | 'waiting' | 'verify' | 'accept' | 'completed' | 'failed' | 'retry_queue';
|
|
2
2
|
export type TaskPriority = 'P0' | 'P1' | 'P2' | 'P3';
|
|
3
|
+
export type ResearchMode = 'domain' | 'tech' | 'problem';
|
|
3
4
|
export interface TaskPhase {
|
|
4
5
|
status: TaskStatus;
|
|
5
6
|
duration: number | null;
|
|
@@ -201,3 +202,38 @@ export interface ParsedTask {
|
|
|
201
202
|
deliverables: string[];
|
|
202
203
|
rawContent: string;
|
|
203
204
|
}
|
|
205
|
+
export interface ResearchAgentConfig {
|
|
206
|
+
role: string;
|
|
207
|
+
focus: string;
|
|
208
|
+
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
209
|
+
result?: string;
|
|
210
|
+
}
|
|
211
|
+
export interface ResearchQuestion {
|
|
212
|
+
id: string;
|
|
213
|
+
question: string;
|
|
214
|
+
header: string;
|
|
215
|
+
options: Array<{
|
|
216
|
+
label: string;
|
|
217
|
+
description: string;
|
|
218
|
+
}>;
|
|
219
|
+
multiSelect: boolean;
|
|
220
|
+
}
|
|
221
|
+
export interface ResearchSession {
|
|
222
|
+
status: 'initialized' | 'preview' | 'researching' | 'questioning' | 'completed';
|
|
223
|
+
topic: string;
|
|
224
|
+
domain: string;
|
|
225
|
+
aspects: string[];
|
|
226
|
+
estimatedQuestions: number;
|
|
227
|
+
agents: ResearchAgentConfig[];
|
|
228
|
+
domainQuestions: ResearchQuestion[];
|
|
229
|
+
answers: Record<string, string | string[]>;
|
|
230
|
+
report?: string;
|
|
231
|
+
knowledge: string[];
|
|
232
|
+
context?: {
|
|
233
|
+
goals: string[];
|
|
234
|
+
constraints: string[];
|
|
235
|
+
deliverables: string[];
|
|
236
|
+
};
|
|
237
|
+
createdAt: string;
|
|
238
|
+
completedAt?: string;
|
|
239
|
+
}
|
package/package.json
CHANGED
package/skills/brainstorm.md
CHANGED
|
@@ -25,20 +25,37 @@ description: 头脑风暴 - 探索需求和设计后再执行任务
|
|
|
25
25
|
"status": "brainstorming",
|
|
26
26
|
"message": "开始头脑风暴",
|
|
27
27
|
"taskTitle": "任务标题",
|
|
28
|
-
"questions": [
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"question": "这个任务的核心目标是什么?",
|
|
32
|
-
"header": "核心目标",
|
|
33
|
-
"options": [...],
|
|
34
|
-
"multiSelect": false
|
|
35
|
-
}
|
|
36
|
-
],
|
|
28
|
+
"questions": [...],
|
|
29
|
+
"suggestResearch": "游戏开发",
|
|
30
|
+
"researchHint": "检测到垂直领域「游戏开发」,建议先进行领域调研",
|
|
37
31
|
"hint": "请逐一回答问题,完成后再调用 --complete"
|
|
38
32
|
}
|
|
39
33
|
```
|
|
40
34
|
|
|
41
|
-
2.
|
|
35
|
+
2. **检测垂直领域** (如果 suggestResearch 存在)
|
|
36
|
+
|
|
37
|
+
如果 CLI 返回了 `suggestResearch` 字段,说明检测到垂直领域:
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
if (result.suggestResearch) {
|
|
41
|
+
AskUserQuestion({
|
|
42
|
+
questions: [{
|
|
43
|
+
question: `检测到垂直领域「${result.suggestResearch}」,建议先进行领域调研。\n\n领域调研可以帮助您:\n• 了解行业最佳实践\n• 获取技术方案建议\n• 生成领域专属文档 (如 GDD/PRD)\n\n是否进入领域调研?`,
|
|
44
|
+
header: "领域调研",
|
|
45
|
+
options: [
|
|
46
|
+
{ label: "进入调研 (推荐)", description: "启动 /om:research 进行深度调研" },
|
|
47
|
+
{ label: "跳过调研", description: "直接进行头脑风暴问答" }
|
|
48
|
+
],
|
|
49
|
+
multiSelect: false
|
|
50
|
+
}]
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
- 如果用户选择"进入调研",调用 `/om:research`,研究完成后自动返回 start
|
|
56
|
+
- 如果用户选择"跳过调研",继续下面的问答流程
|
|
57
|
+
|
|
58
|
+
3. **交互式问答**
|
|
42
59
|
|
|
43
60
|
对每个问题使用 `AskUserQuestion` 进行提问:
|
|
44
61
|
|
|
@@ -58,7 +75,7 @@ description: 头脑风暴 - 探索需求和设计后再执行任务
|
|
|
58
75
|
- 记录可能的设计决策
|
|
59
76
|
- 识别潜在风险
|
|
60
77
|
|
|
61
|
-
|
|
78
|
+
4. **深入追问** (可选)
|
|
62
79
|
|
|
63
80
|
如果用户选择了"其他"或回答不够清晰,进行追问:
|
|
64
81
|
```typescript
|
|
@@ -71,7 +88,7 @@ description: 头脑风暴 - 探索需求和设计后再执行任务
|
|
|
71
88
|
})
|
|
72
89
|
```
|
|
73
90
|
|
|
74
|
-
|
|
91
|
+
5. **总结头脑风暴结果**
|
|
75
92
|
|
|
76
93
|
所有问题回答完成后,总结:
|
|
77
94
|
- 核心目标
|
|
@@ -121,15 +138,64 @@ description: 头脑风暴 - 探索需求和设计后再执行任务
|
|
|
121
138
|
})
|
|
122
139
|
```
|
|
123
140
|
|
|
124
|
-
6.
|
|
141
|
+
6. **智能检测 .openmatrix 状态后执行**
|
|
142
|
+
|
|
143
|
+
**先检测当前状态:**
|
|
144
|
+
```bash
|
|
145
|
+
# 检查 .openmatrix 目录是否存在
|
|
146
|
+
ls .openmatrix/state.json 2>/dev/null
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**根据状态走不同路径:**
|
|
150
|
+
|
|
151
|
+
| .openmatrix 状态 | 处理方式 |
|
|
152
|
+
|-----------------|---------|
|
|
153
|
+
| 不存在 | 全新开始 → init → 写 tasks-input → CLI start |
|
|
154
|
+
| 存在,`status: completed` | 清理旧数据后重新开始 → 写 tasks-input → CLI start |
|
|
155
|
+
| 存在,`status: running` | 提示用户先完成或暂停当前任务 |
|
|
156
|
+
| 存在,`status: paused` | 询问用户:继续上次任务 还是 开始新任务 |
|
|
157
|
+
| 存在,`status: initialized` | 直接写 tasks-input → CLI start |
|
|
158
|
+
|
|
159
|
+
**路径 A: 全新开始 / 重新开始**
|
|
160
|
+
```bash
|
|
161
|
+
# 初始化 (如果不存在)
|
|
162
|
+
openmatrix start --init-only
|
|
163
|
+
|
|
164
|
+
# 如果是重新开始,清理旧数据
|
|
165
|
+
# rm -rf .openmatrix/tasks/ .openmatrix/approvals/ .openmatrix/meetings/
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**将头脑风暴结论转换为 goals:**
|
|
169
|
+
```json
|
|
170
|
+
{
|
|
171
|
+
"title": "任务标题",
|
|
172
|
+
"description": "基于头脑风暴的整体描述",
|
|
173
|
+
"goals": [
|
|
174
|
+
"目标1: 独立功能模块",
|
|
175
|
+
"目标2: 独立功能模块",
|
|
176
|
+
"..."
|
|
177
|
+
],
|
|
178
|
+
"constraints": ["约束"],
|
|
179
|
+
"deliverables": ["交付物"],
|
|
180
|
+
"answers": { "问答答案" },
|
|
181
|
+
"quality": "strict/balanced/fast",
|
|
182
|
+
"mode": "auto",
|
|
183
|
+
"plan": "## 技术方案\n..."
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
写入 `.openmatrix/tasks-input.json` 后执行:
|
|
188
|
+
```bash
|
|
189
|
+
openmatrix start --tasks-json @.openmatrix/tasks-input.json --json
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**路径 B: 继续上次任务**
|
|
193
|
+
```bash
|
|
194
|
+
openmatrix step --json
|
|
195
|
+
```
|
|
196
|
+
从返回的 next task 继续执行。
|
|
125
197
|
|
|
126
|
-
|
|
127
|
-
- 调用 CLI 标记头脑风暴完成:
|
|
128
|
-
```bash
|
|
129
|
-
openmatrix brainstorm --complete --json
|
|
130
|
-
```
|
|
131
|
-
- 自动调用 `/om:start` 开始执行任务
|
|
132
|
-
- 将头脑风暴收集的洞察传递给 start
|
|
198
|
+
**最终:从 CLI 返回的 `subagentTasks` 开始逐个执行 Agent**
|
|
133
199
|
|
|
134
200
|
</process>
|
|
135
201
|
|
package/skills/om.md
CHANGED
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: om
|
|
3
|
-
description: "
|
|
3
|
+
description: "Use when starting any conversation - establishes OpenMatrix as the handler for development tasks. Routes /om:start automatically. Triggers on: implement, build, fix, create, refactor, 修复, 实现, 开发."
|
|
4
4
|
priority: critical
|
|
5
5
|
always_load: true
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
<EXTREMELY-IMPORTANT>
|
|
9
|
-
|
|
9
|
+
## How to Use This Skill
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
- Build/create/implement something
|
|
13
|
-
- Add new features or functionality
|
|
14
|
-
- Fix bugs or resolve issues
|
|
15
|
-
- Refactor or optimize code
|
|
16
|
-
- Make changes to the codebase
|
|
11
|
+
This is the DEFAULT entry when the user wants to produce code changes.
|
|
17
12
|
|
|
18
|
-
**
|
|
13
|
+
**Analyze user INTENT:**
|
|
14
|
+
- "实现X" / "implement X" / "build X" → Development task → This skill
|
|
15
|
+
- "修复X" / "fix X" → Development task → This skill
|
|
16
|
+
- "怎么实现?" / "how to?" → Question → NOT this skill (just answer)
|
|
19
17
|
</EXTREMELY-IMPORTANT>
|
|
20
18
|
|
|
21
19
|
<NO-OTHER-SKILLS>
|
|
@@ -23,79 +21,61 @@ This is the DEFAULT action for ANY development task.
|
|
|
23
21
|
</NO-OTHER-SKILLS>
|
|
24
22
|
|
|
25
23
|
<objective>
|
|
26
|
-
OpenMatrix
|
|
27
|
-
|
|
28
|
-
**核心价值:**
|
|
29
|
-
- 用户无需记忆命令,直接描述任务即可
|
|
30
|
-
- 自动识别任务类型并启动相应流程
|
|
31
|
-
- 支持中英文混合输入
|
|
32
|
-
|
|
33
|
-
**触发优先级:最高**
|
|
34
|
-
- 任何"要做事情"的输入都应触发此技能
|
|
35
|
-
- 系统会自动判断是执行任务还是回答问题
|
|
24
|
+
OpenMatrix 默认入口 - 用户无需记忆命令,直接描述任务即可。
|
|
36
25
|
</objective>
|
|
37
26
|
|
|
38
27
|
<process>
|
|
39
|
-
1.
|
|
28
|
+
1. **Parse user input**
|
|
40
29
|
|
|
41
|
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
30
|
+
`$ARGUMENTS` can be:
|
|
31
|
+
- Task description: "实现用户登录功能"
|
|
32
|
+
- File path: "docs/task.md"
|
|
33
|
+
- Empty input
|
|
45
34
|
|
|
46
|
-
2.
|
|
35
|
+
2. **Route input**
|
|
47
36
|
|
|
48
|
-
|
|
49
|
-
→
|
|
37
|
+
**Task description or file path**:
|
|
38
|
+
→ Invoke `/om:start` with arguments
|
|
50
39
|
|
|
51
|
-
|
|
52
|
-
→
|
|
40
|
+
**Empty input**:
|
|
41
|
+
→ Show help
|
|
53
42
|
|
|
54
|
-
3.
|
|
55
|
-
|
|
56
|
-
无论用户输入什么,都自动转换为 `/om:start` 调用:
|
|
43
|
+
3. **Auto-route to /om:start**
|
|
57
44
|
|
|
58
45
|
```
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
用户输入: "docs/task.md"
|
|
63
|
-
系统执行: /om:start docs/task.md
|
|
64
|
-
|
|
65
|
-
用户输入: (空)
|
|
66
|
-
系统显示: 帮助信息
|
|
46
|
+
"实现用户登录" → /om:start 实现用户登录
|
|
47
|
+
"docs/task.md" → /om:start docs/task.md
|
|
48
|
+
(empty) → Show help
|
|
67
49
|
```
|
|
68
50
|
|
|
69
|
-
4.
|
|
70
|
-
|
|
71
|
-
如果用户输入为空或输入 `--help`,显示:
|
|
51
|
+
4. **Help**
|
|
72
52
|
|
|
53
|
+
If empty or `--help`:
|
|
73
54
|
```
|
|
74
|
-
|
|
55
|
+
OpenMatrix - AI task orchestration
|
|
75
56
|
|
|
76
|
-
|
|
77
|
-
/om
|
|
78
|
-
/om:brainstorm
|
|
79
|
-
/om:start
|
|
80
|
-
/om:auto
|
|
57
|
+
Usage:
|
|
58
|
+
/om <task> Start task
|
|
59
|
+
/om:brainstorm <task> Brainstorm first
|
|
60
|
+
/om:start <task> Interactive start
|
|
61
|
+
/om:auto <task> Full auto
|
|
81
62
|
|
|
82
|
-
|
|
63
|
+
Examples:
|
|
83
64
|
/om 实现用户登录功能
|
|
84
65
|
/om 修复登录页面的样式问题
|
|
85
66
|
/om 添加 API 接口
|
|
86
67
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
68
|
+
Quality:
|
|
69
|
+
strict - TDD + 80% coverage
|
|
70
|
+
balanced - 60% coverage
|
|
71
|
+
fast - No gates
|
|
91
72
|
|
|
92
|
-
|
|
93
|
-
/om:brainstorm
|
|
94
|
-
/om:status
|
|
95
|
-
/om:meeting
|
|
96
|
-
/om:report
|
|
73
|
+
Commands:
|
|
74
|
+
/om:brainstorm - Brainstorm then execute
|
|
75
|
+
/om:status - View status
|
|
76
|
+
/om:meeting - Handle blockers
|
|
77
|
+
/om:report - Generate report
|
|
97
78
|
```
|
|
98
|
-
|
|
99
79
|
</process>
|
|
100
80
|
|
|
101
81
|
<arguments>
|
|
@@ -103,48 +83,14 @@ $ARGUMENTS
|
|
|
103
83
|
</arguments>
|
|
104
84
|
|
|
105
85
|
<examples>
|
|
106
|
-
/om 实现用户登录功能 #
|
|
107
|
-
/om 修复登录页面的样式问题 #
|
|
108
|
-
/om docs/task.md #
|
|
109
|
-
/om #
|
|
86
|
+
/om 实现用户登录功能 # Auto start
|
|
87
|
+
/om 修复登录页面的样式问题 # Direct description
|
|
88
|
+
/om docs/task.md # From file
|
|
89
|
+
/om # Show help
|
|
110
90
|
</examples>
|
|
111
91
|
|
|
112
92
|
<notes>
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
用户输入: /om 实现登录
|
|
117
|
-
│
|
|
118
|
-
▼
|
|
119
|
-
┌─────────────────┐
|
|
120
|
-
│ 检测到任务描述 │
|
|
121
|
-
└────────┬────────┘
|
|
122
|
-
│
|
|
123
|
-
▼
|
|
124
|
-
┌─────────────────┐
|
|
125
|
-
│ 自动调用 │
|
|
126
|
-
│ /om:start │
|
|
127
|
-
│ 实现登录 │
|
|
128
|
-
└─────────────────┘
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## 与 /om:start 的关系
|
|
132
|
-
|
|
133
|
-
`/om` 是 `/om:start` 的快捷方式:
|
|
134
|
-
- `/om <任务>` ≡ `/om:start <任务>`
|
|
135
|
-
- 用户体验更简洁
|
|
136
|
-
- 功能完全相同
|
|
137
|
-
|
|
138
|
-
## 推荐用法
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
# 快速启动 (推荐)
|
|
142
|
-
/om 实现用户登录
|
|
143
|
-
|
|
144
|
-
# 等价于
|
|
145
|
-
/om:start 实现用户登录
|
|
146
|
-
|
|
147
|
-
# 全自动模式
|
|
148
|
-
/om:auto 实现用户登录
|
|
149
|
-
```
|
|
93
|
+
`/om` is a shortcut for `/om:start`:
|
|
94
|
+
- `/om <task>` ≡ `/om:start <task>`
|
|
95
|
+
- Same functionality, simpler UX
|
|
150
96
|
</notes>
|