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.
- package/.claude-plugin/plugin.json +1 -1
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.cursor-plugin/plugin.json +1 -1
- package/.kimi-plugin/plugin.json +1 -1
- package/.qoder-plugin/plugin.json +1 -1
- package/CHANGELOG.md +24 -0
- package/INSTALL.md +2 -2
- package/INSTALL.zh-CN.md +2 -2
- package/README.md +24 -10
- package/README.zh-CN.md +15 -10
- package/adapters/claude/.claude-plugin/plugin.json +1 -1
- package/adapters/claude/bin/release-skill.bundle.mjs +110 -13
- package/adapters/claude/skills/release-config/SKILL.md +36 -41
- package/adapters/claude/skills/release-docs/SKILL.md +38 -35
- package/adapters/claude/skills/release-help/SKILL.md +51 -41
- package/adapters/claude/skills/release-marketplace/SKILL.md +38 -46
- package/adapters/claude/skills/release-prepare/SKILL.md +19 -28
- package/adapters/claude/skills/release-publish/SKILL.md +29 -45
- package/adapters/codex/.codex-plugin/plugin.json +2 -2
- package/adapters/codex/bin/release-skill.bundle.mjs +110 -13
- package/adapters/codex/skills/release-config/SKILL.md +36 -41
- package/adapters/codex/skills/release-docs/SKILL.md +38 -35
- package/adapters/codex/skills/release-help/SKILL.md +51 -41
- package/adapters/codex/skills/release-marketplace/SKILL.md +38 -46
- package/adapters/codex/skills/release-prepare/SKILL.md +19 -28
- package/adapters/codex/skills/release-publish/SKILL.md +29 -45
- package/adapters/cursor/.cursor-plugin/plugin.json +1 -1
- package/adapters/cursor/bin/release-skill.bundle.mjs +110 -13
- package/adapters/cursor/skills/release-config/SKILL.md +36 -41
- package/adapters/cursor/skills/release-docs/SKILL.md +38 -35
- package/adapters/cursor/skills/release-help/SKILL.md +51 -41
- package/adapters/cursor/skills/release-marketplace/SKILL.md +38 -46
- package/adapters/cursor/skills/release-prepare/SKILL.md +19 -28
- package/adapters/cursor/skills/release-publish/SKILL.md +29 -45
- package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
- package/adapters/kimi/bin/release-skill.bundle.mjs +110 -13
- package/adapters/kimi/skills/release-config/SKILL.md +36 -41
- package/adapters/kimi/skills/release-docs/SKILL.md +38 -35
- package/adapters/kimi/skills/release-help/SKILL.md +51 -41
- package/adapters/kimi/skills/release-marketplace/SKILL.md +38 -46
- package/adapters/kimi/skills/release-prepare/SKILL.md +19 -28
- package/adapters/kimi/skills/release-publish/SKILL.md +29 -45
- package/adapters/qoder/.qoder-plugin/plugin.json +1 -1
- package/adapters/qoder/bin/release-skill.bundle.mjs +110 -13
- package/adapters/qoder/skills/release-config/SKILL.md +36 -41
- package/adapters/qoder/skills/release-docs/SKILL.md +38 -35
- package/adapters/qoder/skills/release-help/SKILL.md +51 -41
- package/adapters/qoder/skills/release-marketplace/SKILL.md +38 -46
- package/adapters/qoder/skills/release-prepare/SKILL.md +19 -28
- package/adapters/qoder/skills/release-publish/SKILL.md +29 -45
- package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
- package/adapters/workbuddy/bin/release-skill.bundle.mjs +110 -13
- package/adapters/workbuddy/skills/release-config/SKILL.md +36 -41
- package/adapters/workbuddy/skills/release-docs/SKILL.md +38 -35
- package/adapters/workbuddy/skills/release-help/SKILL.md +51 -41
- package/adapters/workbuddy/skills/release-marketplace/SKILL.md +38 -46
- package/adapters/workbuddy/skills/release-prepare/SKILL.md +19 -28
- package/adapters/workbuddy/skills/release-publish/SKILL.md +29 -45
- package/bin/release-skill.bundle.mjs +110 -13
- package/package.json +1 -1
- package/platform-manifest.json +4 -4
- package/references/02-project-config.md +88 -7
- package/skills/release-config/SKILL.md +36 -41
- package/skills/release-docs/SKILL.md +38 -35
- package/skills/release-help/SKILL.md +51 -41
- package/skills/release-marketplace/SKILL.md +38 -46
- package/skills/release-prepare/SKILL.md +19 -28
- package/skills/release-publish/SKILL.md +29 -45
- package/skills-src/release-config/SKILL.md +36 -41
- package/skills-src/release-docs/SKILL.md +38 -35
- package/skills-src/release-help/SKILL.md +51 -41
- package/skills-src/release-marketplace/SKILL.md +38 -46
- package/skills-src/release-prepare/SKILL.md +19 -28
- package/skills-src/release-publish/SKILL.md +29 -45
- package/src/commands/verify.mjs +123 -17
- package/src/core/skill-resource-closure.mjs +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "release-skill",
|
|
3
|
-
"version": "0.9.
|
|
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.
|
|
22
|
+
"Prepare a release plan for version 0.9.37.",
|
|
23
23
|
"Help me understand the release workflow."
|
|
24
24
|
]
|
|
25
25
|
}
|
package/.kimi-plugin/plugin.json
CHANGED
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
17
|
+
**0.9.37** (2026-10-23)
|
|
18
18
|
|
|
19
|
-
0.9.
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
11
|
+
**0.9.37** (2026-10-23)
|
|
12
12
|
|
|
13
|
-
0.9.
|
|
13
|
+
0.9.37 修复单插件发布单元在冻结插件根为项目根目录时,安装文件写权限变化造成的验证误报,并在 Skill 发起新一轮生产准备前加入 TEST 接入选择。三个 Foundation 依赖均精确锁定为 0.25.0。本发布说明不代表已经发布、完成真实宿主验收、完成消费者安装验证或通过独立验收。
|
|
14
14
|
|
|
15
15
|
**安全**
|
|
16
16
|
|
|
17
|
-
-
|
|
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
|
-
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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` 是必填字段,但可以显式设为空数组。使用
|
|
@@ -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.
|
|
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 = "
|
|
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
|
|
118262
|
-
|
|
118263
|
-
|
|
118264
|
-
|
|
118265
|
-
|
|
118266
|
-
|
|
118267
|
-
|
|
118268
|
-
|
|
118269
|
-
|
|
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
|
-
|
|
10
|
+
用户发起仅配置变更的发布流程,涉及 `.release-skill/project.yaml`、配置 schema、`releaseUnits` 映射、`policy` 策略定义等配置文件的修改,且无代码、文档或 marketplace 变更。
|
|
11
11
|
|
|
12
12
|
## 当前状态
|
|
13
13
|
|
|
14
|
-
`release-config`
|
|
14
|
+
`release-config` 是工作流配置文件(§4)定义的独立工作流之一,专门处理仅配置变更场景。其遵循简化生命周期,专注于配置验证与发布路径决策分支。
|
|
15
15
|
|
|
16
|
-
|
|
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
|
-
-
|
|
26
|
-
-
|
|
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
|
|
33
|
-
- **步骤② assess with schema validation
|
|
34
|
-
- **步骤③ prepare --workflow config
|
|
35
|
-
- **步骤④ decision branch**(来自 plan.workflowDecision
|
|
36
|
-
-
|
|
37
|
-
|
|
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
|
-
|
|
40
|
+
**授权边界**:命令调用本身即授权执行配置的 hooks/gates。config-only 工作流的远程写操作受标准 approval 机制约束,不 bypass 安全 gate。
|
|
48
41
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
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.
|
|
59
|
-
5.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
- **B
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
|
139
|
-
- **marketplace-only
|
|
140
|
-
- **full-happy-end
|
|
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
|
|
145
|
-
- `release-assess
|
|
146
|
-
- `release-prepare
|
|
147
|
-
- `release-approve
|
|
148
|
-
- `release-publish
|
|
149
|
-
- `release-verify
|
|
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 结果。已有文件输出按原合同呈现。栏目只收录当前命令或分支已经返回的事实。
|