@iloom/cli 0.1.14
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/LICENSE +33 -0
- package/README.md +711 -0
- package/dist/ClaudeContextManager-XOSXQ67R.js +13 -0
- package/dist/ClaudeContextManager-XOSXQ67R.js.map +1 -0
- package/dist/ClaudeService-YSZ6EXWP.js +12 -0
- package/dist/ClaudeService-YSZ6EXWP.js.map +1 -0
- package/dist/GitHubService-F7Z3XJOS.js +11 -0
- package/dist/GitHubService-F7Z3XJOS.js.map +1 -0
- package/dist/LoomLauncher-MODG2SEM.js +263 -0
- package/dist/LoomLauncher-MODG2SEM.js.map +1 -0
- package/dist/NeonProvider-PAGPUH7F.js +12 -0
- package/dist/NeonProvider-PAGPUH7F.js.map +1 -0
- package/dist/PromptTemplateManager-7FINLRDE.js +9 -0
- package/dist/PromptTemplateManager-7FINLRDE.js.map +1 -0
- package/dist/SettingsManager-VAZF26S2.js +19 -0
- package/dist/SettingsManager-VAZF26S2.js.map +1 -0
- package/dist/SettingsMigrationManager-MTQIMI54.js +146 -0
- package/dist/SettingsMigrationManager-MTQIMI54.js.map +1 -0
- package/dist/add-issue-22JBNOML.js +54 -0
- package/dist/add-issue-22JBNOML.js.map +1 -0
- package/dist/agents/iloom-issue-analyze-and-plan.md +580 -0
- package/dist/agents/iloom-issue-analyzer.md +290 -0
- package/dist/agents/iloom-issue-complexity-evaluator.md +224 -0
- package/dist/agents/iloom-issue-enhancer.md +266 -0
- package/dist/agents/iloom-issue-implementer.md +262 -0
- package/dist/agents/iloom-issue-planner.md +358 -0
- package/dist/agents/iloom-issue-reviewer.md +63 -0
- package/dist/chunk-2ZPFJQ3B.js +63 -0
- package/dist/chunk-2ZPFJQ3B.js.map +1 -0
- package/dist/chunk-37DYYFVK.js +29 -0
- package/dist/chunk-37DYYFVK.js.map +1 -0
- package/dist/chunk-BLCTGFZN.js +121 -0
- package/dist/chunk-BLCTGFZN.js.map +1 -0
- package/dist/chunk-CP2NU2JC.js +545 -0
- package/dist/chunk-CP2NU2JC.js.map +1 -0
- package/dist/chunk-CWR2SANQ.js +39 -0
- package/dist/chunk-CWR2SANQ.js.map +1 -0
- package/dist/chunk-F3XBU2R7.js +110 -0
- package/dist/chunk-F3XBU2R7.js.map +1 -0
- package/dist/chunk-GEHQXLEI.js +130 -0
- package/dist/chunk-GEHQXLEI.js.map +1 -0
- package/dist/chunk-GYCR2LOU.js +143 -0
- package/dist/chunk-GYCR2LOU.js.map +1 -0
- package/dist/chunk-GZP4UGGM.js +48 -0
- package/dist/chunk-GZP4UGGM.js.map +1 -0
- package/dist/chunk-H4E4THUZ.js +55 -0
- package/dist/chunk-H4E4THUZ.js.map +1 -0
- package/dist/chunk-HPJJSYNS.js +644 -0
- package/dist/chunk-HPJJSYNS.js.map +1 -0
- package/dist/chunk-JBH2ZYYZ.js +220 -0
- package/dist/chunk-JBH2ZYYZ.js.map +1 -0
- package/dist/chunk-JNKJ7NJV.js +78 -0
- package/dist/chunk-JNKJ7NJV.js.map +1 -0
- package/dist/chunk-JQ7VOSTC.js +437 -0
- package/dist/chunk-JQ7VOSTC.js.map +1 -0
- package/dist/chunk-KQDEK2ZW.js +199 -0
- package/dist/chunk-KQDEK2ZW.js.map +1 -0
- package/dist/chunk-O2QWO64Z.js +179 -0
- package/dist/chunk-O2QWO64Z.js.map +1 -0
- package/dist/chunk-OC4H6HJD.js +248 -0
- package/dist/chunk-OC4H6HJD.js.map +1 -0
- package/dist/chunk-PR7FKQBG.js +120 -0
- package/dist/chunk-PR7FKQBG.js.map +1 -0
- package/dist/chunk-PXZBAC2M.js +250 -0
- package/dist/chunk-PXZBAC2M.js.map +1 -0
- package/dist/chunk-QEPVTTHD.js +383 -0
- package/dist/chunk-QEPVTTHD.js.map +1 -0
- package/dist/chunk-RSRO7564.js +203 -0
- package/dist/chunk-RSRO7564.js.map +1 -0
- package/dist/chunk-SJUQ2NDR.js +146 -0
- package/dist/chunk-SJUQ2NDR.js.map +1 -0
- package/dist/chunk-SPYPLHMK.js +177 -0
- package/dist/chunk-SPYPLHMK.js.map +1 -0
- package/dist/chunk-SSCQCCJ7.js +75 -0
- package/dist/chunk-SSCQCCJ7.js.map +1 -0
- package/dist/chunk-SSR5AVRJ.js +41 -0
- package/dist/chunk-SSR5AVRJ.js.map +1 -0
- package/dist/chunk-T7QPXANZ.js +315 -0
- package/dist/chunk-T7QPXANZ.js.map +1 -0
- package/dist/chunk-U3WU5OWO.js +203 -0
- package/dist/chunk-U3WU5OWO.js.map +1 -0
- package/dist/chunk-W3DQTW63.js +124 -0
- package/dist/chunk-W3DQTW63.js.map +1 -0
- package/dist/chunk-WKEWRSDB.js +151 -0
- package/dist/chunk-WKEWRSDB.js.map +1 -0
- package/dist/chunk-Y7SAGNUT.js +66 -0
- package/dist/chunk-Y7SAGNUT.js.map +1 -0
- package/dist/chunk-YETJNRQM.js +39 -0
- package/dist/chunk-YETJNRQM.js.map +1 -0
- package/dist/chunk-YYSKGAZT.js +384 -0
- package/dist/chunk-YYSKGAZT.js.map +1 -0
- package/dist/chunk-ZZZWQGTS.js +169 -0
- package/dist/chunk-ZZZWQGTS.js.map +1 -0
- package/dist/claude-7LUVDZZ4.js +17 -0
- package/dist/claude-7LUVDZZ4.js.map +1 -0
- package/dist/cleanup-3LUWPSM7.js +412 -0
- package/dist/cleanup-3LUWPSM7.js.map +1 -0
- package/dist/cli-overrides-XFZWY7CM.js +16 -0
- package/dist/cli-overrides-XFZWY7CM.js.map +1 -0
- package/dist/cli.js +603 -0
- package/dist/cli.js.map +1 -0
- package/dist/color-ZVALX37U.js +21 -0
- package/dist/color-ZVALX37U.js.map +1 -0
- package/dist/enhance-XJIQHVPD.js +166 -0
- package/dist/enhance-XJIQHVPD.js.map +1 -0
- package/dist/env-MDFL4ZXL.js +23 -0
- package/dist/env-MDFL4ZXL.js.map +1 -0
- package/dist/feedback-23CLXKFT.js +158 -0
- package/dist/feedback-23CLXKFT.js.map +1 -0
- package/dist/finish-CY4CIH6O.js +1608 -0
- package/dist/finish-CY4CIH6O.js.map +1 -0
- package/dist/git-LVRZ57GJ.js +43 -0
- package/dist/git-LVRZ57GJ.js.map +1 -0
- package/dist/ignite-WXEF2ID5.js +359 -0
- package/dist/ignite-WXEF2ID5.js.map +1 -0
- package/dist/index.d.ts +1341 -0
- package/dist/index.js +3058 -0
- package/dist/index.js.map +1 -0
- package/dist/init-RHACUR4E.js +123 -0
- package/dist/init-RHACUR4E.js.map +1 -0
- package/dist/installation-detector-VARGFFRZ.js +11 -0
- package/dist/installation-detector-VARGFFRZ.js.map +1 -0
- package/dist/logger-MKYH4UDV.js +12 -0
- package/dist/logger-MKYH4UDV.js.map +1 -0
- package/dist/mcp/chunk-6SDFJ42P.js +62 -0
- package/dist/mcp/chunk-6SDFJ42P.js.map +1 -0
- package/dist/mcp/claude-YHHHLSXH.js +249 -0
- package/dist/mcp/claude-YHHHLSXH.js.map +1 -0
- package/dist/mcp/color-QS5BFCNN.js +168 -0
- package/dist/mcp/color-QS5BFCNN.js.map +1 -0
- package/dist/mcp/github-comment-server.js +165 -0
- package/dist/mcp/github-comment-server.js.map +1 -0
- package/dist/mcp/terminal-SDCMDVD7.js +202 -0
- package/dist/mcp/terminal-SDCMDVD7.js.map +1 -0
- package/dist/open-X6BTENPV.js +278 -0
- package/dist/open-X6BTENPV.js.map +1 -0
- package/dist/prompt-ANTQWHUF.js +13 -0
- package/dist/prompt-ANTQWHUF.js.map +1 -0
- package/dist/prompts/issue-prompt.txt +230 -0
- package/dist/prompts/pr-prompt.txt +35 -0
- package/dist/prompts/regular-prompt.txt +14 -0
- package/dist/run-2JCPQAX3.js +278 -0
- package/dist/run-2JCPQAX3.js.map +1 -0
- package/dist/schema/settings.schema.json +221 -0
- package/dist/start-LWVRBJ6S.js +982 -0
- package/dist/start-LWVRBJ6S.js.map +1 -0
- package/dist/terminal-3D6TUAKJ.js +16 -0
- package/dist/terminal-3D6TUAKJ.js.map +1 -0
- package/dist/test-git-XPF4SZXJ.js +52 -0
- package/dist/test-git-XPF4SZXJ.js.map +1 -0
- package/dist/test-prefix-XGFXFAYN.js +68 -0
- package/dist/test-prefix-XGFXFAYN.js.map +1 -0
- package/dist/test-tabs-JRKY3QMM.js +69 -0
- package/dist/test-tabs-JRKY3QMM.js.map +1 -0
- package/dist/test-webserver-M2I3EV4J.js +62 -0
- package/dist/test-webserver-M2I3EV4J.js.map +1 -0
- package/dist/update-3ZT2XX2G.js +79 -0
- package/dist/update-3ZT2XX2G.js.map +1 -0
- package/dist/update-notifier-QSSEB5KC.js +11 -0
- package/dist/update-notifier-QSSEB5KC.js.map +1 -0
- package/package.json +113 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ShellCompletion
|
|
4
|
+
} from "./chunk-O2QWO64Z.js";
|
|
5
|
+
import {
|
|
6
|
+
GitWorktreeManager
|
|
7
|
+
} from "./chunk-QEPVTTHD.js";
|
|
8
|
+
import "./chunk-JQ7VOSTC.js";
|
|
9
|
+
import {
|
|
10
|
+
logger
|
|
11
|
+
} from "./chunk-GEHQXLEI.js";
|
|
12
|
+
|
|
13
|
+
// src/cli.ts
|
|
14
|
+
import { program, Option } from "commander";
|
|
15
|
+
|
|
16
|
+
// src/utils/package-info.ts
|
|
17
|
+
import { readFileSync } from "fs";
|
|
18
|
+
import { fileURLToPath } from "url";
|
|
19
|
+
import { dirname, join } from "path";
|
|
20
|
+
function getPackageInfo(scriptPath) {
|
|
21
|
+
try {
|
|
22
|
+
let basePath;
|
|
23
|
+
if (scriptPath) {
|
|
24
|
+
basePath = scriptPath;
|
|
25
|
+
} else {
|
|
26
|
+
const __filename2 = fileURLToPath(import.meta.url);
|
|
27
|
+
basePath = __filename2;
|
|
28
|
+
}
|
|
29
|
+
const __dirname = dirname(basePath);
|
|
30
|
+
const packageJsonPath = join(__dirname, "..", "package.json");
|
|
31
|
+
const packageJsonContent = readFileSync(packageJsonPath, "utf8");
|
|
32
|
+
const packageJson2 = JSON.parse(packageJsonContent);
|
|
33
|
+
return packageJson2;
|
|
34
|
+
} catch (error) {
|
|
35
|
+
throw new Error(
|
|
36
|
+
`Failed to read package.json: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/cli.ts
|
|
42
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
43
|
+
var __filename = fileURLToPath2(import.meta.url);
|
|
44
|
+
var packageJson = getPackageInfo(__filename);
|
|
45
|
+
program.name("iloom").description(packageJson.description).version(packageJson.version).option("--debug", "Enable debug output (default: based on ILOOM_DEBUG env var)").option("--completion", "Output shell completion script for current shell").option("--set <key=value>", "Override any setting using dot notation (repeatable, e.g., --set workflows.issue.startIde=false)").allowUnknownOption().hook("preAction", async (thisCommand) => {
|
|
46
|
+
const options = thisCommand.opts();
|
|
47
|
+
const envDebug = process.env.ILOOM_DEBUG === "true";
|
|
48
|
+
const debugEnabled = options.debug !== void 0 ? options.debug : envDebug;
|
|
49
|
+
logger.setDebug(debugEnabled);
|
|
50
|
+
if (options.completion) {
|
|
51
|
+
const shellCompletion2 = new ShellCompletion();
|
|
52
|
+
shellCompletion2.printCompletionScript();
|
|
53
|
+
process.exit(0);
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const { checkAndNotifyUpdate } = await import("./update-notifier-QSSEB5KC.js");
|
|
57
|
+
const { detectInstallationMethod } = await import("./installation-detector-VARGFFRZ.js");
|
|
58
|
+
const installMethod = detectInstallationMethod(__filename);
|
|
59
|
+
await checkAndNotifyUpdate(packageJson.version, packageJson.name, installMethod);
|
|
60
|
+
} catch {
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const { SettingsMigrationManager } = await import("./SettingsMigrationManager-MTQIMI54.js");
|
|
64
|
+
const migrationManager = new SettingsMigrationManager();
|
|
65
|
+
await migrationManager.migrateSettingsIfNeeded();
|
|
66
|
+
} catch (error) {
|
|
67
|
+
logger.debug(`Settings migration failed: ${error instanceof Error ? error.message : "Unknown"}`);
|
|
68
|
+
}
|
|
69
|
+
await validateSettingsForCommand();
|
|
70
|
+
});
|
|
71
|
+
async function validateSettingsForCommand() {
|
|
72
|
+
try {
|
|
73
|
+
const { SettingsManager } = await import("./SettingsManager-VAZF26S2.js");
|
|
74
|
+
const settingsManager = new SettingsManager();
|
|
75
|
+
await settingsManager.loadSettings();
|
|
76
|
+
} catch (error) {
|
|
77
|
+
logger.error(`Configuration error: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
78
|
+
logger.info("Please fix your .iloom/settings.json file and try again.");
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
var shellCompletion = new ShellCompletion();
|
|
83
|
+
shellCompletion.init();
|
|
84
|
+
program.command("start").alias("create").alias("up").description("Create isolated workspace for an issue/PR").argument("[identifier]", "Issue number, PR number, or branch name (optional - will prompt if not provided)").option("--claude", "Enable Claude integration (default: true)").option("--no-claude", "Disable Claude integration").option("--code", "Enable VSCode (default: true)").option("--no-code", "Disable VSCode").option("--dev-server", "Enable dev server in terminal (default: true)").option("--no-dev-server", "Disable dev server").option("--terminal", "Enable terminal without dev server (default: false)").option("--no-terminal", "Disable terminal").addOption(
|
|
85
|
+
new Option("--one-shot <mode>", "One-shot automation mode").choices(["default", "noReview", "bypassPermissions"]).default("default")
|
|
86
|
+
).action(async (identifier, options) => {
|
|
87
|
+
try {
|
|
88
|
+
let finalIdentifier = identifier;
|
|
89
|
+
if (!finalIdentifier) {
|
|
90
|
+
const { promptInput } = await import("./prompt-ANTQWHUF.js");
|
|
91
|
+
finalIdentifier = await promptInput("Enter issue number, PR number (pr/123), or branch name");
|
|
92
|
+
if (!(finalIdentifier == null ? void 0 : finalIdentifier.trim())) {
|
|
93
|
+
logger.error("Identifier is required");
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const { StartCommand } = await import("./start-LWVRBJ6S.js");
|
|
98
|
+
const command = new StartCommand();
|
|
99
|
+
await command.execute({ identifier: finalIdentifier, options });
|
|
100
|
+
} catch (error) {
|
|
101
|
+
logger.error(`Failed to start workspace: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
program.command("add-issue").alias("a").description("Create and enhance GitHub issue without starting workspace").argument("<description>", "Natural language description of the issue (>50 chars, >2 spaces)").action(async (description) => {
|
|
106
|
+
try {
|
|
107
|
+
const { AddIssueCommand } = await import("./add-issue-22JBNOML.js");
|
|
108
|
+
const command = new AddIssueCommand();
|
|
109
|
+
const issueNumber = await command.execute({
|
|
110
|
+
description,
|
|
111
|
+
options: {}
|
|
112
|
+
});
|
|
113
|
+
logger.success(`Issue #${issueNumber} created successfully`);
|
|
114
|
+
process.exit(0);
|
|
115
|
+
} catch (error) {
|
|
116
|
+
logger.error(`Failed to create issue: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
program.command("feedback").alias("f").description("Submit feedback/bug report to iloom-cli repository").argument("<description>", "Natural language description of feedback (>50 chars, >2 spaces)").action(async (description) => {
|
|
121
|
+
try {
|
|
122
|
+
const { FeedbackCommand } = await import("./feedback-23CLXKFT.js");
|
|
123
|
+
const command = new FeedbackCommand();
|
|
124
|
+
const issueNumber = await command.execute({
|
|
125
|
+
description,
|
|
126
|
+
options: {}
|
|
127
|
+
});
|
|
128
|
+
logger.success(`Feedback submitted as issue #${issueNumber} in iloom-cli repository`);
|
|
129
|
+
process.exit(0);
|
|
130
|
+
} catch (error) {
|
|
131
|
+
logger.error(`Failed to submit feedback: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
program.command("enhance").description("Apply enhancement agent to existing GitHub issue").argument("<issue-number>", "GitHub issue number to enhance", parseInt).option("--no-browser", "Skip browser opening prompt").option("--author <username>", "GitHub username to tag in questions (for CI usage)").action(async (issueNumber, options) => {
|
|
136
|
+
try {
|
|
137
|
+
const { EnhanceCommand } = await import("./enhance-XJIQHVPD.js");
|
|
138
|
+
const command = new EnhanceCommand();
|
|
139
|
+
await command.execute({
|
|
140
|
+
issueNumber,
|
|
141
|
+
options: {
|
|
142
|
+
noBrowser: options.browser === false,
|
|
143
|
+
...options.author && { author: options.author }
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
logger.success(`Enhancement process completed for issue #${issueNumber}`);
|
|
147
|
+
process.exit(0);
|
|
148
|
+
} catch (error) {
|
|
149
|
+
logger.error(`Failed to enhance issue: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
program.command("finish").alias("dn").description("Merge work and cleanup workspace").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").option("-f, --force", "Skip confirmation prompts").option("-n, --dry-run", "Preview actions without executing").option("--pr <number>", "Treat input as PR number", parseFloat).option("--skip-build", "Skip post-merge build verification").action(async (identifier, options) => {
|
|
154
|
+
try {
|
|
155
|
+
const { FinishCommand } = await import("./finish-CY4CIH6O.js");
|
|
156
|
+
const command = new FinishCommand();
|
|
157
|
+
await command.execute({ identifier, options });
|
|
158
|
+
} catch (error) {
|
|
159
|
+
logger.error(`Failed to finish workspace: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
program.command("spin").alias("ignite").description("Launch Claude with auto-detected workspace context").addOption(
|
|
164
|
+
new Option("--one-shot <mode>", "One-shot automation mode").choices(["default", "noReview", "bypassPermissions"]).default("default")
|
|
165
|
+
).action(async (options) => {
|
|
166
|
+
try {
|
|
167
|
+
const { IgniteCommand } = await import("./ignite-WXEF2ID5.js");
|
|
168
|
+
const command = new IgniteCommand();
|
|
169
|
+
await command.execute(options.oneShot ?? "default");
|
|
170
|
+
} catch (error) {
|
|
171
|
+
logger.error(`Failed to spin up loom: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
program.command("open").description("Open workspace in browser or run CLI tool").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").allowUnknownOption().action(async (identifier, _options, command) => {
|
|
176
|
+
try {
|
|
177
|
+
const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
|
|
178
|
+
const { OpenCommand } = await import("./open-X6BTENPV.js");
|
|
179
|
+
const cmd = new OpenCommand();
|
|
180
|
+
const input = identifier ? { identifier, args } : { args };
|
|
181
|
+
await cmd.execute(input);
|
|
182
|
+
} catch (error) {
|
|
183
|
+
logger.error(`Failed to open: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
program.command("run").description("Run CLI tool or open workspace in browser").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").allowUnknownOption().action(async (identifier, _options, command) => {
|
|
188
|
+
try {
|
|
189
|
+
const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
|
|
190
|
+
const { RunCommand } = await import("./run-2JCPQAX3.js");
|
|
191
|
+
const cmd = new RunCommand();
|
|
192
|
+
const input = identifier ? { identifier, args } : { args };
|
|
193
|
+
await cmd.execute(input);
|
|
194
|
+
} catch (error) {
|
|
195
|
+
logger.error(`Failed to run: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
program.command("cleanup").description("Remove workspaces").argument("[identifier]", "Branch name or issue number to cleanup (auto-detected)").option("-l, --list", "List all worktrees").option("-a, --all", "Remove all worktrees (interactive confirmation)").option("-i, --issue <number>", "Cleanup by issue number", parseInt).option("-f, --force", "Skip confirmations and force removal").option("--dry-run", "Show what would be done without doing it").action(async (identifier, options) => {
|
|
200
|
+
try {
|
|
201
|
+
const { CleanupCommand } = await import("./cleanup-3LUWPSM7.js");
|
|
202
|
+
const command = new CleanupCommand();
|
|
203
|
+
const input = {
|
|
204
|
+
options: options ?? {}
|
|
205
|
+
};
|
|
206
|
+
if (identifier) {
|
|
207
|
+
input.identifier = identifier;
|
|
208
|
+
}
|
|
209
|
+
await command.execute(input);
|
|
210
|
+
} catch (error) {
|
|
211
|
+
logger.error(`Failed to cleanup worktrees: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
program.command("list").description("Show active workspaces").option("--json", "Output as JSON").action(async (options) => {
|
|
216
|
+
try {
|
|
217
|
+
const manager = new GitWorktreeManager();
|
|
218
|
+
const worktrees = await manager.listWorktrees({ porcelain: true });
|
|
219
|
+
if (options.json) {
|
|
220
|
+
console.log(JSON.stringify(worktrees, null, 2));
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (worktrees.length === 0) {
|
|
224
|
+
logger.info("No worktrees found");
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
logger.info("Active workspaces:");
|
|
228
|
+
for (const worktree of worktrees) {
|
|
229
|
+
const formatted = manager.formatWorktree(worktree);
|
|
230
|
+
logger.info(` ${formatted.title}`);
|
|
231
|
+
logger.info(` Path: ${formatted.path}`);
|
|
232
|
+
logger.info(` Commit: ${formatted.commit}`);
|
|
233
|
+
}
|
|
234
|
+
} catch (error) {
|
|
235
|
+
logger.error(`Failed to list worktrees: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
program.command("init").description("Initialize iloom configuration and setup shell autocomplete").action(async () => {
|
|
240
|
+
try {
|
|
241
|
+
const { InitCommand } = await import("./init-RHACUR4E.js");
|
|
242
|
+
const command = new InitCommand();
|
|
243
|
+
await command.execute();
|
|
244
|
+
} catch (error) {
|
|
245
|
+
logger.error(`Failed to initialize: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
program.command("update").description("Update iloom-cli to the latest version").option("--dry-run", "Show what would be done without actually updating").action(async (options) => {
|
|
250
|
+
try {
|
|
251
|
+
const { UpdateCommand } = await import("./update-3ZT2XX2G.js");
|
|
252
|
+
const command = new UpdateCommand();
|
|
253
|
+
await command.execute(options);
|
|
254
|
+
} catch (error) {
|
|
255
|
+
logger.error(`Failed to update: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
256
|
+
process.exit(1);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
program.command("test-github").description("Test GitHub integration (Issue #3)").argument("<identifier>", "Issue number or PR number").option("--no-claude", "Skip Claude for branch name generation").action(async (identifier, options) => {
|
|
260
|
+
try {
|
|
261
|
+
const { GitHubService } = await import("./GitHubService-F7Z3XJOS.js");
|
|
262
|
+
logger.info("Testing GitHub Integration\n");
|
|
263
|
+
const service = new GitHubService(options.claude !== void 0 ? { useClaude: options.claude } : {});
|
|
264
|
+
logger.info("Detecting input type...");
|
|
265
|
+
const detection = await service.detectInputType(identifier);
|
|
266
|
+
logger.info(` Type: ${detection.type}`);
|
|
267
|
+
logger.info(` Number: ${detection.number}`);
|
|
268
|
+
if (detection.type === "unknown") {
|
|
269
|
+
logger.error("Could not detect if input is an issue or PR");
|
|
270
|
+
process.exit(1);
|
|
271
|
+
}
|
|
272
|
+
logger.info("Fetching from GitHub...");
|
|
273
|
+
if (detection.type === "issue") {
|
|
274
|
+
if (!detection.number) {
|
|
275
|
+
throw new Error("Issue number not detected");
|
|
276
|
+
}
|
|
277
|
+
const issue = await service.fetchIssue(detection.number);
|
|
278
|
+
logger.success(` Issue #${issue.number}: ${issue.title}`);
|
|
279
|
+
logger.info(` State: ${issue.state}`);
|
|
280
|
+
logger.info(` Labels: ${issue.labels.join(", ") || "none"}`);
|
|
281
|
+
logger.info(` URL: ${issue.url}`);
|
|
282
|
+
logger.info("Generating branch name...");
|
|
283
|
+
const branchName = await service.generateBranchName({
|
|
284
|
+
issueNumber: issue.number,
|
|
285
|
+
title: issue.title
|
|
286
|
+
});
|
|
287
|
+
logger.success(` Branch: ${branchName}`);
|
|
288
|
+
logger.info("Extracting context for Claude...");
|
|
289
|
+
const context = service.extractContext(issue);
|
|
290
|
+
logger.info(` ${context.split("\n").join("\n ")}`);
|
|
291
|
+
} else {
|
|
292
|
+
if (!detection.number) {
|
|
293
|
+
throw new Error("PR number not detected");
|
|
294
|
+
}
|
|
295
|
+
const pr = await service.fetchPR(detection.number);
|
|
296
|
+
logger.success(` PR #${pr.number}: ${pr.title}`);
|
|
297
|
+
logger.info(` State: ${pr.state}`);
|
|
298
|
+
logger.info(` Branch: ${pr.branch}`);
|
|
299
|
+
logger.info(` Base: ${pr.baseBranch}`);
|
|
300
|
+
logger.info(` URL: ${pr.url}`);
|
|
301
|
+
logger.info("Extracting context for Claude...");
|
|
302
|
+
const context = service.extractContext(pr);
|
|
303
|
+
logger.info(` ${context.split("\n").join("\n ")}`);
|
|
304
|
+
}
|
|
305
|
+
logger.success("All GitHub integration tests passed!");
|
|
306
|
+
} catch (error) {
|
|
307
|
+
logger.error(`Test failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
308
|
+
if (error instanceof Error && error.stack) {
|
|
309
|
+
logger.debug(error.stack);
|
|
310
|
+
}
|
|
311
|
+
process.exit(1);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
program.command("test-claude").description("Test Claude integration (Issue #10)").option("--detect", "Test Claude CLI detection").option("--version", "Get Claude CLI version").option("--branch <title>", "Test branch name generation with given title").option("--issue <number>", "Issue number for branch generation", "123").option("--launch <prompt>", "Launch Claude with a prompt (headless)").option("--interactive", "Launch Claude interactively (requires --launch)").option("--template <name>", "Test template loading").action(async (options) => {
|
|
315
|
+
try {
|
|
316
|
+
const { detectClaudeCli, getClaudeVersion, generateBranchName, launchClaude } = await import("./claude-7LUVDZZ4.js");
|
|
317
|
+
const { PromptTemplateManager } = await import("./PromptTemplateManager-7FINLRDE.js");
|
|
318
|
+
const { ClaudeService } = await import("./ClaudeService-YSZ6EXWP.js");
|
|
319
|
+
const { ClaudeContextManager } = await import("./ClaudeContextManager-XOSXQ67R.js");
|
|
320
|
+
logger.info("Testing Claude Integration\n");
|
|
321
|
+
if (options.detect) {
|
|
322
|
+
logger.info("Detecting Claude CLI...");
|
|
323
|
+
const isAvailable = await detectClaudeCli();
|
|
324
|
+
if (isAvailable) {
|
|
325
|
+
logger.success(" Claude CLI is available");
|
|
326
|
+
} else {
|
|
327
|
+
logger.error(" Claude CLI not found");
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (options.version) {
|
|
331
|
+
logger.info("Getting Claude version...");
|
|
332
|
+
const version = await getClaudeVersion();
|
|
333
|
+
if (version) {
|
|
334
|
+
logger.success(` Version: ${version}`);
|
|
335
|
+
} else {
|
|
336
|
+
logger.error(" Could not get version");
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (options.branch) {
|
|
340
|
+
logger.info("Generating branch name...");
|
|
341
|
+
const issueNumber = parseInt(options.issue ?? "123");
|
|
342
|
+
logger.info(` Issue #${issueNumber}: ${options.branch}`);
|
|
343
|
+
const branchName = await generateBranchName(options.branch, issueNumber);
|
|
344
|
+
logger.success(` Generated: ${branchName}`);
|
|
345
|
+
}
|
|
346
|
+
if (options.launch) {
|
|
347
|
+
logger.info("Launching Claude...");
|
|
348
|
+
logger.info(` Prompt: "${options.launch}"`);
|
|
349
|
+
logger.info(` Mode: ${options.interactive ? "Interactive" : "Headless"}`);
|
|
350
|
+
if (options.interactive) {
|
|
351
|
+
logger.info(" Launching Claude in new terminal...");
|
|
352
|
+
await launchClaude(options.launch, { headless: false });
|
|
353
|
+
logger.info(" (Claude should open in a separate process)");
|
|
354
|
+
} else {
|
|
355
|
+
logger.info(" Waiting for response...");
|
|
356
|
+
const result = await launchClaude(options.launch, { headless: true });
|
|
357
|
+
if (result) {
|
|
358
|
+
logger.success(" Response:");
|
|
359
|
+
logger.info(` ${result.split("\n").join("\n ")}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (options.template) {
|
|
364
|
+
logger.info("Loading template...");
|
|
365
|
+
logger.info(` Template: ${options.template}`);
|
|
366
|
+
const manager = new PromptTemplateManager();
|
|
367
|
+
try {
|
|
368
|
+
const content = await manager.loadTemplate(options.template);
|
|
369
|
+
logger.success(" Template loaded successfully");
|
|
370
|
+
logger.info(" First 200 chars:");
|
|
371
|
+
logger.info(` ${content.substring(0, 200).split("\n").join("\n ")}...`);
|
|
372
|
+
} catch (error) {
|
|
373
|
+
logger.error(` Failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
if (!options.detect && !options.version && !options.branch && !options.launch && !options.template) {
|
|
377
|
+
logger.info("Running full Claude integration test suite...\n");
|
|
378
|
+
logger.info("1. Testing Claude CLI detection...");
|
|
379
|
+
const isAvailable = await detectClaudeCli();
|
|
380
|
+
if (isAvailable) {
|
|
381
|
+
logger.success(" Claude CLI is available");
|
|
382
|
+
} else {
|
|
383
|
+
logger.error(" Claude CLI not found");
|
|
384
|
+
logger.info("\nSkipping remaining tests since Claude CLI is not available");
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
logger.info("\n2. Getting Claude version...");
|
|
388
|
+
const version = await getClaudeVersion();
|
|
389
|
+
if (version) {
|
|
390
|
+
logger.success(` Version: ${version}`);
|
|
391
|
+
} else {
|
|
392
|
+
logger.error(" Could not get version");
|
|
393
|
+
}
|
|
394
|
+
logger.info("\n3. Testing branch name generation...");
|
|
395
|
+
const testIssueNumber = 123;
|
|
396
|
+
const testTitle = "Add user authentication feature";
|
|
397
|
+
logger.info(` Issue #${testIssueNumber}: ${testTitle}`);
|
|
398
|
+
const branchName = await generateBranchName(testTitle, testIssueNumber);
|
|
399
|
+
logger.success(` Generated: ${branchName}`);
|
|
400
|
+
logger.info("\n4. Testing ClaudeService initialization...");
|
|
401
|
+
new ClaudeService();
|
|
402
|
+
logger.success(" Service initialized");
|
|
403
|
+
logger.info("\n5. Testing ClaudeContextManager...");
|
|
404
|
+
const contextManager = new ClaudeContextManager();
|
|
405
|
+
await contextManager.prepareContext({
|
|
406
|
+
type: "issue",
|
|
407
|
+
identifier: 123,
|
|
408
|
+
title: "Test issue",
|
|
409
|
+
workspacePath: process.cwd(),
|
|
410
|
+
port: 3123
|
|
411
|
+
});
|
|
412
|
+
logger.success(" Context prepared");
|
|
413
|
+
logger.info("\n6. Testing template loading...");
|
|
414
|
+
const templateManager = new PromptTemplateManager();
|
|
415
|
+
const templates = ["issue", "pr", "regular"];
|
|
416
|
+
let templateCount = 0;
|
|
417
|
+
for (const template of templates) {
|
|
418
|
+
try {
|
|
419
|
+
await templateManager.loadTemplate(template);
|
|
420
|
+
logger.success(` ${template} template loaded`);
|
|
421
|
+
templateCount++;
|
|
422
|
+
} catch {
|
|
423
|
+
logger.warn(` ${template} template not found`);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
logger.info(` Loaded ${templateCount}/${templates.length} templates`);
|
|
427
|
+
logger.info("\n7. Testing Claude launch (headless)...");
|
|
428
|
+
logger.info(' Sending test prompt: "Say hello"');
|
|
429
|
+
try {
|
|
430
|
+
const result = await launchClaude("Say hello", { headless: true });
|
|
431
|
+
if (result) {
|
|
432
|
+
logger.success(" Claude responded successfully");
|
|
433
|
+
logger.info(` Response preview: ${result.substring(0, 100)}...`);
|
|
434
|
+
} else {
|
|
435
|
+
logger.warn(" No response received");
|
|
436
|
+
}
|
|
437
|
+
} catch (error) {
|
|
438
|
+
logger.error(` Launch failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
439
|
+
}
|
|
440
|
+
logger.info("\n" + "=".repeat(50));
|
|
441
|
+
logger.success("All Claude integration tests complete!");
|
|
442
|
+
logger.info("Summary: All core Claude features are working correctly");
|
|
443
|
+
}
|
|
444
|
+
} catch (error) {
|
|
445
|
+
logger.error(`Test failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
446
|
+
if (error instanceof Error && error.stack) {
|
|
447
|
+
logger.debug(error.stack);
|
|
448
|
+
}
|
|
449
|
+
process.exit(1);
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
program.command("test-webserver").description("Test if a web server is running on a workspace port").argument("<issue-number>", "Issue number (port will be calculated as 3000 + issue number)", parseInt).option("--kill", "Kill the web server if detected").action(async (issueNumber, options) => {
|
|
453
|
+
try {
|
|
454
|
+
const { TestWebserverCommand } = await import("./test-webserver-M2I3EV4J.js");
|
|
455
|
+
const command = new TestWebserverCommand();
|
|
456
|
+
await command.execute({ issueNumber, options });
|
|
457
|
+
} catch (error) {
|
|
458
|
+
logger.error(`Test webserver failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
459
|
+
if (error instanceof Error && error.stack) {
|
|
460
|
+
logger.debug(error.stack);
|
|
461
|
+
}
|
|
462
|
+
process.exit(1);
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
program.command("test-git").description("Test Git integration - findMainWorktreePath() function (reads .iloom/settings.json)").action(async () => {
|
|
466
|
+
try {
|
|
467
|
+
const { TestGitCommand } = await import("./test-git-XPF4SZXJ.js");
|
|
468
|
+
const command = new TestGitCommand();
|
|
469
|
+
await command.execute();
|
|
470
|
+
} catch (error) {
|
|
471
|
+
logger.error(`Test git failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
472
|
+
if (error instanceof Error && error.stack) {
|
|
473
|
+
logger.debug(error.stack);
|
|
474
|
+
}
|
|
475
|
+
process.exit(1);
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
program.command("test-tabs").description("Test iTerm2 dual tab functionality - opens two tabs with test commands").action(async () => {
|
|
479
|
+
try {
|
|
480
|
+
const { TestTabsCommand } = await import("./test-tabs-JRKY3QMM.js");
|
|
481
|
+
const command = new TestTabsCommand();
|
|
482
|
+
await command.execute();
|
|
483
|
+
} catch (error) {
|
|
484
|
+
logger.error(`Test tabs failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
485
|
+
if (error instanceof Error && error.stack) {
|
|
486
|
+
logger.debug(error.stack);
|
|
487
|
+
}
|
|
488
|
+
process.exit(1);
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
program.command("test-prefix").description("Test worktree prefix configuration - preview worktree paths (reads .iloom/settings.json)").action(async () => {
|
|
492
|
+
try {
|
|
493
|
+
const { TestPrefixCommand } = await import("./test-prefix-XGFXFAYN.js");
|
|
494
|
+
const command = new TestPrefixCommand();
|
|
495
|
+
await command.execute();
|
|
496
|
+
} catch (error) {
|
|
497
|
+
logger.error(`Test prefix failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
498
|
+
if (error instanceof Error && error.stack) {
|
|
499
|
+
logger.debug(error.stack);
|
|
500
|
+
}
|
|
501
|
+
process.exit(1);
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
program.command("test-neon").description("Test Neon integration and debug configuration").action(async () => {
|
|
505
|
+
try {
|
|
506
|
+
const { NeonProvider } = await import("./NeonProvider-PAGPUH7F.js");
|
|
507
|
+
const { loadEnvIntoProcess } = await import("./env-MDFL4ZXL.js");
|
|
508
|
+
logger.info("Testing Neon Integration\n");
|
|
509
|
+
logger.info("0. Loading environment variables...");
|
|
510
|
+
const envResult = loadEnvIntoProcess();
|
|
511
|
+
if (envResult.error) {
|
|
512
|
+
logger.warn(` Warning: ${envResult.error.message}`);
|
|
513
|
+
}
|
|
514
|
+
if (envResult.parsed) {
|
|
515
|
+
logger.success(` Loaded ${Object.keys(envResult.parsed).length} environment variables`);
|
|
516
|
+
} else {
|
|
517
|
+
logger.info(" No .env files found or parsed");
|
|
518
|
+
}
|
|
519
|
+
logger.info("\n1. Environment Variables:");
|
|
520
|
+
logger.info(` NEON_PROJECT_ID: ${process.env.NEON_PROJECT_ID ?? "(not set)"}`);
|
|
521
|
+
logger.info(` NEON_PARENT_BRANCH: ${process.env.NEON_PARENT_BRANCH ?? "(not set)"}`);
|
|
522
|
+
logger.info("\n2. Creating NeonProvider...");
|
|
523
|
+
try {
|
|
524
|
+
const neonProvider = new NeonProvider({
|
|
525
|
+
projectId: process.env.NEON_PROJECT_ID ?? "",
|
|
526
|
+
parentBranch: process.env.NEON_PARENT_BRANCH ?? ""
|
|
527
|
+
});
|
|
528
|
+
logger.success(" NeonProvider created successfully");
|
|
529
|
+
logger.info("\n3. Testing Neon CLI availability...");
|
|
530
|
+
const isAvailable = await neonProvider.isCliAvailable();
|
|
531
|
+
if (isAvailable) {
|
|
532
|
+
logger.success(" Neon CLI is available");
|
|
533
|
+
} else {
|
|
534
|
+
logger.error(" Neon CLI not found");
|
|
535
|
+
logger.info(" Install with: npm install -g @neon/cli");
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
logger.info("\n4. Testing Neon CLI authentication...");
|
|
539
|
+
const isAuthenticated = await neonProvider.isAuthenticated();
|
|
540
|
+
if (isAuthenticated) {
|
|
541
|
+
logger.success(" Neon CLI is authenticated");
|
|
542
|
+
} else {
|
|
543
|
+
logger.error(" Neon CLI not authenticated");
|
|
544
|
+
logger.info(" Run: neon auth");
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
if (process.env.NEON_PROJECT_ID) {
|
|
548
|
+
logger.info("\n5. Testing branch listing...");
|
|
549
|
+
try {
|
|
550
|
+
const branches = await neonProvider.listBranches();
|
|
551
|
+
logger.success(` Found ${branches.length} branches:`);
|
|
552
|
+
for (const branch of branches.slice(0, 5)) {
|
|
553
|
+
logger.info(` - ${branch}`);
|
|
554
|
+
}
|
|
555
|
+
if (branches.length > 5) {
|
|
556
|
+
logger.info(` ... and ${branches.length - 5} more`);
|
|
557
|
+
}
|
|
558
|
+
} catch (error) {
|
|
559
|
+
logger.error(` Failed to list branches: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
560
|
+
}
|
|
561
|
+
} else {
|
|
562
|
+
logger.warn("\n5. Skipping branch listing (NEON_PROJECT_ID not set)");
|
|
563
|
+
}
|
|
564
|
+
} catch (error) {
|
|
565
|
+
logger.error(` Failed to create NeonProvider: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
566
|
+
if (error instanceof Error && error.message.includes("NEON_PROJECT_ID")) {
|
|
567
|
+
logger.info("\n This is expected if NEON_PROJECT_ID is not set.");
|
|
568
|
+
logger.info(" Set NEON_PROJECT_ID and NEON_PARENT_BRANCH environment variables to test fully.");
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
logger.info("\n" + "=".repeat(50));
|
|
572
|
+
logger.success("Neon integration test complete!");
|
|
573
|
+
} catch (error) {
|
|
574
|
+
logger.error(`Test failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
575
|
+
if (error instanceof Error && error.stack) {
|
|
576
|
+
logger.debug(error.stack);
|
|
577
|
+
}
|
|
578
|
+
process.exit(1);
|
|
579
|
+
}
|
|
580
|
+
});
|
|
581
|
+
program.command("help").description("Display help information").argument("[command]", "Show help for specific command").action(async (command) => {
|
|
582
|
+
if (command) {
|
|
583
|
+
const subCommand = program.commands.find((cmd) => cmd.name() === command);
|
|
584
|
+
if (subCommand) {
|
|
585
|
+
subCommand.outputHelp();
|
|
586
|
+
} else {
|
|
587
|
+
logger.error(`Unknown command: ${command}`);
|
|
588
|
+
program.outputHelp();
|
|
589
|
+
}
|
|
590
|
+
} else {
|
|
591
|
+
program.outputHelp();
|
|
592
|
+
}
|
|
593
|
+
process.exit(0);
|
|
594
|
+
});
|
|
595
|
+
try {
|
|
596
|
+
await program.parseAsync();
|
|
597
|
+
} catch (error) {
|
|
598
|
+
if (error instanceof Error) {
|
|
599
|
+
logger.error(`Error: ${error.message}`);
|
|
600
|
+
process.exit(1);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
//# sourceMappingURL=cli.js.map
|