release-skill 0.7.3 → 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.3",
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.3",
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.3",
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.3",
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.3.",
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.3",
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,27 @@
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
+
14
+ <!-- release-skill:changelog:start version=0.7.4 locale=en baseline=sha256:c1d8df84f44367edc819829462687c58f30eb7ea23b8761c317254bd386ece85 -->
15
+ ## [0.7.4] - 2026-08-22
16
+
17
+ 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.
18
+
19
+ ### Fixed
20
+
21
+ - **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.
22
+ <!-- release-skill:changelog:end version=0.7.4 locale=en -->
23
+
24
+
3
25
  <!-- release-skill:changelog:start version=0.7.3 locale=en baseline=sha256:18caf087c567201044292c958694b39ae9989d4c1abb1886aaa5a1ce8ca57bca -->
4
26
  ## [0.7.3] - 2026-08-22
5
27
 
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.3 -->
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.3
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.3 -->
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.3
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.3 -->
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.3** (2026-08-22)
17
+ **0.7.5** (2026-08-22)
18
18
 
19
- v0.7.3 adopts Foundation 0.8.1 so generated host adapters can initialize Foundation reports and managed projection without rewriting Foundation package identity.
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
- - **Foundation-owned bundle identity**: release-skill now consumes the exact 0.8.1 Contracts, Harness, and Engineering Kit packages and removes its report.mjs identity rewrite. Claude, Codex, Kimi, and WorkBuddy adapters now reach release-domain GATE_FAILED diagnostics for missing plans, while a frozen Codex distribution completes Foundation managed projection and reaches DISTRIBUTED.
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.3 is the current source candidate; v0.7.2 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.3 adopts Foundation 0.8.1 so generated host adapters can initialize Foundat
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.3 is the current
48
- > source candidate and v0.7.2 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.3 -->
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.3** (2026-08-22)
11
+ **0.7.5** (2026-08-22)
12
12
 
13
- v0.7.3 升级到 Foundation 0.8.1。生成的宿主适配器现在可以初始化 Foundation 报告并执行托管投影,无需改写 Foundation 包身份。
13
+ v0.7.5 能识别只发布一个 `skill/` 入口的平台注册投影,消除了 Skill Failure Auditor 发布中剩余的宿主面误判。
14
14
 
15
15
  **修复**
16
16
 
17
- - **由 Foundation 自主管理 bundle 身份**:release-skill 现在精确依赖 0.8.1 Contracts、Harness Engineering Kit,并删除对 report.mjs 身份的改写。Claude、Codex、Kimi 和 WorkBuddy 适配器遇到缺失计划时会返回 release-skill 的 GATE_FAILED 诊断;Codex 适配器也能从冻结输入完成 Foundation 托管投影并达到 DISTRIBUTED。
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.3 是当前源码候选,v0.7.2 是最新已发布版本。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.3 升级到 Foundation 0.8.1。生成的宿主适配器现在可以初始
31
31
  > 远端唯一性检查在 `publish` 全局预检执行。
32
32
 
33
33
  <!-- release-skill:capability:safe-first-command -->
34
- > **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.7.3 是当前源码候选,v0.7.2 是最新已发布版本。**
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.3",
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.3",
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.3"});
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 = "0e814c8b806446476595498baed8b129ca3cb024e3b922049db5774f022c90be";
14
+ const __bundleSourceDigest = "9ced58c843d3cdefc52185b6f64dd05deaf480edc7807ee5bf9efd54023c5ed7";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -36390,8 +36390,13 @@ function getPlatform(id) {
36390
36390
  if (!platform) throw new Error(`unknown platform: ${id}`);
36391
36391
  return platform;
36392
36392
  }
36393
+ function resolveSkillProjectionSurfaceHost(surfaceId, registry = PLATFORMS) {
36394
+ const platform = registry.find((item) => item.skillProjectionSurface === surfaceId);
36395
+ return platform?.buildAdapter?.name ?? null;
36396
+ }
36393
36397
  function assertRegistry(registry = PLATFORMS) {
36394
36398
  const seen = /* @__PURE__ */ new Set();
36399
+ const seenSkillProjectionSurfaces = /* @__PURE__ */ new Set();
36395
36400
  for (const platform of registry) {
36396
36401
  const label = platform?.id ?? "<missing id>";
36397
36402
  if (typeof platform?.id !== "string" || platform.id.length === 0) {
@@ -36440,6 +36445,16 @@ function assertRegistry(registry = PLATFORMS) {
36440
36445
  if (typeof platform.buildAdapter.name !== "string" || platform.buildAdapter.name.length === 0) {
36441
36446
  throw new Error(`platform registry: ${label} buildAdapter needs a non-empty name (its adapter directory name)`);
36442
36447
  }
36448
+ if (typeof platform.skillProjectionSurface !== "string" || !SKILL_PROJECTION_SURFACE_PATTERN.test(platform.skillProjectionSurface)) {
36449
+ throw new Error(`platform registry: ${label} skillProjectionSurface must match platforms/<slug>`);
36450
+ }
36451
+ if (seenSkillProjectionSurfaces.has(platform.skillProjectionSurface)) {
36452
+ throw new Error(`platform registry: duplicate skillProjectionSurface "${platform.skillProjectionSurface}"; aliases must be unique`);
36453
+ }
36454
+ seenSkillProjectionSurfaces.add(platform.skillProjectionSurface);
36455
+ if (resolveSkillProjectionSurfaceHost(platform.skillProjectionSurface, registry) !== platform.buildAdapter.name) {
36456
+ throw new Error(`platform registry: ${label} skillProjectionSurface must map to buildAdapter.name`);
36457
+ }
36443
36458
  if (!VALID_LIST_OUTPUTS.has(platform.jsonProtocol?.listOutput)) {
36444
36459
  throw new Error(`platform registry: ${label} has illegal jsonProtocol.listOutput "${platform.jsonProtocol?.listOutput}"`);
36445
36460
  }
@@ -36567,7 +36582,7 @@ function resolveCapabilityConflicts(platform) {
36567
36582
  }
36568
36583
  return { hasConflict: false, conflicts: [] };
36569
36584
  }
36570
- var CLAUDE, CODEX, KIMI, CODEBUDDY, PLATFORMS, VALID_DISTRIBUTION_TYPES, VALID_ACTION_TYPES, VALID_SOURCE_FORMS, VALID_MARKETPLACE_REF_FORMS, VALID_LIST_OUTPUTS, VALID_CLI_OUTPUTS, VALID_ENTRY_VERSION_BINDING, VALID_INSTALL_METHODS, VALID_REF_STRENGTHS, VALID_OUTPUT_PROTOCOLS, VALID_IDENTITY_EVIDENCE, VALID_DEGRADATION_POLICIES;
36585
+ var CLAUDE, CODEX, KIMI, CODEBUDDY, PLATFORMS, VALID_DISTRIBUTION_TYPES, VALID_ACTION_TYPES, VALID_SOURCE_FORMS, VALID_MARKETPLACE_REF_FORMS, VALID_LIST_OUTPUTS, VALID_CLI_OUTPUTS, VALID_ENTRY_VERSION_BINDING, VALID_INSTALL_METHODS, VALID_REF_STRENGTHS, VALID_OUTPUT_PROTOCOLS, VALID_IDENTITY_EVIDENCE, VALID_DEGRADATION_POLICIES, SKILL_PROJECTION_SURFACE_PATTERN;
36571
36586
  var init_registry2 = __esm({
36572
36587
  async "src/platforms/registry.mjs"() {
36573
36588
  await init_kimi();
@@ -36582,6 +36597,7 @@ var init_registry2 = __esm({
36582
36597
  __name(codexCrossValidateListEntry, "codexCrossValidateListEntry");
36583
36598
  CLAUDE = Object.freeze({
36584
36599
  id: "claude",
36600
+ skillProjectionSurface: "platforms/claude-code",
36585
36601
  distributionType: "claude-plugin",
36586
36602
  actionType: "claude-marketplace-install",
36587
36603
  // Runtime adapter implementing this platform's marketplace-install action.
@@ -36646,6 +36662,7 @@ var init_registry2 = __esm({
36646
36662
  });
36647
36663
  CODEX = Object.freeze({
36648
36664
  id: "codex",
36665
+ skillProjectionSurface: "platforms/codex",
36649
36666
  distributionType: "codex-plugin",
36650
36667
  actionType: "codex-marketplace-install",
36651
36668
  adapter: "plugin-marketplace",
@@ -36706,6 +36723,7 @@ var init_registry2 = __esm({
36706
36723
  });
36707
36724
  KIMI = Object.freeze({
36708
36725
  id: "kimi",
36726
+ skillProjectionSurface: "platforms/kimi-code",
36709
36727
  distributionType: "kimi-plugin",
36710
36728
  actionType: "kimi-marketplace-install",
36711
36729
  adapter: "plugin-marketplace",
@@ -36765,6 +36783,7 @@ var init_registry2 = __esm({
36765
36783
  });
36766
36784
  CODEBUDDY = Object.freeze({
36767
36785
  id: "codebuddy",
36786
+ skillProjectionSurface: "platforms/workbuddy",
36768
36787
  distributionType: "codebuddy-plugin",
36769
36788
  actionType: "codebuddy-marketplace-install",
36770
36789
  adapter: "plugin-marketplace",
@@ -36847,7 +36866,9 @@ var init_registry2 = __esm({
36847
36866
  VALID_OUTPUT_PROTOCOLS = /* @__PURE__ */ new Set(["structured", "text", "none"]);
36848
36867
  VALID_IDENTITY_EVIDENCE = /* @__PURE__ */ new Set(["list-record", "install-output", "filesystem-payload", "human-attestation"]);
36849
36868
  VALID_DEGRADATION_POLICIES = /* @__PURE__ */ new Set(["block", "human-attestation", "human-attestation-with-fallback"]);
36869
+ SKILL_PROJECTION_SURFACE_PATTERN = /^platforms\/[a-z0-9]+(?:-[a-z0-9]+)*$/u;
36850
36870
  __name(getPlatform, "getPlatform");
36871
+ __name(resolveSkillProjectionSurfaceHost, "resolveSkillProjectionSurfaceHost");
36851
36872
  __name(assertRegistry, "assertRegistry");
36852
36873
  assertRegistry();
36853
36874
  __name(resolvePlatformRoute, "resolvePlatformRoute");
@@ -44262,8 +44283,17 @@ async function discoverSkills(root, base = root) {
44262
44283
  function resolvePluginRoot(skillRelativePath, scanRoot2) {
44263
44284
  const parts = toPosix(skillRelativePath).split("/");
44264
44285
  const skillsIndex = parts.lastIndexOf("skills");
44265
- if (skillsIndex < 0) return resolve17(scanRoot2);
44266
- 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);
44267
44297
  }
44268
44298
  function resolveSkillRoot(skillRelativePath, scanRoot2) {
44269
44299
  return resolve17(scanRoot2, dirname7(skillRelativePath));
@@ -44399,8 +44429,13 @@ async function collectRegularFiles(dir, results) {
44399
44429
  }
44400
44430
  }
44401
44431
  function inferSurfaceHost(surfaceId, defaultHost) {
44402
- const match = ADAPTER_SURFACE_PATTERN.exec(surfaceId);
44403
- return match?.[1] ?? defaultHost;
44432
+ const adapterMatch = ADAPTER_SURFACE_PATTERN.exec(surfaceId);
44433
+ if (adapterMatch) return adapterMatch[1];
44434
+ const platformMatch = PLATFORM_SURFACE_PATTERN.exec(surfaceId);
44435
+ if (platformMatch) {
44436
+ return resolveSkillProjectionSurfaceHost(surfaceId) ?? `unknown-platform:${platformMatch[1]}`;
44437
+ }
44438
+ return defaultHost;
44404
44439
  }
44405
44440
  function receiptProjection(result) {
44406
44441
  return {
@@ -44509,6 +44544,7 @@ async function checkSkillResourceClosure({
44509
44544
  const pluginRoot = resolvePluginRoot(skill, scanRoot2);
44510
44545
  const surfaceId = relativeStable(scanRoot2, pluginRoot);
44511
44546
  const surfaceHost = inferSurfaceHost(surfaceId, host);
44547
+ const firstSkillOnSurface = !surfaceMap.has(surfaceId);
44512
44548
  const surface = surfaceMap.get(surfaceId) ?? {
44513
44549
  id: surfaceId,
44514
44550
  host: surfaceHost,
@@ -44518,6 +44554,19 @@ async function checkSkillResourceClosure({
44518
44554
  };
44519
44555
  surface.skillCount += 1;
44520
44556
  surfaceMap.set(surfaceId, surface);
44557
+ if (firstSkillOnSurface && PLATFORM_SURFACE_PATTERN.test(surfaceId) && resolveSkillProjectionSurfaceHost(surfaceId) === null) {
44558
+ findings.push({
44559
+ host: surfaceHost,
44560
+ surface: surfaceId,
44561
+ skill: null,
44562
+ line: null,
44563
+ reference: surfaceId,
44564
+ classification: CLASSIFICATION.UNKNOWN_PLATFORM_SURFACE,
44565
+ resolutionRoot: surfaceId,
44566
+ resolvedTarget: surfaceId,
44567
+ code: FINDING_CODE.UNKNOWN_PLATFORM_SURFACE
44568
+ });
44569
+ }
44521
44570
  if (!skillsBySurface.has(surfaceId)) skillsBySurface.set(surfaceId, []);
44522
44571
  skillsBySurface.get(surfaceId).push(skill);
44523
44572
  const content = await readFile12(resolve17(scanRoot2, skill), "utf8");
@@ -44711,13 +44760,14 @@ function evaluateDeclaredHostSurfaceCoverage(expectedHosts, surfaces) {
44711
44760
  }
44712
44761
  return { passed: missing.length === 0, missing };
44713
44762
  }
44714
- var CHECKER_VERSION, BARE_PREFIXES, EXPLICIT_PREFIXES, SOURCE_TREE_PATTERN, MACHINE_ABSOLUTE_PATTERN, HOME_DIRECTORY_PATTERN, ADAPTER_SURFACE_PATTERN, CLOSURE_RESOURCE_DIRS, GLOB_PATTERN, SOURCE_ONLY_MARKER, TRANSPORT_EXCLUSIONS, CLASSIFICATION, FINDING_CODE;
44763
+ var CHECKER_VERSION, BARE_PREFIXES, EXPLICIT_PREFIXES, SOURCE_TREE_PATTERN, MACHINE_ABSOLUTE_PATTERN, HOME_DIRECTORY_PATTERN, ADAPTER_SURFACE_PATTERN, PLATFORM_SURFACE_PATTERN, CLOSURE_RESOURCE_DIRS, GLOB_PATTERN, SOURCE_ONLY_MARKER, TRANSPORT_EXCLUSIONS, CLASSIFICATION, FINDING_CODE;
44715
44764
  var init_skill_resource_closure = __esm({
44716
- "src/core/skill-resource-closure.mjs"() {
44765
+ async "src/core/skill-resource-closure.mjs"() {
44717
44766
  init_src();
44718
44767
  init_errors3();
44719
44768
  init_frozen();
44720
- CHECKER_VERSION = "skill-resource-closure-v2";
44769
+ await init_registry2();
44770
+ CHECKER_VERSION = "skill-resource-closure-v4";
44721
44771
  BARE_PREFIXES = ["references/", "assets/", "schemas/", "examples/", "scripts/"];
44722
44772
  EXPLICIT_PREFIXES = [
44723
44773
  "<plugin-root>/",
@@ -44731,6 +44781,7 @@ var init_skill_resource_closure = __esm({
44731
44781
  MACHINE_ABSOLUTE_PATTERN = /^(?:\/(?:Users|home|root|tmp|var|etc|opt)(?:\/|$)|[A-Za-z]:[\\/])/u;
44732
44782
  HOME_DIRECTORY_PATTERN = /^(?:~|\$HOME|\$\{HOME\})\/.+/u;
44733
44783
  ADAPTER_SURFACE_PATTERN = /^adapters\/([^/]+)$/u;
44784
+ PLATFORM_SURFACE_PATTERN = /^platforms\/(.+)$/u;
44734
44785
  CLOSURE_RESOURCE_DIRS = Object.freeze(["references", "assets", "schemas", "examples", "scripts"]);
44735
44786
  GLOB_PATTERN = /[*?\[]/u;
44736
44787
  SOURCE_ONLY_MARKER = /(?:\bsource-only\b|仅源码包)/iu;
@@ -44748,7 +44799,8 @@ var init_skill_resource_closure = __esm({
44748
44799
  HOME_DIRECTORY: "home_directory",
44749
44800
  OUT_OF_BOUNDS: "out_of_bounds",
44750
44801
  RESOURCE_DRIFT: "resource_drift",
44751
- STALE_RESOURCE: "stale_resource"
44802
+ STALE_RESOURCE: "stale_resource",
44803
+ UNKNOWN_PLATFORM_SURFACE: "unknown_platform_surface"
44752
44804
  });
44753
44805
  FINDING_CODE = Object.freeze({
44754
44806
  SNAPSHOT_UNSAFE: "SNAPSHOT_UNSAFE",
@@ -44760,7 +44812,8 @@ var init_skill_resource_closure = __esm({
44760
44812
  OUT_OF_BOUNDS: "OUT_OF_BOUNDS",
44761
44813
  SYMLINK_NOT_ALLOWED: "SYMLINK_NOT_ALLOWED",
44762
44814
  RESOURCE_DRIFT: "RESOURCE_DRIFT",
44763
- STALE_RESOURCE: "STALE_RESOURCE"
44815
+ STALE_RESOURCE: "STALE_RESOURCE",
44816
+ UNKNOWN_PLATFORM_SURFACE: "UNKNOWN_PLATFORM_SURFACE"
44764
44817
  });
44765
44818
  __name(toPosix, "toPosix");
44766
44819
  __name(relativeStable, "relativeStable");
@@ -100763,7 +100816,7 @@ var init_prepare = __esm({
100763
100816
  init_evidence();
100764
100817
  await init_plan();
100765
100818
  init_digest();
100766
- init_skill_resource_closure();
100819
+ await init_skill_resource_closure();
100767
100820
  init_public_map();
100768
100821
  init_public_path();
100769
100822
  init_scan();
@@ -102785,7 +102838,7 @@ var init_publish = __esm({
102785
102838
  init_baseline2();
102786
102839
  init_previous_public_baseline();
102787
102840
  init_evidence();
102788
- init_skill_resource_closure();
102841
+ await init_skill_resource_closure();
102789
102842
  init_checkpoints();
102790
102843
  await init_run();
102791
102844
  init_errors3();
@@ -105332,7 +105385,7 @@ var init_verify = __esm({
105332
105385
  init_public_path();
105333
105386
  init_npm();
105334
105387
  init_verification_gates();
105335
- init_skill_resource_closure();
105388
+ await init_skill_resource_closure();
105336
105389
  init_checkpoints();
105337
105390
  init_installation_contract();
105338
105391
  init_npm_entry_closure();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.7.3",
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.3.",
22
+ "Prepare a release plan for version 0.7.5.",
23
23
  "Help me understand the release workflow."
24
24
  ]
25
25
  }