@maestroai/cli 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,545 @@
1
+ import {
2
+ checkClaudeInstalled,
3
+ getClaudeInstallInstructions
4
+ } from "../../../chunk-A3PN4QCM.js";
5
+
6
+ // src/tui/init/InitTUI.tsx
7
+ import { useState, useCallback } from "react";
8
+ import { Box, Text, useInput, useApp, render } from "ink";
9
+ import TextInput from "ink-text-input";
10
+ import figures from "figures";
11
+ import * as fs from "fs";
12
+ import * as path from "path";
13
+ import { existsSync } from "fs";
14
+ import { jsx, jsxs } from "react/jsx-runtime";
15
+ var SMALL_LOGO = `
16
+ _ __ ____ _____
17
+ | |/ / | _ \\ / ____|
18
+ | ' / ___ ___ | |_) | | __
19
+ | < / _ \\ / _ \\| _ <| | |_ |
20
+ | . \\ __/ __/| |_) | |__| |
21
+ |_|\\_\\___|\\___||____/ \\_____|
22
+ `;
23
+ function InitTUI({ detectedTech, onSubmit, onCancel }) {
24
+ const { exit } = useApp();
25
+ const [screen, setScreen] = useState("welcome");
26
+ const [options, setOptions] = useState({
27
+ projectName: "",
28
+ description: "",
29
+ devCount: 3,
30
+ techStack: {}
31
+ });
32
+ useInput((input, key) => {
33
+ if (key.escape || key.ctrl && input === "c") {
34
+ onCancel();
35
+ exit();
36
+ }
37
+ });
38
+ const handleSubmit = useCallback(() => {
39
+ onSubmit(options);
40
+ }, [options, onSubmit]);
41
+ if (screen === "welcome") {
42
+ return /* @__PURE__ */ jsx(WelcomeScreen, { onNext: () => setScreen("projectName") });
43
+ }
44
+ if (screen === "projectName") {
45
+ return /* @__PURE__ */ jsx(
46
+ WizardScreen,
47
+ {
48
+ title: "Project Name",
49
+ step: 1,
50
+ totalSteps: 5,
51
+ children: /* @__PURE__ */ jsx(
52
+ ProjectNameForm,
53
+ {
54
+ initialValue: options.projectName,
55
+ onSubmit: (name) => {
56
+ setOptions({ ...options, projectName: name });
57
+ setScreen("description");
58
+ }
59
+ }
60
+ )
61
+ }
62
+ );
63
+ }
64
+ if (screen === "description") {
65
+ return /* @__PURE__ */ jsx(
66
+ WizardScreen,
67
+ {
68
+ title: "Project Goal",
69
+ step: 2,
70
+ totalSteps: 5,
71
+ children: /* @__PURE__ */ jsx(
72
+ DescriptionForm,
73
+ {
74
+ initialValue: options.description,
75
+ onSubmit: (desc) => {
76
+ setOptions({ ...options, description: desc });
77
+ setScreen("devCount");
78
+ }
79
+ }
80
+ )
81
+ }
82
+ );
83
+ }
84
+ if (screen === "devCount") {
85
+ return /* @__PURE__ */ jsx(
86
+ WizardScreen,
87
+ {
88
+ title: "Team Size",
89
+ step: 3,
90
+ totalSteps: 5,
91
+ children: /* @__PURE__ */ jsx(
92
+ DevCountForm,
93
+ {
94
+ initialValue: options.devCount,
95
+ onSubmit: (count) => {
96
+ setOptions({ ...options, devCount: count });
97
+ setScreen("techStack");
98
+ }
99
+ }
100
+ )
101
+ }
102
+ );
103
+ }
104
+ if (screen === "techStack") {
105
+ return /* @__PURE__ */ jsx(
106
+ WizardScreen,
107
+ {
108
+ title: "Tech Stack",
109
+ step: 4,
110
+ totalSteps: 5,
111
+ children: /* @__PURE__ */ jsx(
112
+ TechStackForm,
113
+ {
114
+ detectedTech,
115
+ initialValues: options.techStack,
116
+ onSubmit: (tech) => {
117
+ setOptions({ ...options, techStack: tech });
118
+ setScreen("review");
119
+ }
120
+ }
121
+ )
122
+ }
123
+ );
124
+ }
125
+ if (screen === "review") {
126
+ return /* @__PURE__ */ jsx(
127
+ ReviewScreen,
128
+ {
129
+ options,
130
+ onEdit: setScreen,
131
+ onSubmit: handleSubmit,
132
+ onCancel
133
+ }
134
+ );
135
+ }
136
+ return null;
137
+ }
138
+ function WizardScreen({
139
+ title,
140
+ step,
141
+ totalSteps,
142
+ children
143
+ }) {
144
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", height: "100%", width: "100%", children: [
145
+ /* @__PURE__ */ jsx(Box, { flexDirection: "column", alignItems: "center", paddingY: 1, borderBottom: true, children: /* @__PURE__ */ jsx(Box, { flexDirection: "column", alignItems: "center", children: /* @__PURE__ */ jsx(Text, { bold: true, color: "green", children: SMALL_LOGO.trim().split("\n").map((line, i) => /* @__PURE__ */ jsx(Text, { color: i === 0 ? "green" : "white", children: line }, i)) }) }) }),
146
+ /* @__PURE__ */ jsx(Box, { width: "100%", paddingX: 2, paddingY: 1, children: /* @__PURE__ */ jsx(Box, { width: "100%", justifyContent: "space-around", children: Array.from({ length: totalSteps }).map((_, i) => /* @__PURE__ */ jsx(
147
+ Box,
148
+ {
149
+ width: 10,
150
+ justifyContent: "center",
151
+ paddingY: 1,
152
+ children: /* @__PURE__ */ jsxs(
153
+ Text,
154
+ {
155
+ color: i < step ? "green" : "gray",
156
+ bold: i === step,
157
+ dimColor: i > step,
158
+ children: [
159
+ i + 1,
160
+ ". ",
161
+ i < step ? "\u2713" : ["Name", "Goal", "Team", "Stack", "Review"][i]
162
+ ]
163
+ }
164
+ )
165
+ },
166
+ i
167
+ )) }) }),
168
+ /* @__PURE__ */ jsx(Box, { flexGrow: 1, justifyContent: "center", flexDirection: "column", paddingX: 2, children: /* @__PURE__ */ jsxs(Box, { flexDirection: "column", alignItems: "center", width: 80, children: [
169
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { bold: true, color: "cyan", children: title }) }),
170
+ children
171
+ ] }) }),
172
+ /* @__PURE__ */ jsx(Box, { paddingX: 2, paddingY: 1, borderTop: true, justifyContent: "center", children: /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
173
+ "Press ",
174
+ /* @__PURE__ */ jsx(Text, { bold: true, children: "Enter" }),
175
+ " to continue \u2022 ",
176
+ /* @__PURE__ */ jsx(Text, { bold: true, children: "Esc" }),
177
+ " to cancel"
178
+ ] }) })
179
+ ] });
180
+ }
181
+ function WelcomeScreen({ onNext }) {
182
+ useInput((input, key) => {
183
+ if (key.return) {
184
+ onNext();
185
+ }
186
+ });
187
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", height: "100%", width: "100%", justifyContent: "center", alignItems: "center", children: [
188
+ /* @__PURE__ */ jsx(Box, { flexDirection: "column", alignItems: "center", marginBottom: 2, children: /* @__PURE__ */ jsx(Text, { bold: true, color: "green", children: SMALL_LOGO.trim().split("\n").map((line, i) => /* @__PURE__ */ jsx(Text, { color: i === 0 ? "greenBright" : "white", children: line }, i)) }) }),
189
+ /* @__PURE__ */ jsx(Box, { marginBottom: 2, children: /* @__PURE__ */ jsx(Text, { bold: true, color: "cyan", children: "Welcome to Maestro" }) }),
190
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Orchestrate multiple AI agents working together as a team" }) }),
191
+ /* @__PURE__ */ jsx(Box, { marginTop: 2, marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "This wizard will help you set up a new project." }) }),
192
+ /* @__PURE__ */ jsx(Box, { marginTop: 2, children: /* @__PURE__ */ jsx(Text, { color: "yellow", bold: true, children: "Press Enter to begin" }) }),
193
+ /* @__PURE__ */ jsx(Box, { marginTop: 3, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Press Esc at any time to cancel" }) })
194
+ ] });
195
+ }
196
+ function ProjectNameForm({ initialValue, onSubmit }) {
197
+ const [value, setValue] = useState(initialValue);
198
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: 60, children: [
199
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Enter a name for your project:" }) }),
200
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsxs(Box, { width: 60, borderStyle: "single", borderColor: "cyan", paddingX: 1, flexDirection: "row", children: [
201
+ /* @__PURE__ */ jsx(Text, { color: "white", children: "Name: " }),
202
+ /* @__PURE__ */ jsx(
203
+ TextInput,
204
+ {
205
+ value,
206
+ onChange: setValue,
207
+ onSubmit,
208
+ placeholder: "my-awesome-project"
209
+ }
210
+ )
211
+ ] }) }),
212
+ /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Example: my-app, task-manager, portfolio-site" }) })
213
+ ] });
214
+ }
215
+ function DescriptionForm({ initialValue, onSubmit }) {
216
+ const [value, setValue] = useState(initialValue);
217
+ const handleSubmit = () => {
218
+ onSubmit(value || "Build a new project");
219
+ };
220
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: 70, children: [
221
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Describe what you want to build:" }) }),
222
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, width: 70, borderStyle: "single", borderColor: "cyan", paddingX: 1, children: /* @__PURE__ */ jsx(
223
+ TextInput,
224
+ {
225
+ value,
226
+ onChange: setValue,
227
+ onSubmit: handleSubmit,
228
+ placeholder: "A task management app with user authentication, real-time updates..."
229
+ }
230
+ ) }),
231
+ /* @__PURE__ */ jsxs(Box, { marginTop: 1, children: [
232
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Tip: For detailed requirements, use " }),
233
+ /* @__PURE__ */ jsx(Text, { bold: true, children: "maestro init --instructions file.md" })
234
+ ] })
235
+ ] });
236
+ }
237
+ function DevCountForm({ initialValue, onSubmit }) {
238
+ const [value, setValue] = useState(initialValue.toString());
239
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: 60, children: [
240
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "How many developer agents should work on this project?" }) }),
241
+ /* @__PURE__ */ jsxs(Box, { marginBottom: 1, width: 60, borderStyle: "single", borderColor: "cyan", paddingX: 1, children: [
242
+ /* @__PURE__ */ jsx(Text, { color: "white", children: "Agents: " }),
243
+ /* @__PURE__ */ jsx(
244
+ TextInput,
245
+ {
246
+ value,
247
+ onChange: setValue,
248
+ onSubmit: (v) => onSubmit(Math.max(1, Math.min(10, parseInt(v, 10) || 3))),
249
+ placeholder: "3"
250
+ }
251
+ )
252
+ ] }),
253
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "More agents = parallel work, but higher cost" }) }),
254
+ /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Recommended: 3-5 agents" }) })
255
+ ] });
256
+ }
257
+ function TechStackForm({
258
+ detectedTech,
259
+ initialValues,
260
+ onSubmit
261
+ }) {
262
+ const [focused, setFocused] = useState("frontend");
263
+ const [values, setValues] = useState({
264
+ frontend: initialValues.frontend ?? detectedTech?.frontend ?? "",
265
+ uiLibrary: initialValues.uiLibrary ?? detectedTech?.uiLibrary ?? "",
266
+ backend: initialValues.backend ?? detectedTech?.backend ?? "",
267
+ database: initialValues.database ?? "",
268
+ other: initialValues.other ?? ""
269
+ });
270
+ const fields = [
271
+ { key: "frontend", label: "Frontend", placeholder: "react, vue, svelte, next.js" },
272
+ { key: "uiLibrary", label: "UI Library", placeholder: "shadcn, tailwind, material-ui" },
273
+ { key: "backend", label: "Backend", placeholder: "node/express, python/fastapi, go" },
274
+ { key: "database", label: "Database", placeholder: "postgres, mongodb, sqlite" },
275
+ { key: "other", label: "Other", placeholder: "redis, elasticsearch, etc." }
276
+ ];
277
+ useInput((input, key) => {
278
+ if (key.tab) {
279
+ const currentIndex = fields.findIndex((f) => f.key === focused);
280
+ if (currentIndex < fields.length - 1) {
281
+ setFocused(fields[currentIndex + 1].key);
282
+ } else {
283
+ setFocused("done");
284
+ }
285
+ } else if (key.shift && key.tab) {
286
+ const currentIndex = focused === "done" ? fields.length - 1 : fields.findIndex((f) => f.key === focused);
287
+ if (currentIndex > 0) {
288
+ setFocused(fields[currentIndex - 1].key);
289
+ }
290
+ } else if (key.return && focused === "done") {
291
+ onSubmit(values);
292
+ }
293
+ });
294
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: 70, children: [
295
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Enter your tech stack (all optional, press Enter to skip):" }) }),
296
+ fields.map((field) => /* @__PURE__ */ jsxs(Box, { marginBottom: 1, width: 70, children: [
297
+ /* @__PURE__ */ jsx(Box, { width: 15, children: /* @__PURE__ */ jsxs(Text, { color: focused === field.key ? "cyan" : "white", bold: focused === field.key, children: [
298
+ field.label,
299
+ ":"
300
+ ] }) }),
301
+ /* @__PURE__ */ jsx(
302
+ TextInput,
303
+ {
304
+ value: values[field.key] || "",
305
+ onChange: (v) => setValues({ ...values, [field.key]: v }),
306
+ placeholder: field.placeholder,
307
+ focus: focused === field.key,
308
+ onSubmit: () => {
309
+ const currentIndex = fields.findIndex((f) => f.key === focused);
310
+ if (currentIndex < fields.length - 1) {
311
+ setFocused(fields[currentIndex + 1].key);
312
+ } else {
313
+ setFocused("done");
314
+ }
315
+ }
316
+ }
317
+ )
318
+ ] }, field.key)),
319
+ /* @__PURE__ */ jsxs(Box, { marginTop: 1, width: 70, children: [
320
+ /* @__PURE__ */ jsxs(
321
+ Text,
322
+ {
323
+ bold: focused === "done",
324
+ color: focused === "done" ? "green" : "white",
325
+ children: [
326
+ focused === "done" ? figures.pointer : " ",
327
+ " [Done]"
328
+ ]
329
+ }
330
+ ),
331
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: " - Press Enter to continue" })
332
+ ] }),
333
+ /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Use Tab to navigate between fields" }) })
334
+ ] });
335
+ }
336
+ function ReviewScreen({
337
+ options,
338
+ onEdit,
339
+ onSubmit,
340
+ onCancel
341
+ }) {
342
+ const [focused, setFocused] = useState("confirm");
343
+ useInput((input, key) => {
344
+ if (key.leftArrow) {
345
+ setFocused("confirm");
346
+ } else if (key.rightArrow) {
347
+ setFocused("cancel");
348
+ } else if (key.return) {
349
+ if (focused === "confirm") {
350
+ onSubmit();
351
+ } else {
352
+ onCancel();
353
+ }
354
+ } else if (input === "1") {
355
+ onEdit("projectName");
356
+ } else if (input === "2") {
357
+ onEdit("description");
358
+ } else if (input === "3") {
359
+ onEdit("devCount");
360
+ } else if (input === "4") {
361
+ onEdit("techStack");
362
+ }
363
+ });
364
+ const techParts = Object.entries(options.techStack).filter(([_, v]) => v);
365
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", height: "100%", width: "100%", children: [
366
+ /* @__PURE__ */ jsx(Box, { flexDirection: "column", alignItems: "center", paddingY: 1, borderBottom: true, children: /* @__PURE__ */ jsx(Box, { flexDirection: "column", alignItems: "center", children: /* @__PURE__ */ jsx(Text, { bold: true, color: "green", children: SMALL_LOGO.trim().split("\n").map((line, i) => /* @__PURE__ */ jsx(Text, { color: i === 0 ? "green" : "white", children: line }, i)) }) }) }),
367
+ /* @__PURE__ */ jsx(Box, { flexGrow: 1, justifyContent: "center", flexDirection: "column", paddingX: 2, children: /* @__PURE__ */ jsxs(Box, { flexDirection: "column", alignItems: "center", width: 80, children: [
368
+ /* @__PURE__ */ jsx(Box, { marginBottom: 2, children: /* @__PURE__ */ jsx(Text, { bold: true, color: "cyan", children: "Review Configuration" }) }),
369
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: 70, marginBottom: 2, children: [
370
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Press a number to edit, or use arrow keys to select:" }) }),
371
+ /* @__PURE__ */ jsx(
372
+ ReviewOptionRow,
373
+ {
374
+ number: 1,
375
+ label: "Project Name",
376
+ value: options.projectName || "<not set>"
377
+ }
378
+ ),
379
+ /* @__PURE__ */ jsx(
380
+ ReviewOptionRow,
381
+ {
382
+ number: 2,
383
+ label: "Description",
384
+ value: (options.description || "<not set>").slice(0, 50) + (options.description?.length > 50 ? "..." : "")
385
+ }
386
+ ),
387
+ /* @__PURE__ */ jsx(
388
+ ReviewOptionRow,
389
+ {
390
+ number: 3,
391
+ label: "Developer Agents",
392
+ value: String(options.devCount)
393
+ }
394
+ ),
395
+ /* @__PURE__ */ jsx(
396
+ ReviewOptionRow,
397
+ {
398
+ number: 4,
399
+ label: "Tech Stack",
400
+ value: techParts.length > 0 ? techParts.map(([_, v]) => `${v}`).join(", ") : "<not set>"
401
+ }
402
+ )
403
+ ] }),
404
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "row", gap: 4, children: [
405
+ /* @__PURE__ */ jsx(
406
+ Box,
407
+ {
408
+ borderStyle: focused === "confirm" ? "bold" : "single",
409
+ borderColor: focused === "confirm" ? "green" : "gray",
410
+ paddingX: 2,
411
+ paddingY: 1,
412
+ children: /* @__PURE__ */ jsxs(Text, { bold: true, color: focused === "confirm" ? "green" : "white", children: [
413
+ focused === "confirm" && figures.pointer,
414
+ " Confirm"
415
+ ] })
416
+ }
417
+ ),
418
+ /* @__PURE__ */ jsx(
419
+ Box,
420
+ {
421
+ borderStyle: focused === "cancel" ? "bold" : "single",
422
+ borderColor: focused === "cancel" ? "red" : "gray",
423
+ paddingX: 2,
424
+ paddingY: 1,
425
+ children: /* @__PURE__ */ jsxs(Text, { bold: true, color: focused === "cancel" ? "red" : "white", children: [
426
+ focused === "cancel" && figures.pointer,
427
+ " Cancel"
428
+ ] })
429
+ }
430
+ )
431
+ ] }),
432
+ /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Press Enter to confirm or cancel \u2022 Use arrow keys to select" }) })
433
+ ] }) }),
434
+ /* @__PURE__ */ jsx(Box, { paddingX: 2, paddingY: 1, borderTop: true, justifyContent: "center", children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Press 1-4 to edit \u2022 Arrow keys to select \u2022 Enter to confirm" }) })
435
+ ] });
436
+ }
437
+ function ReviewOptionRow({ number, label, value }) {
438
+ return /* @__PURE__ */ jsxs(
439
+ Box,
440
+ {
441
+ width: 70,
442
+ paddingX: 1,
443
+ borderStyle: "single",
444
+ borderColor: "gray",
445
+ marginBottom: 1,
446
+ children: [
447
+ /* @__PURE__ */ jsx(Box, { width: 4, children: /* @__PURE__ */ jsxs(Text, { color: "cyan", bold: true, children: [
448
+ number,
449
+ "."
450
+ ] }) }),
451
+ /* @__PURE__ */ jsx(Box, { width: 18, children: /* @__PURE__ */ jsxs(Text, { bold: true, children: [
452
+ label,
453
+ ":"
454
+ ] }) }),
455
+ /* @__PURE__ */ jsx(Box, { flexGrow: 1, children: /* @__PURE__ */ jsx(Text, { color: value === "<not set>" ? "gray" : "green", children: value }) })
456
+ ]
457
+ }
458
+ );
459
+ }
460
+ function detectExistingProject(dir) {
461
+ const result = {
462
+ type: "unknown",
463
+ techStack: {},
464
+ hasExistingCode: false,
465
+ configFiles: []
466
+ };
467
+ const pkgJsonPath = path.resolve(dir, "package.json");
468
+ if (existsSync(pkgJsonPath)) {
469
+ result.hasExistingCode = true;
470
+ result.configFiles.push("package.json");
471
+ try {
472
+ const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
473
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
474
+ if (allDeps["next"]) result.techStack.frontend = "next.js";
475
+ else if (allDeps["react"]) result.techStack.frontend = "react";
476
+ else if (allDeps["vue"]) result.techStack.frontend = "vue";
477
+ else if (allDeps["svelte"]) result.techStack.frontend = "svelte";
478
+ else if (allDeps["angular"]) result.techStack.frontend = "angular";
479
+ if (allDeps["@shadcn/ui"] || allDeps["shadcn-ui"] || allDeps["shadcn"]) result.techStack.uiLibrary = "shadcn";
480
+ else if (allDeps["tailwindcss"]) result.techStack.uiLibrary = "tailwind";
481
+ if (allDeps["express"]) result.techStack.backend = "node/express";
482
+ else if (allDeps["fastify"]) result.techStack.backend = "node/fastify";
483
+ else if (allDeps["hono"]) result.techStack.backend = "node/hono";
484
+ result.type = "node";
485
+ } catch {
486
+ }
487
+ }
488
+ return result;
489
+ }
490
+ function renderInitTUI({ dir, instructions, onExit }) {
491
+ return new Promise((resolve2) => {
492
+ const targetDir = path.resolve(dir);
493
+ const claudeCheck = checkClaudeInstalled();
494
+ if (!claudeCheck.installed) {
495
+ console.log("\nClaude CLI is not installed");
496
+ console.log("\nMaestro requires Claude CLI to orchestrate agents.");
497
+ console.log("\nInstallation Instructions:");
498
+ console.log(getClaudeInstallInstructions());
499
+ console.log();
500
+ onExit();
501
+ process.exit(1);
502
+ return;
503
+ }
504
+ const detected = detectExistingProject(targetDir);
505
+ let instructionsContent = "";
506
+ if (instructions) {
507
+ const instrPath = path.resolve(instructions);
508
+ if (existsSync(instrPath)) {
509
+ instructionsContent = fs.readFileSync(instrPath, "utf-8").trim();
510
+ }
511
+ }
512
+ const App = () => {
513
+ const { exit } = useApp();
514
+ const handleSubmit = (opts) => {
515
+ exit();
516
+ resolve2(opts);
517
+ };
518
+ const handleCancel = () => {
519
+ exit();
520
+ resolve2(null);
521
+ onExit();
522
+ };
523
+ return /* @__PURE__ */ jsx(
524
+ InitTUI,
525
+ {
526
+ detectedTech: detected.techStack,
527
+ onSubmit: handleSubmit,
528
+ onCancel: handleCancel
529
+ }
530
+ );
531
+ };
532
+ const { rerender, unmount } = render(/* @__PURE__ */ jsx(App, {}));
533
+ const onSigInt = () => {
534
+ unmount();
535
+ resolve2(null);
536
+ onExit();
537
+ };
538
+ process.once("SIGINT", onSigInt);
539
+ });
540
+ }
541
+ export {
542
+ InitTUI,
543
+ renderInitTUI
544
+ };
545
+ //# sourceMappingURL=InitTUI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/tui/init/InitTUI.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect } from 'react';\nimport { Box, Text, useInput, useApp, render } from 'ink';\nimport TextInput from 'ink-text-input';\nimport figures from 'figures';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { checkClaudeInstalled, getClaudeInstallInstructions } from '../../utils/claude-check.js';\n\ninterface InitOptions {\n projectName: string;\n description: string;\n devCount: number;\n techStack: {\n frontend?: string;\n uiLibrary?: string;\n backend?: string;\n database?: string;\n other?: string;\n };\n}\n\ninterface InitTUIProps {\n detectedTech?: {\n frontend?: string;\n uiLibrary?: string;\n backend?: string;\n };\n onSubmit: (options: InitOptions) => void;\n onCancel: () => void;\n}\n\ntype Screen = 'welcome' | 'projectName' | 'description' | 'devCount' | 'techStack' | 'review';\n\nconst SMALL_LOGO = `\n _ __ ____ _____\n | |/ / | _ \\\\ / ____|\n | ' / ___ ___ | |_) | | __\n | < / _ \\\\ / _ \\\\| _ <| | |_ |\n | . \\\\ __/ __/| |_) | |__| |\n |_|\\\\_\\\\___|\\\\___||____/ \\\\_____|\n`;\n\nexport function InitTUI({ detectedTech, onSubmit, onCancel }: InitTUIProps) {\n const { exit } = useApp();\n const [screen, setScreen] = useState<Screen>('welcome');\n const [options, setOptions] = useState<InitOptions>({\n projectName: '',\n description: '',\n devCount: 3,\n techStack: {},\n });\n\n // Global exit handler\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n onCancel();\n exit();\n }\n });\n\n const handleSubmit = useCallback(() => {\n onSubmit(options);\n }, [options, onSubmit]);\n\n if (screen === 'welcome') {\n return <WelcomeScreen onNext={() => setScreen('projectName')} />;\n }\n\n if (screen === 'projectName') {\n return (\n <WizardScreen\n title=\"Project Name\"\n step={1}\n totalSteps={5}\n >\n <ProjectNameForm\n initialValue={options.projectName}\n onSubmit={(name) => {\n setOptions({ ...options, projectName: name });\n setScreen('description');\n }}\n />\n </WizardScreen>\n );\n }\n\n if (screen === 'description') {\n return (\n <WizardScreen\n title=\"Project Goal\"\n step={2}\n totalSteps={5}\n >\n <DescriptionForm\n initialValue={options.description}\n onSubmit={(desc) => {\n setOptions({ ...options, description: desc });\n setScreen('devCount');\n }}\n />\n </WizardScreen>\n );\n }\n\n if (screen === 'devCount') {\n return (\n <WizardScreen\n title=\"Team Size\"\n step={3}\n totalSteps={5}\n >\n <DevCountForm\n initialValue={options.devCount}\n onSubmit={(count) => {\n setOptions({ ...options, devCount: count });\n setScreen('techStack');\n }}\n />\n </WizardScreen>\n );\n }\n\n if (screen === 'techStack') {\n return (\n <WizardScreen\n title=\"Tech Stack\"\n step={4}\n totalSteps={5}\n >\n <TechStackForm\n detectedTech={detectedTech}\n initialValues={options.techStack}\n onSubmit={(tech) => {\n setOptions({ ...options, techStack: tech });\n setScreen('review');\n }}\n />\n </WizardScreen>\n );\n }\n\n if (screen === 'review') {\n return (\n <ReviewScreen\n options={options}\n onEdit={setScreen}\n onSubmit={handleSubmit}\n onCancel={onCancel}\n />\n );\n }\n\n return null;\n}\n\nfunction WizardScreen({\n title,\n step,\n totalSteps,\n children,\n}: {\n title: string;\n step: number;\n totalSteps: number;\n children: React.ReactNode;\n}) {\n return (\n <Box flexDirection=\"column\" height=\"100%\" width=\"100%\">\n {/* Header with Logo */}\n <Box flexDirection=\"column\" alignItems=\"center\" paddingY={1} borderBottom>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text bold color=\"green\">\n {SMALL_LOGO.trim().split('\\n').map((line, i) => (\n <Text key={i} color={i === 0 ? 'green' : 'white'}>\n {line}\n </Text>\n ))}\n </Text>\n </Box>\n </Box>\n\n {/* Progress Bar */}\n <Box width=\"100%\" paddingX={2} paddingY={1}>\n <Box width=\"100%\" justifyContent=\"space-around\">\n {Array.from({ length: totalSteps }).map((_, i) => (\n <Box\n key={i}\n width={10}\n justifyContent=\"center\"\n paddingY={1}\n >\n <Text\n color={i < step ? 'green' : 'gray'}\n bold={i === step}\n dimColor={i > step}\n >\n {i + 1}. {i < step ? '✓' : ['Name', 'Goal', 'Team', 'Stack', 'Review'][i]}\n </Text>\n </Box>\n ))}\n </Box>\n </Box>\n\n {/* Main Content - Centered */}\n <Box flexGrow={1} justifyContent=\"center\" flexDirection=\"column\" paddingX={2}>\n <Box flexDirection=\"column\" alignItems=\"center\" width={80}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{title}</Text>\n </Box>\n {children}\n </Box>\n </Box>\n\n {/* Footer */}\n <Box paddingX={2} paddingY={1} borderTop justifyContent=\"center\">\n <Text dimColor>\n Press <Text bold>Enter</Text> to continue • <Text bold>Esc</Text> to cancel\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction WelcomeScreen({ onNext }: { onNext: () => void }) {\n useInput((input, key) => {\n if (key.return) {\n onNext();\n }\n });\n\n return (\n <Box flexDirection=\"column\" height=\"100%\" width=\"100%\" justifyContent=\"center\" alignItems=\"center\">\n <Box flexDirection=\"column\" alignItems=\"center\" marginBottom={2}>\n <Text bold color=\"green\">\n {SMALL_LOGO.trim().split('\\n').map((line, i) => (\n <Text key={i} color={i === 0 ? 'greenBright' : 'white'}>\n {line}\n </Text>\n ))}\n </Text>\n </Box>\n\n <Box marginBottom={2}>\n <Text bold color=\"cyan\">Welcome to Maestro</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text dimColor>Orchestrate multiple AI agents working together as a team</Text>\n </Box>\n\n <Box marginTop={2} marginBottom={1}>\n <Text dimColor>This wizard will help you set up a new project.</Text>\n </Box>\n\n <Box marginTop={2}>\n <Text color=\"yellow\" bold>Press Enter to begin</Text>\n </Box>\n\n <Box marginTop={3}>\n <Text dimColor>Press Esc at any time to cancel</Text>\n </Box>\n </Box>\n );\n}\n\nfunction ProjectNameForm({ initialValue, onSubmit }: { initialValue: string; onSubmit: (name: string) => void }) {\n const [value, setValue] = useState(initialValue);\n\n return (\n <Box flexDirection=\"column\" width={60}>\n <Box marginBottom={1}>\n <Text dimColor>Enter a name for your project:</Text>\n </Box>\n <Box marginBottom={1}>\n <Box width={60} borderStyle=\"single\" borderColor=\"cyan\" paddingX={1} flexDirection=\"row\">\n <Text color=\"white\">Name: </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={onSubmit}\n placeholder=\"my-awesome-project\"\n />\n </Box>\n </Box>\n <Box>\n <Text dimColor>Example: my-app, task-manager, portfolio-site</Text>\n </Box>\n </Box>\n );\n}\n\ninterface DescriptionFormProps {\n initialValue: string;\n onSubmit: (desc: string) => void;\n}\n\nfunction DescriptionForm({ initialValue, onSubmit }: DescriptionFormProps) {\n const [value, setValue] = useState(initialValue);\n\n const handleSubmit = () => {\n onSubmit(value || 'Build a new project');\n };\n\n return (\n <Box flexDirection=\"column\" width={70}>\n <Box marginBottom={1}>\n <Text dimColor>Describe what you want to build:</Text>\n </Box>\n <Box marginBottom={1} width={70} borderStyle=\"single\" borderColor=\"cyan\" paddingX={1}>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={handleSubmit}\n placeholder=\"A task management app with user authentication, real-time updates...\"\n />\n </Box>\n <Box marginTop={1}>\n <Text dimColor>Tip: For detailed requirements, use </Text>\n <Text bold>maestro init --instructions file.md</Text>\n </Box>\n </Box>\n );\n}\n\nfunction DevCountForm({ initialValue, onSubmit }: { initialValue: number; onSubmit: (count: number) => void }) {\n const [value, setValue] = useState(initialValue.toString());\n\n return (\n <Box flexDirection=\"column\" width={60}>\n <Box marginBottom={1}>\n <Text dimColor>How many developer agents should work on this project?</Text>\n </Box>\n <Box marginBottom={1} width={60} borderStyle=\"single\" borderColor=\"cyan\" paddingX={1}>\n <Text color=\"white\">Agents: </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={(v) => onSubmit(Math.max(1, Math.min(10, parseInt(v, 10) || 3)))}\n placeholder=\"3\"\n />\n </Box>\n <Box marginBottom={1}>\n <Text dimColor>More agents = parallel work, but higher cost</Text>\n </Box>\n <Box>\n <Text dimColor>Recommended: 3-5 agents</Text>\n </Box>\n </Box>\n );\n}\n\nfunction TechStackForm({\n detectedTech,\n initialValues,\n onSubmit,\n}: {\n detectedTech?: { frontend?: string; uiLibrary?: string; backend?: string };\n initialValues: InitOptions['techStack'];\n onSubmit: (tech: InitOptions['techStack']) => void;\n}) {\n const [focused, setFocused] = useState<keyof InitOptions['techStack'] | 'done'>('frontend');\n const [values, setValues] = useState<InitOptions['techStack']>({\n frontend: initialValues.frontend ?? detectedTech?.frontend ?? '',\n uiLibrary: initialValues.uiLibrary ?? detectedTech?.uiLibrary ?? '',\n backend: initialValues.backend ?? detectedTech?.backend ?? '',\n database: initialValues.database ?? '',\n other: initialValues.other ?? '',\n });\n\n const fields: Array<{ key: keyof InitOptions['techStack']; label: string; placeholder: string }> = [\n { key: 'frontend', label: 'Frontend', placeholder: 'react, vue, svelte, next.js' },\n { key: 'uiLibrary', label: 'UI Library', placeholder: 'shadcn, tailwind, material-ui' },\n { key: 'backend', label: 'Backend', placeholder: 'node/express, python/fastapi, go' },\n { key: 'database', label: 'Database', placeholder: 'postgres, mongodb, sqlite' },\n { key: 'other', label: 'Other', placeholder: 'redis, elasticsearch, etc.' },\n ];\n\n useInput((input, key) => {\n if (key.tab) {\n const currentIndex = fields.findIndex(f => f.key === focused);\n if (currentIndex < fields.length - 1) {\n setFocused(fields[currentIndex + 1].key);\n } else {\n setFocused('done');\n }\n } else if (key.shift && key.tab) {\n const currentIndex = focused === 'done' ? fields.length - 1 : fields.findIndex(f => f.key === focused);\n if (currentIndex > 0) {\n setFocused(fields[currentIndex - 1].key);\n }\n } else if (key.return && focused === 'done') {\n onSubmit(values);\n }\n });\n\n return (\n <Box flexDirection=\"column\" width={70}>\n <Box marginBottom={1}>\n <Text dimColor>Enter your tech stack (all optional, press Enter to skip):</Text>\n </Box>\n\n {fields.map((field) => (\n <Box key={field.key} marginBottom={1} width={70}>\n <Box width={15}>\n <Text color={focused === field.key ? 'cyan' : 'white'} bold={focused === field.key}>\n {field.label}:\n </Text>\n </Box>\n <TextInput\n value={values[field.key] || ''}\n onChange={(v) => setValues({ ...values, [field.key]: v })}\n placeholder={field.placeholder}\n focus={focused === field.key}\n onSubmit={() => {\n const currentIndex = fields.findIndex(f => f.key === focused);\n if (currentIndex < fields.length - 1) {\n setFocused(fields[currentIndex + 1].key);\n } else {\n setFocused('done');\n }\n }}\n />\n </Box>\n ))}\n\n <Box marginTop={1} width={70}>\n <Text\n bold={focused === 'done'}\n color={focused === 'done' ? 'green' : 'white'}\n >\n {focused === 'done' ? figures.pointer : ' '} [Done]\n </Text>\n <Text dimColor> - Press Enter to continue</Text>\n </Box>\n <Box>\n <Text dimColor>Use Tab to navigate between fields</Text>\n </Box>\n </Box>\n );\n}\n\nfunction ReviewScreen({\n options,\n onEdit,\n onSubmit,\n onCancel,\n}: {\n options: InitOptions;\n onEdit: (screen: Screen) => void;\n onSubmit: () => void;\n onCancel: () => void;\n}) {\n const [focused, setFocused] = useState<'confirm' | 'cancel'>('confirm');\n\n useInput((input, key) => {\n if (key.leftArrow) {\n setFocused('confirm');\n } else if (key.rightArrow) {\n setFocused('cancel');\n } else if (key.return) {\n if (focused === 'confirm') {\n onSubmit();\n } else {\n onCancel();\n }\n } else if (input === '1') {\n onEdit('projectName');\n } else if (input === '2') {\n onEdit('description');\n } else if (input === '3') {\n onEdit('devCount');\n } else if (input === '4') {\n onEdit('techStack');\n }\n });\n\n const techParts = Object.entries(options.techStack).filter(([_, v]) => v);\n\n return (\n <Box flexDirection=\"column\" height=\"100%\" width=\"100%\">\n {/* Header */}\n <Box flexDirection=\"column\" alignItems=\"center\" paddingY={1} borderBottom>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text bold color=\"green\">\n {SMALL_LOGO.trim().split('\\n').map((line, i) => (\n <Text key={i} color={i === 0 ? 'green' : 'white'}>\n {line}\n </Text>\n ))}\n </Text>\n </Box>\n </Box>\n\n {/* Main Content */}\n <Box flexGrow={1} justifyContent=\"center\" flexDirection=\"column\" paddingX={2}>\n <Box flexDirection=\"column\" alignItems=\"center\" width={80}>\n <Box marginBottom={2}>\n <Text bold color=\"cyan\">Review Configuration</Text>\n </Box>\n\n <Box flexDirection=\"column\" width={70} marginBottom={2}>\n <Box marginBottom={1}>\n <Text dimColor>Press a number to edit, or use arrow keys to select:</Text>\n </Box>\n\n <ReviewOptionRow\n number={1}\n label=\"Project Name\"\n value={options.projectName || '<not set>'}\n />\n\n <ReviewOptionRow\n number={2}\n label=\"Description\"\n value={(options.description || '<not set>').slice(0, 50) + (options.description?.length > 50 ? '...' : '')}\n />\n\n <ReviewOptionRow\n number={3}\n label=\"Developer Agents\"\n value={String(options.devCount)}\n />\n\n <ReviewOptionRow\n number={4}\n label=\"Tech Stack\"\n value={techParts.length > 0 ? techParts.map(([_, v]) => `${v}`).join(', ') : '<not set>'}\n />\n </Box>\n\n {/* Action Buttons */}\n <Box flexDirection=\"row\" gap={4}>\n <Box\n borderStyle={focused === 'confirm' ? 'bold' : 'single'}\n borderColor={focused === 'confirm' ? 'green' : 'gray'}\n paddingX={2}\n paddingY={1}\n >\n <Text bold color={focused === 'confirm' ? 'green' : 'white'}>\n {focused === 'confirm' && figures.pointer} Confirm\n </Text>\n </Box>\n\n <Box\n borderStyle={focused === 'cancel' ? 'bold' : 'single'}\n borderColor={focused === 'cancel' ? 'red' : 'gray'}\n paddingX={2}\n paddingY={1}\n >\n <Text bold color={focused === 'cancel' ? 'red' : 'white'}>\n {focused === 'cancel' && figures.pointer} Cancel\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>Press Enter to confirm or cancel • Use arrow keys to select</Text>\n </Box>\n </Box>\n </Box>\n\n {/* Footer */}\n <Box paddingX={2} paddingY={1} borderTop justifyContent=\"center\">\n <Text dimColor>Press 1-4 to edit • Arrow keys to select • Enter to confirm</Text>\n </Box>\n </Box>\n );\n}\n\nfunction ReviewOptionRow({ number, label, value }: {\n number: number;\n label: string;\n value: string;\n}) {\n return (\n <Box\n width={70}\n paddingX={1}\n borderStyle=\"single\"\n borderColor=\"gray\"\n marginBottom={1}\n >\n <Box width={4}>\n <Text color=\"cyan\" bold>{number}.</Text>\n </Box>\n <Box width={18}>\n <Text bold>{label}:</Text>\n </Box>\n <Box flexGrow={1}>\n <Text color={value === '<not set>' ? 'gray' : 'green'}>\n {value}\n </Text>\n </Box>\n </Box>\n );\n}\n\n// Detect existing project tech stack\nfunction detectExistingProject(dir: string): {\n type: string;\n techStack: { frontend?: string; uiLibrary?: string; backend?: string; database?: string };\n hasExistingCode: boolean;\n configFiles: string[];\n} {\n const result = {\n type: 'unknown',\n techStack: {} as { frontend?: string; uiLibrary?: string; backend?: string; database?: string },\n hasExistingCode: false,\n configFiles: [] as string[],\n };\n\n const pkgJsonPath = path.resolve(dir, 'package.json');\n if (existsSync(pkgJsonPath)) {\n result.hasExistingCode = true;\n result.configFiles.push('package.json');\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n if (allDeps['next']) result.techStack.frontend = 'next.js';\n else if (allDeps['react']) result.techStack.frontend = 'react';\n else if (allDeps['vue']) result.techStack.frontend = 'vue';\n else if (allDeps['svelte']) result.techStack.frontend = 'svelte';\n else if (allDeps['angular']) result.techStack.frontend = 'angular';\n\n if (allDeps['@shadcn/ui'] || allDeps['shadcn-ui'] || allDeps['shadcn']) result.techStack.uiLibrary = 'shadcn';\n else if (allDeps['tailwindcss']) result.techStack.uiLibrary = 'tailwind';\n\n if (allDeps['express']) result.techStack.backend = 'node/express';\n else if (allDeps['fastify']) result.techStack.backend = 'node/fastify';\n else if (allDeps['hono']) result.techStack.backend = 'node/hono';\n\n result.type = 'node';\n } catch { /* ignore */ }\n }\n\n return result;\n}\n\ninterface RenderInitTUIOptions {\n dir: string;\n instructions?: string;\n onExit: () => void;\n}\n\nexport function renderInitTUI({ dir, instructions, onExit }: RenderInitTUIOptions): Promise<InitOptions | null> {\n return new Promise((resolve) => {\n const targetDir = path.resolve(dir);\n\n // Check Claude first\n const claudeCheck = checkClaudeInstalled();\n if (!claudeCheck.installed) {\n console.log('\\nClaude CLI is not installed');\n console.log('\\nMaestro requires Claude CLI to orchestrate agents.');\n console.log('\\nInstallation Instructions:');\n console.log(getClaudeInstallInstructions());\n console.log();\n onExit();\n process.exit(1);\n return;\n }\n\n // Detect existing project\n const detected = detectExistingProject(targetDir);\n\n // Read instructions if provided\n let instructionsContent = '';\n if (instructions) {\n const instrPath = path.resolve(instructions);\n if (existsSync(instrPath)) {\n instructionsContent = fs.readFileSync(instrPath, 'utf-8').trim();\n }\n }\n\n const App = () => {\n const { exit } = useApp();\n\n const handleSubmit = (opts: InitOptions) => {\n exit();\n resolve(opts);\n };\n\n const handleCancel = () => {\n exit();\n resolve(null);\n onExit();\n };\n\n return (\n <InitTUI\n detectedTech={detected.techStack}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n />\n );\n };\n\n const { rerender, unmount } = render(<App />);\n\n // Handle Ctrl+C\n const onSigInt = () => {\n unmount();\n resolve(null);\n onExit();\n };\n process.once('SIGINT', onSigInt);\n });\n}\n"],"mappings":"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","names":["resolve"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maestroai/cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "description": "CLI for Maestro - orchestrate multiple Claude Code agents working as a team",
6
6
  "bin": {
@@ -16,8 +16,9 @@
16
16
  "figures": "^6.1.0",
17
17
  "ink": "^5.1.0",
18
18
  "ink-spinner": "^5.0.0",
19
+ "ink-text-input": "^6.0.0",
19
20
  "react": "^18.3.0",
20
- "@maestroai/core": "0.1.1"
21
+ "@maestroai/core": "0.1.2"
21
22
  },
22
23
  "devDependencies": {
23
24
  "@types/react": "^18.3.0",