release-skill 0.1.1 → 0.1.4
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 +2 -2
- package/.codex-plugin/plugin.json +3 -3
- package/CHANGELOG.md +89 -0
- package/INSTALL.md +216 -5
- package/INSTALL.zh-CN.md +358 -0
- package/README.md +411 -67
- package/README.zh-CN.md +377 -59
- 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 +79284 -0
- package/adapters/claude/bin/release-skill.mjs +34 -0
- package/adapters/claude/native/safe-write/binding.gyp +40 -0
- package/adapters/claude/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
- package/adapters/claude/native/safe-write/prebuilds.json +24 -0
- package/adapters/claude/native/safe-write/src/safe_write.cc +2032 -0
- package/adapters/claude/schemas/.render-manifest.json +37 -0
- package/adapters/claude/schemas/approval-record.schema.json +115 -0
- package/adapters/claude/schemas/artifact-lock.schema.json +111 -0
- package/adapters/claude/schemas/artifact-plan.schema.json +52 -0
- package/adapters/claude/schemas/artifact-policy.schema.json +76 -0
- package/adapters/claude/schemas/evidence-event.schema.json +89 -0
- package/adapters/claude/schemas/release-plan.schema.json +860 -0
- package/adapters/claude/schemas/release-project.schema.json +736 -0
- package/adapters/claude/schemas/release-run.schema.json +342 -0
- package/adapters/claude/skills/release-assess/SKILL.md +5 -6
- package/adapters/claude/skills/release-help/SKILL.md +14 -18
- package/adapters/claude/skills/release-prepare/SKILL.md +16 -6
- package/adapters/claude/skills/release-publish/SKILL.md +7 -7
- package/adapters/claude/skills/release-reconcile/SKILL.md +6 -6
- package/adapters/claude/skills/release-setup/SKILL.md +95 -0
- package/adapters/claude/skills/release-verify/SKILL.md +7 -7
- package/adapters/codex/.codex-plugin/plugin.json +2 -2
- package/adapters/codex/bin/release-skill.bundle.mjs +79284 -0
- package/adapters/codex/bin/release-skill.mjs +34 -0
- package/adapters/codex/native/safe-write/binding.gyp +40 -0
- package/adapters/codex/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
- package/adapters/codex/native/safe-write/prebuilds.json +24 -0
- package/adapters/codex/native/safe-write/src/safe_write.cc +2032 -0
- package/adapters/codex/schemas/.render-manifest.json +37 -0
- package/adapters/codex/schemas/approval-record.schema.json +115 -0
- package/adapters/codex/schemas/artifact-lock.schema.json +111 -0
- package/adapters/codex/schemas/artifact-plan.schema.json +52 -0
- package/adapters/codex/schemas/artifact-policy.schema.json +76 -0
- package/adapters/codex/schemas/evidence-event.schema.json +89 -0
- package/adapters/codex/schemas/release-plan.schema.json +860 -0
- package/adapters/codex/schemas/release-project.schema.json +736 -0
- package/adapters/codex/schemas/release-run.schema.json +342 -0
- package/adapters/codex/skills/release-assess/SKILL.md +12 -6
- package/adapters/codex/skills/release-help/SKILL.md +21 -18
- package/adapters/codex/skills/release-prepare/SKILL.md +23 -6
- package/adapters/codex/skills/release-publish/SKILL.md +14 -7
- package/adapters/codex/skills/release-reconcile/SKILL.md +13 -6
- package/adapters/codex/skills/release-setup/SKILL.md +102 -0
- package/adapters/codex/skills/release-verify/SKILL.md +14 -7
- package/bin/release-skill-cli.mjs +807 -0
- package/bin/release-skill.bundle.mjs +79284 -0
- package/bin/release-skill.mjs +23 -732
- package/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
- package/native/safe-write/prebuilds.json +22 -2
- package/native/safe-write/src/safe_write.cc +11 -2
- package/package.json +8 -2
- package/references/02-project-config.md +55 -4
- package/references/05-evidence-and-errors.md +6 -2
- package/schemas/release-plan.schema.json +556 -65
- package/schemas/release-project.schema.json +406 -29
- package/schemas/release-run.schema.json +165 -18
- package/scripts/build-bundle.mjs +133 -0
- package/skills/release-assess/SKILL.md +5 -6
- package/skills/release-help/SKILL.md +14 -18
- package/skills/release-prepare/SKILL.md +16 -6
- package/skills/release-publish/SKILL.md +7 -7
- package/skills/release-reconcile/SKILL.md +6 -6
- package/skills/release-setup/SKILL.md +95 -0
- package/skills/release-verify/SKILL.md +7 -7
- package/skills-src/release-assess/SKILL.md +5 -6
- package/skills-src/release-help/SKILL.md +14 -18
- package/skills-src/release-prepare/SKILL.md +16 -6
- package/skills-src/release-publish/SKILL.md +7 -7
- package/skills-src/release-reconcile/SKILL.md +6 -6
- package/skills-src/release-setup/SKILL.md +95 -0
- package/skills-src/release-verify/SKILL.md +7 -7
- package/src/adapters/contract.mjs +3 -0
- package/src/adapters/git-github.mjs +84 -2
- package/src/adapters/npm.mjs +5 -13
- package/src/adapters/plugin-marketplace.mjs +132 -52
- package/src/adapters/push-snapshot.mjs +84 -17
- package/src/artifacts/policy.mjs +4 -7
- package/src/artifacts/safe-fs-backend-internal.mjs +69 -21
- package/src/commands/prepare.mjs +244 -20
- package/src/commands/publish.mjs +46 -0
- package/src/commands/reconcile.mjs +152 -0
- package/src/commands/setup.mjs +1525 -0
- package/src/commands/verify.mjs +122 -26
- package/src/core/approval.mjs +4 -6
- package/src/core/config.mjs +42 -8
- package/src/core/errors.mjs +4 -0
- package/src/core/pkg-root.mjs +22 -0
- package/src/core/plan.mjs +132 -4
- package/src/core/previous-public-baseline.mjs +21 -1
- package/src/core/run.mjs +4 -4
- package/src/core/trusted-resource.mjs +96 -0
- package/src/core/verification-gates.mjs +451 -0
- package/src/docs/version-gate.mjs +164 -0
- package/src/producers/build-adapters.mjs +512 -55
- package/src/snapshot/frozen.mjs +221 -7
- package/src/snapshot/public-map.mjs +7 -4
- package/src/snapshot/scan.mjs +2 -1
package/INSTALL.zh-CN.md
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
# 安装指南
|
|
2
|
+
|
|
3
|
+
[English](INSTALL.md)
|
|
4
|
+
|
|
5
|
+
<!-- release-skill:release-version: 0.1.4 -->
|
|
6
|
+
## 前置条件
|
|
7
|
+
|
|
8
|
+
- Node.js 22.0.0 或更高版本
|
|
9
|
+
- Git 2.30 或更高版本
|
|
10
|
+
|
|
11
|
+
## 从 npm 安装(推荐)
|
|
12
|
+
|
|
13
|
+
公开版本只有在不可变生产计划经过批准、发布并达到 `VERIFIED` 后才算完整。对于更新的
|
|
14
|
+
源码检出,只有当 `npm view release-skill version` 返回该精确版本后才使用 npm 安装;
|
|
15
|
+
在此之前请使用下文的源码检出方式。
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g release-skill
|
|
19
|
+
CLI=(release-skill)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
也可以不安装,直接运行:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx release-skill help
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
验证安装:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
release-skill --version
|
|
32
|
+
release-skill help
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
输出中应包含版本号和可用命令列表。
|
|
36
|
+
|
|
37
|
+
## 开发安装(本地源码)
|
|
38
|
+
|
|
39
|
+
用于开发或尚未公开发布的源码候选:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
export RELEASE_SKILL_HOME=/absolute/path/to/release-skill
|
|
43
|
+
cd "$RELEASE_SKILL_HOME"
|
|
44
|
+
npm exec --yes pnpm@10.17.1 -- install --frozen-lockfile
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
通过以下数组调用命令行工具:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
CLI=(node "$RELEASE_SKILL_HOME/packages/release-skill/bin/release-skill.mjs")
|
|
51
|
+
"${CLI[@]}" help
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
当 `npm view release-skill version` 已确认目标版本公开并安装后,等价的 npm 入口是
|
|
55
|
+
`CLI=(release-skill)`。同一次运行不要混用 npm 与源码入口。
|
|
56
|
+
|
|
57
|
+
## 首次运行
|
|
58
|
+
|
|
59
|
+
最安全的首条命令始终是 `help`。它完全在本地运行,不写入文件:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
"${CLI[@]}" help
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
如果项目尚无 `.release-skill/project.yaml`,把完整只读报告写入临时文件,只查看其中
|
|
66
|
+
确定性的 `compactSummary`(紧凑摘要):
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
PROJECT=/path/to/your/project
|
|
70
|
+
SETUP_SESSION="$(mktemp -d "${TMPDIR:-/tmp}/release-setup.XXXXXX")"
|
|
71
|
+
REPORT="$SETUP_SESSION/discovery.json"
|
|
72
|
+
ANSWERS="$SETUP_SESSION/answers.json"
|
|
73
|
+
BOUND_REPORT="$SETUP_SESSION/bound.json"
|
|
74
|
+
printf 'SETUP_SESSION=%s\nPROJECT=%s\n' "$SETUP_SESSION" "$PROJECT"
|
|
75
|
+
|
|
76
|
+
"${CLI[@]}" setup --root "$PROJECT" --json > "$REPORT" || test "$?" -eq 2
|
|
77
|
+
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
|
+
```
|
|
79
|
+
|
|
80
|
+
紧凑摘要只是审阅视图,不是授权;`setupDigest` 仍绑定完整事实、候选和 answers。若
|
|
81
|
+
`proposalConflicts` 非空,必须由人工修正冲突的仓库/映射权威事实后重跑 setup,不能
|
|
82
|
+
猜测选边。没有冲突时,机械提取机器提案:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
SETUP_SESSION='/上一步打印的会话目录绝对路径'
|
|
86
|
+
PROJECT='/上一步打印的项目绝对路径'
|
|
87
|
+
REPORT="$SETUP_SESSION/discovery.json"
|
|
88
|
+
ANSWERS="$SETUP_SESSION/answers.json"
|
|
89
|
+
BOUND_REPORT="$SETUP_SESSION/bound.json"
|
|
90
|
+
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"
|
|
91
|
+
"${CLI[@]}" setup --root "$PROJECT" --answers "$ANSWERS" --json > "$BOUND_REPORT"
|
|
92
|
+
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
|
+
printf 'SETUP_SESSION=%s\nPROJECT=%s\n' "$SETUP_SESSION" "$PROJECT"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
人工只确认一次绑定摘要和精确摘要值,然后使用已确认字面量首次创建。结果必须是
|
|
97
|
+
`CONFIG_CREATED`;第二次 setup 必须是 `ALREADY_CONFIGURED`,随后运行 assess。
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
SETUP_SESSION=<上一步打印的会话目录绝对路径>
|
|
101
|
+
PROJECT=<上一步打印的项目绝对路径>
|
|
102
|
+
ANSWERS="$SETUP_SESSION/answers.json"
|
|
103
|
+
CREATED_REPORT="$SETUP_SESSION/created.json"
|
|
104
|
+
POST_REPORT="$SETUP_SESSION/post-setup.json"
|
|
105
|
+
ASSESS_REPORT="$SETUP_SESSION/assess.json"
|
|
106
|
+
"${CLI[@]}" setup --root "$PROJECT" --answers "$ANSWERS" \
|
|
107
|
+
--write --confirm-setup <已确认的 setupDigest> --json > "$CREATED_REPORT"
|
|
108
|
+
"${CLI[@]}" setup --root "$PROJECT" --json > "$POST_REPORT"
|
|
109
|
+
set +e
|
|
110
|
+
"${CLI[@]}" assess --root "$PROJECT" --offline --json > "$ASSESS_REPORT"
|
|
111
|
+
ASSESS_EXIT=$?
|
|
112
|
+
set -e
|
|
113
|
+
[ "$ASSESS_EXIT" -eq 0 ] || [ "$ASSESS_EXIT" -eq 1 ] || exit "$ASSESS_EXIT"
|
|
114
|
+
node -e 'const fs=require("node:fs");const [c,p,a]=process.argv.slice(1).map(x=>JSON.parse(fs.readFileSync(x,"utf8")));if(c.status!=="CONFIG_CREATED"||p.status!=="ALREADY_CONFIGURED"||!["ASSESSED","NEEDS_INPUT","BLOCKED"].includes(a.status)){process.exit(2)}process.stdout.write(JSON.stringify({created:c.status,postSetup:p.status,assessment:{status:a.status,summary:a.summary,gapCount:(a.gaps??[]).length,blockingCodes:(a.gaps??[]).filter(g=>g.severity==="error").map(g=>g.code)}},null,2)+"\n")' "$CREATED_REPORT" "$POST_REPORT" "$ASSESS_REPORT"
|
|
115
|
+
node -e 'require("node:fs").rmSync(process.argv[1],{recursive:true,force:false})' "$SETUP_SESSION"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
解释器/包管理器间接脚本以 `SIDE_EFFECTS_UNPROVEN` 排除且默认不选。项目特有 hook/gate
|
|
119
|
+
只能经人工审阅后增量注册:hook 编辑 `projectConfig.hooks`;gate 编辑
|
|
120
|
+
`verificationGates` 并将同一 id 加入 `selectedGateIds`,然后重跑绑定 dry-run。人工文件使用 `mode: preserve`;显式跨单元共享源使用
|
|
121
|
+
`sourceScope: workspace`。
|
|
122
|
+
|
|
123
|
+
### 进阶 schema 参考——不是首次运行主路径
|
|
124
|
+
|
|
125
|
+
下面的外壳只说明 schema。正常 setup 不应手写,而应机械提取 `recommendedAnswers`。
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"projectConfig": {
|
|
130
|
+
"apiVersion": "release-skill/v1",
|
|
131
|
+
"kind": "ReleaseProject",
|
|
132
|
+
"project": { "name": "my-project", "defaultBranch": "main" },
|
|
133
|
+
"releaseUnits": [{
|
|
134
|
+
"id": "my-project",
|
|
135
|
+
"source": ".",
|
|
136
|
+
"publicRepo": "owner/my-project",
|
|
137
|
+
"version": { "source": "package.json", "tagTemplate": "v{version}" },
|
|
138
|
+
"distributions": [{
|
|
139
|
+
"type": "npm",
|
|
140
|
+
"package": "my-project",
|
|
141
|
+
"access": "public",
|
|
142
|
+
"provenance": false,
|
|
143
|
+
"tag": "latest",
|
|
144
|
+
"registry": "https://registry.npmjs.org",
|
|
145
|
+
"publisher": "my-npm-username"
|
|
146
|
+
}],
|
|
147
|
+
"publicFiles": [
|
|
148
|
+
{ "from": "README.md", "to": "README.md", "mode": "preserve" },
|
|
149
|
+
{ "from": "package.json", "to": "package.json", "mode": "preserve" }
|
|
150
|
+
],
|
|
151
|
+
"requiredPublicFiles": ["README.md", "package.json"],
|
|
152
|
+
"previousPublicBaseline": { "mode": "none" },
|
|
153
|
+
"production": {
|
|
154
|
+
"branchTemplate": "release/{tag}",
|
|
155
|
+
"branchStrategy": "create-release-branch"
|
|
156
|
+
}
|
|
157
|
+
}]
|
|
158
|
+
},
|
|
159
|
+
"selectedGateIds": []
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
这个外壳仅供参考。正常 setup 必须使用机器提案;只有确认不存在历史公开版本时才可
|
|
164
|
+
使用 `mode: none`。人工增量加入 gate 时,其 id 必须与 `selectedGateIds` 精确一致,
|
|
165
|
+
snapshot gate 及其依赖必须存在于 `publicFiles`。详见
|
|
166
|
+
[README 首次接入章节](README.zh-CN.md#首次接入不加载完整报告的确定性流程)。
|
|
167
|
+
|
|
168
|
+
已有配置永远不会被重新生成或覆盖。无法发现 GitHub/npm 渠道的项目返回
|
|
169
|
+
`LOCAL_ONLY_DETECTED`,不会冒充生产就绪。
|
|
170
|
+
|
|
171
|
+
自动 create-once 写入使用 v0.1.3 随包提供、带摘要登记的 `darwin-arm64` 原生预构建。
|
|
172
|
+
其他平台以 `SAFE_WRITE_UNAVAILABLE` 失败关闭;此时保留只读报告,由人工首次创建经审阅
|
|
173
|
+
的文件,不得启用不安全的路径写入兜底。
|
|
174
|
+
|
|
175
|
+
配置存在后,检查发布就绪度:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
"${CLI[@]}" assess --root /path/to/your/project --offline --json
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
该命令只读地检查项目结构、配置、文档和供应链;未显式传入 `--output` 时不写报告,
|
|
182
|
+
也不运行项目 hook。
|
|
183
|
+
|
|
184
|
+
`prepare` 不同:它在目标项目的 `.release-skill/` 下写入发布工件,并可能运行已配置
|
|
185
|
+
hook。hook 是无沙箱的任意进程,可能写到项目外、访问凭据、使用网络或执行远端写入。
|
|
186
|
+
授予 `--acknowledge-hook-side-effects` 前必须审阅可执行文件、参数和工作目录。
|
|
187
|
+
|
|
188
|
+
Git 仓库应保留人工配置,同时忽略生成的权威文件和证据:
|
|
189
|
+
|
|
190
|
+
```gitignore
|
|
191
|
+
.release-skill/*
|
|
192
|
+
!.release-skill/project.yaml
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## 项目配置
|
|
196
|
+
|
|
197
|
+
在项目根目录创建 `.release-skill/project.yaml`。以下是单包项目的最小示例:
|
|
198
|
+
|
|
199
|
+
```yaml
|
|
200
|
+
apiVersion: release-skill/v1
|
|
201
|
+
kind: ReleaseProject
|
|
202
|
+
|
|
203
|
+
project:
|
|
204
|
+
name: my-project
|
|
205
|
+
defaultBranch: main
|
|
206
|
+
|
|
207
|
+
releaseUnits:
|
|
208
|
+
- id: my-project
|
|
209
|
+
source: .
|
|
210
|
+
publicRepo: owner/my-project
|
|
211
|
+
version:
|
|
212
|
+
source: package.json
|
|
213
|
+
tagTemplate: v{version}
|
|
214
|
+
distributions:
|
|
215
|
+
- type: npm
|
|
216
|
+
package: my-project
|
|
217
|
+
access: public
|
|
218
|
+
provenance: false
|
|
219
|
+
tag: latest
|
|
220
|
+
registry: https://registry.npmjs.org
|
|
221
|
+
publisher: my-npm-username
|
|
222
|
+
publicFiles:
|
|
223
|
+
- from: README.md
|
|
224
|
+
to: README.md
|
|
225
|
+
mode: preserve
|
|
226
|
+
- from: package.json
|
|
227
|
+
to: package.json
|
|
228
|
+
mode: preserve
|
|
229
|
+
- from: LICENSE
|
|
230
|
+
to: LICENSE
|
|
231
|
+
mode: preserve
|
|
232
|
+
requiredPublicFiles: [README.md, package.json, LICENSE]
|
|
233
|
+
previousPublicBaseline:
|
|
234
|
+
mode: none # 仅限已确认不存在历史公开版本
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### 进阶:hook(可选)
|
|
238
|
+
|
|
239
|
+
hook 是可选的任意本地进程。prepare 使用 hook 时必须显式授予
|
|
240
|
+
`--acknowledge-hook-side-effects`:
|
|
241
|
+
|
|
242
|
+
```yaml
|
|
243
|
+
hooks:
|
|
244
|
+
build:
|
|
245
|
+
command: [npm, run, build]
|
|
246
|
+
test:
|
|
247
|
+
command:
|
|
248
|
+
- node
|
|
249
|
+
- -e
|
|
250
|
+
- "const p=require('./package.json'); if (!p.name) process.exit(1)"
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
参数约束和安全要求见[完整 README](README.zh-CN.md)。
|
|
254
|
+
|
|
255
|
+
### 进阶:验证 gate(可选)
|
|
256
|
+
|
|
257
|
+
`snapshot-verify` 用于冻结公开快照的一次性可写副本;`consumer-verify` 用于精确且
|
|
258
|
+
隔离安装后的 npm/Claude/Codex 根目录。gate 使用可执行文件数组而不是 shell 字符串,
|
|
259
|
+
并声明 unit、必要时的 distribution、cwd、超时和环境变量白名单。
|
|
260
|
+
|
|
261
|
+
```yaml
|
|
262
|
+
verificationGates:
|
|
263
|
+
- id: package-contract
|
|
264
|
+
phase: snapshot-verify
|
|
265
|
+
scope: { unit: my-project }
|
|
266
|
+
command: [node, -e, "const p=require('./package.json');if(!p.name)process.exit(1)"]
|
|
267
|
+
cwd: .
|
|
268
|
+
timeoutMs: 30000
|
|
269
|
+
envAllowlist: []
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
这个自包含示例只读取已映射的公开文件。若替换成项目脚本,该脚本及全部依赖必须
|
|
273
|
+
存在于冻结公开快照;gate 不能借用父工作空间中的测试、开发依赖或 `node_modules`。
|
|
274
|
+
|
|
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,它们只能由受控的计划动作完成。
|
|
280
|
+
|
|
281
|
+
### 生产分支策略
|
|
282
|
+
|
|
283
|
+
每个生产发布单元显式选择一种策略:
|
|
284
|
+
|
|
285
|
+
- `create-release-branch`:创建此前不存在且不可变的 release 分支;
|
|
286
|
+
- `advance-existing-branch`:从精确绑定的公开基线用普通非 force push 快进已有分支;
|
|
287
|
+
- `initialize-default-branch`:创建不存在的标准分支;只有同时审阅
|
|
288
|
+
`setAsDefaultBranch` 与 `expectedCurrentDefaultBranch` 后,计划才可增加显式默认分支动作。
|
|
289
|
+
|
|
290
|
+
远端漂移、非快进或默认分支不符合预期时必须停止并由人工介入。所有策略都禁止覆盖
|
|
291
|
+
远端历史。新建 ref 仅使用 `--force-with-lease=<ref>:` 作为“目标必须不存在”的原子
|
|
292
|
+
断言;推进已有分支使用普通非 force push。
|
|
293
|
+
|
|
294
|
+
```yaml
|
|
295
|
+
# create-release-branch:目标分支必须不存在
|
|
296
|
+
previousPublicBaseline: { mode: none } # 仅限真正的首次公开发布
|
|
297
|
+
production:
|
|
298
|
+
branchTemplate: release/{tag}
|
|
299
|
+
branchStrategy: create-release-branch
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
```yaml
|
|
303
|
+
# advance-existing-branch:ref 必须精确等于 refs/heads/<目标分支>
|
|
304
|
+
previousPublicBaseline:
|
|
305
|
+
mode: bound
|
|
306
|
+
repo: owner/my-project
|
|
307
|
+
ref: refs/heads/main
|
|
308
|
+
commit: 0123456789abcdef0123456789abcdef01234567
|
|
309
|
+
production:
|
|
310
|
+
branchTemplate: main
|
|
311
|
+
branchStrategy: advance-existing-branch
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
```yaml
|
|
315
|
+
# initialize-default-branch:main 必须不存在,当前默认分支必须符合预期
|
|
316
|
+
previousPublicBaseline:
|
|
317
|
+
mode: bound
|
|
318
|
+
repo: owner/my-project
|
|
319
|
+
ref: refs/heads/old-public-branch
|
|
320
|
+
commit: 0123456789abcdef0123456789abcdef01234567
|
|
321
|
+
production:
|
|
322
|
+
branchTemplate: main
|
|
323
|
+
branchStrategy: initialize-default-branch
|
|
324
|
+
setAsDefaultBranch: true
|
|
325
|
+
expectedCurrentDefaultBranch: old-public-branch
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
后两种策略必须在线执行 production prepare。任何不一致都应停止并审阅;只有检查
|
|
329
|
+
真实远端状态后才能人工更新权威配置,禁止 force push 或弱化基线。
|
|
330
|
+
|
|
331
|
+
## 保护人工维护内容
|
|
332
|
+
|
|
333
|
+
README 文案、slogan、示例、排版及其他人工源文件始终是权威。release-skill 只按
|
|
334
|
+
`publicFiles` 映射做快照,不重新生成或覆盖源 README。每次人工编辑后重新 prepare,
|
|
335
|
+
并批准新的不可变计划;不得编辑冻结快照或复用旧批准绕过变化。
|
|
336
|
+
|
|
337
|
+
如果已有公开副本发生漂移,显式选择:
|
|
338
|
+
|
|
339
|
+
- **merge(合并)**:比较真实远端内容,把接受的改动合并回人工源文件,然后把
|
|
340
|
+
`previousPublicBaseline` 绑定到精确不可变的 `repo`/`ref`/`commit`,再 prepare;
|
|
341
|
+
- **adopt(采纳)**:接受远端为新的事实来源,先带回人工源文件,再更新同一基线绑定;
|
|
342
|
+
- **reject(拒绝)**:停止并调查。不得改成 `mode: none` 绕过漂移或唯一性检查。
|
|
343
|
+
|
|
344
|
+
## 下一步
|
|
345
|
+
|
|
346
|
+
- 阅读[完整中文 README](README.zh-CN.md)了解整个工作流。
|
|
347
|
+
- 缺少配置时运行 `"${CLI[@]}" setup --root <your-project> --json`,在人工决策完成前
|
|
348
|
+
保持默认 dry-run。
|
|
349
|
+
- 运行 `"${CLI[@]}" assess --root <your-project> --offline` 检查发布就绪度。
|
|
350
|
+
- 运行 `"${CLI[@]}" prepare --root <your-project> --offline` 生成发布计划;
|
|
351
|
+
release-skill 自身只做本地写入,但项目 hook 可能执行远端操作。
|
|
352
|
+
- 生产前为每个 unit 配置 `previousPublicBaseline`。已有公开版本必须使用
|
|
353
|
+
`mode: bound`,绑定精确 `repo`、`ref` 和 `commit`,再运行
|
|
354
|
+
`"${CLI[@]}" prepare --root <your-project> --online --production`。默认观察器只证明
|
|
355
|
+
ref 到 commit 的映射,不下载远端内容;目标 branch/tag/Release/npm 唯一性由
|
|
356
|
+
publish 全局预检在任何 execute 前检查。
|
|
357
|
+
- 生产命令只使用 `prepare --json` 返回的不可变 `planPath`,以及 `approve --json`
|
|
358
|
+
返回的不可变 `approvalPath`。可变的 latest 别名不能作为生产权威。
|