release-skill 0.9.0 → 0.9.1

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.
Files changed (92) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codebuddy-plugin/plugin.json +1 -1
  4. package/.codex-plugin/plugin.json +2 -2
  5. package/.kimi-plugin/plugin.json +1 -1
  6. package/CHANGELOG.md +32 -0
  7. package/INSTALL.md +22 -9
  8. package/INSTALL.zh-CN.md +15 -8
  9. package/README.md +37 -30
  10. package/README.zh-CN.md +32 -27
  11. package/adapters/claude/.claude-plugin/marketplace.json +1 -1
  12. package/adapters/claude/.claude-plugin/plugin.json +1 -1
  13. package/adapters/claude/bin/consumer-contract-vectors.json +110 -0
  14. package/adapters/claude/bin/error-codes.json +8 -1
  15. package/adapters/claude/bin/foundation-resource-binding.json +1 -1
  16. package/adapters/claude/bin/registry.json +1 -1
  17. package/adapters/claude/bin/release-skill.bundle.mjs +1719 -1291
  18. package/adapters/claude/bin/rules.json +1 -1
  19. package/adapters/claude/bin/schemas/consumer-contract-vector.schema.json +149 -0
  20. package/adapters/claude/skills/release-finish/SKILL.md +4 -4
  21. package/adapters/claude/skills/release-help/SKILL.md +3 -2
  22. package/adapters/claude/skills/release-prepare/SKILL.md +2 -2
  23. package/adapters/claude/skills/release-publish/SKILL.md +3 -1
  24. package/adapters/claude/src/schemas/migration-manifest.schema.json +271 -7
  25. package/adapters/claude/src/schemas/profile-adoption-declaration.schema.json +8 -0
  26. package/adapters/codex/.codex-plugin/plugin.json +2 -2
  27. package/adapters/codex/bin/consumer-contract-vectors.json +110 -0
  28. package/adapters/codex/bin/error-codes.json +8 -1
  29. package/adapters/codex/bin/foundation-resource-binding.json +1 -1
  30. package/adapters/codex/bin/registry.json +1 -1
  31. package/adapters/codex/bin/release-skill.bundle.mjs +1719 -1291
  32. package/adapters/codex/bin/rules.json +1 -1
  33. package/adapters/codex/bin/schemas/consumer-contract-vector.schema.json +149 -0
  34. package/adapters/codex/skills/release-finish/SKILL.md +4 -4
  35. package/adapters/codex/skills/release-help/SKILL.md +3 -2
  36. package/adapters/codex/skills/release-prepare/SKILL.md +2 -2
  37. package/adapters/codex/skills/release-publish/SKILL.md +3 -1
  38. package/adapters/codex/src/schemas/migration-manifest.schema.json +271 -7
  39. package/adapters/codex/src/schemas/profile-adoption-declaration.schema.json +8 -0
  40. package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
  41. package/adapters/kimi/bin/consumer-contract-vectors.json +110 -0
  42. package/adapters/kimi/bin/error-codes.json +8 -1
  43. package/adapters/kimi/bin/foundation-resource-binding.json +1 -1
  44. package/adapters/kimi/bin/registry.json +1 -1
  45. package/adapters/kimi/bin/release-skill.bundle.mjs +1719 -1291
  46. package/adapters/kimi/bin/rules.json +1 -1
  47. package/adapters/kimi/bin/schemas/consumer-contract-vector.schema.json +149 -0
  48. package/adapters/kimi/skills/release-finish/SKILL.md +4 -4
  49. package/adapters/kimi/skills/release-help/SKILL.md +3 -2
  50. package/adapters/kimi/skills/release-prepare/SKILL.md +2 -2
  51. package/adapters/kimi/skills/release-publish/SKILL.md +3 -1
  52. package/adapters/kimi/src/schemas/migration-manifest.schema.json +271 -7
  53. package/adapters/kimi/src/schemas/profile-adoption-declaration.schema.json +8 -0
  54. package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
  55. package/adapters/workbuddy/bin/consumer-contract-vectors.json +110 -0
  56. package/adapters/workbuddy/bin/error-codes.json +8 -1
  57. package/adapters/workbuddy/bin/foundation-resource-binding.json +1 -1
  58. package/adapters/workbuddy/bin/registry.json +1 -1
  59. package/adapters/workbuddy/bin/release-skill.bundle.mjs +1719 -1291
  60. package/adapters/workbuddy/bin/rules.json +1 -1
  61. package/adapters/workbuddy/bin/schemas/consumer-contract-vector.schema.json +149 -0
  62. package/adapters/workbuddy/skills/release-finish/SKILL.md +4 -4
  63. package/adapters/workbuddy/skills/release-help/SKILL.md +3 -2
  64. package/adapters/workbuddy/skills/release-prepare/SKILL.md +2 -2
  65. package/adapters/workbuddy/skills/release-publish/SKILL.md +3 -1
  66. package/adapters/workbuddy/src/schemas/migration-manifest.schema.json +271 -7
  67. package/adapters/workbuddy/src/schemas/profile-adoption-declaration.schema.json +8 -0
  68. package/bin/consumer-contract-vectors.json +110 -0
  69. package/bin/error-codes.json +8 -1
  70. package/bin/foundation-resource-binding.json +1 -1
  71. package/bin/registry.json +1 -1
  72. package/bin/release-skill-cli.mjs +40 -4
  73. package/bin/release-skill.bundle.mjs +1719 -1291
  74. package/bin/rules.json +1 -1
  75. package/bin/schemas/consumer-contract-vector.schema.json +149 -0
  76. package/package.json +4 -4
  77. package/platform-manifest.json +5 -5
  78. package/skills/release-finish/SKILL.md +4 -4
  79. package/skills/release-help/SKILL.md +3 -2
  80. package/skills/release-prepare/SKILL.md +2 -2
  81. package/skills/release-publish/SKILL.md +3 -1
  82. package/skills-src/release-finish/SKILL.md +4 -4
  83. package/skills-src/release-help/SKILL.md +3 -2
  84. package/skills-src/release-prepare/SKILL.md +2 -2
  85. package/skills-src/release-publish/SKILL.md +3 -1
  86. package/src/commands/post-release-local.mjs +249 -58
  87. package/src/commands/prepare.mjs +39 -4
  88. package/src/commands/ship.mjs +124 -16
  89. package/src/core/derived-artifact-gates.mjs +32 -5
  90. package/src/producers/foundation-resource-projection.mjs +16 -3
  91. package/src/schemas/migration-manifest.schema.json +271 -7
  92. package/src/schemas/profile-adoption-declaration.schema.json +8 -0
package/bin/rules.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "kind": "skill-family.contracts.rules",
4
- "contractsVersion": "1.13.0",
4
+ "contractsVersion": "1.14.0",
5
5
  "budget": {
6
6
  "firstVersionMax": 20,
7
7
  "absoluteMax": 30,
@@ -0,0 +1,149 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://contracts.skill-family.example/v1/consumer-contract-vector.json",
4
+ "title": "ConsumerContractVector",
5
+ "description": "A public, version-bound input and expected-observation vector for a Foundation consumer contract.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schemaVersion", "kind", "vectorId", "vectorSetId", "capabilityId", "foundationVersion", "contractId", "caseClass", "strategy", "request", "expected"],
9
+ "properties": {
10
+ "schemaVersion": { "const": 1 },
11
+ "kind": { "const": "skill-family.consumer-contract-vector" },
12
+ "vectorId": { "type": "string", "minLength": 1 },
13
+ "vectorSetId": { "type": "string", "minLength": 1 },
14
+ "capabilityId": { "type": "string", "minLength": 1 },
15
+ "foundationVersion": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
16
+ "contractId": { "type": "string", "minLength": 1 },
17
+ "caseClass": { "enum": ["positive", "negative", "indeterminate"] },
18
+ "strategy": { "enum": ["real-pure", "official-fake"] },
19
+ "request": { "type": "object" },
20
+ "expected": {
21
+ "oneOf": [
22
+ {
23
+ "type": "object",
24
+ "additionalProperties": false,
25
+ "required": ["outcome", "valueRelation"],
26
+ "properties": {
27
+ "outcome": { "const": "return" },
28
+ "valueRelation": { "const": "atomic-write-contained-absolute-target" }
29
+ }
30
+ },
31
+ {
32
+ "type": "object",
33
+ "additionalProperties": false,
34
+ "required": ["outcome", "value"],
35
+ "properties": {
36
+ "outcome": { "const": "return" },
37
+ "value": {}
38
+ }
39
+ },
40
+ {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "required": ["outcome", "errorCode"],
44
+ "properties": {
45
+ "outcome": { "const": "throw" },
46
+ "errorCode": { "type": "string", "pattern": "^SFC[0-9]{4}$" }
47
+ }
48
+ },
49
+ {
50
+ "type": "object",
51
+ "additionalProperties": false,
52
+ "required": ["outcome", "errorCode", "errorKind"],
53
+ "properties": {
54
+ "outcome": { "const": "throw" },
55
+ "errorCode": { "type": "string", "pattern": "^SFC[0-9]{4}$" },
56
+ "errorKind": { "const": "path-traversal" }
57
+ }
58
+ },
59
+ {
60
+ "type": "object",
61
+ "additionalProperties": false,
62
+ "required": ["outcome", "allowedStates", "failClosed"],
63
+ "properties": {
64
+ "outcome": { "const": "indeterminate" },
65
+ "allowedStates": {
66
+ "type": "array",
67
+ "minItems": 1,
68
+ "items": { "enum": ["return", "throw", "indeterminate"] },
69
+ "uniqueItems": true
70
+ },
71
+ "failClosed": { "const": true }
72
+ }
73
+ }
74
+ ]
75
+ }
76
+ },
77
+ "allOf": [
78
+ {
79
+ "if": {
80
+ "properties": { "capabilityId": { "const": "foundation.harness.atomic-write" } },
81
+ "required": ["capabilityId"]
82
+ },
83
+ "then": {
84
+ "properties": {
85
+ "request": {
86
+ "type": "object",
87
+ "required": ["root"],
88
+ "properties": { "root": { "$ref": "#/$defs/atomicRoot" } }
89
+ }
90
+ }
91
+ },
92
+ "else": {
93
+ "properties": {
94
+ "request": {
95
+ "type": "object",
96
+ "properties": {
97
+ "root": {
98
+ "not": {
99
+ "type": "object",
100
+ "required": ["runtimeBinding"],
101
+ "properties": { "runtimeBinding": { "const": "atomic-write-canonical-root" } }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ },
109
+ {
110
+ "if": {
111
+ "properties": {
112
+ "capabilityId": { "const": "foundation.harness.atomic-write" },
113
+ "caseClass": { "const": "negative" }
114
+ },
115
+ "required": ["capabilityId", "caseClass"]
116
+ },
117
+ "then": {
118
+ "properties": {
119
+ "expected": {
120
+ "type": "object",
121
+ "required": ["errorKind"],
122
+ "properties": { "errorKind": { "const": "path-traversal" } }
123
+ }
124
+ }
125
+ },
126
+ "else": {
127
+ "properties": {
128
+ "expected": {
129
+ "type": "object",
130
+ "not": {
131
+ "required": ["errorKind"],
132
+ "properties": { "errorKind": true }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ ],
139
+ "$defs": {
140
+ "atomicRoot": {
141
+ "type": "object",
142
+ "additionalProperties": false,
143
+ "required": ["runtimeBinding"],
144
+ "properties": {
145
+ "runtimeBinding": { "const": "atomic-write-canonical-root" }
146
+ }
147
+ }
148
+ }
149
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -79,9 +79,9 @@
79
79
  "ajv-formats": "3.0.1",
80
80
  "libnpmpublish": "11.2.0",
81
81
  "npm-registry-fetch": "18.0.2",
82
- "skill-family-contracts": "0.13.0",
83
- "skill-family-engineering-kit": "0.13.0",
84
- "skill-family-harness-node": "0.13.0",
82
+ "skill-family-contracts": "0.14.0",
83
+ "skill-family-engineering-kit": "0.14.0",
84
+ "skill-family-harness-node": "0.14.0",
85
85
  "yaml": "2.9.0"
86
86
  },
87
87
  "devDependencies": {
@@ -2,11 +2,11 @@
2
2
  "schemaVersion": "1.0.0",
3
3
  "platformId": "release-skill",
4
4
  "platformName": "release-skill Plugin Platform",
5
- "version": "0.9.0",
5
+ "version": "0.9.1",
6
6
  "logicalRoot": "skills-src/",
7
- "logicalRootDigest": "36f27cb08efabac14f45d92d669f2e38ff19577440d3ab9c0fe79e7ee92e8b7f",
8
- "projectionDigest": "d5454a1a0319eb4adee316b5c4b736f37ef64e7844f194d7b704ae0e7397bf4f",
9
- "projectionId": "release-skill:platform:0.9.0",
7
+ "logicalRootDigest": "428ed8875967a80e989d2712113cf0a0a2f6f8cd9ba510cbe07ba372298c430f",
8
+ "projectionDigest": "ee43d5a11aa41b122c3d03e67d3a7ad179425d0dcbd2bf7dfec544f184f3ed02",
9
+ "projectionId": "release-skill:platform:0.9.1",
10
10
  "manifestRequired": true,
11
11
  "projectionSources": {
12
12
  "skills-src-root": {
@@ -366,7 +366,7 @@
366
366
  "governanceNotes": {
367
367
  "duplicatePrevention": "This platform-manifest.json eliminates DUPLICATE_LOGICAL_SKILL_ID audit blocking by providing an authoritative claim of projection vs original. Each projected SKILL.md is listed in logicalMappings and is therefore excluded from the family_source logical-skill scan; only skills-src/ is scanned as logical source.",
368
368
  "auditCompliance": "The manifest declares skills-src/ as the unique logical root. All other skill locations (skills/, adapters/*/skills/) are projected artifacts derived via documented generators.",
369
- "versionOwnership": "本文件 version 与 package.json 版本字段确定性对齐(生成时读取)。0.6.0 特性(route/lineage/workflow profiles/三新技能)当前在 version 0.5.1 下开发;版本边界归属待用户裁决后统一,不得擅自 bump。",
369
+ "versionOwnership": "本文件的 version 与 projectionId 由 package.json.version 确定性派生。版本变更必须经过权威版本同步流程;禁止手工修改本生成物。",
370
370
  "projectionInvariants": [
371
371
  "Skills defined in skills-src/ cannot be manually modified; modifications must occur in skills-src/ and propagate via generators",
372
372
  "Generator scripts are deterministic; --check mode verifies no drift between source and projection",
@@ -52,13 +52,13 @@ node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill-local-finish.mjs" \
52
52
 
53
53
  只传用户选择且计划声明的宿主。宿主 CLI 不存在时返回 `SKIPPED_NOT_INSTALLED`。各宿主按以下规则处理:
54
54
 
55
- - ClaudeCodex 绑定冻结的 Git 引用,并在安装后核对插件、市场、版本和市场检出提交。
56
- - Kimi 先核对发布标签对应的提交,再通过受控的终端交互界面(TUI)安装,并读取本机安装根的版本、标签与修订号。
57
- - CodeBuddy/WorkBuddy CLI 不能精确绑定 Git 引用。本机已是目标提交时返回 `ALREADY_CURRENT`,否则返回 `MANUAL_REQUIRED`,不执行“更新到最新”。
55
+ - Claude 先重新绑定冻结市场,再重新观察安装状态;旧插件若仍存在,才调用正式更新命令。Codex 继续按正式市场协议移除并安装冻结的 Git 引用。两者都在安装后核对插件、市场、版本和市场检出提交。
56
+ - Kimi 的精确当前安装会在返回 `ALREADY_CURRENT` 前核对真实载荷;发生安装或迁移时,只在操作完成后核对结果。包名、版本、发布标签、已安装修订号和受管安装根必须与冻结计划一致;`.git` 只提供附加诊断,不是通过条件。旧的本地路径安装会在同一个受控终端交互界面(TUI)会话中先移除,再按发布标签安装、确认信任并重新加载。
57
+ - CodeBuddy/WorkBuddy 只处理同一 bundled-family 插件和市场。只有冻结标签与计划声明的可变分支都从同一远端解析到冻结提交时,才调用正式市场更新和插件更新命令;完成后重新读取安装列表,并精确核对唯一条目的市场、版本和修订号。目标未安装、来源不符、远端不可访问或身份不一致时返回 `MANUAL_REQUIRED`,不修改宿主。
58
58
 
59
59
  任何宿主失败都保留其他宿主的实际结果,不回滚,也不把失败冒充成功。
60
60
 
61
- 完成后报告每个宿主的状态,并提醒用户重启已更新的宿主。
61
+ 完成后报告每个宿主的状态,并提醒用户重启已更新的宿主。本机结果只记录收尾事实,不改变发布状态。
62
62
 
63
63
  ## 临时归属
64
64
 
@@ -12,7 +12,7 @@ description: "Discoverable entry point for release-skill: dependency and environ
12
12
  ## 职责
13
13
 
14
14
  - 依赖和环境检查:Node.js >= 22、Git 决定本地准备就绪度;npm/gh 另行决定生产依赖就绪度
15
- - 能力说明:缺少配置时走 `help → setup → assess`;已有配置的安全默认路径是 `help → assess → prepare --offline`;日常生产发布优先使用可恢复的 `ship`,兼容的分阶段闭环仍是 `prepare --online --production → approve → publish → verify`
15
+ - 能力说明:缺少配置时走 `help → setup → assess`;已有配置的安全默认路径是 `help → assess → prepare --offline`;日常生产发布优先使用可恢复的 `ship`,兼容的分阶段闭环仍是 `prepare --online --production → approve → publish → verify`。冻结计划批准是正常发布级流程的唯一批准门;声明 `requiresApproval: true` 的 postPublish hook 仍须等待独立 checkpoint 批准
16
16
  - 最小示例:展示从 release-help 到 release-assess 的最短路径
17
17
  - 只读诊断:运行 dry-run 检查,不修改任何文件
18
18
  - 故障引导:根据错误码指向对应的修复 Skill
@@ -35,7 +35,8 @@ description: "Discoverable entry point for release-skill: dependency and environ
35
35
  node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" help --json
36
36
  node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" setup --root <path> --json
37
37
  node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" assess --root <path> --offline --json
38
- # 日常发布快速路径:仅在发布前确认一次可读计划摘要,状态文件可恢复
38
+ # 日常发布快速路径:发布前确认可读计划摘要,状态文件可恢复。
39
+ # 受限 postPublish hook 的 checkpoint 批准与计划批准分开。
39
40
  node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" ship --root <path> --target-version <version> --json
40
41
  # 开发阶段执行声明 hooks 并生成 prepare 可复用的内容绑定收据
41
42
  # 配置时刻即授权(FM-16 处置 A):hook 是任意本地进程、无隔离、触发前无确认点,
@@ -29,7 +29,7 @@ description: Freeze an immutable release plan with local configuration, document
29
29
  2. 配置含 `releaseDocuments` 时,先运行只读演练 `${CLI} docs refresh --unit <id> --json`;`status: "changes"` 时展示逐文件路径/语种/版本/`refreshDigest`,取得"本地发布文档写入"明确授权后才执行 `nextCommand.argv` 写入,审阅并提交刷新结果后再继续;`status: "clean"` 时直接进入 prepare
30
30
  3. 运行 `${CLI} prepare --root <path> --offline --json`
31
31
  4. 检查 exit code 0,读取 JSON 返回的 immutable `planPath=plans/<planDigest>.json`,再从该文件读取 `status`、`units`、`externalActions`
32
- 5. 向用户展示可读的 `approvalSummary`(版本、仓库/包、branch/tag、外部动作和例外);`planDigest` 仅作为内部绑定字段,不要求用户复制或确认。后续 approve/publish 只能使用该 immutable planPath,等待确认后再 approve
32
+ 5. 向用户展示可读的 `approvalSummary`:版本、公开仓库、分支策略、branch/tag、npm 与 GitHub Release 目标、全部外部动作、例外,以及需要独立 checkpoint 批准的 postPublish hook。`planDigest` 仅作为内部绑定字段,不要求用户复制或确认。后续 approve/publish 只能使用该 immutable planPath,等待确认后再 approve。计划批准不包含受限 postPublish hook 的 checkpoint 批准
33
33
 
34
34
  若用户明确要求 GitHub+npm 生产发布,加入 `--production`。该模式还会封存独立
35
35
  Git commit/tree 和 npm tarball,并把路径、SHA/integrity、branch/tag 写入计划。
@@ -89,4 +89,4 @@ node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" prepare --root <path> --onlin
89
89
 
90
90
  ## 后续引导
91
91
 
92
- 计划冻结后,读取命令返回的 immutable `planPath` 和 `approvalSummary` 展示给用户,等待确认后再 approve。`planDigest` 由系统自动计算和绑定,不作为人工交互口令。`release-plan.json` 等 latest alias 只用于浏览,不得作为生产 authority 传递。
92
+ 计划冻结后,读取命令返回的 immutable `planPath` 和 `approvalSummary` 展示给用户,等待确认后再 approve。`planDigest` 由系统自动计算和绑定,不作为人工交互口令。`release-plan.json` 等 latest alias 只用于浏览,不得作为生产 authority 传递。冻结计划批准是正常发布级流程的唯一批准门;有效 `requiresApproval: true` 的 postPublish hook 仍须使用绑定 `(planDigest, hookId)` 且最长有效 24 小时的独立 checkpoint 批准。
@@ -44,10 +44,12 @@ description: "从已批准的生产计划发布冻结 Git branch/tag、npm tarba
44
44
 
45
45
  ## 授权门
46
46
 
47
- 1. 展示可读的 `approvalSummary`:版本、仓库/包名、branch/tag、全部 actions 和例外。
47
+ 1. 展示可读的 `approvalSummary`:版本、公开仓库、分支策略、branch/tag、npm 与 GitHub Release 目标、全部 actions、例外,以及需要独立 checkpoint 批准的 postPublish hook。
48
48
  2. 必须存在未过期且由系统绑定同一内部 digest 的 approval record;批准后不再要求用户复制摘要做二次确认。
49
49
  3. 只有 CLI exit code 0 且结构化状态为 `PUBLISHED` 才算外写阶段通过;随后必须运行 verify,只有 `VERIFIED` 才是完整终态。
50
50
 
51
+ 冻结计划批准是正常发布级流程的唯一批准门。它包含计划内的外部动作和验证门禁,不包含有效 `requiresApproval: true` 的 postPublish checkpoint。这类 hook 仍须使用绑定 `(planDigest, hookId)` 且最长有效 24 小时的独立批准记录。
52
+
51
53
  ## 确定性执行
52
54
 
53
55
  ```bash
@@ -52,13 +52,13 @@ node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill-local-finish.mjs" \
52
52
 
53
53
  只传用户选择且计划声明的宿主。宿主 CLI 不存在时返回 `SKIPPED_NOT_INSTALLED`。各宿主按以下规则处理:
54
54
 
55
- - ClaudeCodex 绑定冻结的 Git 引用,并在安装后核对插件、市场、版本和市场检出提交。
56
- - Kimi 先核对发布标签对应的提交,再通过受控的终端交互界面(TUI)安装,并读取本机安装根的版本、标签与修订号。
57
- - CodeBuddy/WorkBuddy CLI 不能精确绑定 Git 引用。本机已是目标提交时返回 `ALREADY_CURRENT`,否则返回 `MANUAL_REQUIRED`,不执行“更新到最新”。
55
+ - Claude 先重新绑定冻结市场,再重新观察安装状态;旧插件若仍存在,才调用正式更新命令。Codex 继续按正式市场协议移除并安装冻结的 Git 引用。两者都在安装后核对插件、市场、版本和市场检出提交。
56
+ - Kimi 的精确当前安装会在返回 `ALREADY_CURRENT` 前核对真实载荷;发生安装或迁移时,只在操作完成后核对结果。包名、版本、发布标签、已安装修订号和受管安装根必须与冻结计划一致;`.git` 只提供附加诊断,不是通过条件。旧的本地路径安装会在同一个受控终端交互界面(TUI)会话中先移除,再按发布标签安装、确认信任并重新加载。
57
+ - CodeBuddy/WorkBuddy 只处理同一 bundled-family 插件和市场。只有冻结标签与计划声明的可变分支都从同一远端解析到冻结提交时,才调用正式市场更新和插件更新命令;完成后重新读取安装列表,并精确核对唯一条目的市场、版本和修订号。目标未安装、来源不符、远端不可访问或身份不一致时返回 `MANUAL_REQUIRED`,不修改宿主。
58
58
 
59
59
  任何宿主失败都保留其他宿主的实际结果,不回滚,也不把失败冒充成功。
60
60
 
61
- 完成后报告每个宿主的状态,并提醒用户重启已更新的宿主。
61
+ 完成后报告每个宿主的状态,并提醒用户重启已更新的宿主。本机结果只记录收尾事实,不改变发布状态。
62
62
 
63
63
  ## 临时归属
64
64
 
@@ -12,7 +12,7 @@ description: "Discoverable entry point for release-skill: dependency and environ
12
12
  ## 职责
13
13
 
14
14
  - 依赖和环境检查:Node.js >= 22、Git 决定本地准备就绪度;npm/gh 另行决定生产依赖就绪度
15
- - 能力说明:缺少配置时走 `help → setup → assess`;已有配置的安全默认路径是 `help → assess → prepare --offline`;日常生产发布优先使用可恢复的 `ship`,兼容的分阶段闭环仍是 `prepare --online --production → approve → publish → verify`
15
+ - 能力说明:缺少配置时走 `help → setup → assess`;已有配置的安全默认路径是 `help → assess → prepare --offline`;日常生产发布优先使用可恢复的 `ship`,兼容的分阶段闭环仍是 `prepare --online --production → approve → publish → verify`。冻结计划批准是正常发布级流程的唯一批准门;声明 `requiresApproval: true` 的 postPublish hook 仍须等待独立 checkpoint 批准
16
16
  - 最小示例:展示从 release-help 到 release-assess 的最短路径
17
17
  - 只读诊断:运行 dry-run 检查,不修改任何文件
18
18
  - 故障引导:根据错误码指向对应的修复 Skill
@@ -35,7 +35,8 @@ description: "Discoverable entry point for release-skill: dependency and environ
35
35
  node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" help --json
36
36
  node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" setup --root <path> --json
37
37
  node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" assess --root <path> --offline --json
38
- # 日常发布快速路径:仅在发布前确认一次可读计划摘要,状态文件可恢复
38
+ # 日常发布快速路径:发布前确认可读计划摘要,状态文件可恢复。
39
+ # 受限 postPublish hook 的 checkpoint 批准与计划批准分开。
39
40
  node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" ship --root <path> --target-version <version> --json
40
41
  # 开发阶段执行声明 hooks 并生成 prepare 可复用的内容绑定收据
41
42
  # 配置时刻即授权(FM-16 处置 A):hook 是任意本地进程、无隔离、触发前无确认点,
@@ -29,7 +29,7 @@ description: Freeze an immutable release plan with local configuration, document
29
29
  2. 配置含 `releaseDocuments` 时,先运行只读演练 `${CLI} docs refresh --unit <id> --json`;`status: "changes"` 时展示逐文件路径/语种/版本/`refreshDigest`,取得"本地发布文档写入"明确授权后才执行 `nextCommand.argv` 写入,审阅并提交刷新结果后再继续;`status: "clean"` 时直接进入 prepare
30
30
  3. 运行 `${CLI} prepare --root <path> --offline --json`
31
31
  4. 检查 exit code 0,读取 JSON 返回的 immutable `planPath=plans/<planDigest>.json`,再从该文件读取 `status`、`units`、`externalActions`
32
- 5. 向用户展示可读的 `approvalSummary`(版本、仓库/包、branch/tag、外部动作和例外);`planDigest` 仅作为内部绑定字段,不要求用户复制或确认。后续 approve/publish 只能使用该 immutable planPath,等待确认后再 approve
32
+ 5. 向用户展示可读的 `approvalSummary`:版本、公开仓库、分支策略、branch/tag、npm 与 GitHub Release 目标、全部外部动作、例外,以及需要独立 checkpoint 批准的 postPublish hook。`planDigest` 仅作为内部绑定字段,不要求用户复制或确认。后续 approve/publish 只能使用该 immutable planPath,等待确认后再 approve。计划批准不包含受限 postPublish hook 的 checkpoint 批准
33
33
 
34
34
  若用户明确要求 GitHub+npm 生产发布,加入 `--production`。该模式还会封存独立
35
35
  Git commit/tree 和 npm tarball,并把路径、SHA/integrity、branch/tag 写入计划。
@@ -89,4 +89,4 @@ node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" prepare --root <path> --onlin
89
89
 
90
90
  ## 后续引导
91
91
 
92
- 计划冻结后,读取命令返回的 immutable `planPath` 和 `approvalSummary` 展示给用户,等待确认后再 approve。`planDigest` 由系统自动计算和绑定,不作为人工交互口令。`release-plan.json` 等 latest alias 只用于浏览,不得作为生产 authority 传递。
92
+ 计划冻结后,读取命令返回的 immutable `planPath` 和 `approvalSummary` 展示给用户,等待确认后再 approve。`planDigest` 由系统自动计算和绑定,不作为人工交互口令。`release-plan.json` 等 latest alias 只用于浏览,不得作为生产 authority 传递。冻结计划批准是正常发布级流程的唯一批准门;有效 `requiresApproval: true` 的 postPublish hook 仍须使用绑定 `(planDigest, hookId)` 且最长有效 24 小时的独立 checkpoint 批准。
@@ -44,10 +44,12 @@ description: "从已批准的生产计划发布冻结 Git branch/tag、npm tarba
44
44
 
45
45
  ## 授权门
46
46
 
47
- 1. 展示可读的 `approvalSummary`:版本、仓库/包名、branch/tag、全部 actions 和例外。
47
+ 1. 展示可读的 `approvalSummary`:版本、公开仓库、分支策略、branch/tag、npm 与 GitHub Release 目标、全部 actions、例外,以及需要独立 checkpoint 批准的 postPublish hook。
48
48
  2. 必须存在未过期且由系统绑定同一内部 digest 的 approval record;批准后不再要求用户复制摘要做二次确认。
49
49
  3. 只有 CLI exit code 0 且结构化状态为 `PUBLISHED` 才算外写阶段通过;随后必须运行 verify,只有 `VERIFIED` 才是完整终态。
50
50
 
51
+ 冻结计划批准是正常发布级流程的唯一批准门。它包含计划内的外部动作和验证门禁,不包含有效 `requiresApproval: true` 的 postPublish checkpoint。这类 hook 仍须使用绑定 `(planDigest, hookId)` 且最长有效 24 小时的独立批准记录。
52
+
51
53
  ## 确定性执行
52
54
 
53
55
  ```bash