greenbump 0.4.0 → 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.
@@ -0,0 +1,241 @@
1
+ import { existsSync } from "fs";
2
+ import { join } from "path";
3
+ import { readFile } from "fs/promises";
4
+ /**
5
+ * Detect project type based on files present
6
+ */
7
+ export async function detectProjectType(cwd) {
8
+ if (existsSync(join(cwd, "package.json"))) {
9
+ return "nodejs";
10
+ }
11
+ if (existsSync(join(cwd, "requirements.txt")) ||
12
+ existsSync(join(cwd, "pyproject.toml")) ||
13
+ existsSync(join(cwd, "setup.py"))) {
14
+ return "python";
15
+ }
16
+ return "unknown";
17
+ }
18
+ /**
19
+ * Generate Dockerfile for project
20
+ */
21
+ export async function generateDockerfile(projectType, cwd) {
22
+ if (projectType === "nodejs") {
23
+ return await generateNodeJsDockerfile(cwd);
24
+ }
25
+ if (projectType === "python") {
26
+ return await generatePythonDockerfile(cwd);
27
+ }
28
+ // Fallback to Node.js
29
+ return await generateNodeJsDockerfile(cwd);
30
+ }
31
+ /**
32
+ * Generate Node.js Dockerfile
33
+ */
34
+ async function generateNodeJsDockerfile(cwd) {
35
+ const hasPnpm = existsSync(join(cwd, "pnpm-lock.yaml"));
36
+ const hasYarn = existsSync(join(cwd, "yarn.lock"));
37
+ let installCmd = "npm ci";
38
+ let copyLockFile = "COPY package*.json ./";
39
+ if (hasPnpm) {
40
+ installCmd = "corepack enable && pnpm install --frozen-lockfile";
41
+ copyLockFile = "COPY package*.json pnpm-lock.yaml ./";
42
+ }
43
+ else if (hasYarn) {
44
+ installCmd = "yarn install --frozen-lockfile";
45
+ copyLockFile = "COPY package*.json yarn.lock ./";
46
+ }
47
+ return `FROM node:20-slim
48
+
49
+ WORKDIR /workspace
50
+
51
+ # Copy package files
52
+ ${copyLockFile}
53
+
54
+ # Install dependencies
55
+ RUN ${installCmd}
56
+
57
+ # Copy source code
58
+ COPY . .
59
+
60
+ # Build if build script exists
61
+ RUN if grep -q '"build":' package.json; then npm run build || true; fi
62
+
63
+ # Default command: run tests
64
+ CMD ["npm", "test"]
65
+ `;
66
+ }
67
+ /**
68
+ * Generate Python Dockerfile
69
+ */
70
+ async function generatePythonDockerfile(cwd) {
71
+ const hasRequirements = existsSync(join(cwd, "requirements.txt"));
72
+ const hasPyproject = existsSync(join(cwd, "pyproject.toml"));
73
+ let installCmd = "";
74
+ let copyFiles = "";
75
+ if (hasRequirements) {
76
+ copyFiles = "COPY requirements*.txt ./";
77
+ installCmd = "pip install --no-cache-dir -r requirements.txt";
78
+ }
79
+ else if (hasPyproject) {
80
+ copyFiles = "COPY pyproject.toml setup.py* ./";
81
+ installCmd = "pip install --no-cache-dir -e .";
82
+ }
83
+ return `FROM python:3.11-slim
84
+
85
+ WORKDIR /workspace
86
+
87
+ # Copy dependency files
88
+ ${copyFiles}
89
+
90
+ # Install dependencies
91
+ RUN ${installCmd}
92
+
93
+ # Copy source code
94
+ COPY . .
95
+
96
+ # Default command: run tests
97
+ CMD ["pytest"]
98
+ `;
99
+ }
100
+ /**
101
+ * Generate docker-compose.yml for services
102
+ */
103
+ export async function generateComposeFile(services) {
104
+ const serviceConfigs = services.map(getServiceConfig).filter((config) => config !== null);
105
+ if (serviceConfigs.length === 0) {
106
+ return "";
107
+ }
108
+ const servicesYaml = serviceConfigs.map(formatServiceConfig).join("\n");
109
+ return `version: '3.8'
110
+
111
+ services:
112
+ ${servicesYaml}
113
+
114
+ networks:
115
+ default:
116
+ name: greenbump_network
117
+ `;
118
+ }
119
+ /**
120
+ * Get service configuration
121
+ */
122
+ function getServiceConfig(serviceName) {
123
+ const configs = {
124
+ postgres: {
125
+ name: "postgres",
126
+ image: "postgres:16-alpine",
127
+ ports: ["5432:5432"],
128
+ environment: {
129
+ POSTGRES_USER: "test",
130
+ POSTGRES_PASSWORD: "test",
131
+ POSTGRES_DB: "test",
132
+ },
133
+ healthcheck: {
134
+ test: ["CMD-SHELL", "pg_isready -U test"],
135
+ interval: "5s",
136
+ timeout: "5s",
137
+ retries: 5,
138
+ },
139
+ },
140
+ mysql: {
141
+ name: "mysql",
142
+ image: "mysql:8",
143
+ ports: ["3306:3306"],
144
+ environment: {
145
+ MYSQL_ROOT_PASSWORD: "test",
146
+ MYSQL_DATABASE: "test",
147
+ },
148
+ healthcheck: {
149
+ test: ["CMD", "mysqladmin", "ping", "-h", "localhost"],
150
+ interval: "5s",
151
+ timeout: "5s",
152
+ retries: 5,
153
+ },
154
+ },
155
+ redis: {
156
+ name: "redis",
157
+ image: "redis:7-alpine",
158
+ ports: ["6379:6379"],
159
+ healthcheck: {
160
+ test: ["CMD", "redis-cli", "ping"],
161
+ interval: "5s",
162
+ timeout: "5s",
163
+ retries: 5,
164
+ },
165
+ },
166
+ mongodb: {
167
+ name: "mongodb",
168
+ image: "mongo:7",
169
+ ports: ["27017:27017"],
170
+ environment: {
171
+ MONGO_INITDB_ROOT_USERNAME: "test",
172
+ MONGO_INITDB_ROOT_PASSWORD: "test",
173
+ },
174
+ healthcheck: {
175
+ test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"],
176
+ interval: "5s",
177
+ timeout: "5s",
178
+ retries: 5,
179
+ },
180
+ },
181
+ };
182
+ return configs[serviceName] || null;
183
+ }
184
+ /**
185
+ * Format service config as YAML
186
+ */
187
+ function formatServiceConfig(config) {
188
+ const lines = [` ${config.name}:`];
189
+ lines.push(` image: ${config.image}`);
190
+ if (config.environment) {
191
+ lines.push(" environment:");
192
+ for (const [key, value] of Object.entries(config.environment)) {
193
+ lines.push(` ${key}: ${value}`);
194
+ }
195
+ }
196
+ if (config.ports.length > 0) {
197
+ lines.push(" ports:");
198
+ for (const port of config.ports) {
199
+ lines.push(` - "${port}"`);
200
+ }
201
+ }
202
+ lines.push(" healthcheck:");
203
+ lines.push(` test: ${JSON.stringify(config.healthcheck.test)}`);
204
+ lines.push(` interval: ${config.healthcheck.interval}`);
205
+ lines.push(` timeout: ${config.healthcheck.timeout}`);
206
+ lines.push(` retries: ${config.healthcheck.retries}`);
207
+ return lines.join("\n");
208
+ }
209
+ /**
210
+ * Check if project has build script
211
+ */
212
+ export async function hasBuildScript(cwd) {
213
+ const pkgPath = join(cwd, "package.json");
214
+ if (!existsSync(pkgPath))
215
+ return false;
216
+ try {
217
+ const content = await readFile(pkgPath, "utf-8");
218
+ const pkg = JSON.parse(content);
219
+ return pkg.scripts?.build !== undefined;
220
+ }
221
+ catch {
222
+ return false;
223
+ }
224
+ }
225
+ /**
226
+ * Check if project has test script
227
+ */
228
+ export async function hasTestScript(cwd) {
229
+ const pkgPath = join(cwd, "package.json");
230
+ if (!existsSync(pkgPath))
231
+ return false;
232
+ try {
233
+ const content = await readFile(pkgPath, "utf-8");
234
+ const pkg = JSON.parse(content);
235
+ return pkg.scripts?.test !== undefined;
236
+ }
237
+ catch {
238
+ return false;
239
+ }
240
+ }
241
+ //# sourceMappingURL=template-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-generator.js","sourceRoot":"","sources":["../../../src/engine/sandbox/template-generator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "greenbump",
3
- "version": "0.4.0",
3
+ "version": "0.5.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": {