@codetreker/daynight 0.8.1 → 0.8.13
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/dist/api/client.d.ts +6 -1
- package/dist/api/client.js +120 -23
- package/dist/api/client.js.map +1 -1
- package/dist/api/index.d.ts +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/parse.d.ts +4 -4
- package/dist/api/parse.js +28 -4
- package/dist/api/parse.js.map +1 -1
- package/dist/api/types.d.ts +23 -1
- package/dist/cli/byte-output-helper.d.ts +1 -0
- package/dist/cli/byte-output-helper.js +48 -0
- package/dist/cli/byte-output-helper.js.map +1 -0
- package/dist/cli/byte-output.d.ts +7 -0
- package/dist/cli/byte-output.js +199 -0
- package/dist/cli/byte-output.js.map +1 -0
- package/dist/cli/cancellation.d.ts +5 -0
- package/dist/cli/cancellation.js +24 -0
- package/dist/cli/cancellation.js.map +1 -0
- package/dist/cli/commands.js +2 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/context.d.ts +2 -0
- package/dist/cli/context.js +15 -9
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/prompts.d.ts +16 -3
- package/dist/cli/prompts.js +38 -10
- package/dist/cli/prompts.js.map +1 -1
- package/dist/cli/schema.js +6 -6
- package/dist/cli/schema.js.map +1 -1
- package/dist/commands/review/adapters/copilot.d.ts +3 -0
- package/dist/commands/review/adapters/copilot.js +16 -7
- package/dist/commands/review/adapters/copilot.js.map +1 -1
- package/dist/commands/review/adapters/github-review-state.d.ts +21 -0
- package/dist/commands/review/adapters/github-review-state.js +144 -0
- package/dist/commands/review/adapters/github-review-state.js.map +1 -0
- package/dist/commands/review/adapters/github.d.ts +2 -1
- package/dist/commands/review/adapters/github.js +31 -4
- package/dist/commands/review/adapters/github.js.map +1 -1
- package/dist/commands/review/coordinator.js +134 -7
- package/dist/commands/review/coordinator.js.map +1 -1
- package/dist/commands/review/model.d.ts +21 -0
- package/dist/commands/review/publication.d.ts +14 -0
- package/dist/commands/review/publication.js +47 -0
- package/dist/commands/review/publication.js.map +1 -0
- package/dist/commands/review/skill.js +5 -83
- package/dist/commands/review/skill.js.map +1 -1
- package/dist/commands/review/skills/daynight-review/SKILL.md +90 -22
- package/dist/commands/review/store.d.ts +20 -0
- package/dist/commands/review/store.js +134 -5
- package/dist/commands/review/store.js.map +1 -1
- package/dist/commands/server/runtime.d.ts +1 -1
- package/dist/commands/server/runtime.js +8 -1
- package/dist/commands/server/runtime.js.map +1 -1
- package/dist/commands/skill/agents.d.ts +23 -0
- package/dist/commands/skill/agents.js +14 -0
- package/dist/commands/skill/agents.js.map +1 -0
- package/dist/commands/skill/command.d.ts +12 -0
- package/dist/commands/skill/command.js +78 -0
- package/dist/commands/skill/command.js.map +1 -0
- package/dist/commands/skill/definition.d.ts +2 -0
- package/dist/commands/skill/definition.js +12 -0
- package/dist/commands/skill/definition.js.map +1 -0
- package/dist/commands/skill/install.d.ts +13 -0
- package/dist/commands/skill/install.js +126 -0
- package/dist/commands/skill/install.js.map +1 -0
- package/dist/commands/skill/skills/using-daynight/SKILL.md +56 -0
- package/dist/commands/skill/skills/using-daynight/references/autopilot.md +71 -0
- package/dist/commands/skill/skills/using-daynight/references/create-task.md +103 -0
- package/dist/commands/skill/skills/using-daynight/references/handbook.md +72 -0
- package/dist/commands/skill/skills/using-daynight/references/run-task.md +80 -0
- package/dist/commands/skill/targets.d.ts +11 -0
- package/dist/commands/skill/targets.js +36 -0
- package/dist/commands/skill/targets.js.map +1 -0
- package/dist/commands/task/attachment-rendering.d.ts +5 -0
- package/dist/commands/task/attachment-rendering.js +38 -0
- package/dist/commands/task/attachment-rendering.js.map +1 -0
- package/dist/commands/task/attachment.d.ts +6 -0
- package/dist/commands/task/attachment.js +91 -0
- package/dist/commands/task/attachment.js.map +1 -0
- package/dist/commands/task/command.js +35 -6
- package/dist/commands/task/command.js.map +1 -1
- package/dist/commands/task/definition.js +59 -8
- package/dist/commands/task/definition.js.map +1 -1
- package/dist/commands/task/rendering.d.ts +1 -0
- package/dist/commands/task/rendering.js +25 -4
- package/dist/commands/task/rendering.js.map +1 -1
- package/dist/config/setup.js +5 -24
- package/dist/config/setup.js.map +1 -1
- package/dist/platform/skill-bundle.d.ts +10 -0
- package/dist/platform/skill-bundle.js +82 -0
- package/dist/platform/skill-bundle.js.map +1 -0
- package/dist/repository/git.d.ts +1 -0
- package/dist/repository/git.js +6 -3
- package/dist/repository/git.js.map +1 -1
- package/package.json +7 -2
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SkillAgent } from "./agents.js";
|
|
2
|
+
export type SkillScope = "user" | "project";
|
|
3
|
+
export type SkillTarget = {
|
|
4
|
+
path: string;
|
|
5
|
+
legacyPath: string;
|
|
6
|
+
parent: string;
|
|
7
|
+
ancestor: string;
|
|
8
|
+
missingParents: readonly string[];
|
|
9
|
+
agents: SkillAgent[];
|
|
10
|
+
};
|
|
11
|
+
export declare const planSkillTargets: (base: string, agents: readonly SkillAgent[]) => Promise<SkillTarget[]>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { resolvePhysicalDirectory } from "../../platform/filesystem.js";
|
|
3
|
+
const comparisonPath = (value) => process.platform === "win32" ? value.toLowerCase() : value;
|
|
4
|
+
const contains = (parent, child) => {
|
|
5
|
+
const relative = path.relative(comparisonPath(parent), comparisonPath(child));
|
|
6
|
+
return relative !== "" && relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
|
|
7
|
+
};
|
|
8
|
+
export const planSkillTargets = async (base, agents) => {
|
|
9
|
+
const targets = [];
|
|
10
|
+
for (const agent of agents) {
|
|
11
|
+
const parent = await resolvePhysicalDirectory(path.join(base, agent.directory, "skills"));
|
|
12
|
+
const physicalParent = path.join(parent.ancestorPath, ...parent.missingComponents);
|
|
13
|
+
const targetPath = path.join(physicalParent, "using-daynight");
|
|
14
|
+
const existing = targets.find((target) => comparisonPath(target.path) === comparisonPath(targetPath));
|
|
15
|
+
if (existing !== undefined)
|
|
16
|
+
existing.agents.push(agent);
|
|
17
|
+
else
|
|
18
|
+
targets.push({ path: targetPath, legacyPath: path.join(physicalParent, "daynight"), parent: physicalParent, ancestor: parent.ancestorPath, missingParents: parent.missingComponents, agents: [agent] });
|
|
19
|
+
}
|
|
20
|
+
for (const [index, first] of targets.entries()) {
|
|
21
|
+
for (const second of targets.slice(index + 1)) {
|
|
22
|
+
if (contains(first.path, second.path) || contains(second.path, first.path)) {
|
|
23
|
+
throw new Error(`Cannot install overlapping skill targets: ${first.agents.map(({ name }) => name).join(", ")} at ${first.path}; ${second.agents.map(({ name }) => name).join(", ")} at ${second.path}. Change the parent skill-directory links so neither target contains the other.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
for (const legacy of targets) {
|
|
28
|
+
for (const target of targets) {
|
|
29
|
+
if (comparisonPath(legacy.legacyPath) === comparisonPath(target.path) || contains(legacy.legacyPath, target.path)) {
|
|
30
|
+
throw new Error(`Cannot remove legacy daynight skill at ${legacy.legacyPath}: it contains the using-daynight installation at ${target.path}. Change the parent skill-directory links so legacy cleanup cannot remove a selected installation.`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return targets;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../../../src/commands/skill/targets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { TaskAttachment } from "../../api/types.js";
|
|
2
|
+
export declare const renderAttachment: (attachment: TaskAttachment) => string;
|
|
3
|
+
export declare const renderAttachmentList: (attachments: readonly TaskAttachment[]) => string;
|
|
4
|
+
export declare const renderAttachmentTree: (attachments: readonly TaskAttachment[]) => string;
|
|
5
|
+
export declare const renderAttachmentJson: (attachments: readonly TaskAttachment[]) => string;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { stringifyApiJson } from "../../api/json.js";
|
|
2
|
+
import { terminalText } from "../../platform/terminal.js";
|
|
3
|
+
export const renderAttachment = (attachment) => [
|
|
4
|
+
`Path: ${terminalText(attachment.path)}`,
|
|
5
|
+
`Content type: ${terminalText(attachment.contentType)}`,
|
|
6
|
+
`Size: ${attachment.sizeBytes} bytes`,
|
|
7
|
+
`Created: ${terminalText(attachment.createdAt)}`,
|
|
8
|
+
`Updated: ${terminalText(attachment.updatedAt)}`,
|
|
9
|
+
"",
|
|
10
|
+
].join("\n");
|
|
11
|
+
export const renderAttachmentList = (attachments) => attachments.length === 0 ? "No attachments.\n" : attachments.map(renderAttachment).join("\n");
|
|
12
|
+
export const renderAttachmentTree = (attachments) => {
|
|
13
|
+
if (attachments.length === 0)
|
|
14
|
+
return "No attachments.\n";
|
|
15
|
+
const root = { children: new Map(), file: false };
|
|
16
|
+
for (const attachment of attachments) {
|
|
17
|
+
let node = root;
|
|
18
|
+
for (const segment of attachment.path.split("/")) {
|
|
19
|
+
let child = node.children.get(segment);
|
|
20
|
+
if (child === undefined) {
|
|
21
|
+
child = { children: new Map(), file: false };
|
|
22
|
+
node.children.set(segment, child);
|
|
23
|
+
}
|
|
24
|
+
node = child;
|
|
25
|
+
}
|
|
26
|
+
node.file = true;
|
|
27
|
+
}
|
|
28
|
+
const render = (node, prefix) => {
|
|
29
|
+
const entries = [...node.children].sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0);
|
|
30
|
+
return entries.flatMap(([name, child], index) => {
|
|
31
|
+
const last = index === entries.length - 1;
|
|
32
|
+
return [`${prefix}${last ? "└── " : "├── "}${terminalText(name)}${child.file ? "" : "/"}`, ...render(child, `${prefix}${last ? " " : "│ "}`)];
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
return `${render(root, "").join("\n")}\n`;
|
|
36
|
+
};
|
|
37
|
+
export const renderAttachmentJson = (attachments) => `${stringifyApiJson(attachments)}\n`;
|
|
38
|
+
//# sourceMappingURL=attachment-rendering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-rendering.js","sourceRoot":"","sources":["../../../src/commands/task/attachment-rendering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CliContext } from "../../cli/context.js";
|
|
2
|
+
import type { ParsedCommand } from "../../cli/schema.js";
|
|
3
|
+
import type { TaskCommandDependencies } from "./command.js";
|
|
4
|
+
export declare const runTaskAttachmentCommand: (command: Extract<ParsedCommand, {
|
|
5
|
+
kind: "run";
|
|
6
|
+
}>, context: CliContext, dependencies: TaskCommandDependencies) => Promise<void>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { open } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import mime from "mime";
|
|
5
|
+
import { canonicalId, validateAttachmentPath } from "../../api/parse.js";
|
|
6
|
+
import { UsageError } from "../../cli/context.js";
|
|
7
|
+
import { renderAttachment, renderAttachmentJson, renderAttachmentList, renderAttachmentTree } from "./attachment-rendering.js";
|
|
8
|
+
const sourceBody = (file) => new ReadableStream({
|
|
9
|
+
async pull(controller) {
|
|
10
|
+
const buffer = new Uint8Array(64 * 1024);
|
|
11
|
+
const { bytesRead } = await file.read(buffer);
|
|
12
|
+
if (bytesRead === 0)
|
|
13
|
+
controller.close();
|
|
14
|
+
else
|
|
15
|
+
controller.enqueue(buffer.subarray(0, bytesRead));
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
export const runTaskAttachmentCommand = async (command, context, dependencies) => {
|
|
19
|
+
const help = `${command.path.join(" ")} --help`;
|
|
20
|
+
const taskId = canonicalId(command.values[0]);
|
|
21
|
+
if (taskId === null)
|
|
22
|
+
throw new UsageError("task-id must be a hyphenated UUID.", help);
|
|
23
|
+
const rawProjectId = command.options.get("--project");
|
|
24
|
+
const projectId = rawProjectId === undefined ? undefined : canonicalId(rawProjectId);
|
|
25
|
+
if (projectId === null)
|
|
26
|
+
throw new UsageError("project-id must be a hyphenated UUID.", help);
|
|
27
|
+
if (command.options.has("--tree") && command.options.has("--json"))
|
|
28
|
+
throw new UsageError("--tree and --json are mutually exclusive.", help);
|
|
29
|
+
const name = command.command.name;
|
|
30
|
+
const source = name === "put" ? command.values[1] : undefined;
|
|
31
|
+
const rawPath = name === "put" ? command.options.get("--path") ?? path.basename(source) : command.values[1];
|
|
32
|
+
let attachmentPath;
|
|
33
|
+
if (rawPath !== undefined) {
|
|
34
|
+
try {
|
|
35
|
+
attachmentPath = validateAttachmentPath(rawPath);
|
|
36
|
+
}
|
|
37
|
+
catch (cause) {
|
|
38
|
+
throw new UsageError(cause instanceof Error ? cause.message : String(cause), help);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
let file;
|
|
42
|
+
let failure;
|
|
43
|
+
try {
|
|
44
|
+
if (source !== undefined) {
|
|
45
|
+
file = await open(source, constants.O_RDONLY | constants.O_NONBLOCK);
|
|
46
|
+
if (!(await file.stat()).isFile())
|
|
47
|
+
throw new UsageError("Attachment source must be a regular file.", help);
|
|
48
|
+
}
|
|
49
|
+
await dependencies.runServerCommand(context, async ({ api, operation, serverUrl }) => {
|
|
50
|
+
operation.check();
|
|
51
|
+
const project = projectId === undefined
|
|
52
|
+
? await dependencies.resolveProject({ serverUrl, operation, api, workingDirectory: context.workingDirectory() })
|
|
53
|
+
: await api.getProject(projectId);
|
|
54
|
+
operation.check();
|
|
55
|
+
if (name === "put") {
|
|
56
|
+
const contentType = mime.getType(attachmentPath) ?? "application/octet-stream";
|
|
57
|
+
const attachment = await api.putTaskAttachment(project.id, taskId, attachmentPath, { body: sourceBody(file), contentType });
|
|
58
|
+
operation.check();
|
|
59
|
+
return `Attachment uploaded.\n${renderAttachment(attachment)}`;
|
|
60
|
+
}
|
|
61
|
+
if (name === "list") {
|
|
62
|
+
const attachments = await api.listTaskAttachments(project.id, taskId);
|
|
63
|
+
operation.check();
|
|
64
|
+
return command.options.has("--json") ? renderAttachmentJson(attachments) : command.options.has("--tree") ? renderAttachmentTree(attachments) : renderAttachmentList(attachments);
|
|
65
|
+
}
|
|
66
|
+
if (name === "read") {
|
|
67
|
+
await api.readTaskAttachment(project.id, taskId, attachmentPath, (chunk, signal) => context.stdoutBytes(chunk, signal));
|
|
68
|
+
operation.check();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
await api.removeTaskAttachment(project.id, taskId, attachmentPath);
|
|
72
|
+
operation.check();
|
|
73
|
+
return "Attachment removed.\n";
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
catch (cause) {
|
|
77
|
+
failure = cause;
|
|
78
|
+
throw cause;
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
try {
|
|
82
|
+
await file?.close();
|
|
83
|
+
}
|
|
84
|
+
catch (cause) {
|
|
85
|
+
if (failure !== undefined)
|
|
86
|
+
throw new AggregateError([failure, cause], "Attachment operation and source cleanup failed.", { cause: failure });
|
|
87
|
+
throw cause;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=attachment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment.js","sourceRoot":"","sources":["../../../src/commands/task/attachment.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,18 +6,39 @@ const defaultDependencies = {
|
|
|
6
6
|
runServerCommand: async (...args) => (await import("../server/runtime.js")).runServerCommand(...args),
|
|
7
7
|
resolveProject: async (...args) => (await import("../../repository/index.js")).resolveProject(...args),
|
|
8
8
|
};
|
|
9
|
+
const taskPriority = (task) => task.status === "in_progress" ? 0 : task.ready ? 1 : task.status === "todo" ? 2 : 3;
|
|
9
10
|
export const runTaskCommand = async (args, context, dependencies = defaultDependencies) => {
|
|
10
11
|
const command = parseCommand(taskDefinition, args, ["daynight", "task"], "daynight task --help");
|
|
11
12
|
if (command.kind !== "run") {
|
|
12
13
|
context.stdout(renderCommandHelp(command.command, command.path));
|
|
13
14
|
return;
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
+
if (command.path[2] === "attachment") {
|
|
17
|
+
const { runTaskAttachmentCommand } = await import("./attachment.js");
|
|
18
|
+
await runTaskAttachmentCommand(command, context, dependencies);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const help = `${command.path.join(" ")} --help`;
|
|
16
22
|
const title = command.options.get("--title");
|
|
17
23
|
const description = command.options.get("--description");
|
|
18
24
|
const status = command.options.get("--status");
|
|
25
|
+
const all = command.options.has("--all");
|
|
26
|
+
if (all && status !== undefined)
|
|
27
|
+
throw new UsageError("--all conflicts with --status.", help);
|
|
19
28
|
const dependsOn = command.options.get("--depends-on");
|
|
20
29
|
const clearDependencies = command.options.has("--clear-dependencies");
|
|
30
|
+
const pullRequestUrls = command.options.get("--pull-request-url");
|
|
31
|
+
const pullRequestTitles = command.options.get("--pull-request-title");
|
|
32
|
+
const clearPullRequests = command.options.has("--clear-pull-requests");
|
|
33
|
+
if (clearPullRequests && (pullRequestUrls !== undefined || pullRequestTitles !== undefined))
|
|
34
|
+
throw new UsageError("--clear-pull-requests conflicts with --pull-request-url and --pull-request-title.", help);
|
|
35
|
+
if (pullRequestUrls?.length !== pullRequestTitles?.length)
|
|
36
|
+
throw new UsageError("Provide the same number of --pull-request-url and --pull-request-title values.", help);
|
|
37
|
+
const properties = clearPullRequests ? { pullRequests: [] } : pullRequestUrls === undefined ? undefined : { pullRequests: pullRequestUrls.map((url, index) => ({ url, title: pullRequestTitles[index] })) };
|
|
38
|
+
const limitArgument = command.options.get("--limit");
|
|
39
|
+
const readyLimit = limitArgument === undefined ? 10 : Number(limitArgument);
|
|
40
|
+
if (limitArgument !== undefined && (!/^[0-9]+$/.test(limitArgument) || !Number.isInteger(readyLimit) || readyLimit < 1 || readyLimit > 100))
|
|
41
|
+
throw new UsageError("Ready task limit must be a decimal integer from 1 to 100.", help);
|
|
21
42
|
if (title !== undefined && !isNonemptyText(title))
|
|
22
43
|
throw new UsageError("Task title must be nonempty UTF-8 text without NUL characters.", help);
|
|
23
44
|
if (description !== undefined && !isText(description))
|
|
@@ -32,9 +53,10 @@ export const runTaskCommand = async (args, context, dependencies = defaultDepend
|
|
|
32
53
|
...(status === undefined ? {} : { status }),
|
|
33
54
|
...(dependsOn === undefined ? {} : { dependsOn }),
|
|
34
55
|
...(clearDependencies ? { dependsOn: [] } : {}),
|
|
56
|
+
...(properties === undefined ? {} : { properties }),
|
|
35
57
|
};
|
|
36
58
|
if (command.command.name === "update" && Object.keys(changes).length === 0)
|
|
37
|
-
throw new UsageError("Task update requires a title, description, status, or
|
|
59
|
+
throw new UsageError("Task update requires a title, description, status, dependency, or PR reference change.", help);
|
|
38
60
|
const rawProjectId = command.options.get("--project");
|
|
39
61
|
let projectId;
|
|
40
62
|
let taskId;
|
|
@@ -72,19 +94,26 @@ export const runTaskCommand = async (args, context, dependencies = defaultDepend
|
|
|
72
94
|
project = await dependencies.resolveProject({ serverUrl, operation, api, workingDirectory: context.workingDirectory() });
|
|
73
95
|
}
|
|
74
96
|
operation.check();
|
|
75
|
-
const { renderTask, renderTaskGraph, renderTaskJson, renderTaskList } = await import("./rendering.js");
|
|
97
|
+
const { renderTask, renderTaskGraph, renderTaskJson, renderTaskList, renderTaskSummaryList } = await import("./rendering.js");
|
|
76
98
|
operation.check();
|
|
77
99
|
if (command.command.name === "create") {
|
|
78
|
-
const input = { title: title, ...(description === undefined ? {} : { description }), ...(dependsOn === undefined ? {} : { dependsOn }) };
|
|
100
|
+
const input = { title: title, ...(description === undefined ? {} : { description }), ...(dependsOn === undefined ? {} : { dependsOn }), ...(properties === undefined ? {} : { properties }) };
|
|
79
101
|
const task = await api.createTask(project.id, input);
|
|
80
102
|
operation.check();
|
|
81
103
|
return `Task created.\n${renderTask(task)}`;
|
|
82
104
|
}
|
|
83
105
|
if (command.command.name === "list") {
|
|
84
106
|
const filters = { ...(status === undefined ? {} : { status }), ...(command.options.has("--ready") ? { ready: true } : {}) };
|
|
85
|
-
const tasks = await api.listTasks(project.id, filters)
|
|
107
|
+
const tasks = (await api.listTasks(project.id, filters))
|
|
108
|
+
.filter((task) => all || status !== undefined || task.status !== "done")
|
|
109
|
+
.toSorted((left, right) => taskPriority(left) - taskPriority(right));
|
|
110
|
+
operation.check();
|
|
111
|
+
return command.options.has("--json") ? renderTaskJson(tasks) : renderTaskSummaryList(tasks);
|
|
112
|
+
}
|
|
113
|
+
if (command.command.name === "ready") {
|
|
114
|
+
const tasks = await api.listReadyTasks(project.id, readyLimit);
|
|
86
115
|
operation.check();
|
|
87
|
-
return command.options.has("--json") ? renderTaskJson(tasks) : renderTaskList(tasks);
|
|
116
|
+
return command.options.has("--json") ? renderTaskJson(tasks) : tasks.length === 0 ? "No ready tasks.\n" : renderTaskList(tasks);
|
|
88
117
|
}
|
|
89
118
|
if (command.command.name === "graph") {
|
|
90
119
|
const graph = await api.getTaskGraph(project.id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/commands/task/command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOjD,MAAM,mBAAmB,GAA4B;IACnD,gBAAgB,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IACrG,cAAc,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;CACvG,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,IAAuB,EACvB,OAAmB,EACnB,YAAY,GAA4B,mBAAmB,EAC5C,EAAE;IACjB,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,sBAAsB,CAAC,CAAC;IACjG,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/commands/task/command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOjD,MAAM,mBAAmB,GAA4B;IACnD,gBAAgB,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IACrG,cAAc,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;CACvG,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAU,EAAU,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjI,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,IAAuB,EACvB,OAAmB,EACnB,YAAY,GAA4B,mBAAmB,EAC5C,EAAE;IACjB,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,sBAAsB,CAAC,CAAC;IACjG,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC;QACrC,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACrE,MAAM,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAuB,CAAC;IACnE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAuB,CAAC;IAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAA2B,CAAC;IACzE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,GAAG,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,UAAU,CAAC,gCAAgC,EAAE,IAAI,CAAC,CAAC;IAC9F,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAkC,CAAC;IACvF,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAkC,CAAC;IACnG,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAkC,CAAC;IACvG,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvE,IAAI,iBAAiB,IAAI,CAAC,eAAe,KAAK,SAAS,IAAI,iBAAiB,KAAK,SAAS,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,mFAAmF,EAAE,IAAI,CAAC,CAAC;IAC7M,IAAI,eAAe,EAAE,MAAM,KAAK,iBAAiB,EAAE,MAAM;QAAE,MAAM,IAAI,UAAU,CAAC,gFAAgF,EAAE,IAAI,CAAC,CAAC;IACxK,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,iBAAkB,CAAC,KAAK,CAAE,EAAE,CAAC,CAAC,EAAE,CAAC;IAC9M,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAuB,CAAC;IAC3E,MAAM,UAAU,GAAG,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC5E,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,2DAA2D,EAAE,IAAI,CAAC,CAAC;IACrO,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,gEAAgE,EAAE,IAAI,CAAC,CAAC;IAChJ,IAAI,WAAW,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,6DAA6D,EAAE,IAAI,CAAC,CAAC;IACjJ,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,iDAAiD,EAAE,IAAI,CAAC,CAAC;IAC7J,IAAI,SAAS,KAAK,SAAS,IAAI,iBAAiB;QAAE,MAAM,IAAI,UAAU,CAAC,yDAAyD,EAAE,IAAI,CAAC,CAAC;IACxI,MAAM,OAAO,GAAqC;QAChD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3C,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;KACpD,CAAC;IACF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,wFAAwF,EAAE,IAAI,CAAC,CAAC;IACjM,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAuB,CAAC;IAC5E,IAAI,SAA6B,CAAC;IAClC,IAAI,MAA0B,CAAC;IAC/B,IAAI,YAAY,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvG,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC3D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC;YACnD,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM,IAAI,UAAU,CAAC,uCAAuC,EAAE,IAAI,CAAC,CAAC;QACnG,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzE,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,SAAS,CAAC;YACtD,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,IAAI,UAAU,CAAC,oCAAoC,EAAE,IAAI,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAuB,CAAC;IAClF,IAAI,eAAmC,CAAC;IACxC,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACnE,IAAI,CAAC;YAAC,eAAe,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;QAAC,CAAC;QAChE,OAAO,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAAC,CAAC;IACvG,CAAC;IACD,MAAM,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;QACnF,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,OAAgB,CAAC;QACrB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAC3H,CAAC;QACD,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9H,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,KAAK,GAAoB,EAAE,KAAK,EAAE,KAAM,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;YAChN,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACrD,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,kBAAkB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,OAAO,GAAgB,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACzI,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;iBACrD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC;iBACvE,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC9F,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC/D,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAClI,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjD,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,MAAO,CAAC,CAAC;YACpD,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,OAAO,GAAG,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,MAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACnH,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,MAAO,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAChF,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,kBAAkB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -5,6 +5,10 @@ const titleOption = { names: ["--title"], description: "Task title", value: { na
|
|
|
5
5
|
const descriptionOption = { names: ["--description"], description: "Task description; an empty value clears it", value: { name: "description", kind: "text", allowEmpty: true } };
|
|
6
6
|
const dependencyOption = { names: ["--depends-on"], description: "Direct dependency task UUID; repeat to supply the full set", value: { name: "task-id", kind: "text" }, repeatable: true };
|
|
7
7
|
const statusOption = { names: ["--status"], description: "Task status", value: { name: "status", kind: "text", choices: ["todo", "in_progress", "done"] } };
|
|
8
|
+
const pullRequestOptions = [
|
|
9
|
+
{ names: ["--pull-request-url"], description: "PR URL text; repeat for the complete list", value: { name: "text", kind: "text", allowEmpty: true }, repeatable: true },
|
|
10
|
+
{ names: ["--pull-request-title"], description: "PR title text; pair by position with each URL", value: { name: "text", kind: "text", allowEmpty: true }, repeatable: true },
|
|
11
|
+
];
|
|
8
12
|
const taskArgument = { name: "task-id", description: "Task UUID" };
|
|
9
13
|
export const taskDefinition = {
|
|
10
14
|
name: "task",
|
|
@@ -12,15 +16,21 @@ export const taskDefinition = {
|
|
|
12
16
|
commands: [
|
|
13
17
|
{
|
|
14
18
|
name: "create",
|
|
15
|
-
description: "Create a todo task with optional dependencies",
|
|
16
|
-
options: [{ ...titleOption, required: true }, descriptionOption, dependencyOption, projectOption, helpOption],
|
|
17
|
-
details: "New tasks start in todo. Repeated --depends-on values preserve the supplied dependency set.",
|
|
19
|
+
description: "Create a todo task with optional dependencies and PR references",
|
|
20
|
+
options: [{ ...titleOption, required: true }, descriptionOption, dependencyOption, ...pullRequestOptions, projectOption, helpOption],
|
|
21
|
+
details: "New tasks start in todo. Repeated --depends-on values preserve the supplied dependency set.\nPR URL and title counts must match; the nth URL pairs with the nth title. Empty values are accepted, and all text is stored as supplied.",
|
|
18
22
|
},
|
|
19
23
|
{
|
|
20
24
|
name: "list",
|
|
21
|
-
description: "List
|
|
22
|
-
options: [statusOption, { names: ["--ready"], description: "Include only tasks ready to start" }, projectOption, jsonOption, helpOption],
|
|
23
|
-
details: "
|
|
25
|
+
description: "List unfinished tasks, with in-progress and ready tasks first",
|
|
26
|
+
options: [{ names: ["--all"], description: "Include completed tasks; conflicts with --status" }, statusOption, { names: ["--ready"], description: "Include only tasks ready to start" }, projectOption, jsonOption, helpOption],
|
|
27
|
+
details: "By default, exclude done tasks. Use --all for every status or --status for a specific status.\nCombine --ready with the selected statuses using AND. Read every page before printing.\nOrder in_progress first, then ready tasks, then remaining tasks; preserve server order within each group.\nText lists omit description, version, and timestamps. --json preserves every task field with the same filtering and ordering.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "ready",
|
|
31
|
+
description: "Show the first ready tasks in the project",
|
|
32
|
+
options: [{ names: ["--limit"], description: "Maximum number of tasks to return, from 1 to 100 (default: 10)", value: { name: "count", kind: "text" } }, projectOption, jsonOption, helpOption],
|
|
33
|
+
details: "Read one bounded page ordered by creation time, then task UUID, ascending. A task is ready when it is todo and every dependency is done.",
|
|
24
34
|
},
|
|
25
35
|
{
|
|
26
36
|
name: "show",
|
|
@@ -30,19 +40,60 @@ export const taskDefinition = {
|
|
|
30
40
|
},
|
|
31
41
|
{
|
|
32
42
|
name: "update",
|
|
33
|
-
description: "Atomically update task fields and
|
|
43
|
+
description: "Atomically update task fields, dependencies, and PR references",
|
|
34
44
|
arguments: [taskArgument],
|
|
35
45
|
options: [titleOption, descriptionOption, statusOption, dependencyOption,
|
|
36
46
|
{ names: ["--clear-dependencies"], description: "Clear the complete dependency set" },
|
|
47
|
+
...pullRequestOptions,
|
|
48
|
+
{ names: ["--clear-pull-requests"], description: "Clear the complete PR reference list" },
|
|
37
49
|
{ names: ["--if-version"], description: "Use this expected task version without reading a newer version", value: { name: "version", kind: "text" } },
|
|
38
50
|
projectOption, helpOption],
|
|
39
|
-
details: "Provide at least one changed field. --depends-on replaces all dependencies; it conflicts with --clear-dependencies.\nWithout --if-version, read the current version before submitting the update. Conflicts are not retried.",
|
|
51
|
+
details: "Provide at least one changed field. --depends-on replaces all dependencies; it conflicts with --clear-dependencies.\nPR URL and title counts must match; the nth URL pairs with the nth title. Pairs replace the complete list; empty values are accepted. --clear-pull-requests conflicts with either PR option. Omitted PR options preserve the current list.\nWithout --if-version, read the current version before submitting the update. Conflicts are not retried.",
|
|
40
52
|
},
|
|
41
53
|
{
|
|
42
54
|
name: "graph",
|
|
43
55
|
description: "Show the complete task graph and summary",
|
|
44
56
|
options: [projectOption, jsonOption, helpOption],
|
|
45
57
|
},
|
|
58
|
+
{
|
|
59
|
+
name: "attachment",
|
|
60
|
+
description: "Manage files attached to a task",
|
|
61
|
+
commands: [
|
|
62
|
+
{
|
|
63
|
+
name: "put",
|
|
64
|
+
description: "Upload one local regular file, replacing the same attachment path",
|
|
65
|
+
arguments: [taskArgument, { name: "file", description: "Local regular file to upload" }],
|
|
66
|
+
options: [{ names: ["--path"], description: "Attachment relative path (default: source basename)", value: { name: "relative-path", kind: "text" } }, projectOption, helpOption],
|
|
67
|
+
allowOptionsTerminator: true,
|
|
68
|
+
details: "Infer the content type from the attachment path. Unknown extensions use application/octet-stream.\nUse -- before a file name starting with a dash, or --path=value for a dash-prefixed target path. Writes are not retried; an interrupted operation may already have taken effect.",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: "list",
|
|
72
|
+
description: "List every attachment and its metadata",
|
|
73
|
+
arguments: [taskArgument],
|
|
74
|
+
options: [{ names: ["--tree"], description: "Display attachment paths as a directory tree" }, projectOption, jsonOption, helpOption],
|
|
75
|
+
details: "Read every page before printing. --tree and --json are mutually exclusive.",
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "read",
|
|
79
|
+
description: "Write the attachment's original bytes to stdout",
|
|
80
|
+
arguments: [taskArgument, { name: "relative-path", description: "Complete attachment relative path" }],
|
|
81
|
+
options: [projectOption, helpOption],
|
|
82
|
+
allowOptionsTerminator: true,
|
|
83
|
+
details: "Output contains only the original bytes, with no labels or extra newline. Diagnostics go to stderr.\nA failed read may leave incomplete content on stdout. Use -- before a path starting with a dash.",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "remove",
|
|
87
|
+
description: "Remove one attachment by its complete relative path",
|
|
88
|
+
arguments: [taskArgument, { name: "relative-path", description: "Complete attachment relative path" }],
|
|
89
|
+
options: [projectOption, helpOption],
|
|
90
|
+
allowOptionsTerminator: true,
|
|
91
|
+
details: "Use -- before a path starting with a dash. Deletes are not retried; an interrupted operation may already have taken effect.",
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
options: [helpOption],
|
|
95
|
+
details: "Paths are case-sensitive, use / separators, and preserve Unicode spelling.\nWithout --project, resolve the current Git origin to its project.\nRun daynight task attachment <command> --help for command usage.",
|
|
96
|
+
},
|
|
46
97
|
],
|
|
47
98
|
options: [helpOption],
|
|
48
99
|
details: "Without --project, resolve the current Git origin to its project using the repository binding.\nText options also accept --option=value; use this form for values starting with a dash.\nServer: serverUrl in ~/.daynight/config.yml\nRun daynight task <command> --help for command usage.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../src/commands/task/definition.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAkB,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC7G,MAAM,aAAa,GAAkB,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;AACrK,MAAM,UAAU,GAAkB,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;AACrH,MAAM,WAAW,GAAkB,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;AAC7H,MAAM,iBAAiB,GAAkB,EAAE,KAAK,EAAE,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,4CAA4C,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC;AACjM,MAAM,gBAAgB,GAAkB,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,4DAA4D,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC3M,MAAM,YAAY,GAAkB,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;AAC3K,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,kEAAkE;IAC/E,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../src/commands/task/definition.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Task, TaskGraph } from "../../api/types.js";
|
|
2
2
|
export declare const renderTask: (task: Task) => string;
|
|
3
3
|
export declare const renderTaskList: (tasks: readonly Task[]) => string;
|
|
4
|
+
export declare const renderTaskSummaryList: (tasks: readonly Task[]) => string;
|
|
4
5
|
export declare const renderTaskGraph: (graph: TaskGraph) => string;
|
|
5
6
|
export declare const renderTaskJson: (value: Task | readonly Task[] | TaskGraph) => string;
|
|
@@ -1,21 +1,42 @@
|
|
|
1
1
|
import { stringifyApiJson } from "../../api/json.js";
|
|
2
2
|
import { terminalText } from "../../platform/terminal.js";
|
|
3
3
|
const identifiers = (values) => values.length === 0 ? "none" : values.map(terminalText).join(", ");
|
|
4
|
-
|
|
4
|
+
const taskIdentity = (task) => [
|
|
5
5
|
`ID: ${terminalText(task.id)}`,
|
|
6
6
|
`Project: ${terminalText(task.projectId)}`,
|
|
7
7
|
`Title: ${terminalText(task.title)}`,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
`
|
|
8
|
+
];
|
|
9
|
+
const taskPullRequests = (task) => [
|
|
10
|
+
`Pull requests: ${task.properties.pullRequests.length}`,
|
|
11
|
+
...task.properties.pullRequests.flatMap((pullRequest, index) => [
|
|
12
|
+
` ${index + 1}. Title: ${terminalText(pullRequest.title)}`,
|
|
13
|
+
` URL: ${terminalText(pullRequest.url)}`,
|
|
14
|
+
]),
|
|
15
|
+
];
|
|
16
|
+
const taskDependencies = (task) => [
|
|
11
17
|
`Ready: ${task.ready}`,
|
|
12
18
|
`Depends on: ${identifiers(task.dependsOn)}`,
|
|
13
19
|
`Blocked by: ${identifiers(task.blockedBy)}`,
|
|
20
|
+
];
|
|
21
|
+
export const renderTask = (task) => [
|
|
22
|
+
...taskIdentity(task),
|
|
23
|
+
`Description: ${terminalText(task.description)}`,
|
|
24
|
+
...taskPullRequests(task),
|
|
25
|
+
`Status: ${terminalText(task.status)}`,
|
|
26
|
+
`Version: ${task.version}`,
|
|
27
|
+
...taskDependencies(task),
|
|
14
28
|
`Created: ${terminalText(task.createdAt)}`,
|
|
15
29
|
`Updated: ${terminalText(task.updatedAt)}`,
|
|
16
30
|
"",
|
|
17
31
|
].join("\n");
|
|
18
32
|
export const renderTaskList = (tasks) => tasks.length === 0 ? "No tasks.\n" : tasks.map(renderTask).join("\n");
|
|
33
|
+
export const renderTaskSummaryList = (tasks) => tasks.length === 0 ? "No tasks.\n" : tasks.map((task) => [
|
|
34
|
+
...taskIdentity(task),
|
|
35
|
+
...taskPullRequests(task),
|
|
36
|
+
`Status: ${terminalText(task.status)}`,
|
|
37
|
+
...taskDependencies(task),
|
|
38
|
+
"",
|
|
39
|
+
].join("\n")).join("\n");
|
|
19
40
|
const renderGraphTask = (task) => [
|
|
20
41
|
`ID: ${terminalText(task.id)}`,
|
|
21
42
|
`Title preview: ${terminalText(task.titlePreview)}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rendering.js","sourceRoot":"","sources":["../../../src/commands/task/rendering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,WAAW,GAAG,CAAC,MAAyB,EAAU,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE9H,MAAM,
|
|
1
|
+
{"version":3,"file":"rendering.js","sourceRoot":"","sources":["../../../src/commands/task/rendering.ts"],"names":[],"mappings":"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"}
|
package/dist/config/setup.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Document } from "yaml";
|
|
2
|
-
import {
|
|
2
|
+
import { CliCancelledError, withCliCancellation } from "../cli/cancellation.js";
|
|
3
3
|
import { parseConfigurationDocument } from "./document.js";
|
|
4
4
|
import { MissingConfigurationFileError, isMissingConfiguration } from "./errors.js";
|
|
5
5
|
import { readConfigurationSource, updateConfigurationFile } from "./files.js";
|
|
@@ -15,23 +15,7 @@ const optionalSource = async (context, signal) => {
|
|
|
15
15
|
throw cause;
|
|
16
16
|
}
|
|
17
17
|
};
|
|
18
|
-
const
|
|
19
|
-
if (supplied !== undefined)
|
|
20
|
-
return action(supplied);
|
|
21
|
-
const controller = new AbortController();
|
|
22
|
-
const signals = process.platform === "win32" ? ["SIGINT", "SIGTERM", "SIGBREAK"] : ["SIGINT", "SIGTERM"];
|
|
23
|
-
const cancel = () => controller.abort(new SetupCancelledError());
|
|
24
|
-
for (const signal of signals)
|
|
25
|
-
process.on(signal, cancel);
|
|
26
|
-
try {
|
|
27
|
-
return await action(controller.signal);
|
|
28
|
-
}
|
|
29
|
-
finally {
|
|
30
|
-
for (const signal of signals)
|
|
31
|
-
process.off(signal, cancel);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
export const configure = async (context, input, capability, suppliedSignal) => withCancellation(async (signal) => {
|
|
18
|
+
export const configure = async (context, input, capability, suppliedSignal) => withCliCancellation(context, async (signal) => {
|
|
35
19
|
const paths = resolveConfigurationPaths(context.homeDirectory());
|
|
36
20
|
const source = await optionalSource(context, signal);
|
|
37
21
|
const baseline = source === undefined ? {} : parseConfigurationDocument(source, paths).mapping;
|
|
@@ -51,7 +35,7 @@ export const configure = async (context, input, capability, suppliedSignal) => w
|
|
|
51
35
|
}
|
|
52
36
|
catch (cause) {
|
|
53
37
|
signal.throwIfAborted();
|
|
54
|
-
if (cause instanceof
|
|
38
|
+
if (cause instanceof CliCancelledError)
|
|
55
39
|
throw cause;
|
|
56
40
|
context.stderr(`${cause instanceof Error ? cause.message : String(cause)}\n`);
|
|
57
41
|
}
|
|
@@ -117,13 +101,10 @@ export const configure = async (context, input, capability, suppliedSignal) => w
|
|
|
117
101
|
}
|
|
118
102
|
catch (cause) {
|
|
119
103
|
if (signal.aborted)
|
|
120
|
-
throw new
|
|
104
|
+
throw new CliCancelledError("Setup cancelled.", { cause: signal.reason });
|
|
121
105
|
throw cause;
|
|
122
106
|
}
|
|
123
|
-
|
|
124
|
-
context.prompt?.close();
|
|
125
|
-
}
|
|
126
|
-
}, suppliedSignal);
|
|
107
|
+
}, suppliedSignal, () => new CliCancelledError("Setup cancelled."));
|
|
127
108
|
export const guideMissingConfiguration = async (context, capability, load, signal) => {
|
|
128
109
|
try {
|
|
129
110
|
return await load();
|