replicas-cli 0.2.342 → 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 +125 -16
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -9270,6 +9270,7 @@ In agent mode the CLI hides commands that don't make sense for in-workspace agen
9270
9270
  | "Make an automation that runs every weekday at 9am" | \`replicas automation create\` (interactive) or \`--trigger-cron "0 9 * * 1-5"\` |
9271
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\` |
9272
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]'\` |
9273
9274
  | "What repos are connected?" | \`replicas repos\` |
9274
9275
  | "Set up a \`replicas.json\` in this repo" | \`replicas init\` (\`-y\` for YAML) |
9275
9276
 
@@ -9356,13 +9357,15 @@ replicas automation create "Review my PRs" \\
9356
9357
  --prompt "Leave a code review on this PR" \\
9357
9358
  --environment <env-name-or-id> \\
9358
9359
  --trigger-github pull_request.opened \\
9359
- --trigger-github-repos acme/web,acme/api
9360
+ --trigger-github-repos acme/web,acme/api \\
9361
+ --trigger-github-exclude-users 'dependabot[bot],renovate[bot]'
9360
9362
 
9361
9363
  replicas automation create "Review my MRs" \\
9362
9364
  --prompt "Leave a code review on this MR" \\
9363
9365
  --environment <env-name-or-id> \\
9364
9366
  --trigger-gitlab merge_request.opened \\
9365
- --trigger-gitlab-repos acme/web,acme/api
9367
+ --trigger-gitlab-repos acme/web,acme/api \\
9368
+ --trigger-gitlab-exclude-users 'bot-user'
9366
9369
 
9367
9370
  # Disable on creation
9368
9371
  replicas automation create ... --disabled
@@ -9386,6 +9389,8 @@ replicas automation edit <id> \\
9386
9389
  --trigger-cron "0 4 * * *" # replaces existing triggers
9387
9390
  \`\`\`
9388
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
+
9389
9394
  \`replicas automation edit <id>\` with no flags drops into interactive mode.
9390
9395
 
9391
9396
  ## Repositories
@@ -9560,6 +9565,27 @@ var REPLICAS_AGENT_ABILITIES = Object.keys(
9560
9565
  );
9561
9566
 
9562
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
+ };
9563
9589
  var DEFAULT_REPLICAS_AGENT_ABILITIES = Object.fromEntries(
9564
9590
  REPLICAS_AGENT_ABILITIES.map((key) => [key, true])
9565
9591
  );
@@ -9599,7 +9625,7 @@ var HOOK_EXEC_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
9599
9625
  var REPLICAS_CONFIG_FILENAMES = ["replicas.json", "replicas.yaml", "replicas.yml"];
9600
9626
 
9601
9627
  // ../shared/src/cli-version.ts
9602
- var CLI_VERSION = "0.2.342";
9628
+ var CLI_VERSION = "0.2.343";
9603
9629
 
9604
9630
  // ../shared/src/engine/environment.ts
9605
9631
  var DESKTOP_NOVNC_PORT = 6080;
@@ -13639,6 +13665,20 @@ function parseWorkspaceLifecyclePolicyOption(value) {
13639
13665
  console.log(chalk18.gray(`Valid options: ${VALID_LIFECYCLE_POLICIES.join(", ")}`));
13640
13666
  process.exit(1);
13641
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
+ }
13642
13682
  function parseAutomationLifecycleOptions(options) {
13643
13683
  if (options.sleepWhenDone && options.lifecycle && options.lifecycle !== "sleep_when_done") {
13644
13684
  console.log(chalk18.red("--sleep-when-done cannot be combined with a different --lifecycle value"));
@@ -13667,13 +13707,19 @@ function formatTrigger(trigger) {
13667
13707
  }
13668
13708
  if (trigger.type === "github") {
13669
13709
  const config2 = trigger.config;
13670
- const repoFilter = config2.repository_ids?.length ? ` (${config2.repository_ids.length} repo${config2.repository_ids.length > 1 ? "s" : ""} filtered)` : "";
13671
- 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(", ")})` : ""}`;
13672
13715
  }
13673
13716
  if (trigger.type === "gitlab") {
13674
13717
  const config2 = trigger.config;
13675
- const repoFilter = config2.repository_ids?.length ? ` (${config2.repository_ids.length} project${config2.repository_ids.length > 1 ? "s" : ""} filtered)` : "";
13676
- 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(", ")})` : ""}`;
13677
13723
  }
13678
13724
  return `${trigger.type}`;
13679
13725
  }
@@ -13888,11 +13934,18 @@ async function promptForTriggers(repositories) {
13888
13934
  triggerRepoIds = filterResponse.repos;
13889
13935
  }
13890
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);
13891
13943
  triggers.push({
13892
13944
  type: "github",
13893
13945
  config: {
13894
13946
  event: eventResponse.event,
13895
- ...triggerRepoIds ? { repository_ids: triggerRepoIds } : {}
13947
+ ...triggerRepoIds ? { repository_ids: triggerRepoIds } : {},
13948
+ ...excludedActors ? { excluded_actors: excludedActors } : {}
13896
13949
  }
13897
13950
  });
13898
13951
  } else if (typeResponse.type === "gitlab") {
@@ -13916,11 +13969,18 @@ async function promptForTriggers(repositories) {
13916
13969
  triggerRepoIds = filterResponse.repos;
13917
13970
  }
13918
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);
13919
13978
  triggers.push({
13920
13979
  type: "gitlab",
13921
13980
  config: {
13922
13981
  event: eventResponse.event,
13923
- ...triggerRepoIds ? { repository_ids: triggerRepoIds } : {}
13982
+ ...triggerRepoIds ? { repository_ids: triggerRepoIds } : {},
13983
+ ...excludedActors ? { excluded_actors: excludedActors } : {}
13924
13984
  }
13925
13985
  });
13926
13986
  }
@@ -13948,6 +14008,14 @@ async function automationCreateCommand(name, options) {
13948
14008
  process.exit(1);
13949
14009
  }
13950
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
+ }
13951
14019
  const agentSelection = applyAgentSelection(
13952
14020
  {
13953
14021
  agent_provider: parseAgentProviderOption(options.agentProvider),
@@ -14026,21 +14094,25 @@ async function automationCreateCommand(name, options) {
14026
14094
  }
14027
14095
  if (options.triggerGithub) {
14028
14096
  const githubRepoIds = resolveTriggerRepositoryIds(repositories, options.triggerGithubRepos, "github");
14097
+ const githubExcludedActors = parseExcludedActorsOption(options.triggerGithubExcludeUsers);
14029
14098
  triggers.push({
14030
14099
  type: "github",
14031
14100
  config: {
14032
14101
  event: options.triggerGithub,
14033
- ...githubRepoIds ? { repository_ids: githubRepoIds } : {}
14102
+ ...githubRepoIds ? { repository_ids: githubRepoIds } : {},
14103
+ ...githubExcludedActors ? { excluded_actors: githubExcludedActors } : {}
14034
14104
  }
14035
14105
  });
14036
14106
  }
14037
14107
  if (options.triggerGitlab) {
14038
14108
  const gitlabRepoIds = resolveTriggerRepositoryIds(repositories, options.triggerGitlabRepos, "gitlab");
14109
+ const gitlabExcludedActors = parseExcludedActorsOption(options.triggerGitlabExcludeUsers);
14039
14110
  triggers.push({
14040
14111
  type: "gitlab",
14041
14112
  config: {
14042
14113
  event: options.triggerGitlab,
14043
- ...gitlabRepoIds ? { repository_ids: gitlabRepoIds } : {}
14114
+ ...gitlabRepoIds ? { repository_ids: gitlabRepoIds } : {},
14115
+ ...gitlabExcludedActors ? { excluded_actors: gitlabExcludedActors } : {}
14044
14116
  }
14045
14117
  });
14046
14118
  }
@@ -14108,6 +14180,15 @@ async function automationEditCommand(id, options) {
14108
14180
  process.exit(1);
14109
14181
  }
14110
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
+ }
14111
14192
  const parsedAgent = {
14112
14193
  agent_provider: parseAgentProviderOption(options.agentProvider),
14113
14194
  model: parseModelOption(options.model),
@@ -14125,7 +14206,7 @@ async function automationEditCommand(id, options) {
14125
14206
  model: existing.automation.model
14126
14207
  });
14127
14208
  const body = {};
14128
- 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;
14129
14210
  if (!hasOptions) {
14130
14211
  const nameResponse = await prompts4({
14131
14212
  type: "text",
@@ -14203,11 +14284,13 @@ async function automationEditCommand(id, options) {
14203
14284
  options.triggerGithubRepos,
14204
14285
  "github"
14205
14286
  );
14287
+ const githubExcludedActors = parseExcludedActorsOption(options.triggerGithubExcludeUsers);
14206
14288
  triggers.push({
14207
14289
  type: "github",
14208
14290
  config: {
14209
14291
  event: options.triggerGithub,
14210
- ...githubRepoIds ? { repository_ids: githubRepoIds } : {}
14292
+ ...githubRepoIds ? { repository_ids: githubRepoIds } : {},
14293
+ ...githubExcludedActors ? { excluded_actors: githubExcludedActors } : {}
14211
14294
  }
14212
14295
  });
14213
14296
  }
@@ -14218,15 +14301,41 @@ async function automationEditCommand(id, options) {
14218
14301
  options.triggerGitlabRepos,
14219
14302
  "gitlab"
14220
14303
  );
14304
+ const gitlabExcludedActors = parseExcludedActorsOption(options.triggerGitlabExcludeUsers);
14221
14305
  triggers.push({
14222
14306
  type: "gitlab",
14223
14307
  config: {
14224
14308
  event: options.triggerGitlab,
14225
- ...gitlabRepoIds ? { repository_ids: gitlabRepoIds } : {}
14309
+ ...gitlabRepoIds ? { repository_ids: gitlabRepoIds } : {},
14310
+ ...gitlabExcludedActors ? { excluded_actors: gitlabExcludedActors } : {}
14226
14311
  }
14227
14312
  });
14228
14313
  }
14229
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
+ }
14230
14339
  }
14231
14340
  if (options.environment) {
14232
14341
  const envResp = await orgAuthenticatedFetch("/v1/environments");
@@ -20222,7 +20331,7 @@ automation.command("get <id>").description("Get automation details by ID").actio
20222
20331
  process.exit(1);
20223
20332
  }
20224
20333
  });
20225
- 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) => {
20226
20335
  try {
20227
20336
  await automationCreateCommand(name, {
20228
20337
  ...options,
@@ -20237,7 +20346,7 @@ automation.command("create [name]").description("Create a new automation").optio
20237
20346
  process.exit(1);
20238
20347
  }
20239
20348
  });
20240
- 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) => {
20241
20350
  try {
20242
20351
  await automationEditCommand(id, options);
20243
20352
  } catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-cli",
3
- "version": "0.2.342",
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": {