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.
Files changed (69) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.codex-plugin/plugin.json +4 -4
  4. package/CHANGELOG.md +108 -0
  5. package/INSTALL.md +81 -1
  6. package/INSTALL.zh-CN.md +69 -1
  7. package/LICENSE +1 -0
  8. package/NOTICE +10 -0
  9. package/README.md +181 -8
  10. package/README.zh-CN.md +153 -8
  11. package/adapters/claude/.claude-plugin/marketplace.json +3 -3
  12. package/adapters/claude/.claude-plugin/plugin.json +2 -2
  13. package/adapters/claude/bin/release-skill.bundle.mjs +14182 -10017
  14. package/adapters/claude/bin/release-skill.mjs +24 -4
  15. package/adapters/claude/native/safe-write/binding.gyp +2 -1
  16. package/adapters/claude/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
  17. package/adapters/claude/native/safe-write/prebuilds.json +1 -1
  18. package/adapters/claude/schemas/.render-manifest.json +10 -10
  19. package/adapters/claude/schemas/release-project.schema.json +118 -0
  20. package/adapters/claude/skills/release-help/SKILL.md +21 -0
  21. package/adapters/claude/skills/release-prepare/SKILL.md +17 -6
  22. package/adapters/claude/skills/release-publish/SKILL.md +3 -1
  23. package/adapters/claude/skills/release-reconcile/SKILL.md +1 -1
  24. package/adapters/codex/.codex-plugin/plugin.json +4 -4
  25. package/adapters/codex/bin/release-skill.bundle.mjs +14182 -10017
  26. package/adapters/codex/bin/release-skill.mjs +24 -4
  27. package/adapters/codex/native/safe-write/binding.gyp +2 -1
  28. package/adapters/codex/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
  29. package/adapters/codex/native/safe-write/prebuilds.json +1 -1
  30. package/adapters/codex/schemas/.render-manifest.json +10 -10
  31. package/adapters/codex/schemas/release-project.schema.json +118 -0
  32. package/adapters/codex/skills/release-help/SKILL.md +21 -0
  33. package/adapters/codex/skills/release-prepare/SKILL.md +17 -6
  34. package/adapters/codex/skills/release-publish/SKILL.md +3 -1
  35. package/adapters/codex/skills/release-reconcile/SKILL.md +1 -1
  36. package/bin/release-skill-cli.mjs +163 -4
  37. package/bin/release-skill.bundle.mjs +14182 -10017
  38. package/bin/release-skill.mjs +24 -4
  39. package/native/safe-write/binding.gyp +2 -1
  40. package/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
  41. package/native/safe-write/prebuilds.json +1 -1
  42. package/package.json +13 -5
  43. package/references/.render-manifest.json +4 -4
  44. package/references/02-project-config.md +24 -0
  45. package/references/05-evidence-and-errors.md +5 -0
  46. package/schemas/.render-manifest.json +10 -10
  47. package/schemas/release-project.schema.json +118 -0
  48. package/scripts/build-bundle.mjs +15 -2
  49. package/skills/release-help/SKILL.md +21 -0
  50. package/skills/release-prepare/SKILL.md +17 -6
  51. package/skills/release-publish/SKILL.md +3 -1
  52. package/skills/release-reconcile/SKILL.md +1 -1
  53. package/skills-src/release-help/SKILL.md +21 -0
  54. package/skills-src/release-prepare/SKILL.md +17 -6
  55. package/skills-src/release-publish/SKILL.md +3 -1
  56. package/skills-src/release-reconcile/SKILL.md +1 -1
  57. package/src/artifacts/transaction-journal.mjs +1126 -105
  58. package/src/artifacts/transaction.mjs +313 -130
  59. package/src/commands/docs.mjs +332 -0
  60. package/src/commands/prepare.mjs +316 -17
  61. package/src/core/errors.mjs +64 -2
  62. package/src/core/redact.mjs +206 -0
  63. package/src/docs/changelog-renderer.mjs +853 -0
  64. package/src/docs/config.mjs +337 -0
  65. package/src/docs/notes-loader.mjs +432 -0
  66. package/src/docs/notes.mjs +553 -0
  67. package/src/docs/readme-renderer.mjs +647 -0
  68. package/src/docs/refresh-planner.mjs +542 -0
  69. 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": "mzdbxqh",
6
- "url": "https://github.com/mzdbxqh"
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.5",
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.5",
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": "release-skill contributors"
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.5",
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": "release-skill contributors"
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": "release-skill",
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.5.",
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 -->
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 -->
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
@@ -1,6 +1,7 @@
1
1
  MIT License
2
2
 
3
3
  Copyright (c) 2026 release-skill contributors
4
+ Copyright (c) 2026 广州市风荷科技有限公司
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
7
  of this software and associated documentation files (the "Software"), to deal
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 -->
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.5 is the current release. v0.1.1 completed a real production release
15
- > to GitHub and npm the first production-verified milestone — followed by
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.5 is the current
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
- unsandboxed processes and may write elsewhere or access the network.
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: packages/app/package.json
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: packages/plugin/package.json
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