replicas-cli 0.2.279 → 0.2.280
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/index.mjs +72 -39
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -50,6 +50,9 @@ Connect to a workspace via SSH.
|
|
|
50
50
|
### `replicas interact`
|
|
51
51
|
Launch the interactive terminal dashboard — a full TUI alternative to the web dashboard. View workspaces, chat with agents, monitor environment status, and create workspaces without leaving the terminal.
|
|
52
52
|
|
|
53
|
+
### Coding agents
|
|
54
|
+
Use `replicas claude-auth` or `replicas codex-auth` to connect Claude Code or Codex credentials. Cursor uses a Cursor API key configured in Coding Agents settings.
|
|
55
|
+
|
|
53
56
|
## Configuration
|
|
54
57
|
|
|
55
58
|
Create a `replicas.json` or `replicas.yaml` file in your repository root:
|
package/dist/index.mjs
CHANGED
|
@@ -7559,11 +7559,33 @@ var VALID_AGENT_PROVIDERS = ["claude", "codex", "cursor", "relay"];
|
|
|
7559
7559
|
function isValidAgentProvider(value) {
|
|
7560
7560
|
return VALID_AGENT_PROVIDERS.some((p) => p === value);
|
|
7561
7561
|
}
|
|
7562
|
+
var AGENT_PROVIDER_OPTIONS = [
|
|
7563
|
+
{
|
|
7564
|
+
value: "claude",
|
|
7565
|
+
label: "Claude Code",
|
|
7566
|
+
description: "Use Claude Code for tasks"
|
|
7567
|
+
},
|
|
7568
|
+
{
|
|
7569
|
+
value: "codex",
|
|
7570
|
+
label: "OpenAI Codex",
|
|
7571
|
+
description: "Use OpenAI Codex for tasks"
|
|
7572
|
+
},
|
|
7573
|
+
{
|
|
7574
|
+
value: "cursor",
|
|
7575
|
+
label: "Cursor",
|
|
7576
|
+
description: "Use Cursor for tasks"
|
|
7577
|
+
},
|
|
7578
|
+
{
|
|
7579
|
+
value: "relay",
|
|
7580
|
+
label: "Relay",
|
|
7581
|
+
description: "Orchestrating agent that delegates to Claude Code and Codex subagents"
|
|
7582
|
+
}
|
|
7583
|
+
];
|
|
7562
7584
|
var VALID_THINKING_LEVELS = ["low", "medium", "high", "max"];
|
|
7563
7585
|
function isValidThinkingLevel(value) {
|
|
7564
7586
|
return VALID_THINKING_LEVELS.some((l) => l === value);
|
|
7565
7587
|
}
|
|
7566
|
-
function getProviderDisplayName(provider) {
|
|
7588
|
+
function getProviderDisplayName(provider, variant = "short") {
|
|
7567
7589
|
switch (provider) {
|
|
7568
7590
|
case "codex":
|
|
7569
7591
|
return "Codex";
|
|
@@ -7572,7 +7594,7 @@ function getProviderDisplayName(provider) {
|
|
|
7572
7594
|
case "relay":
|
|
7573
7595
|
return "Relay";
|
|
7574
7596
|
case "claude":
|
|
7575
|
-
return "Claude";
|
|
7597
|
+
return variant === "long" ? "Claude Code" : "Claude";
|
|
7576
7598
|
}
|
|
7577
7599
|
}
|
|
7578
7600
|
|
|
@@ -9242,7 +9264,7 @@ var HOOK_EXEC_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
|
|
|
9242
9264
|
var REPLICAS_CONFIG_FILENAMES = ["replicas.json", "replicas.yaml", "replicas.yml"];
|
|
9243
9265
|
|
|
9244
9266
|
// ../shared/src/cli-version.ts
|
|
9245
|
-
var CLI_VERSION = "0.2.
|
|
9267
|
+
var CLI_VERSION = "0.2.280";
|
|
9246
9268
|
|
|
9247
9269
|
// ../shared/src/engine/environment.ts
|
|
9248
9270
|
var DESKTOP_NOVNC_PORT = 6080;
|
|
@@ -12589,6 +12611,16 @@ Update available: ${currentVersion} \u2192 ${latestVersion}`));
|
|
|
12589
12611
|
// src/commands/replica.ts
|
|
12590
12612
|
import chalk15 from "chalk";
|
|
12591
12613
|
import prompts3 from "prompts";
|
|
12614
|
+
var REPLICA_AGENT_PROVIDERS = VALID_AGENT_PROVIDERS.filter((provider) => provider !== "relay");
|
|
12615
|
+
function parseReplicaAgent(value) {
|
|
12616
|
+
if (!value) return void 0;
|
|
12617
|
+
const normalized = value.trim().toLowerCase();
|
|
12618
|
+
if (isValidAgentProvider(normalized) && normalized !== "relay") {
|
|
12619
|
+
return normalized;
|
|
12620
|
+
}
|
|
12621
|
+
console.log(chalk15.red(`Invalid coding agent: ${value}. Must be one of: ${REPLICA_AGENT_PROVIDERS.join(", ")}`));
|
|
12622
|
+
process.exit(1);
|
|
12623
|
+
}
|
|
12592
12624
|
function formatDate(dateString) {
|
|
12593
12625
|
return new Date(dateString).toLocaleString();
|
|
12594
12626
|
}
|
|
@@ -12789,7 +12821,7 @@ async function replicaCreateCommand(name, options) {
|
|
|
12789
12821
|
let replicaName = name;
|
|
12790
12822
|
let message = options.message;
|
|
12791
12823
|
let selectedEnvironmentId = options.environment?.trim();
|
|
12792
|
-
let codingAgent = options.agent;
|
|
12824
|
+
let codingAgent = parseReplicaAgent(options.agent);
|
|
12793
12825
|
if (replicaName && /\s/.test(replicaName)) {
|
|
12794
12826
|
console.log(chalk15.red("Replica name cannot contain spaces."));
|
|
12795
12827
|
process.exit(1);
|
|
@@ -12846,21 +12878,14 @@ async function replicaCreateCommand(name, options) {
|
|
|
12846
12878
|
type: "select",
|
|
12847
12879
|
name: "agent",
|
|
12848
12880
|
message: "Select coding agent:",
|
|
12849
|
-
choices:
|
|
12850
|
-
{ title: "Claude", value: "claude" },
|
|
12851
|
-
{ title: "Codex", value: "codex" }
|
|
12852
|
-
],
|
|
12881
|
+
choices: AGENT_PROVIDER_OPTIONS.filter((option) => option.value !== "relay").map((option) => ({ title: option.label, value: option.value })),
|
|
12853
12882
|
initial: 0
|
|
12854
12883
|
});
|
|
12855
12884
|
if (!response2.agent) {
|
|
12856
12885
|
console.log(chalk15.yellow("\nCancelled."));
|
|
12857
12886
|
return;
|
|
12858
12887
|
}
|
|
12859
|
-
codingAgent = response2.agent;
|
|
12860
|
-
}
|
|
12861
|
-
if (!codingAgent || !["claude", "codex"].includes(codingAgent)) {
|
|
12862
|
-
console.log(chalk15.red(`Invalid coding agent: ${codingAgent}. Must be one of: claude, codex`));
|
|
12863
|
-
process.exit(1);
|
|
12888
|
+
codingAgent = parseReplicaAgent(response2.agent);
|
|
12864
12889
|
}
|
|
12865
12890
|
const body = {
|
|
12866
12891
|
name: replicaName,
|
|
@@ -12911,11 +12936,7 @@ async function replicaSendCommand(id, options) {
|
|
|
12911
12936
|
message
|
|
12912
12937
|
};
|
|
12913
12938
|
if (options.agent) {
|
|
12914
|
-
|
|
12915
|
-
console.log(chalk15.red(`Invalid coding agent: ${options.agent}. Must be one of: claude, codex`));
|
|
12916
|
-
process.exit(1);
|
|
12917
|
-
}
|
|
12918
|
-
body.coding_agent = options.agent;
|
|
12939
|
+
body.coding_agent = parseReplicaAgent(options.agent);
|
|
12919
12940
|
}
|
|
12920
12941
|
const response = await orgAuthenticatedFetch(
|
|
12921
12942
|
`/v1/replica/${id}/send`,
|
|
@@ -15938,11 +15959,6 @@ ${parsed.userPrompt}` });
|
|
|
15938
15959
|
|
|
15939
15960
|
// src/interactive/components/ChatMessage.tsx
|
|
15940
15961
|
import { Fragment as Fragment3, jsx as jsx6, jsxs as jsxs6 } from "@opentui/react/jsx-runtime";
|
|
15941
|
-
var AGENT_LABELS = {
|
|
15942
|
-
claude: "Claude",
|
|
15943
|
-
codex: "Codex",
|
|
15944
|
-
relay: "Relay"
|
|
15945
|
-
};
|
|
15946
15962
|
function truncate4(text, maxLen) {
|
|
15947
15963
|
return text.length > maxLen ? text.slice(0, maxLen - 1) + "\u2026" : text;
|
|
15948
15964
|
}
|
|
@@ -16089,7 +16105,7 @@ function ChatMessage({ message, provider }) {
|
|
|
16089
16105
|
}
|
|
16090
16106
|
case "agent":
|
|
16091
16107
|
return /* @__PURE__ */ jsxs6("box", { flexDirection: "column", paddingX: 1, children: [
|
|
16092
|
-
/* @__PURE__ */ jsx6("text", { children: /* @__PURE__ */ jsx6("span", { fg: "#3eeba3", children: /* @__PURE__ */ jsx6("strong", { children:
|
|
16108
|
+
/* @__PURE__ */ jsx6("text", { children: /* @__PURE__ */ jsx6("span", { fg: "#3eeba3", children: /* @__PURE__ */ jsx6("strong", { children: getProviderDisplayName(provider) }) }) }),
|
|
16093
16109
|
/* @__PURE__ */ jsx6(
|
|
16094
16110
|
"markdown",
|
|
16095
16111
|
{
|
|
@@ -16197,7 +16213,8 @@ function ChatArea({
|
|
|
16197
16213
|
isProcessing,
|
|
16198
16214
|
loading,
|
|
16199
16215
|
agentAvailable,
|
|
16200
|
-
agentLabel
|
|
16216
|
+
agentLabel,
|
|
16217
|
+
agentConnectHelp
|
|
16201
16218
|
}) {
|
|
16202
16219
|
const textareaRef = useRef2(null);
|
|
16203
16220
|
const scrollboxRef = useRef2(null);
|
|
@@ -16349,9 +16366,8 @@ function ChatArea({
|
|
|
16349
16366
|
) }),
|
|
16350
16367
|
!agentAvailable && /* @__PURE__ */ jsx7("box", { paddingX: 1, height: 1, children: /* @__PURE__ */ jsx7("text", { children: /* @__PURE__ */ jsxs7("span", { fg: "#d97706", children: [
|
|
16351
16368
|
agentLabel,
|
|
16352
|
-
" is not connected.
|
|
16353
|
-
|
|
16354
|
-
"` to connect."
|
|
16369
|
+
" is not connected. ",
|
|
16370
|
+
agentConnectHelp
|
|
16355
16371
|
] }) }) }),
|
|
16356
16372
|
/* @__PURE__ */ jsxs7(
|
|
16357
16373
|
"box",
|
|
@@ -16711,7 +16727,8 @@ function WorkspaceInfo({ status, workspaceName, workspaceId, focused, loading, a
|
|
|
16711
16727
|
const env = rawEnv && agentAvailability ? {
|
|
16712
16728
|
...rawEnv,
|
|
16713
16729
|
claudeAuthMethod: agentAvailability.claude.available ? rawEnv.claudeAuthMethod : "none",
|
|
16714
|
-
codexAuthMethod: agentAvailability.codex.available ? rawEnv.codexAuthMethod : "none"
|
|
16730
|
+
codexAuthMethod: agentAvailability.codex.available ? rawEnv.codexAuthMethod : "none",
|
|
16731
|
+
cursorAuthMethod: agentAvailability.cursor.available ? rawEnv.cursorAuthMethod : "none"
|
|
16715
16732
|
} : rawEnv;
|
|
16716
16733
|
const dashboardItem = findItem("dashboard");
|
|
16717
16734
|
const wakeItem = findItem("wake");
|
|
@@ -16772,7 +16789,7 @@ function WorkspaceInfo({ status, workspaceName, workspaceId, focused, loading, a
|
|
|
16772
16789
|
onClick: () => handleAction(wakeItem)
|
|
16773
16790
|
}
|
|
16774
16791
|
),
|
|
16775
|
-
(status.isClaudeProcessing || status.isCodexProcessing || status.isRelayProcessing) && /* @__PURE__ */ jsxs8("box", { backgroundColor: "#1a1500", paddingX: 1, marginX: 1, marginBottom: 1, children: [
|
|
16792
|
+
(status.isClaudeProcessing || status.isCodexProcessing || status.isCursorProcessing || status.isRelayProcessing) && /* @__PURE__ */ jsxs8("box", { backgroundColor: "#1a1500", paddingX: 1, marginX: 1, marginBottom: 1, children: [
|
|
16776
16793
|
status.isClaudeProcessing && /* @__PURE__ */ jsx8("text", { children: /* @__PURE__ */ jsxs8("span", { fg: "#ffaa00", children: [
|
|
16777
16794
|
"\u25C6",
|
|
16778
16795
|
" Claude thinking..."
|
|
@@ -16781,6 +16798,10 @@ function WorkspaceInfo({ status, workspaceName, workspaceId, focused, loading, a
|
|
|
16781
16798
|
"\u25C6",
|
|
16782
16799
|
" Codex thinking..."
|
|
16783
16800
|
] }) }),
|
|
16801
|
+
status.isCursorProcessing && /* @__PURE__ */ jsx8("text", { children: /* @__PURE__ */ jsxs8("span", { fg: "#ffaa00", children: [
|
|
16802
|
+
"\u25C6",
|
|
16803
|
+
" Cursor thinking..."
|
|
16804
|
+
] }) }),
|
|
16784
16805
|
status.isRelayProcessing && /* @__PURE__ */ jsx8("text", { children: /* @__PURE__ */ jsxs8("span", { fg: "#ffaa00", children: [
|
|
16785
16806
|
"\u25C6",
|
|
16786
16807
|
" Relay thinking..."
|
|
@@ -16794,6 +16815,10 @@ function WorkspaceInfo({ status, workspaceName, workspaceId, focused, loading, a
|
|
|
16794
16815
|
/* @__PURE__ */ jsxs8("box", { flexDirection: "row", justifyContent: "space-between", paddingX: 1, backgroundColor: "#111111", children: [
|
|
16795
16816
|
/* @__PURE__ */ jsx8("text", { children: /* @__PURE__ */ jsx8("span", { fg: "#cccccc", children: "Codex" }) }),
|
|
16796
16817
|
/* @__PURE__ */ jsx8("text", { children: AUTH_METHOD_LABELS[env.codexAuthMethod] ? /* @__PURE__ */ jsx8("span", { fg: "#3eeba3", children: AUTH_METHOD_LABELS[env.codexAuthMethod] }) : /* @__PURE__ */ jsx8("span", { fg: "#ff4444", children: "\u2717" }) })
|
|
16818
|
+
] }),
|
|
16819
|
+
/* @__PURE__ */ jsxs8("box", { flexDirection: "row", justifyContent: "space-between", paddingX: 1, backgroundColor: "#111111", children: [
|
|
16820
|
+
/* @__PURE__ */ jsx8("text", { children: /* @__PURE__ */ jsx8("span", { fg: "#cccccc", children: "Cursor" }) }),
|
|
16821
|
+
/* @__PURE__ */ jsx8("text", { children: AUTH_METHOD_LABELS[env.cursorAuthMethod] ? /* @__PURE__ */ jsx8("span", { fg: "#3eeba3", children: AUTH_METHOD_LABELS[env.cursorAuthMethod] }) : /* @__PURE__ */ jsx8("span", { fg: "#ff4444", children: "\u2717" }) })
|
|
16797
16822
|
] })
|
|
16798
16823
|
] }),
|
|
16799
16824
|
/* @__PURE__ */ jsx8(Section, { title: "View", children: (() => {
|
|
@@ -17031,6 +17056,12 @@ var authValue = {
|
|
|
17031
17056
|
monolithUrl: MONOLITH_URL5,
|
|
17032
17057
|
queryClient
|
|
17033
17058
|
};
|
|
17059
|
+
function getAgentConnectHelp(provider) {
|
|
17060
|
+
if (provider === "codex") return "Run `replicas codex-auth` to connect.";
|
|
17061
|
+
if (provider === "cursor") return "Add a Cursor API key in Coding Agents settings.";
|
|
17062
|
+
if (provider === "relay") return "Configure Relay in Coding Agents settings.";
|
|
17063
|
+
return "Run `replicas claude-auth` to connect.";
|
|
17064
|
+
}
|
|
17034
17065
|
function App() {
|
|
17035
17066
|
return /* @__PURE__ */ jsx11(ReplicasAuthProvider, { value: authValue, children: /* @__PURE__ */ jsxs9(ToastProvider, { children: [
|
|
17036
17067
|
/* @__PURE__ */ jsx11(AppInner, {}),
|
|
@@ -17116,8 +17147,9 @@ function AppInner() {
|
|
|
17116
17147
|
const selectedChat = chats.find((c) => c.id === resolvedChatId) ?? null;
|
|
17117
17148
|
const isProcessing = mockThinking || (selectedChat?.processing ?? false);
|
|
17118
17149
|
const selectedAgent = selectedChat?.provider ?? "claude";
|
|
17119
|
-
const agentAvailable = agentAvailability ? selectedAgent === "codex" ? agentAvailability.codex.available : agentAvailability.claude.available : true;
|
|
17120
|
-
const agentLabel = selectedAgent
|
|
17150
|
+
const agentAvailable = agentAvailability ? selectedAgent === "codex" ? agentAvailability.codex.available : selectedAgent === "cursor" ? agentAvailability.cursor.available : selectedAgent === "relay" ? agentAvailability.relay.available : agentAvailability.claude.available : true;
|
|
17151
|
+
const agentLabel = getProviderDisplayName(selectedAgent, "long");
|
|
17152
|
+
const agentConnectHelp = getAgentConnectHelp(selectedAgent);
|
|
17121
17153
|
const displayMessages = useMemo6(() => {
|
|
17122
17154
|
if (isMockSelected) return mockMessages;
|
|
17123
17155
|
const rawEvents = historyData?.events ?? [];
|
|
@@ -17313,7 +17345,7 @@ function AppInner() {
|
|
|
17313
17345
|
return;
|
|
17314
17346
|
}
|
|
17315
17347
|
if (!agentAvailable) {
|
|
17316
|
-
toast.error(new Error(`${agentLabel} is not connected.
|
|
17348
|
+
toast.error(new Error(`${agentLabel} is not connected. ${agentConnectHelp}`));
|
|
17317
17349
|
return;
|
|
17318
17350
|
}
|
|
17319
17351
|
sendMessageMutation.mutate({
|
|
@@ -17321,7 +17353,7 @@ function AppInner() {
|
|
|
17321
17353
|
planMode: taskMode === "plan"
|
|
17322
17354
|
});
|
|
17323
17355
|
},
|
|
17324
|
-
[selectedWorkspaceId, resolvedChatId, isMockSelected, sendMessageMutation, taskMode, agentAvailable, agentLabel,
|
|
17356
|
+
[selectedWorkspaceId, resolvedChatId, isMockSelected, sendMessageMutation, taskMode, agentAvailable, agentLabel, agentConnectHelp, toast.error]
|
|
17325
17357
|
);
|
|
17326
17358
|
return /* @__PURE__ */ jsxs9("box", { flexDirection: "column", width: "100%", height: "100%", backgroundColor: "#000000", children: [
|
|
17327
17359
|
/* @__PURE__ */ jsxs9("box", { flexDirection: "row", flexGrow: 1, backgroundColor: "#000000", children: [
|
|
@@ -17366,7 +17398,8 @@ function AppInner() {
|
|
|
17366
17398
|
isProcessing,
|
|
17367
17399
|
loading: loadingMessages,
|
|
17368
17400
|
agentAvailable,
|
|
17369
|
-
agentLabel
|
|
17401
|
+
agentLabel,
|
|
17402
|
+
agentConnectHelp
|
|
17370
17403
|
}
|
|
17371
17404
|
) : selectedWorkspaceId && statusData?.status === "sleeping" ? /* @__PURE__ */ jsxs9(
|
|
17372
17405
|
"box",
|
|
@@ -18134,7 +18167,7 @@ program.command("get <id>").description("Get replica details by ID").action(asyn
|
|
|
18134
18167
|
process.exit(1);
|
|
18135
18168
|
}
|
|
18136
18169
|
});
|
|
18137
|
-
program.command("create [name]").description("Create a new replica").option("-m, --message <message>", "Initial message for the replica").option("-e, --environment <environment>", "Environment ID").option("-a, --agent <agent>", "Coding agent (claude, codex)").action(async (name, options) => {
|
|
18170
|
+
program.command("create [name]").description("Create a new replica").option("-m, --message <message>", "Initial message for the replica").option("-e, --environment <environment>", "Environment ID").option("-a, --agent <agent>", "Coding agent (claude, codex, cursor)").action(async (name, options) => {
|
|
18138
18171
|
try {
|
|
18139
18172
|
await replicaCreateCommand(name, options);
|
|
18140
18173
|
} catch (error) {
|
|
@@ -18146,7 +18179,7 @@ program.command("create [name]").description("Create a new replica").option("-m,
|
|
|
18146
18179
|
process.exit(1);
|
|
18147
18180
|
}
|
|
18148
18181
|
});
|
|
18149
|
-
program.command("send <id>").description("Send a message to a replica").option("-m, --message <message>", "Message to send").option("-a, --agent <agent>", "Coding agent (claude, codex)").action(async (id, options) => {
|
|
18182
|
+
program.command("send <id>").description("Send a message to a replica").option("-m, --message <message>", "Message to send").option("-a, --agent <agent>", "Coding agent (claude, codex, cursor)").action(async (id, options) => {
|
|
18150
18183
|
try {
|
|
18151
18184
|
await replicaSendCommand(id, options);
|
|
18152
18185
|
} catch (error) {
|
|
@@ -18207,7 +18240,7 @@ automation.command("get <id>").description("Get automation details by ID").actio
|
|
|
18207
18240
|
process.exit(1);
|
|
18208
18241
|
}
|
|
18209
18242
|
});
|
|
18210
|
-
automation.command("create [name]").description("Create a new automation").option("-p, --prompt <prompt>", "Prompt for the automation").option("-e, --environment <environment>", "Environment name or ID").option("--trigger-cron <schedule>", 'Cron schedule expression (e.g. "0 9 * * 1-5")').option("--trigger-cron-timezone <timezone>", "Timezone for cron trigger (default: UTC)").option("--trigger-github <event>", 'GitHub event (e.g. "pull_request.opened")').option("--trigger-github-repos <repos>", "Comma-separated repo names to filter GitHub trigger").option("--lifecycle <policy>", "Workspace lifecycle: delete_when_done, delete_after_inactivity, default").option("--auto-stop-minutes <minutes>", "Inactivity timeout in minutes (3-1440, requires --lifecycle delete_after_inactivity)").option("--pr-followups", "Allow follow-up actions on matching PRs").option("--agent-provider <provider>", 'Coding agent to use: claude, codex, relay (or "none" to inherit org default)').option("--model <model>", 'Model identifier (must be valid for --agent-provider; pass "none" to clear)').option("--thinking-level <level>", 'Thinking/reasoning level: low, medium, high, max (or "none" to clear)').option("--plan-mode", "Run automation messages in plan mode").option("--goal-mode", "Set automation messages as Codex goals").option("--fast-mode", "Run automation messages in fast mode").option("--personal", "Create a personal automation owned by the authenticated user").option("--disabled", "Create in disabled state").action(async (name, options) => {
|
|
18243
|
+
automation.command("create [name]").description("Create a new automation").option("-p, --prompt <prompt>", "Prompt for the automation").option("-e, --environment <environment>", "Environment name or ID").option("--trigger-cron <schedule>", 'Cron schedule expression (e.g. "0 9 * * 1-5")').option("--trigger-cron-timezone <timezone>", "Timezone for cron trigger (default: UTC)").option("--trigger-github <event>", 'GitHub event (e.g. "pull_request.opened")').option("--trigger-github-repos <repos>", "Comma-separated repo names to filter GitHub trigger").option("--lifecycle <policy>", "Workspace lifecycle: delete_when_done, delete_after_inactivity, default").option("--auto-stop-minutes <minutes>", "Inactivity timeout in minutes (3-1440, requires --lifecycle delete_after_inactivity)").option("--pr-followups", "Allow follow-up actions on matching PRs").option("--agent-provider <provider>", 'Coding agent to use: claude, codex, cursor, relay (or "none" to inherit org default)').option("--model <model>", 'Model identifier (must be valid for --agent-provider; pass "none" to clear)').option("--thinking-level <level>", 'Thinking/reasoning level: low, medium, high, max (or "none" to clear)').option("--plan-mode", "Run automation messages in plan mode").option("--goal-mode", "Set automation messages as Codex goals").option("--fast-mode", "Run automation messages in fast mode").option("--personal", "Create a personal automation owned by the authenticated user").option("--disabled", "Create in disabled state").action(async (name, options) => {
|
|
18211
18244
|
try {
|
|
18212
18245
|
await automationCreateCommand(name, {
|
|
18213
18246
|
...options,
|
|
@@ -18222,7 +18255,7 @@ automation.command("create [name]").description("Create a new automation").optio
|
|
|
18222
18255
|
process.exit(1);
|
|
18223
18256
|
}
|
|
18224
18257
|
});
|
|
18225
|
-
automation.command("edit <id>").description("Edit an existing automation").option("-n, --name <name>", "New name").option("-p, --prompt <prompt>", "New prompt").option("-e, --enabled <enabled>", "Enable or disable (true/false)").option("--trigger-cron <schedule>", "Set cron schedule (replaces existing triggers)").option("--trigger-cron-timezone <timezone>", "Timezone for cron trigger").option("--trigger-github <event>", "Set GitHub event (replaces existing triggers)").option("--trigger-github-repos <repos>", "Comma-separated repo names to filter GitHub trigger").option("--environment <environment>", "Environment name or ID").option("--lifecycle <policy>", "Workspace lifecycle: delete_when_done, delete_after_inactivity, default").option("--auto-stop-minutes <minutes>", "Inactivity timeout in minutes (3-1440, requires --lifecycle delete_after_inactivity)").option("--pr-followups <enabled>", "Allow follow-up actions on matching PRs (true/false)", parseBooleanOption).option("--agent-provider <provider>", 'Coding agent to use: claude, codex, relay (or "none" to inherit org default)').option("--model <model>", 'Model identifier (must be valid for --agent-provider; pass "none" to clear)').option("--thinking-level <level>", 'Thinking/reasoning level: low, medium, high, max (or "none" to clear)').option("--plan-mode <enabled>", "Run automation messages in plan mode (true/false)", parseBooleanOption).option("--goal-mode <enabled>", "Set automation messages as Codex goals (true/false)", parseBooleanOption).option("--fast-mode <enabled>", "Run automation messages in fast mode (true/false)", parseBooleanOption).action(async (id, options) => {
|
|
18258
|
+
automation.command("edit <id>").description("Edit an existing automation").option("-n, --name <name>", "New name").option("-p, --prompt <prompt>", "New prompt").option("-e, --enabled <enabled>", "Enable or disable (true/false)").option("--trigger-cron <schedule>", "Set cron schedule (replaces existing triggers)").option("--trigger-cron-timezone <timezone>", "Timezone for cron trigger").option("--trigger-github <event>", "Set GitHub event (replaces existing triggers)").option("--trigger-github-repos <repos>", "Comma-separated repo names to filter GitHub trigger").option("--environment <environment>", "Environment name or ID").option("--lifecycle <policy>", "Workspace lifecycle: delete_when_done, delete_after_inactivity, default").option("--auto-stop-minutes <minutes>", "Inactivity timeout in minutes (3-1440, requires --lifecycle delete_after_inactivity)").option("--pr-followups <enabled>", "Allow follow-up actions on matching PRs (true/false)", parseBooleanOption).option("--agent-provider <provider>", 'Coding agent to use: claude, codex, cursor, relay (or "none" to inherit org default)').option("--model <model>", 'Model identifier (must be valid for --agent-provider; pass "none" to clear)').option("--thinking-level <level>", 'Thinking/reasoning level: low, medium, high, max (or "none" to clear)').option("--plan-mode <enabled>", "Run automation messages in plan mode (true/false)", parseBooleanOption).option("--goal-mode <enabled>", "Set automation messages as Codex goals (true/false)", parseBooleanOption).option("--fast-mode <enabled>", "Run automation messages in fast mode (true/false)", parseBooleanOption).action(async (id, options) => {
|
|
18226
18259
|
try {
|
|
18227
18260
|
await automationEditCommand(id, options);
|
|
18228
18261
|
} catch (error) {
|