agentplane 0.1.6 → 0.1.8
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/assets/AGENTS.md +1 -1
- package/assets/agents/ORCHESTRATOR.json +1 -1
- package/assets/agents/UPGRADER.json +1 -1
- package/dist/backends/task-backend.d.ts +16 -0
- package/dist/backends/task-backend.d.ts.map +1 -1
- package/dist/backends/task-backend.js +44 -0
- package/dist/backends/task-index.d.ts.map +1 -1
- package/dist/backends/task-index.js +3 -6
- package/dist/cli/command-guide.d.ts.map +1 -1
- package/dist/cli/command-guide.js +4 -4
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +7 -5
- package/dist/cli/run-cli.d.ts.map +1 -1
- package/dist/cli/run-cli.js +39 -78
- package/dist/commands/backend.d.ts.map +1 -1
- package/dist/commands/backend.js +17 -2
- package/dist/commands/branch/index.d.ts +60 -0
- package/dist/commands/branch/index.d.ts.map +1 -0
- package/dist/commands/branch/index.js +513 -0
- package/dist/commands/guard/index.d.ts +67 -0
- package/dist/commands/guard/index.d.ts.map +1 -0
- package/dist/commands/guard/index.js +367 -0
- package/dist/commands/hooks/index.d.ts +18 -0
- package/dist/commands/hooks/index.d.ts.map +1 -0
- package/dist/commands/hooks/index.js +290 -0
- package/dist/commands/pr/index.d.ts +46 -0
- package/dist/commands/pr/index.d.ts.map +1 -0
- package/dist/commands/pr/index.js +857 -0
- package/dist/commands/recipes.d.ts.map +1 -1
- package/dist/commands/recipes.js +67 -23
- package/dist/commands/shared/git-diff.d.ts +9 -0
- package/dist/commands/shared/git-diff.d.ts.map +1 -0
- package/dist/commands/shared/git-diff.js +41 -0
- package/dist/commands/shared/git-ops.d.ts +24 -0
- package/dist/commands/shared/git-ops.d.ts.map +1 -0
- package/dist/commands/shared/git-ops.js +181 -0
- package/dist/commands/shared/git-worktree.d.ts +8 -0
- package/dist/commands/shared/git-worktree.d.ts.map +1 -0
- package/dist/commands/shared/git-worktree.js +48 -0
- package/dist/commands/shared/git.d.ts +4 -0
- package/dist/commands/shared/git.d.ts.map +1 -0
- package/dist/commands/shared/git.js +14 -0
- package/dist/commands/shared/network-approval.d.ts +8 -0
- package/dist/commands/shared/network-approval.d.ts.map +1 -0
- package/dist/commands/shared/network-approval.js +25 -0
- package/dist/commands/shared/path.d.ts +3 -0
- package/dist/commands/shared/path.d.ts.map +1 -0
- package/dist/commands/shared/path.js +14 -0
- package/dist/commands/shared/pr-meta.d.ts +21 -0
- package/dist/commands/shared/pr-meta.d.ts.map +1 -0
- package/dist/commands/shared/pr-meta.js +72 -0
- package/dist/commands/shared/task-backend.d.ts +15 -0
- package/dist/commands/shared/task-backend.d.ts.map +1 -0
- package/dist/commands/shared/task-backend.js +61 -0
- package/dist/commands/task/add.d.ts +8 -0
- package/dist/commands/task/add.d.ts.map +1 -0
- package/dist/commands/task/add.js +164 -0
- package/dist/commands/task/block.d.ts +19 -0
- package/dist/commands/task/block.d.ts.map +1 -0
- package/dist/commands/task/block.js +86 -0
- package/dist/commands/task/comment.d.ts +8 -0
- package/dist/commands/task/comment.d.ts.map +1 -0
- package/dist/commands/task/comment.js +29 -0
- package/dist/commands/task/doc.d.ts +17 -0
- package/dist/commands/task/doc.d.ts.map +1 -0
- package/dist/commands/task/doc.js +220 -0
- package/dist/commands/task/export.d.ts +5 -0
- package/dist/commands/task/export.d.ts.map +1 -0
- package/dist/commands/task/export.js +27 -0
- package/dist/commands/task/finish.d.ts +27 -0
- package/dist/commands/task/finish.d.ts.map +1 -0
- package/dist/commands/task/finish.js +132 -0
- package/dist/commands/task/index.d.ts +26 -0
- package/dist/commands/task/index.d.ts.map +1 -0
- package/dist/commands/task/index.js +25 -0
- package/dist/commands/task/lint.d.ts +5 -0
- package/dist/commands/task/lint.d.ts.map +1 -0
- package/dist/commands/task/lint.js +22 -0
- package/dist/commands/task/list.d.ts +11 -0
- package/dist/commands/task/list.d.ts.map +1 -0
- package/dist/commands/task/list.js +54 -0
- package/dist/commands/task/migrate-doc.d.ts +8 -0
- package/dist/commands/task/migrate-doc.d.ts.map +1 -0
- package/dist/commands/task/migrate-doc.js +147 -0
- package/dist/commands/task/migrate.d.ts +6 -0
- package/dist/commands/task/migrate.d.ts.map +1 -0
- package/dist/commands/task/migrate.js +70 -0
- package/dist/commands/task/new.d.ts +8 -0
- package/dist/commands/task/new.d.ts.map +1 -0
- package/dist/commands/task/new.js +117 -0
- package/dist/commands/task/next.d.ts +6 -0
- package/dist/commands/task/next.d.ts.map +1 -0
- package/dist/commands/task/next.js +45 -0
- package/dist/commands/task/normalize.d.ts +6 -0
- package/dist/commands/task/normalize.d.ts.map +1 -0
- package/dist/commands/task/normalize.js +46 -0
- package/dist/commands/task/plan.d.ts +14 -0
- package/dist/commands/task/plan.d.ts.map +1 -0
- package/dist/commands/task/plan.js +217 -0
- package/dist/commands/task/ready.d.ts +6 -0
- package/dist/commands/task/ready.d.ts.map +1 -0
- package/dist/commands/task/ready.js +57 -0
- package/dist/commands/task/scaffold.d.ts +8 -0
- package/dist/commands/task/scaffold.d.ts.map +1 -0
- package/dist/commands/task/scaffold.js +142 -0
- package/dist/commands/task/scrub.d.ts +8 -0
- package/dist/commands/task/scrub.d.ts.map +1 -0
- package/dist/commands/task/scrub.js +121 -0
- package/dist/commands/task/search.d.ts +7 -0
- package/dist/commands/task/search.d.ts.map +1 -0
- package/dist/commands/task/search.js +79 -0
- package/dist/commands/task/set-status.d.ts +19 -0
- package/dist/commands/task/set-status.d.ts.map +1 -0
- package/dist/commands/task/set-status.js +123 -0
- package/dist/commands/task/shared.d.ts +48 -0
- package/dist/commands/task/shared.d.ts.map +1 -0
- package/dist/commands/task/shared.js +312 -0
- package/dist/commands/task/show.d.ts +6 -0
- package/dist/commands/task/show.d.ts.map +1 -0
- package/dist/commands/task/show.js +35 -0
- package/dist/commands/task/start.d.ts +19 -0
- package/dist/commands/task/start.d.ts.map +1 -0
- package/dist/commands/task/start.js +110 -0
- package/dist/commands/task/update.d.ts +8 -0
- package/dist/commands/task/update.d.ts.map +1 -0
- package/dist/commands/task/update.js +144 -0
- package/dist/commands/task/verify-record.d.ts +16 -0
- package/dist/commands/task/verify-record.d.ts.map +1 -0
- package/dist/commands/task/verify-record.js +277 -0
- package/dist/commands/task/verify.d.ts +2 -0
- package/dist/commands/task/verify.d.ts.map +1 -0
- package/dist/commands/task/verify.js +1 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +17 -2
- package/dist/commands/workflow.d.ts +5 -364
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +6 -4617
- package/package.json +2 -2
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { ensureDocSections, normalizeDocSectionName, parseDocSections, setMarkdownSection, } from "@agentplaneorg/core";
|
|
4
|
+
import { loadTaskBackend } from "../../backends/task-backend.js";
|
|
5
|
+
import { mapBackendError, mapCoreError } from "../../cli/error-map.js";
|
|
6
|
+
import { infoMessage, missingValueMessage, unknownEntityMessage, usageMessage, backendNotSupportedMessage, } from "../../cli/output.js";
|
|
7
|
+
import { CliError } from "../../shared/errors.js";
|
|
8
|
+
export const TASK_DOC_SET_USAGE = "Usage: agentplane task doc set <task-id> --section <name> (--text <text> | --file <path>)";
|
|
9
|
+
export const TASK_DOC_SET_USAGE_EXAMPLE = 'agentplane task doc set 202602030608-F1Q8AB --section Summary --text "..."';
|
|
10
|
+
export const TASK_DOC_SHOW_USAGE = "Usage: agentplane task doc show <task-id> [--section <name>] [--quiet]";
|
|
11
|
+
export const TASK_DOC_SHOW_USAGE_EXAMPLE = "agentplane task doc show 202602030608-F1Q8AB --section Summary";
|
|
12
|
+
function parseTaskDocShowFlags(args) {
|
|
13
|
+
const out = { quiet: false };
|
|
14
|
+
for (let i = 0; i < args.length; i++) {
|
|
15
|
+
const arg = args[i];
|
|
16
|
+
if (!arg)
|
|
17
|
+
continue;
|
|
18
|
+
if (arg === "--quiet") {
|
|
19
|
+
out.quiet = true;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (arg === "--section") {
|
|
23
|
+
const next = args[i + 1];
|
|
24
|
+
if (!next) {
|
|
25
|
+
throw new CliError({ exitCode: 2, code: "E_USAGE", message: missingValueMessage(arg) });
|
|
26
|
+
}
|
|
27
|
+
out.section = next;
|
|
28
|
+
i++;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
throw new CliError({ exitCode: 2, code: "E_USAGE", message: `Unknown flag: ${arg}` });
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
function parseTaskDocSetFlags(args) {
|
|
36
|
+
const out = {};
|
|
37
|
+
for (let i = 0; i < args.length; i++) {
|
|
38
|
+
const arg = args[i];
|
|
39
|
+
if (!arg)
|
|
40
|
+
continue;
|
|
41
|
+
if (!arg.startsWith("--")) {
|
|
42
|
+
throw new CliError({ exitCode: 2, code: "E_USAGE", message: `Unexpected argument: ${arg}` });
|
|
43
|
+
}
|
|
44
|
+
const next = args[i + 1];
|
|
45
|
+
if (!next) {
|
|
46
|
+
throw new CliError({ exitCode: 2, code: "E_USAGE", message: missingValueMessage(arg) });
|
|
47
|
+
}
|
|
48
|
+
switch (arg) {
|
|
49
|
+
case "--section": {
|
|
50
|
+
out.section = next;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
case "--text": {
|
|
54
|
+
out.text = next;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
case "--file": {
|
|
58
|
+
out.file = next;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case "--updated-by": {
|
|
62
|
+
out.updatedBy = next;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
default: {
|
|
66
|
+
throw new CliError({ exitCode: 2, code: "E_USAGE", message: `Unknown flag: ${arg}` });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
i++;
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
export async function cmdTaskDocSet(opts) {
|
|
74
|
+
const flags = parseTaskDocSetFlags(opts.args);
|
|
75
|
+
if (!flags.section) {
|
|
76
|
+
throw new CliError({
|
|
77
|
+
exitCode: 2,
|
|
78
|
+
code: "E_USAGE",
|
|
79
|
+
message: usageMessage(TASK_DOC_SET_USAGE, TASK_DOC_SET_USAGE_EXAMPLE),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const hasText = flags.text !== undefined;
|
|
83
|
+
const hasFile = flags.file !== undefined;
|
|
84
|
+
if (hasText === hasFile) {
|
|
85
|
+
throw new CliError({
|
|
86
|
+
exitCode: 2,
|
|
87
|
+
code: "E_USAGE",
|
|
88
|
+
message: usageMessage(TASK_DOC_SET_USAGE, TASK_DOC_SET_USAGE_EXAMPLE),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
let updatedBy;
|
|
92
|
+
if (flags.updatedBy !== undefined) {
|
|
93
|
+
const trimmed = flags.updatedBy.trim();
|
|
94
|
+
if (trimmed.length === 0) {
|
|
95
|
+
throw new CliError({
|
|
96
|
+
exitCode: 2,
|
|
97
|
+
code: "E_USAGE",
|
|
98
|
+
message: "--updated-by must be non-empty",
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
updatedBy = trimmed;
|
|
102
|
+
}
|
|
103
|
+
let text = flags.text ?? "";
|
|
104
|
+
if (hasFile) {
|
|
105
|
+
try {
|
|
106
|
+
text = await readFile(path.resolve(opts.cwd, flags.file ?? ""), "utf8");
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
throw mapCoreError(err, { command: "task doc set", filePath: flags.file ?? "" });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const { backend, resolved, config } = await loadTaskBackend({
|
|
114
|
+
cwd: opts.cwd,
|
|
115
|
+
rootOverride: opts.rootOverride ?? null,
|
|
116
|
+
});
|
|
117
|
+
if (!backend.getTaskDoc || !backend.setTaskDoc) {
|
|
118
|
+
throw new CliError({
|
|
119
|
+
exitCode: 2,
|
|
120
|
+
code: "E_USAGE",
|
|
121
|
+
message: backendNotSupportedMessage("task docs"),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const allowed = config.tasks.doc.sections;
|
|
125
|
+
if (!allowed.includes(flags.section)) {
|
|
126
|
+
throw new CliError({
|
|
127
|
+
exitCode: 2,
|
|
128
|
+
code: "E_USAGE",
|
|
129
|
+
message: unknownEntityMessage("doc section", flags.section),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
const normalizedAllowed = new Set(allowed.map((section) => normalizeDocSectionName(section)));
|
|
133
|
+
const targetKey = normalizeDocSectionName(flags.section);
|
|
134
|
+
const headingKeys = new Set();
|
|
135
|
+
for (const line of text.replaceAll("\r\n", "\n").split("\n")) {
|
|
136
|
+
const match = /^##\s+(.*)$/.exec(line.trim());
|
|
137
|
+
if (!match)
|
|
138
|
+
continue;
|
|
139
|
+
const key = normalizeDocSectionName(match[1] ?? "");
|
|
140
|
+
if (key && normalizedAllowed.has(key))
|
|
141
|
+
headingKeys.add(key);
|
|
142
|
+
}
|
|
143
|
+
const existing = await backend.getTaskDoc(opts.taskId);
|
|
144
|
+
const baseDoc = ensureDocSections(existing ?? "", config.tasks.doc.required_sections);
|
|
145
|
+
if (headingKeys.size > 0 && (headingKeys.size > 1 || !headingKeys.has(targetKey))) {
|
|
146
|
+
const fullDoc = ensureDocSections(text, config.tasks.doc.required_sections);
|
|
147
|
+
await backend.setTaskDoc(opts.taskId, fullDoc, updatedBy);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
let nextText = text;
|
|
151
|
+
if (headingKeys.size > 0 && headingKeys.has(targetKey)) {
|
|
152
|
+
const lines = nextText.replaceAll("\r\n", "\n").split("\n");
|
|
153
|
+
let firstContent = 0;
|
|
154
|
+
while (firstContent < lines.length && lines[firstContent]?.trim() === "")
|
|
155
|
+
firstContent++;
|
|
156
|
+
if ((lines[firstContent]?.trim() ?? "") === `## ${flags.section}`) {
|
|
157
|
+
lines.splice(firstContent, 1);
|
|
158
|
+
if (lines[firstContent]?.trim() === "")
|
|
159
|
+
lines.splice(firstContent, 1);
|
|
160
|
+
nextText = lines.join("\n");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const nextDoc = setMarkdownSection(baseDoc, flags.section, nextText);
|
|
164
|
+
const normalized = ensureDocSections(nextDoc, config.tasks.doc.required_sections);
|
|
165
|
+
await backend.setTaskDoc(opts.taskId, normalized, updatedBy);
|
|
166
|
+
}
|
|
167
|
+
const tasksDir = path.join(resolved.gitRoot, config.paths.workflow_dir);
|
|
168
|
+
process.stdout.write(`${path.join(tasksDir, opts.taskId, "README.md")}\n`);
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
if (err instanceof CliError)
|
|
173
|
+
throw err;
|
|
174
|
+
throw mapBackendError(err, { command: "task doc set", root: opts.rootOverride ?? null });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
export async function cmdTaskDocShow(opts) {
|
|
178
|
+
const flags = parseTaskDocShowFlags(opts.args);
|
|
179
|
+
try {
|
|
180
|
+
const { backend } = await loadTaskBackend({
|
|
181
|
+
cwd: opts.cwd,
|
|
182
|
+
rootOverride: opts.rootOverride ?? null,
|
|
183
|
+
});
|
|
184
|
+
if (!backend.getTaskDoc) {
|
|
185
|
+
throw new CliError({
|
|
186
|
+
exitCode: 2,
|
|
187
|
+
code: "E_USAGE",
|
|
188
|
+
message: backendNotSupportedMessage("task docs"),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
const doc = (await backend.getTaskDoc(opts.taskId)) ?? "";
|
|
192
|
+
if (flags.section) {
|
|
193
|
+
const sectionKey = normalizeDocSectionName(flags.section);
|
|
194
|
+
const { sections } = parseDocSections(doc);
|
|
195
|
+
const entry = sections.get(sectionKey);
|
|
196
|
+
const content = entry?.lines ?? [];
|
|
197
|
+
if (content.length > 0) {
|
|
198
|
+
process.stdout.write(`${content.join("\n").trimEnd()}\n`);
|
|
199
|
+
return 0;
|
|
200
|
+
}
|
|
201
|
+
if (!flags.quiet) {
|
|
202
|
+
process.stdout.write(`${infoMessage(`section has no content: ${flags.section}`)}\n`);
|
|
203
|
+
}
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
if (doc.trim()) {
|
|
207
|
+
process.stdout.write(`${doc.trimEnd()}\n`);
|
|
208
|
+
return 0;
|
|
209
|
+
}
|
|
210
|
+
if (!flags.quiet) {
|
|
211
|
+
process.stdout.write(`${infoMessage("task doc metadata missing")}\n`);
|
|
212
|
+
}
|
|
213
|
+
return 0;
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
if (err instanceof CliError)
|
|
217
|
+
throw err;
|
|
218
|
+
throw mapBackendError(err, { command: "task doc show", root: opts.rootOverride ?? null });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/commands/task/export.ts"],"names":[],"mappings":"AAOA,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBjG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { loadTaskBackend } from "../../backends/task-backend.js";
|
|
3
|
+
import { mapBackendError } from "../../cli/error-map.js";
|
|
4
|
+
import { backendNotSupportedMessage } from "../../cli/output.js";
|
|
5
|
+
import { CliError } from "../../shared/errors.js";
|
|
6
|
+
export async function cmdTaskExport(opts) {
|
|
7
|
+
try {
|
|
8
|
+
const { backend, resolved, config } = await loadTaskBackend({
|
|
9
|
+
cwd: opts.cwd,
|
|
10
|
+
rootOverride: opts.rootOverride ?? null,
|
|
11
|
+
});
|
|
12
|
+
const outPath = path.join(resolved.gitRoot, config.paths.tasks_path);
|
|
13
|
+
if (!backend.exportTasksJson) {
|
|
14
|
+
throw new CliError({
|
|
15
|
+
exitCode: 3,
|
|
16
|
+
code: "E_VALIDATION",
|
|
17
|
+
message: backendNotSupportedMessage("exportTasksJson()"),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
await backend.exportTasksJson(outPath);
|
|
21
|
+
process.stdout.write(`${path.relative(resolved.gitRoot, outPath)}\n`);
|
|
22
|
+
return 0;
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
throw mapBackendError(err, { command: "task export", root: opts.rootOverride ?? null });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare const FINISH_USAGE = "Usage: agentplane finish <task-id> [<task-id>...] --author <id> --body <text> [flags]";
|
|
2
|
+
export declare const FINISH_USAGE_EXAMPLE = "agentplane finish 202602030608-F1Q8AB --author INTEGRATOR --body \"Verified: ...\"";
|
|
3
|
+
export declare function cmdFinish(opts: {
|
|
4
|
+
cwd: string;
|
|
5
|
+
rootOverride?: string;
|
|
6
|
+
taskIds: string[];
|
|
7
|
+
author: string;
|
|
8
|
+
body: string;
|
|
9
|
+
commit?: string;
|
|
10
|
+
skipVerify: boolean;
|
|
11
|
+
force: boolean;
|
|
12
|
+
noRequireTaskIdInCommit: boolean;
|
|
13
|
+
commitFromComment: boolean;
|
|
14
|
+
commitEmoji?: string;
|
|
15
|
+
commitAllow: string[];
|
|
16
|
+
commitAutoAllow: boolean;
|
|
17
|
+
commitAllowTasks: boolean;
|
|
18
|
+
commitRequireClean: boolean;
|
|
19
|
+
statusCommit: boolean;
|
|
20
|
+
statusCommitEmoji?: string;
|
|
21
|
+
statusCommitAllow: string[];
|
|
22
|
+
statusCommitAutoAllow: boolean;
|
|
23
|
+
statusCommitRequireClean: boolean;
|
|
24
|
+
confirmStatusCommit: boolean;
|
|
25
|
+
quiet: boolean;
|
|
26
|
+
}): Promise<number>;
|
|
27
|
+
//# sourceMappingURL=finish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finish.d.ts","sourceRoot":"","sources":["../../../src/commands/task/finish.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,YAAY,0FACgE,CAAC;AAC1F,eAAO,MAAM,oBAAoB,uFACmD,CAAC;AAErF,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,uBAAuB,EAAE,OAAO,CAAC;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,wBAAwB,EAAE,OAAO,CAAC;IAClC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoIlB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { loadConfig, resolveProject } from "@agentplaneorg/core";
|
|
2
|
+
import { loadTaskBackend } from "../../backends/task-backend.js";
|
|
3
|
+
import { mapBackendError } from "../../cli/error-map.js";
|
|
4
|
+
import { successMessage } from "../../cli/output.js";
|
|
5
|
+
import { formatCommentBodyForCommit } from "../../shared/comment-format.js";
|
|
6
|
+
import { CliError } from "../../shared/errors.js";
|
|
7
|
+
import { commitFromComment } from "../guard/index.js";
|
|
8
|
+
import { loadBackendTask } from "../shared/task-backend.js";
|
|
9
|
+
import { defaultCommitEmojiForStatus, enforceStatusCommitPolicy, ensureVerificationSatisfiedIfRequired, nowIso, readCommitInfo, readHeadCommit, requireStructuredComment, } from "./shared.js";
|
|
10
|
+
export const FINISH_USAGE = "Usage: agentplane finish <task-id> [<task-id>...] --author <id> --body <text> [flags]";
|
|
11
|
+
export const FINISH_USAGE_EXAMPLE = 'agentplane finish 202602030608-F1Q8AB --author INTEGRATOR --body "Verified: ..."';
|
|
12
|
+
export async function cmdFinish(opts) {
|
|
13
|
+
try {
|
|
14
|
+
if (opts.noRequireTaskIdInCommit) {
|
|
15
|
+
// Parity flag (commit subject checks are not enforced in node CLI).
|
|
16
|
+
}
|
|
17
|
+
const resolved = await resolveProject({
|
|
18
|
+
cwd: opts.cwd,
|
|
19
|
+
rootOverride: opts.rootOverride ?? null,
|
|
20
|
+
});
|
|
21
|
+
const loaded = await loadConfig(resolved.agentplaneDir);
|
|
22
|
+
const { prefix, min_chars: minChars } = loaded.config.tasks.comments.verified;
|
|
23
|
+
requireStructuredComment(opts.body, prefix, minChars);
|
|
24
|
+
if (opts.commitFromComment || opts.statusCommit) {
|
|
25
|
+
enforceStatusCommitPolicy({
|
|
26
|
+
policy: loaded.config.status_commit_policy,
|
|
27
|
+
action: "finish",
|
|
28
|
+
confirmed: opts.confirmStatusCommit,
|
|
29
|
+
quiet: opts.quiet,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if ((opts.commitFromComment || opts.statusCommit) && opts.taskIds.length !== 1) {
|
|
33
|
+
throw new CliError({
|
|
34
|
+
exitCode: 2,
|
|
35
|
+
code: "E_USAGE",
|
|
36
|
+
message: "--commit-from-comment/--status-commit requires exactly one task id",
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const primaryTaskId = opts.taskIds[0] ?? "";
|
|
40
|
+
if ((opts.commitFromComment || opts.statusCommit) && !primaryTaskId) {
|
|
41
|
+
throw new CliError({
|
|
42
|
+
exitCode: 2,
|
|
43
|
+
code: "E_USAGE",
|
|
44
|
+
message: "--commit-from-comment/--status-commit requires exactly one task id",
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const { backend } = await loadTaskBackend({
|
|
48
|
+
cwd: opts.cwd,
|
|
49
|
+
rootOverride: opts.rootOverride ?? null,
|
|
50
|
+
});
|
|
51
|
+
const commitInfo = opts.commit
|
|
52
|
+
? await readCommitInfo(resolved.gitRoot, opts.commit)
|
|
53
|
+
: await readHeadCommit(resolved.gitRoot);
|
|
54
|
+
for (const taskId of opts.taskIds) {
|
|
55
|
+
const { task } = await loadBackendTask({
|
|
56
|
+
cwd: opts.cwd,
|
|
57
|
+
rootOverride: opts.rootOverride,
|
|
58
|
+
taskId,
|
|
59
|
+
});
|
|
60
|
+
if (!opts.force) {
|
|
61
|
+
const currentStatus = String(task.status || "TODO").toUpperCase();
|
|
62
|
+
if (currentStatus === "DONE") {
|
|
63
|
+
throw new CliError({
|
|
64
|
+
exitCode: 2,
|
|
65
|
+
code: "E_USAGE",
|
|
66
|
+
message: `Task is already DONE: ${task.id} (use --force to override)`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
ensureVerificationSatisfiedIfRequired(task, loaded.config);
|
|
71
|
+
const existingComments = Array.isArray(task.comments)
|
|
72
|
+
? task.comments.filter((item) => !!item && typeof item.author === "string" && typeof item.body === "string")
|
|
73
|
+
: [];
|
|
74
|
+
const commentsValue = [...existingComments, { author: opts.author, body: opts.body }];
|
|
75
|
+
const nextTask = {
|
|
76
|
+
...task,
|
|
77
|
+
status: "DONE",
|
|
78
|
+
commit: { hash: commitInfo.hash, message: commitInfo.message },
|
|
79
|
+
comments: commentsValue,
|
|
80
|
+
doc_version: 2,
|
|
81
|
+
doc_updated_at: nowIso(),
|
|
82
|
+
doc_updated_by: opts.author,
|
|
83
|
+
};
|
|
84
|
+
await backend.writeTask(nextTask);
|
|
85
|
+
}
|
|
86
|
+
if (!opts.skipVerify) {
|
|
87
|
+
// No-op for parity; verify is handled by `agentplane verify`.
|
|
88
|
+
}
|
|
89
|
+
// tasks.json is export-only; generated via `agentplane task export`.
|
|
90
|
+
if (opts.commitFromComment) {
|
|
91
|
+
await commitFromComment({
|
|
92
|
+
cwd: opts.cwd,
|
|
93
|
+
rootOverride: opts.rootOverride,
|
|
94
|
+
taskId: primaryTaskId,
|
|
95
|
+
commentBody: opts.body,
|
|
96
|
+
formattedComment: formatCommentBodyForCommit(opts.body, loaded.config),
|
|
97
|
+
emoji: opts.commitEmoji ?? defaultCommitEmojiForStatus("DONE"),
|
|
98
|
+
allow: opts.commitAllow,
|
|
99
|
+
autoAllow: opts.commitAutoAllow || opts.commitAllow.length === 0,
|
|
100
|
+
allowTasks: opts.commitAllowTasks,
|
|
101
|
+
requireClean: opts.commitRequireClean,
|
|
102
|
+
quiet: opts.quiet,
|
|
103
|
+
config: loaded.config,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (opts.statusCommit) {
|
|
107
|
+
await commitFromComment({
|
|
108
|
+
cwd: opts.cwd,
|
|
109
|
+
rootOverride: opts.rootOverride,
|
|
110
|
+
taskId: primaryTaskId,
|
|
111
|
+
commentBody: opts.body,
|
|
112
|
+
formattedComment: formatCommentBodyForCommit(opts.body, loaded.config),
|
|
113
|
+
emoji: opts.statusCommitEmoji ?? defaultCommitEmojiForStatus("DONE"),
|
|
114
|
+
allow: opts.statusCommitAllow,
|
|
115
|
+
autoAllow: opts.statusCommitAutoAllow || opts.statusCommitAllow.length === 0,
|
|
116
|
+
allowTasks: true,
|
|
117
|
+
requireClean: opts.statusCommitRequireClean,
|
|
118
|
+
quiet: opts.quiet,
|
|
119
|
+
config: loaded.config,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (!opts.quiet) {
|
|
123
|
+
process.stdout.write(`${successMessage("finished")}\n`);
|
|
124
|
+
}
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
if (err instanceof CliError)
|
|
129
|
+
throw err;
|
|
130
|
+
throw mapBackendError(err, { command: "finish", root: opts.rootOverride ?? null });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export { TASK_NEW_USAGE, TASK_NEW_USAGE_EXAMPLE, cmdTaskNew } from "./new.js";
|
|
2
|
+
export { TASK_ADD_USAGE, TASK_ADD_USAGE_EXAMPLE, cmdTaskAdd } from "./add.js";
|
|
3
|
+
export { TASK_UPDATE_USAGE, TASK_UPDATE_USAGE_EXAMPLE, cmdTaskUpdate } from "./update.js";
|
|
4
|
+
export { TASK_SCRUB_USAGE, TASK_SCRUB_USAGE_EXAMPLE, cmdTaskScrub } from "./scrub.js";
|
|
5
|
+
export { cmdTaskListWithFilters, cmdTaskList } from "./list.js";
|
|
6
|
+
export { cmdTaskNext } from "./next.js";
|
|
7
|
+
export { cmdReady } from "./ready.js";
|
|
8
|
+
export { cmdTaskSearch } from "./search.js";
|
|
9
|
+
export { TASK_SCAFFOLD_USAGE, TASK_SCAFFOLD_USAGE_EXAMPLE, cmdTaskScaffold } from "./scaffold.js";
|
|
10
|
+
export { cmdTaskNormalize } from "./normalize.js";
|
|
11
|
+
export { cmdTaskMigrate } from "./migrate.js";
|
|
12
|
+
export { TASK_MIGRATE_DOC_USAGE, TASK_MIGRATE_DOC_USAGE_EXAMPLE, cmdTaskMigrateDoc, } from "./migrate-doc.js";
|
|
13
|
+
export { cmdTaskComment } from "./comment.js";
|
|
14
|
+
export { cmdTaskSetStatus } from "./set-status.js";
|
|
15
|
+
export { cmdTaskShow } from "./show.js";
|
|
16
|
+
export { cmdTaskExport } from "./export.js";
|
|
17
|
+
export { cmdTaskLint } from "./lint.js";
|
|
18
|
+
export { TASK_PLAN_USAGE, TASK_PLAN_USAGE_EXAMPLE, TASK_PLAN_SET_USAGE, TASK_PLAN_SET_USAGE_EXAMPLE, TASK_PLAN_APPROVE_USAGE, TASK_PLAN_APPROVE_USAGE_EXAMPLE, TASK_PLAN_REJECT_USAGE, TASK_PLAN_REJECT_USAGE_EXAMPLE, cmdTaskPlan, } from "./plan.js";
|
|
19
|
+
export { START_USAGE, START_USAGE_EXAMPLE, cmdStart } from "./start.js";
|
|
20
|
+
export { BLOCK_USAGE, BLOCK_USAGE_EXAMPLE, cmdBlock } from "./block.js";
|
|
21
|
+
export { FINISH_USAGE, FINISH_USAGE_EXAMPLE, cmdFinish } from "./finish.js";
|
|
22
|
+
export { VERIFY_USAGE, VERIFY_USAGE_EXAMPLE, cmdVerify } from "./verify.js";
|
|
23
|
+
export { TASK_VERIFY_USAGE, TASK_VERIFY_USAGE_EXAMPLE, cmdTaskVerify } from "./verify-record.js";
|
|
24
|
+
export { TASK_DOC_SET_USAGE, TASK_DOC_SET_USAGE_EXAMPLE, TASK_DOC_SHOW_USAGE, TASK_DOC_SHOW_USAGE_EXAMPLE, cmdTaskDocSet, cmdTaskDocShow, } from "./doc.js";
|
|
25
|
+
export { dedupeStrings } from "./shared.js";
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/task/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtF,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,sBAAsB,EACtB,8BAA8B,EAC9B,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,uBAAuB,EACvB,+BAA+B,EAC/B,sBAAsB,EACtB,8BAA8B,EAC9B,WAAW,GACZ,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEjG,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,mBAAmB,EACnB,2BAA2B,EAC3B,aAAa,EACb,cAAc,GACf,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { TASK_NEW_USAGE, TASK_NEW_USAGE_EXAMPLE, cmdTaskNew } from "./new.js";
|
|
2
|
+
export { TASK_ADD_USAGE, TASK_ADD_USAGE_EXAMPLE, cmdTaskAdd } from "./add.js";
|
|
3
|
+
export { TASK_UPDATE_USAGE, TASK_UPDATE_USAGE_EXAMPLE, cmdTaskUpdate } from "./update.js";
|
|
4
|
+
export { TASK_SCRUB_USAGE, TASK_SCRUB_USAGE_EXAMPLE, cmdTaskScrub } from "./scrub.js";
|
|
5
|
+
export { cmdTaskListWithFilters, cmdTaskList } from "./list.js";
|
|
6
|
+
export { cmdTaskNext } from "./next.js";
|
|
7
|
+
export { cmdReady } from "./ready.js";
|
|
8
|
+
export { cmdTaskSearch } from "./search.js";
|
|
9
|
+
export { TASK_SCAFFOLD_USAGE, TASK_SCAFFOLD_USAGE_EXAMPLE, cmdTaskScaffold } from "./scaffold.js";
|
|
10
|
+
export { cmdTaskNormalize } from "./normalize.js";
|
|
11
|
+
export { cmdTaskMigrate } from "./migrate.js";
|
|
12
|
+
export { TASK_MIGRATE_DOC_USAGE, TASK_MIGRATE_DOC_USAGE_EXAMPLE, cmdTaskMigrateDoc, } from "./migrate-doc.js";
|
|
13
|
+
export { cmdTaskComment } from "./comment.js";
|
|
14
|
+
export { cmdTaskSetStatus } from "./set-status.js";
|
|
15
|
+
export { cmdTaskShow } from "./show.js";
|
|
16
|
+
export { cmdTaskExport } from "./export.js";
|
|
17
|
+
export { cmdTaskLint } from "./lint.js";
|
|
18
|
+
export { TASK_PLAN_USAGE, TASK_PLAN_USAGE_EXAMPLE, TASK_PLAN_SET_USAGE, TASK_PLAN_SET_USAGE_EXAMPLE, TASK_PLAN_APPROVE_USAGE, TASK_PLAN_APPROVE_USAGE_EXAMPLE, TASK_PLAN_REJECT_USAGE, TASK_PLAN_REJECT_USAGE_EXAMPLE, cmdTaskPlan, } from "./plan.js";
|
|
19
|
+
export { START_USAGE, START_USAGE_EXAMPLE, cmdStart } from "./start.js";
|
|
20
|
+
export { BLOCK_USAGE, BLOCK_USAGE_EXAMPLE, cmdBlock } from "./block.js";
|
|
21
|
+
export { FINISH_USAGE, FINISH_USAGE_EXAMPLE, cmdFinish } from "./finish.js";
|
|
22
|
+
export { VERIFY_USAGE, VERIFY_USAGE_EXAMPLE, cmdVerify } from "./verify.js";
|
|
23
|
+
export { TASK_VERIFY_USAGE, TASK_VERIFY_USAGE_EXAMPLE, cmdTaskVerify } from "./verify-record.js";
|
|
24
|
+
export { TASK_DOC_SET_USAGE, TASK_DOC_SET_USAGE_EXAMPLE, TASK_DOC_SHOW_USAGE, TASK_DOC_SHOW_USAGE_EXAMPLE, cmdTaskDocSet, cmdTaskDocShow, } from "./doc.js";
|
|
25
|
+
export { dedupeStrings } from "./shared.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../../src/commands/task/lint.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB/F"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { lintTasksFile } from "@agentplaneorg/core";
|
|
2
|
+
import { mapCoreError } from "../../cli/error-map.js";
|
|
3
|
+
import { CliError } from "../../shared/errors.js";
|
|
4
|
+
export async function cmdTaskLint(opts) {
|
|
5
|
+
try {
|
|
6
|
+
const result = await lintTasksFile({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null });
|
|
7
|
+
if (result.errors.length > 0) {
|
|
8
|
+
throw new CliError({
|
|
9
|
+
exitCode: 3,
|
|
10
|
+
code: "E_VALIDATION",
|
|
11
|
+
message: result.errors.join("\n"),
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
process.stdout.write("OK\n");
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
if (err instanceof CliError)
|
|
19
|
+
throw err;
|
|
20
|
+
throw mapCoreError(err, { command: "task lint", root: opts.rootOverride ?? null });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function cmdTaskListWithFilters(opts: {
|
|
2
|
+
cwd: string;
|
|
3
|
+
rootOverride?: string;
|
|
4
|
+
args: string[];
|
|
5
|
+
}): Promise<number>;
|
|
6
|
+
export declare function cmdTaskList(opts: {
|
|
7
|
+
cwd: string;
|
|
8
|
+
rootOverride?: string;
|
|
9
|
+
args: string[];
|
|
10
|
+
}): Promise<number>;
|
|
11
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/task/list.ts"],"names":[],"mappings":"AAWA,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8ClB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAElB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { loadTaskBackend } from "../../backends/task-backend.js";
|
|
2
|
+
import { mapBackendError } from "../../cli/error-map.js";
|
|
3
|
+
import { buildDependencyState, dedupeStrings, formatTaskLine, parseTaskListFilters, toStringArray, } from "./shared.js";
|
|
4
|
+
export async function cmdTaskListWithFilters(opts) {
|
|
5
|
+
const filters = parseTaskListFilters(opts.args);
|
|
6
|
+
try {
|
|
7
|
+
const { backend } = await loadTaskBackend({
|
|
8
|
+
cwd: opts.cwd,
|
|
9
|
+
rootOverride: opts.rootOverride ?? null,
|
|
10
|
+
});
|
|
11
|
+
const tasks = await backend.listTasks();
|
|
12
|
+
const depState = buildDependencyState(tasks);
|
|
13
|
+
let filtered = tasks;
|
|
14
|
+
if (filters.status.length > 0) {
|
|
15
|
+
const wanted = new Set(filters.status.map((s) => s.trim().toUpperCase()));
|
|
16
|
+
filtered = filtered.filter((task) => wanted.has(String(task.status || "TODO").toUpperCase()));
|
|
17
|
+
}
|
|
18
|
+
if (filters.owner.length > 0) {
|
|
19
|
+
const wanted = new Set(filters.owner.map((o) => o.trim().toUpperCase()));
|
|
20
|
+
filtered = filtered.filter((task) => wanted.has(String(task.owner || "").toUpperCase()));
|
|
21
|
+
}
|
|
22
|
+
if (filters.tag.length > 0) {
|
|
23
|
+
const wanted = new Set(filters.tag.map((t) => t.trim()).filter(Boolean));
|
|
24
|
+
filtered = filtered.filter((task) => {
|
|
25
|
+
const tags = dedupeStrings(toStringArray(task.tags));
|
|
26
|
+
return tags.some((tag) => wanted.has(tag));
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const sorted = filtered.toSorted((a, b) => a.id.localeCompare(b.id));
|
|
30
|
+
for (const task of sorted) {
|
|
31
|
+
process.stdout.write(`${formatTaskLine(task, depState.get(task.id))}\n`);
|
|
32
|
+
}
|
|
33
|
+
if (!filters.quiet) {
|
|
34
|
+
const counts = {};
|
|
35
|
+
for (const task of sorted) {
|
|
36
|
+
const status = String(task.status || "TODO").toUpperCase();
|
|
37
|
+
counts[status] = (counts[status] ?? 0) + 1;
|
|
38
|
+
}
|
|
39
|
+
const total = sorted.length;
|
|
40
|
+
const summary = Object.keys(counts)
|
|
41
|
+
.toSorted()
|
|
42
|
+
.map((key) => `${key}=${counts[key]}`)
|
|
43
|
+
.join(", ");
|
|
44
|
+
process.stdout.write(`Total: ${total}${summary ? ` (${summary})` : ""}\n`);
|
|
45
|
+
}
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
throw mapBackendError(err, { command: "task list", root: opts.rootOverride ?? null });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function cmdTaskList(opts) {
|
|
53
|
+
return await cmdTaskListWithFilters(opts);
|
|
54
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const TASK_MIGRATE_DOC_USAGE = "Usage: agentplane task migrate-doc [<task-id> ...] [--all] [--quiet]";
|
|
2
|
+
export declare const TASK_MIGRATE_DOC_USAGE_EXAMPLE = "agentplane task migrate-doc --all";
|
|
3
|
+
export declare function cmdTaskMigrateDoc(opts: {
|
|
4
|
+
cwd: string;
|
|
5
|
+
rootOverride?: string;
|
|
6
|
+
args: string[];
|
|
7
|
+
}): Promise<number>;
|
|
8
|
+
//# sourceMappingURL=migrate-doc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-doc.d.ts","sourceRoot":"","sources":["../../../src/commands/task/migrate-doc.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,sBAAsB,yEACqC,CAAC;AACzE,eAAO,MAAM,8BAA8B,sCAAsC,CAAC;AAgHlF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwClB"}
|