release-skill 0.9.30 → 0.9.31

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 (36) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +2 -2
  4. package/.cursor-plugin/plugin.json +1 -1
  5. package/.kimi-plugin/plugin.json +1 -1
  6. package/.qoder-plugin/plugin.json +1 -1
  7. package/CHANGELOG.md +29 -0
  8. package/INSTALL.md +2 -2
  9. package/INSTALL.zh-CN.md +2 -2
  10. package/README.md +14 -15
  11. package/README.zh-CN.md +14 -15
  12. package/adapters/claude/.claude-plugin/plugin.json +1 -1
  13. package/adapters/claude/bin/release-skill.bundle.mjs +159 -11
  14. package/adapters/claude/skills/release-help/SKILL.md +8 -2
  15. package/adapters/codex/.codex-plugin/plugin.json +2 -2
  16. package/adapters/codex/bin/release-skill.bundle.mjs +159 -11
  17. package/adapters/codex/skills/release-help/SKILL.md +8 -2
  18. package/adapters/cursor/.cursor-plugin/plugin.json +1 -1
  19. package/adapters/cursor/bin/release-skill.bundle.mjs +159 -11
  20. package/adapters/cursor/skills/release-help/SKILL.md +8 -2
  21. package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
  22. package/adapters/kimi/bin/release-skill.bundle.mjs +159 -11
  23. package/adapters/kimi/skills/release-help/SKILL.md +8 -2
  24. package/adapters/qoder/.qoder-plugin/plugin.json +1 -1
  25. package/adapters/qoder/bin/release-skill.bundle.mjs +159 -11
  26. package/adapters/qoder/skills/release-help/SKILL.md +8 -2
  27. package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
  28. package/adapters/workbuddy/bin/release-skill.bundle.mjs +159 -11
  29. package/adapters/workbuddy/skills/release-help/SKILL.md +8 -2
  30. package/bin/release-skill.bundle.mjs +159 -11
  31. package/package.json +1 -1
  32. package/platform-manifest.json +4 -4
  33. package/skills/release-help/SKILL.md +8 -2
  34. package/skills-src/release-help/SKILL.md +8 -2
  35. package/src/commands/post-release-finish.mjs +1 -1
  36. package/src/commands/post-release-local.mjs +156 -8
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.30",
3
+ "version": "0.9.31",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.30",
3
+ "version": "0.9.31",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.30",
3
+ "version": "0.9.31",
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.9.30.",
22
+ "Prepare a release plan for version 0.9.31.",
23
23
  "Help me understand the release workflow."
24
24
  ]
25
25
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.30",
3
+ "version": "0.9.31",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.30",
3
+ "version": "0.9.31",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.30",
3
+ "version": "0.9.31",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ <!-- release-skill:changelog:start version=0.9.31 locale=en baseline=sha256:d40f153bfc277e24178ac5d32d20a0b6d824cf611d0fa65709cea01463b037ea -->
4
+ ## [0.9.31] - 2026-10-17
5
+
6
+ 0.9.31 fixes Kimi removal confirmation and shared setup ownership while retaining exact Foundation 0.25.0 dependencies. This note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance.
7
+
8
+ ### Security
9
+
10
+ - Maintains strict confirmation boundaries: exact plugin ID and selection must be verified before removal. No changes to frozen install URL/ref/sha or post-install payload validation. Hub gate failure prevents GitHub Git Data API write. Writes bind the observed branch head through `compare-and-swap`. Partial Hub publication is never rolled back or force-pushed; completed steps are not overwritten. Existing `RELEASE_SKILL_HUB_RELEASE_EVIDENCE` environment variable continues to require an existing regular file at an absolute path (not a symlink), validated via `npm run release:check -- --release-evidence <file>`. Independent checkpoint approval, no replay of historical frozen plans, and `ALREADY_CURRENT` gate remain enforced.
11
+
12
+ ### Changed
13
+
14
+ - Skill Family Hub remains the unified market. GitHub Git Data API integration continues with `compare-and-swap` write semantics; no automatic rollback or overwrite of completed steps.
15
+
16
+ ### Fixed
17
+
18
+ - Kimi 2.2.0: The remove confirmation page now uses `Remove <displayName> (<id>)?` with `Cancel` and `Remove plugin` options. The adapter verifies the exact plugin ID and current selection. When selection movement is required, move first and re-observe before confirming. No direction key input is needed when `Remove plugin` is already selected. Removal is submitted only while that option is selected.
19
+ - Kimi 2.2.0: Display names containing `Confirm` or `Sure`, or titles arriving in chunks, no longer trigger the old broad regex path. Invalid ID, unknown or ambiguous selection, timeout, or EOF stop the update without proceeding to installation.
20
+ - The adapter retains the existing `Confirm remove plugin "<id>"?` wording, bracketed paste, and CSI Enter input method from Kimi 0.40.1. Frozen install URL/ref/sha, post-install name/version, and payload verification remain unchanged. Offline Expect/fake validation only; no real Kimi consumer installation or update performed.
21
+ - Shared environment setup for the same `unitId/plugin/version` is now merged. Different physical `skillFile` paths under Claude/Codex no longer count as separate setup owners. Only one precise setup feedback from a loaded host is required to satisfy shared environment checks.
22
+ - Host-specific installation, loading, and configuration still require separate verification. Feedback continues to bind `host/unit/path/plan/config/root`. True multiple plugin ownership still requires disambiguation. Failure in any host (Kimi or others) results in `FAILED` status; `VERIFIED`/`DISTRIBUTED` release state is unchanged.
23
+
24
+ ### Upgrade Notes
25
+
26
+ Existing release plans can continue to be finalized after obtaining the new provider. No need to re-publish plugins from the original domain. Use the existing frozen plan within the explicitly authorized host scope; the provider update does not authorize additional host operations. Host installation, loading, and setup facts must be verified independently. This round’s offline Expect/fake testing does not imply the fix is limited to offline use; the product is intended for real hosts. Real Kimi consumer acceptance has not been performed, and thus cannot be claimed as passed.
27
+
28
+ The old release-skill standalone marketplace is deprecated; use `ifoohoo/skill-family-hub` and `release-skill@skill-family-hub`.
29
+ <!-- release-skill:changelog:end version=0.9.31 locale=en -->
30
+
31
+
3
32
  <!-- release-skill:changelog:start version=0.9.30 locale=en baseline=sha256:f96989498b14d998fb38751ca6bd2610255761ebb1618018ec2ca362ebe707a5 -->
4
33
  ## [0.9.30] - 2026-10-16
5
34
 
package/INSTALL.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [简体中文](INSTALL.zh-CN.md)
4
4
 
5
- <!-- release-skill:release-version: 0.9.30 -->
5
+ <!-- release-skill:release-version: 0.9.31 -->
6
6
  ## Prerequisites
7
7
 
8
8
  - Node.js `>=22.22.2 <23` (22.22.2 or newer, and below 23)
@@ -125,7 +125,7 @@ tag pinned to the exact version (never the bare repository URL, which installs
125
125
  the latest release or default branch), confirm the trust prompt, then reload:
126
126
 
127
127
  ```
128
- /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.30
128
+ /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.31
129
129
  /plugins reload
130
130
  ```
131
131
 
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.9.30 -->
5
+ <!-- release-skill:release-version: 0.9.31 -->
6
6
  ## 前置条件
7
7
 
8
8
  - Node.js `>=22.22.2 <23`(22.22.2 及以上,且低于 23)
@@ -113,7 +113,7 @@ release-skill 当前只采用并验证 Kimi Code 的交互式 TUI 路径,**无
113
113
  (切勿使用裸仓库地址,它会安装最新 release 或默认分支),确认信任提示后重新加载:
114
114
 
115
115
  ```
116
- /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.30
116
+ /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.31
117
117
  /plugins reload
118
118
  ```
119
119
 
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [简体中文](README.zh-CN.md) · Installation: [English](INSTALL.md) / [简体中文](INSTALL.zh-CN.md)
4
4
 
5
- <!-- release-skill:release-version: 0.9.30 -->
5
+ <!-- release-skill:release-version: 0.9.31 -->
6
6
  Release preparation for Claude Code, CodeBuddy, WorkBuddy, Codex, and Kimi Code, with human-edited files kept intact.
7
7
 
8
8
  release-skill helps a maintainer answer three questions: what will be released,
@@ -14,36 +14,35 @@ Setup surfaces only the deterministic `compactSummary` review view; the full
14
14
  report stays in a temporary session directory.
15
15
 
16
16
  <!-- release-skill:managed:start id=latest-release -->
17
- **0.9.30** (2026-10-16)
17
+ **0.9.31** (2026-10-17)
18
18
 
19
- 0.9.30 fixes the private Hub hook's missing release-evidence argument while retaining exact Foundation 0.25.0 dependencies. This note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance.
19
+ 0.9.31 fixes Kimi removal confirmation and shared setup ownership while retaining exact Foundation 0.25.0 dependencies. This note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance.
20
20
 
21
21
  **Security**
22
22
 
23
- - The hook rejects missing or invalid evidence paths before remote access; the authoritative Hub gate validates the original release evidence.
24
- - Gate failure prevents Git Data API writes. Partial Hub publication is never rolled back or force-pushed, and completed steps are not overwritten. Writes remain bound to the observed branch head through compare-and-swap.
23
+ - Maintains strict confirmation boundaries: exact plugin ID and selection must be verified before removal. No changes to frozen install URL/ref/sha or post-install payload validation. Hub gate failure prevents GitHub Git Data API write. Writes bind the observed branch head through `compare-and-swap`. Partial Hub publication is never rolled back or force-pushed; completed steps are not overwritten. Existing `RELEASE_SKILL_HUB_RELEASE_EVIDENCE` environment variable continues to require an existing regular file at an absolute path (not a symlink), validated via `npm run release:check -- --release-evidence <file>`. Independent checkpoint approval, no replay of historical frozen plans, and `ALREADY_CURRENT` gate remain enforced.
25
24
 
26
25
  **Changed**
27
26
 
28
- - Skill Family Hub remains the unified market; entries are updated via GitHub Git Data API after post-verify validation.
27
+ - Skill Family Hub remains the unified market. GitHub Git Data API integration continues with `compare-and-swap` write semantics; no automatic rollback or overwrite of completed steps.
29
28
 
30
29
  **Fixed**
31
30
 
32
- - The private Hub hook forwards the absolute path supplied through `RELEASE_SKILL_HUB_RELEASE_EVIDENCE` to `npm run release:check -- --release-evidence <file>`. The path must name an existing regular file; symbolic links are rejected.
31
+ - Kimi 2.2.0: The remove confirmation page now uses `Remove <displayName> (<id>)?` with `Cancel` and `Remove plugin` options. The adapter verifies the exact plugin ID and current selection. When selection movement is required, move first and re-observe before confirming. No direction key input is needed when `Remove plugin` is already selected. Removal is submitted only while that option is selected.
32
+ - Kimi 2.2.0: Display names containing `Confirm` or `Sure`, or titles arriving in chunks, no longer trigger the old broad regex path. Invalid ID, unknown or ambiguous selection, timeout, or EOF stop the update without proceeding to installation.
33
+ - The adapter retains the existing `Confirm remove plugin "<id>"?` wording, bracketed paste, and CSI Enter input method from Kimi 0.40.1. Frozen install URL/ref/sha, post-install name/version, and payload verification remain unchanged. Offline Expect/fake validation only; no real Kimi consumer installation or update performed.
34
+ - Shared environment setup for the same `unitId/plugin/version` is now merged. Different physical `skillFile` paths under Claude/Codex no longer count as separate setup owners. Only one precise setup feedback from a loaded host is required to satisfy shared environment checks.
35
+ - Host-specific installation, loading, and configuration still require separate verification. Feedback continues to bind `host/unit/path/plan/config/root`. True multiple plugin ownership still requires disambiguation. Failure in any host (Kimi or others) results in `FAILED` status; `VERIFIED`/`DISTRIBUTED` release state is unchanged.
33
36
 
34
37
  **Upgrade Notes**
35
38
 
36
- Before running `postverify`, maintainers set the `RELEASE_SKILL_HUB_RELEASE_EVIDENCE` environment variable to the absolute path of the original Hub evidence descriptor; the existing `envAllowlist` forwards only that key. The descriptor and referenced native records are not copied or rewritten.
39
+ Existing release plans can continue to be finalized after obtaining the new provider. No need to re-publish plugins from the original domain. Use the existing frozen plan within the explicitly authorized host scope; the provider update does not authorize additional host operations. Host installation, loading, and setup facts must be verified independently. This round’s offline Expect/fake testing does not imply the fix is limited to offline use; the product is intended for real hosts. Real Kimi consumer acceptance has not been performed, and thus cannot be claimed as passed.
37
40
 
38
- A new plan freezes the corrected hook and still requires independent checkpoint approval. Historical plans, approvals and frozen hooks remain unchanged and are not replayed. `ALREADY_CURRENT` still requires the authoritative Hub gate.
39
-
40
- Existing Hub users need no configuration migration. The old release-skill standalone marketplace is deprecated; use `ifoohoo/skill-family-hub` and `release-skill@skill-family-hub`.
41
-
42
- This note does not authorize publication or prove real-host business or consumer installation verification. No consumer installation or update is added.
41
+ The old release-skill standalone marketplace is deprecated; use `ifoohoo/skill-family-hub` and `release-skill@skill-family-hub`.
43
42
  <!-- release-skill:managed:end id=latest-release -->
44
43
 
45
44
  <!-- release-skill:capability:external-write-boundary -->
46
- > **Current boundary:** v0.9.30: this README records capabilities and verification boundaries;
45
+ > **Current boundary:** v0.9.31: this README records capabilities and verification boundaries;
47
46
  > it is not evidence of
48
47
  > publication, consumer-installation verification, or independent acceptance.
49
48
  > Release availability must be established from the corresponding release records
@@ -67,7 +66,7 @@ This note does not authorize publication or prove real-host business or consumer
67
66
  > publish global preflight.
68
67
 
69
68
  <!-- release-skill:capability:safe-first-command -->
70
- > **Production path verified since the v0.1.1 milestone; for v0.9.30,
69
+ > **Production path verified since the v0.1.1 milestone; for v0.9.31,
71
70
  > publication, consumer-installation verification, and independent acceptance
72
71
  > require version-specific release records and verification results.**
73
72
  > The npm-installed CLI is the supported user entry. Source checkout
package/README.zh-CN.md CHANGED
@@ -2,42 +2,41 @@
2
2
 
3
3
  [English](README.md) · 安装指南:[中文](INSTALL.zh-CN.md) / [English](INSTALL.md)
4
4
 
5
- <!-- release-skill:release-version: 0.9.30 -->
5
+ <!-- release-skill:release-version: 0.9.31 -->
6
6
  面向 Claude Code、CodeBuddy、WorkBuddy、Codex 和 Kimi Code 的发布准备工具,完整保留人工维护的文件内容。
7
7
 
8
8
  release-skill 帮助维护者回答三个问题:准备发布什么、还有哪些检查未通过、最终发布的内容是什么。它不重新生成、也不回写项目源文件。`prepare` 把每个配置的公开文件复制到隔离快照并验证字节——先冻结并供人工审阅,再从同一份冻结产物发布。`setup` 只显示确定性的 `compactSummary` 审阅视图,完整报告保留在临时会话目录中。
9
9
 
10
10
  <!-- release-skill:managed:start id=latest-release -->
11
- **0.9.30** (2026-10-16)
11
+ **0.9.31** (2026-10-17)
12
12
 
13
- 0.9.30 修复项目私有 Hub 钩子漏传发布证据参数的问题,继续使用精确的 Foundation 0.25.0 依赖。本说明不代表已经发布、完成真实宿主验收、完成消费者安装验证或通过独立验收。
13
+ 0.9.31 修复 Kimi 移除确认和共享环境 setup 归属,继续使用精确的 Foundation 0.25.0 依赖。本说明不代表已经发布、完成真实宿主验收、完成消费者安装验证或通过独立验收。
14
14
 
15
15
  **安全**
16
16
 
17
- - 钩子在访问远端前拒绝缺失或非法的证据路径,证据内容交由 Hub 正式门禁验证。
18
- - 门禁失败不进行 Git Data API 写入;部分发布不回滚、不覆盖已完成步骤、不自动强推;写入绑定观察到的分支头并比较后写入。
17
+ - 保持严格确认边界:移除前必须精确核对插件ID与选择。冻结的安装URL/ref/sha与安装后载荷验证规则未变。Hub门禁失败将阻止GitHub Git Data API写入。写入采用 `compare-and-swap`,绑定已观察的分支头并比较后写入;部分发布不回滚、不覆盖已完成步骤、不自动强推。现有 `RELEASE_SKILL_HUB_RELEASE_EVIDENCE` 环境变量仍须指定已有普通文件的绝对路径(拒绝符号链接),交由 `npm run release:check -- --release-evidence <file>` 验证。独立检查点批准、历史冻结计划不重放、ALREADY_CURRENT 门禁仍强制执行。
19
18
 
20
19
  **变更**
21
20
 
22
- - Skill Family Hub 仍是统一市场,验证后经 GitHub Git Data API 更新条目。
21
+ - Skill Family Hub 保持统一市场。GitHub Git Data API 机制延续,写入采用 compare-and-swap 语义;不自动回滚或覆盖已完成步骤。
23
22
 
24
23
  **修复**
25
24
 
26
- - 项目私有 Hub 钩子把 `RELEASE_SKILL_HUB_RELEASE_EVIDENCE` 指定的绝对路径传给 `npm run release:check -- --release-evidence <file>`。路径必须指向已有普通文件,不接受符号链接。
25
+ - Kimi 2.2.0:移除确认页使用 `Remove <displayName> (<id>)?`,包含 Cancel 和 Remove plugin 选项。适配器核对精确插件ID与选中项。需移动时先移动并重新观察选择后再确认。已选中 `Remove plugin` 时无需方向键输入,只有该项选中时才提交移除操作。
26
+ - Kimi 2.2.0:显示名含 Confirm 或 Sure,或标题分块到达,不再触发旧宽泛正则路径。错误ID、未知或歧义选择、timeout或EOF均导致失败关闭,不继续安装。
27
+ - Kimi 2.2.0:保留 Kimi 0.40.1 已支持的实际措辞 `Confirm remove plugin "<id>"?`、括号粘贴及 CSI Enter 输入方式。冻结的安装URL/ref/sha、安装后name/version和载荷核对未改变。本轮采用离线 Expect/fake 验证,不构成真实 Kimi 消费者验收。
28
+ - 同一 `unitId/plugin/version` 的共享环境setup按 unitId/plugin/version 归并;Claude/Codex不同物理skillFile路径不再视为多个setup归属。仅需一个已加载宿主的精确setup反馈即可承接共享环境检查。
29
+ - 各宿主安装、加载及专属配置仍分别核实。反馈继续绑定 host/unit/path/plan/config/root;真正多插件归属仍须消歧,Kimi失败或其他宿主失败仍使收尾 FAILED;不改 VERIFIED/DISTRIBUTED 发布状态。
27
30
 
28
31
  **升级说明**
29
32
 
30
- 维护者在运行 `postverify` 前,将环境变量 `RELEASE_SKILL_HUB_RELEASE_EVIDENCE` 设为原始 Hub 证据描述符的绝对路径;现有 `envAllowlist` 只转发该键。描述符及其引用的原生记录不复制、不改写。
33
+ 在获取新提供方后,可继续按原冻结计划与已授权宿主范围完成收尾工作,无需重发原领域插件。继续使用原冻结计划及已明确授权的宿主范围,提供方更新不扩大本机操作授权。宿主安装、加载与setup事实需独立核实。本轮离线Expect/fake测试不代表修复仅适用于离线场景;产品意图面向真实宿主。真实Kimi消费者验收未执行,不能声称通过。
31
34
 
32
- 新计划冻结修正的钩子,仍须取得独立检查点批准;历史计划、批准和冻结钩子保持不变,不重放。`ALREADY_CURRENT` 仍须通过 Hub 正式门禁。
33
-
34
- 已使用 Hub 的用户无需配置迁移。旧版独立的 `release-skill` 市场已弃用,应改用 `ifoohoo/skill-family-hub` 与 `release-skill@skill-family-hub`。
35
-
36
- 本说明不授权发布,也不证明真实宿主业务或消费者安装验证完成;不新增消费者安装或更新动作。
35
+ 旧版独立的 `release-skill` 市场已弃用,应改用 `ifoohoo/skill-family-hub` 与 `release-skill@skill-family-hub`。
37
36
  <!-- release-skill:managed:end id=latest-release -->
38
37
 
39
38
  <!-- release-skill:capability:external-write-boundary -->
40
- > **当前边界:** v0.9.30 的能力范围与验证边界见本 README,
39
+ > **当前边界:** v0.9.31 的能力范围与验证边界见本 README,
41
40
  > 不代表已经发布、完成消费者安装验证或通过独立验收。
42
41
  > 版本可用性以对应发布记录及发布后验证结果为准。
43
42
  > v0.4.1 是更早的已发布里程碑(v0.2.2 曾处于已发布状态,后因平台验证收敛修复而更新)。
@@ -53,7 +52,7 @@ release-skill 帮助维护者回答三个问题:准备发布什么、还有哪
53
52
  > 远端唯一性检查在 `publish` 全局预检执行。
54
53
 
55
54
  <!-- release-skill:capability:safe-first-command -->
56
- > **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.9.30 的发布、消费者安装验证和独立验收状态须由该版本的发布记录及验证结果确认。**
55
+ > **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.9.31 的发布、消费者安装验证和独立验收状态须由该版本的发布记录及验证结果确认。**
57
56
  > npm 安装的 CLI 是受支持的用户入口;源码 checkout 保留为开发/贡献者路径。
58
57
  >
59
58
  > **第一条命令:**
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.30",
3
+ "version": "0.9.31",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -9,9 +9,9 @@ const __bundlePkgRoot = __bundleResolve(__bundleDirname(__bundleFileURLToPath(im
9
9
  // Provide a real require() for CJS packages bundled into ESM (e.g. yaml, ajv).
10
10
  const __bundleRealRequire = __bundleCreateRequire(import.meta.url);
11
11
  // Package identity injected at build time — closure-independent --version probe.
12
- const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.30"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.31"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "52acbaddf4e589b42b49defb03ff5dfa59e0306f37a3ce0e8e3aaa240b9cfba4";
14
+ const __bundleSourceDigest = "1ac240c6ac1cc3eaec8662f1f04ed43c069136e65400823f01c951e7976dc9e8";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -137228,17 +137228,162 @@ function parseCodeBuddyRemoteObservation(target, stdout) {
137228
137228
  };
137229
137229
  }
137230
137230
  function kimiExpectProgram({ removePlugin } = {}) {
137231
- const removeCommand = removePlugin ? `submitCommand "/plugins remove $removePlugin"
137232
- expect {
137233
- -nocase -re {(remove|delete|uninstall).*(confirm|sure)|(confirm|sure).*(remove|delete|uninstall)} {
137231
+ const removeCommand = removePlugin ? `proc kimi22RemoveIdentity {dialog} {
137232
+ set identity ""
137233
+ foreach rawLine [split $dialog "\\n"] {
137234
+ set line [string trim $rawLine]
137235
+ if {[regexp -nocase {Remove .+ \\(([^()]+)\\)\\?} $line match pluginId]} {
137236
+ if {$identity ne "" && $identity ne $pluginId} { return "" }
137237
+ set identity $pluginId
137238
+ }
137239
+ }
137240
+ return $identity
137241
+ }
137242
+
137243
+ proc kimi22RemoveDialogComplete {dialog} {
137244
+ set hasCancel 0
137245
+ set hasRemove 0
137246
+ foreach rawLine [split $dialog "\\n"] {
137247
+ set line [string trim $rawLine]
137248
+ regsub {^\u276F[ \\t]*} $line {} label
137249
+ set label [string trim $label]
137250
+ if {[string equal -nocase $label "Cancel"]} { set hasCancel 1 }
137251
+ if {[string equal -nocase $label "Remove plugin"]} { set hasRemove 1 }
137252
+ }
137253
+ return [expr {$hasCancel && $hasRemove}]
137254
+ }
137255
+
137256
+ proc kimi22RemoveAction {dialog state unknownCode} {
137257
+ set labels {}
137258
+ set selectedCount 0
137259
+ set selectedIndex -1
137260
+ set selectedLabel ""
137261
+ set removeCount 0
137262
+ set removeIndex -1
137263
+ foreach rawLine [split $dialog "\\n"] {
137264
+ set line [string trim $rawLine]
137265
+ if {$line eq ""} { continue }
137266
+ set selected [regexp {^\u276F[ \\t]*} $line]
137267
+ if {$selected} {
137268
+ regsub {^\u276F[ \\t]*} $line {} label
137269
+ set label [string trim $label]
137270
+ } else {
137271
+ set label $line
137272
+ }
137273
+ set knownAction [expr {
137274
+ [string equal -nocase $label "Cancel"]
137275
+ || [string equal -nocase $label "Remove plugin"]
137276
+ }]
137277
+ if {!$knownAction && $selected} {
137278
+ puts stderr "KIMI_TUI_STATE:$state:unknown"
137279
+ exit $unknownCode
137280
+ }
137281
+ if {!$knownAction} { continue }
137282
+ set index [llength $labels]
137283
+ lappend labels $label
137284
+ if {[string equal -nocase $label "Remove plugin"]} {
137285
+ incr removeCount
137286
+ set removeIndex $index
137287
+ }
137288
+ if {$selected} {
137289
+ incr selectedCount
137290
+ set selectedIndex $index
137291
+ set selectedLabel $label
137292
+ }
137293
+ }
137294
+ if {[llength $labels] != 2 || $removeCount != 1 || $selectedCount != 1} {
137295
+ puts stderr "KIMI_TUI_STATE:$state:unknown"
137296
+ exit $unknownCode
137297
+ }
137298
+ if {[string equal -nocase $selectedLabel "Remove plugin"]} {
137299
+ return selected-remove
137300
+ }
137301
+ if {![string equal -nocase $selectedLabel "Cancel"]} {
137302
+ puts stderr "KIMI_TUI_STATE:$state:unknown"
137303
+ exit $unknownCode
137304
+ }
137305
+ if {$selectedIndex + 1 == $removeIndex} { return move-down }
137306
+ if {$selectedIndex - 1 == $removeIndex} { return move-up }
137307
+ puts stderr "KIMI_TUI_STATE:$state:unknown"
137308
+ exit $unknownCode
137309
+ }
137310
+
137311
+ proc readKimi22RemoveDialog {prefix state timeoutCode unknownCode eofCode} {
137312
+ global expect_out
137313
+ set dialogBuffer $prefix
137314
+ set cleaned [cleanScreen $dialogBuffer]
137315
+ if {![regexp -nocase {Remove .+ \\(([^()]+)\\)\\?} $cleaned]} {
137316
+ expect {
137317
+ -nocase -re {Remove [^\\r\\n]*\\([^\\r\\n]+\\)\\?} {
137318
+ append dialogBuffer $expect_out(buffer)
137319
+ }
137320
+ timeout { failTimeout $state $timeoutCode $unknownCode }
137321
+ eof { failEof $state $eofCode }
137322
+ }
137323
+ set cleaned [cleanScreen $dialogBuffer]
137324
+ }
137325
+ while {![kimi22RemoveDialogComplete $cleaned]} {
137234
137326
  expect {
137235
- -ex $removePlugin {
137236
- send -- "\\033\\[B"
137237
- send -- "\\033\\[13u"
137327
+ -nocase -re {Trust this folder\\?} { unexpectedDirectoryTrust }
137328
+ -nocase -re {(?:Cancel|Remove plugin)[^\\r\\n]*\\r*\\n} {
137329
+ append dialogBuffer $expect_out(buffer)
137238
137330
  }
137239
- timeout { failTimeout remove-confirmation 125 127 }
137240
- eof { failEof remove-confirmation 126 }
137331
+ -re {([^\\r\\n]+\\r*\\n)} {
137332
+ append dialogBuffer $expect_out(buffer)
137333
+ }
137334
+ timeout { failTimeout $state $timeoutCode $unknownCode }
137335
+ eof { failEof $state $eofCode }
137336
+ }
137337
+ set cleaned [cleanScreen $dialogBuffer]
137338
+ }
137339
+ return $cleaned
137340
+ }
137341
+
137342
+ proc confirmKimi22Remove {} {
137343
+ global expect_out promptPattern removePlugin
137344
+ set dialog [readKimi22RemoveDialog $expect_out(buffer) remove-confirmation 125 127 126]
137345
+ set identity [kimi22RemoveIdentity $dialog]
137346
+ if {$identity eq "" || $identity ne $removePlugin} {
137347
+ puts stderr "KIMI_TUI_STATE:remove-confirmation:unknown"
137348
+ exit 127
137349
+ }
137350
+ set action [kimi22RemoveAction $dialog remove-confirmation 127]
137351
+ if {$action eq "move-down"} {
137352
+ send -- "\\033\\[B"
137353
+ } elseif {$action eq "move-up"} {
137354
+ send -- "\\033\\[A"
137355
+ }
137356
+ if {$action ne "selected-remove"} {
137357
+ set confirmedDialog [readKimi22RemoveDialog "" remove-confirm-selection 125 127 126]
137358
+ set confirmedIdentity [kimi22RemoveIdentity $confirmedDialog]
137359
+ if {$confirmedIdentity eq "" || $confirmedIdentity ne $removePlugin} {
137360
+ puts stderr "KIMI_TUI_STATE:remove-confirm-selection:unknown"
137361
+ exit 127
137362
+ }
137363
+ set confirmedAction [kimi22RemoveAction $confirmedDialog remove-confirm-selection 127]
137364
+ if {$confirmedAction ne "selected-remove"} {
137365
+ puts stderr "KIMI_TUI_STATE:remove-confirm-selection:unknown"
137366
+ exit 127
137367
+ }
137368
+ }
137369
+ send -- "\\033\\[13u"
137370
+ expect {
137371
+ -nocase -re {Trust this folder\\?} { unexpectedDirectoryTrust }
137372
+ -re $promptPattern {}
137373
+ timeout { failTimeout remove-prompt 128 130 }
137374
+ eof { failEof remove-prompt 129 }
137375
+ }
137376
+ }
137377
+
137378
+ submitCommand "/plugins remove $removePlugin"
137379
+ expect {
137380
+ -nocase -re {Confirm remove plugin "([^"\\r\\n]+)"\\?\\r*\\n} {
137381
+ if {$expect_out(1,string) ne $removePlugin} {
137382
+ puts stderr "KIMI_TUI_STATE:remove-confirmation:unknown"
137383
+ exit 127
137241
137384
  }
137385
+ send -- "\\033\\[B"
137386
+ send -- "\\033\\[13u"
137242
137387
  expect {
137243
137388
  -nocase -re {Trust this folder\\?} { unexpectedDirectoryTrust }
137244
137389
  -re $promptPattern {}
@@ -137246,6 +137391,9 @@ expect {
137246
137391
  eof { failEof remove-prompt 129 }
137247
137392
  }
137248
137393
  }
137394
+ -nocase -re {Remove [^\\r\\n]*\\([^\\r\\n]+\\)\\?} {
137395
+ confirmKimi22Remove
137396
+ }
137249
137397
  -re $promptPattern {}
137250
137398
  -nocase -re {Trust this folder\\?} { unexpectedDirectoryTrust }
137251
137399
  timeout { failTimeout remove-dialog 122 124 }
@@ -146909,7 +147057,7 @@ async function runPostReleaseFinish({
146909
147057
  }
146910
147058
  const setupSkill = loaded.config.releaseFinish?.setupSkill;
146911
147059
  const candidates = observations.filter((entry) => entry.installation === "current" && entry.loaded === true && typeof entry.skillFile === "string");
146912
- const candidateOwners = new Set(candidates.map((entry) => `${entry.plugin}\0${entry.version}\0${entry.skillFile}`));
147060
+ const candidateOwners = new Set(candidates.map((entry) => `${entry.unitId}\0${entry.plugin}\0${entry.version}`));
146913
147061
  const effectiveSetup = updateKeepsFeedback ? feedback.setup : null;
146914
147062
  let setupStep;
146915
147063
  if (!setupSkill) {
@@ -29,9 +29,15 @@ description: "Discoverable entry point for release-skill: dependency and environ
29
29
 
30
30
  治理诊断只运行 release-skill 自己的只读检查程序,不运行目标 Skill、业务脚本、构建、hook 或发布动作,也不把 `prepare`、`verify`、`release-finish` 当作静态治理入口。用户要求实际接入或发布时,把已有授权带到对应原业务入口;各入口继续执行原有确认、副作用和状态机合同。
31
31
 
32
- ## 0.9.30 能力与证据边界
32
+ ## 0.9.31 能力与证据边界
33
33
 
34
- release-skill 0.9.30 保留 Foundation 0.25.0 精确依赖、可选宿主覆盖诊断输入 `--host-coverage <file>` 与 `--observe-hosts`、Codex 0.154.0 静态加载规则检查 11 份真实生成 Skill 的原字节等既有事实;本版修复私有 Hub 的 postVerify 钩子:通过既有 `envAllowlist` 传递 `RELEASE_SKILL_HUB_RELEASE_EVIDENCE`,其值为原始描述符所指向的已有普通文件绝对路径(拒绝符号链接),交由 Hub `npm run release:check -- --release-evidence <file>` 验证。Qoder 本机更新路径处理维持既有能力,支持 `./adapters/qoder/skills/` 与 `./skills/` 两种布局,仍核对安装 name/version/skills、路径包含性与实际载荷。静态检查不证明安装、会话选择或业务执行通过,批准、发布和验证状态以对应计划、批准及执行记录为准。
34
+ 0.9.31 修复了 Kimi 2.2.0 的移除确认逻辑与共享环境 setup 归属规则。移除确认页采用 `Remove <displayName> (<id>)?` 格式,包含 Cancel 和 Remove plugin 选项;适配器精确核对插件 ID 与选中项,需移动时须先移动并重新观察选择再确认,已选中 `Remove plugin` 时无需方向键输入,仅在该选项激活时提交移除操作。显示名含 Confirm 或 Sure,或标题分块到达,不再触发旧宽泛正则路径;错误 ID、未知或歧义选择、timeout 或 EOF 均导致失败关闭,不继续安装。
35
+
36
+ 保留 Kimi 0.40.1 的实际确认措辞 `Confirm remove plugin "<id>"?`、括号粘贴与 CSI Enter 输入方式。冻结的安装 URL/ref/sha、安装后 name/version 与载荷核对规则未变。本轮验证为离线 Expect/fake 测试,不构成真实 Kimi 消费者验收。
37
+
38
+ 同一 `unitId/plugin/version` 的共享环境 setup 按单元、插件、版本归并,Claude/Codex 不同物理 `skillFile` 路径不再视为多个 setup 归属。仅需一个已加载宿主的精确 setup 反馈即可满足共享环境检查要求。各宿主的安装、加载及专属配置仍需分别核实,反馈继续绑定 `host/unit/path/plan/config/root`;真正多插件归属仍需消歧,Kimi 失败或其他宿主失败均导致收尾状态为 FAILED,不改变 `VERIFIED`/`DISTRIBUTED` 发布状态。
39
+
40
+ 本版保留 Foundation 0.25.0 精确依赖、可选宿主覆盖诊断输入 `--host-coverage <file>` 与 `--observe-hosts`、Codex 0.154.0 对 11 份真实生成 Skill 的原字节静态检查能力。静态检查不证明安装、会话选择或业务执行通过,批准、发布和验证状态以对应计划、批准及执行记录为准。Qoder 本机更新路径处理维持既有能力,支持 `./adapters/qoder/skills/` 与 `./skills/` 两种布局,仍核对安装 name/version/skills、路径包含性与实际载荷。私有 Hub 的 `RELEASE_SKILL_HUB_RELEASE_EVIDENCE` 环境变量继续要求原始描述符指向的已有普通文件绝对路径(拒绝符号链接),交由 `npm run release:check -- --release-evidence <file>` 验证。实际版本能力不能等同于发布状态或真实宿主验收。
35
41
 
36
42
  在冻结前,`prepare` 或新建 `ship` 状态时可重复传入 `--unit <id>`;未传入则默认选择全部单元。延期单元不进入发布计划,亦不获得发布状态。完整配置、生成物新鲜度检查及顶层 Hook 仍作用于全项目范围。`publicSourceAuthorityReceipt` 的 coordinator 与全部 subjects 必须共同选择。
37
43
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.30",
3
+ "version": "0.9.31",
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.9.30.",
22
+ "Prepare a release plan for version 0.9.31.",
23
23
  "Help me understand the release workflow."
24
24
  ]
25
25
  }