@iloom/cli 0.3.4 → 0.4.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 +13 -3
- package/dist/{BranchNamingService-A77VI6AI.js → BranchNamingService-TOM2KAUT.js} +4 -3
- package/dist/ClaudeContextManager-VEGJTS5E.js +16 -0
- package/dist/ClaudeService-ICSHJMQ5.js +15 -0
- package/dist/GitHubService-RPM27GWD.js +12 -0
- package/dist/{LoomLauncher-ZV3ZZIBA.js → LoomLauncher-SJBZFZXE.js} +25 -22
- package/dist/LoomLauncher-SJBZFZXE.js.map +1 -0
- package/dist/PromptTemplateManager-2TDZAUC6.js +9 -0
- package/dist/README.md +13 -3
- package/dist/{SettingsManager-I2LRCW2A.js → SettingsManager-FJFU6JJD.js} +7 -3
- package/dist/SettingsMigrationManager-EH3J2TCN.js +10 -0
- package/dist/{chunk-UJL4HI2R.js → chunk-3NFBZRPR.js} +2 -2
- package/dist/chunk-6UIGZD2N.js +20 -0
- package/dist/chunk-6UIGZD2N.js.map +1 -0
- package/dist/{chunk-RIEO2WML.js → chunk-74VMN2KC.js} +26 -2
- package/dist/chunk-74VMN2KC.js.map +1 -0
- package/dist/{chunk-OYF4VIFI.js → chunk-75B2HZZ5.js} +147 -22
- package/dist/chunk-75B2HZZ5.js.map +1 -0
- package/dist/{chunk-PGPI5LR4.js → chunk-ADDNFQJ4.js} +7 -21
- package/dist/chunk-ADDNFQJ4.js.map +1 -0
- package/dist/{chunk-AKUJXDNW.js → chunk-F4J6KEL6.js} +3 -3
- package/dist/{chunk-DLHA5VQ3.js → chunk-HD5SUKI2.js} +36 -179
- package/dist/chunk-HD5SUKI2.js.map +1 -0
- package/dist/chunk-HHDSIE72.js +667 -0
- package/dist/chunk-HHDSIE72.js.map +1 -0
- package/dist/{chunk-OXAM2WVC.js → chunk-HVGQP44L.js} +21 -1
- package/dist/chunk-HVGQP44L.js.map +1 -0
- package/dist/{chunk-RW54ZMBM.js → chunk-JJUPY5MM.js} +2 -2
- package/dist/{chunk-UAN4A3YU.js → chunk-KM3W7YQX.js} +11 -11
- package/dist/{chunk-3RUPPQRG.js → chunk-KO2FOMHL.js} +43 -2
- package/dist/{chunk-3RUPPQRG.js.map → chunk-KO2FOMHL.js.map} +1 -1
- package/dist/{chunk-2MAIX45J.js → chunk-LTNDJMTH.js} +104 -43
- package/dist/chunk-LTNDJMTH.js.map +1 -0
- package/dist/{chunk-2CXREBLZ.js → chunk-M5XUCTTJ.js} +8 -6
- package/dist/chunk-M5XUCTTJ.js.map +1 -0
- package/dist/{chunk-4XIDC3NF.js → chunk-MD6HA5IK.js} +2 -2
- package/dist/chunk-MLS5FAV7.js +189 -0
- package/dist/chunk-MLS5FAV7.js.map +1 -0
- package/dist/{chunk-2IJEMXOB.js → chunk-NFVFVYAP.js} +419 -427
- package/dist/chunk-NFVFVYAP.js.map +1 -0
- package/dist/{chunk-OC4H6HJD.js → chunk-O7WHXLCB.js} +2 -2
- package/dist/{chunk-M7JJCX53.js → chunk-OEGECBFS.js} +20 -20
- package/dist/chunk-OEGECBFS.js.map +1 -0
- package/dist/{chunk-MKWYLDFK.js → chunk-OF7BNW4D.js} +43 -3
- package/dist/chunk-OF7BNW4D.js.map +1 -0
- package/dist/{chunk-SUOXY5WJ.js → chunk-P2WZIDF3.js} +5 -5
- package/dist/chunk-P2WZIDF3.js.map +1 -0
- package/dist/{chunk-PA6Q6AWM.js → chunk-PSFVTBM7.js} +2 -2
- package/dist/chunk-QHA67Q7A.js +281 -0
- package/dist/chunk-QHA67Q7A.js.map +1 -0
- package/dist/{chunk-ZM3CFL5L.js → chunk-QRBOPFAA.js} +3 -3
- package/dist/{chunk-IFB4Z76W.js → chunk-S44CHE3G.js} +13 -12
- package/dist/chunk-S44CHE3G.js.map +1 -0
- package/dist/{chunk-CE26YH2U.js → chunk-SJ2GZ6RF.js} +48 -50
- package/dist/chunk-SJ2GZ6RF.js.map +1 -0
- package/dist/{chunk-SSCQCCJ7.js → chunk-THF25ICZ.js} +2 -2
- package/dist/{chunk-5Q3NDNNV.js → chunk-TR5MC2U6.js} +153 -6
- package/dist/chunk-TR5MC2U6.js.map +1 -0
- package/dist/{chunk-5VK4NRSF.js → chunk-UNXRACJ7.js} +35 -36
- package/dist/chunk-UNXRACJ7.js.map +1 -0
- package/dist/{chunk-GEHQXLEI.js → chunk-UYVWLISQ.js} +18 -35
- package/dist/chunk-UYVWLISQ.js.map +1 -0
- package/dist/{chunk-OSCLCMDG.js → chunk-UYWAESOT.js} +3 -3
- package/dist/{chunk-ZT3YZB4K.js → chunk-VBFDVGAE.js} +12 -12
- package/dist/chunk-VBFDVGAE.js.map +1 -0
- package/dist/{chunk-CDZERT7Z.js → chunk-VWNS6DH5.js} +48 -4
- package/dist/chunk-VWNS6DH5.js.map +1 -0
- package/dist/{chunk-CFFQ2Z7A.js → chunk-WUQQNE63.js} +2 -2
- package/dist/{claude-W52VKI6L.js → claude-X7EBJRB2.js} +8 -5
- package/dist/{cleanup-H4VXU3C3.js → cleanup-7QVPYBJJ.js} +133 -122
- package/dist/cleanup-7QVPYBJJ.js.map +1 -0
- package/dist/cli.js +901 -425
- package/dist/cli.js.map +1 -1
- package/dist/{color-F7RU6B6Z.js → color-ZPIIUADB.js} +3 -3
- package/dist/{contribute-Y7IQV5QY.js → contribute-RZYCYUDX.js} +8 -6
- package/dist/{contribute-Y7IQV5QY.js.map → contribute-RZYCYUDX.js.map} +1 -1
- package/dist/dev-server-LOY7YWCP.js +298 -0
- package/dist/dev-server-LOY7YWCP.js.map +1 -0
- package/dist/{feedback-XTUCKJNT.js → feedback-562KPG5U.js} +13 -12
- package/dist/{feedback-XTUCKJNT.js.map → feedback-562KPG5U.js.map} +1 -1
- package/dist/{git-IYA53VIC.js → git-OXJACVAU.js} +16 -4
- package/dist/hooks/iloom-hook.js +258 -0
- package/dist/{ignite-T74RYXCA.js → ignite-VSIPGKKG.js} +245 -39
- package/dist/ignite-VSIPGKKG.js.map +1 -0
- package/dist/index.d.ts +459 -124
- package/dist/index.js +740 -210
- package/dist/index.js.map +1 -1
- package/dist/init-SCR2LQ4A.js +21 -0
- package/dist/{installation-detector-VARGFFRZ.js → installation-detector-6R6YOFVZ.js} +3 -3
- package/dist/mcp/issue-management-server.js +2 -1
- package/dist/mcp/issue-management-server.js.map +1 -1
- package/dist/neon-helpers-L5CXQ5CT.js +11 -0
- package/dist/{open-UMXANW5S.js → open-CX7HUE26.js} +12 -10
- package/dist/{open-UMXANW5S.js.map → open-CX7HUE26.js.map} +1 -1
- package/dist/projects-6DTNDVLH.js +73 -0
- package/dist/projects-6DTNDVLH.js.map +1 -0
- package/dist/{prompt-QALMYTVC.js → prompt-A7GGRHSY.js} +3 -3
- package/dist/prompts/init-prompt.txt +49 -0
- package/dist/prompts/issue-prompt.txt +110 -8
- package/dist/prompts/regular-prompt.txt +90 -0
- package/dist/prompts/session-summary-prompt.txt +82 -0
- package/dist/{rebase-VJ2VKR6R.js → rebase-55URTXZC.js} +11 -9
- package/dist/{rebase-VJ2VKR6R.js.map → rebase-55URTXZC.js.map} +1 -1
- package/dist/{remote-VUNCQZ6J.js → remote-73TZ2ADI.js} +3 -3
- package/dist/{run-MJYY4PUT.js → run-DP2U2CA2.js} +12 -10
- package/dist/{run-MJYY4PUT.js.map → run-DP2U2CA2.js.map} +1 -1
- package/dist/schema/settings.schema.json +49 -0
- package/dist/summary-J3CJSM7L.js +244 -0
- package/dist/summary-J3CJSM7L.js.map +1 -0
- package/dist/{test-git-IT5EWQ5C.js → test-git-QLAIBJLX.js} +6 -4
- package/dist/{test-git-IT5EWQ5C.js.map → test-git-QLAIBJLX.js.map} +1 -1
- package/dist/{test-prefix-NPWDPUUH.js → test-prefix-6YM2ZOON.js} +6 -4
- package/dist/{test-prefix-NPWDPUUH.js.map → test-prefix-6YM2ZOON.js.map} +1 -1
- package/dist/{test-tabs-PRMRSHKI.js → test-tabs-JGO3VOXJ.js} +4 -4
- package/dist/{test-webserver-DAHONWCS.js → test-webserver-VPNLAFZ3.js} +2 -2
- package/dist/{update-4TDDUR5K.js → update-LETF5ASC.js} +4 -4
- package/dist/{update-notifier-QEX3CJHA.js → update-notifier-H55ZK7NU.js} +3 -3
- package/package.json +6 -6
- package/dist/ClaudeContextManager-BN7RE5ZQ.js +0 -15
- package/dist/ClaudeService-DLYLJUPA.js +0 -14
- package/dist/GitHubService-FZHHBOFG.js +0 -11
- package/dist/LoomLauncher-ZV3ZZIBA.js.map +0 -1
- package/dist/PromptTemplateManager-6HH3PVXV.js +0 -9
- package/dist/SettingsMigrationManager-TJ7UWZG5.js +0 -10
- package/dist/chunk-2CXREBLZ.js.map +0 -1
- package/dist/chunk-2IJEMXOB.js.map +0 -1
- package/dist/chunk-2MAIX45J.js.map +0 -1
- package/dist/chunk-5Q3NDNNV.js.map +0 -1
- package/dist/chunk-5VK4NRSF.js.map +0 -1
- package/dist/chunk-CDZERT7Z.js.map +0 -1
- package/dist/chunk-CE26YH2U.js.map +0 -1
- package/dist/chunk-DLHA5VQ3.js.map +0 -1
- package/dist/chunk-GEHQXLEI.js.map +0 -1
- package/dist/chunk-IFB4Z76W.js.map +0 -1
- package/dist/chunk-M7JJCX53.js.map +0 -1
- package/dist/chunk-MKWYLDFK.js.map +0 -1
- package/dist/chunk-OXAM2WVC.js.map +0 -1
- package/dist/chunk-OYF4VIFI.js.map +0 -1
- package/dist/chunk-PGPI5LR4.js.map +0 -1
- package/dist/chunk-RIEO2WML.js.map +0 -1
- package/dist/chunk-SUOXY5WJ.js.map +0 -1
- package/dist/chunk-ZT3YZB4K.js.map +0 -1
- package/dist/cleanup-H4VXU3C3.js.map +0 -1
- package/dist/ignite-T74RYXCA.js.map +0 -1
- package/dist/init-4FHTAM3F.js +0 -19
- package/dist/logger-MKYH4UDV.js +0 -12
- package/dist/neon-helpers-77PBPGJ5.js +0 -10
- package/dist/update-notifier-QEX3CJHA.js.map +0 -1
- /package/dist/{BranchNamingService-A77VI6AI.js.map → BranchNamingService-TOM2KAUT.js.map} +0 -0
- /package/dist/{ClaudeContextManager-BN7RE5ZQ.js.map → ClaudeContextManager-VEGJTS5E.js.map} +0 -0
- /package/dist/{ClaudeService-DLYLJUPA.js.map → ClaudeService-ICSHJMQ5.js.map} +0 -0
- /package/dist/{GitHubService-FZHHBOFG.js.map → GitHubService-RPM27GWD.js.map} +0 -0
- /package/dist/{PromptTemplateManager-6HH3PVXV.js.map → PromptTemplateManager-2TDZAUC6.js.map} +0 -0
- /package/dist/{SettingsManager-I2LRCW2A.js.map → SettingsManager-FJFU6JJD.js.map} +0 -0
- /package/dist/{SettingsMigrationManager-TJ7UWZG5.js.map → SettingsMigrationManager-EH3J2TCN.js.map} +0 -0
- /package/dist/{chunk-UJL4HI2R.js.map → chunk-3NFBZRPR.js.map} +0 -0
- /package/dist/{chunk-AKUJXDNW.js.map → chunk-F4J6KEL6.js.map} +0 -0
- /package/dist/{chunk-RW54ZMBM.js.map → chunk-JJUPY5MM.js.map} +0 -0
- /package/dist/{chunk-UAN4A3YU.js.map → chunk-KM3W7YQX.js.map} +0 -0
- /package/dist/{chunk-4XIDC3NF.js.map → chunk-MD6HA5IK.js.map} +0 -0
- /package/dist/{chunk-OC4H6HJD.js.map → chunk-O7WHXLCB.js.map} +0 -0
- /package/dist/{chunk-PA6Q6AWM.js.map → chunk-PSFVTBM7.js.map} +0 -0
- /package/dist/{chunk-ZM3CFL5L.js.map → chunk-QRBOPFAA.js.map} +0 -0
- /package/dist/{chunk-SSCQCCJ7.js.map → chunk-THF25ICZ.js.map} +0 -0
- /package/dist/{chunk-OSCLCMDG.js.map → chunk-UYWAESOT.js.map} +0 -0
- /package/dist/{chunk-CFFQ2Z7A.js.map → chunk-WUQQNE63.js.map} +0 -0
- /package/dist/{claude-W52VKI6L.js.map → claude-X7EBJRB2.js.map} +0 -0
- /package/dist/{color-F7RU6B6Z.js.map → color-ZPIIUADB.js.map} +0 -0
- /package/dist/{git-IYA53VIC.js.map → git-OXJACVAU.js.map} +0 -0
- /package/dist/{init-4FHTAM3F.js.map → init-SCR2LQ4A.js.map} +0 -0
- /package/dist/{installation-detector-VARGFFRZ.js.map → installation-detector-6R6YOFVZ.js.map} +0 -0
- /package/dist/{logger-MKYH4UDV.js.map → neon-helpers-L5CXQ5CT.js.map} +0 -0
- /package/dist/{neon-helpers-77PBPGJ5.js.map → prompt-A7GGRHSY.js.map} +0 -0
- /package/dist/{prompt-QALMYTVC.js.map → remote-73TZ2ADI.js.map} +0 -0
- /package/dist/{test-tabs-PRMRSHKI.js.map → test-tabs-JGO3VOXJ.js.map} +0 -0
- /package/dist/{test-webserver-DAHONWCS.js.map → test-webserver-VPNLAFZ3.js.map} +0 -0
- /package/dist/{update-4TDDUR5K.js.map → update-LETF5ASC.js.map} +0 -0
- /package/dist/{remote-VUNCQZ6J.js.map → update-notifier-H55ZK7NU.js.map} +0 -0
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
promptConfirmation
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-SJ2GZ6RF.js";
|
|
5
5
|
import {
|
|
6
|
-
|
|
7
|
-
} from "./chunk-
|
|
6
|
+
getLogger
|
|
7
|
+
} from "./chunk-6UIGZD2N.js";
|
|
8
8
|
|
|
9
9
|
// src/lib/providers/NeonProvider.ts
|
|
10
10
|
import { execa } from "execa";
|
|
11
|
-
var logger = createLogger({ prefix: "\u{1F5C2}\uFE0F" });
|
|
12
11
|
function validateNeonConfig(config) {
|
|
13
12
|
if (!config.projectId) {
|
|
14
13
|
return {
|
|
@@ -34,7 +33,7 @@ var NeonProvider = class {
|
|
|
34
33
|
constructor(config) {
|
|
35
34
|
this.config = config;
|
|
36
35
|
this._isConfigured = false;
|
|
37
|
-
|
|
36
|
+
getLogger().debug("NeonProvider initialized with config:", {
|
|
38
37
|
projectId: config.projectId,
|
|
39
38
|
parentBranch: config.parentBranch,
|
|
40
39
|
hasProjectId: !!config.projectId,
|
|
@@ -42,8 +41,8 @@ var NeonProvider = class {
|
|
|
42
41
|
});
|
|
43
42
|
const validation = validateNeonConfig(config);
|
|
44
43
|
if (!validation.valid) {
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
getLogger().debug(`NeonProvider not configured: ${validation.error}`);
|
|
45
|
+
getLogger().debug("Neon database branching will not be used");
|
|
47
46
|
this._isConfigured = false;
|
|
48
47
|
} else {
|
|
49
48
|
this._isConfigured = true;
|
|
@@ -68,10 +67,10 @@ var NeonProvider = class {
|
|
|
68
67
|
throw new Error("NeonProvider is not configured. Check databaseProviders.neon configuration in .iloom/settings.json");
|
|
69
68
|
}
|
|
70
69
|
const command = `neon ${args.join(" ")}`;
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
getLogger().debug(`Executing Neon CLI command: ${command}`);
|
|
71
|
+
getLogger().debug(`Project ID being used: ${this.config.projectId}`);
|
|
73
72
|
if (cwd) {
|
|
74
|
-
|
|
73
|
+
getLogger().debug(`Working directory: ${cwd}`);
|
|
75
74
|
}
|
|
76
75
|
const result = await execa("neon", args, {
|
|
77
76
|
timeout: 3e4,
|
|
@@ -204,13 +203,13 @@ var NeonProvider = class {
|
|
|
204
203
|
async findPreviewBranch(branchName, cwd) {
|
|
205
204
|
const slashPattern = `preview/${branchName}`;
|
|
206
205
|
if (await this.branchExists(slashPattern, cwd)) {
|
|
207
|
-
|
|
206
|
+
getLogger().info(`Found Vercel preview database: ${slashPattern}`);
|
|
208
207
|
return slashPattern;
|
|
209
208
|
}
|
|
210
209
|
const sanitized = this.sanitizeBranchName(branchName);
|
|
211
210
|
const underscorePattern = `preview_${sanitized}`;
|
|
212
211
|
if (await this.branchExists(underscorePattern, cwd)) {
|
|
213
|
-
|
|
212
|
+
getLogger().info(`Found Vercel preview database: ${underscorePattern}`);
|
|
214
213
|
return underscorePattern;
|
|
215
214
|
}
|
|
216
215
|
return null;
|
|
@@ -224,7 +223,7 @@ var NeonProvider = class {
|
|
|
224
223
|
* @param cwd - Optional working directory to run commands from
|
|
225
224
|
*/
|
|
226
225
|
async removeExpiration(branchName, cwd) {
|
|
227
|
-
|
|
226
|
+
getLogger().info(`Removing expiration date from branch: ${branchName}`);
|
|
228
227
|
await this.executeNeonCommand([
|
|
229
228
|
"branches",
|
|
230
229
|
"set-expiration",
|
|
@@ -232,7 +231,7 @@ var NeonProvider = class {
|
|
|
232
231
|
"--project-id",
|
|
233
232
|
this.config.projectId
|
|
234
233
|
], cwd);
|
|
235
|
-
|
|
234
|
+
getLogger().success(`Expiration date removed from ${branchName}`);
|
|
236
235
|
}
|
|
237
236
|
/**
|
|
238
237
|
* Create a new database branch
|
|
@@ -249,14 +248,14 @@ var NeonProvider = class {
|
|
|
249
248
|
const previewBranch = await this.findPreviewBranch(name, cwd);
|
|
250
249
|
if (previewBranch) {
|
|
251
250
|
const connectionString2 = await this.getConnectionString(previewBranch, cwd);
|
|
252
|
-
|
|
251
|
+
getLogger().success(`Using existing Vercel preview database: ${previewBranch}`);
|
|
253
252
|
return connectionString2;
|
|
254
253
|
}
|
|
255
254
|
const sanitizedName = this.sanitizeBranchName(name);
|
|
256
255
|
const parentBranch = fromBranch ?? this.config.parentBranch;
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
256
|
+
getLogger().info("Creating Neon database branch...");
|
|
257
|
+
getLogger().info(` Parent branch: ${parentBranch}`);
|
|
258
|
+
getLogger().info(` New branch: ${sanitizedName}`);
|
|
260
259
|
try {
|
|
261
260
|
await this.executeNeonCommand([
|
|
262
261
|
"branches",
|
|
@@ -271,9 +270,9 @@ var NeonProvider = class {
|
|
|
271
270
|
} catch (error) {
|
|
272
271
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
273
272
|
if (errorMessage.toLowerCase().includes("expiration") && errorMessage.toLowerCase().includes("child")) {
|
|
274
|
-
|
|
273
|
+
getLogger().warn("Parent branch has an expiration date - removing it to allow child branch creation");
|
|
275
274
|
await this.removeExpiration(parentBranch, cwd);
|
|
276
|
-
|
|
275
|
+
getLogger().info("Retrying database branch creation...");
|
|
277
276
|
await this.executeNeonCommand([
|
|
278
277
|
"branches",
|
|
279
278
|
"create",
|
|
@@ -288,8 +287,8 @@ var NeonProvider = class {
|
|
|
288
287
|
throw error;
|
|
289
288
|
}
|
|
290
289
|
}
|
|
291
|
-
|
|
292
|
-
|
|
290
|
+
getLogger().success("Database branch created successfully");
|
|
291
|
+
getLogger().info("Getting connection string for new database branch...");
|
|
293
292
|
const connectionString = await this.getConnectionString(sanitizedName, cwd);
|
|
294
293
|
return connectionString;
|
|
295
294
|
}
|
|
@@ -307,16 +306,16 @@ var NeonProvider = class {
|
|
|
307
306
|
if (isPreview) {
|
|
308
307
|
const previewBranch = await this.findPreviewBranch(name, cwd);
|
|
309
308
|
if (previewBranch) {
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
309
|
+
getLogger().warn(`Found Vercel preview database: ${previewBranch}`);
|
|
310
|
+
getLogger().warn("Preview databases are managed by Vercel and will be cleaned up automatically");
|
|
311
|
+
getLogger().warn("Manual deletion may interfere with Vercel's preview deployments");
|
|
313
312
|
const confirmed = await promptConfirmation(
|
|
314
313
|
"Delete preview database anyway?",
|
|
315
314
|
false
|
|
316
315
|
);
|
|
317
316
|
if (confirmed) {
|
|
318
317
|
try {
|
|
319
|
-
|
|
318
|
+
getLogger().info(`Deleting Vercel preview database: ${previewBranch}`);
|
|
320
319
|
await this.executeNeonCommand([
|
|
321
320
|
"branches",
|
|
322
321
|
"delete",
|
|
@@ -324,7 +323,7 @@ var NeonProvider = class {
|
|
|
324
323
|
"--project-id",
|
|
325
324
|
this.config.projectId
|
|
326
325
|
], cwd);
|
|
327
|
-
|
|
326
|
+
getLogger().success("Preview database deleted successfully");
|
|
328
327
|
return {
|
|
329
328
|
success: true,
|
|
330
329
|
deleted: true,
|
|
@@ -333,7 +332,7 @@ var NeonProvider = class {
|
|
|
333
332
|
};
|
|
334
333
|
} catch (error) {
|
|
335
334
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
336
|
-
|
|
335
|
+
getLogger().error(`Failed to delete preview database: ${errorMessage}`);
|
|
337
336
|
return {
|
|
338
337
|
success: false,
|
|
339
338
|
deleted: false,
|
|
@@ -343,7 +342,7 @@ var NeonProvider = class {
|
|
|
343
342
|
};
|
|
344
343
|
}
|
|
345
344
|
} else {
|
|
346
|
-
|
|
345
|
+
getLogger().info("Skipping preview database deletion");
|
|
347
346
|
return {
|
|
348
347
|
success: true,
|
|
349
348
|
deleted: false,
|
|
@@ -354,11 +353,11 @@ var NeonProvider = class {
|
|
|
354
353
|
}
|
|
355
354
|
}
|
|
356
355
|
}
|
|
357
|
-
|
|
356
|
+
getLogger().info(`Checking for Neon database branch: ${sanitizedName}`);
|
|
358
357
|
try {
|
|
359
358
|
const exists = await this.branchExists(sanitizedName, cwd);
|
|
360
359
|
if (!exists) {
|
|
361
|
-
|
|
360
|
+
getLogger().info(`No database branch found for '${name}'`);
|
|
362
361
|
return {
|
|
363
362
|
success: true,
|
|
364
363
|
deleted: false,
|
|
@@ -366,7 +365,7 @@ var NeonProvider = class {
|
|
|
366
365
|
branchName: sanitizedName
|
|
367
366
|
};
|
|
368
367
|
}
|
|
369
|
-
|
|
368
|
+
getLogger().info(`Deleting Neon database branch: ${sanitizedName}`);
|
|
370
369
|
await this.executeNeonCommand([
|
|
371
370
|
"branches",
|
|
372
371
|
"delete",
|
|
@@ -374,7 +373,7 @@ var NeonProvider = class {
|
|
|
374
373
|
"--project-id",
|
|
375
374
|
this.config.projectId
|
|
376
375
|
], cwd);
|
|
377
|
-
|
|
376
|
+
getLogger().success("Database branch deleted successfully");
|
|
378
377
|
return {
|
|
379
378
|
success: true,
|
|
380
379
|
deleted: true,
|
|
@@ -383,7 +382,7 @@ var NeonProvider = class {
|
|
|
383
382
|
};
|
|
384
383
|
} catch (error) {
|
|
385
384
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
386
|
-
|
|
385
|
+
getLogger().error(`Failed to delete database branch: ${errorMessage}`);
|
|
387
386
|
return {
|
|
388
387
|
success: false,
|
|
389
388
|
deleted: false,
|
|
@@ -426,7 +425,7 @@ var NeonProvider = class {
|
|
|
426
425
|
async getBranchNameFromConnectionString(connectionString, cwd) {
|
|
427
426
|
const endpointId = this.extractEndpointId(connectionString);
|
|
428
427
|
if (!endpointId) {
|
|
429
|
-
|
|
428
|
+
getLogger().debug("Could not extract endpoint ID from connection string");
|
|
430
429
|
return null;
|
|
431
430
|
}
|
|
432
431
|
return this.getBranchNameFromEndpoint(endpointId, cwd);
|
|
@@ -446,4 +445,4 @@ function createNeonProviderFromSettings(settings) {
|
|
|
446
445
|
export {
|
|
447
446
|
createNeonProviderFromSettings
|
|
448
447
|
};
|
|
449
|
-
//# sourceMappingURL=chunk-
|
|
448
|
+
//# sourceMappingURL=chunk-UNXRACJ7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/providers/NeonProvider.ts","../src/utils/neon-helpers.ts"],"sourcesContent":["import { execa, type ExecaError } from 'execa'\nimport type { DatabaseProvider } from '../../types/index.js'\nimport { getLogger } from '../../utils/logger-context.js'\nimport { promptConfirmation } from '../../utils/prompt.js'\n\ninterface NeonBranch {\n name: string\n id: string\n [key: string]: unknown\n}\n\nexport interface NeonConfig {\n projectId: string\n parentBranch: string\n}\n\n/**\n * Validate Neon configuration\n * Checks that required configuration values are present\n */\nexport function validateNeonConfig(config: {\n projectId?: string\n parentBranch?: string\n}): { valid: boolean; error?: string } {\n if (!config.projectId) {\n return {\n valid: false,\n error: 'Neon projectId is required. Configure in .iloom/settings.json under databaseProviders.neon',\n }\n }\n\n if (!config.parentBranch) {\n return {\n valid: false,\n error: 'Neon parentBranch is required. Configure in .iloom/settings.json under databaseProviders.neon',\n }\n }\n\n // Basic validation for project ID format (should start with appropriate prefix)\n if (!/^[a-zA-Z0-9-]+$/.test(config.projectId)) {\n return {\n valid: false,\n error: 'Neon projectId contains invalid characters',\n }\n }\n\n return { valid: true }\n}\n\n/**\n * Neon database provider implementation\n * Ports functionality from bash/utils/neon-utils.sh\n */\nexport class NeonProvider implements DatabaseProvider {\n private _isConfigured: boolean = false\n\n constructor(private config: NeonConfig) {\n getLogger().debug('NeonProvider initialized with config:', {\n projectId: config.projectId,\n parentBranch: config.parentBranch,\n hasProjectId: !!config.projectId,\n hasParentBranch: !!config.parentBranch,\n })\n\n // Validate config but don't throw - just mark as not configured\n // This allows the provider to be instantiated even when Neon is not being used\n const validation = validateNeonConfig(config)\n if (!validation.valid) {\n getLogger().debug(`NeonProvider not configured: ${validation.error}`)\n getLogger().debug('Neon database branching will not be used')\n this._isConfigured = false\n } else {\n this._isConfigured = true\n }\n }\n\n /**\n * Check if provider is properly configured\n * Returns true if projectId and parentBranch are valid in settings\n */\n isConfigured(): boolean {\n return this._isConfigured\n }\n\n /**\n * Execute a Neon CLI command and return stdout\n * Throws an error if the command fails\n *\n * @param args - Command arguments to pass to neon CLI\n * @param cwd - Optional working directory to run the command from (defaults to current directory)\n */\n private async executeNeonCommand(args: string[], cwd?: string): Promise<string> {\n // Check if provider is properly configured\n if (!this._isConfigured) {\n throw new Error('NeonProvider is not configured. Check databaseProviders.neon configuration in .iloom/settings.json')\n }\n\n // Log the exact command being executed for debugging\n const command = `neon ${args.join(' ')}`\n getLogger().debug(`Executing Neon CLI command: ${command}`)\n getLogger().debug(`Project ID being used: ${this.config.projectId}`)\n if (cwd) {\n getLogger().debug(`Working directory: ${cwd}`)\n }\n\n const result = await execa('neon', args, {\n timeout: 30000,\n encoding: 'utf8',\n stdio: 'pipe',\n ...(cwd && { cwd }),\n })\n return result.stdout\n }\n\n /**\n * Check if neon CLI is available\n * Ports: check_neon_cli() from bash/utils/neon-utils.sh:18-23\n */\n async isCliAvailable(): Promise<boolean> {\n try {\n await execa('command', ['-v', 'neon'], {\n timeout: 5000,\n shell: true,\n })\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Check if user is authenticated with Neon CLI\n * Ports: check_neon_auth() from bash/utils/neon-utils.sh:25-36\n *\n * @param cwd - Optional working directory to run the command from (prevents issues with deleted directories)\n * @throws Error if authentication check fails for reasons other than not being authenticated\n */\n async isAuthenticated(cwd?: string): Promise<boolean> {\n const cliAvailable = await this.isCliAvailable()\n if (!cliAvailable) {\n return false\n }\n\n try {\n await execa('neon', ['me'], {\n timeout: 10000,\n stdio: 'pipe',\n ...(cwd && { cwd }),\n })\n return true\n } catch (error) {\n const execaError = error as ExecaError\n const stderr = execaError.stderr?.trim() ?? ''\n\n // Check for authentication failure patterns (should return false, not throw)\n const isAuthError =\n stderr.toLowerCase().includes('not authenticated') ||\n stderr.toLowerCase().includes('not logged in') ||\n stderr.toLowerCase().includes('authentication required') ||\n stderr.toLowerCase().includes('login required')\n\n if (isAuthError) {\n return false\n }\n\n // For any other error, let it bubble up\n throw error\n }\n }\n\n /**\n * Sanitize branch name for Neon (replace slashes with underscores)\n * Ports: sanitize_neon_branch_name() from bash/utils/neon-utils.sh:11-15\n */\n sanitizeBranchName(branchName: string): string {\n return branchName.replace(/\\//g, '_')\n }\n\n /**\n * Extract endpoint ID from Neon connection string\n * Pattern matches: ep-abc-123 or ep-abc-123-pooler\n * Returns: ep-abc-123 (without -pooler suffix)\n * Used by: get_neon_branch_name() from bash/utils/neon-utils.sh:294\n */\n private extractEndpointId(connectionString: string): string | null {\n // First, extract the full host part between @ and first dot\n // Examples:\n // @ep-abc123.us-east-1.neon.tech -> ep-abc123\n // @ep-abc123-pooler.us-east-1.neon.tech -> ep-abc123-pooler\n const hostMatch = connectionString.match(/@(ep-[a-z0-9-]+)\\./)\n if (!hostMatch?.[1]) {\n return null\n }\n\n const fullEndpoint = hostMatch[1]\n // Remove -pooler suffix if present\n return fullEndpoint.replace(/-pooler$/, '')\n }\n\n /**\n * List all branches in the Neon project\n * Ports: list_neon_branches() from bash/utils/neon-utils.sh:63-74\n *\n * @param cwd - Optional working directory to run commands from\n */\n async listBranches(cwd?: string): Promise<string[]> {\n const output = await this.executeNeonCommand([\n 'branches',\n 'list',\n '--project-id',\n this.config.projectId,\n '--output',\n 'json',\n ], cwd)\n\n const branches: NeonBranch[] = JSON.parse(output)\n return branches.map(branch => branch.name)\n }\n\n /**\n * Check if a branch exists\n * Ports: check_neon_branch_exists() from bash/utils/neon-utils.sh:38-61\n *\n * @param name - Branch name to check\n * @param cwd - Optional working directory to run commands from\n */\n async branchExists(name: string, cwd?: string): Promise<boolean> {\n const branches = await this.listBranches(cwd)\n return branches.includes(name)\n }\n\n /**\n * Get connection string for a specific branch\n * Ports: get_neon_connection_string() from bash/utils/neon-utils.sh:76-90\n *\n * @param branch - Branch name to get connection string for\n * @param cwd - Optional working directory to run commands from\n */\n async getConnectionString(branch: string, cwd?: string): Promise<string> {\n const connectionString = await this.executeNeonCommand([\n 'connection-string',\n '--branch',\n branch,\n '--project-id',\n this.config.projectId,\n ], cwd)\n return connectionString.trim()\n }\n\n /**\n * Find Vercel preview database branch\n * Checks for both patterns: preview/<branch> and preview_<sanitized-branch>\n * Ports: find_preview_database_branch() from bash/utils/neon-utils.sh:92-124\n *\n * @param branchName - Branch name to find preview for\n * @param cwd - Optional working directory to run commands from\n */\n async findPreviewBranch(branchName: string, cwd?: string): Promise<string | null> {\n // Check for exact preview branch match with slash pattern\n const slashPattern = `preview/${branchName}`\n if (await this.branchExists(slashPattern, cwd)) {\n getLogger().info(`Found Vercel preview database: ${slashPattern}`)\n return slashPattern\n }\n\n // Check for underscore pattern variation\n const sanitized = this.sanitizeBranchName(branchName)\n const underscorePattern = `preview_${sanitized}`\n if (await this.branchExists(underscorePattern, cwd)) {\n getLogger().info(`Found Vercel preview database: ${underscorePattern}`)\n return underscorePattern\n }\n\n return null\n }\n\n /**\n * Remove expiration date from a Neon branch\n * Used when parent branches need to have child branches created\n * Neon limitation: \"Branches with an expiration date cannot have child branches\"\n *\n * @param branchName - Name of the branch to remove expiration from\n * @param cwd - Optional working directory to run commands from\n */\n private async removeExpiration(branchName: string, cwd?: string): Promise<void> {\n getLogger().info(`Removing expiration date from branch: ${branchName}`)\n await this.executeNeonCommand([\n 'branches',\n 'set-expiration',\n branchName,\n '--project-id',\n this.config.projectId,\n ], cwd)\n getLogger().success(`Expiration date removed from ${branchName}`)\n }\n\n /**\n * Create a new database branch\n * ALWAYS checks for Vercel preview database first\n * Handles Neon limitation where parent branches with expiration dates cannot have children\n * Returns connection string for the branch\n * Ports: create_neon_database_branch() from bash/utils/neon-utils.sh:126-187\n *\n * @param name - Name for the new branch\n * @param fromBranch - Parent branch to create from (defaults to config.parentBranch)\n * @param cwd - Optional working directory to run commands from\n */\n async createBranch(name: string, fromBranch?: string, cwd?: string): Promise<string> {\n // Always check for existing Vercel preview database first (lines 149-158)\n const previewBranch = await this.findPreviewBranch(name, cwd)\n if (previewBranch) {\n const connectionString = await this.getConnectionString(previewBranch, cwd)\n getLogger().success(`Using existing Vercel preview database: ${previewBranch}`)\n return connectionString\n }\n\n // Sanitize branch name for Neon (replace slashes with underscores)\n const sanitizedName = this.sanitizeBranchName(name)\n const parentBranch = fromBranch ?? this.config.parentBranch\n\n getLogger().info('Creating Neon database branch...')\n getLogger().info(` Parent branch: ${parentBranch}`)\n getLogger().info(` New branch: ${sanitizedName}`)\n\n try {\n // Create the database branch\n await this.executeNeonCommand([\n 'branches',\n 'create',\n '--name',\n sanitizedName,\n '--parent',\n parentBranch,\n '--project-id',\n this.config.projectId,\n ], cwd)\n } catch (error) {\n // Check if error is about parent branch having an expiration date\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.toLowerCase().includes('expiration') &&\n errorMessage.toLowerCase().includes('child')) {\n getLogger().warn('Parent branch has an expiration date - removing it to allow child branch creation')\n\n // Remove expiration from parent branch\n await this.removeExpiration(parentBranch, cwd)\n\n // Retry branch creation\n getLogger().info('Retrying database branch creation...')\n await this.executeNeonCommand([\n 'branches',\n 'create',\n '--name',\n sanitizedName,\n '--parent',\n parentBranch,\n '--project-id',\n this.config.projectId,\n ], cwd)\n } else {\n // Re-throw if it's a different error\n throw error\n }\n }\n\n getLogger().success('Database branch created successfully')\n\n // Get the connection string for the new branch\n getLogger().info('Getting connection string for new database branch...')\n const connectionString = await this.getConnectionString(sanitizedName, cwd)\n\n return connectionString\n }\n\n /**\n * Delete a database branch\n * Includes preview database protection with user confirmation\n * Ports: delete_neon_database_branch() from bash/utils/neon-utils.sh:204-259\n *\n * @param name - Name of the branch to delete\n * @param isPreview - Whether this is a preview database branch\n * @param cwd - Optional working directory to run commands from (prevents issues with deleted directories)\n */\n async deleteBranch(name: string, isPreview: boolean = false, cwd?: string): Promise<import('../../types/index.js').DatabaseDeletionResult> {\n // Sanitize branch name for Neon\n const sanitizedName = this.sanitizeBranchName(name)\n\n // For preview contexts, check for preview databases first\n if (isPreview) {\n const previewBranch = await this.findPreviewBranch(name, cwd)\n if (previewBranch) {\n getLogger().warn(`Found Vercel preview database: ${previewBranch}`)\n getLogger().warn('Preview databases are managed by Vercel and will be cleaned up automatically')\n getLogger().warn('Manual deletion may interfere with Vercel\\'s preview deployments')\n\n const confirmed = await promptConfirmation(\n 'Delete preview database anyway?',\n false\n )\n\n if (confirmed) {\n // User confirmed - delete preview branch\n try {\n getLogger().info(`Deleting Vercel preview database: ${previewBranch}`)\n await this.executeNeonCommand([\n 'branches',\n 'delete',\n previewBranch,\n '--project-id',\n this.config.projectId,\n ], cwd)\n getLogger().success('Preview database deleted successfully')\n return {\n success: true,\n deleted: true,\n notFound: false,\n branchName: previewBranch\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n getLogger().error(`Failed to delete preview database: ${errorMessage}`)\n return {\n success: false,\n deleted: false,\n notFound: false,\n error: errorMessage,\n branchName: previewBranch\n }\n }\n } else {\n // User declined deletion\n getLogger().info('Skipping preview database deletion')\n return {\n success: true,\n deleted: false,\n notFound: false,\n userDeclined: true,\n branchName: previewBranch\n }\n }\n }\n // If no preview database found, fall through to check regular branch\n }\n\n // Check for regular branch\n getLogger().info(`Checking for Neon database branch: ${sanitizedName}`)\n\n try {\n const exists = await this.branchExists(sanitizedName, cwd)\n\n if (!exists) {\n getLogger().info(`No database branch found for '${name}'`)\n return {\n success: true,\n deleted: false,\n notFound: true,\n branchName: sanitizedName\n }\n }\n\n // Branch exists - delete it\n getLogger().info(`Deleting Neon database branch: ${sanitizedName}`)\n await this.executeNeonCommand([\n 'branches',\n 'delete',\n sanitizedName,\n '--project-id',\n this.config.projectId,\n ], cwd)\n getLogger().success('Database branch deleted successfully')\n\n return {\n success: true,\n deleted: true,\n notFound: false,\n branchName: sanitizedName\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n getLogger().error(`Failed to delete database branch: ${errorMessage}`)\n return {\n success: false,\n deleted: false,\n notFound: false,\n error: errorMessage,\n branchName: sanitizedName\n }\n }\n }\n\n /**\n * Get branch name from endpoint ID (reverse lookup)\n * Searches all branches to find one with matching endpoint\n * Ports: get_neon_branch_name() from bash/utils/neon-utils.sh:262-308\n *\n * @param endpointId - Endpoint ID to search for\n * @param cwd - Optional working directory to run commands from\n */\n async getBranchNameFromEndpoint(endpointId: string, cwd?: string): Promise<string | null> {\n const branches = await this.listBranches(cwd)\n\n for (const branch of branches) {\n try {\n const connectionString = await this.getConnectionString(branch, cwd)\n const branchEndpointId = this.extractEndpointId(connectionString)\n\n if (branchEndpointId === endpointId) {\n return branch\n }\n } catch {\n // Skip branches that fail to get connection string\n continue\n }\n }\n\n return null\n }\n\n /**\n * Get branch name from a connection string (reverse lookup)\n * Extracts endpoint ID from connection string and finds matching branch\n *\n * @param connectionString - Neon connection string (e.g., postgres://...@ep-abc-123.region.neon.tech/...)\n * @param cwd - Optional working directory to run commands from\n */\n async getBranchNameFromConnectionString(connectionString: string, cwd?: string): Promise<string | null> {\n const endpointId = this.extractEndpointId(connectionString)\n if (!endpointId) {\n getLogger().debug('Could not extract endpoint ID from connection string')\n return null\n }\n return this.getBranchNameFromEndpoint(endpointId, cwd)\n }\n}\n","import { NeonProvider } from '../lib/providers/NeonProvider.js'\nimport type { IloomSettings } from '../lib/SettingsManager.js'\n\n/**\n * Create NeonProvider from settings configuration\n * Returns provider with isConfigured() = false if neon settings missing\n */\nexport function createNeonProviderFromSettings(settings: IloomSettings): NeonProvider {\n\tconst neonConfig = settings.databaseProviders?.neon\n\n\treturn new NeonProvider({\n\t\tprojectId: neonConfig?.projectId ?? '',\n\t\tparentBranch: neonConfig?.parentBranch ?? '',\n\t})\n}\n"],"mappings":";;;;;;;;;AAAA,SAAS,aAA8B;AAoBhC,SAAS,mBAAmB,QAGI;AACrC,MAAI,CAAC,OAAO,WAAW;AACrB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,cAAc;AACxB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,CAAC,kBAAkB,KAAK,OAAO,SAAS,GAAG;AAC7C,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAMO,IAAM,eAAN,MAA+C;AAAA,EAGpD,YAAoB,QAAoB;AAApB;AAFpB,SAAQ,gBAAyB;AAG/B,cAAU,EAAE,MAAM,yCAAyC;AAAA,MACzD,WAAW,OAAO;AAAA,MAClB,cAAc,OAAO;AAAA,MACrB,cAAc,CAAC,CAAC,OAAO;AAAA,MACvB,iBAAiB,CAAC,CAAC,OAAO;AAAA,IAC5B,CAAC;AAID,UAAM,aAAa,mBAAmB,MAAM;AAC5C,QAAI,CAAC,WAAW,OAAO;AACrB,gBAAU,EAAE,MAAM,gCAAgC,WAAW,KAAK,EAAE;AACpE,gBAAU,EAAE,MAAM,0CAA0C;AAC5D,WAAK,gBAAgB;AAAA,IACvB,OAAO;AACL,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,mBAAmB,MAAgB,KAA+B;AAE9E,QAAI,CAAC,KAAK,eAAe;AACvB,YAAM,IAAI,MAAM,oGAAoG;AAAA,IACtH;AAGA,UAAM,UAAU,QAAQ,KAAK,KAAK,GAAG,CAAC;AACtC,cAAU,EAAE,MAAM,+BAA+B,OAAO,EAAE;AAC1D,cAAU,EAAE,MAAM,0BAA0B,KAAK,OAAO,SAAS,EAAE;AACnE,QAAI,KAAK;AACP,gBAAU,EAAE,MAAM,sBAAsB,GAAG,EAAE;AAAA,IAC/C;AAEA,UAAM,SAAS,MAAM,MAAM,QAAQ,MAAM;AAAA,MACvC,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO;AAAA,MACP,GAAI,OAAO,EAAE,IAAI;AAAA,IACnB,CAAC;AACD,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAmC;AACvC,QAAI;AACF,YAAM,MAAM,WAAW,CAAC,MAAM,MAAM,GAAG;AAAA,QACrC,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAgB,KAAgC;AAzIxD;AA0II,UAAM,eAAe,MAAM,KAAK,eAAe;AAC/C,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,MAAM,QAAQ,CAAC,IAAI,GAAG;AAAA,QAC1B,SAAS;AAAA,QACT,OAAO;AAAA,QACP,GAAI,OAAO,EAAE,IAAI;AAAA,MACnB,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,aAAa;AACnB,YAAM,WAAS,gBAAW,WAAX,mBAAmB,WAAU;AAG5C,YAAM,cACJ,OAAO,YAAY,EAAE,SAAS,mBAAmB,KACjD,OAAO,YAAY,EAAE,SAAS,eAAe,KAC7C,OAAO,YAAY,EAAE,SAAS,yBAAyB,KACvD,OAAO,YAAY,EAAE,SAAS,gBAAgB;AAEhD,UAAI,aAAa;AACf,eAAO;AAAA,MACT;AAGA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,YAA4B;AAC7C,WAAO,WAAW,QAAQ,OAAO,GAAG;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBAAkB,kBAAyC;AAKjE,UAAM,YAAY,iBAAiB,MAAM,oBAAoB;AAC7D,QAAI,EAAC,uCAAY,KAAI;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,UAAU,CAAC;AAEhC,WAAO,aAAa,QAAQ,YAAY,EAAE;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAa,KAAiC;AAClD,UAAM,SAAS,MAAM,KAAK,mBAAmB;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,IACF,GAAG,GAAG;AAEN,UAAM,WAAyB,KAAK,MAAM,MAAM;AAChD,WAAO,SAAS,IAAI,YAAU,OAAO,IAAI;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,MAAc,KAAgC;AAC/D,UAAM,WAAW,MAAM,KAAK,aAAa,GAAG;AAC5C,WAAO,SAAS,SAAS,IAAI;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBAAoB,QAAgB,KAA+B;AACvE,UAAM,mBAAmB,MAAM,KAAK,mBAAmB;AAAA,MACrD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,OAAO;AAAA,IACd,GAAG,GAAG;AACN,WAAO,iBAAiB,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,kBAAkB,YAAoB,KAAsC;AAEhF,UAAM,eAAe,WAAW,UAAU;AAC1C,QAAI,MAAM,KAAK,aAAa,cAAc,GAAG,GAAG;AAC9C,gBAAU,EAAE,KAAK,kCAAkC,YAAY,EAAE;AACjE,aAAO;AAAA,IACT;AAGA,UAAM,YAAY,KAAK,mBAAmB,UAAU;AACpD,UAAM,oBAAoB,WAAW,SAAS;AAC9C,QAAI,MAAM,KAAK,aAAa,mBAAmB,GAAG,GAAG;AACnD,gBAAU,EAAE,KAAK,kCAAkC,iBAAiB,EAAE;AACtE,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,iBAAiB,YAAoB,KAA6B;AAC9E,cAAU,EAAE,KAAK,yCAAyC,UAAU,EAAE;AACtE,UAAM,KAAK,mBAAmB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,OAAO;AAAA,IACd,GAAG,GAAG;AACN,cAAU,EAAE,QAAQ,gCAAgC,UAAU,EAAE;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,aAAa,MAAc,YAAqB,KAA+B;AAEnF,UAAM,gBAAgB,MAAM,KAAK,kBAAkB,MAAM,GAAG;AAC5D,QAAI,eAAe;AACjB,YAAMA,oBAAmB,MAAM,KAAK,oBAAoB,eAAe,GAAG;AAC1E,gBAAU,EAAE,QAAQ,2CAA2C,aAAa,EAAE;AAC9E,aAAOA;AAAA,IACT;AAGA,UAAM,gBAAgB,KAAK,mBAAmB,IAAI;AAClD,UAAM,eAAe,cAAc,KAAK,OAAO;AAE/C,cAAU,EAAE,KAAK,kCAAkC;AACnD,cAAU,EAAE,KAAK,oBAAoB,YAAY,EAAE;AACnD,cAAU,EAAE,KAAK,iBAAiB,aAAa,EAAE;AAEjD,QAAI;AAEF,YAAM,KAAK,mBAAmB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,OAAO;AAAA,MACd,GAAG,GAAG;AAAA,IACR,SAAS,OAAO;AAEd,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,UAAI,aAAa,YAAY,EAAE,SAAS,YAAY,KAChD,aAAa,YAAY,EAAE,SAAS,OAAO,GAAG;AAChD,kBAAU,EAAE,KAAK,mFAAmF;AAGpG,cAAM,KAAK,iBAAiB,cAAc,GAAG;AAG7C,kBAAU,EAAE,KAAK,sCAAsC;AACvD,cAAM,KAAK,mBAAmB;AAAA,UAC5B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,OAAO;AAAA,QACd,GAAG,GAAG;AAAA,MACR,OAAO;AAEL,cAAM;AAAA,MACR;AAAA,IACF;AAEA,cAAU,EAAE,QAAQ,sCAAsC;AAG1D,cAAU,EAAE,KAAK,sDAAsD;AACvE,UAAM,mBAAmB,MAAM,KAAK,oBAAoB,eAAe,GAAG;AAE1E,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,aAAa,MAAc,YAAqB,OAAO,KAA8E;AAEzI,UAAM,gBAAgB,KAAK,mBAAmB,IAAI;AAGlD,QAAI,WAAW;AACb,YAAM,gBAAgB,MAAM,KAAK,kBAAkB,MAAM,GAAG;AAC5D,UAAI,eAAe;AACjB,kBAAU,EAAE,KAAK,kCAAkC,aAAa,EAAE;AAClE,kBAAU,EAAE,KAAK,8EAA8E;AAC/F,kBAAU,EAAE,KAAK,iEAAkE;AAEnF,cAAM,YAAY,MAAM;AAAA,UACtB;AAAA,UACA;AAAA,QACF;AAEA,YAAI,WAAW;AAEb,cAAI;AACF,sBAAU,EAAE,KAAK,qCAAqC,aAAa,EAAE;AACrE,kBAAM,KAAK,mBAAmB;AAAA,cAC5B;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,KAAK,OAAO;AAAA,YACd,GAAG,GAAG;AACN,sBAAU,EAAE,QAAQ,uCAAuC;AAC3D,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,YACd;AAAA,UACF,SAAS,OAAO;AACd,kBAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,sBAAU,EAAE,MAAM,sCAAsC,YAAY,EAAE;AACtE,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,SAAS;AAAA,cACT,UAAU;AAAA,cACV,OAAO;AAAA,cACP,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF,OAAO;AAEL,oBAAU,EAAE,KAAK,oCAAoC;AACrD,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,YACT,UAAU;AAAA,YACV,cAAc;AAAA,YACd,YAAY;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IAEF;AAGA,cAAU,EAAE,KAAK,sCAAsC,aAAa,EAAE;AAEtE,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,aAAa,eAAe,GAAG;AAEzD,UAAI,CAAC,QAAQ;AACX,kBAAU,EAAE,KAAK,iCAAiC,IAAI,GAAG;AACzD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,UACT,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,MACF;AAGA,gBAAU,EAAE,KAAK,kCAAkC,aAAa,EAAE;AAClE,YAAM,KAAK,mBAAmB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,OAAO;AAAA,MACd,GAAG,GAAG;AACN,gBAAU,EAAE,QAAQ,sCAAsC;AAE1D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,gBAAU,EAAE,MAAM,qCAAqC,YAAY,EAAE;AACrE,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,0BAA0B,YAAoB,KAAsC;AACxF,UAAM,WAAW,MAAM,KAAK,aAAa,GAAG;AAE5C,eAAW,UAAU,UAAU;AAC7B,UAAI;AACF,cAAM,mBAAmB,MAAM,KAAK,oBAAoB,QAAQ,GAAG;AACnE,cAAM,mBAAmB,KAAK,kBAAkB,gBAAgB;AAEhE,YAAI,qBAAqB,YAAY;AACnC,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAEN;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,kCAAkC,kBAA0B,KAAsC;AACtG,UAAM,aAAa,KAAK,kBAAkB,gBAAgB;AAC1D,QAAI,CAAC,YAAY;AACf,gBAAU,EAAE,MAAM,sDAAsD;AACxE,aAAO;AAAA,IACT;AACA,WAAO,KAAK,0BAA0B,YAAY,GAAG;AAAA,EACvD;AACF;;;AC7gBO,SAAS,+BAA+B,UAAuC;AAPtF;AAQC,QAAM,cAAa,cAAS,sBAAT,mBAA4B;AAE/C,SAAO,IAAI,aAAa;AAAA,IACvB,YAAW,yCAAY,cAAa;AAAA,IACpC,eAAc,yCAAY,iBAAgB;AAAA,EAC3C,CAAC;AACF;","names":["connectionString"]}
|
|
@@ -51,65 +51,46 @@ var logger = {
|
|
|
51
51
|
},
|
|
52
52
|
isDebugEnabled: () => {
|
|
53
53
|
return globalDebugEnabled;
|
|
54
|
-
}
|
|
54
|
+
},
|
|
55
|
+
stdout: process.stdout
|
|
55
56
|
};
|
|
56
|
-
function
|
|
57
|
-
const { prefix = "", timestamp = false,
|
|
57
|
+
function createStderrLogger(options = {}) {
|
|
58
|
+
const { prefix = "", timestamp = false, forceColor, debug = globalDebugEnabled } = options;
|
|
58
59
|
let localDebugEnabled = debug;
|
|
59
|
-
const
|
|
60
|
-
const customStderrChalk = forceColor !== void 0 ? new Chalk({ level: forceColor ? 3 : 0 }) : stderrChalk;
|
|
60
|
+
const customChalk = forceColor !== void 0 ? new Chalk({ level: forceColor ? 3 : 0 }) : stderrChalk;
|
|
61
61
|
const prefixStr = prefix ? `[${prefix}] ` : "";
|
|
62
62
|
const getTimestamp = () => timestamp ? `[${(/* @__PURE__ */ new Date()).toISOString()}] ` : "";
|
|
63
|
-
if (silent) {
|
|
64
|
-
return {
|
|
65
|
-
info: () => {
|
|
66
|
-
},
|
|
67
|
-
success: () => {
|
|
68
|
-
},
|
|
69
|
-
warn: () => {
|
|
70
|
-
},
|
|
71
|
-
error: () => {
|
|
72
|
-
},
|
|
73
|
-
debug: () => {
|
|
74
|
-
},
|
|
75
|
-
setDebug: () => {
|
|
76
|
-
},
|
|
77
|
-
isDebugEnabled: () => {
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
63
|
return {
|
|
83
64
|
info: (message, ...args) => {
|
|
84
65
|
const formatted = formatMessage(message, ...args);
|
|
85
66
|
const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`;
|
|
86
|
-
const output = formatWithEmoji(fullMessage, "\u{1F5C2}\uFE0F ",
|
|
87
|
-
console.
|
|
67
|
+
const output = formatWithEmoji(fullMessage, "\u{1F5C2}\uFE0F ", customChalk.blue);
|
|
68
|
+
console.error(output);
|
|
88
69
|
},
|
|
89
70
|
success: (message, ...args) => {
|
|
90
71
|
const formatted = formatMessage(message, ...args);
|
|
91
72
|
const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`;
|
|
92
|
-
const output = formatWithEmoji(fullMessage, "\u2705",
|
|
93
|
-
console.
|
|
73
|
+
const output = formatWithEmoji(fullMessage, "\u2705", customChalk.green);
|
|
74
|
+
console.error(output);
|
|
94
75
|
},
|
|
95
76
|
warn: (message, ...args) => {
|
|
96
77
|
const formatted = formatMessage(message, ...args);
|
|
97
78
|
const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`;
|
|
98
|
-
const output = formatWithEmoji(fullMessage, "\u26A0\uFE0F ",
|
|
79
|
+
const output = formatWithEmoji(fullMessage, "\u26A0\uFE0F ", customChalk.yellow);
|
|
99
80
|
console.error(output);
|
|
100
81
|
},
|
|
101
82
|
error: (message, ...args) => {
|
|
102
83
|
const formatted = formatMessage(message, ...args);
|
|
103
84
|
const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`;
|
|
104
|
-
const output = formatWithEmoji(fullMessage, "\u274C",
|
|
85
|
+
const output = formatWithEmoji(fullMessage, "\u274C", customChalk.red);
|
|
105
86
|
console.error(output);
|
|
106
87
|
},
|
|
107
88
|
debug: (message, ...args) => {
|
|
108
89
|
if (localDebugEnabled) {
|
|
109
90
|
const formatted = formatMessage(message, ...args);
|
|
110
91
|
const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`;
|
|
111
|
-
const output = formatWithEmoji(fullMessage, "\u{1F50D}",
|
|
112
|
-
console.
|
|
92
|
+
const output = formatWithEmoji(fullMessage, "\u{1F50D}", customChalk.gray);
|
|
93
|
+
console.error(output);
|
|
113
94
|
}
|
|
114
95
|
},
|
|
115
96
|
setDebug: (enabled) => {
|
|
@@ -117,14 +98,16 @@ function createLogger(options = {}) {
|
|
|
117
98
|
},
|
|
118
99
|
isDebugEnabled: () => {
|
|
119
100
|
return globalDebugEnabled;
|
|
120
|
-
}
|
|
101
|
+
},
|
|
102
|
+
stdout: process.stderr
|
|
103
|
+
// Use stderr for progress output in JSON mode
|
|
121
104
|
};
|
|
122
105
|
}
|
|
123
106
|
var logger_default = logger;
|
|
124
107
|
|
|
125
108
|
export {
|
|
126
109
|
logger,
|
|
127
|
-
|
|
110
|
+
createStderrLogger,
|
|
128
111
|
logger_default
|
|
129
112
|
};
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
113
|
+
//# sourceMappingURL=chunk-UYVWLISQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts"],"sourcesContent":["// Lines 1-5: Imports\nimport chalk, { Chalk } from 'chalk'\n\n// Lines 7-17: Type definitions\nexport interface LoggerOptions {\n prefix?: string\n timestamp?: boolean\n silent?: boolean\n forceColor?: boolean | undefined | null\n debug?: boolean\n}\n\nexport interface Logger {\n info: (message: string, ...args: unknown[]) => void\n success: (message: string, ...args: unknown[]) => void\n warn: (message: string, ...args: unknown[]) => void\n error: (message: string, ...args: unknown[]) => void\n debug: (message: string, ...args: unknown[]) => void\n setDebug: (enabled: boolean) => void\n isDebugEnabled: () => boolean\n stdout: NodeJS.WriteStream // Stream for progress output (stdout normally, stderr in JSON mode)\n}\n\n// Lines 19-29: Stream-specific chalk instances\nconst stdoutChalk = new Chalk({ level: chalk.level })\nconst stderrChalk = new Chalk({ level: chalk.level })\n\n// Lines 31-45: Helper functions\nfunction formatMessage(message: string, ...args: unknown[]): string {\n // Convert args to strings and append to message\n const formattedArgs = args.map(arg =>\n typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)\n )\n return formattedArgs.length > 0 ? `${message} ${formattedArgs.join(' ')}` : message\n}\n\nfunction formatWithEmoji(message: string, emoji: string, colorFn: (str: string) => string): string {\n if (message.trim()) {\n return colorFn(`${emoji} ${message}`)\n } else {\n return ''\n }\n}\n\nlet globalDebugEnabled = false\n\n// Lines 47-96: Main logger implementation\n/* eslint-disable no-console */\nexport const logger: Logger = {\n info: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const output = formatWithEmoji(formatted, '🗂️ ', stdoutChalk.blue)\n console.log(output)\n },\n\n success: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const output = formatWithEmoji(formatted, '✅', stdoutChalk.green)\n console.log(output)\n },\n\n warn: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const output = formatWithEmoji(formatted, '⚠️ ', stderrChalk.yellow)\n console.error(output)\n },\n\n error: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const output = formatWithEmoji(formatted, '❌', stderrChalk.red)\n console.error(output)\n },\n\n debug: (message: string, ...args: unknown[]): void => {\n if (globalDebugEnabled) {\n const formatted = formatMessage(message, ...args)\n const output = formatWithEmoji(formatted, '🔍', stdoutChalk.gray)\n console.log(output)\n }\n },\n\n setDebug: (enabled: boolean): void => {\n globalDebugEnabled = enabled\n },\n\n isDebugEnabled: (): boolean => {\n return globalDebugEnabled\n },\n\n stdout: process.stdout\n}\n/* eslint-enable no-console */\n\n// Lines 98-145: Factory function for custom logger instances\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const { prefix = '', timestamp = false, silent = false, forceColor, debug = globalDebugEnabled } = options\n\n // Local debug flag for this logger instance\n let localDebugEnabled = debug\n\n // Create chalk instances with forced color if needed\n const customStdoutChalk = forceColor !== undefined\n ? new Chalk({ level: forceColor ? 3 : 0 })\n : stdoutChalk\n const customStderrChalk = forceColor !== undefined\n ? new Chalk({ level: forceColor ? 3 : 0 })\n : stderrChalk\n\n const prefixStr = prefix ? `[${prefix}] ` : ''\n const getTimestamp = (): string => timestamp ? `[${new Date().toISOString()}] ` : ''\n\n if (silent) {\n // Return no-op logger when silent\n return {\n info: (): void => {},\n success: (): void => {},\n warn: (): void => {},\n error: (): void => {},\n debug: (): void => {},\n setDebug: (): void => {},\n isDebugEnabled: (): boolean => {\n return false\n },\n stdout: process.stdout\n }\n }\n\n /* eslint-disable no-console */\n return {\n info: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`\n const output = formatWithEmoji(fullMessage, '🗂️ ', customStdoutChalk.blue)\n console.log(output)\n },\n success: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`\n const output = formatWithEmoji(fullMessage, '✅', customStdoutChalk.green)\n console.log(output)\n },\n warn: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`\n const output = formatWithEmoji(fullMessage, '⚠️ ', customStderrChalk.yellow)\n console.error(output)\n },\n error: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`\n const output = formatWithEmoji(fullMessage, '❌', customStderrChalk.red)\n console.error(output)\n },\n debug: (message: string, ...args: unknown[]): void => {\n if (localDebugEnabled) {\n const formatted = formatMessage(message, ...args)\n const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`\n const output = formatWithEmoji(fullMessage, '🔍', customStdoutChalk.gray)\n console.log(output)\n }\n },\n setDebug: (enabled: boolean): void => {\n localDebugEnabled = enabled\n },\n isDebugEnabled: (): boolean => {\n return globalDebugEnabled\n },\n stdout: process.stdout\n }\n /* eslint-enable no-console */\n}\n\n// Lines 147-200: Factory function for stderr-only logger (for JSON mode)\n/**\n * Creates a logger that redirects all output to stderr.\n * Use this in JSON mode so progress messages don't pollute stdout.\n * The JSON output can then be cleanly piped.\n */\nexport function createStderrLogger(options: LoggerOptions = {}): Logger {\n const { prefix = '', timestamp = false, forceColor, debug = globalDebugEnabled } = options\n\n // Local debug flag for this logger instance\n let localDebugEnabled = debug\n\n // Create chalk instances with forced color if needed\n const customChalk = forceColor !== undefined\n ? new Chalk({ level: forceColor ? 3 : 0 })\n : stderrChalk\n\n const prefixStr = prefix ? `[${prefix}] ` : ''\n const getTimestamp = (): string => timestamp ? `[${new Date().toISOString()}] ` : ''\n\n return {\n info: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`\n const output = formatWithEmoji(fullMessage, '🗂️ ', customChalk.blue)\n console.error(output) // Redirect to stderr\n },\n success: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`\n const output = formatWithEmoji(fullMessage, '✅', customChalk.green)\n console.error(output) // Redirect to stderr\n },\n warn: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`\n const output = formatWithEmoji(fullMessage, '⚠️ ', customChalk.yellow)\n console.error(output)\n },\n error: (message: string, ...args: unknown[]): void => {\n const formatted = formatMessage(message, ...args)\n const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`\n const output = formatWithEmoji(fullMessage, '❌', customChalk.red)\n console.error(output)\n },\n debug: (message: string, ...args: unknown[]): void => {\n if (localDebugEnabled) {\n const formatted = formatMessage(message, ...args)\n const fullMessage = `${getTimestamp()}${prefixStr}${formatted}`\n const output = formatWithEmoji(fullMessage, '🔍', customChalk.gray)\n console.error(output) // Redirect to stderr\n }\n },\n setDebug: (enabled: boolean): void => {\n localDebugEnabled = enabled\n },\n isDebugEnabled: (): boolean => {\n return globalDebugEnabled\n },\n stdout: process.stderr // Use stderr for progress output in JSON mode\n }\n}\n\n// Default export\nexport default logger\n"],"mappings":"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","names":[]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
promptConfirmation
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-SJ2GZ6RF.js";
|
|
5
5
|
import {
|
|
6
6
|
logger
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-UYVWLISQ.js";
|
|
8
8
|
|
|
9
9
|
// src/lib/SettingsMigrationManager.ts
|
|
10
10
|
import fs from "fs-extra";
|
|
@@ -144,4 +144,4 @@ var SettingsMigrationManager = class {
|
|
|
144
144
|
export {
|
|
145
145
|
SettingsMigrationManager
|
|
146
146
|
};
|
|
147
|
-
//# sourceMappingURL=chunk-
|
|
147
|
+
//# sourceMappingURL=chunk-UYWAESOT.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
getLogger
|
|
4
|
+
} from "./chunk-6UIGZD2N.js";
|
|
5
5
|
|
|
6
6
|
// src/utils/package-manager.ts
|
|
7
7
|
import { execa } from "execa";
|
|
@@ -19,13 +19,13 @@ async function detectPackageManager(cwd = process.cwd()) {
|
|
|
19
19
|
if (packageJson.packageManager) {
|
|
20
20
|
const manager = packageJson.packageManager.split("@")[0];
|
|
21
21
|
if (isValidPackageManager(manager)) {
|
|
22
|
-
|
|
22
|
+
getLogger().debug(`Detected package manager from package.json: ${manager}`);
|
|
23
23
|
return manager;
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
} catch (error) {
|
|
28
|
-
|
|
28
|
+
getLogger().debug(`Could not read packageManager from package.json: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
29
29
|
}
|
|
30
30
|
const lockFiles = [
|
|
31
31
|
{ file: "pnpm-lock.yaml", manager: "pnpm" },
|
|
@@ -34,7 +34,7 @@ async function detectPackageManager(cwd = process.cwd()) {
|
|
|
34
34
|
];
|
|
35
35
|
for (const { file, manager } of lockFiles) {
|
|
36
36
|
if (await fs.pathExists(path.join(cwd, file))) {
|
|
37
|
-
|
|
37
|
+
getLogger().debug(`Detected package manager from lock file ${file}: ${manager}`);
|
|
38
38
|
return manager;
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -42,26 +42,26 @@ async function detectPackageManager(cwd = process.cwd()) {
|
|
|
42
42
|
for (const manager of managers) {
|
|
43
43
|
try {
|
|
44
44
|
await execa(manager, ["--version"]);
|
|
45
|
-
|
|
45
|
+
getLogger().debug(`Detected installed package manager: ${manager}`);
|
|
46
46
|
return manager;
|
|
47
47
|
} catch {
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
|
|
50
|
+
getLogger().debug("No package manager detected, defaulting to npm");
|
|
51
51
|
return "npm";
|
|
52
52
|
}
|
|
53
53
|
async function installDependencies(cwd, frozen = true, quiet = false) {
|
|
54
54
|
if (!cwd) {
|
|
55
|
-
|
|
55
|
+
getLogger().debug("Skipping dependency installation - no working directory provided");
|
|
56
56
|
return;
|
|
57
57
|
}
|
|
58
58
|
const pkgPath = path.join(cwd, "package.json");
|
|
59
59
|
if (!await fs.pathExists(pkgPath)) {
|
|
60
|
-
|
|
60
|
+
getLogger().debug("Skipping dependency installation - no package.json found");
|
|
61
61
|
return;
|
|
62
62
|
}
|
|
63
63
|
const packageManager = await detectPackageManager(cwd);
|
|
64
|
-
|
|
64
|
+
getLogger().info(`Installing dependencies with ${packageManager}...`);
|
|
65
65
|
const args = ["install"];
|
|
66
66
|
if (frozen) {
|
|
67
67
|
switch (packageManager) {
|
|
@@ -84,7 +84,7 @@ async function installDependencies(cwd, frozen = true, quiet = false) {
|
|
|
84
84
|
timeout: 3e5
|
|
85
85
|
// 5 minute timeout for install
|
|
86
86
|
});
|
|
87
|
-
|
|
87
|
+
getLogger().success("Dependencies installed successfully");
|
|
88
88
|
} catch (error) {
|
|
89
89
|
const execaError = error;
|
|
90
90
|
const stderr = execaError.stderr ?? execaError.message ?? "Unknown error";
|
|
@@ -117,4 +117,4 @@ export {
|
|
|
117
117
|
installDependencies,
|
|
118
118
|
runScript
|
|
119
119
|
};
|
|
120
|
-
//# sourceMappingURL=chunk-
|
|
120
|
+
//# sourceMappingURL=chunk-VBFDVGAE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/package-manager.ts"],"sourcesContent":["import { execa, type ExecaError } from 'execa'\nimport { getLogger } from './logger-context.js'\nimport fs from 'fs-extra'\nimport path from 'path'\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn'\n\n/**\n * Validate if a string is a supported package manager\n */\nfunction isValidPackageManager(manager: string): manager is PackageManager {\n return manager === 'pnpm' || manager === 'npm' || manager === 'yarn'\n}\n\n/**\n * Detect which package manager to use for a project\n * Checks in order:\n * 1. packageManager field in package.json (Node.js standard)\n * 2. Lock files (pnpm-lock.yaml, package-lock.json, yarn.lock)\n * 3. Installed package managers (system-wide check)\n * 4. Defaults to npm if all detection fails\n *\n * @param cwd Working directory to detect package manager in (defaults to process.cwd())\n * @returns The detected package manager, or 'npm' as default\n */\nexport async function detectPackageManager(cwd: string = process.cwd()): Promise<PackageManager> {\n // 1. Check packageManager field in package.json\n try {\n const packageJsonPath = path.join(cwd, 'package.json')\n if (await fs.pathExists(packageJsonPath)) {\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8')\n const packageJson = JSON.parse(packageJsonContent)\n\n if (packageJson.packageManager) {\n // Parse \"pnpm@8.15.0\" or \"pnpm@10.16.1+sha512...\" -> \"pnpm\"\n const manager = packageJson.packageManager.split('@')[0]\n if (isValidPackageManager(manager)) {\n getLogger().debug(`Detected package manager from package.json: ${manager}`)\n return manager\n }\n }\n }\n } catch (error) {\n // If package.json doesn't exist, is malformed, or unreadable, continue to next detection method\n getLogger().debug(`Could not read packageManager from package.json: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n\n // 2. Check lock files (priority: pnpm > npm > yarn)\n const lockFiles: Array<{ file: string; manager: PackageManager }> = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'package-lock.json', manager: 'npm' },\n { file: 'yarn.lock', manager: 'yarn' },\n ]\n\n for (const { file, manager } of lockFiles) {\n if (await fs.pathExists(path.join(cwd, file))) {\n getLogger().debug(`Detected package manager from lock file ${file}: ${manager}`)\n return manager\n }\n }\n\n // 3. Check installed package managers (original behavior)\n const managers: PackageManager[] = ['pnpm', 'npm', 'yarn']\n for (const manager of managers) {\n try {\n await execa(manager, ['--version'])\n getLogger().debug(`Detected installed package manager: ${manager}`)\n return manager\n } catch {\n // Continue to next manager\n }\n }\n\n // 4. Default to npm (always available in Node.js environments)\n getLogger().debug('No package manager detected, defaulting to npm')\n return 'npm'\n}\n\n/**\n * Install dependencies using the detected package manager\n * @param cwd Working directory to run install in\n * @param frozen Whether to use frozen lockfile (for production installs)\n * @param quiet Whether to suppress command output (default: false)\n * @returns true if installation succeeded, throws Error on failure\n */\nexport async function installDependencies(\n cwd: string,\n frozen: boolean = true,\n quiet: boolean = false\n): Promise<void> {\n // Check if package.json exists before attempting installation\n if (!cwd) {\n getLogger().debug('Skipping dependency installation - no working directory provided')\n return\n }\n\n const pkgPath = path.join(cwd, 'package.json')\n if (!(await fs.pathExists(pkgPath))) {\n getLogger().debug('Skipping dependency installation - no package.json found')\n return\n }\n\n const packageManager = await detectPackageManager(cwd)\n\n getLogger().info(`Installing dependencies with ${packageManager}...`)\n\n const args: string[] = ['install']\n\n // Add frozen lockfile flag based on package manager\n if (frozen) {\n switch (packageManager) {\n case 'pnpm':\n args.push('--frozen-lockfile')\n break\n case 'yarn':\n args.push('--frozen-lockfile')\n break\n case 'npm':\n args.shift() // Remove 'install'\n args.push('ci') // npm ci is equivalent to frozen lockfile\n break\n }\n }\n\n try {\n await execa(packageManager, args, {\n cwd,\n stdio: quiet ? 'pipe' : 'inherit',\n timeout: 300000, // 5 minute timeout for install\n })\n\n getLogger().success('Dependencies installed successfully')\n } catch (error) {\n const execaError = error as ExecaError\n const stderr = execaError.stderr ?? execaError.message ?? 'Unknown error'\n throw new Error(`Failed to install dependencies: ${stderr}`)\n }\n}\n\n/**\n * Run a package.json script\n * @param scriptName The script name from package.json\n * @param cwd Working directory\n * @param args Additional arguments to pass to the script\n * @param options Execution options\n */\nexport async function runScript(\n scriptName: string,\n cwd: string,\n args: string[] = [],\n options: { quiet?: boolean } = {}\n): Promise<void> {\n const packageManager = await detectPackageManager(cwd)\n\n const command = packageManager === 'npm' ? ['run', scriptName] : [scriptName]\n\n try {\n await execa(packageManager, [...command, ...args], {\n cwd,\n stdio: options.quiet ? 'pipe' : 'inherit',\n timeout: 600000, // 10 minute timeout for scripts\n env: {\n ...process.env,\n CI: 'true',\n },\n })\n } catch (error) {\n const execaError = error as ExecaError\n const stderr = execaError.stderr ?? execaError.message ?? 'Unknown error'\n throw new Error(`Failed to run script '${scriptName}': ${stderr}`)\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
logger
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-UYVWLISQ.js";
|
|
5
5
|
|
|
6
6
|
// src/lib/SettingsManager.ts
|
|
7
7
|
import { readFile } from "fs/promises";
|
|
@@ -13,13 +13,20 @@ var AgentSettingsSchema = z.object({
|
|
|
13
13
|
model: z.enum(["sonnet", "opus", "haiku"]).optional().describe("Claude model shorthand: sonnet, opus, or haiku")
|
|
14
14
|
// Future: could add other per-agent overrides
|
|
15
15
|
});
|
|
16
|
+
var SpinAgentSettingsSchema = z.object({
|
|
17
|
+
model: z.enum(["sonnet", "opus", "haiku"]).default("opus").describe("Claude model shorthand for spin orchestrator")
|
|
18
|
+
});
|
|
19
|
+
var SummarySettingsSchema = z.object({
|
|
20
|
+
model: z.enum(["sonnet", "opus", "haiku"]).default("sonnet").describe("Claude model shorthand for session summary generation")
|
|
21
|
+
});
|
|
16
22
|
var WorkflowPermissionSchema = z.object({
|
|
17
23
|
permissionMode: z.enum(["plan", "acceptEdits", "bypassPermissions", "default"]).optional().describe("Permission mode for Claude CLI in this workflow type"),
|
|
18
24
|
noVerify: z.boolean().optional().describe("Skip pre-commit hooks (--no-verify) when committing during finish workflow"),
|
|
19
25
|
startIde: z.boolean().default(true).describe("Launch IDE (code) when starting this workflow type"),
|
|
20
26
|
startDevServer: z.boolean().default(true).describe("Launch development server when starting this workflow type"),
|
|
21
27
|
startAiAgent: z.boolean().default(true).describe("Launch Claude Code agent when starting this workflow type"),
|
|
22
|
-
startTerminal: z.boolean().default(false).describe("Launch terminal window without dev server when starting this workflow type")
|
|
28
|
+
startTerminal: z.boolean().default(false).describe("Launch terminal window without dev server when starting this workflow type"),
|
|
29
|
+
generateSummary: z.boolean().default(true).describe("Generate and post Claude session summary when finishing this workflow type")
|
|
23
30
|
});
|
|
24
31
|
var WorkflowPermissionSchemaNoDefaults = z.object({
|
|
25
32
|
permissionMode: z.enum(["plan", "acceptEdits", "bypassPermissions", "default"]).optional().describe("Permission mode for Claude CLI in this workflow type"),
|
|
@@ -27,7 +34,8 @@ var WorkflowPermissionSchemaNoDefaults = z.object({
|
|
|
27
34
|
startIde: z.boolean().optional().describe("Launch IDE (code) when starting this workflow type"),
|
|
28
35
|
startDevServer: z.boolean().optional().describe("Launch development server when starting this workflow type"),
|
|
29
36
|
startAiAgent: z.boolean().optional().describe("Launch Claude Code agent when starting this workflow type"),
|
|
30
|
-
startTerminal: z.boolean().optional().describe("Launch terminal window without dev server when starting this workflow type")
|
|
37
|
+
startTerminal: z.boolean().optional().describe("Launch terminal window without dev server when starting this workflow type"),
|
|
38
|
+
generateSummary: z.boolean().optional().describe("Generate and post Claude session summary when finishing this workflow type")
|
|
31
39
|
});
|
|
32
40
|
var WorkflowsSettingsSchema = z.object({
|
|
33
41
|
issue: WorkflowPermissionSchema.optional(),
|
|
@@ -95,6 +103,12 @@ var IloomSettingsSchema = z.object({
|
|
|
95
103
|
agents: z.record(z.string(), AgentSettingsSchema).optional().nullable().describe(
|
|
96
104
|
"Per-agent configuration overrides. Available agents: iloom-issue-analyzer (analyzes issues), iloom-issue-planner (creates implementation plans), iloom-issue-analyze-and-plan (combined analysis and planning), iloom-issue-complexity-evaluator (evaluates complexity), iloom-issue-enhancer (enhances issue descriptions), iloom-issue-implementer (implements code changes), iloom-issue-reviewer (reviews code changes against requirements)"
|
|
97
105
|
),
|
|
106
|
+
spin: SpinAgentSettingsSchema.optional().describe(
|
|
107
|
+
"Spin orchestrator configuration. Model defaults to opus when not configured."
|
|
108
|
+
),
|
|
109
|
+
summary: SummarySettingsSchema.optional().describe(
|
|
110
|
+
"Session summary generation configuration. Model defaults to sonnet when not configured."
|
|
111
|
+
),
|
|
98
112
|
capabilities: CapabilitiesSettingsSchema.describe("Project capability configurations"),
|
|
99
113
|
databaseProviders: DatabaseProvidersSettingsSchema.describe("Database provider configurations"),
|
|
100
114
|
issueManagement: z.object({
|
|
@@ -157,6 +171,12 @@ var IloomSettingsSchemaNoDefaults = z.object({
|
|
|
157
171
|
agents: z.record(z.string(), AgentSettingsSchema).optional().nullable().describe(
|
|
158
172
|
"Per-agent configuration overrides. Available agents: iloom-issue-analyzer (analyzes issues), iloom-issue-planner (creates implementation plans), iloom-issue-analyze-and-plan (combined analysis and planning), iloom-issue-complexity-evaluator (evaluates complexity), iloom-issue-enhancer (enhances issue descriptions), iloom-issue-implementer (implements code changes), iloom-issue-reviewer (reviews code changes against requirements)"
|
|
159
173
|
),
|
|
174
|
+
spin: z.object({
|
|
175
|
+
model: z.enum(["sonnet", "opus", "haiku"]).optional()
|
|
176
|
+
}).optional().describe("Spin orchestrator configuration"),
|
|
177
|
+
summary: z.object({
|
|
178
|
+
model: z.enum(["sonnet", "opus", "haiku"]).optional()
|
|
179
|
+
}).optional().describe("Session summary generation configuration"),
|
|
160
180
|
capabilities: CapabilitiesSettingsSchemaNoDefaults.describe("Project capability configurations"),
|
|
161
181
|
databaseProviders: DatabaseProvidersSettingsSchema.describe("Database provider configurations"),
|
|
162
182
|
issueManagement: z.object({
|
|
@@ -389,10 +409,34 @@ ${errorMessages.join("\n")}`
|
|
|
389
409
|
}
|
|
390
410
|
return protectedBranches;
|
|
391
411
|
}
|
|
412
|
+
/**
|
|
413
|
+
* Get the spin orchestrator model with default applied
|
|
414
|
+
* Default is defined in SpinAgentSettingsSchema
|
|
415
|
+
*
|
|
416
|
+
* @param settings - Pre-loaded settings object
|
|
417
|
+
* @returns Model shorthand ('opus', 'sonnet', or 'haiku')
|
|
418
|
+
*/
|
|
419
|
+
getSpinModel(settings) {
|
|
420
|
+
var _a;
|
|
421
|
+
return ((_a = settings == null ? void 0 : settings.spin) == null ? void 0 : _a.model) ?? SpinAgentSettingsSchema.parse({}).model;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Get the session summary model with default applied
|
|
425
|
+
* Default is defined in SummarySettingsSchema
|
|
426
|
+
*
|
|
427
|
+
* @param settings - Pre-loaded settings object
|
|
428
|
+
* @returns Model shorthand ('opus', 'sonnet', or 'haiku')
|
|
429
|
+
*/
|
|
430
|
+
getSummaryModel(settings) {
|
|
431
|
+
var _a;
|
|
432
|
+
return ((_a = settings == null ? void 0 : settings.summary) == null ? void 0 : _a.model) ?? SummarySettingsSchema.parse({}).model;
|
|
433
|
+
}
|
|
392
434
|
};
|
|
393
435
|
|
|
394
436
|
export {
|
|
395
437
|
AgentSettingsSchema,
|
|
438
|
+
SpinAgentSettingsSchema,
|
|
439
|
+
SummarySettingsSchema,
|
|
396
440
|
WorkflowPermissionSchema,
|
|
397
441
|
WorkflowPermissionSchemaNoDefaults,
|
|
398
442
|
WorkflowsSettingsSchema,
|
|
@@ -405,4 +449,4 @@ export {
|
|
|
405
449
|
IloomSettingsSchemaNoDefaults,
|
|
406
450
|
SettingsManager
|
|
407
451
|
};
|
|
408
|
-
//# sourceMappingURL=chunk-
|
|
452
|
+
//# sourceMappingURL=chunk-VWNS6DH5.js.map
|