release-skill 0.1.5 → 0.1.7
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/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +4 -4
- package/CHANGELOG.md +108 -0
- package/INSTALL.md +81 -1
- package/INSTALL.zh-CN.md +69 -1
- package/LICENSE +1 -0
- package/NOTICE +10 -0
- package/README.md +181 -8
- package/README.zh-CN.md +153 -8
- package/adapters/claude/.claude-plugin/marketplace.json +3 -3
- package/adapters/claude/.claude-plugin/plugin.json +2 -2
- package/adapters/claude/bin/release-skill.bundle.mjs +14182 -10017
- package/adapters/claude/bin/release-skill.mjs +24 -4
- package/adapters/claude/native/safe-write/binding.gyp +2 -1
- package/adapters/claude/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
- package/adapters/claude/native/safe-write/prebuilds.json +1 -1
- package/adapters/claude/schemas/.render-manifest.json +10 -10
- package/adapters/claude/schemas/release-project.schema.json +118 -0
- package/adapters/claude/skills/release-help/SKILL.md +21 -0
- package/adapters/claude/skills/release-prepare/SKILL.md +17 -6
- package/adapters/claude/skills/release-publish/SKILL.md +3 -1
- package/adapters/claude/skills/release-reconcile/SKILL.md +1 -1
- package/adapters/codex/.codex-plugin/plugin.json +4 -4
- package/adapters/codex/bin/release-skill.bundle.mjs +14182 -10017
- package/adapters/codex/bin/release-skill.mjs +24 -4
- package/adapters/codex/native/safe-write/binding.gyp +2 -1
- package/adapters/codex/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
- package/adapters/codex/native/safe-write/prebuilds.json +1 -1
- package/adapters/codex/schemas/.render-manifest.json +10 -10
- package/adapters/codex/schemas/release-project.schema.json +118 -0
- package/adapters/codex/skills/release-help/SKILL.md +21 -0
- package/adapters/codex/skills/release-prepare/SKILL.md +17 -6
- package/adapters/codex/skills/release-publish/SKILL.md +3 -1
- package/adapters/codex/skills/release-reconcile/SKILL.md +1 -1
- package/bin/release-skill-cli.mjs +163 -4
- package/bin/release-skill.bundle.mjs +14182 -10017
- package/bin/release-skill.mjs +24 -4
- package/native/safe-write/binding.gyp +2 -1
- package/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
- package/native/safe-write/prebuilds.json +1 -1
- package/package.json +13 -5
- package/references/.render-manifest.json +4 -4
- package/references/02-project-config.md +24 -0
- package/references/05-evidence-and-errors.md +5 -0
- package/schemas/.render-manifest.json +10 -10
- package/schemas/release-project.schema.json +118 -0
- package/scripts/build-bundle.mjs +15 -2
- package/skills/release-help/SKILL.md +21 -0
- package/skills/release-prepare/SKILL.md +17 -6
- package/skills/release-publish/SKILL.md +3 -1
- package/skills/release-reconcile/SKILL.md +1 -1
- package/skills-src/release-help/SKILL.md +21 -0
- package/skills-src/release-prepare/SKILL.md +17 -6
- package/skills-src/release-publish/SKILL.md +3 -1
- package/skills-src/release-reconcile/SKILL.md +1 -1
- package/src/artifacts/transaction-journal.mjs +1126 -105
- package/src/artifacts/transaction.mjs +313 -130
- package/src/commands/docs.mjs +332 -0
- package/src/commands/prepare.mjs +316 -17
- package/src/core/errors.mjs +64 -2
- package/src/core/redact.mjs +206 -0
- package/src/docs/changelog-renderer.mjs +853 -0
- package/src/docs/config.mjs +337 -0
- package/src/docs/notes-loader.mjs +432 -0
- package/src/docs/notes.mjs +553 -0
- package/src/docs/readme-renderer.mjs +647 -0
- package/src/docs/refresh-planner.mjs +542 -0
- package/src/docs/refresh-service.mjs +675 -0
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
"name": "release-skill",
|
|
3
3
|
"description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
|
|
4
4
|
"owner": {
|
|
5
|
-
"name": "
|
|
6
|
-
"url": "https://github.com/
|
|
5
|
+
"name": "ifoohoo",
|
|
6
|
+
"url": "https://github.com/ifoohoo"
|
|
7
7
|
},
|
|
8
8
|
"plugins": [
|
|
9
9
|
{
|
|
10
10
|
"name": "release-skill",
|
|
11
11
|
"source": "./",
|
|
12
|
-
"version": "0.1.
|
|
12
|
+
"version": "0.1.7",
|
|
13
13
|
"description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification"
|
|
14
14
|
}
|
|
15
15
|
]
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "release-skill",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
|
|
5
5
|
"author": {
|
|
6
|
-
"name": "
|
|
6
|
+
"name": "广州市风荷科技有限公司"
|
|
7
7
|
},
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"skills": "./adapters/claude/skills/"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "release-skill",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
|
|
5
5
|
"author": {
|
|
6
|
-
"name": "
|
|
6
|
+
"name": "广州市风荷科技有限公司"
|
|
7
7
|
},
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"skills": "./adapters/codex/skills/",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"displayName": "Release Skill",
|
|
12
12
|
"shortDescription": "Safe preparation and frozen GitHub/npm publishing",
|
|
13
13
|
"longDescription": "Prepares byte-faithful public snapshots without rewriting project source files and publishes approved frozen GitHub/npm artifacts. Full happy end verification confirms consumer installation from frozen Git ref.",
|
|
14
|
-
"developerName": "
|
|
14
|
+
"developerName": "ifoohoo",
|
|
15
15
|
"category": "DevOps",
|
|
16
16
|
"capabilities": [
|
|
17
17
|
"Write",
|
|
@@ -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.1.
|
|
22
|
+
"Prepare a release plan for version 0.1.7.",
|
|
23
23
|
"Help me understand the release workflow."
|
|
24
24
|
]
|
|
25
25
|
}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,10 +1,117 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
<!-- release-skill:changelog:start version=0.1.7 locale=en baseline=sha256:e41fd6460f5bb63343547f04b08e2cfcdd8a64cb53806cbcf39870a2fe27b03e -->
|
|
4
|
+
## [0.1.7] - 2026-07-23
|
|
5
|
+
|
|
6
|
+
v0.1.7 is an organizational migration release. The public GitHub repository moves from `mzdbxqh/release-skill` to `ifoohoo/release-skill` (the repository name is unchanged and GitHub redirects the old URL), the project gains an explicit corporate maintainer and copyright holder (广州市风荷科技有限公司), and the forward-looking repository, maintainer, author, and copyright metadata across the npm package, plugin marketplace manifests, NOTICE, LICENSE, and release configuration are aligned with the new organization. The npm package name (`release-skill`) and the npm publishing identity (`publisher: mzdbxqh`) are unchanged, and the already-published v0.1.6 tag, GitHub Release, and npm version are not rewritten.
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
|
|
10
|
+
- **Public repository migrated to the `ifoohoo` organization**: the public
|
|
11
|
+
GitHub repository is transferred from `mzdbxqh/release-skill` to
|
|
12
|
+
`ifoohoo/release-skill` with the repository name unchanged. The default branch
|
|
13
|
+
remains `main`, the v0.1.6 tag, release, and history are preserved, and the old
|
|
14
|
+
URL redirects (HTTP 301) to the new location. The release configuration
|
|
15
|
+
(`publicRepo` and the bound `previousPublicBaseline`) now points at
|
|
16
|
+
`ifoohoo/release-skill` with the public v0.1.6 commit
|
|
17
|
+
`48fb2a258a2786c2e32136ad67bd51f3a280b3b8` as the previous public baseline.
|
|
18
|
+
- **Corporate maintainer and copyright**: the MIT LICENSE (root and public
|
|
19
|
+
package) now carries a dual copyright line for the release-skill contributors
|
|
20
|
+
and 广州市风荷科技有限公司, and the NOTICE states that the project is maintained
|
|
21
|
+
by 广州市风荷科技有限公司 and clarifies that the GitHub repository transfer is an
|
|
22
|
+
administrative hosting/identity change that does not by itself constitute a
|
|
23
|
+
copyright assignment.
|
|
24
|
+
- **Forward-looking metadata aligned with the organization**: the npm
|
|
25
|
+
`package.json` repository, homepage, and issue tracker URLs point at
|
|
26
|
+
`ifoohoo/release-skill`, and the package adds a corporate author while
|
|
27
|
+
preserving the release-skill contributors. The Claude Code plugin marketplace
|
|
28
|
+
owner now identifies the `ifoohoo` organization. The npm package name
|
|
29
|
+
(`release-skill`) and the npm publishing identity (`publisher: mzdbxqh`) are
|
|
30
|
+
unchanged.
|
|
31
|
+
<!-- release-skill:changelog:end version=0.1.7 locale=en -->
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
<!-- release-skill:changelog:start version=0.1.6 locale=en baseline=sha256:6b45d1aa912b32c9c00a616661ae3e2a9536e5ff85a7c0cf82b846a3ffb6c1d3 -->
|
|
35
|
+
## [0.1.6] - 2026-07-22
|
|
36
|
+
|
|
37
|
+
v0.1.6 is a release-preparation snapshot that closes the release-docs automation loop. A single structured release-notes source drives deterministic, multilingual CHANGELOG and README refresh behind a two-phase, digest-bound write protocol and a prepare-time documentation freshness gate, while terminal transaction receipts are bounded and the CLI lifecycle, path safety, and error-output redaction are hardened.
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- **Structured release-notes-driven document refresh (`docs refresh`)**: a single
|
|
42
|
+
structured release-notes source (`release-notes/0.1.6.yaml`) now drives
|
|
43
|
+
deterministic, multilingual refresh of the managed CHANGELOG and README
|
|
44
|
+
regions. Refresh runs as a two-phase protocol: a read-only planning phase
|
|
45
|
+
renders every candidate and freezes an `inputDigest` (binding the canonical
|
|
46
|
+
notes and the notes-source bytes) plus a `refreshDigest` (binding the protocol
|
|
47
|
+
version, unit, version, configuration projection, and per-file old/new
|
|
48
|
+
digests), and a separate write phase commits the changed targets only when all
|
|
49
|
+
three authorizations are present (`--write`, an exact `--confirm-refresh
|
|
50
|
+
<refreshDigest>` match, and `--ack-local-document-write`). The write phase
|
|
51
|
+
re-plans under the exclusive lock; a diverging digest converges to
|
|
52
|
+
`RELEASE_DOCS_REFRESH_STALE` with zero writes, and a clean plan is a zero-write
|
|
53
|
+
no-op. A prepare-time documentation freshness gate makes version drift between
|
|
54
|
+
the package version and the public docs fail closed before a release plan is
|
|
55
|
+
frozen.
|
|
56
|
+
- **Bounded terminal transaction receipts with recovery safety**: terminal
|
|
57
|
+
(committed / rolled-back) transactions now persist a summary-only receipt
|
|
58
|
+
instead of full payload, capped at 256 KB per receipt
|
|
59
|
+
(`TERMINAL_RECEIPT_SIZE_CAP`), under a retention cap of 50 terminal records
|
|
60
|
+
(`DEFAULT_TRANSACTION_RETENTION_MAX`). Retention pruning only ever removes
|
|
61
|
+
terminal records and never prunes `RECOVERY_CONFLICT` records or any
|
|
62
|
+
non-terminal (recovery-relevant) record, so recovery evidence is preserved even
|
|
63
|
+
when the count cap is reached; a retention failure never aborts an in-flight
|
|
64
|
+
commit.
|
|
65
|
+
- **Strict `docs refresh` parameter validation (fail closed)**: the `docs`
|
|
66
|
+
command validates every parameter before invoking the refresh service, so
|
|
67
|
+
precise stable parameter errors surface even without project configuration or a
|
|
68
|
+
safe-fs backend. The `--flag=value` equals form routes through exactly the same
|
|
69
|
+
validation as the space-separated form; duplicated flags fail closed with
|
|
70
|
+
`DUPLICATE_PARAMETER` before any service call, config read, lock, or
|
|
71
|
+
transaction; and bare positional arguments and single-dash flags (such as `-w`)
|
|
72
|
+
are rejected as unrecognized. Write-authorization flags supplied without
|
|
73
|
+
`--write`, or `--write` without its full authorizations, fail closed with
|
|
74
|
+
precise reasons rather than silently proceeding.
|
|
75
|
+
|
|
76
|
+
### Fixed
|
|
77
|
+
|
|
78
|
+
- **Bundle entry lifecycle settles with real exit codes**: the self-contained
|
|
79
|
+
bundle now owns the command lifecycle. Its entry awaits command completion and
|
|
80
|
+
exits with the real business exit code for success, business errors, handled
|
|
81
|
+
async rejections, and unknown commands, so the launcher no longer leaves an
|
|
82
|
+
unsettled top-level await (Node exit code 13). When the bundle is missing or
|
|
83
|
+
cannot be evaluated, the launcher fails closed with static text only and never
|
|
84
|
+
interpolates machine-specific paths, usernames, or host layout, because
|
|
85
|
+
module-load failure messages carry absolute paths.
|
|
86
|
+
- **Fail-closed path canonicalization with stable diagnostics**: artifact path
|
|
87
|
+
canonicalization requires POSIX separators and rejects absolute paths in POSIX
|
|
88
|
+
(`/`), Windows drive-letter, and UNC spellings, along with traversal, Windows
|
|
89
|
+
reserved device names, and colons, failing closed with `PATH_UNSAFE` rather
|
|
90
|
+
than normalizing an unsafe spelling into a different public path. Error-output
|
|
91
|
+
redaction now distinguishes real filesystem paths from strict RFC 6901 JSON
|
|
92
|
+
Pointer diagnostic coordinates (such as `/units/0/version`): absolute
|
|
93
|
+
POSIX/Windows/UNC paths collapse to a stable `<redacted-path>` placeholder
|
|
94
|
+
while diagnostic pointers are preserved verbatim, keeping failures diagnosable
|
|
95
|
+
without leaking host paths.
|
|
96
|
+
- **Self public-boundary redaction**: the centralized redaction authority
|
|
97
|
+
(`core/redact.mjs`) now closes the self public boundary so runtime error
|
|
98
|
+
outputs and detail structures never carry the release-skill workspace's own
|
|
99
|
+
absolute path, nor the macOS `Users`, Linux home, macOS `private`/`var` alias,
|
|
100
|
+
temp, or CI checkout realms. Redaction runs fail-closed through the
|
|
101
|
+
`ReleaseError` choke point: any two-or-more-segment `/`-led token that is not a
|
|
102
|
+
strict diagnostic JSON Pointer is replaced with `<redacted-path>`, so
|
|
103
|
+
self-releasing never leaks private filesystem layout into public outputs.
|
|
104
|
+
<!-- release-skill:changelog:end version=0.1.6 locale=en -->
|
|
105
|
+
|
|
106
|
+
|
|
3
107
|
All notable changes to the `release-skill` plugin will be documented in this
|
|
4
108
|
file. The format is based on [Keep a Changelog](https://keepachangelog.com/).
|
|
5
109
|
|
|
110
|
+
<!-- release-skill:changelog:start version=0.1.5 locale=en baseline=sha256:72d222ff63008de63edcf20c89626fa18748e6cb39e54263e861b8f0c9669026 -->
|
|
6
111
|
## [0.1.5] - 2026-07-21
|
|
7
112
|
|
|
113
|
+
Claude and Codex marketplace installs now use an explicit, configurable timeout frozen into the release plan.
|
|
114
|
+
|
|
8
115
|
### Added
|
|
9
116
|
|
|
10
117
|
- **Explicit marketplace install timeout (`timeoutMs`)**: Claude and Codex
|
|
@@ -29,6 +136,7 @@ file. The format is based on [Keep a Changelog](https://keepachangelog.com/).
|
|
|
29
136
|
distribution and verified through injected-executor tests. Invalid values
|
|
30
137
|
(non-integer, non-finite, out-of-range) fail closed rather than being
|
|
31
138
|
silently clamped.
|
|
139
|
+
<!-- release-skill:changelog:end version=0.1.5 locale=en -->
|
|
32
140
|
|
|
33
141
|
## [0.1.4] - 2026-07-19
|
|
34
142
|
|
package/INSTALL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[简体中文](INSTALL.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
<!-- release-skill:release-version: 0.1.
|
|
5
|
+
<!-- release-skill:release-version: 0.1.7 -->
|
|
6
6
|
## Prerequisites
|
|
7
7
|
|
|
8
8
|
- Node.js 22.0.0 or later
|
|
@@ -300,6 +300,86 @@ guarantee that a custom command will not modify files or access the network.
|
|
|
300
300
|
Never register Git push, tag, default-branch changes, GitHub Releases, or npm
|
|
301
301
|
publish as a hook/gate; those are controlled plan actions.
|
|
302
302
|
|
|
303
|
+
### Advanced: release-document refresh (optional)
|
|
304
|
+
|
|
305
|
+
A release unit can declare `releaseDocuments` so one structured notes source
|
|
306
|
+
deterministically refreshes its managed README regions and the current
|
|
307
|
+
CHANGELOG entry. The command runs offline: it does not use the network, does
|
|
308
|
+
not call any large language model, and does not auto-translate. It only
|
|
309
|
+
rewrites declared managed regions, the unique version marker's machine
|
|
310
|
+
value, and the current CHANGELOG managed entry; every other byte is
|
|
311
|
+
preserved. `prepare` only checks freshness and never writes the working
|
|
312
|
+
tree.
|
|
313
|
+
|
|
314
|
+
```yaml
|
|
315
|
+
# Release unit fragment in .release-skill/project.yaml
|
|
316
|
+
releaseUnits:
|
|
317
|
+
- id: my-project
|
|
318
|
+
source: .
|
|
319
|
+
releaseDocuments:
|
|
320
|
+
notesSource: release-notes/{version}.yaml
|
|
321
|
+
locales: [en, zh-CN]
|
|
322
|
+
changelogs:
|
|
323
|
+
- path: CHANGELOG.md
|
|
324
|
+
locale: en
|
|
325
|
+
readmes:
|
|
326
|
+
- path: README.md
|
|
327
|
+
locale: en
|
|
328
|
+
regions: [latest-release]
|
|
329
|
+
versionMarkers:
|
|
330
|
+
- id: current-version
|
|
331
|
+
pattern: '<!-- release-skill:version -->v{version}<!-- /release-skill:version -->'
|
|
332
|
+
- path: README.zh-CN.md
|
|
333
|
+
locale: zh-CN
|
|
334
|
+
regions: [latest-release]
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
`notesSource` and every target path are relative to the release unit root;
|
|
338
|
+
`versionMarkers[].pattern` must match the README's existing unique version
|
|
339
|
+
marker exactly, and the refresh replaces only the machine version value.
|
|
340
|
+
The notes source lives under the release unit root; its `version` must
|
|
341
|
+
equal the resolved unit version, every configured locale appears exactly
|
|
342
|
+
once with a non-empty summary and at least one change category, and YAML
|
|
343
|
+
aliases, duplicate keys, unknown fields, and locale fallback all fail
|
|
344
|
+
closed:
|
|
345
|
+
|
|
346
|
+
```yaml
|
|
347
|
+
# release-notes/0.1.6.yaml
|
|
348
|
+
version: 0.1.6
|
|
349
|
+
date: 2026-07-21
|
|
350
|
+
locales:
|
|
351
|
+
en:
|
|
352
|
+
summary: Deterministic multilingual release-document refresh.
|
|
353
|
+
changes:
|
|
354
|
+
added:
|
|
355
|
+
- Refresh managed README regions and changelogs from one source.
|
|
356
|
+
zh-CN:
|
|
357
|
+
summary: 从同一说明源确定性刷新多语种发布文档。
|
|
358
|
+
changes:
|
|
359
|
+
added:
|
|
360
|
+
- 自动刷新 README 受管区域和 CHANGELOG。
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
Drill first (read-only), then write only with all three bindings:
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
"${CLI[@]}" docs refresh --root <your-project> --unit my-project --json
|
|
367
|
+
"${CLI[@]}" docs refresh --root <your-project> --unit my-project \
|
|
368
|
+
--write --confirm-refresh <refreshDigest> --ack-local-document-write --json
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
`refreshDigest` binds the canonical notes object, the configuration
|
|
372
|
+
projection, and the sorted per-file old/new digests — never time, absolute
|
|
373
|
+
paths, or display text. A mismatched digest fails closed with
|
|
374
|
+
`RELEASE_DOCS_REFRESH_STALE` and writes nothing; an unchanged candidate
|
|
375
|
+
reports `clean` and writes nothing either. This authorization covers only
|
|
376
|
+
the declared local document targets; it does not authorize hooks, commits,
|
|
377
|
+
pushes, publishes, or installs. When `prepare` reports `RELEASE_DOCS_STALE`,
|
|
378
|
+
recover by running the drill, reviewing the listed files and locales,
|
|
379
|
+
performing the confirmed local write, reviewing and committing the result,
|
|
380
|
+
and rerunning `prepare`. See the README release-document refresh section
|
|
381
|
+
for the full contract.
|
|
382
|
+
|
|
303
383
|
### Production branch strategy
|
|
304
384
|
|
|
305
385
|
Every production unit selects one explicit strategy:
|
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.1.
|
|
5
|
+
<!-- release-skill:release-version: 0.1.7 -->
|
|
6
6
|
## 前置条件
|
|
7
7
|
|
|
8
8
|
- Node.js 22.0.0 或更高版本
|
|
@@ -278,6 +278,74 @@ release-skill 约束其输入与证据,但无法保证自定义命令不修改
|
|
|
278
278
|
禁止把 Git push、tag、默认分支修改、GitHub Release 或 npm publish 注册为
|
|
279
279
|
hook/gate,它们只能由受控的计划动作完成。
|
|
280
280
|
|
|
281
|
+
### 进阶:发布文档刷新(可选)
|
|
282
|
+
|
|
283
|
+
发布单元可以声明 `releaseDocuments`,用一份结构化说明源确定性刷新 README 受管
|
|
284
|
+
区域和 CHANGELOG 当前版本条目。该命令离线运行:不联网、不调用大模型、不自动
|
|
285
|
+
翻译;只改写声明过的受管区域、唯一版本标记的机器值和 CHANGELOG 当前版本受管
|
|
286
|
+
条目,其他字节全部保留。`prepare` 只检查新鲜度,不写工作树。
|
|
287
|
+
|
|
288
|
+
```yaml
|
|
289
|
+
# .release-skill/project.yaml 的发布单元片段
|
|
290
|
+
releaseUnits:
|
|
291
|
+
- id: my-project
|
|
292
|
+
source: .
|
|
293
|
+
releaseDocuments:
|
|
294
|
+
notesSource: release-notes/{version}.yaml
|
|
295
|
+
locales: [en, zh-CN]
|
|
296
|
+
changelogs:
|
|
297
|
+
- path: CHANGELOG.md
|
|
298
|
+
locale: en
|
|
299
|
+
readmes:
|
|
300
|
+
- path: README.md
|
|
301
|
+
locale: en
|
|
302
|
+
regions: [latest-release]
|
|
303
|
+
versionMarkers:
|
|
304
|
+
- id: current-version
|
|
305
|
+
pattern: '<!-- release-skill:version -->v{version}<!-- /release-skill:version -->'
|
|
306
|
+
- path: README.zh-CN.md
|
|
307
|
+
locale: zh-CN
|
|
308
|
+
regions: [latest-release]
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
`notesSource` 和所有目标路径均相对发布单元根;`versionMarkers[].pattern` 必须与
|
|
312
|
+
README 现有唯一版本标记精确匹配,刷新只替换机器版本值。说明源位于发布单元根
|
|
313
|
+
下,`version` 必须与解析出的单元版本一致,每个配置语种恰好出现一次且 summary
|
|
314
|
+
非空、至少一个变更类别有条目;YAML alias、重复键、未知字段和语种回退均失败
|
|
315
|
+
关闭:
|
|
316
|
+
|
|
317
|
+
```yaml
|
|
318
|
+
# release-notes/0.1.6.yaml
|
|
319
|
+
version: 0.1.6
|
|
320
|
+
date: 2026-07-21
|
|
321
|
+
locales:
|
|
322
|
+
en:
|
|
323
|
+
summary: Deterministic multilingual release-document refresh.
|
|
324
|
+
changes:
|
|
325
|
+
added:
|
|
326
|
+
- Refresh managed README regions and changelogs from one source.
|
|
327
|
+
zh-CN:
|
|
328
|
+
summary: 从同一说明源确定性刷新多语种发布文档。
|
|
329
|
+
changes:
|
|
330
|
+
added:
|
|
331
|
+
- 自动刷新 README 受管区域和 CHANGELOG。
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
先只读演练,确认后再带三项绑定写入:
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
"${CLI[@]}" docs refresh --root <your-project> --unit my-project --json
|
|
338
|
+
"${CLI[@]}" docs refresh --root <your-project> --unit my-project \
|
|
339
|
+
--write --confirm-refresh <refreshDigest> --ack-local-document-write --json
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
`refreshDigest` 绑定规范说明对象、配置投影和按路径排序的逐文件新旧摘要,不绑定
|
|
343
|
+
时间、绝对路径或展示文本。摘要不匹配以 `RELEASE_DOCS_REFRESH_STALE` 失败关闭且
|
|
344
|
+
零写入;候选无变化时返回 `clean` 同样零写入。该授权只覆盖声明的本地文档目标,
|
|
345
|
+
不是 hook、提交、push、publish 或安装的授权。`prepare` 报告 `RELEASE_DOCS_STALE`
|
|
346
|
+
时,按“运行演练 → 审阅文件与语种 → 确认本地写入 → 审阅并提交 → 重新 prepare”
|
|
347
|
+
恢复。完整契约见 README 的发布文档刷新章节。
|
|
348
|
+
|
|
281
349
|
### 生产分支策略
|
|
282
350
|
|
|
283
351
|
每个生产发布单元显式选择一种策略:
|
package/LICENSE
CHANGED
package/NOTICE
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
release-skill is an open-source project released under the MIT License.
|
|
4
4
|
|
|
5
|
+
## Maintenance
|
|
6
|
+
|
|
7
|
+
release-skill is maintained by 广州市风荷科技有限公司 (Guangzhou Fenghe
|
|
8
|
+
Technology Co., Ltd.), together with the release-skill contributors. Copyright
|
|
9
|
+
in the project is held by the release-skill contributors and 广州市风荷科技
|
|
10
|
+
有限公司 as stated in the LICENSE file. The transfer of the public GitHub
|
|
11
|
+
repository to the `ifoohoo` organization is an administrative change of the
|
|
12
|
+
hosting location and maintenance identity; it does not by itself constitute a
|
|
13
|
+
copyright assignment or transfer.
|
|
14
|
+
|
|
5
15
|
## Third-Party Dependencies
|
|
6
16
|
|
|
7
17
|
This project is built on Node.js and the npm ecosystem. See `package.json`
|
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.1.
|
|
5
|
+
<!-- release-skill:release-version: 0.1.7 -->
|
|
6
6
|
Release preparation for Claude Code and Codex, with human-edited files kept intact.
|
|
7
7
|
|
|
8
8
|
release-skill helps a maintainer answer three questions: what will be released,
|
|
@@ -10,9 +10,41 @@ which checks still fail, and which exact bytes will reach users. It freezes the
|
|
|
10
10
|
reviewed artifacts first and publishes those same artifacts later; it does not
|
|
11
11
|
regenerate a README or re-pack the live workspace at the last step.
|
|
12
12
|
|
|
13
|
+
<!-- release-skill:managed:start id=latest-release -->
|
|
14
|
+
**0.1.7** (2026-07-23)
|
|
15
|
+
|
|
16
|
+
v0.1.7 is an organizational migration release. The public GitHub repository moves from `mzdbxqh/release-skill` to `ifoohoo/release-skill` (the repository name is unchanged and GitHub redirects the old URL), the project gains an explicit corporate maintainer and copyright holder (广州市风荷科技有限公司), and the forward-looking repository, maintainer, author, and copyright metadata across the npm package, plugin marketplace manifests, NOTICE, LICENSE, and release configuration are aligned with the new organization. The npm package name (`release-skill`) and the npm publishing identity (`publisher: mzdbxqh`) are unchanged, and the already-published v0.1.6 tag, GitHub Release, and npm version are not rewritten.
|
|
17
|
+
|
|
18
|
+
**Changed**
|
|
19
|
+
|
|
20
|
+
- **Public repository migrated to the `ifoohoo` organization**: the public
|
|
21
|
+
GitHub repository is transferred from `mzdbxqh/release-skill` to
|
|
22
|
+
`ifoohoo/release-skill` with the repository name unchanged. The default branch
|
|
23
|
+
remains `main`, the v0.1.6 tag, release, and history are preserved, and the old
|
|
24
|
+
URL redirects (HTTP 301) to the new location. The release configuration
|
|
25
|
+
(`publicRepo` and the bound `previousPublicBaseline`) now points at
|
|
26
|
+
`ifoohoo/release-skill` with the public v0.1.6 commit
|
|
27
|
+
`48fb2a258a2786c2e32136ad67bd51f3a280b3b8` as the previous public baseline.
|
|
28
|
+
- **Corporate maintainer and copyright**: the MIT LICENSE (root and public
|
|
29
|
+
package) now carries a dual copyright line for the release-skill contributors
|
|
30
|
+
and 广州市风荷科技有限公司, and the NOTICE states that the project is maintained
|
|
31
|
+
by 广州市风荷科技有限公司 and clarifies that the GitHub repository transfer is an
|
|
32
|
+
administrative hosting/identity change that does not by itself constitute a
|
|
33
|
+
copyright assignment.
|
|
34
|
+
- **Forward-looking metadata aligned with the organization**: the npm
|
|
35
|
+
`package.json` repository, homepage, and issue tracker URLs point at
|
|
36
|
+
`ifoohoo/release-skill`, and the package adds a corporate author while
|
|
37
|
+
preserving the release-skill contributors. The Claude Code plugin marketplace
|
|
38
|
+
owner now identifies the `ifoohoo` organization. The npm package name
|
|
39
|
+
(`release-skill`) and the npm publishing identity (`publisher: mzdbxqh`) are
|
|
40
|
+
unchanged.
|
|
41
|
+
<!-- release-skill:managed:end id=latest-release -->
|
|
42
|
+
|
|
13
43
|
<!-- release-skill:capability:external-write-boundary -->
|
|
14
|
-
> **Current boundary:** v0.1.
|
|
15
|
-
>
|
|
44
|
+
> **Current boundary:** v0.1.7 is the current release (v0.1.6 previously held
|
|
45
|
+
> this status after completing real production verification).
|
|
46
|
+
> v0.1.1 completed a real production release to GitHub and npm — the first
|
|
47
|
+
> production-verified milestone — followed by
|
|
16
48
|
> exact npm installation and Claude/Codex consumer installation verification
|
|
17
49
|
> from the frozen Git ref; "current release" and "first production-verified
|
|
18
50
|
> milestone" are two distinct facts and must not be conflated. The same
|
|
@@ -27,7 +59,7 @@ regenerate a README or re-pack the live workspace at the last step.
|
|
|
27
59
|
> publish global preflight.
|
|
28
60
|
|
|
29
61
|
<!-- release-skill:capability:safe-first-command -->
|
|
30
|
-
> **Production path verified since the v0.1.1 milestone; v0.1.
|
|
62
|
+
> **Production path verified since the v0.1.1 milestone; v0.1.7 is the current
|
|
31
63
|
> release.** The npm-installed CLI is the supported user entry. Source checkout
|
|
32
64
|
> is the development/contributor fallback.
|
|
33
65
|
>
|
|
@@ -73,6 +105,10 @@ truth, and never rewrite human truth.**
|
|
|
73
105
|
|
|
74
106
|
## Quick start
|
|
75
107
|
|
|
108
|
+
Every read-only step below keeps potentially large reports in temporary files
|
|
109
|
+
and surfaces only the deterministic `compactSummary` review view; the summary
|
|
110
|
+
is a review aid, never a substitute for the bound digest authorization.
|
|
111
|
+
|
|
76
112
|
### Install / requirements
|
|
77
113
|
|
|
78
114
|
- Node.js 22+
|
|
@@ -490,7 +526,9 @@ publication. The source checkout remains the development/contributor fallback.
|
|
|
490
526
|
`units[].targetVersion`, and `planDigest`. Each unit's snapshot is under
|
|
491
527
|
`<evidenceDir>/snapshots/<unit-id>/`. The release-skill pipeline writes its
|
|
492
528
|
own data under `.release-skill/`; acknowledged project hooks and gates are
|
|
493
|
-
|
|
529
|
+
arbitrary project processes without an operating-system sandbox and may
|
|
530
|
+
write elsewhere, access the network, and read any credentials, tokens,
|
|
531
|
+
keys, and environment variables accessible to the current account.
|
|
494
532
|
6. **Production plan freeze:**
|
|
495
533
|
```bash
|
|
496
534
|
PRODUCTION_JSON=$("${CLI[@]}" prepare --root "$PROJECT" --online --production \
|
|
@@ -521,7 +559,11 @@ publication. The source checkout remains the development/contributor fallback.
|
|
|
521
559
|
publish/reconcile. Approval expires after 24
|
|
522
560
|
hours; a PARTIAL recovery may create a new approval for the same plan while
|
|
523
561
|
preserving every earlier approval byte-for-byte. Use the returned
|
|
524
|
-
`approvalPath` and `expiresAt` as authority.
|
|
562
|
+
`approvalPath` and `expiresAt` as authority. `--actor` is only an
|
|
563
|
+
unauthenticated local audit label: release-skill performs no identity
|
|
564
|
+
authentication and provides no digital signature, so it cannot prove that
|
|
565
|
+
a real human actually approved — it only records the identity the operator
|
|
566
|
+
self-reports.
|
|
525
567
|
8. **Publish (remote writes start here):**
|
|
526
568
|
```bash
|
|
527
569
|
PUBLISH_JSON=$("${CLI[@]}" publish --root "$PROJECT" \
|
|
@@ -557,6 +599,110 @@ Before a real release run `gh auth login`, `gh auth setup-git`, and
|
|
|
557
599
|
Version branches default to `release/<tag>` and can be configured per unit with
|
|
558
600
|
`production.branchTemplate`; any existing remote object stops for human review.
|
|
559
601
|
|
|
602
|
+
### Release-document refresh (optional)
|
|
603
|
+
|
|
604
|
+
A release unit can declare `releaseDocuments` so one structured, bilingual
|
|
605
|
+
notes source deterministically refreshes the managed README regions and the
|
|
606
|
+
current CHANGELOG entry. The core CLI runs entirely offline: it does not use
|
|
607
|
+
the network, does not call any large language model, and does not
|
|
608
|
+
auto-translate. It only rewrites the declared managed regions, the unique
|
|
609
|
+
version marker's machine value, and the current CHANGELOG managed entry;
|
|
610
|
+
every byte outside those regions is preserved verbatim. `prepare` only
|
|
611
|
+
checks freshness and never writes the working tree.
|
|
612
|
+
|
|
613
|
+
```yaml
|
|
614
|
+
# .release-skill/project.yaml (release unit fragment)
|
|
615
|
+
releaseUnits:
|
|
616
|
+
- id: my-project
|
|
617
|
+
source: .
|
|
618
|
+
releaseDocuments:
|
|
619
|
+
notesSource: release-notes/{version}.yaml
|
|
620
|
+
locales: [en, zh-CN]
|
|
621
|
+
changelogs:
|
|
622
|
+
- path: CHANGELOG.md
|
|
623
|
+
locale: en
|
|
624
|
+
readmes:
|
|
625
|
+
- path: README.md
|
|
626
|
+
locale: en
|
|
627
|
+
regions: [latest-release]
|
|
628
|
+
versionMarkers:
|
|
629
|
+
- id: current-version
|
|
630
|
+
pattern: '<!-- release-skill:version -->v{version}<!-- /release-skill:version -->'
|
|
631
|
+
- path: README.zh-CN.md
|
|
632
|
+
locale: zh-CN
|
|
633
|
+
regions: [latest-release]
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
`notesSource` and every target path are relative to the release unit root.
|
|
637
|
+
`versionMarkers[].pattern` must match the README's existing unique version
|
|
638
|
+
marker exactly, with `{version}` standing in for the machine value; the
|
|
639
|
+
refresh replaces only that value (zero or multiple matches fail closed).
|
|
640
|
+
|
|
641
|
+
```yaml
|
|
642
|
+
# release-notes/0.1.6.yaml (structured notes source)
|
|
643
|
+
version: 0.1.6
|
|
644
|
+
date: 2026-07-21
|
|
645
|
+
locales:
|
|
646
|
+
en:
|
|
647
|
+
summary: Deterministic multilingual release-document refresh.
|
|
648
|
+
changes:
|
|
649
|
+
added:
|
|
650
|
+
- Refresh managed README regions and changelogs from one source.
|
|
651
|
+
upgradeNotes: Review and commit refreshed documents before prepare.
|
|
652
|
+
zh-CN:
|
|
653
|
+
summary: 从同一说明源确定性刷新多语种发布文档。
|
|
654
|
+
changes:
|
|
655
|
+
added:
|
|
656
|
+
- 自动刷新 README 受管区域和 CHANGELOG。
|
|
657
|
+
upgradeNotes: prepare 前审阅并提交刷新结果。
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
`version` must exactly equal the resolved unit version; every configured
|
|
661
|
+
locale appears exactly once with a non-empty `summary` and at least one
|
|
662
|
+
change under `security`, `breaking`, `added`, `changed`, `deprecated`,
|
|
663
|
+
`removed`, or `fixed`. YAML aliases, duplicate keys, unknown fields, and
|
|
664
|
+
locale fallback all fail closed.
|
|
665
|
+
|
|
666
|
+
1. **Read-only drill:**
|
|
667
|
+
```bash
|
|
668
|
+
"${CLI[@]}" docs refresh --root "$PROJECT" --unit my-project --json
|
|
669
|
+
```
|
|
670
|
+
Prints `status` (`changes` or `clean`), per-file relative `path`,
|
|
671
|
+
`locale`, `kind`, old/new digests, the unit `version`, `locales`,
|
|
672
|
+
`inputDigest`, and `refreshDigest` — a binding over the protocol
|
|
673
|
+
version, the unit, the canonical notes object, the configuration
|
|
674
|
+
projection, and the sorted per-file old/new digests. It never binds
|
|
675
|
+
time, absolute paths, or display text. `nextCommand.argv` carries the
|
|
676
|
+
exact write command.
|
|
677
|
+
2. **Digest-confirmed local write (only after explicit human authorization
|
|
678
|
+
of the local release-document write):**
|
|
679
|
+
```bash
|
|
680
|
+
"${CLI[@]}" docs refresh --root "$PROJECT" --unit my-project \
|
|
681
|
+
--write --confirm-refresh <refreshDigest> \
|
|
682
|
+
--ack-local-document-write --json
|
|
683
|
+
```
|
|
684
|
+
All three bindings are required; a mismatched digest fails closed with
|
|
685
|
+
`RELEASE_DOCS_REFRESH_STALE` and writes nothing. When the candidate is
|
|
686
|
+
unchanged the drill reports `clean` and the write performs zero writes.
|
|
687
|
+
All targets commit as one transaction; a successful write is followed
|
|
688
|
+
by a re-drill that must return `clean`.
|
|
689
|
+
|
|
690
|
+
This authorization covers only the declared local document targets. It is
|
|
691
|
+
not authorization for hooks, Git commits, pushes, publishes, or installs:
|
|
692
|
+
a maintainer must review the refreshed documents, commit them, and rerun
|
|
693
|
+
`prepare` — the new bytes change the snapshot, workspace digest, and plan
|
|
694
|
+
digest, so an earlier approval cannot authorize the refreshed plan.
|
|
695
|
+
|
|
696
|
+
When configured documents drift, `prepare` fails closed with
|
|
697
|
+
`RELEASE_DOCS_STALE` before hooks, baseline, snapshot, remote checks, and
|
|
698
|
+
plan freeze. Recovery: run the drill, review the shown files/locales/
|
|
699
|
+
version/digest, authorize and perform the local write, review and commit
|
|
700
|
+
the result, then rerun `prepare`. `RELEASE_DOCS_INVALID` (bad
|
|
701
|
+
configuration or notes data), `RELEASE_DOCS_TRANSLATION_MISSING` (a
|
|
702
|
+
configured locale absent), and `RELEASE_DOCS_CONFLICT` (unmanaged
|
|
703
|
+
same-version content or marker damage) each require fixing the source or
|
|
704
|
+
target first; never widen the write scope to resolve them.
|
|
705
|
+
|
|
560
706
|
### Parent workspace with npm + plugin sub-units
|
|
561
707
|
|
|
562
708
|
When a monorepo produces both an npm package and a Claude/Codex plugin from
|
|
@@ -567,6 +713,10 @@ and entry Skill:
|
|
|
567
713
|
Here `project` is the parent workspace's orchestration container, not a public
|
|
568
714
|
release unit. If the workspace root also publishes its own repository or
|
|
569
715
|
package, add another release unit with `source: .`.
|
|
716
|
+
`version.source` is resolved relative to that release unit's `source` directory
|
|
717
|
+
(`version.source` 相对于该发布单元的 `source` 目录解析): a unit with
|
|
718
|
+
`source: packages/app` therefore writes plain `package.json`, not
|
|
719
|
+
`packages/app/package.json`.
|
|
570
720
|
|
|
571
721
|
```yaml
|
|
572
722
|
apiVersion: release-skill/v1
|
|
@@ -580,7 +730,7 @@ releaseUnits:
|
|
|
580
730
|
source: packages/app
|
|
581
731
|
publicRepo: owner/my-app
|
|
582
732
|
version:
|
|
583
|
-
source:
|
|
733
|
+
source: package.json
|
|
584
734
|
tagTemplate: my-app-v{version}
|
|
585
735
|
distributions:
|
|
586
736
|
- type: npm
|
|
@@ -616,7 +766,7 @@ releaseUnits:
|
|
|
616
766
|
source: packages/plugin
|
|
617
767
|
publicRepo: owner/my-plugin
|
|
618
768
|
version:
|
|
619
|
-
source:
|
|
769
|
+
source: package.json
|
|
620
770
|
tagTemplate: my-plugin-v{version}
|
|
621
771
|
distributions:
|
|
622
772
|
# Declare plugin consumers only when the unit ships a plugin.
|
|
@@ -750,6 +900,29 @@ them only for work that genuinely needs the parent workspace or generates
|
|
|
750
900
|
source files. They can modify files or access the network, so prepare requires
|
|
751
901
|
`--acknowledge-hook-side-effects`.
|
|
752
902
|
|
|
903
|
+
Each hook is an object, never a bare command list.
|
|
904
|
+
`command` is an executable/argument array, not a shell string
|
|
905
|
+
(`command` 是可执行文件/参数数组,不是 shell 字符串). Each hook also declares
|
|
906
|
+
`cwd`, `timeoutMs`, and `envAllowlist`:
|
|
907
|
+
|
|
908
|
+
```yaml
|
|
909
|
+
hooks:
|
|
910
|
+
build:
|
|
911
|
+
command: [node, scripts/build.mjs]
|
|
912
|
+
cwd: .
|
|
913
|
+
timeoutMs: 120000
|
|
914
|
+
envAllowlist: [CI]
|
|
915
|
+
test:
|
|
916
|
+
command: [node, --test, test/]
|
|
917
|
+
cwd: .
|
|
918
|
+
timeoutMs: 300000
|
|
919
|
+
envAllowlist: []
|
|
920
|
+
```
|
|
921
|
+
|
|
922
|
+
Hooks still run only after human review of every configured executable,
|
|
923
|
+
argument, working directory, and side effect, and only with
|
|
924
|
+
`prepare --acknowledge-hook-side-effects`.
|
|
925
|
+
|
|
753
926
|
`verificationGates` are the controlled extension point for release calibration:
|
|
754
927
|
|
|
755
928
|
```yaml
|