@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 +1 -1
- package/dist/commands/source.d.ts.map +1 -1
- package/dist/commands/source.js +4 -16
- package/dist/commands/task.d.ts.map +1 -1
- package/dist/commands/task.js +57 -2
- package/dist/lib/adapters/todo-txt/source.d.ts +1 -1
- package/dist/lib/adapters/todo-txt/source.d.ts.map +1 -1
- package/dist/lib/adapters/todo-txt/source.js +12 -2
- package/dist/lib/adapters/todo-txt/writeback.d.ts +1 -1
- package/dist/lib/adapters/todo-txt/writeback.d.ts.map +1 -1
- package/dist/lib/adapters/todo-txt/writeback.js +6 -3
- package/dist/lib/sourceCapabilities.d.ts +1 -0
- package/dist/lib/sourceCapabilities.d.ts.map +1 -1
- package/dist/lib/sourceCapabilities.js +4 -0
- package/dist/lib/taskSource.d.ts +6 -0
- package/dist/lib/taskSource.d.ts.map +1 -1
- package/dist/lib/util.d.ts +6 -0
- package/dist/lib/util.d.ts.map +1 -1
- package/dist/lib/util.js +19 -0
- package/package.json +1 -1
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 _[
|
|
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":"
|
|
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"}
|
package/dist/commands/source.js
CHANGED
|
@@ -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
|
-
|
|
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":"
|
|
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"}
|
package/dist/commands/task.js
CHANGED
|
@@ -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,
|
|
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;
|
|
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,
|
|
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;
|
|
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
|
}
|
|
@@ -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;
|
|
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);
|
package/dist/lib/taskSource.d.ts
CHANGED
|
@@ -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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"}
|
package/dist/lib/util.d.ts
CHANGED
|
@@ -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
|
package/dist/lib/util.d.ts.map
CHANGED
|
@@ -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