qtcloud-devops-cli 0.3.0-rc.8

量潮DevOps云命令行工具
Documentation
# ROADMAP

## v0.3.0 — 纯 Rust CLI,移除 Python 入口 `[BREAKING]`

用 Rust 重写 `release` 逻辑,移除 Python CLI 入口,使 `qtcloud-devops` 成为纯 Rust CLI 工具。PyPI 包保留为 native library 分发渠道(通过 `_native.so` 暴露 scan_repo / sync / retire)。

### 动机

- 当前 `release` 命令是纯 Python,与 Rust 实现的子模块管理引擎架构不一致
- Python 入口(`cli.py`)是多余的间接层——用户始终通过 Rust 二进制使用工具
- 维护两套 CLI 框架(Typer + clap)和两种构建系统增加认知负担

### BREAKING:CLI 接口变更

```
之前                             之后
─────────────────────           ─────────────────────
qtcloud-devops release          qtcloud-devops stage -v v0.1.0     ← 标记版本
  --version v0.1.0              qtcloud-devops publish -v v0.1.0   ← 发布上线
  [--tag-only]                  qtcloud-devops cancel -v v0.1.0    ← 取消
  [--release-only]              qtcloud-devops retire -v v0.1.0    ← 退役
  [--dry-run]
  [-y]
```

- 删除 `release` 命令,只提供 `stage`/`publish`/`cancel`/`retire` 四个子命令
- `release --version v0.1.0 -y``qtcloud-devops stage -v v0.1.0 && qtcloud-devops publish -v v0.1.0 -y`
- `release --tag-only` 无直接等价(`stage` 不打标签,`publish` 始终打标签),用户需手动 `git tag`

### 待办

1. **Rust 重写 release 逻辑**
   - 实现状态机模型:`ReleaseRecord``ReleaseEntry``ReleaseStatus``Storage` trait、`FileStorage`(基于 `release-journal.jsonl` 事件溯源)
   - 实现四个命令:`stage`(标记版本)、`publish`(发布上线)、`cancel`(取消)、`retire`(退役)
   - `release` 命令**删除**(v0.2.x 用户改为 `stage && publish` 组合)
   - 整合断言检查(git 工作区干净、合法分支等)到 Rust 层
   - 注册子命令到 `src/main.rs`

2. **移除 Python CLI 入口**
   - 删除 `src/qtcloud_devops_cli/release.py`
   - 更新 `pyproject.toml`:移除 `[project.scripts]` 入口点

3. **清理 Python 封装层**
   - 删除 `src/qtcloud_devops_cli/code.py``config.py``cli.py`
   - `__init__.py` 只保留一行注释
   - `_native.so` 作为 maturin 构建副产品保留,**不主动维护也不删除**

4. **保留 PyPI 分发**
   - `_native` 库通过 maturin 构建,保留 `python` feature
   - GitHub Releases 分发 Rust 二进制 + `cargo install` 作为额外安装方式
   - 双渠道:`pip install` 给 Python 开发者,`cargo install` / GitHub Releases 给 Rust 开发者

5. **测试迁移**
   - `tests/python/` 下所有测试**全部删除**(逻辑由 Rust 单元测试覆盖)
   - `integrated_tests/` 中依赖 Python CLI 的用例**全部删除**
   - Rust 单元测试覆盖全部 release 逻辑路径(目标 ≥ 40 个新测试)
   - 验收标准:`cargo test` 全部通过,无 Python 测试残留

6. **文档更新**
   - `docs/release.md` 更新为 Rust CLI 用法,标注 BREAKING 变更
   - `docs/index.md` 更新构建/安装说明

## v0.3.1 — release status

新增 `release status` 命令,查看当前项目的发布状态。每次操作开始和结束时执行一次,形成操作前后的状态对比。

**功能**:
- 当前版本号
- 最新发布记录
- 未发布的变更摘要
- 预发布版本列表

## v0.4.0 — plan / build / test

以 `release` 命令组为蓝本,新增三个命令组,覆盖完整开发工作流:

| 命令 | 职责 |
|------|------|
| `plan` | 围绕特殊文件的规划命令。扫描 CHANGELOG.md、pyproject.toml、版本标记等,自动生成发布计划或变更摘要 |
| `build` | 围绕 CI 的构建命令。触发或查询 CI 构建状态,与 GitHub Actions 等 CI 系统交互 |
| `test` | 围绕测试的测试命令。运行测试套件并报告结果,支持过滤和摘要输出 |

**风格**:与现有 `release` 命令组一致——Rust 实现、状态驱动、原子操作。

## 已完成

### Core — Rust 子模块管理引擎

Rust 核心已从 `examples/default` 迁入并完成适配。代码结构从 `packages/code/` 重构为 `src/` + `src/qtcloud_devops_cli/`。

**交付物**:
- `src/python.rs``scan_repo` / `sync_single` / `sync_all` / `retire_submodule` 全部 4 个 pyfunction 绑定
- `src/qtcloud_devops_cli/code.py`:Python 封装层,对接 Rust native 调用
- `src/qtcloud_devops_cli/cli.py`:注册 `code` 子命令组(status / sync / retire)
- `integrated_tests/`:17 个集成测试覆盖 CLI 结构、参数校验、错误处理
- `tests/`:51 个单元测试覆盖 release 逻辑和 config
- 编译:`cargo build` + `cargo test` (22 tests) 通过
- 构建:maturin 单构建系统(`source-dir = "."`,module-name = `qtcloud_devops_cli`
### v0.2.3 — 发布到 PyPI

- 项目已发布到 PyPI(`qtcloud-devops-cli`- release 命令为纯 Python 实现
- 配置使用 pydantic-settings

## 待规划

### P0 — 发布目标支持

- **pub.dev 发布集成**:release 命令支持发布到 pub.dev
- **发布目标抽象**:从 PyPI/pub.dev 的具体实现中提取"发布目标"模型

### P1 — 体验修复

- **Orphaned 状态拆分**(推迟自"开发中"):将 `Orphaned` 拆分为更精确的子状态(rebase force push、squash merge、仓库替换等),更新 `RepoState::scan()` 判定逻辑和 `describe_issue()` 建议

### P2 — 配置扩展

- 放宽分支限制(可配置允许的分支列表)
- 支持非 semver 版本策略
- CI Action 版本升级(Node.js 20 弃用)
- GitLink 镜像容灾同步

## 基本假设

| # | 假设 | 说明 |
|---|------|------|
| 1 | GitHub 为中心 | 主开发在 GitHub,使用 `gh` CLI。GitLink 仅作镜像容灾 |
| 2 | 有 CHANGELOG.md | 格式 `## [X.Y.Z]`,默认查找当前目录 |
| 3 | semver 版本号 | 版本号 `vX.Y.Z``scope/vX.Y.Z` |
| 4 | 工作区干净 | 发布前无未提交变更 |
| 5 | 发布分支受限 |`main` / `master` / `release/*` 可发布 |
| 6 | git remote 可达 |`git remote get-url origin` 自动检测仓库 |
| 7 | 用户可交互 | 发布确认需 TTY 交互,CI 需 `-y` 跳过 |