@clipboard-health/groundcrew 4.27.0 → 4.28.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/README.md +22 -16
- package/crew.config.example.ts +4 -4
- package/package.json +2 -2
- package/static/groundcrew-avatar.png +0 -0
- package/static/groundcrew-mark.svg +20 -23
- package/static/groundcrew-wordmark.svg +30 -0
- package/static/groundcrew-emoji.gif +0 -0
- package/static/groundcrew-wordmark-dark.svg +0 -38
- package/static/groundcrew-wordmark-light.svg +0 -38
package/README.md
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<
|
|
3
|
-
<source media="(prefers-color-scheme: dark)" srcset="./static/groundcrew-wordmark-dark.svg">
|
|
4
|
-
<img alt="groundcrew" src="./static/groundcrew-wordmark-light.svg" height="96">
|
|
5
|
-
</picture>
|
|
2
|
+
<img alt="groundcrew" src="./static/groundcrew-wordmark.svg" height="96">
|
|
6
3
|
</p>
|
|
7
4
|
|
|
8
5
|
<p align="center">
|
|
@@ -10,10 +7,10 @@
|
|
|
10
7
|
</p>
|
|
11
8
|
|
|
12
9
|
<p align="center">
|
|
13
|
-
<a href="https://www.npmjs.com/package/@clipboard-health/groundcrew"><img alt="npm" src="https://img.shields.io/npm/v/@clipboard-health/groundcrew?style=flat-square&label=npm&color=
|
|
14
|
-
<a href="https://www.npmjs.com/package/@clipboard-health/groundcrew"><img alt="downloads" src="https://img.shields.io/npm/dw/@clipboard-health/groundcrew?style=flat-square&label=downloads&color=
|
|
15
|
-
<a href="https://github.com/ClipboardHealth/groundcrew/actions/workflows/ci.yml"><img alt="ci" src="https://img.shields.io/github/actions/workflow/status/ClipboardHealth/groundcrew/ci.yml?style=flat-square&label=ci&color=77d94e&labelColor=
|
|
16
|
-
<a href="./LICENSE"><img alt="license" src="https://img.shields.io/npm/l/@clipboard-health/groundcrew?style=flat-square&label=license&color=
|
|
10
|
+
<a href="https://www.npmjs.com/package/@clipboard-health/groundcrew"><img alt="npm" src="https://img.shields.io/npm/v/@clipboard-health/groundcrew?style=flat-square&label=npm&color=F7C600&labelColor=111111"></a>
|
|
11
|
+
<a href="https://www.npmjs.com/package/@clipboard-health/groundcrew"><img alt="downloads" src="https://img.shields.io/npm/dw/@clipboard-health/groundcrew?style=flat-square&label=downloads&color=111111&labelColor=111111"></a>
|
|
12
|
+
<a href="https://github.com/ClipboardHealth/groundcrew/actions/workflows/ci.yml"><img alt="ci" src="https://img.shields.io/github/actions/workflow/status/ClipboardHealth/groundcrew/ci.yml?style=flat-square&label=ci&color=77d94e&labelColor=111111"></a>
|
|
13
|
+
<a href="./LICENSE"><img alt="license" src="https://img.shields.io/npm/l/@clipboard-health/groundcrew?style=flat-square&label=license&color=111111&labelColor=111111"></a>
|
|
17
14
|
</p>
|
|
18
15
|
|
|
19
16
|
<p align="center">
|
|
@@ -49,7 +46,7 @@ npm install -g @clipboard-health/groundcrew@latest
|
|
|
49
46
|
|
|
50
47
|
# 2. Scaffold a global config. Agents are sandboxed by default
|
|
51
48
|
# (Safehouse/Docker Sandboxes); add --runner none to run unsandboxed on the host.
|
|
52
|
-
crew init --global --project-dir ~/dev --repo OWNER/REPO --
|
|
49
|
+
crew init --global --project-dir ~/dev --repo OWNER/REPO --agent claude
|
|
53
50
|
|
|
54
51
|
# 3. Run the clone commands printed by `crew init`.
|
|
55
52
|
|
|
@@ -64,7 +61,7 @@ crew doctor
|
|
|
64
61
|
crew run --watch
|
|
65
62
|
```
|
|
66
63
|
|
|
67
|
-
`crew init --global` writes config to `${XDG_CONFIG_HOME:-$HOME/.config}/groundcrew/`. Pass `--repo` more than once for multiple repos. `--
|
|
64
|
+
`crew init --global` writes config to `${XDG_CONFIG_HOME:-$HOME/.config}/groundcrew/`. Pass `--repo` more than once for multiple repos. `--agent claude` or `--agent codex` chooses the single built-in agent preset to enable in the generated config.
|
|
68
65
|
|
|
69
66
|
## Task Pickup
|
|
70
67
|
|
|
@@ -72,8 +69,8 @@ crew run --watch
|
|
|
72
69
|
|
|
73
70
|
Linear works out of the box: assign tasks to yourself and add an `agent-*` label.
|
|
74
71
|
|
|
75
|
-
- `agent-claude`, `agent-codex`, or `agent-<name>` routes to that
|
|
76
|
-
- `agent-any` routes to the enabled
|
|
72
|
+
- `agent-claude`, `agent-codex`, or `agent-<name>` routes to that agent.
|
|
73
|
+
- `agent-any` routes to the enabled agent with the most session headroom, after skipping agents over their session limit or weekly paced budget.
|
|
77
74
|
- Tasks without an `agent-*` label are ignored by `crew run`; dispatch one manually with `crew start <TASK>`.
|
|
78
75
|
|
|
79
76
|
Groundcrew scans `workspace.knownRepositories` to infer which repo a task belongs to.
|
|
@@ -91,17 +88,19 @@ Write tasks as complete agent instructions: the goal, the context and constraint
|
|
|
91
88
|
```bash
|
|
92
89
|
crew init [--global | --local] [--force] [--dry-run] # create a crew.config.ts
|
|
93
90
|
[--project-dir <dir>] [--repo <repo>]...
|
|
94
|
-
[--runner <auto|safehouse|sdx|none>] [--
|
|
91
|
+
[--runner <auto|safehouse|sdx|none>] [--agent <claude|codex>]
|
|
95
92
|
crew doctor # check setup
|
|
93
|
+
crew source list|verify [<source>] # inspect configured task sources
|
|
96
94
|
crew task list [--source <name>] # list tasks across sources
|
|
97
95
|
crew task get <TASK> [--source <name>] [--prompt] # inspect one task or its prompt
|
|
98
96
|
crew task create "Title" --source <name> [--agent <name>] # create a source task
|
|
97
|
+
crew task validate [<source>] # validate task content
|
|
99
98
|
crew status [<TASK>] # inspect current state or one task
|
|
100
99
|
crew run [--watch] # one-shot or --watch forever
|
|
101
100
|
crew start <TASK> # provision + launch one task now
|
|
102
101
|
crew stop <TASK> [--reason <text>] # stop workspace, keep worktree
|
|
103
102
|
crew resume <TASK> # reopen a paused task
|
|
104
|
-
crew cleanup <TASK>
|
|
103
|
+
crew cleanup [--force] <TASK> # tear down every worktree for a task
|
|
105
104
|
crew upgrade [<version>] # reinstall crew globally through npm
|
|
106
105
|
```
|
|
107
106
|
|
|
@@ -109,7 +108,7 @@ See [command details](./docs/commands.md) for status output, doctor behavior, an
|
|
|
109
108
|
|
|
110
109
|
## Configuration
|
|
111
110
|
|
|
112
|
-
Workspace settings and at least one enabled
|
|
111
|
+
Workspace settings and at least one enabled agent are required; everything else has a default.
|
|
113
112
|
|
|
114
113
|
```ts
|
|
115
114
|
import type { Config } from "@clipboard-health/groundcrew";
|
|
@@ -122,7 +121,7 @@ export default {
|
|
|
122
121
|
// Strings live under projectDir; use { name, projectDirOverride } to override per repo.
|
|
123
122
|
knownRepositories: ["OWNER/REPO"],
|
|
124
123
|
},
|
|
125
|
-
|
|
124
|
+
agents: {
|
|
126
125
|
default: "claude",
|
|
127
126
|
definitions: {
|
|
128
127
|
claude: {},
|
|
@@ -173,6 +172,13 @@ Regenerate the README demo with VHS:
|
|
|
173
172
|
./static/render-demo.sh
|
|
174
173
|
```
|
|
175
174
|
|
|
175
|
+
Regenerate the Slack bot avatar (also used as the emoji upload; Slack scales it down) after editing the mark:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
sed 's/width="120" height="120"/width="512" height="512"/' static/groundcrew-mark.svg > /tmp/mark512.svg
|
|
179
|
+
sips -s format png /tmp/mark512.svg --out static/groundcrew-avatar.png
|
|
180
|
+
```
|
|
181
|
+
|
|
176
182
|
## License
|
|
177
183
|
|
|
178
184
|
[MIT](./LICENSE)
|
package/crew.config.example.ts
CHANGED
|
@@ -27,9 +27,9 @@ export default {
|
|
|
27
27
|
// { name: "other-org/other-repo", projectDirOverride: "~/work" }
|
|
28
28
|
knownRepositories: ["your-org/your-repo"],
|
|
29
29
|
},
|
|
30
|
-
|
|
30
|
+
agents: {
|
|
31
31
|
default: "claude",
|
|
32
|
-
// `definitions` is the enabled
|
|
32
|
+
// `definitions` is the enabled agent set. Built-in keys can use `{}` to
|
|
33
33
|
// opt into the shipped command/color/usage preset. Add `codex: {}` if you
|
|
34
34
|
// want both shipped agents, or add a custom entry and tag tasks with
|
|
35
35
|
// `agent-<name>`.
|
|
@@ -99,7 +99,7 @@ export default {
|
|
|
99
99
|
// // it into the agent. Chain with `&&` so a failed mint aborts launch.
|
|
100
100
|
// preLaunch: "SESSION_TOKEN=$(your-mint-command) && export SESSION_TOKEN",
|
|
101
101
|
// preLaunchEnv: ["SESSION_TOKEN"],
|
|
102
|
-
// // Required for this
|
|
102
|
+
// // Required for this agent when `local.runner` resolves to `sdx`.
|
|
103
103
|
// sandbox: { agent: "claude" },
|
|
104
104
|
// },
|
|
105
105
|
//
|
|
@@ -110,7 +110,7 @@ export default {
|
|
|
110
110
|
// local: { runner: "auto" },
|
|
111
111
|
//
|
|
112
112
|
// // Groundcrew does not create or authenticate sdx sandboxes. For an sdx
|
|
113
|
-
// //
|
|
113
|
+
// // agent, create the matching sandbox yourself before first launch:
|
|
114
114
|
// // sbx create --name groundcrew-claude claude ~/dev/groundcrew
|
|
115
115
|
// // sbx exec -it groundcrew-claude claude auth login
|
|
116
116
|
// // sbx exec -it groundcrew-claude gh auth login
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clipboard-health/groundcrew",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.28.0",
|
|
4
4
|
"description": "Linear-driven orchestrator that launches AI coding agents in git worktrees, with workspace lifecycle and usage tracking.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"@tsconfig/node24": "24.0.4",
|
|
83
83
|
"@tsconfig/strictest": "2.0.8",
|
|
84
84
|
"@types/node": "25.9.2",
|
|
85
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
85
|
+
"@typescript/native-preview": "7.0.0-dev.20260606.1",
|
|
86
86
|
"@vitest/coverage-v8": "4.1.8",
|
|
87
87
|
"cspell": "10.0.1",
|
|
88
88
|
"dependency-cruiser": "17.4.3",
|
|
Binary file
|
|
@@ -2,28 +2,25 @@
|
|
|
2
2
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120" width="120" height="120" role="img" aria-label="groundcrew">
|
|
3
3
|
<title>groundcrew</title>
|
|
4
4
|
<!--
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
Taxiway sign tile: yellow field, inset inscription border, fork arrow.
|
|
6
|
+
One task stream splitting onto parallel worktrees.
|
|
7
|
+
Field #F7C600, ink #111111. Fork stem (22,60) to (48,60), branches to
|
|
8
|
+
(92.2,29) and (92.2,91) with chevron heads. Stroke 11, round caps/joins.
|
|
9
|
+
At 16px (favicon), drop the inscription border and bump the fork stroke
|
|
10
|
+
to 16.
|
|
11
|
+
|
|
12
|
+
Regenerate groundcrew-avatar.png (Slack bot avatar; also fine as the
|
|
13
|
+
emoji upload; Slack scales it down) with the sips commands in the
|
|
14
|
+
README's Development section. The exact command can't live here: it
|
|
15
|
+
needs a double-hyphen flag, which is illegal inside an XML comment.
|
|
9
16
|
-->
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
<line x1="102" y1="108" x2="32" y2="11" stroke="#FF6D00" stroke-width="20" stroke-linecap="round">
|
|
20
|
-
<animate attributeName="opacity"
|
|
21
|
-
values="1;0.38;1;1"
|
|
22
|
-
keyTimes="0;0.25;0.5;1"
|
|
23
|
-
calcMode="spline"
|
|
24
|
-
keySplines="0.42 0 0.58 1;0.42 0 0.58 1;0 0 1 1"
|
|
25
|
-
dur="2.4s"
|
|
26
|
-
begin="-1.2s"
|
|
27
|
-
repeatCount="indefinite"/>
|
|
28
|
-
</line>
|
|
17
|
+
<!-- rounded rectangles as explicit paths: the macOS renderers (sips and
|
|
18
|
+
qlmanage) that cut the PNG avatar mishandle rx on rect -->
|
|
19
|
+
<path d="M24 0 H96 A24 24 0 0 1 120 24 V96 A24 24 0 0 1 96 120 H24 A24 24 0 0 1 0 96 V24 A24 24 0 0 1 24 0 Z" fill="#F7C600"/>
|
|
20
|
+
<path d="M21 9 H99 A12 12 0 0 1 111 21 V99 A12 12 0 0 1 99 111 H21 A12 12 0 0 1 9 99 V21 A12 12 0 0 1 21 9 Z" fill="none" stroke="#111111" stroke-width="6"/>
|
|
21
|
+
<path
|
|
22
|
+
d="M22 60 H48
|
|
23
|
+
M48 60 L92.2 29 M75.3 27.5 L92.2 29 L87.8 45.4
|
|
24
|
+
M48 60 L92.2 91 M75.3 92.5 L92.2 91 L87.8 74.6"
|
|
25
|
+
fill="none" stroke="#111111" stroke-width="11" stroke-linecap="round" stroke-linejoin="round"/>
|
|
29
26
|
</svg>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 730 128" width="730" height="128" role="img" aria-label="groundcrew">
|
|
3
|
+
<title>groundcrew</title>
|
|
4
|
+
<style>
|
|
5
|
+
.wordmark {
|
|
6
|
+
font-family: Overpass, "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
7
|
+
font-size: 68px;
|
|
8
|
+
font-weight: 800;
|
|
9
|
+
}
|
|
10
|
+
</style>
|
|
11
|
+
<!--
|
|
12
|
+
Airport taxiway sign lockup, self-contained on light and dark pages.
|
|
13
|
+
Location panel (yellow-on-black, flush inscription border) names the
|
|
14
|
+
tool; direction panel (black-on-yellow) carries the fork arrow - one
|
|
15
|
+
task stream splitting onto parallel worktrees.
|
|
16
|
+
Field #F7C600, ink #111111. textLength normalizes the wordmark width
|
|
17
|
+
across font fallbacks.
|
|
18
|
+
-->
|
|
19
|
+
<rect width="730" height="128" rx="14" fill="#F7C600"/>
|
|
20
|
+
<path d="M570 0 H14 A14 14 0 0 0 0 14 V114 A14 14 0 0 0 14 128 H570 Z" fill="#111111"/>
|
|
21
|
+
<path d="M568 2 H14 A12 12 0 0 0 2 14 V114 A12 12 0 0 0 14 126 H568 Z" fill="none" stroke="#F7C600" stroke-width="4"/>
|
|
22
|
+
<text class="wordmark" x="285" y="89" text-anchor="middle" textLength="490" lengthAdjust="spacingAndGlyphs" fill="#F7C600">GROUNDCREW</text>
|
|
23
|
+
<g transform="translate(593,4)">
|
|
24
|
+
<path
|
|
25
|
+
d="M22 60 H48
|
|
26
|
+
M48 60 L92.2 29 M75.3 27.5 L92.2 29 L87.8 45.4
|
|
27
|
+
M48 60 L92.2 91 M75.3 92.5 L92.2 91 L87.8 74.6"
|
|
28
|
+
fill="none" stroke="#111111" stroke-width="11" stroke-linecap="round" stroke-linejoin="round"/>
|
|
29
|
+
</g>
|
|
30
|
+
</svg>
|
|
Binary file
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 120" width="680" height="120" role="img" aria-label="groundcrew">
|
|
3
|
-
<title>groundcrew</title>
|
|
4
|
-
<style>
|
|
5
|
-
.wordmark {
|
|
6
|
-
font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, "Liberation Mono", "DejaVu Sans Mono", monospace;
|
|
7
|
-
font-size: 92px;
|
|
8
|
-
font-weight: 700;
|
|
9
|
-
letter-spacing: -0.04em;
|
|
10
|
-
}
|
|
11
|
-
</style>
|
|
12
|
-
<!--
|
|
13
|
-
Logomark: crossed marshaling wands.
|
|
14
|
-
Handles at (18,108) and (102,108), cross at (60,50), tips at (88,11) and (32,11).
|
|
15
|
-
SMIL animation: wands alternate dimming, 2.4s cycle.
|
|
16
|
-
Right wand offset by -1.2s so both open fully opaque.
|
|
17
|
-
-->
|
|
18
|
-
<line x1="18" y1="108" x2="88" y2="11" stroke="#FF6D00" stroke-width="20" stroke-linecap="round">
|
|
19
|
-
<animate attributeName="opacity"
|
|
20
|
-
values="1;0.38;1;1"
|
|
21
|
-
keyTimes="0;0.25;0.5;1"
|
|
22
|
-
calcMode="spline"
|
|
23
|
-
keySplines="0.42 0 0.58 1;0.42 0 0.58 1;0 0 1 1"
|
|
24
|
-
dur="2.4s"
|
|
25
|
-
repeatCount="indefinite"/>
|
|
26
|
-
</line>
|
|
27
|
-
<line x1="102" y1="108" x2="32" y2="11" stroke="#FF6D00" stroke-width="20" stroke-linecap="round">
|
|
28
|
-
<animate attributeName="opacity"
|
|
29
|
-
values="1;0.38;1;1"
|
|
30
|
-
keyTimes="0;0.25;0.5;1"
|
|
31
|
-
calcMode="spline"
|
|
32
|
-
keySplines="0.42 0 0.58 1;0.42 0 0.58 1;0 0 1 1"
|
|
33
|
-
dur="2.4s"
|
|
34
|
-
begin="-1.2s"
|
|
35
|
-
repeatCount="indefinite"/>
|
|
36
|
-
</line>
|
|
37
|
-
<text class="wordmark" x="136" y="92" textLength="540" lengthAdjust="spacingAndGlyphs" fill="#e4e4e7">groundcrew</text>
|
|
38
|
-
</svg>
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 120" width="680" height="120" role="img" aria-label="groundcrew">
|
|
3
|
-
<title>groundcrew</title>
|
|
4
|
-
<style>
|
|
5
|
-
.wordmark {
|
|
6
|
-
font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, "Liberation Mono", "DejaVu Sans Mono", monospace;
|
|
7
|
-
font-size: 92px;
|
|
8
|
-
font-weight: 700;
|
|
9
|
-
letter-spacing: -0.04em;
|
|
10
|
-
}
|
|
11
|
-
</style>
|
|
12
|
-
<!--
|
|
13
|
-
Logomark: crossed marshaling wands.
|
|
14
|
-
Handles at (18,108) and (102,108), cross at (60,50), tips at (88,11) and (32,11).
|
|
15
|
-
SMIL animation: wands alternate dimming, 2.4s cycle.
|
|
16
|
-
Right wand offset by -1.2s so both open fully opaque.
|
|
17
|
-
-->
|
|
18
|
-
<line x1="18" y1="108" x2="88" y2="11" stroke="#FF6D00" stroke-width="20" stroke-linecap="round">
|
|
19
|
-
<animate attributeName="opacity"
|
|
20
|
-
values="1;0.38;1;1"
|
|
21
|
-
keyTimes="0;0.25;0.5;1"
|
|
22
|
-
calcMode="spline"
|
|
23
|
-
keySplines="0.42 0 0.58 1;0.42 0 0.58 1;0 0 1 1"
|
|
24
|
-
dur="2.4s"
|
|
25
|
-
repeatCount="indefinite"/>
|
|
26
|
-
</line>
|
|
27
|
-
<line x1="102" y1="108" x2="32" y2="11" stroke="#FF6D00" stroke-width="20" stroke-linecap="round">
|
|
28
|
-
<animate attributeName="opacity"
|
|
29
|
-
values="1;0.38;1;1"
|
|
30
|
-
keyTimes="0;0.25;0.5;1"
|
|
31
|
-
calcMode="spline"
|
|
32
|
-
keySplines="0.42 0 0.58 1;0.42 0 0.58 1;0 0 1 1"
|
|
33
|
-
dur="2.4s"
|
|
34
|
-
begin="-1.2s"
|
|
35
|
-
repeatCount="indefinite"/>
|
|
36
|
-
</line>
|
|
37
|
-
<text class="wordmark" x="136" y="92" textLength="540" lengthAdjust="spacingAndGlyphs" fill="#18181b">groundcrew</text>
|
|
38
|
-
</svg>
|