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
@@ -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.21",
5
+ "version": "0.9.22",
6
6
  "logicalRoot": "skills-src/",
7
- "logicalRootDigest": "d0e779f27f973187b5633408ccefa677607947bb90c12c0127a99828f31c6e77",
8
- "projectionDigest": "8c6809eb5a223b8f7eba738b9f42ead31ffe0ba6461b37192fe0093b8aa49663",
9
- "projectionId": "release-skill:platform:0.9.21",
7
+ "logicalRootDigest": "f189a94c83be3c2d898867b42302432c5c93083dacdb110ce632a6e1d8d3e2fd",
8
+ "projectionDigest": "fc361c1567bacfe4b32c984a1ce882d24a5e0e0f7f212e21e73a43bb5bb59392",
9
+ "projectionId": "release-skill:platform:0.9.22",
10
10
  "manifestRequired": true,
11
11
  "projectionSources": {
12
12
  "skills-src-root": {
@@ -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
 
@@ -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
 
@@ -720,7 +720,7 @@ function isCodeBuddyResidualEnvelope(error) {
720
720
  }
721
721
 
722
722
  function isCodeBuddyReadCommand(target, command, args) {
723
- return target.host === 'codebuddy'
723
+ return (target.host === 'codebuddy' || target.host === 'workbuddy')
724
724
  && (command === 'codebuddy' || command === 'cbc' || command === CODEBUDDY_MACOS_PATH)
725
725
  && Array.isArray(args)
726
726
  && (
@@ -732,7 +732,7 @@ function isCodeBuddyReadCommand(target, command, args) {
732
732
  }
733
733
 
734
734
  function isCodeBuddyWriteCommand(target, command, args, kind) {
735
- if (target.host !== 'codebuddy' || !['codebuddy', 'cbc', CODEBUDDY_MACOS_PATH].includes(command)) return false;
735
+ if (!['codebuddy', 'workbuddy'].includes(target.host) || !['codebuddy', 'cbc', CODEBUDDY_MACOS_PATH].includes(command)) return false;
736
736
  const expected = kind === 'marketplace-update'
737
737
  ? ['plugin', 'marketplace', 'update', target.marketplace]
738
738
  : ['plugin', 'update', `${target.plugin}@${target.marketplace}`, '--scope', 'user'];
@@ -754,14 +754,14 @@ async function runCodeBuddyRead(target, command, args, label, env, run) {
754
754
  }
755
755
  }
756
756
 
757
- function exactCodeBuddyMarketplaceObservation(target, stdout) {
757
+ function exactCodeBuddyMarketplaceObservation(target, stdout, { acceptedTypes = ['git'] } = {}) {
758
758
  const parsed = parseJson(stdout, `${target.host} marketplace list`);
759
759
  if (!Array.isArray(parsed)) throw new Error(`${target.host} marketplace list did not return an array`);
760
760
  const matches = parsed.filter((entry) => entry?.name === target.marketplace);
761
761
  if (matches.length !== 1) {
762
762
  throw new Error(`${target.host} marketplace list did not contain exactly one ${target.marketplace}`);
763
763
  }
764
- if (matches[0].type !== 'git') {
764
+ if (!acceptedTypes.includes(matches[0].type)) {
765
765
  throw new Error(`${target.host} marketplace ${target.marketplace} is not a git marketplace`);
766
766
  }
767
767
  return { installed: true, exact: true, found: matches[0] };
@@ -1228,13 +1228,14 @@ async function observeHubMarketplace(target, command, env, run) {
1228
1228
  if (!observed.installed) return observed;
1229
1229
  return { ...observed, commit: await observeHubCheckout(target, observed.root, env, run) };
1230
1230
  }
1231
- const listed = target.host === 'codebuddy'
1231
+ const codeBuddyFamily = target.host === 'codebuddy' || target.host === 'workbuddy';
1232
+ const listed = codeBuddyFamily
1232
1233
  ? (await runCodeBuddyRead(target, command, CODEBUDDY_MARKETPLACE_LIST_ARGS, 'codebuddy marketplace list', env, run)).output
1233
1234
  : await run(command, [...CODEBUDDY_MARKETPLACE_LIST_ARGS], { env });
1234
1235
  const entries = parseJson(listed.stdout, `${target.host} marketplace list`);
1235
1236
  if (!Array.isArray(entries)) throw new Error(`${target.host} marketplace list did not return an array`);
1236
1237
  if (!entries.some((entry) => entry?.name === target.marketplace)) return { installed: false };
1237
- exactCodeBuddyMarketplaceObservation(target, listed.stdout);
1238
+ exactCodeBuddyMarketplaceObservation(target, listed.stdout, { acceptedTypes: ['git', 'github'] });
1238
1239
  const root = await resolveContained(env.CODEBUDDY_CONFIG_DIR, `plugins/marketplaces/${target.marketplace}`);
1239
1240
  return { installed: true, root, commit: await observeHubCheckout(target, root, env, run) };
1240
1241
  }
@@ -1243,7 +1244,7 @@ async function runHubStructuredUpdate(target, detected, run, { plan, root, verif
1243
1244
  const env = hostEnvironment(target.host);
1244
1245
  const codeBuddy = target.host === 'codebuddy' || target.host === 'workbuddy';
1245
1246
  const readPlugin = async () => {
1246
- const output = target.host === 'codebuddy'
1247
+ const output = codeBuddy
1247
1248
  ? (await runCodeBuddyRead(target, detected.command, CODEBUDDY_PLUGIN_LIST_ARGS, 'codebuddy plugin list', env, run)).output
1248
1249
  : await run(detected.command, ['plugin', 'list', '--json'], { env });
1249
1250
  const listed = parseJson(output.stdout, `${target.host} plugin list`);
@@ -1343,9 +1344,14 @@ async function runStructuredUpdate(target, detected, run, {
1343
1344
  if (target.targetKind === 'hub-backed') return runHubStructuredUpdate(target, detected, run, { plan, root, verifyInstalledPayload });
1344
1345
  if (target.host === 'codebuddy' || target.host === 'workbuddy') {
1345
1346
  const env = hostEnvironment(target.host);
1346
- const listedObservation = target.host === 'codebuddy'
1347
- ? await runCodeBuddyRead(target, detected.command, CODEBUDDY_PLUGIN_LIST_ARGS, `${target.host} plugin list`, env, run)
1348
- : { output: await run(detected.command, [...CODEBUDDY_PLUGIN_LIST_ARGS], { env }), recovered: false };
1347
+ const listedObservation = await runCodeBuddyRead(
1348
+ target,
1349
+ detected.command,
1350
+ CODEBUDDY_PLUGIN_LIST_ARGS,
1351
+ `${target.host} plugin list`,
1352
+ env,
1353
+ run,
1354
+ );
1349
1355
  const listed = listedObservation.output;
1350
1356
  const observed = exactPluginObservation(target, listed.stdout);
1351
1357
  if (
@@ -1421,9 +1427,14 @@ async function runStructuredUpdate(target, detected, run, {
1421
1427
  pluginRecovered = true;
1422
1428
  }
1423
1429
  if (!pluginRecovered) {
1424
- const afterList = target.host === 'codebuddy'
1425
- ? await runCodeBuddyRead(target, detected.command, CODEBUDDY_PLUGIN_LIST_ARGS, `${target.host} plugin list`, env, run)
1426
- : { output: await run(detected.command, [...CODEBUDDY_PLUGIN_LIST_ARGS], { env }), recovered: false };
1430
+ const afterList = await runCodeBuddyRead(
1431
+ target,
1432
+ detected.command,
1433
+ CODEBUDDY_PLUGIN_LIST_ARGS,
1434
+ `${target.host} plugin list`,
1435
+ env,
1436
+ run,
1437
+ );
1427
1438
  after = exactPluginObservation(target, afterList.output.stdout);
1428
1439
  }
1429
1440
  if (!after.exact) throw new Error(`${target.host} did not update to the frozen plugin identity`);