@clipboard-health/groundcrew 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTEXT.md +6 -6
- package/README.md +33 -29
- package/configExample.ts +14 -14
- package/package.json +3 -3
- package/src/cli.js +10 -10
- package/src/cli.js.map +1 -1
- package/src/commands/doctor.js +6 -4
- package/src/commands/doctor.js.map +1 -1
- package/src/commands/remoteSetup.d.ts +49 -0
- package/src/commands/{spriteSetup.js → remoteSetup.js} +229 -215
- package/src/commands/remoteSetup.js.map +1 -0
- package/src/commands/setupWorkspace.js +15 -13
- package/src/commands/setupWorkspace.js.map +1 -1
- package/src/index.d.ts +2 -2
- package/src/index.js +1 -1
- package/src/index.js.map +1 -1
- package/src/lib/boardSource.js +1 -1
- package/src/lib/buildSecrets.d.ts +5 -0
- package/src/lib/buildSecrets.js +6 -0
- package/src/lib/buildSecrets.js.map +1 -0
- package/src/lib/config.d.ts +14 -19
- package/src/lib/config.js +48 -69
- package/src/lib/config.js.map +1 -1
- package/src/lib/launchCommand.d.ts +7 -11
- package/src/lib/launchCommand.js +14 -23
- package/src/lib/launchCommand.js.map +1 -1
- package/src/lib/localRunner.js +1 -1
- package/src/lib/localRunner.js.map +1 -1
- package/src/lib/remoteSetupCommand.d.ts +1 -0
- package/src/lib/remoteSetupCommand.js +32 -0
- package/src/lib/remoteSetupCommand.js.map +1 -0
- package/src/lib/shell.d.ts +6 -0
- package/src/lib/shell.js +9 -0
- package/src/lib/shell.js.map +1 -0
- package/src/lib/spriteRemoteRunnerProvider.d.ts +68 -0
- package/src/lib/spriteRemoteRunnerProvider.js +273 -0
- package/src/lib/spriteRemoteRunnerProvider.js.map +1 -0
- package/src/lib/worktrees.d.ts +8 -6
- package/src/lib/worktrees.js +56 -128
- package/src/lib/worktrees.js.map +1 -1
- package/src/commands/spriteSetup.d.ts +0 -49
- package/src/commands/spriteSetup.js.map +0 -1
package/CONTEXT.md
CHANGED
|
@@ -7,13 +7,13 @@ Six nouns that are collision-prone in this codebase. Use them precisely; don't s
|
|
|
7
7
|
The directory an agent works in for a single ticket. Two kinds, one concept:
|
|
8
8
|
|
|
9
9
|
- **Host worktree** — a `git worktree add`'d sibling at `<projectDir>/<repo>-<TICKET>/`. Visible to the host's `git worktree list --porcelain`.
|
|
10
|
-
- **
|
|
10
|
+
- **Remote worktree** — a remote git worktree under `remote.worktreeRoot` on the configured remote runner. Tracked by groundcrew in `remote-worktrees.json`; not visible to the host's `git worktree list --porcelain`.
|
|
11
11
|
|
|
12
12
|
Lifecycle and lookup live in `src/lib/worktrees.ts`. Callers ask `worktrees.create(spec)` / `worktrees.findByTicket(...)` / `worktrees.remove(entry)` / `worktrees.teardown(entries)` and never branch on the kind themselves — the module dispatches.
|
|
13
13
|
|
|
14
|
-
Branch name is `<os-username>-<ticket-lowercased>`. One ticket can have at most one worktree per kind; local host and
|
|
14
|
+
Branch name is `<os-username>-<ticket-lowercased>`. One ticket can have at most one worktree per kind; local host and remote worktrees can coexist when a ticket moves between runners. `list()` returns host and remote worktrees, and intentionally ignores legacy `.sbx` directories.
|
|
15
15
|
|
|
16
|
-
`teardown(entries)` is the destructive lifecycle for a Worktree paired with its Workspace. It closes the live Workspace (deduped per ticket so host and
|
|
16
|
+
`teardown(entries)` is the destructive lifecycle for a Worktree paired with its Workspace. It closes the live Workspace (deduped per ticket so host and remote entries share one close) before removing each Worktree, and survives per-entry failures, returning a structured result. The order is non-negotiable: the Workspace must close while its underlying directory and branch still exist, or the user is left with a zombie Workspace. Cleaner's per-iteration sweep, the `crew cleanup` CLI, and `setupWorkspace`'s rollback path all route through this one operation.
|
|
17
17
|
|
|
18
18
|
## Workspace
|
|
19
19
|
|
|
@@ -22,7 +22,7 @@ The host-side terminal session that runs an agent for one ticket. Two kinds, one
|
|
|
22
22
|
- **cmux workspace** — a pane/tab in [cmux](https://github.com/clayton-cole/cmux). macOS-only.
|
|
23
23
|
- **tmux workspace** — a window inside a dedicated `groundcrew` tmux session. Linux/macOS.
|
|
24
24
|
|
|
25
|
-
Every provisioned ticket gets one workspace, named with the ticket id (`TEAM-220`). Tracked by ticket, not by worktree kind — there is one workspace per ticket regardless of host vs
|
|
25
|
+
Every provisioned ticket gets one workspace, named with the ticket id (`TEAM-220`). Tracked by ticket, not by worktree kind — there is one workspace per ticket regardless of host vs remote runner.
|
|
26
26
|
|
|
27
27
|
Lifecycle and lookup live in `src/lib/workspaces.ts`. Callers ask `workspaces.open(spec)` / `workspaces.probe()` / `workspaces.close(name)` and never branch on the kind themselves — the module dispatches via the resolved adapter (`workspaceKind` config + host capabilities). `probe()` returns a typed `WorkspaceProbe` (`{ kind: "ok"; names }` or `{ kind: "unavailable"; error? }`) so callers don't re-invent a sentinel when the adapter binary is flaky.
|
|
28
28
|
|
|
@@ -33,9 +33,9 @@ Lifecycle and lookup live in `src/lib/workspaces.ts`. Callers ask `workspaces.op
|
|
|
33
33
|
The environment that executes the agent command for a ticket.
|
|
34
34
|
|
|
35
35
|
- **Local runner** — macOS only. Groundcrew requires `safehouse` on `PATH`, starts `clearance`, and launches the model command through `safehouse-clearance` inside the host worktree.
|
|
36
|
-
- **
|
|
36
|
+
- **Remote runner** — remote Linux, currently backed by the Sprite provider. Tickets labeled `agent-remote` keep the workspace local but run repository setup and the agent command inside the configured remote runner.
|
|
37
37
|
|
|
38
|
-
There is no `models.isolation` strategy, Docker Sandboxes runner, or direct local runner. Linux/WSL users run tickets through
|
|
38
|
+
There is no `models.isolation` strategy, Docker Sandboxes runner, or Linux/WSL direct local runner. macOS local runs use the local runner; Linux/WSL users run tickets through the configured remote runner. Legacy `.sbx` worktrees and persistent Docker Sandboxes state are no longer discovered or cleaned up by groundcrew; users remove old state manually with `sbx` if needed.
|
|
39
39
|
|
|
40
40
|
## Dispatcher
|
|
41
41
|
|
package/README.md
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
<h1 align="center">groundcrew</h1>
|
|
2
|
+
<p align="center">
|
|
3
|
+
<img alt="Groundcrew logo." height="250px" src="../../static/groundcrew.svg">
|
|
4
|
+
</p>
|
|
2
5
|
|
|
3
6
|
Watch a Linear project and farm out ready tickets to coding-agent CLIs running in workspaces backed by git worktrees. Workspaces are [`cmux`](https://github.com/clayton-cole/cmux) panes on macOS or `tmux` windows on Linux/macOS.
|
|
4
7
|
|
|
@@ -12,7 +15,7 @@ This installs the `crew` binary. `@clipboard-health/clearance` is pulled in tran
|
|
|
12
15
|
|
|
13
16
|
## Quickstart
|
|
14
17
|
|
|
15
|
-
1. **Install prereqs.** Node 24, `git`, `cmux` _or_ `tmux`, and the agent CLIs themselves (`claude`, `codex`, `cursor-agent`, ...). Local runs require macOS with [Safehouse](https://agent-safehouse.dev/) on `PATH`; Linux/WSL hosts must run tickets
|
|
18
|
+
1. **Install prereqs.** Node 24, `git`, `cmux` _or_ `tmux`, and the agent CLIs themselves (`claude`, `codex`, `cursor-agent`, ...). Local runs require macOS with [Safehouse](https://agent-safehouse.dev/) on `PATH`; Linux/WSL hosts must run tickets through the configured remote runner by adding the `agent-remote` label. Sprite is currently the only remote provider. Optional: `codexbar` for session-usage gating. The `workspaceKind` config key picks the workspace backend (`auto` resolves to cmux when installed, else tmux).
|
|
16
19
|
|
|
17
20
|
2. **Create a Linear project to scope your work.** Any team works — make a project inside it and drop tickets in. The orchestrator polls by project, not by team, so you don't need a dedicated team.
|
|
18
21
|
|
|
@@ -43,8 +46,8 @@ This installs the `crew` binary. `@clipboard-health/clearance` is pulled in tran
|
|
|
43
46
|
|
|
44
47
|
5. **Prepare the runner and agent auth.** Groundcrew supports one local runner and one remote runner:
|
|
45
48
|
- macOS local: `cmux` or `tmux` workspace, Safehouse on `PATH`, `clearance`, and locally authenticated agent CLIs.
|
|
46
|
-
- macOS remote: local `cmux` or `tmux` workspace that launches
|
|
47
|
-
- Linux/WSL remote: `tmux` workspace that launches
|
|
49
|
+
- macOS remote: local `cmux` or `tmux` workspace that launches the configured remote runner.
|
|
50
|
+
- Linux/WSL remote: `tmux` workspace that launches the configured remote runner. Label tickets `agent-remote`; local execution is not supported.
|
|
48
51
|
|
|
49
52
|
Local setup fails before creating a worktree when the host is not macOS or `safehouse` is missing. `models.isolation`, per-model `isolation`, and per-model `sandbox` are legacy keys and now fail config validation.
|
|
50
53
|
|
|
@@ -64,10 +67,10 @@ This installs the `crew` binary. `@clipboard-health/clearance` is pulled in tran
|
|
|
64
67
|
|
|
65
68
|
Watch `${XDG_CACHE_HOME:-$HOME/.cache}/clearance/clearance.log` for `DENY` lines and add only the domains your agents actually need.
|
|
66
69
|
|
|
67
|
-
7. **Optional: prepare a remote
|
|
70
|
+
7. **Optional: prepare a remote runner.** The current remote provider is Sprite, so setup is intentionally explicit: choose which agent CLIs and MCP servers to authenticate. `--mcp` only adds the servers you name; it does not attempt to authenticate every MCP server visible in your Claude account.
|
|
68
71
|
|
|
69
72
|
```bash
|
|
70
|
-
crew
|
|
73
|
+
crew remote setup crew-claude-1 \
|
|
71
74
|
--claude \
|
|
72
75
|
--codex \
|
|
73
76
|
--copy-local-codex-auth \
|
|
@@ -79,18 +82,18 @@ This installs the `crew` binary. `@clipboard-health/clearance` is pulled in tran
|
|
|
79
82
|
--checkpoint
|
|
80
83
|
```
|
|
81
84
|
|
|
82
|
-
Known MCP aliases are `linear`, `slack`, and `notion`. For another HTTP MCP server, pass `--mcp name=https://example.com/mcp`. The command creates the
|
|
85
|
+
Known MCP aliases are `linear`, `slack`, and `notion`. For another HTTP MCP server, pass `--mcp name=https://example.com/mcp`. The command creates the remote runner if needed, prepares `~/dev`, configures Git, runs selected auth flows, adds selected MCP servers to Claude Code, and then opens Claude so you can run `/mcp` and authenticate only those selected servers. With the Sprite provider, `--copy-local-codex-auth` copies `${CODEX_HOME:-$HOME/.codex}/auth.json` into `/home/sprite/.codex/auth.json` and then verifies `codex login status`; it never prints the file contents. Use `--skip-mcp-auth` when you only want to add MCP definitions, and run the `/mcp` step later.
|
|
83
86
|
|
|
84
|
-
Repo setup is separate from runner setup and should run after the ticket branch exists, immediately before launching an agent. It clones/fetches the repo in the
|
|
87
|
+
Repo setup is separate from runner setup and should run after the ticket branch exists, immediately before launching an agent. It clones/fetches the repo in the remote runner, checks out the requested branch (creating it from the base branch when it does not exist on origin), forwards only build-time secrets for the dependency install, removes the temporary secret file, clears those env vars, and then exits. It uses groundcrew's remote setup command.
|
|
85
88
|
|
|
86
89
|
```bash
|
|
87
90
|
op run --env-file "${XDG_CONFIG_HOME:-$HOME/.config}/groundcrew/op.env" -- \
|
|
88
|
-
crew
|
|
91
|
+
crew remote bootstrap crew-claude-1 core-utils --branch rocky-team-123
|
|
89
92
|
```
|
|
90
93
|
|
|
91
94
|
By default bootstrap forwards any locally set `NPM_TOKEN` and `BUF_TOKEN`. Use repeated `--secret <ENV_NAME>` to require a specific set, or `--no-secrets` for public installs. Do not checkpoint after repo bootstrap; dependency state is branch-specific and should be refreshed per ticket.
|
|
92
95
|
|
|
93
|
-
To run a ticket remotely through the orchestrator or `crew run --ticket`, label it with `agent-remote` plus the agent label you want, for example `agent-claude` or `agent-codex`. `agent-remote` alone uses `models.default`. Groundcrew keeps cmux/tmux local, creates a per-ticket git worktree in the
|
|
96
|
+
To run a ticket remotely through the orchestrator or `crew run --ticket`, label it with `agent-remote` plus the agent label you want, for example `agent-claude` or `agent-codex`. `agent-remote` alone uses `models.default`. Groundcrew keeps cmux/tmux local, creates a per-ticket git worktree in the remote runner under `remote.worktreeRoot`, and asks the configured provider to launch the agent. The Sprite provider emits `sprite exec --tty`. Use `crew remote sessions [<runner-name>]` to inspect active remote sessions and `crew remote attach <session-id-or-command> [--runner <runner-name>]` to attach to one; both commands default to `remote.runnerName` when the runner name is omitted.
|
|
94
97
|
|
|
95
98
|
8. **Run.** Doctor first, then a dry run, then the real thing:
|
|
96
99
|
|
|
@@ -114,50 +117,51 @@ Required fields are marked **required**; everything else has a default and can b
|
|
|
114
117
|
| `linear.statuses.terminal` | `["Done"]` | Additional status names treated as terminal for cleanup, board remaining counts, and blocker checks. The `done` status is always included. |
|
|
115
118
|
| `git.remote` | `"origin"` | Remote used for `fetch` and as the worktree base ref. |
|
|
116
119
|
| `git.defaultBranch` | `"main"` | Branch fetched from `git.remote` and used as the worktree base. |
|
|
117
|
-
| `workspace.projectDir` | **required** | Parent dir for cloned repos and local sibling ticket worktrees.
|
|
120
|
+
| `workspace.projectDir` | **required** | Parent dir for cloned repos and local sibling ticket worktrees. Remote ticket worktrees live in `remote.worktreeRoot` on the remote runner. |
|
|
118
121
|
| `workspace.knownRepositories` | **required** | Repos searched for in ticket descriptions to infer where work belongs. A ticket labeled for groundcrew (`agent-*`) fails fast when no known repo appears; unlabeled tickets are ignored. |
|
|
119
122
|
| `orchestrator.maximumInProgress` | `4` | Cap on tickets in `linear.statuses.inProgress` at once. |
|
|
120
123
|
| `orchestrator.pollIntervalMilliseconds` | `120_000` | Poll interval in `--watch` mode. |
|
|
121
124
|
| `orchestrator.sessionLimitPercentage` | `85` | Number in `(0, 100]`. A model whose codexbar session window exceeds this percentage is skipped that tick. |
|
|
122
125
|
| `models.default` | `"claude"` | Tiebreak for `agent-any` resolution and fallback for explicit but unknown `agent-*` labels. Also used by `crew setup <TICKET>` for unlabeled tickets. `crew run` ignores unlabeled tickets and does not apply this default. Must exist in `models.definitions`. |
|
|
123
126
|
| `models.definitions` | `{ claude, codex }` | Agent definitions. Additive merge with shipped defaults. |
|
|
124
|
-
| `models.definitions.<name>.cmd` | — | Shell command launched for the model. Local macOS runs execute in the worktree through Safehouse/clearance;
|
|
127
|
+
| `models.definitions.<name>.cmd` | — | Shell command launched for the model. Local macOS runs execute in the worktree through Safehouse/clearance; remote runs execute inside the remote worktree. `{{worktree}}` is replaced before launch and legacy `{{sandbox}}` expands to an empty string. |
|
|
125
128
|
| `models.definitions.<name>.color` | — | Color for the workspace status pill (cmux only; tmux silently drops it). |
|
|
126
129
|
| `models.definitions.<name>.usage` | optional | If set, codexbar usage is fetched for this model and gated by `sessionLimitPercentage`. Omit to never gate. When `usage.codexbar.source` is omitted, groundcrew uses `auto` on macOS and `cli` elsewhere. |
|
|
127
130
|
| `prompts.initial` | (template) | First message sent to the agent. Placeholders: `{{ticket}}`, `{{worktree}}`, `{{title}}`, `{{description}}`. |
|
|
128
131
|
| `workspaceKind` | `"auto"` | Terminal session manager. `"auto"` picks `cmux` when on PATH, else `tmux`. Set to `"cmux"` or `"tmux"` to fail loudly when the chosen backend is missing. tmux windows live in a dedicated `groundcrew` session. |
|
|
129
|
-
| `remote.
|
|
130
|
-
| `remote.
|
|
131
|
-
| `remote.
|
|
132
|
-
| `remote.
|
|
133
|
-
| `remote.
|
|
132
|
+
| `remote.provider` | `"sprite"` | Remote runner provider used for tickets labeled `agent-remote`. Sprite is currently the only provider. |
|
|
133
|
+
| `remote.runnerName` | `"crew-claude-1"` | Remote runner used for tickets labeled `agent-remote`. |
|
|
134
|
+
| `remote.owner` | `"ClipboardHealth"` | GitHub owner used when cloning bare repository names inside the remote runner. |
|
|
135
|
+
| `remote.repoRoot` | `"/home/sprite/dev"` | Shared clone root inside the remote runner. |
|
|
136
|
+
| `remote.worktreeRoot` | `"/home/sprite/groundcrew/worktrees"` | Per-ticket remote worktree root inside the remote runner. |
|
|
137
|
+
| `remote.secretNames` | `["NPM_TOKEN", "BUF_TOKEN"]` | Build-only env vars that may be uploaded for remote dependency setup, then unset before the agent process starts. |
|
|
134
138
|
| `logging.file` | XDG state path | Append-mode log file destination. `log()` / `logEvent()` tee here in addition to stdout, so a vanished workspace doesn't take the evidence with it. Defaults to `${XDG_STATE_HOME:-$HOME/.local/state}/groundcrew/groundcrew.log`. |
|
|
135
139
|
|
|
136
|
-
The branch prefix (`<prefix>-<TICKET>`) is derived from your OS username (`os.userInfo().username`), not configured. Agent selection looks for a top-level Linear label named `agent-<model>` (e.g. `agent-claude`, `agent-codex`). Add `agent-remote` to run that ticket in the configured
|
|
140
|
+
The branch prefix (`<prefix>-<TICKET>`) is derived from your OS username (`os.userInfo().username`), not configured. Agent selection looks for a top-level Linear label named `agent-<model>` (e.g. `agent-claude`, `agent-codex`). Add `agent-remote` to run that ticket in the configured remote runner instead of locally; `agent-remote` is a modifier label, not a model. **`crew run` only fetches tickets with an `agent-*` label** — the GraphQL query filters them server-side, so unlabeled tickets are never returned by Linear's API and do not appear in the rendered board. Use `crew setup <TICKET>` to provision an unlabeled ticket on demand (manual setup falls back to `models.default`). The reserved label `agent-any` routes the ticket to the configured model with the most available session capacity (lowest codexbar session-used percent), skipping any model already over `sessionLimitPercentage`. With no usage data, `agent-any` resolves to `models.default`. The name `any` cannot be used in `models.definitions`. Todo tickets blocked by Linear issues that are not in `linear.statuses.terminal` are skipped until their blockers reach a terminal status.
|
|
137
141
|
|
|
138
142
|
## Manual commands
|
|
139
143
|
|
|
140
144
|
```bash
|
|
141
|
-
crew
|
|
142
|
-
crew
|
|
143
|
-
crew
|
|
144
|
-
crew
|
|
145
|
-
crew
|
|
146
|
-
crew
|
|
145
|
+
crew remote setup crew-claude-1 --claude --codex --copy-local-codex-auth --github --mcp linear --checkpoint
|
|
146
|
+
crew remote bootstrap crew-claude-1 core-utils --branch rocky-team-123
|
|
147
|
+
crew remote sessions
|
|
148
|
+
crew remote attach <session-id-or-command> --runner crew-claude-1
|
|
149
|
+
crew remote ps crew-claude-1
|
|
150
|
+
crew remote interrupt <process-group-id> --runner crew-claude-1
|
|
147
151
|
crew run --ticket <TICKET>
|
|
148
152
|
crew cleanup <TICKET>
|
|
149
153
|
```
|
|
150
154
|
|
|
151
|
-
`crew run --ticket <TICKET>` provisions a single ticket the same way the orchestrator would: the repo is parsed from the ticket's Linear description, the model comes from the ticket's `agent-*` label, and `agent-remote` is honored. If the description does not mention a repo from `workspace.knownRepositories`, setup fails before provisioning. `--watch` and `--ticket` are mutually exclusive — `--watch` drives the orchestrator loop; `--ticket` provisions one ticket and exits. `crew cleanup <TICKET>` resolves to every tracked worktree carrying that ticket id (host and
|
|
155
|
+
`crew run --ticket <TICKET>` provisions a single ticket the same way the orchestrator would: the repo is parsed from the ticket's Linear description, the model comes from the ticket's `agent-*` label, and `agent-remote` is honored. If the description does not mention a repo from `workspace.knownRepositories`, setup fails before provisioning. `--watch` and `--ticket` are mutually exclusive — `--watch` drives the orchestrator loop; `--ticket` provisions one ticket and exits. `crew cleanup <TICKET>` resolves to every tracked worktree carrying that ticket id (host and remote kinds, across repos) and tears them all down. To inspect remote sessions, run `crew remote sessions` or pass an explicit runner name. To attach to a listed session id or command selector, run `crew remote attach <session-id-or-command>`. If an attached agent appears stuck in a long-running shell tool, use `crew remote ps <runner-name>` to find the child process group (`PGID`) under the agent, then use `crew remote interrupt <PGID> --runner <runner-name>` to send SIGINT to that child command without killing the agent session. With the Sprite provider, if cleanup cannot remove a remote worktree because the agent is still running, stop that session with `sprite sessions kill -s crew-claude-1 <session-id>` and retry cleanup. To inspect codexbar session windows directly, run `codexbar usage`; the orchestrator already gates on this internally via `orchestrator.sessionLimitPercentage`.
|
|
152
156
|
|
|
153
157
|
## Gotchas
|
|
154
158
|
|
|
155
|
-
- **Local execution is macOS plus Safehouse only.** There is no `models.isolation` strategy and no direct local execution mode. On Linux/WSL, label tickets `agent-remote` and run them through
|
|
159
|
+
- **Local execution is macOS plus Safehouse only.** There is no `models.isolation` strategy and no direct local execution mode. On Linux/WSL, label tickets `agent-remote` and run them through the configured remote runner.
|
|
156
160
|
- **Safehouse-already-wrapped commands are not re-wrapped.** If a `models.definitions.<name>.cmd` already starts with `safehouse`, groundcrew assumes that command owns its Safehouse flags and does not add the `safehouse-clearance` wrapper a second time. Changing the proxy's allowlist after it's running requires killing the PID in `${XDG_CACHE_HOME:-$HOME/.cache}/clearance/clearance.pid` so the next launch picks up the new env.
|
|
157
161
|
- **Legacy Docker Sandboxes state is unmanaged.** Groundcrew no longer discovers or cleans `.sbx` worktrees or persistent Docker Sandboxes containers. If you have old state, inspect and remove it manually with `sbx`.
|
|
158
|
-
- **
|
|
159
|
-
- **Long-running remote shell tools block agent input.** Claude Code and similar TUI agents cannot accept a new prompt while one of their shell tools is still running. Use `crew
|
|
160
|
-
- **Codex auth in
|
|
162
|
+
- **Remote cleanup is also conservative.** `crew cleanup` removes tracked remote worktrees and branches, but it does not kill active remote sessions. Use `crew remote sessions [<runner-name>]` to inspect sessions and, with the Sprite provider, `sprite sessions kill -s <runner-name> <session-id>` when Git reports a worktree is busy.
|
|
163
|
+
- **Long-running remote shell tools block agent input.** Claude Code and similar TUI agents cannot accept a new prompt while one of their shell tools is still running. Use `crew remote ps <runner-name>` to inspect the remote process tree; interrupt the tool's child `PGID`, not the agent session `PGID`, with `crew remote interrupt <PGID> --runner <runner-name>`.
|
|
164
|
+
- **Codex auth in remote runners may need auth-file copy.** If `crew remote setup <runner-name> --codex` finishes interactive login but `codex login status` still fails inside the remote runner, rerun with `--copy-local-codex-auth` after confirming local Codex auth works.
|
|
161
165
|
- **Usage source defaults are OS-aware.** `codexbar` usage uses `--source auto` on macOS so CodexBar can prefer account/web sources and fall back as it supports. On Linux/WSL it uses `--source cli`, so install the CodexBar Linux CLI and authenticate the provider CLIs inside that environment.
|
|
162
166
|
- **Status names matter.** If your team uses `Started` instead of `In Progress`, set `linear.statuses.inProgress = "Started"`.
|
|
163
167
|
- **Leaf-only.** Parent issues with children are ignored — sub-issues are the work items.
|
package/configExample.ts
CHANGED
|
@@ -39,7 +39,7 @@ export const config: Config = {
|
|
|
39
39
|
// // re-declare those keys here. Add a third agent (e.g. `cursor`) by
|
|
40
40
|
// // dropping it in this map and tagging tickets with `agent-cursor`.
|
|
41
41
|
// // Local runs on macOS are always wrapped with Safehouse/clearance.
|
|
42
|
-
// // Linux/WSL users should label tickets `agent-remote` to use
|
|
42
|
+
// // Linux/WSL users should label tickets `agent-remote` to use the remote runner.
|
|
43
43
|
// definitions: {
|
|
44
44
|
// cursor: {
|
|
45
45
|
// cmd: "cursor-agent",
|
|
@@ -65,19 +65,19 @@ export const config: Config = {
|
|
|
65
65
|
// workspaceKind: "auto",
|
|
66
66
|
//
|
|
67
67
|
// remote: {
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
//
|
|
68
|
+
// // Provider implementation. Sprite is currently the only provider.
|
|
69
|
+
// provider: "sprite",
|
|
70
|
+
// // Tickets labeled `agent-remote` run through this shared remote runner.
|
|
71
|
+
// runnerName: "crew-claude-1",
|
|
72
|
+
// // Bare repository names are cloned as `${owner}/${repo}` inside the remote runner.
|
|
73
|
+
// owner: "ClipboardHealth",
|
|
74
|
+
// // Absolute paths inside the remote runner. Groundcrew creates one shared
|
|
75
|
+
// // clone per repo and one remote git worktree per ticket.
|
|
76
|
+
// repoRoot: "/home/sprite/dev",
|
|
77
|
+
// worktreeRoot: "/home/sprite/groundcrew/worktrees",
|
|
78
|
+
// // Build-only env vars forwarded for remote dependency setup, then
|
|
79
|
+
// // unset before the agent process starts.
|
|
80
|
+
// secretNames: ["NPM_TOKEN", "BUF_TOKEN"],
|
|
81
81
|
// },
|
|
82
82
|
//
|
|
83
83
|
// logging: {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clipboard-health/groundcrew",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Linear-driven orchestrator that launches AI coding agents in git worktrees, with workspace lifecycle,
|
|
3
|
+
"version": "1.7.0",
|
|
4
|
+
"description": "Linear-driven orchestrator that launches AI coding agents in git worktrees, with workspace lifecycle, remote runners, and usage tracking.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|
|
7
7
|
"ai",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"access": "public"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@clipboard-health/clearance": "1.0.
|
|
40
|
+
"@clipboard-health/clearance": "1.0.4",
|
|
41
41
|
"@linear/sdk": "84.0.0",
|
|
42
42
|
"tslib": "2.8.1"
|
|
43
43
|
},
|
package/src/cli.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { cleanupWorkspaceCli } from "./commands/cleanupWorkspace.js";
|
|
2
2
|
import { doctor } from "./commands/doctor.js";
|
|
3
3
|
import { orchestrate } from "./commands/orchestrator.js";
|
|
4
|
+
import { remoteCli } from "./commands/remoteSetup.js";
|
|
4
5
|
import { setupWorkspaceCli } from "./commands/setupWorkspace.js";
|
|
5
|
-
import { spriteCli } from "./commands/spriteSetup.js";
|
|
6
6
|
import { errorMessage, writeError, writeOutput } from "./lib/util.js";
|
|
7
7
|
async function runCli(argv) {
|
|
8
8
|
let watch = false;
|
|
@@ -58,15 +58,15 @@ const SUBCOMMANDS = {
|
|
|
58
58
|
usage: "[--force] <ticket>",
|
|
59
59
|
invoke: cleanupWorkspaceCli,
|
|
60
60
|
},
|
|
61
|
-
|
|
62
|
-
summary: "Create, authenticate, bootstrap, and inspect a remote
|
|
63
|
-
usage: "setup <
|
|
64
|
-
" → crew
|
|
65
|
-
" → crew
|
|
66
|
-
" → crew
|
|
67
|
-
" → crew
|
|
68
|
-
" → crew
|
|
69
|
-
invoke:
|
|
61
|
+
remote: {
|
|
62
|
+
summary: "Create, authenticate, bootstrap, and inspect a remote runner",
|
|
63
|
+
usage: "setup <runner-name> [--claude] [--github] [--mcp <alias|name=url>] [--checkpoint]\n" +
|
|
64
|
+
" → crew remote bootstrap <runner-name> <repo> [--branch <branch>]\n" +
|
|
65
|
+
" → crew remote sessions [<runner-name>]\n" +
|
|
66
|
+
" → crew remote attach <session-id-or-command> [--runner <runner-name>]\n" +
|
|
67
|
+
" → crew remote ps [<runner-name>]\n" +
|
|
68
|
+
" → crew remote interrupt <process-group-id> [--runner <runner-name>]",
|
|
69
|
+
invoke: remoteCli,
|
|
70
70
|
},
|
|
71
71
|
};
|
|
72
72
|
function printHelp() {
|
package/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../packages/groundcrew/src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../packages/groundcrew/src/cli.ts"],"names":[],"mappings":"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"}
|
package/src/commands/doctor.js
CHANGED
|
@@ -89,8 +89,8 @@ function commandTokensToCheck(cmd) {
|
|
|
89
89
|
function gatherToolTokens(config) {
|
|
90
90
|
const all = new Set();
|
|
91
91
|
for (const definition of Object.values(config.models.definitions)) {
|
|
92
|
-
// Local runs execute the agent command on the host;
|
|
93
|
-
// same command
|
|
92
|
+
// Local runs execute the agent command on the host; remote runs need the
|
|
93
|
+
// same command in the remote runner, but doctor cannot know ticket labels in advance.
|
|
94
94
|
for (const token of commandTokensToCheck(definition.cmd)) {
|
|
95
95
|
all.add(token);
|
|
96
96
|
}
|
|
@@ -150,7 +150,9 @@ export async function doctor() {
|
|
|
150
150
|
for (const token of toolTokens) {
|
|
151
151
|
const required = localCapability.ok;
|
|
152
152
|
// oxlint-disable-next-line no-await-in-loop -- doctor reports tools in deterministic order
|
|
153
|
-
const check = await checkCmd(token, required, required
|
|
153
|
+
const check = await checkCmd(token, required, required
|
|
154
|
+
? undefined
|
|
155
|
+
: "required for local runs; remote runs need this inside the remote runner");
|
|
154
156
|
checks.push(check);
|
|
155
157
|
}
|
|
156
158
|
if (anyModelUsesUsage(config)) {
|
|
@@ -177,7 +179,7 @@ function localCapabilityCheck(host) {
|
|
|
177
179
|
name: "local runner (macOS + Safehouse)",
|
|
178
180
|
ok: false,
|
|
179
181
|
required: false,
|
|
180
|
-
hint: "required for local runs; on Linux/WSL use agent-remote with
|
|
182
|
+
hint: "required for local runs; on Linux/WSL use agent-remote with the remote runner",
|
|
181
183
|
};
|
|
182
184
|
}
|
|
183
185
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../../../packages/groundcrew/src/commands/doctor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../../../packages/groundcrew/src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface McpServer {
|
|
2
|
+
name: string;
|
|
3
|
+
url: string;
|
|
4
|
+
}
|
|
5
|
+
export interface RemoteSetupOptions {
|
|
6
|
+
runnerName: string;
|
|
7
|
+
shouldCreate: boolean;
|
|
8
|
+
shouldAuthenticateClaude: boolean;
|
|
9
|
+
shouldAuthenticateCodex: boolean;
|
|
10
|
+
shouldCopyLocalCodexAuth?: boolean;
|
|
11
|
+
shouldAuthenticateGithub: boolean;
|
|
12
|
+
shouldAuthenticateMcp: boolean;
|
|
13
|
+
shouldCheckpoint: boolean;
|
|
14
|
+
checkpointComment: string;
|
|
15
|
+
gitName?: string;
|
|
16
|
+
gitEmail?: string;
|
|
17
|
+
mcpServers: McpServer[];
|
|
18
|
+
}
|
|
19
|
+
export interface RemoteBootstrapOptions {
|
|
20
|
+
runnerName: string;
|
|
21
|
+
repository: string;
|
|
22
|
+
owner: string;
|
|
23
|
+
baseBranch: string;
|
|
24
|
+
secretNames: string[];
|
|
25
|
+
shouldRequireSelectedSecrets: boolean;
|
|
26
|
+
shouldUseSecrets: boolean;
|
|
27
|
+
branchName?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface RemoteSessionsOptions {
|
|
30
|
+
runnerName?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface RemoteAttachOptions {
|
|
33
|
+
target: string;
|
|
34
|
+
runnerName?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface RemoteProcessOptions {
|
|
37
|
+
runnerName?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface RemoteInterruptOptions {
|
|
40
|
+
processGroupId: string;
|
|
41
|
+
runnerName?: string;
|
|
42
|
+
}
|
|
43
|
+
export declare function bootstrapRemoteRepository(options: RemoteBootstrapOptions): Promise<void>;
|
|
44
|
+
export declare function listRemoteSessions(options: RemoteSessionsOptions): Promise<void>;
|
|
45
|
+
export declare function attachRemoteSession(options: RemoteAttachOptions): Promise<void>;
|
|
46
|
+
export declare function listRemoteProcesses(options: RemoteProcessOptions): Promise<void>;
|
|
47
|
+
export declare function interruptRemoteProcessGroup(options: RemoteInterruptOptions): Promise<void>;
|
|
48
|
+
export declare function setupRemoteRunner(options: RemoteSetupOptions): Promise<void>;
|
|
49
|
+
export declare function remoteCli(argv: string[]): Promise<void>;
|