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
@@ -0,0 +1,62 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { exitCodeFor, overallExitCode } from "./exitcode.js";
4
+ function summary(overrides) {
5
+ return {
6
+ dep: "lodash",
7
+ from: "4.17.20",
8
+ to: "4.17.21",
9
+ packageManager: "npm",
10
+ baselineGreen: true,
11
+ neededFix: false,
12
+ fixed: true,
13
+ unverifiable: false,
14
+ needsReview: false,
15
+ committed: true,
16
+ rounds: 0,
17
+ usage: { inputTokens: 0, outputTokens: 0 },
18
+ editedFiles: [],
19
+ testFilesTouched: [],
20
+ durationMs: 0,
21
+ ...overrides,
22
+ };
23
+ }
24
+ test("exitCodeFor: clean success is 0", () => {
25
+ assert.equal(exitCodeFor(summary({})), 0);
26
+ });
27
+ test("exitCodeFor: unfixed after a fix attempt is 2", () => {
28
+ assert.equal(exitCodeFor(summary({ neededFix: true, fixed: false })), 2);
29
+ });
30
+ test("exitCodeFor: needsReview (test file touched) is 3", () => {
31
+ assert.equal(exitCodeFor(summary({ neededFix: true, fixed: true, needsReview: true })), 3);
32
+ });
33
+ test("exitCodeFor: needsReview from unverifiable is 3", () => {
34
+ assert.equal(exitCodeFor(summary({ unverifiable: true, needsReview: true })), 3);
35
+ });
36
+ test("exitCodeFor: unfixed (2) takes priority over needsReview when both would apply", () => {
37
+ // neededFix && !fixed always wins — needsReview never overloads that state.
38
+ assert.equal(exitCodeFor(summary({ neededFix: true, fixed: false, needsReview: true })), 2);
39
+ });
40
+ test("overallExitCode: a hard failure (1) outranks everything else", () => {
41
+ const failure = { dep: "axios", error: "boom", fatal: true };
42
+ const items = [summary({}), summary({ neededFix: true, fixed: false }), failure];
43
+ assert.equal(overallExitCode(items), 1);
44
+ });
45
+ test("overallExitCode: unfixed (2) outranks needsReview (3) when no hard failure", () => {
46
+ const items = [
47
+ summary({ neededFix: true, fixed: true, needsReview: true }),
48
+ summary({ neededFix: true, fixed: false }),
49
+ ];
50
+ assert.equal(overallExitCode(items), 2);
51
+ });
52
+ test("overallExitCode: needsReview (3) outranks clean success (0)", () => {
53
+ const items = [summary({}), summary({ unverifiable: true, needsReview: true })];
54
+ assert.equal(overallExitCode(items), 3);
55
+ });
56
+ test("overallExitCode: all clean is 0", () => {
57
+ assert.equal(overallExitCode([summary({}), summary({})]), 0);
58
+ });
59
+ test("overallExitCode: empty batch is 0", () => {
60
+ assert.equal(overallExitCode([]), 0);
61
+ });
62
+ //# sourceMappingURL=exitcode.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exitcode.test.js","sourceRoot":"","sources":["../src/exitcode.test.ts"],"names":[],"mappings":"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"}
package/dist/format.js CHANGED
@@ -47,6 +47,11 @@ export function printSummaryBox(summary, write) {
47
47
  if (summary.neededFix) {
48
48
  write(bar(`${pc.dim("fix rounds")} ${summary.rounds}`));
49
49
  write(bar(`${pc.dim("tokens")} ${summary.usage.inputTokens.toLocaleString()} in / ${summary.usage.outputTokens.toLocaleString()} out`));
50
+ // Show which tier fixed it — the key cost signal for v0.6.0
51
+ if (summary.fixedByTier && summary.fixedByTier < 4) {
52
+ const tierNames = ["", "codemod (free)", "learned pattern (free)", "cached fix (free)"];
53
+ write(bar(`${pc.dim("fixed by")} ${pc.green(tierNames[summary.fixedByTier])}`));
54
+ }
50
55
  write(bar(`${pc.dim("files edited")} ${summary.editedFiles.length}`));
51
56
  for (const f of summary.editedFiles.slice(0, 6))
52
57
  write(bar(` ${pc.cyan("·")} ${f}`));
@@ -78,6 +83,16 @@ export function printSummaryBox(summary, write) {
78
83
  write(bar(` ${pc.dim(`… +${summary.staticAnalysisWarnings.length - 3} more`)}`));
79
84
  }
80
85
  }
86
+ if (summary.apiChanges && summary.apiChanges.length > 0) {
87
+ write(bar(""));
88
+ write(bar(pc.yellow(`⚠ API surface changes (exports affected):`)));
89
+ for (const change of summary.apiChanges.slice(0, 5)) {
90
+ write(bar(` ${pc.yellow("·")} ${change}`));
91
+ }
92
+ if (summary.apiChanges.length > 5) {
93
+ write(bar(` ${pc.dim(`… +${summary.apiChanges.length - 5} more`)}`));
94
+ }
95
+ }
81
96
  }
82
97
  if (summary.branch) {
83
98
  write(bar(""));
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { readFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { buildReport, writeReport, REPORT_SCHEMA_VERSION } from "./report.js";
6
+ import { withTmpDir } from "./test-utils.js";
7
+ function summary(overrides = {}) {
8
+ return {
9
+ dep: "lodash",
10
+ from: "4.17.20",
11
+ to: "4.17.21",
12
+ packageManager: "npm",
13
+ baselineGreen: true,
14
+ neededFix: false,
15
+ fixed: true,
16
+ unverifiable: false,
17
+ needsReview: false,
18
+ committed: true,
19
+ rounds: 0,
20
+ usage: { inputTokens: 0, outputTokens: 0 },
21
+ editedFiles: [],
22
+ testFilesTouched: [],
23
+ durationMs: 0,
24
+ ...overrides,
25
+ };
26
+ }
27
+ test("buildReport: wraps a single run in the same array envelope as a batch", () => {
28
+ const envelope = buildReport([summary()]);
29
+ assert.equal(envelope.schemaVersion, REPORT_SCHEMA_VERSION);
30
+ assert.ok(Array.isArray(envelope.runs));
31
+ assert.equal(envelope.runs.length, 1);
32
+ assert.ok(typeof envelope.generatedAt === "string" && !Number.isNaN(Date.parse(envelope.generatedAt)));
33
+ });
34
+ test("buildReport: batch of results, mixing successes and failures, keeps the array shape", () => {
35
+ const failure = { dep: "axios", error: "install failed", fatal: true };
36
+ const envelope = buildReport([summary({ dep: "lodash" }), failure]);
37
+ assert.equal(envelope.runs.length, 2);
38
+ });
39
+ test("writeReport: round-trips through disk with schema and fields intact", async () => {
40
+ await withTmpDir(async (dir) => {
41
+ const failure = { dep: "axios", error: "install failed", fatal: true };
42
+ const envelope = buildReport([summary({ dep: "lodash", rounds: 3 }), failure]);
43
+ const path = join(dir, "report.json");
44
+ await writeReport(path, envelope);
45
+ const raw = await readFile(path, "utf8");
46
+ const parsed = JSON.parse(raw);
47
+ assert.equal(parsed.schemaVersion, 1);
48
+ assert.equal(parsed.runs.length, 2);
49
+ assert.equal(parsed.runs[0].dep, "lodash");
50
+ assert.equal(parsed.runs[0].rounds, 3);
51
+ assert.equal(parsed.runs[1].dep, "axios");
52
+ assert.equal(parsed.runs[1].error, "install failed");
53
+ assert.equal(parsed.runs[1].fatal, true);
54
+ });
55
+ });
56
+ //# sourceMappingURL=report.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.test.js","sourceRoot":"","sources":["../src/report.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,14 @@
1
1
  {
2
2
  "name": "greenbump",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Upgrade a dependency and let an AI agent fix the code it breaks — until CI is green. The Renovate that actually mends your code.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "greenbump": "dist/cli.js"
8
8
  },
9
+ "files": [
10
+ "dist"
11
+ ],
9
12
  "engines": {
10
13
  "node": ">=20"
11
14
  },
@@ -41,14 +44,14 @@
41
44
  "commander": "^14.0.0",
42
45
  "madge": "^8.0.0",
43
46
  "openai": "^4.77.0",
44
- "picocolors": "^1.1.1"
47
+ "picocolors": "^1.1.1",
48
+ "typescript": "^5.7.0"
45
49
  },
46
50
  "devDependencies": {
47
51
  "@types/madge": "^5.0.3",
48
52
  "@types/node": "^22.10.0",
49
53
  "esbuild": "^0.24.0",
50
54
  "glob": "^13.0.6",
51
- "tsx": "^4.19.0",
52
- "typescript": "^5.7.0"
55
+ "tsx": "^4.19.0"
53
56
  }
54
57
  }
package/CHANGELOG.md DELETED
@@ -1,136 +0,0 @@
1
- # Changelog
2
-
3
- All notable changes to this project are documented here. Format follows
4
- [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
-
6
- ## [Unreleased] - v0.5.0
7
-
8
- ### Added
9
- - **Docker sandbox isolation**: Run tests in isolated Docker containers with `--sandbox` flag
10
- - Auto-generates Dockerfile for Node.js and Python projects
11
- - Eliminates environment pollution and matches CI environment
12
- - Supports custom base images via configuration
13
- - **Database integration testing**: Auto-detect and start required services
14
- - Supports PostgreSQL, MySQL, Redis, MongoDB via docker-compose
15
- - `--services` flag to manually specify services (e.g., `--services postgres,redis`)
16
- - Automatic service detection from package.json, docker-compose.yml, and .env files
17
- - Health check wait with configurable timeout
18
- - **Performance regression detection**: Compare metrics before/after upgrade with `--detect-regressions`
19
- - Tracks install time, build time, test time, bundle size, memory usage
20
- - Configurable thresholds (default: build 20%, bundle 15%, test 30%)
21
- - Automatic warning when regressions exceed thresholds
22
- - Sets `needsReview` flag when performance degrades significantly
23
- - New CLI flags:
24
- - `--sandbox`: Enable Docker sandbox mode
25
- - `--services <list>`: Comma-separated services to start
26
- - `--keep-container`: Keep container after run for debugging
27
- - `--detect-regressions`: Enable performance regression detection
28
- - New modules:
29
- - `src/engine/sandbox/` (orchestrator, docker-manager, template-generator, service-detector)
30
- - `src/engine/perf/` (metrics, regression)
31
-
32
- ### Changed
33
- - `RunOptions` now includes sandbox and performance detection options
34
- - `RunSummary` extended with `sandboxResult` and `performanceRegression` fields
35
- - Enhanced verification pipeline: baseline → upgrade → fix → static analysis → sandbox → performance
36
-
37
- ### Impact
38
- - **Zero environment ambiguity**: Docker isolation eliminates "works on my machine" issues
39
- - **Production-grade verification**: Database integration tests catch real-world breakage
40
- - **Performance quality gates**: Automatically flag upgrades that degrade performance
41
- - Target accuracy: 95%+ (up from 90% in v0.4.0)
42
- - Positions greenbump as most thorough automated upgrade tool vs Dependabot/Renovate
43
-
44
- ### Requirements
45
- - Docker must be installed and running for `--sandbox` mode
46
- - docker-compose recommended for multi-service testing
47
- - Graceful fallback to local verification if Docker unavailable
48
-
49
- ## [0.4.0] - 2026-08-17
50
-
51
- ### Added
52
- - **Dependency graph analysis**: Use madge to build dependency graph and identify affected files
53
- - **Staged fix strategy**: Organize fixes into stages (Configuration → Type Definitions → Source Code)
54
- - **Incremental commits**: Each stage commits separately, allowing rollback to last successful stage
55
- - New modules: `dep-graph.ts`, `stages.ts`, `staged-fix.ts`
56
- - `commitStage()` helper in git.ts for incremental commits
57
-
58
- ### Changed
59
- - Foundation for `--staged` flag (will be exposed in CLI in future release)
60
- - Improved fix success rate for complex upgrades (target: 20-40% → 50-70%)
61
-
62
- ### Technical Details
63
- - Uses madge for static dependency analysis
64
- - Three-stage fix pipeline: config files first, then type definitions, then source code
65
- - Each stage validates independently before committing
66
- - Falls back to single-stage fix if dependency graph unavailable
67
-
68
- ## [0.3.0] - 2026-08-17
69
-
70
- ### Added
71
- - **Static analysis verification**: Run TypeScript (`tsc --noEmit`) and ESLint checks after fix loop
72
- - **Change detection warnings**: Automatically flag suspicious changes in git diff
73
- - Test file modifications (critical severity)
74
- - Large deletions >50 lines (warning severity)
75
- - Commented-out or removed test cases (critical severity)
76
- - Display static analysis and change detection warnings in summary output
77
- - Set `needsReview` flag when critical issues detected
78
-
79
- ### Changed
80
- - `RunSummary` now includes `suspiciousChanges` and `staticAnalysisWarnings` fields
81
- - Enhanced verification: fixes must pass type checks (TypeScript projects) in addition to tests
82
-
83
- ### Impact
84
- - Reduces false positive fix rate from 10-20% → 5-10% (50% improvement)
85
- - Improves user trust by catching LLM "cheating" (commenting tests, deleting code)
86
- - TypeScript type error detection: 0% → 95%
87
-
88
- ## [0.2.1]
89
-
90
- ### Added
91
- - `--scan` flag: list outdated dependencies without upgrading (read-only mode)
92
- - Risk boundaries documentation in README (when to use greenbump vs manual review)
93
- - Competitor comparison table (vs Dependabot, Renovate, Migratowl)
94
- - CI smoke tests for real toolchains (npm, pip, cargo)
95
- - Options table updated with `--scan`, `--all`, `--group`, `--max-tokens`
96
-
97
- ### Changed
98
- - GitHub Action branding icon from `arrow-up-circle` to `refresh-cw`
99
- - npm package excludes test files via `.npmignore` (reduced from 116 to 114 files)
100
-
101
- ## [0.2.0]
102
-
103
- ### Added
104
- - Batch upgrades: `--all` (every outdated dep) and multi-dep args, with `--group <name>`
105
- to combine several deps into one branch/PR, and `--fail-fast` to abort a batch on the
106
- first hard failure.
107
- - Monorepo/workspace support: detects npm/yarn `workspaces` and pnpm's
108
- `pnpm-workspace.yaml`, resolving ambiguous dependency names via `--workspace`.
109
- - `needsReview` field on run summaries, surfaced as CLI exit code 3 (distinct from exit
110
- code 2 for an unfixed upgrade) — flags runs where a human should look before merging
111
- (a test file was touched to get green, the run was unverifiable, or a `--max-tokens`
112
- budget was hit).
113
- - `--max-tokens`: hard cap on total tokens spent by the fix loop. Stops the loop and
114
- flags `needsReview` instead of silently overspending.
115
- - `--report-file <path>`: persist a JSON report (schema-versioned) of the run(s).
116
- - GitHub Action: PR draft/label updates driven by `needsReview`, new `review-label`
117
- input (default `needs-review`), and `report-file` input.
118
- - Parser unit tests for the 7 ecosystems that had none: npm, pnpm, pip, uv, pipenv,
119
- swiftpm, elm.
120
-
121
- ### Changed
122
- - Clarified in the docs and in `EcosystemAdapter.verified`'s own type comment that
123
- `verified: true` is a self-reported, one-time manual smoke test by the maintainer —
124
- not an automated, CI-backed guarantee.
125
-
126
- ### Fixed
127
- - A CI-only flaky test in `checks.test.ts` caused by cross-stream (stdout/stderr)
128
- write-ordering not being guaranteed when appended into one combined buffer.
129
-
130
- ## [0.1.0]
131
-
132
- Initial release: single-dependency upgrade via `greenbump <dep>` or the GitHub Action,
133
- auto-detecting the ecosystem (npm, Yarn, pnpm, pip, Poetry, uv, Pipenv, Cargo, Go
134
- modules, Bundler, Composer, Gradle, Maven, NuGet, Mix, Pub, Swift Package Manager,
135
- CocoaPods, Conan, Elm), running the project's build/test, and handing any breakage to
136
- an AI fix agent (Anthropic/OpenAI-compatible providers) until checks pass again.
package/CONTRIBUTING.md DELETED
@@ -1,52 +0,0 @@
1
- # Contributing
2
-
3
- ## Setup
4
-
5
- ```bash
6
- npm install
7
- npm run build
8
- npm test
9
- ```
10
-
11
- `npm test` builds the project then runs every `*.test.js` file under `dist/`
12
- with Node's built-in test runner. Some tests (`git.test.ts`) create real
13
- temporary git repositories and shell out to the actual `git` binary — no
14
- mocking — so they need `git` on `PATH` but touch nothing outside `os.tmpdir()`.
15
-
16
- ## Adding or fixing an ecosystem adapter
17
-
18
- Each package manager lives in its own file under
19
- `src/engine/ecosystems/<id>.ts` and implements the `EcosystemAdapter`
20
- interface (`src/engine/ecosystems/types.ts`): `detect`, `outdated`, `install`,
21
- `defaultCheckCommands`.
22
-
23
- If you're fixing a parser bug, please:
24
- 1. Reproduce it against the *real* CLI output, not a guessed format — most
25
- existing bugs here came from a test fixture that didn't match what the
26
- real tool actually prints (e.g. `mix hex.outdated`'s "Only" column, or
27
- `pod outdated`'s `(latest version X)` suffix).
28
- 2. Add or update the corresponding case in
29
- `src/engine/ecosystems/parsers.test.ts` with a comment explaining the
30
- real-world quirk, not just the happy path.
31
- 3. If you have the toolchain installed locally, run the adapter against a
32
- throwaway project to confirm `detect`/`outdated`/`install` work end to end
33
- before setting `verified: true`.
34
-
35
- ## Code style
36
-
37
- - No unnecessary abstractions — match the size of the existing adapters.
38
- - Don't add error handling for cases that can't happen; only validate at
39
- actual boundaries (parsing untrusted CLI/API output, user-supplied paths).
40
- - Keep PRs scoped: a parser fix doesn't need to also refactor the adapter
41
- around it.
42
-
43
- ## Reporting a bug in a specific ecosystem
44
-
45
- Include:
46
- - The ecosystem id (`--ecosystem <id>` or auto-detected)
47
- - The exact manifest/lockfile involved (redact anything private)
48
- - The raw output of the underlying CLI command that greenbump would have
49
- parsed (e.g. `npm outdated --json`, `pod outdated`)
50
-
51
- For security issues, see [SECURITY.md](SECURITY.md) instead of opening a
52
- public issue.
package/SECURITY.md DELETED
@@ -1,38 +0,0 @@
1
- # Security Policy
2
-
3
- ## Reporting a vulnerability
4
-
5
- Please do **not** open a public GitHub issue for security vulnerabilities.
6
-
7
- Instead, report it privately via GitHub's
8
- [private vulnerability reporting](https://github.com/shidesheng0218/greenbump/security/advisories/new)
9
- (https://github.com/shidesheng0218/greenbump), or by
10
- emailing the maintainer directly if that's not enabled yet.
11
-
12
- Include:
13
- - A description of the issue and its impact
14
- - Steps to reproduce
15
- - The version/commit affected
16
-
17
- We'll acknowledge reports as quickly as we can and credit you in the fix
18
- unless you'd prefer otherwise.
19
-
20
- ## Scope and known risk areas
21
-
22
- greenbump is a CLI/GitHub Action that:
23
- - Runs shell commands from your project's own package manager (`npm`,
24
- `poetry`, `cargo`, etc.) against your working directory.
25
- - Gives an LLM-driven agent tool access (`read_file`, `write_file`,
26
- `search_code`, `run_check`) scoped to the project directory — see
27
- `src/agent/fixer.ts`'s `safePath()` for the path-escape guard.
28
- - Sends your build/test failure output, and optionally dependency changelogs,
29
- to the LLM provider you configure (your own API key — nothing is sent to
30
- any greenbump-operated server).
31
-
32
- If you find a way for the fix agent to escape the project directory, run
33
- arbitrary commands beyond your configured build/test scripts, or exfiltrate
34
- data beyond what's needed for the fix loop, that's a valid report.
35
-
36
- Vulnerabilities in third-party dependencies (`@anthropic-ai/sdk`, `openai`,
37
- `commander`, etc.) should be reported upstream, though we're happy to hear
38
- about them too if they materially affect greenbump.