msdevflow 0.7.8 → 0.8.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) [year] [fullname]
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -32,7 +32,7 @@ npx msdevflow@latest setup
32
32
  1. 把一个 `msd` 核心和十个 `msd-<action>` 路由器作为整套事务原子安装或更新到所需目标;
33
33
  2. 安装或升级官方 `@gitcode-cli/cli@latest`;
34
34
  3. 创建或修复 msdevflow 受管 Python venv,并在其中安装受审的 Playwright 依赖;
35
- 4. 验收 Issue、PR、结构化评论、行内评论、JSON、显式仓库和正文文件等 CLI 能力;
35
+ 4. 验收 Issue、PR、开放里程碑分页、Issue/PR 里程碑关联、结构化评论、行内评论、JSON、显式仓库和正文文件等 CLI 能力;
36
36
  5. GitCode CLI 未认证时打开官方 Token 创建页面,并让 CLI 自己的终端提示接收 Token。
37
37
 
38
38
  显式选择客户端或只读预检:
@@ -118,7 +118,7 @@ Issue 发现/核验
118
118
  -> 远端回读 PR 已 merged
119
119
  ```
120
120
 
121
- 调用正文可提供 Issue/PR URL、仓库路径、canonical、source 和模式。核心 `msd` 不显示运行时 Question 菜单。
121
+ 调用正文可提供 Issue/PR URL、仓库路径、canonical、source 和模式。核心 `msd` 不显示运行时 Question 菜单;完整 E2E 在 `pr-open` 后不再询问是否继续,直接进入 `ci`。
122
122
 
123
123
  这是可暂停、可恢复的流程。外部检视或审批有新进展后,可再次提交 `/msd` 和 PR 信息:
124
124
 
@@ -137,10 +137,10 @@ Claude Code/OpenCode 输入 `/msd-`、Codex 输入 `$msd-` 即可筛选十个独
137
137
  | action | 用途 | 完成状态或结果 |
138
138
  |---|---|---|
139
139
  | `discover` | 只读发现当前账号负责的候选 Issue | 列出候选和排除证据 |
140
- | `create-issue` | 按仓库或 community 模板创建 Issue | `issue-created` |
140
+ | `create-issue` | 按模板创建 Issue,并确定性选择开放里程碑 | `issue-created` |
141
141
  | `issue` | 接取并核验指定 Issue | `verified` |
142
142
  | `develop` | 分析、设计、实现和本地验证 | `locally-verified` |
143
- | `pr` | commit、push 并创建普通 PR | `pr-open` |
143
+ | `pr` | commit、push、创建普通 PR并继承 Issue 里程碑 | `pr-open` |
144
144
  | `ci` | 监控、诊断并修复当前 PR 的 CI | `ci-passed` |
145
145
  | `openlibing-auth` | 验证 GitCode → openLiBing OAuth | `openlibing-authenticated` |
146
146
  | `feedback` | 处理自己 PR 收到的检视意见 | `feedback-resolved` 或 `waiting-for-review` |
@@ -166,11 +166,14 @@ PR:https://gitcode.com/Ascend/example/pulls/456
166
166
  PR:https://gitcode.com/Ascend/example/pulls/789
167
167
  ```
168
168
 
169
- `code-review` 只能检视其他作者的 PR。发现问题时发布高置信度、可操作的 finding;完整检视未发现问题且没有有效未解决意见时,经用户针对当前 PR/head 明确确认后,先发布带签名摘要,再独立评论精确的 `/lgtm`。它不发送 `/approve` 或 `/merge`,也不修改作者代码。
169
+ `code-review` 只能检视其他作者的 PR。发现问题时只发布高置信度、可操作的 finding;完整检视未发现问题且没有有效未解决意见时,经用户针对当前 PR/head 明确确认后,只评论并回读精确的 `/lgtm`,不发布检视摘要或其他前置评论。它不发送 `/approve` 或 `/merge`,也不修改作者代码。
170
170
 
171
171
  ## PR 与检视规则
172
172
 
173
173
  - 创建普通 PR,不创建 Draft PR,也不执行 Ready;
174
+ - `create-issue` 只在开放里程碑唯一时自动选择,多个时由用户选择,没有时明确为 `none`,不会创建或猜测里程碑;
175
+ - `pr` 继承已核验目标 Issue 的里程碑,并在远端写后回读确认;
176
+ - 完整 E2E 在 `pr-open` 后无需确认直接进入 `ci`,但独立 `pr` action 仍立即停止且不触发 CI;
174
177
  - 不主动请求检视,不触发检视机器人;
175
178
  - 作者流程不会调用 `code-review`,也不会自行制造 LGTM/approve;
176
179
  - CI、review 和 merge 结论始终绑定当前 PR head SHA;
@@ -248,3 +251,7 @@ npx msdevflow setup
248
251
  ## 详细文档
249
252
 
250
253
  完整 action、恢复、模板、CI、review、UTF-8 和安全契约见 [`skill/msd/README.md`](skill/msd/README.md)。
254
+
255
+ ## Contributors
256
+
257
+ <p style="display: flex; flex-direction: row; align-items: center; gap: 6px;"><a href="https://gitcode.com/jhon-117" title="kai1949 (@jhon-117)" style="display: inline-flex;"><img src="https://cdn-img.gitcode.com/cf/de/cf4654616de28c691a53b353b5c67274262c4a92a2353ce82aece9e7a5a496f9.jpg?x-oss-process=image/resize,m_fill,w_48,h_48/circle,r_24/format,png" width="48" height="48" alt="kai1949 (@jhon-117)"></a><a href="https://gitcode.com/hummel_mao" title="hummel mao (@hummel_mao)" style="display: inline-flex; text-decoration: none;"><span role="img" aria-label="hummel mao (@hummel_mao)" style="display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 50%; background-color: #ff8b87; color: #ffffff; font-size: 14px; font-weight: 400;">H</span></a><a href="https://gitcode.com/rookie_hongchuan" title="rookie_hongchuan (@rookie_hongchuan)" style="display: inline-flex; text-decoration: none;"><span role="img" aria-label="rookie_hongchuan (@rookie_hongchuan)" style="display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 50%; background-color: #ff8b87; color: #ffffff; font-size: 14px; font-weight: 400;">R</span></a></p>
package/lib/bootstrap.js CHANGED
@@ -50,13 +50,15 @@ const SUPPORTED_CLIENTS = ["claude", "codex", "opencode"];
50
50
  const REQUIRED_SCHEMAS = {
51
51
  "auth login": ["web"],
52
52
  "auth status": ["json"],
53
- "issue create": ["body-file", "dry-run", "json", "repo", "title"],
53
+ "issue create": ["body-file", "dry-run", "json", "milestone", "repo", "title"],
54
54
  "issue list": ["assignee", "json", "repo", "state"],
55
55
  "issue view": ["comments", "json", "repo"],
56
- "issue edit": ["assignee", "json", "repo", "state"],
56
+ "issue edit": ["assignee", "json", "milestone", "repo", "state"],
57
57
  "issue comment": ["body-file", "json", "repo"],
58
58
  "issue prs": ["json", "repo"],
59
+ "milestone list": ["json", "limit", "page", "per-page", "repo"],
59
60
  "pr create": ["base", "body-file", "fork", "head", "json", "repo", "title"],
61
+ "pr edit": ["json", "milestone", "repo"],
60
62
  "pr list": ["direction", "head", "json", "limit", "repo", "sort", "state"],
61
63
  "pr view": ["comments", "json", "repo"],
62
64
  "pr diff": ["json", "repo"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "msdevflow",
3
- "version": "0.7.8",
3
+ "version": "0.8.0",
4
4
  "description": "Install the msdevflow GitCode skill and its runtime dependencies",
5
5
  "type": "module",
6
6
  "bin": {
@@ -11,6 +11,7 @@
11
11
  "lib/",
12
12
  "skill/",
13
13
  "!skill/**/scripts/test_openlibing_ci.py",
14
+ "!skill/**/scripts/test_gitcode_review.py",
14
15
  "!skill/**/__pycache__/**",
15
16
  "!skill/**/*.pyc"
16
17
  ],
@@ -26,10 +26,10 @@ msd-merge
26
26
  | action | 能力 | 完成后行为 |
27
27
  |---|---|---|
28
28
  | `discover` | 只读发现候选 Issue | 列出候选和排除证据后停止 |
29
- | `create-issue` | 按仓库或 community 模板创建 Issue | 回读确认 `issue-created` 后停止 |
29
+ | `create-issue` | 按模板创建 Issue,并确定性选择开放里程碑 | 回读确认 `issue-created` 后停止 |
30
30
  | `issue` | 接取并核验指定 Issue | 到 `verified` 后停止 |
31
31
  | `develop` | 分析、设计、建分支、实现和本地验证 | 到 `locally-verified` 后停止 |
32
- | `pr` | commit、push、创建普通 PR | 到 `pr-open` 后停止 |
32
+ | `pr` | commit、push、创建普通 PR并继承 Issue 里程碑 | 到 `pr-open` 后停止 |
33
33
  | `ci` | 监控、诊断和修复当前 PR 的 CI | 当前 head 全绿后停止 |
34
34
  | `openlibing-auth` | 自动选择当前 canonical 的 run 并验证 OAuth | 只读验证成功后停止 |
35
35
  | `feedback` | 处理自己 PR 收到的检视意见 | 意见闭环并验证后停止 |
@@ -49,6 +49,7 @@ msd-merge
49
49
 
50
50
  ```text
51
51
  discover -> issue -> develop -> pr -> ci
52
+ ^ `pr-open` 后无需确认直接进入
52
53
  \-> openlibing-auth(openLiBing 401/403 时作为认证子流程,成功后返回 ci)
53
54
  -> waiting-for-review
54
55
  -> feedback -> ci -> waiting-for-review (可重复)
@@ -104,7 +105,7 @@ Fork:myname/example
104
105
 
105
106
  本 action 从 canonical 最新默认分支的 `.gitcode/` 递归寻找匹配类型的 `.yml`、`.yaml` 或 `.md` Issue 模板;只有该类型不存在时,才回退到 `Ascend/community@master:.gitcode/.gitcode/ISSUE_TEMPLATE/` 的同类型模板。仓库匹配模板无效时阻断,不回退;类型或同类型模板无法唯一确定时让用户选择。它根据自然语言填充字段,缺少必填信息时逐项询问,创建前展示目标、模板 ref/path、标题、完整正文和元数据。
106
107
 
107
- `create-issue` 不执行重复 Issue/PR 查找。确认创建后使用 UTF-8 安全通道并逐字回读;到 `issue-created` 后立即停止,不接取、不开发。需要继续处理时显式运行 `action=issue`。
108
+ `create-issue` 不执行重复 Issue/PR 查找。它分页读取 canonical 的开放里程碑:没有时明确为 `none`,唯一时自动选择,多个时让用户选择;不按列表顺序猜测“最新”,也不创建或修改里程碑。确认创建后使用 UTF-8 安全通道并逐字回读正文与里程碑;到 `issue-created` 后立即停止,不接取、不开发。需要继续处理时显式运行 `action=issue`。
108
109
 
109
110
  ### 只接取和核验 Issue
110
111
 
@@ -136,7 +137,7 @@ canonical:Ascend/example
136
137
  source:myname/example
137
138
  ```
138
139
 
139
- 它要求实现和本地门禁已有证据;创建普通 PR 后立即停止。
140
+ 它要求实现和本地门禁已有证据;普通 PR 必须继承已核验目标 Issue 的里程碑(或两者均为 `none`),创建及必要的 `pr edit --milestone` 后回读验证,再立即停止,不触发 CI。只有核心 `msd` 的完整 E2E 会在此后无需确认直接路由到 `ci`。
140
141
 
141
142
  ### 只处理 CI
142
143
 
@@ -178,7 +179,9 @@ PR:https://gitcode.com/Ascend/example/pulls/789
178
179
 
179
180
  本 action 只检视当前账号之外的作者所提交的 open、非 Draft/WIP PR;自审返回 `blocked: self-review-forbidden`。它固定当前 head,读取完整权威 diff、全部 changed files、必要上下文、关联 Issue、仓库规范和结构化 discussions,默认不 checkout、不执行 PR head 脚本、不修改代码。
180
181
 
181
- 只发布由本 PR 引入或暴露、证据充分且可操作的 finding;已有 discussion 已覆盖的问题不重复发布。有 finding 或仍有效的未解决意见时不发送 `/lgtm`。完整覆盖且未发现需要作者修改的问题时,先展示带 `——msdevflow` 的检视摘要和后续精确 payload;获得针对当前 PR/head 的明确确认后,先发布并逐字回读摘要,再独立发送正文恰好为 `/lgtm` 的评论。`/lgtm` 不加尾签,不代表 `/approve`、CI 通过或允许合入。本 action 不发送 `/approve`、`/merge`,也不替作者回复或 resolve discussion。
182
+ GitCode 传输只通过内置 `scripts/gitcode_review.py`:一次 `snapshot` 聚合主要证据,需要未变更调用方时用 `context` 批量读取已知精确路径,发布只用 `finding` `lgtm`,最后用 `cleanup` 删除受管 snapshot。Agent 不再现场拼接 Python/PowerShell JSON、grep 展示文本、raw URL、`curl` API endpoint;helper 能力不足或响应不完整时直接阻断。允许客户端执行固定 helper 只用于减少重复网络权限提示,不代表批准任何 reviewer 结论。
183
+
184
+ 只发布由本 PR 引入或暴露、证据充分且可操作的 finding;已有 discussion 已覆盖的问题不重复发布。有 finding 或仍有效的未解决意见时不发送 `/lgtm`。完整覆盖且未发现需要作者修改的问题时,不发布检视摘要或其他前置评论;获得针对当前 PR/head 的明确确认后,只发送并回读正文恰好为 `/lgtm` 的评论。`/lgtm` 不加尾签,不代表 `/approve`、CI 通过或允许合入。本 action 不发送 `/approve`、`/merge`,也不替作者回复或 resolve discussion。
182
185
 
183
186
  ### 只核验并合入
184
187
 
@@ -315,7 +318,7 @@ PR 模板只取自 canonical repository 最新默认分支:
315
318
 
316
319
  ### guided:默认模式
317
320
 
318
- 远端写和关键决策按动作确认,包括创建 Issue 的最终预览、接取、方案、首次 push、创建 PR、未授权 CI 修复、discussion 回复、`code-review` finding 发布和最终 merge。检视未发现问题时,无论 guided 或 autonomous,都必须针对当前 PR/head 明确确认带尾签摘要和精确 `/lgtm`。
321
+ 远端写和关键决策按动作确认,包括创建 Issue 的最终预览、接取、方案、首次 push、创建 PR、未授权 CI 修复、discussion 回复、`code-review` finding 发布和最终 merge。完整 E2E 从已确认并回读的 PR 直接进入 `ci` 属于阶段编排,不新增确认点;`ci` 内实际远端写仍按自身规则确认。检视未发现问题时,无论 guided 或 autonomous,都必须针对当前 PR/head 明确确认精确 `/lgtm`;确认后只发送该 payload,不发布检视摘要或前置评论。
319
322
 
320
323
  ### autonomous
321
324
 
@@ -336,7 +339,7 @@ PR 模板只取自 canonical repository 最新默认分支:
336
339
  - 当前 head SHA 和对应 CI;
337
340
  - comments、结构化 discussions、reviews 和 merge 状态。
338
341
 
339
- 创建 PR、评论、CI 触发、reply、resolve 和 merge 前都会检查远端是否已有等价动作。`create-issue` 不做产品查重,只在创建结果不确定时按本次标题、完整正文、账号、目标和启动时间有界恢复。`code-review` finding 按 PR、固定 head、reviewer、path/position 和完整正文去重;检视通过按 PR、固定 head、reviewer、带尾签摘要和精确 `/lgtm` 去重,旧 head 的结论不证明当前 head 已检视。所有写操作超时或连接中断时都先查询远端事实,不直接重试。
342
+ 创建 PR、评论、CI 触发、reply、resolve 和 merge 前都会检查远端是否已有等价动作。`create-issue` 不做产品查重,只在创建结果不确定时按本次标题、完整正文、账号、目标和启动时间有界恢复。`code-review` finding 按 PR、固定 head、reviewer、path/position 和完整正文去重;检视通过按 PR、固定 head、reviewer 和精确 `/lgtm` 去重,不查找或发布检视摘要,旧 head 的结论不证明当前 head 已检视。所有写操作超时或连接中断时都先查询远端事实,不直接重试。
340
343
 
341
344
  显式 action 完成时输出:
342
345
 
@@ -363,7 +366,7 @@ Agent 写入的正文末尾与主体间隔一个空行并恰好包含一次:
363
366
  ——msdevflow
364
367
  ```
365
368
 
366
- 裸 `compile`、`/lgtm`、`/merge` 等严格机器 payload 保持原样;先通过 UTF-8 安全通道发布并逐字回读带唯一尾签的独立人类可读说明,再发送机器命令。
369
+ 裸 `compile`、`/lgtm`、`/merge` 等严格机器 payload 保持原样。`code-review` 检视通过时只发送并回读精确 `/lgtm`,不发布检视摘要或前置评论;其他机器协议按安全契约先发布并回读带唯一尾签的独立人类可读说明。
367
370
 
368
371
  ## 11. 安全边界
369
372
 
@@ -416,4 +419,6 @@ typed CLI command
416
419
  - [references/command-capabilities.md](references/command-capabilities.md):CLI 能力适配。
417
420
  - [references/ci-and-review.md](references/ci-and-review.md):CI 和作者 discussion 深层规则。
418
421
  - [scripts/openlibing_ci.py](scripts/openlibing_ci.py):openLiBing 只读诊断与交互 OAuth 客户端。
422
+ - [scripts/gitcode_review.py](scripts/gitcode_review.py):`code-review` 固定 snapshot/context/finding/lgtm/cleanup 适配器。
419
423
  - [scripts/test_openlibing_ci.py](scripts/test_openlibing_ci.py):openLiBing 无凭证控制流测试。
424
+ - [scripts/test_gitcode_review.py](scripts/test_gitcode_review.py):GitCode review 适配器的无网络回归测试。
@@ -52,7 +52,9 @@ msd-merge
52
52
  | `code-review` | 检视他人的 PR,发布 finding 或 `/lgtm` | 他人 PR | `review-findings`、`review-passed`、`review-incomplete`、`waiting` 或 `blocked` | [references/code-review.md](references/code-review.md) |
53
53
  | `merge` | 核验门禁并在最终确认后合入 | canonical PR | `merged`、`waiting` 或 `blocked` | [references/review-and-merge.md](references/review-and-merge.md) |
54
54
 
55
- `code-review` 只能通过 `msd-code-review` 或兼容参数 `action=code-review` 独立调用,永不进入作者 E2E,不得检视或批准当前账号自己的 PR。它固定当前 head,完整检视权威 diff、必要上下文和既有 discussions:有高置信度问题时发布经确认且逐字回读的 finding,不发送 `/lgtm`;没有问题、没有有效未解决意见且覆盖完整时,在针对当前 PR/head 明确确认后先发布带尾签摘要,再原样发送 `/lgtm`。它不发送 `/approve`、`/merge`,不修改作者代码。
55
+ `code-review` 只能通过 `msd-code-review` 或兼容参数 `action=code-review` 独立调用,永不进入作者 E2E,不得检视或批准当前账号自己的 PR。它固定当前 head,完整检视权威 diff、必要上下文和既有 discussions:有高置信度问题时只发布经确认且逐字回读的 finding,不发送 `/lgtm`;没有问题、没有有效未解决意见且覆盖完整时,在针对当前 PR/head 明确确认后只发送正文恰好为 `/lgtm` 的评论,不发布检视摘要或其他前置评论。它不发送 `/approve`、`/merge`,不修改作者代码。
56
+
57
+ `code-review` 对 GitCode 的唯一执行适配器是 Skill 随附的 `scripts/gitcode_review.py`:用一次 `snapshot` 聚合 PR 证据,必要时用 `context` 批量读取已知精确路径,发布时只用 `finding` 或经当前 PR/head 确认的 `lgtm`,结束后用 `cleanup` 删除受管 snapshot。不得现场拼接 `python -c`、PowerShell JSON、shell/grep 展示文本解析、raw URL、`curl` 或未知 API endpoint,也不得在 helper 失败时退回原始 CLI 试错。客户端对固定 helper 的网络执行授权只减少权限提示,不替代 finding 或精确 `/lgtm` 的 reviewer 结论确认。
56
58
 
57
59
  ## 显式 action 契约
58
60
 
@@ -78,6 +80,7 @@ discover -> issue -> develop -> pr -> ci
78
80
  - 用户已给出 Issue 时无需先列候选,但仍执行环境、仓库画像和 Issue 核验。
79
81
  - 已有 PR 时仍补做最小充分的 Phase 0 仓库画像,再从权威 PR/head/CI/review 状态定位当前位置。
80
82
  - `pr` 创建普通 PR,不创建 Draft PR,不存在 Ready 转换。
83
+ - 完整 E2E 在 `pr-open` 后不询问是否继续,直接路由到 `ci`;这只是编排器阶段切换,显式 `action=pr` 仍立即停止且不触发 CI。
81
84
  - 不请求检视、不触发检视机器人;当前 head CI 通过且无现有意见或独立审批时,暂停为 `waiting-for-review`。
82
85
  - 有未解决意见时进入 `feedback`;产生新 head 后重新进入 `ci`。
83
86
  - 独立审批门禁满足后才可进入 `merge`,最终合入始终需要用户针对当前 PR 明确确认。
@@ -119,29 +122,30 @@ discovered -> claimed -> verified -> analyzed -> designed
119
122
  - 作者不得冒充 reviewer/approver,不得自行制造 LGTM/approved 门禁。
120
123
  - 不读取、打印或转存 GitCode Token。openLiBing OAuth Token 只允许在当前认证进程内短暂使用,不打印、不落盘、不写入 URL、命令、记忆或对话。
121
124
  - 不跳过 hooks/测试/CI/review,不默认 force push、关闭 Issue、删除分支或重写共享历史。
122
- - 创建 Issue/PR、评论、触发 CI、resolve 和 merge 前检查幂等状态;`create-issue` 不做产品查重,只在写结果不确定时有界恢复;其他写结果不确定时也先回读。
125
+ - 创建 Issue/PR、评论、触发 CI、resolve 和 merge 前检查幂等状态;`create-issue` 在最终预览确认前禁止远端写入,每个 run 最多执行一次已确认的真实创建,禁止测试 Issue、POST 探测、失败重试或替代 Issue,只在写结果不确定时有界只读恢复;其他写结果不确定时也先回读。
126
+ - `code-review` 的 GitCode 网络访问只能由 `scripts/gitcode_review.py` 执行;helper 输出不完整或能力不足即阻断,不回退现场命令、文本解析或 endpoint 探测。受管 snapshot 必须结束时清理,受管 write receipt 只用于固定 head 上评论写入的幂等恢复。
123
127
  - Agent 写入 GitCode 的 PR 正文、Issue/PR 评论、discussion 回复和其他人类可读正文必须按 [references/state-and-safety.md](references/state-and-safety.md) 在末尾恰好附加一次 `——msdevflow`。
124
128
  - 所有人类可读远端文本必须通过 UTF-8 安全通道写入并逐字回读;发现乱码、`?`、截断或尾签损坏时阻断依赖动作,先原地修复。
125
- - 严格机器协议 payload 保持原样;使用已验证且带尾签的独立人类可读说明评论,不把尾签拼进 `compile`、`/lgtm`、`/merge` 等命令。
129
+ - 严格机器协议 payload 保持原样,不把尾签拼进 `compile`、`/lgtm`、`/merge` 等命令。除 `code-review` 检视通过时只发送精确 `/lgtm` 外,其他协议按 [references/state-and-safety.md](references/state-and-safety.md) 发布并验证带尾签的独立人类可读说明。
126
130
  - 只有回读确认 PR 已合入,才能声称端到端完成。
127
131
 
128
132
  ## 执行模式与确认
129
133
 
130
- 默认 `guided`。用户可授权绑定具体 canonical、Issue、source、branch 和目标的 `autonomous`,或只覆盖同一 PR CI 修复循环的 `autonomous-ci`。
134
+ 默认 `guided`。用户可授权绑定具体 canonical、Issue、source、branch 和目标的 `autonomous`,或只覆盖同一 PR CI 修复循环的 `autonomous-ci`。阶段间的只读编排不构成新的确认点;尤其完整 E2E 从 `pr-open` 进入 `ci` 不再次询问用户。
131
135
 
132
136
  无论模式如何,范围或公共行为变化、凭证或安全问题、门禁绕过、force push、审批、合并、新权限、破坏性动作或事实冲突都必须停止。最终 merge 始终需要用户针对当前 PR 明确确认;`code-review` 的检视通过结论和精确 `/lgtm` 也始终需要用户针对当前 PR 与 `review_head_sha` 明确确认。
133
137
 
134
138
  ## Action 完成条件
135
139
 
136
140
  - `discover`:查询范围、候选和排除证据已报告,无远端写入。
137
- - `create-issue`:按确认的仓库或同类型 community 模板创建一个 Issue,远端回读确认目标、标题、完整正文、唯一尾签和元数据逐项一致;不执行查重、接取或开发。
141
+ - `create-issue`:按确认的仓库或同类型 community 模板创建一个 Issue;开放里程碑唯一时自动选择、多个时由用户选择、没有时明确为 `none`,远端回读确认目标、标题、完整正文、唯一尾签和元数据逐项一致;不创建里程碑,也不执行查重、接取或开发。
138
142
  - `issue`:接取状态按授权完成或确认可继续,Issue、关联 PR 和 canonical 默认分支已核验,无重复开发。
139
143
  - `develop`:范围和方案已确认,工作分支基于最新 canonical,任务实现且适用本地门禁有实际证据。
140
- - `pr`:普通 canonical PR 回读确认 source/head/base、Issue 关联、标题和正文正确。
144
+ - `pr`:普通 canonical PR 回读确认 source/head/base、Issue 关联、标题和正文正确,且 PR 里程碑与目标 Issue 精确一致或两者均为 `none`。
141
145
  - `ci`:当前 head SHA 的必需 CI 全绿;openLiBing 要求认证时,OAuth 子流程已验证并继续当前 CI。
142
146
  - `openlibing-auth`:在当前 canonical 内确定性选择并固定一个 openLiBing run,交互 OAuth 后对该 run 的只读请求成功;只持久化专用 GitCode 浏览器会话,Token 未输出或落盘。浏览器不可用时只输出 OAuth 链接并停止为 `blocked: browser-required`,不算完成。
143
147
  - `feedback`:调用时已有的阻塞 discussion 已逐条处理、回复并在允许时 resolve;代码修改已通过受影响本地测试并推送。若产生新 head,停止并建议 `action=ci`,不在本 action 内运行远端 CI;没有现有意见时停止为 `waiting-for-review`。
144
- - `code-review`:固定当前 head 完整检视他人 PR;有高置信度问题时发布逐字回读的 finding 并停止于 `review-findings`;无问题且无有效未解决意见时,经当前 PR/head 明确确认后发布带尾签摘要和精确 `/lgtm`,远端回读后停止于 `review-passed`;覆盖不足时停止于 `review-incomplete`,不得发送 `/lgtm`。
148
+ - `code-review`:固定当前 head 完整检视他人 PR;有高置信度问题时只发布逐字回读的 finding 并停止于 `review-findings`;无问题且无有效未解决意见时,不发布检视摘要或前置评论,经当前 PR/head 明确确认后只发送精确 `/lgtm`,远端回读后停止于 `review-passed`;覆盖不足时停止于 `review-incomplete`,不得发送 `/lgtm`。
145
149
  - `merge`:当前 head 门禁满足且用户确认后,远端回读 `merged` 并记录 merge SHA/时间;否则返回 `waiting` 或 `blocked`。
146
150
 
147
151
  ## 输出
@@ -2,33 +2,70 @@
2
2
 
3
3
  显式 `action=code-review` 用于以独立 reviewer 身份检视他人的 GitCode PR。它只在用户明确指定本 action 时运行,永不进入作者 E2E,也不转入 `feedback`、`ci`、`merge` 或代码修改流程。
4
4
 
5
+ ## 唯一执行适配器
6
+
7
+ 本 action 的 GitCode 读取、归一化、UTF-8 落盘和评论写后回读必须通过 Skill 随附的 `scripts/gitcode_review.py`。不得在现场拼接 `python -c`/`python3 -c`、PowerShell `ConvertFrom-Json`、shell 管道或 grep 解析 GitCode 展示文本;不得直接执行 `pr diff`、`pr comments`、`pr comment`、网页 raw URL、`curl` 或自行试探 API endpoint。固定 helper 返回能力不足、响应不完整或未知 schema 时停止为 `blocked: review-capability-required`;不得绕开 helper 改用另一命令试错。
8
+
9
+ 同一次调用可聚合多个 PR,只执行一次固定 helper 入口,减少重复网络命令和客户端赋权:
10
+
11
+ ```bash
12
+ python <skill-dir>/scripts/gitcode_review.py snapshot \
13
+ --gitcode-command <gitcode-command> \
14
+ [--repo <canonical>] \
15
+ <pr-url-or-number> [<pr-url-or-number> ...]
16
+ ```
17
+
18
+ helper 只在 stdout 输出小型 JSON manifest;完整 PR 元数据、changed-files patch、base/head 文件、comments、行内 comment detail、关联 Issue 和仓库规范写入受管 snapshot 目录。Agent 用文件读取工具按 manifest 逐项读取,不把完整 snapshot 打印回终端。结束时清理:
19
+
20
+ ```bash
21
+ python <skill-dir>/scripts/gitcode_review.py cleanup <snapshot-dir> --yes
22
+ ```
23
+
24
+ `cleanup` 只接受带 msdevflow marker 的受管 snapshot,拒绝删除其他路径。客户端可对这个固定脚本入口授予所需网络执行权限;该权限只允许 helper 调用已固化的 GitCode 只读/写后校验路径,不等于用户已确认 finding、`/lgtm`、approve 或 merge。
25
+
5
26
  ## 前置条件与身份隔离
6
27
 
7
28
  至少需要 PR URL,或能与 canonical repository 唯一组合的 PR 编号。缺少目标时返回 `blocked: pr-required`,不得改为发现候选 PR。
8
29
 
9
- 开始时只读确认:
30
+ 从 snapshot 只读确认:
10
31
 
11
32
  - 当前 GitCode 登录账号及 canonical operation target;
12
33
  - PR 存在、open 且处于可检视状态;Draft/WIP 或已关闭 PR 返回 `waiting`/`blocked`,不发布结论;
13
34
  - PR author 与当前账号不同;相同则返回 `blocked: self-review-forbidden`,不得发布 finding、`/lgtm`、approve 或任何可形成独立门禁的信号;
14
35
  - PR base/head、当前 head SHA、关联 Issue、描述、commits、changed files 和现有 comments/discussions;
15
- - 仓库最新默认分支中的适用 `AGENTS.md`、`CLAUDE.md`、`CONTRIBUTING*`、README、OWNERS/CODEOWNERS、测试与检视规范;
36
+ - canonical 最新 base 分支中适用于 changed files 的 `AGENTS.md`、`CLAUDE.md`、`CONTRIBUTING*`、README、OWNERS/CODEOWNERS 和测试配置;
16
37
  - 当前账号具备发表评论的权限;仓库对 reviewer 资格另有要求时,无法证明资格不得发送 `/lgtm`。
17
38
 
18
- 开始分析时固定 `review_head_sha`。任何检视结论只对该 head 有效。
39
+ 开始分析时固定 helper 返回的 `review_head_sha`。任何检视结论只对该 head 有效。snapshot 标记 `snapshot_complete=false`、changed-files 数量不一致、patch/文件/行内详情缺失、tree 截断、读取期间 head/base 改变或其他 `incomplete_reasons` 时只能停止为 `review-incomplete`,不得把未发现问题解释为通过。
19
40
 
20
- ## CLI 能力
41
+ ## 固定数据路径
21
42
 
22
- 使用前按 schema/help 探测:
43
+ helper 只使用 setup 已验收且本 Skill 固定的路径,不在运行时改变策略:
44
+
45
+ ```text
46
+ pr view <number> -R <canonical> --json
47
+ api repos/<canonical>/pulls/<number>/files
48
+ pr comments <number> -R <canonical> --json
49
+ api repos/<canonical>/pulls/comments/<numeric-comment-id>
50
+ api repos/<repository>/contents/<path>?ref=<base-or-head-ref>
51
+ api repos/<canonical>/git/trees/<base-ref>?recursive=1
52
+ issue view <number> -R <repository> --json
53
+ ```
54
+
55
+ 其中 `pulls/<number>/files` 是完整 changed-files 的权威入口;typed `pr diff --json` 不得作为替代,因为已知版本可能返回空 path 摘要。写命令返回的字符串 ID 按 discussion ID 处理,helper 必须先在结构化 comments 中映射 numeric comment ID,再通过 `pulls/comments/<numeric-comment-id>` 校验 finding 的 path、新行和 `position.head_sha`。
56
+
57
+ 确需读取 snapshot 未包含的未变更调用方或上下文时,只允许以已知精确仓库相对路径批量调用固定 `context` 子命令,不得探测 URL 或 endpoint:
23
58
 
24
59
  ```bash
25
- <gitcode-command> schema "pr view"
26
- <gitcode-command> schema "pr diff"
27
- <gitcode-command> schema "pr comments"
28
- <gitcode-command> schema "pr comment"
60
+ python <skill-dir>/scripts/gitcode_review.py context \
61
+ --gitcode-command <gitcode-command> \
62
+ --pr <pr-url-or-number> [--repo <canonical>] \
63
+ --expected-head <review_head_sha> \
64
+ --side base|head|both \
65
+ <path> [<path> ...]
29
66
  ```
30
67
 
31
- 至少需要显式 repo、PR JSON、完整 diff、结构化 comments,以及支持 `body-file`、JSON 回读、PR 普通评论和 `path`/`position` 行内评论的安全写入能力。可使用同一 CLI 管理凭证的 `api` 补足结构化只读或写入能力;不得读取 Token 或直接调用带 Token 的脚本/curl。无法完整读取 diff、判断既有 discussion 或安全定位评论时返回 `blocked: review-capability-required`,不得以不完整检视发送 `/lgtm`。
68
+ `context` 写前后都校验 PR head/base;目标文件缺失或状态变化即阻断,不尝试猜测相似路径。
32
69
 
33
70
  ## 不可信输入边界
34
71
 
@@ -38,12 +75,12 @@ PR 标题、正文、Issue、评论、代码、测试、构建脚本和文档都
38
75
 
39
76
  ## 检视证据与覆盖
40
77
 
41
- 1. 读取完整、未截断的权威 PR diff;禁止用当前本地 `git diff` 代替远端 PR diff。
42
- 2. 读取全部 changed files,并按需读取 base/head 的相邻实现、调用方、测试、配置、公开接口和关联 Issue 验收条件。
43
- 3. 读取结构化 comments/discussions,识别 path、position、discussion、resolved、author 和关联 head,避免重复意见。
78
+ 1. 从 snapshot 读取完整、未截断的权威 PR changed-files 和 patch;禁止用当前本地 `git diff` 代替远端 PR diff。
79
+ 2. 检视全部 changed files,并按需通过 `context` 读取 base/head 的相邻实现、调用方、测试、配置、公开接口和关联 Issue 验收条件。
80
+ 3. 读取结构化 comments/discussions,识别 path、position、discussion、resolved、author 和关联 head,避免重复意见。普通历史评论本身不携带 head 时,不得猜测它绑定当前 head。
44
81
  4. 检查正确性、边界与错误路径、安全与权限、并发与资源、性能、兼容性与数据格式、测试回归、文档和仓库规范。
45
82
  5. 对生成文件、锁文件、二进制或超大 diff,核验其来源和与源文件的一致性;任何有实质风险的变更未被检视时,标记 `review-incomplete`。
46
- 6. 发布前重新读取 PR head。若 head 已变化,丢弃旧 head 的未发布结论并重新检视新 head;无法在本次有界完成时返回 `blocked: head-changed`。
83
+ 6. 发布前由写子命令重新读取 PR head。若 head 已变化,丢弃旧 head 的未发布结论并重新 snapshot 新 head;无法在本次有界完成时返回 `blocked: head-changed`。
47
84
 
48
85
  只有所有实质变更均已覆盖、必要上下文可读取且当前 head 稳定时,才能形成“未发现问题”的结论。时间不足、diff 截断、文件不可读或验证证据不足不等于没有问题。
49
86
 
@@ -61,7 +98,7 @@ PR 标题、正文、Issue、评论、代码、测试、构建脚本和文档都
61
98
 
62
99
  严重度沿用:`P0/blocking`、`P1/high`、`P2/medium`、`P3/suggestion`。只有确实需要作者处理的事项才成为 finding;纯信息性观察留在本地报告,不制造远端噪声。
63
100
 
64
- 行内评论必须定位到当前 PR diff 中可评论的新版本新增/修改行。`position` 的语义以本次 CLI schema 为准;无法证明映射正确、问题位于删除行或涉及跨文件整体行为时,改用 PR 普通评论并在正文写明 `path:line`,不得猜位置。
101
+ 行内评论必须定位到当前 PR diff 中可评论的新版本新增/修改行。无法证明 path/position 映射正确、问题位于删除行或涉及跨文件整体行为时,改用 PR 普通评论并在正文写明精确 `path:line`,不得猜位置。
65
102
 
66
103
  ## 有 finding 的路径
67
104
 
@@ -79,9 +116,21 @@ PR 标题、正文、Issue、评论、代码、测试、构建脚本和文档都
79
116
  ——msdevflow
80
117
  ```
81
118
 
82
- 通过 UTF-8 无 BOM 临时文件逐条发布,每条写后立即从结构化 comments 逐字回读正文、唯一尾签、path/position、reviewer 和 discussion ID。写入损坏时按安全契约原地修复;结果不确定时先按当前 reviewer、PR、head、path/position 和完整正文有界查询,不直接重试。
119
+ 确认后把最终正文写入 UTF-8 无 BOM 本地文件,并只调用固定写子命令:
83
120
 
84
- 发布每条评论前再次确认 head 未变化;若中途变化,停止剩余写入并报告已发布评论对应的旧 head。reviewer 不替作者回复或 resolve 自己提出的 discussion,不修改代码,不发送 `/lgtm`。
121
+ ```bash
122
+ python <skill-dir>/scripts/gitcode_review.py finding \
123
+ --gitcode-command <gitcode-command> \
124
+ --pr <pr-url-or-number> [--repo <canonical>] \
125
+ --expected-head <review_head_sha> \
126
+ --body-file <utf8-no-bom-finding-file> \
127
+ [--path <new-path> --position <new-line>] \
128
+ --confirmed-current-head
129
+ ```
130
+
131
+ helper 校验唯一尾签,写前确认 head/author,使用内部唯一 UTF-8 无 BOM 临时文件发布,在 `finally` 中删除,并按 discussion ID → numeric comment ID → comment detail 逐字回读 reviewer、正文、path/new line 和 `position.head_sha`。它在受管目录中只持久化正文 SHA-256、固定 head、写前评论集合和写后 ID 的事务凭据,不保存正文或 Token;命令中断后只读恢复同一次尝试,不直接重试。
132
+
133
+ 发布每条评论前都重新调用写子命令确认 head;若中途变化,停止剩余写入并报告已发布评论对应的旧 head。reviewer 不替作者回复或 resolve 自己提出的 discussion,不修改代码,不发送 `/lgtm`。
85
134
 
86
135
  如果没有新 finding,但已有其他 reviewer 的有效未解决问题,按实质去重并报告这些问题,仍不得发送 `/lgtm`。
87
136
 
@@ -90,35 +139,41 @@ PR 标题、正文、Issue、评论、代码、测试、构建脚本和文档都
90
139
  同时满足以下条件才可进入通过路径:
91
140
 
92
141
  - 当前账号不是 PR author,且 reviewer 资格/权限满足仓库规则;
93
- - 所有实质 changed files 和必要上下文已完整检视;
142
+ - snapshot 完整,所有实质 changed files 和必要上下文已完整检视;
94
143
  - 当前 `review_head_sha` 未变化;
95
144
  - 没有本次新 finding;
96
145
  - 没有已确认仍有效的未解决 discussion 或其他已知阻塞问题。
97
146
 
98
- 先生成一条人类可读检视摘要,至少包含当前 head、覆盖范围和“未发现需要作者修改的问题”,正文末尾附加唯一 `——msdevflow`。展示摘要和后续精确 payload:
147
+ 不生成或发布检视摘要,也不发布任何 `/lgtm` 前置说明评论。只向用户展示当前 PR、`review_head_sha` 和后续精确 payload:
99
148
 
100
149
  ```text
101
150
  /lgtm
102
151
  ```
103
152
 
104
- `/lgtm` 是会形成 reviewer 门禁的机器协议。无论 guided 或 autonomous,都必须获得用户针对当前 PR 和 `review_head_sha` 的明确确认;普通的 `action=code-review` 调用只授权只读检视,不等于提前批准该结论。
153
+ `/lgtm` 是会形成 reviewer 门禁的机器协议。无论 guided 或 autonomous,都必须获得用户针对当前 PR 和 `review_head_sha` 的明确确认;普通的 `action=code-review` 调用以及客户端对 helper 的网络权限都不等于提前批准该结论。
154
+
155
+ 确认后只调用:
105
156
 
106
- 确认后:
157
+ ```bash
158
+ python <skill-dir>/scripts/gitcode_review.py lgtm \
159
+ --gitcode-command <gitcode-command> \
160
+ --pr <pr-url-or-number> [--repo <canonical>] \
161
+ --expected-head <review_head_sha> \
162
+ --confirmed-current-head \
163
+ --confirm-exact-lgtm
164
+ ```
107
165
 
108
- 1. 使用 UTF-8 安全通道发布检视摘要并逐字回读;
109
- 2. 再次回读 head,发生变化则停止,不发送 `/lgtm`;
110
- 3. 以正文恰好为 `/lgtm` 的独立 PR 评论发送机器 payload,不添加尾签、空行、代码块或其他文字;
111
- 4. 回读确认 comment author、正文和目标 PR,并有界观察仓库机器人产生的 lgtm label/check;机器人尚未处理时只报告 pending,不重复发送命令。
166
+ helper 内部生成正文恰好为 `/lgtm` 的 UTF-8 无 BOM 临时文件,不接受任意正文,不添加尾签、空行、代码块或其他文字;写前回读 head/author,写后结构化回读 comment author、正文和目标 PR,再次确认 head,并在 `finally` 中删除临时文件。仓库机器人尚未产生 lgtm label/check 时只报告 pending,不重复发送命令。
112
167
 
113
168
  `/lgtm` 仅表示当前 reviewer 对固定 head 的代码检视通过,不等于 `/approve`、CI 通过或允许合入。本 action 不发送 `/approve`、`/merge`,也不调用 `merge`。
114
169
 
115
170
  ## 幂等与恢复
116
171
 
117
- 检视通过的幂等键为:`canonical + PR + review_head_sha + current reviewer + 带尾签摘要 + 精确 /lgtm`。同一 reviewer 已存在这组当前 head 证据时,回读后直接报告 `review-passed`,不重复评论。
172
+ 检视通过的幂等键为:`canonical + PR + review_head_sha + current reviewer + 精确 /lgtm`。helper 的本地事务凭据能证明同一次尝试和固定 head 时,回读后直接报告 `review-passed`,不重复评论。
118
173
 
119
- 只有旧 `/lgtm`、旧 head 摘要或无法绑定 head 的历史门禁时,不得当作当前检视完成。若摘要已验证但 `/lgtm` 因中断未发送,恢复时必须重新确认当前 head、完整覆盖和无问题结论,并再次取得 `/lgtm` 确认。任何写操作超时都先查远端事实。
174
+ 只有旧 `/lgtm`、没有 helper 事务凭据或无法绑定当前 head 的历史门禁时,不得当作当前检视完成。当前 head 缺少可验证的精确 `/lgtm` 时,不自动补发;恢复时重新确认当前 head、完整覆盖和无问题结论,并再次取得 `/lgtm` 确认。任何写操作超时都由 helper 按写前评论集合、返回 discussion ID、reviewer 和完整正文哈希先查远端事实;无法唯一恢复时停止 `blocked: comment-write-uncertain`,禁止直接重试或改用 raw CLI。
120
175
 
121
- 有 finding 的幂等键为:`canonical + PR + review_head_sha + reviewer + path/position + finding 完整正文`。既有等价 finding 直接复用,不重复发布。
176
+ 有 finding 的幂等键为:`canonical + PR + review_head_sha + reviewer + path/position + finding 完整正文`。既有等价 finding 经 comment detail 或 helper 事务凭据绑定当前 head 后直接复用,不重复发布。
122
177
 
123
178
  ## 完成输出
124
179
 
@@ -128,11 +183,11 @@ PR/head: <canonical>#<number> @ <review_head_sha>
128
183
  Reviewer/author: <accounts>
129
184
  Coverage: <files/context reviewed and exclusions>
130
185
  Findings: <new/existing counts and summaries>
131
- Remote writes: <discussion IDs, summary ID, /lgtm ID or none>
186
+ Remote writes: <finding discussion IDs, /lgtm ID or none>
132
187
  Current state: review-passed | review-findings | review-incomplete | waiting | blocked
133
188
  Blocker: none | details
134
189
  Suggested next action: none | wait for author and re-run code-review on new head
135
190
  Confirmation required: none | finding comments | /lgtm for current head
136
191
  ```
137
192
 
138
- 只有精确 `/lgtm` 已被远端回读时才能报告 `review-passed`。仅仅“分析未发现问题”但尚未确认或写入时,状态为 `waiting: lgtm-confirmation`。
193
+ 只有精确 `/lgtm` 已被 helper 远端回读且写后 head 仍匹配时才能报告 `review-passed`。仅仅“分析未发现问题”但尚未确认或写入时,状态为 `waiting: lgtm-confirmation`。
@@ -22,7 +22,9 @@ GitCode CLI 版本和命令集合可能不同。工作流必须探测能力,
22
22
  <gitcode-command> schema "issue view"
23
23
  <gitcode-command> schema "issue edit"
24
24
  <gitcode-command> schema "issue comment"
25
+ <gitcode-command> schema "milestone list"
25
26
  <gitcode-command> schema "pr create"
27
+ <gitcode-command> schema "pr edit"
26
28
  <gitcode-command> schema "pr list"
27
29
  <gitcode-command> schema "pr view"
28
30
  <gitcode-command> schema "pr diff"
@@ -32,7 +34,9 @@ GitCode CLI 版本和命令集合可能不同。工作流必须探测能力,
32
34
  <gitcode-command> schema "pr merge"
33
35
  ```
34
36
 
35
- 若无 schema,对应使用 `<command> --help`。只探测当前 action 所需命令;`create-issue` 至少需要 `issue create` 的显式 repo、title、body-file、JSON 和 dry-run,以及 `issue view` 的 JSON 回读能力;非 ASCII 标题还需要同一 CLI `api --input <utf8-json-file>`。`openlibing-auth` 至少需要可有界列举 canonical PR、读取 PR head/labels/comments JSON 能力。`code-review` 至少需要 `pr view`/`pr diff`/`pr comments` 的显式 repo 和 JSON 能力,以及 `pr comment` 的显式 repo、body-file、JSON、pathposition;完整 diff 必须未截断,comments 必须能识别 discussion、resolved、author path/position。若 typed CLI 无法补齐,可使用同一 CLI 管理凭证的 `api`;仍无法完整读取、去重或安全定位时返回 `blocked: review-capability-required`,不得发送 finding `/lgtm`。完整作者 E2E 记录仓库参数(`-R`/`--repo`)、JSON、body-file/comment-file/stdin、dry-run、fork、assignee、discussion/resolve、正文 edit 和标题 edit 能力。涉及人类可读远端文本时,必须确认 [state-and-safety.md](state-and-safety.md) 要求的 UTF-8 文件、stdin 或 `api --input <utf8-json-file>` 安全通道;Windows PowerShell 5.1 下只有 `--body`/`--comment`/`--title` 等字符串参数而入口为 `.cmd` wrapper 时,不把非 ASCII 文本直接放进命令行参数。
37
+ 若无 schema,对应使用 `<command> --help`。只探测当前 action 所需命令;`create-issue` 至少需要 `milestone list` 的显式 repo、JSON 和分页,`issue create` 的显式 repo、title、body-file、JSON 和 dry-run,`issue view` 的 JSON 回读能力,以及 `issue edit` 的显式 repo、milestone number 和 JSON。官方 npm GitCode CLI typed `issue create --title` `create-issue` 唯一支持的非 ASCII 标题创建通道;不得调用 `api .../issues --method POST` 测试或创建 Issue。`pr` 至少需要读取关联 IssuePR milestone 的 JSON 能力,以及 `pr edit` 的显式 repo、milestone number JSON;typed `pr create` 不支持 milestone 时,必须在同一次已确认的 PR action 中以 `pr edit --milestone` 关联并回读。`openlibing-auth` 至少需要可有界列举 canonical PR、读取 PR head/labels/comments 的 JSON 能力。完整作者 E2E 记录仓库参数(`-R`/`--repo`)、JSON、body-file/comment-file/stdin、dry-run、fork、assignee、discussion/resolve、正文 edit 和标题 edit 能力。涉及人类可读远端文本时,必须确认 [state-and-safety.md](state-and-safety.md) 要求的 UTF-8 文件、stdin 或 `api --input <utf8-json-file>` 安全通道;Windows PowerShell 5.1 下只有 `--body`/`--comment`/`--title` 等字符串参数而入口为 `.cmd` wrapper 时,不把非 ASCII 文本直接放进命令行参数。
38
+
39
+ `code-review` 是能力降级顺序的专用例外:Agent 不直接探测或组合 GitCode 命令,只调用 Skill 随附的 `scripts/gitcode_review.py`。setup 必须验收 `issue view`、`pr view`、`pr comments`、`pr comment` 和 `api`;helper 内部只使用 [code-review.md](code-review.md) 固定的数据路径,以 `pulls/<number>/files` 而不是 typed `pr diff --json` 读取完整 changed-files。helper 的 `snapshot`/`context`/`finding`/`lgtm` 返回能力不足、未知 schema 或不完整响应时,停止为 `blocked: review-capability-required` 或 `review-incomplete`;不得退回 raw CLI、网页 raw URL、`curl`、现场 `python -c`/PowerShell JSON、展示文本 grep 或其他 endpoint 试探。
36
40
 
37
41
  ## 安装/升级 handoff
38
42
 
@@ -46,6 +50,8 @@ npx msdevflow setup
46
50
 
47
51
  ## 能力降级顺序
48
52
 
53
+ 除 `code-review` 外:
54
+
49
55
  1. CLI 缺失或核心 capability 不足时,返回 `blocked: bootstrap-required`,由用户运行独立 setup 后恢复;
50
56
  2. typed CLI command;
51
57
  3. 同一 CLI 的其他 typed command/JSON 输出;
@@ -53,6 +59,8 @@ npx msdevflow setup
53
59
  5. 网页人工操作说明;
54
60
  6. blocked。
55
61
 
62
+ `code-review` 不适用上述运行时降级;其唯一入口是固定 helper,helper 失败即阻断,不切换命令或数据路径。
63
+
56
64
  禁止:
57
65
 
58
66
  - 读取 CLI 配置获取 Token;
@@ -65,10 +73,10 @@ npx msdevflow setup
65
73
  ## 常见版本差异
66
74
 
67
75
  - 某些版本没有 `repo` 或 `api`;默认分支可从 `git remote show`、remote HEAD、PR base 或平台网页事实交叉确认。
68
- - 某些版本只有 `pr view --comments`,没有结构化 `pr comments`;此时能阅读评论但无法可靠获得 discussion/resolved 字段,作者 feedback 的逐条 reply/resolve 应降级为人工步骤,`code-review` 则因无法可靠去重而返回 `blocked: review-capability-required`。
69
- - 某些版本的 `pr comment` 不支持 `path`/`position` 或其 position 语义不清;`code-review` 不得猜测行内位置。问题无法安全改为带精确 `path:line` 的 PR 普通评论时返回 `blocked: review-capability-required`。
76
+ - 某些版本只有 `pr view --comments`,没有结构化 `pr comments`;此时能阅读评论但无法可靠获得 discussion/resolved 字段,作者 feedback 的逐条 reply/resolve 应降级为人工步骤,`code-review` 固定 helper 则返回 `blocked: review-capability-required`。
77
+ - 某些版本的 `pr comment` 不支持 `path`/`position` 或其 position 语义不清;`code-review` 固定 helper 不猜测行内位置。问题可由 helper 安全发布为带精确 `path:line` 的 PR 普通评论时使用普通评论,否则返回 `blocked: review-capability-required`。
70
78
  - 某些版本不支持 `--json`;不得用彩色展示文本做关键写操作的唯一确认,至少通过第二个只读命令回读。
71
- - 某些版本不支持 forkbody-file;应升级 CLI。若 typed command 缺少 UTF-8 安全文本输入,优先使用同一 CLI 的 `api --input <utf8-json-file>`;仍无法安全表达时给出网页人工步骤或进入 `blocked`。
79
+ - 某些版本不支持 forkbody-file、里程碑分页、`issue create --milestone` 或 `pr edit --milestone`;应升级 CLI。不得因 PR 已创建就忽略里程碑关联失败或声称 `pr-open`。若 typed command 缺少 UTF-8 安全文本输入,优先使用同一 CLI 的 `api --input <utf8-json-file>`;仍无法安全表达时给出网页人工步骤或进入 `blocked`。
72
80
  - Windows PowerShell 5.1 的原生管道默认编码不是可靠的 UTF-8;不得把含中文的字符串裸管道到 CLI,也不得依赖 `Out-File`/`Set-Content` 默认编码生成正文文件。
73
81
  - CLI 参数可能使用 `-R` 或 `--repo`;以 schema/help 为准。
74
82