@clipboard-health/groundcrew 4.45.1 → 4.45.3
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 +1 -1
- package/crew.config.example.ts +14 -0
- package/dist/cli.js +2 -2
- package/dist/commands/resumeWorkspace.d.ts +6 -0
- package/dist/commands/resumeWorkspace.d.ts.map +1 -1
- package/dist/commands/resumeWorkspace.js +37 -6
- package/dist/commands/setupWorkspace.d.ts.map +1 -1
- package/dist/commands/setupWorkspace.js +1 -0
- package/dist/lib/adapters/linear/fetch.d.ts +2 -2
- package/dist/lib/adapters/linear/fetch.d.ts.map +1 -1
- package/dist/lib/adapters/linear/parsing.d.ts +2 -2
- package/dist/lib/adapters/linear/parsing.d.ts.map +1 -1
- package/dist/lib/adapters/todo-txt/normalizer.d.ts +1 -1
- package/dist/lib/adapters/todo-txt/normalizer.d.ts.map +1 -1
- package/dist/lib/adapters/todo-txt/parser.d.ts +1 -1
- package/dist/lib/adapters/todo-txt/parser.d.ts.map +1 -1
- package/dist/lib/agentLaunch.d.ts +1 -0
- package/dist/lib/agentLaunch.d.ts.map +1 -1
- package/dist/lib/agentLaunch.js +1 -0
- package/dist/lib/config.d.ts +37 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +45 -1
- package/dist/lib/launchCommand.d.ts +18 -0
- package/dist/lib/launchCommand.d.ts.map +1 -1
- package/dist/lib/launchCommand.js +20 -5
- package/dist/lib/taskSourceFilesystem.d.ts.map +1 -1
- package/dist/lib/taskSourceFilesystem.js +1 -2
- package/docs/commands.md +3 -1
- package/docs/configuration.md +22 -0
- package/package.json +12 -12
package/README.md
CHANGED
|
@@ -105,7 +105,7 @@ crew status [<TASK>] # inspect current state o
|
|
|
105
105
|
crew run [--watch] # one-shot or --watch forever
|
|
106
106
|
crew start <TASK> # provision + launch one task now
|
|
107
107
|
crew stop <TASK> [--reason <text>] # stop workspace, keep worktree
|
|
108
|
-
crew resume <TASK>
|
|
108
|
+
crew resume [--new] <TASK> # reopen a paused task (--new: fresh conversation)
|
|
109
109
|
crew open <pr> | --branch <name> [--repo <owner/repo>] # iterate on an existing PR or branch
|
|
110
110
|
[--prompt <text> | --prompt-file <path>] [--task <id>] [--dry-run]
|
|
111
111
|
crew cleanup [--force] <TASK> # tear down every worktree for a task
|
package/crew.config.example.ts
CHANGED
|
@@ -153,6 +153,11 @@ export default {
|
|
|
153
153
|
// preLaunchEnv: ["SESSION_TOKEN"],
|
|
154
154
|
// // Required for this agent when `local.runner` resolves to `sdx`.
|
|
155
155
|
// sandbox: { agent: "claude" },
|
|
156
|
+
// // Args appended on `crew resume` so the agent reopens its previous
|
|
157
|
+
// // conversation in the worktree (`crew resume --new` starts fresh). The
|
|
158
|
+
// // built-in claude/codex presets default this ("--continue" / "resume
|
|
159
|
+
// // --last"); set it for custom agents or to override the preset default.
|
|
160
|
+
// resumeArgs: "--continue",
|
|
156
161
|
// },
|
|
157
162
|
//
|
|
158
163
|
// // Local isolation backend. Defaults to `"auto"` — macOS → safehouse,
|
|
@@ -161,6 +166,15 @@ export default {
|
|
|
161
166
|
// // macOS when you need an agent to use Docker safely.
|
|
162
167
|
// local: { runner: "auto" },
|
|
163
168
|
//
|
|
169
|
+
// // Safehouse optional integrations, turned on for every agent launched
|
|
170
|
+
// // under the safehouse runner (forwarded to `safehouse --enable=<list>`).
|
|
171
|
+
// // Each name layers the matching optional sandbox profile on top of the
|
|
172
|
+
// // deny-by-default policy. Examples: `agent-browser` so the
|
|
173
|
+
// // chrome-devtools MCP server can drive a headless Chrome;
|
|
174
|
+
// // `browser-native-messaging` for `claude --chrome`. Ignored by the
|
|
175
|
+
// // srt/sdx/none runners.
|
|
176
|
+
// local: { safehouse: { enable: ["agent-browser"] } },
|
|
177
|
+
//
|
|
164
178
|
// // Groundcrew does not create or authenticate sdx sandboxes. For an sdx
|
|
165
179
|
// // agent, create the matching sandbox yourself before first launch:
|
|
166
180
|
// // sbx create --name groundcrew-claude claude ~/dev/groundcrew
|
package/dist/cli.js
CHANGED
|
@@ -166,8 +166,8 @@ const SUBCOMMANDS = {
|
|
|
166
166
|
},
|
|
167
167
|
},
|
|
168
168
|
resume: {
|
|
169
|
-
summary: "Reopen an existing task worktree
|
|
170
|
-
usage: "<task>",
|
|
169
|
+
summary: "Reopen an existing task worktree, resuming the agent's chat session",
|
|
170
|
+
usage: "[--new] <task>",
|
|
171
171
|
invoke: resumeWorkspaceCli,
|
|
172
172
|
},
|
|
173
173
|
open: {
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { type ResolvedConfig } from "../lib/config.ts";
|
|
2
2
|
export interface ResumeWorkspaceOptions {
|
|
3
3
|
task: string;
|
|
4
|
+
/**
|
|
5
|
+
* Force a fresh conversation: cold-start the agent (the historic behavior),
|
|
6
|
+
* ignoring the agent's `resumeArgs`. Defaults to false, which reopens the
|
|
7
|
+
* agent's previous conversation when `resumeArgs` is configured.
|
|
8
|
+
*/
|
|
9
|
+
fresh?: boolean;
|
|
4
10
|
}
|
|
5
11
|
export declare function resumeWorkspace(config: ResolvedConfig, options: ResumeWorkspaceOptions): Promise<void>;
|
|
6
12
|
export declare function resumeWorkspaceCli(argv: string[]): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resumeWorkspace.d.ts","sourceRoot":"","sources":["../../src/commands/resumeWorkspace.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"resumeWorkspace.d.ts","sourceRoot":"","sources":["../../src/commands/resumeWorkspace.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoC,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAiBzF,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAyKD,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAmGf;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE"}
|
|
@@ -3,7 +3,7 @@ import { getLinearClient } from "../lib/adapters/linear/client.js";
|
|
|
3
3
|
import { isLinearEnabled, sourcesFromConfig } from "../lib/buildSources.js";
|
|
4
4
|
import { loadConfig } from "../lib/config.js";
|
|
5
5
|
import { composeAgentLaunch, openAgentWorkspace, prepareAgentLaunch } from "../lib/agentLaunch.js";
|
|
6
|
-
import { workerEnvironmentForTask } from "../lib/launchCommand.js";
|
|
6
|
+
import { withResumeArgs, workerEnvironmentForTask } from "../lib/launchCommand.js";
|
|
7
7
|
import { readRunState, recordRunState } from "../lib/runState.js";
|
|
8
8
|
import { taskSupportsCompletionCommand } from "../lib/sourceCapabilities.js";
|
|
9
9
|
import { removeStagedPrompt, stageBuildSecrets, stagePromptText, stageWorkspaceLaunchCommand, } from "../lib/stagedLaunch.js";
|
|
@@ -13,11 +13,20 @@ import { errorMessage, log } from "../lib/util.js";
|
|
|
13
13
|
import { failIfWorkspaceAlreadyLive } from "../lib/workspaceLiveness.js";
|
|
14
14
|
import { resolveLaunchDir, worktrees } from "../lib/worktrees.js";
|
|
15
15
|
function parseArguments(argv) {
|
|
16
|
-
|
|
16
|
+
let fresh = false;
|
|
17
|
+
const positionals = [];
|
|
18
|
+
for (const argument of argv) {
|
|
19
|
+
if (argument === "--new") {
|
|
20
|
+
fresh = true;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
positionals.push(argument);
|
|
24
|
+
}
|
|
25
|
+
const [task, ...extras] = positionals;
|
|
17
26
|
if (task === undefined || task.length === 0 || extras.length > 0 || task.startsWith("-")) {
|
|
18
|
-
throw new Error("Usage: crew resume <task>");
|
|
27
|
+
throw new Error("Usage: crew resume [--new] <task>");
|
|
19
28
|
}
|
|
20
|
-
return { task: naturalIdFromCanonical(task).toLowerCase() };
|
|
29
|
+
return { task: naturalIdFromCanonical(task).toLowerCase(), fresh };
|
|
21
30
|
}
|
|
22
31
|
async function fetchTaskDetails(task) {
|
|
23
32
|
try {
|
|
@@ -116,6 +125,22 @@ function renderResumePrompt(context) {
|
|
|
116
125
|
"Run the repository's documented verification before stopping, then leave the branch ready or open a PR when possible.",
|
|
117
126
|
].join("\n");
|
|
118
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Decide the definition to launch on resume: when the agent has `resumeArgs`
|
|
130
|
+
* and `--new` was not passed, append them so the agent reopens its previous
|
|
131
|
+
* conversation; otherwise cold-start (the historic behavior).
|
|
132
|
+
*/
|
|
133
|
+
function resolveResumeLaunch(input) {
|
|
134
|
+
const { task, definition, fresh } = input;
|
|
135
|
+
if (fresh || definition.resumeArgs === undefined) {
|
|
136
|
+
if (fresh && definition.resumeArgs !== undefined) {
|
|
137
|
+
log(`Starting a fresh conversation for ${task}`);
|
|
138
|
+
}
|
|
139
|
+
return definition;
|
|
140
|
+
}
|
|
141
|
+
log(`Reopening the previous conversation for ${task}`);
|
|
142
|
+
return withResumeArgs(definition, definition.resumeArgs);
|
|
143
|
+
}
|
|
119
144
|
export async function resumeWorkspace(config, options) {
|
|
120
145
|
const task = options.task.toLowerCase();
|
|
121
146
|
await failIfWorkspaceAlreadyLive(config, task, "resuming");
|
|
@@ -124,10 +149,15 @@ export async function resumeWorkspace(config, options) {
|
|
|
124
149
|
if (definition === undefined) {
|
|
125
150
|
throw new Error(`Unknown agent: ${context.agent}`);
|
|
126
151
|
}
|
|
152
|
+
const launchDefinition = resolveResumeLaunch({
|
|
153
|
+
task,
|
|
154
|
+
definition,
|
|
155
|
+
fresh: options.fresh === true,
|
|
156
|
+
});
|
|
127
157
|
const { runner, networkEgress, sandboxName, workspaceKind, ensureReady } = await prepareAgentLaunch({
|
|
128
158
|
config,
|
|
129
159
|
agent: context.agent,
|
|
130
|
-
definition,
|
|
160
|
+
definition: launchDefinition,
|
|
131
161
|
purpose: "resumes",
|
|
132
162
|
});
|
|
133
163
|
await ensureReady();
|
|
@@ -157,7 +187,7 @@ export async function resumeWorkspace(config, options) {
|
|
|
157
187
|
runner,
|
|
158
188
|
networkEgress,
|
|
159
189
|
task,
|
|
160
|
-
definition,
|
|
190
|
+
definition: launchDefinition,
|
|
161
191
|
promptFile: stagedPrompt.file,
|
|
162
192
|
worktreeDir,
|
|
163
193
|
workingDir: launchDir,
|
|
@@ -169,6 +199,7 @@ export async function resumeWorkspace(config, options) {
|
|
|
169
199
|
markDoneSupported: context.completionMarkDoneSupported,
|
|
170
200
|
}),
|
|
171
201
|
taskSourceWritePaths,
|
|
202
|
+
safehouseEnableFeatures: config.local.safehouse.enable,
|
|
172
203
|
}));
|
|
173
204
|
const launchCmd = stageWorkspaceLaunchCommand(stagedPrompt.directory, launchCommand);
|
|
174
205
|
await openAgentWorkspace({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupWorkspace.d.ts","sourceRoot":"","sources":["../../src/commands/setupWorkspace.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAyBnE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6FAA6F;IAC7F,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAuBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,qBAAqB,EAC9B,UAAU,GAAE,wBAA6B,GACxC,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"setupWorkspace.d.ts","sourceRoot":"","sources":["../../src/commands/setupWorkspace.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAyBnE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6FAA6F;IAC7F,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAuBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,qBAAqB,EAC9B,UAAU,GAAE,wBAA6B,GACxC,OAAO,CAAC,IAAI,CAAC,CAgJf;AA8MD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,IAAI,CAAC,CAkDf"}
|
|
@@ -120,6 +120,7 @@ export async function setupWorkspace(config, options, runOptions = {}) {
|
|
|
120
120
|
markDoneSupported: completionMarkDoneSupported,
|
|
121
121
|
}),
|
|
122
122
|
taskSourceWritePaths,
|
|
123
|
+
safehouseEnableFeatures: config.local.safehouse.enable,
|
|
123
124
|
});
|
|
124
125
|
srtSettingsDir = stagedSrtSettingsDir;
|
|
125
126
|
const launchCmd = stageWorkspaceLaunchCommand(promptDir, launchCommand);
|
|
@@ -128,9 +128,9 @@ export interface RawLinearIssue {
|
|
|
128
128
|
title: string;
|
|
129
129
|
description: string;
|
|
130
130
|
teamId: string;
|
|
131
|
-
labels: {
|
|
131
|
+
labels: Array<{
|
|
132
132
|
name: string;
|
|
133
|
-
}
|
|
133
|
+
}>;
|
|
134
134
|
/** Linear workflow state name, e.g. "Todo", "In Review". May be "" if state was null. */
|
|
135
135
|
stateName: string;
|
|
136
136
|
stateType: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/fetch.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAYpC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,4FAA4F;IAC5F,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;CAClC;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAUpE;AAkBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,OAAO,CAE1E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,OAAO,CAEpE;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE1E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,OAAO,CAEjF;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEpE;AA0BD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QACN,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;KAChD,GAAG,IAAI,CAAC;CACV;AAqFD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,OAAO,CAAC,eAAe,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,GACzD,MAAM,CAQR;AAyGD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,yFAAyF;IACzF,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,oBAAoB,CAAC,UAAU,EAAE;IACrD,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC,CA8C9B;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE;IACpD,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,cAAc,CAAC,CA6E1B;AAUD,wBAAsB,yBAAyB,CAAC,UAAU,EAAE;IAC1D,MAAM,EAAE,YAAY,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2ClB;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE;IACnD,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,aAAa,CAAC,CAuCzB;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,cAAc,GACrB,IAAI,CAON;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,OAAO,EAAE,CAS/E"}
|
|
@@ -35,9 +35,9 @@ interface ParseRepositoryArguments {
|
|
|
35
35
|
}
|
|
36
36
|
export declare function parseRepository(arguments_: ParseRepositoryArguments): string;
|
|
37
37
|
export declare function resolveAgentFor(arguments_: {
|
|
38
|
-
labels: {
|
|
38
|
+
labels: Array<{
|
|
39
39
|
name: string;
|
|
40
|
-
}
|
|
40
|
+
}>;
|
|
41
41
|
config: ResolvedConfig;
|
|
42
42
|
}): AgentResolution;
|
|
43
43
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsing.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/parsing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG3F,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAE5F,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AASpF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAUnE;AAiDD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE;IAC/C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,cAAc,CAAC;CACxB,GAAG,oBAAoB,CAuBvB;AAED,UAAU,wBAAwB;IAChC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,wBAAwB,GAAG,MAAM,CA2B5E;AAkDD,wBAAgB,eAAe,CAAC,UAAU,EAAE;IAC1C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,
|
|
1
|
+
{"version":3,"file":"parsing.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/parsing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG3F,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAE5F,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AASpF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAUnE;AAiDD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE;IAC/C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,cAAc,CAAC;CACxB,GAAG,oBAAoB,CAuBvB;AAED,UAAU,wBAAwB;IAChC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,wBAAwB,GAAG,MAAM,CA2B5E;AAkDD,wBAAgB,eAAe,CAAC,UAAU,EAAE;IAC1C,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,MAAM,EAAE,cAAc,CAAC;CACxB,GAAG,eAAe,CAiBlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/todo-txt/normalizer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsC,KAAK,KAAK,EAAiB,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAkED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/todo-txt/normalizer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsC,KAAK,KAAK,EAAiB,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAkED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,KAAK,GAAG,SAAS,CAqD7E;AAID,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAYrF;AAqCD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO5D"}
|
|
@@ -16,7 +16,7 @@ export declare const DATE_RE: RegExp;
|
|
|
16
16
|
/** Local datetime threshold form for `t:`, seconds optional. */
|
|
17
17
|
export declare const DATETIME_RE: RegExp;
|
|
18
18
|
export declare function hashLine(raw: string): string;
|
|
19
|
-
export declare function parseAllLines(fileContent: string):
|
|
19
|
+
export declare function parseAllLines(fileContent: string): Array<ParsedTodoLine | null>;
|
|
20
20
|
export declare function getMetadataFirst(parsed: ParsedTodoLine, key: string): string | undefined;
|
|
21
21
|
export declare function getMetadataAll(parsed: ParsedTodoLine, key: string): string[];
|
|
22
22
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/todo-txt/parser.ts"],"names":[],"mappings":"AAEA,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,uFAAuF;IACvF,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC;AAED,eAAO,MAAM,OAAO,QAAwB,CAAC;AAC7C,gEAAgE;AAChE,eAAO,MAAM,WAAW,QAA+C,CAAC;AAMxE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AA6ED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/todo-txt/parser.ts"],"names":[],"mappings":"AAEA,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,uFAAuF;IACvF,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC;AAED,eAAO,MAAM,OAAO,QAAwB,CAAC;AAC7C,gEAAgE;AAChE,eAAO,MAAM,WAAW,QAA+C,CAAC;AAMxE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AA6ED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,CAQ/E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAExF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5E"}
|
|
@@ -23,6 +23,7 @@ export declare function composeAgentLaunch(input: {
|
|
|
23
23
|
workerEnvironment?: WorkerEnvironment | undefined;
|
|
24
24
|
omitPromptArgument?: boolean | undefined;
|
|
25
25
|
taskSourceWritePaths?: readonly string[] | undefined;
|
|
26
|
+
safehouseEnableFeatures?: readonly string[] | undefined;
|
|
26
27
|
}): {
|
|
27
28
|
launchCommand: string;
|
|
28
29
|
srtSettingsDir: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentLaunch.d.ts","sourceRoot":"","sources":["../../src/lib/agentLaunch.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,EAAE,oBAAoB,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAClD,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"agentLaunch.d.ts","sourceRoot":"","sources":["../../src/lib/agentLaunch.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,EAAE,oBAAoB,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAClD,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACrD,uBAAuB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACzD,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAuChE;AA4DD,UAAU,mBAAmB;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,iFAAiF;IACjF,aAAa,EAAE,oBAAoB,CAAC;IACpC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAsD/B;AAwBD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhB"}
|
package/dist/lib/agentLaunch.js
CHANGED
|
@@ -47,6 +47,7 @@ export function composeAgentLaunch(input) {
|
|
|
47
47
|
omitPromptArgument: input.omitPromptArgument,
|
|
48
48
|
safehouseAddDirs: input.runner === "safehouse" ? resolveSafehouseAddDirs(input.worktreeDir) : undefined,
|
|
49
49
|
safehouseAgentAddDirs: input.runner === "safehouse" ? (input.taskSourceWritePaths ?? []) : undefined,
|
|
50
|
+
safehouseEnableFeatures: input.runner === "safehouse" ? input.safehouseEnableFeatures : undefined,
|
|
50
51
|
safehouseAgentIntegration,
|
|
51
52
|
});
|
|
52
53
|
return { launchCommand, srtSettingsDir: staged?.directory };
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -107,6 +107,17 @@ export interface AgentDefinition {
|
|
|
107
107
|
* or `none` without surprise.
|
|
108
108
|
*/
|
|
109
109
|
sandbox?: SandboxDefinition;
|
|
110
|
+
/**
|
|
111
|
+
* Opt-in: shell args appended to `cmd` on `crew resume` so the agent reopens
|
|
112
|
+
* its previous conversation in the worktree instead of cold-starting. groundcrew
|
|
113
|
+
* stores no session id — it relies on one conversation per worktree, so the
|
|
114
|
+
* agent's own "resume latest in this directory" primitive is enough.
|
|
115
|
+
*
|
|
116
|
+
* Examples: `"--continue"` (Claude Code), `"resume --last"` (Codex).
|
|
117
|
+
*
|
|
118
|
+
* `crew resume --new` ignores this and forces a fresh conversation.
|
|
119
|
+
*/
|
|
120
|
+
resumeArgs?: string;
|
|
110
121
|
}
|
|
111
122
|
/**
|
|
112
123
|
* User-facing agent entry shape. Built-in agent names (`claude`, `codex`)
|
|
@@ -213,7 +224,7 @@ export interface Config {
|
|
|
213
224
|
* to `projectDir` when unset, so single-directory setups are unchanged.
|
|
214
225
|
*/
|
|
215
226
|
worktreeDir?: string;
|
|
216
|
-
knownRepositories:
|
|
227
|
+
knownRepositories: Array<string | KnownRepository>;
|
|
217
228
|
};
|
|
218
229
|
defaults?: {
|
|
219
230
|
hooks?: HookCommands;
|
|
@@ -263,6 +274,24 @@ export interface Config {
|
|
|
263
274
|
* unrestricted network egress. `srt`/`sdx`/`none` ignore this setting.
|
|
264
275
|
*/
|
|
265
276
|
networkEgress?: NetworkEgressSetting;
|
|
277
|
+
/**
|
|
278
|
+
* Safehouse sandbox tuning. Consumed only by the `safehouse` runner; other
|
|
279
|
+
* runners ignore it.
|
|
280
|
+
*/
|
|
281
|
+
safehouse?: {
|
|
282
|
+
/**
|
|
283
|
+
* Optional Safehouse integrations turned on for every agent launched
|
|
284
|
+
* under the safehouse runner, forwarded verbatim to
|
|
285
|
+
* `safehouse --enable=<comma-list>` on the agent wrap. Each name layers
|
|
286
|
+
* the matching optional sandbox profile on top of the deny-by-default
|
|
287
|
+
* policy — e.g. `agent-browser` for the chrome-devtools MCP server's
|
|
288
|
+
* Puppeteer/CDP browser, or `browser-native-messaging` for
|
|
289
|
+
* `claude --chrome`. Names are safehouse feature slugs
|
|
290
|
+
* (`[a-z0-9][a-z0-9-]*`); unknown names are rejected by safehouse at
|
|
291
|
+
* launch. Defaults to none.
|
|
292
|
+
*/
|
|
293
|
+
enable?: string[];
|
|
294
|
+
};
|
|
266
295
|
};
|
|
267
296
|
logging?: {
|
|
268
297
|
/**
|
|
@@ -333,6 +362,13 @@ export interface ResolvedConfig {
|
|
|
333
362
|
* `"allowlisted"`. Only the safehouse runner consumes this today.
|
|
334
363
|
*/
|
|
335
364
|
networkEgress: NetworkEgressSetting;
|
|
365
|
+
/**
|
|
366
|
+
* Resolved Safehouse tuning. Always present; `enable` defaults to `[]`.
|
|
367
|
+
* Only the safehouse runner consumes it.
|
|
368
|
+
*/
|
|
369
|
+
safehouse: {
|
|
370
|
+
enable: readonly string[];
|
|
371
|
+
};
|
|
336
372
|
};
|
|
337
373
|
logging: {
|
|
338
374
|
file: string;
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAO1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,oBAAoB,CAAC;AAE3F,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,QAAQ,CAAC;AAE/B;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvE,eAAO,MAAM,uBAAuB,EAAE,SAAS,oBAAoB,EAKzD,CAAC;AAEX;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAE/D;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,MAAM,CAAC;AAEtD,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAMrD,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,aAAa,GAAG,MAAM,CAAC;AAE1D,eAAO,MAAM,uBAAuB,EAAE,SAAS,oBAAoB,EAGzD,CAAC;AAEX;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;;;OAOG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QACN,QAAQ,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACjD,CAAC;IACF;;;;OAIG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.js
CHANGED
|
@@ -61,11 +61,14 @@ const BUILT_IN_AGENT_DEFINITIONS = {
|
|
|
61
61
|
cmd: "claude --permission-mode auto",
|
|
62
62
|
color: "#C15F3C",
|
|
63
63
|
usage: { codexbar: { provider: "claude" } },
|
|
64
|
+
// `crew resume` reopens the worktree's latest conversation by default.
|
|
65
|
+
resumeArgs: "--continue",
|
|
64
66
|
},
|
|
65
67
|
codex: {
|
|
66
68
|
cmd: "codex --dangerously-bypass-approvals-and-sandbox",
|
|
67
69
|
color: "#3267e3",
|
|
68
70
|
usage: { codexbar: { provider: "codex" } },
|
|
71
|
+
resumeArgs: "resume --last",
|
|
69
72
|
},
|
|
70
73
|
};
|
|
71
74
|
const MODEL_DEFINITIONS_MIGRATION_MESSAGE = [
|
|
@@ -280,6 +283,38 @@ function normalizeNetworkEgress(value, configKey) {
|
|
|
280
283
|
}
|
|
281
284
|
return value;
|
|
282
285
|
}
|
|
286
|
+
const SAFEHOUSE_FEATURE_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
|
|
287
|
+
function normalizeSafehouseEnable(value, configKey) {
|
|
288
|
+
if (value === undefined) {
|
|
289
|
+
return [];
|
|
290
|
+
}
|
|
291
|
+
if (!isPlainObject(value)) {
|
|
292
|
+
fail(`${configKey} must be an object`);
|
|
293
|
+
}
|
|
294
|
+
const { enable } = value;
|
|
295
|
+
if (enable === undefined) {
|
|
296
|
+
return [];
|
|
297
|
+
}
|
|
298
|
+
if (!Array.isArray(enable)) {
|
|
299
|
+
fail(`${configKey}.enable must be an array of safehouse feature names (got ${JSON.stringify(enable)})`);
|
|
300
|
+
}
|
|
301
|
+
const features = [];
|
|
302
|
+
for (const [index, entry] of enable.entries()) {
|
|
303
|
+
if (typeof entry !== "string" || !SAFEHOUSE_FEATURE_PATTERN.test(entry)) {
|
|
304
|
+
fail(`${configKey}.enable[${index}] must be a safehouse feature slug matching ${SAFEHOUSE_FEATURE_PATTERN.source} (got ${JSON.stringify(entry)})`);
|
|
305
|
+
}
|
|
306
|
+
features.push(entry);
|
|
307
|
+
}
|
|
308
|
+
return [...new Set(features)];
|
|
309
|
+
}
|
|
310
|
+
function normalizeResumeArgs(value, configKey) {
|
|
311
|
+
requireString(value, configKey);
|
|
312
|
+
const trimmed = value.trim();
|
|
313
|
+
if (trimmed.length === 0) {
|
|
314
|
+
fail(`${configKey} must be a non-empty string (got ${JSON.stringify(value)})`);
|
|
315
|
+
}
|
|
316
|
+
return trimmed;
|
|
317
|
+
}
|
|
283
318
|
function normalizeSandbox(value, configKey) {
|
|
284
319
|
if (!isPlainObject(value)) {
|
|
285
320
|
fail(`${configKey} must be an object`);
|
|
@@ -350,6 +385,9 @@ function buildOverrideCandidate(name, override, existing) {
|
|
|
350
385
|
if (override.sandbox !== undefined) {
|
|
351
386
|
candidate.sandbox = normalizeSandbox(override.sandbox, `agents.definitions.${name}.sandbox`);
|
|
352
387
|
}
|
|
388
|
+
if (override.resumeArgs !== undefined) {
|
|
389
|
+
candidate.resumeArgs = normalizeResumeArgs(override.resumeArgs, `agents.definitions.${name}.resumeArgs`);
|
|
390
|
+
}
|
|
353
391
|
if (override.preLaunch !== undefined) {
|
|
354
392
|
candidate.preLaunch = override.preLaunch;
|
|
355
393
|
}
|
|
@@ -370,7 +408,7 @@ function mergeDefinitions(user) {
|
|
|
370
408
|
failIfLegacyModelKeys(name, override);
|
|
371
409
|
const builtIn = BUILT_IN_AGENT_DEFINITIONS[name];
|
|
372
410
|
const candidate = buildOverrideCandidate(name, override, builtIn);
|
|
373
|
-
const { cmd, color, usage, sandbox, preLaunch, preLaunchEnv } = candidate;
|
|
411
|
+
const { cmd, color, usage, sandbox, resumeArgs, preLaunch, preLaunchEnv } = candidate;
|
|
374
412
|
if (typeof cmd !== "string" || cmd.length === 0) {
|
|
375
413
|
fail(`agents.definitions.${name}.cmd must be a non-empty string`);
|
|
376
414
|
}
|
|
@@ -384,6 +422,9 @@ function mergeDefinitions(user) {
|
|
|
384
422
|
if (sandbox !== undefined) {
|
|
385
423
|
definition.sandbox = sandbox;
|
|
386
424
|
}
|
|
425
|
+
if (resumeArgs !== undefined) {
|
|
426
|
+
definition.resumeArgs = resumeArgs;
|
|
427
|
+
}
|
|
387
428
|
if (preLaunch !== undefined) {
|
|
388
429
|
definition.preLaunch = preLaunch;
|
|
389
430
|
}
|
|
@@ -647,6 +688,9 @@ function applyDefaults(user, configDir) {
|
|
|
647
688
|
local: {
|
|
648
689
|
runner: normalizeLocalRunner(userLocal?.runner, "local.runner") ?? "auto",
|
|
649
690
|
networkEgress: normalizeNetworkEgress(userLocal?.networkEgress, "local.networkEgress") ?? "allowlisted",
|
|
691
|
+
safehouse: {
|
|
692
|
+
enable: normalizeSafehouseEnable(userLocal?.safehouse, "local.safehouse"),
|
|
693
|
+
},
|
|
650
694
|
},
|
|
651
695
|
logging: {
|
|
652
696
|
file: expandHome(normalizeOptionalString(user.logging?.file, "logging.file") ?? defaultLogFile()),
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { type LocalRunner, type AgentDefinition, type NetworkEgressSetting } from "./config.ts";
|
|
2
2
|
export { shellSingleQuote } from "./shell.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Return a copy of `definition` whose `cmd` has the agent's `resumeArgs`
|
|
5
|
+
* appended, so `crew resume` relaunches the agent into its previous
|
|
6
|
+
* conversation (e.g. `--continue` for Claude, `resume --last` for Codex).
|
|
7
|
+
* Appending after the base `cmd` keeps the first token — which
|
|
8
|
+
* `inferAgentCommandName` reads for the safehouse profile — and the trailing
|
|
9
|
+
* `"$_p"` prompt positional the launch builders add both intact.
|
|
10
|
+
*/
|
|
11
|
+
export declare function withResumeArgs(definition: AgentDefinition, resumeArgs: string): AgentDefinition;
|
|
3
12
|
/**
|
|
4
13
|
* Resolve the shipped Safehouse proxy wrapper inside `@clipboard-health/clearance`
|
|
5
14
|
* via Node's module-resolution algorithm so the path works whether npm hoists
|
|
@@ -141,6 +150,15 @@ interface LaunchCommandArguments {
|
|
|
141
150
|
* intentionally withheld from the repo-controlled prepareWorktree wrap.
|
|
142
151
|
*/
|
|
143
152
|
safehouseAgentAddDirs?: readonly string[] | undefined;
|
|
153
|
+
/**
|
|
154
|
+
* Optional Safehouse integrations turned on for the agent wrap, emitted as
|
|
155
|
+
* `--enable=<comma-list>` before the profile shim. Each name layers the
|
|
156
|
+
* matching optional sandbox profile (e.g. `agent-browser`) on top of the
|
|
157
|
+
* agent's deny-by-default policy. Withheld from the repo-controlled
|
|
158
|
+
* prepareWorktree wrap, which never needs them. Empty/undefined → no
|
|
159
|
+
* `--enable` flag.
|
|
160
|
+
*/
|
|
161
|
+
safehouseEnableFeatures?: readonly string[] | undefined;
|
|
144
162
|
/**
|
|
145
163
|
* Extra host-terminal integration surface granted only to the Safehouse agent
|
|
146
164
|
* wrap. The agent may need to execute host shims and reach their sockets
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchCommand.d.ts","sourceRoot":"","sources":["../../src/lib/launchCommand.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,GAAE,MAAwB,GAAG,MAAM,CAcvF;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,MAAwB,GAAG,MAAM,CAgB3E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,MAAM,CAMvF;AAkND,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA8B9D;AAMD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC,CAAC;AAEH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,OAAO,CAAC;CAC5B,GAAG,iBAAiB,CAMpB;AAwCD,MAAM,WAAW,yBAAyB;IACxC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAED,UAAU,sBAAsB;IAC9B,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C;;;;OAIG;IACH,MAAM,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,aAAa,EAAE,oBAAoB,CAAC;IACpC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACnE;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACjD;;;OAGG;IACH,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACtD;;;;;OAKG;IACH,yBAAyB,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAClE;;;OAGG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAClD;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,sBAAsB,GAAG,MAAM,CAkC7E"}
|
|
1
|
+
{"version":3,"file":"launchCommand.d.ts","sourceRoot":"","sources":["../../src/lib/launchCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,17 @@ import { BUILD_SECRET_NAMES, hasPreLaunchEnv, } from "./config.js";
|
|
|
5
5
|
import { clearanceAllowHostsFilesFromEnvironment } from "./clearanceAllowlist.js";
|
|
6
6
|
import { shellSingleQuote } from "./shell.js";
|
|
7
7
|
export { shellSingleQuote } from "./shell.js";
|
|
8
|
+
/**
|
|
9
|
+
* Return a copy of `definition` whose `cmd` has the agent's `resumeArgs`
|
|
10
|
+
* appended, so `crew resume` relaunches the agent into its previous
|
|
11
|
+
* conversation (e.g. `--continue` for Claude, `resume --last` for Codex).
|
|
12
|
+
* Appending after the base `cmd` keeps the first token — which
|
|
13
|
+
* `inferAgentCommandName` reads for the safehouse profile — and the trailing
|
|
14
|
+
* `"$_p"` prompt positional the launch builders add both intact.
|
|
15
|
+
*/
|
|
16
|
+
export function withResumeArgs(definition, resumeArgs) {
|
|
17
|
+
return { ...definition, cmd: `${definition.cmd} ${resumeArgs}` };
|
|
18
|
+
}
|
|
8
19
|
/**
|
|
9
20
|
* Resolve the shipped Safehouse proxy wrapper inside `@clipboard-health/clearance`
|
|
10
21
|
* via Node's module-resolution algorithm so the path works whether npm hoists
|
|
@@ -369,8 +380,7 @@ function buildUnwrappedHostLaunchCommand(arguments_) {
|
|
|
369
380
|
if (arguments_.secretsFile !== undefined) {
|
|
370
381
|
lines.push(unsetSecretsLine());
|
|
371
382
|
}
|
|
372
|
-
lines.push(...workerEnvironmentExports(arguments_.workerEnvironment)
|
|
373
|
-
lines.push(...preLaunchPromptAndExec({
|
|
383
|
+
lines.push(...workerEnvironmentExports(arguments_.workerEnvironment), ...preLaunchPromptAndExec({
|
|
374
384
|
definition: arguments_.definition,
|
|
375
385
|
worktreeDir: arguments_.worktreeDir,
|
|
376
386
|
promptFile: arguments_.promptFile,
|
|
@@ -443,6 +453,9 @@ function buildSafehouseLaunchCommand(arguments_) {
|
|
|
443
453
|
const safehouseAddDirsFlag = safehousePathListFlag("--add-dirs", safehousePrepareAddDirs);
|
|
444
454
|
const safehouseAgentAddDirsFlag = safehousePathListFlag("--add-dirs", safehouseAgentAddDirs);
|
|
445
455
|
const safehouseAgentAddDirsReadOnlyFlag = safehousePathListFlag("--add-dirs-ro", safehouseAgentIntegration?.addDirsReadOnly ?? []);
|
|
456
|
+
// Optional sandbox integrations (e.g. `agent-browser`) layered onto the agent
|
|
457
|
+
// profile only — the repo-controlled prepareWorktree hook never needs them.
|
|
458
|
+
const safehouseEnableFlag = safehouseEnableFeaturesFlag(arguments_.safehouseEnableFeatures ?? []);
|
|
446
459
|
const safehouseWrapper = safehouseWrapperCommand(arguments_.networkEgress);
|
|
447
460
|
// Defensive shim+promptDir trap: by the time we arm it, `rm -rf <promptDir>`
|
|
448
461
|
// has already run (line below) so the promptDir wipe is a no-op on the happy
|
|
@@ -472,12 +485,15 @@ function buildSafehouseLaunchCommand(arguments_) {
|
|
|
472
485
|
// Running the real launch chain as `sh -c` would make it see `sh`, so use
|
|
473
486
|
// an agent-named symlink to /bin/sh. This preserves per-agent profile
|
|
474
487
|
// selection without enabling every agent profile.
|
|
475
|
-
`{ ${safehouseWrapper} ${safehouseAgentAddDirsFlag}${safehouseAgentAddDirsReadOnlyFlag}${agentEnvPassFlag}"$_safehouse_shim" -c ${shellSingleQuote(agentCommand)} sh${promptPositional(arguments_.omitPromptArgument)}; _safehouse_status=$?; rm -rf "$_safehouse_shim_dir"; trap - EXIT; exit "$_safehouse_status"; }`);
|
|
488
|
+
`{ ${safehouseWrapper} ${safehouseAgentAddDirsFlag}${safehouseAgentAddDirsReadOnlyFlag}${safehouseEnableFlag}${agentEnvPassFlag}"$_safehouse_shim" -c ${shellSingleQuote(agentCommand)} sh${promptPositional(arguments_.omitPromptArgument)}; _safehouse_status=$?; rm -rf "$_safehouse_shim_dir"; trap - EXIT; exit "$_safehouse_status"; }`);
|
|
476
489
|
return lines.join(" && ");
|
|
477
490
|
}
|
|
478
491
|
function safehousePathListFlag(flagName, paths) {
|
|
479
492
|
return paths.length === 0 ? "" : `${flagName}=${shellSingleQuote(paths.join(":"))} `;
|
|
480
493
|
}
|
|
494
|
+
function safehouseEnableFeaturesFlag(features) {
|
|
495
|
+
return features.length === 0 ? "" : `--enable=${shellSingleQuote(features.join(","))} `;
|
|
496
|
+
}
|
|
481
497
|
function uniqueStrings(values) {
|
|
482
498
|
return [...new Set(values)];
|
|
483
499
|
}
|
|
@@ -605,8 +621,7 @@ function buildSdxLaunchCommand(arguments_) {
|
|
|
605
621
|
if (arguments_.secretsFile !== undefined) {
|
|
606
622
|
innerParts.push(unsetSecretsLine());
|
|
607
623
|
}
|
|
608
|
-
innerParts.push(...workerEnvironmentExports(arguments_.workerEnvironment));
|
|
609
|
-
innerParts.push(agentCommand);
|
|
624
|
+
innerParts.push(...workerEnvironmentExports(arguments_.workerEnvironment), agentCommand);
|
|
610
625
|
const innerCommand = innerParts.join("; ");
|
|
611
626
|
// Passthrough form (`-e KEY` without `=VALUE`): sbx reads each value
|
|
612
627
|
// from its own env at invocation time — populated by sourceSecretsLine
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taskSourceFilesystem.d.ts","sourceRoot":"","sources":["../../src/lib/taskSourceFilesystem.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAUlD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,SAAS,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"taskSourceFilesystem.d.ts","sourceRoot":"","sources":["../../src/lib/taskSourceFilesystem.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAUlD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,SAAS,MAAM,EAAE,CAwCpB"}
|
|
@@ -36,8 +36,7 @@ export function taskSourceWritePathsForCompletion(input) {
|
|
|
36
36
|
const source = todoTxtAdapterConfigSchema.parse(rawSource);
|
|
37
37
|
// Completion writeback writes the todo file plus lock/tmp siblings, so the
|
|
38
38
|
// sandbox grant must cover the todo file's parent directory.
|
|
39
|
-
paths.push(resolveForWorker(input.workingDir, path.dirname(source.todoPath)));
|
|
40
|
-
paths.push(resolveForWorker(input.workingDir, source.tasksDir));
|
|
39
|
+
paths.push(resolveForWorker(input.workingDir, path.dirname(source.todoPath)), resolveForWorker(input.workingDir, source.tasksDir));
|
|
41
40
|
}
|
|
42
41
|
else {
|
|
43
42
|
// shell: open the directories the source declares it reads/writes in place
|
package/docs/commands.md
CHANGED
|
@@ -143,10 +143,12 @@ The command closes the cmux/tmux/zellij workspace if present, records local run
|
|
|
143
143
|
|
|
144
144
|
## Resume
|
|
145
145
|
|
|
146
|
-
`crew resume <TASK>` reopens an existing task worktree with a continuation prompt. Resume never creates a new worktree; if none exists it fails and leaves re-dispatch to `crew start <task>`.
|
|
146
|
+
`crew resume [--new] <TASK>` reopens an existing task worktree with a continuation prompt. Resume never creates a new worktree; if none exists it fails and leaves re-dispatch to `crew start <task>`.
|
|
147
147
|
|
|
148
148
|
The resume prompt tells the agent to inspect git status and diff before editing, includes the previous interrupt reason when recorded, and reuses the recorded agent, repository, branch, runner, sandbox, and workspace backend. When no run-state file exists but a worktree does, resume falls back to Linear resolution for the agent and task context.
|
|
149
149
|
|
|
150
|
+
`crew resume <TASK>` reopens the agent's previous conversation in the worktree by default — the built-in `claude` and `codex` presets ship a [`resumeArgs`](./configuration.md#resuming-the-agents-conversation) default (`--continue`, `resume --last`) that groundcrew appends to the agent's command. `crew resume --new <TASK>` ignores `resumeArgs` and forces a fresh conversation. Custom agents cold-start unless they set `resumeArgs`. groundcrew stores no session id — it relies on one conversation per worktree.
|
|
151
|
+
|
|
150
152
|
## Open
|
|
151
153
|
|
|
152
154
|
`crew open` provisions a worktree for an existing pull request or branch — work that groundcrew did not create — and launches a session in it. Use it to iterate on a PR opened by hand, by a teammate, or by another tool.
|
package/docs/configuration.md
CHANGED
|
@@ -201,6 +201,27 @@ Rules:
|
|
|
201
201
|
- `agents.default` must point at an enabled agent.
|
|
202
202
|
- Legacy agent entries like `codex: { disabled: true }` are rejected with migration guidance; remove unwanted entries instead.
|
|
203
203
|
|
|
204
|
+
## Resuming the agent's conversation
|
|
205
|
+
|
|
206
|
+
`crew resume` reopens the agent's previous conversation in the worktree — **no config required** for the built-in agents. The shipped `claude` and `codex` presets carry a `resumeArgs` default (`--continue` and `resume --last`), which groundcrew appends to the agent's command on resume.
|
|
207
|
+
|
|
208
|
+
How it works:
|
|
209
|
+
|
|
210
|
+
- The first launch is unchanged — the agent creates its own conversation in the worktree.
|
|
211
|
+
- `crew resume <TASK>` appends `resumeArgs` to the agent's `cmd`, so the agent reopens that conversation (`claude --continue`, `codex … resume --last`). groundcrew stores no session id — each task has its own worktree, so the agent's "resume the latest conversation in this directory" primitive is enough.
|
|
212
|
+
- `crew resume --new <TASK>` ignores `resumeArgs` and cold-starts a fresh conversation.
|
|
213
|
+
- `resumeArgs` is appended after `cmd`, so the agent binary (and its safehouse profile) and the trailing prompt argument are unaffected. It assumes one conversation per worktree — if you manually open extra sessions in that directory, "latest" may not be the one you expect.
|
|
214
|
+
|
|
215
|
+
Set `resumeArgs` yourself to enable this for a **custom** agent, or to override/replace the preset default:
|
|
216
|
+
|
|
217
|
+
```ts
|
|
218
|
+
agents: {
|
|
219
|
+
definitions: {
|
|
220
|
+
"claude-opus": { cmd: "claude --model claude-opus-4-8 --permission-mode auto", color: "#8A4FFF", resumeArgs: "--continue" },
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
```
|
|
224
|
+
|
|
204
225
|
## Prompt Customization
|
|
205
226
|
|
|
206
227
|
Groundcrew ships one agent-agnostic unattended prompt by default. It tells the agent to make reasonable assumptions, follow repository instructions, run documented verification, review its diff, open a PR when GitHub/`gh` is available, and include a workspace continuation hint when known.
|
|
@@ -312,6 +333,7 @@ and hook contract.
|
|
|
312
333
|
| `agents.definitions.<name>.sandbox` | optional | Docker Sandboxes binding for the agent. Required at launch when `local.runner` resolves to `sdx`. Field: `agent` (required sbx agent name). Groundcrew assumes the `groundcrew-<agent>` sandbox already exists. |
|
|
313
334
|
| `agents.definitions.<name>.preLaunch` | optional | Host-only shell snippet run before the agent exec and outside Safehouse/sdx. Exports survive into the launch shell; under the default `safehouse` runner they are only forwarded to the agent when listed via `preLaunchEnv` or when `cmd` includes its own `safehouse --env-pass=NAMES`. `{{worktree}}` is substituted. A non-zero exit aborts launch. Not supported when `local.runner` resolves to `sdx` in v1. |
|
|
314
335
|
| `agents.definitions.<name>.preLaunchEnv` | optional | Companion to `preLaunch`: list of env var names to append to groundcrew's Safehouse `--env-pass=` flag, so `preLaunch` exports reach the agent without overriding `cmd`. Each entry must match `[A-Za-z_][A-Za-z0-9_]*`. Under `runner: "none"` exports already inherit and `preLaunchEnv` is a no-op. An empty array is a uniform no-op in every runner; a non-empty list is rejected when `cmd` already starts with `safehouse` or when `runner` resolves to `sdx`. |
|
|
336
|
+
| `agents.definitions.<name>.resumeArgs` | preset default | Shell args appended to `cmd` on `crew resume` so the agent [reopens its previous conversation](#resuming-the-agents-conversation) in the worktree. Defaults to `"--continue"` (claude) and `"resume --last"` (codex) on the built-in presets; set it for custom agents or to override. `crew resume --new` ignores it and cold-starts. No session id is stored. |
|
|
315
337
|
| `prompts.initial` | unattended template | First message sent to the agent: the execution wrapper around each task. The task description is the task-specific prompt. Placeholders: `{{task}}`, `{{worktree}}`, `{{title}}`, `{{description}}`. Override only to change the execution contract for every task, such as team-wide review rules or tool conventions. Mutually exclusive with `prompts.promptFile`. |
|
|
316
338
|
| `prompts.promptFile` | optional | Path to a UTF-8 file whose contents become `prompts.initial`, read at load time. Resolved relative to the config file's directory; `~` is expanded and absolute paths are used as-is. The JSON-friendly alternative to inlining a large prompt or `readFileSync`. Mutually exclusive with `prompts.initial`. |
|
|
317
339
|
| `workspaceKind` | `"auto"` | Terminal session manager. `"auto"` picks `cmux` when on PATH, else `tmux`. Set to `"cmux"`, `"tmux"`, or `"zellij"` to fail loudly when the chosen backend is missing. |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clipboard-health/groundcrew",
|
|
3
|
-
"version": "4.45.
|
|
3
|
+
"version": "4.45.3",
|
|
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",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"verify": "node scripts/verifyAll.mts"
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|
|
72
|
-
"@anthropic-ai/sandbox-runtime": "0.0.
|
|
72
|
+
"@anthropic-ai/sandbox-runtime": "0.0.55",
|
|
73
73
|
"@clipboard-health/clearance": "1.3.2",
|
|
74
74
|
"@linear/sdk": "86.0.0",
|
|
75
75
|
"cosmiconfig": "9.0.2",
|
|
@@ -77,28 +77,28 @@
|
|
|
77
77
|
"zod": "4.4.3"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
|
-
"@clipboard-health/ai-rules": "2.
|
|
81
|
-
"@clipboard-health/oxlint-config": "1.
|
|
80
|
+
"@clipboard-health/ai-rules": "2.29.1",
|
|
81
|
+
"@clipboard-health/oxlint-config": "1.12.0",
|
|
82
82
|
"@nx/js": "22.7.5",
|
|
83
83
|
"@tsconfig/node24": "24.0.4",
|
|
84
84
|
"@tsconfig/strictest": "2.0.8",
|
|
85
|
-
"@types/node": "25.9.
|
|
86
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
87
|
-
"@vitest/coverage-v8": "4.1.
|
|
85
|
+
"@types/node": "25.9.4",
|
|
86
|
+
"@typescript/native-preview": "7.0.0-dev.20260618.1",
|
|
87
|
+
"@vitest/coverage-v8": "4.1.9",
|
|
88
88
|
"cspell": "10.0.1",
|
|
89
89
|
"dependency-cruiser": "17.4.3",
|
|
90
90
|
"husky": "9.1.7",
|
|
91
|
-
"jscpd": "5.0.
|
|
91
|
+
"jscpd": "5.0.10",
|
|
92
92
|
"knip": "6.16.1",
|
|
93
93
|
"lint-staged": "17.0.7",
|
|
94
94
|
"markdownlint-cli2": "0.22.1",
|
|
95
95
|
"nx": "22.7.5",
|
|
96
|
-
"oxfmt": "0.
|
|
97
|
-
"oxlint": "1.
|
|
96
|
+
"oxfmt": "0.55.0",
|
|
97
|
+
"oxlint": "1.70.0",
|
|
98
98
|
"oxlint-tsgolint": "0.23.0",
|
|
99
|
-
"syncpack": "15.3.
|
|
99
|
+
"syncpack": "15.3.2",
|
|
100
100
|
"vite": "8.0.16",
|
|
101
|
-
"vitest": "4.1.
|
|
101
|
+
"vitest": "4.1.9"
|
|
102
102
|
},
|
|
103
103
|
"engines": {
|
|
104
104
|
"node": "24.14.1",
|