openmatrix 0.1.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.
Files changed (85) hide show
  1. package/README.md +512 -0
  2. package/dist/agents/agent-runner.d.ts +152 -0
  3. package/dist/agents/agent-runner.js +656 -0
  4. package/dist/agents/base-agent.d.ts +46 -0
  5. package/dist/agents/base-agent.js +17 -0
  6. package/dist/agents/impl/coder-agent.d.ts +17 -0
  7. package/dist/agents/impl/coder-agent.js +96 -0
  8. package/dist/agents/impl/executor-agent.d.ts +32 -0
  9. package/dist/agents/impl/executor-agent.js +168 -0
  10. package/dist/agents/impl/index.d.ts +6 -0
  11. package/dist/agents/impl/index.js +17 -0
  12. package/dist/agents/impl/planner-agent.d.ts +24 -0
  13. package/dist/agents/impl/planner-agent.js +126 -0
  14. package/dist/agents/impl/researcher-agent.d.ts +17 -0
  15. package/dist/agents/impl/researcher-agent.js +133 -0
  16. package/dist/agents/impl/reviewer-agent.d.ts +17 -0
  17. package/dist/agents/impl/reviewer-agent.js +120 -0
  18. package/dist/agents/impl/tester-agent.d.ts +17 -0
  19. package/dist/agents/impl/tester-agent.js +110 -0
  20. package/dist/cli/commands/approve.d.ts +2 -0
  21. package/dist/cli/commands/approve.js +87 -0
  22. package/dist/cli/commands/meeting.d.ts +2 -0
  23. package/dist/cli/commands/meeting.js +245 -0
  24. package/dist/cli/commands/report.d.ts +2 -0
  25. package/dist/cli/commands/report.js +202 -0
  26. package/dist/cli/commands/resume.d.ts +2 -0
  27. package/dist/cli/commands/resume.js +104 -0
  28. package/dist/cli/commands/retry.d.ts +2 -0
  29. package/dist/cli/commands/retry.js +79 -0
  30. package/dist/cli/commands/start.d.ts +2 -0
  31. package/dist/cli/commands/start.js +252 -0
  32. package/dist/cli/commands/status.d.ts +2 -0
  33. package/dist/cli/commands/status.js +226 -0
  34. package/dist/cli/index.d.ts +2 -0
  35. package/dist/cli/index.js +26 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +9 -0
  38. package/dist/orchestrator/ai-reviewer.d.ts +50 -0
  39. package/dist/orchestrator/ai-reviewer.js +326 -0
  40. package/dist/orchestrator/approval-manager.d.ts +62 -0
  41. package/dist/orchestrator/approval-manager.js +160 -0
  42. package/dist/orchestrator/executor.d.ts +114 -0
  43. package/dist/orchestrator/executor.js +325 -0
  44. package/dist/orchestrator/full-test-runner.d.ts +122 -0
  45. package/dist/orchestrator/full-test-runner.js +335 -0
  46. package/dist/orchestrator/git-commit-manager.d.ts +75 -0
  47. package/dist/orchestrator/git-commit-manager.js +248 -0
  48. package/dist/orchestrator/interactive-question-generator.d.ts +90 -0
  49. package/dist/orchestrator/interactive-question-generator.js +312 -0
  50. package/dist/orchestrator/meeting-manager.d.ts +85 -0
  51. package/dist/orchestrator/meeting-manager.js +222 -0
  52. package/dist/orchestrator/phase-executor.d.ts +198 -0
  53. package/dist/orchestrator/phase-executor.js +796 -0
  54. package/dist/orchestrator/question-generator.d.ts +22 -0
  55. package/dist/orchestrator/question-generator.js +102 -0
  56. package/dist/orchestrator/retry-manager.d.ts +41 -0
  57. package/dist/orchestrator/retry-manager.js +83 -0
  58. package/dist/orchestrator/scheduler.d.ts +62 -0
  59. package/dist/orchestrator/scheduler.js +148 -0
  60. package/dist/orchestrator/state-machine.d.ts +53 -0
  61. package/dist/orchestrator/state-machine.js +124 -0
  62. package/dist/orchestrator/task-parser.d.ts +7 -0
  63. package/dist/orchestrator/task-parser.js +63 -0
  64. package/dist/orchestrator/task-planner.d.ts +71 -0
  65. package/dist/orchestrator/task-planner.js +316 -0
  66. package/dist/storage/file-store.d.ts +12 -0
  67. package/dist/storage/file-store.js +80 -0
  68. package/dist/storage/state-manager.d.ts +31 -0
  69. package/dist/storage/state-manager.js +202 -0
  70. package/dist/types/index.d.ts +193 -0
  71. package/dist/types/index.js +30 -0
  72. package/dist/utils/logger.d.ts +41 -0
  73. package/dist/utils/logger.js +166 -0
  74. package/dist/utils/progress-reporter.d.ts +116 -0
  75. package/dist/utils/progress-reporter.js +287 -0
  76. package/package.json +50 -0
  77. package/scripts/build-check.js +19 -0
  78. package/scripts/install-skills.js +51 -0
  79. package/skills/approve.md +253 -0
  80. package/skills/meeting.md +346 -0
  81. package/skills/report.md +100 -0
  82. package/skills/resume.md +68 -0
  83. package/skills/retry.md +61 -0
  84. package/skills/start.md +449 -0
  85. package/skills/status.md +46 -0
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReviewerAgent = void 0;
4
+ /**
5
+ * Reviewer Agent - 代码审查
6
+ *
7
+ * 职责:
8
+ * - 代码质量审查
9
+ * - 安全性检查
10
+ * - 性能评估
11
+ * - 最佳实践建议
12
+ */
13
+ class ReviewerAgent {
14
+ type = 'reviewer';
15
+ capabilities = ['review', 'audit', 'security', 'performance'];
16
+ async execute(task) {
17
+ const startTime = Date.now();
18
+ try {
19
+ const prompt = this.buildReviewerPrompt(task);
20
+ return {
21
+ runId: this.generateRunId(),
22
+ taskId: task.id,
23
+ agentType: 'reviewer',
24
+ status: 'completed',
25
+ output: prompt,
26
+ artifacts: [],
27
+ needsApproval: true, // 审查结果需要确认
28
+ duration: Date.now() - startTime,
29
+ completedAt: new Date().toISOString()
30
+ };
31
+ }
32
+ catch (error) {
33
+ return {
34
+ runId: this.generateRunId(),
35
+ taskId: task.id,
36
+ agentType: 'reviewer',
37
+ status: 'failed',
38
+ output: '',
39
+ artifacts: [],
40
+ needsApproval: false,
41
+ error: error instanceof Error ? error.message : String(error),
42
+ duration: Date.now() - startTime,
43
+ completedAt: new Date().toISOString()
44
+ };
45
+ }
46
+ }
47
+ buildReviewerPrompt(task) {
48
+ return `
49
+ # 代码审查
50
+
51
+ ## 审查范围
52
+
53
+ ${task.description}
54
+
55
+ ## 审查清单
56
+
57
+ ### 1. 代码质量
58
+
59
+ - [ ] 代码可读性
60
+ - [ ] 命名规范
61
+ - [ ] 函数复杂度
62
+ - [ ] 重复代码
63
+ - [ ] 注释质量
64
+
65
+ ### 2. 安全性
66
+
67
+ - [ ] 输入验证
68
+ - [ ] SQL 注入
69
+ - [ ] XSS 攻击
70
+ - [ ] 敏感数据暴露
71
+ - [ ] 权限控制
72
+
73
+ ### 3. 性能
74
+
75
+ - [ ] 算法效率
76
+ - [ ] 数据库查询
77
+ - [ ] 内存使用
78
+ - [ ] 缓存策略
79
+
80
+ ### 4. 最佳实践
81
+
82
+ - [ ] 设计模式
83
+ - [ ] 错误处理
84
+ - [ ] 日志记录
85
+ - [ ] 测试覆盖
86
+
87
+ ## 输出格式
88
+
89
+ \`\`\`markdown
90
+ # 审查报告
91
+
92
+ ## 总体评价
93
+ [✅ 通过 / ⚠️ 需修改 / ❌ 拒绝]
94
+
95
+ ## 问题列表
96
+
97
+ ### 严重 (必须修复)
98
+ 1. [文件:行号] 问题描述
99
+ - 建议: 修复建议
100
+
101
+ ### 警告 (建议修复)
102
+ 1. [文件:行号] 问题描述
103
+
104
+ ### 建议 (可选优化)
105
+ 1. 优化建议
106
+
107
+ ## 总结
108
+ [审查总结]
109
+ \`\`\`
110
+
111
+ ## 开始审查
112
+
113
+ 请检查相关代码文件并提供审查意见。
114
+ `;
115
+ }
116
+ generateRunId() {
117
+ return `reviewer-${Date.now().toString(36)}`;
118
+ }
119
+ }
120
+ exports.ReviewerAgent = ReviewerAgent;
@@ -0,0 +1,17 @@
1
+ import type { Task, AgentType, AgentResult } from '../../types/index.js';
2
+ /**
3
+ * Tester Agent - 测试验证
4
+ *
5
+ * 职责:
6
+ * - 编写单元测试
7
+ * - 编写集成测试
8
+ * - 执行测试用例
9
+ * - 生成测试报告
10
+ */
11
+ export declare class TesterAgent {
12
+ readonly type: AgentType;
13
+ readonly capabilities: string[];
14
+ execute(task: Task): Promise<AgentResult>;
15
+ private buildTesterPrompt;
16
+ private generateRunId;
17
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TesterAgent = void 0;
4
+ /**
5
+ * Tester Agent - 测试验证
6
+ *
7
+ * 职责:
8
+ * - 编写单元测试
9
+ * - 编写集成测试
10
+ * - 执行测试用例
11
+ * - 生成测试报告
12
+ */
13
+ class TesterAgent {
14
+ type = 'tester';
15
+ capabilities = ['test', 'verify', 'coverage', 'report'];
16
+ async execute(task) {
17
+ const startTime = Date.now();
18
+ try {
19
+ const prompt = this.buildTesterPrompt(task);
20
+ return {
21
+ runId: this.generateRunId(),
22
+ taskId: task.id,
23
+ agentType: 'tester',
24
+ status: 'completed',
25
+ output: prompt,
26
+ artifacts: [],
27
+ needsApproval: false,
28
+ duration: Date.now() - startTime,
29
+ completedAt: new Date().toISOString()
30
+ };
31
+ }
32
+ catch (error) {
33
+ return {
34
+ runId: this.generateRunId(),
35
+ taskId: task.id,
36
+ agentType: 'tester',
37
+ status: 'failed',
38
+ output: '',
39
+ artifacts: [],
40
+ needsApproval: false,
41
+ error: error instanceof Error ? error.message : String(error),
42
+ duration: Date.now() - startTime,
43
+ completedAt: new Date().toISOString()
44
+ };
45
+ }
46
+ }
47
+ buildTesterPrompt(task) {
48
+ return `
49
+ # 测试任务
50
+
51
+ ## 测试目标
52
+
53
+ ${task.description}
54
+
55
+ ## 测试范围
56
+
57
+ ### 1. 单元测试
58
+ - 测试各个函数/方法
59
+ - 覆盖边界情况
60
+ - 测试错误处理
61
+
62
+ ### 2. 集成测试
63
+ - 测试模块间交互
64
+ - 测试 API 端点
65
+ - 测试数据流
66
+
67
+ ### 3. 测试用例
68
+
69
+ | 场景 | 输入 | 预期输出 |
70
+ |-----|------|---------|
71
+ | 正常流程 | ... | ... |
72
+ | 边界情况 | ... | ... |
73
+ | 异常处理 | ... | ... |
74
+
75
+ ## 执行步骤
76
+
77
+ 1. 识别需要测试的代码
78
+ 2. 编写测试用例
79
+ 3. 运行测试
80
+ 4. 生成报告
81
+
82
+ ## 输出格式
83
+
84
+ \`\`\`markdown
85
+ # 测试报告
86
+
87
+ ## 测试结果
88
+ - ✅ 通过: X
89
+ - ❌ 失败: Y
90
+ - ⏭️ 跳过: Z
91
+
92
+ ## 覆盖率
93
+ - 语句: X%
94
+ - 分支: Y%
95
+ - 函数: Z%
96
+
97
+ ## 失败用例 (如有)
98
+ 1. [用例名]: [失败原因]
99
+ \`\`\`
100
+
101
+ ## 开始测试
102
+
103
+ 请运行 \`npm test\` 并分析结果。
104
+ `;
105
+ }
106
+ generateRunId() {
107
+ return `tester-${Date.now().toString(36)}`;
108
+ }
109
+ }
110
+ exports.TesterAgent = TesterAgent;
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const approveCommand: Command;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.approveCommand = void 0;
4
+ // src/cli/commands/approve.ts
5
+ const commander_1 = require("commander");
6
+ const state_manager_js_1 = require("../../storage/state-manager.js");
7
+ const approval_manager_js_1 = require("../../orchestrator/approval-manager.js");
8
+ exports.approveCommand = new commander_1.Command('approve')
9
+ .description('审批待处理项')
10
+ .argument('[approvalId]', '审批ID')
11
+ .option('-d, --decision <decision>', '决策 (approve/modify/reject)')
12
+ .option('-c, --comment <comment>', '备注说明')
13
+ .action(async (approvalId, options) => {
14
+ const basePath = process.cwd();
15
+ const omPath = `${basePath}/.openmatrix`;
16
+ const stateManager = new state_manager_js_1.StateManager(omPath);
17
+ await stateManager.initialize();
18
+ const approvalManager = new approval_manager_js_1.ApprovalManager(stateManager);
19
+ // 如果没有提供审批ID,列出所有待审批
20
+ if (!approvalId) {
21
+ const pendingApprovals = await approvalManager.getPendingApprovals();
22
+ if (pendingApprovals.length === 0) {
23
+ console.log('✅ 没有待处理的审批');
24
+ return;
25
+ }
26
+ console.log('📋 待处理审批:\n');
27
+ pendingApprovals.forEach((approval, i) => {
28
+ const typeEmoji = {
29
+ plan: '📋',
30
+ merge: '🔀',
31
+ deploy: '🚀',
32
+ meeting: '🔴',
33
+ custom: '📝'
34
+ };
35
+ const emoji = typeEmoji[approval.type] || '📝';
36
+ console.log(` [${i + 1}] ${emoji} ${approval.id}: ${approval.title}`);
37
+ console.log(` 类型: ${approval.type} | 任务: ${approval.taskId}`);
38
+ });
39
+ console.log('\n💡 使用 openmatrix approve <ID> 处理审批');
40
+ return;
41
+ }
42
+ // 获取审批
43
+ const approval = await approvalManager.getApproval(approvalId);
44
+ if (!approval) {
45
+ console.log(`❌ 审批 ${approvalId} 不存在`);
46
+ return;
47
+ }
48
+ if (approval.status !== 'pending') {
49
+ console.log(`❌ 审批 ${approvalId} 已处理`);
50
+ console.log(` 状态: ${approval.status}`);
51
+ console.log(` 决策: ${approval.decision}`);
52
+ return;
53
+ }
54
+ // 如果没有提供决策,显示审批内容
55
+ if (!options.decision) {
56
+ console.log(`\n📋 审批详情\n`);
57
+ console.log(`ID: ${approval.id}`);
58
+ console.log(`类型: ${approval.type}`);
59
+ console.log(`任务: ${approval.taskId}`);
60
+ console.log(`\n${approval.content}\n`);
61
+ console.log('选项:');
62
+ approval.options.forEach(opt => {
63
+ console.log(` ${opt.key}: ${opt.label}`);
64
+ });
65
+ console.log('\n💡 使用 openmatrix approve <ID> -d <decision>');
66
+ return;
67
+ }
68
+ // 处理决策
69
+ const validDecisions = ['approve', 'modify', 'reject'];
70
+ if (!validDecisions.includes(options.decision)) {
71
+ console.log(`❌ 无效决策: ${options.decision}`);
72
+ console.log(` 有效选项: ${validDecisions.join(', ')}`);
73
+ return;
74
+ }
75
+ await approvalManager.processDecision({
76
+ approvalId,
77
+ decision: options.decision,
78
+ comment: options.comment,
79
+ decidedBy: 'user',
80
+ decidedAt: new Date().toISOString()
81
+ });
82
+ const statusEmoji = options.decision === 'approve' ? '✅' : '❌';
83
+ console.log(`\n${statusEmoji} 审批已处理: ${options.decision}`);
84
+ if (options.decision === 'approve') {
85
+ console.log('\n💡 使用 /om:resume 继续执行任务');
86
+ }
87
+ });
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const meetingCommand: Command;
@@ -0,0 +1,245 @@
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
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.meetingCommand = void 0;
37
+ // src/cli/commands/meeting.ts
38
+ const commander_1 = require("commander");
39
+ const state_manager_js_1 = require("../../storage/state-manager.js");
40
+ const approval_manager_js_1 = require("../../orchestrator/approval-manager.js");
41
+ const path = __importStar(require("path"));
42
+ exports.meetingCommand = new commander_1.Command('meeting')
43
+ .description('查看和处理待确认的 Meeting')
44
+ .argument('[meetingId]', 'Meeting ID (可选)')
45
+ .option('-l, --list', '列出所有待处理 Meeting')
46
+ .option('--action <action>', '操作类型: provide-info, skip, retry, modify, decide, cancel')
47
+ .option('--info <info>', '提供的信息 (用于 provide-info)')
48
+ .option('--message <message>', '备注信息')
49
+ .option('--reason <reason>', '决策理由 (用于 decide)')
50
+ .option('--new-plan <plan>', '新方案 (用于 modify)')
51
+ .option('--skip-all', '跳过所有 Meeting')
52
+ .action(async (meetingId, options) => {
53
+ const basePath = process.cwd();
54
+ const omPath = path.join(basePath, '.openmatrix');
55
+ const stateManager = new state_manager_js_1.StateManager(omPath);
56
+ await stateManager.initialize();
57
+ const approvalManager = new approval_manager_js_1.ApprovalManager(stateManager);
58
+ try {
59
+ // 获取所有 pending 的 meeting
60
+ const pendingApprovals = await stateManager.getApprovalsByStatus('pending');
61
+ const meetings = pendingApprovals.filter(a => a.type === 'meeting');
62
+ // 列出所有 Meeting
63
+ if (options.list || (!meetingId && !options.skipAll)) {
64
+ if (meetings.length === 0) {
65
+ console.log('✅ 没有待处理的 Meeting\n');
66
+ console.log('当前状态:');
67
+ const allApprovals = await stateManager.getApprovalsByStatus('approved');
68
+ const meetingApprovals = allApprovals.filter(a => a.type === 'meeting');
69
+ console.log(` - 已解决: ${meetingApprovals.length}`);
70
+ console.log(` - 总计: ${meetingApprovals.length}`);
71
+ return;
72
+ }
73
+ console.log(`\n📋 待处理 Meeting (${meetings.length}个)\n`);
74
+ meetings.forEach((meeting, index) => {
75
+ const icon = meeting.title.includes('决策') ? '🤔' : '🔴';
76
+ const shortTitle = meeting.title.slice(0, 40);
77
+ console.log(` [${index + 1}] ${icon} ${meeting.id} - ${shortTitle}`);
78
+ console.log(` 任务: ${meeting.taskId}`);
79
+ if (meeting.content) {
80
+ const content = meeting.content.slice(0, 60).replace(/\n/g, ' ');
81
+ console.log(` 详情: ${content}...`);
82
+ }
83
+ console.log('');
84
+ });
85
+ console.log('💡 提示: 使用 /om:meeting <id> 处理指定 Meeting');
86
+ return;
87
+ }
88
+ // 批量跳过
89
+ if (options.skipAll) {
90
+ console.log(`\n⏭️ 批量跳过 ${meetings.length} 个 Meeting...\n`);
91
+ for (const meeting of meetings) {
92
+ await approvalManager.processDecision({
93
+ approvalId: meeting.id,
94
+ decision: 'approve',
95
+ comment: options.message || '批量跳过',
96
+ decidedBy: 'user',
97
+ decidedAt: new Date().toISOString()
98
+ });
99
+ // 更新关联任务状态为 skipped
100
+ const task = await stateManager.getTask(meeting.taskId);
101
+ if (task) {
102
+ await stateManager.updateTask(meeting.taskId, {
103
+ status: 'completed',
104
+ description: `[SKIPPED] ${task.description}`
105
+ });
106
+ }
107
+ console.log(` ✓ ${meeting.id} 已跳过`);
108
+ }
109
+ console.log('\n✅ 所有 Meeting 已处理');
110
+ return;
111
+ }
112
+ // 处理指定 Meeting
113
+ if (!meetingId) {
114
+ console.log('❌ 请指定 Meeting ID 或使用 --list');
115
+ return;
116
+ }
117
+ const meeting = meetings.find(m => m.id === meetingId);
118
+ if (!meeting) {
119
+ console.log(`❌ Meeting ${meetingId} 不存在或已处理`);
120
+ return;
121
+ }
122
+ // 显示 Meeting 详情
123
+ console.log(`\n📋 Meeting: ${meeting.id}`);
124
+ console.log(`🎯 任务: ${meeting.taskId}`);
125
+ console.log(`\n## 详情\n`);
126
+ console.log(meeting.content || '无详细内容');
127
+ console.log('');
128
+ // 执行操作
129
+ const action = options.action;
130
+ if (!action) {
131
+ console.log('💡 可用操作:');
132
+ console.log(' --action provide-info --info "..."');
133
+ console.log(' --action skip --message "..."');
134
+ console.log(' --action retry');
135
+ console.log(' --action modify --new-plan "..."');
136
+ console.log(' --action decide --reason "..."');
137
+ console.log(' --action cancel --message "..."');
138
+ return;
139
+ }
140
+ switch (action) {
141
+ case 'provide-info':
142
+ if (!options.info) {
143
+ console.log('❌ 请提供 --info 参数');
144
+ return;
145
+ }
146
+ await approvalManager.processDecision({
147
+ approvalId: meeting.id,
148
+ decision: 'approve',
149
+ comment: `提供信息: ${options.info}`,
150
+ decidedBy: 'user',
151
+ decidedAt: new Date().toISOString()
152
+ });
153
+ console.log('✅ 信息已记录,任务将恢复执行');
154
+ break;
155
+ case 'skip':
156
+ await approvalManager.processDecision({
157
+ approvalId: meeting.id,
158
+ decision: 'approve',
159
+ comment: options.message || '跳过此任务',
160
+ decidedBy: 'user',
161
+ decidedAt: new Date().toISOString()
162
+ });
163
+ // 标记任务为跳过
164
+ const skipTask = await stateManager.getTask(meeting.taskId);
165
+ if (skipTask) {
166
+ await stateManager.updateTask(meeting.taskId, {
167
+ status: 'completed',
168
+ description: `[SKIPPED] ${skipTask.description}`
169
+ });
170
+ }
171
+ console.log('⏭️ 任务已跳过,下游任务可继续');
172
+ break;
173
+ case 'retry':
174
+ await approvalManager.processDecision({
175
+ approvalId: meeting.id,
176
+ decision: 'reject',
177
+ comment: '重新执行此任务',
178
+ decidedBy: 'user',
179
+ decidedAt: new Date().toISOString()
180
+ });
181
+ // 重置任务状态
182
+ await stateManager.updateTask(meeting.taskId, {
183
+ status: 'retry_queue',
184
+ error: undefined
185
+ });
186
+ console.log('🔄 任务已重置,将重新执行');
187
+ break;
188
+ case 'modify':
189
+ if (!options.newPlan) {
190
+ console.log('❌ 请提供 --new-plan 参数');
191
+ return;
192
+ }
193
+ await approvalManager.processDecision({
194
+ approvalId: meeting.id,
195
+ decision: 'approve',
196
+ comment: `修改方案: ${options.newPlan}`,
197
+ decidedBy: 'user',
198
+ decidedAt: new Date().toISOString()
199
+ });
200
+ // 更新任务描述
201
+ const modifyTask = await stateManager.getTask(meeting.taskId);
202
+ if (modifyTask) {
203
+ await stateManager.updateTask(meeting.taskId, {
204
+ status: 'pending',
205
+ description: `${modifyTask.description}\n\n[MODIFIED] ${options.newPlan}`,
206
+ error: undefined
207
+ });
208
+ }
209
+ console.log('✅ 方案已修改,任务将重新执行');
210
+ break;
211
+ case 'decide':
212
+ await approvalManager.processDecision({
213
+ approvalId: meeting.id,
214
+ decision: 'approve',
215
+ comment: `决策: ${options.reason || '已做出决策'}`,
216
+ decidedBy: 'user',
217
+ decidedAt: new Date().toISOString()
218
+ });
219
+ console.log('✅ 决策已记录');
220
+ break;
221
+ case 'cancel':
222
+ await approvalManager.processDecision({
223
+ approvalId: meeting.id,
224
+ decision: 'reject',
225
+ comment: options.message || '取消此任务',
226
+ decidedBy: 'user',
227
+ decidedAt: new Date().toISOString()
228
+ });
229
+ // 标记任务为失败
230
+ await stateManager.updateTask(meeting.taskId, {
231
+ status: 'failed',
232
+ error: '用户取消'
233
+ });
234
+ console.log('❌ 任务已取消');
235
+ break;
236
+ default:
237
+ console.log(`❌ 未知操作: ${action}`);
238
+ console.log('可用: provide-info, skip, retry, modify, decide, cancel');
239
+ }
240
+ }
241
+ catch (error) {
242
+ console.error('❌ 处理失败:', error instanceof Error ? error.message : error);
243
+ process.exit(1);
244
+ }
245
+ });
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const reportCommand: Command;