greenbump 0.2.1 → 0.5.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/CHANGELOG.md +82 -0
- package/README.md +2 -0
- package/action-dist/index.cjs +1054 -19
- package/competitive-analysis.md +304 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/engine/change-detector.js +152 -0
- package/dist/engine/change-detector.js.map +1 -0
- package/dist/engine/dep-graph.js +101 -0
- package/dist/engine/dep-graph.js.map +1 -0
- package/dist/engine/git.js +10 -0
- package/dist/engine/git.js.map +1 -1
- 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 +71 -2
- package/dist/engine/run.js.map +1 -1
- 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/staged-fix.js +108 -0
- package/dist/engine/staged-fix.js.map +1 -0
- package/dist/engine/stages.js +125 -0
- package/dist/engine/stages.js.map +1 -0
- package/dist/engine/verify.js +121 -0
- package/dist/engine/verify.js.map +1 -0
- package/dist/format.js +20 -0
- package/dist/format.js.map +1 -1
- package/optimization-roadmap.md +772 -0
- package/package.json +4 -1
|
@@ -0,0 +1,304 @@
|
|
|
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/dist/cli.js
CHANGED
|
@@ -38,6 +38,10 @@ program
|
|
|
38
38
|
.option("--fail-fast", "abort a batch on the first hard failure instead of continuing")
|
|
39
39
|
.option("--workspace <path>", "disambiguate a dep that's outdated at different versions in multiple workspace packages")
|
|
40
40
|
.option("--scan", "list outdated dependencies without upgrading (read-only mode)")
|
|
41
|
+
.option("--sandbox", "run tests in isolated Docker container (requires Docker)")
|
|
42
|
+
.option("--services <services>", "comma-separated list of services to start (postgres,redis,mongodb)")
|
|
43
|
+
.option("--keep-container", "keep Docker container after run for debugging")
|
|
44
|
+
.option("--detect-regressions", "check for performance regressions after upgrade")
|
|
41
45
|
.action(async (deps, opts) => {
|
|
42
46
|
if (opts.listProviders) {
|
|
43
47
|
console.log("Built-in provider presets:\n" + listProviders());
|
|
@@ -110,6 +114,10 @@ program
|
|
|
110
114
|
maxTokens: opts.maxTokens ? parseInt(opts.maxTokens, 10) : undefined,
|
|
111
115
|
noGit: opts.git === false,
|
|
112
116
|
onLog: log,
|
|
117
|
+
sandbox: opts.sandbox,
|
|
118
|
+
services: opts.services ? opts.services.split(",").map((s) => s.trim()) : undefined,
|
|
119
|
+
keepContainer: opts.keepContainer,
|
|
120
|
+
detectRegressions: opts.detectRegressions,
|
|
113
121
|
};
|
|
114
122
|
const isBatch = opts.all || deps.length > 1;
|
|
115
123
|
try {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
/**
|
|
5
|
+
* Detect suspicious changes in the git diff that might indicate the LLM
|
|
6
|
+
* "cheated" to make tests pass (e.g., commenting out tests, deleting code).
|
|
7
|
+
*/
|
|
8
|
+
export async function detectSuspiciousChanges(cwd) {
|
|
9
|
+
const changes = [];
|
|
10
|
+
try {
|
|
11
|
+
// Get git diff for staged + unstaged changes
|
|
12
|
+
const { stdout: diff } = await execAsync("git diff HEAD", { cwd });
|
|
13
|
+
if (!diff.trim())
|
|
14
|
+
return []; // No changes
|
|
15
|
+
// 1. Detect test file modifications
|
|
16
|
+
const testFileChanges = detectTestFileChanges(diff);
|
|
17
|
+
changes.push(...testFileChanges);
|
|
18
|
+
// 2. Detect large deletions (>50 lines in a single file)
|
|
19
|
+
const largeDeletions = detectLargeDeletions(diff);
|
|
20
|
+
changes.push(...largeDeletions);
|
|
21
|
+
// 3. Detect commented-out tests (heuristic)
|
|
22
|
+
const commentedTests = detectCommentedTests(diff);
|
|
23
|
+
changes.push(...commentedTests);
|
|
24
|
+
// 4. Detect removed test cases (it('...') or test('...') deletions)
|
|
25
|
+
const removedTests = detectRemovedTests(diff);
|
|
26
|
+
changes.push(...removedTests);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
// Git command failed (e.g., not a git repo) - ignore
|
|
30
|
+
}
|
|
31
|
+
return changes;
|
|
32
|
+
}
|
|
33
|
+
function detectTestFileChanges(diff) {
|
|
34
|
+
const changes = [];
|
|
35
|
+
const testFilePattern = /\.(test|spec)\.(ts|js|tsx|jsx)$/;
|
|
36
|
+
// Parse diff to find modified files
|
|
37
|
+
const fileHeaderPattern = /^diff --git a\/(.+?) b\/(.+?)$/gm;
|
|
38
|
+
let match;
|
|
39
|
+
while ((match = fileHeaderPattern.exec(diff)) !== null) {
|
|
40
|
+
const filePath = match[2];
|
|
41
|
+
if (testFilePattern.test(filePath)) {
|
|
42
|
+
changes.push({
|
|
43
|
+
type: "test-modified",
|
|
44
|
+
file: filePath,
|
|
45
|
+
description: "Test file was modified during fix loop",
|
|
46
|
+
severity: "critical",
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return changes;
|
|
51
|
+
}
|
|
52
|
+
function detectLargeDeletions(diff) {
|
|
53
|
+
const changes = [];
|
|
54
|
+
// Split diff by file
|
|
55
|
+
const fileDiffs = diff.split(/^diff --git /m).slice(1); // First element is empty
|
|
56
|
+
for (const fileDiff of fileDiffs) {
|
|
57
|
+
const fileMatch = fileDiff.match(/^a\/(.+?) b\/(.+?)$/m);
|
|
58
|
+
if (!fileMatch)
|
|
59
|
+
continue;
|
|
60
|
+
const filePath = fileMatch[2];
|
|
61
|
+
// Count deletions (lines starting with -)
|
|
62
|
+
const lines = fileDiff.split("\n");
|
|
63
|
+
let deletions = 0;
|
|
64
|
+
for (const line of lines) {
|
|
65
|
+
if (line.startsWith("-") && !line.startsWith("---")) {
|
|
66
|
+
deletions++;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (deletions > 50) {
|
|
70
|
+
changes.push({
|
|
71
|
+
type: "large-deletion",
|
|
72
|
+
file: filePath,
|
|
73
|
+
description: `${deletions} lines deleted (possible over-aggressive fix)`,
|
|
74
|
+
severity: "warning",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return changes;
|
|
79
|
+
}
|
|
80
|
+
function detectCommentedTests(diff) {
|
|
81
|
+
const changes = [];
|
|
82
|
+
// Look for patterns like:
|
|
83
|
+
// - it('should work', () => {
|
|
84
|
+
// + // it('should work', () => {
|
|
85
|
+
// or
|
|
86
|
+
// - test('should work', () => {
|
|
87
|
+
// + /* test('should work', () => {
|
|
88
|
+
const lines = diff.split("\n");
|
|
89
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
90
|
+
const prevLine = lines[i];
|
|
91
|
+
const currLine = lines[i + 1];
|
|
92
|
+
if (prevLine.startsWith("-") &&
|
|
93
|
+
/\b(it|test|describe)\(/.test(prevLine) &&
|
|
94
|
+
currLine.startsWith("+") &&
|
|
95
|
+
(/^[+]\s*(\/\/|\/\*)/.test(currLine) ||
|
|
96
|
+
currLine.includes("// it(") ||
|
|
97
|
+
currLine.includes("// test(") ||
|
|
98
|
+
currLine.includes("/* it(") ||
|
|
99
|
+
currLine.includes("/* test("))) {
|
|
100
|
+
// Extract approximate location
|
|
101
|
+
const fileContext = findFileContext(diff, i);
|
|
102
|
+
changes.push({
|
|
103
|
+
type: "test-commented",
|
|
104
|
+
file: fileContext || "unknown",
|
|
105
|
+
description: "Test case appears to have been commented out",
|
|
106
|
+
severity: "critical",
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return changes;
|
|
111
|
+
}
|
|
112
|
+
function detectRemovedTests(diff) {
|
|
113
|
+
const changes = [];
|
|
114
|
+
// Look for deleted test cases (lines starting with - that contain it( or test()
|
|
115
|
+
const lines = diff.split("\n");
|
|
116
|
+
let removedTestCount = 0;
|
|
117
|
+
let currentFile = "unknown";
|
|
118
|
+
for (const line of lines) {
|
|
119
|
+
// Track current file
|
|
120
|
+
const fileMatch = line.match(/^diff --git a\/(.+?) b\/(.+?)$/);
|
|
121
|
+
if (fileMatch) {
|
|
122
|
+
currentFile = fileMatch[2];
|
|
123
|
+
removedTestCount = 0; // Reset counter for new file
|
|
124
|
+
}
|
|
125
|
+
// Check for deleted test cases
|
|
126
|
+
if (line.startsWith("-") &&
|
|
127
|
+
!line.startsWith("---") &&
|
|
128
|
+
/\b(it|test)\s*\(/.test(line)) {
|
|
129
|
+
removedTestCount++;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (removedTestCount > 0) {
|
|
133
|
+
changes.push({
|
|
134
|
+
type: "test-removed",
|
|
135
|
+
file: currentFile,
|
|
136
|
+
description: `${removedTestCount} test case(s) were deleted`,
|
|
137
|
+
severity: "critical",
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return changes;
|
|
141
|
+
}
|
|
142
|
+
function findFileContext(diff, lineIndex) {
|
|
143
|
+
// Walk backwards to find the nearest "diff --git" header
|
|
144
|
+
const lines = diff.split("\n");
|
|
145
|
+
for (let i = lineIndex; i >= 0; i--) {
|
|
146
|
+
const match = lines[i].match(/^diff --git a\/(.+?) b\/(.+?)$/);
|
|
147
|
+
if (match)
|
|
148
|
+
return match[2];
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=change-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-detector.js","sourceRoot":"","sources":["../../src/engine/change-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import madge from "madge";
|
|
2
|
+
/**
|
|
3
|
+
* Build a dependency graph for the codebase and identify which files
|
|
4
|
+
* are affected by upgrading a specific package.
|
|
5
|
+
*
|
|
6
|
+
* This helps prioritize which files to fix first in a staged fix approach.
|
|
7
|
+
*/
|
|
8
|
+
export async function buildDependencyGraph(cwd, upgradedPkg) {
|
|
9
|
+
try {
|
|
10
|
+
// Use madge to analyze dependencies
|
|
11
|
+
const result = await madge(cwd, {
|
|
12
|
+
fileExtensions: ["js", "ts", "jsx", "tsx"],
|
|
13
|
+
excludeRegExp: [/node_modules/, /dist/, /build/, /\.test\.|\.spec\./],
|
|
14
|
+
});
|
|
15
|
+
const graph = result.obj();
|
|
16
|
+
const nodes = [];
|
|
17
|
+
// Convert madge graph to our format
|
|
18
|
+
for (const [file, imports] of Object.entries(graph)) {
|
|
19
|
+
const importsList = imports;
|
|
20
|
+
// Check if this file directly imports the upgraded package
|
|
21
|
+
const usesUpgradedPkg = importsList.some((imp) => {
|
|
22
|
+
// Match import statements like: import x from 'react'
|
|
23
|
+
// or: const x = require('react')
|
|
24
|
+
return imp === upgradedPkg || imp.startsWith(`${upgradedPkg}/`);
|
|
25
|
+
});
|
|
26
|
+
nodes.push({
|
|
27
|
+
file,
|
|
28
|
+
imports: importsList,
|
|
29
|
+
usesUpgradedPkg,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return nodes;
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
// Madge might fail on certain codebases - return empty graph
|
|
36
|
+
console.warn(`Failed to build dependency graph: ${err.message}`);
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Organize files into layers based on dependency distance from the upgraded package.
|
|
42
|
+
*
|
|
43
|
+
* Layer 0: Files that directly import the upgraded package
|
|
44
|
+
* Layer 1: Files that import Layer 0 files
|
|
45
|
+
* Layer 2: Files that import Layer 1 files
|
|
46
|
+
* etc.
|
|
47
|
+
*
|
|
48
|
+
* This layering helps fix files in order: fix the "leaves" first (directly affected),
|
|
49
|
+
* then work up the dependency tree.
|
|
50
|
+
*/
|
|
51
|
+
export function organizeLayers(nodes) {
|
|
52
|
+
const layers = [];
|
|
53
|
+
const fileToLayer = new Map();
|
|
54
|
+
// Layer 0: direct users of the upgraded package
|
|
55
|
+
const layer0Files = nodes
|
|
56
|
+
.filter((n) => n.usesUpgradedPkg)
|
|
57
|
+
.map((n) => n.file);
|
|
58
|
+
if (layer0Files.length === 0) {
|
|
59
|
+
// No direct imports found - return all files as one layer
|
|
60
|
+
return [
|
|
61
|
+
{
|
|
62
|
+
level: 0,
|
|
63
|
+
files: nodes.map((n) => n.file),
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
layers.push({ level: 0, files: layer0Files });
|
|
68
|
+
layer0Files.forEach((f) => fileToLayer.set(f, 0));
|
|
69
|
+
// Build subsequent layers
|
|
70
|
+
let currentLayer = 0;
|
|
71
|
+
let remainingNodes = nodes.filter((n) => !n.usesUpgradedPkg);
|
|
72
|
+
while (remainingNodes.length > 0 && currentLayer < 10) {
|
|
73
|
+
// Cap at 10 layers to avoid infinite loops
|
|
74
|
+
currentLayer++;
|
|
75
|
+
const prevLayerFiles = layers[currentLayer - 1].files;
|
|
76
|
+
const nextLayerFiles = [];
|
|
77
|
+
for (const node of remainingNodes) {
|
|
78
|
+
// Check if this node imports any files from the previous layer
|
|
79
|
+
const importsPrevLayer = node.imports.some((imp) => prevLayerFiles.includes(imp));
|
|
80
|
+
if (importsPrevLayer) {
|
|
81
|
+
nextLayerFiles.push(node.file);
|
|
82
|
+
fileToLayer.set(node.file, currentLayer);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (nextLayerFiles.length === 0) {
|
|
86
|
+
// No more dependencies found - remaining files are unaffected
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
layers.push({ level: currentLayer, files: nextLayerFiles });
|
|
90
|
+
remainingNodes = remainingNodes.filter((n) => !fileToLayer.has(n.file));
|
|
91
|
+
}
|
|
92
|
+
return layers;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get a flat list of files to fix, ordered by dependency layer (leaves first).
|
|
96
|
+
* This is what the fix loop will iterate through.
|
|
97
|
+
*/
|
|
98
|
+
export function getPrioritizedFiles(layers) {
|
|
99
|
+
return layers.flatMap((layer) => layer.files);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=dep-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dep-graph.js","sourceRoot":"","sources":["../../src/engine/dep-graph.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/git.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { exec } from "./exec.js";
|
|
2
|
+
export { exec };
|
|
2
3
|
export async function isGitRepo(cwd) {
|
|
3
4
|
const r = await exec("git", ["rev-parse", "--is-inside-work-tree"], { cwd });
|
|
4
5
|
return r.code === 0 && r.stdout.trim() === "true";
|
|
@@ -21,6 +22,15 @@ export async function commitAll(cwd, message) {
|
|
|
21
22
|
await exec("git", ["add", "-A"], { cwd });
|
|
22
23
|
await exec("git", ["commit", "-m", message, "--no-verify"], { cwd });
|
|
23
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Create an incremental commit for a specific stage of the fix process.
|
|
27
|
+
* Used in staged fix mode to create separate commits for each stage.
|
|
28
|
+
*/
|
|
29
|
+
export async function commitStage(cwd, stageName, stageNumber, totalStages) {
|
|
30
|
+
await exec("git", ["add", "-A"], { cwd });
|
|
31
|
+
const message = `fix: stage ${stageNumber}/${totalStages} - ${stageName}\n\nAutomated by greenbump (staged fix mode).`;
|
|
32
|
+
await exec("git", ["commit", "-m", message, "--no-verify"], { cwd });
|
|
33
|
+
}
|
|
24
34
|
/** `git diff --stat` against a ref, for the PR summary. */
|
|
25
35
|
export async function diffStat(cwd, ref) {
|
|
26
36
|
const r = await exec("git", ["diff", "--stat", ref], { cwd });
|
package/dist/engine/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/engine/git.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/engine/git.ts"],"names":[],"mappings":"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"}
|