@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 +2 -1
- package/agents/codeforge.md +5 -2
- package/commands/parallel.md +25 -104
- package/dist/index.js +1315 -2535
- package/install.mjs +1 -0
- package/package.json +1 -1
- package/workflows/_merge-confirm-semantics.yaml +133 -0
- package/workflows/parallel-explore.yaml +3 -2
- package/commands/parallel-status.md +0 -56
package/install.mjs
CHANGED
|
@@ -272,6 +272,7 @@ function writePluginEntry({ targetRoot }) {
|
|
|
272
272
|
for (const e of data.plugin) {
|
|
273
273
|
const s = String(e)
|
|
274
274
|
if (/\/codeforge\/index\.js$/.test(s)) continue
|
|
275
|
+
if (s === "@andyqiu/codeforge") continue // 删除 npm 包名格式 entry
|
|
275
276
|
if (/\/plugins\/[^/]+\.ts$/.test(s) && /opencode/.test(s)) continue
|
|
276
277
|
if (/\/\.opencode\/plugins\//.test(s)) continue
|
|
277
278
|
cleaned.push(e)
|
package/package.json
CHANGED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# ──────────────────────────────────────────────────────────────
|
|
2
|
+
# _merge-confirm-semantics.yaml
|
|
3
|
+
#
|
|
4
|
+
# ADR:zero-command-worktree-convergence [B1] Decision 7
|
|
5
|
+
#
|
|
6
|
+
# 「对话确认合入」的语义规则集(**规则/配置**,非步骤 DAG)。
|
|
7
|
+
# 文件名以 `_` 前缀 → workflow step-loader 跳过(不当作步骤工作流解析);
|
|
8
|
+
# 由未来 Phase 5 的「user-merge-confirm」plugin 按显式路径读取消费。
|
|
9
|
+
#
|
|
10
|
+
# 铁律 1:工作流/判定逻辑必须 YAML,禁止硬编码进 plugin —— 故确认词判定规则放此处。
|
|
11
|
+
#
|
|
12
|
+
# ⚠ 本批次(第一批)只**定义规则 + 测试**,不启用对话合入主流程(Phase 5 才接线)。
|
|
13
|
+
# 机械底线(chat.message 不可伪造)尚待 P0.4 spike 结论(见
|
|
14
|
+
# docs/spikes/p0.4-chat-message-unforgeable.md);spike 未 pass 前对话合入不上线。
|
|
15
|
+
# ──────────────────────────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
version: 1.0.0
|
|
18
|
+
description: |
|
|
19
|
+
用户对话确认合入/放弃的语义判定规则。两层判定:
|
|
20
|
+
1. plugin 机械层:用本文件的 whitelist/blacklist 正则初筛(AI 无法绕)
|
|
21
|
+
2. codeforge LLM 层:对自然语言做语义判定(处理口语变体)
|
|
22
|
+
两层都判肯定才推进;任一不确定 → fail-closed(NOT_CONFIRMED,重新提问)。
|
|
23
|
+
|
|
24
|
+
# ──────────────────────────────────────────────────────────────
|
|
25
|
+
# 合入确认(merge confirm)
|
|
26
|
+
# ──────────────────────────────────────────────────────────────
|
|
27
|
+
merge_confirm:
|
|
28
|
+
# 算「确认合入」的肯定词(宽松但需明确肯定)。匹配为「包含」语义,大小写不敏感。
|
|
29
|
+
affirmative:
|
|
30
|
+
- "确认合入"
|
|
31
|
+
- "确认合并"
|
|
32
|
+
- "确认"
|
|
33
|
+
- "可以合"
|
|
34
|
+
- "可以合入"
|
|
35
|
+
- "同意合入"
|
|
36
|
+
- "通过,合"
|
|
37
|
+
- "没问题合"
|
|
38
|
+
- "合吧"
|
|
39
|
+
- "合入吧"
|
|
40
|
+
- "行,合"
|
|
41
|
+
- "ok 合"
|
|
42
|
+
- "merge it"
|
|
43
|
+
- "lgtm 合"
|
|
44
|
+
|
|
45
|
+
# 一律不算确认(模糊 / 歧义 / 否定)→ NOT_CONFIRMED(fail-closed)
|
|
46
|
+
ambiguous_or_negative:
|
|
47
|
+
- "看看"
|
|
48
|
+
- "再说"
|
|
49
|
+
- "等下"
|
|
50
|
+
- "先不"
|
|
51
|
+
- "不急"
|
|
52
|
+
- "这个方案不错" # 评价≠确认合入
|
|
53
|
+
- "好的" # 孤立语气词,歧义
|
|
54
|
+
- "嗯"
|
|
55
|
+
- "继续" # 多指继续开发,非合入
|
|
56
|
+
- "还行"
|
|
57
|
+
- "应该可以吧" # 不确定语气
|
|
58
|
+
|
|
59
|
+
# 关键规则:「确认 + 新需求」同句 → NOT_CONFIRMED
|
|
60
|
+
# 理由:用户在同一句里既说「确认」又追加新需求,意图是「先改这个再说」而非「立即合」;
|
|
61
|
+
# 且追加需求会让 coder 改 worktree → HEAD 漂移,旧确认本就该作废。
|
|
62
|
+
# 机械识别启发式(plugin 层):句中命中 affirmative 词,但**同时**命中下列「新需求信号」
|
|
63
|
+
# 之一 → 判 NOT_CONFIRMED,要求用户先把新需求做完、再单独确认。
|
|
64
|
+
confirm_plus_new_request_is_not_confirmed: true
|
|
65
|
+
new_request_signals:
|
|
66
|
+
- "但是"
|
|
67
|
+
- "但" # 「可以合,但先加日志」等转折/附带条件 → 非纯确认(覆盖「但是」无法命中的「但先…」)
|
|
68
|
+
- "不过"
|
|
69
|
+
- "另外"
|
|
70
|
+
- "还要"
|
|
71
|
+
- "再加"
|
|
72
|
+
- "顺便"
|
|
73
|
+
- "改一下"
|
|
74
|
+
- "再改"
|
|
75
|
+
- "加个"
|
|
76
|
+
- "先加" # 「先加日志/先加测试」= 合前还有活要干 → NOT_CONFIRMED
|
|
77
|
+
- "先改"
|
|
78
|
+
- "记得"
|
|
79
|
+
- "把" # 「确认,把 X 改成 Y」典型祈使新需求
|
|
80
|
+
- "before"
|
|
81
|
+
- "but also"
|
|
82
|
+
- "and also"
|
|
83
|
+
|
|
84
|
+
# 确认窗口约束(Phase 5 plugin 强制;本批次仅声明):
|
|
85
|
+
# confirm 记录必须在 codeforge 进入 READY_TO_CONFIRM_MERGE 之后产生,
|
|
86
|
+
# 且绑定 {sessionId, worktreeHeadSha, approvalSha, ts};HEAD 漂移即作废(见 ADR Decision 8)。
|
|
87
|
+
window:
|
|
88
|
+
must_be_after_ready_state: true
|
|
89
|
+
bind_keys: [sessionId, worktreeHeadSha, approvalSha, ts]
|
|
90
|
+
invalidate_on_head_drift: true
|
|
91
|
+
|
|
92
|
+
# ──────────────────────────────────────────────────────────────
|
|
93
|
+
# 放弃确认(discard confirm)—— 比 merge 更高门槛 + 默认 salvage
|
|
94
|
+
# ADR:zero-command-worktree-convergence [B1] Decision 7(discard 部分)
|
|
95
|
+
# ──────────────────────────────────────────────────────────────
|
|
96
|
+
discard_confirm:
|
|
97
|
+
# discard 是不可逆销毁,门槛必须高于 merge:要求明确「否定式确认词」,模糊一律不执行。
|
|
98
|
+
higher_threshold: true
|
|
99
|
+
affirmative:
|
|
100
|
+
- "确认放弃"
|
|
101
|
+
- "删掉重来"
|
|
102
|
+
- "放弃这次改动"
|
|
103
|
+
- "不要了,删掉"
|
|
104
|
+
- "确认丢弃"
|
|
105
|
+
- "确认删除 worktree"
|
|
106
|
+
# 模糊回答一律 NOT_CONFIRMED(不销毁)
|
|
107
|
+
ambiguous_or_negative:
|
|
108
|
+
- "放弃" # 单独「放弃」歧义(可能指放弃某想法),不足以销毁
|
|
109
|
+
- "算了"
|
|
110
|
+
- "不用了"
|
|
111
|
+
- "重来" # 单独「重来」歧义
|
|
112
|
+
|
|
113
|
+
# 默认 salvage:即使确认放弃,也**默认先 salvage 留痕**(建 codeforge/salvage/<sid>-<ts> 分支)
|
|
114
|
+
# 再清 worktree,绝不走「对话式无痕销毁」默认路径。
|
|
115
|
+
# 真正无痕销毁(salvage:false)仅在用户显式要求「不留痕/彻底删干净」时才允许,且需二次确认。
|
|
116
|
+
default_salvage: true
|
|
117
|
+
silent_destruction_requires_explicit_optout: true
|
|
118
|
+
explicit_optout_phrases:
|
|
119
|
+
- "不留痕"
|
|
120
|
+
- "彻底删干净"
|
|
121
|
+
- "不要 salvage"
|
|
122
|
+
- "连备份也删"
|
|
123
|
+
|
|
124
|
+
# ──────────────────────────────────────────────────────────────
|
|
125
|
+
# 强制合入确认(force merge confirm)—— 最高门槛,跳过 reviewer 门但保留用户门
|
|
126
|
+
# ADR:zero-command-worktree-convergence Decision 9(force 部分,后续 Phase 5 接线)
|
|
127
|
+
# ──────────────────────────────────────────────────────────────
|
|
128
|
+
force_merge_confirm:
|
|
129
|
+
# 比普通 confirm 更高摩擦:必须输入特定确认短语,防误触。
|
|
130
|
+
required_phrase: "强制合入 确认"
|
|
131
|
+
warn_before: "将跳过全部 review 直接合入主仓,风险自负。"
|
|
132
|
+
# force 永远不能跳过用户门(门 B);只允许跳过 reviewer 门(门 A)。
|
|
133
|
+
must_pass_user_gate: true
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# DEPRECATED (ADR:parallel-progress-feedback hotfix 2)
|
|
2
2
|
#
|
|
3
|
-
# /parallel 命令已由 plugins/subtasks.ts 直接拦截处理(command.execute.before hook
|
|
4
|
-
#
|
|
3
|
+
# /parallel 命令已由 plugins/subtasks.ts 直接拦截处理(command.execute.before hook);
|
|
4
|
+
# 该命令现已弃用为 deprecation stub(ADR:zero-command-worktree-convergence [A2]),
|
|
5
|
+
# 原 /parallel-status 查询亦已下线,状态改由 session_merge action=status 暴露。
|
|
5
6
|
#
|
|
6
7
|
# 本 workflow 之前作为 fallback 路径存在,dry_run 模式会吐大段 plan JSON 污染父 session;
|
|
7
8
|
# 真跑模式又会和 plugin 路径冲突。当前实现下整个 workflow 已无用。
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: 查询当前 inflight 子任务(subagent)的运行状态
|
|
3
|
-
subtask: false
|
|
4
|
-
adr: 0054
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
<!--
|
|
8
|
-
codeforge 元数据(opencode 不读,由 plugins / workflow-engine 解析):
|
|
9
|
-
name: parallel-status
|
|
10
|
-
version: 1.0.0
|
|
11
|
-
allowed_tools: (无 — 纯查询)
|
|
12
|
-
说明:subtask: false 让命令在主 session 执行(拿 parent context),
|
|
13
|
-
plugins/parallel-status.ts 在 command.execute.before 拦截并回写 markdown。
|
|
14
|
-
-->
|
|
15
|
-
|
|
16
|
-
# /parallel-status — 查询子任务进度
|
|
17
|
-
|
|
18
|
-
随时查询当前正在跑的 `/parallel` 子任务(subagent)状态,复用 subtask-heartbeat 内存 inflight Map。
|
|
19
|
-
|
|
20
|
-
## 用法
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
/parallel-status
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## 输出示例
|
|
27
|
-
|
|
28
|
-
如果有 inflight:
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
📊 当前 3 个 subagent 在跑:
|
|
32
|
-
|
|
33
|
-
| # | child id | parent id | agent | 已跑 | 最近工具 |
|
|
34
|
-
|---|----------|-----------|-------|------|----------|
|
|
35
|
-
| 1 | `ses_xxx1` | `ses_p` | coder | 1m20s | edit |
|
|
36
|
-
| 2 | `ses_xxx2` | `ses_p` | coder | 45s | bash |
|
|
37
|
-
| 3 | `ses_xxx3` | `ses_p` | reviewer | 30s | grep |
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
如果无:
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
✅ 当前无 inflight subagent
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## 行为
|
|
47
|
-
|
|
48
|
-
1. `plugins/parallel-status.ts` 注册 `command.execute.before` hook
|
|
49
|
-
2. 拦截 `command === "parallel-status"`,调 `getInflightSnapshot()` 拿快照
|
|
50
|
-
3. 调纯函数 `formatInflightMarkdown(snapshot)` 生成 markdown
|
|
51
|
-
4. 回写到 `output.parts`,覆盖 .md template 默认内容
|
|
52
|
-
|
|
53
|
-
## 元数据
|
|
54
|
-
|
|
55
|
-
- `subtask`: `false` —— 强制走主 session,避免被 opencode 当 subagent 派发
|
|
56
|
-
- `allowed_tools`: 无(plugin hook 直接接管输出)
|