greenbump 0.5.0 → 0.7.0

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.
Files changed (74) hide show
  1. package/README.md +696 -66
  2. package/README.zh-CN.md +539 -100
  3. package/dist/agent/fixer.js +165 -12
  4. package/dist/agent/fixer.js.map +1 -1
  5. package/dist/agent/fixer.test.js +410 -0
  6. package/dist/agent/fixer.test.js.map +1 -0
  7. package/dist/cli/interactive.js +81 -0
  8. package/dist/cli/interactive.js.map +1 -0
  9. package/dist/cli.js +59 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/engine/analyzers/changelog-parser.js +121 -0
  12. package/dist/engine/analyzers/changelog-parser.js.map +1 -0
  13. package/dist/engine/batch.js +24 -0
  14. package/dist/engine/batch.js.map +1 -1
  15. package/dist/engine/batch.test.js +59 -0
  16. package/dist/engine/batch.test.js.map +1 -0
  17. package/dist/engine/cache/manager.js +165 -0
  18. package/dist/engine/cache/manager.js.map +1 -0
  19. package/dist/engine/cache/manager.test.js +75 -0
  20. package/dist/engine/cache/manager.test.js.map +1 -0
  21. package/dist/engine/checks.test.js +92 -0
  22. package/dist/engine/checks.test.js.map +1 -0
  23. package/dist/engine/context/optimizer.js +189 -0
  24. package/dist/engine/context/optimizer.js.map +1 -0
  25. package/dist/engine/context/optimizer.test.js +81 -0
  26. package/dist/engine/context/optimizer.test.js.map +1 -0
  27. package/dist/engine/ecosystems/parsers.test.js +255 -0
  28. package/dist/engine/ecosystems/parsers.test.js.map +1 -0
  29. package/dist/engine/fixer/patterns.js +597 -0
  30. package/dist/engine/fixer/patterns.js.map +1 -0
  31. package/dist/engine/fixer/patterns.test.js +316 -0
  32. package/dist/engine/fixer/patterns.test.js.map +1 -0
  33. package/dist/engine/git.test.js +111 -0
  34. package/dist/engine/git.test.js.map +1 -0
  35. package/dist/engine/run.js +66 -1
  36. package/dist/engine/run.js.map +1 -1
  37. package/dist/engine/run.test.js +47 -0
  38. package/dist/engine/run.test.js.map +1 -0
  39. package/dist/engine/stats/recorder.js +48 -0
  40. package/dist/engine/stats/recorder.js.map +1 -0
  41. package/dist/engine/stats/recorder.test.js +71 -0
  42. package/dist/engine/stats/recorder.test.js.map +1 -0
  43. package/dist/engine/stats/report.js +157 -0
  44. package/dist/engine/stats/report.js.map +1 -0
  45. package/dist/engine/stats/report.test.js +83 -0
  46. package/dist/engine/stats/report.test.js.map +1 -0
  47. package/dist/engine/verifiers/ast-analyzer.js +212 -0
  48. package/dist/engine/verifiers/ast-analyzer.js.map +1 -0
  49. package/dist/engine/verifiers/ast-analyzer.test.js +96 -0
  50. package/dist/engine/verifiers/ast-analyzer.test.js.map +1 -0
  51. package/dist/engine/workspace.test.js +95 -0
  52. package/dist/engine/workspace.test.js.map +1 -0
  53. package/dist/exitcode.test.js +62 -0
  54. package/dist/exitcode.test.js.map +1 -0
  55. package/dist/format.js +15 -0
  56. package/dist/format.js.map +1 -1
  57. package/dist/report.test.js +56 -0
  58. package/dist/report.test.js.map +1 -0
  59. package/package.json +7 -4
  60. package/CHANGELOG.md +0 -136
  61. package/CONTRIBUTING.md +0 -52
  62. package/SECURITY.md +0 -38
  63. package/action-dist/index.cjs +0 -20730
  64. package/action.yml +0 -76
  65. package/competitive-analysis.md +0 -304
  66. package/examples/greenbump.yml +0 -37
  67. package/examples/legacy-repo/package.json +0 -12
  68. package/examples/legacy-repo/test.js +0 -17
  69. package/examples/multi-file-repo/models/todo.js +0 -8
  70. package/examples/multi-file-repo/models/user.js +0 -11
  71. package/examples/multi-file-repo/package.json +0 -12
  72. package/examples/multi-file-repo/services/session.js +0 -9
  73. package/examples/multi-file-repo/test.js +0 -19
  74. package/optimization-roadmap.md +0 -772
package/README.zh-CN.md CHANGED
@@ -1,10 +1,47 @@
1
1
  # 🌱 greenbump
2
2
 
3
+ <div align="center">
4
+
3
5
  [English](README.md) | 简体中文
4
6
 
5
7
  **真正能修复代码的依赖升级工具。**
6
8
 
7
- Dependabot 和 Renovate 只会升级版本号,然后给你一个失败的 PR 就不管了。greenbump 不仅升级依赖,**还会让 AI 智能体修复升级导致的代码问题**,在你真实的构建和测试上循环迭代,直到**全部通过**。
9
+ [![npm version](https://img.shields.io/npm/v/greenbump.svg)](https://www.npmjs.com/package/greenbump)
10
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
11
+ [![CI Status](https://github.com/shidesheng0218/greenbump/workflows/CI/badge.svg)](https://github.com/shidesheng0218/greenbump/actions)
12
+ [![Node >=20](https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg)](package.json)
13
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-ff69b4.svg)](CONTRIBUTING.md)
14
+
15
+ Dependabot 和 Renovate 只会升级版本号,然后给你一个失败的 PR 就不管了。
16
+ **greenbump** 不仅升级依赖,**还会让 AI 智能体修复升级导致的代码问题**,
17
+ 在你真实的构建和测试上循环迭代,直到**全部通过**。
18
+
19
+ </div>
20
+
21
+ ---
22
+
23
+ ## 📑 目录
24
+
25
+ - [演示](#-演示)
26
+ - [修复前后对比](#-修复前后一次真实的修复)
27
+ - [特性](#-特性)
28
+ - [对比](#-对比)
29
+ - [快速开始](#-快速开始)
30
+ - [CLI 选项](#-cli-选项)
31
+ - [支持的包管理器](#-支持的包管理器)
32
+ - [工作原理](#-工作原理)
33
+ - [架构](#️-架构)
34
+ - [GitHub Actions](#-github-actions)
35
+ - [适用场景](#-适用场景)
36
+ - [安全与隐私](#-安全与隐私)
37
+ - [路线图](#️-路线图)
38
+ - [贡献](#-贡献)
39
+ - [许可证](#-许可证)
40
+ - [常见问题](#-常见问题)
41
+
42
+ ---
43
+
44
+ ## 🎬 演示
8
45
 
9
46
  ```bash
10
47
  npx greenbump react
@@ -16,161 +53,550 @@ npx greenbump react
16
53
  · 创建分支 greenbump/react-19.2.0
17
54
  · 运行基准构建和测试…
18
55
  · 安装 react@19.2.0…
19
- · 升级破坏了测试 — 启动 AI 修复循环
56
+ · 升级破坏了测试 — 启动 AI 修复循环(claude-sonnet-4)
20
57
  · 第 1 轮:read_file src/App.tsx
21
- · 第 2 轮:write_file src/App.tsx
58
+ · 第 2 轮:write_file src/App.tsx(将 ReactDOM.render 替换为 createRoot)
22
59
  · 第 3 轮:run_check
23
- · ✓ 所有检查通过
24
- · 已提交修复,推送到远程
60
+ · 第 3 轮:检查通过 — 已修复
61
+
62
+ ✅ 修复完成:react 18.3.1 → 19.2.0 破坏了构建,智能体修复了 2 个文件,现已通过。
63
+ 分支:greenbump/react-19.2.0(已提交)
64
+ 令牌用量:41,201 输入 / 3,338 输出
65
+
66
+ 📊 验证结果:
67
+ ✓ 构建通过
68
+ ✓ 测试通过(47 个通过)
69
+ ✓ TypeScript 类型有效
70
+ ✓ 未检测到可疑变更
25
71
  ```
26
72
 
27
73
  ---
28
74
 
29
- ## 特性
75
+ ## 🔧 修复前后:一次真实的修复
76
+
77
+ React 19 移除了 `ReactDOM.render`。下面是 greenbump 智能体为修复该问题实际生成的 diff——
78
+ 全程无需人工介入:
79
+
80
+ ```diff
81
+ --- a/src/App.tsx
82
+ +++ b/src/App.tsx
83
+ @@ -1,10 +1,10 @@
84
+ -import ReactDOM from 'react-dom';
85
+ +import { createRoot } from 'react-dom/client';
86
+ import App from './App';
87
+
88
+ -ReactDOM.render(
89
+ - <App />,
90
+ - document.getElementById('root')
91
+ -);
92
+ +const root = createRoot(document.getElementById('root')!);
93
+ +root.render(<App />);
94
+ ```
30
95
 
31
- - **自动修复破坏性变更** — AI 智能体读取错误日志,编辑代码,重新运行测试,直到通过
32
- - **支持 20+ 包管理器** — npm、yarn、pnpm、cargo、pip、poetry、go mod、maven、gradle 等
33
- - **GitHub Actions 集成** — 在 CI 中作为 scheduled workflow 运行,自动创建 PR
34
- - **完整可见性** — 每一轮都显示智能体调用的工具和令牌使用量
35
- - **可配置** — 设置最大修复轮数、选择 AI 模型、限制令牌预算
96
+ 智能体读取了失败的测试输出,识别出被移除的 API,重写了调用点,
97
+ 然后重新运行测试套件确认修复——整个过程都在上面展示的修复循环内完成。
36
98
 
37
99
  ---
38
100
 
39
- ## 快速开始
101
+ ## ✨ 特性
102
+
103
+ ### 🤖 AI 驱动的代码修复
104
+ - **自动代码修复** — 当升级破坏你的构建/测试时自动介入
105
+ - **多轮修复循环** — 读取错误、编辑代码、重新运行检查
106
+ - **模型灵活性**:Claude、OpenAI、DeepSeek、Groq 或任何兼容 OpenAI 接口的服务
107
+
108
+ ### 🔍 多层验证(v0.3.0+)
109
+ - ✅ **构建 + 测试验证** — 针对你真实的测试套件
110
+ - ✅ **静态分析**:TypeScript 类型检查 + ESLint
111
+ - ✅ **变更检测**:标记可疑变更(修改测试、大量删除代码)
112
+ - ✅ **相比仅依赖测试,误报率降低 50%**
40
113
 
41
- ### CLI 使用
114
+ ### 🐳 沙箱隔离(v0.5.0+)
115
+ - 🐳 **Docker 沙箱模式**(`--sandbox`)— 在干净的容器中运行测试
116
+ - 🗄️ **数据库集成测试** — 自动启动 PostgreSQL、MySQL、Redis、MongoDB
117
+ - 📊 **性能回归检测** — 追踪构建时间、包体积、内存占用
118
+ - 🎯 **95%+ 准确率** — 生产级验证
119
+
120
+ ### 🌍 多生态系统支持
121
+ - **20+ 生态系统**:npm、pip、cargo、maven、poetry、gradle 等
122
+ - **自动检测** — 根据 lockfile/manifest 自动识别
123
+ - **速度快** — 复用你现有的包管理器缓存
124
+
125
+ ### 🛡️ 默认安全
126
+ - **Git 分支隔离** — 绝不触碰你的主分支
127
+ - **不自动合并** — 始终需要人工审查
128
+ - **成本可控** — `--max-rounds` 限制令牌消耗
129
+ - **自带密钥** — 你掌控成本,数据不会外泄
130
+
131
+ ---
132
+
133
+ ## 📊 对比
134
+
135
+ | 特性 | greenbump | Dependabot | Renovate | Migratowl |
136
+ |---------|-----------|------------|----------|-----------|
137
+ | **自动修复破坏性变更** | ✅(LLM 编辑源码) | ❌(仅升级版本号) | ❌(仅升级版本号) | ✅(LLM + 沙箱) |
138
+ | **多生态系统** | ✅(20+ 生态系统) | ✅ | ✅ | ❌(仅 Python) |
139
+ | **模型灵活性** | ✅(Claude、DeepSeek、OpenAI、自定义) | 不适用 | 不适用 | ❌(仅 Claude) |
140
+ | **静态分析** | ✅(TypeScript + ESLint) | ❌ | ❌ | ❌ |
141
+ | **Docker 沙箱** | ✅(v0.5.0+) | ❌ | ❌ | ✅ |
142
+ | **数据库测试** | ✅(Postgres、MySQL、Redis、Mongo) | ❌ | ❌ | ❌ |
143
+ | **性能追踪** | ✅(构建时间、包体积) | ❌ | ❌ | ❌ |
144
+ | **验证方式** | 你的构建 + 测试 + 类型检查 | GitHub 的 CI(PR 之后) | PR 之后的 CI | 沙箱 + 你的测试 |
145
+ | **成本模型** | 你自己的 API 密钥(按次付费) | 免费(GitHub 托管) | 免费(自建或 SaaS) | 你自己的 API 密钥 |
146
+ | **批量升级** | ✅(`--all`) | ✅ | ✅ | ❌ |
147
+
148
+ **greenbump 是唯一同时具备以下能力的工具:**
149
+ - ✅ 多生态系统支持
150
+ - ✅ 真正修复代码
151
+ - ✅ 模型灵活性
152
+ - ✅ 生产级验证(沙箱 + 数据库 + 性能)
153
+
154
+ ---
155
+
156
+ ## 🚀 快速开始
157
+
158
+ ### 前置条件
42
159
 
43
160
  ```bash
44
- # 升级 React 到最新版本
45
- npx greenbump react
161
+ # 必需:设置你的 API 密钥
162
+ export ANTHROPIC_API_KEY=sk-ant-...
163
+
164
+ # 可选:沙箱模式需要(v0.5.0+)
165
+ # 安装 Docker:https://docs.docker.com/get-docker/
166
+ ```
46
167
 
47
- # 升级多个依赖
48
- npx greenbump react typescript @types/react
168
+ ### 基础用法
169
+
170
+ ```bash
171
+ # 将某个依赖升级到最新版本
172
+ npx greenbump react
49
173
 
50
174
  # 指定目标版本
51
- npx greenbump lodash@4.17.21
175
+ npx greenbump eslint --to 9.15.0
52
176
 
53
- # 使用不同的 AI 模型
54
- npx greenbump --provider openai --model gpt-4o react
177
+ # 不指定依赖,让 greenbump 自动选择最过期的一个
178
+ npx greenbump
179
+
180
+ # 列出过期依赖(只读模式,不做升级)
181
+ npx greenbump --scan
55
182
  ```
56
183
 
57
- **需要 API 密钥:**
58
- - Anthropic(默认):`export ANTHROPIC_API_KEY=sk-ant-...`
59
- - OpenAI:`export OPENAI_API_KEY=sk-...`
184
+ ### 进阶用法
185
+
186
+ ```bash
187
+ # 🐳 沙箱模式:在 Docker 容器中运行测试
188
+ npx greenbump react --sandbox
189
+
190
+ # 🗄️ 附带数据库服务
191
+ npx greenbump typeorm --sandbox --services postgres,redis
192
+
193
+ # 📊 性能回归检测
194
+ npx greenbump webpack --detect-regressions
195
+
196
+ # 🔥 完整验证(推荐用于生产环境)
197
+ npx greenbump --sandbox --detect-regressions --services postgres
198
+
199
+ # 🚀 批量升级所有过期依赖
200
+ npx greenbump --all
201
+
202
+ # 🎯 将多个依赖合并到一个 PR
203
+ npx greenbump react react-dom --group react-upgrade
204
+ ```
205
+
206
+ ---
207
+
208
+ ## 📖 CLI 选项
209
+
210
+ ### 核心选项
211
+
212
+ | 参数 | 说明 |
213
+ |---|---|
214
+ | `[dep]` | 要升级的依赖。省略时自动选择最过期的一个。 |
215
+ | `--to <version>` | 目标版本(默认:`latest`)。 |
216
+ | `--ecosystem <id>` | 依赖生态系统(`npm`、`poetry`、`cargo`、`maven` 等)。省略时自动检测。 |
217
+ | `--list-ecosystems` | 列出所有支持的生态系统并退出。 |
218
+ | `--scan` | 仅列出过期依赖,不执行升级(只读模式)。 |
219
+ | `--all` | 升级所有检测到的过期依赖。 |
220
+ | `--group <name>` | 将多个依赖合并到同一个分支/PR。 |
221
+
222
+ ### 构建与测试
223
+
224
+ | 参数 | 说明 |
225
+ |---|---|
226
+ | `--build-cmd <cmd>` | 覆盖构建命令,例如 `"make build"`。 |
227
+ | `--test-cmd <cmd>` | 覆盖测试命令,例如 `"make test"`。 |
228
+
229
+ ### AI 智能体
230
+
231
+ | 参数 | 说明 |
232
+ |---|---|
233
+ | `--provider <name>` | 模型提供商预设(`anthropic`、`openai`、`deepseek`、`groq` 等)。 |
234
+ | `--model <model>` | 修复智能体使用的模型 id(默认:各提供商的默认模型)。 |
235
+ | `--list-providers` | 列出内置的提供商预设并退出。 |
236
+ | `--max-rounds <n>` | 限制修复循环的轮数/令牌消耗(默认:`15`)。 |
237
+ | `--max-tokens <n>` | 令牌总消耗硬上限;超出后停止并标记为待审查。 |
238
+
239
+ ### 沙箱与验证(v0.5.0+)
240
+
241
+ | 参数 | 说明 |
242
+ |---|---|
243
+ | `--sandbox` | 在隔离的 Docker 容器中运行测试(需要 Docker)。 |
244
+ | `--services <list>` | 逗号分隔的服务列表(例如 `postgres,redis,mongodb`)。 |
245
+ | `--keep-container` | 运行结束后保留 Docker 容器,便于调试。 |
246
+ | `--detect-regressions` | 检测性能回归(构建时间、包体积等)。 |
247
+
248
+ ### 成本与信任(v0.6.0+)
249
+
250
+ | 参数 | 说明 |
251
+ |---|---|
252
+ | `-i`, `--interactive` | 交互模式:每个 AI 提议的修改以彩色 diff 展示,确认后才写入。接受(`y`)、拒绝(`n`)、跳过(`s`)、全部接受(`a`)或手动编辑(`e`)。 |
253
+ | `--no-free-tiers` | 跳过免费修复层级(codemod / 学习模式 / 缓存),直接调用 LLM。 |
254
+ | `--no-cache` | 完全禁用 changelog / 修复缓存。 |
255
+ | `--no-ast-analysis` | 禁用修复后的 API 表面分析(导出删除、签名变更、新增 `any`)。 |
256
+ | `--list-codemods` | 列出所有内置免费 codemod 并退出。 |
257
+ | `--cache-stats` | 显示缓存条目数、体积及分类统计。 |
258
+ | `--cache-clear [category]` | 清除缓存条目(`changelogs`、`llm-fixes`、`patterns`;省略则全部清除)。 |
259
+ | `--stats [days]` | 显示最近 N 天(默认 30 天)的用量与节省报告并退出。 |
260
+ | `--json` | 配合 `--stats` 使用,输出原始 JSON 而非格式化报告。 |
261
+
262
+ #### 分层修复策略如何降低成本
263
+
264
+ 升级导致构建失败时,greenbump 按成本从低到高依次尝试四个修复层级:
265
+
266
+ | 层级 | 策略 | 成本 |
267
+ |---|---|---|
268
+ | 1 | **内置 codemod** —— 针对知名 Breaking Change 的正则转换(React 18→19、Express 4→5、Zod 3→4、React Router 5→6、Mongoose、Lodash、Node util.* 等) | 0 token |
269
+ | 2 | **学习模式** —— 历史成功修复提炼为可复用规则 | 0 token |
270
+ | 3 | **缓存的 LLM 修复** —— 相同的失败上下文直接重放之前的修复 | 0 token |
271
+ | 4 | **LLM 修复循环** —— 完整的 AI 代理,仅在前三层未命中时启用 | 付费 |
272
+
273
+ 内置 24 条 codemod(`greenbump --list-codemods` 查看完整列表)——大多数直接改代码;对于风险较高、不适合正则改写的场景(ESLint 9 flat config、Axios 1.x、Webpack 5 polyfill 等),第 1 层会命中错误并输出迁移提示,而不是硬猜一个改动,避免误改。
274
+
275
+ 端到端验证:Express 4→5(`app.del`→`app.delete`)和 Zod 3→4(`error.errors`→`error.issues`)均由第 1 层修复,**消耗 0 输入 / 0 输出 token**。成功的 LLM 修复会被学习进缓存,因此跨项目的重复失败同样免费。
276
+
277
+ #### 看看它到底帮你省了多少
278
+
279
+ ```bash
280
+ npx greenbump --stats # 最近 30 天
281
+ npx greenbump --stats 7 # 最近 7 天
282
+ npx greenbump --stats --json # 机器可读,方便接入自己的看板
283
+ ```
284
+
285
+ 每次运行都会在本地追加一条记录(`~/.greenbump/runs.jsonl`,可用 `GREENBUMP_STATS_DIR` 覆盖路径)——不联网、不上报,数据不出本机。`--stats` 会汇总出修复层级分布、避免的 LLM 调用次数、实际花费的 token/金额,以及免费层级节省的**估算**金额(明确标注为估算,不是账单)。
286
+
287
+ ### Git
288
+
289
+ | 参数 | 说明 |
290
+ |---|---|
291
+ | `--no-git` | 直接在当前工作区操作,不创建新分支。 |
292
+ | `--pr-body` | 打印一份可直接粘贴使用的 PR 正文。 |
293
+ | `--report-file <path>` | 将运行结果的 JSON 报告写入该路径。 |
294
+
295
+ ---
296
+
297
+ ## 🌍 支持的包管理器
298
+
299
+ greenbump 会根据项目的 lockfile/manifest 自动检测生态系统。运行 `greenbump --list-ecosystems` 查看完整列表。
300
+
301
+ <details>
302
+ <summary><b>✅ 已验证的生态系统(20+)</b></summary>
303
+
304
+ **JavaScript/TypeScript:**
305
+ - npm、Yarn、pnpm
60
306
 
61
- ### GitHub Actions
307
+ **Python:**
308
+ - pip、Poetry、uv、Pipenv
62
309
 
63
- 创建 `.github/workflows/greenbump.yml`:
310
+ **Rust:**
311
+ - Cargo
312
+
313
+ **Go:**
314
+ - Go modules
315
+
316
+ **Ruby:**
317
+ - Bundler
318
+
319
+ **PHP:**
320
+ - Composer
321
+
322
+ **Java/Kotlin:**
323
+ - Gradle、Maven
324
+
325
+ **.NET:**
326
+ - NuGet
327
+
328
+ **Elixir:**
329
+ - Mix(Hex)
330
+
331
+ **Dart/Flutter:**
332
+ - Pub
333
+
334
+ **Swift:**
335
+ - Swift Package Manager
336
+
337
+ **Objective-C:**
338
+ - CocoaPods
339
+
340
+ **C/C++:**
341
+ - Conan
342
+
343
+ **Elm:**
344
+ - Elm packages
345
+
346
+ </details>
347
+
348
+ > **说明**:“已验证”表示维护者至少手动测试过一次该生态系统。解析逻辑有单元测试覆盖,但 CLI 工具本身未在 CI 中运行。如果遇到问题,欢迎 [反馈](https://github.com/shidesheng0218/greenbump/issues)!
349
+
350
+ ---
351
+
352
+ ## 🎭 工作原理
353
+
354
+ ```mermaid
355
+ graph TD
356
+ A[检测过期依赖] --> B[创建 Git 分支]
357
+ B --> C[基准:运行构建 + 测试]
358
+ C --> D{已经是红的?}
359
+ D -->|是| E[停止 - 先手动修复]
360
+ D -->|否| F[升级依赖]
361
+ F --> G{构建/测试通过?}
362
+ G -->|是| H[干净升级 ✅]
363
+ G -->|否| I[AI 修复循环]
364
+ I --> J[读取错误输出]
365
+ J --> K[编辑源代码]
366
+ K --> L[重新运行检查]
367
+ L --> M{已修复?}
368
+ M -->|否| N{达到最大轮数?}
369
+ N -->|否| I
370
+ N -->|是| O[标记待审查 ⚠️]
371
+ M -->|是| P[验证流水线]
372
+ P --> Q[TypeScript 类型检查]
373
+ Q --> R[ESLint]
374
+ R --> S[变更检测]
375
+ S --> T{启用沙箱?}
376
+ T -->|是| U[Docker 容器测试]
377
+ T -->|否| V{检测性能回归?}
378
+ U --> V
379
+ V -->|是| W[性能对比]
380
+ V -->|否| X[提交并创建 PR]
381
+ W --> X
382
+ ```
383
+
384
+ ### 分步说明
385
+
386
+ 1. **🔍 检测** 生态系统和过期依赖(例如 `npm outdated`、`poetry show -o`、`cargo outdated`)
387
+ 2. **🌿 隔离** 在全新的 `greenbump/<dep>-<version>` 分支上操作
388
+ 3. **📊 基准测试** — 运行你的构建 + 测试。如果已经是红的,停止(绝不追着已存在的失败跑)
389
+ 4. **⬆️ 升级** 目标依赖
390
+ 5. **🤖 修复循环**(如果被破坏):
391
+ - AI 智能体读取失败输出
392
+ - 编辑源代码修复破坏性变更
393
+ - 重新运行检查
394
+ - 循环直到通过或达到最大轮数
395
+ 6. **✅ 验证流水线**(v0.3.0+):
396
+ - 运行 TypeScript 类型检查(`tsc --noEmit`)
397
+ - 运行 ESLint
398
+ - 检测可疑变更(测试被修改、大量删除代码)
399
+ 7. **🐳 沙箱验证**(v0.5.0+,可选):
400
+ - 使用干净环境构建 Docker 镜像
401
+ - 启动所需的数据库服务
402
+ - 在隔离容器中运行测试
403
+ 8. **📊 性能检查**(v0.5.0+,可选):
404
+ - 对比构建时间、测试时间、包体积
405
+ - 标记回归(构建变慢 >20%、包体积增大 >15%)
406
+ 9. **💾 提交** 变更并输出 PR 正文
407
+
408
+ ---
409
+
410
+ ## 🏗️ 架构
411
+
412
+ ```mermaid
413
+ flowchart LR
414
+ subgraph CLI["🌱 greenbump CLI"]
415
+ A1[生态系统适配器]
416
+ A2[修复循环引擎]
417
+ A3[验证流水线]
418
+ A4[Git / PR 层]
419
+ end
420
+
421
+ subgraph Adapters["🌍 20+ 生态系统"]
422
+ E1[npm / yarn / pnpm]
423
+ E2[pip / poetry / uv]
424
+ E3[cargo]
425
+ E4[maven / gradle]
426
+ E5[...更多]
427
+ end
428
+
429
+ subgraph Agent["🤖 AI 提供商"]
430
+ M1[Anthropic]
431
+ M2[OpenAI]
432
+ M3[DeepSeek / Groq / 自定义]
433
+ end
434
+
435
+ subgraph Sandbox["🐳 可选沙箱"]
436
+ S1[Docker 容器]
437
+ S2[Postgres / MySQL / Redis / Mongo]
438
+ end
439
+
440
+ A1 --- Adapters
441
+ A2 -- "工具调用" --> Agent
442
+ A3 -- "隔离运行" --> Sandbox
443
+ A4 --> GH[GitHub / GitLab PR]
444
+
445
+ CLI --> Adapters
446
+ CLI --> Agent
447
+ CLI --> Sandbox
448
+ ```
449
+
450
+ 每一层都可以独立替换:任选生态系统适配器、任选模型提供商,
451
+ 只有在需要生产级隔离时才启用沙箱。
452
+
453
+ ---
454
+
455
+ ## 🎬 GitHub Actions
456
+
457
+ 按计划自动升级依赖,让 greenbump 帮你开 PR。
458
+
459
+ ### 基础配置
460
+
461
+ 新建 `.github/workflows/greenbump.yml`:
64
462
 
65
463
  ```yaml
66
464
  name: greenbump
67
465
  on:
68
466
  schedule:
69
- - cron: '0 2 * * 1' # 每周一凌晨 2 点
70
- workflow_dispatch:
71
-
467
+ - cron: "0 6 * * 1" # 每周一早上 6 点
468
+ workflow_dispatch: # 手动触发
469
+ permissions:
470
+ contents: write
471
+ pull-requests: write
72
472
  jobs:
73
- upgrade:
473
+ bump:
74
474
  runs-on: ubuntu-latest
75
- permissions:
76
- contents: write
77
- pull-requests: write
78
475
  steps:
79
476
  - uses: actions/checkout@v4
477
+ - uses: actions/setup-node@v4
478
+ with: { node-version: 20 }
479
+ - run: npm ci
80
480
  - uses: shidesheng0218/greenbump@v0
81
481
  with:
82
- packages: 'react typescript lodash'
83
482
  anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
84
483
  ```
85
484
 
86
- 在仓库设置中添加 `ANTHROPIC_API_KEY` secret。
87
-
88
- ---
485
+ ### 进阶配置(含沙箱 + 服务)
89
486
 
90
- ## 工作原理
487
+ ```yaml
488
+ name: greenbump-full-verification
489
+ on:
490
+ schedule:
491
+ - cron: "0 6 * * 1"
492
+ workflow_dispatch:
493
+ permissions:
494
+ contents: write
495
+ pull-requests: write
496
+ jobs:
497
+ bump:
498
+ runs-on: ubuntu-latest
499
+ steps:
500
+ - uses: actions/checkout@v4
501
+ - uses: actions/setup-node@v4
502
+ with: { node-version: 20 }
503
+ - run: npm ci
504
+ - uses: shidesheng0218/greenbump@v0
505
+ with:
506
+ anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
507
+ sandbox: true
508
+ services: postgres,redis
509
+ detect-regressions: true
510
+ ```
91
511
 
92
- 1. **检测生态系统** — 自动识别 package.json、Cargo.toml、go.mod 等
93
- 2. **运行基准测试** — 在升级前运行构建和测试,确保它们通过
94
- 3. **升级依赖** — 安装目标版本
95
- 4. **检查是否破坏** — 重新运行测试,如果失败则启动 AI 修复循环
96
- 5. **AI 修复循环** — 智能体可以:
97
- - `read_file` — 读取源代码和错误日志
98
- - `write_file` — 编辑代码文件
99
- - `run_check` — 重新运行构建和测试
100
- - 循环直到所有检查通过或达到最大轮数
101
- 6. **提交并推送** — 创建描述性提交信息和 PR 正文
512
+ 添加 `ANTHROPIC_API_KEY` 仓库 secret:
513
+ 1. 进入 **Settings** → **Secrets and variables** → **Actions**
514
+ 2. 点击 **New repository secret**
515
+ 3. 名称:`ANTHROPIC_API_KEY`,值:你的密钥
102
516
 
103
- ---
517
+ > **💡 提示**:当 greenbump 无法完全修复升级问题或验证出现警告时,会开一个 **draft PR**(标记为待审查)。
104
518
 
105
- ## CLI 选项
519
+ > **⚠️ CI 触发限制**:使用 `GITHUB_TOKEN` 打开的 PR 不会触发其他 workflow(GitHub 的安全机制)。如果需要 CI 在 greenbump 的 PR 上运行,请通过 `github-token:` 传入一个 personal access token。
106
520
 
107
- ```
108
- npx greenbump [选项] <包名...>
109
-
110
- 选项:
111
- --provider <名称> AI 提供商:anthropic | openai(默认:anthropic)
112
- --model <名称> 模型名称(默认:claude-3-7-sonnet-20250219)
113
- --max-rounds <数字> 每个包的最大修复轮数(默认:15)
114
- --max-total-tokens <数字> 令牌预算限制(可选)
115
- --no-push 本地提交但不推送到远程
116
- --help 显示帮助信息
117
- ```
521
+ 完整示例(包含所有输入项):[examples/greenbump.yml](examples/greenbump.yml)
118
522
 
119
523
  ---
120
524
 
121
- ## 支持的包管理器
525
+ ## 🎯 适用场景
122
526
 
123
- | 生态系统 | 清单文件 | 安装命令 |
124
- |---------|---------|---------|
125
- | **JavaScript** | package.json | npm/yarn/pnpm/bun |
126
- | **Python** | requirements.txt, pyproject.toml | pip/poetry/pipenv/uv |
127
- | **Rust** | Cargo.toml | cargo |
128
- | **Go** | go.mod | go get |
129
- | **Java** | pom.xml, build.gradle | mvn/gradle |
130
- | **Ruby** | Gemfile | bundler |
131
- | **PHP** | composer.json | composer |
132
- | **Dart** | pubspec.yaml | pub/flutter |
133
- | **Swift** | Package.swift | swift |
134
- | **Elixir** | mix.exs | mix |
135
- | **Elm** | elm.json | elm |
136
- | **C#** | *.csproj | dotnet |
137
- | **C++** | conanfile.txt | conan |
138
- | **iOS** | Podfile | pod |
527
+ ### ✅ 非常适合
139
528
 
140
- 每个适配器实现:
141
- - `detect()` — 查找清单文件
142
- - `outdated()` — 检查可用更新
143
- - `install()` — 安装特定版本
529
+ - **小版本/补丁升级**,破坏性变更较小(重命名导出、签名更新)
530
+ - **依赖链升级**,升级路径在 changelog 中有文档说明
531
+ - **测试快速可靠的项目**,能及时捕获回归
532
+ - **TypeScript 项目**,类型错误能暴露大部分破坏性变更
533
+ - **测试覆盖良好的代码库**,“测试通过”确实意味着“功能正常”
144
534
 
145
- ---
535
+ ### ⚠️ 需要谨慎
146
536
 
147
- ## 贡献
537
+ - **大版本跨越且伴随架构变更**(例如 React 15 → 16、Angular 2 → 3)
538
+ - **多依赖协同升级**(例如一次性升级所有 Babel 插件)
539
+ - **安全补丁**,需要审计修复内容而不只是通过测试
540
+ - **没有测试的项目** — greenbump 只能验证测试套件覆盖到的部分
148
541
 
149
- 欢迎提交 Issue 和 Pull Request!
542
+ ### ❌ 不建议使用
150
543
 
151
- 查看 [CONTRIBUTING.md](CONTRIBUTING.md) 了解:
152
- - 如何设置开发环境
153
- - 如何添加新的包管理器支持
154
- - 代码风格指南
155
- - 如何运行测试
544
+ - **破坏核心假设的框架迁移**(async/await 重构、构建系统变更)
545
+ - **测试无法覆盖的运行时问题**
546
+ - **不稳定的测试套件**,“测试通过”本身不可靠
547
+
548
+ > **💡 最佳实践**:将 greenbump 用作简单升级的第一道处理。合并前始终审查 PR diff,尤其是涉及安全、数据处理或关键路径的依赖。用 `--max-rounds` 限制困难升级的令牌消耗,用 `--scan` 在动手前预览有哪些依赖已过期。
156
549
 
157
550
  ---
158
551
 
159
- ## 安全
552
+ ## 🔒 安全与隐私
160
553
 
161
- 如果你发现安全漏洞,请查看 [SECURITY.md](SECURITY.md) 了解如何负责任地报告。
554
+ - **自带密钥**:你掌控成本,数据不会外泄
555
+ - **不收集数据**:greenbump 完全在本地或你的 CI 中运行
556
+ - **代码保持私密**:仅发送给你选择的 AI 提供商(Anthropic、OpenAI 等)
557
+ - **安全的 Git 工作流**:只在分支上操作,绝不自动合并,绝不修改你的 lockfile
558
+ - **执行有边界**:`--max-rounds` 和 `--max-tokens` 防止失控消耗
162
559
 
163
560
  **关键安全边界:**
164
561
  - AI 智能体只能访问项目目录内的文件(路径遍历保护)
165
562
  - 所有文件操作都经过 `safePath()` 验证
166
563
  - 智能体不能执行任意 shell 命令
167
- - 发送给 AI 提供商的数据:错误日志、差异、文件内容(不包含 secrets)
564
+ - 发送给 AI 提供商的数据:错误日志、diff、文件内容(不包含 secrets)
565
+
566
+ 如果你发现安全漏洞,请查看 [SECURITY.md](SECURITY.md) 了解如何负责任地报告。
168
567
 
169
568
  ---
170
569
 
171
- ## 许可证
570
+ ## 🗺️ 路线图
172
571
 
173
- MIT License — 详见 [LICENSE](LICENSE)
572
+ - [x] **v0.1.0**:核心修复循环 + 多生态系统支持
573
+ - [x] **v0.2.0**:批量升级(`--all`)、changelog 集成
574
+ - [x] **v0.3.0**:静态分析(TypeScript + ESLint)+ 变更检测
575
+ - [x] **v0.4.0**:多阶段修复策略 + 依赖图分析
576
+ - [x] **v0.5.0**:Docker 沙箱 + 数据库测试 + 性能回归检测
577
+ - [ ] **v0.6.0**:用于监控升级的 Web UI
578
+ - [ ] **v0.7.0**:升级影响预测(运行前预判)
579
+ - [ ] **v0.8.0**:自定义验证脚本
580
+ - [ ] **v0.9.0**:多仓库编排
581
+ - [ ] **v1.0.0**:生产可用版本
582
+
583
+ ---
584
+
585
+ ## 🤝 贡献
586
+
587
+ 欢迎贡献代码!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解指南。
588
+
589
+ **我们特别需要帮助的方向:**
590
+ - 🌍 更多生态系统适配器(尤其是小众包管理器)
591
+ - 🧪 针对真实升级场景的集成测试
592
+ - 📚 文档改进
593
+ - 🐛 附带可复现步骤的 Bug 报告
594
+
595
+ ---
596
+
597
+ ## 📄 许可证
598
+
599
+ MIT © [shidesheng0218](https://github.com/shidesheng0218)
174
600
 
175
601
  ---
176
602
 
@@ -186,7 +612,7 @@ A: 取决于破坏的复杂度。简单的 API 重命名通常 1-2 轮(30-60
186
612
 
187
613
  **Q: 费用是多少?**
188
614
 
189
- A: 使用你自己的 API 密钥,按 AI 提供商的定价付费。典型的修复消耗 10k-50k tokens(Claude Sonnet 约 $0.15-$0.75)。可以用 `--max-total-tokens` 设置预算上限。
615
+ A: 使用你自己的 API 密钥,按 AI 提供商的定价付费。典型的修复消耗 10k-50k tokens(Claude Sonnet 约 $0.15-$0.75)。可以用 `--max-tokens` 设置预算上限。
190
616
 
191
617
  **Q: 支持私有包吗?**
192
618
 
@@ -199,15 +625,28 @@ A: 不能保证。AI 能处理大多数常见的 API 变更、导入重命名、
199
625
  **Q: 安全吗?**
200
626
 
201
627
  A: 智能体被限制在项目目录内,不能执行任意命令。但它**会修改你的代码**,所以:
202
- - 在干净的 git 工作树上运行(有未提交的变更会被拒绝)
203
- - 审查修复后的 PR 再合并
204
- - 在非关键分支上先测试
628
+ - 建议在干净的 git 工作树上运行(有未提交的变更会被拒绝)
629
+ - 合并前审查修复后的 PR
630
+ - 先在非关键分支上测试
205
631
  - 查看 [SECURITY.md](SECURITY.md) 了解完整的安全模型
206
632
 
207
633
  ---
208
634
 
209
- ## 反馈
635
+ ## 💬 支持与反馈
210
636
 
211
- 遇到问题或有建议?请在 [GitHub Issues](https://github.com/shidesheng0218/greenbump/issues) 提交。
637
+ - 🐛 **Bug 反馈**:[GitHub Issues](https://github.com/shidesheng0218/greenbump/issues)
638
+ - 💡 **功能建议**:[GitHub Discussions](https://github.com/shidesheng0218/greenbump/discussions)
639
+ - 📖 **文档**:[docs/](docs/)
640
+ - 🌟 **点个 Star**:如果 greenbump 对你有帮助,欢迎在 GitHub 上点个 ⭐!
212
641
 
213
642
  开发者:[@shidesheng0218](https://github.com/shidesheng0218)
643
+
644
+ ---
645
+
646
+ <div align="center">
647
+
648
+ **Made with ❤️ by developers, for developers**
649
+
650
+ [⬆ 回到顶部](#-greenbump)
651
+
652
+ </div>