agentplane 0.2.19 → 0.2.22
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 +6 -4
- package/bin/agentplane.js +24 -0
- package/dist/backends/task-backend/load.d.ts +2 -0
- package/dist/backends/task-backend/load.d.ts.map +1 -1
- package/dist/backends/task-backend/load.js +38 -18
- package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
- package/dist/backends/task-backend/local-backend.js +27 -7
- package/dist/cli/command-guide.d.ts.map +1 -1
- package/dist/cli/command-guide.js +12 -11
- package/dist/cli/run-cli/command-catalog.d.ts +1 -1
- package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
- package/dist/cli/run-cli/command-catalog.js +72 -13
- package/dist/cli/run-cli/commands/core.d.ts +11 -1
- package/dist/cli/run-cli/commands/core.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/core.js +295 -8
- package/dist/cli/run-cli/commands/init/write-agents.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init/write-agents.js +33 -1
- package/dist/cli/run-cli/commands/init/write-config.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init/write-config.js +4 -0
- package/dist/cli/run-cli/commands/init/write-gitignore.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init/write-gitignore.js +3 -18
- package/dist/cli/run-cli/commands/init.d.ts +1 -0
- package/dist/cli/run-cli/commands/init.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init.js +96 -31
- package/dist/cli/run-cli.d.ts.map +1 -1
- package/dist/cli/run-cli.js +86 -17
- package/dist/cli/spec/docs-render.d.ts.map +1 -1
- package/dist/cli/spec/docs-render.js +13 -6
- package/dist/commands/backend/sync.command.d.ts +3 -2
- package/dist/commands/backend/sync.command.d.ts.map +1 -1
- package/dist/commands/backend/sync.command.js +13 -15
- package/dist/commands/commit.command.d.ts.map +1 -1
- package/dist/commands/commit.command.js +2 -0
- package/dist/commands/commit.spec.d.ts +2 -0
- package/dist/commands/commit.spec.d.ts.map +1 -1
- package/dist/commands/commit.spec.js +26 -0
- package/dist/commands/doctor.run.d.ts.map +1 -1
- package/dist/commands/doctor.run.js +15 -6
- package/dist/commands/finish.run.d.ts.map +1 -1
- package/dist/commands/finish.run.js +2 -0
- package/dist/commands/finish.spec.d.ts +2 -0
- package/dist/commands/finish.spec.d.ts.map +1 -1
- package/dist/commands/finish.spec.js +36 -0
- package/dist/commands/guard/impl/allow.d.ts.map +1 -1
- package/dist/commands/guard/impl/allow.js +33 -7
- package/dist/commands/guard/impl/commands.d.ts +2 -0
- package/dist/commands/guard/impl/commands.d.ts.map +1 -1
- package/dist/commands/guard/impl/commands.js +24 -4
- package/dist/commands/guard/impl/comment-commit.d.ts +1 -0
- package/dist/commands/guard/impl/comment-commit.d.ts.map +1 -1
- package/dist/commands/guard/impl/comment-commit.js +16 -24
- package/dist/commands/pr/pr.command.d.ts +1 -1
- package/dist/commands/pr/pr.command.d.ts.map +1 -1
- package/dist/commands/pr/pr.command.js +15 -15
- package/dist/commands/release/apply.command.d.ts.map +1 -1
- package/dist/commands/release/apply.command.js +51 -3
- package/dist/commands/release/plan.command.d.ts.map +1 -1
- package/dist/commands/release/plan.command.js +25 -1
- package/dist/commands/shared/task-backend.d.ts +3 -0
- package/dist/commands/shared/task-backend.d.ts.map +1 -1
- package/dist/commands/shared/task-backend.js +4 -1
- package/dist/commands/task/block.d.ts.map +1 -1
- package/dist/commands/task/block.js +16 -16
- package/dist/commands/task/close-duplicate.command.d.ts +14 -0
- package/dist/commands/task/close-duplicate.command.d.ts.map +1 -0
- package/dist/commands/task/close-duplicate.command.js +102 -0
- package/dist/commands/task/close-duplicate.d.ts +14 -0
- package/dist/commands/task/close-duplicate.d.ts.map +1 -0
- package/dist/commands/task/close-duplicate.js +90 -0
- package/dist/commands/task/close-noop.command.d.ts +14 -0
- package/dist/commands/task/close-noop.command.d.ts.map +1 -0
- package/dist/commands/task/close-noop.command.js +77 -0
- package/dist/commands/task/close-noop.d.ts +13 -0
- package/dist/commands/task/close-noop.d.ts.map +1 -0
- package/dist/commands/task/close-noop.js +77 -0
- package/dist/commands/task/finish.d.ts +2 -0
- package/dist/commands/task/finish.d.ts.map +1 -1
- package/dist/commands/task/finish.js +63 -14
- package/dist/commands/task/index.d.ts +3 -0
- package/dist/commands/task/index.d.ts.map +1 -1
- package/dist/commands/task/index.js +3 -0
- package/dist/commands/task/new.d.ts.map +1 -1
- package/dist/commands/task/new.js +34 -6
- package/dist/commands/task/new.spec.js +1 -1
- package/dist/commands/task/plan.d.ts.map +1 -1
- package/dist/commands/task/plan.js +16 -5
- package/dist/commands/task/ready.d.ts.map +1 -1
- package/dist/commands/task/ready.js +6 -8
- package/dist/commands/task/set-status.d.ts.map +1 -1
- package/dist/commands/task/set-status.js +19 -21
- package/dist/commands/task/shared.d.ts +35 -1
- package/dist/commands/task/shared.d.ts.map +1 -1
- package/dist/commands/task/shared.js +188 -0
- package/dist/commands/task/start-ready.command.d.ts +14 -0
- package/dist/commands/task/start-ready.command.d.ts.map +1 -0
- package/dist/commands/task/start-ready.command.js +77 -0
- package/dist/commands/task/start-ready.d.ts +13 -0
- package/dist/commands/task/start-ready.d.ts.map +1 -0
- package/dist/commands/task/start-ready.js +37 -0
- package/dist/commands/task/start.d.ts.map +1 -1
- package/dist/commands/task/start.js +20 -23
- package/dist/commands/task/update.command.d.ts +1 -0
- package/dist/commands/task/update.command.d.ts.map +1 -1
- package/dist/commands/task/update.command.js +8 -0
- package/dist/commands/task/update.d.ts +1 -0
- package/dist/commands/task/update.d.ts.map +1 -1
- package/dist/commands/task/update.js +19 -3
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +67 -19
- package/dist/shared/errors.d.ts +9 -1
- package/dist/shared/errors.d.ts.map +1 -1
- package/dist/shared/errors.js +3 -1
- package/dist/shared/runtime-artifacts.d.ts +3 -0
- package/dist/shared/runtime-artifacts.d.ts.map +1 -0
- package/dist/shared/runtime-artifacts.js +18 -0
- package/dist/usecases/context/resolve-context.d.ts +3 -0
- package/dist/usecases/context/resolve-context.d.ts.map +1 -1
- package/dist/usecases/context/resolve-context.js +6 -1
- package/package.json +2 -2
- package/dist/cli/parse/lifecycle.d.ts +0 -64
- package/dist/cli/parse/lifecycle.d.ts.map +0 -1
- package/dist/cli/parse/lifecycle.js +0 -285
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { usageError } from "../../cli/spec/errors.js";
|
|
2
|
+
import { cmdTaskCloseDuplicate } from "./close-duplicate.js";
|
|
3
|
+
export const taskCloseDuplicateSpec = {
|
|
4
|
+
id: ["task", "close-duplicate"],
|
|
5
|
+
group: "Task",
|
|
6
|
+
summary: "Close a task as a duplicate of another task with no-op bookkeeping metadata.",
|
|
7
|
+
args: [{ name: "task-id", required: true, valueHint: "<task-id>" }],
|
|
8
|
+
options: [
|
|
9
|
+
{
|
|
10
|
+
kind: "string",
|
|
11
|
+
name: "of",
|
|
12
|
+
valueHint: "<task-id>",
|
|
13
|
+
required: true,
|
|
14
|
+
description: "Canonical task id that this task duplicates.",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
kind: "string",
|
|
18
|
+
name: "author",
|
|
19
|
+
valueHint: "<id>",
|
|
20
|
+
required: true,
|
|
21
|
+
description: "Comment author id (e.g. ORCHESTRATOR).",
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
kind: "string",
|
|
25
|
+
name: "note",
|
|
26
|
+
valueHint: "<text>",
|
|
27
|
+
description: "Optional short reason appended to the closure comment.",
|
|
28
|
+
},
|
|
29
|
+
{ kind: "boolean", name: "force", default: false, description: "Force closure despite gates." },
|
|
30
|
+
{
|
|
31
|
+
kind: "boolean",
|
|
32
|
+
name: "yes",
|
|
33
|
+
default: false,
|
|
34
|
+
description: "Auto-approve force-action approval checks when required.",
|
|
35
|
+
},
|
|
36
|
+
{ kind: "boolean", name: "quiet", default: false, description: "Suppress output." },
|
|
37
|
+
],
|
|
38
|
+
examples: [
|
|
39
|
+
{
|
|
40
|
+
cmd: "agentplane task close-duplicate 202602120845-VKGC27 --of 202602120845-RWJ8K3 --author ORCHESTRATOR",
|
|
41
|
+
why: "Close accidental duplicate task in one command.",
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
validateRaw: (raw) => {
|
|
45
|
+
const taskId = typeof raw.args["task-id"] === "string" ? raw.args["task-id"].trim() : "";
|
|
46
|
+
const of = typeof raw.opts.of === "string" ? raw.opts.of.trim() : "";
|
|
47
|
+
const author = typeof raw.opts.author === "string" ? raw.opts.author.trim() : "";
|
|
48
|
+
const note = raw.opts.note;
|
|
49
|
+
if (!taskId) {
|
|
50
|
+
throw usageError({
|
|
51
|
+
spec: taskCloseDuplicateSpec,
|
|
52
|
+
message: "Invalid value for task-id: empty.",
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (!of) {
|
|
56
|
+
throw usageError({ spec: taskCloseDuplicateSpec, message: "Invalid value for --of: empty." });
|
|
57
|
+
}
|
|
58
|
+
if (!author) {
|
|
59
|
+
throw usageError({
|
|
60
|
+
spec: taskCloseDuplicateSpec,
|
|
61
|
+
message: "Invalid value for --author: empty.",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (typeof note === "string" && note.trim().length === 0) {
|
|
65
|
+
throw usageError({
|
|
66
|
+
spec: taskCloseDuplicateSpec,
|
|
67
|
+
message: "Invalid value for --note: empty.",
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (taskId === of) {
|
|
71
|
+
throw usageError({
|
|
72
|
+
spec: taskCloseDuplicateSpec,
|
|
73
|
+
message: "Duplicate target must differ from task-id.",
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
parse: (raw) => ({
|
|
78
|
+
taskId: String(raw.args["task-id"]),
|
|
79
|
+
duplicateOf: String(raw.opts.of),
|
|
80
|
+
author: String(raw.opts.author),
|
|
81
|
+
note: typeof raw.opts.note === "string" ? raw.opts.note : undefined,
|
|
82
|
+
force: raw.opts.force === true,
|
|
83
|
+
yes: raw.opts.yes === true,
|
|
84
|
+
quiet: raw.opts.quiet === true,
|
|
85
|
+
}),
|
|
86
|
+
};
|
|
87
|
+
export function makeRunTaskCloseDuplicateHandler(getCtx) {
|
|
88
|
+
return async (ctx, p) => {
|
|
89
|
+
return await cmdTaskCloseDuplicate({
|
|
90
|
+
ctx: await getCtx("task close-duplicate"),
|
|
91
|
+
cwd: ctx.cwd,
|
|
92
|
+
rootOverride: ctx.rootOverride,
|
|
93
|
+
taskId: p.taskId,
|
|
94
|
+
duplicateOf: p.duplicateOf,
|
|
95
|
+
author: p.author,
|
|
96
|
+
note: p.note,
|
|
97
|
+
force: p.force,
|
|
98
|
+
yes: p.yes,
|
|
99
|
+
quiet: p.quiet,
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type CommandContext } from "../shared/task-backend.js";
|
|
2
|
+
export declare function cmdTaskCloseDuplicate(opts: {
|
|
3
|
+
ctx: CommandContext;
|
|
4
|
+
cwd: string;
|
|
5
|
+
rootOverride?: string;
|
|
6
|
+
taskId: string;
|
|
7
|
+
duplicateOf: string;
|
|
8
|
+
author: string;
|
|
9
|
+
note?: string;
|
|
10
|
+
force: boolean;
|
|
11
|
+
yes: boolean;
|
|
12
|
+
quiet: boolean;
|
|
13
|
+
}): Promise<number>;
|
|
14
|
+
//# sourceMappingURL=close-duplicate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-duplicate.d.ts","sourceRoot":"","sources":["../../../src/commands/task/close-duplicate.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIrF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,cAAc,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuFlB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { mapBackendError } from "../../cli/error-map.js";
|
|
2
|
+
import { CliError } from "../../shared/errors.js";
|
|
3
|
+
import { ensureActionApproved } from "../shared/approval-requirements.js";
|
|
4
|
+
import { loadTaskFromContext } from "../shared/task-backend.js";
|
|
5
|
+
import { backendIsLocalFileBackend, getTaskStore } from "../shared/task-store.js";
|
|
6
|
+
import { appendTaskEvent, nowIso, requireStructuredComment } from "./shared.js";
|
|
7
|
+
export async function cmdTaskCloseDuplicate(opts) {
|
|
8
|
+
try {
|
|
9
|
+
const sourceId = opts.taskId.trim();
|
|
10
|
+
const duplicateOf = opts.duplicateOf.trim();
|
|
11
|
+
if (!sourceId || !duplicateOf) {
|
|
12
|
+
throw new CliError({
|
|
13
|
+
exitCode: 2,
|
|
14
|
+
code: "E_USAGE",
|
|
15
|
+
message: "Both task id and --of must be non-empty.",
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (sourceId === duplicateOf) {
|
|
19
|
+
throw new CliError({
|
|
20
|
+
exitCode: 2,
|
|
21
|
+
code: "E_USAGE",
|
|
22
|
+
message: `Duplicate target must differ from task id (${sourceId}).`,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (opts.force) {
|
|
26
|
+
await ensureActionApproved({
|
|
27
|
+
action: "force_action",
|
|
28
|
+
config: opts.ctx.config,
|
|
29
|
+
yes: opts.yes,
|
|
30
|
+
reason: "task close-duplicate --force",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const canonical = await loadTaskFromContext({ ctx: opts.ctx, taskId: duplicateOf });
|
|
34
|
+
const useStore = backendIsLocalFileBackend(opts.ctx);
|
|
35
|
+
const store = useStore ? getTaskStore(opts.ctx) : null;
|
|
36
|
+
const task = useStore
|
|
37
|
+
? await store.get(sourceId)
|
|
38
|
+
: await loadTaskFromContext({ ctx: opts.ctx, taskId: sourceId });
|
|
39
|
+
if (!opts.force && String(task.status || "TODO").toUpperCase() === "DONE") {
|
|
40
|
+
throw new CliError({
|
|
41
|
+
exitCode: 2,
|
|
42
|
+
code: "E_USAGE",
|
|
43
|
+
message: `Task is already DONE: ${sourceId} (use --force to override)`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const reason = opts.note?.trim();
|
|
47
|
+
const canonicalTitle = canonical.title?.trim() ? ` (${canonical.title.trim()})` : "";
|
|
48
|
+
const baseBody = `Verified: ${sourceId} is a bookkeeping duplicate of ${duplicateOf}${canonicalTitle}; ` +
|
|
49
|
+
"no code/config changes are expected in this task and closure is recorded as no-op.";
|
|
50
|
+
const body = reason ? `${baseBody}\n\nReason: ${reason}` : baseBody;
|
|
51
|
+
const verifiedCfg = opts.ctx.config.tasks.comments.verified;
|
|
52
|
+
requireStructuredComment(body, verifiedCfg.prefix, verifiedCfg.min_chars);
|
|
53
|
+
const at = nowIso();
|
|
54
|
+
const next = {
|
|
55
|
+
...task,
|
|
56
|
+
status: "DONE",
|
|
57
|
+
comments: [
|
|
58
|
+
...(Array.isArray(task.comments) ? task.comments : []),
|
|
59
|
+
{ author: opts.author, body },
|
|
60
|
+
],
|
|
61
|
+
events: appendTaskEvent(task, {
|
|
62
|
+
type: "status",
|
|
63
|
+
at,
|
|
64
|
+
author: opts.author,
|
|
65
|
+
from: String(task.status || "TODO").toUpperCase(),
|
|
66
|
+
to: "DONE",
|
|
67
|
+
note: body,
|
|
68
|
+
}),
|
|
69
|
+
result_summary: `Closed as duplicate of ${duplicateOf}.`,
|
|
70
|
+
risk_level: "low",
|
|
71
|
+
breaking: false,
|
|
72
|
+
doc_version: 2,
|
|
73
|
+
doc_updated_at: at,
|
|
74
|
+
doc_updated_by: opts.author,
|
|
75
|
+
};
|
|
76
|
+
await (useStore ? store.update(sourceId, () => next) : opts.ctx.taskBackend.writeTask(next));
|
|
77
|
+
if (!opts.quiet) {
|
|
78
|
+
process.stdout.write(`task.done: ${sourceId} (duplicate of ${duplicateOf})\n`);
|
|
79
|
+
}
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
if (err instanceof CliError)
|
|
84
|
+
throw err;
|
|
85
|
+
throw mapBackendError(err, {
|
|
86
|
+
command: "task close-duplicate",
|
|
87
|
+
root: opts.rootOverride ?? null,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CommandCtx, CommandSpec } from "../../cli/spec/spec.js";
|
|
2
|
+
import type { CommandContext } from "../shared/task-backend.js";
|
|
3
|
+
type TaskCloseNoopParsed = {
|
|
4
|
+
taskId: string;
|
|
5
|
+
author: string;
|
|
6
|
+
note?: string;
|
|
7
|
+
force: boolean;
|
|
8
|
+
yes: boolean;
|
|
9
|
+
quiet: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare const taskCloseNoopSpec: CommandSpec<TaskCloseNoopParsed>;
|
|
12
|
+
export declare function makeRunTaskCloseNoopHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: TaskCloseNoopParsed) => Promise<number>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=close-noop.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-noop.command.d.ts","sourceRoot":"","sources":["../../../src/commands/task/close-noop.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,KAAK,mBAAmB,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,mBAAmB,CA2D9D,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAC5E,KAAK,UAAU,EAAE,GAAG,mBAAmB,KAAG,OAAO,CAAC,MAAM,CAAC,CAaxE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { usageError } from "../../cli/spec/errors.js";
|
|
2
|
+
import { cmdTaskCloseNoop } from "./close-noop.js";
|
|
3
|
+
export const taskCloseNoopSpec = {
|
|
4
|
+
id: ["task", "close-noop"],
|
|
5
|
+
group: "Task",
|
|
6
|
+
summary: "Close a task as a verified no-op in one command.",
|
|
7
|
+
args: [{ name: "task-id", required: true, valueHint: "<task-id>" }],
|
|
8
|
+
options: [
|
|
9
|
+
{
|
|
10
|
+
kind: "string",
|
|
11
|
+
name: "author",
|
|
12
|
+
valueHint: "<id>",
|
|
13
|
+
required: true,
|
|
14
|
+
description: "Comment author id (e.g. ORCHESTRATOR).",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
kind: "string",
|
|
18
|
+
name: "note",
|
|
19
|
+
valueHint: "<text>",
|
|
20
|
+
description: "Optional closure note.",
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
kind: "boolean",
|
|
24
|
+
name: "force",
|
|
25
|
+
default: false,
|
|
26
|
+
description: "Override status/verification gates.",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
kind: "boolean",
|
|
30
|
+
name: "yes",
|
|
31
|
+
default: false,
|
|
32
|
+
description: "Auto-approve force-action checks when required.",
|
|
33
|
+
},
|
|
34
|
+
{ kind: "boolean", name: "quiet", default: false, description: "Suppress output." },
|
|
35
|
+
],
|
|
36
|
+
examples: [
|
|
37
|
+
{
|
|
38
|
+
cmd: 'agentplane task close-noop 202602030608-F1Q8AB --author ORCHESTRATOR --note "Duplicate tracking artifact"',
|
|
39
|
+
why: "Close bookkeeping-only tasks without manual verify+finish choreography.",
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
validateRaw: (raw) => {
|
|
43
|
+
const taskId = typeof raw.args["task-id"] === "string" ? raw.args["task-id"].trim() : "";
|
|
44
|
+
const author = typeof raw.opts.author === "string" ? raw.opts.author.trim() : "";
|
|
45
|
+
const note = raw.opts.note;
|
|
46
|
+
if (!taskId)
|
|
47
|
+
throw usageError({ spec: taskCloseNoopSpec, message: "Invalid value for task-id: empty." });
|
|
48
|
+
if (!author)
|
|
49
|
+
throw usageError({ spec: taskCloseNoopSpec, message: "Invalid value for --author: empty." });
|
|
50
|
+
if (typeof note === "string" && note.trim().length === 0) {
|
|
51
|
+
throw usageError({ spec: taskCloseNoopSpec, message: "Invalid value for --note: empty." });
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
parse: (raw) => ({
|
|
55
|
+
taskId: String(raw.args["task-id"]),
|
|
56
|
+
author: String(raw.opts.author),
|
|
57
|
+
note: typeof raw.opts.note === "string" ? raw.opts.note : undefined,
|
|
58
|
+
force: raw.opts.force === true,
|
|
59
|
+
yes: raw.opts.yes === true,
|
|
60
|
+
quiet: raw.opts.quiet === true,
|
|
61
|
+
}),
|
|
62
|
+
};
|
|
63
|
+
export function makeRunTaskCloseNoopHandler(getCtx) {
|
|
64
|
+
return async (ctx, p) => {
|
|
65
|
+
return await cmdTaskCloseNoop({
|
|
66
|
+
ctx: await getCtx("task close-noop"),
|
|
67
|
+
cwd: ctx.cwd,
|
|
68
|
+
rootOverride: ctx.rootOverride,
|
|
69
|
+
taskId: p.taskId,
|
|
70
|
+
author: p.author,
|
|
71
|
+
note: p.note,
|
|
72
|
+
force: p.force,
|
|
73
|
+
yes: p.yes,
|
|
74
|
+
quiet: p.quiet,
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type CommandContext } from "../shared/task-backend.js";
|
|
2
|
+
export declare function cmdTaskCloseNoop(opts: {
|
|
3
|
+
ctx?: CommandContext;
|
|
4
|
+
cwd: string;
|
|
5
|
+
rootOverride?: string;
|
|
6
|
+
taskId: string;
|
|
7
|
+
author: string;
|
|
8
|
+
note?: string;
|
|
9
|
+
force: boolean;
|
|
10
|
+
yes: boolean;
|
|
11
|
+
quiet: boolean;
|
|
12
|
+
}): Promise<number>;
|
|
13
|
+
//# sourceMappingURL=close-noop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-noop.d.ts","sourceRoot":"","sources":["../../../src/commands/task/close-noop.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGpF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsElB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { mapBackendError } from "../../cli/error-map.js";
|
|
2
|
+
import { CliError } from "../../shared/errors.js";
|
|
3
|
+
import { ensureActionApproved } from "../shared/approval-requirements.js";
|
|
4
|
+
import { backendIsLocalFileBackend, getTaskStore } from "../shared/task-store.js";
|
|
5
|
+
import { loadCommandContext } from "../shared/task-backend.js";
|
|
6
|
+
import { appendTaskEvent, nowIso, requireStructuredComment } from "./shared.js";
|
|
7
|
+
export async function cmdTaskCloseNoop(opts) {
|
|
8
|
+
try {
|
|
9
|
+
const ctx = opts.ctx ??
|
|
10
|
+
(await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
|
|
11
|
+
if (opts.force) {
|
|
12
|
+
await ensureActionApproved({
|
|
13
|
+
action: "force_action",
|
|
14
|
+
config: ctx.config,
|
|
15
|
+
yes: opts.yes,
|
|
16
|
+
reason: "task close-noop --force",
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const useStore = backendIsLocalFileBackend(ctx);
|
|
20
|
+
const store = useStore ? getTaskStore(ctx) : null;
|
|
21
|
+
const task = useStore
|
|
22
|
+
? await store.get(opts.taskId)
|
|
23
|
+
: await ctx.taskBackend.getTask(opts.taskId);
|
|
24
|
+
if (!task) {
|
|
25
|
+
throw new CliError({
|
|
26
|
+
exitCode: 4,
|
|
27
|
+
code: "E_IO",
|
|
28
|
+
message: `Task not found: ${opts.taskId}`,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (!opts.force && String(task.status || "TODO").toUpperCase() === "DONE") {
|
|
32
|
+
throw new CliError({
|
|
33
|
+
exitCode: 2,
|
|
34
|
+
code: "E_USAGE",
|
|
35
|
+
message: `Task is already DONE: ${opts.taskId} (use --force to override)`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const normalizedNote = opts.note?.trim();
|
|
39
|
+
const baseBody = "Verified: no implementation changes were required; closure is recorded as no-op bookkeeping.";
|
|
40
|
+
const body = normalizedNote ? `${baseBody}\n\nNote: ${normalizedNote}` : baseBody;
|
|
41
|
+
const verifiedCfg = ctx.config.tasks.comments.verified;
|
|
42
|
+
requireStructuredComment(body, verifiedCfg.prefix, verifiedCfg.min_chars);
|
|
43
|
+
const at = nowIso();
|
|
44
|
+
const next = {
|
|
45
|
+
...task,
|
|
46
|
+
status: "DONE",
|
|
47
|
+
comments: [
|
|
48
|
+
...(Array.isArray(task.comments) ? task.comments : []),
|
|
49
|
+
{ author: opts.author, body },
|
|
50
|
+
],
|
|
51
|
+
events: appendTaskEvent(task, {
|
|
52
|
+
type: "status",
|
|
53
|
+
at,
|
|
54
|
+
author: opts.author,
|
|
55
|
+
from: String(task.status || "TODO").toUpperCase(),
|
|
56
|
+
to: "DONE",
|
|
57
|
+
note: body,
|
|
58
|
+
}),
|
|
59
|
+
result_summary: "No-op closure recorded.",
|
|
60
|
+
risk_level: "low",
|
|
61
|
+
breaking: false,
|
|
62
|
+
doc_version: 2,
|
|
63
|
+
doc_updated_at: at,
|
|
64
|
+
doc_updated_by: opts.author,
|
|
65
|
+
};
|
|
66
|
+
await (useStore ? store.update(opts.taskId, () => next) : ctx.taskBackend.writeTask(next));
|
|
67
|
+
if (!opts.quiet) {
|
|
68
|
+
process.stdout.write(`task.done: ${opts.taskId} (no-op)\n`);
|
|
69
|
+
}
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
if (err instanceof CliError)
|
|
74
|
+
throw err;
|
|
75
|
+
throw mapBackendError(err, { command: "task close-noop", root: opts.rootOverride ?? null });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -24,6 +24,8 @@ export declare function cmdFinish(opts: {
|
|
|
24
24
|
statusCommitAutoAllow: boolean;
|
|
25
25
|
statusCommitRequireClean: boolean;
|
|
26
26
|
confirmStatusCommit: boolean;
|
|
27
|
+
closeCommit?: boolean;
|
|
28
|
+
closeUnstageOthers?: boolean;
|
|
27
29
|
quiet: boolean;
|
|
28
30
|
}): Promise<number>;
|
|
29
31
|
//# sourceMappingURL=finish.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finish.d.ts","sourceRoot":"","sources":["../../../src/commands/task/finish.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"finish.d.ts","sourceRoot":"","sources":["../../../src/commands/task/finish.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAmCnC,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,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,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,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,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqUlB"}
|
|
@@ -4,12 +4,12 @@ import { formatCommentBodyForCommit } from "../../shared/comment-format.js";
|
|
|
4
4
|
import { CliError } from "../../shared/errors.js";
|
|
5
5
|
import { readFile, rm } from "node:fs/promises";
|
|
6
6
|
import path from "node:path";
|
|
7
|
-
import { buildGitCommitEnv, commitFromComment } from "../guard/index.js";
|
|
7
|
+
import { buildGitCommitEnv, cmdCommit, commitFromComment } from "../guard/index.js";
|
|
8
8
|
import { ensureActionApproved } from "../shared/approval-requirements.js";
|
|
9
9
|
import { loadCommandContext, loadTaskFromContext, } from "../shared/task-backend.js";
|
|
10
10
|
import { backendIsLocalFileBackend, getTaskStore } from "../shared/task-store.js";
|
|
11
11
|
import { readDirectWorkLock } from "../../shared/direct-work-lock.js";
|
|
12
|
-
import { appendTaskEvent, defaultCommitEmojiForStatus, enforceStatusCommitPolicy, ensureVerificationSatisfiedIfRequired, nowIso, readCommitInfo, readHeadCommit, requireStructuredComment, } from "./shared.js";
|
|
12
|
+
import { appendTaskEvent, defaultCommitEmojiForStatus, enforceStatusCommitPolicy, ensureVerificationSatisfiedIfRequired, nowIso, readCommitInfo, readHeadCommit, requireStructuredComment, resolvePrimaryTag, toStringArray, } from "./shared.js";
|
|
13
13
|
async function clearDirectWorkLockIfMatches(opts) {
|
|
14
14
|
const lockPath = path.join(opts.agentplaneDir, "cache", "direct-work.json");
|
|
15
15
|
try {
|
|
@@ -40,23 +40,36 @@ export async function cmdFinish(opts) {
|
|
|
40
40
|
}
|
|
41
41
|
const { prefix, min_chars: minChars } = ctx.config.tasks.comments.verified;
|
|
42
42
|
requireStructuredComment(opts.body, prefix, minChars);
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
const autoStatusCommit = (ctx.config.finish_auto_status_commit === true ||
|
|
44
|
+
ctx.config.commit_automation === "finish_only") &&
|
|
45
|
+
!opts.commitFromComment &&
|
|
46
|
+
!opts.statusCommit &&
|
|
47
|
+
opts.closeCommit !== true &&
|
|
48
|
+
opts.taskIds.length === 1;
|
|
49
|
+
const statusCommitRequested = opts.statusCommit || autoStatusCommit;
|
|
50
|
+
if ((opts.commitFromComment || statusCommitRequested) && opts.taskIds.length !== 1) {
|
|
51
|
+
throw new CliError({
|
|
52
|
+
exitCode: 2,
|
|
53
|
+
code: "E_USAGE",
|
|
54
|
+
message: "--commit-from-comment/--status-commit requires exactly one task id",
|
|
49
55
|
});
|
|
50
56
|
}
|
|
51
|
-
if (
|
|
57
|
+
if (opts.closeCommit && opts.taskIds.length !== 1) {
|
|
52
58
|
throw new CliError({
|
|
53
59
|
exitCode: 2,
|
|
54
60
|
code: "E_USAGE",
|
|
55
|
-
message: "--
|
|
61
|
+
message: "--close-commit requires exactly one task id",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (opts.closeCommit && (opts.commitFromComment || opts.statusCommit)) {
|
|
65
|
+
throw new CliError({
|
|
66
|
+
exitCode: 2,
|
|
67
|
+
code: "E_USAGE",
|
|
68
|
+
message: "--close-commit cannot be combined with --commit-from-comment/--status-commit",
|
|
56
69
|
});
|
|
57
70
|
}
|
|
58
71
|
const primaryTaskId = opts.taskIds[0] ?? "";
|
|
59
|
-
if ((opts.commitFromComment ||
|
|
72
|
+
if ((opts.commitFromComment || statusCommitRequested) && !primaryTaskId) {
|
|
60
73
|
throw new CliError({
|
|
61
74
|
exitCode: 2,
|
|
62
75
|
code: "E_USAGE",
|
|
@@ -82,6 +95,7 @@ export async function cmdFinish(opts) {
|
|
|
82
95
|
const riskLevel = opts.risk;
|
|
83
96
|
const breaking = opts.breaking === true;
|
|
84
97
|
let primaryStatusFrom = null;
|
|
98
|
+
let primaryTag = null;
|
|
85
99
|
for (const taskId of opts.taskIds) {
|
|
86
100
|
const task = useStore ? await store.get(taskId) : await loadTaskFromContext({ ctx, taskId });
|
|
87
101
|
if (!opts.force) {
|
|
@@ -95,9 +109,10 @@ export async function cmdFinish(opts) {
|
|
|
95
109
|
}
|
|
96
110
|
}
|
|
97
111
|
if (taskId === primaryTaskId &&
|
|
98
|
-
(opts.commitFromComment ||
|
|
112
|
+
(opts.commitFromComment || statusCommitRequested) &&
|
|
99
113
|
primaryStatusFrom === null) {
|
|
100
114
|
primaryStatusFrom = String(task.status || "TODO").toUpperCase();
|
|
115
|
+
primaryTag = resolvePrimaryTag(toStringArray(task.tags), ctx).primary;
|
|
101
116
|
}
|
|
102
117
|
ensureVerificationSatisfiedIfRequired(task, ctx.config);
|
|
103
118
|
if (taskId === metaTaskId) {
|
|
@@ -149,9 +164,19 @@ export async function cmdFinish(opts) {
|
|
|
149
164
|
? store.update(taskId, () => nextTask)
|
|
150
165
|
: ctx.taskBackend.writeTask(nextTask));
|
|
151
166
|
}
|
|
167
|
+
if (opts.commitFromComment || statusCommitRequested) {
|
|
168
|
+
enforceStatusCommitPolicy({
|
|
169
|
+
policy: ctx.config.status_commit_policy,
|
|
170
|
+
action: "finish",
|
|
171
|
+
confirmed: opts.confirmStatusCommit || autoStatusCommit,
|
|
172
|
+
quiet: opts.quiet,
|
|
173
|
+
statusFrom: primaryStatusFrom ?? "UNKNOWN",
|
|
174
|
+
statusTo: "DONE",
|
|
175
|
+
});
|
|
176
|
+
}
|
|
152
177
|
// tasks.json is export-only; generated via `agentplane task export`.
|
|
153
178
|
let executorAgent = null;
|
|
154
|
-
if (opts.commitFromComment ||
|
|
179
|
+
if (opts.commitFromComment || statusCommitRequested) {
|
|
155
180
|
const mode = ctx.config.workflow_mode;
|
|
156
181
|
executorAgent = opts.author;
|
|
157
182
|
if (mode === "direct") {
|
|
@@ -174,6 +199,7 @@ export async function cmdFinish(opts) {
|
|
|
174
199
|
cwd: opts.cwd,
|
|
175
200
|
rootOverride: opts.rootOverride,
|
|
176
201
|
taskId: primaryTaskId,
|
|
202
|
+
primaryTag: primaryTag ?? "meta",
|
|
177
203
|
executorAgent: executorAgent ?? undefined,
|
|
178
204
|
author: opts.author,
|
|
179
205
|
statusFrom: primaryStatusFrom ?? undefined,
|
|
@@ -221,7 +247,7 @@ export async function cmdFinish(opts) {
|
|
|
221
247
|
await ctx.git.commitAmendNoEdit({ env });
|
|
222
248
|
}
|
|
223
249
|
}
|
|
224
|
-
if (
|
|
250
|
+
if (statusCommitRequested) {
|
|
225
251
|
if (typeof opts.statusCommitEmoji === "string" && opts.statusCommitEmoji.trim() !== "✅") {
|
|
226
252
|
throw new CliError({
|
|
227
253
|
exitCode: 2,
|
|
@@ -234,6 +260,7 @@ export async function cmdFinish(opts) {
|
|
|
234
260
|
cwd: opts.cwd,
|
|
235
261
|
rootOverride: opts.rootOverride,
|
|
236
262
|
taskId: primaryTaskId,
|
|
263
|
+
primaryTag: primaryTag ?? "meta",
|
|
237
264
|
executorAgent: executorAgent ?? undefined,
|
|
238
265
|
author: opts.author,
|
|
239
266
|
statusFrom: primaryStatusFrom ?? undefined,
|
|
@@ -249,6 +276,28 @@ export async function cmdFinish(opts) {
|
|
|
249
276
|
config: ctx.config,
|
|
250
277
|
});
|
|
251
278
|
}
|
|
279
|
+
if (opts.closeCommit && primaryTaskId) {
|
|
280
|
+
await cmdCommit({
|
|
281
|
+
ctx,
|
|
282
|
+
cwd: opts.cwd,
|
|
283
|
+
rootOverride: opts.rootOverride,
|
|
284
|
+
taskId: primaryTaskId,
|
|
285
|
+
message: "",
|
|
286
|
+
close: true,
|
|
287
|
+
allow: [],
|
|
288
|
+
autoAllow: false,
|
|
289
|
+
allowTasks: true,
|
|
290
|
+
allowBase: false,
|
|
291
|
+
allowPolicy: false,
|
|
292
|
+
allowConfig: false,
|
|
293
|
+
allowHooks: false,
|
|
294
|
+
allowCI: false,
|
|
295
|
+
requireClean: true,
|
|
296
|
+
quiet: opts.quiet,
|
|
297
|
+
closeUnstageOthers: opts.closeUnstageOthers === true,
|
|
298
|
+
closeCheckOnly: false,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
252
301
|
if (ctx.config.workflow_mode === "direct") {
|
|
253
302
|
await clearDirectWorkLockIfMatches({
|
|
254
303
|
agentplaneDir: ctx.resolvedProject.agentplaneDir,
|
|
@@ -15,6 +15,9 @@ export { cmdTaskComment } from "./comment.js";
|
|
|
15
15
|
export { cmdTaskSetStatus } from "./set-status.js";
|
|
16
16
|
export { cmdTaskShow } from "./show.js";
|
|
17
17
|
export { cmdTaskDerive } from "./derive.js";
|
|
18
|
+
export { cmdTaskCloseDuplicate } from "./close-duplicate.js";
|
|
19
|
+
export { cmdTaskStartReady } from "./start-ready.js";
|
|
20
|
+
export { cmdTaskCloseNoop } from "./close-noop.js";
|
|
18
21
|
export { cmdTaskExport } from "./export.js";
|
|
19
22
|
export { cmdTaskLint } from "./lint.js";
|
|
20
23
|
export { cmdTaskPlanSet, cmdTaskPlanApprove, cmdTaskPlanReject } from "./plan.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/task/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,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,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/task/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,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,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAElF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -14,6 +14,9 @@ export { cmdTaskComment } from "./comment.js";
|
|
|
14
14
|
export { cmdTaskSetStatus } from "./set-status.js";
|
|
15
15
|
export { cmdTaskShow } from "./show.js";
|
|
16
16
|
export { cmdTaskDerive } from "./derive.js";
|
|
17
|
+
export { cmdTaskCloseDuplicate } from "./close-duplicate.js";
|
|
18
|
+
export { cmdTaskStartReady } from "./start-ready.js";
|
|
19
|
+
export { cmdTaskCloseNoop } from "./close-noop.js";
|
|
17
20
|
export { cmdTaskExport } from "./export.js";
|
|
18
21
|
export { cmdTaskLint } from "./lint.js";
|
|
19
22
|
export { cmdTaskPlanSet, cmdTaskPlanApprove, cmdTaskPlanReject } from "./plan.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/commands/task/new.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/commands/task/new.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAQpF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC5C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAyBF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsElB"}
|