greenbump 0.4.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.
- package/README.md +673 -66
- package/README.zh-CN.md +525 -100
- package/dist/agent/fixer.js +161 -12
- package/dist/agent/fixer.js.map +1 -1
- package/dist/agent/fixer.test.js +410 -0
- package/dist/agent/fixer.test.js.map +1 -0
- package/dist/cli/interactive.js +81 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -1
- package/dist/engine/analyzers/changelog-parser.js +121 -0
- package/dist/engine/analyzers/changelog-parser.js.map +1 -0
- package/dist/engine/batch.test.js +59 -0
- package/dist/engine/batch.test.js.map +1 -0
- package/dist/engine/cache/manager.js +165 -0
- package/dist/engine/cache/manager.js.map +1 -0
- package/dist/engine/cache/manager.test.js +75 -0
- package/dist/engine/cache/manager.test.js.map +1 -0
- package/dist/engine/checks.test.js +92 -0
- package/dist/engine/checks.test.js.map +1 -0
- package/dist/engine/context/optimizer.js +189 -0
- package/dist/engine/context/optimizer.js.map +1 -0
- package/dist/engine/context/optimizer.test.js +81 -0
- package/dist/engine/context/optimizer.test.js.map +1 -0
- package/dist/engine/ecosystems/parsers.test.js +255 -0
- package/dist/engine/ecosystems/parsers.test.js.map +1 -0
- package/dist/engine/fixer/patterns.js +356 -0
- package/dist/engine/fixer/patterns.js.map +1 -0
- package/dist/engine/fixer/patterns.test.js +124 -0
- package/dist/engine/fixer/patterns.test.js.map +1 -0
- package/dist/engine/git.js +1 -0
- package/dist/engine/git.js.map +1 -1
- package/dist/engine/git.test.js +111 -0
- package/dist/engine/git.test.js.map +1 -0
- package/dist/engine/perf/metrics.js +171 -0
- package/dist/engine/perf/metrics.js.map +1 -0
- package/dist/engine/perf/regression.js +115 -0
- package/dist/engine/perf/regression.js.map +1 -0
- package/dist/engine/run.js +93 -2
- package/dist/engine/run.js.map +1 -1
- package/dist/engine/run.test.js +47 -0
- package/dist/engine/run.test.js.map +1 -0
- package/dist/engine/sandbox/docker-manager.js +215 -0
- package/dist/engine/sandbox/docker-manager.js.map +1 -0
- package/dist/engine/sandbox/orchestrator.js +107 -0
- package/dist/engine/sandbox/orchestrator.js.map +1 -0
- package/dist/engine/sandbox/service-detector.js +147 -0
- package/dist/engine/sandbox/service-detector.js.map +1 -0
- package/dist/engine/sandbox/template-generator.js +241 -0
- package/dist/engine/sandbox/template-generator.js.map +1 -0
- package/dist/engine/verifiers/ast-analyzer.js +212 -0
- package/dist/engine/verifiers/ast-analyzer.js.map +1 -0
- package/dist/engine/verifiers/ast-analyzer.test.js +96 -0
- package/dist/engine/verifiers/ast-analyzer.test.js.map +1 -0
- package/dist/engine/workspace.test.js +95 -0
- package/dist/engine/workspace.test.js.map +1 -0
- package/dist/exitcode.test.js +62 -0
- package/dist/exitcode.test.js.map +1 -0
- package/dist/format.js +15 -0
- package/dist/format.js.map +1 -1
- package/dist/report.test.js +56 -0
- package/dist/report.test.js.map +1 -0
- package/package.json +7 -4
- package/CHANGELOG.md +0 -93
- package/CONTRIBUTING.md +0 -52
- package/SECURITY.md +0 -38
- package/action-dist/index.cjs +0 -19935
- package/action.yml +0 -76
- package/competitive-analysis.md +0 -304
- package/examples/greenbump.yml +0 -37
- package/examples/legacy-repo/package.json +0 -12
- package/examples/legacy-repo/test.js +0 -17
- package/examples/multi-file-repo/models/todo.js +0 -8
- package/examples/multi-file-repo/models/user.js +0 -11
- package/examples/multi-file-repo/package.json +0 -12
- package/examples/multi-file-repo/services/session.js +0 -9
- package/examples/multi-file-repo/test.js +0 -19
- 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
|
-
|
|
9
|
+
[](https://www.npmjs.com/package/greenbump)
|
|
10
|
+
[](https://opensource.org/licenses/MIT)
|
|
11
|
+
[](https://github.com/shidesheng0218/greenbump/actions)
|
|
12
|
+
[](package.json)
|
|
13
|
+
[](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
|
-
|
|
32
|
-
|
|
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
|
-
###
|
|
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
|
-
#
|
|
45
|
-
|
|
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
|
-
|
|
170
|
+
```bash
|
|
171
|
+
# 将某个依赖升级到最新版本
|
|
172
|
+
npx greenbump react
|
|
49
173
|
|
|
50
174
|
# 指定目标版本
|
|
51
|
-
npx greenbump
|
|
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
|
-
|
|
54
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
302
|
+
**Ruby:**
|
|
303
|
+
- Bundler
|
|
62
304
|
|
|
63
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
142
|
-
-
|
|
143
|
-
-
|
|
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
|
-
|
|
530
|
+
- **破坏核心假设的框架迁移**(async/await 重构、构建系统变更)
|
|
531
|
+
- **测试无法覆盖的运行时问题**
|
|
532
|
+
- **不稳定的测试套件**,“测试通过”本身不可靠
|
|
150
533
|
|
|
151
|
-
|
|
152
|
-
- 如何设置开发环境
|
|
153
|
-
- 如何添加新的包管理器支持
|
|
154
|
-
- 代码风格指南
|
|
155
|
-
- 如何运行测试
|
|
534
|
+
> **💡 最佳实践**:将 greenbump 用作简单升级的第一道处理。合并前始终审查 PR diff,尤其是涉及安全、数据处理或关键路径的依赖。用 `--max-rounds` 限制困难升级的令牌消耗,用 `--scan` 在动手前预览有哪些依赖已过期。
|
|
156
535
|
|
|
157
536
|
---
|
|
158
537
|
|
|
159
|
-
##
|
|
538
|
+
## 🔒 安全与隐私
|
|
160
539
|
|
|
161
|
-
|
|
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
|
|
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
|
|
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-
|
|
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
|
-
-
|
|
203
|
-
-
|
|
204
|
-
-
|
|
614
|
+
- 建议在干净的 git 工作树上运行(有未提交的变更会被拒绝)
|
|
615
|
+
- 合并前审查修复后的 PR
|
|
616
|
+
- 先在非关键分支上测试
|
|
205
617
|
- 查看 [SECURITY.md](SECURITY.md) 了解完整的安全模型
|
|
206
618
|
|
|
207
619
|
---
|
|
208
620
|
|
|
209
|
-
##
|
|
621
|
+
## 💬 支持与反馈
|
|
210
622
|
|
|
211
|
-
|
|
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>
|