msdevflow 0.8.1 → 0.8.3

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/lib/bootstrap.js CHANGED
@@ -50,12 +50,13 @@ 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", "milestone", "repo", "title"],
53
+ "issue create": ["body-file", "dry-run", "issue-type", "json", "milestone", "repo", "title"],
54
54
  "issue list": ["assignee", "json", "repo", "state"],
55
55
  "issue view": ["comments", "json", "repo"],
56
- "issue edit": ["assignee", "json", "milestone", "repo", "state"],
56
+ "issue edit": ["assignee", "body-file", "json", "label", "milestone", "repo", "state", "title", "yes"],
57
57
  "issue comment": ["body-file", "json", "repo"],
58
58
  "issue prs": ["json", "repo"],
59
+ "label list": ["json", "limit", "page", "per-page", "repo"],
59
60
  "milestone list": ["json", "limit", "page", "per-page", "repo"],
60
61
  "pr create": ["base", "body-file", "fork", "head", "json", "repo", "title"],
61
62
  "pr edit": ["json", "milestone", "repo"],
@@ -1518,6 +1519,10 @@ function wrapperContent(details, platform) {
1518
1519
  : `#!/usr/bin/env bash\nexec ${shellQuote(details.cliTarget)} "$@"\n`;
1519
1520
  }
1520
1521
 
1522
+ function isNpmGitcodeShim(content) {
1523
+ return /@gitcode-cli|gitcode\.js/i.test(content);
1524
+ }
1525
+
1521
1526
  function validateWrapper(details, platform) {
1522
1527
  const existing = readOptionalFile(details.wrapper);
1523
1528
  if (existing === null) {
@@ -1527,7 +1532,7 @@ function validateWrapper(details, platform) {
1527
1532
  if (platform !== "win32") {
1528
1533
  accepted.push(`#!/usr/bin/env bash\nexec "${details.cliTarget}" "$@"\n`);
1529
1534
  }
1530
- if (!accepted.includes(existing)) {
1535
+ if (!accepted.includes(existing) && !isNpmGitcodeShim(existing)) {
1531
1536
  throw new BootstrapError(`Refusing to overwrite unrelated wrapper: ${details.wrapper}`, 3);
1532
1537
  }
1533
1538
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "msdevflow",
3
- "version": "0.8.1",
3
+ "version": "0.8.3",
4
4
  "description": "Install the msdevflow GitCode skill and its runtime dependencies",
5
5
  "type": "module",
6
6
  "bin": {
@@ -64,7 +64,9 @@ msd-merge
64
64
  4. 不执行下游 action。例如 `action=ci` 通过后不得处理 feedback 或 merge;`action=pr` 创建 PR 后不得自动触发 CI。
65
65
  5. action 自身为安全完成所必需的复验属于本 action:例如 `pr` 在提交前重新运行适用本地门禁,`feedback` 修改后运行受影响本地测试。这不授权执行独立的下游 `ci`、补做缺失的产品实现或扩大范围。
66
66
  6. `ci` 和完整 E2E 在 openLiBing 只读接口返回 401/403 时可运行 OAuth 认证子流程并恢复原流程;这是读取当前 CI 证据的必要步骤,不视为越界执行显式 `openlibing-auth` action。
67
- 7. 所有远端写仍遵循 guided/autonomous 授权、UTF-8、尾签、幂等和最终 merge 确认规则。
67
+ 7. 每个 action 在自身边界内连续执行到完成状态;不得在分析、设计、编辑、验证等中间步骤询问是否继续。能从权威证据、仓库约定和已确认目标可靠推导的结论直接采用,并报告依据,不把可自行完成的判断转交用户。
68
+ 8. 只有证据缺失或矛盾且不同选择会实质改变范围、公共行为、兼容性、性能目标或风险,或安全契约明确要求确认时才询问;其余不影响已确认语义的实现细节选择最小、可逆且符合仓库惯例的方案。
69
+ 9. action 内端到端完成不授权执行其上游或下游 action,也不替代 guided/autonomous 授权、UTF-8、尾签、幂等和最终 merge 确认规则。
68
70
 
69
71
  ## 完整作者 E2E
70
72
 
@@ -109,7 +111,7 @@ discovered -> claimed -> verified -> analyzed -> designed
109
111
  -> approved -> merge-confirmed -> merged
110
112
  ```
111
113
 
112
- 任一状态可进入 `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` 绑定,不进入作者状态机。
114
+ 任一状态可进入 `blocked`。状态晋级必须有远端或本地证据,不能只依据先前文本声明。`designed` 的证据按 [references/design-and-development.md](references/design-and-development.md) 的分级和实际触发维度确定:simple 使用最小设计记录;standard/complex 使用决策树结论,并分别为行为、领域与数据、兼容性、性能等触发维度提供对应证据,未触发的维度不强制生成产物。用户原始请求已完整表达 simple 的最小设计时即视为确认;其他适用设计内容由用户整体确认后才进入实现。`issue-created` 和 `openlibing-authenticated` 是独立 action 的完成状态,不改变作者主流程的业务阶段;`issue-created` 不自动进入 `claimed`,`openlibing-authenticated` 也只作为 `ci`/E2E 的条件性认证子状态。`review-findings`、`review-passed` 和 `review-incomplete` 仅属于独立 `code-review`,按 reviewer 与固定 `review_head_sha` 绑定,不进入作者状态机。
113
115
 
114
116
  ## 全局不变量
115
117
 
@@ -138,7 +140,7 @@ discovered -> claimed -> verified -> analyzed -> designed
138
140
  ## Action 完成条件
139
141
 
140
142
  - `discover`:查询范围、候选和排除证据已报告,无远端写入。
141
- - `create-issue`:按确认的仓库或同类型 community 模板创建一个 Issue;开放里程碑唯一时自动选择、多个时由用户选择、没有时明确为 `none`,远端回读确认目标、标题、完整正文、唯一尾签和元数据逐项一致;不创建里程碑,也不执行查重、接取或开发。
143
+ - `create-issue`:按确认的仓库或同类型 community 模板创建一个 Issue;创建参数显式设置已核实的平台类型,必需标签完整分页核验后应用,标题包含仓库/模板约定或默认的类型前缀。开放里程碑唯一时自动选择、多个时由用户选择、没有时明确为 `none`;远端回读必须确认平台类型与用户意图一致、前缀标题逐字一致、必需标签齐全,以及目标、完整正文、唯一尾签和其余元数据一致。类型错误或不可验证、缺少必需标签均为 `blocked`,不报告 `issue-created`;不创建标签或里程碑,也不执行查重、接取或开发。
142
144
  - `issue`:接取状态按授权完成或确认可继续,Issue、关联 PR 和 canonical 默认分支已核验,无重复开发。
143
145
  - `develop`:范围和方案已确认,工作分支基于最新 canonical,任务实现且适用本地门禁有实际证据。
144
146
  - `pr`:普通 canonical PR 回读确认 source/head/base、Issue 关联、标题和正文正确,且 PR 里程碑与目标 Issue 精确一致或两者均为 `none`。
@@ -23,6 +23,7 @@ GitCode CLI 版本和命令集合可能不同。工作流必须探测能力,
23
23
  <gitcode-command> schema "issue edit"
24
24
  <gitcode-command> schema "issue comment"
25
25
  <gitcode-command> schema "milestone list"
26
+ <gitcode-command> schema "label list"
26
27
  <gitcode-command> schema "pr create"
27
28
  <gitcode-command> schema "pr edit"
28
29
  <gitcode-command> schema "pr list"
@@ -34,7 +35,7 @@ GitCode CLI 版本和命令集合可能不同。工作流必须探测能力,
34
35
  <gitcode-command> schema "pr merge"
35
36
  ```
36
37
 
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` 至少需要读取关联 Issue 和 PR 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
+ 若无 schema,对应使用 `<command> --help`。只探测当前 action 所需命令;`create-issue` 至少需要 `milestone list` 的显式 repo、JSON 和分页,`label list` 的显式 repo、JSON 和完整分页,`issue create` 的显式 repo、title、body-file、issue-type、JSON 和 dry-run,`issue view` 的 JSON 回读能力,以及 `issue edit` 的显式 repo、label、title、body-file、milestone number、yes 和 JSON。平台 `issue_type` 不在 typed view 输出时须用已验证的同 CLI 单 Issue GET JSON 回读;类型枚举和名称/ID 映射只采用当前官方文档、CLI 实现或仓库类型配置支持的只读路径,不猜 endpoint。`--issue-type` 的 enterprise 标注不是目标仓库支持证据;类型无法明确设置或回读时在创建前阻断,不能省略参数创建默认 Bug。标签完整分页证明必需标签缺失时也必须阻断,不降级为 `none`。官方 npm GitCode CLI 的 typed `issue create --title` 是 `create-issue` 唯一支持的非 ASCII 标题创建通道;不得调用 `api .../issues --method POST` 测试或创建 Issue。`pr` 至少需要读取关联 Issue 和 PR 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
 
39
40
  `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 试探。
40
41
 
@@ -8,9 +8,9 @@
8
8
 
9
9
  本 action 是一次性 Issue 创建事务。最终预览得到用户明确确认前,禁止任何会改变远端状态的操作,包括 Issue/PR 创建、编辑、关闭、删除、评论、标签或里程碑写入;只允许 schema/help、dry-run、本地序列化和只读查询。`POST` 到 Issue 集合永远是真实创建,不得用测试标题、最小 payload、权限探测、编码探测、字段探测或“dry-run API”名义调用。
10
10
 
11
- 每个 action run 最多允许一次真实 Issue 创建请求,而且只能发送已确认预览中的完整 payload。发起请求前将本次 run 标记为 `create_attempted=true`;无论返回成功、400/403、超时、连接中断、进程失败、空响应还是结果无法解析,都不得重置该标记,也不得切换 CLI/API、修改标题/正文/类型/标签/里程碑后再次创建。创建尝试后只能按“回读、恢复与完成”执行有界只读查询和同一 Issue 回读;不能证明结果时返回 `blocked: create-result-uncertain`,不得重试。
11
+ 每个 action run 最多允许一次真实 Issue 创建请求,而且只能发送已确认预览中的完整 payload。发起请求前将本次 run 标记为 `create_attempted=true`;无论返回成功、400/403、超时、连接中断、进程失败、空响应还是结果无法解析,都不得重置该标记,也不得切换 CLI/API、修改标题/正文/类型/标签/里程碑后再次创建。创建尝试后只允许本文件规定的有界只读恢复、同一 Issue 回读,以及确认创建结果后应用或修复该 Issue 的已确认元数据;不能证明结果时返回 `blocked: create-result-uncertain`,不得重试创建。
12
12
 
13
- 预览确认只授权一次完全匹配的最终创建,不授权测试写入、替代 payload、关闭旧 Issue 或在本 action 内创建第二个 Issue。确认前若标题、类型、正文或元数据变化,必须重新生成完整预览并重新确认;创建成功后本 action 立即结束,不在本 action 内把 Issue 改成另一类型、关闭它或创建替代 Issue。
13
+ 预览确认只授权一次完全匹配的最终创建,以及对同一 Issue 应用或修复已确认元数据,不授权测试写入、替代 payload、关闭旧 Issue 或在本 action 内创建第二个 Issue。确认前若标题、类型、正文或元数据变化,必须重新生成完整预览并重新确认;只有元数据应用和完整回读通过后本 action 才结束。不得改成另一未确认类型;把服务器实际值纠正为已确认类型仅按“回读、恢复与完成”的已验证编辑能力执行。
14
14
 
15
15
  本 action 不执行重复或相似 Issue/PR 查找。只有创建命令超时、中断或结果不确定时,才允许为恢复本次写入而有界查询:限定当前账号、action 启动时间之后、目标仓库、标题和完整正文逐字一致;这不是产品查重,未找到唯一结果时停止,不直接重试。
16
16
 
@@ -25,7 +25,7 @@
25
25
  3. 只保留可识别的 Issue 模板;排除 PR/Pull Request/Merge Request 模板、`config.yml`/`config.yaml`、模板选择配置、普通说明文档和其他非 Issue 文件。
26
26
  4. 根据文件名、模板 `name`/`description`、YAML 顶层 `labels` 以及 Markdown frontmatter 判断类型。只有证据唯一一致时才自动归类;证据冲突时视为模板无效。
27
27
  5. YAML Issue Form 至少应可解析为映射,包含非空 `name`、`description` 和 `body` 列表;每个需要用户填写的项必须有受支持的 `type`、可显示 label 或等价提示,并能判断是否必填。Markdown 模板必须有可识别的 Issue 模板 frontmatter 或明确的 Issue 字段结构。
28
- 6. 对用户描述只能唯一推断为 `bug-report`、`feature-request`、`documentation` `question` 之一时自动选择该类型;无法唯一推断时展示类型、模板名称、说明和路径,让用户选择。不得默认选择第一个、按列表顺序猜测或拼接多个模板。
28
+ 6. 用户明确指定的类型优先于自然语言推断,固定为 `requested_type`:`feature`/特性/需求建议 → `feature-request`,bug/缺陷 → `bug-report`,文档 `documentation`,咨询 → `question`。只有用户未指定时才按描述唯一推断;无法唯一推断时展示类型、模板名称、说明和路径,让用户选择。不得因为描述里有“问题”就把特性改为 bug,不得默认选择第一个、按列表顺序猜测或拼接多个模板。
29
29
  7. 若目标仓库存在匹配类型的模板但模板损坏、证据冲突、含无法表达的必填控件或格式不受支持,返回 `blocked: repository-template-invalid`,报告路径和原因;不得回退到通用模板。
30
30
  8. 同一类型存在多个有效模板且无法按名称、说明和用户描述唯一选择时,展示候选并等待用户确认。
31
31
 
@@ -48,6 +48,37 @@ https://gitcode.com/Ascend/community/tree/master/.gitcode/.gitcode/ISSUE_TEMPLAT
48
48
 
49
49
  回退必须保持类型一致,不因某个模板无效而改用另一类型,不跨目标仓库与 community 拼接字段。fallback 文件也必须从远端 `master` 读取并按相同规则验证;无匹配或无效时返回 `blocked: fallback-template-unavailable`。
50
50
 
51
+ ## 平台类型、标签与标题前缀
52
+
53
+ `requested_type`(用户意图)、模板类别、平台 `issue_type`、labels 和标题前缀是独立字段,必须一致表达所选类型;使用 Feature 正文模板、加 `feature` 标签或 `[Feature]` 前缀都不能代替设置平台类型。
54
+
55
+ ### 平台类型
56
+
57
+ 1. 创建前通过当前 CLI 的 schema/help、官方接口说明和目标仓库的只读类型配置,确认平台可用类型及其精确名称/ID,并固定 `platform_issue_type` 及映射证据。类型名称只能按已验证映射关联到 `requested_type`,不得把 `feature-request` 文件名直接当成平台接受的值。
58
+ 2. `issue create --issue-type` 可能标注为 enterprise 能力;有这个 flag 不等于目标仓库支持它。必须只读确认当前仓库适用性和参数接受名称还是 ID。没有已知类型列表命令时只使用官方文档或已验证 CLI 实现支持的只读接口,不猜 endpoint、不用 POST 探测,也不通过查找现有 Issue 猜类型。
59
+ 3. 平台类型的创建参数和回读通道都必须在创建前确定。typed `issue view --json` 不提供类型时,使用同一 CLI 的已验证单 Issue GET JSON,例如 `<gitcode-command> api "repos/<canonical>/issues/<number>"`,读取 `issue_type`/`issue_type_detail`;不得把字段缺失当成类型正确。
60
+ 4. 无法证明所需类型可明确设置并回读时,返回 `blocked: issue-type-unavailable`,不执行真实创建,不省略类型参数依赖默认值。dry-run 只证明请求序列化,不证明服务器会接受该类型。
61
+
62
+ ### 标签解析
63
+
64
+ 1. 模板声明的 labels 和用户明确要求的 labels 都是必需元数据,不得静默降级为 `none`。模板未声明类型标签时,按 `requested_type` 查找 `feature`、`bug`、`documentation` 或 `question`;只有仓库规则明确规定别名映射时才用该别名,不能靠语义相近自行替换。
65
+ 2. 用目标仓库的 `label list` JSON 分页核验精确标签,固定 `per-page`、逐页递增 `page`,并按 schema 保证每页 `limit` 不小于 `per-page`。没有找到所有必需标签时,继续到分页元数据表明结束,或没有元数据时返回数量小于 `per-page`/空页;恰好返回 100 条不表示只有 100 条。不能只查第一页就断言标签不存在,`limit` 截断也不能作为不存在的证据;重复页或无法证明完整性时返回 `blocked: label-discovery-incomplete`。
66
+ 3. 优先精确名称匹配;仅大小写不同的匹配须在完整分页后证明唯一,再使用仓库返回的精确名称并记录映射。完整查询后仍无匹配则返回 `blocked: required-label-unavailable`,不创建新标签,也不丢弃标签继续创建。
67
+ 4. 固定预期标签集合 `required_labels` 和已验证 `issue edit --label` 参数;每个标签的来源、精确名称和应用方式都进入预览。用户要求、模板或仓库类型标签之间有矛盾时阻断,不得把互相矛盾的类型标签全部附上。标签应用能力不足时在创建前阻断,而不是创建后才发现无法补齐。
68
+
69
+ ### 标题前缀
70
+
71
+ 仓库明确规则优先,其次所选模板顶层 `title`/Markdown frontmatter 的类型前缀;二者冲突时按模板无效规则阻断。均未规定前缀时,使用本 Skill 默认值:
72
+
73
+ | requested_type | 默认标题前缀 |
74
+ |---|---|
75
+ | feature-request | `[Feature]` |
76
+ | bug-report | `[Bug]` |
77
+ | documentation | `[Docs]` |
78
+ | question | `[Question]` |
79
+
80
+ 最终标题以正确的类型前缀开头且只出现一次;已存在同类前缀时保留一个,存在相反类型前缀时按已明确的 `requested_type` 修正后预览,不得保留 `[Bug]` 来提交 Feature。预览、dry-run、真实创建和回读使用同一完整标题,不依赖平台自动添加前缀。
81
+
51
82
  ## 里程碑选择
52
83
 
53
84
  模板确定后、生成最终预览前,分页读取 canonical repository 的里程碑 JSON,并按权威 `state` 字段只保留开放里程碑。`milestone list` 没有服务端状态筛选时,按返回的分页元数据继续读取;没有分页元数据时,固定 `per-page` 并读取到结果少于该值或出现空页,再统一过滤,不能只检查第一页。
@@ -63,8 +94,8 @@ https://gitcode.com/Ascend/community/tree/master/.gitcode/.gitcode/ISSUE_TEMPLAT
63
94
 
64
95
  - YAML `markdown` 项只作为填写说明,不伪造为用户答案;`input`、`textarea`、`dropdown` 和 `checkboxes` 转为保持原顺序的 Markdown 字段。
65
96
  - Markdown 模板保留原有标题、章节、提示和顺序,只替换明确的填写占位内容;不得删除仓库要求的声明或检查项。
66
- - 模板顶层 `title` 只作为前缀或建议,最终标题必须完整、具体且由预览确认。
67
- - 只使用模板声明且目标仓库可接受的 labels、assignees 和其他元数据;不创建新标签、不擅自新增负责人。里程碑只按本文件的确定性选择规则设置,不创建或修改里程碑。无法安全应用必需元数据时进入 `blocked`。
97
+ - 最终标题必须完整、具体,按“标题前缀”规则包含正确且唯一的前缀,再由预览确认;不得将模板 `title` 当成可随意丢弃的建议。
98
+ - 平台类型和必需标签按上节固定;assignees 和其他元数据只使用模板声明或用户明确要求、且目标仓库可接受的值,不擅自新增负责人。里程碑只按本文件的确定性选择规则设置,不创建或修改里程碑。无法安全应用必需元数据时进入 `blocked`。
68
99
  - 不编造环境、复现步骤、日志、链接、截图、版本、影响范围或验收结果。自然语言中无法推出的必填字段一次只询问一个;选填字段无法推出时保留明确的“未提供”或按模板允许留空。
69
100
  - 最终 Issue 正文末尾与主体间隔一个空行并恰好附加一次 `——msdevflow`。
70
101
 
@@ -80,12 +111,17 @@ https://gitcode.com/Ascend/community/tree/master/.gitcode/.gitcode/ISSUE_TEMPLAT
80
111
  Account: <username>
81
112
  Operation target: <canonical>
82
113
  Default branch: <branch>
83
- Issue type: <type>
114
+ Requested type: <requested_type>
115
+ Platform issue type: <exact name/ID + mapping evidence + create argument>
84
116
  Template source: repository | Ascend/community fallback
85
117
  Template ref/path: <repository>@<ref>:<path>
86
- Title: <exact title>
118
+ Title prefix: <exact prefix + repository/template/default source>
119
+ Title: <exact title including prefix>
87
120
  Body: <complete rendered body including one signature>
88
- Labels/assignees: <exact values or none>
121
+ Labels: <required_labels with exact repository names + template/user/type source>
122
+ Assignees: <exact values or none>
123
+ Metadata plan: <same-Issue label/assignee/milestone edit arguments>
124
+ Dry-run: <creation payload matched; platform acceptance not yet tested>
89
125
  Milestone: <number + exact title + open + due date, or none>
90
126
  Milestone selection: explicit | user-selected | sole open milestone | no open milestone
91
127
  Duplicate search: not performed by design
@@ -102,55 +138,65 @@ Duplicate search: not performed by design
102
138
  使用前只读探测:
103
139
 
104
140
  ```bash
141
+ <gitcode-command> schema "label list"
105
142
  <gitcode-command> schema "milestone list"
106
143
  <gitcode-command> schema "issue create"
107
144
  <gitcode-command> schema "issue view"
108
145
  <gitcode-command> schema "issue edit"
109
146
  ```
110
147
 
111
- 将最终正文写入唯一的系统临时文件,编码固定为 UTF-8 无 BOM。官方 npm GitCode CLI 的 `issue create --title` 是本 Skill 已验收的中文标题通道;Windows `.cmd` wrapper 也直接使用 typed command,不得为中文标题切换到 API POST。预览确认后可以先用最终仓库、标题和正文文件执行一次本地 dry-run:
148
+ 必须具备 `issue create --issue-type`、完整的标签分页、同 Issue 标签/里程碑编辑和平台类型 JSON 回读能力;具体类型的适用性仍按“平台类型”核验,不能只看 flag 是否存在。
149
+
150
+ 将最终正文写入唯一的系统临时文件,编码固定为 UTF-8 无 BOM。官方 npm GitCode CLI 的 `issue create --title` 是本 Skill 已验收的中文标题通道;Windows `.cmd` wrapper 也直接使用 typed command,不得为中文标题切换到 API POST。最终预览前必须用固定仓库、带前缀标题、正文文件和已验证的平台类型执行本地 dry-run:
112
151
 
113
152
  ```text
114
- <gitcode-command> issue create -R <canonical> --title <exact-title> --body-file <utf8-body-file> --dry-run --json
153
+ <gitcode-command> issue create -R <canonical> --title <exact-title> --body-file <utf8-body-file> --issue-type <platform-issue-type> --dry-run --json
115
154
  ```
116
155
 
117
- dry-run 的输出不得包含新 Issue number/URL;否则视为能力异常并停止。真实创建固定只携带仓库、最终标题、最终正文文件和 JSON 输出,不在创建命令中传 label、assignee、milestone 或其他可选元数据:
156
+ dry-run 不得产生新 Issue number/URL;否则视为能力异常并停止。按 JSON 逐项比较 repository、完整 title、完整 body 和非空 `issue_type` 与预期创建参数一致;类型为空、缺失或不一致时返回 `blocked: create-payload-mismatch`,不得继续真实创建。labels/assignees/milestone 按预先验证的同 Issue 编辑计划应用,dry-run 中这些字段暂为空不代表允许丢弃最终必需元数据。预览同时覆盖创建参数和该编辑计划,不得只展示模板类型冒充平台类型。
157
+
158
+ 真实创建使用与 dry-run 完全相同的参数,仅去掉 `--dry-run`;平台类型是必需创建参数,不得省略并依赖默认值:
118
159
 
119
160
  ```text
120
- <gitcode-command> issue create -R <canonical> --title <exact-title> --body-file <utf8-body-file> --json
161
+ <gitcode-command> issue create -R <canonical> --title <exact-title> --body-file <utf8-body-file> --issue-type <platform-issue-type> --json
121
162
  ```
122
163
 
123
- 执行真实命令前设置 `create_attempted=true`。该命令是本次 run 唯一允许的创建请求;禁止使用 `test-*`、`*-check`、`permission-*`、最小正文或其他替代 payload 探测权限、编码、标签、里程碑或字段组合。认证和权限只能通过 `auth status`、schema、dry-run 判断;最终创建仍失败时返回 `blocked`,不得发测试 Issue 或改用另一创建通道。
164
+ 执行真实命令前设置 `create_attempted=true`。该命令是本次 run 唯一允许的创建请求;禁止使用 `test-*`、`*-check`、`permission-*`、最小正文或其他替代 payload 探测权限、编码、标签、里程碑或字段组合。预览确认后若任何参数或正文文件变化,停止并重新执行本地校验和预览确认,不按变更内容直接创建。`auth status`、schema、dry-run 不证明服务器写权限;最终创建仍失败时返回 `blocked`,不得发测试 Issue 或改用另一创建通道。
124
165
 
125
- 创建成功并获得 Issue number 后,才可对同一个 Issue 应用预览确认过的元数据。里程碑固定使用:
166
+ 创建返回 Issue number 后,先回读确认平台类型,再按预览计划对同一个 Issue 应用标签、assignees 和里程碑;这仍是同一次创建事务,不得提前报告 `issue-created`。标签使用已验证的 typed `issue edit --label` 语义,不假设多值参数格式;编辑前读取现有标签,若参数替换集合则发送现有集合与 `required_labels` 的并集,避免删掉机器人或人工标签。里程碑固定使用:
126
167
 
127
168
  ```text
128
169
  <gitcode-command> issue edit <issue-number> -R <canonical> --milestone <milestone-number> --json --yes
129
170
  ```
130
171
 
131
- 未选择里程碑时不执行该命令。模板声明的 label/assignee 只有在创建前只读证明目标仓库接受、`issue edit` schema 明确支持且预览已列出时才可原地应用;否则预览必须明确为 `none`,不得把未经确认或不存在的元数据塞入创建请求。平台自动附加的系统类型标签在回读中单独披露,不得误报为 Agent 请求的 label
172
+ 未选择里程碑时不执行该命令。label/assignee 仅按创建前已验证并经预览确认的精确值应用;不支持必需字段时应在创建前阻断,不得把必需 label 改成 `none`。平台自动附加的其他标签单独披露;平台 `issue_type` 不是 label,两者必须独立验证。
132
173
 
133
174
  正文文件在 dry-run、唯一一次真实创建和必要回读完成后立即删除。typed command、UTF-8 文件输入或必要的同 Issue metadata edit 能力不足时返回 `blocked: bootstrap-required` 或 `blocked: utf8-safe-create-unavailable`;不得猜测 API 字段、发起 POST 实验或创建替代 Issue。
134
175
 
135
176
  ## 回读、恢复与完成
136
177
 
137
- 创建返回 Issue number/URL 后,立即用权威 JSON 读取该 Issue,逐项验证:
178
+ 创建返回 Issue number/URL 后立即回读目标与类型;仅在该门禁通过后应用已确认元数据,随后再次用权威 JSON 完整验证:
138
179
 
139
180
  - repository 和 Issue number/URL;
140
181
  - state 为 open;
141
- - 标题逐字一致;
182
+ - 平台 `issue_type`/`issue_type_detail` 与固定的 `platform_issue_type` 名称/ID 按已验证映射一致,并与 `requested_type` 同类;不能只核对正文模板;
183
+ - 标题逐字一致,包含正确且唯一的类型前缀;
142
184
  - 正文统一换行为 `\n` 后逐字一致,且尾签恰好一次;
143
- - 预览中要求的 labels assignees 已实际应用;
185
+ - 预览中全部 `required_labels` 都出现在实际 labels 中,assignees 也与预览一致;额外系统标签单独披露;
144
186
  - 里程碑回读结果与预览中的 number 和标题精确一致,或预览明确为 `none` 且实际未关联。
145
187
 
146
- 创建结果不确定时只执行本文件定义的有界恢复查询;找到多个或无法证明唯一时返回 `blocked: create-result-uncertain`。创建成功但正文、标题或里程碑不一致时,只有已验证 UTF-8 安全且支持目标字段的 `issue edit` 能力可原地修复;设置里程碑时使用同一 canonical 和已确认的 number,清空里程碑则必须先由当前 schema/help 或只读事实验证明确语义,不得猜测 `0` 的含义。无法安全修复时停止并报告 Issue URL,不得再创建一个 Issue。
188
+ 创建结果不确定时只执行本文件定义的有界恢复查询;找到多个或无法证明唯一时返回 `blocked: create-result-uncertain`。创建已存在但平台类型错误(例如预期 Feature、实际 `Bug-Report`)或类型字段不可验证时,分别返回 `blocked: issue-type-mismatch` / `blocked: issue-type-unverified`,暂停标签/assignee/里程碑等后续写入,只允许下一段规定的已确认类型修复;不得解释成“只是系统标签”而宣称完成。
189
+
190
+ 类型、标签、标题、正文或里程碑与预览不一致时,只能用已验证 UTF-8 安全且支持目标字段的 typed `issue edit` 原地应用已确认值,然后重新完整回读。当前 edit 无类型参数时不得尝试猜测 API PATCH 字段;保留类型 blocker 和已创建 Issue URL,交由人工纠正,不创建替代 Issue。其他必需元数据无法应用或回读不一致时返回 `blocked: issue-metadata-mismatch`。设置里程碑时使用同一 canonical 和已确认的 number,清空里程碑则必须先由当前 schema/help 或只读事实验证明确语义,不得猜测 `0` 的含义。
191
+
192
+ 同 Issue 编辑响应不确定时也先回读;不能核实当前值或发现外部改动时停止,不盲目重试或覆盖。恢复到同一 Issue 后仍必须核验预览绑定的平台类型、完整前缀标题、必需标签和其余字段,不能以 Issue 已存在作为完成证据。
147
193
 
148
194
  只有完整回读通过才进入 `issue-created`:
149
195
 
150
196
  ```text
151
197
  action: create-issue
152
198
  Current state: issue-created | blocked
153
- Evidence: <canonical>#<number>, template ref/path, milestone number/title or none, exact readback
199
+ Evidence: <canonical>#<number>, requested/platform type, exact prefixed title, required labels, template ref/path, milestone number/title or none, exact readback
154
200
  Current head: na
155
201
  Blocker: none | details
156
202
  Suggested next action: issue | none
@@ -4,32 +4,69 @@
4
4
 
5
5
  ## Phase 3:需求分析与设计决策树
6
6
 
7
- 先搜索 Issue、评论、仓库文档和代码;材料中已有的事实不要反问用户。输出:
7
+ 先只读搜索 Issue、评论、仓库文档和受影响代码,优先从材料建立事实;材料中已有答案时不得反问用户。先按下方门禁完成一次分级,该结果同时决定设计负载和归档要求。
8
8
 
9
- - 当前理解;
10
- - 范围和非目标;
11
- - 验收标准;
12
- - 兼容性与风险;
13
- - 依赖和待确认项;
14
- - 候选方案及权衡。
9
+ ### 设计分级与归档门禁
15
10
 
16
- 对关键歧义建立决策树:上游目标和行为优先,下游模块、实现和测试随后;显式标明依赖。每轮只问一个最高价值问题,同时给推荐答案和理由,直到用户确认方案。
11
+ 识别本次变更触发的风险维度:
17
12
 
18
- ### 设计归档门禁
13
+ - **行为**:新增或改变用户流程、交互语义、可访问性语义、公共行为或接口契约;按已有明确契约恢复原行为,或做不改变语义的局部文案/样式修正,不单独触发本维度;
14
+ - **领域与数据**:正确性依赖表关系、基数、唯一性、顺序、时间语义等领域不变量;
15
+ - **兼容性**:新旧数据、接口、行为或调用方需要共存或迁移;
16
+ - **性能**:改动可能改变查询计划、I/O 或调用次数、遍历/匹配/过滤范围、缓存命中、内存分配,或其他随数据规模增长的成本;仅修改不影响执行路径的查询常量或拼写不触发本维度。
19
17
 
20
- 先分类变更复杂度。满足任一条件时,必须在仓库约定位置创建或更新 RFC/design:
18
+ 按且仅按以下一档执行:
21
19
 
22
- - 新增或改变用户交互、快捷键、可见 UI 或公共行为;
23
- - 新增会话/持久化状态、数据模型、接口或生命周期重置规则;
24
- - 横跨多个组件、模块或前后端;
25
- - 涉及兼容性、迁移、安全、性能或重要测试策略;
26
- - Issue、仓库规范或维护者要求设计文档。
20
+ 1. **simple**:局部、预期行为已有明确证据、无风险维度、无新状态,且不引入新的公共语义;可以恢复已有明确契约,或做不改变语义的局部文案/样式修正。只输出需求事实、改动范围、验收方式和跳过独立设计文档的理由;用户原始请求已明确覆盖这些内容时即视为整体确认,不重复询问,否则最多询问一个会影响实现的未决事实,并把回复视为整体确认。
21
+ 2. **standard**:范围限于单个组件且只触发一个风险维度,并且不新增或改变持久化状态、数据模型、公共接口,不涉及迁移或安全。建立决策树,只产出被触发维度的证据,不要求独立 RFC/design。
22
+ 3. **complex**:触发两个及以上风险维度;或跨多个组件/模块/前后端;或新增、改变持久化状态、数据模型、公共接口、生命周期、迁移、安全或重要测试策略;或 Issue、仓库规范、维护者要求设计文档。建立完整决策树,并在仓库约定位置创建或更新 RFC/design。
27
23
 
28
- 只有局部、行为明确、无新状态且不改变用户可见行为的简单修复,才可以不创建独立设计文档;跳过时必须记录理由。
24
+ 分级不确定时按更高一级处理。simple 的最小设计记录、standard 的决策树结论、complex 的归档文档都是 `designed` 状态的设计产物。
29
25
 
30
- 设计产物至少包含:需求事实、范围/非目标、决策树结论、状态与数据模型、交互流程、文件级计划、兼容性/风险、重置与恢复、测试方案、候选方案及取舍。实现复用建议必须与产品需求语义分开描述。
26
+ ### 决策树与提问
31
27
 
32
- **硬门禁:设计产物已落盘、路径已报告、内容经用户确认之前,不得创建工作分支或修改代码。** 若发现已经越过门禁,立即暂停实现,盘点现有修改,补齐并确认设计;不得用事后文档默认为已批准。
28
+ standard 和 complex 按依赖顺序建立决策树,上游未闭环前不得跳入下游:
29
+
30
+ 1. **目标与成功标准**;
31
+ 2. **范围与非目标**;
32
+ 3. **事实、约束和风险维度**;
33
+ 4. **目标模块、行为与接口契约**;
34
+ 5. **实现策略**:数据结构、算法、过滤时机和复用边界;
35
+ 6. **测试、性能验证、迁移/回滚和 PR 范围**。
36
+
37
+ 显式标明决策依赖和被否决方案。只有材料缺失、矛盾、过时或无法证明且会改变设计的事项才问用户;每轮只问一个最高价值问题,并给出推荐答案和理由。所有分支闭环后合并展示一次完整设计供用户确认;用户已明确确认完整方案时不重复确认各小节。
38
+
39
+ ### 领域事实与数据模型
40
+
41
+ 触发"领域与数据"维度时先发现后确认,不得只凭变量名、单个样本或实现习惯推断:
42
+
43
+ - 读取受影响链路中的权威定义和最小充分上下文,如 schema/迁移、实体或协议定义、生产者写入逻辑、消费者查询、现有测试和代表性样本;
44
+ - 对关键结论引用可定位的文件、符号、测试或命令证据;样本只能证明现象,不能单独证明唯一性等不变量;
45
+ - 列出关键字段、基数关系(1:1 / 1:N / N:M)、唯一确定规则、顺序与时间语义、缺失/重复数据行为;
46
+ - 将结论区分为已验证事实、由证据推导的结论和仍未证实的假设;只有最后一类且会影响设计时才询问用户。
47
+
48
+ ### 兼容性分析
49
+
50
+ 触发"兼容性"维度时:
51
+
52
+ - 记录改前行为,并用仓库内引用、签名和数据格式枚举已知调用方;可能存在仓库外消费者时显式记录风险,不假装已穷举;
53
+ - 列出新旧数据、接口和可见行为的差异,以及旧路径、旧格式、错误/缺失数据的处理方式;
54
+ - 明确兼容或迁移策略、回退方式、退役条件和验证用例。除非 Issue 明确要求改变,现有可观察行为默认保持不变。
55
+
56
+ ### 性能基线
57
+
58
+ 触发"性能"维度时:
59
+
60
+ - 必须先记录改前静态基线及证据:查询/I/O 次数、遍历与数据结构、处理数据范围、时间和空间复杂度;不得只用同阶 Big-O 证明性能不劣化;
61
+ - 有现成 benchmark、profiling 工具或可重复代表性数据时,改码前运行并记录命令、环境、数据规模和结果;热点路径、查询次数或同阶算法常数可能变化时,应优先补最小可重复基准;
62
+ - 无法安全获得运行基线时不伪造数据,改用查询次数、扫描范围、分配量和复杂度上界作为静态预算,并披露未测量风险;
63
+ - 写明改后目标和最终复测方法。默认不得增加渐进复杂度、查询往返或无界扫描,也不得出现超出测量波动的稳定回退;确需接受劣化时必须在设计阶段说明收益和代价并取得用户确认。
64
+
65
+ ### 设计产物门禁
66
+
67
+ 设计产物按分级包含最小记录或归档文档:simple 覆盖需求事实与证据、改动范围和验收方式;standard/complex 还须覆盖范围/非目标、决策树结论、触发风险维度的分析、文件级计划、测试与回滚。实现复用建议必须与产品需求语义分开描述。
68
+
69
+ **硬门禁:对应分级的设计产物已展示、内容经用户整体确认之前,不得创建工作分支或修改代码;complex 还必须先落盘并报告路径。** 若发现已经越过门禁,立即暂停实现,盘点现有修改,补齐并确认设计;不得用事后文档默认为已批准。
33
70
 
34
71
  ## Phase 4:分支和计划
35
72
 
@@ -61,15 +98,27 @@ git switch -c <branch> <canonical-remote>/<default-branch>
61
98
 
62
99
  失败必须修复或记录 blocker。不能验证 UI 或运行全量测试时,执行风险匹配的最小集合并披露未运行项。不得声称未执行的检查通过。
63
100
 
101
+ ### 实现对照设计验证
102
+
103
+ - **simple**:实现后运行受影响测试和最小适用门禁,确认结果符合最小设计记录。
104
+ - **standard/complex**:逐项修改后只核验该项实际影响的设计维度,不重复验证未受影响维度;实现全部完成后,在进入 `locally-verified` 前对所有触发维度至少完整验证一次。
105
+ - 触发"领域与数据"时,用测试或可重复查询验证关键基数、唯一性、顺序、时间范围及缺失/重复数据行为。
106
+ - 触发"兼容性"时,分别验证设计产物中的新旧路径和行为差异清单。
107
+ - 触发"性能"时,执行设计产物约定的复测并与改前基线或静态预算对比;无法实际测量时报告未验证项,不得声称性能未劣化。
108
+
109
+ 正常实现不暂停询问用户。只有发现影响范围、行为、兼容性、性能目标或已确认领域事实的实质偏差时才停止,集中报告偏差、影响和推荐处理方式;命名或局部结构等不改变设计的小偏差直接修正并在最终报告披露。
110
+
64
111
  实现完成后展示:
65
112
 
66
113
  ```text
67
114
  Changed files and purpose
68
115
  Scope deviations: none | details
116
+ Design dimensions verified: behavior | domain/data | compatibility | performance
117
+ Performance comparison: not-applicable | baseline vs result | static budget | unverified + reason
69
118
  Local gate commands and results
70
119
  Unrun checks and reason
71
120
  git diff summary
72
121
  Next state: locally-verified | blocked
73
122
  ```
74
123
 
75
- 达到 `locally-verified` 后立即停止,确认工作分支不是默认分支,且变更范围与已确认设计一致。显式 `action=develop` 不 commit、不 push、不创建 PR;建议下一个 action 为 `pr`。
124
+ 达到 `locally-verified` 后立即停止,确认工作分支不是默认分支;simple 的变更范围与最小设计记录一致,standard/complex 的变更范围与已确认设计产物一致。显式 `action=develop` 不 commit、不 push、不创建 PR;建议下一个 action 为 `pr`。
@@ -24,7 +24,7 @@
24
24
 
25
25
  执行前检查:
26
26
 
27
- - Issue create:不预查重;只在写结果不确定时执行 `create-issue` 的有界恢复,并回读本次预览的 milestone number/title 或 `none`,禁止盲目重试;
27
+ - Issue create:不预查重;只在写结果不确定时执行 `create-issue` 的有界恢复;定位到同一 Issue 后逐项回读本次预览的平台类型、含类型前缀的完整标题、必需标签、正文及 milestone number/title 或 `none`。平台类型不一致或不可验证、必需标签缺失时不得报告 `issue-created`;仅按 create-issue 的已验证同 Issue 编辑规则修复,不盲目重试、不创建替代 Issue;
28
28
  - assignee/comment:Issue 是否已有等价状态或带唯一尾签的等价评论;
29
29
  - PR create:canonical + source + head + base 是否已有 open/merged PR,Agent 创建或编辑的正文是否带唯一尾签,PR milestone 是否已与目标 Issue 的 number/title 一致;PR 已存在但里程碑未完成时只恢复同一 PR 的关联,不重复创建;
30
30
  - CI trigger:同 PR + head SHA 是否已有有效运行;精确命令与带唯一尾签的独立说明评论分别检查;
@@ -107,11 +107,13 @@ Agent 创建或修改的 Issue/PR 正文,以及发布的 Issue 评论、PR 普
107
107
 
108
108
  ## Guided 检查点
109
109
 
110
+ 确认只用于真实决策或受保护动作,不用于汇报内部步骤。每个 action 在取得适用确认后连续执行到自身完成条件,不询问“是否继续分析/修改/测试”,也不要求用户代选可由权威证据、仓库约定和已确认目标可靠推导的实现细节。用户原始请求或本轮已确认内容已经明确授权同一目标、范围和动作时不重复确认;安全契约明确规定必须针对当前事实重新确认的 merge、`code-review` finding/`/lgtm` 等例外不复用旧确认。
111
+
110
112
  开始以下动作前确认:
111
113
 
112
- - 创建 Issue 的最终目标、模板、标题、正文、开放里程碑选择和其他元数据预览;
114
+ - 创建 Issue 的最终目标、用户类型与平台类型映射、模板、含类型前缀的标题、正文、必需标签、开放里程碑选择及同 Issue 元数据编辑计划预览;
113
115
  - 自领/修改 Issue assignee 或发布接取评论;
114
- - 需求分析和方案选择;
116
+ - 权威证据和用户原始请求无法唯一确定、且会实质改变范围、公共行为、兼容性、性能目标或风险的需求结论和方案选择;
115
117
  - 修改范围发生变化;
116
118
  - 首次 push;
117
119
  - 创建 PR,包括从目标 Issue 继承的里程碑及创建后必要的 `pr edit --milestone`;