release-skill 0.7.4 → 0.7.5

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.
@@ -9,7 +9,7 @@
9
9
  {
10
10
  "name": "release-skill",
11
11
  "source": "./",
12
- "version": "0.7.4",
12
+ "version": "0.7.5",
13
13
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
14
14
  "author": {
15
15
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -19,7 +19,7 @@
19
19
  ],
20
20
  "defaultPrompt": [
21
21
  "Assess this project for release readiness.",
22
- "Prepare a release plan for version 0.7.4.",
22
+ "Prepare a release plan for version 0.7.5.",
23
23
  "Help me understand the release workflow."
24
24
  ]
25
25
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ <!-- release-skill:changelog:start version=0.7.5 locale=en baseline=sha256:39f8f00f21c9071341106ea4becf4e8d10a732bd01b430e244dc4e3c5bf07da2 -->
4
+ ## [0.7.5] - 2026-08-22
5
+
6
+ v0.7.5 recognizes registered platform projections that publish a single `skill/` entry, closing the remaining false missing-host result for Skill Failure Auditor releases.
7
+
8
+ ### Fixed
9
+
10
+ - **Singular platform skill surfaces**: resource closure now assigns `platforms/<host>/skill/SKILL.md` to the registered `platforms/<host>` surface, while preserving root, adapter, and plural `skills/` behavior. Unregistered platform trees still fail closed. The changed closure algorithm is identified as `skill-resource-closure-v4`, so plans frozen by earlier checker versions cannot cross the publish boundary.
11
+ <!-- release-skill:changelog:end version=0.7.5 locale=en -->
12
+
13
+
3
14
  <!-- release-skill:changelog:start version=0.7.4 locale=en baseline=sha256:c1d8df84f44367edc819829462687c58f30eb7ea23b8761c317254bd386ece85 -->
4
15
  ## [0.7.4] - 2026-08-22
5
16
 
package/INSTALL.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [简体中文](INSTALL.zh-CN.md)
4
4
 
5
- <!-- release-skill:release-version: 0.7.4 -->
5
+ <!-- release-skill:release-version: 0.7.5 -->
6
6
  ## Prerequisites
7
7
 
8
8
  - Node.js 22.0.0 or later
@@ -114,7 +114,7 @@ tag pinned to the exact version (never the bare repository URL, which installs
114
114
  the latest release or default branch), confirm the trust prompt, then reload:
115
115
 
116
116
  ```
117
- /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.7.4
117
+ /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.7.5
118
118
  /plugins reload
119
119
  ```
120
120
 
package/INSTALL.zh-CN.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [English](INSTALL.md)
4
4
 
5
- <!-- release-skill:release-version: 0.7.4 -->
5
+ <!-- release-skill:release-version: 0.7.5 -->
6
6
  ## 前置条件
7
7
 
8
8
  - Node.js 22.0.0 或更高版本
@@ -104,7 +104,7 @@ Kimi Code 有交互式插件市场,但**没有可脚本化的非交互安装
104
104
  (切勿使用裸仓库地址,它会安装最新 release 或默认分支),确认信任提示后重新加载:
105
105
 
106
106
  ```
107
- /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.7.4
107
+ /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.7.5
108
108
  /plugins reload
109
109
  ```
110
110
 
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [简体中文](README.zh-CN.md) · Installation: [English](INSTALL.md) / [简体中文](INSTALL.zh-CN.md)
4
4
 
5
- <!-- release-skill:release-version: 0.7.4 -->
5
+ <!-- release-skill:release-version: 0.7.5 -->
6
6
  Release preparation for Claude Code, CodeBuddy, WorkBuddy, Codex, and Kimi Code, with human-edited files kept intact.
7
7
 
8
8
  release-skill helps a maintainer answer three questions: what will be released,
@@ -14,17 +14,17 @@ Setup surfaces only the deterministic `compactSummary` review view; the full
14
14
  report stays in a temporary session directory.
15
15
 
16
16
  <!-- release-skill:managed:start id=latest-release -->
17
- **0.7.4** (2026-08-22)
17
+ **0.7.5** (2026-08-22)
18
18
 
19
- v0.7.4 recognizes declared plugin hosts in both generated adapter trees and registered platform projection trees, so valid releases such as Skill Family Audit are no longer blocked by a false missing-host result.
19
+ v0.7.5 recognizes registered platform projections that publish a single `skill/` entry, closing the remaining false missing-host result for Skill Failure Auditor releases.
20
20
 
21
21
  **Fixed**
22
22
 
23
- - **Registry-driven projection surfaces**: each platform descriptor now declares its exact `platforms/*` skill projection surface. The resource-closure gate derives the host from the existing `buildAdapter.name` authority. Claude, Codex, Kimi, and WorkBuddy projections satisfy declared-host coverage without copying adapter trees; unknown platform projections still fail closed. The changed closure algorithm is identified as `skill-resource-closure-v3`, so frozen plans from earlier checker versions cannot cross the publish boundary.
23
+ - **Singular platform skill surfaces**: resource closure now assigns `platforms/<host>/skill/SKILL.md` to the registered `platforms/<host>` surface, while preserving root, adapter, and plural `skills/` behavior. Unregistered platform trees still fail closed. The changed closure algorithm is identified as `skill-resource-closure-v4`, so plans frozen by earlier checker versions cannot cross the publish boundary.
24
24
  <!-- release-skill:managed:end id=latest-release -->
25
25
 
26
26
  <!-- release-skill:capability:external-write-boundary -->
27
- > **Current boundary:** v0.7.4 is the current source candidate; v0.7.3 remains
27
+ > **Current boundary:** v0.7.5 is the current source candidate; v0.7.4 remains
28
28
  > the latest published release. v0.4.1 was an earlier published milestone;
29
29
  > v0.2.2 previously held published status before the platform verification
30
30
  > convergence fix was added.
@@ -44,8 +44,8 @@ v0.7.4 recognizes declared plugin hosts in both generated adapter trees and regi
44
44
  > publish global preflight.
45
45
 
46
46
  <!-- release-skill:capability:safe-first-command -->
47
- > **Production path verified since the v0.1.1 milestone; v0.7.4 is the current
48
- > source candidate and v0.7.3 is the latest published release.** The npm-installed CLI is the supported user entry. Source checkout
47
+ > **Production path verified since the v0.1.1 milestone; v0.7.5 is the current
48
+ > source candidate and v0.7.4 is the latest published release.** The npm-installed CLI is the supported user entry. Source checkout
49
49
  > is the development/contributor fallback.
50
50
  >
51
51
  > **Start here:**
package/README.zh-CN.md CHANGED
@@ -2,23 +2,23 @@
2
2
 
3
3
  [English](README.md) · 安装指南:[中文](INSTALL.zh-CN.md) / [English](INSTALL.md)
4
4
 
5
- <!-- release-skill:release-version: 0.7.4 -->
5
+ <!-- release-skill:release-version: 0.7.5 -->
6
6
  面向 Claude Code、CodeBuddy、WorkBuddy、Codex 和 Kimi Code 的发布准备工具,完整保留人工维护的文件内容。
7
7
 
8
8
  release-skill 帮助维护者回答三个问题:准备发布什么、还有哪些检查未通过、最终发布的内容是什么。它不重新生成、也不回写项目源文件。`prepare` 把每个配置的公开文件复制到隔离快照并验证字节——先冻结并供人工审阅,再从同一份冻结产物发布。`setup` 只显示确定性的 `compactSummary` 审阅视图,完整报告保留在临时会话目录中。
9
9
 
10
10
  <!-- release-skill:managed:start id=latest-release -->
11
- **0.7.4** (2026-08-22)
11
+ **0.7.5** (2026-08-22)
12
12
 
13
- v0.7.4 同时识别生成的 adapter 目录和平台注册的投影目录,不再把 Skill Family Audit 这类合法发布误判为缺少宿主面。
13
+ v0.7.5 能识别只发布一个 `skill/` 入口的平台注册投影,消除了 Skill Failure Auditor 发布中剩余的宿主面误判。
14
14
 
15
15
  **修复**
16
16
 
17
- - **由平台注册表统一识别投影面**:每个平台描述符现在声明精确的 `platforms/*` 技能投影目录。资源闭包门禁继续从既有 `buildAdapter.name` 权威字段派生宿主名。Claude、Codex、Kimi WorkBuddy 投影无需复制 adapter 目录即可满足宿主覆盖;未知平台投影仍会失败关闭。变更后的闭包算法标识为 `skill-resource-closure-v3`,旧检查器冻结的计划不能越过发布边界。
17
+ - **单数平台技能目录**:资源闭包现在会把 `platforms/<host>/skill/SKILL.md` 归入已登记的 `platforms/<host>` 投影面,同时保持根目录、adapter 和复数 `skills/` 布局的原有行为。未登记的平台目录仍会失败关闭。闭包算法标识升级为 `skill-resource-closure-v4`,早期检查器冻结的计划不能越过发布边界。
18
18
  <!-- release-skill:managed:end id=latest-release -->
19
19
 
20
20
  <!-- release-skill:capability:external-write-boundary -->
21
- > **当前边界:** v0.7.4 是当前源码候选,v0.7.3 是最新已发布版本。v0.4.1 是更早的已发布里程碑(v0.2.2 曾处于已发布状态,后因平台验证收敛修复而更新)。
21
+ > **当前边界:** v0.7.5 是当前源码候选,v0.7.4 是最新已发布版本。v0.4.1 是更早的已发布里程碑(v0.2.2 曾处于已发布状态,后因平台验证收敛修复而更新)。
22
22
  > v0.1.1 已完成 GitHub 与 npm 的
23
23
  > 真实生产发布,是首次生产验证的历史里程碑,并从冻结 Git ref 完成精确 npm
24
24
  > 安装及 Claude/Codex 消费者安装验证;"当前发布版本"与"首次生产验证里程碑"
@@ -31,7 +31,7 @@ v0.7.4 同时识别生成的 adapter 目录和平台注册的投影目录,不
31
31
  > 远端唯一性检查在 `publish` 全局预检执行。
32
32
 
33
33
  <!-- release-skill:capability:safe-first-command -->
34
- > **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.7.4 是当前源码候选,v0.7.3 是最新已发布版本。**
34
+ > **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.7.5 是当前源码候选,v0.7.4 是最新已发布版本。**
35
35
  > npm 安装的 CLI 是受支持的用户入口;源码 checkout 保留为开发/贡献者路径。
36
36
  >
37
37
  > **第一条命令:**
@@ -9,7 +9,7 @@
9
9
  {
10
10
  "name": "release-skill",
11
11
  "source": "./",
12
- "version": "0.7.4",
12
+ "version": "0.7.5",
13
13
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
14
14
  "author": {
15
15
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
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.7.4"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.7.5"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "94f8a4247206a95c5365d48448b1cce5e47d4fc42a711ac72e761565bc2dcb69";
14
+ const __bundleSourceDigest = "9ced58c843d3cdefc52185b6f64dd05deaf480edc7807ee5bf9efd54023c5ed7";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -44283,8 +44283,17 @@ async function discoverSkills(root, base = root) {
44283
44283
  function resolvePluginRoot(skillRelativePath, scanRoot2) {
44284
44284
  const parts = toPosix(skillRelativePath).split("/");
44285
44285
  const skillsIndex = parts.lastIndexOf("skills");
44286
- if (skillsIndex < 0) return resolve17(scanRoot2);
44287
- return resolve17(scanRoot2, ...parts.slice(0, skillsIndex));
44286
+ if (skillsIndex >= 0) return resolve17(scanRoot2, ...parts.slice(0, skillsIndex));
44287
+ if (parts[0] === "platforms" && parts.length >= 3) {
44288
+ const registeredSurface = parts.slice(0, 2).join("/");
44289
+ if (resolveSkillProjectionSurfaceHost(registeredSurface) !== null) {
44290
+ return resolve17(scanRoot2, ...parts.slice(0, 2));
44291
+ }
44292
+ const skillIndex = parts.lastIndexOf("skill");
44293
+ if (skillIndex >= 2) return resolve17(scanRoot2, ...parts.slice(0, skillIndex));
44294
+ return resolve17(scanRoot2, ...parts.slice(0, 2));
44295
+ }
44296
+ return resolve17(scanRoot2);
44288
44297
  }
44289
44298
  function resolveSkillRoot(skillRelativePath, scanRoot2) {
44290
44299
  return resolve17(scanRoot2, dirname7(skillRelativePath));
@@ -44758,7 +44767,7 @@ var init_skill_resource_closure = __esm({
44758
44767
  init_errors3();
44759
44768
  init_frozen();
44760
44769
  await init_registry2();
44761
- CHECKER_VERSION = "skill-resource-closure-v3";
44770
+ CHECKER_VERSION = "skill-resource-closure-v4";
44762
44771
  BARE_PREFIXES = ["references/", "assets/", "schemas/", "examples/", "scripts/"];
44763
44772
  EXPLICIT_PREFIXES = [
44764
44773
  "<plugin-root>/",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -19,7 +19,7 @@
19
19
  ],
20
20
  "defaultPrompt": [
21
21
  "Assess this project for release readiness.",
22
- "Prepare a release plan for version 0.7.4.",
22
+ "Prepare a release plan for version 0.7.5.",
23
23
  "Help me understand the release workflow."
24
24
  ]
25
25
  }
@@ -9,9 +9,9 @@ const __bundlePkgRoot = __bundleResolve(__bundleDirname(__bundleFileURLToPath(im
9
9
  // Provide a real require() for CJS packages bundled into ESM (e.g. yaml, ajv).
10
10
  const __bundleRealRequire = __bundleCreateRequire(import.meta.url);
11
11
  // Package identity injected at build time — closure-independent --version probe.
12
- const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.7.4"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.7.5"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "94f8a4247206a95c5365d48448b1cce5e47d4fc42a711ac72e761565bc2dcb69";
14
+ const __bundleSourceDigest = "9ced58c843d3cdefc52185b6f64dd05deaf480edc7807ee5bf9efd54023c5ed7";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -44283,8 +44283,17 @@ async function discoverSkills(root, base = root) {
44283
44283
  function resolvePluginRoot(skillRelativePath, scanRoot2) {
44284
44284
  const parts = toPosix(skillRelativePath).split("/");
44285
44285
  const skillsIndex = parts.lastIndexOf("skills");
44286
- if (skillsIndex < 0) return resolve17(scanRoot2);
44287
- return resolve17(scanRoot2, ...parts.slice(0, skillsIndex));
44286
+ if (skillsIndex >= 0) return resolve17(scanRoot2, ...parts.slice(0, skillsIndex));
44287
+ if (parts[0] === "platforms" && parts.length >= 3) {
44288
+ const registeredSurface = parts.slice(0, 2).join("/");
44289
+ if (resolveSkillProjectionSurfaceHost(registeredSurface) !== null) {
44290
+ return resolve17(scanRoot2, ...parts.slice(0, 2));
44291
+ }
44292
+ const skillIndex = parts.lastIndexOf("skill");
44293
+ if (skillIndex >= 2) return resolve17(scanRoot2, ...parts.slice(0, skillIndex));
44294
+ return resolve17(scanRoot2, ...parts.slice(0, 2));
44295
+ }
44296
+ return resolve17(scanRoot2);
44288
44297
  }
44289
44298
  function resolveSkillRoot(skillRelativePath, scanRoot2) {
44290
44299
  return resolve17(scanRoot2, dirname7(skillRelativePath));
@@ -44758,7 +44767,7 @@ var init_skill_resource_closure = __esm({
44758
44767
  init_errors3();
44759
44768
  init_frozen();
44760
44769
  await init_registry2();
44761
- CHECKER_VERSION = "skill-resource-closure-v3";
44770
+ CHECKER_VERSION = "skill-resource-closure-v4";
44762
44771
  BARE_PREFIXES = ["references/", "assets/", "schemas/", "examples/", "scripts/"];
44763
44772
  EXPLICIT_PREFIXES = [
44764
44773
  "<plugin-root>/",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
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.7.4"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.7.5"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "94f8a4247206a95c5365d48448b1cce5e47d4fc42a711ac72e761565bc2dcb69";
14
+ const __bundleSourceDigest = "9ced58c843d3cdefc52185b6f64dd05deaf480edc7807ee5bf9efd54023c5ed7";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -44283,8 +44283,17 @@ async function discoverSkills(root, base = root) {
44283
44283
  function resolvePluginRoot(skillRelativePath, scanRoot2) {
44284
44284
  const parts = toPosix(skillRelativePath).split("/");
44285
44285
  const skillsIndex = parts.lastIndexOf("skills");
44286
- if (skillsIndex < 0) return resolve17(scanRoot2);
44287
- return resolve17(scanRoot2, ...parts.slice(0, skillsIndex));
44286
+ if (skillsIndex >= 0) return resolve17(scanRoot2, ...parts.slice(0, skillsIndex));
44287
+ if (parts[0] === "platforms" && parts.length >= 3) {
44288
+ const registeredSurface = parts.slice(0, 2).join("/");
44289
+ if (resolveSkillProjectionSurfaceHost(registeredSurface) !== null) {
44290
+ return resolve17(scanRoot2, ...parts.slice(0, 2));
44291
+ }
44292
+ const skillIndex = parts.lastIndexOf("skill");
44293
+ if (skillIndex >= 2) return resolve17(scanRoot2, ...parts.slice(0, skillIndex));
44294
+ return resolve17(scanRoot2, ...parts.slice(0, 2));
44295
+ }
44296
+ return resolve17(scanRoot2);
44288
44297
  }
44289
44298
  function resolveSkillRoot(skillRelativePath, scanRoot2) {
44290
44299
  return resolve17(scanRoot2, dirname7(skillRelativePath));
@@ -44758,7 +44767,7 @@ var init_skill_resource_closure = __esm({
44758
44767
  init_errors3();
44759
44768
  init_frozen();
44760
44769
  await init_registry2();
44761
- CHECKER_VERSION = "skill-resource-closure-v3";
44770
+ CHECKER_VERSION = "skill-resource-closure-v4";
44762
44771
  BARE_PREFIXES = ["references/", "assets/", "schemas/", "examples/", "scripts/"];
44763
44772
  EXPLICIT_PREFIXES = [
44764
44773
  "<plugin-root>/",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
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.7.4"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.7.5"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "94f8a4247206a95c5365d48448b1cce5e47d4fc42a711ac72e761565bc2dcb69";
14
+ const __bundleSourceDigest = "9ced58c843d3cdefc52185b6f64dd05deaf480edc7807ee5bf9efd54023c5ed7";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -44283,8 +44283,17 @@ async function discoverSkills(root, base = root) {
44283
44283
  function resolvePluginRoot(skillRelativePath, scanRoot2) {
44284
44284
  const parts = toPosix(skillRelativePath).split("/");
44285
44285
  const skillsIndex = parts.lastIndexOf("skills");
44286
- if (skillsIndex < 0) return resolve17(scanRoot2);
44287
- return resolve17(scanRoot2, ...parts.slice(0, skillsIndex));
44286
+ if (skillsIndex >= 0) return resolve17(scanRoot2, ...parts.slice(0, skillsIndex));
44287
+ if (parts[0] === "platforms" && parts.length >= 3) {
44288
+ const registeredSurface = parts.slice(0, 2).join("/");
44289
+ if (resolveSkillProjectionSurfaceHost(registeredSurface) !== null) {
44290
+ return resolve17(scanRoot2, ...parts.slice(0, 2));
44291
+ }
44292
+ const skillIndex = parts.lastIndexOf("skill");
44293
+ if (skillIndex >= 2) return resolve17(scanRoot2, ...parts.slice(0, skillIndex));
44294
+ return resolve17(scanRoot2, ...parts.slice(0, 2));
44295
+ }
44296
+ return resolve17(scanRoot2);
44288
44297
  }
44289
44298
  function resolveSkillRoot(skillRelativePath, scanRoot2) {
44290
44299
  return resolve17(scanRoot2, dirname7(skillRelativePath));
@@ -44758,7 +44767,7 @@ var init_skill_resource_closure = __esm({
44758
44767
  init_errors3();
44759
44768
  init_frozen();
44760
44769
  await init_registry2();
44761
- CHECKER_VERSION = "skill-resource-closure-v3";
44770
+ CHECKER_VERSION = "skill-resource-closure-v4";
44762
44771
  BARE_PREFIXES = ["references/", "assets/", "schemas/", "examples/", "scripts/"];
44763
44772
  EXPLICIT_PREFIXES = [
44764
44773
  "<plugin-root>/",
@@ -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.7.4"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.7.5"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "94f8a4247206a95c5365d48448b1cce5e47d4fc42a711ac72e761565bc2dcb69";
14
+ const __bundleSourceDigest = "9ced58c843d3cdefc52185b6f64dd05deaf480edc7807ee5bf9efd54023c5ed7";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -44283,8 +44283,17 @@ async function discoverSkills(root, base = root) {
44283
44283
  function resolvePluginRoot(skillRelativePath, scanRoot2) {
44284
44284
  const parts = toPosix(skillRelativePath).split("/");
44285
44285
  const skillsIndex = parts.lastIndexOf("skills");
44286
- if (skillsIndex < 0) return resolve17(scanRoot2);
44287
- return resolve17(scanRoot2, ...parts.slice(0, skillsIndex));
44286
+ if (skillsIndex >= 0) return resolve17(scanRoot2, ...parts.slice(0, skillsIndex));
44287
+ if (parts[0] === "platforms" && parts.length >= 3) {
44288
+ const registeredSurface = parts.slice(0, 2).join("/");
44289
+ if (resolveSkillProjectionSurfaceHost(registeredSurface) !== null) {
44290
+ return resolve17(scanRoot2, ...parts.slice(0, 2));
44291
+ }
44292
+ const skillIndex = parts.lastIndexOf("skill");
44293
+ if (skillIndex >= 2) return resolve17(scanRoot2, ...parts.slice(0, skillIndex));
44294
+ return resolve17(scanRoot2, ...parts.slice(0, 2));
44295
+ }
44296
+ return resolve17(scanRoot2);
44288
44297
  }
44289
44298
  function resolveSkillRoot(skillRelativePath, scanRoot2) {
44290
44299
  return resolve17(scanRoot2, dirname7(skillRelativePath));
@@ -44758,7 +44767,7 @@ var init_skill_resource_closure = __esm({
44758
44767
  init_errors3();
44759
44768
  init_frozen();
44760
44769
  await init_registry2();
44761
- CHECKER_VERSION = "skill-resource-closure-v3";
44770
+ CHECKER_VERSION = "skill-resource-closure-v4";
44762
44771
  BARE_PREFIXES = ["references/", "assets/", "schemas/", "examples/", "scripts/"];
44763
44772
  EXPLICIT_PREFIXES = [
44764
44773
  "<plugin-root>/",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
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.7.4",
5
+ "version": "0.7.5",
6
6
  "logicalRoot": "skills-src/",
7
7
  "logicalRootDigest": "3767fc36f42ca561f5e839cea7b7e5bc16d08c47867b5bd6086f25efd0cb0f06",
8
8
  "projectionDigest": "419f7f9601015459956e10aae74f42240ab2ac248238ff7494f3e761643d1749",
9
- "projectionId": "release-skill:platform:0.7.4",
9
+ "projectionId": "release-skill:platform:0.7.5",
10
10
  "manifestRequired": true,
11
11
  "projectionSources": {
12
12
  "skills-src-root": {
@@ -4,7 +4,8 @@
4
4
  * Only path tokens in Markdown code spans, fenced code blocks, and local link
5
5
  * targets are interpreted. Bare Skill resources resolve from the directory
6
6
  * containing SKILL.md. Explicit plugin-root tokens resolve from the parent of
7
- * the nearest `skills/` directory.
7
+ * the nearest `skills/` directory or from a registered platform projection
8
+ * root when the projection publishes a singular `skill/` entry.
8
9
  */
9
10
 
10
11
  import { lstat, readFile, readdir } from 'node:fs/promises';
@@ -15,7 +16,7 @@ import { GATE_FAILED, ReleaseError } from './errors.mjs';
15
16
  import { computeFrozenSnapshot } from '../snapshot/frozen.mjs';
16
17
  import { resolveSkillProjectionSurfaceHost } from '../platforms/registry.mjs';
17
18
 
18
- export const CHECKER_VERSION = 'skill-resource-closure-v3';
19
+ export const CHECKER_VERSION = 'skill-resource-closure-v4';
19
20
 
20
21
  const BARE_PREFIXES = ['references/', 'assets/', 'schemas/', 'examples/', 'scripts/'];
21
22
  const EXPLICIT_PREFIXES = [
@@ -117,8 +118,27 @@ export async function discoverSkills(root, base = root) {
117
118
  export function resolvePluginRoot(skillRelativePath, scanRoot) {
118
119
  const parts = toPosix(skillRelativePath).split('/');
119
120
  const skillsIndex = parts.lastIndexOf('skills');
120
- if (skillsIndex < 0) return resolve(scanRoot);
121
- return resolve(scanRoot, ...parts.slice(0, skillsIndex));
121
+ if (skillsIndex >= 0) return resolve(scanRoot, ...parts.slice(0, skillsIndex));
122
+
123
+ // Published platform projections may expose one platform-level `skill/`
124
+ // entry rather than an adapter-style `skills/<name>/` tree. A registered
125
+ // platform surface remains the authority for its root even when the skill
126
+ // directory below it has a different physical name.
127
+ if (parts[0] === 'platforms' && parts.length >= 3) {
128
+ const registeredSurface = parts.slice(0, 2).join('/');
129
+ if (resolveSkillProjectionSurfaceHost(registeredSurface) !== null) {
130
+ return resolve(scanRoot, ...parts.slice(0, 2));
131
+ }
132
+
133
+ // Preserve fail-closed discovery for an unregistered singular platform
134
+ // projection, including nested platform paths. A direct platform SKILL
135
+ // without either marker still belongs to its first two path segments.
136
+ const skillIndex = parts.lastIndexOf('skill');
137
+ if (skillIndex >= 2) return resolve(scanRoot, ...parts.slice(0, skillIndex));
138
+ return resolve(scanRoot, ...parts.slice(0, 2));
139
+ }
140
+
141
+ return resolve(scanRoot);
122
142
  }
123
143
 
124
144
  export function resolveSkillRoot(skillRelativePath, scanRoot) {