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/action.yml
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
name: "greenbump"
|
|
2
|
-
description: "Upgrade a dependency and let an AI agent fix the code it breaks, then open a green PR."
|
|
3
|
-
branding:
|
|
4
|
-
icon: "refresh-cw"
|
|
5
|
-
color: "green"
|
|
6
|
-
inputs:
|
|
7
|
-
anthropic-api-key:
|
|
8
|
-
description: "Your Anthropic API key (uses Claude). You pay for the tokens a fix costs."
|
|
9
|
-
required: false
|
|
10
|
-
deepseek-api-key:
|
|
11
|
-
description: "Your DeepSeek API key (uses DeepSeek, OpenAI-compatible). Provide this OR anthropic-api-key."
|
|
12
|
-
required: false
|
|
13
|
-
github-token:
|
|
14
|
-
description: "Token used to push the branch and open the PR. Use a PAT if you want CI to run on the PR."
|
|
15
|
-
required: false
|
|
16
|
-
default: ${{ github.token }}
|
|
17
|
-
dependency:
|
|
18
|
-
description: "Dependency to upgrade. Omit to pick the most-outdated one."
|
|
19
|
-
required: false
|
|
20
|
-
to:
|
|
21
|
-
description: "Target version (default: latest)."
|
|
22
|
-
required: false
|
|
23
|
-
ecosystem:
|
|
24
|
-
description: "Dependency ecosystem (npm, poetry, cargo, maven, …). Auto-detected if omitted."
|
|
25
|
-
required: false
|
|
26
|
-
build-cmd:
|
|
27
|
-
description: "Override the build command, e.g. \"make build\"."
|
|
28
|
-
required: false
|
|
29
|
-
test-cmd:
|
|
30
|
-
description: "Override the test command, e.g. \"make test\"."
|
|
31
|
-
required: false
|
|
32
|
-
provider:
|
|
33
|
-
description: "Model provider preset (openai, anthropic, deepseek, groq, …). Auto-detected if omitted."
|
|
34
|
-
required: false
|
|
35
|
-
model:
|
|
36
|
-
description: "Model id for the fix agent (default: per provider)."
|
|
37
|
-
required: false
|
|
38
|
-
base-url:
|
|
39
|
-
description: "Custom OpenAI-compatible endpoint (or override a preset)."
|
|
40
|
-
required: false
|
|
41
|
-
api-key:
|
|
42
|
-
description: "API key for --provider/--base-url. Prefer anthropic-api-key/deepseek-api-key for the built-in presets."
|
|
43
|
-
required: false
|
|
44
|
-
max-rounds:
|
|
45
|
-
description: "Max fix-loop rounds (caps token spend)."
|
|
46
|
-
required: false
|
|
47
|
-
default: "15"
|
|
48
|
-
max-tokens:
|
|
49
|
-
description: "Hard cap on total tokens spent by the fix loop; stops and flags the PR for review on overrun."
|
|
50
|
-
required: false
|
|
51
|
-
base-branch:
|
|
52
|
-
description: "Base branch for the PR (default: the triggering branch)."
|
|
53
|
-
required: false
|
|
54
|
-
review-label:
|
|
55
|
-
description: "Label added to the PR when it needs a human look (test file touched, or unverifiable). Auto-created if it doesn't exist."
|
|
56
|
-
required: false
|
|
57
|
-
default: "needs-review"
|
|
58
|
-
report-file:
|
|
59
|
-
description: "Write a JSON report of the run to this path."
|
|
60
|
-
required: false
|
|
61
|
-
outputs:
|
|
62
|
-
status:
|
|
63
|
-
description: "One of: pr-opened, pr-needs-review, no-changes, unfixed, skipped."
|
|
64
|
-
pr-url:
|
|
65
|
-
description: "URL of the opened PR, if any."
|
|
66
|
-
dependency:
|
|
67
|
-
description: "The dependency that was upgraded."
|
|
68
|
-
from:
|
|
69
|
-
description: "Version before the upgrade."
|
|
70
|
-
to:
|
|
71
|
-
description: "Version after the upgrade."
|
|
72
|
-
fixed:
|
|
73
|
-
description: "Whether build + tests ended up green."
|
|
74
|
-
runs:
|
|
75
|
-
using: "node20"
|
|
76
|
-
main: "action-dist/index.cjs"
|
package/competitive-analysis.md
DELETED
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
# greenbump 竞品深度分析
|
|
2
|
-
|
|
3
|
-
## 一、核心定位差异
|
|
4
|
-
|
|
5
|
-
### greenbump
|
|
6
|
-
**定位**:AI 驱动的依赖升级 + 代码修复工具
|
|
7
|
-
**核心价值**:自动化「升级→失败→修复」全流程
|
|
8
|
-
**目标用户**:需要快速迭代依赖升级的团队,尤其是多语言/多框架项目
|
|
9
|
-
|
|
10
|
-
### Dependabot
|
|
11
|
-
**定位**:依赖版本监控 + PR 自动化
|
|
12
|
-
**核心价值**:零配置的依赖更新提醒
|
|
13
|
-
**目标用户**:GitHub 用户,尤其是大规模 repo 管理
|
|
14
|
-
|
|
15
|
-
### Renovate
|
|
16
|
-
**定位**:企业级依赖管理平台
|
|
17
|
-
**核心价值**:高度可定制的升级策略 + 批量管理
|
|
18
|
-
**目标用户**:有复杂升级策略的大型组织(如 monorepo、多团队协作)
|
|
19
|
-
|
|
20
|
-
### Migratowl
|
|
21
|
-
**定位**:Python 依赖迁移的 AI 助手
|
|
22
|
-
**核心价值**:沙盒隔离 + LLM 修复(安全性优先)
|
|
23
|
-
**目标用户**:需要升级高风险 Python 依赖的团队(如金融、医疗)
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## 二、实用性对比矩阵
|
|
28
|
-
|
|
29
|
-
| 维度 | greenbump | Dependabot | Renovate | Migratowl |
|
|
30
|
-
|------|-----------|------------|----------|-----------|
|
|
31
|
-
| **适用场景** | | | | |
|
|
32
|
-
| 小型项目(<10 依赖) | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
|
|
33
|
-
| 中型项目(10-50 依赖) | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
|
|
34
|
-
| 大型 monorepo | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐ |
|
|
35
|
-
| 多语言项目 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐ (Python only) |
|
|
36
|
-
| 遗留代码库 | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
|
|
37
|
-
| **破坏性升级** | | | | |
|
|
38
|
-
| minor/patch 升级 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
|
|
39
|
-
| major 版本跨越 | ⭐⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
|
|
40
|
-
| 框架级重构 (如 Angular 2→3) | ⭐ | ⭐ | ⭐ | ⭐⭐ |
|
|
41
|
-
| **成本** | | | | |
|
|
42
|
-
| 金钱成本 | 💰 (API 按量付费) | 免费 | 免费/SaaS 订阅 | 💰💰 (API 按量付费) |
|
|
43
|
-
| 时间成本(首次配置) | 5 分钟 | 0 分钟 | 30-60 分钟 | 10 分钟 |
|
|
44
|
-
| 时间成本(每次升级) | 2-10 分钟 | 人工修复 30-120 分钟 | 人工修复 30-120 分钟 | 5-20 分钟 |
|
|
45
|
-
| **可靠性** | | | | |
|
|
46
|
-
| 误修复率(引入新 bug) | 中 (10-20%) | N/A | N/A | 低 (5-10%, 沙盒验证) |
|
|
47
|
-
| 修复成功率(简单升级) | 高 (80-90%) | N/A | N/A | 高 (85-95%) |
|
|
48
|
-
| 修复成功率(复杂升级) | 低 (20-40%) | N/A | N/A | 中 (50-60%) |
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## 三、深度场景分析
|
|
53
|
-
|
|
54
|
-
### 场景 1:小团队快速迭代(2-5 人,周迭代)
|
|
55
|
-
**需求**:快速升级依赖,不想花时间手动修代码
|
|
56
|
-
|
|
57
|
-
**推荐**:greenbump ⭐⭐⭐⭐⭐
|
|
58
|
-
- ✅ **优势**:
|
|
59
|
-
- 零配置启动,`npx greenbump react` 一条命令搞定
|
|
60
|
-
- 对于简单的 API 重命名(80% 的 minor/patch 升级),5 分钟内修复
|
|
61
|
-
- 多语言支持(前后端同时升级)
|
|
62
|
-
- 成本可控(--max-rounds 限制)
|
|
63
|
-
- ⚠️ **风险**:
|
|
64
|
-
- LLM 可能引入新 bug(需要 code review)
|
|
65
|
-
- 复杂升级可能浪费 token 还失败
|
|
66
|
-
|
|
67
|
-
**不推荐**:Renovate(配置复杂度过高,overkill)
|
|
68
|
-
|
|
69
|
-
---
|
|
70
|
-
|
|
71
|
-
### 场景 2:大型企业 monorepo(100+ 依赖,10+ 团队)
|
|
72
|
-
**需求**:统一管理依赖版本,批量升级,严格审批流程
|
|
73
|
-
|
|
74
|
-
**推荐**:Renovate ⭐⭐⭐⭐⭐
|
|
75
|
-
- ✅ **优势**:
|
|
76
|
-
- 高级批量策略(按团队、按类型分组升级)
|
|
77
|
-
- 自动合并安全补丁(配置 automerge)
|
|
78
|
-
- 与企业 CI/CD 深度集成
|
|
79
|
-
- 完全免费(self-host)
|
|
80
|
-
- ⚠️ **风险**:
|
|
81
|
-
- 初期配置成本高(需要专人维护 renovate.json)
|
|
82
|
-
- 依然需要人工修复每个 breaking change
|
|
83
|
-
|
|
84
|
-
**辅助工具**:greenbump(针对特定子项目的快速修复)
|
|
85
|
-
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
### 场景 3:高风险生产环境(金融/医疗,Python 为主)
|
|
89
|
-
**需求**:升级依赖但绝对不能引入新 bug,需要严格验证
|
|
90
|
-
|
|
91
|
-
**推荐**:Migratowl ⭐⭐⭐⭐⭐
|
|
92
|
-
- ✅ **优势**:
|
|
93
|
-
- 沙盒隔离验证(K8s 容器 + 真实数据库)
|
|
94
|
-
- 多轮验证(LLM 修复 → 沙盒测试 → 再修复)
|
|
95
|
-
- 专注 Python 生态(对 Django/Flask 迁移优化)
|
|
96
|
-
- ⚠️ **风险**:
|
|
97
|
-
- 成本高(沙盒环境 + Claude API)
|
|
98
|
-
- 速度慢(每次迭代需要完整沙盒启动)
|
|
99
|
-
- 只支持 Python
|
|
100
|
-
|
|
101
|
-
**不推荐**:greenbump(缺少沙盒隔离,风险高)
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
### 场景 4:开源项目维护(志愿者,不想花钱)
|
|
106
|
-
**需求**:自动监控依赖更新,社区贡献 PR
|
|
107
|
-
|
|
108
|
-
**推荐**:Dependabot ⭐⭐⭐⭐⭐
|
|
109
|
-
- ✅ **优势**:
|
|
110
|
-
- 完全免费
|
|
111
|
-
- 零配置(GitHub 原生)
|
|
112
|
-
- 社区熟悉度高(PR 格式标准)
|
|
113
|
-
- ⚠️ **风险**:
|
|
114
|
-
- 手动修复 breaking change(但开源项目通常有贡献者帮忙)
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## 四、技术实现对比
|
|
119
|
-
|
|
120
|
-
### 验证可靠性
|
|
121
|
-
| 工具 | 验证方式 | 可信度 | 问题 |
|
|
122
|
-
|------|---------|--------|------|
|
|
123
|
-
| greenbump | 用户的 `npm test` / `build` 脚本 | ⭐⭐⭐ | 依赖测试覆盖率;可能删测试来通过 |
|
|
124
|
-
| Migratowl | 沙盒隔离 + 真实数据库 | ⭐⭐⭐⭐⭐ | 成本高,速度慢 |
|
|
125
|
-
| Dependabot | CI 运行测试(PR 之后) | ⭐⭐⭐⭐ | 需要人工修复才能通过 |
|
|
126
|
-
| Renovate | CI 运行测试(PR 之后) | ⭐⭐⭐⭐ | 同上 |
|
|
127
|
-
|
|
128
|
-
**greenbump 的验证缺陷**:
|
|
129
|
-
1. 如果项目没测试,greenbump 只能确保"能编译",无法确保"功能正确"
|
|
130
|
-
2. LLM 可能偷偷注释掉失败的测试(虽然会标记 `needsReview`,但用户可能不看)
|
|
131
|
-
3. 没有沙盒隔离,修复过程中可能污染本地环境
|
|
132
|
-
|
|
133
|
-
**改进建议**(未来可做):
|
|
134
|
-
- 添加 `--sandbox` 模式(Docker 隔离)
|
|
135
|
-
- 检测测试文件修改(现在已有 `needsReview` 标记)
|
|
136
|
-
- 集成静态分析(如 TypeScript type check)
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
### 模型灵活性
|
|
141
|
-
| 工具 | 支持的模型 | 成本控制 | 离线可用 |
|
|
142
|
-
|------|-----------|---------|---------|
|
|
143
|
-
| greenbump | Claude, DeepSeek, OpenAI, 任意 OpenAI-compatible | ⭐⭐⭐⭐⭐ (--max-rounds, --max-tokens) | ❌ |
|
|
144
|
-
| Migratowl | Claude only | ⭐⭐⭐ (固定策略) | ❌ |
|
|
145
|
-
| GitHub Copilot Workspace | GitHub 模型 | ⭐⭐ (订阅制) | ❌ |
|
|
146
|
-
|
|
147
|
-
**greenbump 的独特优势**:
|
|
148
|
-
- 可以用 DeepSeek(便宜 10 倍)跑简单升级
|
|
149
|
-
- 可以用本地 Ollama 模型(完全免费,但效果差)
|
|
150
|
-
- 严格的成本上限(不会因为 LLM 死循环烧光预算)
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
## 五、真实世界实用性评估
|
|
155
|
-
|
|
156
|
-
### greenbump 的「甜蜜点」场景
|
|
157
|
-
✅ **最适合**:
|
|
158
|
-
1. **简单 API 重命名**(如 `lodash.get()` → `_.get()`)
|
|
159
|
-
- 成功率:90%+
|
|
160
|
-
- 时间节省:30 分钟 → 3 分钟
|
|
161
|
-
|
|
162
|
-
2. **小规模依赖升级**(1-5 个文件改动)
|
|
163
|
-
- 成功率:70-80%
|
|
164
|
-
- 成本:$0.10-$0.50 per fix
|
|
165
|
-
|
|
166
|
-
3. **有完善测试的项目**
|
|
167
|
-
- LLM 可以信任测试输出
|
|
168
|
-
- 误修复会被立即发现
|
|
169
|
-
|
|
170
|
-
⚠️ **不适合**:
|
|
171
|
-
1. **大规模重构**(如 Webpack 4 → 5,涉及 50+ 文件)
|
|
172
|
-
- LLM 上下文不够,会遗漏文件
|
|
173
|
-
- 建议:人工升级 + greenbump 修细节
|
|
174
|
-
|
|
175
|
-
2. **没测试的项目**
|
|
176
|
-
- greenbump 无法验证正确性
|
|
177
|
-
- 建议:先写测试,或用 Dependabot
|
|
178
|
-
|
|
179
|
-
3. **Runtime-only 的 bug**(如数据库查询逻辑变化)
|
|
180
|
-
- 测试通过但生产环境炸
|
|
181
|
-
- 建议:人工 review + staging 验证
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
### Renovate 的「甜蜜点」场景
|
|
186
|
-
✅ **最适合**:
|
|
187
|
-
1. **大型 monorepo**(统一管理 100+ 依赖)
|
|
188
|
-
2. **自动合并安全补丁**(配置 automerge 规则)
|
|
189
|
-
3. **复杂升级策略**(如"周一升级 dev deps,周五升级 prod deps")
|
|
190
|
-
|
|
191
|
-
⚠️ **不适合**:
|
|
192
|
-
1. **小项目**(配置成本 > 收益)
|
|
193
|
-
2. **需要快速迭代**(PR 创建后依然要人工修代码)
|
|
194
|
-
|
|
195
|
-
---
|
|
196
|
-
|
|
197
|
-
### Migratowl 的「甜蜜点」场景
|
|
198
|
-
✅ **最适合**:
|
|
199
|
-
1. **高风险生产环境**(金融、医疗)
|
|
200
|
-
2. **Major 版本跨越**(如 Django 2 → 4)
|
|
201
|
-
3. **缺少测试但不能出错**(沙盒验证兜底)
|
|
202
|
-
|
|
203
|
-
⚠️ **不适合**:
|
|
204
|
-
1. **非 Python 项目**
|
|
205
|
-
2. **预算有限**(成本是 greenbump 的 3-5 倍)
|
|
206
|
-
3. **快速迭代**(沙盒启动慢)
|
|
207
|
-
|
|
208
|
-
---
|
|
209
|
-
|
|
210
|
-
## 六、成本-收益分析
|
|
211
|
-
|
|
212
|
-
### 假设场景:一个中型 React + Node.js 项目,50 个依赖,每月升级 5 个
|
|
213
|
-
|
|
214
|
-
#### 方案 1:纯人工(Dependabot 提醒)
|
|
215
|
-
- **时间成本**:5 个依赖 × 平均 1 小时 = 5 小时/月
|
|
216
|
-
- **金钱成本**:$0
|
|
217
|
-
- **风险**:人工错误,遗漏升级
|
|
218
|
-
- **年化成本**:60 小时 = $6,000(按 $100/小时)
|
|
219
|
-
|
|
220
|
-
#### 方案 2:greenbump
|
|
221
|
-
- **时间成本**:5 个依赖 × 平均 10 分钟(跑 + review)= 50 分钟/月
|
|
222
|
-
- **金钱成本**:5 次 × $0.30 = $1.50/月(DeepSeek)
|
|
223
|
-
- **风险**:10% 误修复率,需要 code review
|
|
224
|
-
- **年化成本**:10 小时 + $18 = $1,018
|
|
225
|
-
|
|
226
|
-
**节省**:$4,982/年(83% 时间节省)
|
|
227
|
-
|
|
228
|
-
#### 方案 3:Renovate(自动合并安全补丁)
|
|
229
|
-
- **时间成本**:
|
|
230
|
-
- 初期配置:8 小时(一次性)
|
|
231
|
-
- 每月维护:30 分钟(调整规则)
|
|
232
|
-
- 人工修复 breaking change:3 个 × 1 小时 = 3 小时/月
|
|
233
|
-
- **金钱成本**:$0(self-host)
|
|
234
|
-
- **年化成本**:8 + 36 + 6 = 50 小时 = $5,000
|
|
235
|
-
|
|
236
|
-
**对比**:greenbump 在中型项目上最具成本效益
|
|
237
|
-
|
|
238
|
-
---
|
|
239
|
-
|
|
240
|
-
## 七、综合推荐
|
|
241
|
-
|
|
242
|
-
### 如果你是...
|
|
243
|
-
|
|
244
|
-
**1. 创业公司/小团队**(<10 人)
|
|
245
|
-
→ **greenbump** ⭐⭐⭐⭐⭐
|
|
246
|
-
理由:时间就是钱,快速迭代最重要
|
|
247
|
-
|
|
248
|
-
**2. 大型企业**(100+ 依赖,多团队)
|
|
249
|
-
→ **Renovate** (主) + **greenbump** (辅)
|
|
250
|
-
理由:Renovate 管策略,greenbump 修代码
|
|
251
|
-
|
|
252
|
-
**3. 开源项目维护者**
|
|
253
|
-
→ **Dependabot** ⭐⭐⭐⭐⭐
|
|
254
|
-
理由:免费 + 社区熟悉
|
|
255
|
-
|
|
256
|
-
**4. 高风险生产环境**(金融/医疗,Python)
|
|
257
|
-
→ **Migratowl** ⭐⭐⭐⭐⭐
|
|
258
|
-
理由:沙盒验证是硬需求
|
|
259
|
-
|
|
260
|
-
**5. 遗留代码库**(无测试,怕炸)
|
|
261
|
-
→ **人工升级** + code review
|
|
262
|
-
理由:任何自动化工具都不可信
|
|
263
|
-
|
|
264
|
-
---
|
|
265
|
-
|
|
266
|
-
## 八、greenbump 的改进空间
|
|
267
|
-
|
|
268
|
-
### 当前最大痛点
|
|
269
|
-
1. **验证可靠性不足**
|
|
270
|
-
- 问题:依赖用户测试覆盖率
|
|
271
|
-
- 解决:添加 `--sandbox` Docker 隔离模式
|
|
272
|
-
|
|
273
|
-
2. **复杂升级成功率低**
|
|
274
|
-
- 问题:LLM 上下文有限,大型重构会遗漏
|
|
275
|
-
- 解决:引入「多阶段升级」(先升级配置,再升级代码)
|
|
276
|
-
|
|
277
|
-
3. **成本不透明**
|
|
278
|
-
- 问题:用户不知道一次升级会花多少钱
|
|
279
|
-
- 解决:添加 `--estimate` 预估模式
|
|
280
|
-
|
|
281
|
-
### 未来可做的功能
|
|
282
|
-
1. **学习模式**:记录成功的修复模式,下次直接套用(不调 LLM)
|
|
283
|
-
2. **团队共享**:同一个依赖的升级经验,团队内复用
|
|
284
|
-
3. **Rollback 机制**:如果 PR merge 后生产环境炸了,一键回滚
|
|
285
|
-
|
|
286
|
-
---
|
|
287
|
-
|
|
288
|
-
## 结论
|
|
289
|
-
|
|
290
|
-
**greenbump 的核心价值**:
|
|
291
|
-
在「零配置」和「高度可定制」之间找到平衡,用 LLM 自动化了「升级后手动修代码」这个最痛的环节。
|
|
292
|
-
|
|
293
|
-
**适用性**:⭐⭐⭐⭐
|
|
294
|
-
- 对小型/中型项目(<50 依赖)极度友好
|
|
295
|
-
- 对大型 monorepo 需要配合 Renovate 使用
|
|
296
|
-
- 对高风险场景需要人工 review 兜底
|
|
297
|
-
|
|
298
|
-
**实用性**:⭐⭐⭐⭐
|
|
299
|
-
- 时间节省:60-80%(vs 纯人工)
|
|
300
|
-
- 成本可控:$0.10-$0.50 per fix(DeepSeek)
|
|
301
|
-
- 风险可控:needsReview 标记 + code review
|
|
302
|
-
|
|
303
|
-
**最大竞争优势**:
|
|
304
|
-
唯一支持「多语言 + 多模型 + 实际修代码」的工具。Dependabot/Renovate 只管版本号,Migratowl 只支持 Python,greenbump 填补了这个空白。
|
package/examples/greenbump.yml
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# Copy this to .github/workflows/greenbump.yml in your repo.
|
|
2
|
-
# Example GitHub Actions workflow for greenbump
|
|
3
|
-
# See https://github.com/shidesheng0218/greenbump for full documentation
|
|
4
|
-
name: greenbump
|
|
5
|
-
|
|
6
|
-
on:
|
|
7
|
-
schedule:
|
|
8
|
-
- cron: "0 6 * * 1" # every Monday 06:00 UTC
|
|
9
|
-
workflow_dispatch: # or run it by hand, optionally naming a dependency
|
|
10
|
-
inputs:
|
|
11
|
-
dependency:
|
|
12
|
-
description: "Dependency to upgrade (blank = most outdated)"
|
|
13
|
-
required: false
|
|
14
|
-
|
|
15
|
-
permissions:
|
|
16
|
-
contents: write
|
|
17
|
-
pull-requests: write
|
|
18
|
-
|
|
19
|
-
jobs:
|
|
20
|
-
bump:
|
|
21
|
-
runs-on: ubuntu-latest
|
|
22
|
-
steps:
|
|
23
|
-
- uses: actions/checkout@v4
|
|
24
|
-
|
|
25
|
-
- uses: actions/setup-node@v4
|
|
26
|
-
with:
|
|
27
|
-
node-version: 20
|
|
28
|
-
|
|
29
|
-
- run: npm ci
|
|
30
|
-
|
|
31
|
-
- uses: shidesheng0218/greenbump@v0
|
|
32
|
-
with:
|
|
33
|
-
anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
34
|
-
dependency: ${{ inputs.dependency }}
|
|
35
|
-
# Optional: use a PAT instead of the default token if you want
|
|
36
|
-
# the generated PR to trigger your CI workflows.
|
|
37
|
-
# github-token: ${{ secrets.GREENBUMP_PAT }}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "legacy-repo",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Sample repo with a deliberately outdated dependency, for greenbump e2e testing.",
|
|
5
|
-
"private": true,
|
|
6
|
-
"scripts": {
|
|
7
|
-
"test": "node test.js"
|
|
8
|
-
},
|
|
9
|
-
"dependencies": {
|
|
10
|
-
"uuid": "3.4.0"
|
|
11
|
-
}
|
|
12
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
const assert = require("node:assert");
|
|
2
|
-
const { newId } = require("./src/id.js");
|
|
3
|
-
|
|
4
|
-
// A real test that asserts behaviour — greenbump must NOT weaken this to pass.
|
|
5
|
-
const id = newId();
|
|
6
|
-
assert.strictEqual(typeof id, "string", "id must be a string");
|
|
7
|
-
assert.match(
|
|
8
|
-
id,
|
|
9
|
-
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,
|
|
10
|
-
"id must be a valid UUID",
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
const a = newId();
|
|
14
|
-
const b = newId();
|
|
15
|
-
assert.notStrictEqual(a, b, "ids must be unique");
|
|
16
|
-
|
|
17
|
-
console.log("ok - newId() returns unique valid UUIDs");
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// Breaks on uuid v7+: the `uuid/v4` subpath import was removed.
|
|
2
|
-
// Note the different local name (`generateId`) from models/todo.js —
|
|
3
|
-
// a fix agent that patches one call site and re-runs tests will only
|
|
4
|
-
// see this one break AFTER fixing todo.js, one at a time.
|
|
5
|
-
const generateId = require("uuid/v4");
|
|
6
|
-
|
|
7
|
-
function createUser(name) {
|
|
8
|
-
return { id: generateId(), name };
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
module.exports = { createUser };
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "multi-file-repo",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Sample repo where one dependency upgrade breaks 3 separate files, for greenbump e2e testing of search_code.",
|
|
5
|
-
"private": true,
|
|
6
|
-
"scripts": {
|
|
7
|
-
"test": "node test.js"
|
|
8
|
-
},
|
|
9
|
-
"dependencies": {
|
|
10
|
-
"uuid": "3.4.0"
|
|
11
|
-
}
|
|
12
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
// Breaks on uuid v7+: the `uuid/v4` subpath import was removed.
|
|
2
|
-
// Yet another local name (`newUUID`) — third independent call site.
|
|
3
|
-
const newUUID = require("uuid/v4");
|
|
4
|
-
|
|
5
|
-
function startSession(userId) {
|
|
6
|
-
return { token: newUUID(), userId, startedAt: Date.now() };
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
module.exports = { startSession };
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
const assert = require("node:assert");
|
|
2
|
-
const { createTodo } = require("./models/todo.js");
|
|
3
|
-
const { createUser } = require("./models/user.js");
|
|
4
|
-
const { startSession } = require("./services/session.js");
|
|
5
|
-
|
|
6
|
-
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
7
|
-
|
|
8
|
-
const todo = createTodo("write tests");
|
|
9
|
-
assert.match(todo.id, UUID_RE, "todo id must be a valid UUID");
|
|
10
|
-
assert.strictEqual(todo.title, "write tests");
|
|
11
|
-
|
|
12
|
-
const user = createUser("ada");
|
|
13
|
-
assert.match(user.id, UUID_RE, "user id must be a valid UUID");
|
|
14
|
-
|
|
15
|
-
const session = startSession(user.id);
|
|
16
|
-
assert.match(session.token, UUID_RE, "session token must be a valid UUID");
|
|
17
|
-
assert.strictEqual(session.userId, user.id);
|
|
18
|
-
|
|
19
|
-
console.log("ok - todo, user, and session all generate valid UUIDs");
|