msdevflow 0.6.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.
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "msdevflow",
3
+ "version": "0.6.0",
4
+ "description": "Install the msdevflow GitCode skill and its runtime dependencies",
5
+ "type": "module",
6
+ "bin": {
7
+ "msdevflow": "bin/msdevflow.js"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "lib/",
12
+ "skill/",
13
+ "!skill/msdevflow/scripts/test_openlibing_ci.py"
14
+ ],
15
+ "scripts": {
16
+ "check": "node --check bin/msdevflow.js && node --check lib/bootstrap.js",
17
+ "test": "node --test"
18
+ },
19
+ "engines": {
20
+ "node": ">=18"
21
+ },
22
+ "keywords": [
23
+ "agent-skills",
24
+ "gitcode",
25
+ "setup"
26
+ ],
27
+ "license": "UNLICENSED"
28
+ }
@@ -0,0 +1,365 @@
1
+ # msdevflow
2
+
3
+ 通用 GitCode Issue 到 PR 合入 workflow skill。它保留一个统一 skill,通过显式 `action` 单独执行某一部分;未指定 `action` 时,按远端和本地证据运行完整作者端到端流程。
4
+
5
+ ## 1. Action 模型
6
+
7
+ 支持:
8
+
9
+ | action | 能力 | 完成后行为 |
10
+ |---|---|---|
11
+ | `discover` | 只读发现候选 Issue | 列出候选和排除证据后停止 |
12
+ | `create-issue` | 按仓库或 community 模板创建 Issue | 回读确认 `issue-created` 后停止 |
13
+ | `issue` | 接取并核验指定 Issue | 到 `verified` 后停止 |
14
+ | `develop` | 分析、设计、建分支、实现和本地验证 | 到 `locally-verified` 后停止 |
15
+ | `pr` | commit、push、创建普通 PR | 到 `pr-open` 后停止 |
16
+ | `ci` | 监控、诊断和修复当前 PR 的 CI | 当前 head 全绿后停止 |
17
+ | `openlibing-auth` | 自动选择当前 canonical 的 run 并验证 OAuth | 只读验证成功后停止 |
18
+ | `feedback` | 处理自己 PR 收到的检视意见 | 意见闭环并验证后停止 |
19
+ | `code-review` | 完整检视他人的 PR | 有 finding 时发布意见;无问题时经确认发送 `/lgtm` |
20
+ | `merge` | 核验门禁并在最终确认后合入 | merged、waiting 或 blocked 后停止 |
21
+
22
+ 显式 action 遵循两个硬边界:
23
+
24
+ 1. 只执行自身,完成后立即停止,不自动进入下游 action;
25
+ 2. 前置条件不足时只做必要的只读核验,然后返回 `blocked` 和建议的上游 action,不自动补跑。
26
+
27
+ 例如,`action=ci` 发现 PR 不存在时,只建议 `action=pr`,不会自行 commit、push 或创建 PR。openLiBing 返回 401/403 时运行 OAuth 是读取当前 CI 证据的必要子流程,不视为进入下游 action;认证成功后继续当前 `ci` 或 E2E 流程。
28
+
29
+ ## 2. 完整作者 E2E
30
+
31
+ 未指定 `action` 时,从环境、CLI 能力和仓库画像开始运行完整流程:
32
+
33
+ ```text
34
+ discover -> issue -> develop -> pr -> ci
35
+ \-> openlibing-auth(openLiBing 401/403 时作为认证子流程,成功后返回 ci)
36
+ -> waiting-for-review
37
+ -> feedback -> ci -> waiting-for-review (可重复)
38
+ -> approved -> merge-confirmed -> merged
39
+ ```
40
+
41
+ “从头运行”表示从 Phase 0 重新读取权威事实,不表示重复执行已完成动作。workflow 会根据 Issue、PR、当前 head、CI、comments、reviews 和本地 Git 幂等跳过已有证据的步骤。
42
+
43
+ 完整作者流程不会调用 `code-review`。
44
+
45
+ ## 3. 普通 PR 与外部检视
46
+
47
+ `action=pr` 创建普通 PR:
48
+
49
+ - 不创建 Draft PR;
50
+ - 不存在 Ready 转换;
51
+ - 不主动请求检视;
52
+ - 不触发检视机器人。
53
+
54
+ 当前 head CI 通过后,PR 即处于可由外部 reviewer 检视的状态。没有现有检视意见或独立审批时,完整流程暂停为 `waiting-for-review`;后续可恢复完整流程,或显式运行 `action=feedback`。
55
+
56
+ ## 4. 调用示例
57
+
58
+ ### 未指定 action:完整 E2E
59
+
60
+ ```text
61
+ /msdevflow
62
+ 处理 https://gitcode.com/Ascend/example/issues/123。
63
+ 本地仓库:D:\work\example
64
+ canonical:Ascend/example
65
+ Fork:myname/example
66
+ 使用 guided 模式,推进到满足门禁后合入。
67
+ ```
68
+
69
+ ### 只发现候选 Issue
70
+
71
+ ```text
72
+ /msdevflow action=discover
73
+ 查询 Ascend/example 中分配给当前账号的开放 Issue,列出仍需处理的候选。
74
+ ```
75
+
76
+ `discover` 全程只读,不接取、不评论、不建分支。
77
+
78
+ ### 只创建 Issue
79
+
80
+ ```text
81
+ /msdevflow action=create-issue
82
+ 在 Ascend/example 提一个 bug:升级后首次启动失败,错误信息和环境如下……
83
+ 使用 guided 模式,先给我完整预览,确认后再创建。
84
+ ```
85
+
86
+ 本 action 从 canonical 最新默认分支的 `.gitcode/` 递归寻找匹配类型的 `.yml`、`.yaml` 或 `.md` Issue 模板;只有该类型不存在时,才回退到 `Ascend/community@master:.gitcode/.gitcode/ISSUE_TEMPLATE/` 的同类型模板。仓库匹配模板无效时阻断,不回退;类型或同类型模板无法唯一确定时让用户选择。它根据自然语言填充字段,缺少必填信息时逐项询问,创建前展示目标、模板 ref/path、标题、完整正文和元数据。
87
+
88
+ `create-issue` 不执行重复 Issue/PR 查找。确认创建后使用 UTF-8 安全通道并逐字回读;到 `issue-created` 后立即停止,不接取、不开发。需要继续处理时显式运行 `action=issue`。
89
+
90
+ ### 只接取和核验 Issue
91
+
92
+ ```text
93
+ /msdevflow action=issue
94
+ 处理 https://gitcode.com/Ascend/example/issues/123。
95
+ 本地仓库:D:\work\example
96
+ ```
97
+
98
+ 显式 `action=issue` 必须指定 Issue URL 或编号;缺失时返回 `blocked`,不会退化为 `discover`。
99
+
100
+ ### 只开发和本地验证
101
+
102
+ ```text
103
+ /msdevflow action=develop
104
+ Issue:https://gitcode.com/Ascend/example/issues/123
105
+ 本地仓库:D:\work\example
106
+ ```
107
+
108
+ 它要求 Issue 已核验;完成后不 commit、不 push、不创建 PR。
109
+
110
+ ### 只创建 PR
111
+
112
+ ```text
113
+ /msdevflow action=pr
114
+ Issue:https://gitcode.com/Ascend/example/issues/123
115
+ 本地仓库:D:\work\example
116
+ canonical:Ascend/example
117
+ source:myname/example
118
+ ```
119
+
120
+ 它要求实现和本地门禁已有证据;创建普通 PR 后立即停止。
121
+
122
+ ### 只处理 CI
123
+
124
+ ```text
125
+ /msdevflow action=ci
126
+ PR:https://gitcode.com/Ascend/example/pulls/456
127
+ 本地仓库:D:\work\example
128
+ ```
129
+
130
+ CI 通过后立即停止,不处理 feedback 或 merge。识别为 openLiBing 且只读 API 返回 401/403 时,可自动安装 Python Playwright 依赖并打开已有的系统 Chrome/Edge 或 Playwright Chromium,认证成功后继续本 action;不会自动下载浏览器,浏览器不可用时输出可复制的 OAuth 链接并停止为 `blocked: browser-required`。可用 `autonomous-ci` 只授权同一 PR 上根因明确的最小 CI 修复循环。
131
+
132
+ ### 只验证 openLiBing OAuth
133
+
134
+ ```text
135
+ /msdevflow action=openlibing-auth
136
+ 本地仓库:D:\work\example
137
+ ```
138
+
139
+ 本 action 从当前工作区唯一识别 canonical,只在该仓库内按“当前分支关联 PR → 最近开放 PR → 最近合入 PR”的顺序选择一个包含 openLiBing run 的验证目标,不要求用户提供 PR。它可自动安装 Python Playwright 依赖,并使用已有的系统 Chrome/Edge 或 Playwright Chromium打开可见窗口;不会自动下载浏览器。用户亲自完成 GitCode 登录和授权。浏览器不可用时输出可复制的 OAuth 链接并停止为 `blocked: browser-required`;人工浏览器登录不等于验证完成。只有 OAuth 后对固定 run 的真实只读请求成功才完成,随后立即停止,不进入 `ci`。
140
+
141
+ 它不读取或输出 GitCode Token。openLiBing Token 只驻留当前 Python 进程,固定显示为 `redacted`;持久化的只有受管专用 profile 中的 GitCode 浏览器登录态。
142
+
143
+ ### 只处理自己 PR 的意见
144
+
145
+ ```text
146
+ /msdevflow action=feedback
147
+ PR:https://gitcode.com/Ascend/example/pulls/456
148
+ 本地仓库:D:\work\example
149
+ ```
150
+
151
+ 没有现有意见时直接停止为 `waiting-for-review`,不请求检视。修改产生新 head 时,本 action 完成受影响本地测试、commit、push、逐条回复和 resolve 后停止,并建议 `action=ci`;不会在内部继续运行远端 CI。
152
+
153
+ ### 检视他人的 PR
154
+
155
+ ```text
156
+ /msdevflow action=code-review
157
+ PR:https://gitcode.com/Ascend/example/pulls/789
158
+ ```
159
+
160
+ 本 action 只检视当前账号之外的作者所提交的 open、非 Draft/WIP PR;自审返回 `blocked: self-review-forbidden`。它固定当前 head,读取完整权威 diff、全部 changed files、必要上下文、关联 Issue、仓库规范和结构化 discussions,默认不 checkout、不执行 PR head 脚本、不修改代码。
161
+
162
+ 只发布由本 PR 引入或暴露、证据充分且可操作的 finding;已有 discussion 已覆盖的问题不重复发布。有 finding 或仍有效的未解决意见时不发送 `/lgtm`。完整覆盖且未发现需要作者修改的问题时,先展示带 `——msdevflow` 的检视摘要和后续精确 payload;获得针对当前 PR/head 的明确确认后,先发布并逐字回读摘要,再独立发送正文恰好为 `/lgtm` 的评论。`/lgtm` 不加尾签,不代表 `/approve`、CI 通过或允许合入。本 action 不发送 `/approve`、`/merge`,也不替作者回复或 resolve discussion。
163
+
164
+ ### 只核验并合入
165
+
166
+ ```text
167
+ /msdevflow action=merge
168
+ PR:https://gitcode.com/Ascend/example/pulls/456
169
+ ```
170
+
171
+ 显式 `action=merge` 不等于授权直接合入。workflow 仍会重新读取当前 head、CI、discussion 和独立审批门禁,并在执行最终合入前请求针对当前 PR 的明确确认。
172
+
173
+ ## 5. 前置条件
174
+
175
+ 需要:
176
+
177
+ - Claude Code 或其他兼容 Agent Skills 的客户端;
178
+ - `git`;
179
+ - GitCode 官方 npm CLI;
180
+ - GitCode CLI 已认证;
181
+ - 本地已有目标仓库,或允许克隆;
182
+ - 对目标 Issue、Fork、分支和 PR 具备相应权限。
183
+
184
+ workflow 使用环境探测或独立 setup 成功结果确定的命令:
185
+
186
+ ```text
187
+ 没有 Python gitcode -> <gitcode-command> = gitcode
188
+ 已有 Python gitcode -> 保留它,<gitcode-command> = gitcode-npm
189
+ ```
190
+
191
+ 来源不明时不会覆盖。选定命令在整个 run 中保持不变。
192
+
193
+ 先检查:
194
+
195
+ ```bash
196
+ <gitcode-command> version
197
+ <gitcode-command> auth status
198
+ git --version
199
+ ```
200
+
201
+ 标准 setup 会在未认证时自动运行:
202
+
203
+ ```bash
204
+ <gitcode-command> auth login --web
205
+ ```
206
+
207
+ 用户只在 GitCode CLI 打开的官方浏览器页面完成登录。不要把 Token 粘贴到对话、setup、README、项目文件或命令 URL 中;如需手动恢复认证,也优先在自己的终端运行同一 `--web` 命令。
208
+
209
+ ## 6. 安装
210
+
211
+ npm 包同时携带 `msdevflow` skill 和 setup 程序。标准安装只需要:
212
+
213
+ ```bash
214
+ npx msdevflow setup
215
+ ```
216
+
217
+ `setup` 先展示 skill 目标、安装或更新状态、GitCode CLI 归属、registry、安装模式、Python 依赖命令和认证方式;用户确认后,在同一次运行中:
218
+
219
+ 1. 安装或更新 `~/.claude/skills/msdevflow`;
220
+ 2. 安装或升级官方 GitCode npm CLI;
221
+ 3. 安装内置 `scripts/requirements.txt` 中的 Python Playwright 包;
222
+ 4. 验收 workflow 所需 schema/API;
223
+ 5. CLI 未认证时运行选定命令的 `auth login --web`。
224
+
225
+ 可选只读预检:
226
+
227
+ ```bash
228
+ npx msdevflow setup --dry-run
229
+ ```
230
+
231
+ 自定义 skills 目录时使用:
232
+
233
+ ```bash
234
+ npx msdevflow setup --skills-dir "<skills-directory>"
235
+ ```
236
+
237
+ npm 包尚未发布时,可从当前源码/发布目录运行等价入口:
238
+
239
+ ```bash
240
+ node ./msdevflow/bin/msdevflow.js setup
241
+ ```
242
+
243
+ `setup` 不下载或启动 Chromium。凭证只由 GitCode CLI 和官方浏览器流程接收与保存;setup 不读取、输出或转存 Token,也不要求用户把 Token 传给 Agent。已有 skill 目标只有 manifest 明确标识为 `msdevflow` 时才允许更新,来源不明的目录、文件或符号链接会被拒绝覆盖。安装后建议重新启动 Claude Code 会话。
244
+
245
+ ## 7. 仓库画像和 PR 模板
246
+
247
+ 完整 E2E 和需要仓库规则的显式 action 会读取适用的 `AGENTS.md`、`CLAUDE.md`、`CONTRIBUTING*`、README、OWNERS/CODEOWNERS、CI、pre-commit 和测试配置。
248
+
249
+ PR 模板只取自 canonical repository 最新默认分支:
250
+
251
+ 1. 仓库文档明确指定的路径;
252
+ 2. `.gitcode/PULL_REQUEST_TEMPLATE.md`;
253
+ 3. `.gitcode/PULL_REQUEST_TEMPLATE/*.md`;
254
+ 4. `.github/PULL_REQUEST_TEMPLATE.md`;
255
+ 5. `.github/PULL_REQUEST_TEMPLATE/*.md`;
256
+ 6. 仓库根目录或 `docs/` 下的 `PULL_REQUEST_TEMPLATE.md`。
257
+
258
+ 不从个人 Fork、工作分支或未提交文件读取模板。同级多模板无法唯一选择时请求确认;没有模板时使用:背景与关联 Issue、变更内容、验证、风险与回滚、未覆盖项。
259
+
260
+ ## 8. 执行模式
261
+
262
+ ### guided:默认模式
263
+
264
+ 远端写和关键决策按动作确认,包括创建 Issue 的最终预览、接取、方案、首次 push、创建 PR、未授权 CI 修复、discussion 回复、`code-review` finding 发布和最终 merge。检视未发现问题时,无论 guided 或 autonomous,都必须针对当前 PR/head 明确确认带尾签摘要和精确 `/lgtm`。
265
+
266
+ ### autonomous
267
+
268
+ 必须绑定具体 canonical、Issue、source、branch 和目标。它不授权范围变化、force push、审批或最终合入。
269
+
270
+ ### autonomous-ci
271
+
272
+ 只授权同一 PR 上与已确认根因直接相关的 CI 修复、验证、新 commit、push 和重跑。它不授权创建 PR、处理 feedback、审批或合入。
273
+
274
+ 无论模式如何,最终 merge 始终需要用户针对当前 PR 再次明确确认。
275
+
276
+ ## 9. Action 恢复与幂等
277
+
278
+ 每个显式 action 启动时都会重新读取自身所需事实,不依赖前一个 action 的会话摘要。恢复会读取:
279
+
280
+ - 本地工作树、分支、HEAD、remotes 和未推送 commits;
281
+ - Issue、关联 PR、PR source/head/base;
282
+ - 当前 head SHA 和对应 CI;
283
+ - comments、结构化 discussions、reviews 和 merge 状态。
284
+
285
+ 创建 PR、评论、CI 触发、reply、resolve 和 merge 前都会检查远端是否已有等价动作。`create-issue` 不做产品查重,只在创建结果不确定时按本次标题、完整正文、账号、目标和启动时间有界恢复。`code-review` finding 按 PR、固定 head、reviewer、path/position 和完整正文去重;检视通过按 PR、固定 head、reviewer、带尾签摘要和精确 `/lgtm` 去重,旧 head 的结论不证明当前 head 已检视。所有写操作超时或连接中断时都先查询远端事实,不直接重试。
286
+
287
+ 显式 action 完成时输出:
288
+
289
+ ```text
290
+ action
291
+ current state and evidence
292
+ current head
293
+ blocker
294
+ suggested next action
295
+ confirmation required
296
+ ```
297
+
298
+ 建议下一个 action 只是提示,不会自动执行。
299
+
300
+ ## 10. 中文和远端正文
301
+
302
+ 所有人类可读远端文本通过显式 UTF-8 通道写入。Windows PowerShell 5.1 不把含中文正文裸管道给原生 CLI;优先生成 UTF-8 无 BOM 临时文件并使用 `--body-file`/`--comment-file`。
303
+
304
+ 非 ASCII PR/Issue 标题不经 `.cmd` wrapper 的字符串参数直接传递,改用由 CLI 管理凭证的 UTF-8 JSON 文件 API。每次写入后从 GitCode 逐字回读标题和完整正文;发现乱码、`?`、截断、尾签缺失或重复时先原地修复,在验证通过前不执行依赖动作。
305
+
306
+ Agent 写入的正文末尾与主体间隔一个空行并恰好包含一次:
307
+
308
+ ```markdown
309
+ ——msdevflow
310
+ ```
311
+
312
+ 裸 `compile`、`/lgtm`、`/merge` 等严格机器 payload 保持原样;先通过 UTF-8 安全通道发布并逐字回读带唯一尾签的独立人类可读说明,再发送机器命令。
313
+
314
+ ## 11. 安全边界
315
+
316
+ skill 禁止:
317
+
318
+ - 读取或打印 GitCode Token;
319
+ - 输出、转存或持久化 openLiBing Token;该 Token 只允许在当前认证进程内短暂使用;
320
+ - 把 Token 放入 URL、项目文件、记忆或对话;
321
+ - 从 GitCode CLI 配置提取 Token 后调用 curl;
322
+ - 使用 `--no-verify` 跳过 hooks;
323
+ - 用盲目重跑代替 CI 根因修复;
324
+ - 默认 force push 或重写共享历史;
325
+ - 作者自行制造 LGTM/approve;独立 `code-review` 只能由非作者 reviewer 对固定 head 执行;
326
+ - 在门禁未满足时合入;
327
+ - 因 CLI 不支持命令而假装操作完成;
328
+ - 让显式 action 隐式执行上游或下游 action。
329
+
330
+ ## 12. CLI 版本兼容
331
+
332
+ 使用命令前优先执行:
333
+
334
+ ```bash
335
+ <gitcode-command> schema "<command>"
336
+ ```
337
+
338
+ 显式 action 只要求自身所需能力。降级顺序:
339
+
340
+ ```text
341
+ typed CLI command
342
+ -> 其他 CLI JSON 能力
343
+ -> <gitcode-command> api(仍由 CLI 管理凭证)
344
+ -> 网页人工步骤
345
+ -> blocked
346
+ ```
347
+
348
+ 不会读取 Token 或直接 curl 绕过 CLI 能力缺失。结构化 comments、reply 或 resolve 缺失时,相关步骤明确降级为人工操作或 blocked。
349
+
350
+ ## 13. 相关文件
351
+
352
+ - [SKILL.md](SKILL.md):action 路由、完整作者 E2E 和全局不变量。
353
+ - [references/setup-and-issue.md](references/setup-and-issue.md):`discover`、`issue`、公共环境与仓库画像。
354
+ - [references/create-issue.md](references/create-issue.md):`create-issue` 的模板发现、字段生成、确认、创建和回读。
355
+ - [references/design-and-development.md](references/design-and-development.md):`develop`。
356
+ - [references/pr-and-ci.md](references/pr-and-ci.md):`pr`、`ci`。
357
+ - [references/openlibing-ci.md](references/openlibing-ci.md):`openlibing-auth` 和 openLiBing CI OAuth 子流程。
358
+ - [references/review-and-merge.md](references/review-and-merge.md):`feedback`、`merge`。
359
+ - [references/code-review.md](references/code-review.md):独立 reviewer 检视、finding 和 `/lgtm`。
360
+ - [references/recovery.md](references/recovery.md):action 恢复、幂等和报告。
361
+ - [references/state-and-safety.md](references/state-and-safety.md):授权、UTF-8、尾签和安全契约。
362
+ - [references/command-capabilities.md](references/command-capabilities.md):CLI 能力适配。
363
+ - [references/ci-and-review.md](references/ci-and-review.md):CI 和作者 discussion 深层规则。
364
+ - [scripts/openlibing_ci.py](scripts/openlibing_ci.py):openLiBing 只读诊断与交互 OAuth 客户端。
365
+ - [scripts/test_openlibing_ci.py](scripts/test_openlibing_ci.py):openLiBing 无凭证控制流测试。
@@ -0,0 +1,125 @@
1
+ ---
2
+ name: msdevflow
3
+ description: >
4
+ 通用 GitCode Issue 到 PR 合入工作流。未指定 action 时,从环境与仓库画像开始,按远端和本地证据幂等推进完整作者流程;也支持通过 action=discover、create-issue、issue、develop、pr、ci、openlibing-auth、feedback、code-review 或 merge 只执行单个能力。适用于发现、新建或接取 GitCode Issue、开发并创建 PR、处理 CI、验证 openLiBing OAuth、处理自己 PR 的检视意见、检视他人 PR,以及在独立审批和显式确认后合入。仅适用于已授权的 GitCode 仓库。
5
+ metadata:
6
+ version: 1.9.0
7
+ source: msdevflow
8
+ ---
9
+
10
+ # msdevflow:GitCode Issue 到 PR 合入
11
+
12
+ 把 GitCode 工作拆成可显式调用的 action,同时保留未指定 action 时的完整作者 E2E 编排。先探测仓库规范和 CLI 能力,不硬编码组织、默认分支、CI、分支命名、合并方式或机器人协议。
13
+
14
+ ## Action 路由
15
+
16
+ 只识别显式参数 `action=<name>`。未知 action 停止并列出有效值,不做远端写入。
17
+
18
+ | action | 目标 | 主要输入 | 完成后立即停止于 | 必读文件 |
19
+ |---|---|---|---|---|
20
+ | `discover` | 只读发现候选 Issue | 仓库范围或当前工作区 | 候选和排除证据已列出 | [references/setup-and-issue.md](references/setup-and-issue.md) |
21
+ | `create-issue` | 按仓库或 community 模板创建 Issue | canonical、问题描述或类型 | `issue-created` | [references/create-issue.md](references/create-issue.md);公共启动读 [references/setup-and-issue.md](references/setup-and-issue.md) |
22
+ | `issue` | 接取并核验指定 Issue | Issue URL/编号、canonical | `verified` | [references/setup-and-issue.md](references/setup-and-issue.md) |
23
+ | `develop` | 分析、设计、建分支、实现和本地验证 | 已核验 Issue、本地仓库 | `locally-verified` | [references/design-and-development.md](references/design-and-development.md) |
24
+ | `pr` | commit、push 并创建普通 PR | 已实现分支、Issue、canonical/source | `pr-open` | [references/pr-and-ci.md](references/pr-and-ci.md) |
25
+ | `ci` | 监控、诊断并修复当前 PR 的 CI | canonical PR | `ci-passed` | [references/pr-and-ci.md](references/pr-and-ci.md);失败时读 [references/ci-and-review.md](references/ci-and-review.md) |
26
+ | `openlibing-auth` | 验证 GitCode → openLiBing OAuth | 当前工作区 canonical | `openlibing-authenticated` | [references/openlibing-ci.md](references/openlibing-ci.md) |
27
+ | `feedback` | 处理自己 PR 收到的检视意见 | canonical PR 及可写 source branch | `feedback-resolved` 或 `waiting-for-review` | [references/review-and-merge.md](references/review-and-merge.md);结构化 discussion 时读 [references/ci-and-review.md](references/ci-and-review.md) |
28
+ | `code-review` | 检视他人的 PR,发布 finding 或 `/lgtm` | 他人 PR | `review-findings`、`review-passed`、`review-incomplete`、`waiting` 或 `blocked` | [references/code-review.md](references/code-review.md) |
29
+ | `merge` | 核验门禁并在最终确认后合入 | canonical PR | `merged`、`waiting` 或 `blocked` | [references/review-and-merge.md](references/review-and-merge.md) |
30
+
31
+ `code-review` 只能显式调用,永不进入作者 E2E,不得检视或批准当前账号自己的 PR。它固定当前 head,完整检视权威 diff、必要上下文和既有 discussions:有高置信度问题时发布经确认且逐字回读的 finding,不发送 `/lgtm`;没有问题、没有有效未解决意见且覆盖完整时,在针对当前 PR/head 明确确认后先发布带尾签摘要,再原样发送 `/lgtm`。它不发送 `/approve`、`/merge`,不修改作者代码。
32
+
33
+ ## 显式 action 契约
34
+
35
+ 1. 只执行指定 action;达到完成条件后立即停止,只报告证据、当前 head、blocker 和建议的下一个 action。
36
+ 2. 启动时只读重建该 action 所需事实,不相信旧摘要、旧 head 或调用方声称的阶段已完成。
37
+ 3. 前置条件缺失时不得自动执行上游 action;只读核验后返回 `blocked`、缺失证据和建议的上游 action。
38
+ 4. 不执行下游 action。例如 `action=ci` 通过后不得处理 feedback 或 merge;`action=pr` 创建 PR 后不得自动触发 CI。
39
+ 5. action 自身为安全完成所必需的复验属于本 action:例如 `pr` 在提交前重新运行适用本地门禁,`feedback` 修改后运行受影响本地测试。这不授权执行独立的下游 `ci`、补做缺失的产品实现或扩大范围。
40
+ 6. `ci` 和完整 E2E 在 openLiBing 只读接口返回 401/403 时可运行 OAuth 认证子流程并恢复原流程;这是读取当前 CI 证据的必要步骤,不视为越界执行显式 `openlibing-auth` action。
41
+ 7. 所有远端写仍遵循 guided/autonomous 授权、UTF-8、尾签、幂等和最终 merge 确认规则。
42
+
43
+ ## 未指定 action:完整作者 E2E
44
+
45
+ 未提供 `action` 时,从 Phase 0 环境、CLI 能力和仓库画像开始运行完整流程;“从头开始”只表示重新读取事实,不表示重复创建资源或重复评论。按证据幂等跳过已完成步骤:
46
+
47
+ ```text
48
+ discover -> issue -> develop -> pr -> ci
49
+ -> waiting-for-review
50
+ -> feedback -> ci -> waiting-for-review (可重复)
51
+ -> approved -> merge-confirmed -> merged
52
+ ```
53
+
54
+ - 用户已给出 Issue 时无需先列候选,但仍执行环境、仓库画像和 Issue 核验。
55
+ - 已有 PR 时仍补做最小充分的 Phase 0 仓库画像,再从权威 PR/head/CI/review 状态定位当前位置。
56
+ - `pr` 创建普通 PR,不创建 Draft PR,不存在 Ready 转换。
57
+ - 不请求检视、不触发检视机器人;当前 head CI 通过且无现有意见或独立审批时,暂停为 `waiting-for-review`。
58
+ - 有未解决意见时进入 `feedback`;产生新 head 后重新进入 `ci`。
59
+ - 独立审批门禁满足后才可进入 `merge`,最终合入始终需要用户针对当前 PR 明确确认。
60
+ - `code-review` 永不被完整作者 E2E 调用。
61
+
62
+ ## 公共启动与渐进式加载
63
+
64
+ 1. 固定 `gitcode_command`:无 Python 同名工具时为 `gitcode`;有 Python `gitcode` 时保留它并使用 `gitcode-npm`。来源不明时停止,不覆盖。
65
+ 2. 检查当前目录;若不是 Git 仓库,自动探测直接子目录中的 Git 仓库及 remotes。
66
+ 3. 确认 canonical repository、source repository、operation target、当前账号和授权范围。
67
+ 4. 除纯只读 `discover` 外,显式 action 先从 [references/setup-and-issue.md](references/setup-and-issue.md) 只读取公共环境、仓库上下文和最小充分仓库画像,不执行其中的 Issue 接取业务;随后只加载该 action 对应 reference 及实际触发的深层规则。`create-issue` 的模板选择和写入只按 [references/create-issue.md](references/create-issue.md),不执行候选发现或既有 Issue 核验。`code-review` 只使用公共只读画像和 [references/code-review.md](references/code-review.md),不加载作者 feedback/merge 规则。未指定 action 也只按当前位置渐进加载。
68
+ 5. CLI 缺失、命令不兼容或版本不足时读 [references/command-capabilities.md](references/command-capabilities.md),停止当前 action 并提示用户运行独立 setup;setup 成功后恢复原 action。
69
+ 6. 进入 autonomous、远端写、危险动作或恢复时读 [references/state-and-safety.md](references/state-and-safety.md)。
70
+ 7. 中断恢复、写结果不确定或最终报告时读 [references/recovery.md](references/recovery.md)。
71
+ 8. 显式 `openlibing-auth` 直接加载 [references/openlibing-ci.md](references/openlibing-ci.md);CI 失败或结构化 discussion 处理时读 [references/ci-and-review.md](references/ci-and-review.md),识别为 openLiBing 后再加载专用适配器。
72
+
73
+ 所有示例中的 `<gitcode-command>` 都替换为本次固定值,整个 run 不得混用。
74
+
75
+ ## 作者流程状态
76
+
77
+ ```text
78
+ discovered -> claimed -> verified -> analyzed -> designed
79
+ -> branched -> implemented -> locally-verified -> pr-open
80
+ -> ci-passed -> waiting-for-review
81
+ -> feedback-pending -> feedback-resolved -> ci-passed
82
+ -> approved -> merge-confirmed -> merged
83
+ ```
84
+
85
+ 任一状态可进入 `blocked`。状态晋级必须有远端或本地证据,不能只依据先前文本声明。`issue-created` 和 `openlibing-authenticated` 是独立 action 的完成状态,不改变作者主流程的业务阶段;`issue-created` 不自动进入 `claimed`,`openlibing-authenticated` 也只作为 `ci`/E2E 的条件性认证子状态。`review-findings`、`review-passed` 和 `review-incomplete` 仅属于独立 `code-review`,按 reviewer 与固定 `review_head_sha` 绑定,不进入作者状态机。
86
+
87
+ ## 全局不变量
88
+
89
+ - 始终区分 canonical repository、source repository 和 operation target;所有远端写显式指定目标仓。
90
+ - 候选发现只依据 Issue 元数据、评论和关联 PR;用户选定后、开发前再核验默认分支和重复实现。
91
+ - 从最新 canonical 基线建工作分支,禁止直接在默认分支开发。
92
+ - 真实运行适用测试、lint、pre-commit、构建、安全和 UI 验证;未运行项必须披露。
93
+ - CI 成功必须绑定当前 head SHA;不以盲目重试代替根因分析。
94
+ - 每条未解决的行内 discussion 都要判断、处理、验证、线程内回复,并在允许时 resolve。
95
+ - 作者不得冒充 reviewer/approver,不得自行制造 LGTM/approved 门禁。
96
+ - 不读取、打印或转存 GitCode Token。openLiBing OAuth Token 只允许在当前认证进程内短暂使用,不打印、不落盘、不写入 URL、命令、记忆或对话。
97
+ - 不跳过 hooks/测试/CI/review,不默认 force push、关闭 Issue、删除分支或重写共享历史。
98
+ - 创建 Issue/PR、评论、触发 CI、resolve 和 merge 前检查幂等状态;`create-issue` 不做产品查重,只在写结果不确定时有界恢复;其他写结果不确定时也先回读。
99
+ - Agent 写入 GitCode 的 PR 正文、Issue/PR 评论、discussion 回复和其他人类可读正文必须按 [references/state-and-safety.md](references/state-and-safety.md) 在末尾恰好附加一次 `——msdevflow`。
100
+ - 所有人类可读远端文本必须通过 UTF-8 安全通道写入并逐字回读;发现乱码、`?`、截断或尾签损坏时阻断依赖动作,先原地修复。
101
+ - 严格机器协议 payload 保持原样;使用已验证且带尾签的独立人类可读说明评论,不把尾签拼进 `compile`、`/lgtm`、`/merge` 等命令。
102
+ - 只有回读确认 PR 已合入,才能声称端到端完成。
103
+
104
+ ## 执行模式与确认
105
+
106
+ 默认 `guided`。用户可授权绑定具体 canonical、Issue、source、branch 和目标的 `autonomous`,或只覆盖同一 PR CI 修复循环的 `autonomous-ci`。
107
+
108
+ 无论模式如何,范围或公共行为变化、凭证或安全问题、门禁绕过、force push、审批、合并、新权限、破坏性动作或事实冲突都必须停止。最终 merge 始终需要用户针对当前 PR 明确确认;`code-review` 的检视通过结论和精确 `/lgtm` 也始终需要用户针对当前 PR 与 `review_head_sha` 明确确认。
109
+
110
+ ## Action 完成条件
111
+
112
+ - `discover`:查询范围、候选和排除证据已报告,无远端写入。
113
+ - `create-issue`:按确认的仓库或同类型 community 模板创建一个 Issue,远端回读确认目标、标题、完整正文、唯一尾签和元数据逐项一致;不执行查重、接取或开发。
114
+ - `issue`:接取状态按授权完成或确认可继续,Issue、关联 PR 和 canonical 默认分支已核验,无重复开发。
115
+ - `develop`:范围和方案已确认,工作分支基于最新 canonical,任务实现且适用本地门禁有实际证据。
116
+ - `pr`:普通 canonical PR 回读确认 source/head/base、Issue 关联、标题和正文正确。
117
+ - `ci`:当前 head SHA 的必需 CI 全绿;openLiBing 要求认证时,OAuth 子流程已验证并继续当前 CI。
118
+ - `openlibing-auth`:在当前 canonical 内确定性选择并固定一个 openLiBing run,交互 OAuth 后对该 run 的只读请求成功;只持久化专用 GitCode 浏览器会话,Token 未输出或落盘。浏览器不可用时只输出 OAuth 链接并停止为 `blocked: browser-required`,不算完成。
119
+ - `feedback`:调用时已有的阻塞 discussion 已逐条处理、回复并在允许时 resolve;代码修改已通过受影响本地测试并推送。若产生新 head,停止并建议 `action=ci`,不在本 action 内运行远端 CI;没有现有意见时停止为 `waiting-for-review`。
120
+ - `code-review`:固定当前 head 完整检视他人 PR;有高置信度问题时发布逐字回读的 finding 并停止于 `review-findings`;无问题且无有效未解决意见时,经当前 PR/head 明确确认后发布带尾签摘要和精确 `/lgtm`,远端回读后停止于 `review-passed`;覆盖不足时停止于 `review-incomplete`,不得发送 `/lgtm`。
121
+ - `merge`:当前 head 门禁满足且用户确认后,远端回读 `merged` 并记录 merge SHA/时间;否则返回 `waiting` 或 `blocked`。
122
+
123
+ ## 输出
124
+
125
+ 每次暂停或结束只报告:`action`、当前状态、已完成证据、当前 head、blocker、建议的下一个 action 和需用户确认的动作。最终报告格式按 [references/recovery.md](references/recovery.md) 输出。
@@ -0,0 +1,129 @@
1
+ # CI 与检视闭环
2
+
3
+ ## CI 适配器发现
4
+
5
+ 按以下顺序确定 CI 行为:
6
+
7
+ 1. CONTRIBUTING、PR 模板、CI 配置和仓库文档;
8
+ 2. 同仓库近期已合入 PR 的 labels/comments/checks;
9
+ 3. GitCode CLI 可查询的 pipeline/check/status;
10
+ 4. 维护者明确说明。
11
+
12
+ 不要把一个仓库的 `compile`、label 或机器人协议迁移到另一个仓库。
13
+
14
+ 若评论/文档明确为 openLiBing,按需加载 [openlibing-ci.md](openlibing-ci.md);先用 GitCode 评论定位 run/job,再尝试只读 detail/log API。401/403 时,显式 `action=ci` 和完整 E2E 都直接进入安全 OAuth 子流程,允许自动安装 Python Playwright 依赖并打开已有的系统 Chrome/Edge 或 Playwright Chromium,但不自动下载浏览器;成功后恢复原 CI 诊断,浏览器不可用时输出 OAuth 链接并停止为 `blocked: browser-required`。不得把 GitCode Actions 当作 openLiBing。
15
+
16
+ 记录适配器:
17
+
18
+ ```yaml
19
+ trigger: automatic | comment | cli | external | none
20
+ trigger_value: compile-or-command
21
+ status_source: checks | labels | comments | external
22
+ running_values: []
23
+ passed_values: []
24
+ failed_values: []
25
+ log_source: cli | comment-link | external-tool
26
+ required_gates: []
27
+ ```
28
+
29
+ ## CI 状态机
30
+
31
+ ```text
32
+ idle -> triggered -> running -> passed
33
+ \-> failed -> diagnosed -> fixed -> pushed -> idle
34
+ \-> blocked
35
+ ```
36
+
37
+ 运行键为 `canonical + PR number + head SHA`。新 push 产生新 head,旧 head 的成功不能作为当前通过证据。若触发器是精确评论命令,必须先按 [state-and-safety.md](state-and-safety.md) 通过 UTF-8 安全通道发布带唯一尾签的独立人类可读说明评论,逐字回读完整正文和尾签通过后,再原样单独发送并回读触发 payload;不能把尾签拼进命令。
38
+
39
+ ## 失败诊断
40
+
41
+ 输出:pipeline/run、head SHA、失败 stage/job、首个直接错误、相关日志、根因分类、本地复现、修复和验证。
42
+
43
+ 根因分类:
44
+
45
+ - 当前改动直接导致;
46
+ - 当前改动触发的连带失败;
47
+ - canonical 基线问题;
48
+ - CI 基础设施;
49
+ - 权限/资源;
50
+ - 证据不足。
51
+
52
+ 只有日志或对照实验支持时才能归类为基线/基础设施。重复触发不是诊断。
53
+
54
+ ## 自动修复边界
55
+
56
+ `autonomous-ci` 仅允许修复与已确认根因直接相关的最小范围。每轮:
57
+
58
+ 1. 修改;
59
+ 2. 本地复现和受影响门禁通过;
60
+ 3. 新 commit,不 amend;
61
+ 4. push 同一 source branch;
62
+ 5. 获取新 head SHA;
63
+ 6. 幂等触发或等待自动 CI;
64
+ 7. 记录结果。
65
+
66
+ 范围变化、无法复现、连续失败指向不同根因、安全问题或需新权限时 blocked。
67
+
68
+ ## 检视评论数据
69
+
70
+ 优先使用权威 PR diff 和结构化评论字段:
71
+
72
+ ```text
73
+ id
74
+ comment_type
75
+ discussion_id
76
+ path/diff_file
77
+ position/diff_position
78
+ resolved
79
+ body
80
+ replies
81
+ commit/head SHA
82
+ ```
83
+
84
+ 只用关键词筛选会误判。字段缺失时,关键词只能辅助判断,不能假装获得 discussion/resolved 状态。
85
+
86
+ ## 意见分类
87
+
88
+ - blocking/P0:必须修复或由 reviewer 明确撤回;
89
+ - high/P1:原则上修复;
90
+ - medium/P2:合理则修,可有依据地延期;
91
+ - suggestion/P3:按范围决定;
92
+ - clarification:先问清;
93
+ - invalid:用代码/spec/测试证据说明不采纳。
94
+
95
+ 多个 discussion 指向同一问题时可合并实现,但每个 discussion 都要独立回复。
96
+
97
+ ## 每条 discussion 的闭环
98
+
99
+ 1. 回读当前评论与 current head;
100
+ 2. 判断合理性和处理方式;
101
+ 3. 修改并验证,或形成不采纳/延期依据;
102
+ 4. push 后获取 commit SHA;
103
+ 5. 通过 UTF-8 安全通道在线程内回复,并按 [state-and-safety.md](state-and-safety.md) 附加唯一尾签:
104
+ - 已修复:说明行为和 commit;
105
+ - 部分采纳:说明采纳与未采纳边界;
106
+ - 延期:原因、后续跟踪方式;
107
+ - 不采纳:spec/代码/测试依据;
108
+ 6. 统一换行为 `\n` 后逐字比较完整远端回复与预期正文,并验证末尾恰好存在一次尾签;发现 `?`、乱码、截断、尾签缺失、重复或其他不一致时先原地修复,未修复前不得 resolve;
109
+ 7. 正文回读通过后,仓库规则允许且权限具备时 resolve,再回读确认 `resolved=true`;
110
+ 8. 产生新 head 时,显式 `action=feedback` 停止并建议 `action=ci`;未指定 action 的完整作者 E2E 由编排器随后路由到 `ci`。
111
+
112
+ 不要只发一条总体总结替代逐条回复。汇总应在逐条闭环后发布。
113
+
114
+ ## 审批与合入门禁
115
+
116
+ 普通 PR 在当前 head CI 通过后可供外部检视;LGTM/approve 是独立 reviewer/approver 动作,merge 是高影响远端动作。作者 Agent 不得请求检视、触发检视机器人或自行生成 reviewer 身份的 LGTM/approve。
117
+
118
+ 合入检查必须绑定当前 head:
119
+
120
+ ```text
121
+ open && mergeable
122
+ current_head == ci_passed_head
123
+ required_checks_passed
124
+ blocking_discussions_resolved
125
+ independent_review_gates_passed
126
+ user_confirmed_current_pr_merge
127
+ ```
128
+
129
+ 项目若由机器人或维护者合入,只有门禁满足且用户已明确确认当前 PR 最终合入后,才触发仓库明确记录的协议;如果 `/merge` 可能最终自动合入,也属于最终 merge 动作,只能在 `action=merge` 或完整作者 E2E 的 merge 阶段发送。人类可读说明必须通过 UTF-8 安全通道发送并附加唯一尾签,逐字回读完整正文和尾签通过后才继续;精确协议命令按 [state-and-safety.md](state-and-safety.md) 使用已验证且带唯一尾签的独立说明评论,并保持原 payload。触发后有界监控并回读结果,不得同时直接 merge。