@clipboard-health/groundcrew 4.25.0 → 4.26.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 CHANGED
@@ -20,7 +20,7 @@
20
20
  <a href="./static/demo.tape"><img alt="Groundcrew dispatching tasks into tmux panes with coding agents running in parallel" src="./static/demo.gif" width="800"></a>
21
21
  </p>
22
22
 
23
- Groundcrew watches assigned tasks, creates isolated worktrees, launches agent CLIs in dedicated terminals, and leaves each task's work on its own PR-ready branch. For the backstory, read _[Tasks to pull requests while you sleep](https://www.clipboardworks.com/resources/blog/tasks-to-pull-requests-while-you-sleep)_.
23
+ Groundcrew watches assigned tasks, creates isolated worktrees, launches agent CLIs in dedicated terminals, and leaves each task's work on its own PR-ready branch. For the backstory, read _[Tickets to pull requests while you sleep](https://www.clipboardworks.com/resources/blog/tickets-to-pull-requests-while-you-sleep)_.
24
24
 
25
25
  ## Why
26
26
 
@@ -1 +1 @@
1
- {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/commands/source.ts"],"names":[],"mappings":"AA8IA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7D"}
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/commands/source.ts"],"names":[],"mappings":"AAiIA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7D"}
@@ -1,7 +1,7 @@
1
1
  import { buildSources, sourcesFromConfig } from "../lib/buildSources.js";
2
2
  import { loadConfig } from "../lib/config.js";
3
3
  import { summarizeSource } from "../lib/sourceCapabilities.js";
4
- import { errorMessage, writeOutput } from "../lib/util.js";
4
+ import { errorMessage, parseSourceFilterArgs, writeOutput } from "../lib/util.js";
5
5
  const SOURCE_USAGE = `Usage: crew source <subcommand>
6
6
 
7
7
  Subcommands:
@@ -42,6 +42,7 @@ function printSourceTable(summaries) {
42
42
  "LIST TASKS".padEnd(10),
43
43
  "GET TASK".padEnd(8),
44
44
  "CREATE".padEnd(6),
45
+ "VALIDATE".padEnd(8),
45
46
  "WRITEBACK",
46
47
  ].join(" ");
47
48
  writeOutput(header);
@@ -55,27 +56,14 @@ function printSourceTable(summaries) {
55
56
  yesNo(cap.listTasks).padEnd(10),
56
57
  yesNo(cap.getTask).padEnd(8),
57
58
  yesNo(cap.createTask).padEnd(6),
59
+ yesNo(cap.validate).padEnd(8),
58
60
  yesNo(writeback),
59
61
  ].join(" ");
60
62
  writeOutput(row);
61
63
  }
62
64
  }
63
65
  async function sourceVerifyCli(argv) {
64
- let jsonOutput = false;
65
- let targetSource;
66
- for (const arg of argv) {
67
- if (arg === "--json") {
68
- jsonOutput = true;
69
- continue;
70
- }
71
- if (arg.startsWith("-")) {
72
- throw new Error(`crew source verify: unknown option: ${arg}\nUsage: crew source verify [source] [--json]`);
73
- }
74
- if (targetSource !== undefined) {
75
- throw new Error("crew source verify: too many arguments\nUsage: crew source verify [source] [--json]");
76
- }
77
- targetSource = arg;
78
- }
66
+ const { targetSource, jsonOutput } = parseSourceFilterArgs(argv, "crew source verify", "Usage: crew source verify [source] [--json]");
79
67
  const config = await loadConfig();
80
68
  const rawSources = sourcesFromConfig(config);
81
69
  const allSources = await buildSources(rawSources, { globalConfig: config });
@@ -1 +1 @@
1
- {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"AAomBA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3D"}
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"AAmrBA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB3D"}
@@ -1,13 +1,14 @@
1
1
  import { buildSources, sourcesFromConfig } from "../lib/buildSources.js";
2
2
  import { AGENT_ANY_MODEL, loadConfig } from "../lib/config.js";
3
3
  import { naturalIdFromCanonical, } from "../lib/taskSource.js";
4
- import { writeOutput } from "../lib/util.js";
4
+ import { parseSourceFilterArgs, writeOutput } from "../lib/util.js";
5
5
  const TASK_USAGE = `Usage: crew task <subcommand>
6
6
 
7
7
  Subcommands:
8
8
  list [options] List tasks across configured sources
9
9
  get <task-id> [options] Get one task
10
- create "Short title" [options] Create one task`;
10
+ create "Short title" [options] Create one task
11
+ validate [source] [options] Validate task content`;
11
12
  const LIST_USAGE = `Usage: crew task list [options]
12
13
 
13
14
  Options:
@@ -471,6 +472,56 @@ async function taskCreateCli(argv) {
471
472
  }
472
473
  writeOutput(created.id);
473
474
  }
475
+ const VALIDATE_USAGE = `Usage: crew task validate [source]
476
+
477
+ Options:
478
+ --json Print results as JSON.`;
479
+ async function taskValidateCli(argv) {
480
+ const { targetSource, jsonOutput } = parseSourceFilterArgs(argv, "crew task validate", VALIDATE_USAGE);
481
+ // jscpd:ignore-start -- shared source-loading boilerplate; extracting to a helper would break vi.mock
482
+ const config = await loadConfig();
483
+ const rawSources = sourcesFromConfig(config);
484
+ const allSources = await buildSources(rawSources, { globalConfig: config });
485
+ let sources = allSources;
486
+ if (targetSource !== undefined) {
487
+ sources = allSources.filter((s) => s.name === targetSource);
488
+ if (sources.length === 0) {
489
+ throw new Error(`crew task validate: no source named "${targetSource}"`);
490
+ }
491
+ }
492
+ // jscpd:ignore-end
493
+ const results = await Promise.all(sources.map(async (source) => {
494
+ if (source.validate === undefined) {
495
+ return { source: source.name, supported: false, errors: [] };
496
+ }
497
+ const errors = await source.validate();
498
+ return { source: source.name, supported: true, errors };
499
+ }));
500
+ const hasErrors = results.some((r) => r.errors.length > 0);
501
+ if (jsonOutput) {
502
+ writeOutput(JSON.stringify(results.map(({ source, supported, errors }) => ({ source, supported, errors })), null, 2));
503
+ if (hasErrors) {
504
+ process.exitCode = 1;
505
+ }
506
+ return;
507
+ }
508
+ const nameWidth = Math.max(...results.map((r) => r.source.length));
509
+ for (const result of results) {
510
+ if (!result.supported) {
511
+ writeOutput(`${result.source.padEnd(nameWidth)} not supported`);
512
+ continue;
513
+ }
514
+ if (result.errors.length === 0) {
515
+ writeOutput(`${result.source.padEnd(nameWidth)} ok`);
516
+ }
517
+ else {
518
+ writeOutput(`${result.source.padEnd(nameWidth)} ${result.errors.length} error(s)\n${result.errors.map((e) => ` - ${e}`).join("\n")}`);
519
+ }
520
+ }
521
+ if (hasErrors) {
522
+ process.exitCode = 1;
523
+ }
524
+ }
474
525
  export async function taskCli(argv) {
475
526
  const [verb, ...rest] = argv;
476
527
  if (verb === "list") {
@@ -485,5 +536,9 @@ export async function taskCli(argv) {
485
536
  await taskCreateCli(rest);
486
537
  return;
487
538
  }
539
+ if (verb === "validate") {
540
+ await taskValidateCli(rest);
541
+ return;
542
+ }
488
543
  throw new Error(TASK_USAGE);
489
544
  }
@@ -1,5 +1,5 @@
1
1
  import type { AdapterContext } from "../../adapterDefinition.ts";
2
2
  import { type TaskSource } from "../../taskSource.ts";
3
3
  import type { TodoTxtAdapterConfig } from "./schema.ts";
4
- export declare function createTodoTxtTaskSource(config: TodoTxtAdapterConfig, _context: AdapterContext): TaskSource;
4
+ export declare function createTodoTxtTaskSource(config: TodoTxtAdapterConfig, context: AdapterContext): TaskSource;
5
5
  //# sourceMappingURL=source.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/todo-txt/source.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAKL,KAAK,UAAU,EAEhB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AA0RxD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,cAAc,GACvB,UAAU,CA4IZ"}
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/todo-txt/source.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAKL,KAAK,UAAU,EAEhB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AA0RxD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,cAAc,GACtB,UAAU,CAwJZ"}
@@ -1,6 +1,7 @@
1
1
  import { spawnSync } from "node:child_process";
2
2
  import { appendFileSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
3
3
  import path from "node:path";
4
+ import { AGENT_ANY_MODEL } from "../../config.js";
4
5
  import { toCanonicalId, } from "../../taskSource.js";
5
6
  import { readEnvironmentVariable } from "../../util.js";
6
7
  import { isActiveForFetch, normalizeToIssue } from "./normalizer.js";
@@ -245,10 +246,16 @@ function openPromptEditor(promptPath) {
245
246
  throw new Error(`todo-txt: editor exited with status ${result.status}`);
246
247
  }
247
248
  }
248
- export function createTodoTxtTaskSource(config, _context) {
249
+ export function createTodoTxtTaskSource(config, context) {
249
250
  const sourceName = config.name;
250
251
  /* v8 ignore next @preserve -- Covered in source tests; full-suite V8 coverage remaps this line inconsistently. */
251
252
  const { todoPath, tasksDir } = config;
253
+ const knownAgents = context.globalConfig.models === undefined
254
+ ? undefined
255
+ : new Set([
256
+ AGENT_ANY_MODEL,
257
+ ...Object.keys(context.globalConfig.models.definitions).map((k) => k.toLowerCase()),
258
+ ]);
252
259
  function listTasks() {
253
260
  const updatedAt = fileUpdatedAt(todoPath);
254
261
  const { parsedAll } = readAndParseTodo(todoPath);
@@ -299,11 +306,14 @@ export function createTodoTxtTaskSource(config, _context) {
299
306
  return {
300
307
  name: sourceName,
301
308
  async verify() {
302
- const errors = validateTodoFile(todoPath, tasksDir);
309
+ const errors = validateTodoFile(todoPath, tasksDir, knownAgents);
303
310
  if (errors.length > 0) {
304
311
  throw new Error(`todo-txt source "${sourceName}" verification failed:\n${errors.map((e) => ` - ${e}`).join("\n")}`);
305
312
  }
306
313
  },
314
+ async validate() {
315
+ return validateTodoFile(todoPath, tasksDir, knownAgents);
316
+ },
307
317
  async listTasks() {
308
318
  return listTasks();
309
319
  },
@@ -14,6 +14,6 @@ export declare function withLock<T>(lockPath: string, fn: () => T | Promise<T>):
14
14
  type StatusMutation = "in-progress" | "in-review" | "done";
15
15
  export declare function updateTaskStatus(options: UpdateOptions, newStatus: StatusMutation): Promise<RecurResult | undefined>;
16
16
  export declare function copyPromptFile(oldPath: string, newPath: string): void;
17
- export declare function validateTodoFile(todoPath: string, tasksDir: string): string[];
17
+ export declare function validateTodoFile(todoPath: string, tasksDir: string, knownAgents?: ReadonlySet<string>): string[];
18
18
  export {};
19
19
  //# sourceMappingURL=writeback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"writeback.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/todo-txt/writeback.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAoKD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,gBAAgB,CAAC;IACtB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAQxF;AAED,KAAK,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC;AA6E3D,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,cAAc,GACxB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAsElC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAQrE;AA4FD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA0C7E"}
1
+ {"version":3,"file":"writeback.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/todo-txt/writeback.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAoKD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,gBAAgB,CAAC;IACtB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAQxF;AAED,KAAK,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC;AA6E3D,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,cAAc,GACxB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAsElC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAQrE;AAgGD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,MAAM,EAAE,CA0CV"}
@@ -296,12 +296,15 @@ function validateDepsAndDates(parsed, parsedAll, id, prefix, errors) {
296
296
  errors.push(`${prefix}: malformed rec: "${recVal}" for task "${id}" (expected e.g. 1d, 1w, +1m)`);
297
297
  }
298
298
  }
299
- function validateActiveTaskLine(parsed, parsedAll, tasksDir, id, prefix, errors) {
299
+ function validateActiveTaskLine(parsed, parsedAll, tasksDir, id, prefix, errors, knownAgents) {
300
300
  const agent = parsed.metadata["agent"]?.[0];
301
301
  /* v8 ignore next @preserve -- parser KEY_VALUE_RE requires \S+, so empty agent values can't be parsed */
302
302
  if (agent !== undefined && agent.trim().length === 0) {
303
303
  errors.push(`${prefix}: empty agent: value for task "${id}"`);
304
304
  }
305
+ if (knownAgents !== undefined && agent !== undefined && !knownAgents.has(agent.toLowerCase())) {
306
+ errors.push(`${prefix}: unknown agent "${agent}" for task "${id}"`);
307
+ }
305
308
  const statusValue = parsed.metadata["status"]?.[0];
306
309
  const validStatuses = ["todo", "in-progress", "in-review", "done", "other"];
307
310
  if (statusValue !== undefined && !validStatuses.includes(statusValue)) {
@@ -315,7 +318,7 @@ function validateActiveTaskLine(parsed, parsedAll, tasksDir, id, prefix, errors)
315
318
  }
316
319
  validateDepsAndDates(parsed, parsedAll, id, prefix, errors);
317
320
  }
318
- export function validateTodoFile(todoPath, tasksDir) {
321
+ export function validateTodoFile(todoPath, tasksDir, knownAgents) {
319
322
  const errors = [];
320
323
  let content;
321
324
  try {
@@ -349,7 +352,7 @@ export function validateTodoFile(todoPath, tasksDir) {
349
352
  if (parsed.completed) {
350
353
  continue;
351
354
  }
352
- validateActiveTaskLine(parsed, parsedAll, tasksDir, id, prefix, errors);
355
+ validateActiveTaskLine(parsed, parsedAll, tasksDir, id, prefix, errors, knownAgents);
353
356
  }
354
357
  return errors;
355
358
  }
@@ -6,6 +6,7 @@ interface SourceCapabilities {
6
6
  markInProgress: boolean;
7
7
  markInReview: boolean;
8
8
  markDone: boolean;
9
+ validate: boolean;
9
10
  }
10
11
  export interface SourceSummary {
11
12
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"sourceCapabilities.d.ts","sourceRoot":"","sources":["../../src/lib/sourceCapabilities.ts"],"names":[],"mappings":"AAKA,UAAU,kBAAkB;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,kBAAkB,CAAC;CAClC;AAgDD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAiB3D"}
1
+ {"version":3,"file":"sourceCapabilities.d.ts","sourceRoot":"","sources":["../../src/lib/sourceCapabilities.ts"],"names":[],"mappings":"AAKA,UAAU,kBAAkB;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,kBAAkB,CAAC;CAClC;AAoDD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAiB3D"}
@@ -10,6 +10,7 @@ const LINEAR_CAPABILITIES = {
10
10
  markInProgress: true,
11
11
  markInReview: true,
12
12
  markDone: false,
13
+ validate: false,
13
14
  };
14
15
  const UNKNOWN_KIND_CAPABILITIES = {
15
16
  verify: false,
@@ -19,6 +20,7 @@ const UNKNOWN_KIND_CAPABILITIES = {
19
20
  markInProgress: false,
20
21
  markInReview: false,
21
22
  markDone: false,
23
+ validate: false,
22
24
  };
23
25
  function shellCapabilities(raw) {
24
26
  const config = shellAdapterConfigSchema.parse(raw);
@@ -31,6 +33,7 @@ function shellCapabilities(raw) {
31
33
  markInProgress: commands.markInProgress !== undefined,
32
34
  markInReview: commands.markInReview !== undefined,
33
35
  markDone: commands.markDone !== undefined,
36
+ validate: false,
34
37
  };
35
38
  }
36
39
  const TODO_TXT_CAPABILITIES = {
@@ -41,6 +44,7 @@ const TODO_TXT_CAPABILITIES = {
41
44
  markInProgress: true,
42
45
  markInReview: true,
43
46
  markDone: true,
47
+ validate: true,
44
48
  };
45
49
  export function summarizeSource(raw) {
46
50
  const { kind } = kindShape.parse(raw);
@@ -197,6 +197,12 @@ export interface TaskSource {
197
197
  * don't distinguish parents simply omit this method; Board returns [].
198
198
  */
199
199
  fetchParentSkips?: () => Promise<readonly ParentSkip[]>;
200
+ /**
201
+ * Optional: validate task content and return human-readable error strings.
202
+ * Sources that cannot validate task content omit this method.
203
+ * Unlike `verify()`, this never throws — errors are returned as an array.
204
+ */
205
+ validate?: () => Promise<string[]>;
200
206
  }
201
207
  export declare class RepositoryResolutionError extends Error {
202
208
  constructor(arguments_: {
@@ -1 +1 @@
1
- {"version":3,"file":"taskSource.d.ts","sourceRoot":"","sources":["../../src/lib/taskSource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"taskSource.d.ts","sourceRoot":"","sources":["../../src/lib/taskSource.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,12 @@ export interface DryRunPositionals {
46
46
  * command's `usage` string for the "Unknown option" error.
47
47
  */
48
48
  export declare function parseDryRunPositionals(argv: string[], usage: string): DryRunPositionals;
49
+ interface SourceFilterArgs {
50
+ targetSource: string | undefined;
51
+ jsonOutput: boolean;
52
+ }
53
+ /** Parse the `[source] [--json]` argument pattern shared by source-scoped subcommands. */
54
+ export declare function parseSourceFilterArgs(argv: string[], commandName: string, usage: string): SourceFilterArgs;
49
55
  export declare function errorMessage(error: unknown): string;
50
56
  export {};
51
57
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":"AAIA,wBAAsB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB3E;AAED,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAIlD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGhD;AAQD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE/C;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAWD,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AASD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAY7D;AAED,yEAAyE;AACzE,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOxF;AA8BD,iFAAiF;AACjF,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAOzC;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAS3C;AAED,KAAK,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;AAUpF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,IAAI,CAiBxF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvF;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAcvF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAcnD"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":"AAIA,wBAAsB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB3E;AAED,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAIlD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGhD;AAQD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE/C;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAWD,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AASD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAY7D;AAED,yEAAyE;AACzE,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOxF;AA8BD,iFAAiF;AACjF,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAOzC;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAS3C;AAED,KAAK,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;AAUpF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,IAAI,CAiBxF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvF;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAcvF;AAED,UAAU,gBAAgB;IACxB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,0FAA0F;AAC1F,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,gBAAgB,CAiBlB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAcnD"}
package/dist/lib/util.js CHANGED
@@ -212,6 +212,25 @@ export function parseDryRunPositionals(argv, usage) {
212
212
  }
213
213
  return { dryRun, positionals };
214
214
  }
215
+ /** Parse the `[source] [--json]` argument pattern shared by source-scoped subcommands. */
216
+ export function parseSourceFilterArgs(argv, commandName, usage) {
217
+ let jsonOutput = false;
218
+ let targetSource;
219
+ for (const arg of argv) {
220
+ if (arg === "--json") {
221
+ jsonOutput = true;
222
+ continue;
223
+ }
224
+ if (arg.startsWith("-")) {
225
+ throw new Error(`${commandName}: unknown option: ${arg}\n${usage}`);
226
+ }
227
+ if (targetSource !== undefined) {
228
+ throw new Error(`${commandName}: too many arguments\n${usage}`);
229
+ }
230
+ targetSource = arg;
231
+ }
232
+ return { targetSource, jsonOutput };
233
+ }
215
234
  export function errorMessage(error) {
216
235
  if (error instanceof Error) {
217
236
  return error.message;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clipboard-health/groundcrew",
3
- "version": "4.25.0",
3
+ "version": "4.26.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",