feat: codex and grok templates — the mechanic's second and third tenants
Two coding-CLI templates mirroring claude's shape: a box.env + verbatim
cloud-init, inheriting the box-net placement contract structurally, no
new design.
- codex: OpenAI Codex CLI via 'npm i -g @openai/codex' (the SCOPED
package; needs Node 22), symlinked onto the non-interactive exec PATH
via 'npm prefix -g' — the same PATH fix the claude template needed.
- grok: xAI Grok Build via the official 'curl x.ai/cli/install.sh',
run AS the grok user (the installer drops into $HOME); the binary is
found and symlinked to /usr/local/bin.
Install commands verified upstream at implementation time, per the
issue's rule (npmjs.com/package/@openai/codex, x.ai/cli). Each gets an
AGENTS.md-style context file telling the agent it lives in a
disposable, isolated, creds-free box.
Drill: templates listing now expects four; a compact per-template smoke
(mint, '<cli> --version' via box exec, remove) validates each payload
installs and lands on the exec PATH — the generic mechanic is already
proven by blank+claude and not repeated.
Closes #54
2026-07-14 15:59:39 +00:00
|
|
|
#cloud-config
|
|
|
|
|
users:
|
|
|
|
|
- name: grok
|
|
|
|
|
shell: /bin/bash
|
|
|
|
|
sudo: "ALL=(ALL) NOPASSWD:ALL"
|
|
|
|
|
lock_passwd: true
|
|
|
|
|
write_files:
|
|
|
|
|
- path: /home/grok/.grok/AGENTS.md
|
|
|
|
|
owner: "grok:grok"
|
|
|
|
|
permissions: '0644'
|
|
|
|
|
defer: true
|
|
|
|
|
content: |
|
|
|
|
|
# You are running inside a box (template: grok)
|
|
|
|
|
|
|
|
|
|
A box is a trust-less, network-isolated, ephemeral VM created by the
|
|
|
|
|
`box` CLI. Keep this context in mind:
|
|
|
|
|
|
|
|
|
|
- **Creds-free by default.** The box starts with no xAI and no git
|
|
|
|
|
credentials. If you need to authenticate, the operator runs
|
|
|
|
|
`grok-build login` interactively (SuperGrok / X Premium+). For git, the
|
|
|
|
|
operator adds their own credentials (a PAT or `gh auth login`). Never
|
|
|
|
|
assume credentials are present; never ask for or store secrets on disk
|
|
|
|
|
beyond what the operator sets up.
|
|
|
|
|
- **Isolated.** The box reaches the public internet but nothing on the host
|
|
|
|
|
or local network. There is no inbound path.
|
|
|
|
|
- **Disposable.** Nothing here is backed up. State is discarded when the box
|
|
|
|
|
is removed; the operator persists work via git push and via `box snapshot`.
|
|
|
|
|
- **Bootstrap runbook.** If the repository you are working in contains a
|
2026-07-14 18:01:34 +00:00
|
|
|
`.box/` folder (older repos may use `.claudebox/`), read it as your setup runbook — how to install
|
feat: codex and grok templates — the mechanic's second and third tenants
Two coding-CLI templates mirroring claude's shape: a box.env + verbatim
cloud-init, inheriting the box-net placement contract structurally, no
new design.
- codex: OpenAI Codex CLI via 'npm i -g @openai/codex' (the SCOPED
package; needs Node 22), symlinked onto the non-interactive exec PATH
via 'npm prefix -g' — the same PATH fix the claude template needed.
- grok: xAI Grok Build via the official 'curl x.ai/cli/install.sh',
run AS the grok user (the installer drops into $HOME); the binary is
found and symlinked to /usr/local/bin.
Install commands verified upstream at implementation time, per the
issue's rule (npmjs.com/package/@openai/codex, x.ai/cli). Each gets an
AGENTS.md-style context file telling the agent it lives in a
disposable, isolated, creds-free box.
Drill: templates listing now expects four; a compact per-template smoke
(mint, '<cli> --version' via box exec, remove) validates each payload
installs and lands on the exec PATH — the generic mechanic is already
proven by blank+claude and not repeated.
Closes #54
2026-07-14 15:59:39 +00:00
|
|
|
dependencies, start services, template environment files, seed data, and
|
|
|
|
|
smoke-test — and follow it. It is documentation for you, not a script the
|
|
|
|
|
host runs.
|
|
|
|
|
package_update: true
|
|
|
|
|
packages:
|
|
|
|
|
- git
|
|
|
|
|
- gh
|
|
|
|
|
- curl
|
|
|
|
|
- ca-certificates
|
|
|
|
|
- gnupg
|
|
|
|
|
- ripgrep
|
|
|
|
|
- jq
|
|
|
|
|
- tmux
|
|
|
|
|
- age
|
|
|
|
|
- unzip
|
|
|
|
|
- build-essential
|
|
|
|
|
runcmd:
|
|
|
|
|
- curl -fsSL https://get.docker.com | sh
|
|
|
|
|
- usermod -aG docker grok
|
|
|
|
|
# Grok Build's official installer (verified upstream: x.ai/cli). It drops the
|
|
|
|
|
# binary under the invoking user's home, so run it AS grok, not root.
|
|
|
|
|
- sudo -u grok bash -lc 'curl -fsSL https://x.ai/cli/install.sh | bash'
|
|
|
|
|
# 'box exec <b> -- grok-build …' runs a NON-interactive shell that reads no
|
|
|
|
|
# rc files. Find whatever the installer dropped and symlink it onto the
|
|
|
|
|
# system PATH — the same fix the claude template needed. If the installer's
|
|
|
|
|
# binary name changes upstream, this glob is the one line to update.
|
|
|
|
|
- |
|
|
|
|
|
bin="$(find /home/grok -maxdepth 4 -type f -name 'grok-build' 2>/dev/null | head -1)"
|
|
|
|
|
[ -n "$bin" ] && ln -sf "$bin" /usr/local/bin/grok-build || echo "grok-build binary not found post-install — check x.ai/cli install layout" >&2
|
|
|
|
|
- echo 'export PATH="$HOME/.local/bin:$PATH"' >> /home/grok/.bashrc
|