release-skill 0.1.7 → 0.1.8
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/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.kimi-plugin/plugin.json +27 -0
- package/CHANGELOG.md +22 -0
- package/INSTALL.md +73 -2
- package/INSTALL.zh-CN.md +94 -99
- package/README.md +49 -35
- package/README.zh-CN.md +82 -321
- package/adapters/claude/.claude-plugin/marketplace.json +1 -1
- package/adapters/claude/.claude-plugin/plugin.json +1 -1
- package/adapters/claude/bin/release-skill.bundle.mjs +1061 -182
- package/adapters/claude/schemas/.render-manifest.json +4 -4
- package/adapters/claude/schemas/release-plan.schema.json +20 -2
- package/adapters/claude/schemas/release-project.schema.json +22 -4
- package/adapters/claude/schemas/release-run.schema.json +1 -0
- package/adapters/codex/.codex-plugin/plugin.json +2 -2
- package/adapters/codex/bin/release-skill.bundle.mjs +1061 -182
- package/adapters/codex/schemas/.render-manifest.json +4 -4
- package/adapters/codex/schemas/release-plan.schema.json +20 -2
- package/adapters/codex/schemas/release-project.schema.json +22 -4
- package/adapters/codex/schemas/release-run.schema.json +1 -0
- package/adapters/kimi/.kimi-plugin/plugin.json +27 -0
- package/adapters/kimi/bin/release-skill.bundle.mjs +84415 -0
- package/adapters/kimi/bin/release-skill.mjs +54 -0
- package/adapters/kimi/native/safe-write/binding.gyp +41 -0
- package/adapters/kimi/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
- package/adapters/kimi/native/safe-write/prebuilds.json +24 -0
- package/adapters/kimi/native/safe-write/src/safe_write.cc +2032 -0
- package/adapters/kimi/schemas/.render-manifest.json +37 -0
- package/adapters/kimi/schemas/approval-record.schema.json +115 -0
- package/adapters/kimi/schemas/artifact-lock.schema.json +111 -0
- package/adapters/kimi/schemas/artifact-plan.schema.json +52 -0
- package/adapters/kimi/schemas/artifact-policy.schema.json +76 -0
- package/adapters/kimi/schemas/evidence-event.schema.json +89 -0
- package/adapters/kimi/schemas/release-plan.schema.json +878 -0
- package/adapters/kimi/schemas/release-project.schema.json +895 -0
- package/adapters/kimi/schemas/release-run.schema.json +343 -0
- package/adapters/kimi/skills/release-assess/SKILL.md +58 -0
- package/adapters/kimi/skills/release-help/SKILL.md +84 -0
- package/adapters/kimi/skills/release-prepare/SKILL.md +99 -0
- package/adapters/kimi/skills/release-publish/SKILL.md +64 -0
- package/adapters/kimi/skills/release-reconcile/SKILL.md +80 -0
- package/adapters/kimi/skills/release-setup/SKILL.md +102 -0
- package/adapters/kimi/skills/release-verify/SKILL.md +77 -0
- package/bin/release-skill-cli.mjs +16 -4
- package/bin/release-skill.bundle.mjs +1061 -182
- package/package.json +4 -2
- package/schemas/.render-manifest.json +4 -4
- package/schemas/release-plan.schema.json +20 -2
- package/schemas/release-project.schema.json +22 -4
- package/schemas/release-run.schema.json +1 -0
- package/src/adapters/contract.mjs +1 -0
- package/src/adapters/plugin-marketplace.mjs +990 -30
- package/src/commands/assess.mjs +50 -1
- package/src/commands/prepare.mjs +65 -0
- package/src/commands/publish.mjs +3 -0
- package/src/commands/reconcile.mjs +3 -0
- package/src/commands/setup.mjs +10 -5
- package/src/commands/verify.mjs +16 -6
- package/src/core/plan.mjs +118 -0
- package/src/core/verification-gates.mjs +1 -1
- package/src/producers/build-adapters.mjs +38 -8
package/README.zh-CN.md
CHANGED
|
@@ -2,38 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md) · 安装指南:[中文](INSTALL.zh-CN.md) / [English](INSTALL.md)
|
|
4
4
|
|
|
5
|
-
<!-- release-skill:release-version: 0.1.
|
|
6
|
-
面向 Claude Code 和
|
|
5
|
+
<!-- release-skill:release-version: 0.1.8 -->
|
|
6
|
+
面向 Claude Code、Codex 和 Kimi Code 的发布准备工具,完整保留人工维护的文件内容。
|
|
7
7
|
|
|
8
|
-
release-skill
|
|
9
|
-
发布的字节究竟是什么。它先冻结并供人工审阅,再从同一份冻结制品发布,不会在
|
|
10
|
-
最后一步重新生成 README、重新打包活动工作区或覆盖人工内容。
|
|
8
|
+
release-skill 帮助维护者回答三个问题:准备发布什么、还有哪些检查未通过、最终发布的内容是什么。它先冻结并供人工审阅,再从同一份冻结产物发布,不会在最后一步重新生成 README、重新打包当前工作区或覆盖人工内容。
|
|
11
9
|
|
|
12
10
|
<!-- release-skill:managed:start id=latest-release -->
|
|
13
|
-
**0.1.
|
|
11
|
+
**0.1.8** (2026-07-23)
|
|
14
12
|
|
|
15
|
-
v0.1.
|
|
13
|
+
v0.1.8 在不改写已经公开的 v0.1.7 制品的前提下,新增对 Kimi Code 一等插件宿主的支持。由于 Kimi Code 没有可脚本化的非交互插件安装接口,Kimi 分发采用生成的自包含适配器,以及失败关闭、绑定冻结计划的人工安装证明。npm 包名(`release-skill`)、发布身份(`publisher: mzdbxqh`)、公开仓库(`ifoohoo/release-skill`)与公司维护主体均保持不变。
|
|
16
14
|
|
|
17
15
|
**变更**
|
|
18
16
|
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
`
|
|
24
|
-
`
|
|
25
|
-
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
著作权转让。
|
|
29
|
-
- **面向未来版本的元数据与组织对齐**:npm `package.json` 的仓库、主页与问题
|
|
30
|
-
跟踪地址指向 `ifoohoo/release-skill`,并在保留 release-skill 贡献者的同时新增公司
|
|
31
|
-
作者。Claude Code 插件市场所有者现在标识 `ifoohoo` 组织。npm 包名
|
|
32
|
-
(`release-skill`)与 npm 发布身份(`publisher: mzdbxqh`)保持不变。
|
|
17
|
+
- **Kimi Code 插件分发与验证**:v0.1.8 新增根
|
|
18
|
+
`.kimi-plugin/plugin.json`、生成的自包含 `adapters/kimi/` 适配器和公开安装说明。
|
|
19
|
+
由于 Kimi Code 没有可脚本化的非交互插件安装接口,生产发布会生成版本钉死的人工
|
|
20
|
+
安装要求并进入 `PARTIAL`;操作者必须在隔离的 `KIMI_CODE_HOME` 中完成安装,并
|
|
21
|
+
提供分别绑定冻结计划摘要和载荷摘要的可信证明,之后 `reconcile` 才能进入
|
|
22
|
+
`PUBLISHED`,`verify` 才能进入 `VERIFIED`。
|
|
23
|
+
- **保留不可变的 v0.1.7 历史**:既有 v0.1.7 Git 标签、GitHub Release、npm
|
|
24
|
+
版本与公开提交均不改写。v0.1.8 生产计划以已公开的 v0.1.7 提交
|
|
25
|
+
`fe5897456d4166a2ec60e99405836b122562b80d` 作为前序公开基线。
|
|
33
26
|
<!-- release-skill:managed:end id=latest-release -->
|
|
34
27
|
|
|
35
28
|
<!-- release-skill:capability:external-write-boundary -->
|
|
36
|
-
> **当前边界:** v0.1.
|
|
29
|
+
> **当前边界:** v0.1.8 是当前发布版本(v0.1.7 曾处于已发布、待独立验证状态)。
|
|
37
30
|
> v0.1.1 已完成 GitHub 与 npm 的
|
|
38
31
|
> 真实生产发布,是首次生产验证的历史里程碑,并从冻结 Git ref 完成精确 npm
|
|
39
32
|
> 安装及 Claude/Codex 消费者安装验证;“当前发布版本”与“首次生产验证里程碑”
|
|
@@ -46,7 +39,7 @@ v0.1.7 是一个组织迁移版本。公开 GitHub 仓库从 `mzdbxqh/release-sk
|
|
|
46
39
|
> 远端唯一性检查在 `publish` 全局预检执行。
|
|
47
40
|
|
|
48
41
|
<!-- release-skill:capability:safe-first-command -->
|
|
49
|
-
> **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.1.
|
|
42
|
+
> **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.1.8 是当前发布版本。**
|
|
50
43
|
> npm 安装的 CLI 是受支持的用户入口;源码 checkout 保留为开发/贡献者路径。
|
|
51
44
|
>
|
|
52
45
|
> **第一条命令:**
|
|
@@ -62,33 +55,21 @@ v0.1.7 是一个组织迁移版本。公开 GitHub 仓库从 `mzdbxqh/release-sk
|
|
|
62
55
|
|
|
63
56
|
## 为什么人工修改的 README 不会丢失
|
|
64
57
|
|
|
65
|
-
release-skill 不重新生成、也不回写项目源文件。`prepare`
|
|
66
|
-
到隔离的本地快照,并验证复制前后的字节。README 的 slogan、示例、正文、格式,
|
|
67
|
-
以及后续任何人工修改都会作为完整文件被保留。
|
|
58
|
+
release-skill 不重新生成、也不回写项目源文件。`prepare` 从当前工作区把每个公开文件复制到隔离的本地快照,并验证复制前后的字节。README 的 slogan、示例、正文、格式,以及后续任何人工修改都会作为完整文件被保留。
|
|
68
59
|
|
|
69
60
|
- 后续 prepare 重新读取当前文件,不会从模板重建。
|
|
70
61
|
- 快照必须与源文件逐字节一致。
|
|
71
62
|
- 计划变化会产生新的 digest,旧批准不能授权新内容。
|
|
72
|
-
- prepare 后再改源文件,publish 会因 baseline
|
|
73
|
-
正确方式是重新 prepare、重新审阅并重新 approve。
|
|
63
|
+
- prepare 后再改源文件,publish 会因 baseline 变化在远端写入前停止。保留修改的正确方式是重新 prepare、重新审阅并重新 approve。
|
|
74
64
|
- 冻结制品被篡改时,publish 会因 snapshot/tarball/Git object 摘要不符停止。
|
|
75
65
|
- 远端 branch、tag、Release 或 npm 版本冲突时交给人工;系统不 force、不覆盖。
|
|
76
|
-
- 只有 `publicFiles` 明确列出的文件会被复制;需要发布的翻译 README
|
|
77
|
-
|
|
78
|
-
- 发布只冻结当前真相:`prepare` 不会刷新或重写人工文档。维护者必须先更新
|
|
79
|
-
README、INSTALL 与 CHANGELOG(包括必须与 `package.json` 版本一致的机器可读
|
|
80
|
-
`release-skill:release-version` 标记,以及当前包版本的正式 CHANGELOG 标题),
|
|
81
|
-
再 prepare、审阅和批准。任一文档版本标记或 CHANGELOG 当前版本条目漂移时,
|
|
82
|
-
发布前门禁失败关闭。
|
|
66
|
+
- 只有 `publicFiles` 明确列出的文件会被复制;需要发布的翻译 README、图片、演示文件和链接文档都要显式加入配置。
|
|
67
|
+
- 发布只冻结当前真相:`prepare` 不会刷新或重写人工文档。维护者必须先更新 README、INSTALL 与 CHANGELOG(包括必须与 `package.json` 版本一致的机器可读 `release-skill:release-version` 标记,以及当前包版本的正式 CHANGELOG 标题),再 prepare、审阅和批准。任一文档版本标记或 CHANGELOG 当前版本条目漂移时,发布前门禁失败关闭。
|
|
83
68
|
|
|
84
69
|
保护规则只有一句话:**复制当前事实,冻结已审阅事实,不重写人工事实。**
|
|
85
70
|
|
|
86
71
|
## 快速开始
|
|
87
72
|
|
|
88
|
-
下文每个只读步骤都把可能很大的报告保存在临时文件中,只展示确定性的
|
|
89
|
-
`compactSummary`(紧凑摘要)审阅视图;紧凑摘要只是审阅辅助,不能替代绑定摘要
|
|
90
|
-
授权。
|
|
91
|
-
|
|
92
73
|
### 安装 / 前置条件
|
|
93
74
|
|
|
94
75
|
- Node.js 22+
|
|
@@ -115,8 +96,6 @@ release-skill help
|
|
|
115
96
|
|
|
116
97
|
**开发安装(贡献者回退,从源码 checkout):**
|
|
117
98
|
|
|
118
|
-
设置源码路径并安装依赖:
|
|
119
|
-
|
|
120
99
|
```bash
|
|
121
100
|
export RELEASE_SKILL_HOME=/absolute/path/to/release-skill
|
|
122
101
|
cd "$RELEASE_SKILL_HOME"
|
|
@@ -132,11 +111,9 @@ npm exec --yes pnpm@10.17.1 -- install --frozen-lockfile
|
|
|
132
111
|
!.release-skill/project.yaml
|
|
133
112
|
```
|
|
134
113
|
|
|
135
|
-
###
|
|
114
|
+
### 首次接入
|
|
136
115
|
|
|
137
|
-
setup
|
|
138
|
-
`compactSummary`(紧凑摘要)审阅视图。紧凑摘要不能替代授权:`setupDigest` 仍绑定
|
|
139
|
-
完整事实、候选和 answers。
|
|
116
|
+
`setup` 默认只读。把完整报告写入临时文件,只查看确定性的 `compactSummary`(紧凑摘要):
|
|
140
117
|
|
|
141
118
|
```bash
|
|
142
119
|
PROJECT=/absolute/path/to/my-project
|
|
@@ -150,11 +127,9 @@ release-skill setup --root "$PROJECT" --json > "$REPORT" || test "$?" -eq 2
|
|
|
150
127
|
node -e 'const fs=require("node:fs");const r=JSON.parse(fs.readFileSync(process.argv[1],"utf8"));if(!r.compactSummary){console.error("compactSummary missing");process.exit(2)}process.stdout.write(JSON.stringify(r.compactSummary,null,2)+"\n")' "$REPORT"
|
|
151
128
|
```
|
|
152
129
|
|
|
153
|
-
`NEEDS_INPUT` 和 `LOCAL_ONLY_DETECTED` 按设计返回退出码 2。若
|
|
154
|
-
`proposalConflicts` 非空,包括 `PUBLIC_REPO_AUTHORITY_CONFLICT` 或公开文件映射冲突,
|
|
155
|
-
必须停止自动路径,由人工修正冲突的仓库或映射权威事实后重新运行 setup,不得猜测选边。
|
|
130
|
+
`NEEDS_INPUT` 和 `LOCAL_ONLY_DETECTED` 按设计返回退出码 2。若 `proposalConflicts` 非空,必须停止自动路径,由人工修正冲突的仓库或映射权威事实后重新运行 setup,不得猜测选边。
|
|
156
131
|
|
|
157
|
-
|
|
132
|
+
没有冲突时,机械提取机器提案:
|
|
158
133
|
|
|
159
134
|
```bash
|
|
160
135
|
SETUP_SESSION='/上一步打印的会话目录绝对路径'
|
|
@@ -190,17 +165,11 @@ node -e 'const fs=require("node:fs");const [c,p,a]=process.argv.slice(1).map(x=>
|
|
|
190
165
|
node -e 'require("node:fs").rmSync(process.argv[1],{recursive:true,force:false})' "$SETUP_SESSION"
|
|
191
166
|
```
|
|
192
167
|
|
|
193
|
-
写入必须返回 `CONFIG_CREATED`,下一次 setup 必须返回 `ALREADY_CONFIGURED
|
|
194
|
-
永不重新生成,后续只做经审阅的增量编辑。解释器/包管理器间接脚本会以
|
|
195
|
-
`SIDE_EFFECTS_UNPROVEN` 排除,不会自动选择;项目特有 hook/gate 只有人工审阅后才
|
|
196
|
-
增量加入:hook 编辑 `projectConfig.hooks`;gate 编辑 `verificationGates` 并将同一 id
|
|
197
|
-
加入 `selectedGateIds`,随后重新运行绑定 dry-run。人工文件保持 `mode: preserve`;只有显式跨单元共享源才使用
|
|
198
|
-
`sourceScope: workspace`。
|
|
168
|
+
写入必须返回 `CONFIG_CREATED`,下一次 setup 必须返回 `ALREADY_CONFIGURED`。已有配置永不重新生成,后续只做经审阅的增量编辑。发现的解释器/包管理器脚本标记为 `SIDE_EFFECTS_UNPROVEN`,不会被自动选中。只有在人工审阅之后才添加项目专属的 hook 或 gate:编辑 `projectConfig.hooks`,或编辑 `verificationGates` 并把同一个 id 加入 `selectedGateIds`,然后重新运行绑定 dry-run。人工维护的文件保持 `mode: preserve`;只有明确的跨单元共享来源才使用 `sourceScope: workspace`。
|
|
199
169
|
|
|
200
|
-
####
|
|
170
|
+
#### 进阶:schema 参考——并非首次接入路径
|
|
201
171
|
|
|
202
|
-
|
|
203
|
-
`recommendedAnswers`。
|
|
172
|
+
下面的 wrapper 仅用于说明 schema。正常 setup 路径中不要手工编写它;按上文机械提取 `recommendedAnswers`。
|
|
204
173
|
|
|
205
174
|
```json
|
|
206
175
|
{
|
|
@@ -238,11 +207,9 @@ node -e 'require("node:fs").rmSync(process.argv[1],{recursive:true,force:false})
|
|
|
238
207
|
}
|
|
239
208
|
```
|
|
240
209
|
|
|
241
|
-
|
|
242
|
-
历史公开版本时才可使用 `mode: none`。
|
|
210
|
+
这只是 schema 参考,不是接入模板。正常 setup 必须使用机器提案。`mode: none` 仅在不存在任何公开版本时有效。
|
|
243
211
|
|
|
244
|
-
|
|
245
|
-
已提取的机器提案做这一处增量编辑:
|
|
212
|
+
下面的参考展示经人工审阅的 gate 与 `selectedGateIds` 之间的精确关系。该关系只能作为对提取出的机器提案的增量编辑来应用:
|
|
246
213
|
|
|
247
214
|
```json
|
|
248
215
|
{
|
|
@@ -288,10 +255,7 @@ node -e 'require("node:fs").rmSync(process.argv[1],{recursive:true,force:false})
|
|
|
288
255
|
}
|
|
289
256
|
```
|
|
290
257
|
|
|
291
|
-
id
|
|
292
|
-
`package.json`。如果改用项目脚本,该脚本及其全部依赖必须包含在 `publicFiles` 中;
|
|
293
|
-
snapshot gate 看不到父工作空间的测试、开发依赖或 `node_modules`,除非它们本来就是
|
|
294
|
-
显式公开内容。
|
|
258
|
+
id 必须从当前 `gateCandidates` 复制,不得臆造。示例命令在公开快照内自包含。项目脚本只有在脚本本身及其全部依赖都包含在 `publicFiles` 中时才有效;snapshot gate 看不到父工作区的测试、开发依赖或 `node_modules`,除非它们被显式公开。
|
|
295
259
|
|
|
296
260
|
```bash
|
|
297
261
|
release-skill setup --root /absolute/path/to/my-project \
|
|
@@ -301,15 +265,9 @@ release-skill setup --root /absolute/path/to/my-project \
|
|
|
301
265
|
--write --confirm-setup <setupDigest> --json
|
|
302
266
|
```
|
|
303
267
|
|
|
304
|
-
|
|
305
|
-
写入使用随包提供、带摘要登记的 `darwin-arm64` 原生预构建;
|
|
306
|
-
不支持的平台会以 `SAFE_WRITE_UNAVAILABLE` 失败关闭,不会退回存在路径竞态的写法。
|
|
307
|
-
已有配置返回 `ALREADY_CONFIGURED`/`CONFIG_EXISTS`,后续由人工增量编辑;README、slogan、
|
|
308
|
-
CHANGELOG 和业务脚本不会被生成或覆盖。没有远端渠道时会返回
|
|
309
|
-
`LOCAL_ONLY_DETECTED`,表示生产渠道仍需人工建立或明确放弃。
|
|
268
|
+
Setup 只原子创建缺失的 `.release-skill/project.yaml`。这一 create-once 步骤使用 v0.1.3 起随包发布、经 digest 登记的 `darwin-arm64` 原生预编译产物;不支持的平台以 `SAFE_WRITE_UNAVAILABLE` 失败关闭,不会回退到基于路径的写入。`ALREADY_CONFIGURED`/`CONFIG_EXISTS` 表示现有文件仍由人工所有,只能增量编辑。README、slogan、CHANGELOG 和业务脚本永不被生成或覆盖。没有远端渠道的项目会报告 `LOCAL_ONLY_DETECTED`,而不是虚构生产支持。
|
|
310
269
|
|
|
311
|
-
|
|
312
|
-
不能依赖工具猜测:
|
|
270
|
+
以下是一个最小的人工编写配置。npm 可见性、公开文件边界和远端目标都必须显式声明:
|
|
313
271
|
|
|
314
272
|
```yaml
|
|
315
273
|
apiVersion: release-skill/v1
|
|
@@ -338,18 +296,18 @@ releaseUnits:
|
|
|
338
296
|
mode: preserve
|
|
339
297
|
requiredPublicFiles: [README.md, LICENSE, package.json]
|
|
340
298
|
previousPublicBaseline:
|
|
341
|
-
mode: none #
|
|
299
|
+
mode: none # 首次发布:不存在更早的公开版本
|
|
342
300
|
distributions:
|
|
343
301
|
- type: npm
|
|
344
302
|
package: my-project
|
|
345
|
-
access: public # 或 restricted
|
|
346
|
-
provenance: false #
|
|
303
|
+
access: public # 或 restricted;选择真实的包策略
|
|
304
|
+
provenance: false # 只有在 CI/OIDC 配置完成后才使用 true
|
|
347
305
|
tag: latest
|
|
348
306
|
registry: https://registry.npmjs.org
|
|
349
307
|
publisher: my-npm-username
|
|
350
|
-
# 可选:CLI
|
|
351
|
-
#
|
|
352
|
-
#
|
|
308
|
+
# 可选:CLI smoke 验证。配置 smokeBin 后,verify 会在隔离目录
|
|
309
|
+
# 安装该包并运行指定二进制。不配置 smokeBin 时,verify 只确认
|
|
310
|
+
# 安装与 name/version。
|
|
353
311
|
# smokeBin: my-project
|
|
354
312
|
# smokeArgs: [help, --json]
|
|
355
313
|
# smokeExpectedJson:
|
|
@@ -362,8 +320,7 @@ releaseUnits:
|
|
|
362
320
|
releaseNotes: "人工维护的发布说明"
|
|
363
321
|
```
|
|
364
322
|
|
|
365
|
-
|
|
366
|
-
`mode: none`。已有公开仓库必须绑定不可变的 ref 和 commit:
|
|
323
|
+
每个发布单元都必须声明其前序公开基线。只有当你确认不存在更早的公开版本时才使用 `mode: none`。对于已有公开仓库,绑定精确的不可变 ref 与 commit:
|
|
367
324
|
|
|
368
325
|
```yaml
|
|
369
326
|
previousPublicBaseline:
|
|
@@ -373,79 +330,13 @@ releaseUnits:
|
|
|
373
330
|
commit: 0123456789abcdef0123456789abcdef01234567
|
|
374
331
|
```
|
|
375
332
|
|
|
376
|
-
`none`
|
|
377
|
-
GitHub Release 和 npm version 的唯一性。bound 的生产 prepare 必须在线运行,以便
|
|
378
|
-
观察 ref 到 commit 的映射。
|
|
379
|
-
默认 observer 不下载远端文件内容,因此只能报告 mapping diff,并明确标记 content
|
|
380
|
-
diff unavailable。发生漂移时先停止发布,由人工取得并审阅真实远端 commit;工具
|
|
381
|
-
不会下载或合并远端文件。`merge` 表示在 human-owned 权威源中同时保留本地与远端
|
|
382
|
-
修改;`adopt` 表示把审阅后的远端字节复制回该权威源;`reject` 表示停止本次发布并
|
|
383
|
-
调查或修复远端/ref,禁止改成 `mode: none` 绕过。选择 `merge` 或 `adopt` 后,还必须
|
|
384
|
-
把 `previousPublicBaseline` 重新绑定到人工接受的不可变 `repo`/`ref`/`commit`,再运行
|
|
385
|
-
新的 `prepare --online --production`、审阅和 approve。
|
|
386
|
-
|
|
387
|
-
分支策略也必须符合真实仓库语义:
|
|
333
|
+
`none` 不是绕过冲突检查的手段:publish 仍会在任何写入前检查目标 branch、tag、GitHub Release 与 npm 版本的唯一性。bound 模式的生产 prepare 必须在线运行,以便观察 ref 到 commit 的映射。默认观察器不下载远端文件内容,因此它报告映射差异并标记内容差异不可用。发生漂移时停止,由人工选择 `merge`、`adopt` 或 `reject`。先获取并审阅真实远端 commit;工具不会下载或合并其文件。`merge` 在人工所有的来源中保留本地与远端双方修改;`adopt` 把审阅过的远端字节复制进该来源;`reject` 在调查或修正远端/ref 期间停止本次发布;永远不要为了绕过漂移而改回 `mode: none`。`merge` 或 `adopt` 之后,把 `previousPublicBaseline` 重新绑定到已接受的不可变 `repo`/`ref`/`commit`,再运行新的 `prepare --online --production`、审阅并批准。
|
|
388
334
|
|
|
389
|
-
|
|
390
|
-
- `advance-existing-branch`:在 `previousPublicBaseline` 精确提交上创建单父提交,
|
|
391
|
-
只允许普通 fast-forward push;远端并发漂移时交由人工。
|
|
392
|
-
- `initialize-default-branch`:受控创建不存在的标准分支;只有显式配置
|
|
393
|
-
`setAsDefaultBranch` 和 `expectedCurrentDefaultBranch` 时,默认分支切换才成为
|
|
394
|
-
计划中可批准、可观察、可 reconcile 的独立动作。
|
|
395
|
-
|
|
396
|
-
三种策略的最小配置如下:
|
|
397
|
-
|
|
398
|
-
```yaml
|
|
399
|
-
# 新建不可变 release 分支;目标必须不存在。
|
|
400
|
-
previousPublicBaseline: { mode: none } # 仅限真正的首次公开发布
|
|
401
|
-
production:
|
|
402
|
-
branchTemplate: release/{tag}
|
|
403
|
-
branchStrategy: create-release-branch
|
|
404
|
-
```
|
|
405
|
-
|
|
406
|
-
```yaml
|
|
407
|
-
# 推进 main;绑定的 ref 必须与目标分支精确一致。
|
|
408
|
-
previousPublicBaseline:
|
|
409
|
-
mode: bound
|
|
410
|
-
repo: owner/my-project
|
|
411
|
-
ref: refs/heads/main
|
|
412
|
-
commit: 0123456789abcdef0123456789abcdef01234567
|
|
413
|
-
production:
|
|
414
|
-
branchTemplate: main
|
|
415
|
-
branchStrategy: advance-existing-branch
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
```yaml
|
|
419
|
-
# 一次性创建尚不存在的 main,并显式切换默认分支。
|
|
420
|
-
previousPublicBaseline:
|
|
421
|
-
mode: bound
|
|
422
|
-
repo: owner/my-project
|
|
423
|
-
ref: refs/heads/old-public-branch
|
|
424
|
-
commit: 0123456789abcdef0123456789abcdef01234567
|
|
425
|
-
production:
|
|
426
|
-
branchTemplate: main
|
|
427
|
-
branchStrategy: initialize-default-branch
|
|
428
|
-
setAsDefaultBranch: true
|
|
429
|
-
expectedCurrentDefaultBranch: old-public-branch
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
后两种策略必须运行 `prepare --online --production`。如果观察到的分支、commit、
|
|
433
|
-
目标不存在性或当前默认分支与预期不符,先停止并审阅真实远端状态,再人工更新权威
|
|
434
|
-
源文件/配置;禁止 force push 或弱化基线。
|
|
435
|
-
|
|
436
|
-
这只是解释机制的本地示例,不是完整的 npm 发布清单。真实发布前必须枚举全部
|
|
437
|
-
公开运行时代码、可执行文件、类型声明、图片和链接文档。monorepo 应把 `source`
|
|
438
|
-
设为 `packages/my-plugin` 之类的子目录;每个 `from` 仍相对工作空间根,例如
|
|
439
|
-
`packages/my-plugin/README.md`。
|
|
440
|
-
|
|
441
|
-
首次 prepare 前,建议提交 `.gitignore`、`.release-skill/project.yaml`、README、版本文件和
|
|
442
|
-
全部待发布内容,使 Git baseline 易于复现。prepare 前已有且之后未变化的未提交修改也会
|
|
443
|
-
进入 snapshot/baseline;只有 prepare 后再次变化才会使后续 baseline 校验停止。
|
|
335
|
+
分支策略应与真实仓库匹配(`create-release-branch`、`advance-existing-branch`、`initialize-default-branch`);三种策略的最小配置示例见[英文 README](README.md)。
|
|
444
336
|
|
|
445
337
|
### 主流程
|
|
446
338
|
|
|
447
|
-
按以下顺序执行。步骤 1–4 是安全默认(只读或仅本地);步骤 5–9
|
|
448
|
-
人工门禁的生产发布。
|
|
339
|
+
按以下顺序执行。步骤 1–4 是安全默认(只读或仅本地);步骤 5–9 是需要显式人工门禁的生产发布。
|
|
449
340
|
|
|
450
341
|
```bash
|
|
451
342
|
# npm 安装的 CLI(推荐):
|
|
@@ -456,9 +347,6 @@ ACTOR=your-name
|
|
|
456
347
|
# CLI=(node "$RELEASE_SKILL_HOME/packages/release-skill/bin/release-skill.mjs")
|
|
457
348
|
```
|
|
458
349
|
|
|
459
|
-
v0.1.1 生产发布验证完成后,npm 安装的 CLI 是受支持的用户入口;
|
|
460
|
-
源码 checkout 保留为开发/贡献者路径。
|
|
461
|
-
|
|
462
350
|
1. **环境检查:**
|
|
463
351
|
```bash
|
|
464
352
|
"${CLI[@]}" help
|
|
@@ -467,8 +355,7 @@ v0.1.1 生产发布验证完成后,npm 安装的 CLI 是受支持的用户入
|
|
|
467
355
|
```bash
|
|
468
356
|
"${CLI[@]}" setup --root "$PROJECT" --json
|
|
469
357
|
```
|
|
470
|
-
按上文机械提取 `compactSummary` 与 `recommendedAnswers`,只确认一次绑定后的
|
|
471
|
-
`setupDigest`;配置已存在时跳过。
|
|
358
|
+
按上文机械提取 `compactSummary` 与 `recommendedAnswers`,只确认一次绑定后的 `setupDigest`;配置已存在时跳过。
|
|
472
359
|
3. **就绪评估(只读):**
|
|
473
360
|
```bash
|
|
474
361
|
"${CLI[@]}" assess --root "$PROJECT" --offline --json
|
|
@@ -479,14 +366,8 @@ v0.1.1 生产发布验证完成后,npm 安装的 CLI 是受支持的用户入
|
|
|
479
366
|
--acknowledge-hook-side-effects \
|
|
480
367
|
--acknowledge-gate-side-effects --json
|
|
481
368
|
```
|
|
482
|
-
只有项目配置没有对应 hook 或 snapshot gate
|
|
483
|
-
|
|
484
|
-
5. **人工审阅:** 检查返回的 `planPath`、`externalActions`、
|
|
485
|
-
`units[].targetVersion` 和 `planDigest`。每个发布单元的快照位于
|
|
486
|
-
`<evidenceDir>/snapshots/<unit-id>/`。release-skill 自身只把数据写入
|
|
487
|
-
`.release-skill/`;获得授权的项目 hook/gate 是没有操作系统沙箱的任意项目
|
|
488
|
-
进程,可能写入其他位置、访问网络,并读取当前账号可访问的凭据、令牌、密钥和
|
|
489
|
-
环境变量。
|
|
369
|
+
只有项目配置没有对应 hook 或 snapshot gate 时,才省略相应授权参数。授权前必须审阅可执行文件、参数、工作目录和副作用,不能把授权参数当固定样板。
|
|
370
|
+
5. **人工审阅:** 检查返回的 `planPath`、`externalActions`、`units[].targetVersion` 和 `planDigest`。每个发布单元的快照位于 `<evidenceDir>/snapshots/<unit-id>/`。
|
|
490
371
|
6. **生产计划冻结:**
|
|
491
372
|
```bash
|
|
492
373
|
PRODUCTION_JSON=$("${CLI[@]}" prepare --root "$PROJECT" --online --production \
|
|
@@ -496,12 +377,7 @@ v0.1.1 生产发布验证完成后,npm 安装的 CLI 是受支持的用户入
|
|
|
496
377
|
PLAN_PATH=$(printf '%s\n' "$PRODUCTION_JSON" | jq -r '.planPath')
|
|
497
378
|
PLAN_DIGEST=$(printf '%s\n' "$PRODUCTION_JSON" | jq -r '.planDigest')
|
|
498
379
|
```
|
|
499
|
-
|
|
500
|
-
审阅新 plan 的 externalActions、npm access/provenance/tag、branch/tag 和冻结摘要。
|
|
501
|
-
`prepare --json` 返回的生产权威 `planPath` 指向
|
|
502
|
-
`<项目>/.release-skill/plans/<planDigest>.json`,后续必须始终沿用这个返回值。
|
|
503
|
-
`.release-skill/release-plan.json` 只是可变便利副本,不得传给生产
|
|
504
|
-
approve/publish/reconcile。
|
|
380
|
+
同样,只省略配置不需要的授权,并在授权前逐项审阅项目进程。`prepare --json` 返回的生产权威 `planPath` 指向 `<项目>/.release-skill/plans/<planDigest>.json`,后续必须始终沿用这个返回值。`.release-skill/release-plan.json` 只是可变便利副本,不得传给生产 approve/publish/reconcile。
|
|
505
381
|
7. **批准:**
|
|
506
382
|
```bash
|
|
507
383
|
APPROVAL_JSON=$("${CLI[@]}" approve --plan "$PLAN_PATH" \
|
|
@@ -509,14 +385,7 @@ v0.1.1 生产发布验证完成后,npm 安装的 CLI 是受支持的用户入
|
|
|
509
385
|
printf '%s\n' "$APPROVAL_JSON" | jq .
|
|
510
386
|
APPROVAL_PATH=$(printf '%s\n' "$APPROVAL_JSON" | jq -r '.approvalPath')
|
|
511
387
|
```
|
|
512
|
-
|
|
513
|
-
`<项目>/.release-skill/approvals/<planDigest>/<approvalDigest>.json`。
|
|
514
|
-
`latestApprovalPath` 指向 `.release-skill/approval-record.json`,它只是可变便利
|
|
515
|
-
副本,不得传给生产 publish/reconcile。批准 24 小时失效;PARTIAL 恢复可为同一
|
|
516
|
-
plan 重新批准,同时逐字节保留全部旧批准。后续必须使用返回的 immutable
|
|
517
|
-
`approvalPath` 和 `expiresAt`。`--actor` 只是未经认证的本地审计标签:
|
|
518
|
-
release-skill 不执行身份认证、不提供数字签名,因此无法证明真人已经批准——
|
|
519
|
-
它只记录操作者自报的身份。
|
|
388
|
+
批准 24 小时失效;`--actor` 只是未经认证的本地审计标签。后续必须使用返回的 immutable `approvalPath` 和 `expiresAt`。
|
|
520
389
|
8. **发布(从此开始写远端):**
|
|
521
390
|
```bash
|
|
522
391
|
PUBLISH_JSON=$("${CLI[@]}" publish --root "$PROJECT" \
|
|
@@ -532,27 +401,13 @@ v0.1.1 生产发布验证完成后,npm 安装的 CLI 是受支持的用户入
|
|
|
532
401
|
--plan "$PLAN_PATH" --run "$PUBLISH_RUN_PATH" \
|
|
533
402
|
--acknowledge-gate-side-effects --json
|
|
534
403
|
```
|
|
535
|
-
只有计划既没有 consumer gate,也没有 npm `smokeBin`
|
|
536
|
-
执行已安装的项目代码,而且没有操作系统或网络沙箱。
|
|
404
|
+
只有计划既没有 consumer gate,也没有 npm `smokeBin` 时才省略授权。
|
|
537
405
|
|
|
538
|
-
|
|
539
|
-
文档其他位置的尖括号标签直接当作 shell 语法。
|
|
540
|
-
|
|
541
|
-
生产 prepare 会把每个公开快照封存为独立 Git commit/tree,并为 npm 单元生成固定
|
|
542
|
-
tarball。`publish` 先对所有动作做只读预检,再按“公开快照 branch → tag → npm →
|
|
543
|
-
GitHub Release → Claude/Codex 插件市场(marketplace)安装”执行并逐项观察。`verify` 在隔离目录
|
|
544
|
-
安装每一个精确 npm `package@version`;配置 `smokeBin` 后还会运行 CLI 并校验输出。
|
|
545
|
-
只有全部证据与冻结计划一致才进入 `VERIFIED`。真实发布前运行 `gh auth login`、
|
|
546
|
-
`gh auth setup-git` 和 `npm login`,同时确认 Git HTTPS credential 能访问目标仓库。
|
|
547
|
-
默认分支名为 `release/<tag>`,可由每个 unit 的 `production.branchTemplate` 配置;
|
|
548
|
-
同名远端对象存在时停止,交由人工判断。
|
|
406
|
+
生产 prepare 会把每个公开快照封存为独立 Git commit/tree,并为 npm 单元生成固定 tarball。`publish` 先对所有动作做只读预检,再按“公开快照 branch → tag → npm → GitHub Release → Claude/Codex 插件市场安装”执行并逐项观察。Kimi Code 没有可脚本化的安装接口,其检查点**失败关闭**:`publish` 在完成自动化写入后落入 `PARTIAL`,并产出版本钉死的手动安装要求。操作者随后用 requirement 给出的隔离 `KIMI_CODE_HOME` 启动 Kimi Code,运行钉死的 `/plugins install <release-tag URL>`,把可信证明(同时绑定冻结**计划**摘要与快照**载荷**摘要)写入按计划摘要命名的目录 `.release-skill/kimi-attestations/<planDigest>/<plugin>/`,再运行 `reconcile`(→ `PUBLISHED`)与 `verify`(→ `VERIFIED`);两者都从同一稳定位置读取证明。安装到日常 `~/.kimi-code` 不被接受。完整流程与证明 JSON 字段见 `INSTALL.zh-CN.md`。`verify` 在隔离目录安装每一个精确 npm `package@version`;配置 `smokeBin` 后还会运行 CLI 并校验输出。只有全部证据与冻结计划一致才进入 `VERIFIED`。默认分支名由每个 unit 的 `production.branchTemplate` 配置;同名远端对象存在时停止,交由人工判断。
|
|
549
407
|
|
|
550
408
|
### 发布文档刷新(可选)
|
|
551
409
|
|
|
552
|
-
发布单元可以声明 `releaseDocuments`,用一份结构化双语说明源确定性刷新 README
|
|
553
|
-
受管区域和 CHANGELOG 当前版本条目。核心 CLI 完全离线运行:不联网、不调用大模型、
|
|
554
|
-
不自动翻译;只改写声明过的受管区域、唯一版本标记的机器值和 CHANGELOG 当前版本
|
|
555
|
-
受管条目,区域外字节逐字保留。`prepare` 只检查新鲜度,不写工作树。
|
|
410
|
+
发布单元可以声明 `releaseDocuments`,用一份结构化双语说明源确定性刷新 README 受管区域和 CHANGELOG 当前版本条目。核心 CLI 完全离线运行:不联网、不调用大模型、不自动翻译;只改写声明过的受管区域、唯一版本标记的机器值和 CHANGELOG 当前版本受管条目,区域外字节逐字保留。`prepare` 只检查新鲜度,不写工作树。
|
|
556
411
|
|
|
557
412
|
```yaml
|
|
558
413
|
# .release-skill/project.yaml(发布单元片段)
|
|
@@ -577,76 +432,24 @@ releaseUnits:
|
|
|
577
432
|
regions: [latest-release]
|
|
578
433
|
```
|
|
579
434
|
|
|
580
|
-
`notesSource` 和所有目标路径均相对发布单元根。`versionMarkers[].pattern` 必须与
|
|
581
|
-
README 现有唯一版本标记精确匹配,`{version}` 代表机器版本值;刷新只替换该值
|
|
582
|
-
(零次或多次匹配失败关闭)。
|
|
583
|
-
|
|
584
|
-
```yaml
|
|
585
|
-
# release-notes/0.1.6.yaml(结构化说明源)
|
|
586
|
-
version: 0.1.6
|
|
587
|
-
date: 2026-07-21
|
|
588
|
-
locales:
|
|
589
|
-
en:
|
|
590
|
-
summary: Deterministic multilingual release-document refresh.
|
|
591
|
-
changes:
|
|
592
|
-
added:
|
|
593
|
-
- Refresh managed README regions and changelogs from one source.
|
|
594
|
-
upgradeNotes: Review and commit refreshed documents before prepare.
|
|
595
|
-
zh-CN:
|
|
596
|
-
summary: 从同一说明源确定性刷新多语种发布文档。
|
|
597
|
-
changes:
|
|
598
|
-
added:
|
|
599
|
-
- 自动刷新 README 受管区域和 CHANGELOG。
|
|
600
|
-
upgradeNotes: prepare 前审阅并提交刷新结果。
|
|
601
|
-
```
|
|
602
|
-
|
|
603
|
-
`version` 必须与解析出的单元版本精确一致;每个配置语种恰好出现一次,`summary`
|
|
604
|
-
与变更项非空,且 `security`、`breaking`、`added`、`changed`、`deprecated`、
|
|
605
|
-
`removed`、`fixed` 中至少一个类别含条目。YAML alias、重复键、未知字段和语种回退
|
|
606
|
-
均失败关闭。
|
|
607
|
-
|
|
608
435
|
1. **只读演练:**
|
|
609
436
|
```bash
|
|
610
437
|
"${CLI[@]}" docs refresh --root "$PROJECT" --unit my-project --json
|
|
611
438
|
```
|
|
612
|
-
输出 `status`(`changes` 或 `clean`)、逐文件相对 `path`、`locale`、`kind`、
|
|
613
|
-
新旧摘要、单元 `version`、`locales`、`inputDigest` 和 `refreshDigest`。
|
|
614
|
-
`refreshDigest` 绑定协议版本、发布单元、规范说明对象、配置投影和按路径排序的
|
|
615
|
-
逐文件新旧摘要,不绑定时间、绝对路径或展示文本;`nextCommand.argv` 给出精确
|
|
616
|
-
写入命令。
|
|
617
439
|
2. **摘要确认的本地写入(仅在用户明确授权“本地发布文档写入”后执行):**
|
|
618
440
|
```bash
|
|
619
441
|
"${CLI[@]}" docs refresh --root "$PROJECT" --unit my-project \
|
|
620
442
|
--write --confirm-refresh <refreshDigest> \
|
|
621
443
|
--ack-local-document-write --json
|
|
622
444
|
```
|
|
623
|
-
三项绑定缺一不可;摘要不匹配以 `RELEASE_DOCS_REFRESH_STALE` 失败关闭且零写入。
|
|
624
|
-
候选无变化时演练返回 `clean`,写入同样零写入。全部目标作为一个事务提交;
|
|
625
|
-
写入成功后立即复演,必须返回 `clean`。
|
|
626
445
|
|
|
627
|
-
该授权只覆盖声明的本地发布文档目标,不是 hook、Git 提交、push、publish
|
|
628
|
-
授权:维护者必须审阅刷新结果并提交,然后重新 `prepare`——新字节会改变快照、
|
|
629
|
-
workspace digest 和 plan digest,旧批准不能授权刷新后的计划。
|
|
630
|
-
|
|
631
|
-
配置了 `releaseDocuments` 的文档发生漂移时,`prepare` 在 hook、基线、快照、
|
|
632
|
-
远端检查和计划冻结前以 `RELEASE_DOCS_STALE` 失败关闭。恢复路径:运行演练,审阅
|
|
633
|
-
展示的文件/语种/版本/摘要,授权并执行本地写入,审阅提交后重新 `prepare`。
|
|
634
|
-
`RELEASE_DOCS_INVALID`(配置或说明数据非法)、`RELEASE_DOCS_TRANSLATION_MISSING`
|
|
635
|
-
(配置语种缺失)和 `RELEASE_DOCS_CONFLICT`(非受管同版本内容或标记损坏)都需要
|
|
636
|
-
先修复源或目标,不得扩大写入范围解决。
|
|
446
|
+
该授权只覆盖声明的本地发布文档目标,不是 hook、Git 提交、push、publish 或安装的授权:维护者必须审阅刷新结果并提交,然后重新 `prepare`。
|
|
637
447
|
|
|
638
448
|
### 父工作空间 + npm 子单元 + 插件子单元
|
|
639
449
|
|
|
640
|
-
当 monorepo 从不同目录同时产出 npm 包和 Claude/Codex
|
|
641
|
-
发布单元。只有当某个单元确实以 manifest、marketplace 和 entry Skill 的形式
|
|
642
|
-
发布插件时,才为其添加插件分发:
|
|
450
|
+
当 monorepo 从不同目录同时产出 npm 包和 Claude/Codex/Kimi Code 插件时,应定义独立的发布单元。只有当某个单元确实以 manifest、marketplace 和 entry Skill 的形式发布插件时,才为其添加插件分发:
|
|
643
451
|
|
|
644
|
-
|
|
645
|
-
根目录也要发布独立仓库或 package,应再增加一个 `source: .` 的 release unit。
|
|
646
|
-
`version.source` 相对于该发布单元的 `source` 目录解析
|
|
647
|
-
(`version.source` is resolved relative to that release unit's `source` directory):
|
|
648
|
-
`source: packages/app` 的单元应直接写 `package.json`,而不是
|
|
649
|
-
`packages/app/package.json`。
|
|
452
|
+
这里的 `project` 是父工作空间的编排容器,不是公开发布单元。如果工作区根目录也发布自己的仓库或包,再添加一个 `source: .` 的发布单元。`version.source` 相对于该发布单元的 `source` 目录解析(`version.source` is resolved relative to that release unit's `source` directory):因此 `source: packages/app` 的单元写裸 `package.json`,而不是 `packages/app/package.json`。
|
|
650
453
|
|
|
651
454
|
```yaml
|
|
652
455
|
apiVersion: release-skill/v1
|
|
@@ -700,17 +503,21 @@ releaseUnits:
|
|
|
700
503
|
tagTemplate: my-plugin-v{version}
|
|
701
504
|
distributions:
|
|
702
505
|
# 只有当单元确实发布插件时才声明插件消费者。
|
|
703
|
-
# CLI
|
|
506
|
+
# CLI smoke 是独立的;只有当插件包同时暴露 CLI 二进制时才声明 smokeBin。
|
|
704
507
|
- type: claude-plugin
|
|
705
508
|
plugin: my-plugin
|
|
706
509
|
marketplace: my-plugin
|
|
707
510
|
entrySkill: my-plugin-help
|
|
708
|
-
timeoutMs: 300000 # 可选;范围 30000
|
|
511
|
+
timeoutMs: 300000 # 可选;范围 30000-900000;默认 300000
|
|
709
512
|
- type: codex-plugin
|
|
710
513
|
plugin: my-plugin
|
|
711
514
|
marketplace: my-plugin
|
|
712
515
|
entrySkill: my-plugin-help
|
|
713
|
-
timeoutMs: 300000 # 可选;范围 30000
|
|
516
|
+
timeoutMs: 300000 # 可选;范围 30000-900000;默认 300000
|
|
517
|
+
- type: kimi-plugin
|
|
518
|
+
plugin: my-plugin
|
|
519
|
+
entrySkill: my-plugin-help
|
|
520
|
+
timeoutMs: 300000 # 可选;范围 30000-900000;默认 300000(Kimi 无安装命令;仅约束只读验证)
|
|
714
521
|
publicFiles:
|
|
715
522
|
- from: packages/plugin/.claude-plugin/plugin.json
|
|
716
523
|
to: .claude-plugin/plugin.json
|
|
@@ -721,6 +528,9 @@ releaseUnits:
|
|
|
721
528
|
- from: packages/plugin/.codex-plugin/plugin.json
|
|
722
529
|
to: .codex-plugin/plugin.json
|
|
723
530
|
mode: preserve
|
|
531
|
+
- from: packages/plugin/.kimi-plugin/plugin.json
|
|
532
|
+
to: .kimi-plugin/plugin.json
|
|
533
|
+
mode: preserve
|
|
724
534
|
- from: packages/plugin/.agents/plugins/marketplace.json
|
|
725
535
|
to: .agents/plugins/marketplace.json
|
|
726
536
|
mode: preserve
|
|
@@ -740,6 +550,7 @@ releaseUnits:
|
|
|
740
550
|
- .claude-plugin/plugin.json
|
|
741
551
|
- .claude-plugin/marketplace.json
|
|
742
552
|
- .codex-plugin/plugin.json
|
|
553
|
+
- .kimi-plugin/plugin.json
|
|
743
554
|
- .agents/plugins/marketplace.json
|
|
744
555
|
- skills/my-plugin-help/SKILL.md
|
|
745
556
|
- README.md
|
|
@@ -752,21 +563,13 @@ releaseUnits:
|
|
|
752
563
|
releaseTitleTemplate: "{unit} {version}"
|
|
753
564
|
```
|
|
754
565
|
|
|
755
|
-
|
|
756
|
-
入口 Skill 和全部 required public files。CLI 冒烟(`smokeBin`)对插件单元
|
|
757
|
-
是可选项,仅当发布包同时暴露 CLI 二进制时才适用。
|
|
566
|
+
每个插件单元**必须**列出其 Claude/Codex/Kimi Code `plugin.json`、Claude/Codex 的 `marketplace.json`(Kimi Code 没有 marketplace 清单)、entry Skill 以及全部必需公开文件。CLI smoke(`smokeBin`)对插件单元是可选的,只适用于发布的 npm 包暴露 CLI 二进制的情况。
|
|
758
567
|
|
|
759
|
-
|
|
760
|
-
用于设置 marketplace add、plugin install 和 plugin list 三条命令的子进程超时。
|
|
761
|
-
真实网络下这些命令可能需要 40–105 秒;默认 300 秒超时避免误报 `PARTIAL`。
|
|
762
|
-
解析后的值冻结到计划中,与其他动作参数一起接受批准。无 `timeoutMs` 的旧计划
|
|
763
|
-
在执行时默认回退到 300,000 毫秒以保证向后兼容。
|
|
568
|
+
插件分发可以声明 `timeoutMs`(范围 30,000–900,000 ms;默认 300,000 ms),用于 marketplace add、插件安装与插件列表命令的子进程超时。真实网络下这些命令可能需要 40–105 秒;默认 300 秒超时可以避免误报 `PARTIAL`。解析后的值会冻结进计划,并随其他动作参数一起批准。没有 `timeoutMs` 的旧计划在执行时按 300,000 ms 兼容处理。
|
|
764
569
|
|
|
765
570
|
### PARTIAL 恢复与 reconcile
|
|
766
571
|
|
|
767
|
-
当 `publish` 在部分检查点成功但在其他检查点失败时,运行进入 `PARTIAL`
|
|
768
|
-
状态。**不要从头重跑,也不要删除远端状态**(例如不要删除已推送的 tag 或
|
|
769
|
-
unpublish 已发布的包)。
|
|
572
|
+
当 `publish` 在部分检查点成功但在其他检查点失败时,运行进入 `PARTIAL` 状态。**不要从头重跑,也不要删除远端状态。**
|
|
770
573
|
|
|
771
574
|
使用 `reconcile` 检查实际远端状态,跳过已一致的步骤,安全重试未完成的动作:
|
|
772
575
|
|
|
@@ -778,21 +581,12 @@ RECONCILE_JSON=$("${CLI[@]}" reconcile --root "$PROJECT" \
|
|
|
778
581
|
--confirm-production "$PLAN_DIGEST" --json)
|
|
779
582
|
printf '%s\n' "$RECONCILE_JSON" | jq .
|
|
780
583
|
RECONCILE_RUN_PATH=$(printf '%s\n' "$RECONCILE_JSON" | jq -r '.runPath')
|
|
781
|
-
# 保存 reconcile 返回的新 runPath,再执行全新的安装验证。
|
|
782
584
|
"${CLI[@]}" verify --root "$PROJECT" \
|
|
783
585
|
--plan "$PLAN_PATH" --run "$RECONCILE_RUN_PATH" \
|
|
784
586
|
--acknowledge-gate-side-effects --json
|
|
785
587
|
```
|
|
786
588
|
|
|
787
|
-
|
|
788
|
-
以上变量沿用主流程从 JSON 提取的精确值;如果恢复期间批准已过期,应为同一个不可变
|
|
789
|
-
计划重新批准,并在 reconcile 前替换 `APPROVAL_PATH`。
|
|
790
|
-
|
|
791
|
-
`reconcile` 查询实际远端状态(Git refs、npm 版本、GitHub Release、
|
|
792
|
-
marketplace 安装),跳过证据已匹配冻结计划的步骤,只重试安全且未完成的
|
|
793
|
-
步骤。远端冲突(例如意外的 tag 或 npm 版本)需要人工判断,无法自动解决。
|
|
794
|
-
reconcile 成功只返回 `PUBLISHED`,不会返回 `VERIFIED`;只有全新运行的 verify
|
|
795
|
-
可以产生终态 `VERIFIED`。
|
|
589
|
+
reconcile 成功只返回 `PUBLISHED`,不会返回 `VERIFIED`;只有全新运行的 verify 可以产生终态 `VERIFIED`。
|
|
796
590
|
|
|
797
591
|
## 已验收能力
|
|
798
592
|
|
|
@@ -805,20 +599,15 @@ reconcile 成功只返回 `PUBLISHED`,不会返回 `VERIFIED`;只有全新
|
|
|
805
599
|
- 记录 Git/工作区身份,冻结绑定 digest 的发布计划;
|
|
806
600
|
- 用计划摘要、有效期和显式 action allowlist 绑定人工批准;
|
|
807
601
|
- 从冻结 Git object 和 npm tarball 发布,并核对远端 commit/tree/tag/integrity;
|
|
808
|
-
- 从冻结 Git ref 安装配置的 Claude/Codex 插件,证明入口 Skill
|
|
602
|
+
- 从冻结 Git ref 安装配置的 Claude/Codex 插件,证明入口 Skill 和安装载荷摘要;对 Kimi Code(无可脚本化安装接口)产出版本钉死的手动安装要求,仅依据绑定到冻结计划摘要的可信证明来确认入口 Skill 和载荷摘要;
|
|
809
603
|
- 明确区分 `PUBLISHED`(外写完成)与 `VERIFIED`(远端和消费者安装证据完成);
|
|
810
604
|
- 中途失败停止后续动作,记录独立 run;不修改冻结 plan,不自动撤销已成功动作。
|
|
811
605
|
|
|
812
606
|
## 个性化验证:hook 与 gate
|
|
813
607
|
|
|
814
|
-
`hooks.docs/build/test/typecheck/lint`
|
|
815
|
-
父工作区的步骤。它们可能修改项目或访问网络,prepare 必须显式传入
|
|
816
|
-
`--acknowledge-hook-side-effects`。
|
|
608
|
+
`hooks.docs/build/test/typecheck/lint` 在冻结前运行,适合确实需要生成源文件或依赖父工作区的步骤。它们可能修改项目或访问网络,prepare 必须显式传入 `--acknowledge-hook-side-effects`。
|
|
817
609
|
|
|
818
|
-
每个 hook
|
|
819
|
-
`command` 是可执行文件/参数数组,不是 shell 字符串
|
|
820
|
-
(`command` is an executable/argument array, not a shell string)。每个 hook 还声明
|
|
821
|
-
`cwd`、`timeoutMs` 和 `envAllowlist`:
|
|
610
|
+
每个 hook 都是一个对象,`command` 是可执行文件/参数数组,不是 shell 字符串(`command` is an executable/argument array, not a shell string)。每个 hook 还声明 `cwd`、`timeoutMs` 和 `envAllowlist`:
|
|
822
611
|
|
|
823
612
|
```yaml
|
|
824
613
|
hooks:
|
|
@@ -834,9 +623,6 @@ hooks:
|
|
|
834
623
|
envAllowlist: []
|
|
835
624
|
```
|
|
836
625
|
|
|
837
|
-
hook 同样必须先逐项审阅配置的可执行文件、参数、工作目录和副作用,
|
|
838
|
-
并经 `prepare --acknowledge-hook-side-effects` 明确授权才会运行。
|
|
839
|
-
|
|
840
626
|
`verificationGates` 是更适合发布校准的受控扩展点:
|
|
841
627
|
|
|
842
628
|
```yaml
|
|
@@ -851,26 +637,11 @@ verificationGates:
|
|
|
851
637
|
cwd: .
|
|
852
638
|
timeoutMs: 120000
|
|
853
639
|
envAllowlist: [CI]
|
|
854
|
-
- id: installed-help
|
|
855
|
-
phase: consumer-verify
|
|
856
|
-
scope: { unit: my-project, distribution: npm }
|
|
857
|
-
command: [node, scripts/check-installed-help.mjs]
|
|
858
|
-
cwd: .
|
|
859
|
-
timeoutMs: 30000
|
|
860
|
-
envAllowlist: []
|
|
861
|
-
expectedJson: { status: READY }
|
|
862
640
|
```
|
|
863
641
|
|
|
864
|
-
snapshot
|
|
865
|
-
及其全部依赖必须存在于冻结公开快照;consumer 脚本也必须存在于精确安装的发行物。
|
|
866
|
-
gate 不能借用父工作空间中的测试、开发依赖或 `node_modules`。
|
|
642
|
+
`snapshot-verify` 在冻结公开快照的一次性可写副本中执行;`consumer-verify` 在精确 npm/Claude/Codex/Kimi Code 隔离安装根执行。两者都使用命令数组而非 shell 字符串,定义和结果会进入摘要证据,并要求 prepare/verify 显式传入 `--acknowledge-gate-side-effects`。
|
|
867
643
|
|
|
868
|
-
|
|
869
|
-
npm/Claude/Codex 隔离安装根执行。两者都使用命令数组而非 shell 字符串,定义和
|
|
870
|
-
结果会进入摘要证据,并要求 prepare/verify 显式传入
|
|
871
|
-
`--acknowledge-gate-side-effects`。gate 仍是无网络沙箱的项目进程,release-skill
|
|
872
|
-
无法保证它不会写文件或访问网络。push、tag、默认分支切换、GitHub Release 和
|
|
873
|
-
npm publish 不能放进 hook/gate,只能由冻结计划的受控动作执行。
|
|
644
|
+
push、tag、默认分支修改、GitHub Release 和 npm publish 不能放进 hook/gate,只能由冻结计划的受控动作执行。
|
|
874
645
|
|
|
875
646
|
## 当前不会做什么
|
|
876
647
|
|
|
@@ -878,23 +649,16 @@ npm publish 不能放进 hook/gate,只能由冻结计划的受控动作执行
|
|
|
878
649
|
- 不自动生成 README,不覆盖项目源文件;
|
|
879
650
|
- 不自动合并冲突,也不要求回滚工作流;
|
|
880
651
|
- 不声称已经替项目完成真实生产 canary;
|
|
881
|
-
- `prepare --online` 只观察 bound
|
|
882
|
-
|
|
883
|
-
- 不覆盖已有 branch/tag/Release,不 unpublish npm;新建 ref 仅使用
|
|
884
|
-
`--force-with-lease=<ref>:` 作为“目标必须不存在”的原子比较并设置断言,推进已有
|
|
885
|
-
分支使用普通非 force push;
|
|
652
|
+
- `prepare --online` 只观察 bound 前序基线;目标唯一性由 publish 全局预检完成;
|
|
653
|
+
- 不覆盖已有 branch/tag/Release,不 unpublish npm;
|
|
886
654
|
- 不承诺 Windows 或广泛的跨平台原生写入;
|
|
887
655
|
- 不会隐藏地 commit、push、打 tag、创建 Release 或发布包。
|
|
888
656
|
|
|
889
657
|
### 写入安全
|
|
890
658
|
|
|
891
|
-
`setup` 默认只读,写入只允许精确摘要确认后首次创建配置。`assess`
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
hook,它就是任意本地进程,必须使用 `--acknowledge-hook-side-effects` 明确授权;
|
|
895
|
-
gate 同样是项目进程,必须使用 `--acknowledge-gate-side-effects` 明确授权。它们
|
|
896
|
-
可能自行产生文件系统或网络副作用。`publish` 是唯一生产外写入口,必须同时
|
|
897
|
-
提供 approval 和当前 plan digest。最小安全演练应省略 hook,并在本地沙箱目标运行。
|
|
659
|
+
`setup` 默认只读,写入只允许精确摘要确认后首次创建配置。`assess` 默认只读。`prepare` 会在 `.release-skill/` 下写本地文件,但不会写项目源文件或远端服务。如果配置了 hook,它就是任意本地进程,必须使用 `--acknowledge-hook-side-effects` 明确授权;gate 同样需要 `--acknowledge-gate-side-effects`。
|
|
660
|
+
|
|
661
|
+
`publish` 是唯一生产外写入口,必须同时提供 approval 和当前 plan digest。
|
|
898
662
|
|
|
899
663
|
### 失败时怎么办
|
|
900
664
|
|
|
@@ -904,15 +668,15 @@ gate 同样是项目进程,必须使用 `--acknowledge-gate-side-effects` 明
|
|
|
904
668
|
| `LOCAL_ONLY_DETECTED` | 决定建立远端渠道或仅保留本地配置设计;不得冒充生产就绪。 |
|
|
905
669
|
| `SETUP_DIGEST_MISMATCH` | 项目事实或 answers 已变化;重新 dry-run、审阅并确认新摘要。 |
|
|
906
670
|
| `CONFIG_EXISTS` | setup 不覆盖已有配置;运行 assess 后人工增量修改。 |
|
|
907
|
-
| `SAFE_WRITE_UNAVAILABLE` | 当前平台不支持自动 create-once
|
|
671
|
+
| `SAFE_WRITE_UNAVAILABLE` | 当前平台不支持自动 create-once;保留只读报告,由人工首次创建经审阅的配置。 |
|
|
908
672
|
| `CONFIG_INVALID` | 修正 `.release-skill/project.yaml`,重新运行 `assess`。 |
|
|
909
673
|
| `PUBLIC_FILE_MISSING` | 添加或修正配置中的公开文件。 |
|
|
910
674
|
| `FORBIDDEN_CONTENT_DETECTED` | 移除泄漏或私有内容,再次 prepare。 |
|
|
911
675
|
| `SNAPSHOT_FIDELITY_FAILED` | 检查源文件和快照路径,重新运行 `prepare`。 |
|
|
912
676
|
| `BASELINE_CHANGED` | 保留人工修改,重新 prepare、审阅和 approve。 |
|
|
913
|
-
| `prepare` 阶段 `GATE_FAILED` | 修复 snapshot gate 或冻结公开制品,再生成一份新 plan
|
|
914
|
-
| `verify` 阶段 `GATE_FAILED` | 若是消费者环境失败,修复环境后从同一 `PUBLISHED` run 重跑 verify
|
|
915
|
-
| `PARTIAL` | 不重跑整套发布、不删除远端;审阅返回的 `runPath` 并运行 `reconcile
|
|
677
|
+
| `prepare` 阶段 `GATE_FAILED` | 修复 snapshot gate 或冻结公开制品,再生成一份新 plan。 |
|
|
678
|
+
| `verify` 阶段 `GATE_FAILED` | 若是消费者环境失败,修复环境后从同一 `PUBLISHED` run 重跑 verify;若是已发布制品缺陷,发布新的补丁版本。 |
|
|
679
|
+
| `PARTIAL` | 不重跑整套发布、不删除远端;审阅返回的 `runPath` 并运行 `reconcile`。 |
|
|
916
680
|
| `PUBLISHED` | 运行 `verify --plan <planPath> --run <publishRunPath>`;此时还不是终态。 |
|
|
917
681
|
| `VERIFIED` | 远端状态、精确 npm 安装和插件消费者安装都与冻结计划一致。 |
|
|
918
682
|
|
|
@@ -926,9 +690,6 @@ gate 同样是项目进程,必须使用 `--acknowledge-gate-side-effects` 明
|
|
|
926
690
|
- `release-reconcile`:基于证据恢复 PARTIAL;冲突时人工介入。
|
|
927
691
|
- `release-verify`:发布后验证;只有 `VERIFIED` 才是 happy end。
|
|
928
692
|
|
|
929
|
-
冲突默认仍由人工介入。v0.1.1 生产发布后,受支持的用户入口是 npm 安装的
|
|
930
|
-
`release-skill` CLI;源码 checkout 保留为开发/贡献者路径。
|
|
931
|
-
|
|
932
693
|
## 许可证
|
|
933
694
|
|
|
934
695
|
MIT,见 [LICENSE](LICENSE)。
|