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
|
Binary file
|
|
@@ -1,4 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"comment": "
|
|
3
|
-
"prebuilds": {
|
|
2
|
+
"comment": "Registered Node-API prebuilds. Each entry is loaded only after path, file identity, exports, and SHA-256 verification.",
|
|
3
|
+
"prebuilds": {
|
|
4
|
+
"darwin-arm64": {
|
|
5
|
+
"path": "prebuilds/darwin-arm64/safe_write.node",
|
|
6
|
+
"sha256": "a0e39732c359f3faa23715e6d17d8bc5fec5c5b86e0390220e1beb9f5def2d2e",
|
|
7
|
+
"exports": [
|
|
8
|
+
"openRoot",
|
|
9
|
+
"openDir",
|
|
10
|
+
"readEntry",
|
|
11
|
+
"readFile",
|
|
12
|
+
"createTemp",
|
|
13
|
+
"rename",
|
|
14
|
+
"abortTemp",
|
|
15
|
+
"mkdir",
|
|
16
|
+
"rmdir",
|
|
17
|
+
"unlink",
|
|
18
|
+
"chmod",
|
|
19
|
+
"fsync",
|
|
20
|
+
"close"
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
}
|
|
4
24
|
}
|
|
@@ -637,7 +637,7 @@ static napi_value OpenDir(napi_env env, napi_callback_info info) {
|
|
|
637
637
|
}
|
|
638
638
|
|
|
639
639
|
// ---------------------------------------------------------------------------
|
|
640
|
-
// readEntry(handle, name) -> { type, size, mode } | null
|
|
640
|
+
// readEntry(handle, name) -> { type, size, mode, dev, ino, nlink } | null
|
|
641
641
|
// ---------------------------------------------------------------------------
|
|
642
642
|
|
|
643
643
|
static napi_value ReadEntry(napi_env env, napi_callback_info info) {
|
|
@@ -683,17 +683,26 @@ static napi_value ReadEntry(napi_env env, napi_callback_info info) {
|
|
|
683
683
|
else if (S_ISCHR(st.st_mode)) type = "char-device";
|
|
684
684
|
else if (S_ISSOCK(st.st_mode)) type = "socket";
|
|
685
685
|
|
|
686
|
-
napi_value type_val, size_val, mode_val;
|
|
686
|
+
napi_value type_val, size_val, mode_val, dev_val, ino_val, nlink_val;
|
|
687
687
|
NAPI_CHECK(napi_create_string_utf8(env, type, NAPI_AUTO_LENGTH, &type_val));
|
|
688
688
|
NAPI_CHECK(
|
|
689
689
|
napi_create_int64(env, static_cast<int64_t>(st.st_size), &size_val));
|
|
690
690
|
NAPI_CHECK(
|
|
691
691
|
napi_create_int32(env, static_cast<int32_t>(st.st_mode & 07777),
|
|
692
692
|
&mode_val));
|
|
693
|
+
NAPI_CHECK(
|
|
694
|
+
napi_create_int64(env, static_cast<int64_t>(st.st_dev), &dev_val));
|
|
695
|
+
NAPI_CHECK(
|
|
696
|
+
napi_create_int64(env, static_cast<int64_t>(st.st_ino), &ino_val));
|
|
697
|
+
NAPI_CHECK(
|
|
698
|
+
napi_create_int64(env, static_cast<int64_t>(st.st_nlink), &nlink_val));
|
|
693
699
|
|
|
694
700
|
NAPI_CHECK(napi_set_named_property(env, result, "type", type_val));
|
|
695
701
|
NAPI_CHECK(napi_set_named_property(env, result, "size", size_val));
|
|
696
702
|
NAPI_CHECK(napi_set_named_property(env, result, "mode", mode_val));
|
|
703
|
+
NAPI_CHECK(napi_set_named_property(env, result, "dev", dev_val));
|
|
704
|
+
NAPI_CHECK(napi_set_named_property(env, result, "ino", ino_val));
|
|
705
|
+
NAPI_CHECK(napi_set_named_property(env, result, "nlink", nlink_val));
|
|
697
706
|
return result;
|
|
698
707
|
}
|
|
699
708
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "release-skill",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -27,18 +27,20 @@
|
|
|
27
27
|
"schemas/",
|
|
28
28
|
"native/",
|
|
29
29
|
"!native/safe-write/build/",
|
|
30
|
+
"scripts/build-bundle.mjs",
|
|
30
31
|
"README.md",
|
|
31
32
|
"README.zh-CN.md",
|
|
32
33
|
"CHANGELOG.md",
|
|
33
34
|
"CODE_OF_CONDUCT.md",
|
|
34
35
|
"CONTRIBUTING.md",
|
|
35
36
|
"INSTALL.md",
|
|
37
|
+
"INSTALL.zh-CN.md",
|
|
36
38
|
"LICENSE",
|
|
37
39
|
"NOTICE",
|
|
38
40
|
"SECURITY.md"
|
|
39
41
|
],
|
|
40
42
|
"scripts": {
|
|
41
|
-
"build": "node --check src/**/*.mjs",
|
|
43
|
+
"build": "node --check src/**/*.mjs && node scripts/build-bundle.mjs",
|
|
42
44
|
"test": "node --test test/*.test.mjs",
|
|
43
45
|
"test:no-dogfood": "node --test $(ls test/*.test.mjs | grep -v -E 'dogfood|artifacts-safe-fs-native-seam')",
|
|
44
46
|
"typecheck": "node --check src/**/*.mjs bin/*.mjs",
|
|
@@ -46,7 +48,10 @@
|
|
|
46
48
|
"sync:skills:check": "node scripts/sync-skills.mjs --check",
|
|
47
49
|
"build:adapters": "node scripts/build-adapters.mjs",
|
|
48
50
|
"build:adapters:check": "node scripts/build-adapters.mjs --check",
|
|
51
|
+
"build:bundle": "node scripts/build-bundle.mjs",
|
|
52
|
+
"build:bundle:check": "node scripts/build-bundle.mjs --check",
|
|
49
53
|
"native:build": "node-gyp rebuild --directory native/safe-write",
|
|
54
|
+
"native:package-current": "node scripts/package-native-prebuild.mjs",
|
|
50
55
|
"native:build:test": "GYP_DEFINES='test_seam=1' node-gyp rebuild --directory native/safe-write",
|
|
51
56
|
"native:test": "npm run native:build:test && node --expose-gc --test test/artifacts-safe-fs-native-seam.test.mjs && npm run native:build && RELEASE_SKILL_NATIVE_DEV=1 node --test test/artifacts-safe-fs.test.mjs test/artifacts-transaction-native.test.mjs && node --input-type=module -e \"import {createRequire} from 'node:module';const a=createRequire(import.meta.url)('./native/safe-write/build/Release/safe_write.node');const k=Object.keys(a).sort();const e=['abortTemp','chmod','close','createTemp','fsync','mkdir','openDir','openRoot','readEntry','readFile','rename','rmdir','unlink'];if(k.length!==e.length||k.some((v,i)=>v!==e[i])){console.error('Production exports mismatch:',k);process.exit(1)}console.log('Production exports verified:',k.length,'functions')\""
|
|
52
57
|
},
|
|
@@ -58,6 +63,7 @@
|
|
|
58
63
|
"yaml": "2.9.0"
|
|
59
64
|
},
|
|
60
65
|
"devDependencies": {
|
|
66
|
+
"esbuild": "0.25.8",
|
|
61
67
|
"node-gyp": "12.3.0"
|
|
62
68
|
},
|
|
63
69
|
"engines": {
|
|
@@ -30,6 +30,10 @@ releaseUnits: # 发布单元数组,至少 1 个
|
|
|
30
30
|
- id: <string> # 唯一标识
|
|
31
31
|
source: <string> # 源码相对路径(相对项目根目录)
|
|
32
32
|
publicRepo: <string> # 公开仓库 owner/repo
|
|
33
|
+
production:
|
|
34
|
+
githubHost: github.com
|
|
35
|
+
branchTemplate: <string>
|
|
36
|
+
branchStrategy: create-release-branch # 或 advance-existing-branch / initialize-default-branch
|
|
33
37
|
version:
|
|
34
38
|
source: <string> # 版本来源,如 "package.json"
|
|
35
39
|
tagTemplate: <string> # tag 模板,如 "artifact-graph-v{version}"
|
|
@@ -46,6 +50,17 @@ releaseUnits: # 发布单元数组,至少 1 个
|
|
|
46
50
|
mode: none # none | bound
|
|
47
51
|
# bound 时还必须提供 repo/ref/commit,可选 tree/manifestDigest
|
|
48
52
|
|
|
53
|
+
verificationGates: # 可选;定义会进入冻结计划摘要
|
|
54
|
+
- id: <stable-id>
|
|
55
|
+
phase: snapshot-verify # 或 consumer-verify
|
|
56
|
+
scope:
|
|
57
|
+
unit: <release-unit-id>
|
|
58
|
+
# consumer-verify 还必须填写 distribution
|
|
59
|
+
command: [<executable>, <arg>]
|
|
60
|
+
cwd: .
|
|
61
|
+
timeoutMs: 30000
|
|
62
|
+
envAllowlist: []
|
|
63
|
+
|
|
49
64
|
hooks: # 可选,命令 hooks
|
|
50
65
|
docs: <hook>
|
|
51
66
|
build: <hook>
|
|
@@ -62,7 +77,7 @@ policy: # 可选,安全策略
|
|
|
62
77
|
|
|
63
78
|
## 3. 公开源码镜像与分发包
|
|
64
79
|
|
|
65
|
-
`releaseUnits[].publicFiles` 定义 GitHub 公开源码镜像的显式、闭世界 allowlist。每个映射都必须可审阅;未列出的文件不会因为目录扫描、模板重生成或历史惯例而被自动加入。`releaseUnits[].requiredPublicFiles` 只约束同一发布单元,不能借用其他单元的目标路径。
|
|
80
|
+
`releaseUnits[].publicFiles` 定义 GitHub 公开源码镜像的显式、闭世界 allowlist。每个映射都必须可审阅;未列出的文件不会因为目录扫描、模板重生成或历史惯例而被自动加入。`sourceScope` 默认为 `unit`,此时 `from` 必须位于 `releaseUnits[].source` 内;只有历史共享许可证、公共文档或工作流等明确的工作空间级来源才可写 `sourceScope: workspace`,其路径仍必须受工作空间根目录的词法、realpath 和无符号链接校验约束。`releaseUnits[].requiredPublicFiles` 只约束同一发布单元,不能借用其他单元的目标路径。
|
|
66
81
|
|
|
67
82
|
公开源码镜像与 distribution pack 是两条不同边界:前者决定公开仓库快照,后者由 npm `files`、插件 manifest 等渠道合同决定安装内容。发布前必须分别冻结、比较并验证两条边界;distribution pack 中的必需路径必须由该发布单元的公开映射覆盖。
|
|
68
83
|
|
|
@@ -90,6 +105,14 @@ human-owned 权威源,然后重新 prepare、审阅并 approve;后续环节
|
|
|
90
105
|
|
|
91
106
|
旧的 `policy.requiredPublicFiles` 已不支持。加载器必须返回 `CONFIG_INVALID`,并引导迁移到各自的 `releaseUnits[].requiredPublicFiles`。
|
|
92
107
|
|
|
108
|
+
### 3.2 公开分支策略
|
|
109
|
+
|
|
110
|
+
- `create-release-branch`:目标分支必须不存在;创建独立 release 分支,冻结提交没有父提交。
|
|
111
|
+
- `advance-existing-branch`:目标分支必须与 `previousPublicBaseline` 的精确提交一致;冻结提交以它为唯一父提交,publish 仅允许普通 fast-forward push。并发漂移或非快进时失败关闭,不使用 force。
|
|
112
|
+
- `initialize-default-branch`:目标标准分支必须不存在,冻结提交以当前公开基线为父提交;只有同时声明 `setAsDefaultBranch: true` 和 `expectedCurrentDefaultBranch` 时,计划才会增加显式 `set-default-branch` action。切换失败进入 PARTIAL,可由 reconcile 依据旧/新/第三方状态恢复或转人工。
|
|
113
|
+
|
|
114
|
+
已有公开仓不得使用 `mode: none` 伪装成首次发布。示例中的 commit 只是校准时点证据;每轮 production prepare 都必须在线重观测。
|
|
115
|
+
|
|
93
116
|
---
|
|
94
117
|
|
|
95
118
|
## 4. Hooks 参数约束
|
|
@@ -121,6 +144,32 @@ hooks:
|
|
|
121
144
|
envAllowlist: [CI]
|
|
122
145
|
```
|
|
123
146
|
|
|
147
|
+
### 4.1 分阶段验证 gate
|
|
148
|
+
|
|
149
|
+
`verificationGates` 是项目个性化校验的受控扩展点,不是另一套发布流程:
|
|
150
|
+
|
|
151
|
+
| 字段 | 约束 |
|
|
152
|
+
|---|---|
|
|
153
|
+
| `id` | 全局唯一、稳定,匹配 `^[a-z0-9][a-z0-9._-]*$` |
|
|
154
|
+
| `phase` | `snapshot-verify` 或 `consumer-verify` |
|
|
155
|
+
| `scope.unit` | 必须引用现有发布单元 |
|
|
156
|
+
| `scope.distribution` | consumer 阶段必填,且必须是该单元真实声明的渠道 |
|
|
157
|
+
| `command` | `execFile` 风格字符串数组;禁止 shell 字符串 |
|
|
158
|
+
| `cwd` | 相对执行根,不允许路径逃逸或符号链接分量 |
|
|
159
|
+
| `timeoutMs` | 1000 至 7200000 |
|
|
160
|
+
| `envAllowlist` | 仅显式变量;其他凭证和环境变量不转发 |
|
|
161
|
+
| `expectedJson` | 可选;stdout 必须为 JSON 且递归包含这些字段 |
|
|
162
|
+
|
|
163
|
+
`snapshot-verify` 获得冻结公开快照的一次性可写副本;副本销毁后重新摘要原快照,失败时还没有远端写入。`consumer-verify` 只在精确 npm 或 Claude/Codex 隔离安装成功后,从安装根执行;结果摘要进入 verify run,失败不得达到 VERIFIED。
|
|
164
|
+
|
|
165
|
+
gate 与 legacy hook 都是无网络沙箱的本地进程,必须显式确认副作用。release-skill 会限制环境、路径、超时和证据输出,但不能替项目保证其命令不会写文件或访问网络。Git push、tag、默认分支、GitHub Release 和 npm publish 只能是冻结计划里的 adapter action,不能注册为 hook/gate。
|
|
166
|
+
|
|
167
|
+
### 4.2 首次接入 setup
|
|
168
|
+
|
|
169
|
+
`release-skill setup --root <path> --json` 默认只读,扫描工作区、包与插件 manifest、逐单元 Git 权威、旧版 `public-release.json` 和脚本,输出候选、完整 `recommendedAnswers`、结构化冲突/假设和 `setupDigest`。旧配置只作为不可信迁移事实,其中的 `snapshotCommands` 只成为未授权 gate 候选;它不会把脚本存在解释成用户选择,也不会读取 README 中的自然语言作为命令。报告可能包含大量精确映射,Agent 应先把完整 JSON 落到系统临时文件,只读取紧凑摘要,并机械提取 `recommendedAnswers`,不得在上下文中重新生成。
|
|
170
|
+
|
|
171
|
+
写入要求人工提供完整 answers JSON,再次 dry-run,并使用同一摘要执行 `--write --confirm-setup <setupDigest>`。写入只允许首次原子创建 `.release-skill/project.yaml`;已有配置返回 `ALREADY_CONFIGURED`/`CONFIG_EXISTS`,由人工增量编辑。事实漂移返回 `SETUP_DIGEST_MISMATCH`。没有远端渠道的项目返回 `LOCAL_ONLY_DETECTED`,不得宣称 production-ready。
|
|
172
|
+
|
|
124
173
|
---
|
|
125
174
|
|
|
126
175
|
## 5. Profile(规划中)
|
|
@@ -201,9 +250,11 @@ profile 是预设的默认配置模板,提供常见发布拓扑的开箱配置
|
|
|
201
250
|
5. `releaseUnits` 至少包含 1 个元素。
|
|
202
251
|
6. 每个 `releaseUnit.id` 全局唯一。
|
|
203
252
|
7. 每个 `releaseUnit.source` 路径在项目中存在。
|
|
204
|
-
8. 所有 hook 的 `command` 为数组且第一个元素非空。
|
|
205
|
-
9. 所有 hook 的 `cwd` 不包含绝对路径前缀和 `..`。
|
|
206
|
-
10.
|
|
253
|
+
8. 所有 hook/gate 的 `command` 为数组且第一个元素非空。
|
|
254
|
+
9. 所有 hook/gate 的 `cwd` 不包含绝对路径前缀和 `..`。
|
|
255
|
+
10. gate id 唯一,unit/distribution scope 引用真实配置。
|
|
256
|
+
11. 分支推进策略使用 bound 基线;默认分支初始化具备显式旧/新分支断言。
|
|
257
|
+
12. 所有路径字段不包含 `<project-root>/` 前缀。
|
|
207
258
|
|
|
208
259
|
验证失败返回 `CONFIG_INVALID` 错误码,附带具体失败原因。
|
|
209
260
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# 05 -- 证据与错误
|
|
2
2
|
|
|
3
|
-
本文档定义 release-skill
|
|
3
|
+
本文档定义 release-skill 的稳定错误码、JSON/JSONL 事件格式、脱敏规则和证据目录结构。状态机见 `01-state-machine.md`,配置约束见 `02-project-config.md`。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## 1. 稳定错误码
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
以下列出用户最常遇到的稳定错误码。实现中的完整列表由 `src/core/errors.mjs` 维护;已发布错误码不得重命名或删除。
|
|
10
10
|
|
|
11
11
|
| 错误码 | 含义 | 触发场景 | 典型恢复 |
|
|
12
12
|
|---|---|---|---|
|
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
| `HOOK_TIMEOUT` | 项目 hook 执行超时 | hook 运行时间超过 `timeoutMs` 配置 | 增加超时值或优化 hook 执行效率 |
|
|
20
20
|
| `PARTIAL_RELEASE` | 发布部分成功 | 至少一个外部检查点成功但后续检查点失败 | 使用 `reconcile` 从检查点恢复 |
|
|
21
21
|
| `POST_PUBLISH_VERIFY_FAILED` | 发布后验证未通过 | 安装测试失败、泄漏审计未通过、provenance 验证失败 | 检查失败原因,可能需要人工干预 |
|
|
22
|
+
| `SETUP_DIGEST_MISMATCH` | setup 事实或答案已漂移 | dry-run 后 README/package/manifest/remote/answers 发生变化,或确认摘要错误 | 重新运行 setup dry-run、审阅并确认新摘要 |
|
|
23
|
+
| `CONFIG_EXISTS` | setup 目标配置已经存在 | 写入模式试图创建已有 `.release-skill/project.yaml` | 不覆盖;运行 assess 并人工增量编辑 |
|
|
22
24
|
|
|
23
25
|
---
|
|
24
26
|
|
|
@@ -86,6 +88,8 @@
|
|
|
86
88
|
| `stdout` | 标准输出引用(脱敏后存储,见第 4 节) |
|
|
87
89
|
| `stderr` | 标准错误引用(脱敏后存储,见第 4 节) |
|
|
88
90
|
|
|
91
|
+
验证 gate 不保存原始 stdout/stderr;证据仅记录命令数组、相对 cwd、时间、exit code、字节数、SHA-256 摘要和结构化裁决,避免把项目命令输出中的凭证复制进证据。
|
|
92
|
+
|
|
89
93
|
---
|
|
90
94
|
|
|
91
95
|
## 4. 脱敏规则
|