Sandboxes

One-Tap Commands with actions.json

actions.json is for the developer tasks you run by hand — test suites, linters, code generators, database resets, dev-server restarts. List them once, commit, and they're one tap away from your phone.

Drop a small actions.json file at the root of your repository and RepoGo shows an Actions entry in the chat menu for that workspace. Open it and every command you listed is a row with a Run button. Tap one — or several at once — and RepoGo runs each command on your connected environment, shows a live spinner while it works, and tells you how it ended: a green alert with Exit code 0 on success, a red one with the exit code on failure.

No file yet? You don't have to leave the app. Open Actions on a project with no actions.json and there's a Create actions.json button — one tap writes a starter file at the repo root and drops you straight into the editor on it. Once a file exists, the pencil in the Actions header reopens it (and lets you pick, if your repo has more than one).

A quick example#

Create a file named actions.json at the root of your repository:

json
{
  "actions": [
    { "name": "test", "label": "Run Tests", "cmd": "npm test" }
  ]
}

Commit it, open the project in RepoGo, and tap the menu in the chat header. You'll see Actions → a Run Tests row. Tap Run: the command executes in your environment, the row spins while it works, and when it exits you get the result — the exit code, how long it took, and the full output a tap away.

Actions run only when you ask. Nothing in actions.json runs on its own — not on boot, not on file changes. One tap, one run.

How it works#

  1. You commit actions.json to your repo root. It lives with your code, so it's the same on every clone and can differ per branch.
  2. RepoGo reads it when you open Actions. The Actions item is always in the chat menu for a connected environment; with no file yet it offers to create one.
  3. A tap runs the command in your environment's shell — your Mac (via RepoGo Host) or your cloud sandbox — from the folder you specify.
  4. The exit code decides the outcome. Exit 0 shows a green success alert; anything else shows a red alert with the code. Each row also keeps its result — exit code, duration, and the command's stdout/stderr — so you can expand it and read exactly what happened.

Run as many as you like in parallel: each row has its own spinner and its own result. Kicking off the test suite doesn't block you from running codegen next to it.

The file in full#

json
{
  "actions": [
    {
      "name": "test",
      "label": "Run Tests",
      "cmd": "npm test",
      "cwd": "apps/web",
      "timeoutMs": 300000
    },
    { "name": "gen", "label": "Generate API Client", "cmd": "npm run gen:api" }
  ]
}

Fields#

FieldRequiredWhat it does
nameYesA short, stable id for the action. Use lowercase letters, numbers, and dashes.
cmdYesThe command to run. It executes in a shell, so pipes, $VARS, &&, and scripts all work. Its exit code decides success (0) or failure (anything else).
labelNoThe text shown on the row. Defaults to name — use it for something friendlier, like "Run Tests" instead of test.
cwdNoThe folder to run in, relative to your repo root. Leave it out to run at the root. Handy in monorepos: apps/web.
timeoutMsNoHow long the command may run, in milliseconds. Defaults to 30 seconds — set this higher for long tasks like test suites (e.g. 300000 for 5 minutes). Detached actions are capped at 10 minutes.
detachNoSet true to fire-and-forget: RepoGo starts the command and returns immediately, and the row shows a Stop button instead of a result. Good for "kick it off and move on" tasks. Detached runs report no output or exit code, and are stopped automatically after 10 minutes at most.

A few things to know:

  • Every actions.json in the repo counts. RepoGo searches subfolders too and shows them all together, labeled by the folder they came from — so a monorepo can keep each app's actions next to that app.
  • Entries missing name or cmd are skipped, and each file caps at 20 actions.
  • Fire-and-await, or fire-and-forget. A normal action blocks until it finishes and reports its exit code. A detach: true action starts and immediately hands you a Stop button — you can stop it any time (even after closing and reopening the app), but you won't get a completion alert. Neither is a service: for long-lived dev servers and watchers, use environment.json instead.

Actions vs. tests vs. services#

You want to…Use
Start dev servers automatically when the environment wakesenvironment.json
Trigger a task on demand (tests, lint, codegen, reset)actions.json

Both live in your repo, so setting up a new project is just: add the file, commit, done.