replicas-cli 0.2.335 → 0.2.337
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +207 -23
- 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
|
|
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
|
|
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:
|
|
8784
|
-
referenceFile: { name: "LINEAR.md", content:
|
|
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
|
|
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
|
|
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:
|
|
9050
|
-
referenceFile: { name: "MEDIA.md", content:
|
|
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
|
|
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
|
|
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:
|
|
9146
|
-
referenceFile: { name: "PREVIEWS.md", content:
|
|
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
|
|
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
|
|
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:
|
|
9363
|
-
referenceFile: { name: "REPLICAS.md", content:
|
|
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
|
|
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
|
|
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:
|
|
9480
|
-
referenceFile: { name: "SLACK.md", content:
|
|
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.
|
|
9600
|
+
var CLI_VERSION = "0.2.337";
|
|
9541
9601
|
|
|
9542
9602
|
// ../shared/src/engine/environment.ts
|
|
9543
9603
|
var DESKTOP_NOVNC_PORT = 6080;
|
|
@@ -11004,6 +11064,7 @@ function messageForItem(item) {
|
|
|
11004
11064
|
description: item.description,
|
|
11005
11065
|
prompt: item.prompt,
|
|
11006
11066
|
subagentType: item.subagentType,
|
|
11067
|
+
...item.receiverThreadIds ? { receiverThreadIds: item.receiverThreadIds } : {},
|
|
11007
11068
|
...item.model ? { model: item.model } : {},
|
|
11008
11069
|
status: normalizeCodexAspTranscriptStatus(item.status),
|
|
11009
11070
|
...item.output ? { output: item.output } : {},
|
|
@@ -11082,8 +11143,11 @@ function duplicateMessage(a, b) {
|
|
|
11082
11143
|
function mergeCodexAspDisplayMessages(primary, supplemental) {
|
|
11083
11144
|
const merged = [...primary];
|
|
11084
11145
|
for (const message of supplemental) {
|
|
11085
|
-
|
|
11146
|
+
const duplicateIndex = merged.findIndex((existing) => duplicateMessage(existing, message));
|
|
11147
|
+
if (duplicateIndex === -1) {
|
|
11086
11148
|
merged.push(message);
|
|
11149
|
+
} else if (message.type === "user") {
|
|
11150
|
+
merged[duplicateIndex] = { ...merged[duplicateIndex], timestamp: message.timestamp };
|
|
11087
11151
|
}
|
|
11088
11152
|
}
|
|
11089
11153
|
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 +14553,76 @@ async function mediaListCommand(options) {
|
|
|
14489
14553
|
}
|
|
14490
14554
|
}
|
|
14491
14555
|
|
|
14556
|
+
// src/commands/learnings.ts
|
|
14557
|
+
function printBlocks(learnings) {
|
|
14558
|
+
for (const learning of learnings) {
|
|
14559
|
+
const labels = [
|
|
14560
|
+
learning.scope === "global" ? "org-wide" : "environment",
|
|
14561
|
+
...learning.always_apply ? ["always applies"] : []
|
|
14562
|
+
];
|
|
14563
|
+
console.log(`## ${learning.name} (id: ${learning.id}, ${labels.join(", ")})`);
|
|
14564
|
+
console.log(learning.content);
|
|
14565
|
+
console.log("");
|
|
14566
|
+
}
|
|
14567
|
+
}
|
|
14568
|
+
async function learningsReadCommand(options) {
|
|
14569
|
+
const query = options.query?.trim();
|
|
14570
|
+
if (!query) {
|
|
14571
|
+
throw new Error("--query is required. Enrich it with codebase specifics (feature area, module names).");
|
|
14572
|
+
}
|
|
14573
|
+
const response = await agentFetch("/v1/agent/learnings/read", {
|
|
14574
|
+
method: "POST",
|
|
14575
|
+
body: { query }
|
|
14576
|
+
});
|
|
14577
|
+
if (response.learnings.length === 0) {
|
|
14578
|
+
console.log("No learnings matched this query.");
|
|
14579
|
+
} else {
|
|
14580
|
+
printBlocks(response.learnings);
|
|
14581
|
+
}
|
|
14582
|
+
if (response.matching_degraded) {
|
|
14583
|
+
console.log("Note: trigger matching was unavailable \u2014 only always-apply learnings are shown.");
|
|
14584
|
+
}
|
|
14585
|
+
}
|
|
14586
|
+
async function propose(request) {
|
|
14587
|
+
const { proposal } = await agentFetch("/v1/agent/learnings/proposals", {
|
|
14588
|
+
method: "POST",
|
|
14589
|
+
body: request
|
|
14590
|
+
});
|
|
14591
|
+
console.log(
|
|
14592
|
+
`Proposal submitted for human review (${proposal.action}, id: ${proposal.id}). It only takes effect once approved in the dashboard.`
|
|
14593
|
+
);
|
|
14594
|
+
}
|
|
14595
|
+
async function learningsAddCommand(options) {
|
|
14596
|
+
await propose({
|
|
14597
|
+
action: "add",
|
|
14598
|
+
name: options.name,
|
|
14599
|
+
content: options.content,
|
|
14600
|
+
trigger: options.trigger,
|
|
14601
|
+
always_apply: options.always || void 0,
|
|
14602
|
+
global: options.global || void 0
|
|
14603
|
+
});
|
|
14604
|
+
}
|
|
14605
|
+
function parseAlways(value) {
|
|
14606
|
+
if (value === void 0) return void 0;
|
|
14607
|
+
if (value !== "true" && value !== "false") {
|
|
14608
|
+
throw new Error("--always must be 'true' or 'false'");
|
|
14609
|
+
}
|
|
14610
|
+
return value === "true";
|
|
14611
|
+
}
|
|
14612
|
+
async function learningsUpdateCommand(id, options) {
|
|
14613
|
+
await propose({
|
|
14614
|
+
action: "update",
|
|
14615
|
+
target_learning_id: id,
|
|
14616
|
+
name: options.name,
|
|
14617
|
+
content: options.content,
|
|
14618
|
+
trigger: options.trigger,
|
|
14619
|
+
always_apply: parseAlways(options.always)
|
|
14620
|
+
});
|
|
14621
|
+
}
|
|
14622
|
+
async function learningsDeleteCommand(id) {
|
|
14623
|
+
await propose({ action: "delete", target_learning_id: id });
|
|
14624
|
+
}
|
|
14625
|
+
|
|
14492
14626
|
// src/commands/computer/index.ts
|
|
14493
14627
|
import { spawn as spawn4, spawnSync as spawnSync3 } from "child_process";
|
|
14494
14628
|
import { createHash as createHash2 } from "crypto";
|
|
@@ -20429,6 +20563,55 @@ if (isAgentMode()) {
|
|
|
20429
20563
|
if (error instanceof Error) {
|
|
20430
20564
|
console.error(chalk23.red(`
|
|
20431
20565
|
\u2717 ${error.message}
|
|
20566
|
+
`));
|
|
20567
|
+
}
|
|
20568
|
+
process.exit(1);
|
|
20569
|
+
}
|
|
20570
|
+
});
|
|
20571
|
+
const learnings = program.command("learnings").description("Fetch curated org knowledge and propose changes for human review");
|
|
20572
|
+
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) => {
|
|
20573
|
+
try {
|
|
20574
|
+
await learningsReadCommand(options);
|
|
20575
|
+
} catch (error) {
|
|
20576
|
+
if (error instanceof Error) {
|
|
20577
|
+
console.error(chalk23.red(`
|
|
20578
|
+
\u2717 ${error.message}
|
|
20579
|
+
`));
|
|
20580
|
+
}
|
|
20581
|
+
process.exit(1);
|
|
20582
|
+
}
|
|
20583
|
+
});
|
|
20584
|
+
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) => {
|
|
20585
|
+
try {
|
|
20586
|
+
await learningsAddCommand(options);
|
|
20587
|
+
} catch (error) {
|
|
20588
|
+
if (error instanceof Error) {
|
|
20589
|
+
console.error(chalk23.red(`
|
|
20590
|
+
\u2717 ${error.message}
|
|
20591
|
+
`));
|
|
20592
|
+
}
|
|
20593
|
+
process.exit(1);
|
|
20594
|
+
}
|
|
20595
|
+
});
|
|
20596
|
+
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) => {
|
|
20597
|
+
try {
|
|
20598
|
+
await learningsUpdateCommand(id, options);
|
|
20599
|
+
} catch (error) {
|
|
20600
|
+
if (error instanceof Error) {
|
|
20601
|
+
console.error(chalk23.red(`
|
|
20602
|
+
\u2717 ${error.message}
|
|
20603
|
+
`));
|
|
20604
|
+
}
|
|
20605
|
+
process.exit(1);
|
|
20606
|
+
}
|
|
20607
|
+
});
|
|
20608
|
+
learnings.command("delete <id>").description("Propose deleting an outdated learning (pending human review)").action(async (id) => {
|
|
20609
|
+
try {
|
|
20610
|
+
await learningsDeleteCommand(id);
|
|
20611
|
+
} catch (error) {
|
|
20612
|
+
if (error instanceof Error) {
|
|
20613
|
+
console.error(chalk23.red(`
|
|
20614
|
+
\u2717 ${error.message}
|
|
20432
20615
|
`));
|
|
20433
20616
|
}
|
|
20434
20617
|
process.exit(1);
|
|
@@ -20474,7 +20657,8 @@ if (isAgentMode()) {
|
|
|
20474
20657
|
"computer",
|
|
20475
20658
|
"automation",
|
|
20476
20659
|
"repos",
|
|
20477
|
-
"environment"
|
|
20660
|
+
"environment",
|
|
20661
|
+
"learnings"
|
|
20478
20662
|
]);
|
|
20479
20663
|
const kept = program.commands.filter((cmd) => allowed.has(cmd.name()));
|
|
20480
20664
|
const cmds = program.commands;
|