release-skill 0.9.36 → 0.9.37

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 (77) 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 +24 -0
  8. package/INSTALL.md +2 -2
  9. package/INSTALL.zh-CN.md +2 -2
  10. package/README.md +24 -10
  11. package/README.zh-CN.md +15 -10
  12. package/adapters/claude/.claude-plugin/plugin.json +1 -1
  13. package/adapters/claude/bin/release-skill.bundle.mjs +110 -13
  14. package/adapters/claude/skills/release-config/SKILL.md +36 -41
  15. package/adapters/claude/skills/release-docs/SKILL.md +38 -35
  16. package/adapters/claude/skills/release-help/SKILL.md +51 -41
  17. package/adapters/claude/skills/release-marketplace/SKILL.md +38 -46
  18. package/adapters/claude/skills/release-prepare/SKILL.md +19 -28
  19. package/adapters/claude/skills/release-publish/SKILL.md +29 -45
  20. package/adapters/codex/.codex-plugin/plugin.json +2 -2
  21. package/adapters/codex/bin/release-skill.bundle.mjs +110 -13
  22. package/adapters/codex/skills/release-config/SKILL.md +36 -41
  23. package/adapters/codex/skills/release-docs/SKILL.md +38 -35
  24. package/adapters/codex/skills/release-help/SKILL.md +51 -41
  25. package/adapters/codex/skills/release-marketplace/SKILL.md +38 -46
  26. package/adapters/codex/skills/release-prepare/SKILL.md +19 -28
  27. package/adapters/codex/skills/release-publish/SKILL.md +29 -45
  28. package/adapters/cursor/.cursor-plugin/plugin.json +1 -1
  29. package/adapters/cursor/bin/release-skill.bundle.mjs +110 -13
  30. package/adapters/cursor/skills/release-config/SKILL.md +36 -41
  31. package/adapters/cursor/skills/release-docs/SKILL.md +38 -35
  32. package/adapters/cursor/skills/release-help/SKILL.md +51 -41
  33. package/adapters/cursor/skills/release-marketplace/SKILL.md +38 -46
  34. package/adapters/cursor/skills/release-prepare/SKILL.md +19 -28
  35. package/adapters/cursor/skills/release-publish/SKILL.md +29 -45
  36. package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
  37. package/adapters/kimi/bin/release-skill.bundle.mjs +110 -13
  38. package/adapters/kimi/skills/release-config/SKILL.md +36 -41
  39. package/adapters/kimi/skills/release-docs/SKILL.md +38 -35
  40. package/adapters/kimi/skills/release-help/SKILL.md +51 -41
  41. package/adapters/kimi/skills/release-marketplace/SKILL.md +38 -46
  42. package/adapters/kimi/skills/release-prepare/SKILL.md +19 -28
  43. package/adapters/kimi/skills/release-publish/SKILL.md +29 -45
  44. package/adapters/qoder/.qoder-plugin/plugin.json +1 -1
  45. package/adapters/qoder/bin/release-skill.bundle.mjs +110 -13
  46. package/adapters/qoder/skills/release-config/SKILL.md +36 -41
  47. package/adapters/qoder/skills/release-docs/SKILL.md +38 -35
  48. package/adapters/qoder/skills/release-help/SKILL.md +51 -41
  49. package/adapters/qoder/skills/release-marketplace/SKILL.md +38 -46
  50. package/adapters/qoder/skills/release-prepare/SKILL.md +19 -28
  51. package/adapters/qoder/skills/release-publish/SKILL.md +29 -45
  52. package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
  53. package/adapters/workbuddy/bin/release-skill.bundle.mjs +110 -13
  54. package/adapters/workbuddy/skills/release-config/SKILL.md +36 -41
  55. package/adapters/workbuddy/skills/release-docs/SKILL.md +38 -35
  56. package/adapters/workbuddy/skills/release-help/SKILL.md +51 -41
  57. package/adapters/workbuddy/skills/release-marketplace/SKILL.md +38 -46
  58. package/adapters/workbuddy/skills/release-prepare/SKILL.md +19 -28
  59. package/adapters/workbuddy/skills/release-publish/SKILL.md +29 -45
  60. package/bin/release-skill.bundle.mjs +110 -13
  61. package/package.json +1 -1
  62. package/platform-manifest.json +4 -4
  63. package/references/02-project-config.md +88 -7
  64. package/skills/release-config/SKILL.md +36 -41
  65. package/skills/release-docs/SKILL.md +38 -35
  66. package/skills/release-help/SKILL.md +51 -41
  67. package/skills/release-marketplace/SKILL.md +38 -46
  68. package/skills/release-prepare/SKILL.md +19 -28
  69. package/skills/release-publish/SKILL.md +29 -45
  70. package/skills-src/release-config/SKILL.md +36 -41
  71. package/skills-src/release-docs/SKILL.md +38 -35
  72. package/skills-src/release-help/SKILL.md +51 -41
  73. package/skills-src/release-marketplace/SKILL.md +38 -46
  74. package/skills-src/release-prepare/SKILL.md +19 -28
  75. package/skills-src/release-publish/SKILL.md +29 -45
  76. package/src/commands/verify.mjs +123 -17
  77. package/src/core/skill-resource-closure.mjs +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.36",
3
+ "version": "0.9.37",
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.9.36",
3
+ "version": "0.9.37",
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.9.36",
3
+ "version": "0.9.37",
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.9.36.",
22
+ "Prepare a release plan for version 0.9.37.",
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.9.36",
3
+ "version": "0.9.37",
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.9.36",
3
+ "version": "0.9.37",
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.9.36",
3
+ "version": "0.9.37",
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,29 @@
1
1
  # Changelog
2
2
 
3
+ <!-- release-skill:changelog:start version=0.9.37 locale=en baseline=sha256:11b436a4b3d6a642189df7126078f2fa2a2d3cf0922d8031d0c33cb12d9680d3 -->
4
+ ## [0.9.37] - 2026-10-23
5
+
6
+ 0.9.37 fixes a false verification failure caused by write-bit changes to installed files in the single-plugin path where the frozen plugin root is the project root. It also adds a TEST intake choice before a Skill starts a new production preparation. The three Foundation dependencies remain pinned to 0.25.0. This note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance.
7
+
8
+ ### Security
9
+
10
+ - Remote-write authorization and release approval remain unchanged. Consent to skip TEST intake is not release approval.
11
+ - Skill Family Hub is the unified marketplace. Updates use GitHub Git Data API and compare-and-swap against the observed branch head; partial Hub publication is never rolled back or force-pushed, and completed steps are not overwritten.
12
+
13
+ ### Added
14
+
15
+ - Before a Skill starts a new production preparation, it checks `testIntake`. When wiring is missing, the Skill directs the project through the existing `skill-family-test:skill-family-test-plan` and `skill-family-test:skill-family-test-run` entries to organize the plan and checks and return the actual result. The original business owner judges the result; invoking TEST or skipping intake does not mean the tests passed. Skipping requires an explicit prompt followed by consent that applies to the current run and matches the project, version, and scope. Silence, refusal, general release preauthorization, and stale or mismatched consent do not qualify. A matching response for the current run may be reused.
16
+
17
+ ### Fixed
18
+
19
+ - Only in the single-plugin path where the frozen plugin root is the project root, `verify` ignores changes to all write permission bits (`mode & ~0o222`) when comparing installed files with the frozen snapshot. The frozen snapshot retains its original modes. File content, type, size, non-write mode bits, missing or extra paths, and frozen bindings remain strictly checked.
20
+
21
+ ### Upgrade Notes
22
+
23
+ This applies only to new Skill-led production preparation. Read-only and non-production paths, and approval, publish, reconcile, and formal verify for plans that are already frozen, gain no new TEST intake obligation. The direct non-interactive CLI continues to accept optional `testIntake`; no CLI argument, consent format, authentication, or state machine was added. Test results remain bound to the existing candidate and requirements contract. The release-skill standalone marketplace is deprecated; use `ifoohoo/skill-family-hub` and `release-skill@skill-family-hub`.
24
+ <!-- release-skill:changelog:end version=0.9.37 locale=en -->
25
+
26
+
3
27
  <!-- release-skill:changelog:start version=0.9.36 locale=en baseline=sha256:704d09597e835404867409d99c9b8d674751ef145a9e0855d6e2182d768bb3a2 -->
4
28
  ## [0.9.36] - 2026-10-22
5
29
 
package/INSTALL.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [简体中文](INSTALL.zh-CN.md)
4
4
 
5
- <!-- release-skill:release-version: 0.9.36 -->
5
+ <!-- release-skill:release-version: 0.9.37 -->
6
6
  ## Prerequisites
7
7
 
8
8
  - Node.js `>=22.22.2 <23` (22.22.2 or newer, and below 23)
@@ -125,7 +125,7 @@ tag pinned to the exact version (never the bare repository URL, which installs
125
125
  the latest release or default branch), confirm the trust prompt, then reload:
126
126
 
127
127
  ```
128
- /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.36
128
+ /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.37
129
129
  /plugins reload
130
130
  ```
131
131
 
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.9.36 -->
5
+ <!-- release-skill:release-version: 0.9.37 -->
6
6
  ## 前置条件
7
7
 
8
8
  - Node.js `>=22.22.2 <23`(22.22.2 及以上,且低于 23)
@@ -113,7 +113,7 @@ release-skill 当前只采用并验证 Kimi Code 的交互式 TUI 路径,**无
113
113
  (切勿使用裸仓库地址,它会安装最新 release 或默认分支),确认信任提示后重新加载:
114
114
 
115
115
  ```
116
- /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.36
116
+ /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.37
117
117
  /plugins reload
118
118
  ```
119
119
 
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.9.36 -->
5
+ <!-- release-skill:release-version: 0.9.37 -->
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,27 +14,30 @@ 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.9.36** (2026-10-22)
17
+ **0.9.37** (2026-10-23)
18
18
 
19
- 0.9.36 fixes incorrect rejection of valid dual-projection plugin directories in Qoder, ensures correct validation of market sources via both URL and GitHub-based manifests, and corrects Codex entry root detection to respect manifest-declared paths instead of hardcoding `skills/`. This release note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance. Foundation dependencies remain pinned to 0.25.0.
19
+ 0.9.37 fixes a false verification failure caused by write-bit changes to installed files in the single-plugin path where the frozen plugin root is the project root. It also adds a TEST intake choice before a Skill starts a new production preparation. The three Foundation dependencies remain pinned to 0.25.0. This note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance.
20
20
 
21
21
  **Security**
22
22
 
23
- - Foundation 0.25.0 remains unchanged; the source, scope, commit/digest, and full payload are preserved. The frozen snapshot is re-verified before writing, and the full payload is compared after installation. No new market, first-install, host strategy, framework, dependency, or tier has been introduced. 0.9.35 is immutable. Skill Family Hub remains the unified marketplace, using GitHub Git Data API and compare-and-swap bound to the observed branch head. Partial Hub publication is never rolled back or force-pushed; completed steps are not overwritten.
23
+ - Remote-write authorization and release approval remain unchanged. Consent to skip TEST intake is not release approval.
24
+ - Skill Family Hub is the unified marketplace. Updates use GitHub Git Data API and compare-and-swap against the observed branch head; partial Hub publication is never rolled back or force-pushed, and completed steps are not overwritten.
25
+
26
+ **Added**
27
+
28
+ - Before a Skill starts a new production preparation, it checks `testIntake`. When wiring is missing, the Skill directs the project through the existing `skill-family-test:skill-family-test-plan` and `skill-family-test:skill-family-test-run` entries to organize the plan and checks and return the actual result. The original business owner judges the result; invoking TEST or skipping intake does not mean the tests passed. Skipping requires an explicit prompt followed by consent that applies to the current run and matches the project, version, and scope. Silence, refusal, general release preauthorization, and stale or mismatched consent do not qualify. A matching response for the current run may be reused.
24
29
 
25
30
  **Fixed**
26
31
 
27
- - In 0.9.35, Qoder plugins incorrectly rejected valid dual-projection directories. The `name` and `version` in `.qoder-plugin/plugin.json` and `.claude-plugin/plugin.json` must bind to the same frozen target, though individual `skills` can differ. Each present candidate must be a valid JSON object, match the target identity, have non-empty `skills`, and resolve to a real directory within the plugin root. Native takes precedence; compatibility is only used when native is missing. If any candidate is invalid, installation fails immediately without fallback. After installation, the selected path and `skills` must exactly match the frozen choice, and full payload validation is retained.
28
- - Qoder now also accepts existing markets that provide `.claude-plugin/marketplace.json` instead of a root `marketplace.json`. The system supports two existing locations: a URL-based `marketplace.json` at the root, and a GitHub-based `marketplace.json` in `.claude-plugin/`. At least one must exist. Each present index must be valid and contain exactly one entry for the target plugin, bound to the same frozen identity; other plugin entries remain allowed. A bad source is not ignored just because another is valid. URL sources require exact repository and SHA verification, and any explicit `version` or `ref` must match. GitHub sources require exact verification of `repo`, `ref`, `sha`, and `entry.version`. Only confirmed missing files are considered absent. Validation occurs after market refresh and before plugin update. `ALREADY_CURRENT` remains read-only with zero update commands.
29
- - The Codex entry root check previously hardcoded `skills/`, rejecting valid paths like `.agents/skills/` declared in the manifest. Installation pre-check and post-install observation now respect the `skills` directory declared in the plugin manifest. When the field is missing, the default `skills/` path is retained, and existing prefix behavior is preserved. Explicitly invalid, out-of-bounds, or non-directory paths are rejected without fallback. Post-install observation and full payload verification must bind to the same frozen installation contract.
32
+ - Only in the single-plugin path where the frozen plugin root is the project root, `verify` ignores changes to all write permission bits (`mode & ~0o222`) when comparing installed files with the frozen snapshot. The frozen snapshot retains its original modes. File content, type, size, non-write mode bits, missing or extra paths, and frozen bindings remain strictly checked.
30
33
 
31
34
  **Upgrade Notes**
32
35
 
33
- The release-skill standalone marketplace is deprecated; use `ifoohoo/skill-family-hub` and the updated `release-skill@skill-family-hub`, `release-finish`, and public CLI. Unmodified plugins need not be republished. Byte changes require a new frozen plan and matching approval. Installation does not imply loading — if actual loading is not observed, the state remains `reload-pending`. Local completion failure does not alter the remote `VERIFIED` status.
36
+ This applies only to new Skill-led production preparation. Read-only and non-production paths, and approval, publish, reconcile, and formal verify for plans that are already frozen, gain no new TEST intake obligation. The direct non-interactive CLI continues to accept optional `testIntake`; no CLI argument, consent format, authentication, or state machine was added. Test results remain bound to the existing candidate and requirements contract. The release-skill standalone marketplace is deprecated; use `ifoohoo/skill-family-hub` and `release-skill@skill-family-hub`.
34
37
  <!-- release-skill:managed:end id=latest-release -->
35
38
 
36
39
  <!-- release-skill:capability:external-write-boundary -->
37
- > **Current boundary:** v0.9.36: this README records capabilities and verification boundaries;
40
+ > **Current boundary:** v0.9.37: this README records capabilities and verification boundaries;
38
41
  > it is not evidence of
39
42
  > publication, consumer-installation verification, or independent acceptance.
40
43
  > Release availability must be established from the corresponding release records
@@ -58,7 +61,7 @@ The release-skill standalone marketplace is deprecated; use `ifoohoo/skill-famil
58
61
  > publish global preflight.
59
62
 
60
63
  <!-- release-skill:capability:safe-first-command -->
61
- > **Production path verified since the v0.1.1 milestone; for v0.9.36,
64
+ > **Production path verified since the v0.1.1 milestone; for v0.9.37,
62
65
  > publication, consumer-installation verification, and independent acceptance
63
66
  > require version-specific release records and verification results.**
64
67
  > The npm-installed CLI is the supported user entry. Source checkout
@@ -615,6 +618,17 @@ of the current plan digest. Replacing the result, criterion, scope, or allowed
615
618
  limitation invalidates the previous approval. Approve, publish, and reconcile
616
619
  re-check those originals before acting.
617
620
 
621
+ When a Skill starts a new production prepare, it checks intake first. If
622
+ intake is missing, it names the gap and default-pushes the existing wiring.
623
+ Skip is allowed only after this-round matching explicit consent. Silence,
624
+ refuse, generic publish preauthorization, and stale, other-project, version,
625
+ or scope-mismatched consent do not skip. A matching this-round reply is
626
+ reused. Skip is never described as tests already passed. Already-frozen
627
+ approve, publish, reconcile, and verify do not gain a new intake obligation.
628
+ Read-only, non-production, and delegated marketplace-only paths do not add
629
+ one. Direct non-interactive CLI still accepts optional `testIntake` with no
630
+ new choice flag.
631
+
618
632
  Use `release-skill post-release --finish` for the complete local finish. It
619
633
  always reports merge, host update, actual host loading, setup, and source-branch
620
634
  steps. Exit 0 means every applicable step completed or was explicitly skipped;
package/README.zh-CN.md CHANGED
@@ -2,33 +2,36 @@
2
2
 
3
3
  [English](README.md) · 安装指南:[中文](INSTALL.zh-CN.md) / [English](INSTALL.md)
4
4
 
5
- <!-- release-skill:release-version: 0.9.36 -->
5
+ <!-- release-skill:release-version: 0.9.37 -->
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.9.36** (2026-10-22)
11
+ **0.9.37** (2026-10-23)
12
12
 
13
- 0.9.36 修复 Qoder 插件清单对合法双投影目录的误拒,确保市场来源在 URL 与 GitHub 两种路径下均正确校验,修正 Codex 入口目录检测逻辑以尊重 manifest 声明路径而非硬编码 skills/。本发布说明不代表已经发布、完成真实宿主验收、完成消费者安装验证或通过独立验收。Foundation 依赖保持精确锁定为 0.25.0。
13
+ 0.9.37 修复单插件发布单元在冻结插件根为项目根目录时,安装文件写权限变化造成的验证误报,并在 Skill 发起新一轮生产准备前加入 TEST 接入选择。三个 Foundation 依赖均精确锁定为 0.25.0。本发布说明不代表已经发布、完成真实宿主验收、完成消费者安装验证或通过独立验收。
14
14
 
15
15
  **安全**
16
16
 
17
- - Foundation 0.25.0 保持不变;Hub 来源、user-scope、冻结 commit/digest 与完整载荷校验机制保留。写入宿主前复验冻结快照摘要,安装后比较完整载荷。无新增市场、首装、新宿主策略、新框架、新依赖或 tier 变化。0.9.35 不可变。Skill Family Hub 仍为统一市场,沿用 GitHub Git Data API,以比较后写入绑定已观察的分支头;部分发布不回滚、不覆盖已完成步骤。
17
+ - 远端写入授权和发布批准保持不变。同意跳过 TEST 接入不等于发布批准。
18
+ - Skill Family Hub 是统一市场,更新采用 GitHub Git Data API,并以比较后写入绑定已观察的分支头;部分发布不回滚、不覆盖已完成步骤,也不 force-push。
19
+
20
+ **新增**
21
+
22
+ - Skill 启动新一轮生产准备前会核对 `testIntake`。缺少接线时,Skill 会引导项目通过现有的 `skill-family-test:skill-family-test-plan` 和 `skill-family-test:skill-family-test-run` 入口组织方案与检查,并交回实际结果。结果仍由原业务职责方判读;调用 TEST 或跳过接入都不表示测试已通过。跳过前必须明确征询,并取得适用于本轮且与项目、版本、范围匹配的同意。沉默、拒绝、一般发布预授权及过期或不匹配的同意都不能作为跳过依据;本轮匹配的答复可以复用。
18
23
 
19
24
  **修复**
20
25
 
21
- - 0.9.35 版本中,Qoder 插件误拒自身合法的双投影目录。`.qoder-plugin/plugin.json` 与 `.claude-plugin/plugin.json` 中的 name/version 必须绑定同一冻结目标,各自 skills 可不同。每个已存在候选必须是合法 JSON 对象、目标身份匹配、skills 非空且解析为插件根内真实目录。原生优先,仅原生缺失时才选兼容;任一候选无效即失败,不回退。安装后路径与 skills 必须精确匹配冻结选择,完整载荷检查保留。
22
- - Qoder 现可接受只提供 `.claude-plugin/marketplace.json`、未提供根 marketplace.json 的既有市场。支持两种既有位置:根 marketplace.json 的 URL 来源,以及 `.claude-plugin/marketplace.json` 的 GitHub 来源。至少一份存在,每份已存在清单均须合法,且目标插件恰有一条、绑定同一冻结身份;市场仍可包含其他插件。不因另一份有效而忽略坏清单。URL 来源保留仓库与 sha 精确校验,显式 version/ref 必须匹配;兼容 GitHub 来源校验 repo/ref/sha/entry.version。仅确定缺文件视为缺席。市场刷新后、插件更新前校验;ALREADY_CURRENT 保持只读且零更新命令。
23
- - Codex 入口目录原检查写死为 skills/,误拒 `.agents/skills/` 等合法 manifest 声明路径。安装前检查与安装后观察均采用 manifest 声明的 skills 目录。字段缺省时继续使用既有 skills/ 默认路径,入口名前缀行为保留。显式无效、越界或非目录路径拒绝,不回退。已安装入口观察与完整载荷验证须绑定同一冻结安装合同。
26
+ - 仅在单插件发布单元且冻结插件根为项目根目录的验证路径中,`verify` 比较已安装文件与冻结快照时忽略所有写权限位(`mode & ~0o222`)。冻结快照保留原始权限;文件内容、类型、大小、非写权限位、缺失或新增路径及冻结绑定仍严格检查。
24
27
 
25
28
  **升级说明**
26
29
 
27
- 原独立的 `release-skill` 市场已弃用。使用更新后的 `release-skill@skill-family-hub` 入口、`release-finish` 与公共 CLI。未改插件无需重发,改字节须新冻结计划与匹配批准。安装 ≠ 加载,未观察实际加载则保留 reload-pending 状态。本机收尾失败不改变远端 VERIFIED 状态。统一使用 `ifoohoo/skill-family-hub` 和 `release-skill@skill-family-hub`。
30
+ 本项只适用于由 Skill 开始的新一轮生产准备。只读、非生产路径,以及已有冻结计划的批准、发布、对账和正式验证不新增 TEST 接入义务。直接非交互 CLI 仍接受可选 `testIntake`;本版本未增加 CLI 参数、同意格式、认证或状态机。测试结果继续按既有合同绑定候选与要求。原独立的 `release-skill` 市场已弃用,请使用 `ifoohoo/skill-family-hub` 和 `release-skill@skill-family-hub`。
28
31
  <!-- release-skill:managed:end id=latest-release -->
29
32
 
30
33
  <!-- release-skill:capability:external-write-boundary -->
31
- > **当前边界:** v0.9.36 的能力范围与验证边界见本 README,
34
+ > **当前边界:** v0.9.37 的能力范围与验证边界见本 README,
32
35
  > 不代表已经发布、完成消费者安装验证或通过独立验收。
33
36
  > 版本可用性以对应发布记录及发布后验证结果为准。
34
37
  > v0.4.1 是更早的已发布里程碑(v0.2.2 曾处于已发布状态,后因平台验证收敛修复而更新)。
@@ -44,7 +47,7 @@ release-skill 帮助维护者回答三个问题:准备发布什么、还有哪
44
47
  > 远端唯一性检查在 `publish` 全局预检执行。
45
48
 
46
49
  <!-- release-skill:capability:safe-first-command -->
47
- > **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.9.36 的发布、消费者安装验证和独立验收状态须由该版本的发布记录及验证结果确认。**
50
+ > **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.9.37 的发布、消费者安装验证和独立验收状态须由该版本的发布记录及验证结果确认。**
48
51
  > npm 安装的 CLI 是受支持的用户入口;源码 checkout 保留为开发/贡献者路径。
49
52
  >
50
53
  > **第一条命令:**
@@ -504,6 +507,8 @@ release-finish 在 `--root` 指定的当前发布项目根目录调用该入口
504
507
 
505
508
  可选的 `testIntake` 只声明要求文件和结果文件,并且只在生产 prepare 中生效。首次生产 prepare 保存一份非正式候选,返回 `NEEDS_INPUT`(`GATE_FAILED`,退出码 13),并给出 `candidatePath`、`candidateSha256` 和 `subjectDigest`,此时不写正式计划。用 `prepare --candidate <path>` 续接同一候选;适用的冻结前要求通过后才写入正式计划和 `PREPARED`。候选不能用于批准或发布,也不能清除 `PARTIAL`、`PUBLISHED` 或 `VERIFIED`。未声明 `testIntake` 的项目保持原有 hook、完整门和发布路径。docs、config、marketplace 工作流、单元选择和无需发布的配置都不免除项目级要求。非生产 prepare 拒绝 `testIntake`,错误码为 `CONFIG_INVALID`。可选的 `testAcceptance` 进入当前计划摘要。替换结果、准则、范围或允许的限制会使原批准失效。approve、publish 和 reconcile 在动作前复核这些原件。
506
509
 
510
+ 由 Skill 发起的新一轮生产准备先核对接入。缺失则说明缺项并默认推动现有接线;仅本轮适用且范围匹配的明确同意可跳过。沉默、拒绝、仅普通发布预授权、旧轮次、其他项目、版本或范围不匹配均不可跳过;本轮匹配答复可复用。不得把跳过写成测试已达标。已冻结计划的批准、发布、对账与正式验证不回头追加接入义务。只读、非生产及 marketplace-only 委托发布不新增接入义务。直接非交互 CLI 仍接受可选 `testIntake`,不新增选择参数。
511
+
507
512
  完整的本地收尾使用 `release-skill post-release --finish`。命令固定报告分支决定、宿主更新、实际加载、setup 和源码分支检查:全部适用步骤完成或明确跳过时退出 0,仍有待办时退出 2,确定失败时退出 1。智能体通过绝对路径的 `--finish-feedback` JSON 文件回传观察,文件必须绑定当前计划摘要、配置摘要和规范项目根目录。反馈只作为数据:脚本不执行其中字符串,也不把反馈当成新的写入授权。`--skip-local-hosts` 显示跳过宿主更新、加载和 setup,不得与 `--hosts` 或 `--update-local-hosts` 同时使用。
508
513
 
509
514
  `distributions` 是必填字段,但可以显式设为空数组。使用
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.36",
3
+ "version": "0.9.37",
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.36"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.37"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "bc9386087a5bffe2f92c12f687ec75582a9e853164020e99618a4bdf5cd13a68";
14
+ const __bundleSourceDigest = "6eb7b6560da84252426dc5cfc81297a3d5d6d6101aecb1a8fbf3f35402892715";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -116683,6 +116683,49 @@ import { dirname as dirname11, join as join20, relative as relative18, isAbsolut
116683
116683
  import { tmpdir as tmpdir3 } from "node:os";
116684
116684
  import { execFile as execFileCb7 } from "node:child_process";
116685
116685
  import { promisify as promisify7 } from "node:util";
116686
+ function transportIdentityEntries(entries) {
116687
+ return entries.map(({ path: path43, type, mode, size, contentDigest }) => ({
116688
+ path: path43,
116689
+ type,
116690
+ mode: mode & ~WRITE_BITS,
116691
+ size,
116692
+ contentDigest
116693
+ }));
116694
+ }
116695
+ function compareInstallToFrozenTransport(frozenEntries, installedEntries) {
116696
+ const frozen = transportIdentityEntries(frozenEntries);
116697
+ const installed = transportIdentityEntries(installedEntries);
116698
+ const installedByPath = new Map(installed.map((entry) => [entry.path, entry]));
116699
+ const conflicts = [];
116700
+ for (const frozenEntry of frozen) {
116701
+ const installedEntry = installedByPath.get(frozenEntry.path);
116702
+ if (!installedEntry) {
116703
+ conflicts.push(`missing: ${frozenEntry.path}`);
116704
+ continue;
116705
+ }
116706
+ if (installedEntry.type !== frozenEntry.type) {
116707
+ conflicts.push(`type mismatch: ${frozenEntry.path}`);
116708
+ } else if (installedEntry.size !== frozenEntry.size || installedEntry.contentDigest !== frozenEntry.contentDigest) {
116709
+ conflicts.push(`content mismatch: ${frozenEntry.path}`);
116710
+ } else if (installedEntry.mode !== frozenEntry.mode) {
116711
+ conflicts.push(`mode mismatch: ${frozenEntry.path}`);
116712
+ }
116713
+ }
116714
+ const frozenPaths = new Set(frozen.map((entry) => entry.path));
116715
+ for (const installedEntry of installed) {
116716
+ if (!frozenPaths.has(installedEntry.path)) {
116717
+ conflicts.push(`extra: ${installedEntry.path}`);
116718
+ }
116719
+ }
116720
+ return conflicts;
116721
+ }
116722
+ function frozenSnapshotRelativePath(unit, actions, unitId) {
116723
+ if (typeof unit?.frozenSnapshot?.path === "string" && unit.frozenSnapshot.path.length > 0) {
116724
+ return unit.frozenSnapshot.path;
116725
+ }
116726
+ const action = (actions ?? []).find((item) => item.unitId === unitId && typeof item.parameters?.snapshotPath === "string" && item.parameters.snapshotPath.length > 0);
116727
+ return action?.parameters?.snapshotPath ?? null;
116728
+ }
116686
116729
  async function verifyCursorHostDistributions({
116687
116730
  plan,
116688
116731
  root,
@@ -118258,16 +118301,65 @@ async function verifyRelease(options) {
118258
118301
  }
118259
118302
  const pluginDistCount = (surface.unit?.distributions ?? []).filter((d) => d.type !== "npm").length;
118260
118303
  if (pluginDistCount === 1 && surface.frozenPluginRoot === ".") {
118261
- const observedReceipt = createSkillResourceClosureReceipt(closureResult, {
118262
- unitId: surface.unitId,
118263
- preparedAt: expectedUnitReceipt.preparedAt ?? null,
118264
- exitCode: expectedUnitReceipt.exitCode ?? 0
118265
- });
118266
- assertSkillResourceClosureReceipt(
118267
- expectedUnitReceipt,
118268
- observedReceipt,
118269
- `unit "${surface.unitId}"`
118270
- );
118304
+ const frozenRel = frozenSnapshotRelativePath(surface.unit, actions, surface.unitId);
118305
+ if (frozenRel) {
118306
+ const frozenDir = await resolveFrozenPath(root, frozenRel, "frozen snapshot path");
118307
+ const frozenClosure = await checkSkillResourceClosure({
118308
+ snapshotDir: frozenDir,
118309
+ host: surface.host,
118310
+ surfaceHostBindings: [{ surfaceId: surface.surfaceId, host: surface.host }]
118311
+ });
118312
+ const frozenReceipt = createSkillResourceClosureReceipt(frozenClosure, {
118313
+ unitId: surface.unitId,
118314
+ preparedAt: expectedUnitReceipt.preparedAt ?? null,
118315
+ exitCode: expectedUnitReceipt.exitCode ?? 0
118316
+ });
118317
+ assertSkillResourceClosureReceipt(
118318
+ expectedUnitReceipt,
118319
+ frozenReceipt,
118320
+ `unit "${surface.unitId}"`
118321
+ );
118322
+ const frozenSnap = await computeFrozenSnapshot(frozenDir, {
118323
+ excludeRootEntries: TRANSPORT_EXCLUSIONS
118324
+ });
118325
+ const installedSnap = await computeFrozenSnapshot(surface.installPath, {
118326
+ excludeRootEntries: TRANSPORT_EXCLUSIONS
118327
+ });
118328
+ const conflicts = compareInstallToFrozenTransport(
118329
+ frozenSnap.entries,
118330
+ installedSnap.entries
118331
+ );
118332
+ await evidence.append({
118333
+ phase: "verify",
118334
+ step: "skill-resource-closure",
118335
+ status: "install-comparison",
118336
+ unitId: surface.unitId,
118337
+ frozenInputDigest: frozenSnap.digest,
118338
+ installedInputDigest: installedSnap.digest,
118339
+ frozenModes: frozenSnap.entries.map((entry) => ({ path: entry.path, mode: entry.mode })),
118340
+ installedModes: installedSnap.entries.map((entry) => ({ path: entry.path, mode: entry.mode }))
118341
+ });
118342
+ if (conflicts.length > 0) {
118343
+ const listed = conflicts.slice(0, PAYLOAD_CONFLICT_REPORT_CAP2).join("; ");
118344
+ const overflow = conflicts.length > PAYLOAD_CONFLICT_REPORT_CAP2 ? `; and ${conflicts.length - PAYLOAD_CONFLICT_REPORT_CAP2} more conflicting path(s)` : "";
118345
+ throw new ReleaseError(
118346
+ POST_PUBLISH_VERIFY_FAILED,
118347
+ `installed plugin root differs in path, bytes, size, or non-write mode bits for unit "${surface.unitId}": ${listed}${overflow}`,
118348
+ { unitId: surface.unitId, conflicts }
118349
+ );
118350
+ }
118351
+ } else {
118352
+ const observedReceipt = createSkillResourceClosureReceipt(closureResult, {
118353
+ unitId: surface.unitId,
118354
+ preparedAt: expectedUnitReceipt.preparedAt ?? null,
118355
+ exitCode: expectedUnitReceipt.exitCode ?? 0
118356
+ });
118357
+ assertSkillResourceClosureReceipt(
118358
+ expectedUnitReceipt,
118359
+ observedReceipt,
118360
+ `unit "${surface.unitId}"`
118361
+ );
118362
+ }
118271
118363
  }
118272
118364
  }
118273
118365
  skillResourceClosureReceipts.push(createSkillResourceClosureReceipt(
@@ -118478,7 +118570,7 @@ async function verifyRelease(options) {
118478
118570
  throw err;
118479
118571
  }
118480
118572
  }
118481
- var execFile6, VERIFICATION_RESOLVED_TYPES, ADAPTER_ACTION_TYPE_MAP2, FIRST_RELEASE_BOOTSTRAP_MODE, EXTERNAL_MARKETPLACE_SHA_RE2, defaultNpmExecutor;
118573
+ var execFile6, VERIFICATION_RESOLVED_TYPES, WRITE_BITS, PAYLOAD_CONFLICT_REPORT_CAP2, ADAPTER_ACTION_TYPE_MAP2, FIRST_RELEASE_BOOTSTRAP_MODE, EXTERNAL_MARKETPLACE_SHA_RE2, defaultNpmExecutor;
118482
118574
  var init_verify = __esm({
118483
118575
  async "src/commands/verify.mjs"() {
118484
118576
  init_src2();
@@ -118516,6 +118608,11 @@ var init_verify = __esm({
118516
118608
  PASSED_MANUAL: "PASSED_MANUAL",
118517
118609
  NOT_REQUIRED_UNCHANGED: "NOT_REQUIRED_UNCHANGED"
118518
118610
  });
118611
+ WRITE_BITS = 146;
118612
+ PAYLOAD_CONFLICT_REPORT_CAP2 = 10;
118613
+ __name(transportIdentityEntries, "transportIdentityEntries");
118614
+ __name(compareInstallToFrozenTransport, "compareInstallToFrozenTransport");
118615
+ __name(frozenSnapshotRelativePath, "frozenSnapshotRelativePath");
118519
118616
  __name(verifyCursorHostDistributions, "verifyCursorHostDistributions");
118520
118617
  __name(verifyPublicSourceAuthorityReceiptOffline, "verifyPublicSourceAuthorityReceiptOffline");
118521
118618
  ADAPTER_ACTION_TYPE_MAP2 = {
@@ -7,36 +7,29 @@ description: "Config-only workflow profile: route confirms config-only diff, ass
7
7
 
8
8
  ## 触发
9
9
 
10
- 用户询问或执行纯配置变更的发布流程。包含 `.release-skill/project.yaml`、配置 schema 等配置文件的修改,且无代码、文档或 marketplace 变更。
10
+ 用户发起仅配置变更的发布流程,涉及 `.release-skill/project.yaml`、配置 schema、`releaseUnits` 映射、`policy` 策略定义等配置文件的修改,且无代码、文档或 marketplace 变更。
11
11
 
12
12
  ## 当前状态
13
13
 
14
- `release-config` 是工作流配置文件 (§4) 定义的独立工作流之一,专门处理仅配置变更的场景。它遵循简化生命周期,专注于配置验证和发布路径决策分支。
14
+ `release-config` 是工作流配置文件(§4)定义的独立工作流之一,专门处理仅配置变更场景。其遵循简化生命周期,专注于配置验证与发布路径决策分支。
15
15
 
16
- **机械实现**: `prepare --workflow config` 确定性地裁剪代码类门禁(H5),并比较当前
17
- per-unit `snapshotDigest` 与最新冻结 plan——公开字节未变 → `publishPath:
18
- 'no-publish-needed'`(externalActions 被移除,无 publish 路径);字节变化或无对比
19
- plan → `publishPath: 'publish-needed'`(fail-safe)。决策以 `workflowDecision` 绑定
20
- 进 plan digest,不可篡改。**不存在** `NO_PUBLISH_NEEDED`/`REPORTED` 虚构状态:
21
- prepare 的真实输出是 plan 内的 `workflowDecision`。
16
+ **机械实现**:`prepare --workflow config` 确定性地裁剪代码类门禁(H5),并比较当前 per-unit `snapshotDigest` 与最新冻结 plan——公开字节未变 → `publishPath: 'no-publish-needed'`(`externalActions` 被移除,无 publish 路径);字节变化或无对比 plan → `publishPath: 'publish-needed'`(fail-safe)。决策以 `workflowDecision` 绑定进 plan digest,不可篡改。**不存在** `NO_PUBLISH_NEEDED`/`REPORTED` 虚构状态:prepare 的真实输出是 plan 内的 `workflowDecision`。
22
17
 
23
18
  **边界**:裁剪代码类检查(declared hooks、snapshot-verify gates、skill-resource-closure),保留基线、快照、计划冻结和文档新鲜度检查。来源权威检查按发布分支决定,不能一并裁掉:
24
19
 
25
- - 场景 A:公开字节未变,`externalActions=[]`,不生成 `plan.sourceAuthority`(冻结的源码来源权威),也不进入 approve/publish/verify。即使配置了公开来源收据,这一边界也不变。
26
- - 场景 B:公开字节变化或不可判定,需要发布。production prepare 必须通过现有来源权威检查并冻结 `plan.sourceAuthority`;publish、reconcile、verify 继续校验冻结绑定和远端一致性,consumer-verify 保留。
20
+ - **场景 A**:公开字节未变,`externalActions=[]`,不生成 `plan.sourceAuthority`(冻结的源码来源权威),也不进入 approve/publish/verify。即使配置了公开来源收据,这一边界也不变。
21
+ - **场景 B**:公开字节变化或不可判定,需要发布。production prepare 必须通过现有来源权威检查并冻结 `plan.sourceAuthority`;publish、reconcile、verify 继续校验冻结绑定和远端一致性,consumer-verify 保留。
27
22
 
28
23
  旧 production 计划缺少 `sourceAuthority` 时,仍在外部写入前拒绝。未发生外部写入的旧计划必须重新 prepare 并批准新摘要,不补字段、不迁移旧批准。已有 `PARTIAL` 保留检查点,走匹配版本的恢复路径。docs production 同样要求来源权威;marketplace 委托目标工作区发布的边界不变。
29
24
 
30
25
  ## 职责与边界
31
26
 
32
- - **步骤① diff 确认 config-only**: 调用 `release-skill route` command 确认仅有配置变更
33
- - **步骤② assess with schema validation**: 执行配置结构验证、schema 检查、contract 一致性
34
- - **步骤③ prepare --workflow config**: 本地 freeze 检查,生成只读计划;输出 `workflowDecision`
35
- - **步骤④ decision branch**(来自 plan.workflowDecision):
36
- - 场景 A:`publishPath === 'no-publish-needed'`(公开字节未变化)→ 记录决策并结束,
37
- 无 publish 路径,不运行 approve/publish/verify
38
- - 场景 B:`publishPath === 'publish-needed'`(公开 surface 变化或不可判定)→ 运行
39
- 轻链 (approve→publish→verify)
27
+ - **步骤① diff 确认 config-only**:调用 `release-skill route` 命令确认仅有配置变更
28
+ - **步骤② assess with schema validation**:执行配置结构验证、schema 检查、contract 一致性
29
+ - **步骤③ prepare --workflow config**:本地 freeze 检查,生成只读计划;输出 `workflowDecision`
30
+ - **步骤④ decision branch**(来自 plan.workflowDecision):
31
+ - **场景 A**:`publishPath === 'no-publish-needed'`(公开字节未变化)→ 记录决策并结束,无 publish 路径,不运行 approve/publish/verify
32
+ - **场景 B**:`publishPath === 'publish-needed'`(公开 surface 变化或不可判定)→ 运行轻链(approve→publish→verify)
40
33
 
41
34
  存量增量只改本轮目标映射。已有合法字段、历史发行记录与精确授权保持不变,不要重建 `.release-skill/project.yaml`。
42
35
 
@@ -44,25 +37,27 @@ prepare 的真实输出是 plan 内的 `workflowDecision`。
44
37
 
45
38
  `delivery.include/exclude` 不是文件包含或排除。排除不得覆盖 `requiredPublicFiles`。互相冲突的配置必须失败关闭。Foundation 建议不能作为发布批准。未经精确批准不产生远端动作。分类文字不会机械识别全部私有内容。接入评估缺失码 `REQUIRED_PUBLIC_FILE_MISSING` 不属于本技能的 prepare 路径;config-only prepare 仍走 `release-prepare` 原生错误。
46
39
 
47
- **授权边界**: 命令调用本身即授权执行配置的 hooks/gates。config-only 工作流的远程写操作受标准 approval 机制约束,不 bypass 安全 gate。
40
+ **授权边界**:命令调用本身即授权执行配置的 hooks/gates。config-only 工作流的远程写操作受标准 approval 机制约束,不 bypass 安全 gate。
48
41
 
49
- **阶段通过规则**:
50
- - 场景 A: prepare 输出 `workflowDecision.decision === 'public-bytes-unchanged'`(无 publish 路径)
51
- - 场景 B: `status === 'VERIFIED'` + CLI exit code 0
42
+ **接入选择**:进入本入口的新一轮生产准备前,必须按 `release-prepare` 同一完整流程核对 `testIntake`。若缺失,须说明缺项并默认推动 `skill-family-test:skill-family-test-plan`,再在授权范围内调用 `skill-family-test:skill-family-test-run`,由 TEST 组织检查并交回结果。跳过须先明确征询,再依据本轮适用且范围匹配的明确同意决定。**沉默、拒绝、仅普通发布预授权、旧轮次、其他项目、版本或范围不匹配均不可跳过**。本轮匹配答复可复用。**不得把跳过写成测试已达标,也不得用跳过清除已声明的适用要求**。已冻结计划的批准、发布、对账与正式验证不回头追加接入义务。只读和非生产准备不新增接入义务。直接非交互 CLI 仍接受可选 `testIntake`,不新增选择参数。答复与适用范围记入既有任务或执行计划。
43
+
44
+ **阶段通过规则**:
45
+ - **场景 A**:prepare 输出 `workflowDecision.decision === 'public-bytes-unchanged'`(无 publish 路径)
46
+ - **场景 B**:`status === 'VERIFIED'` + CLI exit code 0
52
47
 
53
48
  ## 正向执行路径
54
49
 
55
- 1. 运行 `release-skill route --root <path> [--target-version <ver>] --json` 获取 diff 分类;已知目标版本时显式传入,route 只是工作流建议
50
+ 1. 运行 `release-skill route --root <path> [--target-version <ver>] --json` 获取 diff 分类;已知目标版本时显式传入,`route` 只是工作流建议
56
51
  2. 若推荐 `workflowKind === 'config-only'`,则使用本技能
57
52
  3. 执行步骤②:运行 `release-skill assess --root <path> --offline --json` 进行 schema validation
58
- 4. 执行步骤③:运行 `release-skill prepare --offline --workflow config --target-version <ver> --json`
59
- 5. 读取输出中的 `workflowDecision`:
60
- - **A**: `publishPath === 'no-publish-needed'` → 记录决策(plan 已冻结,无
61
- externalActions),结束。无需 approve/publish/verify
62
- - **B**: `publishPath === 'publish-needed'` → 继续 approve → publish → verify 链条
63
- 6. (场景 B 续) 执行步骤⑥:运行 `release-skill approve --plan <path> --actor <name>`
64
- 7. (场景 B 续) 执行步骤⑦:运行 `release-skill publish --plan <path> --approval <path>`
65
- 8. (场景 B 续) 执行步骤⑧:运行 `release-skill verify --plan <path> --run <path>`
53
+ 4. 进入本入口新一轮生产准备前完成接入选择:按 `release-prepare` 同一完整流程核对 `testIntake`,默认推动 `skill-family-test:skill-family-test-plan` 与授权范围内的 `skill-family-test-run`。跳过须先明确征询再依据本轮匹配答复决定。未完成接入且无有效跳过时,不进入下一步 `prepare`。该分支只决定后续是否进入发布链,不改变生产 prepare 前的测试接入要求。
54
+ 5. 执行步骤③:运行 `release-skill prepare --offline --workflow config --target-version <ver> --json`
55
+ 6. 读取输出中的 `workflowDecision`:
56
+ - **A**:`publishPath === 'no-publish-needed'` → 记录决策(plan 已冻结,无 `externalActions`),结束。无需 approve/publish/verify
57
+ - **B**:`publishPath === 'publish-needed'` → 继续 approve → publish → verify 链条
58
+ 7. (场景 B 续)执行步骤⑥:运行 `release-skill approve --plan <path> --actor <name>`
59
+ 8. (场景 B 续)执行步骤⑦:运行 `release-skill publish --plan <path> --approval <path>`
60
+ 9. (场景 B 续)执行步骤⑧:运行 `release-skill verify --plan <path> --run <path> --json`
66
61
 
67
62
  ## 确定性脚本调用
68
63
 
@@ -135,21 +130,21 @@ node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" verify \
135
130
 
136
131
  ## 与其他工作流的关系
137
132
 
138
- - **docs-only**: 纯文档变更时使用 `release-docs`
139
- - **marketplace-only**: 仅 marketplace 变更时使用独立工作流
140
- - **full-happy-end**: 混合变更(code+config+docs)时降级到此完整路径
133
+ - **docs-only**:纯文档变更时使用 `release-docs`
134
+ - **marketplace-only**:仅 marketplace 变更时使用独立工作流
135
+ - **full-happy-end**:混合变更(code+config+docs)时降级到此完整路径
141
136
 
142
137
  ## 关联技能
143
138
 
144
- - `release-skill route`: 快速入门决策路由(§4.3)
145
- - `release-assess`: 配置 schema/contract 验证入口
146
- - `release-prepare`: 离线冻结检查(`--workflow config` 输出 publish-path 决策)
147
- - `release-approve`: Plan approval(仅场景 B)
148
- - `release-publish`: 制品发布(仅在 public surface 变化时执行)
149
- - `release-verify`: 消费者验证(场景 B 的最终验证门)
139
+ - `release-skill route`:快速入门决策路由(§4.3)
140
+ - `release-assess`:配置 schema/contract 验证入口
141
+ - `release-prepare`:离线冻结检查(`--workflow config` 输出 publish-path 决策)
142
+ - `release-approve`:Plan approval(仅场景 B)
143
+ - `release-publish`:制品发布(仅在 public surface 变化时执行)
144
+ - `release-verify`:消费者验证(场景 B 的最终验证门)
150
145
 
151
146
  ## 人类最终回复
152
147
 
153
148
  纯问询或转交时短答:写明实际回答、适用范围或理由、必要限制和下一步。建议保持为建议。
154
149
 
155
- 执行路径说明实际分支、已完成步骤、未执行步骤,以及既有计划、`workflowDecision` 产物和限制。`publishPath` 为 `no-publish-needed` 时按原合同结束,无发布路径。场景 B 只写入已经执行的 approve、publish、verify 结果。已有文件输出按原合同呈现。栏目只收录当前命令或分支已经返回的事实。
150
+ 执行路径说明实际分支、已完成步骤、未执行步骤,以及既有计划、`workflowDecision` 产物和限制。`publishPath` 为 `no-publish-needed` 时按原合同结束,无发布路径。场景 B 只写入已经执行的 approve、publish、verify 结果。已有文件输出按原合同呈现。栏目只收录当前命令或分支已经返回的事实。