diff --git a/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js b/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js
index e24eabf630..dfe799aedf 100644
--- a/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js
+++ b/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js
@@ -122,7 +122,7 @@ describe('Scout onboarding knowledge', () => {
// Linux run 38982219348: a Claude Code listener cannot run on Linux, WSL or
// Windows (#2288 refuses it), so a connect card for it there is a dead end.
test('offers a connect card for Claude Code on a Mac only, and says what works elsewhere', () => {
- expect(prompt).toMatch(/Claude Code on a Mac; Codex on Mac or Linux \(WSL included\)/);
+ expect(prompt).toMatch(/Claude Code on a Mac; Codex on a Mac \(Linux and WSL not yet tested\)/);
expect(prompt).toMatch(/DeepSeek Harness \(dsh\) through its attach guide, walked on macOS with other OSs unverified/);
expect(prompt).not.toMatch(/On Linux \(WSL included\), Codex only/);
expect(prompt).toMatch(/For Claude Code on Linux, WSL or Windows, do not propose a connect card/);
@@ -153,9 +153,9 @@ describe('Scout onboarding knowledge', () => {
// Rhea on #2765: the prompt is the only guard before the card, so the pairs
// it may go out for are listed, not inferred.
- test('proposes the card only for Claude Code on macOS and Codex on macOS, Linux or WSL', () => {
- expect(prompt).toMatch(/The card may go out for exactly these pairs: Claude Code on macOS; Codex on macOS, Linux or WSL\./);
- expect(prompt).toMatch(/Any other OS, such as native Windows, ChromeOS, iPad or iPhone, Android or FreeBSD, gets a text answer and no card/);
+ test('proposes the card only for Claude Code on macOS and Codex on macOS', () => {
+ expect(prompt).toMatch(/The card may go out for exactly these pairs: Claude Code on macOS; Codex on macOS\./);
+ expect(prompt).toMatch(/Any other OS, such as Linux, WSL, native Windows, ChromeOS, iPad or iPhone, Android or FreeBSD, gets a text answer and no card/);
['ChromeOS', 'iPad', 'Android'].forEach((os) => expect(prompt).toContain(os));
});
@@ -179,10 +179,10 @@ describe('Scout onboarding knowledge', () => {
// CodeRabbit on #2765: the no-card rule must not deny tools that do connect.
expect(prompt).not.toMatch(/For any other tool, or an OS where it does not run yet, never propose the card; answer in text and say plainly that it does not run there yet/);
expect(prompt).toMatch(/For Claude Code on Linux, WSL or Windows, do not propose a connect card: offer "Run it here" with commonly_offer_hosted_agent, and also say they can use the pod from their own Claude Code sessions with the MCP command on the connect page \(on Windows the page gives it as two PowerShell lines\)/);
- expect(prompt).toMatch(/For Codex on native Windows, do not propose a connect card either: offer "Run it here", or running Codex on a Mac or Linux machine/);
+ expect(prompt).toMatch(/For Codex on native Windows, do not propose a connect card either: offer "Run it here", or running Codex on a Mac\. Say plainly why/);
const en = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../../../../frontend/src/i18n/locales/en.json'), 'utf8'));
expect(en.agentByo.listen.unavailableClaude).toMatch(/Connect Claude Code from your own sessions with the command below, or choose “Run it here”/);
- expect(en.agentByo.listen.unavailableCodex).toMatch(/Choose “Run it here” for a hosted agent, or run the command on a Mac or Linux machine/);
+ expect(en.agentByo.listen.unavailableCodex).toMatch(/Choose “Run it here” for a hosted agent, or run the command on a Mac\. Linux is not tested yet\./);
});
// Stranger journey 2026-10-26: Scout wrote the Terminal steps and asked
diff --git a/backend/config/native-agents/scout.ts b/backend/config/native-agents/scout.ts
index f51de2182a..1292009453 100644
--- a/backend/config/native-agents/scout.ts
+++ b/backend/config/native-agents/scout.ts
@@ -144,7 +144,7 @@ export const scoutApp = {
// agent to its own folder cannot start Claude Code on Linux or WSL, and
// the CLI refuses to try (#2288). Codex does not run in it.
+ '- Where their own agent can be connected as a teammate that answers '
- + '@mentions: Claude Code on a Mac; Codex on Mac or Linux (WSL included); '
+ + '@mentions: Claude Code on a Mac; Codex on a Mac (Linux and WSL not yet tested); '
+ 'DeepSeek Harness (dsh) through its attach guide, walked on macOS with '
+ 'other OSs unverified. On native Windows, Claude Code and Codex are not '
+ 'supported; Codex inside WSL counts as Linux. For '
@@ -153,7 +153,7 @@ export const scoutApp = {
+ 'from their own Claude Code sessions with the MCP command on the connect '
+ 'page (on Windows the page gives it as two PowerShell lines). For Codex on '
+ 'native Windows, do not propose a connect card either: offer "Run it here", '
- + 'or running Codex on a Mac or Linux machine. Say plainly why: it does not '
+ + 'or running Codex on a Mac. Say plainly why: it does not '
+ 'run there yet.\n'
// A new person asked (2026-10-17) for Claude, GPT and Gemini in one group
// chat and was told there was no way to bring GPT in. Codex runs GPT.
@@ -201,7 +201,7 @@ export const scoutApp = {
// and adapter only).
+ '- You can SET UP their own agent for them, and the connect card is the '
+ 'answer whenever it can work. The card may go out for exactly these pairs: '
- + 'Claude Code on macOS; Codex on macOS, Linux or WSL. Any other OS, such as '
+ + 'Claude Code on macOS; Codex on macOS. Any other OS, such as Linux, WSL, '
+ 'native Windows, ChromeOS, iPad or iPhone, Android or FreeBSD, gets a text '
+ 'answer and no card. The tool must be the command-line one they run in a '
+ 'terminal: the Claude app (desktop or phone) and claude.ai are not Claude '
diff --git a/docs-site/agents/on-my-computer.mdx b/docs-site/agents/on-my-computer.mdx
index 2f5be28239..859bc57cc0 100644
--- a/docs-site/agents/on-my-computer.mdx
+++ b/docs-site/agents/on-my-computer.mdx
@@ -26,7 +26,7 @@ not show an agent runtime key for this path.
Choose **On my computer**, select the computer and a pod, and name the agent.
Leave the adapter on **Auto-detect on that computer**, or choose one explicitly.
Auto-detect tries Claude Code, then Codex. Claude Code is supported on Mac;
-Codex runs on Mac and Linux, including WSL. Select **Add to this computer**.
+Codex runs on a Mac; Linux is not tested yet. Select **Add to this computer**.
The daemon picks up the request, starts the agent, and the page
waits for it to report that it is running. Then open the pod and mention the
agent.
diff --git a/docs-site/bring-your-own/codex.mdx b/docs-site/bring-your-own/codex.mdx
index a50eca669f..aa98fba31a 100644
--- a/docs-site/bring-your-own/codex.mdx
+++ b/docs-site/bring-your-own/codex.mdx
@@ -4,12 +4,12 @@ sidebarTitle: Codex
description: Run a Codex listener on your Mac that answers @mentions in a Commonly pod. Needs Node.js 20 or later and the Codex CLI signed in.
---
-The Codex listener runs on your Mac.
+The Codex listener runs on macOS; Linux not yet tested.
You need Node.js 20 or later and the Codex CLI signed in on that computer.
1. Open [Connect your agent](https://commonly.me/v2/agents/byo) and choose **Use my own agent**.
-2. Name the agent, choose its pod, and select **Codex** and **macOS**.
+2. Name the agent, choose its pod, and select **Codex** and **macOS**. Linux is not yet tested.
3. Select **Get my connect command**. Copy the listener command shown on the page into Terminal on that Mac. The token is shown once.
4. Keep the terminal running. Wait for the listening check, then @mention the agent in its pod.
diff --git a/docs-site/bring-your-own/deepseek-harness.mdx b/docs-site/bring-your-own/deepseek-harness.mdx
index 4b5bed9d78..b2b05a8e01 100644
--- a/docs-site/bring-your-own/deepseek-harness.mdx
+++ b/docs-site/bring-your-own/deepseek-harness.mdx
@@ -4,7 +4,7 @@ sidebarTitle: DeepSeek Harness
description: Attach DeepSeek Harness (dsh) from your Mac to an invite-only Commonly pod with the Commonly CLI.
---
-DeepSeek Harness (dsh) connects to an invite-only pod from your Mac. The supported path uses Commonly CLI 0.1.122 and dsh 0.2.1-rc.2. It cannot run as a public seat.
+DeepSeek Harness (dsh) connects to an invite-only pod from your Mac. The supported path uses dsh 0.2.1-rc.2. It cannot run as a public seat.
Follow the [DeepSeek Harness guide](https://github.com/Team-Commonly/commonly/blob/main/docs/cli/dsh.md) to put your DeepSeek key in a file outside the workspace and create `environment.json`. Then attach and run:
diff --git a/docs-site/bring-your-own/index.mdx b/docs-site/bring-your-own/index.mdx
index a6ed44a627..59c4aeb77a 100644
--- a/docs-site/bring-your-own/index.mdx
+++ b/docs-site/bring-your-own/index.mdx
@@ -14,10 +14,10 @@ On [Connect your agent](https://commonly.me/v2/agents/byo), choose **Use my own
Connect on a Mac through the web setup.
- Connect on a Mac through the web setup.
+ Connect on a Mac through the web setup. Linux not yet tested.
- Attach from the CLI in an invite-only pod.
+ Attach from the CLI.
Attach from the CLI on a Mac in an invite-only pod.
diff --git a/docs-site/bring-your-own/opencode.mdx b/docs-site/bring-your-own/opencode.mdx
index 6f1765529e..d1c50a24c1 100644
--- a/docs-site/bring-your-own/opencode.mdx
+++ b/docs-site/bring-your-own/opencode.mdx
@@ -4,7 +4,7 @@ sidebarTitle: OpenCode
description: Attach OpenCode to a Commonly pod that only its members can read, with the Commonly CLI, on macOS.
---
-OpenCode uses CLI attach, not the token issued by the web Connect page. The [OpenCode guide](https://github.com/Team-Commonly/commonly/blob/main/docs/cli/opencode.md) has the environment file and provider key setup for macOS, OpenCode 1.19.3, and DeepSeek.
+OpenCode uses CLI attach, not the token issued by the web Connect page. The [OpenCode guide](https://github.com/Team-Commonly/commonly/blob/main/docs/cli/opencode.md) has the environment file and provider key setup for macOS, the tested OpenCode versions 1.18.35 and 1.19.0, and DeepSeek.
After completing that guide's install, sign-in, and environment file steps, attach in a pod that only its members can read:
diff --git a/docs/audits/claim-table.md b/docs/audits/claim-table.md
index 8dd8cb49d1..5d03567da6 100644
--- a/docs/audits/claim-table.md
+++ b/docs/audits/claim-table.md
@@ -40,11 +40,11 @@ Owner: TASK-010. Source: `README.md`.
| README | Sign up with GitHub, Google or email (L62) | TRUE | backend/controllers/authController.ts:615–625 (`registrationOpen`); backend/routes/auth.ts:237 (`/registration-policy`); live `https://api.commonly.me/api/auth/registration-policy` on 10-25 returned `inviteOnly:false, registrationOpen:true`. Invite-only is the production default when `REGISTRATION_INVITE_ONLY` is unset (authController.ts:36–40), so this depends on that env var being off. Providers: frontend/src/i18n/locales/en.json:116–117, :380 (Google, GitHub). | 2026-10-25 |
| README | Install the CLI with `npm i -g @commonlyai/cli@latest` (L71) | TRUE | cli/package.json:2 (name), :9 (bin `commonly`) | 2026-10-25 |
| README | `commonly agent run --adapter claude` (L74) | TRUE | cli/src/commands/agent.js:295 (`agent run --adapter`), :361 | 2026-10-25 |
-| README | Bring your own → Use my own agent → Get my connect command (L68) | TRUE | frontend/src/i18n/locales/en.json:1623 ("Use my own agent"), :1469 ("Get my connect command") | 2026-10-25 |
-| README | The connect page gives four lines with your token filled in (L68–75) | TRUE | frontend/src/v2/components/V2AgentBYO.tsx:981 (install, two exports, `commonly agent run`) | 2026-10-25 |
+| README | Bring your own → Use my own agent → Get my connect command (L68) | TRUE | frontend/src/i18n/locales/en.json:1620 ("Use my own agent"), :1469 ("Get my connect command") | 2026-10-25 |
+| README | The connect page gives four lines with your token filled in (L68–75) | TRUE | frontend/src/v2/components/V2AgentBYO.tsx:980 (install, two exports, `commonly agent run`) | 2026-10-25 |
| README | The page shows **is listening** once running (L77) | TRUE | frontend/src/i18n/locales/en.json:1640 ("{{name}} is listening.") | 2026-10-25 |
| README | Claude Code answers @mentions on macOS (L79) | TRUE | cli/src/lib/adapters/claude.js:760 (workspace trust refused under bwrap: "run on macOS only for now"). Linux support for invite-only pods is in review (#2820) and will change this row when it ships | 2026-10-25 |
-| README | On Linux and Windows, the page connects Claude Code over MCP (L79) | TRUE | frontend/src/v2/components/V2AgentBYO.tsx:958 (`claude mcp add … npx -y @commonlyai/mcp`), :965 (Windows `cmd /c commonly-mcp`) | 2026-10-25 |
+| README | On Linux and Windows, the page connects Claude Code over MCP (L79) | TRUE | frontend/src/v2/components/V2AgentBYO.tsx:957 (`claude mcp add … npx -y @commonlyai/mcp`), :964 (Windows `cmd /c commonly-mcp`) | 2026-10-25 |
| README | Codex answers @mentions on macOS (L80, macOS half) | TRUE | cli/src/lib/adapters/codex.js:487 (Codex's permission-profile boundary runs on macOS). The adapter has no platform gate. The mention path itself is not walked; GTM's walk can still cut it. | 2026-10-26 |
| README | Codex answers @mentions on Linux (L80, Linux half) | CUT | frontend/src/v2/components/V2AgentBYO.tsx:103–105 offers Codex on Linux, and nobody has walked it. The line reads "Linux not yet tested". | 2026-10-26 |
| README | OpenCode guide "(walked on macOS)" (was L80; L81 has no parenthetical) | CUT | Nothing shows the walk did not happen, so this is CUT rather than FALSE. The parenthetical is removed in this PR (README.md:81). | 2026-10-27 |
@@ -97,6 +97,37 @@ Owner: TASK-012. Source: `docs-site/bring-your-own/index.mdx`, `claude-code.mdx`
| Page | Claim | Verdict | Evidence | Date |
|---|---|---|---|---|
+| bring-your-own/index.mdx:6 | On Connect your agent, choose **Use my own agent** | TRUE | en.json:1620 (`byo`: "Use my own agent") | 2026-10-26 |
+| bring-your-own/index.mdx:14 | Claude Code: "Connect on a Mac through the web setup" | TRUE | V2AgentBYO.tsx:104 offers the listener on mac for Claude only; workspace-trust.js:93 refuses a non-darwin workspace. Lily ruled 10-25 that Claude answers @mentions on macOS only | 2026-10-26 |
+| bring-your-own/index.mdx:17, codex.mdx:7 | Codex: "Connect on a Mac through the web setup" and "The Codex listener runs on macOS" | TRUE | V2AgentBYO.tsx:104 offers the mac listener for Codex; the macOS half only | 2026-10-26 |
+| bring-your-own/index.mdx:17, codex.mdx:7, :12 (pre-fix :3, :6, :11) | Codex listener works on Linux (was offered in the app at V2AgentBYO.tsx:104) | FALSE | Lily 10-26 06:12Z: codex 0.164 fails bootstrap on Linux, 0.144 reaches the model call; not verified end to end. Fixed here: "macOS; Linux not yet tested" on codex.mdx:7 and :12 (were :3, :6, :11) and index.mdx:17; in-app copy en.json:1545, en.json:1612, zh-CN.json:1605, zh-CN.json:1671; guides.json:138, :795, :5726; on-my-computer.mdx:29. The in-app offer is narrowed to mac (V2AgentBYO.tsx:104) | 2026-10-26 |
+| bring-your-own/index.mdx:20 | OpenCode card: "Attach from the CLI in an invite-only pod" | CUT | No code makes an OpenCode seat private: opencode.js:358-391 and :451-489 run public seats. Card narrowed to "Attach from the CLI" | 2026-10-26 |
+| bring-your-own/index.mdx:23, deepseek-harness.mdx:7 | DeepSeek Harness: "Attach from the CLI on a Mac in an invite-only pod"; cannot run as a public seat | TRUE | dsh.js:44-45 refuses public trust; dsh.js:328-329 a confined seat needs darwin (Seatbelt) | 2026-10-26 |
+| bring-your-own/index.mdx:30 | MCP gives an interactive session Commonly tools; a listener answers @mentions while you are away | TRUE | MCP connect block at V2AgentBYO.tsx:957; commonly-mcp/src has no poll loop (tools.js:231 is an ack call); the listener is `commonly agent run` (agent.js:3858) | 2026-10-26 |
+| claude-code.mdx:9, codex.mdx:9, codex.mdx:4 | Needs Node.js 20 or later | TRUE | cli/package.json:65-67 `engines.node >=20.0.0` | 2026-10-26 |
+| claude-code.mdx:9 | Claude Code signed in on that Mac | TRUE | claude.js:236-238 names the macOS Keychain credential that Claude's sign-in uses | 2026-10-26 |
+| claude-code.mdx:12 | Select **Claude Code** and **macOS** on the Connect page | TRUE | V2AgentBYO.tsx:95 lists the OS choices; en.json:1611 names the OS when Claude cannot run | 2026-10-26 |
+| claude-code.mdx:13, codex.mdx:13 | Get my connect command; the token is shown once | TRUE | en.json:1466 (`openConnect`); en.json:1552 (`keyOnce`: "a private key we show only once") | 2026-10-26 |
+| claude-code.mdx:19-22 | Listener command: `npm i -g @commonlyai/cli@latest`, `export COMMONLY_API_URL`, `export COMMONLY_AGENT_TOKEN`, `commonly agent run --adapter claude` | TRUE | V2AgentBYO.tsx:46 (install) and :980 (the copied listener template with `--adapter ${listenAdapter}`) | 2026-10-26 |
+| codex.mdx:16 | Copied command installs `@commonlyai/cli`, sets URL and token, and runs `commonly agent run --adapter codex` | TRUE | V2AgentBYO.tsx:980 with listenAdapter set to codex; codex is registered (cli/src/lib/adapters/index.js:23) | 2026-10-26 |
+| claude-code.mdx:25, codex.mdx:16, work-in-your-repo.mdx:21 | MCP alone does not answer @mentions and does not start the listener | TRUE | commonly-mcp/src has no poll loop (tools.js:231 is an ack call); the listener is `commonly agent run` (agent.js:3858) | 2026-10-26 |
+| opencode.mdx:7 | "OpenCode 1.19.3" is the version the guide covers | STALE | opencode.js:68 `TESTED_OPENCODE_VERSIONS = ['1.18.35', '1.19.0']`. Fixed here to name the tested versions | 2026-10-26 |
+| opencode.mdx:12-13 | `commonly agent attach opencode --pod ... --env ...`, then `commonly agent run ` | TRUE | opencode is registered (cli/src/lib/adapters/index.js:25); attach takes `--env ` (agent.js:3678) | 2026-10-26 |
+| deepseek-harness.mdx:6 (removed) | "Commonly CLI 0.1.122" is the supported path | CUT | No code pins a CLI version for dsh. The 0.1.122 pin exists only in docs/cli/dsh.md:16. Removed from the page | 2026-10-26 |
+| deepseek-harness.mdx:7 | dsh 0.2.1-rc.2 is the supported version | TRUE | dsh.js:35 `TESTED_DSH_VERSIONS = ['0.2.1-rc.2']`; :344-345 refuses other versions | 2026-10-26 |
+| deepseek-harness.mdx:12-13 | `commonly agent attach dsh ... --env ...`, then `commonly agent run ` | TRUE | dsh is registered (cli/src/lib/adapters/index.js:27); attach takes `--env` (agent.js:3678) | 2026-10-26 |
+| work-in-your-repo.mdx:25 | On macOS, if every pod is private, the listener works in the folder you ran it from | TRUE | workspace-trust.js:6-8 (a pod must be confirmed private, not publicly readable, not listed, invite-only); :93 (darwin only); :112-119 (scratch folder otherwise) | 2026-10-26 |
+| work-in-your-repo.mdx:27 | Reads files there and runs read-only git: `status`, `log`, `diff`, `show`, `blame` | TRUE | cli/src/lib/git-readonly.js:65 `READONLY_GIT_SUBCOMMANDS` | 2026-10-26 |
+| work-in-your-repo.mdx:28 | Can't edit files, run commands, or fetch web pages | TRUE | Grants are off unless passed: agent.js:303-309 accepts only write and web, and only from `--allow` | 2026-10-26 |
+| work-in-your-repo.mdx:29 | Can't read `.env` or `.env.*`; read-only git refuses them by name or path | TRUE | git-readonly.js:158-163 (ENV_FILE_SEGMENT and the excludes); :46 (committed .env refused by path or object id) | 2026-10-26 |
+| work-in-your-repo.mdx:31 | Read-only git turns off external diff tools, conversion programs and signature checks, in submodules too | TRUE | git-readonly.js:21-22 and :112-116 (`--no-ext-diff --no-textconv`); :120-126 (the same off-switches reach a submodule's git as `-c` flags); :209-210 (`--submodule=diff` refused) | 2026-10-26 |
+| work-in-your-repo.mdx:32 | Read-only git never contacts a remote | TRUE | git-readonly.js:40 (lazy fetch off, so a partial clone's missing objects stay missing); readonlyGitEnv sets GIT_NO_LAZY_FETCH and GIT_ALLOW_PROTOCOL=none (git-readonly.js:283-300) | 2026-10-26 |
+| work-in-your-repo.mdx:35 | Otherwise reads only its scratch folder, and the start-up lines say why | TRUE | workspace-trust.js:90-107 (refusals with reasons); :112-119 (scratch folder as the cwd) | 2026-10-26 |
+| work-in-your-repo.mdx:42-44 | `--allow write`, `--allow web` and `--allow write,web` are accepted on first run | TRUE | agent.js:3863 (`--allow `); agent.js:303-309 (WORKSPACE_SANDBOX_ALLOW) | 2026-10-26 |
+| work-in-your-repo.mdx:52 | Grants fixed at first setup; change with `commonly agent detach --force`, then rerun | TRUE | agent.js:315-329 (grants fixed when the token file is written; the message names detach --force) | 2026-10-26 |
+| work-in-your-repo.mdx:54 | Only Claude Code listeners work in a folder for now | TRUE | workspace-trust.js:90-91 returns no workspace unless adapterName is claude | 2026-10-26 |
+| en.json:1611 | "Claude Code can't answer @mentions from {{os}} yet" | TRUE | matches workspace-trust.js:93 and V2AgentBYO.tsx:104 | 2026-10-26 |
+| V2AgentBYO.tsx:104, en.json:1545, en.json:1612, zh-CN.json:1605, zh-CN.json:1671, guides.json:138, :795, :5726, on-my-computer.mdx:29 | Codex works on a Mac or Linux computer (the Linux half) | FALSE | Same evidence as the Codex-on-Linux row. Copy changed to "Linux is not tested yet"; the in-app listener offer narrowed to mac (`listenerRunsOn`), per Lily's "macOS; Linux not yet tested" | 2026-10-26 |
## Connectors and grants
diff --git a/frontend/src/content/guides.json b/frontend/src/content/guides.json
index 3964b550e8..4fb837b56c 100644
--- a/frontend/src/content/guides.json
+++ b/frontend/src/content/guides.json
@@ -135,7 +135,7 @@
},
{
"question": "Can I use Claude Code and Codex in the same team?",
- "answer": "Yes. Set each one up from the Bring your own agent page on your own machine (Claude Code on a Mac; Codex on a Mac or Linux, including WSL). Both join the same pod with their own identities, answer @mentions while their listener runs, and keep their runtime-specific tools."
+ "answer": "Yes. Set each one up from the Bring your own agent page on your own machine (Claude Code on a Mac; Codex on a Mac; Linux is not tested yet). Both join the same pod with their own identities, answer @mentions while their listener runs, and keep their runtime-specific tools."
},
{
"question": "How do agents share context?",
@@ -792,7 +792,7 @@
},
{
"question": "Will an MCP-connected agent respond automatically when mentioned?",
- "answer": "An MCP-connected agent is reactive: it acts when you invoke it in its host tool. To have @mentions answered while you are away, run the listener command the Bring your own agent page gives you, commonly agent run . While it runs, Claude Code (Mac only) or Codex (Mac or Linux, including WSL) answers on your machine. Start with MCP when you use Claude Code or Codex interactively."
+ "answer": "An MCP-connected agent is reactive: it acts when you invoke it in its host tool. To have @mentions answered while you are away, run the listener command the Bring your own agent page gives you, commonly agent run . While it runs, Claude Code (Mac only) or Codex (Mac only; Linux is not tested yet) answers on your machine. Start with MCP when you use Claude Code or Codex interactively."
},
{
"question": "Can this replace GitHub, tests, or source control?",
@@ -5723,7 +5723,7 @@
},
"intro": [
"An AI agent CLI wrapper turns a local command-line agent into a participant in a shared workspace: it polls collaboration events and drives the local CLI to respond. It does not move the agent into the workspace, make a laptop a hosted runtime, or give the agent permissions its runtime and connected systems did not already have.",
- "Commonly (commonly.me), the shared workspace where humans and AI agents work together, offers a CLI path for the case where a team wants a local agent to stay present in a pod while the operator is away. The listener runs Claude Code (Mac only) or Codex (Mac or Linux, including WSL), set up from the Bring your own agent page, or OpenCode, attached from the command line with commonly agent attach opencode. The agent still runs on the machine that starts it. Commonly supplies the pod identity, collaboration surface, runtime events, memory, and task record; the local CLI supplies the reasoning and any host-level capabilities its operator has configured.",
+ "Commonly (commonly.me), the shared workspace where humans and AI agents work together, offers a CLI path for the case where a team wants a local agent to stay present in a pod while the operator is away. The listener runs Claude Code (Mac only) or Codex (Mac only; Linux is not tested yet), set up from the Bring your own agent page, or OpenCode, attached from the command line with commonly agent attach opencode. The agent still runs on the machine that starts it. Commonly supplies the pod identity, collaboration surface, runtime events, memory, and task record; the local CLI supplies the reasoning and any host-level capabilities its operator has configured.",
"That split is the useful part of the design, and the part worth being explicit about. A local agent can collaborate continuously without a public inbound endpoint, but a wrapper is not a security boundary, a repository permission system, or a substitute for review. This guide explains how to attach and run a CLI agent, where its authority begins and ends, how heartbeats fit into the operating model, and how to test one small workflow before handing the agent a larger role."
],
"sections": [
diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json
index 796bbfde79..8230605dd3 100644
--- a/frontend/src/i18n/locales/en.json
+++ b/frontend/src/i18n/locales/en.json
@@ -1542,7 +1542,7 @@
"footnote": {
"cliRoute": "Prefer the CLI? Choose “{{byo}}”; after install, the next step shows the listener command that answers @mentions.",
"cliRouteClaudeUnavailable": "Prefer the CLI? Choose “{{byo}}”; after install, connect Claude Code to Commonly from your own sessions. To answer @mentions, run the listener on a supported computer or choose “{{hosted}}”.",
- "cliRouteCodexUnavailable": "Prefer the CLI? Choose “{{byo}}”; after install, the next step explains how to run the listener on a Mac or Linux computer. To answer @mentions from Windows, choose “{{hosted}}”.",
+ "cliRouteCodexUnavailable": "Prefer the CLI? Choose “{{byo}}”; after install, the next step explains how to run the listener on a Mac computer. To answer @mentions from {{os}}, choose “{{hosted}}”.",
"notSure": "Not sure which path?",
"mcpVsCli": "MCP vs CLI vs SDK",
"fullWalkthrough": "full walkthrough"
@@ -1609,7 +1609,7 @@
"toolClaude": "Claude Code",
"toolCodex": "the Codex CLI",
"unavailableClaude": "Claude Code can’t answer @mentions from {{os}} yet: Commonly runs it in a sandbox, and on {{os}} that sandbox can’t run it. Connect Claude Code from your own sessions with the command below, or choose “Run it here” for a hosted agent.",
- "unavailableCodex": "The Codex CLI can’t answer @mentions from Windows yet. Choose “Run it here” for a hosted agent, or run the command on a Mac or Linux machine.",
+ "unavailableCodex": "The Codex CLI can’t answer @mentions from {{os}} yet. Choose “Run it here” for a hosted agent, or run the command on a Mac. Linux is not tested yet.",
"switchToCodex": "I use Codex instead",
"switchToClaude": "I use Claude Code instead"
},
diff --git a/frontend/src/i18n/locales/zh-CN.json b/frontend/src/i18n/locales/zh-CN.json
index e1e40b57c1..a3f190cce2 100644
--- a/frontend/src/i18n/locales/zh-CN.json
+++ b/frontend/src/i18n/locales/zh-CN.json
@@ -1602,7 +1602,7 @@
"footnote": {
"cliRoute": "更喜欢用 CLI?选择「{{byo}}」;安装后下一步会显示回复 @提及的监听命令。",
"cliRouteClaudeUnavailable": "更喜欢用 CLI?选择「{{byo}}」;安装后可以在自己的 Claude Code 会话中连接 Commonly。要回复 @提及,请在支持的电脑上运行监听命令,或选择「{{hosted}}」。",
- "cliRouteCodexUnavailable": "更喜欢用 CLI?选择「{{byo}}」;安装后下一步会说明如何在 Mac 或 Linux 电脑上运行监听命令。要从 Windows 回复 @提及,请选择「{{hosted}}」。",
+ "cliRouteCodexUnavailable": "更喜欢用 CLI?选择「{{byo}}」;安装后下一步会说明如何在 Mac 电脑上运行监听命令。要从 {{os}} 回复 @提及,请选择「{{hosted}}」。",
"notSure": "不确定用哪条路径?",
"mcpVsCli": "MCP、CLI 与 SDK 对比",
"fullWalkthrough": "完整教程"
@@ -1668,7 +1668,7 @@
"osWindows": "Windows",
"toolClaude": "Claude Code",
"unavailableClaude": "Claude Code 在 {{os}} 上暂时不能回复 @提及:Commonly 要把它放进沙箱里运行,而 Commonly 用的沙箱在 {{os}} 上还做不到。你可以用下面的命令把 Commonly 的工具接进自己的 Claude Code 会话,或者选择“在这里运行”,改用托管智能体。",
- "unavailableCodex": "Codex CLI 在 Windows 上暂时不能回复 @提及。你可以选择“在这里运行”,改用托管智能体;也可以换到 Mac 或 Linux 机器上运行这条命令。",
+ "unavailableCodex": "Codex CLI 在 {{os}} 上暂时不能回复 @提及。你可以选择“在这里运行”,改用托管智能体;也可以换到 Mac 机器上运行这条命令(Linux 尚未测试)。",
"toolCodex": "Codex CLI",
"switchToCodex": "我用的是 Codex",
"switchToClaude": "我用的是 Claude Code"
diff --git a/frontend/src/v2/__tests__/V2AgentBYOFootnote.test.tsx b/frontend/src/v2/__tests__/V2AgentBYOFootnote.test.tsx
index 46703dc364..45113e5bb6 100644
--- a/frontend/src/v2/__tests__/V2AgentBYOFootnote.test.tsx
+++ b/frontend/src/v2/__tests__/V2AgentBYOFootnote.test.tsx
@@ -98,7 +98,7 @@ describe('V2AgentBYO footnote', () => {
const footnote = await screen.findByText(/Prefer the CLI\?/);
await screen.findByTestId('byo-mode-byo');
expect(footnote).toHaveTextContent(`Choose “${modeTitle('byo-mode-byo')}”`);
- expect(footnote).toHaveTextContent('run the listener on a Mac or Linux computer');
+ expect(footnote).toHaveTextContent('run the listener on a Mac computer');
expect(footnote).toHaveTextContent(`To answer @mentions from Windows, choose “${modeTitle('byo-mode-hosted')}”`);
expect(footnote).not.toHaveTextContent('the next step shows the listener command');
});
diff --git a/frontend/src/v2/__tests__/V2AgentBYOFromCard.test.tsx b/frontend/src/v2/__tests__/V2AgentBYOFromCard.test.tsx
index db96709fe4..ae638b33fb 100644
--- a/frontend/src/v2/__tests__/V2AgentBYOFromCard.test.tsx
+++ b/frontend/src/v2/__tests__/V2AgentBYOFromCard.test.tsx
@@ -187,9 +187,9 @@ describe('BYO from an approved connect card', () => {
});
});
-// #2289: the listener runs on a Mac with either tool and on Linux with Codex
-// only. The compact page promises "One command in Terminal", so it opens only
-// where that command will be shown.
+// #2289: the listener runs on a Mac with either tool only (Linux is not tested
+// yet, 10-26). The compact page promises "One command in Terminal", so it opens
+// only where that command will be shown.
describe('the compact page opens only where the command exists', () => {
const realUserAgent = window.navigator.userAgent;
const setUserAgent = (value) => Object.defineProperty(window.navigator, 'userAgent', { value, configurable: true });
@@ -204,10 +204,11 @@ describe('the compact page opens only where the command exists', () => {
expect(screen.queryByTestId('byo-card-compact')).toBeNull();
});
- test('a Codex card opened on Linux is compact: the listener runs there', async () => {
+ test('a Codex card opened on Linux gets the full page: Codex on Linux is not tested yet', async () => {
setUserAgent(LINUX);
renderAt('/v2/agents/byo?pod=bbb222&name=lee-codex&from=card&adapter=codex');
- expect(await screen.findByTestId('byo-card-compact')).toBeInTheDocument();
+ expect(await screen.findByTestId('byo-mode-byo')).toHaveAttribute('aria-pressed', 'true');
+ expect(screen.queryByTestId('byo-card-compact')).toBeNull();
});
test('on Windows no card is compact, Codex included', async () => {
diff --git a/frontend/src/v2/__tests__/V2AgentBYOListenSnippet.test.tsx b/frontend/src/v2/__tests__/V2AgentBYOListenSnippet.test.tsx
index d80394ffbc..977d8658e4 100644
--- a/frontend/src/v2/__tests__/V2AgentBYOListenSnippet.test.tsx
+++ b/frontend/src/v2/__tests__/V2AgentBYOListenSnippet.test.tsx
@@ -253,7 +253,7 @@ describe('BYO listener snippet', () => {
expect(screen.getByTestId('byo-mcp-claude')).not.toHaveTextContent(/command above/);
});
- test('Linux with Claude Code: no listener command, and the bash MCP command; with Codex the listener is back', async () => {
+ test('Linux with Claude Code or Codex: no listener command, and the bash MCP command; Codex says it is not tested yet', async () => {
setUserAgent(LINUX);
await issueToken();
expect(screen.getByTestId('byo-setup-os-linux')).toHaveAttribute('aria-pressed', 'true');
@@ -263,8 +263,8 @@ describe('BYO listener snippet', () => {
expect(mcpBox()).toMatch(/-- npx -y @commonlyai\/mcp$/);
expect(screen.getByTestId('byo-mcp-claude')).not.toHaveTextContent(/command above|Optional/);
fireEvent.click(screen.getByTestId('byo-listen-adapter-switch'));
- expect((listener()?.textContent || '').split('\n')[3]).toMatch(/ --adapter codex$/);
- expect(screen.getByTestId('byo-listen-needs')).toHaveTextContent(/the Codex CLI signed in/);
+ expect(listener()).toBeUndefined();
+ expect(screen.getByTestId('byo-listen-unavailable')).toHaveTextContent(/The Codex CLI can’t answer @mentions from Linux yet\. .*Linux is not tested yet\./);
});
test('Codex on Windows says so, and offers hosted or another machine', async () => {
diff --git a/frontend/src/v2/components/V2AgentBYO.tsx b/frontend/src/v2/components/V2AgentBYO.tsx
index 9daf273ec8..74c341b0f3 100644
--- a/frontend/src/v2/components/V2AgentBYO.tsx
+++ b/frontend/src/v2/components/V2AgentBYO.tsx
@@ -99,10 +99,9 @@ const SETUP_OS_OPTIONS: Array<{ os: SetupOs; labelKey: string }> = [
// host check leaves Codex alone (it confines with its own profiles, not
// Seatbelt or bubblewrap), but this page's command is bash `export` lines,
// which PowerShell cannot run, and Codex on native Windows is unmeasured.
-// Not drift: the page only offers what it has seen work.
-const listenerRunsOn = (os: SetupOs, adapter: 'claude' | 'codex'): boolean => (
- os === 'mac' || (os === 'linux' && adapter === 'codex')
-);
+// Not drift: the page only offers what it has seen work. Codex on Linux is
+// not walked yet (Lily, 10-26: "macOS; Linux not yet tested"), so no listener.
+const listenerRunsOn = (os: SetupOs): boolean => os === 'mac';
type ModelOption = { value: string; labelKey: string };
const CLAUDE_MODEL_OPTIONS: ModelOption[] = [
{ value: 'opus', labelKey: 'agentByo.form.modelOpus' },
@@ -199,7 +198,7 @@ const V2AgentBYO: React.FC = () => {
// Where the person sets up, defaulted from this browser. They can switch:
// the machine they browse on is not always the one they set up.
const [setupOs, setSetupOs] = useState(browserOs);
- const listenerAvailable = listenerRunsOn(setupOs, listenAdapter);
+ const listenerAvailable = listenerRunsOn(setupOs);
// Live listening verification (#887 class, second half). #888 made the
// listening step legible; this makes it CHECKABLE — the page polls the
// kernel until THIS agent's runtime token authenticates for the first time
@@ -1352,6 +1351,7 @@ const V2AgentBYO: React.FC = () => {
: 'agentByo.footnote.cliRouteCodexUnavailable', {
byo: t('agentByo.mode.byo'),
hosted: t('agentByo.mode.hosted'),
+ os: t(SETUP_OS_OPTIONS.find((o) => o.os === setupOs)?.labelKey || 'agentByo.listen.osMac'),
})}{' '}
{t('agentByo.footnote.notSure')}{' '}
{t('agentByo.footnote.mcpVsCli')}