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.
- package/.claude-plugin/plugin.json +1 -1
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.cursor-plugin/plugin.json +1 -1
- package/.kimi-plugin/plugin.json +1 -1
- package/.qoder-plugin/plugin.json +1 -1
- package/CHANGELOG.md +26 -0
- package/INSTALL.md +2 -2
- package/INSTALL.zh-CN.md +2 -2
- package/README.md +12 -14
- package/README.zh-CN.md +12 -14
- package/adapters/claude/.claude-plugin/plugin.json +1 -1
- package/adapters/claude/bin/release-skill.bundle.mjs +26 -11
- package/adapters/claude/skills/release-help/SKILL.md +2 -2
- package/adapters/codex/.codex-plugin/plugin.json +2 -2
- package/adapters/codex/bin/release-skill.bundle.mjs +26 -11
- package/adapters/codex/skills/release-help/SKILL.md +2 -2
- package/adapters/cursor/.cursor-plugin/plugin.json +1 -1
- package/adapters/cursor/bin/release-skill.bundle.mjs +26 -11
- package/adapters/cursor/skills/release-help/SKILL.md +2 -2
- package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
- package/adapters/kimi/bin/release-skill.bundle.mjs +26 -11
- package/adapters/kimi/skills/release-help/SKILL.md +2 -2
- package/adapters/qoder/.qoder-plugin/plugin.json +1 -1
- package/adapters/qoder/bin/release-skill.bundle.mjs +26 -11
- package/adapters/qoder/skills/release-help/SKILL.md +2 -2
- package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
- package/adapters/workbuddy/bin/release-skill.bundle.mjs +26 -11
- package/adapters/workbuddy/skills/release-help/SKILL.md +2 -2
- package/bin/release-skill.bundle.mjs +26 -11
- package/package.json +1 -1
- package/platform-manifest.json +4 -4
- package/skills/release-help/SKILL.md +2 -2
- package/skills-src/release-help/SKILL.md +2 -2
- package/src/commands/post-release-local.mjs +24 -13
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "release-skill",
|
|
3
|
-
"version": "0.9.
|
|
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.
|
|
22
|
+
"Prepare a release plan for version 0.9.22.",
|
|
23
23
|
"Help me understand the release workflow."
|
|
24
24
|
]
|
|
25
25
|
}
|
package/.kimi-plugin/plugin.json
CHANGED
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
17
|
+
**0.9.22** (2026-09-17)
|
|
18
18
|
|
|
19
|
-
0.9.
|
|
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
|
-
-
|
|
25
|
-
-
|
|
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
|
-
-
|
|
35
|
-
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
11
|
+
**0.9.22** (2026-09-17)
|
|
12
12
|
|
|
13
|
-
0.9.
|
|
13
|
+
0.9.22 是一个本地源码候选,修复 0.9.21 真实宿主收尾暴露的两处问题。CodeBuddy 与 WorkBuddy 继续使用同一份冻结 Hub 身份和安装载荷检查。Foundation 依赖保持固定为 0.21.0。本说明不代表已经发布、完成真实宿主验收、完成消费者安装验证或通过独立验收。
|
|
14
14
|
|
|
15
15
|
**安全**
|
|
16
16
|
|
|
17
17
|
- Hub 发布继续绑定已观察的分支头执行比较后写入。部分发布时不回滚、不覆盖已经成功的远端步骤。
|
|
18
|
-
-
|
|
19
|
-
-
|
|
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
|
-
-
|
|
29
|
-
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 使用冻结
|
|
@@ -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.
|
|
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 = "
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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.
|
|
31
|
+
## 0.9.22 候选边界
|
|
32
32
|
|
|
33
|
-
当前 0.9.
|
|
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.
|
|
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.
|
|
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.
|
|
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 = "
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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.
|
|
38
|
+
## 0.9.22 候选边界
|
|
39
39
|
|
|
40
|
-
当前 0.9.
|
|
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
|
|