feat(installer): set up a Claude Code cloud environment with --cloud - #72
Merged
Merged
Conversation
Adds setup-workstation.sh --cloud and the two files pasted into a cloud environment (cloud/setup-script.sh, cloud/environment.env). A copy run outside a checkout now re-runs the one in the release's kit bundle, which also carries the helpers it sources. Registry gains cloud: false and install_linux. Fixes primary-profile MCP registrations landing in ~/.claude/.claude.json instead of ~/.claude.json.
ExtraToast
enabled auto-merge (squash)
September 26, 2026 09:13
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
A Claude Code cloud session starts from a fresh Ubuntu VM, so none of the laptop's agent setup reaches it: no Codex, no Hermes, no plugins, no language servers, no MCP fleet, no memory. This adds a cloud mode to
setup-workstation.sh, plus the two files you paste into a cloud environment.cloud/setup-script.shfetches the latest release's script fromassets.jorisjonkers.devand runs it with--cloud.cloud/environment.envlists the variables to fill in. Everything else stays in the registry, so the environment never needs editing again. The setup guide isdocs/CLOUD.md.What changes
--cloud: one profile. Claude Code is left to the host; a config-only CLI goes under/opt/agent-kit/claude-cliwhen none is onPATH. MCP tokens are registered as${VAR}references, so the cached snapshot holds none. Codex is logged in fromOPENAI_API_KEY, and Hermes gets an OpenRouter model when it has none.cloud: falsein the registry keeps an entry off the cloud. That covers Claude Code's own install, thekubernetesserver (no kube context), thegithubplugin (the host's GitHub proxy covers it) and every LSP the estate does not use. Skipping them keeps setup inside the environment's ~5-minute cache budget.install_linux:for brew-only language servers: Kotlin (pinned, sha256-checked) and jdtls.port-forward-agent.sh,cloud-session.shandhermes-merge-mcp.py. Before this, acurl | bashrun could not sourceport-forward-agent.shor merge Hermes' MCP servers.claudenever reads. Since feat(installer): second Claude Code profile and claude-<profile> launcher #58, every registration ran withCLAUDE_CONFIG_DIR=~/.claude. That moves.claude.jsoninside the directory, but a bareclaudereads~/.claude.json. The primary profile now runs withoutCLAUDE_CONFIG_DIRunless you set one yourself.hermes-agentinstalls with--python '>=3.11,<3.14'. The cloud's GitHub proxy blocks uv's managed-Python download, and the VM's system Python 3.12 satisfies the range.Location:line ofclaude mcp list's diagnostics as a server name.Verification done
render_registry.py --check,ruffandmypyare clean.pytest: 185 passed, 27 of them new. They covertests/test_cloud_setup.py, the primary-profile and diagnostics cases intest_registry_render.py, and the bundle contents intest_publish_installer_artifacts.py.shellcheckis clean on the new scripts, and-S warningis clean on the generated one.End to end in
ubuntu:24.04as root: staged the bundle withpublish-installer-artifacts.sh stage, served it locally, and rancloud/setup-script.shagainst it. It took 72 s with 0 failures. Read back:/root/.claude.jsonholds the five servers withBearer ${HINDSIGHT_API_TOKEN}andBearer ${MEMORY_MCP_TOKEN}.codex,hermes,olcli,drawio-mcpand the TypeScript, Pyright, Kotlin and jdtls servers are all in/usr/local/bin.kubernetesentry.The container was arm64, not the cloud's x86_64.
The profile bug shows on a real laptop:
~/.claude/.claude.jsonholds the servers setup registered on 2026-09-15, where a bareclaudenever looks.After merge
curl -fsSL https://assets.jorisjonkers.dev/setup-workstation.sh | sed -n 2p. Until then, the published script rejects--cloud.docs/CLOUD.md: mint twoclaude-cloudtokens, add the custom network list, and paste the two files./root/.claude.json.claude mcp listin the first session answers it.~/.claude/.claude.jsonis stale once this lands and can be deleted.