release-skill 0.9.33 → 0.9.35
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/.claude-plugin/plugin.json +1 -1
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.cursor-plugin/plugin.json +1 -1
- package/.kimi-plugin/plugin.json +1 -1
- package/.qoder-plugin/plugin.json +1 -1
- package/CHANGELOG.md +48 -0
- package/INSTALL.md +2 -2
- package/INSTALL.zh-CN.md +2 -2
- package/README.md +25 -15
- package/README.zh-CN.md +11 -15
- package/adapters/claude/.claude-plugin/plugin.json +1 -1
- package/adapters/claude/bin/release-skill.bundle.mjs +5878 -4056
- package/adapters/claude/schemas/.render-manifest.json +8 -4
- package/adapters/claude/schemas/release-plan.schema.json +85 -0
- package/adapters/claude/schemas/release-project.schema.json +18 -0
- package/adapters/claude/schemas/test-intake.schema.json +217 -0
- package/adapters/claude/skills/release-finish/SKILL.md +5 -1
- package/adapters/claude/skills/release-help/SKILL.md +4 -1
- package/adapters/claude/skills/release-prepare/SKILL.md +9 -2
- package/adapters/codex/.codex-plugin/plugin.json +2 -2
- package/adapters/codex/bin/release-skill.bundle.mjs +5878 -4056
- package/adapters/codex/schemas/.render-manifest.json +8 -4
- package/adapters/codex/schemas/release-plan.schema.json +85 -0
- package/adapters/codex/schemas/release-project.schema.json +18 -0
- package/adapters/codex/schemas/test-intake.schema.json +217 -0
- package/adapters/codex/skills/release-finish/SKILL.md +5 -1
- package/adapters/codex/skills/release-help/SKILL.md +4 -1
- package/adapters/codex/skills/release-prepare/SKILL.md +9 -2
- package/adapters/cursor/.cursor-plugin/plugin.json +1 -1
- package/adapters/cursor/bin/release-skill.bundle.mjs +5878 -4056
- package/adapters/cursor/schemas/.render-manifest.json +8 -4
- package/adapters/cursor/schemas/release-plan.schema.json +85 -0
- package/adapters/cursor/schemas/release-project.schema.json +18 -0
- package/adapters/cursor/schemas/test-intake.schema.json +217 -0
- package/adapters/cursor/skills/release-finish/SKILL.md +5 -1
- package/adapters/cursor/skills/release-help/SKILL.md +4 -1
- package/adapters/cursor/skills/release-prepare/SKILL.md +9 -2
- package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
- package/adapters/kimi/bin/release-skill.bundle.mjs +5878 -4056
- package/adapters/kimi/schemas/.render-manifest.json +8 -4
- package/adapters/kimi/schemas/release-plan.schema.json +85 -0
- package/adapters/kimi/schemas/release-project.schema.json +18 -0
- package/adapters/kimi/schemas/test-intake.schema.json +217 -0
- package/adapters/kimi/skills/release-finish/SKILL.md +5 -1
- package/adapters/kimi/skills/release-help/SKILL.md +4 -1
- package/adapters/kimi/skills/release-prepare/SKILL.md +9 -2
- package/adapters/qoder/.qoder-plugin/plugin.json +1 -1
- package/adapters/qoder/bin/release-skill.bundle.mjs +5878 -4056
- package/adapters/qoder/schemas/.render-manifest.json +8 -4
- package/adapters/qoder/schemas/release-plan.schema.json +85 -0
- package/adapters/qoder/schemas/release-project.schema.json +18 -0
- package/adapters/qoder/schemas/test-intake.schema.json +217 -0
- package/adapters/qoder/skills/release-finish/SKILL.md +5 -1
- package/adapters/qoder/skills/release-help/SKILL.md +4 -1
- package/adapters/qoder/skills/release-prepare/SKILL.md +9 -2
- package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
- package/adapters/workbuddy/bin/release-skill.bundle.mjs +5878 -4056
- package/adapters/workbuddy/schemas/.render-manifest.json +8 -4
- package/adapters/workbuddy/schemas/release-plan.schema.json +85 -0
- package/adapters/workbuddy/schemas/release-project.schema.json +18 -0
- package/adapters/workbuddy/schemas/test-intake.schema.json +217 -0
- package/adapters/workbuddy/skills/release-finish/SKILL.md +5 -1
- package/adapters/workbuddy/skills/release-help/SKILL.md +4 -1
- package/adapters/workbuddy/skills/release-prepare/SKILL.md +9 -2
- package/bin/release-skill-cli.mjs +37 -2
- package/bin/release-skill.bundle.mjs +5878 -4056
- package/package.json +1 -1
- package/platform-manifest.json +4 -4
- package/references/.render-manifest.json +6 -6
- package/references/01-state-machine.md +12 -1
- package/references/02-project-config.md +23 -1
- package/references/05-evidence-and-errors.md +30 -0
- package/schemas/.render-manifest.json +8 -4
- package/schemas/release-plan.schema.json +85 -0
- package/schemas/release-project.schema.json +18 -0
- package/schemas/test-intake.schema.json +217 -0
- package/skills/release-finish/SKILL.md +5 -1
- package/skills/release-help/SKILL.md +4 -1
- package/skills/release-prepare/SKILL.md +9 -2
- package/skills-src/release-finish/SKILL.md +5 -1
- package/skills-src/release-help/SKILL.md +4 -1
- package/skills-src/release-prepare/SKILL.md +9 -2
- package/src/commands/approve.mjs +13 -0
- package/src/commands/post-release-local.mjs +33 -15
- package/src/commands/prepare.mjs +501 -5
- package/src/commands/publish.mjs +2 -0
- package/src/commands/reconcile.mjs +2 -0
- package/src/commands/route.mjs +32 -7
- package/src/commands/ship.mjs +168 -5
- package/src/core/config.mjs +5 -0
- package/src/core/plan.mjs +3 -1
- package/src/core/test-candidate.mjs +649 -0
- package/src/core/test-intake.mjs +645 -0
package/package.json
CHANGED
package/platform-manifest.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
3
|
"platformId": "release-skill",
|
|
4
4
|
"platformName": "release-skill Plugin Platform",
|
|
5
|
-
"version": "0.9.
|
|
5
|
+
"version": "0.9.35",
|
|
6
6
|
"logicalRoot": "skills-src/",
|
|
7
|
-
"logicalRootDigest": "
|
|
8
|
-
"projectionDigest": "
|
|
9
|
-
"projectionId": "release-skill:platform:0.9.
|
|
7
|
+
"logicalRootDigest": "05adb1b81257f99a74b7736f13a174095f79b0745f4c1a5947bb7d95ee9cf8ad",
|
|
8
|
+
"projectionDigest": "9ae26428567a5d7eaf2586626dcd503e0035205e99c3ec3c335f13b94ffa58c4",
|
|
9
|
+
"projectionId": "release-skill:platform:0.9.35",
|
|
10
10
|
"manifestRequired": true,
|
|
11
11
|
"projectionSources": {
|
|
12
12
|
"skills-src-root": {
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"bytes": 6335
|
|
7
7
|
},
|
|
8
8
|
"01-state-machine.md": {
|
|
9
|
-
"digest": "
|
|
10
|
-
"bytes":
|
|
9
|
+
"digest": "75a34b3e8bcf196e6ccde20717b8f2aba9eb848a2a6a67aa914e5444f82d6b29",
|
|
10
|
+
"bytes": 16742
|
|
11
11
|
},
|
|
12
12
|
"02-project-config.md": {
|
|
13
|
-
"digest": "
|
|
14
|
-
"bytes":
|
|
13
|
+
"digest": "95ef58bcf788636c2b0300955e095a050829b51f6e5b4fc1a8d618d6b8a18021",
|
|
14
|
+
"bytes": 34314
|
|
15
15
|
},
|
|
16
16
|
"03-readme-quality.md": {
|
|
17
17
|
"digest": "d74e41052592443ebbd450d0ace5f9b9b19c7a94db50f952b17c1c5a4c5dc230",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"bytes": 4682
|
|
23
23
|
},
|
|
24
24
|
"05-evidence-and-errors.md": {
|
|
25
|
-
"digest": "
|
|
26
|
-
"bytes":
|
|
25
|
+
"digest": "90a3e7de1cc3edc6cfb55f03b060158db819fe211c0c7a4af41977466fe7f27b",
|
|
26
|
+
"bytes": 20537
|
|
27
27
|
},
|
|
28
28
|
"06-adapter-contract.md": {
|
|
29
29
|
"digest": "fd58e8a438aaa9a7a4a939ac190dbdd5d11c3fcaca08feaced4a612a6d6dcf3f",
|
|
@@ -102,6 +102,14 @@ postPublish hooks 分两个阶段,各自对应独立的 distribute run:
|
|
|
102
102
|
外部写入开始后不得缩小范围。任一检查点成功后出现失败,仍进入 PARTIAL,并由
|
|
103
103
|
`reconcile` 在原冻结计划内向前恢复;延期单元需要另行 prepare、审阅和批准。
|
|
104
104
|
|
|
105
|
+
### 2.4 显式测试接入的同候选续接
|
|
106
|
+
|
|
107
|
+
声明 `testIntake` 的生产 prepare 不新增状态。首次准备在冻结适用快照和 tarball 后保存一份非正式候选,命令返回 `NEEDS_INPUT`(`GATE_FAILED`,退出码 13)。这一步不写正式计划,不进入 `PREPARED`,也不写 `FROZEN`。
|
|
108
|
+
|
|
109
|
+
同一候选通过 `prepare --candidate <path>` 续接。适用的预冻结要求核验通过后,才写入正式计划并进入 `PREPARED`。续接使用新的运行目录,不覆盖旧证据,也不再生成第二份候选。对象、配置或权威要求等实质输入变化时拒绝续接,原候选保持不变;只补齐仍绑定该对象的结果不算漂移。
|
|
110
|
+
|
|
111
|
+
候选不是计划。它不能进入批准或发布,也不能把 `PARTIAL`、`PUBLISHED`、`VERIFIED` 或任何已成功的外部检查点改成完成。`ship` 在接受前保持持久状态 `NEW`,并带上同一个 `testCandidate`。未声明 `testIntake` 的项目仍按原转换进入 `PREPARED`。
|
|
112
|
+
|
|
105
113
|
---
|
|
106
114
|
|
|
107
115
|
## 3. 禁止转换
|
|
@@ -141,6 +149,7 @@ postPublish hooks 分两个阶段,各自对应独立的 distribute run:
|
|
|
141
149
|
- 系统必须明确列出缺失的输入项、影响范围和可选方案。
|
|
142
150
|
- NEEDS_INPUT 不能被静默转换为 VERIFIED。
|
|
143
151
|
- 用户提供输入后,系统从 DISCOVERED 或 ASSESSED 重新开始。
|
|
152
|
+
- 显式测试接入的 `NEEDS_INPUT` 只补齐同一候选的结果。`ship` 保持 `NEW` 与原 `testCandidate`,不重建候选,也不读取正式 `planPath`。结果满足后,同一次续接才进入 `PREPARED`。
|
|
144
153
|
|
|
145
154
|
### 4.2 BLOCKED 处理
|
|
146
155
|
|
|
@@ -160,7 +169,7 @@ postPublish hooks 分两个阶段,各自对应独立的 distribute run:
|
|
|
160
169
|
|
|
161
170
|
批准记录绑定到发布计划 hash。以下任何变化均导致批准自动失效:
|
|
162
171
|
|
|
163
|
-
- 发布计划绑定层内容变化(plan digest 不匹配)。planVersion 2 的 digest 只绑定信任边界:冻结产物身份(git commit/tree、manifestDigest、npm tarball 摘要)、外部动作列表(不含运行时 status
|
|
172
|
+
- 发布计划绑定层内容变化(plan digest 不匹配)。planVersion 2 的 digest 只绑定信任边界:冻结产物身份(git commit/tree、manifestDigest、npm tarball 摘要)、外部动作列表(不含运行时 status)、目标版本、配置摘要、校验门。当前计划版本上的可选 `testAcceptance` 属于绑定层,记录层剥离不移除它。替换结果、准则、范围或允许的限制会改变 plan digest,原批准不再适用。不改变这些原件的注释不会使批准失效。没有 `testAcceptance` 的计划保持原绑定范围。planVersion 1 与未声明该字段的 planVersion 2 摘要含义不变。
|
|
164
173
|
- 目标版本变化。
|
|
165
174
|
- 已批准的 action 列表变化。
|
|
166
175
|
|
|
@@ -170,6 +179,8 @@ postPublish hooks 分两个阶段,各自对应独立的 distribute run:
|
|
|
170
179
|
|
|
171
180
|
失效后系统回退到 PREPARED 状态,要求重新批准。
|
|
172
181
|
|
|
182
|
+
approve、publish 和 reconcile 在任何外部动作前复核 `testAcceptance` 指向的要求文件和结果原件。原件缺失或摘要不符时失败关闭,不重新批准,也不重放已经成功的外部检查点。未带 `testAcceptance` 的计划跳过这项复核。
|
|
183
|
+
|
|
173
184
|
### 4.5 路由诊断与当前恢复
|
|
174
185
|
|
|
175
186
|
`route` 负责选择 workflow 和展示 diagnostics,不承担发布授权。传入
|
|
@@ -31,6 +31,10 @@ releaseFinish: # 可选;仅控制本地发布收尾
|
|
|
31
31
|
sourceBranchCheck: remind # remind(缺省)或 skip
|
|
32
32
|
setupSkill: <plugin:skill> # 可选;已加载目标插件提供的 setup 入口
|
|
33
33
|
|
|
34
|
+
testIntake: # 可选;生产 prepare 才接受。未声明则保持原路径
|
|
35
|
+
requirementsFile: intake/requirements.json
|
|
36
|
+
resultFile: intake/result.json
|
|
37
|
+
|
|
34
38
|
publicSourceAuthorityReceipt: # 可选;把源码坐标与多个 npm tarball 绑定为公开 Release asset
|
|
35
39
|
coordinatorUnitId: <release-unit-id>
|
|
36
40
|
subjectUnitIds: [<release-unit-id>]
|
|
@@ -118,6 +122,22 @@ policy: # 可选,安全策略
|
|
|
118
122
|
|
|
119
123
|
`distributions: []` 表示该发布单元不生成 npm 或插件市场动作,不表示跳过公开发布。
|
|
120
124
|
|
|
125
|
+
### 2.0 显式测试接入
|
|
126
|
+
|
|
127
|
+
`testIntake` 可选。只含两个项目相对普通文件路径:`requirementsFile` 与 `resultFile`。两者归一化后必须不同;`a/./b` 与 `a/b` 视为同一路径。未知字段、绝对路径、`..` 和结尾斜杠在配置加载时拒绝。
|
|
128
|
+
|
|
129
|
+
未声明 `testIntake` 的项目保持原有 hook、完整门、缓存和发布路径,不因此增加 TEST、Graph 或 Registry 依赖。`--test-selection incremental` 仍在冻结时拒绝。
|
|
130
|
+
|
|
131
|
+
声明之后只允许生产 `prepare`。非生产 prepare 返回 `CONFIG_INVALID`,原因 `TEST_INTAKE_NON_PRODUCTION`。assess 等其他命令仍可加载这份配置。docs、config、marketplace 轻量工作流、`selectedUnits` 和无需发布的配置分支都不免除项目级要求:未选中单元的单元级要求可以不进入本轮,项目级要求始终适用。
|
|
132
|
+
|
|
133
|
+
要求文件与结果文件的字段以 `schemas/test-intake.schema.json` 为准。release 只核收原件:预冻结项必须有一条可核验结果,处置为 `executed`、`reused`,或由 owner 确认的 `not-applicable`;结论为 `passed`;`acceptedBy` 与声明的 acceptor 一致,`not-applicable` 时与 owner 一致;引用文件可读且摘要一致;结果里的 `subjectDigest` 与 `requirementsSha256` 绑定当前对象。退出码 0、全局 PASS、空证据、`failed` / `incomplete` / `uncovered`、未知字段,或把后续阶段项提前标成完成,都不能通过。未知失败原因保持 `unknown`。安装、加载和业务证据继续分开保存,不合并成一个类别。
|
|
134
|
+
|
|
135
|
+
首次生产 prepare 生成适用快照和 tarball 后,只保存一份非正式候选 `.release-skill/runs/<run>/test-candidate.json`,返回 `NEEDS_INPUT`(`GATE_FAILED`,退出码 13),并给出 `candidatePath`、`candidateSha256`、`subjectDigest`。此时不写正式计划,也不进入 `PREPARED` 或 `FROZEN`。之后用 `prepare --candidate <path>` 续接:新的运行目录,不覆盖旧运行目录、旧证据或旧候选。结果补齐并核验通过后才写正式计划。对象、配置、权威要求或其他实质输入变化时返回 `TEST_CANDIDATE_REPREPARE`,原候选字节保持不变。只往结果文件补入仍绑定该对象的有效内容,不算输入漂移。
|
|
136
|
+
|
|
137
|
+
候选不能传给 approve 或 publish,也不能把 `PARTIAL`、`PUBLISHED`、`VERIFIED` 或任何已成功的外部检查点改成完成。`ship` 在接受前保持持久状态 `NEW` 与 `testCandidate`,不重建候选。没有 `testCandidate` 的 `NEW` 记录仍走原来的准备路径。
|
|
138
|
+
|
|
139
|
+
正式计划上的可选 `testAcceptance` 进入当前计划版本的绑定摘要,记录层剥离不移除它。替换结果、准则、范围或允许的限制会改变 plan digest,原批准不再适用。不改变这些原件的注释不会使批准失效。没有 `testAcceptance` 的计划保持原摘要路径。approve、publish 和 reconcile 在动作前复核绑定原件;原件缺失或被改写时失败关闭,不重新批准,也不重放已经成功的外部检查点。
|
|
140
|
+
|
|
121
141
|
### 2.1 本地发布收尾
|
|
122
142
|
|
|
123
143
|
`releaseFinish` 只控制 `release-finish` 的本地收尾,不改写冻结计划、发布状态或宿主范围。
|
|
@@ -225,7 +245,9 @@ releaseUnits:
|
|
|
225
245
|
|
|
226
246
|
`hub.repo` 使用 `owner/repo`,`hub.ref` 必须是完整的 `refs/heads/...` 引用。声明该字段时,同一 `postPublish` 块至少要有一个 `phase: postVerify` Hook。prepare 只校验冻结声明和插件身份,不访问 Hub,也不要求 Hub 预先存在目标版本。
|
|
227
247
|
|
|
228
|
-
Qoder 保持 build-only 分发边界,不新增发布计划内的 distribution 或安装检查点。本机收尾更新 Qoder 有四个前提:冻结计划已声明、用户显式选择、Hub
|
|
248
|
+
Qoder 保持 build-only 分发边界,不新增发布计划内的 distribution 或安装检查点。本机收尾更新 Qoder 有四个前提:冻结计划已声明、用户显式选择、Hub 来源匹配、既有用户范围安装核对通过。流程不添加市场或执行首次安装。更新完成仅表示安装载荷已变更,不表示当前会话已加载新版,后续仍须重新加载或新开会话,并完成一次真实的只读业务调用。
|
|
249
|
+
|
|
250
|
+
冻结与安装两侧均核验原生 `.qoder-plugin/plugin.json` 与 Claude 兼容 `.claude-plugin/plugin.json`:原生清单缺失时方可启用兼容清单,原生清单存在但无效时不得回退;两清单同时存在时,均须可解析为有效对象,且 `name/version/skills` 完全一致,以原生清单为优先。安装侧结果须与冻结侧选定的相对清单路径及 `skills` 一致,不得忽略额外出现的损坏或冲突清单。写入前复验冻结快照摘要,安装后须完整比较声明载荷与冻结来源,现有 `external-marketplace-v1` 合同允许宿主额外文件,因此完整载荷比较不得替代双清单的独立核验。
|
|
229
251
|
|
|
230
252
|
0.9.21 起,同一声明也能执行 Claude、Codex、Kimi、CodeBuddy 和 WorkBuddy 的本机更新,无需恢复旧宿主 distribution。插件仓库、标签、提交和快照摘要必须来自冻结 unit 与对应标签动作。Claude、Codex 和 CodeBuddy 家族使用已有同源 Hub 市场;刷新前后分别核对宿主专用条目,安装后比较完整冻结载荷。CodeBuddy/WorkBuddy 只升级已有插件,并在插件写入前再次确认 Hub 分支未漂移。Kimi 直接使用冻结 GitHub Release 和终端交互,其只有仓库 URL 的 Hub 文件不承担标签或提交证明。启动进程保留三个代理变量 `http_proxy`、`https_proxy`、`all_proxy`。
|
|
231
253
|
|
|
@@ -34,6 +34,34 @@
|
|
|
34
34
|
| `DIRTY_SOURCE_INPUT` | 源码输入闭包存在未提交变化 | `publicFiles.from` 或 `version.source` 有 staged、unstaged、untracked 变化 | 提交或撤销这些具体输入的变化后重新 prepare;无关 dirty 不受影响 |
|
|
35
35
|
| `BUNDLE_STALE` | bundle 与其源码输入失步(fail-closed 前置门禁) | `bin/release-skill.bundle.mjs` 内嵌的源码摘要与当前 `src/` 摘要不一致,或 bundle/内嵌摘要缺失;在 prepare 加载 config 后的早期阶段检测,任何 workflow 均不可豁免 | 按错误提示在 release-skill 包根运行 `node scripts/build-bundle.mjs`(或 `pnpm build`)重建 bundle 后重新 prepare |
|
|
36
36
|
|
|
37
|
+
显式测试接入不新增顶层错误码。配置和结构问题仍是 `CONFIG_INVALID`(退出码 10),覆盖和续接问题仍是 `GATE_FAILED`(退出码 13)。稳定原因写在 `details.reason`,未知失败保持 `unknown`,不另造原因。
|
|
38
|
+
|
|
39
|
+
| `details.reason` | 错误码 | 含义 |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| `TEST_INTAKE_NON_PRODUCTION` | `CONFIG_INVALID` | 非生产 prepare 声明了 `testIntake` |
|
|
42
|
+
| `TEST_INTAKE_PATH` | `CONFIG_INVALID` | 接入路径不合法,或两个文件归一化后相同 |
|
|
43
|
+
| `TEST_CANDIDATE_WITHOUT_INTAKE` | `CONFIG_INVALID` | 未声明 `testIntake` 却传入候选路径 |
|
|
44
|
+
| `TEST_CANDIDATE_NOT_PLAN` | `GATE_FAILED` | 把候选文件交给 approve 或 publish |
|
|
45
|
+
| `TEST_INTAKE_NEEDS_INPUT` | `GATE_FAILED` | 候选已保存,预冻结结果尚未接受 |
|
|
46
|
+
| `TEST_REQUIREMENT_MISSING` | `GATE_FAILED` | 结果文件或某条适用要求缺失 |
|
|
47
|
+
| `TEST_EVIDENCE_EMPTY` | `GATE_FAILED` | `executed` 或 `reused` 没有可核验证据 |
|
|
48
|
+
| `TEST_ACCEPTOR_MISMATCH` | `GATE_FAILED` | `acceptedBy` 与 acceptor 或 owner 不一致 |
|
|
49
|
+
| `TEST_RESULT_EARLY_PHASE` | `GATE_FAILED` | 后续阶段项在冻结前被标成完成 |
|
|
50
|
+
| `TEST_SUBJECT_MISMATCH` | `GATE_FAILED` | 结果没有绑定当前对象 |
|
|
51
|
+
| `TEST_REQUIREMENTS_DIGEST_MISMATCH` | `GATE_FAILED` | 结果没有绑定当前要求文件 |
|
|
52
|
+
| `TEST_CANDIDATE_REPREPARE` | `GATE_FAILED` | 候选所绑定的实质输入已变化,须重新准备 |
|
|
53
|
+
| `TEST_CANDIDATE_DIGEST_MISMATCH` | `GATE_FAILED` | 候选字节与 ship 记录或证据摘要不一致 |
|
|
54
|
+
| `TEST_CANDIDATE_EVIDENCE_MISSING` | `GATE_FAILED` | 找不到保存候选时的证据摘要 |
|
|
55
|
+
| `TEST_CANDIDATE_CONFIG_CONFLICT` | `GATE_FAILED` | ship 续接时配置摘要已变化 |
|
|
56
|
+
| `TEST_CANDIDATE_UNIT_CONFLICT` | `GATE_FAILED` | ship 续接时单元选择已变化 |
|
|
57
|
+
| `TEST_ACCEPTANCE_MISSING` | `GATE_FAILED` | 计划绑定的原件缺失 |
|
|
58
|
+
| `TEST_ACCEPTANCE_TAMPERED` | `GATE_FAILED` | 计划绑定的原件与摘要不符 |
|
|
59
|
+
| `TEST_ACCEPTANCE_SUBJECT` | `GATE_FAILED` | `testAcceptance.subjectDigest` 与计划对象不一致 |
|
|
60
|
+
| `TEST_ACCEPTANCE_ROOT` | `GATE_FAILED` | 无法从计划路径确定项目根 |
|
|
61
|
+
| `unknown` | `GATE_FAILED` | 失败、未完成或未覆盖,且没有更具体的稳定原因 |
|
|
62
|
+
|
|
63
|
+
安装证据、加载证据和业务证据继续按原字段分开保存。测试接入不把它们收成一个全局 PASS 或单一证据类别。
|
|
64
|
+
|
|
37
65
|
**动作状态码** (adapter execute/observe/verify):
|
|
38
66
|
|
|
39
67
|
- `NO_CHANGE`: 幂等时 payload 无差异,不创建 commit/tag/push。
|
|
@@ -205,6 +233,8 @@ v2 的顶层结构封闭(`additionalProperties: false`),只接受 Schema
|
|
|
205
233
|
|
|
206
234
|
冻结计划存放在 `.release-skill/plans/<planDigest>.json`;批准记录存放在 `.release-skill/approvals/<planDigest>/<approvalDigest>.json`,均不在运行目录内。
|
|
207
235
|
|
|
236
|
+
声明 `testIntake` 时,首次生产 prepare 在该次运行目录写入 `test-candidate.json`。它不是正式计划。证据流用 `phase: test-candidate`、`status: saved` 记录这次保存,候选摘要放在 `details.candidateSha256`。续接另开运行目录,不改写这份候选,也不改写当时的证据。正式计划只在接受之后出现。
|
|
237
|
+
|
|
208
238
|
### 5.1 文件保留
|
|
209
239
|
|
|
210
240
|
- 不得手工删除运行证据。生产 prepare 保留 `.release-skill/runs/` 中已有的运行目录,包括封口失败的 prepare 和已经结束的谱系。
|
|
@@ -26,16 +26,20 @@
|
|
|
26
26
|
"bytes": 1744
|
|
27
27
|
},
|
|
28
28
|
"release-plan.schema.json": {
|
|
29
|
-
"digest": "
|
|
30
|
-
"bytes":
|
|
29
|
+
"digest": "a1e748edeb36b00aa59cbcce893141a30b5c96e75d7fbdbc85b932cde9cc413c",
|
|
30
|
+
"bytes": 68944
|
|
31
31
|
},
|
|
32
32
|
"release-project.schema.json": {
|
|
33
|
-
"digest": "
|
|
34
|
-
"bytes":
|
|
33
|
+
"digest": "e996238c58067fbe1228ab012da53e8edde1b9d3c8f135d4d5848349f4392148",
|
|
34
|
+
"bytes": 57111
|
|
35
35
|
},
|
|
36
36
|
"release-run.schema.json": {
|
|
37
37
|
"digest": "4a041b8f6488e7d61b7eb271ebdbc2e043731df41c4437783ef63e77f664c192",
|
|
38
38
|
"bytes": 19002
|
|
39
|
+
},
|
|
40
|
+
"test-intake.schema.json": {
|
|
41
|
+
"digest": "654e91ce518cb2b8aca84947d0c3bb8c4262ab047d86081e7e93dc07a9c6c739",
|
|
42
|
+
"bytes": 6982
|
|
39
43
|
}
|
|
40
44
|
}
|
|
41
45
|
}
|
|
@@ -1170,6 +1170,9 @@
|
|
|
1170
1170
|
}
|
|
1171
1171
|
}
|
|
1172
1172
|
},
|
|
1173
|
+
"testAcceptance": {
|
|
1174
|
+
"$ref": "#/definitions/testAcceptance"
|
|
1175
|
+
},
|
|
1173
1176
|
"createdAt": {
|
|
1174
1177
|
"type": "string",
|
|
1175
1178
|
"format": "date-time"
|
|
@@ -1371,6 +1374,58 @@
|
|
|
1371
1374
|
}
|
|
1372
1375
|
},
|
|
1373
1376
|
"definitions": {
|
|
1377
|
+
"testFileRef": {
|
|
1378
|
+
"type": "object",
|
|
1379
|
+
"additionalProperties": false,
|
|
1380
|
+
"required": ["path", "sha256"],
|
|
1381
|
+
"properties": {
|
|
1382
|
+
"path": {
|
|
1383
|
+
"type": "string",
|
|
1384
|
+
"minLength": 1,
|
|
1385
|
+
"pattern": "^(?!/)(?!.*\\\\)(?!.*\\u0000)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*//)(?!.*/$).+$"
|
|
1386
|
+
},
|
|
1387
|
+
"sha256": {
|
|
1388
|
+
"type": "string",
|
|
1389
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
1390
|
+
},
|
|
1391
|
+
"anchor": {
|
|
1392
|
+
"type": "string",
|
|
1393
|
+
"minLength": 1
|
|
1394
|
+
}
|
|
1395
|
+
}
|
|
1396
|
+
},
|
|
1397
|
+
"testAcceptance": {
|
|
1398
|
+
"type": "object",
|
|
1399
|
+
"description": "Binding-layer acceptance of pre-freeze test requirements. Included in the plan digest. Not a record-layer field.",
|
|
1400
|
+
"additionalProperties": false,
|
|
1401
|
+
"required": [
|
|
1402
|
+
"formatVersion",
|
|
1403
|
+
"subjectDigest",
|
|
1404
|
+
"requirements",
|
|
1405
|
+
"result",
|
|
1406
|
+
"acceptedRequirementIds",
|
|
1407
|
+
"deferredRequirementIds"
|
|
1408
|
+
],
|
|
1409
|
+
"properties": {
|
|
1410
|
+
"formatVersion": { "const": 1 },
|
|
1411
|
+
"subjectDigest": {
|
|
1412
|
+
"type": "string",
|
|
1413
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
1414
|
+
},
|
|
1415
|
+
"requirements": { "$ref": "#/definitions/testFileRef" },
|
|
1416
|
+
"result": { "$ref": "#/definitions/testFileRef" },
|
|
1417
|
+
"acceptedRequirementIds": {
|
|
1418
|
+
"type": "array",
|
|
1419
|
+
"uniqueItems": true,
|
|
1420
|
+
"items": { "type": "string", "minLength": 1 }
|
|
1421
|
+
},
|
|
1422
|
+
"deferredRequirementIds": {
|
|
1423
|
+
"type": "array",
|
|
1424
|
+
"uniqueItems": true,
|
|
1425
|
+
"items": { "type": "string", "minLength": 1 }
|
|
1426
|
+
}
|
|
1427
|
+
}
|
|
1428
|
+
},
|
|
1374
1429
|
"verificationGate": {
|
|
1375
1430
|
"type": "object",
|
|
1376
1431
|
"required": [
|
|
@@ -2221,6 +2276,36 @@
|
|
|
2221
2276
|
}
|
|
2222
2277
|
}
|
|
2223
2278
|
}
|
|
2279
|
+
},
|
|
2280
|
+
{
|
|
2281
|
+
"if": {
|
|
2282
|
+
"properties": {
|
|
2283
|
+
"production": {
|
|
2284
|
+
"required": ["mode"]
|
|
2285
|
+
}
|
|
2286
|
+
},
|
|
2287
|
+
"required": ["production"]
|
|
2288
|
+
},
|
|
2289
|
+
"then": {
|
|
2290
|
+
"properties": {
|
|
2291
|
+
"units": {
|
|
2292
|
+
"items": {
|
|
2293
|
+
"properties": {
|
|
2294
|
+
"frozenSnapshot": {
|
|
2295
|
+
"required": [
|
|
2296
|
+
"gitObjectDir",
|
|
2297
|
+
"branch",
|
|
2298
|
+
"branchStrategy",
|
|
2299
|
+
"commit",
|
|
2300
|
+
"tree",
|
|
2301
|
+
"commitTimestamp"
|
|
2302
|
+
]
|
|
2303
|
+
}
|
|
2304
|
+
}
|
|
2305
|
+
}
|
|
2306
|
+
}
|
|
2307
|
+
}
|
|
2308
|
+
}
|
|
2224
2309
|
}
|
|
2225
2310
|
]
|
|
2226
2311
|
}
|
|
@@ -62,6 +62,24 @@
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
},
|
|
65
|
+
"testIntake": {
|
|
66
|
+
"type": "object",
|
|
67
|
+
"description": "Optional explicit test intake. When present, both files are required project-relative ordinary paths. Production prepare only. Undeclared projects keep the existing release path.",
|
|
68
|
+
"additionalProperties": false,
|
|
69
|
+
"required": ["requirementsFile", "resultFile"],
|
|
70
|
+
"properties": {
|
|
71
|
+
"requirementsFile": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"minLength": 1,
|
|
74
|
+
"pattern": "^(?!/)(?!.*\\\\)(?!.*\\u0000)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*//)(?!.*/$).+$"
|
|
75
|
+
},
|
|
76
|
+
"resultFile": {
|
|
77
|
+
"type": "string",
|
|
78
|
+
"minLength": 1,
|
|
79
|
+
"pattern": "^(?!/)(?!.*\\\\)(?!.*\\u0000)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*//)(?!.*/$).+$"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
},
|
|
65
83
|
"publicSourceAuthorityReceipt": {
|
|
66
84
|
"type": "object",
|
|
67
85
|
"description": "Optional public source-authority receipt uploaded to one coordinator GitHub Release after all subject npm tarballs are frozen.",
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://release-skill.dev/schemas/test-intake/v1",
|
|
4
|
+
"title": "Release test intake documents",
|
|
5
|
+
"description": "Requirements, results, candidate, and testAcceptance documents for an explicit testIntake release. Unknown fields are rejected.",
|
|
6
|
+
"$ref": "#/definitions/candidate",
|
|
7
|
+
"definitions": {
|
|
8
|
+
"fileRef": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"additionalProperties": false,
|
|
11
|
+
"required": ["path", "sha256"],
|
|
12
|
+
"properties": {
|
|
13
|
+
"path": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"minLength": 1,
|
|
16
|
+
"pattern": "^(?!/)(?!.*\\\\)(?!.*\\u0000)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*//)(?!.*/$).+$"
|
|
17
|
+
},
|
|
18
|
+
"sha256": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
21
|
+
},
|
|
22
|
+
"anchor": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"minLength": 1
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"requirement": {
|
|
29
|
+
"type": "object",
|
|
30
|
+
"additionalProperties": false,
|
|
31
|
+
"required": ["id", "source", "criterion", "owner", "scope", "phase", "acceptor"],
|
|
32
|
+
"properties": {
|
|
33
|
+
"id": { "type": "string", "minLength": 1 },
|
|
34
|
+
"source": { "$ref": "#/definitions/fileRef" },
|
|
35
|
+
"criterion": { "$ref": "#/definitions/fileRef" },
|
|
36
|
+
"owner": { "type": "string", "minLength": 1 },
|
|
37
|
+
"scope": {
|
|
38
|
+
"oneOf": [
|
|
39
|
+
{
|
|
40
|
+
"type": "object",
|
|
41
|
+
"additionalProperties": false,
|
|
42
|
+
"required": ["kind"],
|
|
43
|
+
"properties": { "kind": { "const": "project" } }
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"type": "object",
|
|
47
|
+
"additionalProperties": false,
|
|
48
|
+
"required": ["kind", "unitId"],
|
|
49
|
+
"properties": {
|
|
50
|
+
"kind": { "const": "unit" },
|
|
51
|
+
"unitId": { "type": "string", "minLength": 1 }
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"phase": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"enum": ["pre-freeze", "consumer-verify", "postverify", "finish"]
|
|
59
|
+
},
|
|
60
|
+
"acceptor": { "type": "string", "minLength": 1 },
|
|
61
|
+
"handoff": { "$ref": "#/definitions/handoff" }
|
|
62
|
+
},
|
|
63
|
+
"allOf": [
|
|
64
|
+
{
|
|
65
|
+
"if": {
|
|
66
|
+
"properties": { "phase": { "const": "pre-freeze" } },
|
|
67
|
+
"required": ["phase"]
|
|
68
|
+
},
|
|
69
|
+
"then": { "not": { "required": ["handoff"] } }
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"if": {
|
|
73
|
+
"properties": { "phase": { "enum": ["consumer-verify", "postverify", "finish"] } },
|
|
74
|
+
"required": ["phase"]
|
|
75
|
+
},
|
|
76
|
+
"then": { "required": ["handoff"] }
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
"handoff": {
|
|
81
|
+
"type": "object",
|
|
82
|
+
"additionalProperties": false,
|
|
83
|
+
"required": ["kind", "id"],
|
|
84
|
+
"properties": {
|
|
85
|
+
"kind": { "type": "string", "enum": ["gate", "hook", "finish"] },
|
|
86
|
+
"id": { "type": "string", "minLength": 1 }
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"requirementsDocument": {
|
|
90
|
+
"type": "object",
|
|
91
|
+
"additionalProperties": false,
|
|
92
|
+
"required": ["formatVersion", "requirements"],
|
|
93
|
+
"properties": {
|
|
94
|
+
"formatVersion": { "const": 1 },
|
|
95
|
+
"requirements": {
|
|
96
|
+
"type": "array",
|
|
97
|
+
"minItems": 1,
|
|
98
|
+
"items": { "$ref": "#/definitions/requirement" }
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
"resultItem": {
|
|
103
|
+
"type": "object",
|
|
104
|
+
"additionalProperties": false,
|
|
105
|
+
"required": [
|
|
106
|
+
"requirementId",
|
|
107
|
+
"disposition",
|
|
108
|
+
"verdict",
|
|
109
|
+
"acceptedBy",
|
|
110
|
+
"decision",
|
|
111
|
+
"evidence",
|
|
112
|
+
"applicability",
|
|
113
|
+
"limitations"
|
|
114
|
+
],
|
|
115
|
+
"properties": {
|
|
116
|
+
"requirementId": { "type": "string", "minLength": 1 },
|
|
117
|
+
"disposition": {
|
|
118
|
+
"type": "string",
|
|
119
|
+
"enum": ["executed", "reused", "not-applicable", "failed", "incomplete", "uncovered"]
|
|
120
|
+
},
|
|
121
|
+
"verdict": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"enum": ["passed", "failed", "not-evaluated"]
|
|
124
|
+
},
|
|
125
|
+
"acceptedBy": { "type": "string", "minLength": 1 },
|
|
126
|
+
"decision": { "$ref": "#/definitions/fileRef" },
|
|
127
|
+
"evidence": {
|
|
128
|
+
"type": "array",
|
|
129
|
+
"items": { "$ref": "#/definitions/fileRef" }
|
|
130
|
+
},
|
|
131
|
+
"applicability": { "$ref": "#/definitions/fileRef" },
|
|
132
|
+
"limitations": {
|
|
133
|
+
"type": "array",
|
|
134
|
+
"items": { "$ref": "#/definitions/fileRef" }
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
"resultDocument": {
|
|
139
|
+
"type": "object",
|
|
140
|
+
"additionalProperties": false,
|
|
141
|
+
"required": ["formatVersion", "subjectDigest", "requirementsSha256", "results"],
|
|
142
|
+
"properties": {
|
|
143
|
+
"formatVersion": { "const": 1 },
|
|
144
|
+
"subjectDigest": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
145
|
+
"requirementsSha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
146
|
+
"results": {
|
|
147
|
+
"type": "array",
|
|
148
|
+
"items": { "$ref": "#/definitions/resultItem" }
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"testAcceptance": {
|
|
153
|
+
"type": "object",
|
|
154
|
+
"additionalProperties": false,
|
|
155
|
+
"required": [
|
|
156
|
+
"formatVersion",
|
|
157
|
+
"subjectDigest",
|
|
158
|
+
"requirements",
|
|
159
|
+
"result",
|
|
160
|
+
"acceptedRequirementIds",
|
|
161
|
+
"deferredRequirementIds"
|
|
162
|
+
],
|
|
163
|
+
"properties": {
|
|
164
|
+
"formatVersion": { "const": 1 },
|
|
165
|
+
"subjectDigest": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
166
|
+
"requirements": { "$ref": "#/definitions/fileRef" },
|
|
167
|
+
"result": { "$ref": "#/definitions/fileRef" },
|
|
168
|
+
"acceptedRequirementIds": {
|
|
169
|
+
"type": "array",
|
|
170
|
+
"uniqueItems": true,
|
|
171
|
+
"items": { "type": "string", "minLength": 1 }
|
|
172
|
+
},
|
|
173
|
+
"deferredRequirementIds": {
|
|
174
|
+
"type": "array",
|
|
175
|
+
"uniqueItems": true,
|
|
176
|
+
"items": { "type": "string", "minLength": 1 }
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
"candidate": {
|
|
181
|
+
"type": "object",
|
|
182
|
+
"additionalProperties": false,
|
|
183
|
+
"required": ["candidateVersion", "writerVersion", "prepareOptions", "requirements", "prepared"],
|
|
184
|
+
"properties": {
|
|
185
|
+
"candidateVersion": { "const": 1 },
|
|
186
|
+
"writerVersion": { "type": "string", "minLength": 1 },
|
|
187
|
+
"prepareOptions": {
|
|
188
|
+
"type": "object",
|
|
189
|
+
"additionalProperties": false,
|
|
190
|
+
"required": ["workflow", "offline", "production", "unitIds", "unitVersions"],
|
|
191
|
+
"properties": {
|
|
192
|
+
"workflow": { "type": "string", "enum": ["full", "docs", "config", "marketplace"] },
|
|
193
|
+
"offline": { "type": "boolean" },
|
|
194
|
+
"production": { "const": true },
|
|
195
|
+
"unitIds": {
|
|
196
|
+
"type": "array",
|
|
197
|
+
"items": { "type": "string", "minLength": 1 }
|
|
198
|
+
},
|
|
199
|
+
"unitVersions": {
|
|
200
|
+
"type": "object",
|
|
201
|
+
"additionalProperties": { "type": "string", "minLength": 1 }
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
"requirements": { "$ref": "#/definitions/fileRef" },
|
|
206
|
+
"prepared": {
|
|
207
|
+
"type": "object",
|
|
208
|
+
"properties": {
|
|
209
|
+
"status": false,
|
|
210
|
+
"digest": false,
|
|
211
|
+
"testAcceptance": false
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
@@ -72,7 +72,11 @@ node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill-local-finish.mjs" \
|
|
|
72
72
|
- Claude/Codex 的 Hub 目标只使用已经登记的同源市场。升级前先读取声明的 Hub 分支,并核对宿主专用索引中的插件仓库、标签、提交及存在的版本字段。刷新市场后再次核对实际目录和条目,再执行原有更新或重装命令。Claude 精确当前安装会离线核对真实载荷;Codex 列表不提供安装根时,仍须正式重装,从安装输出取得 `installedPath` 后核对载荷。旧安装动作继续使用冻结市场引用预检;远端不可达或引用不符时返回 `MANUAL_REQUIRED`。每个宿主单独保留结果,失败不会中断其他已选宿主。
|
|
73
73
|
- Kimi 的精确当前安装会在返回 `ALREADY_CURRENT` 前核对真实载荷;发生安装或迁移时,只在操作完成后核对结果。配置根依次取显式 `kimiHome`、`KIMI_CODE_HOME`、用户主目录下的 `.kimi-code`,TUI 与安装后观察使用同一根。release-finish 当前只采用并验证 Kimi Code 的受控终端交互界面(TUI)路径,并把 TUI 工作目录固定为 `--root` 指定的当前发布项目。用户已确认冻结计划、显式选择更新且 `--hosts` 包含 `kimi` 时,流程读取完整的初始 `Trust this folder?` 对话框,要求其中只有一个正向项 `Trust this folder` 和一个选中项。正向项已经选中时不发送方向键,直接确认;已知拒绝项选中时,按它与正向项的相对位置移动一次,重新读取完整对话框并确认正向项已选中,然后才提交。插件命令发出后再次出现目录信任、界面或选中项未知、正向项缺失或重复、移动后无法确认、超时或提前退出时,该宿主失败并停止后续安装步骤。若后续 Kimi 版本出现新的可复现界面差异,先记录 Kimi 版本、可见选项、选中项及选项关系;这些事实足以唯一确认当前目录、正向信任项和选择结果时,在最近测试补回归与兼容并继续,目录身份或选项语义不明时仍停止并交回主会话。插件信任仍先清理 ANSI/OSC 控制序列和软换行,再分别核对冻结仓库与标签;只有选中 `Trust and install` 才提交并重新加载。包名、版本、发布标签、已安装修订号和受管安装根必须与冻结计划一致;`.git` 只提供附加诊断,不是通过条件。旧的本地路径安装会在同一 TUI 会话中先移除,再按发布标签安装。
|
|
74
74
|
- CodeBuddy/WorkBuddy 只升级既有安装,不自动首装。CodeBuddy 仅探测全局 `codebuddy`/`cbc`,配置根固定为有效 `HOME` 下的 `.codebuddy`;WorkBuddy 仅在 macOS 探测应用内嵌 CLI,配置根固定为有效 `HOME` 下的 `.workbuddy`,两者不互作回退。Hub 目标先核对各自 `plugins/marketplaces/<hub>` 的远端和分支,再核对 `.codebuddy-plugin/marketplace.json` 条目。刷新市场后确认远端分支未漂移,才更新插件;最后核对列表中的版本、`gitCommitSha` 和 `plugins/cache/<hub>/<plugin>/<version>` 的完整载荷。旧 bundled-family 目标继续要求插件标签和市场分支均指向冻结提交。非 macOS 的 WorkBuddy 返回 `SKIPPED_UNSUPPORTED_PLATFORM`。
|
|
75
|
-
- Qoder
|
|
75
|
+
- Qoder 首先通过 `qoder plugins marketplace list --json` 验证目标 Hub 的名称、仓库地址、分支信息及本机 checkout 状态,随后使用 `qoder plugins list --json` 核对唯一插件条目的市场归属、`scope=user`、版本号与 `installPath`。若目标市场或插件未安装,返回 `MANUAL_REQUIRED`,禁止自动添加市场或执行首次安装。对于旧版已安装情况,仅执行 `qoder plugins marketplace update <name>` 与 `qoder plugins update <plugin@marketplace> --scope user`。在市场刷新后、插件更新前,必须从 Hub 的 `marketplace.json` 中校验目标条目的 `source.url` 与 `source.sha`。
|
|
76
|
+
|
|
77
|
+
冻结快照与真实 `installPath` 均需比对 `.qoder-plugin/plugin.json` 与 `.claude-plugin/plugin.json` 两个候选清单。仅当原生清单缺失时,方可启用兼容清单;原生清单存在但无效时不得回退。存在的清单均须可解析为有效对象,并满足插件身份与根内技能目录要求,双清单的 `name/version/skills` 必须完全一致,且以原生清单为优先。安装侧选择的相对清单路径及 `skills` 必须与冻结侧选择一致。安装侧额外出现的损坏或冲突清单不得忽略;允许宿主附加文件的 `external-marketplace-v1` 载荷完整比较,不可替代对清单的独立核验。
|
|
78
|
+
|
|
79
|
+
冻结快照摘要须在宿主写入前完成复验,安装后仍需复验完整声明载荷与冻结来源;即使版本已为目标版本,也必须完成全部复验后方可返回 `ALREADY_CURRENT`。市场在检查与更新之间可能发生变更,若事后身份校验失败,报告错误,不进行自动降级、卸载或覆盖。
|
|
76
80
|
|
|
77
81
|
Kimi 不使用只有仓库 URL 的 Hub 文件证明标签或提交。它先克隆冻结发布标签并核对提交,再进入既有终端交互流程;启动进程保留 `http_proxy`、`https_proxy` 和 `all_proxy`。
|
|
78
82
|
|
|
@@ -29,7 +29,7 @@ description: "Discoverable entry point for release-skill: dependency and environ
|
|
|
29
29
|
|
|
30
30
|
治理诊断只运行 release-skill 自己的只读检查程序,不运行目标 Skill、业务脚本、构建、hook 或发布动作,也不把 `prepare`、`verify`、`release-finish` 当作静态治理入口。用户要求实际接入或发布时,把已有授权带到对应原业务入口;各入口继续执行原有确认、副作用和状态机合同。
|
|
31
31
|
|
|
32
|
-
## 0.9.
|
|
32
|
+
## 0.9.35 能力与证据边界
|
|
33
33
|
|
|
34
34
|
四类工程材料接到现有 `release-project` 字段。公开正式材料写入 `publicFiles`(`sourceScope` / `from` / `to` / `mode`)。运行必需资源写入 `requiredPublicFiles`,必须被同一单元 `publicFiles[].to` 精确覆盖。私有正式材料与非正式运行材料不列入 `publicFiles`,需要挡住时使用 `forbiddenPaths` / `forbiddenContentPatterns`。正式不等于公开。是否进入公开快照由 `publicFiles` 是否列出决定。npm 是载荷渠道。`package.json` 的 `files` 与入口闭包和公开映射同时约束。`delivery.include` / `delivery.exclude` 只选择宿主,不是文件包含或排除。排除不得拿掉运行必需资源。互相冲突的配置必须失败关闭。
|
|
35
35
|
|
|
@@ -52,6 +52,8 @@ Qoder 本机更新路径处理维持既有能力,支持 `./adapters/qoder/skil
|
|
|
52
52
|
|
|
53
53
|
在冻结前,`prepare` 或新建 `ship` 状态时可重复传入 `--unit <id>`;未传入则默认选择全部单元。延期单元不进入发布计划,亦不获得发布状态。完整配置、生成物新鲜度检查及顶层 Hook 仍作用于全项目范围。`publicSourceAuthorityReceipt` 的 coordinator 与全部 subjects 必须共同选择。
|
|
54
54
|
|
|
55
|
+
可选 `testIntake` 只在生产 prepare 生效。首次准备返回 `NEEDS_INPUT` 和一份非正式候选,退出码 13;同一候选用 `prepare --candidate <path>` 续接,接受后才有正式计划。候选不能批准或发布,也不能清除 `PARTIAL`、`PUBLISHED` 或 `VERIFIED`。未声明的项目、原有 hook 和完整门保持不变。轻量工作流和单元选择都不免除项目级要求。非生产 prepare 遇到 `testIntake` 返回 `CONFIG_INVALID`。
|
|
56
|
+
|
|
55
57
|
冻结后,发布流程(publish、reconcile、verify、distribute)不再接受 `--unit` 参数,仅以 `plan.units` 为唯一有效范围。
|
|
56
58
|
|
|
57
59
|
每个单元必须声明 `previousPublicBaseline`:只有确认没有前序公开版本时,才使用 `none`;否则必须提供 `bound`,并包含 `repo/ref/commit` 信息。`none` 不绕过 publish 阶段的唯一性预检。
|
|
@@ -116,6 +118,7 @@ node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill-local-finish.mjs" \
|
|
|
116
118
|
- 项目配置缺失:进入 `release-setup` 的只读发现,不直接生成或覆盖 README/配置。
|
|
117
119
|
- assess 失败:运行 `release-assess` 的离线诊断并按错误码处理。
|
|
118
120
|
- `PARTIAL` 或远端冲突:进入 `release-reconcile`,保留已经成功的 checkpoint。
|
|
121
|
+
- `testIntake` 返回 `NEEDS_INPUT`:停留在给出的候选上补齐结果,再用 `--candidate` 续接。不要把候选文件交给 approve 或 publish。
|
|
119
122
|
- 文档、Cursor、宿主更新或本机收尾失败:转到上节对应专用 Skill,不在 help 中猜测恢复步骤。
|
|
120
123
|
|
|
121
124
|
## 后续引导
|