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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "release-skill",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "广州市风荷科技有限公司"
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
],
|
|
20
20
|
"defaultPrompt": [
|
|
21
21
|
"Assess this project for release readiness.",
|
|
22
|
-
"Prepare a release plan for version 0.1.
|
|
22
|
+
"Prepare a release plan for version 0.1.8.",
|
|
23
23
|
"Help me understand the release workflow."
|
|
24
24
|
]
|
|
25
25
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "release-skill",
|
|
3
|
+
"version": "0.1.8",
|
|
4
|
+
"description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "广州市风荷科技有限公司"
|
|
7
|
+
},
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"homepage": "https://github.com/ifoohoo/release-skill#readme",
|
|
10
|
+
"keywords": [
|
|
11
|
+
"release",
|
|
12
|
+
"publish",
|
|
13
|
+
"governance",
|
|
14
|
+
"skill",
|
|
15
|
+
"claude-code",
|
|
16
|
+
"codex",
|
|
17
|
+
"kimi-code"
|
|
18
|
+
],
|
|
19
|
+
"skills": "./adapters/kimi/skills/",
|
|
20
|
+
"interface": {
|
|
21
|
+
"displayName": "Release Skill",
|
|
22
|
+
"shortDescription": "Safe preparation and frozen GitHub/npm publishing",
|
|
23
|
+
"longDescription": "Prepares byte-faithful public snapshots without rewriting project source files and publishes approved frozen GitHub/npm artifacts. Full happy end verification confirms consumer installation from frozen Git ref.",
|
|
24
|
+
"developerName": "ifoohoo",
|
|
25
|
+
"websiteURL": "https://github.com/ifoohoo/release-skill"
|
|
26
|
+
}
|
|
27
|
+
}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
<!-- release-skill:changelog:start version=0.1.8 locale=en baseline=sha256:1e1a0af9d5807bceb7af1eae88b726f67e6811dba4db579fd625c07f3bdbca89 -->
|
|
4
|
+
## [0.1.8] - 2026-07-23
|
|
5
|
+
|
|
6
|
+
v0.1.8 adds Kimi Code as a first-class plugin host without rewriting the already-published v0.1.7 artifacts. Kimi delivery uses a generated self-contained adapter and a fail-closed, plan-bound manual installation attestation because Kimi Code has no scriptable non-interactive plugin installation interface. The npm package name (`release-skill`), publishing identity (`publisher: mzdbxqh`), public repository (`ifoohoo/release-skill`), and corporate maintainer remain unchanged.
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
|
|
10
|
+
- **Kimi Code plugin delivery and verification**: v0.1.8 adds the root
|
|
11
|
+
`.kimi-plugin/plugin.json`, a generated self-contained `adapters/kimi/` bundle,
|
|
12
|
+
and public installation guidance. Because Kimi Code exposes no scriptable
|
|
13
|
+
non-interactive plugin installation interface, production publish emits a
|
|
14
|
+
version-pinned manual installation requirement and enters `PARTIAL`; an
|
|
15
|
+
isolated `KIMI_CODE_HOME` installation and a trusted attestation bound
|
|
16
|
+
independently to the frozen plan digest and payload digest are required before
|
|
17
|
+
`reconcile` can reach `PUBLISHED` and `verify` can reach `VERIFIED`.
|
|
18
|
+
- **Immutable v0.1.7 history preserved**: the existing v0.1.7 Git tag,
|
|
19
|
+
GitHub Release, npm version, and public commit remain untouched. The v0.1.8
|
|
20
|
+
production plan binds the published v0.1.7 commit
|
|
21
|
+
`fe5897456d4166a2ec60e99405836b122562b80d` as its previous public baseline.
|
|
22
|
+
<!-- release-skill:changelog:end version=0.1.8 locale=en -->
|
|
23
|
+
|
|
24
|
+
|
|
3
25
|
<!-- release-skill:changelog:start version=0.1.7 locale=en baseline=sha256:e41fd6460f5bb63343547f04b08e2cfcdd8a64cb53806cbcf39870a2fe27b03e -->
|
|
4
26
|
## [0.1.7] - 2026-07-23
|
|
5
27
|
|
package/INSTALL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[简体中文](INSTALL.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
<!-- release-skill:release-version: 0.1.
|
|
5
|
+
<!-- release-skill:release-version: 0.1.8 -->
|
|
6
6
|
## Prerequisites
|
|
7
7
|
|
|
8
8
|
- Node.js 22.0.0 or later
|
|
@@ -35,6 +35,77 @@ release-skill help
|
|
|
35
35
|
|
|
36
36
|
You should see the version number and the list of available commands.
|
|
37
37
|
|
|
38
|
+
## Install as a Kimi Code plugin
|
|
39
|
+
|
|
40
|
+
Kimi Code is a supported plugin host alongside Claude Code and Codex. The
|
|
41
|
+
Kimi Code plugin manifest lives at `.kimi-plugin/plugin.json`, mirroring
|
|
42
|
+
`.claude-plugin/plugin.json` and `.codex-plugin/plugin.json`, and the package
|
|
43
|
+
ships `adapters/kimi/` next to `adapters/claude/` and `adapters/codex/`.
|
|
44
|
+
|
|
45
|
+
Kimi Code has an interactive plugin marketplace but **no scriptable,
|
|
46
|
+
non-interactive install API**. release-skill therefore models Kimi installation
|
|
47
|
+
as a version-pinned **manual** install plus trusted observation/attestation:
|
|
48
|
+
`publish`/`verify` never auto-install Kimi plugins. The closed loop is:
|
|
49
|
+
|
|
50
|
+
1. `publish` performs the automated writes (Git branch/tag, npm, GitHub
|
|
51
|
+
Release), then reaches the `kimi-marketplace-install` checkpoint. Because
|
|
52
|
+
there is no scriptable install, that checkpoint **fails closed** and the run
|
|
53
|
+
lands in `PARTIAL` — the successful automated writes are NOT undone. The
|
|
54
|
+
checkpoint observation (and the requirement file below) gives the isolated
|
|
55
|
+
`KIMI_CODE_HOME`, the pinned install URL, and the attestation path.
|
|
56
|
+
2. Read the requirement at
|
|
57
|
+
`<root>/.release-skill/kimi-attestations/<planDigest>/<plugin>/release-skill-kimi-manual-install.json`.
|
|
58
|
+
3. Launch Kimi Code with that **isolated** home so the managed copy lands inside
|
|
59
|
+
it (do not use your ordinary `~/.kimi-code`):
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
HOME=<kimiCodeHome> KIMI_CODE_HOME=<kimiCodeHome> kimi
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The plugin installs to `<kimiCodeHome>/plugins/managed/<plugin>/`.
|
|
66
|
+
4. In that isolated session, install from the release tag pinned to the exact
|
|
67
|
+
version (never the bare repository URL, which installs the latest release or
|
|
68
|
+
default branch), confirm the trust prompt, then reload:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
/plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.1.8
|
|
72
|
+
/plugins reload
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
5. Write the attestation JSON to
|
|
76
|
+
`<root>/.release-skill/kimi-attestations/<planDigest>/<plugin>/release-skill-kimi-attestation.json`.
|
|
77
|
+
`planDigest` MUST be the frozen **plan** digest; `payloadDigest` MUST be the
|
|
78
|
+
frozen snapshot **payload** digest; `installPath` MUST be the isolated
|
|
79
|
+
managed directory above; `attestedAt` must not be in the future and
|
|
80
|
+
`expiresAt` must be within 24 hours of `attestedAt`. Example:
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"consumer": "kimi",
|
|
85
|
+
"plugin": "release-skill",
|
|
86
|
+
"version": "0.1.8",
|
|
87
|
+
"entrySkill": "release-help",
|
|
88
|
+
"repo": "ifoohoo/release-skill",
|
|
89
|
+
"ref": "release-skill-v0.1.8",
|
|
90
|
+
"installPath": "<kimiCodeHome>/plugins/managed/release-skill",
|
|
91
|
+
"planDigest": "<64-hex frozen plan digest>",
|
|
92
|
+
"payloadDigest": "<64-hex frozen snapshot payload digest>",
|
|
93
|
+
"attestedBy": "<person responsible>",
|
|
94
|
+
"attestedAt": "2026-07-23T00:00:00.000Z",
|
|
95
|
+
"expiresAt": "2026-07-23T12:00:00.000Z"
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
6. Run `release-skill reconcile --run <publish-run>` (promotes `PARTIAL` →
|
|
100
|
+
`PUBLISHED`) and then `release-skill verify --run <reconcile-run>` (→
|
|
101
|
+
`VERIFIED`). Both read the attestation from the same plan-digest-keyed
|
|
102
|
+
directory, so their fresh run directories do not lose the proof.
|
|
103
|
+
|
|
104
|
+
Installing into the ordinary `~/.kimi-code` is **not** acceptable proof: the
|
|
105
|
+
attested `installPath` must resolve inside the requirement's isolated
|
|
106
|
+
`KIMI_CODE_HOME` managed root, otherwise verification fails closed and the Kimi
|
|
107
|
+
unit never reaches `VERIFIED`.
|
|
108
|
+
|
|
38
109
|
## Development Install (Local Checkout)
|
|
39
110
|
|
|
40
111
|
For development or when working from source:
|
|
@@ -273,7 +344,7 @@ requirements.
|
|
|
273
344
|
|
|
274
345
|
Use a `snapshot-verify` gate for checks that should run against a disposable
|
|
275
346
|
writable copy of the frozen public snapshot. Use `consumer-verify` for commands
|
|
276
|
-
that must run from an exact isolated npm/Claude/Codex installation root. Gate
|
|
347
|
+
that must run from an exact isolated npm/Claude/Codex/Kimi Code installation root. Gate
|
|
277
348
|
commands are executable arrays, not shell strings, and must declare unit,
|
|
278
349
|
distribution when applicable, cwd, timeout, and environment allowlist.
|
|
279
350
|
|
package/INSTALL.zh-CN.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[English](INSTALL.md)
|
|
4
4
|
|
|
5
|
-
<!-- release-skill:release-version: 0.1.
|
|
5
|
+
<!-- release-skill:release-version: 0.1.8 -->
|
|
6
6
|
## 前置条件
|
|
7
7
|
|
|
8
8
|
- Node.js 22.0.0 或更高版本
|
|
@@ -10,9 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
## 从 npm 安装(推荐)
|
|
12
12
|
|
|
13
|
-
公开版本只有在不可变生产计划经过批准、发布并达到 `VERIFIED`
|
|
14
|
-
源码检出,只有当 `npm view release-skill version` 返回该精确版本后才使用 npm 安装;
|
|
15
|
-
在此之前请使用下文的源码检出方式。
|
|
13
|
+
公开版本只有在不可变生产计划经过批准、发布并达到 `VERIFIED` 后才算完整。对于尚未公开发布的源码版本,只有当 `npm view release-skill version` 返回该精确版本后才使用 npm 安装;在此之前请使用下文的源码检出方式。
|
|
16
14
|
|
|
17
15
|
```bash
|
|
18
16
|
npm install -g release-skill
|
|
@@ -34,6 +32,72 @@ release-skill help
|
|
|
34
32
|
|
|
35
33
|
输出中应包含版本号和可用命令列表。
|
|
36
34
|
|
|
35
|
+
## 安装为 Kimi Code 插件
|
|
36
|
+
|
|
37
|
+
Kimi Code 是与 Claude Code 和 Codex 并列的受支持插件宿主。Kimi Code 插件
|
|
38
|
+
清单位于 `.kimi-plugin/plugin.json`,与 `.claude-plugin/plugin.json`、
|
|
39
|
+
`.codex-plugin/plugin.json` 对应;包内同时提供 `adapters/kimi/`,与
|
|
40
|
+
`adapters/claude/`、`adapters/codex/` 并列。
|
|
41
|
+
|
|
42
|
+
Kimi Code 有交互式插件市场,但**没有可脚本化的非交互安装接口**。因此
|
|
43
|
+
release-skill 把 Kimi 安装建模为“版本钉死的手动安装 + 可信观测/人工证明”:
|
|
44
|
+
`publish`/`verify` 从不对 Kimi 执行自动安装。完整闭环如下:
|
|
45
|
+
|
|
46
|
+
1. `publish` 先完成自动化写入(Git branch/tag、npm、GitHub Release),随后
|
|
47
|
+
到达 `kimi-marketplace-install` 检查点。由于没有可脚本化安装接口,该检查点
|
|
48
|
+
**失败关闭**,整个 run 落入 `PARTIAL`——已成功的自动化写入**不会**被撤销。
|
|
49
|
+
检查点输出(以及下面的 requirement 文件)会给出隔离的 `KIMI_CODE_HOME`、
|
|
50
|
+
钉死的安装 URL 与证明写入路径。
|
|
51
|
+
2. 读取 requirement:
|
|
52
|
+
`<root>/.release-skill/kimi-attestations/<planDigest>/<plugin>/release-skill-kimi-manual-install.json`。
|
|
53
|
+
3. 用该**隔离** home 启动 Kimi Code,使 managed 副本落在其中(不要使用你日常的
|
|
54
|
+
`~/.kimi-code`):
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
HOME=<kimiCodeHome> KIMI_CODE_HOME=<kimiCodeHome> kimi
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
插件会安装到 `<kimiCodeHome>/plugins/managed/<plugin>/`。
|
|
61
|
+
4. 在该隔离会话中,从钉死到精确版本的 release tag 安装(切勿使用裸仓库地址,
|
|
62
|
+
它会安装最新 release 或默认分支),确认信任提示后重新加载:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
/plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.1.8
|
|
66
|
+
/plugins reload
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
5. 把证明 JSON 写入
|
|
70
|
+
`<root>/.release-skill/kimi-attestations/<planDigest>/<plugin>/release-skill-kimi-attestation.json`。
|
|
71
|
+
`planDigest` 必须是冻结**计划**摘要;`payloadDigest` 必须是冻结快照**载荷**
|
|
72
|
+
摘要;`installPath` 必须是上面的隔离 managed 目录;`attestedAt` 不得为未来
|
|
73
|
+
时间,`expiresAt` 必须在 `attestedAt` 之后 24 小时内。示例:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"consumer": "kimi",
|
|
78
|
+
"plugin": "release-skill",
|
|
79
|
+
"version": "0.1.8",
|
|
80
|
+
"entrySkill": "release-help",
|
|
81
|
+
"repo": "ifoohoo/release-skill",
|
|
82
|
+
"ref": "release-skill-v0.1.8",
|
|
83
|
+
"installPath": "<kimiCodeHome>/plugins/managed/release-skill",
|
|
84
|
+
"planDigest": "<64 位十六进制冻结计划摘要>",
|
|
85
|
+
"payloadDigest": "<64 位十六进制冻结快照载荷摘要>",
|
|
86
|
+
"attestedBy": "<责任人>",
|
|
87
|
+
"attestedAt": "2026-07-23T00:00:00.000Z",
|
|
88
|
+
"expiresAt": "2026-07-23T12:00:00.000Z"
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
6. 运行 `release-skill reconcile --run <publish-run>`(把 `PARTIAL` 提升为
|
|
93
|
+
`PUBLISHED`),再运行 `release-skill verify --run <reconcile-run>`(→
|
|
94
|
+
`VERIFIED`)。两者都从同一个按计划摘要命名的目录读取证明,因此它们各自的
|
|
95
|
+
新 run 目录不会丢失该证明。
|
|
96
|
+
|
|
97
|
+
把插件安装到日常的 `~/.kimi-code` **不**构成有效证明:证明中的 `installPath`
|
|
98
|
+
必须解析到 requirement 给出的隔离 `KIMI_CODE_HOME` managed 根之内,否则验证
|
|
99
|
+
失败关闭,Kimi 单元绝不进入 `VERIFIED`。
|
|
100
|
+
|
|
37
101
|
## 开发安装(本地源码)
|
|
38
102
|
|
|
39
103
|
用于开发或尚未公开发布的源码候选:
|
|
@@ -51,8 +115,7 @@ CLI=(node "$RELEASE_SKILL_HOME/packages/release-skill/bin/release-skill.mjs")
|
|
|
51
115
|
"${CLI[@]}" help
|
|
52
116
|
```
|
|
53
117
|
|
|
54
|
-
当 `npm view release-skill version` 已确认目标版本公开并安装后,等价的 npm 入口是
|
|
55
|
-
`CLI=(release-skill)`。同一次运行不要混用 npm 与源码入口。
|
|
118
|
+
当 `npm view release-skill version` 已确认目标版本公开并安装后,等价的 npm 入口是 `CLI=(release-skill)`。同一次运行不要混用 npm 与源码入口。
|
|
56
119
|
|
|
57
120
|
## 首次运行
|
|
58
121
|
|
|
@@ -62,8 +125,7 @@ CLI=(node "$RELEASE_SKILL_HOME/packages/release-skill/bin/release-skill.mjs")
|
|
|
62
125
|
"${CLI[@]}" help
|
|
63
126
|
```
|
|
64
127
|
|
|
65
|
-
如果项目尚无 `.release-skill/project.yaml
|
|
66
|
-
确定性的 `compactSummary`(紧凑摘要):
|
|
128
|
+
如果项目尚无 `.release-skill/project.yaml`,把完整只读报告写入临时文件,只查看其中确定性的 `compactSummary`(紧凑摘要):
|
|
67
129
|
|
|
68
130
|
```bash
|
|
69
131
|
PROJECT=/path/to/your/project
|
|
@@ -77,9 +139,7 @@ printf 'SETUP_SESSION=%s\nPROJECT=%s\n' "$SETUP_SESSION" "$PROJECT"
|
|
|
77
139
|
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"
|
|
78
140
|
```
|
|
79
141
|
|
|
80
|
-
紧凑摘要只是审阅视图,不是授权;`setupDigest` 仍绑定完整事实、候选和 answers。若
|
|
81
|
-
`proposalConflicts` 非空,必须由人工修正冲突的仓库/映射权威事实后重跑 setup,不能
|
|
82
|
-
猜测选边。没有冲突时,机械提取机器提案:
|
|
142
|
+
紧凑摘要只是审阅视图,不是授权;`setupDigest` 仍绑定完整事实、候选和 answers。若 `proposalConflicts` 非空,必须由人工修正冲突的仓库/映射权威事实后重跑 setup,不能猜测选边。没有冲突时,机械提取机器提案:
|
|
83
143
|
|
|
84
144
|
```bash
|
|
85
145
|
SETUP_SESSION='/上一步打印的会话目录绝对路径'
|
|
@@ -88,13 +148,13 @@ REPORT="$SETUP_SESSION/discovery.json"
|
|
|
88
148
|
ANSWERS="$SETUP_SESSION/answers.json"
|
|
89
149
|
BOUND_REPORT="$SETUP_SESSION/bound.json"
|
|
90
150
|
node -e 'const fs=require("node:fs");const r=JSON.parse(fs.readFileSync(process.argv[1],"utf8"));if((r.proposalConflicts??[]).length){console.error("proposal conflicts require human resolution");process.exit(2)}if(!r.recommendedAnswers){console.error("recommendedAnswers missing");process.exit(2)}fs.writeFileSync(process.argv[2],JSON.stringify(r.recommendedAnswers,null,2)+"\n",{flag:"wx",mode:0o600})' "$REPORT" "$ANSWERS"
|
|
151
|
+
|
|
91
152
|
"${CLI[@]}" setup --root "$PROJECT" --answers "$ANSWERS" --json > "$BOUND_REPORT"
|
|
92
153
|
node -e 'const fs=require("node:fs");const r=JSON.parse(fs.readFileSync(process.argv[1],"utf8"));if(!r.compactSummary||!r.setupDigest){console.error("bound setup report incomplete");process.exit(2)}process.stdout.write(JSON.stringify({compactSummary:r.compactSummary,setupDigest:r.setupDigest},null,2)+"\n")' "$BOUND_REPORT"
|
|
93
154
|
printf 'SETUP_SESSION=%s\nPROJECT=%s\n' "$SETUP_SESSION" "$PROJECT"
|
|
94
155
|
```
|
|
95
156
|
|
|
96
|
-
人工只确认一次绑定摘要和精确摘要值,然后使用已确认字面量首次创建。结果必须是
|
|
97
|
-
`CONFIG_CREATED`;第二次 setup 必须是 `ALREADY_CONFIGURED`,随后运行 assess。
|
|
157
|
+
人工只确认一次绑定摘要和精确摘要值,然后使用已确认字面量首次创建。结果必须是 `CONFIG_CREATED`;第二次 setup 必须是 `ALREADY_CONFIGURED`,随后运行 assess。
|
|
98
158
|
|
|
99
159
|
```bash
|
|
100
160
|
SETUP_SESSION=<上一步打印的会话目录绝对路径>
|
|
@@ -115,10 +175,7 @@ node -e 'const fs=require("node:fs");const [c,p,a]=process.argv.slice(1).map(x=>
|
|
|
115
175
|
node -e 'require("node:fs").rmSync(process.argv[1],{recursive:true,force:false})' "$SETUP_SESSION"
|
|
116
176
|
```
|
|
117
177
|
|
|
118
|
-
解释器/包管理器间接脚本以 `SIDE_EFFECTS_UNPROVEN` 排除且默认不选。项目特有 hook/gate
|
|
119
|
-
只能经人工审阅后增量注册:hook 编辑 `projectConfig.hooks`;gate 编辑
|
|
120
|
-
`verificationGates` 并将同一 id 加入 `selectedGateIds`,然后重跑绑定 dry-run。人工文件使用 `mode: preserve`;显式跨单元共享源使用
|
|
121
|
-
`sourceScope: workspace`。
|
|
178
|
+
解释器/包管理器间接脚本以 `SIDE_EFFECTS_UNPROVEN` 排除且默认不选。项目特有 hook/gate 只能经人工审阅后增量注册:hook 编辑 `projectConfig.hooks`;gate 编辑 `verificationGates` 并将同一 id 加入 `selectedGateIds`,然后重跑绑定 dry-run。人工文件使用 `mode: preserve`;显式跨单元共享源使用 `sourceScope: workspace`。
|
|
122
179
|
|
|
123
180
|
### 进阶 schema 参考——不是首次运行主路径
|
|
124
181
|
|
|
@@ -160,17 +217,11 @@ node -e 'require("node:fs").rmSync(process.argv[1],{recursive:true,force:false})
|
|
|
160
217
|
}
|
|
161
218
|
```
|
|
162
219
|
|
|
163
|
-
这个外壳仅供参考。正常 setup
|
|
164
|
-
使用 `mode: none`。人工增量加入 gate 时,其 id 必须与 `selectedGateIds` 精确一致,
|
|
165
|
-
snapshot gate 及其依赖必须存在于 `publicFiles`。详见
|
|
166
|
-
[README 首次接入章节](README.zh-CN.md#首次接入不加载完整报告的确定性流程)。
|
|
220
|
+
这个外壳仅供参考。正常 setup 必须使用机器提案;只有确认不存在历史公开版本时才可使用 `mode: none`。
|
|
167
221
|
|
|
168
|
-
已有配置永远不会被重新生成或覆盖。无法发现 GitHub/npm 渠道的项目返回
|
|
169
|
-
`LOCAL_ONLY_DETECTED`,不会冒充生产就绪。
|
|
222
|
+
已有配置永远不会被重新生成或覆盖。无法发现 GitHub/npm 渠道的项目返回 `LOCAL_ONLY_DETECTED`,不会冒充生产就绪。
|
|
170
223
|
|
|
171
|
-
自动 create-once 写入使用 v0.1.3 随包提供、带摘要登记的 `darwin-arm64`
|
|
172
|
-
其他平台以 `SAFE_WRITE_UNAVAILABLE` 失败关闭;此时保留只读报告,由人工首次创建经审阅
|
|
173
|
-
的文件,不得启用不安全的路径写入兜底。
|
|
224
|
+
自动 create-once 写入使用 v0.1.3 随包提供、带摘要登记的 `darwin-arm64` 原生预构建。其他平台以 `SAFE_WRITE_UNAVAILABLE` 失败关闭;此时保留只读报告,由人工首次创建经审阅的文件,不得启用不安全的路径写入兜底。
|
|
174
225
|
|
|
175
226
|
配置存在后,检查发布就绪度:
|
|
176
227
|
|
|
@@ -178,12 +229,9 @@ snapshot gate 及其依赖必须存在于 `publicFiles`。详见
|
|
|
178
229
|
"${CLI[@]}" assess --root /path/to/your/project --offline --json
|
|
179
230
|
```
|
|
180
231
|
|
|
181
|
-
该命令只读地检查项目结构、配置、文档和供应链;未显式传入 `--output`
|
|
182
|
-
也不运行项目 hook。
|
|
232
|
+
该命令只读地检查项目结构、配置、文档和供应链;未显式传入 `--output` 时不写报告,也不运行项目 hook。
|
|
183
233
|
|
|
184
|
-
`prepare` 不同:它在目标项目的 `.release-skill/` 下写入发布工件,并可能运行已配置
|
|
185
|
-
hook。hook 是无沙箱的任意进程,可能写到项目外、访问凭据、使用网络或执行远端写入。
|
|
186
|
-
授予 `--acknowledge-hook-side-effects` 前必须审阅可执行文件、参数和工作目录。
|
|
234
|
+
`prepare` 不同:它在目标项目的 `.release-skill/` 下写入发布工件,并可能运行已配置 hook。hook 是无沙箱的任意进程,可能写到项目外、访问凭据、使用网络或执行远端写入。授予 `--acknowledge-hook-side-effects` 前必须审阅可执行文件、参数和工作目录。
|
|
187
235
|
|
|
188
236
|
Git 仓库应保留人工配置,同时忽略生成的权威文件和证据:
|
|
189
237
|
|
|
@@ -236,8 +284,7 @@ releaseUnits:
|
|
|
236
284
|
|
|
237
285
|
### 进阶:hook(可选)
|
|
238
286
|
|
|
239
|
-
hook 是可选的任意本地进程。prepare 使用 hook 时必须显式授予
|
|
240
|
-
`--acknowledge-hook-side-effects`:
|
|
287
|
+
hook 是可选的任意本地进程。prepare 使用 hook 时必须显式授予 `--acknowledge-hook-side-effects`:
|
|
241
288
|
|
|
242
289
|
```yaml
|
|
243
290
|
hooks:
|
|
@@ -254,9 +301,7 @@ hooks:
|
|
|
254
301
|
|
|
255
302
|
### 进阶:验证 gate(可选)
|
|
256
303
|
|
|
257
|
-
`snapshot-verify` 用于冻结公开快照的一次性可写副本;`consumer-verify`
|
|
258
|
-
隔离安装后的 npm/Claude/Codex 根目录。gate 使用可执行文件数组而不是 shell 字符串,
|
|
259
|
-
并声明 unit、必要时的 distribution、cwd、超时和环境变量白名单。
|
|
304
|
+
`snapshot-verify` 用于冻结公开快照的一次性可写副本;`consumer-verify` 用于精确且隔离安装后的 npm/Claude/Codex/Kimi Code 根目录。gate 使用可执行文件数组而不是 shell 字符串,并声明 unit、必要时的 distribution、cwd、超时和环境变量白名单。
|
|
260
305
|
|
|
261
306
|
```yaml
|
|
262
307
|
verificationGates:
|
|
@@ -269,21 +314,13 @@ verificationGates:
|
|
|
269
314
|
envAllowlist: []
|
|
270
315
|
```
|
|
271
316
|
|
|
272
|
-
|
|
273
|
-
存在于冻结公开快照;gate 不能借用父工作空间中的测试、开发依赖或 `node_modules`。
|
|
317
|
+
这个自包含示例只读取已映射的公开文件。若替换成项目脚本,该脚本及全部依赖必须存在于冻结公开快照;gate 不能借用父工作空间中的测试、开发依赖或 `node_modules`。
|
|
274
318
|
|
|
275
|
-
当计划的当前阶段包含 gate 时,prepare 或 verify 必须传入
|
|
276
|
-
`--acknowledge-gate-side-effects`。hook/gate 都是无网络沙箱的项目进程;
|
|
277
|
-
release-skill 约束其输入与证据,但无法保证自定义命令不修改文件或不访问网络。
|
|
278
|
-
禁止把 Git push、tag、默认分支修改、GitHub Release 或 npm publish 注册为
|
|
279
|
-
hook/gate,它们只能由受控的计划动作完成。
|
|
319
|
+
当计划的当前阶段包含 gate 时,prepare 或 verify 必须传入 `--acknowledge-gate-side-effects`。hook/gate 都是无网络沙箱的项目进程;release-skill 约束其输入与证据,但无法保证自定义命令不修改文件或不访问网络。禁止把 Git push、tag、默认分支修改、GitHub Release 或 npm publish 注册为 hook/gate,它们只能由受控的计划动作完成。
|
|
280
320
|
|
|
281
321
|
### 进阶:发布文档刷新(可选)
|
|
282
322
|
|
|
283
|
-
发布单元可以声明 `releaseDocuments`,用一份结构化说明源确定性刷新 README
|
|
284
|
-
区域和 CHANGELOG 当前版本条目。该命令离线运行:不联网、不调用大模型、不自动
|
|
285
|
-
翻译;只改写声明过的受管区域、唯一版本标记的机器值和 CHANGELOG 当前版本受管
|
|
286
|
-
条目,其他字节全部保留。`prepare` 只检查新鲜度,不写工作树。
|
|
323
|
+
发布单元可以声明 `releaseDocuments`,用一份结构化说明源确定性刷新 README 受管区域和 CHANGELOG 当前版本条目。该命令离线运行:不联网、不调用大模型、不自动翻译;只改写声明过的受管区域、唯一版本标记的机器值和 CHANGELOG 当前版本受管条目,其他字节全部保留。`prepare` 只检查新鲜度,不写工作树。
|
|
287
324
|
|
|
288
325
|
```yaml
|
|
289
326
|
# .release-skill/project.yaml 的发布单元片段
|
|
@@ -308,29 +345,6 @@ releaseUnits:
|
|
|
308
345
|
regions: [latest-release]
|
|
309
346
|
```
|
|
310
347
|
|
|
311
|
-
`notesSource` 和所有目标路径均相对发布单元根;`versionMarkers[].pattern` 必须与
|
|
312
|
-
README 现有唯一版本标记精确匹配,刷新只替换机器版本值。说明源位于发布单元根
|
|
313
|
-
下,`version` 必须与解析出的单元版本一致,每个配置语种恰好出现一次且 summary
|
|
314
|
-
非空、至少一个变更类别有条目;YAML alias、重复键、未知字段和语种回退均失败
|
|
315
|
-
关闭:
|
|
316
|
-
|
|
317
|
-
```yaml
|
|
318
|
-
# release-notes/0.1.6.yaml
|
|
319
|
-
version: 0.1.6
|
|
320
|
-
date: 2026-07-21
|
|
321
|
-
locales:
|
|
322
|
-
en:
|
|
323
|
-
summary: Deterministic multilingual release-document refresh.
|
|
324
|
-
changes:
|
|
325
|
-
added:
|
|
326
|
-
- Refresh managed README regions and changelogs from one source.
|
|
327
|
-
zh-CN:
|
|
328
|
-
summary: 从同一说明源确定性刷新多语种发布文档。
|
|
329
|
-
changes:
|
|
330
|
-
added:
|
|
331
|
-
- 自动刷新 README 受管区域和 CHANGELOG。
|
|
332
|
-
```
|
|
333
|
-
|
|
334
348
|
先只读演练,确认后再带三项绑定写入:
|
|
335
349
|
|
|
336
350
|
```bash
|
|
@@ -339,12 +353,7 @@ locales:
|
|
|
339
353
|
--write --confirm-refresh <refreshDigest> --ack-local-document-write --json
|
|
340
354
|
```
|
|
341
355
|
|
|
342
|
-
`refreshDigest`
|
|
343
|
-
时间、绝对路径或展示文本。摘要不匹配以 `RELEASE_DOCS_REFRESH_STALE` 失败关闭且
|
|
344
|
-
零写入;候选无变化时返回 `clean` 同样零写入。该授权只覆盖声明的本地文档目标,
|
|
345
|
-
不是 hook、提交、push、publish 或安装的授权。`prepare` 报告 `RELEASE_DOCS_STALE`
|
|
346
|
-
时,按“运行演练 → 审阅文件与语种 → 确认本地写入 → 审阅并提交 → 重新 prepare”
|
|
347
|
-
恢复。完整契约见 README 的发布文档刷新章节。
|
|
356
|
+
`refreshDigest` 绑定规范说明对象、配置投影和按路径排序的逐文件新旧摘要,不绑定时间、绝对路径或展示文本。摘要不匹配以 `RELEASE_DOCS_REFRESH_STALE` 失败关闭且零写入;候选无变化时返回 `clean` 同样零写入。该授权只覆盖声明的本地文档目标,不是 hook、提交、push、publish 或安装的授权。完整契约见 README 的发布文档刷新章节。
|
|
348
357
|
|
|
349
358
|
### 生产分支策略
|
|
350
359
|
|
|
@@ -352,12 +361,9 @@ locales:
|
|
|
352
361
|
|
|
353
362
|
- `create-release-branch`:创建此前不存在且不可变的 release 分支;
|
|
354
363
|
- `advance-existing-branch`:从精确绑定的公开基线用普通非 force push 快进已有分支;
|
|
355
|
-
- `initialize-default-branch`:创建不存在的标准分支;只有同时审阅
|
|
356
|
-
`setAsDefaultBranch` 与 `expectedCurrentDefaultBranch` 后,计划才可增加显式默认分支动作。
|
|
364
|
+
- `initialize-default-branch`:创建不存在的标准分支;只有同时审阅 `setAsDefaultBranch` 与 `expectedCurrentDefaultBranch` 后,计划才可增加显式默认分支动作。
|
|
357
365
|
|
|
358
|
-
|
|
359
|
-
远端历史。新建 ref 仅使用 `--force-with-lease=<ref>:` 作为“目标必须不存在”的原子
|
|
360
|
-
断言;推进已有分支使用普通非 force push。
|
|
366
|
+
远端漂移、非快进或默认分支不符合预期时必须停止并由人工介入。所有策略都禁止覆盖远端历史。新建 ref 仅使用 `--force-with-lease=<ref>:` 作为“目标必须不存在”的原子断言;推进已有分支使用普通非 force push。
|
|
361
367
|
|
|
362
368
|
```yaml
|
|
363
369
|
# create-release-branch:目标分支必须不存在
|
|
@@ -393,34 +399,23 @@ production:
|
|
|
393
399
|
expectedCurrentDefaultBranch: old-public-branch
|
|
394
400
|
```
|
|
395
401
|
|
|
396
|
-
后两种策略必须在线执行 production prepare
|
|
397
|
-
真实远端状态后才能人工更新权威配置,禁止 force push 或弱化基线。
|
|
402
|
+
后两种策略必须在线执行 production prepare。任何不一致都应停止并审阅;只有检查真实远端状态后才能人工更新权威配置,禁止 force push 或弱化基线。
|
|
398
403
|
|
|
399
404
|
## 保护人工维护内容
|
|
400
405
|
|
|
401
|
-
README 文案、slogan、示例、排版及其他人工源文件始终是权威。release-skill 只按
|
|
402
|
-
`publicFiles` 映射做快照,不重新生成或覆盖源 README。每次人工编辑后重新 prepare,
|
|
403
|
-
并批准新的不可变计划;不得编辑冻结快照或复用旧批准绕过变化。
|
|
406
|
+
README 文案、slogan、示例、排版及其他人工源文件始终是权威。release-skill 只按 `publicFiles` 映射做快照,不重新生成或覆盖源 README。每次人工编辑后重新 prepare,并批准新的不可变计划;不得编辑冻结快照或复用旧批准绕过变化。
|
|
404
407
|
|
|
405
408
|
如果已有公开副本发生漂移,显式选择:
|
|
406
409
|
|
|
407
|
-
- **merge(合并)**:比较真实远端内容,把接受的改动合并回人工源文件,然后把
|
|
408
|
-
`previousPublicBaseline` 绑定到精确不可变的 `repo`/`ref`/`commit`,再 prepare;
|
|
410
|
+
- **merge(合并)**:比较真实远端内容,把接受的改动合并回人工源文件,然后把 `previousPublicBaseline` 绑定到精确不可变的 `repo`/`ref`/`commit`,再 prepare;
|
|
409
411
|
- **adopt(采纳)**:接受远端为新的事实来源,先带回人工源文件,再更新同一基线绑定;
|
|
410
412
|
- **reject(拒绝)**:停止并调查。不得改成 `mode: none` 绕过漂移或唯一性检查。
|
|
411
413
|
|
|
412
414
|
## 下一步
|
|
413
415
|
|
|
414
416
|
- 阅读[完整中文 README](README.zh-CN.md)了解整个工作流。
|
|
415
|
-
- 缺少配置时运行 `"${CLI[@]}" setup --root <your-project> --json
|
|
416
|
-
保持默认 dry-run。
|
|
417
|
+
- 缺少配置时运行 `"${CLI[@]}" setup --root <your-project> --json`,在人工决策完成前保持默认 dry-run。
|
|
417
418
|
- 运行 `"${CLI[@]}" assess --root <your-project> --offline` 检查发布就绪度。
|
|
418
|
-
- 运行 `"${CLI[@]}" prepare --root <your-project> --offline` 生成发布计划;
|
|
419
|
-
|
|
420
|
-
-
|
|
421
|
-
`mode: bound`,绑定精确 `repo`、`ref` 和 `commit`,再运行
|
|
422
|
-
`"${CLI[@]}" prepare --root <your-project> --online --production`。默认观察器只证明
|
|
423
|
-
ref 到 commit 的映射,不下载远端内容;目标 branch/tag/Release/npm 唯一性由
|
|
424
|
-
publish 全局预检在任何 execute 前检查。
|
|
425
|
-
- 生产命令只使用 `prepare --json` 返回的不可变 `planPath`,以及 `approve --json`
|
|
426
|
-
返回的不可变 `approvalPath`。可变的 latest 别名不能作为生产权威。
|
|
419
|
+
- 运行 `"${CLI[@]}" prepare --root <your-project> --offline` 生成发布计划;release-skill 自身只做本地写入,但项目 hook 可能执行远端操作。
|
|
420
|
+
- 生产前为每个 unit 配置 `previousPublicBaseline`。已有公开版本必须使用 `mode: bound`,绑定精确 `repo`、`ref` 和 `commit`,再运行 `"${CLI[@]}" prepare --root <your-project> --online --production`。
|
|
421
|
+
- 生产命令只使用 `prepare --json` 返回的不可变 `planPath`,以及 `approve --json` 返回的不可变 `approvalPath`。
|