@mycodemap/mycodemap 0.1.0 → 0.1.1
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/CHANGELOG.md +86 -6
- package/README.md +172 -80
- package/dist/cli/commands/cycles.d.ts.map +1 -1
- package/dist/cli/commands/cycles.js +2 -0
- package/dist/cli/commands/cycles.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +3 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/logs.d.ts +5 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +189 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/report.d.ts +12 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +158 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/watch-foreground.d.ts.map +1 -1
- package/dist/cli/commands/watch-foreground.js +2 -0
- package/dist/cli/commands/watch-foreground.js.map +1 -1
- package/dist/cli/commands/watch.d.ts.map +1 -1
- package/dist/cli/commands/watch.js +2 -0
- package/dist/cli/commands/watch.js.map +1 -1
- package/dist/cli/first-run-guide.d.ts +23 -0
- package/dist/cli/first-run-guide.d.ts.map +1 -0
- package/dist/cli/first-run-guide.js +83 -0
- package/dist/cli/first-run-guide.js.map +1 -0
- package/dist/cli/index.js +63 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/platform-check.d.ts +21 -0
- package/dist/cli/platform-check.d.ts.map +1 -0
- package/dist/cli/platform-check.js +94 -0
- package/dist/cli/platform-check.js.map +1 -0
- package/dist/cli/tree-sitter-check.d.ts +35 -0
- package/dist/cli/tree-sitter-check.d.ts.map +1 -0
- package/dist/cli/tree-sitter-check.js +133 -0
- package/dist/cli/tree-sitter-check.js.map +1 -0
- package/dist/cli/utils/sanitize.d.ts +54 -0
- package/dist/cli/utils/sanitize.d.ts.map +1 -0
- package/dist/cli/utils/sanitize.js +131 -0
- package/dist/cli/utils/sanitize.js.map +1 -0
- package/docs/AI_ASSISTANT_SETUP.md +743 -0
- package/docs/CI_GATEWAY_DESIGN.md +784 -0
- package/docs/OMC_TEAM_DEBUG_REPORT.md +285 -0
- package/docs/PUBLISH_NPM_DESIGN_FINAL.md +485 -0
- package/docs/REFACTOR_ARCHITECTURE_OVERVIEW.md +552 -0
- package/docs/REFACTOR_CONFIDENCE_DESIGN.md +244 -0
- package/docs/REFACTOR_GIT_ANALYZER_DESIGN.md +785 -0
- package/docs/REFACTOR_ORCHESTRATOR_DESIGN.md +1065 -0
- package/docs/REFACTOR_REQUIREMENTS.md +970 -0
- package/docs/REFACTOR_RESULT_FUSION_DESIGN.md +315 -0
- package/docs/REFACTOR_TEST_LINKER_DESIGN.md +311 -0
- package/docs/SETUP_GUIDE.md +407 -0
- package/docs/archive/AI_INTEGRATION_GUIDE_ARCHIVED.md +385 -0
- package/docs/archive/PUBLISH_NPM_DESIGN_V1.md +1693 -0
- package/docs/archive/PUBLISH_NPM_DESIGN_V2.md +390 -0
- package/docs/archive/TASK_DESIGN_COVERAGE_REPORT.md +314 -0
- package/docs/plans/POST_TASK_PLAN.md +129 -0
- package/docs/plans/archive/2026-03-03-deps-path-extension-fix.md +186 -0
- package/examples/README.md +61 -0
- package/examples/claude/codemap-skill.md +94 -0
- package/examples/codex/codemap-agent.md +66 -0
- package/examples/copilot/copilot-instructions.md +24 -0
- package/examples/kimi/codemap-skill.md +92 -0
- package/package.json +5 -3
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
# OMC Team 模式与 Claude Code 不兼容问题分析报告
|
|
2
|
+
|
|
3
|
+
> 生成时间:2026-03-07
|
|
4
|
+
> 分析范围:OMC team 模式 + Claude Code 集成
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 问题现象
|
|
9
|
+
|
|
10
|
+
### 1.1 观察到的症状
|
|
11
|
+
|
|
12
|
+
从 trace 数据显示:
|
|
13
|
+
- **worker-1**: spawn 了 **11 次**
|
|
14
|
+
- **worker-2**: spawn 了 **3 次**
|
|
15
|
+
- 主 session 在 16:08 结束,reason: "other"
|
|
16
|
+
|
|
17
|
+
### 1.2 影响
|
|
18
|
+
|
|
19
|
+
- 资源快速耗尽(内存、进程)
|
|
20
|
+
- Claude Code 主进程可能因资源压力退出
|
|
21
|
+
- 任务完成状态不稳定
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 2. 根本原因分析
|
|
26
|
+
|
|
27
|
+
### 2.1 架构问题:V1 Runtime 的 Watchdog 循环
|
|
28
|
+
|
|
29
|
+
**问题位置**: `runtime.ts:518-647` (watchdogCliWorkers 函数)
|
|
30
|
+
|
|
31
|
+
**问题描述**:
|
|
32
|
+
```
|
|
33
|
+
watchdog tick 循环逻辑:
|
|
34
|
+
1. 检查 workers 的 done.json 信号
|
|
35
|
+
2. 如果有信号 -> markTaskFromDone -> killWorkerPane -> spawnWorkerForTask (如果有 pending 任务)
|
|
36
|
+
3. 如果 worker 死了 -> applyDeadPaneTransition -> requeue -> spawnWorkerForTask
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Bug**: 当任务完成后,watchdog 会立即 spawn 新的 worker 来执行其他 pending 任务。这导致:
|
|
40
|
+
- Worker 刚完成就被 kill
|
|
41
|
+
- 立即创建新 worker
|
|
42
|
+
- 如果任务列表只有 1 个任务,也会反复创建同一个 worker
|
|
43
|
+
|
|
44
|
+
### 2.2 状态同步问题
|
|
45
|
+
|
|
46
|
+
**问题**: `markTaskFromDone()` 更新任务状态为 completed,但可能存在:
|
|
47
|
+
- 文件系统写入延迟
|
|
48
|
+
- 状态读取不一致
|
|
49
|
+
- 导致 `allTasksTerminal()` 错误判断
|
|
50
|
+
|
|
51
|
+
### 2.3 Session 管理问题
|
|
52
|
+
|
|
53
|
+
**观察**:
|
|
54
|
+
- Session 在 16:08 结束 (reason: "other")
|
|
55
|
+
- Workers 在 16:07 完成后反复重建
|
|
56
|
+
- 主 session 可能因资源压力或错误退出
|
|
57
|
+
|
|
58
|
+
### 2.4 Claude Code 原生 team 集成问题
|
|
59
|
+
|
|
60
|
+
从 config.json 可见:
|
|
61
|
+
- Workers 使用 `in-process` backend (`"backendType": "in-process"`)
|
|
62
|
+
- 这意味着 workers 运行在同一个 Claude Code 进程内
|
|
63
|
+
- 当 worker 完成后返回结果时,可能触发主进程重新 spawn
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 3. 具体问题点
|
|
68
|
+
|
|
69
|
+
### 问题 1: Watchdog 立即重新分配任务
|
|
70
|
+
|
|
71
|
+
**代码位置**: `runtime.ts:559-565`
|
|
72
|
+
```typescript
|
|
73
|
+
if (signal) {
|
|
74
|
+
// ... 处理完成信号
|
|
75
|
+
await killWorkerPane(runtime, wName, active.paneId);
|
|
76
|
+
if (!(await allTasksTerminal(runtime))) {
|
|
77
|
+
const nextTaskIndexValue = await nextPendingTaskIndex(runtime);
|
|
78
|
+
if (nextTaskIndexValue != null) {
|
|
79
|
+
await spawnWorkerForTask(runtime, wName, nextTaskIndexValue); // 立即 spawn!
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**问题**: 任务完成后立即 spawn 新 worker,没有给主 session 任何喘息机会
|
|
86
|
+
|
|
87
|
+
### 问题 2: Worker 复用逻辑缺失
|
|
88
|
+
|
|
89
|
+
**代码位置**: `runtime.ts:421-426`
|
|
90
|
+
```typescript
|
|
91
|
+
const maxConcurrentWorkers = agentTypes.length;
|
|
92
|
+
for (let i = 0; i < maxConcurrentWorkers; i++) {
|
|
93
|
+
const taskIndex = await nextPendingTaskIndex(runtime);
|
|
94
|
+
if (taskIndex == null) break;
|
|
95
|
+
await spawnWorkerForTask(runtime, workerName(i), taskIndex);
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**问题**: 每次都创建新的 workerName,而不是复用已有的 worker
|
|
100
|
+
|
|
101
|
+
### 问题 3: In-Process Workers 的状态管理
|
|
102
|
+
|
|
103
|
+
**代码位置**: config.json
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"backendType": "in-process"
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**问题**: in-process workers 完成后会返回结果给主 agent,这可能触发某种重新调度的 hook,导致反复 spawn
|
|
111
|
+
|
|
112
|
+
### 问题 4: 缺乏资源限制
|
|
113
|
+
|
|
114
|
+
**问题**: 没有机制限制:
|
|
115
|
+
- 单个 worker 的最大执行时间
|
|
116
|
+
- 总 worker spawn 次数
|
|
117
|
+
- 内存使用上限
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 4. 修复方案
|
|
122
|
+
|
|
123
|
+
### 4.1 方案 A: 启用 V2 Runtime (推荐)
|
|
124
|
+
|
|
125
|
+
**原理**: V2 runtime 使用事件驱动架构,避免轮询问题
|
|
126
|
+
|
|
127
|
+
**操作**:
|
|
128
|
+
```bash
|
|
129
|
+
export OMC_RUNTIME_V2=1
|
|
130
|
+
# 然后重新运行 team
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**预期效果**:
|
|
134
|
+
- 更稳定的任务状态管理
|
|
135
|
+
- 事件驱动而非轮询
|
|
136
|
+
- 减少不必要的 worker 重建
|
|
137
|
+
|
|
138
|
+
### 4.2 方案 B: 修复 V1 Runtime
|
|
139
|
+
|
|
140
|
+
#### B.1 添加冷却期
|
|
141
|
+
|
|
142
|
+
**修改位置**: `runtime.ts:559-565`
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
// 在 killWorkerPane 后添加延迟
|
|
146
|
+
await killWorkerPane(runtime, wName, active.paneId);
|
|
147
|
+
|
|
148
|
+
// 添加冷却期,避免立即重新 spawn
|
|
149
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
150
|
+
|
|
151
|
+
if (!(await allTasksTerminal(runtime))) {
|
|
152
|
+
// ... existing logic
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
#### B.2 添加 Worker 池机制
|
|
157
|
+
|
|
158
|
+
**修改位置**: `runtime.ts` - 新增 worker 池状态
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
interface WorkerPool {
|
|
162
|
+
availableWorkers: string[]; // 可复用的 worker 名称
|
|
163
|
+
activeWorkers: Map<string, ActiveWorkerState>;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// 在 spawnWorkerForTask 中复用
|
|
167
|
+
async function spawnWorkerForTask(...) {
|
|
168
|
+
// 先检查池中是否有可用 worker
|
|
169
|
+
if (runtime.workerPool.availableWorkers.length > 0) {
|
|
170
|
+
const reusableWorkerName = runtime.workerPool.availableWorkers.pop();
|
|
171
|
+
// 复用该 worker
|
|
172
|
+
}
|
|
173
|
+
// 否则创建新 worker
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
#### B.3 添加资源限制
|
|
178
|
+
|
|
179
|
+
**修改位置**: `runtime.ts` - 新增限制配置
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
const MAX_WORKER_SPAWNS = 20; // 最多 spawn 次数
|
|
183
|
+
const WORKER_COOLDOWN_MS = 3000; // 冷却期
|
|
184
|
+
|
|
185
|
+
// 在 watchdog 中跟踪 spawn 次数
|
|
186
|
+
let workerSpawnCount = 0;
|
|
187
|
+
|
|
188
|
+
async function spawnWorkerForTask(...) {
|
|
189
|
+
if (workerSpawnCount >= MAX_WORKER_SPAWNS) {
|
|
190
|
+
console.warn('[watchdog] Max worker spawn limit reached');
|
|
191
|
+
return '';
|
|
192
|
+
}
|
|
193
|
+
workerSpawnCount++;
|
|
194
|
+
// ... existing logic
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 4.3 方案 C: 修复 Claude Code 集成
|
|
199
|
+
|
|
200
|
+
#### C.1 修改 worker hook 逻辑
|
|
201
|
+
|
|
202
|
+
**修改位置**: `src/hooks/team-worker-hook.ts`
|
|
203
|
+
|
|
204
|
+
确保 worker 完成后:
|
|
205
|
+
1. 写入 done.json
|
|
206
|
+
2. **不自动退出** (等待主 session 指示)
|
|
207
|
+
3. 进入空闲状态等待新任务
|
|
208
|
+
|
|
209
|
+
#### C.2 添加状态一致性检查
|
|
210
|
+
|
|
211
|
+
**修改位置**: `runtime.ts:allTasksTerminal()`
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
export async function allTasksTerminal(runtime: TeamRuntime): Promise<boolean> {
|
|
215
|
+
const root = stateRoot(runtime.cwd, runtime.teamName);
|
|
216
|
+
|
|
217
|
+
// 多次重试读取确保一致性
|
|
218
|
+
for (let retry = 0; retry < 3; retry++) {
|
|
219
|
+
let allTerminal = true;
|
|
220
|
+
for (let i = 0; i < runtime.config.tasks.length; i++) {
|
|
221
|
+
const task = await readTask(root, String(i + 1));
|
|
222
|
+
if (!task) return false; // 任务文件不存在
|
|
223
|
+
if (task.status !== 'completed' && task.status !== 'failed') {
|
|
224
|
+
allTerminal = false;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (allTerminal) return true;
|
|
228
|
+
await new Promise(r => setTimeout(r, 100)); // 等待状态稳定
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 5. 实施建议
|
|
237
|
+
|
|
238
|
+
### 优先级
|
|
239
|
+
|
|
240
|
+
| 优先级 | 修复项 | 难度 | 预期效果 |
|
|
241
|
+
|--------|--------|------|----------|
|
|
242
|
+
| P0 | 启用 V2 Runtime | 低 | 立即改善 |
|
|
243
|
+
| P1 | 添加冷却期 | 中 | 减少频繁重建 |
|
|
244
|
+
| P2 | Worker 池机制 | 高 | 根本解决 |
|
|
245
|
+
| P3 | 资源限制 | 中 | 防止资源耗尽 |
|
|
246
|
+
|
|
247
|
+
### 验证方法
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
# 1. 检查 OMC_RUNTIME_V2 是否启用
|
|
251
|
+
echo $OMC_RUNTIME_V2
|
|
252
|
+
|
|
253
|
+
# 2. 运行 team 并监控 spawn 次数
|
|
254
|
+
/team 3:executor "test task"
|
|
255
|
+
|
|
256
|
+
# 3. 观察日志中 worker spawn 次数
|
|
257
|
+
# 修复前: worker-1 spawn 11 次
|
|
258
|
+
# 修复后: worker-1 spawn 1-2 次
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 6. 附录:相关代码位置
|
|
264
|
+
|
|
265
|
+
| 文件 | 说明 |
|
|
266
|
+
|------|------|
|
|
267
|
+
| `src/team/runtime.ts` | V1 runtime 核心逻辑 |
|
|
268
|
+
| `src/team/runtime-v2.ts` | V2 runtime (事件驱动) |
|
|
269
|
+
| `src/hooks/team-worker-hook.ts` | Worker 生命周期 hook |
|
|
270
|
+
| `src/hooks/team-leader-nudge-hook.ts` | 主 session 状态 hook |
|
|
271
|
+
| `src/team/tmux-session.ts` | tmux 会话管理 |
|
|
272
|
+
| `src/team/task-file-ops.ts` | 任务文件操作 |
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## 7. 结论
|
|
277
|
+
|
|
278
|
+
OMC team 模式与 Claude Code 不兼容的主要原因是:
|
|
279
|
+
|
|
280
|
+
1. **V1 runtime 的 watchdog 逻辑缺陷** - 任务完成后立即重新 spawn worker
|
|
281
|
+
2. **缺乏 worker 复用机制** - 每次都创建新 worker
|
|
282
|
+
3. **资源限制缺失** - 没有防止无限 spawn 的保护
|
|
283
|
+
4. **In-process workers 状态同步问题** - 主进程可能因资源压力退出
|
|
284
|
+
|
|
285
|
+
**推荐优先尝试方案 A (启用 V2 Runtime)**,这是最简单且最可能立即见效的方案。
|