release-skill 0.9.8 → 0.9.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,7 +9,7 @@
9
9
  {
10
10
  "name": "release-skill",
11
11
  "source": "./",
12
- "version": "0.9.8",
12
+ "version": "0.9.9",
13
13
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
14
14
  "author": {
15
15
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
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.8.",
22
+ "Prepare a release plan for version 0.9.9.",
23
23
  "Help me understand the release workflow."
24
24
  ]
25
25
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # Changelog
2
2
 
3
+ <!-- release-skill:changelog:start version=0.9.9 locale=en baseline=sha256:44d7cba7d5e4cbe182157c8b200e3a2d9b494d61a9555cd5af5c62c97a60fb37 -->
4
+ ## [0.9.9] - 2026-09-04
5
+
6
+ 0.9.9 is a local source candidate that makes Kimi Code plugin trust compare the complete displayed installation identity with the frozen URL. It consumes the three Foundation packages at the exact 0.16.0 release. This note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance.
7
+
8
+ ### Security
9
+
10
+ - Kimi Code extracts the complete installation identity from the plugin trust dialog, removes ANSI/OSC control sequences and soft wrapping, and compares the result exactly with the frozen installation URL. Similar repository names and tag prefixes or suffixes fail closed.
11
+ - Claude and Codex continue to verify the frozen marketplace repository, ref, and commit before the first marketplace or plugin write when a rebind is required. An unreachable remote, missing ref, or commit mismatch returns `MANUAL_REQUIRED` for that host with zero host writes; other selected hosts continue.
12
+ - Kimi Code continues only when the selected row is confirmed as `Trust and install`. A `Trust this folder?` dialog, an unknown screen, timeout, EOF, or mismatched identity fails closed before unintended confirmation.
13
+ - Any host plan remains a qualified frozen-plan path and requires a VERIFIED-run from the same release lineage before host acceptance; this source candidate does not provide that acceptance.
14
+
15
+ ### Changed
16
+
17
+ - The English and Chinese README scope descriptions identify 0.9.9 as the current source candidate.
18
+ - The public release-finish flow continues to treat a `proposal-inbox` postVerify hook as proposal delivery plus delivery evidence. The receiver applies, renders, and synchronizes the proposal under its own runbook and governance; no Hub repository or push sequence is built into the public Skill.
19
+ - Kimi Code continues to resolve its effective configuration root from explicit `kimiHome`, then `KIMI_CODE_HOME`, then `~/.kimi-code`; the TUI process and post-install observation use the same root.
20
+ - The current 0.9.9 candidate keeps the narrow R-05 Hook cache v2 consumer path, keeps the CodeBuddy plugin entry explicit as `marketplace: release-skill`, and keeps `--root <project-root>` in release-finish local-finish examples. Foundation dependencies remain pinned to the three released 0.16.0 packages.
21
+
22
+ ### Upgrade Notes
23
+
24
+ Prepare and approve a new 0.9.9 production plan for these changes. After verify reaches `VERIFIED`, complete every declared postVerify hook with its own immutable checkpoint approval before running release-finish. Real-host acceptance can begin only after 0.9.9 is officially published and VERIFIED; the official 0.9.9 entry must be installed or reloaded first. A source candidate, an older installed entry, or the mere existence of plan and run files cannot complete real-host acceptance. Each selected host must complete a first successful update. On the second run, Claude, Kimi, CodeBuddy, and WorkBuddy must report `ALREADY_CURRENT`; Codex may report `UPDATED` only when it reinstalls the same exact 0.9.9 frozen reference, payload validation passes, and `restartRequired=true` is declared. The local updater uses the Kimi Code TUI path verified for 0.40.1; it does not switch to a web or REST installation path. Confirm that the complete frozen installation URL shown by the plugin trust dialog is exact, and never approve a folder-trust dialog as part of plugin installation. This candidate does not claim that 0.9.9 has already been published or VERIFIED.
25
+ <!-- release-skill:changelog:end version=0.9.9 locale=en -->
26
+
27
+
3
28
  <!-- release-skill:changelog:start version=0.9.8 locale=en baseline=sha256:ed56048811dd7946bfdaa4022d0430906db713ef86eed1528395dbfb031b075e -->
4
29
  ## [0.9.8] - 2026-09-04
5
30
 
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.8 -->
5
+ <!-- release-skill:release-version: 0.9.9 -->
6
6
  ## Prerequisites
7
7
 
8
8
  - Node.js 22.0.0 or later
@@ -114,7 +114,7 @@ tag pinned to the exact version (never the bare repository URL, which installs
114
114
  the latest release or default branch), confirm the trust prompt, then reload:
115
115
 
116
116
  ```
117
- /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.8
117
+ /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.9
118
118
  /plugins reload
119
119
  ```
120
120
 
package/INSTALL.zh-CN.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [English](INSTALL.md)
4
4
 
5
- <!-- release-skill:release-version: 0.9.8 -->
5
+ <!-- release-skill:release-version: 0.9.9 -->
6
6
  ## 前置条件
7
7
 
8
8
  - Node.js 22.0.0 或更高版本
@@ -104,7 +104,7 @@ release-skill 当前只采用并验证 Kimi Code 的交互式 TUI 路径,**无
104
104
  (切勿使用裸仓库地址,它会安装最新 release 或默认分支),确认信任提示后重新加载:
105
105
 
106
106
  ```
107
- /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.8
107
+ /plugins install https://github.com/ifoohoo/release-skill/releases/tag/release-skill-v0.9.9
108
108
  /plugins reload
109
109
  ```
110
110
 
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [简体中文](README.zh-CN.md) · Installation: [English](INSTALL.md) / [简体中文](INSTALL.zh-CN.md)
4
4
 
5
- <!-- release-skill:release-version: 0.9.8 -->
5
+ <!-- release-skill:release-version: 0.9.9 -->
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,33 +14,31 @@ 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.8** (2026-09-04)
17
+ **0.9.9** (2026-09-04)
18
18
 
19
- 0.9.8 is a local source candidate that makes release-finish safe across receiver boundaries and current local hosts. It removes Hub-specific work from the public finishing flow, verifies frozen Claude and Codex marketplace identities before rebind writes, supports the Kimi Code 0.40.1 TUI, and skips empty distribute runs for plans that contain only postVerify hooks. It consumes the three Foundation packages at the exact 0.16.0 release. This note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance.
19
+ 0.9.9 is a local source candidate that makes Kimi Code plugin trust compare the complete displayed installation identity with the frozen URL. It consumes the three Foundation packages at the exact 0.16.0 release. This note is not evidence of publication, real-host acceptance, consumer installation verification, or independent acceptance.
20
20
 
21
21
  **Security**
22
22
 
23
- - Claude and Codex verify the frozen marketplace repository, ref, and commit before the first marketplace or plugin write when a rebind is required. An unreachable remote, missing ref, or commit mismatch returns `MANUAL_REQUIRED` for that host with zero host writes; other selected hosts continue.
24
- - Kimi Code plugin trust proceeds only when the dialog contains the frozen repository and tag and the selected row is confirmed as `Trust and install`. A `Trust this folder?` dialog, an unknown screen, timeout, EOF, or mismatched identity fails closed before unintended confirmation.
25
- - Kimi Code reports success only after the TUI displays its install-finished result and the installed registry, package version, tag, revision, managed root, and payload all match the frozen plan.
23
+ - Kimi Code extracts the complete installation identity from the plugin trust dialog, removes ANSI/OSC control sequences and soft wrapping, and compares the result exactly with the frozen installation URL. Similar repository names and tag prefixes or suffixes fail closed.
24
+ - Claude and Codex continue to verify the frozen marketplace repository, ref, and commit before the first marketplace or plugin write when a rebind is required. An unreachable remote, missing ref, or commit mismatch returns `MANUAL_REQUIRED` for that host with zero host writes; other selected hosts continue.
25
+ - Kimi Code continues only when the selected row is confirmed as `Trust and install`. A `Trust this folder?` dialog, an unknown screen, timeout, EOF, or mismatched identity fails closed before unintended confirmation.
26
26
  - Any host plan remains a qualified frozen-plan path and requires a VERIFIED-run from the same release lineage before host acceptance; this source candidate does not provide that acceptance.
27
27
 
28
28
  **Changed**
29
29
 
30
- - The public release-finish flow treats a `proposal-inbox` postVerify hook as proposal delivery plus delivery evidence. The receiver applies, renders, and synchronizes the proposal under its own runbook and governance; no Hub repository or push sequence is built into the public Skill.
31
- - Local-host ordering follows each host's frozen installation source. Receiver completion is not a universal prerequisite for updating unrelated hosts.
32
- - Kimi Code resolves its effective configuration root from explicit `kimiHome`, then `KIMI_CODE_HOME`, then `~/.kimi-code`; the TUI process and post-install observation use the same root.
33
- - The Kimi Code 0.40.1 TUI path normalizes ANSI/OSC control sequences and soft-wrapped URLs, uses a wide pseudo-terminal, submits commands through bracketed paste plus CSI Enter, and waits for explicit prompt, trust, install-result, reload, and exit states.
34
- - A single phase-aware postPublish predicate now requires distribute only for targets, explicit distribute hooks, or hooks whose omitted phase defaults to distribute. A plan containing only postVerify hooks moves from PUBLISHED directly to verify and runs postVerify independently after VERIFIED.
35
- - The current 0.9.8 candidate includes the narrow R-05 Hook cache v2 consumer path, keeps the CodeBuddy plugin entry explicit as `marketplace: release-skill`, and keeps `--root <project-root>` in release-finish local-finish examples. Foundation dependencies are pinned to the three released 0.16.0 packages.
30
+ - The English and Chinese README scope descriptions identify 0.9.9 as the current source candidate.
31
+ - The public release-finish flow continues to treat a `proposal-inbox` postVerify hook as proposal delivery plus delivery evidence. The receiver applies, renders, and synchronizes the proposal under its own runbook and governance; no Hub repository or push sequence is built into the public Skill.
32
+ - Kimi Code continues to resolve its effective configuration root from explicit `kimiHome`, then `KIMI_CODE_HOME`, then `~/.kimi-code`; the TUI process and post-install observation use the same root.
33
+ - The current 0.9.9 candidate keeps the narrow R-05 Hook cache v2 consumer path, keeps the CodeBuddy plugin entry explicit as `marketplace: release-skill`, and keeps `--root <project-root>` in release-finish local-finish examples. Foundation dependencies remain pinned to the three released 0.16.0 packages.
36
34
 
37
35
  **Upgrade Notes**
38
36
 
39
- Prepare and approve a new 0.9.8 production plan for these changes. After verify reaches `VERIFIED`, complete every declared postVerify hook with its own immutable checkpoint approval before running release-finish. Real-host acceptance can begin only after 0.9.8 is officially published and VERIFIED; the official 0.9.8 entry must be installed or reloaded first. A source candidate, an older installed entry, or the mere existence of plan and run files cannot complete real-host acceptance. Each selected host must complete a first successful update. On the second run, Claude, Kimi, CodeBuddy, and WorkBuddy must report `ALREADY_CURRENT`; Codex may report `UPDATED` only when it reinstalls the same exact 0.9.8 frozen reference, payload validation passes, and `restartRequired=true` is declared. The local updater uses the Kimi Code TUI path verified for 0.40.1; it does not switch to a web or REST installation path. Confirm the frozen repository and tag shown by the plugin trust dialog, and never approve a folder-trust dialog as part of plugin installation. This candidate does not claim that 0.9.8 has already been published or VERIFIED.
37
+ Prepare and approve a new 0.9.9 production plan for these changes. After verify reaches `VERIFIED`, complete every declared postVerify hook with its own immutable checkpoint approval before running release-finish. Real-host acceptance can begin only after 0.9.9 is officially published and VERIFIED; the official 0.9.9 entry must be installed or reloaded first. A source candidate, an older installed entry, or the mere existence of plan and run files cannot complete real-host acceptance. Each selected host must complete a first successful update. On the second run, Claude, Kimi, CodeBuddy, and WorkBuddy must report `ALREADY_CURRENT`; Codex may report `UPDATED` only when it reinstalls the same exact 0.9.9 frozen reference, payload validation passes, and `restartRequired=true` is declared. The local updater uses the Kimi Code TUI path verified for 0.40.1; it does not switch to a web or REST installation path. Confirm that the complete frozen installation URL shown by the plugin trust dialog is exact, and never approve a folder-trust dialog as part of plugin installation. This candidate does not claim that 0.9.9 has already been published or VERIFIED.
40
38
  <!-- release-skill:managed:end id=latest-release -->
41
39
 
42
40
  <!-- release-skill:capability:external-write-boundary -->
43
- > **Current boundary:** v0.9.8 is the current source candidate. This README
41
+ > **Current boundary:** v0.9.9 is the current source candidate. This README
44
42
  > records intended scope and verification boundaries; it is not evidence of
45
43
  > publication, consumer-installation verification, or independent acceptance.
46
44
  > Release availability must be established from the corresponding release records
@@ -64,7 +62,7 @@ Prepare and approve a new 0.9.8 production plan for these changes. After verify
64
62
  > publish global preflight.
65
63
 
66
64
  <!-- release-skill:capability:safe-first-command -->
67
- > **Production path verified since the v0.1.1 milestone; v0.9.8 is the current
65
+ > **Production path verified since the v0.1.1 milestone; v0.9.9 is the current
68
66
  > source candidate. Its README does not establish publication,
69
67
  > consumer-installation verification, or independent acceptance.**
70
68
  > The npm-installed CLI is the supported user entry. Source checkout
@@ -93,7 +91,7 @@ checkpoints remain intact and use matching-version recovery. Evidence v1 stays
93
91
  read-only; v2 uses a closed top level with phase extensions in `details`.
94
92
  Summaries and recovery suggestions are diagnostic, never publication authority.
95
93
 
96
- The current 0.9.7 candidate includes the narrow R-05 Hook cache v2 consumer
94
+ The current 0.9.9 candidate includes the narrow R-05 Hook cache v2 consumer
97
95
  path, the public `postverify` path, and the stable isolated install-tree record
98
96
  path (A2/A3). It still
99
97
  excludes R-02 safe full-tree inventory, R-10 historical-release verification
package/README.zh-CN.md CHANGED
@@ -2,39 +2,37 @@
2
2
 
3
3
  [English](README.md) · 安装指南:[中文](INSTALL.zh-CN.md) / [English](INSTALL.md)
4
4
 
5
- <!-- release-skill:release-version: 0.9.8 -->
5
+ <!-- release-skill:release-version: 0.9.9 -->
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.8** (2026-09-04)
11
+ **0.9.9** (2026-09-04)
12
12
 
13
- 0.9.8 是修正 release-finish 接收端边界和当前本机宿主安全性的本地源码候选。它从公共收尾流程移除 Hub 专属操作,在 Claude 和 Codex 重绑市场前验证冻结身份,支持 Kimi Code 0.40.1 TUI,并让只有 postVerify hook 的计划跳过空 distribute。三项 Foundation 依赖均精确消费已发布的 0.16.0。本说明不代表已经发布、完成真实宿主验收、完成消费者安装验证或通过独立验收。
13
+ 0.9.9 是修正 Kimi Code 插件信任身份精确比较的本地源码候选。三项 Foundation 依赖均精确消费已发布的 0.16.0。本说明不代表已经发布、完成真实宿主验收、完成消费者安装验证或通过独立验收。
14
14
 
15
15
  **安全**
16
16
 
17
- - Claude Codex 仅在确实需要重绑时,于第一条市场或插件写命令前验证冻结的 marketplace 仓库、ref commit。远端不可达、ref 缺失或 commit 不一致时,该宿主以零写入返回 `MANUAL_REQUIRED`,其他已选宿主继续。
18
- - Kimi Code 只有在插件信任对话框包含冻结 repotag,且选中项确认为 `Trust and install` 时才继续。出现 `Trust this folder?`、未知界面、超时、EOF 或身份不一致时,在意外确认前失败关闭。
19
- - Kimi Code 只有在 TUI 显示安装完成,而且安装登记、package version、tag、revision、受管根和载荷都与冻结计划一致后才报告成功。
17
+ - Kimi Code 会从插件信任对话框提取完整安装身份,清除 ANSI/OSC 控制序列并归一软换行,再与冻结安装 URL 精确比较。相似仓库名、tag 前缀或 tag 后缀均失败关闭。
18
+ - Claude Codex 继续在确实需要重绑时,于第一条市场或插件写命令前验证冻结的 marketplace 仓库、ref commit。远端不可达、ref 缺失或 commit 不一致时,该宿主以零写入返回 `MANUAL_REQUIRED`,其他已选宿主继续。
19
+ - Kimi Code 只有在选中项确认为 `Trust and install` 时才继续。出现 `Trust this folder?`、未知界面、超时、EOF 或身份不一致时,在意外确认前失败关闭。
20
20
  - 任何宿主计划都必须是合格冻结计划,并要求同一发布谱系的 VERIFIED run 才能开始宿主验收;本源码候选不提供该验收。
21
21
 
22
22
  **变更**
23
23
 
24
- - 公共 release-finish 只把 `proposal-inbox` postVerify hook 定义为提案送达和送达证据。接收端按自身 runbook 和治理应用、渲染与同步提案;公共 Skill 不再内置 Hub 仓库或推送顺序。
25
- - 本机宿主顺序按各宿主在冻结计划中的真实安装来源决定。接收端完成不是更新无关宿主的统一前置条件。
26
- - Kimi Code 有效配置根依次取显式 `kimiHome`、`KIMI_CODE_HOME` 和 `~/.kimi-code`;TUI 进程与安装后观察使用同一根目录。
27
- - Kimi Code 0.40.1 TUI 路径会归一 ANSI/OSC 控制序列和 URL 软换行,使用宽伪终端,以 bracketed paste CSI Enter 提交命令,并显式等待提示符、插件信任、安装结果、重载与退出状态。
28
- - 统一的 phase-aware postPublish 判定只在存在 target、显式 distribute hook,或 hook 缺省 phase 按既有规则属于 distribute 时要求 distribute。只有 postVerify hook 的计划从 PUBLISHED 直接进入 verify,并在 VERIFIED 后独立执行 postVerify。
29
- - 当前 0.9.8 候选包含窄范围的 R-05 Hook cache v2 消费路径,保留 CodeBuddy 插件显式的 `marketplace: release-skill` 条目,并在 release-finish 本机收尾示例中保留 `--root <project-root>`。Foundation 三包精确依赖已发布的 0.16.0。
24
+ - 中英文 README 的范围说明统一把 0.9.9 标为当前源码候选。
25
+ - 公共 release-finish 继续只把 `proposal-inbox` postVerify hook 定义为提案送达和送达证据。接收端按自身 runbook 和治理应用、渲染与同步提案;公共 Skill 不内置 Hub 仓库或推送顺序。
26
+ - Kimi Code 有效配置根继续依次取显式 `kimiHome`、`KIMI_CODE_HOME` 和 `~/.kimi-code`;TUI 进程与安装后观察使用同一根目录。
27
+ - 当前 0.9.9 候选保留窄范围的 R-05 Hook cache v2 消费路径,保留 CodeBuddy 插件显式的 `marketplace: release-skill` 条目,并在 release-finish 本机收尾示例中保留 `--root <project-root>`。Foundation 三包继续精确依赖已发布的 0.16.0。
30
28
 
31
29
  **升级说明**
32
30
 
33
- 采用这些修复时,应准备并批准新的 0.9.8 production plan。verify 达到 `VERIFIED` 后,先用各 hook 独立的不可变 checkpoint approval 完成所有已声明 postVerify,再运行 release-finish。真实宿主验收只有在 0.9.8 正式发布并达到 VERIFIED 后才能开始;必须先安装或重载正式的 0.9.8 入口。源码候选、旧的已安装入口,或仅存在计划和运行文件,都不能完成真实宿主验收。每个已选宿主都必须完成首次成功更新。第二次运行时,Claude、Kimi、CodeBuddy 和 WorkBuddy 必须返回 `ALREADY_CURRENT`;Codex 可以返回 `UPDATED`,但只有在重新安装同一精确 0.9.8 冻结引用、载荷验证通过并声明 `restartRequired=true` 时才允许这样返回。本机 updater 采用已针对 Kimi Code 0.40.1 验证的 TUI 路径,不切换到 Web 或 REST 安装路径。插件信任界面显示的仓库与 tag 必须和冻结目标一致;插件安装过程中不得批准目录信任界面。本候选不宣称 0.9.8 已经发布或达到 VERIFIED。
31
+ 采用这些修复时,应准备并批准新的 0.9.9 production plan。verify 达到 `VERIFIED` 后,先用各 hook 独立的不可变 checkpoint approval 完成所有已声明 postVerify,再运行 release-finish。真实宿主验收只有在 0.9.9 正式发布并达到 VERIFIED 后才能开始;必须先安装或重载正式的 0.9.9 入口。源码候选、旧的已安装入口,或仅存在计划和运行文件,都不能完成真实宿主验收。每个已选宿主都必须完成首次成功更新。第二次运行时,Claude、Kimi、CodeBuddy 和 WorkBuddy 必须返回 `ALREADY_CURRENT`;Codex 可以返回 `UPDATED`,但只有在重新安装同一精确 0.9.9 冻结引用、载荷验证通过并声明 `restartRequired=true` 时才允许这样返回。本机 updater 采用已针对 Kimi Code 0.40.1 验证的 TUI 路径,不切换到 Web 或 REST 安装路径。插件信任界面显示的完整冻结安装 URL 必须精确一致;插件安装过程中不得批准目录信任界面。本候选不宣称 0.9.9 已经发布或达到 VERIFIED。
34
32
  <!-- release-skill:managed:end id=latest-release -->
35
33
 
36
34
  <!-- release-skill:capability:external-write-boundary -->
37
- > **当前边界:** v0.9.8 只是当前源码候选。本 README 记录预期范围与验证边界,
35
+ > **当前边界:** v0.9.9 只是当前源码候选。本 README 记录预期范围与验证边界,
38
36
  > 不代表已经发布、完成消费者安装验证或通过独立验收。
39
37
  > 版本可用性以对应发布记录及发布后验证结果为准。
40
38
  > v0.4.1 是更早的已发布里程碑(v0.2.2 曾处于已发布状态,后因平台验证收敛修复而更新)。
@@ -50,7 +48,7 @@ release-skill 帮助维护者回答三个问题:准备发布什么、还有哪
50
48
  > 远端唯一性检查在 `publish` 全局预检执行。
51
49
 
52
50
  <!-- release-skill:capability:safe-first-command -->
53
- > **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.9.8 是当前源码候选,本 README 不证明该候选已经发布、完成消费者安装验证或通过独立验收。**
51
+ > **生产路径自 v0.1.1 里程碑起已完成真实生产验证;v0.9.9 是当前源码候选,本 README 不证明该候选已经发布、完成消费者安装验证或通过独立验收。**
54
52
  > npm 安装的 CLI 是受支持的用户入口;源码 checkout 保留为开发/贡献者路径。
55
53
  >
56
54
  > **第一条命令:**
@@ -68,7 +66,7 @@ marketplace 委托目标工作区发布的边界不变。
68
66
 
69
67
  旧 production 计划缺少 `sourceAuthority` 时,在外部写入前拒绝。未发生外部写入的计划必须重新 prepare 并批准新摘要,不能补写旧计划或迁移批准。已有 `PARTIAL` 保留检查点,走匹配版本的恢复路径。evidence v1 只读;v2 顶层封闭,阶段扩展放在 `details`。摘要和恢复建议只作诊断,不构成发布权威。
70
68
 
71
- 当前 0.9.7 候选包含窄范围的 R-05 Hook cache v2 消费路径、公开 `postverify` 路径和稳定隔离安装树记录路径(A2/A3)。当前仍不包含 R-02 安全整树盘点、R-10 历史发布验证的产品实现、真实 Kimi/WorkBuddy 公开市场安装与调用门禁或 Audit 公开离线发布记录验证器。本范围说明不构成远端发布记录或消费者升级指引。
69
+ 当前 0.9.9 候选包含窄范围的 R-05 Hook cache v2 消费路径、公开 `postverify` 路径和稳定隔离安装树记录路径(A2/A3)。当前仍不包含 R-02 安全整树盘点、R-10 历史发布验证的产品实现、真实 Kimi/WorkBuddy 公开市场安装与调用门禁或 Audit 公开离线发布记录验证器。本范围说明不构成远端发布记录或消费者升级指引。
72
70
 
73
71
  Foundation 三包精确依赖已发布的 0.16.0。新生成的 Kimi/CodeBuddy 同仓计划在 verify 阶段调用正式 `runPluginVerification`,把完整冻结载荷交给 Foundation,并记录最小的 `install-only` 观察收据。Kimi 映射为 `kimi-code`,CodeBuddy 映射为兼容的 `workbuddy`。`observed` 与 `payloadMatches` 只表示机制观察结果,不代表远端已发布或 release-skill 已完成领域验证。独立市场来源、真实市场安装和宿主调用仍是人工后续任务。
74
72
 
@@ -9,7 +9,7 @@
9
9
  {
10
10
  "name": "release-skill",
11
11
  "source": "./",
12
- "version": "0.9.8",
12
+ "version": "0.9.9",
13
13
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
14
14
  "author": {
15
15
  "name": "广州市风荷科技有限公司"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -9,9 +9,9 @@ const __bundlePkgRoot = __bundleResolve(__bundleDirname(__bundleFileURLToPath(im
9
9
  // Provide a real require() for CJS packages bundled into ESM (e.g. yaml, ajv).
10
10
  const __bundleRealRequire = __bundleCreateRequire(import.meta.url);
11
11
  // Package identity injected at build time — closure-independent --version probe.
12
- const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.8"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.9"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "7fa9e4b55133e888e3f3ace288f0194eb1ac063c0616252d2dda8e58be7eee21";
14
+ const __bundleSourceDigest = "ef2ec274a982afcf48acdbccdf32439d199dd1d79b4a39b1aeaef23195fadbfb";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -132339,7 +132339,7 @@ proc cleanScreen {value} {
132339
132339
  proc compactScreen {value} {
132340
132340
  set value [cleanScreen $value]
132341
132341
  regsub -all {[[:space:]]+} $value {} value
132342
- return [string tolower $value]
132342
+ return $value
132343
132343
  }
132344
132344
 
132345
132345
  proc extractPluginTrustDialog {value} {
@@ -132354,6 +132354,22 @@ proc extractPluginTrustDialog {value} {
132354
132354
  return [string range $cleaned $dialogStart end]
132355
132355
  }
132356
132356
 
132357
+ proc extractPluginTrustIdentity {value} {
132358
+ set cleaned [cleanScreen $value]
132359
+ set lowered [string tolower $cleaned]
132360
+ set identityStart -1
132361
+ foreach marker {"install third-party plugin " "trust and install from "} {
132362
+ set markerStart [string last $marker $lowered]
132363
+ if {$markerStart >= 0 && $markerStart + [string length $marker] > $identityStart} {
132364
+ set identityStart [expr {$markerStart + [string length $marker]}]
132365
+ }
132366
+ }
132367
+ if {$identityStart < 0} { return "" }
132368
+ set identityEnd [string first "?" $cleaned $identityStart]
132369
+ if {$identityEnd < 0} { return "" }
132370
+ return [string range $cleaned $identityStart [expr {$identityEnd - 1}]]
132371
+ }
132372
+
132357
132373
  proc failTimeout {state timeoutCode unknownCode} {
132358
132374
  global expect_out
132359
132375
  set buffer ""
@@ -132425,12 +132441,14 @@ if {$dialog eq ""} {
132425
132441
  puts stderr "KIMI_TUI_STATE:plugin-trust:dialog-unknown"
132426
132442
  exit 113
132427
132443
  }
132428
- set compactDialog [compactScreen $dialog]
132429
- if {[string first [string tolower [compactScreen $expectedRepo]] $compactDialog] < 0} {
132430
- puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
132431
- exit 111
132432
- }
132433
- if {[string first [string tolower [compactScreen $expectedTag]] $compactDialog] < 0} {
132444
+ set identity [extractPluginTrustIdentity $dialog]
132445
+ set compactIdentity [compactScreen $identity]
132446
+ if {$identity eq "" || $compactIdentity ne [compactScreen $installUrl]} {
132447
+ set expectedRepoPrefix "[compactScreen $expectedRepo]/releases/tag/"
132448
+ if {[string first $expectedRepoPrefix $compactIdentity] != 0} {
132449
+ puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
132450
+ exit 111
132451
+ }
132434
132452
  puts stderr "KIMI_TUI_STATE:plugin-trust:tag-mismatch"
132435
132453
  exit 112
132436
132454
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
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.8.",
22
+ "Prepare a release plan for version 0.9.9.",
23
23
  "Help me understand the release workflow."
24
24
  ]
25
25
  }
@@ -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.8"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.9"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "7fa9e4b55133e888e3f3ace288f0194eb1ac063c0616252d2dda8e58be7eee21";
14
+ const __bundleSourceDigest = "ef2ec274a982afcf48acdbccdf32439d199dd1d79b4a39b1aeaef23195fadbfb";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -132339,7 +132339,7 @@ proc cleanScreen {value} {
132339
132339
  proc compactScreen {value} {
132340
132340
  set value [cleanScreen $value]
132341
132341
  regsub -all {[[:space:]]+} $value {} value
132342
- return [string tolower $value]
132342
+ return $value
132343
132343
  }
132344
132344
 
132345
132345
  proc extractPluginTrustDialog {value} {
@@ -132354,6 +132354,22 @@ proc extractPluginTrustDialog {value} {
132354
132354
  return [string range $cleaned $dialogStart end]
132355
132355
  }
132356
132356
 
132357
+ proc extractPluginTrustIdentity {value} {
132358
+ set cleaned [cleanScreen $value]
132359
+ set lowered [string tolower $cleaned]
132360
+ set identityStart -1
132361
+ foreach marker {"install third-party plugin " "trust and install from "} {
132362
+ set markerStart [string last $marker $lowered]
132363
+ if {$markerStart >= 0 && $markerStart + [string length $marker] > $identityStart} {
132364
+ set identityStart [expr {$markerStart + [string length $marker]}]
132365
+ }
132366
+ }
132367
+ if {$identityStart < 0} { return "" }
132368
+ set identityEnd [string first "?" $cleaned $identityStart]
132369
+ if {$identityEnd < 0} { return "" }
132370
+ return [string range $cleaned $identityStart [expr {$identityEnd - 1}]]
132371
+ }
132372
+
132357
132373
  proc failTimeout {state timeoutCode unknownCode} {
132358
132374
  global expect_out
132359
132375
  set buffer ""
@@ -132425,12 +132441,14 @@ if {$dialog eq ""} {
132425
132441
  puts stderr "KIMI_TUI_STATE:plugin-trust:dialog-unknown"
132426
132442
  exit 113
132427
132443
  }
132428
- set compactDialog [compactScreen $dialog]
132429
- if {[string first [string tolower [compactScreen $expectedRepo]] $compactDialog] < 0} {
132430
- puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
132431
- exit 111
132432
- }
132433
- if {[string first [string tolower [compactScreen $expectedTag]] $compactDialog] < 0} {
132444
+ set identity [extractPluginTrustIdentity $dialog]
132445
+ set compactIdentity [compactScreen $identity]
132446
+ if {$identity eq "" || $compactIdentity ne [compactScreen $installUrl]} {
132447
+ set expectedRepoPrefix "[compactScreen $expectedRepo]/releases/tag/"
132448
+ if {[string first $expectedRepoPrefix $compactIdentity] != 0} {
132449
+ puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
132450
+ exit 111
132451
+ }
132434
132452
  puts stderr "KIMI_TUI_STATE:plugin-trust:tag-mismatch"
132435
132453
  exit 112
132436
132454
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -9,9 +9,9 @@ const __bundlePkgRoot = __bundleResolve(__bundleDirname(__bundleFileURLToPath(im
9
9
  // Provide a real require() for CJS packages bundled into ESM (e.g. yaml, ajv).
10
10
  const __bundleRealRequire = __bundleCreateRequire(import.meta.url);
11
11
  // Package identity injected at build time — closure-independent --version probe.
12
- const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.8"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.9"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "7fa9e4b55133e888e3f3ace288f0194eb1ac063c0616252d2dda8e58be7eee21";
14
+ const __bundleSourceDigest = "ef2ec274a982afcf48acdbccdf32439d199dd1d79b4a39b1aeaef23195fadbfb";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -132339,7 +132339,7 @@ proc cleanScreen {value} {
132339
132339
  proc compactScreen {value} {
132340
132340
  set value [cleanScreen $value]
132341
132341
  regsub -all {[[:space:]]+} $value {} value
132342
- return [string tolower $value]
132342
+ return $value
132343
132343
  }
132344
132344
 
132345
132345
  proc extractPluginTrustDialog {value} {
@@ -132354,6 +132354,22 @@ proc extractPluginTrustDialog {value} {
132354
132354
  return [string range $cleaned $dialogStart end]
132355
132355
  }
132356
132356
 
132357
+ proc extractPluginTrustIdentity {value} {
132358
+ set cleaned [cleanScreen $value]
132359
+ set lowered [string tolower $cleaned]
132360
+ set identityStart -1
132361
+ foreach marker {"install third-party plugin " "trust and install from "} {
132362
+ set markerStart [string last $marker $lowered]
132363
+ if {$markerStart >= 0 && $markerStart + [string length $marker] > $identityStart} {
132364
+ set identityStart [expr {$markerStart + [string length $marker]}]
132365
+ }
132366
+ }
132367
+ if {$identityStart < 0} { return "" }
132368
+ set identityEnd [string first "?" $cleaned $identityStart]
132369
+ if {$identityEnd < 0} { return "" }
132370
+ return [string range $cleaned $identityStart [expr {$identityEnd - 1}]]
132371
+ }
132372
+
132357
132373
  proc failTimeout {state timeoutCode unknownCode} {
132358
132374
  global expect_out
132359
132375
  set buffer ""
@@ -132425,12 +132441,14 @@ if {$dialog eq ""} {
132425
132441
  puts stderr "KIMI_TUI_STATE:plugin-trust:dialog-unknown"
132426
132442
  exit 113
132427
132443
  }
132428
- set compactDialog [compactScreen $dialog]
132429
- if {[string first [string tolower [compactScreen $expectedRepo]] $compactDialog] < 0} {
132430
- puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
132431
- exit 111
132432
- }
132433
- if {[string first [string tolower [compactScreen $expectedTag]] $compactDialog] < 0} {
132444
+ set identity [extractPluginTrustIdentity $dialog]
132445
+ set compactIdentity [compactScreen $identity]
132446
+ if {$identity eq "" || $compactIdentity ne [compactScreen $installUrl]} {
132447
+ set expectedRepoPrefix "[compactScreen $expectedRepo]/releases/tag/"
132448
+ if {[string first $expectedRepoPrefix $compactIdentity] != 0} {
132449
+ puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
132450
+ exit 111
132451
+ }
132434
132452
  puts stderr "KIMI_TUI_STATE:plugin-trust:tag-mismatch"
132435
132453
  exit 112
132436
132454
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -9,9 +9,9 @@ const __bundlePkgRoot = __bundleResolve(__bundleDirname(__bundleFileURLToPath(im
9
9
  // Provide a real require() for CJS packages bundled into ESM (e.g. yaml, ajv).
10
10
  const __bundleRealRequire = __bundleCreateRequire(import.meta.url);
11
11
  // Package identity injected at build time — closure-independent --version probe.
12
- const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.8"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.9"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "7fa9e4b55133e888e3f3ace288f0194eb1ac063c0616252d2dda8e58be7eee21";
14
+ const __bundleSourceDigest = "ef2ec274a982afcf48acdbccdf32439d199dd1d79b4a39b1aeaef23195fadbfb";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -132339,7 +132339,7 @@ proc cleanScreen {value} {
132339
132339
  proc compactScreen {value} {
132340
132340
  set value [cleanScreen $value]
132341
132341
  regsub -all {[[:space:]]+} $value {} value
132342
- return [string tolower $value]
132342
+ return $value
132343
132343
  }
132344
132344
 
132345
132345
  proc extractPluginTrustDialog {value} {
@@ -132354,6 +132354,22 @@ proc extractPluginTrustDialog {value} {
132354
132354
  return [string range $cleaned $dialogStart end]
132355
132355
  }
132356
132356
 
132357
+ proc extractPluginTrustIdentity {value} {
132358
+ set cleaned [cleanScreen $value]
132359
+ set lowered [string tolower $cleaned]
132360
+ set identityStart -1
132361
+ foreach marker {"install third-party plugin " "trust and install from "} {
132362
+ set markerStart [string last $marker $lowered]
132363
+ if {$markerStart >= 0 && $markerStart + [string length $marker] > $identityStart} {
132364
+ set identityStart [expr {$markerStart + [string length $marker]}]
132365
+ }
132366
+ }
132367
+ if {$identityStart < 0} { return "" }
132368
+ set identityEnd [string first "?" $cleaned $identityStart]
132369
+ if {$identityEnd < 0} { return "" }
132370
+ return [string range $cleaned $identityStart [expr {$identityEnd - 1}]]
132371
+ }
132372
+
132357
132373
  proc failTimeout {state timeoutCode unknownCode} {
132358
132374
  global expect_out
132359
132375
  set buffer ""
@@ -132425,12 +132441,14 @@ if {$dialog eq ""} {
132425
132441
  puts stderr "KIMI_TUI_STATE:plugin-trust:dialog-unknown"
132426
132442
  exit 113
132427
132443
  }
132428
- set compactDialog [compactScreen $dialog]
132429
- if {[string first [string tolower [compactScreen $expectedRepo]] $compactDialog] < 0} {
132430
- puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
132431
- exit 111
132432
- }
132433
- if {[string first [string tolower [compactScreen $expectedTag]] $compactDialog] < 0} {
132444
+ set identity [extractPluginTrustIdentity $dialog]
132445
+ set compactIdentity [compactScreen $identity]
132446
+ if {$identity eq "" || $compactIdentity ne [compactScreen $installUrl]} {
132447
+ set expectedRepoPrefix "[compactScreen $expectedRepo]/releases/tag/"
132448
+ if {[string first $expectedRepoPrefix $compactIdentity] != 0} {
132449
+ puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
132450
+ exit 111
132451
+ }
132434
132452
  puts stderr "KIMI_TUI_STATE:plugin-trust:tag-mismatch"
132435
132453
  exit 112
132436
132454
  }
@@ -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.8"});
12
+ const __bundlePkg = Object.freeze({"name":"release-skill","version":"0.9.9"});
13
13
  // Build-time source digest for the BUNDLE_STALE freshness gate (see above).
14
- const __bundleSourceDigest = "7fa9e4b55133e888e3f3ace288f0194eb1ac063c0616252d2dda8e58be7eee21";
14
+ const __bundleSourceDigest = "ef2ec274a982afcf48acdbccdf32439d199dd1d79b4a39b1aeaef23195fadbfb";
15
15
 
16
16
  var __create = Object.create;
17
17
  var __defProp = Object.defineProperty;
@@ -132339,7 +132339,7 @@ proc cleanScreen {value} {
132339
132339
  proc compactScreen {value} {
132340
132340
  set value [cleanScreen $value]
132341
132341
  regsub -all {[[:space:]]+} $value {} value
132342
- return [string tolower $value]
132342
+ return $value
132343
132343
  }
132344
132344
 
132345
132345
  proc extractPluginTrustDialog {value} {
@@ -132354,6 +132354,22 @@ proc extractPluginTrustDialog {value} {
132354
132354
  return [string range $cleaned $dialogStart end]
132355
132355
  }
132356
132356
 
132357
+ proc extractPluginTrustIdentity {value} {
132358
+ set cleaned [cleanScreen $value]
132359
+ set lowered [string tolower $cleaned]
132360
+ set identityStart -1
132361
+ foreach marker {"install third-party plugin " "trust and install from "} {
132362
+ set markerStart [string last $marker $lowered]
132363
+ if {$markerStart >= 0 && $markerStart + [string length $marker] > $identityStart} {
132364
+ set identityStart [expr {$markerStart + [string length $marker]}]
132365
+ }
132366
+ }
132367
+ if {$identityStart < 0} { return "" }
132368
+ set identityEnd [string first "?" $cleaned $identityStart]
132369
+ if {$identityEnd < 0} { return "" }
132370
+ return [string range $cleaned $identityStart [expr {$identityEnd - 1}]]
132371
+ }
132372
+
132357
132373
  proc failTimeout {state timeoutCode unknownCode} {
132358
132374
  global expect_out
132359
132375
  set buffer ""
@@ -132425,12 +132441,14 @@ if {$dialog eq ""} {
132425
132441
  puts stderr "KIMI_TUI_STATE:plugin-trust:dialog-unknown"
132426
132442
  exit 113
132427
132443
  }
132428
- set compactDialog [compactScreen $dialog]
132429
- if {[string first [string tolower [compactScreen $expectedRepo]] $compactDialog] < 0} {
132430
- puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
132431
- exit 111
132432
- }
132433
- if {[string first [string tolower [compactScreen $expectedTag]] $compactDialog] < 0} {
132444
+ set identity [extractPluginTrustIdentity $dialog]
132445
+ set compactIdentity [compactScreen $identity]
132446
+ if {$identity eq "" || $compactIdentity ne [compactScreen $installUrl]} {
132447
+ set expectedRepoPrefix "[compactScreen $expectedRepo]/releases/tag/"
132448
+ if {[string first $expectedRepoPrefix $compactIdentity] != 0} {
132449
+ puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
132450
+ exit 111
132451
+ }
132434
132452
  puts stderr "KIMI_TUI_STATE:plugin-trust:tag-mismatch"
132435
132453
  exit 112
132436
132454
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "release-skill",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "Safe preparation and frozen GitHub/npm production publishing with full happy end verification",
5
5
  "author": {
6
6
  "name": "广州市风荷科技有限公司"
@@ -2,11 +2,11 @@
2
2
  "schemaVersion": "1.0.0",
3
3
  "platformId": "release-skill",
4
4
  "platformName": "release-skill Plugin Platform",
5
- "version": "0.9.8",
5
+ "version": "0.9.9",
6
6
  "logicalRoot": "skills-src/",
7
7
  "logicalRootDigest": "aec96745b30289ed48d576fbfc98ecd3aacb834f83394be76d4734d7d0fc0ad4",
8
8
  "projectionDigest": "e5117d89c9f965e15a1464cc84f542cb1e75a685f842183d0cfc7a105ace5ceb",
9
- "projectionId": "release-skill:platform:0.9.8",
9
+ "projectionId": "release-skill:platform:0.9.9",
10
10
  "manifestRequired": true,
11
11
  "projectionSources": {
12
12
  "skills-src-root": {
@@ -1010,7 +1010,7 @@ proc cleanScreen {value} {
1010
1010
  proc compactScreen {value} {
1011
1011
  set value [cleanScreen $value]
1012
1012
  regsub -all {[[:space:]]+} $value {} value
1013
- return [string tolower $value]
1013
+ return $value
1014
1014
  }
1015
1015
 
1016
1016
  proc extractPluginTrustDialog {value} {
@@ -1025,6 +1025,22 @@ proc extractPluginTrustDialog {value} {
1025
1025
  return [string range $cleaned $dialogStart end]
1026
1026
  }
1027
1027
 
1028
+ proc extractPluginTrustIdentity {value} {
1029
+ set cleaned [cleanScreen $value]
1030
+ set lowered [string tolower $cleaned]
1031
+ set identityStart -1
1032
+ foreach marker {"install third-party plugin " "trust and install from "} {
1033
+ set markerStart [string last $marker $lowered]
1034
+ if {$markerStart >= 0 && $markerStart + [string length $marker] > $identityStart} {
1035
+ set identityStart [expr {$markerStart + [string length $marker]}]
1036
+ }
1037
+ }
1038
+ if {$identityStart < 0} { return "" }
1039
+ set identityEnd [string first "?" $cleaned $identityStart]
1040
+ if {$identityEnd < 0} { return "" }
1041
+ return [string range $cleaned $identityStart [expr {$identityEnd - 1}]]
1042
+ }
1043
+
1028
1044
  proc failTimeout {state timeoutCode unknownCode} {
1029
1045
  global expect_out
1030
1046
  set buffer ""
@@ -1096,12 +1112,14 @@ if {$dialog eq ""} {
1096
1112
  puts stderr "KIMI_TUI_STATE:plugin-trust:dialog-unknown"
1097
1113
  exit 113
1098
1114
  }
1099
- set compactDialog [compactScreen $dialog]
1100
- if {[string first [string tolower [compactScreen $expectedRepo]] $compactDialog] < 0} {
1101
- puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
1102
- exit 111
1103
- }
1104
- if {[string first [string tolower [compactScreen $expectedTag]] $compactDialog] < 0} {
1115
+ set identity [extractPluginTrustIdentity $dialog]
1116
+ set compactIdentity [compactScreen $identity]
1117
+ if {$identity eq "" || $compactIdentity ne [compactScreen $installUrl]} {
1118
+ set expectedRepoPrefix "[compactScreen $expectedRepo]/releases/tag/"
1119
+ if {[string first $expectedRepoPrefix $compactIdentity] != 0} {
1120
+ puts stderr "KIMI_TUI_STATE:plugin-trust:repo-mismatch"
1121
+ exit 111
1122
+ }
1105
1123
  puts stderr "KIMI_TUI_STATE:plugin-trust:tag-mismatch"
1106
1124
  exit 112
1107
1125
  }