replicas-cli 0.2.341 → 0.2.343

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 +127 -16
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -7721,6 +7721,7 @@ var AGENT_MODELS = {
7721
7721
  "gpt-5-mini",
7722
7722
  "gemini-3.1-pro",
7723
7723
  "gemini-3-flash",
7724
+ "grok-4.5",
7724
7725
  "grok-4.3",
7725
7726
  CLAUDE_HAIKU_4_5_MODEL,
7726
7727
  "kimi-k2.5"
@@ -7758,6 +7759,7 @@ var MODEL_LABELS = {
7758
7759
  [CLAUDE_HAIKU_4_5_MODEL]: "Haiku 4.5",
7759
7760
  "gemini-3.1-pro": "Gemini 3.1 Pro",
7760
7761
  "gemini-3-flash": "Gemini 3 Flash",
7762
+ "grok-4.5": "Grok 4.5",
7761
7763
  "grok-4.3": "Grok 4.3",
7762
7764
  "kimi-k2.5": "Kimi K2.5"
7763
7765
  };
@@ -9268,6 +9270,7 @@ In agent mode the CLI hides commands that don't make sense for in-workspace agen
9268
9270
  | "Make an automation that runs every weekday at 9am" | \`replicas automation create\` (interactive) or \`--trigger-cron "0 9 * * 1-5"\` |
9269
9271
  | "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\` |
9270
9272
  | "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\` |
9273
+ | "Ignore Dependabot for this PR automation" | \`replicas automation edit <id> --trigger-github-exclude-users 'dependabot[bot]'\` |
9271
9274
  | "What repos are connected?" | \`replicas repos\` |
9272
9275
  | "Set up a \`replicas.json\` in this repo" | \`replicas init\` (\`-y\` for YAML) |
9273
9276
 
@@ -9354,13 +9357,15 @@ replicas automation create "Review my PRs" \\
9354
9357
  --prompt "Leave a code review on this PR" \\
9355
9358
  --environment <env-name-or-id> \\
9356
9359
  --trigger-github pull_request.opened \\
9357
- --trigger-github-repos acme/web,acme/api
9360
+ --trigger-github-repos acme/web,acme/api \\
9361
+ --trigger-github-exclude-users 'dependabot[bot],renovate[bot]'
9358
9362
 
9359
9363
  replicas automation create "Review my MRs" \\
9360
9364
  --prompt "Leave a code review on this MR" \\
9361
9365
  --environment <env-name-or-id> \\
9362
9366
  --trigger-gitlab merge_request.opened \\
9363
- --trigger-gitlab-repos acme/web,acme/api
9367
+ --trigger-gitlab-repos acme/web,acme/api \\
9368
+ --trigger-gitlab-exclude-users 'bot-user'
9364
9369
 
9365
9370
  # Disable on creation
9366
9371
  replicas automation create ... --disabled
@@ -9384,6 +9389,8 @@ replicas automation edit <id> \\
9384
9389
  --trigger-cron "0 4 * * *" # replaces existing triggers
9385
9390
  \`\`\`
9386
9391
 
9392
+ \`replicas automation edit <id> --trigger-github-exclude-users "dependabot[bot],renovate[bot]"\` updates existing GitHub triggers without replacing the rest of the trigger list. The GitLab equivalent is \`--trigger-gitlab-exclude-users\`. Passing an empty string (for example, \`--trigger-github-exclude-users ""\`) clears existing exclusions for that code host. Passing \`--trigger-github\` or \`--trigger-gitlab\` still replaces triggers, and the matching exclude flag is applied to the replacement trigger.
9393
+
9387
9394
  \`replicas automation edit <id>\` with no flags drops into interactive mode.
9388
9395
 
9389
9396
  ## Repositories
@@ -9558,6 +9565,27 @@ var REPLICAS_AGENT_ABILITIES = Object.keys(
9558
9565
  );
9559
9566
 
9560
9567
  // ../shared/src/routes/preferences.ts
9568
+ var EMPTY_AGENT_DEFAULT_SETTINGS = {
9569
+ agent_provider: null,
9570
+ model: null,
9571
+ thinking_level: null,
9572
+ goal_mode: null,
9573
+ fast_mode: null
9574
+ };
9575
+ var DEFAULT_USER_PREFERENCES = {
9576
+ default_agent: "codex",
9577
+ default_model: null,
9578
+ cursor_models: null,
9579
+ close_workspace_on_pr_close: true,
9580
+ default_environment_id: null,
9581
+ respond_to_ci_workflows: true,
9582
+ respond_to_ci_checks: true,
9583
+ respond_to_human_pr_reviews: false,
9584
+ pr_user_attribution: false,
9585
+ auto_draft_prs: false,
9586
+ default_fast_mode: false,
9587
+ agent_defaults: { ...EMPTY_AGENT_DEFAULT_SETTINGS }
9588
+ };
9561
9589
  var DEFAULT_REPLICAS_AGENT_ABILITIES = Object.fromEntries(
9562
9590
  REPLICAS_AGENT_ABILITIES.map((key) => [key, true])
9563
9591
  );
@@ -9597,7 +9625,7 @@ var HOOK_EXEC_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
9597
9625
  var REPLICAS_CONFIG_FILENAMES = ["replicas.json", "replicas.yaml", "replicas.yml"];
9598
9626
 
9599
9627
  // ../shared/src/cli-version.ts
9600
- var CLI_VERSION = "0.2.341";
9628
+ var CLI_VERSION = "0.2.343";
9601
9629
 
9602
9630
  // ../shared/src/engine/environment.ts
9603
9631
  var DESKTOP_NOVNC_PORT = 6080;
@@ -13637,6 +13665,20 @@ function parseWorkspaceLifecyclePolicyOption(value) {
13637
13665
  console.log(chalk18.gray(`Valid options: ${VALID_LIFECYCLE_POLICIES.join(", ")}`));
13638
13666
  process.exit(1);
13639
13667
  }
13668
+ function parseExcludedActorsOption(value) {
13669
+ if (value === void 0) return void 0;
13670
+ const actors = value.split(",").map((actor) => actor.trim()).filter(Boolean);
13671
+ return actors.length > 0 ? actors : void 0;
13672
+ }
13673
+ function withExcludedActors(config2, excludedActors) {
13674
+ const next = { ...config2 };
13675
+ if (excludedActors?.length) {
13676
+ next.excluded_actors = excludedActors;
13677
+ } else {
13678
+ delete next.excluded_actors;
13679
+ }
13680
+ return next;
13681
+ }
13640
13682
  function parseAutomationLifecycleOptions(options) {
13641
13683
  if (options.sleepWhenDone && options.lifecycle && options.lifecycle !== "sleep_when_done") {
13642
13684
  console.log(chalk18.red("--sleep-when-done cannot be combined with a different --lifecycle value"));
@@ -13665,13 +13707,19 @@ function formatTrigger(trigger) {
13665
13707
  }
13666
13708
  if (trigger.type === "github") {
13667
13709
  const config2 = trigger.config;
13668
- const repoFilter = config2.repository_ids?.length ? ` (${config2.repository_ids.length} repo${config2.repository_ids.length > 1 ? "s" : ""} filtered)` : "";
13669
- return `github: ${config2.event}${repoFilter}`;
13710
+ const details = [
13711
+ config2.repository_ids?.length ? `${config2.repository_ids.length} repo${config2.repository_ids.length > 1 ? "s" : ""} filtered` : null,
13712
+ config2.excluded_actors?.length ? `exclude: ${config2.excluded_actors.join(", ")}` : null
13713
+ ].filter(Boolean);
13714
+ return `github: ${config2.event}${details.length > 0 ? ` (${details.join(", ")})` : ""}`;
13670
13715
  }
13671
13716
  if (trigger.type === "gitlab") {
13672
13717
  const config2 = trigger.config;
13673
- const repoFilter = config2.repository_ids?.length ? ` (${config2.repository_ids.length} project${config2.repository_ids.length > 1 ? "s" : ""} filtered)` : "";
13674
- return `gitlab: ${config2.event}${repoFilter}`;
13718
+ const details = [
13719
+ config2.repository_ids?.length ? `${config2.repository_ids.length} project${config2.repository_ids.length > 1 ? "s" : ""} filtered` : null,
13720
+ config2.excluded_actors?.length ? `exclude: ${config2.excluded_actors.join(", ")}` : null
13721
+ ].filter(Boolean);
13722
+ return `gitlab: ${config2.event}${details.length > 0 ? ` (${details.join(", ")})` : ""}`;
13675
13723
  }
13676
13724
  return `${trigger.type}`;
13677
13725
  }
@@ -13886,11 +13934,18 @@ async function promptForTriggers(repositories) {
13886
13934
  triggerRepoIds = filterResponse.repos;
13887
13935
  }
13888
13936
  }
13937
+ const excludedActorsResponse = await prompts4({
13938
+ type: "text",
13939
+ name: "excludedActors",
13940
+ message: "Exclude GitHub users (comma-separated, optional):"
13941
+ });
13942
+ const excludedActors = parseExcludedActorsOption(excludedActorsResponse.excludedActors);
13889
13943
  triggers.push({
13890
13944
  type: "github",
13891
13945
  config: {
13892
13946
  event: eventResponse.event,
13893
- ...triggerRepoIds ? { repository_ids: triggerRepoIds } : {}
13947
+ ...triggerRepoIds ? { repository_ids: triggerRepoIds } : {},
13948
+ ...excludedActors ? { excluded_actors: excludedActors } : {}
13894
13949
  }
13895
13950
  });
13896
13951
  } else if (typeResponse.type === "gitlab") {
@@ -13914,11 +13969,18 @@ async function promptForTriggers(repositories) {
13914
13969
  triggerRepoIds = filterResponse.repos;
13915
13970
  }
13916
13971
  }
13972
+ const excludedActorsResponse = await prompts4({
13973
+ type: "text",
13974
+ name: "excludedActors",
13975
+ message: "Exclude GitLab users (comma-separated, optional):"
13976
+ });
13977
+ const excludedActors = parseExcludedActorsOption(excludedActorsResponse.excludedActors);
13917
13978
  triggers.push({
13918
13979
  type: "gitlab",
13919
13980
  config: {
13920
13981
  event: eventResponse.event,
13921
- ...triggerRepoIds ? { repository_ids: triggerRepoIds } : {}
13982
+ ...triggerRepoIds ? { repository_ids: triggerRepoIds } : {},
13983
+ ...excludedActors ? { excluded_actors: excludedActors } : {}
13922
13984
  }
13923
13985
  });
13924
13986
  }
@@ -13946,6 +14008,14 @@ async function automationCreateCommand(name, options) {
13946
14008
  process.exit(1);
13947
14009
  }
13948
14010
  }
14011
+ if (options.triggerGithubExcludeUsers !== void 0 && !options.triggerGithub) {
14012
+ console.log(chalk18.red("--trigger-github-exclude-users requires --trigger-github"));
14013
+ process.exit(1);
14014
+ }
14015
+ if (options.triggerGitlabExcludeUsers !== void 0 && !options.triggerGitlab) {
14016
+ console.log(chalk18.red("--trigger-gitlab-exclude-users requires --trigger-gitlab"));
14017
+ process.exit(1);
14018
+ }
13949
14019
  const agentSelection = applyAgentSelection(
13950
14020
  {
13951
14021
  agent_provider: parseAgentProviderOption(options.agentProvider),
@@ -14024,21 +14094,25 @@ async function automationCreateCommand(name, options) {
14024
14094
  }
14025
14095
  if (options.triggerGithub) {
14026
14096
  const githubRepoIds = resolveTriggerRepositoryIds(repositories, options.triggerGithubRepos, "github");
14097
+ const githubExcludedActors = parseExcludedActorsOption(options.triggerGithubExcludeUsers);
14027
14098
  triggers.push({
14028
14099
  type: "github",
14029
14100
  config: {
14030
14101
  event: options.triggerGithub,
14031
- ...githubRepoIds ? { repository_ids: githubRepoIds } : {}
14102
+ ...githubRepoIds ? { repository_ids: githubRepoIds } : {},
14103
+ ...githubExcludedActors ? { excluded_actors: githubExcludedActors } : {}
14032
14104
  }
14033
14105
  });
14034
14106
  }
14035
14107
  if (options.triggerGitlab) {
14036
14108
  const gitlabRepoIds = resolveTriggerRepositoryIds(repositories, options.triggerGitlabRepos, "gitlab");
14109
+ const gitlabExcludedActors = parseExcludedActorsOption(options.triggerGitlabExcludeUsers);
14037
14110
  triggers.push({
14038
14111
  type: "gitlab",
14039
14112
  config: {
14040
14113
  event: options.triggerGitlab,
14041
- ...gitlabRepoIds ? { repository_ids: gitlabRepoIds } : {}
14114
+ ...gitlabRepoIds ? { repository_ids: gitlabRepoIds } : {},
14115
+ ...gitlabExcludedActors ? { excluded_actors: gitlabExcludedActors } : {}
14042
14116
  }
14043
14117
  });
14044
14118
  }
@@ -14106,6 +14180,15 @@ async function automationEditCommand(id, options) {
14106
14180
  process.exit(1);
14107
14181
  }
14108
14182
  }
14183
+ const replacingTriggers = Boolean(options.triggerCron || options.triggerGithub || options.triggerGitlab);
14184
+ if (replacingTriggers && options.triggerGithubExcludeUsers !== void 0 && !options.triggerGithub) {
14185
+ console.log(chalk18.red("--trigger-github-exclude-users requires --trigger-github when replacing triggers"));
14186
+ process.exit(1);
14187
+ }
14188
+ if (replacingTriggers && options.triggerGitlabExcludeUsers !== void 0 && !options.triggerGitlab) {
14189
+ console.log(chalk18.red("--trigger-gitlab-exclude-users requires --trigger-gitlab when replacing triggers"));
14190
+ process.exit(1);
14191
+ }
14109
14192
  const parsedAgent = {
14110
14193
  agent_provider: parseAgentProviderOption(options.agentProvider),
14111
14194
  model: parseModelOption(options.model),
@@ -14123,7 +14206,7 @@ async function automationEditCommand(id, options) {
14123
14206
  model: existing.automation.model
14124
14207
  });
14125
14208
  const body = {};
14126
- 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.sleepWhenDone || 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;
14209
+ const hasOptions = options.name || options.prompt || options.enabled !== void 0 || options.prFollowups !== void 0 || options.triggerCron || options.triggerGithub || options.triggerGitlab || options.environment || options.triggerGithubExcludeUsers !== void 0 || options.triggerGitlabExcludeUsers !== void 0 || options.lifecycle || options.sleepWhenDone || 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;
14127
14210
  if (!hasOptions) {
14128
14211
  const nameResponse = await prompts4({
14129
14212
  type: "text",
@@ -14201,11 +14284,13 @@ async function automationEditCommand(id, options) {
14201
14284
  options.triggerGithubRepos,
14202
14285
  "github"
14203
14286
  );
14287
+ const githubExcludedActors = parseExcludedActorsOption(options.triggerGithubExcludeUsers);
14204
14288
  triggers.push({
14205
14289
  type: "github",
14206
14290
  config: {
14207
14291
  event: options.triggerGithub,
14208
- ...githubRepoIds ? { repository_ids: githubRepoIds } : {}
14292
+ ...githubRepoIds ? { repository_ids: githubRepoIds } : {},
14293
+ ...githubExcludedActors ? { excluded_actors: githubExcludedActors } : {}
14209
14294
  }
14210
14295
  });
14211
14296
  }
@@ -14216,15 +14301,41 @@ async function automationEditCommand(id, options) {
14216
14301
  options.triggerGitlabRepos,
14217
14302
  "gitlab"
14218
14303
  );
14304
+ const gitlabExcludedActors = parseExcludedActorsOption(options.triggerGitlabExcludeUsers);
14219
14305
  triggers.push({
14220
14306
  type: "gitlab",
14221
14307
  config: {
14222
14308
  event: options.triggerGitlab,
14223
- ...gitlabRepoIds ? { repository_ids: gitlabRepoIds } : {}
14309
+ ...gitlabRepoIds ? { repository_ids: gitlabRepoIds } : {},
14310
+ ...gitlabExcludedActors ? { excluded_actors: gitlabExcludedActors } : {}
14224
14311
  }
14225
14312
  });
14226
14313
  }
14227
14314
  body.triggers = triggers;
14315
+ } else if (options.triggerGithubExcludeUsers !== void 0 || options.triggerGitlabExcludeUsers !== void 0) {
14316
+ const githubExcludedActors = parseExcludedActorsOption(options.triggerGithubExcludeUsers);
14317
+ const gitlabExcludedActors = parseExcludedActorsOption(options.triggerGitlabExcludeUsers);
14318
+ let matchedGithub = options.triggerGithubExcludeUsers === void 0;
14319
+ let matchedGitlab = options.triggerGitlabExcludeUsers === void 0;
14320
+ body.triggers = existing.automation.triggers.map((trigger) => {
14321
+ if (trigger.type === "github" && options.triggerGithubExcludeUsers !== void 0) {
14322
+ matchedGithub = true;
14323
+ return { ...trigger, config: withExcludedActors(trigger.config, githubExcludedActors) };
14324
+ }
14325
+ if (trigger.type === "gitlab" && options.triggerGitlabExcludeUsers !== void 0) {
14326
+ matchedGitlab = true;
14327
+ return { ...trigger, config: withExcludedActors(trigger.config, gitlabExcludedActors) };
14328
+ }
14329
+ return trigger;
14330
+ });
14331
+ if (!matchedGithub) {
14332
+ console.log(chalk18.red("No existing GitHub trigger found. Pass --trigger-github to create one."));
14333
+ process.exit(1);
14334
+ }
14335
+ if (!matchedGitlab) {
14336
+ console.log(chalk18.red("No existing GitLab trigger found. Pass --trigger-gitlab to create one."));
14337
+ process.exit(1);
14338
+ }
14228
14339
  }
14229
14340
  if (options.environment) {
14230
14341
  const envResp = await orgAuthenticatedFetch("/v1/environments");
@@ -20220,7 +20331,7 @@ automation.command("get <id>").description("Get automation details by ID").actio
20220
20331
  process.exit(1);
20221
20332
  }
20222
20333
  });
20223
- 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: archive_when_done, sleep_when_done, delete_after_inactivity, default").option("--sleep-when-done", "Sleep automation workspaces as soon as the agent finishes").option("--auto-stop-minutes <minutes>", "Inactivity timeout in minutes (3-1440, requires --lifecycle default or 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) => {
20334
+ 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-github-exclude-users <users>", "Comma-separated GitHub usernames to exclude from triggering (pass empty string to clear the list)").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("--trigger-gitlab-exclude-users <users>", "Comma-separated GitLab usernames to exclude from triggering (pass empty string to clear the list)").option("--lifecycle <policy>", "Workspace lifecycle: archive_when_done, sleep_when_done, delete_after_inactivity, default").option("--sleep-when-done", "Sleep automation workspaces as soon as the agent finishes").option("--auto-stop-minutes <minutes>", "Inactivity timeout in minutes (3-1440, requires --lifecycle default or 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) => {
20224
20335
  try {
20225
20336
  await automationCreateCommand(name, {
20226
20337
  ...options,
@@ -20235,7 +20346,7 @@ automation.command("create [name]").description("Create a new automation").optio
20235
20346
  process.exit(1);
20236
20347
  }
20237
20348
  });
20238
- 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: archive_when_done, sleep_when_done, delete_after_inactivity, default").option("--sleep-when-done", "Sleep automation workspaces as soon as the agent finishes").option("--auto-stop-minutes <minutes>", "Inactivity timeout in minutes (3-1440, requires --lifecycle default or 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) => {
20349
+ 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-github-exclude-users <users>", "Comma-separated GitHub usernames to exclude from triggering (pass empty string to clear the list)").option("--trigger-gitlab <event>", "Set GitLab event (replaces existing triggers)").option("--trigger-gitlab-repos <repos>", "Comma-separated repo names to filter GitLab trigger").option("--trigger-gitlab-exclude-users <users>", "Comma-separated GitLab usernames to exclude from triggering (pass empty string to clear the list)").option("--environment <environment>", "Environment name or ID").option("--lifecycle <policy>", "Workspace lifecycle: archive_when_done, sleep_when_done, delete_after_inactivity, default").option("--sleep-when-done", "Sleep automation workspaces as soon as the agent finishes").option("--auto-stop-minutes <minutes>", "Inactivity timeout in minutes (3-1440, requires --lifecycle default or 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) => {
20239
20350
  try {
20240
20351
  await automationEditCommand(id, options);
20241
20352
  } catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-cli",
3
- "version": "0.2.341",
3
+ "version": "0.2.343",
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": {