release-skill 0.9.25 → 0.9.27

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 (43) 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 +50 -0
  8. package/INSTALL.md +2 -2
  9. package/INSTALL.zh-CN.md +2 -2
  10. package/README.md +16 -15
  11. package/README.zh-CN.md +18 -16
  12. package/adapters/claude/.claude-plugin/plugin.json +1 -1
  13. package/adapters/claude/bin/release-skill.bundle.mjs +14 -6
  14. package/adapters/claude/skills/release-help/SKILL.md +7 -5
  15. package/adapters/claude/skills/release-prepare/SKILL.md +2 -2
  16. package/adapters/codex/.codex-plugin/plugin.json +2 -2
  17. package/adapters/codex/bin/release-skill.bundle.mjs +14 -6
  18. package/adapters/codex/skills/release-help/SKILL.md +7 -5
  19. package/adapters/codex/skills/release-prepare/SKILL.md +2 -2
  20. package/adapters/cursor/.cursor-plugin/plugin.json +1 -1
  21. package/adapters/cursor/bin/release-skill.bundle.mjs +14 -6
  22. package/adapters/cursor/skills/release-help/SKILL.md +7 -5
  23. package/adapters/cursor/skills/release-prepare/SKILL.md +2 -2
  24. package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
  25. package/adapters/kimi/bin/release-skill.bundle.mjs +14 -6
  26. package/adapters/kimi/skills/release-help/SKILL.md +7 -5
  27. package/adapters/kimi/skills/release-prepare/SKILL.md +2 -2
  28. package/adapters/qoder/.qoder-plugin/plugin.json +1 -1
  29. package/adapters/qoder/bin/release-skill.bundle.mjs +14 -6
  30. package/adapters/qoder/skills/release-help/SKILL.md +7 -5
  31. package/adapters/qoder/skills/release-prepare/SKILL.md +2 -2
  32. package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
  33. package/adapters/workbuddy/bin/release-skill.bundle.mjs +14 -6
  34. package/adapters/workbuddy/skills/release-help/SKILL.md +7 -5
  35. package/adapters/workbuddy/skills/release-prepare/SKILL.md +2 -2
  36. package/bin/release-skill.bundle.mjs +14 -6
  37. package/package.json +1 -1
  38. package/platform-manifest.json +4 -4
  39. package/skills/release-help/SKILL.md +7 -5
  40. package/skills/release-prepare/SKILL.md +2 -2
  41. package/skills-src/release-help/SKILL.md +7 -5
  42. package/skills-src/release-prepare/SKILL.md +2 -2
  43. package/src/commands/post-release-local.mjs +14 -4
@@ -38,15 +38,17 @@ description: "Discoverable entry point for release-skill: dependency and environ
38
38
 
39
39
  治理诊断只运行 release-skill 自己的只读检查程序,不运行目标 Skill、业务脚本、构建、hook 或发布动作,也不把 `prepare`、`verify`、`release-finish` 当作静态治理入口。用户要求实际接入或发布时,把已有授权带到对应原业务入口;各入口继续执行原有确认、副作用和状态机合同。
40
40
 
41
- ## 0.9.25 候选边界
41
+ ## 0.9.27 能力与证据边界
42
42
 
43
- 当前 0.9.25 候选精确消费 Foundation 0.22.0 的公开包根 API。0.9.25 仍是源码候选,不能从本说明推断已批准、发布或验证。
43
+ release-skill 0.9.27 精确依赖 Foundation 0.22.0 的公开包根 API。本版修复 Kimi 本机宿主观察:受管插件根只有 kimi.plugin.json、没有 package.json 时不再失败。本节说明当前版本的能力范围与证据边界;批准、发布和验证状态以对应计划、批准及执行记录为准,不能由本说明推断。
44
44
 
45
- 冻结前,`prepare` 或新建 `ship` 状态可重复传入 `--unit <id>`;不传则选择全部单元。延期单元不进入计划,也不获得发布状态。完整配置、生成物新鲜度和顶层 Hook 仍覆盖全项目;`publicSourceAuthorityReceipt` 的 coordinator 与 subjects 必须共同选择。冻结后以 `plan.units` 为唯一范围,publish、reconcile、verify、distribute 不再接受 `--unit`。
45
+ 在冻结前,`prepare` 或新建 `ship` 状态时可重复传入 `--unit <id>`;未传入则默认选择全部单元。延期单元不进入发布计划,亦不获得发布状态。完整配置、生成物新鲜度检查及顶层 Hook 仍作用于全项目范围。`publicSourceAuthorityReceipt` 的 coordinator 与全部 subjects 必须共同选择。
46
46
 
47
- 每个单元都要声明 `previousPublicBaseline`:确认没有前序版本才用 `none`,否则使用带 repo/ref/commit 的 `bound`。`none` 不绕过 publish 的唯一性预检。
47
+ 冻结后,发布流程(publish、reconcile、verify、distribute)不再接受 `--unit` 参数,仅以 `plan.units` 为唯一有效范围。
48
48
 
49
- Hook cache v2 只复用绝对路径,或已用真实 cwd 核验的 cwd-relative executable identity;裸 PATH、PATHEXT、Windows 或观察不可用时冷执行,并失败关闭。稳定隔离安装树只在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接只记录、不跟随,声明载荷中的 symlink 失败关闭。
49
+ 每个单元必须声明 `previousPublicBaseline`:只有确认没有前序公开版本时,才使用 `none`;否则必须提供 `bound`,并包含 `repo/ref/commit` 信息。`none` 不绕过 publish 阶段的唯一性预检。
50
+
51
+ Hook 缓存 v2 仅复用绝对路径,或已通过真实 cwd 核验的 cwd-relative 可执行文件身份;若依赖裸 PATH、PATHEXT、Windows 环境或观察不可用,将触发冷执行并失败关闭。稳定隔离安装树仅在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接仅记录,不跟随;声明载荷中出现 symlink 将导致失败关闭。
50
52
 
51
53
  ## 最短路径
52
54
 
@@ -21,7 +21,7 @@ description: Freeze an immutable release plan with local configuration, document
21
21
 
22
22
  运行项目构建/测试 hook,生成公开快照并扫描泄漏,冻结不可变发布计划。prepare 自身不调用发布 adapter,但会执行用户配置的 hook。
23
23
 
24
- 0.9.4 候选允许多发布单元项目在冻结前显式选择本轮范围。`--unit <id>` 可以重复传入;未传时仍选择全部单元。显式选择只跳过延期单元的单元级工作,完整配置校验、生成物新鲜度和顶层 Hook 仍全部执行。计划冻结后以 `plan.units` 为唯一范围权威,publish、reconcile、verify 和 distribute 不接受单元选择。
24
+ 自 0.9.4 起,多发布单元项目可在计划冻结前显式指定本轮发布范围。重复传入 `--unit <id>` 可选择多个单元;未传入该参数时,默认选择全部单元。显式选择只跳过延期单元的单元级工作;完整配置校验、生成物新鲜度检查及顶层 Hook 仍全部执行。冻结后,`plan.units` 是唯一范围权威,publish、reconcile、verify 和 distribute 不再接受单元选择。
25
25
 
26
26
  0.9.3 引入的 Hook cache v2 继续只复用有完整身份和输入证据的成功 Hook 结果。裸 PATH、PATHEXT、Windows、TTL、损坏记录或 Foundation 观察不可用时,缓存保持失败关闭,Hook 仍按完整路径冷执行;该机制不改变 prepare 的计划、批准和发布权威。
27
27
 
@@ -39,7 +39,7 @@ description: Freeze an immutable release plan with local configuration, document
39
39
 
40
40
  **发布文档新鲜度门**: 配置了 `releaseDocuments` 的单元在 hook 授权门前先执行同一只读规划器:`clean` 继续;`changes` 抛 `RELEASE_DOCS_STALE`,详情列出相对路径、语种、`refreshDigest` 和精确演练/写入参数数组。prepare 只检查、不写工作树。正式 prepare 前先运行只读演练;有变化时向用户展示文件/语种/版本/`refreshDigest`,只有在用户明确授权"本地发布文档写入"后,才执行带 `--write --confirm-refresh <refreshDigest> --ack-local-document-write` 三项绑定的写入,随后运行聚焦校验,要求维护者审阅并提交刷新结果,再重新 prepare。该授权不扩展为 hook、提交、push 或 publish 授权。
41
41
 
42
- **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才把这些 ID 逐个传给 `--unit`。release-skill 不根据失败自动排除单元。选择命中 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须包含收据声明的完整单元闭包;缺少单元时按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
42
+ **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才逐个传入 `--unit`;不得根据失败自动排除单元。选中的单元包含 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须同时包含收据声明的完整单元闭包。缺少单元时,按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
43
43
 
44
44
  ## 正向执行路径
45
45
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.25",
3
+ "version": "0.9.27",
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.25"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.27"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "42145a246d5fd5adff3a1218e94fbfc06df377290431628aa3270e2414b8183e";
14
+ const __bundleSourceDigest = "25d576aeb1a7c01598399f326190124dbdd91b562e32ad4d9a532e3399654151";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -135457,6 +135457,7 @@ function hostEnvironment(host, { kimiHome } = {}) {
135457
135457
  if (host === "workbuddy") {
135458
135458
  env.CODEBUDDY_CONFIG_DIR = join29(env.HOME, ".workbuddy");
135459
135459
  env.WORKBUDDY_CONFIG_DIR = join29(env.HOME, ".workbuddy");
135460
+ env.CODEBUDDY_FORCE_LITE_WB_BUNDLE = "1";
135460
135461
  }
135461
135462
  if (host === "kimi" && kimiHome) env.KIMI_CODE_HOME = kimiHome;
135462
135463
  return env;
@@ -136644,10 +136645,17 @@ async function observeKimiTarget(target, kimiHome, run6) {
136644
136645
  const pluginRoot = await resolveContained(managedRoot, target.plugin);
136645
136646
  const declaredRoot = await resolveContained(managedRoot, relative28(managedRoot, entry.root));
136646
136647
  if (declaredRoot !== pluginRoot) throw new Error("Kimi installed plugin root does not match its managed root");
136647
- const packageJson = parseJson2(
136648
- await readFileContained(pluginRoot, "package.json", { encoding: "utf8" }),
136649
- "Kimi installed package manifest"
136650
- );
136648
+ let manifestText;
136649
+ let manifestLabel = "Kimi installed package manifest";
136650
+ try {
136651
+ manifestText = await readFileContained(pluginRoot, "package.json", { encoding: "utf8" });
136652
+ } catch (error) {
136653
+ const missing = error?.code === "ENOENT" || error?.details?.causeCode === "ENOENT" || error?.details?.kind === "missing-resource";
136654
+ if (!missing) throw error;
136655
+ manifestLabel = "Kimi installed plugin manifest";
136656
+ manifestText = await readFileContained(pluginRoot, "kimi.plugin.json", { encoding: "utf8" });
136657
+ }
136658
+ const packageJson = parseJson2(manifestText, manifestLabel);
136651
136659
  const refName = entry.github.ref?.kind === "tag" ? entry.github.ref.value : void 0;
136652
136660
  const revision = entry.github.installedSha;
136653
136661
  let gitHeadExact = true;
@@ -37,15 +37,17 @@ description: "Discoverable entry point for release-skill: dependency and environ
37
37
 
38
38
  治理诊断只运行 release-skill 自己的只读检查程序,不运行目标 Skill、业务脚本、构建、hook 或发布动作,也不把 `prepare`、`verify`、`release-finish` 当作静态治理入口。用户要求实际接入或发布时,把已有授权带到对应原业务入口;各入口继续执行原有确认、副作用和状态机合同。
39
39
 
40
- ## 0.9.25 候选边界
40
+ ## 0.9.27 能力与证据边界
41
41
 
42
- 当前 0.9.25 候选精确消费 Foundation 0.22.0 的公开包根 API。0.9.25 仍是源码候选,不能从本说明推断已批准、发布或验证。
42
+ release-skill 0.9.27 精确依赖 Foundation 0.22.0 的公开包根 API。本版修复 Kimi 本机宿主观察:受管插件根只有 kimi.plugin.json、没有 package.json 时不再失败。本节说明当前版本的能力范围与证据边界;批准、发布和验证状态以对应计划、批准及执行记录为准,不能由本说明推断。
43
43
 
44
- 冻结前,`prepare` 或新建 `ship` 状态可重复传入 `--unit <id>`;不传则选择全部单元。延期单元不进入计划,也不获得发布状态。完整配置、生成物新鲜度和顶层 Hook 仍覆盖全项目;`publicSourceAuthorityReceipt` 的 coordinator 与 subjects 必须共同选择。冻结后以 `plan.units` 为唯一范围,publish、reconcile、verify、distribute 不再接受 `--unit`。
44
+ 在冻结前,`prepare` 或新建 `ship` 状态时可重复传入 `--unit <id>`;未传入则默认选择全部单元。延期单元不进入发布计划,亦不获得发布状态。完整配置、生成物新鲜度检查及顶层 Hook 仍作用于全项目范围。`publicSourceAuthorityReceipt` 的 coordinator 与全部 subjects 必须共同选择。
45
45
 
46
- 每个单元都要声明 `previousPublicBaseline`:确认没有前序版本才用 `none`,否则使用带 repo/ref/commit 的 `bound`。`none` 不绕过 publish 的唯一性预检。
46
+ 冻结后,发布流程(publish、reconcile、verify、distribute)不再接受 `--unit` 参数,仅以 `plan.units` 为唯一有效范围。
47
47
 
48
- Hook cache v2 只复用绝对路径,或已用真实 cwd 核验的 cwd-relative executable identity;裸 PATH、PATHEXT、Windows 或观察不可用时冷执行,并失败关闭。稳定隔离安装树只在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接只记录、不跟随,声明载荷中的 symlink 失败关闭。
48
+ 每个单元必须声明 `previousPublicBaseline`:只有确认没有前序公开版本时,才使用 `none`;否则必须提供 `bound`,并包含 `repo/ref/commit` 信息。`none` 不绕过 publish 阶段的唯一性预检。
49
+
50
+ Hook 缓存 v2 仅复用绝对路径,或已通过真实 cwd 核验的 cwd-relative 可执行文件身份;若依赖裸 PATH、PATHEXT、Windows 环境或观察不可用,将触发冷执行并失败关闭。稳定隔离安装树仅在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接仅记录,不跟随;声明载荷中出现 symlink 将导致失败关闭。
49
51
 
50
52
  ## 最短路径
51
53
 
@@ -20,7 +20,7 @@ description: Freeze an immutable release plan with local configuration, document
20
20
 
21
21
  运行项目构建/测试 hook,生成公开快照并扫描泄漏,冻结不可变发布计划。prepare 自身不调用发布 adapter,但会执行用户配置的 hook。
22
22
 
23
- 0.9.4 候选允许多发布单元项目在冻结前显式选择本轮范围。`--unit <id>` 可以重复传入;未传时仍选择全部单元。显式选择只跳过延期单元的单元级工作,完整配置校验、生成物新鲜度和顶层 Hook 仍全部执行。计划冻结后以 `plan.units` 为唯一范围权威,publish、reconcile、verify 和 distribute 不接受单元选择。
23
+ 自 0.9.4 起,多发布单元项目可在计划冻结前显式指定本轮发布范围。重复传入 `--unit <id>` 可选择多个单元;未传入该参数时,默认选择全部单元。显式选择只跳过延期单元的单元级工作;完整配置校验、生成物新鲜度检查及顶层 Hook 仍全部执行。冻结后,`plan.units` 是唯一范围权威,publish、reconcile、verify 和 distribute 不再接受单元选择。
24
24
 
25
25
  0.9.3 引入的 Hook cache v2 继续只复用有完整身份和输入证据的成功 Hook 结果。裸 PATH、PATHEXT、Windows、TTL、损坏记录或 Foundation 观察不可用时,缓存保持失败关闭,Hook 仍按完整路径冷执行;该机制不改变 prepare 的计划、批准和发布权威。
26
26
 
@@ -38,7 +38,7 @@ description: Freeze an immutable release plan with local configuration, document
38
38
 
39
39
  **发布文档新鲜度门**: 配置了 `releaseDocuments` 的单元在 hook 授权门前先执行同一只读规划器:`clean` 继续;`changes` 抛 `RELEASE_DOCS_STALE`,详情列出相对路径、语种、`refreshDigest` 和精确演练/写入参数数组。prepare 只检查、不写工作树。正式 prepare 前先运行只读演练;有变化时向用户展示文件/语种/版本/`refreshDigest`,只有在用户明确授权"本地发布文档写入"后,才执行带 `--write --confirm-refresh <refreshDigest> --ack-local-document-write` 三项绑定的写入,随后运行聚焦校验,要求维护者审阅并提交刷新结果,再重新 prepare。该授权不扩展为 hook、提交、push 或 publish 授权。
40
40
 
41
- **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才把这些 ID 逐个传给 `--unit`。release-skill 不根据失败自动排除单元。选择命中 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须包含收据声明的完整单元闭包;缺少单元时按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
41
+ **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才逐个传入 `--unit`;不得根据失败自动排除单元。选中的单元包含 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须同时包含收据声明的完整单元闭包。缺少单元时,按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
42
42
 
43
43
  ## 正向执行路径
44
44
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.25",
3
+ "version": "0.9.27",
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.25"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.27"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "42145a246d5fd5adff3a1218e94fbfc06df377290431628aa3270e2414b8183e";
14
+ const __bundleSourceDigest = "25d576aeb1a7c01598399f326190124dbdd91b562e32ad4d9a532e3399654151";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -135457,6 +135457,7 @@ function hostEnvironment(host, { kimiHome } = {}) {
135457
135457
  if (host === "workbuddy") {
135458
135458
  env.CODEBUDDY_CONFIG_DIR = join29(env.HOME, ".workbuddy");
135459
135459
  env.WORKBUDDY_CONFIG_DIR = join29(env.HOME, ".workbuddy");
135460
+ env.CODEBUDDY_FORCE_LITE_WB_BUNDLE = "1";
135460
135461
  }
135461
135462
  if (host === "kimi" && kimiHome) env.KIMI_CODE_HOME = kimiHome;
135462
135463
  return env;
@@ -136644,10 +136645,17 @@ async function observeKimiTarget(target, kimiHome, run6) {
136644
136645
  const pluginRoot = await resolveContained(managedRoot, target.plugin);
136645
136646
  const declaredRoot = await resolveContained(managedRoot, relative28(managedRoot, entry.root));
136646
136647
  if (declaredRoot !== pluginRoot) throw new Error("Kimi installed plugin root does not match its managed root");
136647
- const packageJson = parseJson2(
136648
- await readFileContained(pluginRoot, "package.json", { encoding: "utf8" }),
136649
- "Kimi installed package manifest"
136650
- );
136648
+ let manifestText;
136649
+ let manifestLabel = "Kimi installed package manifest";
136650
+ try {
136651
+ manifestText = await readFileContained(pluginRoot, "package.json", { encoding: "utf8" });
136652
+ } catch (error) {
136653
+ const missing = error?.code === "ENOENT" || error?.details?.causeCode === "ENOENT" || error?.details?.kind === "missing-resource";
136654
+ if (!missing) throw error;
136655
+ manifestLabel = "Kimi installed plugin manifest";
136656
+ manifestText = await readFileContained(pluginRoot, "kimi.plugin.json", { encoding: "utf8" });
136657
+ }
136658
+ const packageJson = parseJson2(manifestText, manifestLabel);
136651
136659
  const refName = entry.github.ref?.kind === "tag" ? entry.github.ref.value : void 0;
136652
136660
  const revision = entry.github.installedSha;
136653
136661
  let gitHeadExact = true;
@@ -37,15 +37,17 @@ description: "Discoverable entry point for release-skill: dependency and environ
37
37
 
38
38
  治理诊断只运行 release-skill 自己的只读检查程序,不运行目标 Skill、业务脚本、构建、hook 或发布动作,也不把 `prepare`、`verify`、`release-finish` 当作静态治理入口。用户要求实际接入或发布时,把已有授权带到对应原业务入口;各入口继续执行原有确认、副作用和状态机合同。
39
39
 
40
- ## 0.9.25 候选边界
40
+ ## 0.9.27 能力与证据边界
41
41
 
42
- 当前 0.9.25 候选精确消费 Foundation 0.22.0 的公开包根 API。0.9.25 仍是源码候选,不能从本说明推断已批准、发布或验证。
42
+ release-skill 0.9.27 精确依赖 Foundation 0.22.0 的公开包根 API。本版修复 Kimi 本机宿主观察:受管插件根只有 kimi.plugin.json、没有 package.json 时不再失败。本节说明当前版本的能力范围与证据边界;批准、发布和验证状态以对应计划、批准及执行记录为准,不能由本说明推断。
43
43
 
44
- 冻结前,`prepare` 或新建 `ship` 状态可重复传入 `--unit <id>`;不传则选择全部单元。延期单元不进入计划,也不获得发布状态。完整配置、生成物新鲜度和顶层 Hook 仍覆盖全项目;`publicSourceAuthorityReceipt` 的 coordinator 与 subjects 必须共同选择。冻结后以 `plan.units` 为唯一范围,publish、reconcile、verify、distribute 不再接受 `--unit`。
44
+ 在冻结前,`prepare` 或新建 `ship` 状态时可重复传入 `--unit <id>`;未传入则默认选择全部单元。延期单元不进入发布计划,亦不获得发布状态。完整配置、生成物新鲜度检查及顶层 Hook 仍作用于全项目范围。`publicSourceAuthorityReceipt` 的 coordinator 与全部 subjects 必须共同选择。
45
45
 
46
- 每个单元都要声明 `previousPublicBaseline`:确认没有前序版本才用 `none`,否则使用带 repo/ref/commit 的 `bound`。`none` 不绕过 publish 的唯一性预检。
46
+ 冻结后,发布流程(publish、reconcile、verify、distribute)不再接受 `--unit` 参数,仅以 `plan.units` 为唯一有效范围。
47
47
 
48
- Hook cache v2 只复用绝对路径,或已用真实 cwd 核验的 cwd-relative executable identity;裸 PATH、PATHEXT、Windows 或观察不可用时冷执行,并失败关闭。稳定隔离安装树只在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接只记录、不跟随,声明载荷中的 symlink 失败关闭。
48
+ 每个单元必须声明 `previousPublicBaseline`:只有确认没有前序公开版本时,才使用 `none`;否则必须提供 `bound`,并包含 `repo/ref/commit` 信息。`none` 不绕过 publish 阶段的唯一性预检。
49
+
50
+ Hook 缓存 v2 仅复用绝对路径,或已通过真实 cwd 核验的 cwd-relative 可执行文件身份;若依赖裸 PATH、PATHEXT、Windows 环境或观察不可用,将触发冷执行并失败关闭。稳定隔离安装树仅在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接仅记录,不跟随;声明载荷中出现 symlink 将导致失败关闭。
49
51
 
50
52
  ## 最短路径
51
53
 
@@ -20,7 +20,7 @@ description: Freeze an immutable release plan with local configuration, document
20
20
 
21
21
  运行项目构建/测试 hook,生成公开快照并扫描泄漏,冻结不可变发布计划。prepare 自身不调用发布 adapter,但会执行用户配置的 hook。
22
22
 
23
- 0.9.4 候选允许多发布单元项目在冻结前显式选择本轮范围。`--unit <id>` 可以重复传入;未传时仍选择全部单元。显式选择只跳过延期单元的单元级工作,完整配置校验、生成物新鲜度和顶层 Hook 仍全部执行。计划冻结后以 `plan.units` 为唯一范围权威,publish、reconcile、verify 和 distribute 不接受单元选择。
23
+ 自 0.9.4 起,多发布单元项目可在计划冻结前显式指定本轮发布范围。重复传入 `--unit <id>` 可选择多个单元;未传入该参数时,默认选择全部单元。显式选择只跳过延期单元的单元级工作;完整配置校验、生成物新鲜度检查及顶层 Hook 仍全部执行。冻结后,`plan.units` 是唯一范围权威,publish、reconcile、verify 和 distribute 不再接受单元选择。
24
24
 
25
25
  0.9.3 引入的 Hook cache v2 继续只复用有完整身份和输入证据的成功 Hook 结果。裸 PATH、PATHEXT、Windows、TTL、损坏记录或 Foundation 观察不可用时,缓存保持失败关闭,Hook 仍按完整路径冷执行;该机制不改变 prepare 的计划、批准和发布权威。
26
26
 
@@ -38,7 +38,7 @@ description: Freeze an immutable release plan with local configuration, document
38
38
 
39
39
  **发布文档新鲜度门**: 配置了 `releaseDocuments` 的单元在 hook 授权门前先执行同一只读规划器:`clean` 继续;`changes` 抛 `RELEASE_DOCS_STALE`,详情列出相对路径、语种、`refreshDigest` 和精确演练/写入参数数组。prepare 只检查、不写工作树。正式 prepare 前先运行只读演练;有变化时向用户展示文件/语种/版本/`refreshDigest`,只有在用户明确授权"本地发布文档写入"后,才执行带 `--write --confirm-refresh <refreshDigest> --ack-local-document-write` 三项绑定的写入,随后运行聚焦校验,要求维护者审阅并提交刷新结果,再重新 prepare。该授权不扩展为 hook、提交、push 或 publish 授权。
40
40
 
41
- **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才把这些 ID 逐个传给 `--unit`。release-skill 不根据失败自动排除单元。选择命中 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须包含收据声明的完整单元闭包;缺少单元时按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
41
+ **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才逐个传入 `--unit`;不得根据失败自动排除单元。选中的单元包含 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须同时包含收据声明的完整单元闭包。缺少单元时,按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
42
42
 
43
43
  ## 正向执行路径
44
44
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.25",
3
+ "version": "0.9.27",
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.25"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.27"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "42145a246d5fd5adff3a1218e94fbfc06df377290431628aa3270e2414b8183e";
14
+ const __bundleSourceDigest = "25d576aeb1a7c01598399f326190124dbdd91b562e32ad4d9a532e3399654151";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -135457,6 +135457,7 @@ function hostEnvironment(host, { kimiHome } = {}) {
135457
135457
  if (host === "workbuddy") {
135458
135458
  env.CODEBUDDY_CONFIG_DIR = join29(env.HOME, ".workbuddy");
135459
135459
  env.WORKBUDDY_CONFIG_DIR = join29(env.HOME, ".workbuddy");
135460
+ env.CODEBUDDY_FORCE_LITE_WB_BUNDLE = "1";
135460
135461
  }
135461
135462
  if (host === "kimi" && kimiHome) env.KIMI_CODE_HOME = kimiHome;
135462
135463
  return env;
@@ -136644,10 +136645,17 @@ async function observeKimiTarget(target, kimiHome, run6) {
136644
136645
  const pluginRoot = await resolveContained(managedRoot, target.plugin);
136645
136646
  const declaredRoot = await resolveContained(managedRoot, relative28(managedRoot, entry.root));
136646
136647
  if (declaredRoot !== pluginRoot) throw new Error("Kimi installed plugin root does not match its managed root");
136647
- const packageJson = parseJson2(
136648
- await readFileContained(pluginRoot, "package.json", { encoding: "utf8" }),
136649
- "Kimi installed package manifest"
136650
- );
136648
+ let manifestText;
136649
+ let manifestLabel = "Kimi installed package manifest";
136650
+ try {
136651
+ manifestText = await readFileContained(pluginRoot, "package.json", { encoding: "utf8" });
136652
+ } catch (error) {
136653
+ const missing = error?.code === "ENOENT" || error?.details?.causeCode === "ENOENT" || error?.details?.kind === "missing-resource";
136654
+ if (!missing) throw error;
136655
+ manifestLabel = "Kimi installed plugin manifest";
136656
+ manifestText = await readFileContained(pluginRoot, "kimi.plugin.json", { encoding: "utf8" });
136657
+ }
136658
+ const packageJson = parseJson2(manifestText, manifestLabel);
136651
136659
  const refName = entry.github.ref?.kind === "tag" ? entry.github.ref.value : void 0;
136652
136660
  const revision = entry.github.installedSha;
136653
136661
  let gitHeadExact = true;
@@ -29,15 +29,17 @@ 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.25 候选边界
32
+ ## 0.9.27 能力与证据边界
33
33
 
34
- 当前 0.9.25 候选精确消费 Foundation 0.22.0 的公开包根 API。0.9.25 仍是源码候选,不能从本说明推断已批准、发布或验证。
34
+ release-skill 0.9.27 精确依赖 Foundation 0.22.0 的公开包根 API。本版修复 Kimi 本机宿主观察:受管插件根只有 kimi.plugin.json、没有 package.json 时不再失败。本节说明当前版本的能力范围与证据边界;批准、发布和验证状态以对应计划、批准及执行记录为准,不能由本说明推断。
35
35
 
36
- 冻结前,`prepare` 或新建 `ship` 状态可重复传入 `--unit <id>`;不传则选择全部单元。延期单元不进入计划,也不获得发布状态。完整配置、生成物新鲜度和顶层 Hook 仍覆盖全项目;`publicSourceAuthorityReceipt` 的 coordinator 与 subjects 必须共同选择。冻结后以 `plan.units` 为唯一范围,publish、reconcile、verify、distribute 不再接受 `--unit`。
36
+ 在冻结前,`prepare` 或新建 `ship` 状态时可重复传入 `--unit <id>`;未传入则默认选择全部单元。延期单元不进入发布计划,亦不获得发布状态。完整配置、生成物新鲜度检查及顶层 Hook 仍作用于全项目范围。`publicSourceAuthorityReceipt` 的 coordinator 与全部 subjects 必须共同选择。
37
37
 
38
- 每个单元都要声明 `previousPublicBaseline`:确认没有前序版本才用 `none`,否则使用带 repo/ref/commit 的 `bound`。`none` 不绕过 publish 的唯一性预检。
38
+ 冻结后,发布流程(publish、reconcile、verify、distribute)不再接受 `--unit` 参数,仅以 `plan.units` 为唯一有效范围。
39
39
 
40
- Hook cache v2 只复用绝对路径,或已用真实 cwd 核验的 cwd-relative executable identity;裸 PATH、PATHEXT、Windows 或观察不可用时冷执行,并失败关闭。稳定隔离安装树只在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接只记录、不跟随,声明载荷中的 symlink 失败关闭。
40
+ 每个单元必须声明 `previousPublicBaseline`:只有确认没有前序公开版本时,才使用 `none`;否则必须提供 `bound`,并包含 `repo/ref/commit` 信息。`none` 不绕过 publish 阶段的唯一性预检。
41
+
42
+ Hook 缓存 v2 仅复用绝对路径,或已通过真实 cwd 核验的 cwd-relative 可执行文件身份;若依赖裸 PATH、PATHEXT、Windows 环境或观察不可用,将触发冷执行并失败关闭。稳定隔离安装树仅在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接仅记录,不跟随;声明载荷中出现 symlink 将导致失败关闭。
41
43
 
42
44
  ## 最短路径
43
45
 
@@ -13,7 +13,7 @@ description: Freeze an immutable release plan with local configuration, document
13
13
 
14
14
  运行项目构建/测试 hook,生成公开快照并扫描泄漏,冻结不可变发布计划。prepare 自身不调用发布 adapter,但会执行用户配置的 hook。
15
15
 
16
- 0.9.4 候选允许多发布单元项目在冻结前显式选择本轮范围。`--unit <id>` 可以重复传入;未传时仍选择全部单元。显式选择只跳过延期单元的单元级工作,完整配置校验、生成物新鲜度和顶层 Hook 仍全部执行。计划冻结后以 `plan.units` 为唯一范围权威,publish、reconcile、verify 和 distribute 不接受单元选择。
16
+ 自 0.9.4 起,多发布单元项目可在计划冻结前显式指定本轮发布范围。重复传入 `--unit <id>` 可选择多个单元;未传入该参数时,默认选择全部单元。显式选择只跳过延期单元的单元级工作;完整配置校验、生成物新鲜度检查及顶层 Hook 仍全部执行。冻结后,`plan.units` 是唯一范围权威,publish、reconcile、verify 和 distribute 不再接受单元选择。
17
17
 
18
18
  0.9.3 引入的 Hook cache v2 继续只复用有完整身份和输入证据的成功 Hook 结果。裸 PATH、PATHEXT、Windows、TTL、损坏记录或 Foundation 观察不可用时,缓存保持失败关闭,Hook 仍按完整路径冷执行;该机制不改变 prepare 的计划、批准和发布权威。
19
19
 
@@ -31,7 +31,7 @@ description: Freeze an immutable release plan with local configuration, document
31
31
 
32
32
  **发布文档新鲜度门**: 配置了 `releaseDocuments` 的单元在 hook 授权门前先执行同一只读规划器:`clean` 继续;`changes` 抛 `RELEASE_DOCS_STALE`,详情列出相对路径、语种、`refreshDigest` 和精确演练/写入参数数组。prepare 只检查、不写工作树。正式 prepare 前先运行只读演练;有变化时向用户展示文件/语种/版本/`refreshDigest`,只有在用户明确授权"本地发布文档写入"后,才执行带 `--write --confirm-refresh <refreshDigest> --ack-local-document-write` 三项绑定的写入,随后运行聚焦校验,要求维护者审阅并提交刷新结果,再重新 prepare。该授权不扩展为 hook、提交、push 或 publish 授权。
33
33
 
34
- **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才把这些 ID 逐个传给 `--unit`。release-skill 不根据失败自动排除单元。选择命中 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须包含收据声明的完整单元闭包;缺少单元时按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
34
+ **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才逐个传入 `--unit`;不得根据失败自动排除单元。选中的单元包含 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须同时包含收据声明的完整单元闭包。缺少单元时,按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
35
35
 
36
36
  ## 正向执行路径
37
37
 
@@ -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.25"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.27"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "42145a246d5fd5adff3a1218e94fbfc06df377290431628aa3270e2414b8183e";
14
+ const __bundleSourceDigest = "25d576aeb1a7c01598399f326190124dbdd91b562e32ad4d9a532e3399654151";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -135457,6 +135457,7 @@ function hostEnvironment(host, { kimiHome } = {}) {
135457
135457
  if (host === "workbuddy") {
135458
135458
  env.CODEBUDDY_CONFIG_DIR = join29(env.HOME, ".workbuddy");
135459
135459
  env.WORKBUDDY_CONFIG_DIR = join29(env.HOME, ".workbuddy");
135460
+ env.CODEBUDDY_FORCE_LITE_WB_BUNDLE = "1";
135460
135461
  }
135461
135462
  if (host === "kimi" && kimiHome) env.KIMI_CODE_HOME = kimiHome;
135462
135463
  return env;
@@ -136644,10 +136645,17 @@ async function observeKimiTarget(target, kimiHome, run6) {
136644
136645
  const pluginRoot = await resolveContained(managedRoot, target.plugin);
136645
136646
  const declaredRoot = await resolveContained(managedRoot, relative28(managedRoot, entry.root));
136646
136647
  if (declaredRoot !== pluginRoot) throw new Error("Kimi installed plugin root does not match its managed root");
136647
- const packageJson = parseJson2(
136648
- await readFileContained(pluginRoot, "package.json", { encoding: "utf8" }),
136649
- "Kimi installed package manifest"
136650
- );
136648
+ let manifestText;
136649
+ let manifestLabel = "Kimi installed package manifest";
136650
+ try {
136651
+ manifestText = await readFileContained(pluginRoot, "package.json", { encoding: "utf8" });
136652
+ } catch (error) {
136653
+ const missing = error?.code === "ENOENT" || error?.details?.causeCode === "ENOENT" || error?.details?.kind === "missing-resource";
136654
+ if (!missing) throw error;
136655
+ manifestLabel = "Kimi installed plugin manifest";
136656
+ manifestText = await readFileContained(pluginRoot, "kimi.plugin.json", { encoding: "utf8" });
136657
+ }
136658
+ const packageJson = parseJson2(manifestText, manifestLabel);
136651
136659
  const refName = entry.github.ref?.kind === "tag" ? entry.github.ref.value : void 0;
136652
136660
  const revision = entry.github.installedSha;
136653
136661
  let gitHeadExact = true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.25",
3
+ "version": "0.9.27",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -2,11 +2,11 @@
2
2
  "schemaVersion": "1.0.0",
3
3
  "platformId": "release-skill",
4
4
  "platformName": "release-skill Plugin Platform",
5
- "version": "0.9.25",
5
+ "version": "0.9.27",
6
6
  "logicalRoot": "skills-src/",
7
- "logicalRootDigest": "7b62f9ded9aea774298ad86a781d58ad83f4092f3c3220b4a75dfe11ad19f809",
8
- "projectionDigest": "bb92d4a3f57842000aa404a0698c5e38c111f05408027491e0904912af81d716",
9
- "projectionId": "release-skill:platform:0.9.25",
7
+ "logicalRootDigest": "0fa3132f1cabb5aa580e9984ee85a1762824ffd147bc91262ad9b60ad7f3b7a1",
8
+ "projectionDigest": "a47de2ca6763aba458a767d21d28fdab2581dcb0cd422593529056d34d052763",
9
+ "projectionId": "release-skill:platform:0.9.27",
10
10
  "manifestRequired": true,
11
11
  "projectionSources": {
12
12
  "skills-src-root": {
@@ -29,15 +29,17 @@ 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.25 候选边界
32
+ ## 0.9.27 能力与证据边界
33
33
 
34
- 当前 0.9.25 候选精确消费 Foundation 0.22.0 的公开包根 API。0.9.25 仍是源码候选,不能从本说明推断已批准、发布或验证。
34
+ release-skill 0.9.27 精确依赖 Foundation 0.22.0 的公开包根 API。本版修复 Kimi 本机宿主观察:受管插件根只有 kimi.plugin.json、没有 package.json 时不再失败。本节说明当前版本的能力范围与证据边界;批准、发布和验证状态以对应计划、批准及执行记录为准,不能由本说明推断。
35
35
 
36
- 冻结前,`prepare` 或新建 `ship` 状态可重复传入 `--unit <id>`;不传则选择全部单元。延期单元不进入计划,也不获得发布状态。完整配置、生成物新鲜度和顶层 Hook 仍覆盖全项目;`publicSourceAuthorityReceipt` 的 coordinator 与 subjects 必须共同选择。冻结后以 `plan.units` 为唯一范围,publish、reconcile、verify、distribute 不再接受 `--unit`。
36
+ 在冻结前,`prepare` 或新建 `ship` 状态时可重复传入 `--unit <id>`;未传入则默认选择全部单元。延期单元不进入发布计划,亦不获得发布状态。完整配置、生成物新鲜度检查及顶层 Hook 仍作用于全项目范围。`publicSourceAuthorityReceipt` 的 coordinator 与全部 subjects 必须共同选择。
37
37
 
38
- 每个单元都要声明 `previousPublicBaseline`:确认没有前序版本才用 `none`,否则使用带 repo/ref/commit 的 `bound`。`none` 不绕过 publish 的唯一性预检。
38
+ 冻结后,发布流程(publish、reconcile、verify、distribute)不再接受 `--unit` 参数,仅以 `plan.units` 为唯一有效范围。
39
39
 
40
- Hook cache v2 只复用绝对路径,或已用真实 cwd 核验的 cwd-relative executable identity;裸 PATH、PATHEXT、Windows 或观察不可用时冷执行,并失败关闭。稳定隔离安装树只在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接只记录、不跟随,声明载荷中的 symlink 失败关闭。
40
+ 每个单元必须声明 `previousPublicBaseline`:只有确认没有前序公开版本时,才使用 `none`;否则必须提供 `bound`,并包含 `repo/ref/commit` 信息。`none` 不绕过 publish 阶段的唯一性预检。
41
+
42
+ Hook 缓存 v2 仅复用绝对路径,或已通过真实 cwd 核验的 cwd-relative 可执行文件身份;若依赖裸 PATH、PATHEXT、Windows 环境或观察不可用,将触发冷执行并失败关闭。稳定隔离安装树仅在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接仅记录,不跟随;声明载荷中出现 symlink 将导致失败关闭。
41
43
 
42
44
  ## 最短路径
43
45
 
@@ -13,7 +13,7 @@ description: Freeze an immutable release plan with local configuration, document
13
13
 
14
14
  运行项目构建/测试 hook,生成公开快照并扫描泄漏,冻结不可变发布计划。prepare 自身不调用发布 adapter,但会执行用户配置的 hook。
15
15
 
16
- 0.9.4 候选允许多发布单元项目在冻结前显式选择本轮范围。`--unit <id>` 可以重复传入;未传时仍选择全部单元。显式选择只跳过延期单元的单元级工作,完整配置校验、生成物新鲜度和顶层 Hook 仍全部执行。计划冻结后以 `plan.units` 为唯一范围权威,publish、reconcile、verify 和 distribute 不接受单元选择。
16
+ 自 0.9.4 起,多发布单元项目可在计划冻结前显式指定本轮发布范围。重复传入 `--unit <id>` 可选择多个单元;未传入该参数时,默认选择全部单元。显式选择只跳过延期单元的单元级工作;完整配置校验、生成物新鲜度检查及顶层 Hook 仍全部执行。冻结后,`plan.units` 是唯一范围权威,publish、reconcile、verify 和 distribute 不再接受单元选择。
17
17
 
18
18
  0.9.3 引入的 Hook cache v2 继续只复用有完整身份和输入证据的成功 Hook 结果。裸 PATH、PATHEXT、Windows、TTL、损坏记录或 Foundation 观察不可用时,缓存保持失败关闭,Hook 仍按完整路径冷执行;该机制不改变 prepare 的计划、批准和发布权威。
19
19
 
@@ -31,7 +31,7 @@ description: Freeze an immutable release plan with local configuration, document
31
31
 
32
32
  **发布文档新鲜度门**: 配置了 `releaseDocuments` 的单元在 hook 授权门前先执行同一只读规划器:`clean` 继续;`changes` 抛 `RELEASE_DOCS_STALE`,详情列出相对路径、语种、`refreshDigest` 和精确演练/写入参数数组。prepare 只检查、不写工作树。正式 prepare 前先运行只读演练;有变化时向用户展示文件/语种/版本/`refreshDigest`,只有在用户明确授权"本地发布文档写入"后,才执行带 `--write --confirm-refresh <refreshDigest> --ack-local-document-write` 三项绑定的写入,随后运行聚焦校验,要求维护者审阅并提交刷新结果,再重新 prepare。该授权不扩展为 hook、提交、push 或 publish 授权。
33
33
 
34
- **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才把这些 ID 逐个传给 `--unit`。release-skill 不根据失败自动排除单元。选择命中 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须包含收据声明的完整单元闭包;缺少单元时按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
34
+ **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才逐个传入 `--unit`;不得根据失败自动排除单元。选中的单元包含 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须同时包含收据声明的完整单元闭包。缺少单元时,按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
35
35
 
36
36
  ## 正向执行路径
37
37
 
@@ -29,15 +29,17 @@ 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.25 候选边界
32
+ ## 0.9.27 能力与证据边界
33
33
 
34
- 当前 0.9.25 候选精确消费 Foundation 0.22.0 的公开包根 API。0.9.25 仍是源码候选,不能从本说明推断已批准、发布或验证。
34
+ release-skill 0.9.27 精确依赖 Foundation 0.22.0 的公开包根 API。本版修复 Kimi 本机宿主观察:受管插件根只有 kimi.plugin.json、没有 package.json 时不再失败。本节说明当前版本的能力范围与证据边界;批准、发布和验证状态以对应计划、批准及执行记录为准,不能由本说明推断。
35
35
 
36
- 冻结前,`prepare` 或新建 `ship` 状态可重复传入 `--unit <id>`;不传则选择全部单元。延期单元不进入计划,也不获得发布状态。完整配置、生成物新鲜度和顶层 Hook 仍覆盖全项目;`publicSourceAuthorityReceipt` 的 coordinator 与 subjects 必须共同选择。冻结后以 `plan.units` 为唯一范围,publish、reconcile、verify、distribute 不再接受 `--unit`。
36
+ 在冻结前,`prepare` 或新建 `ship` 状态时可重复传入 `--unit <id>`;未传入则默认选择全部单元。延期单元不进入发布计划,亦不获得发布状态。完整配置、生成物新鲜度检查及顶层 Hook 仍作用于全项目范围。`publicSourceAuthorityReceipt` 的 coordinator 与全部 subjects 必须共同选择。
37
37
 
38
- 每个单元都要声明 `previousPublicBaseline`:确认没有前序版本才用 `none`,否则使用带 repo/ref/commit 的 `bound`。`none` 不绕过 publish 的唯一性预检。
38
+ 冻结后,发布流程(publish、reconcile、verify、distribute)不再接受 `--unit` 参数,仅以 `plan.units` 为唯一有效范围。
39
39
 
40
- Hook cache v2 只复用绝对路径,或已用真实 cwd 核验的 cwd-relative executable identity;裸 PATH、PATHEXT、Windows 或观察不可用时冷执行,并失败关闭。稳定隔离安装树只在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接只记录、不跟随,声明载荷中的 symlink 失败关闭。
40
+ 每个单元必须声明 `previousPublicBaseline`:只有确认没有前序公开版本时,才使用 `none`;否则必须提供 `bound`,并包含 `repo/ref/commit` 信息。`none` 不绕过 publish 阶段的唯一性预检。
41
+
42
+ Hook 缓存 v2 仅复用绝对路径,或已通过真实 cwd 核验的 cwd-relative 可执行文件身份;若依赖裸 PATH、PATHEXT、Windows 环境或观察不可用,将触发冷执行并失败关闭。稳定隔离安装树仅在宿主命令退出、目录隔离且扫描期间无并发写入时记录;附加链接仅记录,不跟随;声明载荷中出现 symlink 将导致失败关闭。
41
43
 
42
44
  ## 最短路径
43
45
 
@@ -13,7 +13,7 @@ description: Freeze an immutable release plan with local configuration, document
13
13
 
14
14
  运行项目构建/测试 hook,生成公开快照并扫描泄漏,冻结不可变发布计划。prepare 自身不调用发布 adapter,但会执行用户配置的 hook。
15
15
 
16
- 0.9.4 候选允许多发布单元项目在冻结前显式选择本轮范围。`--unit <id>` 可以重复传入;未传时仍选择全部单元。显式选择只跳过延期单元的单元级工作,完整配置校验、生成物新鲜度和顶层 Hook 仍全部执行。计划冻结后以 `plan.units` 为唯一范围权威,publish、reconcile、verify 和 distribute 不接受单元选择。
16
+ 自 0.9.4 起,多发布单元项目可在计划冻结前显式指定本轮发布范围。重复传入 `--unit <id>` 可选择多个单元;未传入该参数时,默认选择全部单元。显式选择只跳过延期单元的单元级工作;完整配置校验、生成物新鲜度检查及顶层 Hook 仍全部执行。冻结后,`plan.units` 是唯一范围权威,publish、reconcile、verify 和 distribute 不再接受单元选择。
17
17
 
18
18
  0.9.3 引入的 Hook cache v2 继续只复用有完整身份和输入证据的成功 Hook 结果。裸 PATH、PATHEXT、Windows、TTL、损坏记录或 Foundation 观察不可用时,缓存保持失败关闭,Hook 仍按完整路径冷执行;该机制不改变 prepare 的计划、批准和发布权威。
19
19
 
@@ -31,7 +31,7 @@ description: Freeze an immutable release plan with local configuration, document
31
31
 
32
32
  **发布文档新鲜度门**: 配置了 `releaseDocuments` 的单元在 hook 授权门前先执行同一只读规划器:`clean` 继续;`changes` 抛 `RELEASE_DOCS_STALE`,详情列出相对路径、语种、`refreshDigest` 和精确演练/写入参数数组。prepare 只检查、不写工作树。正式 prepare 前先运行只读演练;有变化时向用户展示文件/语种/版本/`refreshDigest`,只有在用户明确授权"本地发布文档写入"后,才执行带 `--write --confirm-refresh <refreshDigest> --ack-local-document-write` 三项绑定的写入,随后运行聚焦校验,要求维护者审阅并提交刷新结果,再重新 prepare。该授权不扩展为 hook、提交、push 或 publish 授权。
33
33
 
34
- **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才把这些 ID 逐个传给 `--unit`。release-skill 不根据失败自动排除单元。选择命中 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须包含收据声明的完整单元闭包;缺少单元时按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
34
+ **显式发布范围**: 只有用户已经指出本轮要发布哪些单元时,才逐个传入 `--unit`;不得根据失败自动排除单元。选中的单元包含 `publicSourceAuthorityReceipt` 的 coordinator 或 subject 时,必须同时包含收据声明的完整单元闭包。缺少单元时,按命令返回的精确 argv 重新选择,不自动扩选。成功后展示 `releaseScope.selectedUnitIds`、`releaseScope.deferredUnitIds` 和批准摘要。延期仅表示没有进入本轮计划,不表示通过或失败。
35
35
 
36
36
  ## 正向执行路径
37
37
 
@@ -601,6 +601,7 @@ function hostEnvironment(host, { kimiHome } = {}) {
601
601
  if (host === 'workbuddy') {
602
602
  env.CODEBUDDY_CONFIG_DIR = join(env.HOME, '.workbuddy');
603
603
  env.WORKBUDDY_CONFIG_DIR = join(env.HOME, '.workbuddy');
604
+ env.CODEBUDDY_FORCE_LITE_WB_BUNDLE = '1';
604
605
  }
605
606
  if (host === 'kimi' && kimiHome) env.KIMI_CODE_HOME = kimiHome;
606
607
  return env;
@@ -1897,10 +1898,19 @@ async function observeKimiTarget(target, kimiHome, run) {
1897
1898
  const pluginRoot = await resolveContained(managedRoot, target.plugin);
1898
1899
  const declaredRoot = await resolveContained(managedRoot, relative(managedRoot, entry.root));
1899
1900
  if (declaredRoot !== pluginRoot) throw new Error('Kimi installed plugin root does not match its managed root');
1900
- const packageJson = parseJson(
1901
- await readFileContained(pluginRoot, 'package.json', { encoding: 'utf8' }),
1902
- 'Kimi installed package manifest',
1903
- );
1901
+ let manifestText;
1902
+ let manifestLabel = 'Kimi installed package manifest';
1903
+ try {
1904
+ manifestText = await readFileContained(pluginRoot, 'package.json', { encoding: 'utf8' });
1905
+ } catch (error) {
1906
+ const missing = error?.code === 'ENOENT'
1907
+ || error?.details?.causeCode === 'ENOENT'
1908
+ || error?.details?.kind === 'missing-resource';
1909
+ if (!missing) throw error;
1910
+ manifestLabel = 'Kimi installed plugin manifest';
1911
+ manifestText = await readFileContained(pluginRoot, 'kimi.plugin.json', { encoding: 'utf8' });
1912
+ }
1913
+ const packageJson = parseJson(manifestText, manifestLabel);
1904
1914
  const refName = entry.github.ref?.kind === 'tag' ? entry.github.ref.value : undefined;
1905
1915
  const revision = entry.github.installedSha;
1906
1916
  let gitHeadExact = true;