replicas-cli 0.2.335 → 0.2.338

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 +225 -31
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -8681,8 +8681,67 @@ var GOOGLE_ABILITY = {
8681
8681
  referenceFile: { name: "GOOGLE.md", content: REFERENCE5 }
8682
8682
  };
8683
8683
 
8684
+ // ../shared/src/default-skills/replicas-agent/abilities/learnings.ts
8685
+ var SECTION6 = `### Learnings
8686
+ Curated, human-approved organization knowledge that helps you execute correctly \u2014 conventions, gotchas, environment facts, and past user corrections that the codebase alone can't tell you.
8687
+
8688
+ **Reference:** \`references/LEARNINGS.md\`
8689
+
8690
+ Use this when:
8691
+ - You are starting a substantive task and have gathered enough context to write a meaningful query
8692
+ - A user corrects you about a durable fact, preference, or process worth keeping
8693
+ - You find an existing learning contradicted by the current code or docs`;
8694
+ var REFERENCE6 = `# Learnings
8695
+
8696
+ Learnings are curated, human-approved knowledge entries your organization maintains: conventions, gotchas, environment facts, and process rules. Some entries always apply; contextual entries are retrieved by matching your query against their trigger descriptions.
8697
+
8698
+ ## Reading Learnings
8699
+
8700
+ \`\`\`bash
8701
+ replicas learnings read --query "<enriched query>"
8702
+ \`\`\`
8703
+
8704
+ **When to read:** once you've collected enough context to write a meaningful query \u2014 typically after your first look at the relevant code. Don't wait until you're deep into execution; learnings are most valuable before you commit to an approach.
8705
+
8706
+ **Enrich the query.** Use codebase specifics (feature area, module/component names), not the raw user request. Triggers describe *situations*, so a query grounded in what the task actually touches matches far better.
8707
+
8708
+ Example: the user asks "remove the PRs chart projections". After locating the chart you know it lives in the platform admin dashboard, so query:
8709
+
8710
+ \`\`\`bash
8711
+ replicas learnings read --query "Remove the PRs chart in the platform admin dashboard"
8712
+ \`\`\`
8713
+
8714
+ This matches a learning triggered on "UI/UX work on the admin panel" that the raw request would have missed.
8715
+
8716
+ Output is a list of blocks \u2014 id, name, and content. Use the ids to propose updates or deletions.
8717
+
8718
+ ## Proposing changes
8719
+
8720
+ All writes are proposals: a human reviews them in the dashboard, and nothing takes effect until approved.
8721
+
8722
+ \`\`\`bash
8723
+ replicas learnings add --name "<short name>" --content "<the knowledge>" [--trigger "<when to surface it>"] [--always] [--global]
8724
+ replicas learnings update <id> [--name "..."] [--content "..."] [--trigger "..."] [--always true|false]
8725
+ replicas learnings delete <id>
8726
+ \`\`\`
8727
+
8728
+ \`--always\` marks an entry as always-returned (no trigger needed); \`--global\` proposes org-wide scope instead of this workspace's environment.
8729
+
8730
+ **Be very conservative:**
8731
+ - Propose \`add\` only for durable, org-useful facts: explicit user corrections, hard-won environment or process knowledge.
8732
+ - Never store task-specific details, anything derivable by reading the repo, or secrets/credentials.
8733
+ - Propose \`update\` or \`delete\` when a learning is contradicted by the current code or docs \u2014 flag outdated knowledge instead of silently ignoring it.
8734
+ - Write narrow triggers describing when the entry should surface (e.g. "UI/UX work on the admin panel"), not vague topics.`;
8735
+ var LEARNINGS_ABILITY = {
8736
+ label: "Learnings",
8737
+ description: "Fetch curated org knowledge and propose new learnings for human review.",
8738
+ bullet: "- Fetching organization Learnings (curated, human-approved knowledge) before executing, or proposing new ones",
8739
+ section: SECTION6,
8740
+ referenceFile: { name: "LEARNINGS.md", content: REFERENCE6 }
8741
+ };
8742
+
8684
8743
  // ../shared/src/default-skills/replicas-agent/abilities/linear.ts
8685
- var SECTION6 = `### Linear
8744
+ var SECTION7 = `### Linear
8686
8745
  Fetch issues, update state, add comments, and search via the Linear GraphQL API.
8687
8746
 
8688
8747
  **Reference:** \`references/LINEAR.md\`
@@ -8691,7 +8750,7 @@ Use this when:
8691
8750
  - You encounter a Linear issue link and need to understand the task
8692
8751
  - You need to update an issue's state (e.g. mark as done)
8693
8752
  - You need to comment on or search for Linear issues`;
8694
- var REFERENCE6 = `# Linear Integration
8753
+ var REFERENCE7 = `# Linear Integration
8695
8754
 
8696
8755
  This guide covers how to interact with Linear from within your Replicas workspace.
8697
8756
 
@@ -8780,12 +8839,12 @@ var LINEAR_ABILITY = {
8780
8839
  label: "Linear",
8781
8840
  description: "Fetch issues, post comments, update states via the Linear GraphQL API.",
8782
8841
  bullet: "- Interacting with Linear (fetching issues, updating state, commenting, etc.)",
8783
- section: SECTION6,
8784
- referenceFile: { name: "LINEAR.md", content: REFERENCE6 }
8842
+ section: SECTION7,
8843
+ referenceFile: { name: "LINEAR.md", content: REFERENCE7 }
8785
8844
  };
8786
8845
 
8787
8846
  // ../shared/src/default-skills/replicas-agent/abilities/media.ts
8788
- var SECTION7 = `### Media
8847
+ var SECTION8 = `### Media
8789
8848
  Share screenshots, screen recordings, generated diagrams, and audio clips inline in the Replicas chat and natively embedded in external messages.
8790
8849
 
8791
8850
  **Reference:** \`references/MEDIA.md\`
@@ -8794,7 +8853,7 @@ Use this when:
8794
8853
  - You produce a screenshot, recording, generated image, or audio clip the user should see
8795
8854
  - You record video output (browser automation, screen capture) \u2014 including the recommended aspect ratio and FPS
8796
8855
  - You need to embed media in a Slack/Linear/GitHub message AND keep a referenceable copy in the Replicas dashboard`;
8797
- var REFERENCE7 = `# Media (Screenshots, Recordings, Audio)
8856
+ var REFERENCE8 = `# Media (Screenshots, Recordings, Audio)
8798
8857
 
8799
8858
  This guide covers how to share screenshots, screen recordings, generated diagrams, and audio clips \u2014 both inline in the Replicas chat and natively embedded in external surfaces (Slack, Linear, GitHub).
8800
8859
 
@@ -9046,12 +9105,12 @@ var MEDIA_ABILITY = {
9046
9105
  label: "Media",
9047
9106
  description: "Share screenshots, recordings, generated images, and audio clips.",
9048
9107
  bullet: "- Producing or showing the user any media \u2014 screenshots, screen recordings, generated images or diagrams, audio clips \u2014 including in your Replicas chat reply, PR descriptions/comments, and other external platforms",
9049
- section: SECTION7,
9050
- referenceFile: { name: "MEDIA.md", content: REFERENCE7 }
9108
+ section: SECTION8,
9109
+ referenceFile: { name: "MEDIA.md", content: REFERENCE8 }
9051
9110
  };
9052
9111
 
9053
9112
  // ../shared/src/default-skills/replicas-agent/abilities/previews.ts
9054
- var SECTION8 = `### Previews
9113
+ var SECTION9 = `### Previews
9055
9114
  Expose locally running services (web apps, APIs, databases) as public preview URLs so humans can interact with them directly.
9056
9115
 
9057
9116
  **Reference:** \`references/PREVIEWS.md\`
@@ -9060,7 +9119,7 @@ Use this when:
9060
9119
  - You need to start a service that a human should view or interact with
9061
9120
  - The task involves UI work that benefits from human review
9062
9121
  - You are verifying frontend/backend integrations visually`;
9063
- var REFERENCE8 = `# Preview URLs
9122
+ var REFERENCE9 = `# Preview URLs
9064
9123
 
9065
9124
  When you run services on ports \u2014 such as a web app, API server, or database \u2014 humans may want to interact with them directly. You can expose your locally running services as public preview URLs.
9066
9125
 
@@ -9142,12 +9201,12 @@ var PREVIEWS_ABILITY = {
9142
9201
  label: "Previews",
9143
9202
  description: "Expose locally running services on public preview URLs for humans.",
9144
9203
  bullet: "- Creating preview URLs for locally running services",
9145
- section: SECTION8,
9146
- referenceFile: { name: "PREVIEWS.md", content: REFERENCE8 }
9204
+ section: SECTION9,
9205
+ referenceFile: { name: "PREVIEWS.md", content: REFERENCE9 }
9147
9206
  };
9148
9207
 
9149
9208
  // ../shared/src/default-skills/replicas-agent/abilities/replicas.ts
9150
- var SECTION9 = `### Replicas (in-workspace CLI)
9209
+ var SECTION10 = `### Replicas (in-workspace CLI)
9151
9210
  Take action *with* Replicas itself \u2014 manage automations, environments (variables, files), repos, and \`replicas.json\` config \u2014 using the pre-installed, pre-authenticated \`replicas\` CLI.
9152
9211
 
9153
9212
  **Reference:** \`references/REPLICAS.md\`
@@ -9157,7 +9216,7 @@ Use this when:
9157
9216
  - The user asks you to manage environments, environment variables, or environment files
9158
9217
  - The user asks "what envs / repos / automations do I have?"
9159
9218
  - The user asks you to scaffold a \`replicas.json\` / \`replicas.yaml\` in a repo`;
9160
- var REFERENCE9 = `# Replicas (in-workspace CLI)
9219
+ var REFERENCE10 = `# Replicas (in-workspace CLI)
9161
9220
 
9162
9221
  This guide covers how to take action *with* Replicas itself from inside a Replicas workspace \u2014 managing automations, environments (and their variables/files), repos, previews, and the user's \`replicas.json\` config \u2014 using the pre-installed \`replicas\` CLI.
9163
9222
 
@@ -9359,13 +9418,13 @@ var REPLICAS_ABILITY = {
9359
9418
  description: "Teach the agent about Replicas itself \u2014 automations, environments, the in-workspace CLI.",
9360
9419
  // No bullet — help_instructions covers the `replicas` CLI surface in detail.
9361
9420
  bullet: "",
9362
- section: SECTION9,
9363
- referenceFile: { name: "REPLICAS.md", content: REFERENCE9 },
9421
+ section: SECTION10,
9422
+ referenceFile: { name: "REPLICAS.md", content: REFERENCE10 },
9364
9423
  locked: true
9365
9424
  };
9366
9425
 
9367
9426
  // ../shared/src/default-skills/replicas-agent/abilities/slack.ts
9368
- var SECTION10 = `### Slack
9427
+ var SECTION11 = `### Slack
9369
9428
  Send messages, read threads, search conversations, and upload files via the Slack Web API.
9370
9429
 
9371
9430
  **Reference:** \`references/SLACK.md\`
@@ -9375,7 +9434,7 @@ Use this when:
9375
9434
  - You need to read or fetch a Slack conversation
9376
9435
  - You encounter a Slack message link and need to retrieve its content
9377
9436
  - The task asks you to notify, update, or communicate via Slack`;
9378
- var REFERENCE10 = `# Slack Integration
9437
+ var REFERENCE11 = `# Slack Integration
9379
9438
 
9380
9439
  This guide covers how to interact with Slack from within your Replicas workspace.
9381
9440
 
@@ -9476,8 +9535,8 @@ var SLACK_ABILITY = {
9476
9535
  label: "Slack",
9477
9536
  description: "Send messages, read threads, search conversations, upload files.",
9478
9537
  bullet: "- Interacting with Slack (sending messages, reading threads, etc.)",
9479
- section: SECTION10,
9480
- referenceFile: { name: "SLACK.md", content: REFERENCE10 }
9538
+ section: SECTION11,
9539
+ referenceFile: { name: "SLACK.md", content: REFERENCE11 }
9481
9540
  };
9482
9541
 
9483
9542
  // ../shared/src/default-skills/replicas-agent/registry.ts
@@ -9488,6 +9547,7 @@ var REPLICAS_AGENT_ABILITY_REGISTRY = {
9488
9547
  github: GITHUB_ABILITY,
9489
9548
  gitlab: GITLAB_ABILITY,
9490
9549
  google: GOOGLE_ABILITY,
9550
+ learnings: LEARNINGS_ABILITY,
9491
9551
  linear: LINEAR_ABILITY,
9492
9552
  media: MEDIA_ABILITY,
9493
9553
  previews: PREVIEWS_ABILITY,
@@ -9537,7 +9597,7 @@ var HOOK_EXEC_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
9537
9597
  var REPLICAS_CONFIG_FILENAMES = ["replicas.json", "replicas.yaml", "replicas.yml"];
9538
9598
 
9539
9599
  // ../shared/src/cli-version.ts
9540
- var CLI_VERSION = "0.2.335";
9600
+ var CLI_VERSION = "0.2.338";
9541
9601
 
9542
9602
  // ../shared/src/engine/environment.ts
9543
9603
  var DESKTOP_NOVNC_PORT = 6080;
@@ -9663,6 +9723,11 @@ var REPO_FILTER_PARAM = {
9663
9723
  label: "Filter by repository",
9664
9724
  type: "repository_ids"
9665
9725
  };
9726
+ var EXCLUDED_ACTORS_PARAM = {
9727
+ id: "excluded_actors",
9728
+ label: "Exclude users",
9729
+ type: "excluded_actors"
9730
+ };
9666
9731
  var GROUP_PR_EVENTS_PARAM = {
9667
9732
  id: "group_pr_events",
9668
9733
  label: "Group PR events to same workspace",
@@ -9674,10 +9739,10 @@ var GITHUB_TRIGGER = {
9674
9739
  description: "Trigger on repository events",
9675
9740
  icon: "github",
9676
9741
  events: [
9677
- { id: "pull_request.opened", label: "PR opened", parameters: [REPO_FILTER_PARAM, GROUP_PR_EVENTS_PARAM] },
9678
- { id: "pull_request.synchronize", label: "PR updated (new commits)", parameters: [REPO_FILTER_PARAM, GROUP_PR_EVENTS_PARAM] },
9679
- { id: "pull_request.merged", label: "PR merged", parameters: [REPO_FILTER_PARAM] },
9680
- { id: "pull_request.closed", label: "PR closed", parameters: [REPO_FILTER_PARAM] }
9742
+ { id: "pull_request.opened", label: "PR opened", parameters: [REPO_FILTER_PARAM, EXCLUDED_ACTORS_PARAM, GROUP_PR_EVENTS_PARAM] },
9743
+ { id: "pull_request.synchronize", label: "PR updated (new commits)", parameters: [REPO_FILTER_PARAM, EXCLUDED_ACTORS_PARAM, GROUP_PR_EVENTS_PARAM] },
9744
+ { id: "pull_request.merged", label: "PR merged", parameters: [REPO_FILTER_PARAM, EXCLUDED_ACTORS_PARAM] },
9745
+ { id: "pull_request.closed", label: "PR closed", parameters: [REPO_FILTER_PARAM, EXCLUDED_ACTORS_PARAM] }
9681
9746
  ]
9682
9747
  };
9683
9748
 
@@ -9687,6 +9752,11 @@ var REPO_FILTER_PARAM2 = {
9687
9752
  label: "Filter by project",
9688
9753
  type: "repository_ids"
9689
9754
  };
9755
+ var EXCLUDED_ACTORS_PARAM2 = {
9756
+ id: "excluded_actors",
9757
+ label: "Exclude users",
9758
+ type: "excluded_actors"
9759
+ };
9690
9760
  var GROUP_MR_EVENTS_PARAM = {
9691
9761
  id: "group_pr_events",
9692
9762
  label: "Group MR events to same workspace",
@@ -9698,10 +9768,10 @@ var GITLAB_TRIGGER = {
9698
9768
  description: "Trigger on project events",
9699
9769
  icon: "gitlab",
9700
9770
  events: [
9701
- { id: "merge_request.opened", label: "MR opened", parameters: [REPO_FILTER_PARAM2, GROUP_MR_EVENTS_PARAM] },
9702
- { id: "merge_request.updated", label: "MR updated (new commits)", parameters: [REPO_FILTER_PARAM2, GROUP_MR_EVENTS_PARAM] },
9703
- { id: "merge_request.merged", label: "MR merged", parameters: [REPO_FILTER_PARAM2] },
9704
- { id: "merge_request.closed", label: "MR closed", parameters: [REPO_FILTER_PARAM2] }
9771
+ { id: "merge_request.opened", label: "MR opened", parameters: [REPO_FILTER_PARAM2, EXCLUDED_ACTORS_PARAM2, GROUP_MR_EVENTS_PARAM] },
9772
+ { id: "merge_request.updated", label: "MR updated (new commits)", parameters: [REPO_FILTER_PARAM2, EXCLUDED_ACTORS_PARAM2, GROUP_MR_EVENTS_PARAM] },
9773
+ { id: "merge_request.merged", label: "MR merged", parameters: [REPO_FILTER_PARAM2, EXCLUDED_ACTORS_PARAM2] },
9774
+ { id: "merge_request.closed", label: "MR closed", parameters: [REPO_FILTER_PARAM2, EXCLUDED_ACTORS_PARAM2] }
9705
9775
  ]
9706
9776
  };
9707
9777
 
@@ -11004,6 +11074,7 @@ function messageForItem(item) {
11004
11074
  description: item.description,
11005
11075
  prompt: item.prompt,
11006
11076
  subagentType: item.subagentType,
11077
+ ...item.receiverThreadIds ? { receiverThreadIds: item.receiverThreadIds } : {},
11007
11078
  ...item.model ? { model: item.model } : {},
11008
11079
  status: normalizeCodexAspTranscriptStatus(item.status),
11009
11080
  ...item.output ? { output: item.output } : {},
@@ -11082,8 +11153,11 @@ function duplicateMessage(a, b) {
11082
11153
  function mergeCodexAspDisplayMessages(primary, supplemental) {
11083
11154
  const merged = [...primary];
11084
11155
  for (const message of supplemental) {
11085
- if (!merged.some((existing) => duplicateMessage(existing, message))) {
11156
+ const duplicateIndex = merged.findIndex((existing) => duplicateMessage(existing, message));
11157
+ if (duplicateIndex === -1) {
11086
11158
  merged.push(message);
11159
+ } else if (message.type === "user") {
11160
+ merged[duplicateIndex] = { ...merged[duplicateIndex], timestamp: message.timestamp };
11087
11161
  }
11088
11162
  }
11089
11163
  return merged.map((message, index) => ({ message, index })).sort((a, b) => parseTimestampMs(a.message.timestamp) - parseTimestampMs(b.message.timestamp) || a.index - b.index).map(({ message }) => message);
@@ -14489,6 +14563,76 @@ async function mediaListCommand(options) {
14489
14563
  }
14490
14564
  }
14491
14565
 
14566
+ // src/commands/learnings.ts
14567
+ function printBlocks(learnings) {
14568
+ for (const learning of learnings) {
14569
+ const labels = [
14570
+ learning.scope === "global" ? "org-wide" : "environment",
14571
+ ...learning.always_apply ? ["always applies"] : []
14572
+ ];
14573
+ console.log(`## ${learning.name} (id: ${learning.id}, ${labels.join(", ")})`);
14574
+ console.log(learning.content);
14575
+ console.log("");
14576
+ }
14577
+ }
14578
+ async function learningsReadCommand(options) {
14579
+ const query = options.query?.trim();
14580
+ if (!query) {
14581
+ throw new Error("--query is required. Enrich it with codebase specifics (feature area, module names).");
14582
+ }
14583
+ const response = await agentFetch("/v1/agent/learnings/read", {
14584
+ method: "POST",
14585
+ body: { query }
14586
+ });
14587
+ if (response.learnings.length === 0) {
14588
+ console.log("No learnings matched this query.");
14589
+ } else {
14590
+ printBlocks(response.learnings);
14591
+ }
14592
+ if (response.matching_degraded) {
14593
+ console.log("Note: trigger matching was unavailable \u2014 only always-apply learnings are shown.");
14594
+ }
14595
+ }
14596
+ async function propose(request) {
14597
+ const { proposal } = await agentFetch("/v1/agent/learnings/proposals", {
14598
+ method: "POST",
14599
+ body: request
14600
+ });
14601
+ console.log(
14602
+ `Proposal submitted for human review (${proposal.action}, id: ${proposal.id}). It only takes effect once approved in the dashboard.`
14603
+ );
14604
+ }
14605
+ async function learningsAddCommand(options) {
14606
+ await propose({
14607
+ action: "add",
14608
+ name: options.name,
14609
+ content: options.content,
14610
+ trigger: options.trigger,
14611
+ always_apply: options.always || void 0,
14612
+ global: options.global || void 0
14613
+ });
14614
+ }
14615
+ function parseAlways(value) {
14616
+ if (value === void 0) return void 0;
14617
+ if (value !== "true" && value !== "false") {
14618
+ throw new Error("--always must be 'true' or 'false'");
14619
+ }
14620
+ return value === "true";
14621
+ }
14622
+ async function learningsUpdateCommand(id, options) {
14623
+ await propose({
14624
+ action: "update",
14625
+ target_learning_id: id,
14626
+ name: options.name,
14627
+ content: options.content,
14628
+ trigger: options.trigger,
14629
+ always_apply: parseAlways(options.always)
14630
+ });
14631
+ }
14632
+ async function learningsDeleteCommand(id) {
14633
+ await propose({ action: "delete", target_learning_id: id });
14634
+ }
14635
+
14492
14636
  // src/commands/computer/index.ts
14493
14637
  import { spawn as spawn4, spawnSync as spawnSync3 } from "child_process";
14494
14638
  import { createHash as createHash2 } from "crypto";
@@ -20429,6 +20573,55 @@ if (isAgentMode()) {
20429
20573
  if (error instanceof Error) {
20430
20574
  console.error(chalk23.red(`
20431
20575
  \u2717 ${error.message}
20576
+ `));
20577
+ }
20578
+ process.exit(1);
20579
+ }
20580
+ });
20581
+ const learnings = program.command("learnings").description("Fetch curated org knowledge and propose changes for human review");
20582
+ learnings.command("read").description("Fetch learnings relevant to a task. Enrich the query with codebase specifics, not the raw user request.").requiredOption("-q, --query <query>", "Enriched task description to match against learning triggers").action(async (options) => {
20583
+ try {
20584
+ await learningsReadCommand(options);
20585
+ } catch (error) {
20586
+ if (error instanceof Error) {
20587
+ console.error(chalk23.red(`
20588
+ \u2717 ${error.message}
20589
+ `));
20590
+ }
20591
+ process.exit(1);
20592
+ }
20593
+ });
20594
+ learnings.command("add").description("Propose a new learning (pending human review)").requiredOption("-n, --name <name>", "Short name for the learning").requiredOption("-c, --content <content>", "The knowledge itself").option("-t, --trigger <trigger>", "When this learning should surface (required unless --always)").option("-a, --always", "Always apply instead of trigger-matching").option("-g, --global", "Propose org-wide scope instead of this workspace environment").action(async (options) => {
20595
+ try {
20596
+ await learningsAddCommand(options);
20597
+ } catch (error) {
20598
+ if (error instanceof Error) {
20599
+ console.error(chalk23.red(`
20600
+ \u2717 ${error.message}
20601
+ `));
20602
+ }
20603
+ process.exit(1);
20604
+ }
20605
+ });
20606
+ learnings.command("update <id>").description("Propose changes to an existing learning (pending human review)").option("-n, --name <name>", "New name").option("-c, --content <content>", "New content").option("-t, --trigger <trigger>", "New trigger").option("-a, --always <bool>", "Set always-apply: 'true' or 'false'").action(async (id, options) => {
20607
+ try {
20608
+ await learningsUpdateCommand(id, options);
20609
+ } catch (error) {
20610
+ if (error instanceof Error) {
20611
+ console.error(chalk23.red(`
20612
+ \u2717 ${error.message}
20613
+ `));
20614
+ }
20615
+ process.exit(1);
20616
+ }
20617
+ });
20618
+ learnings.command("delete <id>").description("Propose deleting an outdated learning (pending human review)").action(async (id) => {
20619
+ try {
20620
+ await learningsDeleteCommand(id);
20621
+ } catch (error) {
20622
+ if (error instanceof Error) {
20623
+ console.error(chalk23.red(`
20624
+ \u2717 ${error.message}
20432
20625
  `));
20433
20626
  }
20434
20627
  process.exit(1);
@@ -20474,7 +20667,8 @@ if (isAgentMode()) {
20474
20667
  "computer",
20475
20668
  "automation",
20476
20669
  "repos",
20477
- "environment"
20670
+ "environment",
20671
+ "learnings"
20478
20672
  ]);
20479
20673
  const kept = program.commands.filter((cmd) => allowed.has(cmd.name()));
20480
20674
  const cmds = program.commands;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-cli",
3
- "version": "0.2.335",
3
+ "version": "0.2.338",
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": {