release-skill 0.9.21 → 0.9.22

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 (35) 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 +26 -0
  8. package/INSTALL.md +2 -2
  9. package/INSTALL.zh-CN.md +2 -2
  10. package/README.md +12 -14
  11. package/README.zh-CN.md +12 -14
  12. package/adapters/claude/.claude-plugin/plugin.json +1 -1
  13. package/adapters/claude/bin/release-skill.bundle.mjs +26 -11
  14. package/adapters/claude/skills/release-help/SKILL.md +2 -2
  15. package/adapters/codex/.codex-plugin/plugin.json +2 -2
  16. package/adapters/codex/bin/release-skill.bundle.mjs +26 -11
  17. package/adapters/codex/skills/release-help/SKILL.md +2 -2
  18. package/adapters/cursor/.cursor-plugin/plugin.json +1 -1
  19. package/adapters/cursor/bin/release-skill.bundle.mjs +26 -11
  20. package/adapters/cursor/skills/release-help/SKILL.md +2 -2
  21. package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
  22. package/adapters/kimi/bin/release-skill.bundle.mjs +26 -11
  23. package/adapters/kimi/skills/release-help/SKILL.md +2 -2
  24. package/adapters/qoder/.qoder-plugin/plugin.json +1 -1
  25. package/adapters/qoder/bin/release-skill.bundle.mjs +26 -11
  26. package/adapters/qoder/skills/release-help/SKILL.md +2 -2
  27. package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
  28. package/adapters/workbuddy/bin/release-skill.bundle.mjs +26 -11
  29. package/adapters/workbuddy/skills/release-help/SKILL.md +2 -2
  30. package/bin/release-skill.bundle.mjs +26 -11
  31. package/package.json +1 -1
  32. package/platform-manifest.json +4 -4
  33. package/skills/release-help/SKILL.md +2 -2
  34. package/skills-src/release-help/SKILL.md +2 -2
  35. package/src/commands/post-release-local.mjs +24 -13
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.21",
3
+ "version": "0.9.22",
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.21",
3
+ "version": "0.9.22",
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.21",
3
+ "version": "0.9.22",
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.21.",
22
+ "Prepare a release plan for version 0.9.22.",
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.21",
3
+ "version": "0.9.22",
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.21",
3
+ "version": "0.9.22",
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.21",
3
+ "version": "0.9.22",
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,31 @@
1
1
  # Changelog
2
2
 
3
+ <!-- release-skill:changelog:start version=0.9.22 locale=en baseline=sha256:5b9ca7ff99b3d072831f4f114ff4830f6d76540f7c5262fd1deb97eaec9d0a57 -->
4
+ ## [0.9.22] - 2026-09-17
5
+
6
+ 0.9.22 is a local source candidate that fixes two failures found during the real-host rollout of 0.9.21. CodeBuddy and WorkBuddy keep the same frozen Hub identity and installed-payload checks. Foundation dependencies remain pinned to 0.21.0. This note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance.
7
+
8
+ ### Security
9
+
10
+ - Hub publication remains a compare-and-swap operation. A partial Hub publication is never rolled back or force-pushed automatically.
11
+ - A Hub marketplace reported as github is accepted only on the Hub-backed CodeBuddy/WorkBuddy path. The updater still verifies the checkout origin, branch, HEAD, host-specific index, installed revision, and complete frozen payload.
12
+ - WorkBuddy reuses the existing strict residual_process_group envelope only when the child exited successfully and Foundation reports the exact cleanup evidence. Any field mismatch fails closed before later writes.
13
+
14
+ ### Changed
15
+
16
+ - Skill Family Hub remains the central marketplace, and its release entry continues to use the existing GitHub Git Data API after release verification.
17
+
18
+ ### Fixed
19
+
20
+ - CodeBuddy 2.148.0 can now update an existing Hub plugin when its official marketplace list reports type github instead of type git.
21
+ - WorkBuddy can complete the same existing-plugin update when its embedded CodeBuddy CLI exits successfully but leaves a process group that Foundation has already terminated and verified.
22
+
23
+ ### Upgrade Notes
24
+
25
+ Upgrade from 0.9.21 before running local host finishing for CodeBuddy or WorkBuddy. No configuration migration is required. Remove the old release-skill standalone marketplace; use the ifoohoo/skill-family-hub repository and Hub-qualified plugin id release-skill@skill-family-hub. Reload or restart each updated host before claiming that 0.9.22 is loaded.
26
+ <!-- release-skill:changelog:end version=0.9.22 locale=en -->
27
+
28
+
3
29
  <!-- release-skill:changelog:start version=0.9.21 locale=en baseline=sha256:90f61122ebbbe5f53bc95be7049aaaab4401e19cc805e76be525e9a74bf0a360 -->
4
30
  ## [0.9.21] - 2026-09-17
5
31
 
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.21 -->
5
+ <!-- release-skill:release-version: 0.9.22 -->
6
6
  ## Prerequisites
7
7
 
8
8
  - Node.js 22.0.0 or later
@@ -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.21
128
+ /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.22
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.21 -->
5
+ <!-- release-skill:release-version: 0.9.22 -->
6
6
  ## 前置条件
7
7
 
8
8
  - Node.js 22.0.0 或更高版本
@@ -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.21
116
+ /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.22
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.21 -->
5
+ <!-- release-skill:release-version: 0.9.22 -->
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,16 +14,15 @@ 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.21** (2026-09-17)
17
+ **0.9.22** (2026-09-17)
18
18
 
19
- 0.9.21 is a local source candidate that enables automatic local updates for Claude, Codex, Kimi, CodeBuddy, and WorkBuddy when the frozen plan declares a Hub source. Qoder and Cursor retain their existing paths. Foundation dependencies remain pinned to 0.21.0. This note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance.
19
+ 0.9.22 is a local source candidate that fixes two failures found during the real-host rollout of 0.9.21. CodeBuddy and WorkBuddy keep the same frozen Hub identity and installed-payload checks. Foundation dependencies remain pinned to 0.21.0. This note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance.
20
20
 
21
21
  **Security**
22
22
 
23
23
  - Hub publication remains a compare-and-swap operation. A partial Hub publication is never rolled back or force-pushed automatically.
24
- - CodeBuddy and WorkBuddy only upgrade existing installations and reject a Hub branch that moves before plugin update.
25
- - Kimi uses the frozen GitHub Release; its repository-only Hub entry is not treated as tag or commit evidence.
26
- - Completed postVerify lineage, host selection, plan-digest confirmation, and full installed-payload verification remain required. Host failures preserve the results of other selected hosts.
24
+ - A Hub marketplace reported as github is accepted only on the Hub-backed CodeBuddy/WorkBuddy path. The updater still verifies the checkout origin, branch, HEAD, host-specific index, installed revision, and complete frozen payload.
25
+ - WorkBuddy reuses the existing strict residual_process_group envelope only when the child exited successfully and Foundation reports the exact cleanup evidence. Any field mismatch fails closed before later writes.
27
26
 
28
27
  **Changed**
29
28
 
@@ -31,17 +30,16 @@ report stays in a temporary session directory.
31
30
 
32
31
  **Fixed**
33
32
 
34
- - Hub-only plans now produce executable local host targets without recreating legacy installation actions or distributions.
35
- - Claude, Codex, CodeBuddy, and WorkBuddy verify their host-specific Hub entries and installed payloads against the frozen release identity.
36
- - Kimi retains http_proxy, https_proxy, and all_proxy in the process that performs its controlled terminal installation.
33
+ - CodeBuddy 2.148.0 can now update an existing Hub plugin when its official marketplace list reports type github instead of type git.
34
+ - WorkBuddy can complete the same existing-plugin update when its embedded CodeBuddy CLI exits successfully but leaves a process group that Foundation has already terminated and verified.
37
35
 
38
36
  **Upgrade Notes**
39
37
 
40
- Upgrade from 0.9.20 to automate the five previously manual Hub-backed hosts. No configuration migration is required. Remove the old release-skill standalone marketplace; use the ifoohoo/skill-family-hub repository and Hub-qualified plugin id release-skill@skill-family-hub. Claude can verify an exact current installation offline. Codex performs its existing remove/install flow when its list does not provide an installation root. Installed does not mean loaded: reload or restart the host and confirm the loaded version.
38
+ Upgrade from 0.9.21 before running local host finishing for CodeBuddy or WorkBuddy. No configuration migration is required. Remove the old release-skill standalone marketplace; use the ifoohoo/skill-family-hub repository and Hub-qualified plugin id release-skill@skill-family-hub. Reload or restart each updated host before claiming that 0.9.22 is loaded.
41
39
  <!-- release-skill:managed:end id=latest-release -->
42
40
 
43
41
  <!-- release-skill:capability:external-write-boundary -->
44
- > **Current boundary:** v0.9.21 is the current source candidate. This README
42
+ > **Current boundary:** v0.9.22 is the current source candidate. This README
45
43
  > records intended scope and verification boundaries; it is not evidence of
46
44
  > publication, consumer-installation verification, or independent acceptance.
47
45
  > Release availability must be established from the corresponding release records
@@ -65,7 +63,7 @@ Upgrade from 0.9.20 to automate the five previously manual Hub-backed hosts. No
65
63
  > publish global preflight.
66
64
 
67
65
  <!-- release-skill:capability:safe-first-command -->
68
- > **Production path verified since the v0.1.1 milestone; v0.9.21 is the current
66
+ > **Production path verified since the v0.1.1 milestone; v0.9.22 is the current
69
67
  > source candidate. Its README does not establish publication,
70
68
  > consumer-installation verification, or independent acceptance.**
71
69
  > The npm-installed CLI is the supported user entry. Source checkout
@@ -94,7 +92,7 @@ checkpoints remain intact and use matching-version recovery. Evidence v1 stays
94
92
  read-only; v2 uses a closed top level with phase extensions in `details`.
95
93
  Summaries and recovery suggestions are diagnostic, never publication authority.
96
94
 
97
- The current 0.9.21 candidate includes the narrow R-05 Hook cache v2 consumer
95
+ The current 0.9.22 candidate includes the narrow R-05 Hook cache v2 consumer
98
96
  path, the public `postverify` path, and the stable isolated install-tree record
99
97
  path (A2/A3). It also adds the explicit-input `verify-records` command and a
100
98
  self-contained Qoder projection, first-class Cursor packaging, and the
@@ -879,7 +877,7 @@ run. The core prepare, publish, and verify workflow remains cross-platform.
879
877
  A release unit may also declare `postPublish.localHostUpdate` for a plugin that
880
878
  is delivered through a project-selected Hub by a `postVerify` hook. After that
881
879
  hook reaches `DISTRIBUTED`, `ship`, `verify`, `post-release`, and
882
- `release-finish` display the declared Hub, plugin, and hosts. Version 0.9.21
880
+ `release-finish` display the declared Hub, plugin, and hosts. Version 0.9.22
883
881
  makes Claude, Codex, Kimi, CodeBuddy, WorkBuddy, and Qoder executable after
884
882
  explicit host selection and plan-digest confirmation. Claude and Codex require
885
883
  an existing matching Hub marketplace and verify its host-specific entry before
package/README.zh-CN.md CHANGED
@@ -2,22 +2,21 @@
2
2
 
3
3
  [English](README.md) · 安装指南:[中文](INSTALL.zh-CN.md) / [English](INSTALL.md)
4
4
 
5
- <!-- release-skill:release-version: 0.9.21 -->
5
+ <!-- release-skill:release-version: 0.9.22 -->
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.21** (2026-09-17)
11
+ **0.9.22** (2026-09-17)
12
12
 
13
- 0.9.21 是一个本地源码候选,补齐冻结计划声明 Hub 来源后,Claude、Codex、Kimi、CodeBuddy 和 WorkBuddy 的本机自动更新。Qoder 与 Cursor 保留原有路径。Foundation 依赖继续固定为 0.21.0。本说明不代表已经发布、完成真实宿主验收、完成消费者安装验证或通过独立验收。
13
+ 0.9.22 是一个本地源码候选,修复 0.9.21 真实宿主收尾暴露的两处问题。CodeBuddy 与 WorkBuddy 继续使用同一份冻结 Hub 身份和安装载荷检查。Foundation 依赖保持固定为 0.21.0。本说明不代表已经发布、完成真实宿主验收、完成消费者安装验证或通过独立验收。
14
14
 
15
15
  **安全**
16
16
 
17
17
  - Hub 发布继续绑定已观察的分支头执行比较后写入。部分发布时不回滚、不覆盖已经成功的远端步骤。
18
- - CodeBuddy 与 WorkBuddy 只升级既有安装;插件写入前发现 Hub 分支漂移时停止。
19
- - Kimi 直接使用冻结 GitHub Release,不把只有仓库 URL 的 Hub 条目作为标签或提交证据。
20
- - 继续要求完整 postVerify 谱系、用户选择宿主、确认计划摘要和完整载荷验证。单个宿主失败时保留其他已选宿主的实际结果。
18
+ - 只有 Hub-backed CodeBuddy/WorkBuddy 路径接受 github 市场类型。更新器仍核对 checkout 的 origin、分支、HEAD、宿主专用索引、安装修订号和完整冻结载荷。
19
+ - WorkBuddy 只复用现有的严格 residual_process_group 信封。子进程必须成功退出,Foundation 也必须返回精确的清理证据;任一字段不符时,在后续写入前失败关闭。
21
20
 
22
21
  **变更**
23
22
 
@@ -25,17 +24,16 @@ release-skill 帮助维护者回答三个问题:准备发布什么、还有哪
25
24
 
26
25
  **修复**
27
26
 
28
- - 仅声明 Hub 的计划现在可以生成可执行宿主目标,不再需要旧安装动作或旧宿主 distribution。
29
- - Claude、Codex、CodeBuddy 和 WorkBuddy 按各自 Hub 索引核对冻结发布身份,并比较实际安装载荷。
30
- - Kimi 终端安装进程保留 http_proxy、https_proxy 和 all_proxy 三个代理变量。
27
+ - CodeBuddy 2.148.0 的官方市场列表返回 github 类型时,现在可以继续更新既有 Hub 插件。
28
+ - WorkBuddy 的内嵌 CodeBuddy CLI 成功退出,且 Foundation 已清理并验证残留进程组时,现在可以完成同一条既有插件更新路径。
31
29
 
32
30
  **升级说明**
33
31
 
34
- 从 0.9.20 升级后,原先只能人工处理的五个 Hub 宿主可自动更新,无需迁移配置。请移除独立的 `release-skill` 市场,改用 ifoohoo/skill-family-hub 仓库与 Hub 限定插件名 release-skill@skill-family-hub。Claude 可以离线复验精确当前安装;Codex 列表不提供安装根时继续使用既有卸载再安装流程。安装完成不代表会话已加载新版,仍需重新加载或重启宿主并确认版本。
32
+ 执行 CodeBuddy 或 WorkBuddy 本机宿主收尾前,请从 0.9.21 升级到 0.9.22,无需迁移配置。请移除独立的 `release-skill` 市场,改用 ifoohoo/skill-family-hub 仓库与 Hub 限定插件名 release-skill@skill-family-hub。更新后必须重新加载或重启宿主,确认实际加载 0.9.22 后再报告完成。
35
33
  <!-- release-skill:managed:end id=latest-release -->
36
34
 
37
35
  <!-- release-skill:capability:external-write-boundary -->
38
- > **当前边界:** v0.9.21 只是当前源码候选。本 README 记录预期范围与验证边界,
36
+ > **当前边界:** v0.9.22 只是当前源码候选。本 README 记录预期范围与验证边界,
39
37
  > 不代表已经发布、完成消费者安装验证或通过独立验收。
40
38
  > 版本可用性以对应发布记录及发布后验证结果为准。
41
39
  > v0.4.1 是更早的已发布里程碑(v0.2.2 曾处于已发布状态,后因平台验证收敛修复而更新)。
@@ -51,7 +49,7 @@ release-skill 帮助维护者回答三个问题:准备发布什么、还有哪
51
49
  > 远端唯一性检查在 `publish` 全局预检执行。
52
50
 
53
51
  <!-- release-skill:capability:safe-first-command -->
54
- > **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.9.21 是当前源码候选,本 README 不证明该候选已经发布、完成消费者安装验证或通过独立验收。**
52
+ > **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.9.22 是当前源码候选,本 README 不证明该候选已经发布、完成消费者安装验证或通过独立验收。**
55
53
  > npm 安装的 CLI 是受支持的用户入口;源码 checkout 保留为开发/贡献者路径。
56
54
  >
57
55
  > **第一条命令:**
@@ -69,7 +67,7 @@ marketplace 委托目标工作区发布的边界不变。
69
67
 
70
68
  旧 production 计划缺少 `sourceAuthority` 时,在外部写入前拒绝。未发生外部写入的计划必须重新 prepare 并批准新摘要,不能补写旧计划或迁移批准。已有 `PARTIAL` 保留检查点,走匹配版本的恢复路径。evidence v1 只读;v2 顶层封闭,阶段扩展放在 `details`。摘要和恢复建议只作诊断,不构成发布权威。
71
69
 
72
- 当前 0.9.21 候选包含窄范围的 R-05 Hook cache v2 消费路径、公开 `postverify`
70
+ 当前 0.9.22 候选包含窄范围的 R-05 Hook cache v2 消费路径、公开 `postverify`
73
71
  路径和稳定隔离安装树记录路径(A2/A3),并增加只接受显式输入的 `verify-records`
74
72
  命令、自包含 Qoder 投影、Cursor 正式打包,以及基于 Foundation 的宿主核验桥。
75
73
  Skill Family Hub 仍是唯一市场来源。
@@ -735,7 +733,7 @@ verify run;核心 prepare、publish、verify 流程仍跨平台。
735
733
 
736
734
  如果插件由项目选定的 Hub 通过 `postVerify` Hook 交付,发布单元还可以声明
737
735
  `postPublish.localHostUpdate`。Hook 达到 `DISTRIBUTED` 后,`ship`、`verify`、
738
- `post-release` 和 `release-finish` 会显示声明中的 Hub、插件和宿主。0.9.21 让 Claude、
736
+ `post-release` 和 `release-finish` 会显示声明中的 Hub、插件和宿主。0.9.22 让 Claude、
739
737
  Codex、Kimi、CodeBuddy、WorkBuddy 和 Qoder 在用户选择宿主并确认计划摘要后进入执行。
740
738
  Claude 和 Codex 要求已有同源 Hub 市场,并在插件写入前核对宿主专用条目。CodeBuddy
741
739
  与 WorkBuddy 只升级既有安装,刷新市场后再次检查 Hub 分支是否漂移。Kimi 使用冻结
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.21",
3
+ "version": "0.9.22",
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.21"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.22"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "250625e18d802aeb764f43f469e6addbee46fa1b1a9fe1b672f1ccb8c98c0a81";
14
+ const __bundleSourceDigest = "45eaf443ea0ae412317287ca2fa661303666663c304c4691330b5ea1e700881d";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -135120,10 +135120,10 @@ function isCodeBuddyResidualEnvelope(error) {
135120
135120
  return envelope?.ok === false && envelope.exitStatus === 124 && envelope.processStatus === "TERMINATED" && envelope.terminationReason === "child_exit" && envelope.watchdogReason === "residual_process_group" && evidence?.childExitCode === 0 && (evidence.childSignal === null || evidence.childSignal === void 0) && evidence.residualGroupCleanupCompleted === true && evidence.forcedKill === false && evidence.outputLimitExceeded === null && Array.isArray(signals) && signals.length === 1 && signal?.signal === "SIGTERM" && signal.requestedMode === "process_group" && signal.successfulMode === "process_group";
135121
135121
  }
135122
135122
  function isCodeBuddyReadCommand(target, command2, args2) {
135123
- return target.host === "codebuddy" && (command2 === "codebuddy" || command2 === "cbc" || command2 === CODEBUDDY_MACOS_PATH) && Array.isArray(args2) && (args2.every((value, index) => value === CODEBUDDY_PLUGIN_LIST_ARGS[index]) && args2.length === CODEBUDDY_PLUGIN_LIST_ARGS.length || args2.every((value, index) => value === CODEBUDDY_MARKETPLACE_LIST_ARGS[index]) && args2.length === CODEBUDDY_MARKETPLACE_LIST_ARGS.length);
135123
+ return (target.host === "codebuddy" || target.host === "workbuddy") && (command2 === "codebuddy" || command2 === "cbc" || command2 === CODEBUDDY_MACOS_PATH) && Array.isArray(args2) && (args2.every((value, index) => value === CODEBUDDY_PLUGIN_LIST_ARGS[index]) && args2.length === CODEBUDDY_PLUGIN_LIST_ARGS.length || args2.every((value, index) => value === CODEBUDDY_MARKETPLACE_LIST_ARGS[index]) && args2.length === CODEBUDDY_MARKETPLACE_LIST_ARGS.length);
135124
135124
  }
135125
135125
  function isCodeBuddyWriteCommand(target, command2, args2, kind) {
135126
- if (target.host !== "codebuddy" || !["codebuddy", "cbc", CODEBUDDY_MACOS_PATH].includes(command2)) return false;
135126
+ if (!["codebuddy", "workbuddy"].includes(target.host) || !["codebuddy", "cbc", CODEBUDDY_MACOS_PATH].includes(command2)) return false;
135127
135127
  const expected = kind === "marketplace-update" ? ["plugin", "marketplace", "update", target.marketplace] : ["plugin", "update", `${target.plugin}@${target.marketplace}`, "--scope", "user"];
135128
135128
  return Array.isArray(args2) && args2.length === expected.length && args2.every((value, index) => value === expected[index]);
135129
135129
  }
@@ -135141,14 +135141,14 @@ async function runCodeBuddyRead(target, command2, args2, label, env, run6) {
135141
135141
  };
135142
135142
  }
135143
135143
  }
135144
- function exactCodeBuddyMarketplaceObservation(target, stdout) {
135144
+ function exactCodeBuddyMarketplaceObservation(target, stdout, { acceptedTypes = ["git"] } = {}) {
135145
135145
  const parsed = parseJson2(stdout, `${target.host} marketplace list`);
135146
135146
  if (!Array.isArray(parsed)) throw new Error(`${target.host} marketplace list did not return an array`);
135147
135147
  const matches = parsed.filter((entry) => entry?.name === target.marketplace);
135148
135148
  if (matches.length !== 1) {
135149
135149
  throw new Error(`${target.host} marketplace list did not contain exactly one ${target.marketplace}`);
135150
135150
  }
135151
- if (matches[0].type !== "git") {
135151
+ if (!acceptedTypes.includes(matches[0].type)) {
135152
135152
  throw new Error(`${target.host} marketplace ${target.marketplace} is not a git marketplace`);
135153
135153
  }
135154
135154
  return { installed: true, exact: true, found: matches[0] };
@@ -135558,11 +135558,12 @@ async function observeHubMarketplace(target, command2, env, run6) {
135558
135558
  if (!observed.installed) return observed;
135559
135559
  return { ...observed, commit: await observeHubCheckout(target, observed.root, env, run6) };
135560
135560
  }
135561
- const listed = target.host === "codebuddy" ? (await runCodeBuddyRead(target, command2, CODEBUDDY_MARKETPLACE_LIST_ARGS, "codebuddy marketplace list", env, run6)).output : await run6(command2, [...CODEBUDDY_MARKETPLACE_LIST_ARGS], { env });
135561
+ const codeBuddyFamily = target.host === "codebuddy" || target.host === "workbuddy";
135562
+ const listed = codeBuddyFamily ? (await runCodeBuddyRead(target, command2, CODEBUDDY_MARKETPLACE_LIST_ARGS, "codebuddy marketplace list", env, run6)).output : await run6(command2, [...CODEBUDDY_MARKETPLACE_LIST_ARGS], { env });
135562
135563
  const entries = parseJson2(listed.stdout, `${target.host} marketplace list`);
135563
135564
  if (!Array.isArray(entries)) throw new Error(`${target.host} marketplace list did not return an array`);
135564
135565
  if (!entries.some((entry) => entry?.name === target.marketplace)) return { installed: false };
135565
- exactCodeBuddyMarketplaceObservation(target, listed.stdout);
135566
+ exactCodeBuddyMarketplaceObservation(target, listed.stdout, { acceptedTypes: ["git", "github"] });
135566
135567
  const root = await resolveContained(env.CODEBUDDY_CONFIG_DIR, `plugins/marketplaces/${target.marketplace}`);
135567
135568
  return { installed: true, root, commit: await observeHubCheckout(target, root, env, run6) };
135568
135569
  }
@@ -135570,7 +135571,7 @@ async function runHubStructuredUpdate(target, detected, run6, { plan, root, veri
135570
135571
  const env = hostEnvironment(target.host);
135571
135572
  const codeBuddy = target.host === "codebuddy" || target.host === "workbuddy";
135572
135573
  const readPlugin = /* @__PURE__ */ __name(async () => {
135573
- const output = target.host === "codebuddy" ? (await runCodeBuddyRead(target, detected.command, CODEBUDDY_PLUGIN_LIST_ARGS, "codebuddy plugin list", env, run6)).output : await run6(detected.command, ["plugin", "list", "--json"], { env });
135574
+ const output = codeBuddy ? (await runCodeBuddyRead(target, detected.command, CODEBUDDY_PLUGIN_LIST_ARGS, "codebuddy plugin list", env, run6)).output : await run6(detected.command, ["plugin", "list", "--json"], { env });
135574
135575
  const listed = parseJson2(output.stdout, `${target.host} plugin list`);
135575
135576
  const entries = target.host === "codex" ? listed?.installed : listed;
135576
135577
  if (Array.isArray(entries) && entries.filter((entry) => (target.host === "codex" ? entry?.pluginId : entry?.id) === `${target.plugin}@${target.marketplace}`).length > 1) throw new Error(`${target.host} plugin list returned conflicting entries`);
@@ -135672,7 +135673,14 @@ async function runStructuredUpdate(target, detected, run6, {
135672
135673
  if (target.targetKind === "hub-backed") return runHubStructuredUpdate(target, detected, run6, { plan, root, verifyInstalledPayload });
135673
135674
  if (target.host === "codebuddy" || target.host === "workbuddy") {
135674
135675
  const env2 = hostEnvironment(target.host);
135675
- const listedObservation = target.host === "codebuddy" ? await runCodeBuddyRead(target, detected.command, CODEBUDDY_PLUGIN_LIST_ARGS, `${target.host} plugin list`, env2, run6) : { output: await run6(detected.command, [...CODEBUDDY_PLUGIN_LIST_ARGS], { env: env2 }), recovered: false };
135676
+ const listedObservation = await runCodeBuddyRead(
135677
+ target,
135678
+ detected.command,
135679
+ CODEBUDDY_PLUGIN_LIST_ARGS,
135680
+ `${target.host} plugin list`,
135681
+ env2,
135682
+ run6
135683
+ );
135676
135684
  const listed = listedObservation.output;
135677
135685
  const observed = exactPluginObservation(target, listed.stdout);
135678
135686
  if (target.sourceForm !== "bundled-family" || target.pluginRepo !== target.marketplaceRepo || target.pluginCommit !== target.marketplaceCommit) {
@@ -135755,7 +135763,14 @@ async function runStructuredUpdate(target, detected, run6, {
135755
135763
  pluginRecovered = true;
135756
135764
  }
135757
135765
  if (!pluginRecovered) {
135758
- const afterList = target.host === "codebuddy" ? await runCodeBuddyRead(target, detected.command, CODEBUDDY_PLUGIN_LIST_ARGS, `${target.host} plugin list`, env2, run6) : { output: await run6(detected.command, [...CODEBUDDY_PLUGIN_LIST_ARGS], { env: env2 }), recovered: false };
135766
+ const afterList = await runCodeBuddyRead(
135767
+ target,
135768
+ detected.command,
135769
+ CODEBUDDY_PLUGIN_LIST_ARGS,
135770
+ `${target.host} plugin list`,
135771
+ env2,
135772
+ run6
135773
+ );
135759
135774
  after2 = exactPluginObservation(target, afterList.output.stdout);
135760
135775
  }
135761
135776
  if (!after2.exact) throw new Error(`${target.host} did not update to the frozen plugin identity`);
@@ -28,9 +28,9 @@ description: "Discoverable entry point for release-skill: dependency and environ
28
28
 
29
29
  治理诊断只运行 release-skill 自己的只读检查程序,不运行目标 Skill、业务脚本、构建、hook 或发布动作,也不把 `prepare`、`verify`、`release-finish` 当作静态治理入口。用户要求实际接入或发布时,把已有授权带到对应原业务入口;各入口继续执行原有确认、副作用和状态机合同。
30
30
 
31
- ## 0.9.21 候选边界
31
+ ## 0.9.22 候选边界
32
32
 
33
- 当前 0.9.21 候选精确消费 Foundation 0.21.0 的公开包根 API。0.9.21 仍是源码候选,不能从本说明推断已批准、发布或验证。
33
+ 当前 0.9.22 候选精确消费 Foundation 0.21.0 的公开包根 API。0.9.22 仍是源码候选,不能从本说明推断已批准、发布或验证。
34
34
 
35
35
  冻结前,`prepare` 或新建 `ship` 状态可重复传入 `--unit <id>`;不传则选择全部单元。延期单元不进入计划,也不获得发布状态。完整配置、生成物新鲜度和顶层 Hook 仍覆盖全项目;`publicSourceAuthorityReceipt` 的 coordinator 与 subjects 必须共同选择。冻结后以 `plan.units` 为唯一范围,publish、reconcile、verify、distribute 不再接受 `--unit`。
36
36
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.21",
3
+ "version": "0.9.22",
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.21.",
22
+ "Prepare a release plan for version 0.9.22.",
23
23
  "Help me understand the release workflow."
24
24
  ]
25
25
  }
@@ -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.21"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.22"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "250625e18d802aeb764f43f469e6addbee46fa1b1a9fe1b672f1ccb8c98c0a81";
14
+ const __bundleSourceDigest = "45eaf443ea0ae412317287ca2fa661303666663c304c4691330b5ea1e700881d";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -135120,10 +135120,10 @@ function isCodeBuddyResidualEnvelope(error) {
135120
135120
  return envelope?.ok === false && envelope.exitStatus === 124 && envelope.processStatus === "TERMINATED" && envelope.terminationReason === "child_exit" && envelope.watchdogReason === "residual_process_group" && evidence?.childExitCode === 0 && (evidence.childSignal === null || evidence.childSignal === void 0) && evidence.residualGroupCleanupCompleted === true && evidence.forcedKill === false && evidence.outputLimitExceeded === null && Array.isArray(signals) && signals.length === 1 && signal?.signal === "SIGTERM" && signal.requestedMode === "process_group" && signal.successfulMode === "process_group";
135121
135121
  }
135122
135122
  function isCodeBuddyReadCommand(target, command2, args2) {
135123
- return target.host === "codebuddy" && (command2 === "codebuddy" || command2 === "cbc" || command2 === CODEBUDDY_MACOS_PATH) && Array.isArray(args2) && (args2.every((value, index) => value === CODEBUDDY_PLUGIN_LIST_ARGS[index]) && args2.length === CODEBUDDY_PLUGIN_LIST_ARGS.length || args2.every((value, index) => value === CODEBUDDY_MARKETPLACE_LIST_ARGS[index]) && args2.length === CODEBUDDY_MARKETPLACE_LIST_ARGS.length);
135123
+ return (target.host === "codebuddy" || target.host === "workbuddy") && (command2 === "codebuddy" || command2 === "cbc" || command2 === CODEBUDDY_MACOS_PATH) && Array.isArray(args2) && (args2.every((value, index) => value === CODEBUDDY_PLUGIN_LIST_ARGS[index]) && args2.length === CODEBUDDY_PLUGIN_LIST_ARGS.length || args2.every((value, index) => value === CODEBUDDY_MARKETPLACE_LIST_ARGS[index]) && args2.length === CODEBUDDY_MARKETPLACE_LIST_ARGS.length);
135124
135124
  }
135125
135125
  function isCodeBuddyWriteCommand(target, command2, args2, kind) {
135126
- if (target.host !== "codebuddy" || !["codebuddy", "cbc", CODEBUDDY_MACOS_PATH].includes(command2)) return false;
135126
+ if (!["codebuddy", "workbuddy"].includes(target.host) || !["codebuddy", "cbc", CODEBUDDY_MACOS_PATH].includes(command2)) return false;
135127
135127
  const expected = kind === "marketplace-update" ? ["plugin", "marketplace", "update", target.marketplace] : ["plugin", "update", `${target.plugin}@${target.marketplace}`, "--scope", "user"];
135128
135128
  return Array.isArray(args2) && args2.length === expected.length && args2.every((value, index) => value === expected[index]);
135129
135129
  }
@@ -135141,14 +135141,14 @@ async function runCodeBuddyRead(target, command2, args2, label, env, run6) {
135141
135141
  };
135142
135142
  }
135143
135143
  }
135144
- function exactCodeBuddyMarketplaceObservation(target, stdout) {
135144
+ function exactCodeBuddyMarketplaceObservation(target, stdout, { acceptedTypes = ["git"] } = {}) {
135145
135145
  const parsed = parseJson2(stdout, `${target.host} marketplace list`);
135146
135146
  if (!Array.isArray(parsed)) throw new Error(`${target.host} marketplace list did not return an array`);
135147
135147
  const matches = parsed.filter((entry) => entry?.name === target.marketplace);
135148
135148
  if (matches.length !== 1) {
135149
135149
  throw new Error(`${target.host} marketplace list did not contain exactly one ${target.marketplace}`);
135150
135150
  }
135151
- if (matches[0].type !== "git") {
135151
+ if (!acceptedTypes.includes(matches[0].type)) {
135152
135152
  throw new Error(`${target.host} marketplace ${target.marketplace} is not a git marketplace`);
135153
135153
  }
135154
135154
  return { installed: true, exact: true, found: matches[0] };
@@ -135558,11 +135558,12 @@ async function observeHubMarketplace(target, command2, env, run6) {
135558
135558
  if (!observed.installed) return observed;
135559
135559
  return { ...observed, commit: await observeHubCheckout(target, observed.root, env, run6) };
135560
135560
  }
135561
- const listed = target.host === "codebuddy" ? (await runCodeBuddyRead(target, command2, CODEBUDDY_MARKETPLACE_LIST_ARGS, "codebuddy marketplace list", env, run6)).output : await run6(command2, [...CODEBUDDY_MARKETPLACE_LIST_ARGS], { env });
135561
+ const codeBuddyFamily = target.host === "codebuddy" || target.host === "workbuddy";
135562
+ const listed = codeBuddyFamily ? (await runCodeBuddyRead(target, command2, CODEBUDDY_MARKETPLACE_LIST_ARGS, "codebuddy marketplace list", env, run6)).output : await run6(command2, [...CODEBUDDY_MARKETPLACE_LIST_ARGS], { env });
135562
135563
  const entries = parseJson2(listed.stdout, `${target.host} marketplace list`);
135563
135564
  if (!Array.isArray(entries)) throw new Error(`${target.host} marketplace list did not return an array`);
135564
135565
  if (!entries.some((entry) => entry?.name === target.marketplace)) return { installed: false };
135565
- exactCodeBuddyMarketplaceObservation(target, listed.stdout);
135566
+ exactCodeBuddyMarketplaceObservation(target, listed.stdout, { acceptedTypes: ["git", "github"] });
135566
135567
  const root = await resolveContained(env.CODEBUDDY_CONFIG_DIR, `plugins/marketplaces/${target.marketplace}`);
135567
135568
  return { installed: true, root, commit: await observeHubCheckout(target, root, env, run6) };
135568
135569
  }
@@ -135570,7 +135571,7 @@ async function runHubStructuredUpdate(target, detected, run6, { plan, root, veri
135570
135571
  const env = hostEnvironment(target.host);
135571
135572
  const codeBuddy = target.host === "codebuddy" || target.host === "workbuddy";
135572
135573
  const readPlugin = /* @__PURE__ */ __name(async () => {
135573
- const output = target.host === "codebuddy" ? (await runCodeBuddyRead(target, detected.command, CODEBUDDY_PLUGIN_LIST_ARGS, "codebuddy plugin list", env, run6)).output : await run6(detected.command, ["plugin", "list", "--json"], { env });
135574
+ const output = codeBuddy ? (await runCodeBuddyRead(target, detected.command, CODEBUDDY_PLUGIN_LIST_ARGS, "codebuddy plugin list", env, run6)).output : await run6(detected.command, ["plugin", "list", "--json"], { env });
135574
135575
  const listed = parseJson2(output.stdout, `${target.host} plugin list`);
135575
135576
  const entries = target.host === "codex" ? listed?.installed : listed;
135576
135577
  if (Array.isArray(entries) && entries.filter((entry) => (target.host === "codex" ? entry?.pluginId : entry?.id) === `${target.plugin}@${target.marketplace}`).length > 1) throw new Error(`${target.host} plugin list returned conflicting entries`);
@@ -135672,7 +135673,14 @@ async function runStructuredUpdate(target, detected, run6, {
135672
135673
  if (target.targetKind === "hub-backed") return runHubStructuredUpdate(target, detected, run6, { plan, root, verifyInstalledPayload });
135673
135674
  if (target.host === "codebuddy" || target.host === "workbuddy") {
135674
135675
  const env2 = hostEnvironment(target.host);
135675
- const listedObservation = target.host === "codebuddy" ? await runCodeBuddyRead(target, detected.command, CODEBUDDY_PLUGIN_LIST_ARGS, `${target.host} plugin list`, env2, run6) : { output: await run6(detected.command, [...CODEBUDDY_PLUGIN_LIST_ARGS], { env: env2 }), recovered: false };
135676
+ const listedObservation = await runCodeBuddyRead(
135677
+ target,
135678
+ detected.command,
135679
+ CODEBUDDY_PLUGIN_LIST_ARGS,
135680
+ `${target.host} plugin list`,
135681
+ env2,
135682
+ run6
135683
+ );
135676
135684
  const listed = listedObservation.output;
135677
135685
  const observed = exactPluginObservation(target, listed.stdout);
135678
135686
  if (target.sourceForm !== "bundled-family" || target.pluginRepo !== target.marketplaceRepo || target.pluginCommit !== target.marketplaceCommit) {
@@ -135755,7 +135763,14 @@ async function runStructuredUpdate(target, detected, run6, {
135755
135763
  pluginRecovered = true;
135756
135764
  }
135757
135765
  if (!pluginRecovered) {
135758
- const afterList = target.host === "codebuddy" ? await runCodeBuddyRead(target, detected.command, CODEBUDDY_PLUGIN_LIST_ARGS, `${target.host} plugin list`, env2, run6) : { output: await run6(detected.command, [...CODEBUDDY_PLUGIN_LIST_ARGS], { env: env2 }), recovered: false };
135766
+ const afterList = await runCodeBuddyRead(
135767
+ target,
135768
+ detected.command,
135769
+ CODEBUDDY_PLUGIN_LIST_ARGS,
135770
+ `${target.host} plugin list`,
135771
+ env2,
135772
+ run6
135773
+ );
135759
135774
  after2 = exactPluginObservation(target, afterList.output.stdout);
135760
135775
  }
135761
135776
  if (!after2.exact) throw new Error(`${target.host} did not update to the frozen plugin identity`);
@@ -35,9 +35,9 @@ description: "Discoverable entry point for release-skill: dependency and environ
35
35
 
36
36
  治理诊断只运行 release-skill 自己的只读检查程序,不运行目标 Skill、业务脚本、构建、hook 或发布动作,也不把 `prepare`、`verify`、`release-finish` 当作静态治理入口。用户要求实际接入或发布时,把已有授权带到对应原业务入口;各入口继续执行原有确认、副作用和状态机合同。
37
37
 
38
- ## 0.9.21 候选边界
38
+ ## 0.9.22 候选边界
39
39
 
40
- 当前 0.9.21 候选精确消费 Foundation 0.21.0 的公开包根 API。0.9.21 仍是源码候选,不能从本说明推断已批准、发布或验证。
40
+ 当前 0.9.22 候选精确消费 Foundation 0.21.0 的公开包根 API。0.9.22 仍是源码候选,不能从本说明推断已批准、发布或验证。
41
41
 
42
42
  冻结前,`prepare` 或新建 `ship` 状态可重复传入 `--unit <id>`;不传则选择全部单元。延期单元不进入计划,也不获得发布状态。完整配置、生成物新鲜度和顶层 Hook 仍覆盖全项目;`publicSourceAuthorityReceipt` 的 coordinator 与 subjects 必须共同选择。冻结后以 `plan.units` 为唯一范围,publish、reconcile、verify、distribute 不再接受 `--unit`。
43
43
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.21",
3
+ "version": "0.9.22",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"