replicas-cli 0.2.285 → 0.2.286

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.
Files changed (2) hide show
  1. package/dist/index.mjs +130 -42
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -8999,7 +8999,7 @@ In agent mode the CLI hides commands that don't make sense for in-workspace agen
8999
8999
  | \`replicas connect <name>\` | SSH into another workspace (requires user creds \u2014 usually only useful when scripting locally) |
9000
9000
  | \`replicas repos\` | List repos connected to the org |
9001
9001
  | \`replicas environment ...\` | Manage environments, env vars, env files |
9002
- | \`replicas automation ...\` | Manage automations (cron + GitHub event triggers) |
9002
+ | \`replicas automation ...\` | Manage automations (cron + GitHub/GitLab event triggers) |
9003
9003
  | \`replicas preview ...\` | Register / list preview URLs (covered in \`PREVIEWS.md\`) |
9004
9004
  | \`replicas media ...\` | Upload screenshots, videos, audio (covered in \`MEDIA.md\`) |
9005
9005
 
@@ -9017,6 +9017,7 @@ In agent mode the CLI hides commands that don't make sense for in-workspace agen
9017
9017
  | "Run my nightly automation now" | \`replicas automation run <id>\` |
9018
9018
  | "Make an automation that runs every weekday at 9am" | \`replicas automation create\` (interactive) or \`--trigger-cron "0 9 * * 1-5"\` |
9019
9019
  | "Make an automation that runs when a PR opens on \`acme/web\`" | \`replicas automation create ... --trigger-github pull_request.opened --trigger-github-repos acme/web\` |
9020
+ | "Make an automation that runs when an MR opens on \`acme/web\`" | \`replicas automation create ... --trigger-gitlab merge_request.opened --trigger-gitlab-repos acme/web\` |
9020
9021
  | "What repos are connected?" | \`replicas repos\` |
9021
9022
  | "Set up a \`replicas.json\` in this repo" | \`replicas init\` (\`-y\` for YAML) |
9022
9023
 
@@ -9075,7 +9076,7 @@ Constraints:
9075
9076
 
9076
9077
  ## Automations
9077
9078
 
9078
- Automations are saved prompts with one or more triggers (cron schedules and/or GitHub events). When fired, they create a workspace using the configured environment and run the prompt with the user's coding agent.
9079
+ Automations are saved prompts with one or more triggers (cron schedules and/or GitHub or GitLab events). When fired, they create a workspace using the configured environment and run the prompt with the user's coding agent.
9079
9080
 
9080
9081
  ### List / get / run / delete
9081
9082
 
@@ -9105,6 +9106,12 @@ replicas automation create "Review my PRs" \\
9105
9106
  --trigger-github pull_request.opened \\
9106
9107
  --trigger-github-repos acme/web,acme/api
9107
9108
 
9109
+ replicas automation create "Review my MRs" \\
9110
+ --prompt "Leave a code review on this MR" \\
9111
+ --environment <env-name-or-id> \\
9112
+ --trigger-gitlab merge_request.opened \\
9113
+ --trigger-gitlab-repos acme/web,acme/api
9114
+
9108
9115
  # Disable on creation
9109
9116
  replicas automation create ... --disabled
9110
9117
 
@@ -9338,7 +9345,7 @@ var HOOK_EXEC_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
9338
9345
  var REPLICAS_CONFIG_FILENAMES = ["replicas.json", "replicas.yaml", "replicas.yml"];
9339
9346
 
9340
9347
  // ../shared/src/cli-version.ts
9341
- var CLI_VERSION = "0.2.285";
9348
+ var CLI_VERSION = "0.2.286";
9342
9349
 
9343
9350
  // ../shared/src/engine/environment.ts
9344
9351
  var DESKTOP_NOVNC_PORT = 6080;
@@ -9539,6 +9546,30 @@ var GITHUB_TRIGGER = {
9539
9546
  ]
9540
9547
  };
9541
9548
 
9549
+ // ../shared/src/automations/gitlab/index.ts
9550
+ var REPO_FILTER_PARAM2 = {
9551
+ id: "repository_ids",
9552
+ label: "Filter by project",
9553
+ type: "repository_ids"
9554
+ };
9555
+ var GROUP_MR_EVENTS_PARAM = {
9556
+ id: "group_pr_events",
9557
+ label: "Group MR events to same workspace",
9558
+ type: "boolean"
9559
+ };
9560
+ var GITLAB_TRIGGER = {
9561
+ type: "gitlab",
9562
+ label: "GitLab",
9563
+ description: "Trigger on project events",
9564
+ icon: "gitlab",
9565
+ events: [
9566
+ { id: "merge_request.opened", label: "MR opened", parameters: [REPO_FILTER_PARAM2, GROUP_MR_EVENTS_PARAM] },
9567
+ { id: "merge_request.updated", label: "MR updated (new commits)", parameters: [REPO_FILTER_PARAM2, GROUP_MR_EVENTS_PARAM] },
9568
+ { id: "merge_request.merged", label: "MR merged", parameters: [REPO_FILTER_PARAM2] },
9569
+ { id: "merge_request.closed", label: "MR closed", parameters: [REPO_FILTER_PARAM2] }
9570
+ ]
9571
+ };
9572
+
9542
9573
  // ../shared/src/display-message/types.ts
9543
9574
  var BACKGROUND_TASK_SUBTYPES = /* @__PURE__ */ new Set([
9544
9575
  "task_started",
@@ -13362,8 +13393,29 @@ function formatTrigger(trigger) {
13362
13393
  const repoFilter = config2.repository_ids?.length ? ` (${config2.repository_ids.length} repo${config2.repository_ids.length > 1 ? "s" : ""} filtered)` : "";
13363
13394
  return `github: ${config2.event}${repoFilter}`;
13364
13395
  }
13396
+ if (trigger.type === "gitlab") {
13397
+ const config2 = trigger.config;
13398
+ const repoFilter = config2.repository_ids?.length ? ` (${config2.repository_ids.length} project${config2.repository_ids.length > 1 ? "s" : ""} filtered)` : "";
13399
+ return `gitlab: ${config2.event}${repoFilter}`;
13400
+ }
13365
13401
  return `${trigger.type}`;
13366
13402
  }
13403
+ function resolveTriggerRepositoryIds(repositories, repoNamesInput, provider) {
13404
+ if (!repoNamesInput) return void 0;
13405
+ const repoIds = [];
13406
+ const providerRepos = repositories.filter((repo) => !repo.provider || repo.provider === provider);
13407
+ const repoNames = repoNamesInput.split(",").map((r) => r.trim()).filter(Boolean);
13408
+ for (const repoName of repoNames) {
13409
+ const repo = providerRepos.find((r) => r.name === repoName);
13410
+ if (!repo) {
13411
+ console.log(chalk18.red(`Repository not found for ${provider} trigger filter: ${repoName}`));
13412
+ console.log(chalk18.gray(`Available: ${providerRepos.map((r) => r.name).join(", ")}`));
13413
+ process.exit(1);
13414
+ }
13415
+ repoIds.push(repo.id);
13416
+ }
13417
+ return repoIds;
13418
+ }
13367
13419
  function truncate2(text, maxLength) {
13368
13420
  if (text.length <= maxLength) return text;
13369
13421
  return text.substring(0, maxLength) + "...";
@@ -13513,7 +13565,8 @@ async function promptForTriggers(repositories) {
13513
13565
  message: "Select trigger type:",
13514
13566
  choices: [
13515
13567
  { title: "Cron (scheduled)", value: "cron" },
13516
- { title: "GitHub (event-based)", value: "github" }
13568
+ { title: "GitHub (event-based)", value: "github" },
13569
+ { title: "GitLab (event-based)", value: "gitlab" }
13517
13570
  ]
13518
13571
  });
13519
13572
  if (!typeResponse.type) return triggers;
@@ -13547,12 +13600,13 @@ async function promptForTriggers(repositories) {
13547
13600
  });
13548
13601
  if (!eventResponse.event) return triggers;
13549
13602
  let triggerRepoIds;
13550
- if (repositories && repositories.length > 0) {
13603
+ const githubRepositories = repositories?.filter((repo) => !repo.provider || repo.provider === "github") ?? [];
13604
+ if (githubRepositories.length > 0) {
13551
13605
  const filterResponse = await prompts4({
13552
13606
  type: "multiselect",
13553
13607
  name: "repos",
13554
13608
  message: "Filter trigger to specific repositories (press enter to skip for all):",
13555
- choices: repositories.map((r) => ({ title: r.name, value: r.id }))
13609
+ choices: githubRepositories.map((r) => ({ title: r.name, value: r.id }))
13556
13610
  });
13557
13611
  if (filterResponse.repos && filterResponse.repos.length > 0) {
13558
13612
  triggerRepoIds = filterResponse.repos;
@@ -13565,6 +13619,34 @@ async function promptForTriggers(repositories) {
13565
13619
  ...triggerRepoIds ? { repository_ids: triggerRepoIds } : {}
13566
13620
  }
13567
13621
  });
13622
+ } else if (typeResponse.type === "gitlab") {
13623
+ const eventResponse = await prompts4({
13624
+ type: "select",
13625
+ name: "event",
13626
+ message: "Select GitLab event:",
13627
+ choices: GITLAB_TRIGGER.events?.map((e) => ({ title: e.label, value: e.id })) ?? []
13628
+ });
13629
+ if (!eventResponse.event) return triggers;
13630
+ let triggerRepoIds;
13631
+ const gitlabRepositories = repositories?.filter((repo) => repo.provider === "gitlab") ?? [];
13632
+ if (gitlabRepositories.length > 0) {
13633
+ const filterResponse = await prompts4({
13634
+ type: "multiselect",
13635
+ name: "repos",
13636
+ message: "Filter trigger to specific GitLab projects (press enter to skip for all):",
13637
+ choices: gitlabRepositories.map((r) => ({ title: r.name, value: r.id }))
13638
+ });
13639
+ if (filterResponse.repos && filterResponse.repos.length > 0) {
13640
+ triggerRepoIds = filterResponse.repos;
13641
+ }
13642
+ }
13643
+ triggers.push({
13644
+ type: "gitlab",
13645
+ config: {
13646
+ event: eventResponse.event,
13647
+ ...triggerRepoIds ? { repository_ids: triggerRepoIds } : {}
13648
+ }
13649
+ });
13568
13650
  }
13569
13651
  const moreResponse = await prompts4({
13570
13652
  type: "confirm",
@@ -13667,20 +13749,7 @@ async function automationCreateCommand(name, options) {
13667
13749
  });
13668
13750
  }
13669
13751
  if (options.triggerGithub) {
13670
- let githubRepoIds;
13671
- if (options.triggerGithubRepos) {
13672
- githubRepoIds = [];
13673
- const repoNames = options.triggerGithubRepos.split(",").map((r) => r.trim()).filter(Boolean);
13674
- for (const repoName of repoNames) {
13675
- const repo = repositories.find((r) => r.name === repoName);
13676
- if (!repo) {
13677
- console.log(chalk18.red(`Repository not found for trigger filter: ${repoName}`));
13678
- console.log(chalk18.gray(`Available: ${repositories.map((r) => r.name).join(", ")}`));
13679
- process.exit(1);
13680
- }
13681
- githubRepoIds.push(repo.id);
13682
- }
13683
- }
13752
+ const githubRepoIds = resolveTriggerRepositoryIds(repositories, options.triggerGithubRepos, "github");
13684
13753
  triggers.push({
13685
13754
  type: "github",
13686
13755
  config: {
@@ -13689,8 +13758,18 @@ async function automationCreateCommand(name, options) {
13689
13758
  }
13690
13759
  });
13691
13760
  }
13761
+ if (options.triggerGitlab) {
13762
+ const gitlabRepoIds = resolveTriggerRepositoryIds(repositories, options.triggerGitlabRepos, "gitlab");
13763
+ triggers.push({
13764
+ type: "gitlab",
13765
+ config: {
13766
+ event: options.triggerGitlab,
13767
+ ...gitlabRepoIds ? { repository_ids: gitlabRepoIds } : {}
13768
+ }
13769
+ });
13770
+ }
13692
13771
  if (triggers.length === 0) {
13693
- triggers = await promptForTriggers(repositories.map((r) => ({ id: r.id, name: r.name })));
13772
+ triggers = await promptForTriggers(repositories.map((r) => ({ id: r.id, name: r.name, provider: r.provider })));
13694
13773
  if (triggers.length === 0) {
13695
13774
  console.log(chalk18.red("At least one trigger is required."));
13696
13775
  process.exit(1);
@@ -13769,7 +13848,7 @@ async function automationEditCommand(id, options) {
13769
13848
  model: existing.automation.model
13770
13849
  });
13771
13850
  const body = {};
13772
- const hasOptions = options.name || options.prompt || options.enabled !== void 0 || options.prFollowups !== void 0 || options.triggerCron || options.triggerGithub || options.environment || options.lifecycle || options.autoStopMinutes || options.agentProvider !== void 0 || options.model !== void 0 || options.thinkingLevel !== void 0 || options.planMode !== void 0 || options.goalMode !== void 0 || options.fastMode !== void 0;
13851
+ const hasOptions = options.name || options.prompt || options.enabled !== void 0 || options.prFollowups !== void 0 || options.triggerCron || options.triggerGithub || options.triggerGitlab || options.environment || options.lifecycle || options.autoStopMinutes || options.agentProvider !== void 0 || options.model !== void 0 || options.thinkingLevel !== void 0 || options.planMode !== void 0 || options.goalMode !== void 0 || options.fastMode !== void 0;
13773
13852
  if (!hasOptions) {
13774
13853
  const nameResponse = await prompts4({
13775
13854
  type: "text",
@@ -13829,7 +13908,7 @@ async function automationEditCommand(id, options) {
13829
13908
  if (options.prFollowups !== void 0) {
13830
13909
  body.config = workspaceConfigWithPrFollowups(existing.automation.config, options.prFollowups);
13831
13910
  }
13832
- if (options.triggerCron || options.triggerGithub) {
13911
+ if (options.triggerCron || options.triggerGithub || options.triggerGitlab) {
13833
13912
  const triggers = [];
13834
13913
  if (options.triggerCron) {
13835
13914
  triggers.push({
@@ -13841,21 +13920,12 @@ async function automationEditCommand(id, options) {
13841
13920
  });
13842
13921
  }
13843
13922
  if (options.triggerGithub) {
13844
- let githubRepoIds;
13845
- if (options.triggerGithubRepos) {
13846
- const repoResponse = await orgAuthenticatedFetch("/v1/repositories");
13847
- githubRepoIds = [];
13848
- const repoNames = options.triggerGithubRepos.split(",").map((r) => r.trim()).filter(Boolean);
13849
- for (const repoName of repoNames) {
13850
- const repo = repoResponse.repositories.find((r) => r.name === repoName);
13851
- if (!repo) {
13852
- console.log(chalk18.red(`Repository not found for trigger filter: ${repoName}`));
13853
- console.log(chalk18.gray(`Available: ${repoResponse.repositories.map((r) => r.name).join(", ")}`));
13854
- process.exit(1);
13855
- }
13856
- githubRepoIds.push(repo.id);
13857
- }
13858
- }
13923
+ const repoResponse = options.triggerGithubRepos ? await orgAuthenticatedFetch("/v1/repositories") : null;
13924
+ const githubRepoIds = resolveTriggerRepositoryIds(
13925
+ repoResponse?.repositories ?? [],
13926
+ options.triggerGithubRepos,
13927
+ "github"
13928
+ );
13859
13929
  triggers.push({
13860
13930
  type: "github",
13861
13931
  config: {
@@ -13864,6 +13934,21 @@ async function automationEditCommand(id, options) {
13864
13934
  }
13865
13935
  });
13866
13936
  }
13937
+ if (options.triggerGitlab) {
13938
+ const repoResponse = options.triggerGitlabRepos ? await orgAuthenticatedFetch("/v1/repositories") : null;
13939
+ const gitlabRepoIds = resolveTriggerRepositoryIds(
13940
+ repoResponse?.repositories ?? [],
13941
+ options.triggerGitlabRepos,
13942
+ "gitlab"
13943
+ );
13944
+ triggers.push({
13945
+ type: "gitlab",
13946
+ config: {
13947
+ event: options.triggerGitlab,
13948
+ ...gitlabRepoIds ? { repository_ids: gitlabRepoIds } : {}
13949
+ }
13950
+ });
13951
+ }
13867
13952
  body.triggers = triggers;
13868
13953
  }
13869
13954
  if (options.environment) {
@@ -16609,8 +16694,10 @@ var WEB_APP_URL3 = process.env.REPLICAS_WEB_URL || "https://tryreplicas.com";
16609
16694
  function buildInteractiveItems(workspaceId, status, previews, wakingWorkspaceId) {
16610
16695
  const items = [];
16611
16696
  const hasAnyPr = status.repoStatuses?.some((repo) => repo.prUrls.length > 0);
16612
- const githubConfigured = status.environmentDetails?.githubAccessConfigured;
16613
- if (workspaceId && status.status === "active" && !hasAnyPr && githubConfigured) {
16697
+ const codeHostConfigured = Boolean(
16698
+ status.environmentDetails?.githubAccessConfigured || status.environmentDetails?.gitlabAccessConfigured
16699
+ );
16700
+ if (workspaceId && status.status === "active" && !hasAnyPr && codeHostConfigured) {
16614
16701
  items.push({ type: "createPr" });
16615
16702
  }
16616
16703
  if (workspaceId) {
@@ -17091,6 +17178,7 @@ function WorkspaceInfo({ status, workspaceName, workspaceId, focused, loading, a
17091
17178
  })() }),
17092
17179
  env && /* @__PURE__ */ jsxs8(Section, { title: "Integrations", children: [
17093
17180
  /* @__PURE__ */ jsx8(CardItem, { label: "GitHub", status: env.githubAccessConfigured }),
17181
+ /* @__PURE__ */ jsx8(CardItem, { label: "GitLab", status: env.gitlabAccessConfigured }),
17094
17182
  /* @__PURE__ */ jsx8(CardItem, { label: "Slack", status: env.slackAccessConfigured }),
17095
17183
  /* @__PURE__ */ jsx8(CardItem, { label: "Linear", status: env.linearAccessConfigured }),
17096
17184
  /* @__PURE__ */ jsx8(CardItem, { label: "Google Drive", status: env.googleAccessConfigured })
@@ -18445,7 +18533,7 @@ automation.command("get <id>").description("Get automation details by ID").actio
18445
18533
  process.exit(1);
18446
18534
  }
18447
18535
  });
18448
- 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) => {
18536
+ 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("--trigger-gitlab <event>", 'GitLab event (e.g. "merge_request.opened")').option("--trigger-gitlab-repos <repos>", "Comma-separated repo names to filter GitLab 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) => {
18449
18537
  try {
18450
18538
  await automationCreateCommand(name, {
18451
18539
  ...options,
@@ -18460,7 +18548,7 @@ automation.command("create [name]").description("Create a new automation").optio
18460
18548
  process.exit(1);
18461
18549
  }
18462
18550
  });
18463
- 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) => {
18551
+ 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("--trigger-gitlab <event>", "Set GitLab event (replaces existing triggers)").option("--trigger-gitlab-repos <repos>", "Comma-separated repo names to filter GitLab 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) => {
18464
18552
  try {
18465
18553
  await automationEditCommand(id, options);
18466
18554
  } catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-cli",
3
- "version": "0.2.285",
3
+ "version": "0.2.286",
4
4
  "description": "CLI for managing Replicas workspaces - SSH into cloud dev environments with automatic port forwarding",
5
5
  "main": "dist/index.mjs",
6
6
  "bin": {