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
@@ -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`);
@@ -36,9 +36,9 @@ description: "Discoverable entry point for release-skill: dependency and environ
36
36
 
37
37
  治理诊断只运行 release-skill 自己的只读检查程序,不运行目标 Skill、业务脚本、构建、hook 或发布动作,也不把 `prepare`、`verify`、`release-finish` 当作静态治理入口。用户要求实际接入或发布时,把已有授权带到对应原业务入口;各入口继续执行原有确认、副作用和状态机合同。
38
38
 
39
- ## 0.9.21 候选边界
39
+ ## 0.9.22 候选边界
40
40
 
41
- 当前 0.9.21 候选精确消费 Foundation 0.21.0 的公开包根 API。0.9.21 仍是源码候选,不能从本说明推断已批准、发布或验证。
41
+ 当前 0.9.22 候选精确消费 Foundation 0.21.0 的公开包根 API。0.9.22 仍是源码候选,不能从本说明推断已批准、发布或验证。
42
42
 
43
43
  冻结前,`prepare` 或新建 `ship` 状态可重复传入 `--unit <id>`;不传则选择全部单元。延期单元不进入计划,也不获得发布状态。完整配置、生成物新鲜度和顶层 Hook 仍覆盖全项目;`publicSourceAuthorityReceipt` 的 coordinator 与 subjects 必须共同选择。冻结后以 `plan.units` 为唯一范围,publish、reconcile、verify、distribute 不再接受 `--unit`。
44
44
 
@@ -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`);
@@ -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": "广州市风荷科技有限公司"
@@ -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": "广州市风荷科技有限公司"
@@ -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
 
@@ -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`);
package/package.json CHANGED
@@ -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": "广州市风荷科技有限公司"