Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "xresconv-cli"
version = "2.0.0"
version = "2.0.1"
edition = "2024"
rust-version = "1.88"
license = "MIT"
Expand Down
7 changes: 6 additions & 1 deletion HISTORY.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
更新记录
==========

2.0.1
------

1. 修复旧 Python 入口从 GitHub Releases 下载时拒绝仓库规范地址 `owent/xresconv-cli` 的问题;保留旧组织地址兼容,并补充两种地址的离线回归测试与公开 Release 下载验收。

2.0.0
------

Expand All @@ -10,7 +15,7 @@
4. 修复:支持 `<output_type output_dir="...">` 属性(原实现遗漏解析)
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 调用逐字节对照
Expand Down
78 changes: 2 additions & 76 deletions Plan.md
Original file line number Diff line number Diff line change
@@ -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)。
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ xresconv-cli
安装
------

从 [GitHub Releases](https://github.com/xresloader/xresconv-cli/releases) 下载对应平台的预编译包:
从 [GitHub Releases](https://github.com/owent/xresconv-cli/releases) 下载对应平台的预编译包:

| 平台 | 制品 |
| --- | --- |
Expand Down Expand Up @@ -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 版的行为差异
----------------------
Expand Down Expand Up @@ -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。

示例截图
------
Expand Down
6 changes: 3 additions & 3 deletions doc/ai/requirements-coverage.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 个客户端;只为实际需要创建配置,不能视为运行验收 |
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion doc/ai/source-index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 故障依据 |
Expand Down
31 changes: 31 additions & 0 deletions doc/ai/validation.md
Original file line number Diff line number Diff line change
Expand Up @@ -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。
10 changes: 6 additions & 4 deletions doc/migration-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 本地覆盖率只覆盖本平台编译分支。
Loading
Loading