automata-cli 0.1.0-feature-030-do-work.196 → 0.1.0-feature-030-do-work.198
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/dist/ConfigWizard-NTK7NLAE.js +478 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/ConfigWizard-XTUCCDAF.js +0 -601
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
DEFAULT_CHECK_ISSUE_PROMPT,
|
|
4
|
+
DEFAULT_DO_WORK,
|
|
5
|
+
DEFAULT_DO_WORK_ISSUE_DISCUSS_PROMPT,
|
|
6
|
+
DEFAULT_DO_WORK_PR_WORK_PROMPT,
|
|
7
|
+
DEFAULT_FIX_COMMENTS_PROMPT,
|
|
8
|
+
DEFAULT_SONAR_PROMPT,
|
|
9
|
+
readConfig,
|
|
10
|
+
readRawConfig,
|
|
11
|
+
writeConfig
|
|
12
|
+
} from "./chunk-UA32XYYL.js";
|
|
13
|
+
|
|
14
|
+
// src/config/ConfigWizard.tsx
|
|
15
|
+
import { useState } from "react";
|
|
16
|
+
import { Box, Text, useInput, useApp } from "ink";
|
|
17
|
+
import { writeFileSync, mkdirSync } from "fs";
|
|
18
|
+
import { join } from "path";
|
|
19
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
20
|
+
function writePromptFile(filename, content) {
|
|
21
|
+
const dir = join(process.cwd(), ".automata");
|
|
22
|
+
mkdirSync(dir, { recursive: true });
|
|
23
|
+
writeFileSync(join(dir, filename), content, "utf8");
|
|
24
|
+
}
|
|
25
|
+
var REMOTE_OPTIONS = [
|
|
26
|
+
{ label: "GitHub", value: "gh" },
|
|
27
|
+
{ label: "Azure DevOps", value: "azdo" }
|
|
28
|
+
];
|
|
29
|
+
var TECHNIQUE_OPTIONS = [
|
|
30
|
+
{ label: "By Label", value: "label" },
|
|
31
|
+
{ label: "By Assignee", value: "assignee" },
|
|
32
|
+
{ label: "By Title Contains", value: "title-contains" }
|
|
33
|
+
];
|
|
34
|
+
var EXECUTOR_OPTIONS = [
|
|
35
|
+
{ label: "Claude Code", value: "claude" },
|
|
36
|
+
{ label: "Codex", value: "codex" }
|
|
37
|
+
];
|
|
38
|
+
var MAIN_MENU_OPTIONS = ["Remote / Mode", "Implement-Next", "Prompts", "Issue Watch", "Do Work"];
|
|
39
|
+
var PROMPTS_MENU_OPTIONS = [
|
|
40
|
+
"Sonar",
|
|
41
|
+
"Fix-Comments",
|
|
42
|
+
"Check-Issue",
|
|
43
|
+
"Do Work \u2014 Discuss",
|
|
44
|
+
"Do Work \u2014 PR"
|
|
45
|
+
];
|
|
46
|
+
function parseAllowedUsers(value) {
|
|
47
|
+
return value.split(",").map((user) => user.trim()).filter((user) => user.length > 0);
|
|
48
|
+
}
|
|
49
|
+
function handleTextEntry(input, key, screen, cancel) {
|
|
50
|
+
if (key.return) {
|
|
51
|
+
screen.onSubmit();
|
|
52
|
+
} else if (key.backspace || key.delete) {
|
|
53
|
+
screen.setValue((value) => value.slice(0, -1));
|
|
54
|
+
} else if (key.escape) {
|
|
55
|
+
screen.onBack();
|
|
56
|
+
} else if (key.ctrl && input === "c") {
|
|
57
|
+
cancel();
|
|
58
|
+
} else if (input && !key.ctrl && !key.meta) {
|
|
59
|
+
screen.setValue((value) => value + input);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function handleMenu(input, key, menu, cancel) {
|
|
63
|
+
if (key.upArrow) {
|
|
64
|
+
menu.setIndex((i) => i > 0 ? i - 1 : menu.length - 1);
|
|
65
|
+
} else if (key.downArrow) {
|
|
66
|
+
menu.setIndex((i) => i < menu.length - 1 ? i + 1 : 0);
|
|
67
|
+
} else if (key.return) {
|
|
68
|
+
menu.onSelect();
|
|
69
|
+
} else if (key.escape) {
|
|
70
|
+
if (menu.onBack) menu.onBack();
|
|
71
|
+
else cancel();
|
|
72
|
+
} else if (key.ctrl && input === "c") {
|
|
73
|
+
cancel();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function TextEntryScreen({ title, label, value, hint }) {
|
|
77
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
78
|
+
/* @__PURE__ */ jsx(Text, { bold: true, children: title }),
|
|
79
|
+
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
80
|
+
/* @__PURE__ */ jsxs(Text, { children: [
|
|
81
|
+
label,
|
|
82
|
+
" ",
|
|
83
|
+
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
84
|
+
value,
|
|
85
|
+
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
86
|
+
] })
|
|
87
|
+
] }),
|
|
88
|
+
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
89
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: hint })
|
|
90
|
+
] });
|
|
91
|
+
}
|
|
92
|
+
function MenuEntryScreen({ title, options, index, hint }) {
|
|
93
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
94
|
+
/* @__PURE__ */ jsx(Text, { bold: true, children: title }),
|
|
95
|
+
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
96
|
+
options.map((option, optionIndex) => /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(Text, { color: optionIndex === index ? "cyan" : void 0, children: [
|
|
97
|
+
optionIndex === index ? "\u276F " : " ",
|
|
98
|
+
option
|
|
99
|
+
] }) }, option)),
|
|
100
|
+
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
101
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: hint })
|
|
102
|
+
] });
|
|
103
|
+
}
|
|
104
|
+
var BACK = "Esc to go back \xB7 Ctrl+C to cancel";
|
|
105
|
+
function savePrompt(filename, content, merge) {
|
|
106
|
+
let value;
|
|
107
|
+
if (content) {
|
|
108
|
+
writePromptFile(filename, content);
|
|
109
|
+
value = filename;
|
|
110
|
+
}
|
|
111
|
+
writeConfig(merge(value, readRawConfig()));
|
|
112
|
+
}
|
|
113
|
+
var PROMPT_SCREEN_BY_OPTION = {
|
|
114
|
+
Sonar: "sonar-prompt",
|
|
115
|
+
"Fix-Comments": "fix-comments-prompt",
|
|
116
|
+
"Check-Issue": "check-issue-prompt",
|
|
117
|
+
"Do Work \u2014 Discuss": "do-work-discuss-prompt",
|
|
118
|
+
"Do Work \u2014 PR": "do-work-pr-prompt"
|
|
119
|
+
};
|
|
120
|
+
function ConfigWizard() {
|
|
121
|
+
const existing = readConfig();
|
|
122
|
+
const rawExisting = readRawConfig();
|
|
123
|
+
const initialRemoteIndex = REMOTE_OPTIONS.findIndex((o) => o.value === existing.remoteType);
|
|
124
|
+
const initialTechIndex = TECHNIQUE_OPTIONS.findIndex((o) => o.value === existing.issueDiscoveryTechnique);
|
|
125
|
+
const [screen, setScreen] = useState("main");
|
|
126
|
+
const [mainMenuIndex, setMainMenuIndex] = useState(0);
|
|
127
|
+
const [selectedRemoteIndex, setSelectedRemoteIndex] = useState(initialRemoteIndex >= 0 ? initialRemoteIndex : 0);
|
|
128
|
+
const [selectedTechIndex, setSelectedTechIndex] = useState(initialTechIndex >= 0 ? initialTechIndex : 0);
|
|
129
|
+
const [discoveryValue, setDiscoveryValue] = useState(existing.issueDiscoveryValue ?? "");
|
|
130
|
+
const [systemPrompt, setSystemPrompt] = useState(existing.claudeSystemPrompt ?? "");
|
|
131
|
+
const [promptsMenuIndex, setPromptsMenuIndex] = useState(0);
|
|
132
|
+
const [sonarPrompt, setSonarPrompt] = useState(existing.prompts?.sonar ?? DEFAULT_SONAR_PROMPT);
|
|
133
|
+
const [fixCommentsPrompt, setFixCommentsPrompt] = useState(
|
|
134
|
+
existing.prompts?.fixComments ?? DEFAULT_FIX_COMMENTS_PROMPT
|
|
135
|
+
);
|
|
136
|
+
const [checkIssuePrompt, setCheckIssuePrompt] = useState(existing.prompts?.checkIssue ?? DEFAULT_CHECK_ISSUE_PROMPT);
|
|
137
|
+
const [allowedUsers, setAllowedUsers] = useState((existing.allowedUsers ?? []).join(", "));
|
|
138
|
+
const [agentUser, setAgentUser] = useState(existing.agentUser ?? "");
|
|
139
|
+
const [doWorkBaseBranch, setDoWorkBaseBranch] = useState(
|
|
140
|
+
existing.doWork?.baseBranch ?? DEFAULT_DO_WORK.baseBranch
|
|
141
|
+
);
|
|
142
|
+
const initialExecutorIndex = EXECUTOR_OPTIONS.findIndex((o) => o.value === existing.doWork?.executor);
|
|
143
|
+
const [doWorkExecutorIndex, setDoWorkExecutorIndex] = useState(Math.max(initialExecutorIndex, 0));
|
|
144
|
+
const [doWorkClaudeModel, setDoWorkClaudeModel] = useState(existing.doWork?.models?.claude ?? "");
|
|
145
|
+
const [doWorkCodexModel, setDoWorkCodexModel] = useState(existing.doWork?.models?.codex ?? "");
|
|
146
|
+
const [doWorkMaxRuns, setDoWorkMaxRuns] = useState(
|
|
147
|
+
String(existing.doWork?.maxRunsPerTick ?? DEFAULT_DO_WORK.maxRunsPerTick)
|
|
148
|
+
);
|
|
149
|
+
const [doWorkDiscussPrompt, setDoWorkDiscussPrompt] = useState(
|
|
150
|
+
existing.doWork?.prompts?.issueDiscuss ?? DEFAULT_DO_WORK_ISSUE_DISCUSS_PROMPT
|
|
151
|
+
);
|
|
152
|
+
const [doWorkPrPrompt, setDoWorkPrPrompt] = useState(
|
|
153
|
+
existing.doWork?.prompts?.prWork ?? DEFAULT_DO_WORK_PR_WORK_PROMPT
|
|
154
|
+
);
|
|
155
|
+
const [pendingRemote, setPendingRemote] = useState(existing.remoteType ?? "gh");
|
|
156
|
+
const [pendingTechnique, setPendingTechnique] = useState(
|
|
157
|
+
existing.issueDiscoveryTechnique ?? "label"
|
|
158
|
+
);
|
|
159
|
+
const { exit } = useApp();
|
|
160
|
+
const textScreens = {
|
|
161
|
+
value: {
|
|
162
|
+
setValue: setDiscoveryValue,
|
|
163
|
+
onSubmit: () => setScreen("system-prompt"),
|
|
164
|
+
onBack: () => setScreen("main")
|
|
165
|
+
},
|
|
166
|
+
"system-prompt": {
|
|
167
|
+
setValue: setSystemPrompt,
|
|
168
|
+
onSubmit: () => {
|
|
169
|
+
let claudeSystemPromptValue;
|
|
170
|
+
if (systemPrompt) {
|
|
171
|
+
writePromptFile("claude-system-prompt.md", systemPrompt);
|
|
172
|
+
claudeSystemPromptValue = "claude-system-prompt.md";
|
|
173
|
+
}
|
|
174
|
+
writeConfig({
|
|
175
|
+
...rawExisting,
|
|
176
|
+
remoteType: pendingRemote,
|
|
177
|
+
issueDiscoveryTechnique: pendingTechnique,
|
|
178
|
+
issueDiscoveryValue: discoveryValue || void 0,
|
|
179
|
+
claudeSystemPrompt: claudeSystemPromptValue
|
|
180
|
+
});
|
|
181
|
+
exit();
|
|
182
|
+
},
|
|
183
|
+
onBack: () => setScreen("main")
|
|
184
|
+
},
|
|
185
|
+
"sonar-prompt": {
|
|
186
|
+
setValue: setSonarPrompt,
|
|
187
|
+
onSubmit: () => {
|
|
188
|
+
savePrompt("sonar-prompt.md", sonarPrompt, (value, current) => ({
|
|
189
|
+
...current,
|
|
190
|
+
prompts: { ...current.prompts, sonar: value }
|
|
191
|
+
}));
|
|
192
|
+
setScreen("prompts-menu");
|
|
193
|
+
},
|
|
194
|
+
onBack: () => setScreen("prompts-menu")
|
|
195
|
+
},
|
|
196
|
+
"fix-comments-prompt": {
|
|
197
|
+
setValue: setFixCommentsPrompt,
|
|
198
|
+
onSubmit: () => {
|
|
199
|
+
savePrompt("fix-comments-prompt.md", fixCommentsPrompt, (value, current) => ({
|
|
200
|
+
...current,
|
|
201
|
+
prompts: { ...current.prompts, fixComments: value }
|
|
202
|
+
}));
|
|
203
|
+
setScreen("prompts-menu");
|
|
204
|
+
},
|
|
205
|
+
onBack: () => setScreen("prompts-menu")
|
|
206
|
+
},
|
|
207
|
+
"check-issue-prompt": {
|
|
208
|
+
setValue: setCheckIssuePrompt,
|
|
209
|
+
onSubmit: () => {
|
|
210
|
+
savePrompt("check-issue-prompt.md", checkIssuePrompt, (value, current) => ({
|
|
211
|
+
...current,
|
|
212
|
+
prompts: { ...current.prompts, checkIssue: value }
|
|
213
|
+
}));
|
|
214
|
+
setScreen("prompts-menu");
|
|
215
|
+
},
|
|
216
|
+
onBack: () => setScreen("prompts-menu")
|
|
217
|
+
},
|
|
218
|
+
"allowed-users": {
|
|
219
|
+
setValue: setAllowedUsers,
|
|
220
|
+
onSubmit: () => setScreen("agent-user"),
|
|
221
|
+
onBack: () => setScreen("main")
|
|
222
|
+
},
|
|
223
|
+
"agent-user": {
|
|
224
|
+
setValue: setAgentUser,
|
|
225
|
+
onSubmit: () => {
|
|
226
|
+
const parsedUsers = parseAllowedUsers(allowedUsers);
|
|
227
|
+
const current = readRawConfig();
|
|
228
|
+
writeConfig({
|
|
229
|
+
...current,
|
|
230
|
+
allowedUsers: parsedUsers.length > 0 ? parsedUsers : void 0,
|
|
231
|
+
agentUser: agentUser.trim() || void 0
|
|
232
|
+
});
|
|
233
|
+
exit();
|
|
234
|
+
},
|
|
235
|
+
onBack: () => setScreen("allowed-users")
|
|
236
|
+
},
|
|
237
|
+
"do-work-base-branch": {
|
|
238
|
+
setValue: setDoWorkBaseBranch,
|
|
239
|
+
onSubmit: () => setScreen("do-work-executor"),
|
|
240
|
+
onBack: () => setScreen("main")
|
|
241
|
+
},
|
|
242
|
+
"do-work-claude-model": {
|
|
243
|
+
setValue: setDoWorkClaudeModel,
|
|
244
|
+
onSubmit: () => setScreen("do-work-codex-model"),
|
|
245
|
+
onBack: () => setScreen("do-work-executor")
|
|
246
|
+
},
|
|
247
|
+
"do-work-codex-model": {
|
|
248
|
+
setValue: setDoWorkCodexModel,
|
|
249
|
+
onSubmit: () => setScreen("do-work-max-runs"),
|
|
250
|
+
onBack: () => setScreen("do-work-claude-model")
|
|
251
|
+
},
|
|
252
|
+
"do-work-max-runs": {
|
|
253
|
+
setValue: setDoWorkMaxRuns,
|
|
254
|
+
onSubmit: () => {
|
|
255
|
+
const parsedMaxRuns = Number.parseInt(doWorkMaxRuns, 10);
|
|
256
|
+
const current = readRawConfig();
|
|
257
|
+
writeConfig({
|
|
258
|
+
...current,
|
|
259
|
+
doWork: {
|
|
260
|
+
...current.doWork,
|
|
261
|
+
baseBranch: doWorkBaseBranch.trim() || void 0,
|
|
262
|
+
executor: EXECUTOR_OPTIONS[doWorkExecutorIndex].value,
|
|
263
|
+
models: {
|
|
264
|
+
claude: doWorkClaudeModel.trim() || void 0,
|
|
265
|
+
codex: doWorkCodexModel.trim() || void 0
|
|
266
|
+
},
|
|
267
|
+
maxRunsPerTick: Number.isNaN(parsedMaxRuns) || parsedMaxRuns < 0 ? void 0 : parsedMaxRuns
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
exit();
|
|
271
|
+
},
|
|
272
|
+
onBack: () => setScreen("do-work-codex-model")
|
|
273
|
+
},
|
|
274
|
+
"do-work-discuss-prompt": {
|
|
275
|
+
setValue: setDoWorkDiscussPrompt,
|
|
276
|
+
onSubmit: () => {
|
|
277
|
+
savePrompt("do-work-issue-discuss.md", doWorkDiscussPrompt, (value, current) => ({
|
|
278
|
+
...current,
|
|
279
|
+
doWork: { ...current.doWork, prompts: { ...current.doWork?.prompts, issueDiscuss: value } }
|
|
280
|
+
}));
|
|
281
|
+
setScreen("prompts-menu");
|
|
282
|
+
},
|
|
283
|
+
onBack: () => setScreen("prompts-menu")
|
|
284
|
+
},
|
|
285
|
+
"do-work-pr-prompt": {
|
|
286
|
+
setValue: setDoWorkPrPrompt,
|
|
287
|
+
onSubmit: () => {
|
|
288
|
+
savePrompt("do-work-pr-work.md", doWorkPrPrompt, (value, current) => ({
|
|
289
|
+
...current,
|
|
290
|
+
doWork: { ...current.doWork, prompts: { ...current.doWork?.prompts, prWork: value } }
|
|
291
|
+
}));
|
|
292
|
+
setScreen("prompts-menu");
|
|
293
|
+
},
|
|
294
|
+
onBack: () => setScreen("prompts-menu")
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
const menus = {
|
|
298
|
+
main: {
|
|
299
|
+
index: mainMenuIndex,
|
|
300
|
+
length: MAIN_MENU_OPTIONS.length,
|
|
301
|
+
setIndex: setMainMenuIndex,
|
|
302
|
+
onSelect: () => {
|
|
303
|
+
const chosen = MAIN_MENU_OPTIONS[mainMenuIndex];
|
|
304
|
+
if (chosen === "Remote / Mode") setScreen("remote");
|
|
305
|
+
else if (chosen === "Implement-Next") setScreen("technique");
|
|
306
|
+
else if (chosen === "Issue Watch") setScreen("allowed-users");
|
|
307
|
+
else if (chosen === "Do Work") setScreen("do-work-base-branch");
|
|
308
|
+
else setScreen("prompts-menu");
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
remote: {
|
|
312
|
+
index: selectedRemoteIndex,
|
|
313
|
+
length: REMOTE_OPTIONS.length,
|
|
314
|
+
setIndex: setSelectedRemoteIndex,
|
|
315
|
+
onSelect: () => {
|
|
316
|
+
setPendingRemote(REMOTE_OPTIONS[selectedRemoteIndex].value);
|
|
317
|
+
setScreen("technique");
|
|
318
|
+
},
|
|
319
|
+
onBack: () => setScreen("main")
|
|
320
|
+
},
|
|
321
|
+
technique: {
|
|
322
|
+
index: selectedTechIndex,
|
|
323
|
+
length: TECHNIQUE_OPTIONS.length,
|
|
324
|
+
setIndex: setSelectedTechIndex,
|
|
325
|
+
onSelect: () => {
|
|
326
|
+
setPendingTechnique(TECHNIQUE_OPTIONS[selectedTechIndex].value);
|
|
327
|
+
setScreen("value");
|
|
328
|
+
},
|
|
329
|
+
onBack: () => setScreen("main")
|
|
330
|
+
},
|
|
331
|
+
"prompts-menu": {
|
|
332
|
+
index: promptsMenuIndex,
|
|
333
|
+
length: PROMPTS_MENU_OPTIONS.length,
|
|
334
|
+
setIndex: setPromptsMenuIndex,
|
|
335
|
+
onSelect: () => setScreen(PROMPT_SCREEN_BY_OPTION[PROMPTS_MENU_OPTIONS[promptsMenuIndex]]),
|
|
336
|
+
onBack: () => setScreen("main")
|
|
337
|
+
},
|
|
338
|
+
"do-work-executor": {
|
|
339
|
+
index: doWorkExecutorIndex,
|
|
340
|
+
length: EXECUTOR_OPTIONS.length,
|
|
341
|
+
setIndex: setDoWorkExecutorIndex,
|
|
342
|
+
onSelect: () => setScreen("do-work-claude-model"),
|
|
343
|
+
onBack: () => setScreen("do-work-base-branch")
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
useInput((input, key) => {
|
|
347
|
+
const textScreen = textScreens[screen];
|
|
348
|
+
if (textScreen) {
|
|
349
|
+
handleTextEntry(input, key, textScreen, exit);
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
const menu = menus[screen];
|
|
353
|
+
if (menu) {
|
|
354
|
+
handleMenu(input, key, menu, exit);
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
const techLabel = TECHNIQUE_OPTIONS.find((o) => o.value === pendingTechnique)?.label ?? pendingTechnique;
|
|
358
|
+
const textViews = {
|
|
359
|
+
value: {
|
|
360
|
+
title: "Implement-Next \u2014 Issue Discovery Value",
|
|
361
|
+
label: `${techLabel} value:`,
|
|
362
|
+
value: discoveryValue,
|
|
363
|
+
hint: `Type value \xB7 Enter to continue \xB7 ${BACK}`
|
|
364
|
+
},
|
|
365
|
+
"system-prompt": {
|
|
366
|
+
title: "Implement-Next \u2014 Claude System Prompt",
|
|
367
|
+
label: "System prompt (optional):",
|
|
368
|
+
value: systemPrompt,
|
|
369
|
+
hint: `Type prompt \xB7 Enter to save and exit \xB7 ${BACK}`
|
|
370
|
+
},
|
|
371
|
+
"sonar-prompt": {
|
|
372
|
+
title: "Prompts \u2014 Sonar",
|
|
373
|
+
label: "Sonar prompt:",
|
|
374
|
+
value: sonarPrompt,
|
|
375
|
+
hint: `Type prompt \xB7 Enter to save \xB7 ${BACK}`
|
|
376
|
+
},
|
|
377
|
+
"fix-comments-prompt": {
|
|
378
|
+
title: "Prompts \u2014 Fix-Comments",
|
|
379
|
+
label: "Fix-Comments prompt:",
|
|
380
|
+
value: fixCommentsPrompt,
|
|
381
|
+
hint: `Type prompt \xB7 Enter to save \xB7 ${BACK}`
|
|
382
|
+
},
|
|
383
|
+
"check-issue-prompt": {
|
|
384
|
+
title: "Prompts \u2014 Check-Issue",
|
|
385
|
+
label: "Check-Issue prompt:",
|
|
386
|
+
value: checkIssuePrompt,
|
|
387
|
+
hint: `Type prompt \xB7 Enter to save \xB7 ${BACK}`
|
|
388
|
+
},
|
|
389
|
+
"allowed-users": {
|
|
390
|
+
title: "Issue Watch \u2014 Allowed Users",
|
|
391
|
+
label: "Logins allowed to instruct the agent (comma separated):",
|
|
392
|
+
value: allowedUsers,
|
|
393
|
+
hint: `Type logins \xB7 Enter to continue \xB7 ${BACK}`
|
|
394
|
+
},
|
|
395
|
+
"agent-user": {
|
|
396
|
+
title: "Issue Watch \u2014 Agent User",
|
|
397
|
+
label: "Login the agent posts as:",
|
|
398
|
+
value: agentUser,
|
|
399
|
+
hint: `Type login \xB7 Enter to save and exit \xB7 ${BACK}`
|
|
400
|
+
},
|
|
401
|
+
"do-work-base-branch": {
|
|
402
|
+
title: "Do Work \u2014 Base Branch",
|
|
403
|
+
label: "Branch discussion turns return to:",
|
|
404
|
+
value: doWorkBaseBranch,
|
|
405
|
+
hint: `Type branch \xB7 Enter to continue \xB7 ${BACK}`
|
|
406
|
+
},
|
|
407
|
+
"do-work-claude-model": {
|
|
408
|
+
title: "Do Work \u2014 Claude Model",
|
|
409
|
+
label: "Default model when the executor is Claude (blank = the executor's own default):",
|
|
410
|
+
value: doWorkClaudeModel,
|
|
411
|
+
hint: `Type model \xB7 Enter to continue \xB7 ${BACK}`
|
|
412
|
+
},
|
|
413
|
+
"do-work-codex-model": {
|
|
414
|
+
title: "Do Work \u2014 Codex Model",
|
|
415
|
+
label: "Default model when the executor is Codex (blank = the executor's own default):",
|
|
416
|
+
value: doWorkCodexModel,
|
|
417
|
+
hint: `Type model \xB7 Enter to continue \xB7 ${BACK}`
|
|
418
|
+
},
|
|
419
|
+
"do-work-max-runs": {
|
|
420
|
+
title: "Do Work \u2014 Max Runs Per Tick",
|
|
421
|
+
label: "Model runs allowed per tick (0 = unlimited):",
|
|
422
|
+
value: doWorkMaxRuns,
|
|
423
|
+
hint: `Type a number \xB7 Enter to save \xB7 ${BACK}`
|
|
424
|
+
},
|
|
425
|
+
"do-work-discuss-prompt": {
|
|
426
|
+
title: "Prompts \u2014 Do Work \u2014 Discuss",
|
|
427
|
+
label: "Discussion turn instructions:",
|
|
428
|
+
value: doWorkDiscussPrompt,
|
|
429
|
+
hint: `Type prompt \xB7 Enter to save \xB7 ${BACK}`
|
|
430
|
+
},
|
|
431
|
+
"do-work-pr-prompt": {
|
|
432
|
+
title: "Prompts \u2014 Do Work \u2014 PR",
|
|
433
|
+
label: "Pull request turn instructions:",
|
|
434
|
+
value: doWorkPrPrompt,
|
|
435
|
+
hint: `Type prompt \xB7 Enter to save \xB7 ${BACK}`
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
const menuViews = {
|
|
439
|
+
main: {
|
|
440
|
+
title: "Configure Automata",
|
|
441
|
+
options: MAIN_MENU_OPTIONS,
|
|
442
|
+
index: mainMenuIndex,
|
|
443
|
+
hint: "\u2191/\u2193 to move \xB7 Enter to select \xB7 Ctrl+C to cancel"
|
|
444
|
+
},
|
|
445
|
+
remote: {
|
|
446
|
+
title: "Remote / Mode",
|
|
447
|
+
options: REMOTE_OPTIONS.map((o) => o.label),
|
|
448
|
+
index: selectedRemoteIndex,
|
|
449
|
+
hint: `\u2191/\u2193 to move \xB7 Enter to confirm \xB7 ${BACK}`
|
|
450
|
+
},
|
|
451
|
+
technique: {
|
|
452
|
+
title: "Implement-Next \u2014 Issue Discovery Technique",
|
|
453
|
+
options: TECHNIQUE_OPTIONS.map((o) => o.label),
|
|
454
|
+
index: selectedTechIndex,
|
|
455
|
+
hint: `\u2191/\u2193 to move \xB7 Enter to confirm \xB7 ${BACK}`
|
|
456
|
+
},
|
|
457
|
+
"prompts-menu": {
|
|
458
|
+
title: "Prompts",
|
|
459
|
+
options: PROMPTS_MENU_OPTIONS,
|
|
460
|
+
index: promptsMenuIndex,
|
|
461
|
+
hint: `\u2191/\u2193 to move \xB7 Enter to edit \xB7 ${BACK}`
|
|
462
|
+
},
|
|
463
|
+
"do-work-executor": {
|
|
464
|
+
title: "Do Work \u2014 Executor",
|
|
465
|
+
options: EXECUTOR_OPTIONS.map((o) => o.label),
|
|
466
|
+
index: doWorkExecutorIndex,
|
|
467
|
+
hint: `\u2191/\u2193 to move \xB7 Enter to continue \xB7 ${BACK}`
|
|
468
|
+
}
|
|
469
|
+
};
|
|
470
|
+
const textView = textViews[screen];
|
|
471
|
+
if (textView) return /* @__PURE__ */ jsx(TextEntryScreen, { ...textView });
|
|
472
|
+
const menuView = menuViews[screen];
|
|
473
|
+
if (menuView) return /* @__PURE__ */ jsx(MenuEntryScreen, { ...menuView });
|
|
474
|
+
return null;
|
|
475
|
+
}
|
|
476
|
+
export {
|
|
477
|
+
ConfigWizard
|
|
478
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -183,7 +183,7 @@ var configCommand = new Command("config").description("Configure automata settin
|
|
|
183
183
|
const [{ render }, React, { ConfigWizard }] = await Promise.all([
|
|
184
184
|
import("ink"),
|
|
185
185
|
import("react"),
|
|
186
|
-
import("./ConfigWizard-
|
|
186
|
+
import("./ConfigWizard-NTK7NLAE.js")
|
|
187
187
|
]);
|
|
188
188
|
const { waitUntilExit } = render(React.createElement(ConfigWizard));
|
|
189
189
|
await waitUntilExit();
|
package/package.json
CHANGED
|
@@ -1,601 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
DEFAULT_CHECK_ISSUE_PROMPT,
|
|
4
|
-
DEFAULT_DO_WORK,
|
|
5
|
-
DEFAULT_DO_WORK_ISSUE_DISCUSS_PROMPT,
|
|
6
|
-
DEFAULT_DO_WORK_PR_WORK_PROMPT,
|
|
7
|
-
DEFAULT_FIX_COMMENTS_PROMPT,
|
|
8
|
-
DEFAULT_SONAR_PROMPT,
|
|
9
|
-
readConfig,
|
|
10
|
-
readRawConfig,
|
|
11
|
-
writeConfig
|
|
12
|
-
} from "./chunk-UA32XYYL.js";
|
|
13
|
-
|
|
14
|
-
// src/config/ConfigWizard.tsx
|
|
15
|
-
import { useState } from "react";
|
|
16
|
-
import { Box, Text, useInput, useApp } from "ink";
|
|
17
|
-
import { writeFileSync, mkdirSync } from "fs";
|
|
18
|
-
import { join } from "path";
|
|
19
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
20
|
-
function writePromptFile(filename, content) {
|
|
21
|
-
const dir = join(process.cwd(), ".automata");
|
|
22
|
-
mkdirSync(dir, { recursive: true });
|
|
23
|
-
writeFileSync(join(dir, filename), content, "utf8");
|
|
24
|
-
}
|
|
25
|
-
var REMOTE_OPTIONS = [
|
|
26
|
-
{ label: "GitHub", value: "gh" },
|
|
27
|
-
{ label: "Azure DevOps", value: "azdo" }
|
|
28
|
-
];
|
|
29
|
-
var TECHNIQUE_OPTIONS = [
|
|
30
|
-
{ label: "By Label", value: "label" },
|
|
31
|
-
{ label: "By Assignee", value: "assignee" },
|
|
32
|
-
{ label: "By Title Contains", value: "title-contains" }
|
|
33
|
-
];
|
|
34
|
-
var EXECUTOR_OPTIONS = [
|
|
35
|
-
{ label: "Claude Code", value: "claude" },
|
|
36
|
-
{ label: "Codex", value: "codex" }
|
|
37
|
-
];
|
|
38
|
-
var MAIN_MENU_OPTIONS = ["Remote / Mode", "Implement-Next", "Prompts", "Issue Watch", "Do Work"];
|
|
39
|
-
var PROMPTS_MENU_OPTIONS = [
|
|
40
|
-
"Sonar",
|
|
41
|
-
"Fix-Comments",
|
|
42
|
-
"Check-Issue",
|
|
43
|
-
"Do Work \u2014 Discuss",
|
|
44
|
-
"Do Work \u2014 PR"
|
|
45
|
-
];
|
|
46
|
-
function parseAllowedUsers(value) {
|
|
47
|
-
return value.split(",").map((user) => user.trim()).filter((user) => user.length > 0);
|
|
48
|
-
}
|
|
49
|
-
function handleTextEntry(input, key, screen, cancel) {
|
|
50
|
-
if (key.return) {
|
|
51
|
-
screen.onSubmit();
|
|
52
|
-
} else if (key.backspace || key.delete) {
|
|
53
|
-
screen.setValue((value) => value.slice(0, -1));
|
|
54
|
-
} else if (key.escape) {
|
|
55
|
-
screen.onBack();
|
|
56
|
-
} else if (key.ctrl && input === "c") {
|
|
57
|
-
cancel();
|
|
58
|
-
} else if (input && !key.ctrl && !key.meta) {
|
|
59
|
-
screen.setValue((value) => value + input);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
function handleMenu(input, key, index, length, setIndex, cancel, onSelect, onBack) {
|
|
63
|
-
if (key.upArrow) {
|
|
64
|
-
setIndex((i) => i > 0 ? i - 1 : length - 1);
|
|
65
|
-
} else if (key.downArrow) {
|
|
66
|
-
setIndex((i) => i < length - 1 ? i + 1 : 0);
|
|
67
|
-
} else if (key.return) {
|
|
68
|
-
onSelect();
|
|
69
|
-
} else if (key.escape) {
|
|
70
|
-
if (onBack) onBack();
|
|
71
|
-
else cancel();
|
|
72
|
-
} else if (key.ctrl && input === "c") {
|
|
73
|
-
cancel();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
function savePrompt(filename, content, merge) {
|
|
77
|
-
let value;
|
|
78
|
-
if (content) {
|
|
79
|
-
writePromptFile(filename, content);
|
|
80
|
-
value = filename;
|
|
81
|
-
}
|
|
82
|
-
writeConfig(merge(value, readRawConfig()));
|
|
83
|
-
}
|
|
84
|
-
var PROMPT_SCREEN_BY_OPTION = {
|
|
85
|
-
Sonar: "sonar-prompt",
|
|
86
|
-
"Fix-Comments": "fix-comments-prompt",
|
|
87
|
-
"Check-Issue": "check-issue-prompt",
|
|
88
|
-
"Do Work \u2014 Discuss": "do-work-discuss-prompt",
|
|
89
|
-
"Do Work \u2014 PR": "do-work-pr-prompt"
|
|
90
|
-
};
|
|
91
|
-
function ConfigWizard() {
|
|
92
|
-
const existing = readConfig();
|
|
93
|
-
const rawExisting = readRawConfig();
|
|
94
|
-
const initialRemoteIndex = REMOTE_OPTIONS.findIndex((o) => o.value === existing.remoteType);
|
|
95
|
-
const initialTechIndex = TECHNIQUE_OPTIONS.findIndex((o) => o.value === existing.issueDiscoveryTechnique);
|
|
96
|
-
const [screen, setScreen] = useState("main");
|
|
97
|
-
const [mainMenuIndex, setMainMenuIndex] = useState(0);
|
|
98
|
-
const [selectedRemoteIndex, setSelectedRemoteIndex] = useState(initialRemoteIndex >= 0 ? initialRemoteIndex : 0);
|
|
99
|
-
const [selectedTechIndex, setSelectedTechIndex] = useState(initialTechIndex >= 0 ? initialTechIndex : 0);
|
|
100
|
-
const [discoveryValue, setDiscoveryValue] = useState(existing.issueDiscoveryValue ?? "");
|
|
101
|
-
const [systemPrompt, setSystemPrompt] = useState(existing.claudeSystemPrompt ?? "");
|
|
102
|
-
const [promptsMenuIndex, setPromptsMenuIndex] = useState(0);
|
|
103
|
-
const [sonarPrompt, setSonarPrompt] = useState(existing.prompts?.sonar ?? DEFAULT_SONAR_PROMPT);
|
|
104
|
-
const [fixCommentsPrompt, setFixCommentsPrompt] = useState(
|
|
105
|
-
existing.prompts?.fixComments ?? DEFAULT_FIX_COMMENTS_PROMPT
|
|
106
|
-
);
|
|
107
|
-
const [checkIssuePrompt, setCheckIssuePrompt] = useState(existing.prompts?.checkIssue ?? DEFAULT_CHECK_ISSUE_PROMPT);
|
|
108
|
-
const [allowedUsers, setAllowedUsers] = useState((existing.allowedUsers ?? []).join(", "));
|
|
109
|
-
const [agentUser, setAgentUser] = useState(existing.agentUser ?? "");
|
|
110
|
-
const [doWorkBaseBranch, setDoWorkBaseBranch] = useState(
|
|
111
|
-
existing.doWork?.baseBranch ?? DEFAULT_DO_WORK.baseBranch
|
|
112
|
-
);
|
|
113
|
-
const initialExecutorIndex = EXECUTOR_OPTIONS.findIndex((o) => o.value === existing.doWork?.executor);
|
|
114
|
-
const [doWorkExecutorIndex, setDoWorkExecutorIndex] = useState(Math.max(initialExecutorIndex, 0));
|
|
115
|
-
const [doWorkClaudeModel, setDoWorkClaudeModel] = useState(existing.doWork?.models?.claude ?? "");
|
|
116
|
-
const [doWorkCodexModel, setDoWorkCodexModel] = useState(existing.doWork?.models?.codex ?? "");
|
|
117
|
-
const [doWorkMaxRuns, setDoWorkMaxRuns] = useState(
|
|
118
|
-
String(existing.doWork?.maxRunsPerTick ?? DEFAULT_DO_WORK.maxRunsPerTick)
|
|
119
|
-
);
|
|
120
|
-
const [doWorkDiscussPrompt, setDoWorkDiscussPrompt] = useState(
|
|
121
|
-
existing.doWork?.prompts?.issueDiscuss ?? DEFAULT_DO_WORK_ISSUE_DISCUSS_PROMPT
|
|
122
|
-
);
|
|
123
|
-
const [doWorkPrPrompt, setDoWorkPrPrompt] = useState(
|
|
124
|
-
existing.doWork?.prompts?.prWork ?? DEFAULT_DO_WORK_PR_WORK_PROMPT
|
|
125
|
-
);
|
|
126
|
-
const [pendingRemote, setPendingRemote] = useState(existing.remoteType ?? "gh");
|
|
127
|
-
const [pendingTechnique, setPendingTechnique] = useState(
|
|
128
|
-
existing.issueDiscoveryTechnique ?? "label"
|
|
129
|
-
);
|
|
130
|
-
const { exit } = useApp();
|
|
131
|
-
const textScreens = {
|
|
132
|
-
value: {
|
|
133
|
-
setValue: setDiscoveryValue,
|
|
134
|
-
onSubmit: () => setScreen("system-prompt"),
|
|
135
|
-
onBack: () => setScreen("main")
|
|
136
|
-
},
|
|
137
|
-
"system-prompt": {
|
|
138
|
-
setValue: setSystemPrompt,
|
|
139
|
-
onSubmit: () => {
|
|
140
|
-
let claudeSystemPromptValue;
|
|
141
|
-
if (systemPrompt) {
|
|
142
|
-
writePromptFile("claude-system-prompt.md", systemPrompt);
|
|
143
|
-
claudeSystemPromptValue = "claude-system-prompt.md";
|
|
144
|
-
}
|
|
145
|
-
writeConfig({
|
|
146
|
-
...rawExisting,
|
|
147
|
-
remoteType: pendingRemote,
|
|
148
|
-
issueDiscoveryTechnique: pendingTechnique,
|
|
149
|
-
issueDiscoveryValue: discoveryValue || void 0,
|
|
150
|
-
claudeSystemPrompt: claudeSystemPromptValue
|
|
151
|
-
});
|
|
152
|
-
exit();
|
|
153
|
-
},
|
|
154
|
-
onBack: () => setScreen("main")
|
|
155
|
-
},
|
|
156
|
-
"sonar-prompt": {
|
|
157
|
-
setValue: setSonarPrompt,
|
|
158
|
-
onSubmit: () => {
|
|
159
|
-
savePrompt("sonar-prompt.md", sonarPrompt, (value, current) => ({
|
|
160
|
-
...current,
|
|
161
|
-
prompts: { ...current.prompts, sonar: value }
|
|
162
|
-
}));
|
|
163
|
-
setScreen("prompts-menu");
|
|
164
|
-
},
|
|
165
|
-
onBack: () => setScreen("prompts-menu")
|
|
166
|
-
},
|
|
167
|
-
"fix-comments-prompt": {
|
|
168
|
-
setValue: setFixCommentsPrompt,
|
|
169
|
-
onSubmit: () => {
|
|
170
|
-
savePrompt("fix-comments-prompt.md", fixCommentsPrompt, (value, current) => ({
|
|
171
|
-
...current,
|
|
172
|
-
prompts: { ...current.prompts, fixComments: value }
|
|
173
|
-
}));
|
|
174
|
-
setScreen("prompts-menu");
|
|
175
|
-
},
|
|
176
|
-
onBack: () => setScreen("prompts-menu")
|
|
177
|
-
},
|
|
178
|
-
"check-issue-prompt": {
|
|
179
|
-
setValue: setCheckIssuePrompt,
|
|
180
|
-
onSubmit: () => {
|
|
181
|
-
savePrompt("check-issue-prompt.md", checkIssuePrompt, (value, current) => ({
|
|
182
|
-
...current,
|
|
183
|
-
prompts: { ...current.prompts, checkIssue: value }
|
|
184
|
-
}));
|
|
185
|
-
setScreen("prompts-menu");
|
|
186
|
-
},
|
|
187
|
-
onBack: () => setScreen("prompts-menu")
|
|
188
|
-
},
|
|
189
|
-
"allowed-users": {
|
|
190
|
-
setValue: setAllowedUsers,
|
|
191
|
-
onSubmit: () => setScreen("agent-user"),
|
|
192
|
-
onBack: () => setScreen("main")
|
|
193
|
-
},
|
|
194
|
-
"agent-user": {
|
|
195
|
-
setValue: setAgentUser,
|
|
196
|
-
onSubmit: () => {
|
|
197
|
-
const parsedUsers = parseAllowedUsers(allowedUsers);
|
|
198
|
-
const current = readRawConfig();
|
|
199
|
-
writeConfig({
|
|
200
|
-
...current,
|
|
201
|
-
allowedUsers: parsedUsers.length > 0 ? parsedUsers : void 0,
|
|
202
|
-
agentUser: agentUser.trim() || void 0
|
|
203
|
-
});
|
|
204
|
-
exit();
|
|
205
|
-
},
|
|
206
|
-
onBack: () => setScreen("allowed-users")
|
|
207
|
-
},
|
|
208
|
-
"do-work-base-branch": {
|
|
209
|
-
setValue: setDoWorkBaseBranch,
|
|
210
|
-
onSubmit: () => setScreen("do-work-executor"),
|
|
211
|
-
onBack: () => setScreen("main")
|
|
212
|
-
},
|
|
213
|
-
"do-work-claude-model": {
|
|
214
|
-
setValue: setDoWorkClaudeModel,
|
|
215
|
-
onSubmit: () => setScreen("do-work-codex-model"),
|
|
216
|
-
onBack: () => setScreen("do-work-executor")
|
|
217
|
-
},
|
|
218
|
-
"do-work-codex-model": {
|
|
219
|
-
setValue: setDoWorkCodexModel,
|
|
220
|
-
onSubmit: () => setScreen("do-work-max-runs"),
|
|
221
|
-
onBack: () => setScreen("do-work-claude-model")
|
|
222
|
-
},
|
|
223
|
-
"do-work-max-runs": {
|
|
224
|
-
setValue: setDoWorkMaxRuns,
|
|
225
|
-
onSubmit: () => {
|
|
226
|
-
const parsedMaxRuns = Number.parseInt(doWorkMaxRuns, 10);
|
|
227
|
-
const current = readRawConfig();
|
|
228
|
-
writeConfig({
|
|
229
|
-
...current,
|
|
230
|
-
doWork: {
|
|
231
|
-
...current.doWork,
|
|
232
|
-
baseBranch: doWorkBaseBranch.trim() || void 0,
|
|
233
|
-
executor: EXECUTOR_OPTIONS[doWorkExecutorIndex].value,
|
|
234
|
-
models: {
|
|
235
|
-
claude: doWorkClaudeModel.trim() || void 0,
|
|
236
|
-
codex: doWorkCodexModel.trim() || void 0
|
|
237
|
-
},
|
|
238
|
-
maxRunsPerTick: Number.isNaN(parsedMaxRuns) || parsedMaxRuns < 0 ? void 0 : parsedMaxRuns
|
|
239
|
-
}
|
|
240
|
-
});
|
|
241
|
-
exit();
|
|
242
|
-
},
|
|
243
|
-
onBack: () => setScreen("do-work-codex-model")
|
|
244
|
-
},
|
|
245
|
-
"do-work-discuss-prompt": {
|
|
246
|
-
setValue: setDoWorkDiscussPrompt,
|
|
247
|
-
onSubmit: () => {
|
|
248
|
-
savePrompt("do-work-issue-discuss.md", doWorkDiscussPrompt, (value, current) => ({
|
|
249
|
-
...current,
|
|
250
|
-
doWork: { ...current.doWork, prompts: { ...current.doWork?.prompts, issueDiscuss: value } }
|
|
251
|
-
}));
|
|
252
|
-
setScreen("prompts-menu");
|
|
253
|
-
},
|
|
254
|
-
onBack: () => setScreen("prompts-menu")
|
|
255
|
-
},
|
|
256
|
-
"do-work-pr-prompt": {
|
|
257
|
-
setValue: setDoWorkPrPrompt,
|
|
258
|
-
onSubmit: () => {
|
|
259
|
-
savePrompt("do-work-pr-work.md", doWorkPrPrompt, (value, current) => ({
|
|
260
|
-
...current,
|
|
261
|
-
doWork: { ...current.doWork, prompts: { ...current.doWork?.prompts, prWork: value } }
|
|
262
|
-
}));
|
|
263
|
-
setScreen("prompts-menu");
|
|
264
|
-
},
|
|
265
|
-
onBack: () => setScreen("prompts-menu")
|
|
266
|
-
}
|
|
267
|
-
};
|
|
268
|
-
useInput((input, key) => {
|
|
269
|
-
const textScreen = textScreens[screen];
|
|
270
|
-
if (textScreen) {
|
|
271
|
-
handleTextEntry(input, key, textScreen, exit);
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
if (screen === "main") {
|
|
275
|
-
handleMenu(input, key, mainMenuIndex, MAIN_MENU_OPTIONS.length, setMainMenuIndex, exit, () => {
|
|
276
|
-
const chosen = MAIN_MENU_OPTIONS[mainMenuIndex];
|
|
277
|
-
if (chosen === "Remote / Mode") setScreen("remote");
|
|
278
|
-
else if (chosen === "Implement-Next") setScreen("technique");
|
|
279
|
-
else if (chosen === "Issue Watch") setScreen("allowed-users");
|
|
280
|
-
else if (chosen === "Do Work") setScreen("do-work-base-branch");
|
|
281
|
-
else setScreen("prompts-menu");
|
|
282
|
-
});
|
|
283
|
-
} else if (screen === "remote") {
|
|
284
|
-
handleMenu(
|
|
285
|
-
input,
|
|
286
|
-
key,
|
|
287
|
-
selectedRemoteIndex,
|
|
288
|
-
REMOTE_OPTIONS.length,
|
|
289
|
-
setSelectedRemoteIndex,
|
|
290
|
-
exit,
|
|
291
|
-
() => {
|
|
292
|
-
setPendingRemote(REMOTE_OPTIONS[selectedRemoteIndex].value);
|
|
293
|
-
setScreen("technique");
|
|
294
|
-
},
|
|
295
|
-
() => setScreen("main")
|
|
296
|
-
);
|
|
297
|
-
} else if (screen === "technique") {
|
|
298
|
-
handleMenu(
|
|
299
|
-
input,
|
|
300
|
-
key,
|
|
301
|
-
selectedTechIndex,
|
|
302
|
-
TECHNIQUE_OPTIONS.length,
|
|
303
|
-
setSelectedTechIndex,
|
|
304
|
-
exit,
|
|
305
|
-
() => {
|
|
306
|
-
setPendingTechnique(TECHNIQUE_OPTIONS[selectedTechIndex].value);
|
|
307
|
-
setScreen("value");
|
|
308
|
-
},
|
|
309
|
-
() => setScreen("main")
|
|
310
|
-
);
|
|
311
|
-
} else if (screen === "prompts-menu") {
|
|
312
|
-
handleMenu(input, key, promptsMenuIndex, PROMPTS_MENU_OPTIONS.length, setPromptsMenuIndex, exit, () => {
|
|
313
|
-
setScreen(PROMPT_SCREEN_BY_OPTION[PROMPTS_MENU_OPTIONS[promptsMenuIndex]]);
|
|
314
|
-
}, () => setScreen("main"));
|
|
315
|
-
} else if (screen === "do-work-executor") {
|
|
316
|
-
handleMenu(
|
|
317
|
-
input,
|
|
318
|
-
key,
|
|
319
|
-
doWorkExecutorIndex,
|
|
320
|
-
EXECUTOR_OPTIONS.length,
|
|
321
|
-
setDoWorkExecutorIndex,
|
|
322
|
-
exit,
|
|
323
|
-
() => setScreen("do-work-claude-model"),
|
|
324
|
-
() => setScreen("do-work-base-branch")
|
|
325
|
-
);
|
|
326
|
-
}
|
|
327
|
-
});
|
|
328
|
-
if (screen === "main") {
|
|
329
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
330
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Configure Automata" }),
|
|
331
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
332
|
-
MAIN_MENU_OPTIONS.map((option, index) => /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(Text, { color: index === mainMenuIndex ? "cyan" : void 0, children: [
|
|
333
|
-
index === mainMenuIndex ? "\u276F " : " ",
|
|
334
|
-
option
|
|
335
|
-
] }) }, option)),
|
|
336
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
337
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2191/\u2193 to move \xB7 Enter to select \xB7 Ctrl+C to cancel" })
|
|
338
|
-
] });
|
|
339
|
-
}
|
|
340
|
-
if (screen === "remote") {
|
|
341
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
342
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Remote / Mode" }),
|
|
343
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
344
|
-
/* @__PURE__ */ jsx(Text, { children: "Remote environment type:" }),
|
|
345
|
-
REMOTE_OPTIONS.map((option, index) => /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(Text, { color: index === selectedRemoteIndex ? "cyan" : void 0, children: [
|
|
346
|
-
index === selectedRemoteIndex ? "\u276F " : " ",
|
|
347
|
-
option.label
|
|
348
|
-
] }) }, option.value)),
|
|
349
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
350
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2191/\u2193 to move \xB7 Enter to confirm \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
351
|
-
] });
|
|
352
|
-
}
|
|
353
|
-
if (screen === "technique") {
|
|
354
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
355
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Implement-Next \u2014 Issue Discovery Technique" }),
|
|
356
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
357
|
-
/* @__PURE__ */ jsx(Text, { children: "How to find the next issue to work on:" }),
|
|
358
|
-
TECHNIQUE_OPTIONS.map((option, index) => /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(Text, { color: index === selectedTechIndex ? "cyan" : void 0, children: [
|
|
359
|
-
index === selectedTechIndex ? "\u276F " : " ",
|
|
360
|
-
option.label
|
|
361
|
-
] }) }, option.value)),
|
|
362
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
363
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2191/\u2193 to move \xB7 Enter to confirm \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
364
|
-
] });
|
|
365
|
-
}
|
|
366
|
-
if (screen === "value") {
|
|
367
|
-
const techLabel = TECHNIQUE_OPTIONS.find((t) => t.value === pendingTechnique)?.label ?? pendingTechnique;
|
|
368
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
369
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Implement-Next \u2014 Issue Discovery Value" }),
|
|
370
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
371
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
372
|
-
techLabel,
|
|
373
|
-
" value:",
|
|
374
|
-
" ",
|
|
375
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
376
|
-
discoveryValue,
|
|
377
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
378
|
-
] })
|
|
379
|
-
] }),
|
|
380
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
381
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type value \xB7 Enter to continue \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
382
|
-
] });
|
|
383
|
-
}
|
|
384
|
-
if (screen === "system-prompt") {
|
|
385
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
386
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Implement-Next \u2014 Claude System Prompt" }),
|
|
387
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
388
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
389
|
-
"System prompt (optional):",
|
|
390
|
-
" ",
|
|
391
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
392
|
-
systemPrompt,
|
|
393
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
394
|
-
] })
|
|
395
|
-
] }),
|
|
396
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
397
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type prompt \xB7 Enter to save and exit \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
398
|
-
] });
|
|
399
|
-
}
|
|
400
|
-
if (screen === "prompts-menu") {
|
|
401
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
402
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Prompts" }),
|
|
403
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
404
|
-
PROMPTS_MENU_OPTIONS.map((option, index) => /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(Text, { color: index === promptsMenuIndex ? "cyan" : void 0, children: [
|
|
405
|
-
index === promptsMenuIndex ? "\u276F " : " ",
|
|
406
|
-
option
|
|
407
|
-
] }) }, option)),
|
|
408
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
409
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2191/\u2193 to move \xB7 Enter to edit \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
410
|
-
] });
|
|
411
|
-
}
|
|
412
|
-
if (screen === "sonar-prompt") {
|
|
413
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
414
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Prompts \u2014 Sonar" }),
|
|
415
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
416
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
417
|
-
"Sonar prompt:",
|
|
418
|
-
" ",
|
|
419
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
420
|
-
sonarPrompt,
|
|
421
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
422
|
-
] })
|
|
423
|
-
] }),
|
|
424
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
425
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type prompt \xB7 Enter to save \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
426
|
-
] });
|
|
427
|
-
}
|
|
428
|
-
if (screen === "check-issue-prompt") {
|
|
429
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
430
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Prompts \u2014 Check-Issue" }),
|
|
431
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
432
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
433
|
-
"Check-Issue prompt:",
|
|
434
|
-
" ",
|
|
435
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
436
|
-
checkIssuePrompt,
|
|
437
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
438
|
-
] })
|
|
439
|
-
] }),
|
|
440
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
441
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type prompt \xB7 Enter to save \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
442
|
-
] });
|
|
443
|
-
}
|
|
444
|
-
if (screen === "allowed-users") {
|
|
445
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
446
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Issue Watch \u2014 Allowed Users" }),
|
|
447
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
448
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
449
|
-
"Logins allowed to instruct the agent (comma separated):",
|
|
450
|
-
" ",
|
|
451
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
452
|
-
allowedUsers,
|
|
453
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
454
|
-
] })
|
|
455
|
-
] }),
|
|
456
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
457
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type logins \xB7 Enter to continue \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
458
|
-
] });
|
|
459
|
-
}
|
|
460
|
-
if (screen === "do-work-base-branch") {
|
|
461
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
462
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Do Work \u2014 Base Branch" }),
|
|
463
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
464
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
465
|
-
"Branch discussion turns return to:",
|
|
466
|
-
" ",
|
|
467
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
468
|
-
doWorkBaseBranch,
|
|
469
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
470
|
-
] })
|
|
471
|
-
] }),
|
|
472
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
473
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type branch \xB7 Enter to continue \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
474
|
-
] });
|
|
475
|
-
}
|
|
476
|
-
if (screen === "do-work-executor") {
|
|
477
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
478
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Do Work \u2014 Executor" }),
|
|
479
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
480
|
-
EXECUTOR_OPTIONS.map((option, index) => /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(Text, { color: index === doWorkExecutorIndex ? "cyan" : void 0, children: [
|
|
481
|
-
index === doWorkExecutorIndex ? "\u276F " : " ",
|
|
482
|
-
option.label
|
|
483
|
-
] }) }, option.value)),
|
|
484
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
485
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2191/\u2193 to move \xB7 Enter to continue \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
486
|
-
] });
|
|
487
|
-
}
|
|
488
|
-
if (screen === "do-work-claude-model") {
|
|
489
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
490
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Do Work \u2014 Claude Model" }),
|
|
491
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
492
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
493
|
-
"Default model when the executor is Claude (blank = the executor's own default):",
|
|
494
|
-
" ",
|
|
495
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
496
|
-
doWorkClaudeModel,
|
|
497
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
498
|
-
] })
|
|
499
|
-
] }),
|
|
500
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
501
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type model \xB7 Enter to continue \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
502
|
-
] });
|
|
503
|
-
}
|
|
504
|
-
if (screen === "do-work-codex-model") {
|
|
505
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
506
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Do Work \u2014 Codex Model" }),
|
|
507
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
508
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
509
|
-
"Default model when the executor is Codex (blank = the executor's own default):",
|
|
510
|
-
" ",
|
|
511
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
512
|
-
doWorkCodexModel,
|
|
513
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
514
|
-
] })
|
|
515
|
-
] }),
|
|
516
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
517
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type model \xB7 Enter to continue \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
518
|
-
] });
|
|
519
|
-
}
|
|
520
|
-
if (screen === "do-work-max-runs") {
|
|
521
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
522
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Do Work \u2014 Max Runs Per Tick" }),
|
|
523
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
524
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
525
|
-
"Model runs allowed per tick (0 = unlimited):",
|
|
526
|
-
" ",
|
|
527
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
528
|
-
doWorkMaxRuns,
|
|
529
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
530
|
-
] })
|
|
531
|
-
] }),
|
|
532
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
533
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type a number \xB7 Enter to save \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
534
|
-
] });
|
|
535
|
-
}
|
|
536
|
-
if (screen === "do-work-discuss-prompt") {
|
|
537
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
538
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Prompts \u2014 Do Work \u2014 Discuss" }),
|
|
539
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
540
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
541
|
-
"Discussion turn instructions:",
|
|
542
|
-
" ",
|
|
543
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
544
|
-
doWorkDiscussPrompt,
|
|
545
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
546
|
-
] })
|
|
547
|
-
] }),
|
|
548
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
549
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type prompt \xB7 Enter to save \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
550
|
-
] });
|
|
551
|
-
}
|
|
552
|
-
if (screen === "do-work-pr-prompt") {
|
|
553
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
554
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Prompts \u2014 Do Work \u2014 PR" }),
|
|
555
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
556
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
557
|
-
"Pull request turn instructions:",
|
|
558
|
-
" ",
|
|
559
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
560
|
-
doWorkPrPrompt,
|
|
561
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
562
|
-
] })
|
|
563
|
-
] }),
|
|
564
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
565
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type prompt \xB7 Enter to save \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
566
|
-
] });
|
|
567
|
-
}
|
|
568
|
-
if (screen === "agent-user") {
|
|
569
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
570
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Issue Watch \u2014 Agent User" }),
|
|
571
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
572
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
573
|
-
"Login the agent posts as:",
|
|
574
|
-
" ",
|
|
575
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
576
|
-
agentUser,
|
|
577
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
578
|
-
] })
|
|
579
|
-
] }),
|
|
580
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
581
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type login \xB7 Enter to save and exit \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
582
|
-
] });
|
|
583
|
-
}
|
|
584
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginY: 1, children: [
|
|
585
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: "Prompts \u2014 Fix-Comments" }),
|
|
586
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
587
|
-
/* @__PURE__ */ jsxs(Text, { children: [
|
|
588
|
-
"Fix-Comments prompt:",
|
|
589
|
-
" ",
|
|
590
|
-
/* @__PURE__ */ jsxs(Text, { color: "cyan", children: [
|
|
591
|
-
fixCommentsPrompt,
|
|
592
|
-
/* @__PURE__ */ jsx(Text, { children: "_" })
|
|
593
|
-
] })
|
|
594
|
-
] }),
|
|
595
|
-
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
596
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Type prompt \xB7 Enter to save \xB7 Esc to go back \xB7 Ctrl+C to cancel" })
|
|
597
|
-
] });
|
|
598
|
-
}
|
|
599
|
-
export {
|
|
600
|
-
ConfigWizard
|
|
601
|
-
};
|