@andyqiu/codeforge 0.7.4 → 0.7.7

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
@@ -49,7 +49,8 @@ npm install -g @andyqiu/codeforge
49
49
  | `/quick <需求>` | 强制降档用快速模型处理 |
50
50
  | `/changes` | 查看当前 session 的改动摘要 |
51
51
  | `/pause` | 暂停当前任务 |
52
- | `/parallel <任务1>,<任务2>` | 多个独立任务并发跑 |
52
+
53
+ > 并行已成为 codeforge 默认能力(auto-parallel):直接描述多个独立需求即可,codeforge 自动判断并并发到隔离 lane,汇聚后统一走合入闭环——**无需手动 `/parallel`**(旧命令已弃用,过渡期保留一个版本周期,下一 minor 移除)。
53
54
 
54
55
  ### Discover Agent — 虚拟产品经理
55
56
 
@@ -38,7 +38,7 @@ fallback_models:
38
38
  - 必须按下方「能力边界」表的场景分类,先判定再派 —— **不允许"安全起见派 planner"作为默认**(这是 planner 角色再次膨胀的成因)
39
39
  - 派 task 之前,必须用 ≤ 1 句话明文告知用户「即将派 \<agent\> 做 \<一句话任务\>」 —— 让用户在 opencode TUI 出现 Delegating spinner 静默期之前就有文字反馈
40
40
  - **工具调用层并发(Tool-call Concurrency)**:在同一次 LLM response 里,凡**互不依赖的只读操作**(`smart_search` / `repo_map` / `read` / `plan_read`)必须**在同一条消息里同时 emit**,不允许串行等待。只有当后一个工具依赖前一个工具的结果时才允许串行。
41
- - **自动任务并行(Auto-parallel)**:接到复杂任务时,**主动判断**是否有可并行的功能模块——无需用户显式调用 `/parallel`。判断标准:模块间无强依赖(不改同文件 / 无协议传递依赖)且各模块独立可验证时,**自动启动并行执行**。串行只用于真有依赖的步骤。
41
+ - **自动任务并行(Auto-parallel,默认能力)**:接到复杂任务时,**主动判断**是否有可并行的功能模块——并行已是默认能力,**用户无需也不应被要求显式调用 `/parallel`**(该命令已弃用,仅留一个版本周期的 deprecation stub)。判断标准:模块间无强依赖(不改同文件 / 无协议传递依赖)且各模块独立可验证时,**自动启动并行执行**;串行只用于真有依赖的步骤。并行 lane 各自隔离独立 worktree、**永不直入主仓**,汇聚到 aggregator 后统一走合入闭环(ADR:zero-command-worktree-convergence)。
42
42
  - 派 task 的 prompt 必须**自包含**:子 session 不继承父对话;必要的上下文(plan_id / sessionId / 文件路径 / 关键约束)都要写进 prompt
43
43
  - 大方案(≥ 50 行)必须通过 **plan_id 机制**传递:派 planner 时要求它把方案写到 `plan_write`,回报时给出 `plan_id: plan-xxx`(独占一行);派 coder 时只在 prompt 里塞 `plan_id`,让 coder 第一步 `plan_read(plan_id=<id>)` 拿完整方案(同时闭合 session-worktree-guard 的 plan-read hard gate)
44
44
  - 派 coder 写「交付物」时,必须在 prompt 里明示「直接写到 session worktree,final response 不要粘回长内容」
@@ -144,6 +144,8 @@ codeforge 在 session 内维护两个 loop 计数器:
144
144
 
145
145
  **逃生口**:`/merge --force` 跳过 review 闭环直接 squash merge(写审计日志)。
146
146
 
147
+ **合入触发(过渡期)**:当前 `/merge` 仍作为**用户拍板**合入的命令锚点(保留,不删);codeforge 在 APPROVE 后可调 `session_merge action=merge`(ADR:codeforge-merge-permission)。**对话式合入**(用户口头确认即合)是未来方向(Phase 5),其人类确认门受 P0.4 不可伪造性 gate 约束,未落地前不得以"用户说过可以合"替代命令/审批证据(ADR:zero-command-worktree-convergence)。codeforge 始终**不直接写代码**。
148
+
147
149
  ## 工具用法
148
150
 
149
151
  - `smart_search` / `repo_map` / `read` / `plan_read`:只读上下文准备;**互不依赖时必须并发 emit**
@@ -151,7 +153,8 @@ codeforge 在 session 内维护两个 loop 计数器:
151
153
  - `review_approval`:仅用于 **fallback 补写审批记录** —— reviewer 漏调时,codeforge 补写并传 `source: "codeforge-fallback"`(`coveredSha`/`reviewTarget` 工具对 `session:<sid>` id 自动补全,无需手传;ADR:review-approval-auto-covered-sha)
152
154
  - `session_merge`:
153
155
  - `action=diff stat=true session_id=<id>`:**核查某 session worktree 相对 baseSha 的改动文件列表**(用于校验 coder 写入;优先信任 boomerang 的 diff --stat,仅在 boomerang 缺证据时调)。`stat=false` 返回完整 diff
154
- - `action=status session_id=<id>`:查 session worktree 绑定状态(worktree_branch 提取失败时的兜底核查)
156
+ - `action=status session_id=<id>`:查 session worktree 绑定状态(含 salvage / abandoned / pending 可见性汇总;worktree_branch 提取失败时的兜底核查)
157
+ - `action=checkpoint session_id=<id>`:在 session worktree 内幂等提交当前进展(空工作区 skip,返回稳定 HEAD)。codeforge 无 bash 能力,派 lane 前做 aggregator checkpoint 走此合规路径(ADR:zero-command-worktree-convergence B7)
155
158
  - `action=merge`:APPROVE 后合入主仓(见上方 session_merge 前置条件约束)
156
159
  - ⚠️ **绝不用 `read` 主仓验证 coder 改动** —— coder 写在 session worktree,主仓不会变,必误判
157
160
 
@@ -1,124 +1,45 @@
1
1
  ---
2
- description: 把一个大任务拆成 N 个并行子任务,独立 worktree 跑,最后汇总
3
- subtask: true
2
+ description: (已弃用)并行已成为默认能力,由 codeforge 自动判断;本命令将在下一 minor 移除
4
3
  ---
5
4
 
6
5
  <!--
7
6
  codeforge 元数据(opencode 不读,由 plugins / workflow-engine 解析):
8
7
  name: parallel
9
- version: 1.0.0
10
- trigger_workflow: parallel-explore
11
- allowed_tools: smart_search, repo-map
12
- 说明:subtask: true 强制走 opencode 子代理通道,不污染主上下文;agent 由 workflow 控制
13
- ADR-0008(gstack markdown skill)/ ADR-0011(Roo Boomerang Tasks)/ ADR-0054(父 session 反馈通道)
8
+ version: 2.0.0-deprecated-stub
9
+ 说明:ADR:zero-command-worktree-convergence [A2] —— /parallel 降级为一个版本周期 deprecation stub。
10
+ plugins/subtasks.ts command.execute.before 拦截 command==="parallel",
11
+ **不再触发旧 parallel direct-merge 调度**,只回写本弃用提示。
12
+ 旧的 schedule / lane direct-merge 流程已冻结(见 [A2] / Decision 2)。
13
+ 保留一个版本周期降迁移摩擦,下一 minor 由 install.mjs stale prune 删除。
14
14
  -->
15
15
 
16
16
 
17
- # /parallel — N 路并发探索
17
+ # /parallel —(已弃用)
18
18
 
19
- 把一个含糊的需求扔给 **planner**,让它先拆成几个独立子任务,然后由
20
- `plugins/subtasks.ts` `lib/parallel.schedule` **真正并发**跑(每条子
21
- 任务可分配独立 worktree),跑完做冲突检测 + 摘要汇总。
19
+ > ⚠️ **此命令已弃用。** 并行已成为 **codeforge 的默认能力**:你只需正常描述需求,
20
+ > codeforge 会自动判断能否拆分并行(文件不相交 + 无协议依赖 + 可独立验证才并行,
21
+ > 否则串行),无需再手动敲 `/parallel`。
22
22
 
23
- 灵感来自 Cursor Composer 的"8 路并行"。
23
+ ## 现在该怎么做
24
24
 
25
- ## 输入
25
+ 直接把需求告诉 codeforge 即可,例如:
26
26
 
27
- 用户需求:$ARGUMENTS
28
-
29
- ## 用法
30
-
31
- 最简单:把多个子任务用 `;` 或换行分隔。
32
-
33
- ```
34
- /parallel
35
- 实现登录页骨架
36
- 实现注册页骨架
37
- 实现密码重置骨架
38
- ```
39
-
40
- 或单行 `;` 分隔:
41
-
42
- ```
43
- /parallel 改 README; 同步 PRD; 跑测试
44
27
  ```
45
-
46
- 走 workflow(`parallel-explore.yaml`):
47
-
28
+ 把 user-service 重写成 3 种风格做对比
29
+ 实现登录页、注册页、密码重置三个独立骨架
48
30
  ```
49
- /parallel 把 user-service 重写成 3 种风格做对比
50
- ```
51
-
52
- planner 会先出 3 路子任务方案,subtasks 并发执行,reviewer 汇总报最终选型。
53
-
54
- ## 行为
55
-
56
- 1. 解析后面的描述(`\n` / `;` / `|` 都识别),构造 `SubtaskSpec[]`
57
- 2. 触发 `parallel-explore` workflow(如果加载成功);否则降级走 plugin 直接调度
58
- 3. 每条子任务:
59
- - 拿到独立 worktree(如果 deps 提供)
60
- - 运行(默认 mock;真实环境由 opencode runtime 注入 agent runner)
61
- - 失败完全隔离,不影响其他子任务
62
- 4. 全部跑完做:
63
- - 冲突检测(两个子任务改了同一文件 → 标红)
64
- - digest 摘要(success / failed / need_review / cancelled / timeout)
65
- 5. 通过 `reply` 把 markdown 摘要回写给用户
66
-
67
- ## 参数
68
-
69
- | 字段 | 类型 | 默认 | 说明 |
70
- |---|---|---|---|
71
- | `args.subtasks` | `SubtaskSpec[]` | — | 结构化子任务(优先级最高) |
72
- | `args.description` | `string` | — | 自由文本,自动按 `\n;\|` 拆 |
73
- | `args.parentId` | `string` | `task-<ts>` | 父任务 id,影响子任务命名 |
74
- | `args.maxConcurrency` | `1..16` | 4 | 并发上限 |
75
- | `args.totalTimeout_ms` | ≥1000 | 30 分钟 | 全局超时 |
76
31
 
77
- ## 失败回退
32
+ codeforge 会:
78
33
 
79
- - runner 未注入 → 用内置 mock runner,仅打印描述(验证调度链路本身能通)
80
- - workflow 加载失败 plugins/subtasks 直接调度
81
- - `lib/parallel.schedule` 抛错 reply ❌ 错误信息,不冒泡到主流程
34
+ 1. 自动评估可并行性,按需拆分为独立 lane(各自隔离 worktree,**永不直入主仓**)。
35
+ 2. 汇聚 lane 改动到 aggregator。
36
+ 3. 经双门(reviewer APPROVE + 用户确认)后才合入主仓。
82
37
 
83
- ## 元数据
84
-
85
- - `agent`: 不指定 —— 由 parallel-explore.yaml 控制 agent 切换
86
- - `subtask`: `true` —— opencode 原生字段,强制走子代理通道
87
- - `trigger_workflow`: `parallel-explore`
88
-
89
- ## 反馈通道(ADR-0054)
90
-
91
- `/parallel` 执行期间,父 session 会看到 4 类结构化文字反馈:
92
-
93
- 1. **派出**:`🚀 /parallel 已派出 N 个子任务(并发=K)...` + 子任务清单
94
- 2. **启动**:每个子任务跑起来时 `▶ 子任务 i/N 启动: <id> — <description>`
95
- 3. **完成**:每个子任务结束时 `<emoji> 子任务 i/N 完成 [status] <id> (Xms, files=Y)`
96
- - ✅ success / ⚠ need_review / ⏱ timeout / 🗑 cancelled / ❌ failed
97
- 4. **总结**:所有子任务完成后吐既有的 digest(成功/失败/冲突)
98
-
99
- 这些文字用 `synthetic+ignored+noReply` 三件套追加到 `session.messages`,
100
- **用户可见但 LLM 不读**(不污染父 session 上下文)。
101
-
102
- ### 随时查进度
103
-
104
- 跑 `/parallel-status` 立刻看当前 inflight subagent:
105
-
106
- ```
107
- /parallel-status
108
-
109
- 📊 当前 2 个 subagent 在跑:
110
- | # | child id | parent id | agent | 已跑 | 最近工具 |
111
- |---|----------|-----------|-------|------|----------|
112
- | 1 | `ses_xxx1...` | `ses_yyy...` | coder | 1m20s | edit |
113
- ```
114
-
115
- 或没有时:
116
-
117
- ```
118
- ✅ 当前无 inflight subagent
119
- ```
38
+ ## 迁移说明
120
39
 
121
- ### 失败降级
40
+ - 本 `/parallel` 命令保留 **一个版本周期** 作为过渡 stub,**不会**再触发旧的
41
+ parallel direct-merge 调度(该路径已冻结,避免绕过 review 直入主仓)。
42
+ - 下一个 minor 版本将彻底移除本命令(`install.mjs` stale prune 自动清理用户目录残留)。
43
+ - 查看 worktree / lane 状态:用 `session_merge action=status`(已含 salvage / abandoned / pending 汇总)。
122
44
 
123
- 如果 opencode SDK 太老(< v1.15)或 `promptAsync` 不可用,notice 会静默 noop(log warn)——
124
- 此时退化到原有行为(只有最终 digest)。`/parallel-status` 不受影响(纯内存查询)。
45
+ 详见 ADR:zero-command-worktree-convergence。