@wrongstack/tools 0.286.0 → 0.287.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/_edit-match.d.ts.map +1 -1
- package/dist/batch-tool-use.d.ts +1 -1
- package/dist/batch-tool-use.d.ts.map +1 -1
- package/dist/batch-tool-use.js +26 -8
- package/dist/batch-tool-use.js.map +2 -2
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/types.d.ts +1 -1
- package/dist/browser/types.d.ts.map +1 -1
- package/dist/builtin.js +544 -118
- package/dist/builtin.js.map +4 -4
- package/dist/codebase-index/go-parser.d.ts.map +1 -1
- package/dist/codebase-index/index.js +190 -96
- package/dist/codebase-index/index.js.map +4 -4
- package/dist/codebase-index/py-parser.d.ts.map +1 -1
- package/dist/codebase-index/rs-parser.d.ts.map +1 -1
- package/dist/codebase-index/worker.js +188 -94
- package/dist/codebase-index/worker.js.map +4 -4
- package/dist/edit.d.ts.map +1 -1
- package/dist/edit.js +36 -12
- package/dist/edit.js.map +3 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +818 -125
- package/dist/index.js.map +4 -4
- package/dist/kanban.d.ts +7 -2
- package/dist/kanban.d.ts.map +1 -1
- package/dist/kanban.js +158 -19
- package/dist/kanban.js.map +4 -4
- package/dist/next-steps.d.ts +6 -2
- package/dist/next-steps.d.ts.map +1 -1
- package/dist/next-steps.js +3 -3
- package/dist/next-steps.js.map +2 -2
- package/dist/pack.js +544 -118
- package/dist/pack.js.map +4 -4
- package/dist/plan.d.ts.map +1 -1
- package/dist/plan.js +154 -4
- package/dist/plan.js.map +4 -4
- package/dist/session-kanban.d.ts +38 -0
- package/dist/session-kanban.d.ts.map +1 -0
- package/dist/session-kanban.js +489 -0
- package/dist/session-kanban.js.map +7 -0
- package/dist/task.d.ts.map +1 -1
- package/dist/task.js +163 -4
- package/dist/task.js.map +4 -4
- package/dist/todo.d.ts.map +1 -1
- package/dist/todo.js +155 -7
- package/dist/todo.js.map +4 -4
- package/dist/tool-icon-map.d.ts.map +1 -1
- package/dist/tool-icons.d.ts.map +1 -1
- package/dist/tool-icons.js +7 -1
- package/dist/tool-icons.js.map +2 -2
- package/package.json +7 -3
package/dist/kanban.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SerializedTaskGraph, Tool } from '@wrongstack/core';
|
|
2
|
-
import type { AssignKanbanTaskInput, KanbanAgentRunStatus, KanbanBoard, KanbanBoardSummary, KanbanEvent, KanbanOrchestrationSnapshot, KanbanQueueHealth, KanbanSearchResult, KanbanTask, KanbanTaskPriority, KanbanTaskStatus } from '@wrongstack/kanban';
|
|
3
|
-
type KanbanAction = 'list_boards' | 'get_board' | 'create_board' | 'duplicate_board' | 'update_board' | 'delete_board' | 'generate_board' | 'export_markdown' | 'export_task_graph' | 'sync_task_graph' | 'search_tasks' | 'ready_tasks' | 'snapshot' | 'add_column' | 'update_column' | 'delete_column' | 'add_task' | 'split_task' | 'merge_tasks' | 'copy_task' | 'transfer_task' | 'get_task' | 'update_task' | 'move_task' | 'delete_task' | 'set_chain' | 'get_chain' | 'claim_task' | 'release_task' | 'assign_task' | 'mark_assignment' | 'heartbeat_assignment' | 'recover_stale' | 'events' | 'queue_health' | 'add_dependency' | 'add_goal_metric' | 'update_goal_metric' | 'add_check' | 'update_check' | 'add_note' | 'add_link';
|
|
2
|
+
import type { AssignKanbanTaskInput, KanbanAgentRunStatus, KanbanBoard, KanbanBoardSummary, KanbanEvent, KanbanOrchestrationSnapshot, KanbanQueueHealth, KanbanSearchResult, KanbanTask, KanbanTaskPriority, KanbanTaskStatus, KanbanTaskType } from '@wrongstack/kanban';
|
|
3
|
+
type KanbanAction = 'list_boards' | 'get_board' | 'create_board' | 'duplicate_board' | 'update_board' | 'delete_board' | 'generate_board' | 'export_markdown' | 'export_task_graph' | 'sync_task_graph' | 'create_from_graph' | 'import_session_tasks' | 'search_tasks' | 'ready_tasks' | 'snapshot' | 'add_column' | 'update_column' | 'delete_column' | 'add_task' | 'split_task' | 'merge_tasks' | 'copy_task' | 'transfer_task' | 'get_task' | 'update_task' | 'move_task' | 'delete_task' | 'set_chain' | 'get_chain' | 'claim_task' | 'release_task' | 'assign_task' | 'mark_assignment' | 'heartbeat_assignment' | 'recover_stale' | 'events' | 'queue_health' | 'add_dependency' | 'add_goal_metric' | 'update_goal_metric' | 'add_check' | 'update_check' | 'add_note' | 'add_link';
|
|
4
4
|
interface KanbanToolInput extends Omit<AssignKanbanTaskInput, 'status'> {
|
|
5
5
|
action: KanbanAction;
|
|
6
6
|
boardId?: string | undefined;
|
|
@@ -14,6 +14,7 @@ interface KanbanToolInput extends Omit<AssignKanbanTaskInput, 'status'> {
|
|
|
14
14
|
tags?: string[] | undefined;
|
|
15
15
|
labels?: string[] | undefined;
|
|
16
16
|
priority?: KanbanTaskPriority | undefined;
|
|
17
|
+
taskType?: KanbanTaskType | undefined;
|
|
17
18
|
status?: KanbanTaskStatus | undefined;
|
|
18
19
|
order?: number | undefined;
|
|
19
20
|
targetColumnId?: string | undefined;
|
|
@@ -85,6 +86,10 @@ interface KanbanToolInput extends Omit<AssignKanbanTaskInput, 'status'> {
|
|
|
85
86
|
includeArchived?: boolean | undefined;
|
|
86
87
|
archiveMissingTasks?: boolean | undefined;
|
|
87
88
|
preserveManualDependencies?: boolean | undefined;
|
|
89
|
+
/** Full dependency id list for add_task/update_task (superset of dependencyTaskId). */
|
|
90
|
+
dependsOn?: string[] | undefined;
|
|
91
|
+
/** Estimated effort in hours for add_task/update_task. */
|
|
92
|
+
estimatedHours?: number | undefined;
|
|
88
93
|
}
|
|
89
94
|
interface KanbanToolOutput {
|
|
90
95
|
ok: boolean;
|
package/dist/kanban.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kanban.d.ts","sourceRoot":"","sources":["../src/kanban.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAyB,mBAAmB,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEzF,OAAO,KAAK,EACV,qBAAqB,EAErB,oBAAoB,EACpB,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,kBAAkB,EAClB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"kanban.d.ts","sourceRoot":"","sources":["../src/kanban.ts"],"names":[],"mappings":"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"}
|
package/dist/kanban.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/kanban.ts
|
|
2
|
-
import { deserializeTaskGraph, serializeTaskGraph } from "@wrongstack/core";
|
|
2
|
+
import { deserializeTaskGraph as deserializeTaskGraph2, loadTasks as loadTasks2, serializeTaskGraph } from "@wrongstack/core";
|
|
3
3
|
import {
|
|
4
4
|
addCheckToTask,
|
|
5
5
|
addColumn,
|
|
@@ -11,18 +11,19 @@ import {
|
|
|
11
11
|
assignTask,
|
|
12
12
|
claimReadyTask,
|
|
13
13
|
copyTaskToBoard,
|
|
14
|
-
createBoard,
|
|
14
|
+
createBoard as createBoard2,
|
|
15
|
+
createBoardFromTaskGraph,
|
|
15
16
|
duplicateBoard,
|
|
16
17
|
exportBoardAsMarkdown,
|
|
17
18
|
exportBoardToTaskGraph,
|
|
18
19
|
generateBoardFromDescription,
|
|
19
|
-
getBoard,
|
|
20
|
+
getBoard as getBoard2,
|
|
20
21
|
getKanbanOrchestrationSnapshot,
|
|
21
22
|
getKanbanQueueHealth,
|
|
22
23
|
getTask,
|
|
23
24
|
getTaskChain,
|
|
24
25
|
heartbeatTaskAssignment,
|
|
25
|
-
listBoards,
|
|
26
|
+
listBoards as listBoards2,
|
|
26
27
|
listKanbanEvents,
|
|
27
28
|
listReadyTasks,
|
|
28
29
|
mergeTasks,
|
|
@@ -30,21 +31,76 @@ import {
|
|
|
30
31
|
parseLinesIntoTasks,
|
|
31
32
|
recoverStaleTaskAssignments,
|
|
32
33
|
releaseTaskClaim,
|
|
33
|
-
removeBoard,
|
|
34
|
+
removeBoard as removeBoard2,
|
|
34
35
|
removeColumn,
|
|
35
36
|
removeTask,
|
|
36
37
|
searchKanban,
|
|
37
38
|
setTaskChain,
|
|
38
39
|
splitTask,
|
|
39
|
-
syncBoardFromTaskGraph,
|
|
40
|
+
syncBoardFromTaskGraph as syncBoardFromTaskGraph2,
|
|
40
41
|
transferTaskToBoard,
|
|
41
|
-
updateBoard,
|
|
42
|
+
updateBoard as updateBoard2,
|
|
42
43
|
updateCheckOnTask,
|
|
43
44
|
updateColumn,
|
|
44
45
|
updateGoalMetricOnTask,
|
|
45
46
|
updateTask,
|
|
46
47
|
updateTaskAssignment
|
|
47
48
|
} from "@wrongstack/kanban";
|
|
49
|
+
|
|
50
|
+
// src/session-kanban.ts
|
|
51
|
+
import {
|
|
52
|
+
deserializeTaskGraph,
|
|
53
|
+
loadPlan,
|
|
54
|
+
loadTasks,
|
|
55
|
+
mutatePlan,
|
|
56
|
+
mutateTasks
|
|
57
|
+
} from "@wrongstack/core";
|
|
58
|
+
import {
|
|
59
|
+
createBoard,
|
|
60
|
+
getBoard,
|
|
61
|
+
listBoards,
|
|
62
|
+
removeBoard,
|
|
63
|
+
syncBoardFromTaskGraph,
|
|
64
|
+
updateBoard
|
|
65
|
+
} from "@wrongstack/kanban";
|
|
66
|
+
function taskFileToSerializedGraph(tasks, sessionId) {
|
|
67
|
+
const ids = new Set(tasks.map((task) => task.id));
|
|
68
|
+
const nodes = tasks.map((task, index) => ({
|
|
69
|
+
id: task.id,
|
|
70
|
+
title: task.title,
|
|
71
|
+
description: task.description ?? "",
|
|
72
|
+
type: task.type,
|
|
73
|
+
priority: task.priority,
|
|
74
|
+
status: task.status,
|
|
75
|
+
...task.assignee ? { assignee: task.assignee } : {},
|
|
76
|
+
...task.estimateHours !== void 0 ? { estimateHours: task.estimateHours } : {},
|
|
77
|
+
createdAt: index,
|
|
78
|
+
updatedAt: index
|
|
79
|
+
}));
|
|
80
|
+
const edges = tasks.flatMap(
|
|
81
|
+
(task) => (task.dependsOn ?? []).filter((dependency) => ids.has(dependency)).map((dependency) => ({
|
|
82
|
+
id: `${dependency}->${task.id}`,
|
|
83
|
+
from: dependency,
|
|
84
|
+
to: task.id,
|
|
85
|
+
type: "depends_on"
|
|
86
|
+
}))
|
|
87
|
+
);
|
|
88
|
+
const hasIncoming = new Set(edges.map((edge) => edge.to));
|
|
89
|
+
const rootNodes = nodes.filter((node) => !hasIncoming.has(node.id)).map((node) => node.id);
|
|
90
|
+
return {
|
|
91
|
+
// Keep the historical graph id so existing mirrored task cards are reused.
|
|
92
|
+
id: `session:${sessionId}`,
|
|
93
|
+
specId: `session:${sessionId}`,
|
|
94
|
+
title: "Session tasks",
|
|
95
|
+
nodes,
|
|
96
|
+
edges,
|
|
97
|
+
rootNodes: rootNodes.length ? rootNodes : nodes[0] ? [nodes[0].id] : [],
|
|
98
|
+
createdAt: 0,
|
|
99
|
+
updatedAt: 0
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// src/kanban.ts
|
|
48
104
|
var kanbanTool = {
|
|
49
105
|
name: "kanban",
|
|
50
106
|
category: "Project",
|
|
@@ -71,6 +127,8 @@ var kanbanTool = {
|
|
|
71
127
|
"export_markdown",
|
|
72
128
|
"export_task_graph",
|
|
73
129
|
"sync_task_graph",
|
|
130
|
+
"create_from_graph",
|
|
131
|
+
"import_session_tasks",
|
|
74
132
|
"search_tasks",
|
|
75
133
|
"ready_tasks",
|
|
76
134
|
"snapshot",
|
|
@@ -117,6 +175,10 @@ var kanbanTool = {
|
|
|
117
175
|
tags: { type: "array", items: { type: "string" } },
|
|
118
176
|
labels: { type: "array", items: { type: "string" } },
|
|
119
177
|
priority: { type: "string", enum: ["critical", "high", "medium", "low"] },
|
|
178
|
+
taskType: {
|
|
179
|
+
type: "string",
|
|
180
|
+
enum: ["feature", "bugfix", "refactor", "docs", "test", "chore"]
|
|
181
|
+
},
|
|
120
182
|
status: {
|
|
121
183
|
type: "string",
|
|
122
184
|
enum: [
|
|
@@ -159,8 +221,21 @@ var kanbanTool = {
|
|
|
159
221
|
releaseStatus: { type: "string", enum: ["pending", "ready", "blocked"] },
|
|
160
222
|
releaseReason: { type: "string" },
|
|
161
223
|
clearAssignee: { type: "boolean" },
|
|
162
|
-
recoveryMode: { type: "string", enum: ["release", "retry", "fail"] },
|
|
224
|
+
recoveryMode: { type: "string", enum: ["auto", "release", "retry", "fail"] },
|
|
163
225
|
recoveryNow: { type: "string" },
|
|
226
|
+
recoveryPolicyFailOnCostCeiling: { type: "boolean" },
|
|
227
|
+
recoveryPolicyReleaseOnFailureKinds: { type: "array", items: { type: "string" } },
|
|
228
|
+
recoveryPolicyReleaseOnHeartbeatDue: { type: "boolean" },
|
|
229
|
+
recoveryPolicyRetryPolicyOverride: {
|
|
230
|
+
type: "string",
|
|
231
|
+
enum: ["off", "incremental", "exponential"]
|
|
232
|
+
},
|
|
233
|
+
assignee: { type: "string" },
|
|
234
|
+
costCeilingUsd: { type: "number" },
|
|
235
|
+
retryPolicy: { type: "string", enum: ["off", "incremental", "exponential"] },
|
|
236
|
+
lastFailureKind: { type: "string" },
|
|
237
|
+
dependsOn: { type: "array", items: { type: "string" } },
|
|
238
|
+
estimatedHours: { type: "number" },
|
|
164
239
|
taskGraph: { type: "object" },
|
|
165
240
|
graphId: { type: "string" },
|
|
166
241
|
specId: { type: "string" },
|
|
@@ -216,7 +291,7 @@ var kanbanTool = {
|
|
|
216
291
|
try {
|
|
217
292
|
switch (input.action) {
|
|
218
293
|
case "list_boards": {
|
|
219
|
-
const boards = await
|
|
294
|
+
const boards = await listBoards2(projectRoot);
|
|
220
295
|
return { ok: true, message: `${boards.length} board(s).`, boards };
|
|
221
296
|
}
|
|
222
297
|
case "get_board": {
|
|
@@ -225,7 +300,7 @@ var kanbanTool = {
|
|
|
225
300
|
}
|
|
226
301
|
case "create_board": {
|
|
227
302
|
if (!input.title) return fail("create_board requires title.");
|
|
228
|
-
const board = await
|
|
303
|
+
const board = await createBoard2(projectRoot, {
|
|
229
304
|
title: input.title,
|
|
230
305
|
...input.description !== void 0 ? { description: input.description } : {},
|
|
231
306
|
...input.tags !== void 0 ? { tags: input.tags } : {},
|
|
@@ -235,7 +310,7 @@ var kanbanTool = {
|
|
|
235
310
|
}
|
|
236
311
|
case "update_board": {
|
|
237
312
|
if (!input.boardId) return fail("update_board requires boardId.");
|
|
238
|
-
const board = await
|
|
313
|
+
const board = await updateBoard2(projectRoot, input.boardId, {
|
|
239
314
|
...input.title !== void 0 ? { title: input.title } : {},
|
|
240
315
|
...input.description !== void 0 ? { description: input.description } : {},
|
|
241
316
|
...input.tags !== void 0 ? { tags: input.tags } : {}
|
|
@@ -255,7 +330,7 @@ var kanbanTool = {
|
|
|
255
330
|
}
|
|
256
331
|
case "delete_board": {
|
|
257
332
|
if (!input.boardId) return fail("delete_board requires boardId.");
|
|
258
|
-
const removed = await
|
|
333
|
+
const removed = await removeBoard2(projectRoot, input.boardId);
|
|
259
334
|
return { ok: removed, message: removed ? "Board deleted." : "Board not found." };
|
|
260
335
|
}
|
|
261
336
|
case "generate_board": {
|
|
@@ -266,14 +341,14 @@ var kanbanTool = {
|
|
|
266
341
|
...input.context !== void 0 ? { context: input.context } : {},
|
|
267
342
|
...input.columns !== void 0 ? { columns: input.columns } : {}
|
|
268
343
|
});
|
|
269
|
-
const board = await
|
|
344
|
+
const board = await createBoard2(projectRoot, boardInput);
|
|
270
345
|
for (const taskInput2 of parseLinesIntoTasks(
|
|
271
346
|
input.description,
|
|
272
347
|
board.columns[0]?.id ?? "backlog"
|
|
273
348
|
)) {
|
|
274
349
|
await addTask(projectRoot, board.id, taskInput2);
|
|
275
350
|
}
|
|
276
|
-
return okBoard(await
|
|
351
|
+
return okBoard(await getBoard2(projectRoot, board.id) ?? board, "Board generated.");
|
|
277
352
|
}
|
|
278
353
|
case "export_markdown": {
|
|
279
354
|
const board = await requireBoard(projectRoot, input.boardId);
|
|
@@ -306,8 +381,8 @@ var kanbanTool = {
|
|
|
306
381
|
if (!input.boardId || !input.taskGraph) {
|
|
307
382
|
return fail("sync_task_graph requires boardId and taskGraph.");
|
|
308
383
|
}
|
|
309
|
-
const graph =
|
|
310
|
-
const result = await
|
|
384
|
+
const graph = deserializeTaskGraph2(input.taskGraph);
|
|
385
|
+
const result = await syncBoardFromTaskGraph2(projectRoot, input.boardId, graph, {
|
|
311
386
|
...input.title !== void 0 ? { title: input.title } : {},
|
|
312
387
|
...input.description !== void 0 ? { description: input.description } : {},
|
|
313
388
|
...input.tags !== void 0 ? { tags: input.tags } : {},
|
|
@@ -324,6 +399,59 @@ var kanbanTool = {
|
|
|
324
399
|
board: result.board
|
|
325
400
|
} : fail("Board not found.");
|
|
326
401
|
}
|
|
402
|
+
case "create_from_graph": {
|
|
403
|
+
if (!input.taskGraph) return fail("create_from_graph requires taskGraph.");
|
|
404
|
+
const graph = deserializeTaskGraph2(input.taskGraph);
|
|
405
|
+
const { board } = await createBoardFromTaskGraph(projectRoot, graph, {
|
|
406
|
+
...input.title !== void 0 ? { title: input.title } : {},
|
|
407
|
+
...input.description !== void 0 ? { description: input.description } : {},
|
|
408
|
+
...input.tags !== void 0 ? { tags: input.tags } : {},
|
|
409
|
+
...input.generatedBy !== void 0 ? { generatedBy: input.generatedBy } : {},
|
|
410
|
+
...input.sourceSystem !== void 0 ? { sourceSystem: input.sourceSystem } : {},
|
|
411
|
+
...input.phaseId !== void 0 ? { phaseId: input.phaseId } : {},
|
|
412
|
+
...input.includeCompletedTasks !== void 0 ? { includeCompletedTasks: input.includeCompletedTasks } : {}
|
|
413
|
+
});
|
|
414
|
+
return {
|
|
415
|
+
ok: true,
|
|
416
|
+
message: `Created board "${board.title}" from task graph with ${board.tasks.length} tasks.`,
|
|
417
|
+
board
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
case "import_session_tasks": {
|
|
421
|
+
const taskPath = ctx.meta?.["task.path"];
|
|
422
|
+
if (!taskPath) return fail("No session task file for this session.");
|
|
423
|
+
const file = await loadTasks2(taskPath);
|
|
424
|
+
if (!file || file.tasks.length === 0) return fail("No session tasks to import.");
|
|
425
|
+
const sessionId = ctx.session?.id ?? file.sessionId ?? "session";
|
|
426
|
+
const graph = deserializeTaskGraph2(taskFileToSerializedGraph(file.tasks, sessionId));
|
|
427
|
+
const tags = ["session", `session:${sessionId}`];
|
|
428
|
+
const existing = (await listBoards2(projectRoot)).find(
|
|
429
|
+
(b) => b.tags?.includes(`session:${sessionId}`)
|
|
430
|
+
);
|
|
431
|
+
if (existing) {
|
|
432
|
+
const result = await syncBoardFromTaskGraph2(projectRoot, existing.id, graph, {
|
|
433
|
+
sourceSystem: "session",
|
|
434
|
+
tags,
|
|
435
|
+
archiveMissingTasks: true,
|
|
436
|
+
includeCompletedTasks: true
|
|
437
|
+
});
|
|
438
|
+
return result ? {
|
|
439
|
+
ok: true,
|
|
440
|
+
message: `Synced ${file.tasks.length} session tasks into board "${result.board.title}".`,
|
|
441
|
+
board: result.board
|
|
442
|
+
} : fail("Session board vanished mid-sync.");
|
|
443
|
+
}
|
|
444
|
+
const { board } = await createBoardFromTaskGraph(projectRoot, graph, {
|
|
445
|
+
title: `Session tasks (${sessionId.slice(0, 8)})`,
|
|
446
|
+
sourceSystem: "session",
|
|
447
|
+
tags
|
|
448
|
+
});
|
|
449
|
+
return {
|
|
450
|
+
ok: true,
|
|
451
|
+
message: `Imported ${file.tasks.length} session tasks into new board "${board.title}".`,
|
|
452
|
+
board
|
|
453
|
+
};
|
|
454
|
+
}
|
|
327
455
|
case "search_tasks": {
|
|
328
456
|
const tasks = await searchKanban(projectRoot, {
|
|
329
457
|
query: input.query,
|
|
@@ -760,7 +888,7 @@ function okTask(board, task, message) {
|
|
|
760
888
|
return { ok: true, message, board, task };
|
|
761
889
|
}
|
|
762
890
|
async function requireBoard(projectRoot, boardId) {
|
|
763
|
-
return boardId ?
|
|
891
|
+
return boardId ? getBoard2(projectRoot, boardId) : null;
|
|
764
892
|
}
|
|
765
893
|
function taskInput(input) {
|
|
766
894
|
const assignment = hasAssignmentInput(input) ? assignmentForTaskCreate(input) : void 0;
|
|
@@ -769,14 +897,23 @@ function taskInput(input) {
|
|
|
769
897
|
columnId: input.columnId,
|
|
770
898
|
description: input.description,
|
|
771
899
|
priority: input.priority,
|
|
900
|
+
...input.taskType !== void 0 ? { type: input.taskType } : {},
|
|
772
901
|
status: input.status,
|
|
773
902
|
labels: input.labels,
|
|
774
903
|
...assignment?.agentId ?? assignment?.role ?? assignment?.name ? { assignedAgent: assignment.agentId ?? assignment.role ?? assignment.name } : {},
|
|
775
904
|
...input.assignee ?? assignment?.name ?? assignment?.agentId ? { assignee: input.assignee ?? assignment?.name ?? assignment?.agentId } : {},
|
|
776
|
-
...input
|
|
905
|
+
...mergedDependsOn(input) ? { dependsOn: mergedDependsOn(input) } : {},
|
|
906
|
+
...input.estimatedHours !== void 0 ? { estimatedHours: input.estimatedHours } : {},
|
|
777
907
|
...assignment ? { assignment } : {}
|
|
778
908
|
};
|
|
779
909
|
}
|
|
910
|
+
function mergedDependsOn(input) {
|
|
911
|
+
const ids = [
|
|
912
|
+
...input.dependsOn ?? [],
|
|
913
|
+
...input.dependencyTaskId !== void 0 ? [input.dependencyTaskId] : []
|
|
914
|
+
].filter((id, i, arr) => id && arr.indexOf(id) === i);
|
|
915
|
+
return ids.length > 0 ? ids : void 0;
|
|
916
|
+
}
|
|
780
917
|
function taskPatch(input) {
|
|
781
918
|
return {
|
|
782
919
|
title: input.title,
|
|
@@ -784,10 +921,12 @@ function taskPatch(input) {
|
|
|
784
921
|
columnId: input.columnId,
|
|
785
922
|
order: input.order,
|
|
786
923
|
priority: input.priority,
|
|
924
|
+
...input.taskType !== void 0 ? { type: input.taskType } : {},
|
|
787
925
|
status: input.status,
|
|
788
926
|
labels: input.labels,
|
|
789
927
|
assignedAgent: input.agentId,
|
|
790
|
-
...input
|
|
928
|
+
...mergedDependsOn(input) ? { dependsOn: mergedDependsOn(input) } : {},
|
|
929
|
+
...input.estimatedHours !== void 0 ? { estimatedHours: input.estimatedHours } : {}
|
|
791
930
|
};
|
|
792
931
|
}
|
|
793
932
|
function assignmentInput(input) {
|