@vheins/local-memory-mcp 0.4.2 → 0.4.6
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/dashboard/public/app.js +16 -7
- package/dist/dashboard/public/index.html +17 -6
- package/dist/prompts/registry.d.ts +92 -8
- package/dist/prompts/registry.d.ts.map +1 -1
- package/dist/prompts/registry.js +204 -41
- package/dist/prompts/registry.js.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +18 -3
- package/dist/router.js.map +1 -1
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +23 -6
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/tasks.archive.test.d.ts +2 -0
- package/dist/tasks.archive.test.d.ts.map +1 -0
- package/dist/tasks.archive.test.js +75 -0
- package/dist/tasks.archive.test.js.map +1 -0
- package/dist/tools/schemas.d.ts +12 -18
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +10 -11
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/task.bulk-manage.d.ts +2 -1
- package/dist/tools/task.bulk-manage.d.ts.map +1 -1
- package/dist/tools/task.bulk-manage.js +20 -2
- package/dist/tools/task.bulk-manage.js.map +1 -1
- package/dist/tools/task.manage.d.ts +3 -1
- package/dist/tools/task.manage.d.ts.map +1 -1
- package/dist/tools/task.manage.js +66 -3
- package/dist/tools/task.manage.js.map +1 -1
- package/dist/tools/tasks-transition.test.js +71 -11
- package/dist/tools/tasks-transition.test.js.map +1 -1
- package/dist/tools/tasks.pending-limit-refined.test.d.ts +2 -0
- package/dist/tools/tasks.pending-limit-refined.test.d.ts.map +1 -0
- package/dist/tools/tasks.pending-limit-refined.test.js +72 -0
- package/dist/tools/tasks.pending-limit-refined.test.js.map +1 -0
- package/dist/types.d.ts +3 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SQLiteStore } from "../storage/sqlite.js";
|
|
2
|
-
|
|
2
|
+
import { VectorStore } from "../types.js";
|
|
3
|
+
export declare function handleTaskBulkManage(args: any, storage: SQLiteStore, vectors: VectorStore): Promise<{
|
|
3
4
|
content: {
|
|
4
5
|
type: string;
|
|
5
6
|
text: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.bulk-manage.d.ts","sourceRoot":"","sources":["../../src/tools/task.bulk-manage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"task.bulk-manage.d.ts","sourceRoot":"","sources":["../../src/tools/task.bulk-manage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAkC,WAAW,EAAE,MAAM,aAAa,CAAC;AAY1E,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW;;;;;;GAkGrB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from "crypto";
|
|
2
2
|
import { TaskBulkManageSchema } from "./schemas.js";
|
|
3
|
+
import { archiveTaskToMemory } from "./task.manage.js";
|
|
3
4
|
function deriveTaskStatusTimestamps(status, now) {
|
|
4
5
|
return {
|
|
5
6
|
in_progress_at: status === "in_progress" ? now : null,
|
|
@@ -7,7 +8,7 @@ function deriveTaskStatusTimestamps(status, now) {
|
|
|
7
8
|
canceled_at: status === "canceled" ? now : null
|
|
8
9
|
};
|
|
9
10
|
}
|
|
10
|
-
export async function handleTaskBulkManage(args, storage) {
|
|
11
|
+
export async function handleTaskBulkManage(args, storage, vectors) {
|
|
11
12
|
const parsed = TaskBulkManageSchema.parse(args);
|
|
12
13
|
const { action, repo, tasks, ids } = parsed;
|
|
13
14
|
switch (action) {
|
|
@@ -26,7 +27,20 @@ export async function handleTaskBulkManage(args, storage) {
|
|
|
26
27
|
}
|
|
27
28
|
codesInRequest.add(taskData.task_code);
|
|
28
29
|
const taskId = randomUUID();
|
|
29
|
-
const normalizedStatus = taskData.status || "
|
|
30
|
+
const normalizedStatus = taskData.status || "backlog";
|
|
31
|
+
// New tasks MUST be backlog or pending
|
|
32
|
+
if (normalizedStatus !== "backlog" && normalizedStatus !== "pending") {
|
|
33
|
+
throw new Error(`New tasks must be created with status 'backlog' or 'pending'. Task '${taskData.task_code}' has status '${normalizedStatus}'.`);
|
|
34
|
+
}
|
|
35
|
+
// Max 10 pending tasks validation
|
|
36
|
+
if (normalizedStatus === "pending") {
|
|
37
|
+
const stats = storage.getTaskStats(repo);
|
|
38
|
+
// Count pending tasks in current request that are already processed
|
|
39
|
+
const pendingInRequest = tasks.slice(0, createdTasks.length).filter(t => (t.status || "backlog") === "pending").length;
|
|
40
|
+
if (stats.todo + pendingInRequest >= 10) {
|
|
41
|
+
throw new Error(`Cannot create task '${taskData.task_code}' as 'pending'. Maximum of 10 pending tasks reached in repository '${repo}'. Please use 'backlog' instead.`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
30
44
|
const statusTimestamps = deriveTaskStatusTimestamps(normalizedStatus, now);
|
|
31
45
|
const task = {
|
|
32
46
|
id: taskId,
|
|
@@ -53,6 +67,10 @@ export async function handleTaskBulkManage(args, storage) {
|
|
|
53
67
|
};
|
|
54
68
|
storage.insertTask(task);
|
|
55
69
|
createdTasks.push(task.task_code);
|
|
70
|
+
// Archive if created as completed
|
|
71
|
+
if (task.status === "completed") {
|
|
72
|
+
await archiveTaskToMemory(task.id, repo, storage, vectors);
|
|
73
|
+
}
|
|
56
74
|
}
|
|
57
75
|
return {
|
|
58
76
|
content: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.bulk-manage.js","sourceRoot":"","sources":["../../src/tools/task.bulk-manage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"task.bulk-manage.js","sourceRoot":"","sources":["../../src/tools/task.bulk-manage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { SQLiteStore } from "../storage/sqlite.js";
|
|
2
|
+
import { VectorStore } from "../types.js";
|
|
3
|
+
export declare function archiveTaskToMemory(taskId: string, repo: string, storage: SQLiteStore, vectors: VectorStore): Promise<void>;
|
|
2
4
|
export declare function handleTaskList(args: any, storage: SQLiteStore): Promise<{
|
|
3
5
|
content: {
|
|
4
6
|
type: string;
|
|
@@ -13,7 +15,7 @@ export declare function handleTaskCreate(args: any, storage: SQLiteStore): Promi
|
|
|
13
15
|
}[];
|
|
14
16
|
isError: boolean;
|
|
15
17
|
}>;
|
|
16
|
-
export declare function handleTaskUpdate(args: any, storage: SQLiteStore): Promise<{
|
|
18
|
+
export declare function handleTaskUpdate(args: any, storage: SQLiteStore, vectors: VectorStore): Promise<{
|
|
17
19
|
content: {
|
|
18
20
|
type: string;
|
|
19
21
|
text: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.manage.d.ts","sourceRoot":"","sources":["../../src/tools/task.manage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"task.manage.d.ts","sourceRoot":"","sources":["../../src/tools/task.manage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAkC,WAAW,EAAE,MAAM,aAAa,CAAC;AA8B1E,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,iBAgDrB;AAGD,wBAAsB,cAAc,CAClC,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,WAAW;;;;;;GA+BrB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,WAAW;;;;;;GA0DrB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW;;;;;;GAkFrB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,WAAW;;;;;;GAYrB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from "crypto";
|
|
2
2
|
import { TaskListSchema, TaskCreateSchema, TaskUpdateSchema, TaskDeleteSchema } from "./schemas.js";
|
|
3
|
+
import { handleMemoryStore } from "./memory.store.js";
|
|
3
4
|
function deriveTaskStatusTimestamps(status, now, existingTask) {
|
|
4
5
|
const timestamps = {
|
|
5
6
|
in_progress_at: null,
|
|
@@ -17,6 +18,50 @@ function deriveTaskStatusTimestamps(status, now, existingTask) {
|
|
|
17
18
|
}
|
|
18
19
|
return timestamps;
|
|
19
20
|
}
|
|
21
|
+
export async function archiveTaskToMemory(taskId, repo, storage, vectors) {
|
|
22
|
+
const task = storage.getTaskById(taskId);
|
|
23
|
+
if (!task)
|
|
24
|
+
return;
|
|
25
|
+
const comments = storage.getTaskCommentsByTaskId(taskId);
|
|
26
|
+
let content = `Task: [${task.task_code}] ${task.title}\n`;
|
|
27
|
+
content += `Phase: ${task.phase}\n`;
|
|
28
|
+
content += `Description: ${task.description || "No description"}\n`;
|
|
29
|
+
if (comments && comments.length > 0) {
|
|
30
|
+
content += `\nComments & History:\n`;
|
|
31
|
+
// Reverse comments to show in chronological order for the archive
|
|
32
|
+
const chronComments = [...comments].reverse();
|
|
33
|
+
for (const c of chronComments) {
|
|
34
|
+
const statusInfo = c.next_status ? ` (Status: ${c.previous_status} -> ${c.next_status})` : "";
|
|
35
|
+
content += `- [${c.created_at}] ${c.agent}${statusInfo}: ${c.comment}\n`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Use the task metadata if available
|
|
39
|
+
const metadata = {
|
|
40
|
+
task_id: taskId,
|
|
41
|
+
task_code: task.task_code,
|
|
42
|
+
original_metadata: task.metadata
|
|
43
|
+
};
|
|
44
|
+
const title = `Completed Task: ${task.title}`;
|
|
45
|
+
const truncatedTitle = title.length > 100 ? title.substring(0, 97) + "..." : title;
|
|
46
|
+
try {
|
|
47
|
+
await handleMemoryStore({
|
|
48
|
+
type: "task_archive",
|
|
49
|
+
title: truncatedTitle,
|
|
50
|
+
content: content,
|
|
51
|
+
importance: Math.min(5, task.priority + 1), // Slightly higher importance for archived tasks
|
|
52
|
+
agent: task.agent || "system",
|
|
53
|
+
role: task.role || "unknown",
|
|
54
|
+
model: "system",
|
|
55
|
+
scope: { repo: repo },
|
|
56
|
+
tags: ["task-archive", ...task.tags],
|
|
57
|
+
metadata: metadata
|
|
58
|
+
}, storage, vectors);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// console.error is fine here, or use logger if available
|
|
62
|
+
console.error("Failed to archive task to memory", error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
20
65
|
export async function handleTaskList(args, storage) {
|
|
21
66
|
const { repo, status, phase, limit, offset } = TaskListSchema.parse(args);
|
|
22
67
|
let tasks;
|
|
@@ -26,7 +71,7 @@ export async function handleTaskList(args, storage) {
|
|
|
26
71
|
}
|
|
27
72
|
else {
|
|
28
73
|
// If no status specified, exclude 'completed' by default to keep context clean.
|
|
29
|
-
const activeStatuses = ['pending', 'in_progress', 'blocked', 'canceled'];
|
|
74
|
+
const activeStatuses = ['backlog', 'pending', 'in_progress', 'blocked', 'canceled'];
|
|
30
75
|
tasks = storage.getTasksByMultipleStatuses(repo, activeStatuses, limit, offset);
|
|
31
76
|
}
|
|
32
77
|
const filteredTasks = phase
|
|
@@ -51,6 +96,17 @@ export async function handleTaskCreate(args, storage) {
|
|
|
51
96
|
if (storage.isTaskCodeDuplicate(repo, task_code)) {
|
|
52
97
|
throw new Error(`Duplicate task_code: '${task_code}' already exists in repository '${repo}'`);
|
|
53
98
|
}
|
|
99
|
+
// New tasks MUST be backlog or pending
|
|
100
|
+
if (status !== "backlog" && status !== "pending") {
|
|
101
|
+
throw new Error("New tasks must be created with status 'backlog' or 'pending'.");
|
|
102
|
+
}
|
|
103
|
+
// Max 10 pending tasks validation
|
|
104
|
+
if (status === "pending") {
|
|
105
|
+
const stats = storage.getTaskStats(repo);
|
|
106
|
+
if (stats.todo >= 10) {
|
|
107
|
+
throw new Error(`Cannot create task as 'pending'. Maximum of 10 pending tasks reached in repository '${repo}'. Please use 'backlog' instead.`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
54
110
|
const taskId = randomUUID();
|
|
55
111
|
const now = new Date().toISOString();
|
|
56
112
|
const statusTimestamps = deriveTaskStatusTimestamps(status, now);
|
|
@@ -86,7 +142,7 @@ export async function handleTaskCreate(args, storage) {
|
|
|
86
142
|
isError: false
|
|
87
143
|
};
|
|
88
144
|
}
|
|
89
|
-
export async function handleTaskUpdate(args, storage) {
|
|
145
|
+
export async function handleTaskUpdate(args, storage, vectors) {
|
|
90
146
|
const updateData = TaskUpdateSchema.parse(args);
|
|
91
147
|
const { repo, id, comment, ...updates } = updateData;
|
|
92
148
|
const existingTask = storage.getTaskById(id);
|
|
@@ -99,6 +155,9 @@ export async function handleTaskUpdate(args, storage) {
|
|
|
99
155
|
throw new Error("comment is required when changing task status");
|
|
100
156
|
}
|
|
101
157
|
// Workflow transition validation
|
|
158
|
+
if (existingTask.status === "backlog" && updates.status === "completed") {
|
|
159
|
+
throw new Error("Cannot transition directly from 'backlog' to 'completed'. Task must be 'in_progress' first.");
|
|
160
|
+
}
|
|
102
161
|
if (existingTask.status === "pending" && updates.status === "completed") {
|
|
103
162
|
throw new Error("Cannot transition directly from 'pending' to 'completed'. Task must be 'in_progress' first.");
|
|
104
163
|
}
|
|
@@ -143,10 +202,14 @@ export async function handleTaskUpdate(args, storage) {
|
|
|
143
202
|
created_at: new Date().toISOString()
|
|
144
203
|
});
|
|
145
204
|
}
|
|
205
|
+
// Archive to memory if completed
|
|
206
|
+
if (updates.status === "completed" && existingTask.status !== "completed") {
|
|
207
|
+
await archiveTaskToMemory(id, repo, storage, vectors);
|
|
208
|
+
}
|
|
146
209
|
return {
|
|
147
210
|
content: [{
|
|
148
211
|
type: "text",
|
|
149
|
-
text: `Task updated: ${id}`
|
|
212
|
+
text: `Task updated: ${id}${updates.status === "completed" ? " and archived to memory" : ""}`
|
|
150
213
|
}],
|
|
151
214
|
isError: false
|
|
152
215
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.manage.js","sourceRoot":"","sources":["../../src/tools/task.manage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"task.manage.js","sourceRoot":"","sources":["../../src/tools/task.manage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from "vitest";
|
|
1
|
+
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
2
2
|
import { handleTaskUpdate, handleTaskCreate } from "./task.manage.js";
|
|
3
3
|
import { SQLiteStore } from "../storage/sqlite.js";
|
|
4
4
|
describe("Task Status Transitions", () => {
|
|
5
5
|
let db;
|
|
6
|
+
let mockVectors;
|
|
6
7
|
const REPO = "test-repo";
|
|
7
8
|
beforeEach(() => {
|
|
8
9
|
db = new SQLiteStore(":memory:");
|
|
10
|
+
mockVectors = {
|
|
11
|
+
upsert: vi.fn().mockResolvedValue(undefined),
|
|
12
|
+
remove: vi.fn().mockResolvedValue(undefined),
|
|
13
|
+
search: vi.fn().mockResolvedValue([])
|
|
14
|
+
};
|
|
9
15
|
});
|
|
10
16
|
async function createTask(taskCode, status) {
|
|
11
17
|
return await handleTaskCreate({
|
|
@@ -19,6 +25,33 @@ describe("Task Status Transitions", () => {
|
|
|
19
25
|
role: "test-role"
|
|
20
26
|
}, db);
|
|
21
27
|
}
|
|
28
|
+
it("should block transition from backlog to completed", async () => {
|
|
29
|
+
await createTask("TASK-001", "backlog");
|
|
30
|
+
const task = db.getTasksByRepo(REPO)[0];
|
|
31
|
+
await expect(handleTaskUpdate({
|
|
32
|
+
repo: REPO,
|
|
33
|
+
id: task.id,
|
|
34
|
+
status: "completed",
|
|
35
|
+
comment: "finishing",
|
|
36
|
+
est_tokens: 100,
|
|
37
|
+
agent: "test-agent",
|
|
38
|
+
role: "test-role"
|
|
39
|
+
}, db, mockVectors)).rejects.toThrow("Cannot transition directly from 'backlog' to 'completed'. Task must be 'in_progress' first.");
|
|
40
|
+
});
|
|
41
|
+
it("should allow transition from backlog to pending", async () => {
|
|
42
|
+
await createTask("TASK-001", "backlog");
|
|
43
|
+
const task = db.getTasksByRepo(REPO)[0];
|
|
44
|
+
await handleTaskUpdate({
|
|
45
|
+
repo: REPO,
|
|
46
|
+
id: task.id,
|
|
47
|
+
status: "pending",
|
|
48
|
+
comment: "ready for execution",
|
|
49
|
+
agent: "test-agent",
|
|
50
|
+
role: "test-role"
|
|
51
|
+
}, db, mockVectors);
|
|
52
|
+
const updatedTask = db.getTaskById(task.id);
|
|
53
|
+
expect(updatedTask.status).toBe("pending");
|
|
54
|
+
});
|
|
22
55
|
it("should block transition from pending to completed", async () => {
|
|
23
56
|
await createTask("TASK-001", "pending");
|
|
24
57
|
const task = db.getTasksByRepo(REPO)[0];
|
|
@@ -30,7 +63,7 @@ describe("Task Status Transitions", () => {
|
|
|
30
63
|
est_tokens: 100,
|
|
31
64
|
agent: "test-agent",
|
|
32
65
|
role: "test-role"
|
|
33
|
-
}, db)).rejects.toThrow("Cannot transition directly from 'pending' to 'completed'. Task must be 'in_progress' first.");
|
|
66
|
+
}, db, mockVectors)).rejects.toThrow("Cannot transition directly from 'pending' to 'completed'. Task must be 'in_progress' first.");
|
|
34
67
|
});
|
|
35
68
|
it("should allow transition from pending to in_progress", async () => {
|
|
36
69
|
await createTask("TASK-001", "pending");
|
|
@@ -42,13 +75,22 @@ describe("Task Status Transitions", () => {
|
|
|
42
75
|
comment: "starting",
|
|
43
76
|
agent: "test-agent",
|
|
44
77
|
role: "test-role"
|
|
45
|
-
}, db);
|
|
78
|
+
}, db, mockVectors);
|
|
46
79
|
const updatedTask = db.getTaskById(task.id);
|
|
47
80
|
expect(updatedTask.status).toBe("in_progress");
|
|
48
81
|
});
|
|
49
82
|
it("should allow transition from in_progress to completed", async () => {
|
|
50
|
-
await createTask("TASK-001", "
|
|
83
|
+
await createTask("TASK-001", "pending");
|
|
51
84
|
const task = db.getTasksByRepo(REPO)[0];
|
|
85
|
+
// to in_progress first
|
|
86
|
+
await handleTaskUpdate({
|
|
87
|
+
repo: REPO,
|
|
88
|
+
id: task.id,
|
|
89
|
+
status: "in_progress",
|
|
90
|
+
comment: "starting",
|
|
91
|
+
agent: "test-agent",
|
|
92
|
+
role: "test-role"
|
|
93
|
+
}, db, mockVectors);
|
|
52
94
|
await handleTaskUpdate({
|
|
53
95
|
repo: REPO,
|
|
54
96
|
id: task.id,
|
|
@@ -57,13 +99,22 @@ describe("Task Status Transitions", () => {
|
|
|
57
99
|
est_tokens: 100,
|
|
58
100
|
agent: "test-agent",
|
|
59
101
|
role: "test-role"
|
|
60
|
-
}, db);
|
|
102
|
+
}, db, mockVectors);
|
|
61
103
|
const updatedTask = db.getTaskById(task.id);
|
|
62
104
|
expect(updatedTask.status).toBe("completed");
|
|
63
105
|
});
|
|
64
106
|
it("should allow transition to blocked and back", async () => {
|
|
65
|
-
await createTask("TASK-001", "
|
|
107
|
+
await createTask("TASK-001", "pending");
|
|
66
108
|
const task = db.getTasksByRepo(REPO)[0];
|
|
109
|
+
// to in_progress first
|
|
110
|
+
await handleTaskUpdate({
|
|
111
|
+
repo: REPO,
|
|
112
|
+
id: task.id,
|
|
113
|
+
status: "in_progress",
|
|
114
|
+
comment: "starting",
|
|
115
|
+
agent: "test-agent",
|
|
116
|
+
role: "test-role"
|
|
117
|
+
}, db, mockVectors);
|
|
67
118
|
// to blocked
|
|
68
119
|
await handleTaskUpdate({
|
|
69
120
|
repo: REPO,
|
|
@@ -72,7 +123,7 @@ describe("Task Status Transitions", () => {
|
|
|
72
123
|
comment: "waiting for feedback",
|
|
73
124
|
agent: "test-agent",
|
|
74
125
|
role: "test-role"
|
|
75
|
-
}, db);
|
|
126
|
+
}, db, mockVectors);
|
|
76
127
|
expect(db.getTaskById(task.id).status).toBe("blocked");
|
|
77
128
|
// back to in_progress
|
|
78
129
|
await handleTaskUpdate({
|
|
@@ -82,7 +133,7 @@ describe("Task Status Transitions", () => {
|
|
|
82
133
|
comment: "feedback received",
|
|
83
134
|
agent: "test-agent",
|
|
84
135
|
role: "test-role"
|
|
85
|
-
}, db);
|
|
136
|
+
}, db, mockVectors);
|
|
86
137
|
expect(db.getTaskById(task.id).status).toBe("in_progress");
|
|
87
138
|
// to blocked from pending
|
|
88
139
|
await createTask("TASK-002", "pending");
|
|
@@ -94,12 +145,21 @@ describe("Task Status Transitions", () => {
|
|
|
94
145
|
comment: "blocked early",
|
|
95
146
|
agent: "test-agent",
|
|
96
147
|
role: "test-role"
|
|
97
|
-
}, db);
|
|
148
|
+
}, db, mockVectors);
|
|
98
149
|
expect(db.getTaskById(task2.id).status).toBe("blocked");
|
|
99
150
|
});
|
|
100
151
|
it("should block transition from blocked to completed", async () => {
|
|
101
|
-
await createTask("TASK-001", "
|
|
152
|
+
await createTask("TASK-001", "pending");
|
|
102
153
|
const task = db.getTasksByRepo(REPO)[0];
|
|
154
|
+
// to blocked
|
|
155
|
+
await handleTaskUpdate({
|
|
156
|
+
repo: REPO,
|
|
157
|
+
id: task.id,
|
|
158
|
+
status: "blocked",
|
|
159
|
+
comment: "blocked",
|
|
160
|
+
agent: "test-agent",
|
|
161
|
+
role: "test-role"
|
|
162
|
+
}, db, mockVectors);
|
|
103
163
|
await expect(handleTaskUpdate({
|
|
104
164
|
repo: REPO,
|
|
105
165
|
id: task.id,
|
|
@@ -108,7 +168,7 @@ describe("Task Status Transitions", () => {
|
|
|
108
168
|
est_tokens: 100,
|
|
109
169
|
agent: "test-agent",
|
|
110
170
|
role: "test-role"
|
|
111
|
-
}, db)).rejects.toThrow("Cannot transition directly from 'blocked' to 'completed'. Task must be 'in_progress' first.");
|
|
171
|
+
}, db, mockVectors)).rejects.toThrow("Cannot transition directly from 'blocked' to 'completed'. Task must be 'in_progress' first.");
|
|
112
172
|
});
|
|
113
173
|
});
|
|
114
174
|
//# sourceMappingURL=tasks-transition.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-transition.test.js","sourceRoot":"","sources":["../../src/tools/tasks-transition.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"tasks-transition.test.js","sourceRoot":"","sources":["../../src/tools/tasks-transition.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.pending-limit-refined.test.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.pending-limit-refined.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
2
|
+
import { handleTaskCreate, handleTaskUpdate } from "./task.manage.js";
|
|
3
|
+
import { SQLiteStore } from "../storage/sqlite.js";
|
|
4
|
+
describe("Task Pending Limit Refined Validation", () => {
|
|
5
|
+
let db;
|
|
6
|
+
let mockVectors;
|
|
7
|
+
const REPO = "test-repo";
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
db = new SQLiteStore(":memory:");
|
|
10
|
+
mockVectors = {
|
|
11
|
+
upsert: vi.fn().mockResolvedValue(undefined),
|
|
12
|
+
remove: vi.fn().mockResolvedValue(undefined),
|
|
13
|
+
search: vi.fn().mockResolvedValue([])
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
async function createManyPending(count) {
|
|
17
|
+
for (let i = 0; i < count; i++) {
|
|
18
|
+
await handleTaskCreate({
|
|
19
|
+
repo: REPO,
|
|
20
|
+
task_code: `TASK-${i}`,
|
|
21
|
+
phase: "test",
|
|
22
|
+
title: "Test Task",
|
|
23
|
+
description: "Test Description",
|
|
24
|
+
status: "pending",
|
|
25
|
+
agent: "test-agent",
|
|
26
|
+
role: "test-role"
|
|
27
|
+
}, db);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
it("should block creating the 11th pending task", async () => {
|
|
31
|
+
await createManyPending(10);
|
|
32
|
+
await expect(handleTaskCreate({
|
|
33
|
+
repo: REPO,
|
|
34
|
+
task_code: "TASK-11",
|
|
35
|
+
phase: "test",
|
|
36
|
+
title: "11th Task",
|
|
37
|
+
description: "Should fail",
|
|
38
|
+
status: "pending",
|
|
39
|
+
agent: "test-agent",
|
|
40
|
+
role: "test-role"
|
|
41
|
+
}, db)).rejects.toThrow(/Maximum of 10 pending tasks reached/);
|
|
42
|
+
});
|
|
43
|
+
it("should ALLOW moving from backlog to pending even if limit reached", async () => {
|
|
44
|
+
await createManyPending(10);
|
|
45
|
+
// Create one backlog task (allowed)
|
|
46
|
+
await handleTaskCreate({
|
|
47
|
+
repo: REPO,
|
|
48
|
+
task_code: "TASK-BACKLOG",
|
|
49
|
+
phase: "test",
|
|
50
|
+
title: "Backlog Task",
|
|
51
|
+
description: "In backlog",
|
|
52
|
+
status: "backlog",
|
|
53
|
+
agent: "test-agent",
|
|
54
|
+
role: "test-role"
|
|
55
|
+
}, db);
|
|
56
|
+
const task = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-BACKLOG");
|
|
57
|
+
// Move to pending (should be ALLOWED now)
|
|
58
|
+
await handleTaskUpdate({
|
|
59
|
+
repo: REPO,
|
|
60
|
+
id: task.id,
|
|
61
|
+
status: "pending",
|
|
62
|
+
comment: "ready to start",
|
|
63
|
+
agent: "test-agent",
|
|
64
|
+
role: "test-role"
|
|
65
|
+
}, db, mockVectors);
|
|
66
|
+
const updatedTask = db.getTaskById(task.id);
|
|
67
|
+
expect(updatedTask.status).toBe("pending");
|
|
68
|
+
const stats = db.getTaskStats(REPO);
|
|
69
|
+
expect(stats.todo).toBe(11);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=tasks.pending-limit-refined.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.pending-limit-refined.test.js","sourceRoot":"","sources":["../../src/tools/tasks.pending-limit-refined.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type MemoryType = "code_fact" | "decision" | "mistake" | "pattern" | "agent_handoff" | "agent_registered" | "file_claim";
|
|
1
|
+
export type MemoryType = "code_fact" | "decision" | "mistake" | "pattern" | "agent_handoff" | "agent_registered" | "file_claim" | "task_archive";
|
|
2
2
|
export type MemoryScope = {
|
|
3
3
|
repo: string;
|
|
4
4
|
branch?: string;
|
|
@@ -32,10 +32,11 @@ export type VectorResult = {
|
|
|
32
32
|
id: string;
|
|
33
33
|
score: number;
|
|
34
34
|
};
|
|
35
|
-
export type TaskStatus = "pending" | "in_progress" | "completed" | "canceled" | "blocked";
|
|
35
|
+
export type TaskStatus = "backlog" | "pending" | "in_progress" | "completed" | "canceled" | "blocked";
|
|
36
36
|
export type TaskPriority = 1 | 2 | 3 | 4 | 5;
|
|
37
37
|
export interface TaskStats {
|
|
38
38
|
total: number;
|
|
39
|
+
backlog: number;
|
|
39
40
|
todo: number;
|
|
40
41
|
inProgress: number;
|
|
41
42
|
completed: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,kBAAkB,GAAG,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|