From eae4ffc97d9d576128037c2c7f1c935c5d586e40 Mon Sep 17 00:00:00 2001 From: owent Date: Wed, 23 Sep 2026 22:25:02 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A7=20Python=20?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E4=B8=8B=E8=BD=BD=E8=A7=84=E8=8C=83=20Releas?= =?UTF-8?q?e=20=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- Cargo.toml | 2 +- HISTORY.md | 7 ++++++- README.md | 10 +++++----- doc/ai/requirements-coverage.md | 6 +++--- tests/test_python_shim.py | 12 +++++++----- xresconv_cli.py | 14 +++++++++----- 7 files changed, 32 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 46bf883..cb0a732 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -453,7 +453,7 @@ dependencies = [ [[package]] name = "xresconv-cli" -version = "2.0.0" +version = "2.0.1" dependencies = [ "clap", "ctrlc", diff --git a/Cargo.toml b/Cargo.toml index 0356072..626831d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "xresconv-cli" -version = "2.0.0" +version = "2.0.1" edition = "2024" rust-version = "1.88" license = "MIT" diff --git a/HISTORY.md b/HISTORY.md index 763050b..e8aa784 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,6 +1,11 @@ 更新记录 ========== +2.0.1 +------ + +1. 修复旧 Python 入口从 GitHub Releases 下载时拒绝仓库规范地址 `owent/xresconv-cli` 的问题;保留旧组织地址兼容,并补充两种地址的离线回归测试与公开 Release 下载验收。 + 2.0.0 ------ @@ -10,7 +15,7 @@ 4. 修复:支持 `` 属性(原实现遗漏解析) 5. 修复:java 子进程启动失败计入失败数并输出诊断(原实现线程崩溃但失败数不增加) 6. 修复:日志着色兼容 `TERM=dumb` -7. GitHub Actions:六种 OS/架构原生测试、固定后端集成、15 个构建目标;tag 通过完整门禁后自动发布预编译包及校验和 +7. GitHub Actions:Linux/macOS/Windows 原生测试、8 个核心构建目标与 3 个扩展目标;tag 通过完整门禁后自动发布预编译包及校验和 8. 修复 JVM 参数重复、非正并发静默漏任务、循环 include、scheme 空白/空属性兼容、stdin 引号与相对 Java 路径 9. 增加取消进程树回收、双输出管道排空、失败状态饱和汇总、XML 编码与内部实体兼容 10. Python 下载回退、原子缓存安装和离线回归;真实 proto2/proto3 六种格式与直接 Java 调用逐字节对照 diff --git a/README.md b/README.md index ab2680d..bae5f3c 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ xresconv-cli 安装 ------ -从 [GitHub Releases](https://github.com/xresloader/xresconv-cli/releases) 下载对应平台的预编译包: +从 [GitHub Releases](https://github.com/owent/xresconv-cli/releases) 下载对应平台的预编译包: | 平台 | 制品 | | --- | --- | @@ -59,11 +59,11 @@ Python 兼容入口 1. 环境变量 `XRESCONV_CLI_BIN` 指定的可执行文件路径;不存在时提示并继续尝试缓存/下载。 2. 缓存目录中已下载的二进制(Windows 为 `%LOCALAPPDATA%\xresconv-cli\bin`,其他平台为 `${XDG_CACHE_HOME:-~/.cache}/xresconv-cli/bin`)。 -3. 以上都缺失时,从 [GitHub Releases](https://github.com/xresloader/xresconv-cli/releases) 下载最新版本的对应平台制品(校验 sha256 后写入缓存)。 +3. 以上都缺失时,从 [GitHub Releases](https://github.com/owent/xresconv-cli/releases) 下载最新版本的对应平台制品(校验 sha256 后写入缓存)。 Linux x64/arm64 优先使用 musl 静态包,以兼容不同 libc 发行版。下载具有超时与大小限制,校验失败不会覆盖现有缓存; 安装使用同目录临时文件与原子替换,并发启动不会读到下载了一半的二进制。已缓存版本不会每次联网检查升级。 -Python 3.14 已实测;兼容层保留 Python 2.7 的导入和子进程调用方式,但本轮没有可用的 Python 2.7 解释器做运行验收。 +Python 3.14 已实测;兼容层保留旧入口的调用方式。自动测试使用 Python 3 和本地编译的 Rust 二进制。 与 Python 版的行为差异 ---------------------- @@ -106,11 +106,11 @@ macOS x64 包在 `macos-latest` 上构建和冒烟。 发布流程 -------- -推送与 `Cargo.toml` 版本一致的 tag(如 `v2.0.0` 或 `2.0.0`)会触发 [release.yml](.github/workflows/release.yml)。 +推送与 `Cargo.toml` 版本一致的 tag(如 `v2.0.1` 或 `2.0.1`)会触发 [release.yml](.github/workflows/release.yml)。 流程复用完整构建/测试门禁,检查全部 8 个核心制品及 SHA256,上传完毕后自动公开 Release。 预发布版本标记 prerelease,不替换 latest;上传失败保留草稿,已公开版本拒绝覆盖。 常规 push/PR 同样构建并保存跨平台包为 Actions artifacts,扩展平台失败不阻塞核心发布。 -本地可用 `pwsh -NoProfile -File scripts/release.ps1 -Mode Tag -Tag v2.0.0` 检查 tag。 +本地可用 `pwsh -NoProfile -File scripts/release.ps1 -Mode Tag -Tag v2.0.1` 检查 tag。 示例截图 ------ diff --git a/doc/ai/requirements-coverage.md b/doc/ai/requirements-coverage.md index 7fc5362..5447755 100644 --- a/doc/ai/requirements-coverage.md +++ b/doc/ai/requirements-coverage.md @@ -23,7 +23,7 @@ Rust 是目标方向;新增资料不扩展被用户排除的技术栈。 | ID | 附件板块或具体要求 | 落点与适用边界 | | --- | --- | --- | -| C01 | 目标:理解、开发、修复、测试、文档、部署、路线图与计划 | [工程流程][engineering]、[Rust Skill][rust]、[Plan][plan];Rust 实现尚未开始 | +| C01 | 目标:理解、开发、修复、测试、文档、部署、路线图与计划 | [工程流程][engineering]、[Rust Skill][rust]、[Plan][plan];Rust 实现已建立 | | C02 | 调研和实时更新:范围、索引、版本、冲突、方案、事实变化、收尾 | [工程流程][engineering];来源含 claim/scope、URL/version、日期/method、installed/status、周期/触发、impact/owner | | C03 | 推荐结构与文件选择决策 | [维护流程][maintenance];最小入口、模块规则、Skill/Agent、兼容/工作流、设计/MCP、强制约束各有位置 | | C04 | 跨工具兼容 | [兼容参考][clients] 覆盖附件 13 个客户端;只为实际需要创建配置,不能视为运行验收 | @@ -56,8 +56,8 @@ Rust 是目标方向;新增资料不扩展被用户排除的技术栈。 - 客户端清单的完整参考不等于安装全套客户端;自定义 Agent/MCP/hooks/可选流程没有实施需求,不创建占位配置。 - 原附件链接的独立“高性能命令行工具清单”内容未提供;本地已建立可核验清单,不能声称读过或逐项覆盖未知外部内容。 -- 本仓库尚无 Cargo 工程;Rust 命令是未来门禁,不虚构构建、业务测试、后端或生产验收。 -- 新 Skill 的格式、发现与真实效果分开验收;当前状态以 [验证记录][validation] 为准。 +- 本仓库已有 Cargo 工程;构建、业务测试与 CI 结果以 [验证记录][validation] 为准,不将其外推为生产运行验收。 +- 新 Skill 的格式检查与已有发现记录见 [验证记录][validation];按 2026-09-23 用户要求,规则注入、Skill 发现与真实效果不再作为本轮验收门禁。 [root]: ../../AGENTS.md [engineering]: engineering-workflow.md diff --git a/tests/test_python_shim.py b/tests/test_python_shim.py index 24f8fbc..8f2bb22 100644 --- a/tests/test_python_shim.py +++ b/tests/test_python_shim.py @@ -105,9 +105,9 @@ def test_download_failure_is_diagnostic(self): self.assertIn("network down", stderr.getvalue()) self.assertIn(shim.BIN_ENV, stderr.getvalue()) - def release(self, checksum=None, missing=None, url=None): + def release(self, checksum=None, missing=None, url=None, owner="xresloader"): name = "xresconv-cli-2.0.0-x86_64-unknown-linux-musl.tar.gz" - asset_url = "https://github.com/xresloader/xresconv-cli/releases/download/v2.0.0/" + name + asset_url = "https://github.com/" + owner + "/xresconv-cli/releases/download/v2.0.0/" + name data = b"archive" meta = {"tag_name": "v2.0.0", "assets": [ {"name": name, "browser_download_url": url or asset_url}, @@ -121,15 +121,17 @@ def release(self, checksum=None, missing=None, url=None): @mock.patch.object(shim, "detect_asset", return_value=("x86_64-unknown-linux-musl", ".tar.gz")) def test_release_and_checksum(self, _): - with self.release(): - self.assertEqual(shim.download_latest(), (b"archive", ".tar.gz")) + for owner in ("xresloader", "owent"): + with self.subTest(owner=owner), self.release(owner=owner): + self.assertEqual(shim.download_latest(), (b"archive", ".tar.gz")) for checksum in [b"0" * 64, b"", b"invalid", b"g" * 64]: with self.subTest(checksum=checksum), self.release(checksum=checksum), self.assertRaises(RuntimeError): shim.download_latest() @mock.patch.object(shim, "detect_asset", return_value=("x86_64-unknown-linux-musl", ".tar.gz")) def test_missing_release_assets_and_foreign_url(self, _): - for args in [{"missing": 0}, {"missing": 1}, {"url": "https://example.com/binary"}]: + for args in [{"missing": 0}, {"missing": 1}, {"url": "https://example.com/binary"}, + {"owner": "owent-evil"}]: with self.subTest(args=args), self.release(**args), self.assertRaises(RuntimeError): shim.download_latest() diff --git a/xresconv_cli.py b/xresconv_cli.py index c136fe6..1bb05fb 100644 --- a/xresconv_cli.py +++ b/xresconv_cli.py @@ -8,7 +8,7 @@ 3. 从 GitHub Releases 下载最新版本并写入缓存 Rust 版本发布页(含各平台预编译二进制): -https://github.com/xresloader/xresconv-cli/releases +https://github.com/owent/xresconv-cli/releases """ from __future__ import unicode_literals @@ -36,12 +36,12 @@ "[DEPRECATED] xresconv-cli 已用 Rust 重写,Python 版本不再维护,本入口仅做兼容转发。\n" "[DEPRECATED] xresconv-cli has been rewritten in Rust; this Python entry only forwards to the Rust binary.\n" "建议直接使用预编译可执行文件 / Please use the prebuilt binary directly:\n" - " https://github.com/xresloader/xresconv-cli/releases\n" + " https://github.com/owent/xresconv-cli/releases\n" ) BIN_ENV = "XRESCONV_CLI_BIN" -RELEASES_API = "https://api.github.com/repos/xresloader/xresconv-cli/releases/latest" -RELEASES_PAGE = "https://github.com/xresloader/xresconv-cli/releases" +RELEASES_API = "https://api.github.com/repos/owent/xresconv-cli/releases/latest" +RELEASES_PAGE = "https://github.com/owent/xresconv-cli/releases" BIN_NAME = "xresconv-cli.exe" if os.name == "nt" else "xresconv-cli" @@ -106,8 +106,12 @@ def http_get(url, max_size=128 * 1024 * 1024): def release_url(asset): url = asset.get("browser_download_url", "") parsed = urlparse(url) + allowed_paths = ( + "/owent/xresconv-cli/releases/download/", + "/xresloader/xresconv-cli/releases/download/", + ) if (parsed.scheme != "https" or parsed.netloc != "github.com" - or not parsed.path.startswith("/xresloader/xresconv-cli/releases/download/")): + or not parsed.path.startswith(allowed_paths)): raise RuntimeError("invalid GitHub release asset URL") return url From 5e8e68cfe2fc96b8584305aef2dc6fe29380ffe4 Mon Sep 17 00:00:00 2001 From: owent Date: Wed, 23 Sep 2026 22:31:07 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B8=85=E7=90=86=E5=B7=B2=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E8=AE=A1=E5=88=92=E5=B9=B6=E8=AE=B0=E5=BD=95=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E9=AA=8C=E6=94=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plan.md | 78 +-------------------------------------- doc/ai/source-index.md | 2 +- doc/ai/validation.md | 31 ++++++++++++++++ doc/migration-contract.md | 10 +++-- 4 files changed, 40 insertions(+), 81 deletions(-) diff --git a/Plan.md b/Plan.md index 77c078e..3f3cc17 100644 --- a/Plan.md +++ b/Plan.md @@ -1,77 +1,3 @@ -# Rust 重构计划 +# Plan -## 当前状态 - -2026-09-23:完成当前暂存 Rust 迁移的源码审查与修复,保留原暂存区。 -行为基线为 `656c7e3d44efee978334e0364eb7de0fe3c8778c`;合同与测试映射见 [迁移合同](doc/migration-contract.md)。 -单 Cargo package、edition 2024、MSRV 1.88;依赖按官方注册表核验,Cargo.toml 使用显式 `^` 兼容范围,Cargo.lock 锁定构建版本。 -CLI 不绑定 JDK;历史本机真实验收使用 OpenJDK 25.0.4.1 + xresloader 2.23.7,见验证记录。 - -本地常规测试、真实后端对照和最低工具链检查已执行;最终数量与覆盖率见 [验证记录](doc/ai/validation.md)。 -发布配置包含 8 个核心包、3 个扩展包,tag 通过门禁后自动公开 Release。 -[首次 CI run](https://github.com/owent/xresconv-cli/actions/runs/35853777700) 暴露了跨平台打包清理、LFS 样本和 musl 冒烟问题; -已按实际日志修复。[第二次 CI run](https://github.com/owent/xresconv-cli/actions/runs/35861863204) -确认全部 8 个核心包、常规测试和覆盖率通过。 -当前 CI 的 LoongArch 交叉构建调用了 x64 链接器;缺少已验证的构建环境,该非必需目标已从矩阵移除。 -[第三次 CI run](https://github.com/owent/xresconv-cli/actions/runs/35866699467) 的唯一失败 job 仍来自外部后端样本; -按当前范围删除跨仓库集成门禁及 Windows/Linux 32 位目标,后续 CI 只验证本仓库可控资源。 -首次 tag 发布下载与 Python 2.7 运行尚未验收。 -本轮未提交、推送、打 tag 或发布。 - -## 阶段与验收 - -### P0:工程指引 - -- [x] 建立共享 `AGENTS.md`、两个按需 Skills、来源索引和文档验证约定。 -- [x] 7 份 Markdown lint、两个 Skill frontmatter 与本地引用检查通过。 -- [x] Kilo CLI 在仓库根和 `doc/ai` 的原生发现诊断均列出两个项目 Skill(`--pure` 会话)。 -- [x] 补齐工程原则、PowerShell/现代工具、客户端和维护流程,以 [逐项覆盖表](doc/ai/requirements-coverage.md) 保存范围。 -- [x] 补全后的 15 份文档、三个 Skill 格式/引用及 PowerShell 示例通过;Kilo 根/子目录均发现三个 Skill。 -- [ ] 完成规则注入、新增 Skill 的 Codex 独立启动发现、目标客户端真实 Skill 路由及效果对照。 - 静态检查与运行验证分别记录在 [验证记录](doc/ai/validation.md)。 - -### P1:兼容合同 - -- [x] 对照历史 Python 全部 CLI/XML/规划/调度实现,检查当前所有 Rust 模块、调用方与测试。 -- [x] 固定 xresconv-conf fixture 来源与 xresloader 2.23.7 sample 提交,见 [来源索引](doc/ai/source-index.md)。 -- [x] 将兼容行为、历史缺陷修正、stdin 表达限制、失败状态与测试对应记录到迁移合同。 -- [x] 先执行 4 个失败回归,再修复空属性、重复 scheme 空白、无效并发与重复 JVM 参数。 -- [x] 临时运行历史 Python 与 Rust,6 组预览命令流逐项一致,保留原配置合并与筛选语义。 - -### P2:Rust 实现 - -- [x] CLI 重复参数/长选项前缀、Java 路径解析和无副作用预览。 -- [x] XML 编码、内部实体、命名空间、循环/深度保护以及失败加载回滚。 -- [x] 按固定后端实际分词器处理参数;不以 shell 转义替代 stdin 协议。 -- [x] 取消时回收自有进程树;stdout/stderr 并行排空;写管道失败与剩余任务返回失败。 -- [x] 后端测试替身独立于正式二进制;过滤/覆盖率测试从当前源码构建替身。 -- [x] 核验最新稳定依赖;MSRV 1.88 已实际执行本机 `--all-targets` 检查,常规 Cargo 门禁见验证记录。 -- [x] 最新稳定工具链完成其他 7 个核心 target 的交叉 `cargo check`;本机 Windows x64 完成实际构建与运行。 - -### P3:测试与真实后端 - -- [x] 覆盖 CLI、include/合并/默认 scheme、输出矩阵、引用/Unicode、路径与颜色环境。 -- [x] 覆盖并发 1/2/4/100 的无重复遗漏、启动失败、提前退出、大量输出、取消及后代回收。 -- [x] Python 三脚本/目录入口均用环境变量转交本地二进制;下载/校验/缓存/异常离线测试。 -- [x] 历史固定 JAR + sample 的对照证据保留在验证记录;现行自动测试不依赖外部仓库资源。 -- [x] 建立 LLVM 覆盖率与 CI 90% 行覆盖门禁;平台分支和无法稳定注入的系统失败路径单列限制。 -- [x] 第二次 CI 已实际运行 Linux/macOS/ARM 常规测试及 8 个核心目标的构建和冒烟。 - -### P4:发布与替换 - -- [x] 常规 push/PR 保存预编译 artifacts;tag 复用完整门禁。 -- [x] 版本与 tag 一致性、8 个核心制品完整性、SHA256 与 ZIP/TAR 打包消费测试。 -- [x] 发布任务独占写权限,Actions 使用官方当前大版本标签;上传成功后公开,预发布不替换 latest。 -- [x] CI 只使用仓内 fixture/fake-java;不查询 xresloader Release/JAR/sample。Python 使用最新稳定 3.x。 -- [x] 发布目标移除 Windows/Linux i686 与 Linux ARM32;Python 自动下载映射同步,不承诺未构建的架构。 -- [x] 修复跨平台 PowerShell 隐藏暂存目录清理;Unix 冒烟改用 Bash。LoongArch 因当前交叉链接配置不可用而移除。 -- [x] 环境路径缺失继续缓存/下载;原子安装、有限网络等待、失败不损坏旧缓存。 -- [x] README、历史记录、工程指引、Rust Skill、来源与验证记录同步。 -- [ ] 解耦后的 GitHub CI 复跑、首次 tag 流程与全部目标解压/运行验收,扩展目标为尽力构建。 -- [ ] Python 2.7 运行验收:兼容写法保留,当前机器只有 Python 3。 - -## 交接 - -继续从上述外部验收项开始;不要把历史“尚未实现/下一步 P1”描述重新当作现状。 -下载或发布失败先检查当前 Release 状态,已有公开版本不覆盖;回滚说明见迁移合同。 -以前的 44/46 测试计数及“草稿即发布”状态已由本轮实测纠正,历史审计保留于验证记录与 Git。 +当前无未完成任务。Rust 迁移、兼容测试、跨平台构建和公开发布的证据见 [迁移合同](doc/migration-contract.md) 与 [验证记录](doc/ai/validation.md)。 diff --git a/doc/ai/source-index.md b/doc/ai/source-index.md index 1b9185a..4a9718a 100644 --- a/doc/ai/source-index.md +++ b/doc/ai/source-index.md @@ -44,7 +44,7 @@ git grep -n -e load_xml_file -e load_global_options -e load_list_item_nodes -e w | R3 | clap 4.6.7、roxmltree 0.21.1、regex 1.13.1、windows-sys 0.61.2、tempfile 3.27.0;新增 ctrlc 3.5.2、encoding_rs 0.8.41、libc 0.2.189 | [crates.io API][crates-io] / 2026-09-23 max_stable_version | 最新稳定版已查询;Cargo 更新锁文件,encoding_rs 的 MSRV 1.88 已实测 | Cargo.toml/Cargo.lock | | X2 | xresloader v2.23.7 release 资产含 `xresloader-2.23.7.jar`,SHA256 见验证记录;样本 Excel 由 Git LFS 管理 | GitHub API / v2.23.7,仓库 `.gitattributes` | 历史本机真实后端验收;第三次 CI 证明外部样本测试不稳定,现已退出门禁 | 历史证据;不作为 CI 资源 | | CI1 | checkout v7、upload-artifact v7、download-artifact v8、setup-python v7、stale v11 | [checkout][checkout-action]、[Python setup][setup-python] | 用户要求随大版本接收更新;现行 workflow 已移除 setup-java 和外部后端 job | .github/workflows | -| CI2 | `ubuntu-latest`/`macos-latest`/`windows-latest` 为滚动标签;ARM 原生 runner 仍需架构专用标签 | [官方 runner 表][runners]、[镜像标签][runner-images] / rolling | GitHub 文档核验;第二次 CI 的 macOS Intel 交叉包与 Rosetta 冒烟通过 | build.yml 矩阵 | +| CI2 | `ubuntu-latest`/`macos-latest`/`windows-latest` 为滚动标签;ARM 原生 runner 仍需架构专用标签 | [官方 runner 表][runners]、[镜像标签][runner-images] / rolling | GitHub 文档核验;2026-09-23 常规 CI run 35871630941 的 18 个 job 与 v2.0.1 发布 run 35874108129 的 20 个 job 全通过,8 个核心及 3 个扩展包均构建成功 | build.yml 矩阵 | | X3 | 本地 2.23.7 后端 stdin 不支持反斜杠转义 | [Main.java][backend-parser] / `7263367d99f04af8fca8b1fd80cac29b05f2f6b0` | 历史本地源码核对与 JAR 产物对照;现行 CI 只验证本仓库的 stdin 编码合同 | 参数编码与外部运行边界 | | CI4 | setup-python 的 `3.x` 取最新稳定 Python 3;Python 无单独 LTS 系列 | [Python setup][setup-python]、[Python 版本状态][python-versions] | 官方文档核验;外部 Java LTS 动态查询已从 CI 移除 | build.yml 环境选择 | | CI5 | GitHub Release 资产 digest 与 Git LFS 按路径物化曾用于跨仓库集成 job | [Release API][release-api]、[Git LFS pull][lfs-pull]、[Git LFS 配置][lfs-config] | 历史故障见验证记录;当前 CI 不下载 xresloader 资产 | 历史 CI 故障依据 | diff --git a/doc/ai/validation.md b/doc/ai/validation.md index 2d653ad..ca33a1f 100644 --- a/doc/ai/validation.md +++ b/doc/ai/validation.md @@ -264,3 +264,34 @@ Windows `cargo fmt --all --check`、`cargo check --workspace --locked`、 Windows cargo-llvm-cov 0.9.1 的 90% 行门禁通过,行覆盖 1586/1692 = 93.74%。 actionlint 1.7.12 验证现行四个 job 和 11 个制品目标,仍仅过滤其未知但 GitHub 已提供的 `ubuntu-26.04-arm` 标签。 本轮未提交、推送或触发解耦后的远程 CI;首次 tag 发布仍未验收。 + +## 2026-09-23 解耦 CI、首次发布与规范地址修复 + +- [常规 CI run 35871630941](https://github.com/owent/xresconv-cli/actions/runs/35871630941) 在 + `33f6e54fa72eb3bc0eaf68754dfacd808d0da0d6` 完成,18 个 job 全部成功:五平台原生测试、 + lint、90% 行覆盖率门禁、8 个核心包和 3 个可选扩展包。当前门禁未查询或执行外部 xresloader 资源。 +- 从该 run 下载全部 11 个包及 SHA256 到忽略的 `target/plan-release-check/`, + `scripts/release.ps1 -Mode Verify` 确认 11 个校验和与 8 个核心包齐全; + 全部 11 个压缩包解压后均有普通二进制、README 与 LICENSE。 + 解压后的 Windows x64 包执行 `--version`/`--help`,WSL Debian 执行 Linux x64 GNU/musl 包的 + `--version`/`--help`,均成功;其余平台运行证据来自对应 CI runner 的打包前冒烟, + 不声称本机执行了 macOS、ARM、Android、RISC-V 或 FreeBSD 二进制。 +- [首次 tag run 35872817845](https://github.com/owent/xresconv-cli/actions/runs/35872817845) + 在同一提交成功,`v2.0.0` 已公开,11 个平台包及各自 SHA256 共 22 个资产。 + GitHub 公开资产 URL 使用仓库规范路径 `owent/xresconv-cli`;旧 Python 入口以独立空缓存和缺失的 + `XRESCONV_CLI_BIN` 实际运行时因 `invalid GitHub release asset URL` 退出 1。 +- 修复下载器使用规范 API/页面地址,允许规范及旧组织两种资产路径,仍拒绝外部主机和伪装 owner。 + 13 个 Python 离线 unittest 通过;同一独立缓存场景下,修复后的旧入口下载 `v2.0.0`、 + 校验 SHA256 并运行,`--version` 输出 `2.0.0`、退出 0。 + `v2.0.1` 本地 `cargo fmt/check/test/clippy --locked` 门禁通过;83 个 Rust 测试通过。 +- 按本轮用户指示,规则注入、Skill 发现与 Python 2.7 运行不再作为验收门禁。 + 既往未执行记录保留为当时的事实,不再列入 Plan 待办。 +- [v2.0.1 tag run 35874108129](https://github.com/owent/xresconv-cli/actions/runs/35874108129) + 在提交 `eae4ffc97d9d576128037c2c7f1c935c5d586e40` 完成,20 个 job 全部成功; + [公开 Release](https://github.com/owent/xresconv-cli/releases/tag/v2.0.1) 非草稿、非预发布, + latest API 返回 `v2.0.1` 和 22 个资产。 + 重新下载 11 包及 SHA256,`scripts/release.ps1 -Mode Verify` 通过,全部压缩包解压成功; + 解压后的 Windows x64 和 WSL Linux x64 GNU/musl 包执行 `--version`/`--help` 均通过。 + 其他目标由各自 CI runner 在打包前运行冒烟;Android、RISC-V、FreeBSD 仅尽力构建与解压。 +- 修复后的旧 Python 入口在独立空缓存、`XRESCONV_CLI_BIN` 指向不存在路径时, + 从公开 latest Release 下载并校验 Windows x64 包,转交运行得到 `2.0.1`、退出 0。 diff --git a/doc/migration-contract.md b/doc/migration-contract.md index ff5ec01..851a717 100644 --- a/doc/migration-contract.md +++ b/doc/migration-contract.md @@ -58,7 +58,9 @@ XML 的 `option` 仍是已有后端命令片段,其内部引号由配置作者 不修改 XML/输入数据,不自动删除旧版。已缓存二进制不会在每次启动时联网升级。 - Python 下载只读取官方仓库 API/制品,限时限量;从压缩包只复制唯一的普通二进制文件,拒绝链接、空文件和路径穿越。 -本轮只完成本地修复与发布流程配置,没有提交、推送 tag、上传或公开 Release。 -第三次 CI 已通过 Linux/macOS/ARM 常规测试、覆盖率及全部 8 个核心包构建/冒烟; -外部后端样本测试已退出本仓库门禁。解耦后的 CI、首次 tag 发布与 Python 2.7 运行仍未验收。 -Windows 本地覆盖率只覆盖本平台编译分支,不能作为跨平台或 100% 分支覆盖证明。 +解耦后的 [常规 CI](https://github.com/owent/xresconv-cli/actions/runs/35871630941) 18 个 job 全部通过; +[首次 tag 流程](https://github.com/owent/xresconv-cli/actions/runs/35872817845) 已公开 `v2.0.0` 与 11 个平台包。 +公开 Release 的规范资产 URL 使用 `owent/xresconv-cli`,暴露旧 Python 入口只接受旧组织路径的问题; +`v2.0.1` 已修复并公开发布;tag 流程 20 个 job 全部通过,旧 Python 入口已从空缓存下载并运行最新版本。 +实际结果见 [验证记录](ai/validation.md)。 +规则注入、Skill 发现和 Python 2.7 运行不属于当前验收范围。Windows 本地覆盖率只覆盖本平台编译分支。