Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions FEATURES-SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,12 +165,11 @@ happens while nobody is at the keyboard.
- Saved remote devices: run an agent on another machine's daemon β€” dashboard here, agents there
- Run on a fresh GitHub Actions runner
- Run on a Claude Code cloud session
- A web run's cloud session is created by the Chrome extension in your own browser, through claude.ai's repository picker β€” repo-bound, so it can push and open its pull request; the CLI's cloud mode only when no extension is around
- A web run's cloud session is created by the Chrome extension in your own browser, through claude.ai's repository picker β€” repo-bound, so it can push and open its pull request; without the extension (or with the browser bridge off) the run stops and says which is missing
- Chrome extension bridging claude.ai questions back to the dashboard
- A cloud session's conversation mirrored into the run view, turn by turn, as it is written
- Answer a cloud agent's question from the dashboard (typed back into claude.ai) β€” the same gate panel a local agent gets, multi-select and stop options included, listed with every other open question
- Browser-bridge token setting
- Web runs trust the project for Claude Code automatically β€” no manual trust step
- A cloud run's row follows the session's real branch and PR, with its armed draft PR opened when the session opens none
- Another machine's runs on the shared data branch are told apart: their rows carry a glyph naming the machine that started them (the Overview's working-now card spells it out), and a run is listed once even when two checkouts share its archive

Expand Down
3 changes: 1 addition & 2 deletions packages/chrome-extension/content.js
Original file line number Diff line number Diff line change
Expand Up @@ -471,8 +471,7 @@ async function deliverAnswer(text) {

// ---------------------------------------------------------------------------
// Creating a session (#1328). A session created through this page's repo picker is repo-bound,
// and those are the ones that can push and open a pull request; `claude --cloud` on some accounts
// produces a bundle upload that cannot (#1320). So the daemon queues a repo, a branch and a prompt,
// and those are the ones that can push and open a pull request (#1320). So the daemon queues a repo, a branch and a prompt,
// and this drives the same controls a person would on the new-session page: the repo chip and
// its searchable list, the branch chip that appears beside it, the composer, send.
//
Expand Down
33 changes: 0 additions & 33 deletions packages/framework/src/claude-trust.SPEC.md

This file was deleted.

10 changes: 0 additions & 10 deletions packages/framework/src/claude-trust.test.SPEC.md

This file was deleted.

78 changes: 0 additions & 78 deletions packages/framework/src/claude-trust.test.ts

This file was deleted.

79 changes: 0 additions & 79 deletions packages/framework/src/claude-trust.ts

This file was deleted.

2 changes: 1 addition & 1 deletion packages/framework/src/cli.SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ The user picks a run target in the dashboard: this device, a GitHub Actions runn

For the `actions` target, the repository's owner and name come from its GitHub origin remote and the credential from the environment or, failing that, from the `gh` CLI β€” never from the committed `the-framework.yml`, since a repo file is public and this must be a user credential. A missing remote or a missing credential aborts the agent before any driver exists, with a message naming both ways to supply the token and pointing out that it must belong to a user rather than an app.

For the `web` target nothing is resolved: the wrapped CLI holds the account the cloud session runs under. The agent announces the hand-off and, when the repository has no GitHub remote, that a bundle of it will be uploaded instead. It also states plainly that the cloud session clones the remote at its current branch, so local commits that were never pushed are not in it. A `web` agent that a daemon spawned β€” its environment names the daemon's address, and the registry holds the daemon token β€” asks that daemon for a session created by the browser extension before falling back to the CLI's own cloud mode; an agent with no daemon address, or no token, hands off through the CLI alone.
For the `web` target nothing is resolved: the session is created on the user's own account by the browser extension. The agent announces the hand-off, and states plainly that the cloud session opens on the run's pushed starting point, so local commits that were never pushed are not in it. A `web` agent's cloud session is created by the browser extension through the daemon that spawned the agent β€” its environment names the daemon's address, and the registry holds the daemon token; an agent with no daemon address, or no token, stops saying web runs start from the dashboard.

The framework launches Chrome itself for a browser-enabled agent rather than letting the driver's browser tooling launch its own, because that is what lets the preview attach to the same page. It does so only for a local agent: the browser tools are wired on this machine, so a remote agent could never reach them, and launching Chrome would leak a headless browser per agent. A browser asked for on a remote target, or on a machine with no Chrome, is reported as having no effect rather than failing the agent. Whether the system prompt may claim the agent has a browser is narrower still than the setting: it must be a local, real, Claude Code agent.

Expand Down
20 changes: 9 additions & 11 deletions packages/framework/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,10 @@ export function chooseSessionLink(opts: Pick<AgentOptions, 'driver'>, fake: bool
}

/**
* The extension-backed session start a web run can use (#1328): only when a daemon spawned this
* run (its URL is in {@link DAEMON_URL_ENV}) and the registry holds the daemon token that the
* daemon's start-queue asks for. Anything less and the run hands off through the CLI alone.
* How a web run reaches the daemon whose browser extension creates its session (#1328): only
* when a daemon spawned this run (its URL is in {@link DAEMON_URL_ENV}) and the registry holds
* the daemon token that the daemon's start-queue asks for. Anything less and the run fails
* saying web runs start from the dashboard.
*/
export async function extensionStartConfig(env: NodeJS.ProcessEnv): Promise<CloudDriverOptions | undefined> {
const daemonUrl = env[DAEMON_URL_ENV]
Expand Down Expand Up @@ -1168,15 +1169,12 @@ async function driveAgent(opts: AgentOptions, io: CliIO): Promise<number> {
io.out(`β—† run on: GitHub Actions (${slug.owner}/${slug.repo})`)
}

// Run on Claude Code on the web (#610). Nothing to resolve: the CLI holds the account the
// cloud session is created under, so there is no token of ours and no repo config. The
// session clones this repo's remote at its current branch, so local commits that were never
// pushed are not in it β€” say so once here rather than let the cloud session look stale.
// Run on Claude Code on the web (#610): the browser extension creates the session on the
// user's own account (#1328), so there is no token of ours and no repo config. The session
// opens on this run's pushed hand-off ref, so local commits that were never pushed are not in
// it β€” say so once here rather than let the cloud session look stale.
if (opts.target === 'web' && !fake) {
io.out('β—† run on: Claude Code on the web (a cloud session on your own account)')
if (!(await githubSlugFor(cwd))) {
io.out(' no GitHub remote here, so the CLI uploads a bundle of this repo instead.')
}
io.out('β—† run on: Claude Code on the web (a cloud session on your own account, created by the browser extension)')
}

// A daemon-spawned web run asks its daemon for an extension-created session first (#1328): the
Expand Down
2 changes: 1 addition & 1 deletion packages/framework/src/cloud-session-link.test.SPEC.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
What the tests cover: a `web`-target agent's agent meta ends up carrying the cloud session's real deep link (the per-session claude.ai/code URL the driver reads out of the hand-off), not the generic claude.ai/code entry point β€” while the opening event still honestly records the generic link that was all that was known before the session existed. The contract that the deep link wins is pinned end to end, through the real cloud driver, the real telemetry, and the real meta fold, rather than per layer.
What the tests cover: a `web`-target agent's agent meta ends up carrying the cloud session's real deep link (the per-session claude.ai/code URL the browser extension reports back through the daemon), not the generic claude.ai/code entry point β€” while the opening event still honestly records the generic link that was all that was known before the session existed. The contract that the deep link wins is pinned end to end, through the real cloud driver, the real telemetry, and the real meta fold, rather than per layer.

## Before modifying/creating SPEC.md files

Expand Down
Loading
Loading