diff --git a/CLAUDE.md b/CLAUDE.md index 2651095..b1c02bb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -78,6 +78,27 @@ make ci # 只读验证(check + test) ### 4.4 Git 工作流 - 一切开发在 feature 分支,严禁直改 main;频繁语义化提交;提交**必须**调用 `commit` skill;大改动前先提交回滚点。 +### 4.4.1 发布流程(每步都是历史欠账换来的,不得跳步) + +> [!CRITICAL] +> **发布 = 合并 + push + tag + 构建 + 上传 registry。只 bump 版本号不叫发布。** +> 教训: 1.0.6 与 1.1.0 都完成了版本号 bump 与 CHANGELOG,却从未上传,registry 长期停在 1.0.5——下游 `pip install` 拿不到任何修复,且无人发现。 + +按顺序执行,**构建之前**必须先改完所有文档: + +| # | 动作 | 要点 | +|---|---|---| +| 1 | **更新 README** | 打包会把当时的 README 固化进 sdist,**发布后再改就来不及了**(包里那份永远是旧的)。逐项核对: 安装命令的版本约束(`==1.1.*` 这类**极易漏改**,漏了下游就被锁在旧版)、能力表是否覆盖新行为、数字型断言是否仍成立(如遥测字段数,须用 `inspect.signature` 实测而非凭记忆) | +| 2 | CHANGELOG 定版 | "未发布" → `## X.Y.Z(日期)` | +| 3 | 版本号 | `pyproject.toml` + `src/polygateway/__init__.py` 两处必须一致 | +| 4 | 合并 main + push | `--no-ff`;合并后在 main 上重跑 `make lint` 与全套件 | +| 5 | **打 tag 并 push** | `git tag -a vX.Y.Z -m "..."` + `git push origin vX.Y.Z`。历史上多个版本漏打 | +| 6 | 构建 | `rm -rf dist && python -m build && python -m twine check dist/*` | +| 7 | **上传 registry** | 凭据在 `~/.config/tea/config.yml`(tea CLI 的 Gitea token,**不在** `~/.pypirc`);token 走 `TWINE_PASSWORD` 环境变量,不进命令行
`TWINE_USERNAME=iomgaa TWINE_PASSWORD=$TOKEN python -m twine upload --repository-url https://gitea.iomgaa.online/api/packages/iomgaa/pypi dist/*` | +| 8 | **验证已发布** | `pip download --no-deps --index-url .../pypi/simple/ "polygateway==X.Y.Z"`,并解包确认新代码在内。**不验证不算发布完成** | + +Gitea 包 registry 是 **owner 级**(`/iomgaa/-/packages/`)不是仓库级;PyPI 元数据不含仓库字段,故不会自动挂到 `PolyGateway/packages`,需在包页面手动 Link to a repository。 + ### 4.5 配置管理 - 工程配置走 `pydantic-settings` + `.env`(模板 `.env.example`,敏感项不提交);严禁硬编码默认值;缺失关键配置直接报错。 - 多源命名约定 `{SCOPE}__{PROVIDER}__{N}__{FIELD}`;韧性参数键名沿用三项目习惯(`LLM_TIMEOUT` 等),降低迁移成本。