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