@dmmulroy/overseer 0.1.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/bin/os +99 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +6 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/learnings.d.ts +19 -0
- package/dist/api/learnings.d.ts.map +1 -0
- package/dist/api/learnings.js +31 -0
- package/dist/api/learnings.js.map +1 -0
- package/dist/api/tasks.d.ts +69 -0
- package/dist/api/tasks.d.ts.map +1 -0
- package/dist/api/tasks.js +108 -0
- package/dist/api/tasks.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +52 -0
- package/dist/cli.js.map +1 -0
- package/dist/executor.d.ts +12 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +112 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +193 -0
- package/dist/server.js.map +1 -0
- package/dist/tests/executor.test.d.ts +2 -0
- package/dist/tests/executor.test.d.ts.map +1 -0
- package/dist/tests/executor.test.js +169 -0
- package/dist/tests/executor.test.js.map +1 -0
- package/dist/tests/integration.test.d.ts +2 -0
- package/dist/tests/integration.test.d.ts.map +1 -0
- package/dist/tests/integration.test.js +378 -0
- package/dist/tests/integration.test.js.map +1 -0
- package/dist/tests/server.test.d.ts +2 -0
- package/dist/tests/server.test.d.ts.map +1 -0
- package/dist/tests/server.test.js +53 -0
- package/dist/tests/server.test.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +42 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end integration tests with real Rust CLI
|
|
3
|
+
*
|
|
4
|
+
* These tests require:
|
|
5
|
+
* - Rust CLI built at ../../os/target/debug/os
|
|
6
|
+
* - jj repository initialized in test directory
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, before, after } from "node:test";
|
|
9
|
+
import assert from "node:assert/strict";
|
|
10
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
11
|
+
import { tmpdir } from "node:os";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { spawn } from "node:child_process";
|
|
14
|
+
let testDir;
|
|
15
|
+
let originalDbPath;
|
|
16
|
+
let originalCliPath;
|
|
17
|
+
let originalCliCwd;
|
|
18
|
+
before(async () => {
|
|
19
|
+
// Create temporary directory for test database
|
|
20
|
+
testDir = await mkdtemp(join(tmpdir(), "overseer-test-"));
|
|
21
|
+
const dbPath = join(testDir, "overseer.db");
|
|
22
|
+
// Set DB path, CLI path, and CWD for tests
|
|
23
|
+
originalDbPath = process.env.OVERSEER_DB_PATH;
|
|
24
|
+
originalCliPath = process.env.OVERSEER_CLI_PATH;
|
|
25
|
+
originalCliCwd = process.env.OVERSEER_CLI_CWD;
|
|
26
|
+
process.env.OVERSEER_DB_PATH = dbPath;
|
|
27
|
+
// Point to debug binary (relative to mcp directory)
|
|
28
|
+
process.env.OVERSEER_CLI_PATH = join(process.cwd(), "../overseer/target/debug/os");
|
|
29
|
+
// Run CLI from test directory (where jj repo is)
|
|
30
|
+
process.env.OVERSEER_CLI_CWD = testDir;
|
|
31
|
+
// Initialize jj repo for VCS tests
|
|
32
|
+
await runCommand("jj", ["git", "init", "--colocate", testDir]);
|
|
33
|
+
await runCommand("jj", ["describe", "-m", "initial"], testDir);
|
|
34
|
+
});
|
|
35
|
+
after(async () => {
|
|
36
|
+
// Restore original env vars
|
|
37
|
+
if (originalDbPath === undefined) {
|
|
38
|
+
delete process.env.OVERSEER_DB_PATH;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
process.env.OVERSEER_DB_PATH = originalDbPath;
|
|
42
|
+
}
|
|
43
|
+
if (originalCliPath === undefined) {
|
|
44
|
+
delete process.env.OVERSEER_CLI_PATH;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
process.env.OVERSEER_CLI_PATH = originalCliPath;
|
|
48
|
+
}
|
|
49
|
+
if (originalCliCwd === undefined) {
|
|
50
|
+
delete process.env.OVERSEER_CLI_CWD;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
process.env.OVERSEER_CLI_CWD = originalCliCwd;
|
|
54
|
+
}
|
|
55
|
+
// Clean up test directory
|
|
56
|
+
if (testDir) {
|
|
57
|
+
await rm(testDir, { recursive: true, force: true });
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* Helper to run shell commands
|
|
62
|
+
*/
|
|
63
|
+
function runCommand(cmd, args, cwd) {
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
const proc = spawn(cmd, args, { cwd: cwd || testDir });
|
|
66
|
+
let stdout = "";
|
|
67
|
+
let stderr = "";
|
|
68
|
+
proc.stdout?.on("data", (data) => {
|
|
69
|
+
stdout += data.toString();
|
|
70
|
+
});
|
|
71
|
+
proc.stderr?.on("data", (data) => {
|
|
72
|
+
stderr += data.toString();
|
|
73
|
+
});
|
|
74
|
+
proc.on("close", (code) => {
|
|
75
|
+
if (code === 0) {
|
|
76
|
+
resolve(stdout);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
reject(new Error(`Command failed: ${stderr || stdout}`));
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Helper to execute code via executor directly
|
|
86
|
+
*/
|
|
87
|
+
async function executeCode(code) {
|
|
88
|
+
// Import execute directly to avoid MCP connection requirement
|
|
89
|
+
const { execute } = await import("../executor.js");
|
|
90
|
+
return await execute(code);
|
|
91
|
+
}
|
|
92
|
+
describe("Integration Tests", () => {
|
|
93
|
+
describe("Tasks API", () => {
|
|
94
|
+
it("should create and get task", async () => {
|
|
95
|
+
const result = await executeCode(`
|
|
96
|
+
const task = await tasks.create({
|
|
97
|
+
description: "Test task",
|
|
98
|
+
context: "Test context",
|
|
99
|
+
priority: 1
|
|
100
|
+
});
|
|
101
|
+
return task;
|
|
102
|
+
`);
|
|
103
|
+
assert.ok(result);
|
|
104
|
+
const task = result;
|
|
105
|
+
assert.ok(task.id);
|
|
106
|
+
assert.equal(task.description, "Test task");
|
|
107
|
+
assert.equal(task.priority, 1);
|
|
108
|
+
assert.equal(task.completed, false);
|
|
109
|
+
assert.equal(task.depth, 0);
|
|
110
|
+
});
|
|
111
|
+
it("should list tasks", async () => {
|
|
112
|
+
// Create a task first
|
|
113
|
+
await executeCode(`
|
|
114
|
+
await tasks.create({ description: "List test task" });
|
|
115
|
+
`);
|
|
116
|
+
const result = await executeCode(`
|
|
117
|
+
return await tasks.list();
|
|
118
|
+
`);
|
|
119
|
+
assert.ok(Array.isArray(result));
|
|
120
|
+
assert.ok(result.length > 0);
|
|
121
|
+
});
|
|
122
|
+
it("should create parent-child hierarchy", async () => {
|
|
123
|
+
const result = await executeCode(`
|
|
124
|
+
const parent = await tasks.create({
|
|
125
|
+
description: "Parent task",
|
|
126
|
+
priority: 1
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
const child = await tasks.create({
|
|
130
|
+
description: "Child task",
|
|
131
|
+
parentId: parent.id,
|
|
132
|
+
priority: 2
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
return { parent, child };
|
|
136
|
+
`);
|
|
137
|
+
assert.ok(result);
|
|
138
|
+
const { parent, child } = result;
|
|
139
|
+
assert.equal(parent.depth, 0);
|
|
140
|
+
assert.equal(child.depth, 1);
|
|
141
|
+
assert.equal(child.parentId, parent.id);
|
|
142
|
+
});
|
|
143
|
+
it("should get task with progressive context", async () => {
|
|
144
|
+
const result = await executeCode(`
|
|
145
|
+
const milestone = await tasks.create({
|
|
146
|
+
description: "Build API",
|
|
147
|
+
context: "REST API with auth",
|
|
148
|
+
priority: 1
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
const task = await tasks.create({
|
|
152
|
+
description: "Add login endpoint",
|
|
153
|
+
context: "POST /auth/login",
|
|
154
|
+
parentId: milestone.id,
|
|
155
|
+
priority: 2
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
const fetched = await tasks.get(task.id);
|
|
159
|
+
return fetched.context;
|
|
160
|
+
`);
|
|
161
|
+
assert.ok(result);
|
|
162
|
+
const context = result;
|
|
163
|
+
assert.equal(context.own, "POST /auth/login");
|
|
164
|
+
assert.equal(context.milestone, "REST API with auth");
|
|
165
|
+
});
|
|
166
|
+
it("should complete and reopen task", async () => {
|
|
167
|
+
const result = await executeCode(`
|
|
168
|
+
const task = await tasks.create({
|
|
169
|
+
description: "Completable task"
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
const completed = await tasks.complete(task.id, "Done!");
|
|
173
|
+
const reopened = await tasks.reopen(completed.id);
|
|
174
|
+
|
|
175
|
+
return { completed: completed.completed, reopened: reopened.completed };
|
|
176
|
+
`);
|
|
177
|
+
const statuses = result;
|
|
178
|
+
assert.equal(statuses.completed, true);
|
|
179
|
+
assert.equal(statuses.reopened, false);
|
|
180
|
+
});
|
|
181
|
+
it("should add and remove blockers", async () => {
|
|
182
|
+
const result = await executeCode(`
|
|
183
|
+
const task1 = await tasks.create({ description: "Task 1" });
|
|
184
|
+
const task2 = await tasks.create({ description: "Task 2" });
|
|
185
|
+
|
|
186
|
+
await tasks.block(task1.id, task2.id);
|
|
187
|
+
const blocked = await tasks.get(task1.id);
|
|
188
|
+
|
|
189
|
+
await tasks.unblock(task1.id, task2.id);
|
|
190
|
+
const unblocked = await tasks.get(task1.id);
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
blockedCount: blocked.blockedBy.length,
|
|
194
|
+
unblockedCount: unblocked.blockedBy.length
|
|
195
|
+
};
|
|
196
|
+
`);
|
|
197
|
+
const counts = result;
|
|
198
|
+
assert.equal(counts.blockedCount, 1);
|
|
199
|
+
assert.equal(counts.unblockedCount, 0);
|
|
200
|
+
});
|
|
201
|
+
it("should filter tasks by ready status", async () => {
|
|
202
|
+
const result = await executeCode(`
|
|
203
|
+
// Create blocked task
|
|
204
|
+
const blocker = await tasks.create({ description: "Blocker" });
|
|
205
|
+
const blocked = await tasks.create({
|
|
206
|
+
description: "Blocked",
|
|
207
|
+
blockedBy: [blocker.id]
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// Create ready task
|
|
211
|
+
const ready = await tasks.create({ description: "Ready" });
|
|
212
|
+
|
|
213
|
+
const readyTasks = await tasks.list({ ready: true });
|
|
214
|
+
const blockedTask = readyTasks.find(t => t.id === blocked.id);
|
|
215
|
+
const readyTask = readyTasks.find(t => t.id === ready.id);
|
|
216
|
+
|
|
217
|
+
return {
|
|
218
|
+
hasBlocked: !!blockedTask,
|
|
219
|
+
hasReady: !!readyTask
|
|
220
|
+
};
|
|
221
|
+
`);
|
|
222
|
+
const flags = result;
|
|
223
|
+
assert.equal(flags.hasBlocked, false, "Blocked task should not be ready");
|
|
224
|
+
assert.equal(flags.hasReady, true, "Unblocked task should be ready");
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe("Learnings API", () => {
|
|
228
|
+
it("should add and list learnings", async () => {
|
|
229
|
+
const result = await executeCode(`
|
|
230
|
+
const task = await tasks.create({ description: "Task with learning" });
|
|
231
|
+
|
|
232
|
+
const learning = await learnings.add(
|
|
233
|
+
task.id,
|
|
234
|
+
"Use TypeScript for type safety"
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
const list = await learnings.list(task.id);
|
|
238
|
+
|
|
239
|
+
return { learning, list };
|
|
240
|
+
`);
|
|
241
|
+
assert.ok(result);
|
|
242
|
+
const { learning, list } = result;
|
|
243
|
+
assert.ok(learning.id);
|
|
244
|
+
assert.ok(Array.isArray(list));
|
|
245
|
+
assert.equal(list.length, 1);
|
|
246
|
+
});
|
|
247
|
+
it("should delete learning", async () => {
|
|
248
|
+
const result = await executeCode(`
|
|
249
|
+
const task = await tasks.create({ description: "Task" });
|
|
250
|
+
const learning = await learnings.add(task.id, "Test learning");
|
|
251
|
+
|
|
252
|
+
await learnings.delete(learning.id);
|
|
253
|
+
const list = await learnings.list(task.id);
|
|
254
|
+
|
|
255
|
+
return list.length;
|
|
256
|
+
`);
|
|
257
|
+
assert.equal(result, 0);
|
|
258
|
+
});
|
|
259
|
+
it("should include learnings in task get", async () => {
|
|
260
|
+
const result = await executeCode(`
|
|
261
|
+
const milestone = await tasks.create({
|
|
262
|
+
description: "Milestone"
|
|
263
|
+
});
|
|
264
|
+
await learnings.add(milestone.id, "Milestone learning");
|
|
265
|
+
|
|
266
|
+
const task = await tasks.create({
|
|
267
|
+
description: "Task",
|
|
268
|
+
parentId: milestone.id
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
const fetched = await tasks.get(task.id);
|
|
272
|
+
return fetched.learnings;
|
|
273
|
+
`);
|
|
274
|
+
assert.ok(result);
|
|
275
|
+
const inherited = result;
|
|
276
|
+
assert.ok(inherited.milestone);
|
|
277
|
+
assert.equal(inherited.milestone.length, 1);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
describe("Error Handling", () => {
|
|
281
|
+
it("should handle nonexistent task ID", async () => {
|
|
282
|
+
try {
|
|
283
|
+
await executeCode(`
|
|
284
|
+
return await tasks.get("nonexistent_id");
|
|
285
|
+
`);
|
|
286
|
+
assert.fail("Should have thrown");
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
assert.ok(err instanceof Error);
|
|
290
|
+
// CLI will return error for nonexistent ID
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
it("should handle cycle detection", async () => {
|
|
294
|
+
try {
|
|
295
|
+
await executeCode(`
|
|
296
|
+
const task1 = await tasks.create({ description: "Task 1" });
|
|
297
|
+
const task2 = await tasks.create({
|
|
298
|
+
description: "Task 2",
|
|
299
|
+
parentId: task1.id
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
// Try to make task1 a child of task2 (would create cycle)
|
|
303
|
+
await tasks.update(task1.id, { parentId: task2.id });
|
|
304
|
+
`);
|
|
305
|
+
assert.fail("Should have thrown");
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
assert.ok(err instanceof Error);
|
|
309
|
+
// CLI should reject the cycle
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
it("should handle depth limit", async () => {
|
|
313
|
+
try {
|
|
314
|
+
await executeCode(`
|
|
315
|
+
const task1 = await tasks.create({ description: "L0" });
|
|
316
|
+
const task2 = await tasks.create({ description: "L1", parentId: task1.id });
|
|
317
|
+
const task3 = await tasks.create({ description: "L2", parentId: task2.id });
|
|
318
|
+
|
|
319
|
+
// Try to create L3 (exceeds max depth of 2)
|
|
320
|
+
await tasks.create({ description: "L3", parentId: task3.id });
|
|
321
|
+
`);
|
|
322
|
+
assert.fail("Should have thrown");
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
assert.ok(err instanceof Error);
|
|
326
|
+
// CLI should reject exceeding max depth
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
describe("Complex Workflows", () => {
|
|
331
|
+
it("should handle full task lifecycle", async () => {
|
|
332
|
+
const result = await executeCode(`
|
|
333
|
+
// Create milestone
|
|
334
|
+
const milestone = await tasks.create({
|
|
335
|
+
description: "Build feature X",
|
|
336
|
+
context: "New feature for users",
|
|
337
|
+
priority: 1
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
// Add milestone learning
|
|
341
|
+
await learnings.add(milestone.id, "Follow existing patterns");
|
|
342
|
+
|
|
343
|
+
// Create subtask
|
|
344
|
+
const task = await tasks.create({
|
|
345
|
+
description: "Implement core logic",
|
|
346
|
+
context: "Handle edge cases",
|
|
347
|
+
parentId: milestone.id,
|
|
348
|
+
priority: 2
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
// Get task with inherited context
|
|
352
|
+
const fetched = await tasks.get(task.id);
|
|
353
|
+
|
|
354
|
+
// Start and complete task
|
|
355
|
+
await tasks.start(task.id);
|
|
356
|
+
await tasks.complete(task.id, "Implemented successfully");
|
|
357
|
+
|
|
358
|
+
// Add learning
|
|
359
|
+
await learnings.add(task.id, "Consider performance", task.id);
|
|
360
|
+
|
|
361
|
+
// Get final state
|
|
362
|
+
const final = await tasks.get(task.id);
|
|
363
|
+
|
|
364
|
+
return {
|
|
365
|
+
hasContext: !!final.context.milestone,
|
|
366
|
+
hasLearnings: final.learnings.milestone.length > 0,
|
|
367
|
+
isCompleted: final.completed
|
|
368
|
+
};
|
|
369
|
+
`);
|
|
370
|
+
assert.ok(result);
|
|
371
|
+
const workflow = result;
|
|
372
|
+
assert.equal(workflow.hasContext, true);
|
|
373
|
+
assert.equal(workflow.hasLearnings, true);
|
|
374
|
+
assert.equal(workflow.isCompleted, true);
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/tests/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../../src/tests/server.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for MCP server
|
|
3
|
+
*
|
|
4
|
+
* Note: These tests use execute() directly instead of going through
|
|
5
|
+
* the MCP server request handling to avoid needing a connected transport.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it } from "node:test";
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
import { execute } from "../executor.js";
|
|
10
|
+
describe("MCP Server Execute Tool", () => {
|
|
11
|
+
describe("Basic Execution", () => {
|
|
12
|
+
it("should execute simple return statement", async () => {
|
|
13
|
+
const result = await execute("return 42;");
|
|
14
|
+
assert.equal(result, 42);
|
|
15
|
+
});
|
|
16
|
+
it("should execute async code with await", async () => {
|
|
17
|
+
const result = await execute(`
|
|
18
|
+
const promise = Promise.resolve("hello");
|
|
19
|
+
return await promise;
|
|
20
|
+
`);
|
|
21
|
+
assert.equal(result, "hello");
|
|
22
|
+
});
|
|
23
|
+
it("should return object results", async () => {
|
|
24
|
+
const result = await execute('return { id: "123", name: "test" };');
|
|
25
|
+
// Check properties instead of deep equality due to VM context
|
|
26
|
+
assert.equal(result.id, "123");
|
|
27
|
+
assert.equal(result.name, "test");
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe("Error Handling", () => {
|
|
31
|
+
it("should handle syntax errors in code", async () => {
|
|
32
|
+
try {
|
|
33
|
+
await execute("return {{{;");
|
|
34
|
+
assert.fail("Should have thrown");
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
assert.ok(err instanceof Error);
|
|
38
|
+
assert.ok(err.message.length > 0);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
it("should handle runtime errors", async () => {
|
|
42
|
+
try {
|
|
43
|
+
await execute('throw new Error("test error");');
|
|
44
|
+
assert.fail("Should have thrown");
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
assert.ok(err instanceof Error);
|
|
48
|
+
assert.ok(err.message.includes("test error"));
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=server.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../src/tests/server.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;;;OAG5B,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,qCAAqC,CAA4B,CAAC;YAC/F,8DAA8D;YAC9D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC;gBAChC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,gCAAgC,CAAC,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC;gBAChC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core domain types mirroring the Rust CLI output
|
|
3
|
+
*/
|
|
4
|
+
declare const TaskIdBrand: unique symbol;
|
|
5
|
+
declare const LearningIdBrand: unique symbol;
|
|
6
|
+
export type TaskId = string & {
|
|
7
|
+
readonly [TaskIdBrand]: never;
|
|
8
|
+
};
|
|
9
|
+
export type LearningId = string & {
|
|
10
|
+
readonly [LearningIdBrand]: never;
|
|
11
|
+
};
|
|
12
|
+
export declare function isTaskId(s: string): s is TaskId;
|
|
13
|
+
export declare function isLearningId(s: string): s is LearningId;
|
|
14
|
+
export declare function parseTaskId(s: string): TaskId;
|
|
15
|
+
export declare function parseLearningId(s: string): LearningId;
|
|
16
|
+
export interface Task {
|
|
17
|
+
id: TaskId;
|
|
18
|
+
parentId: TaskId | null;
|
|
19
|
+
description: string;
|
|
20
|
+
context: {
|
|
21
|
+
own: string;
|
|
22
|
+
parent?: string;
|
|
23
|
+
milestone?: string;
|
|
24
|
+
};
|
|
25
|
+
learnings: {
|
|
26
|
+
milestone: Learning[];
|
|
27
|
+
parent: Learning[];
|
|
28
|
+
};
|
|
29
|
+
priority: 1 | 2 | 3 | 4 | 5;
|
|
30
|
+
completed: boolean;
|
|
31
|
+
completedAt: string | null;
|
|
32
|
+
startedAt: string | null;
|
|
33
|
+
createdAt: string;
|
|
34
|
+
updatedAt: string;
|
|
35
|
+
result: string | null;
|
|
36
|
+
commitSha: string | null;
|
|
37
|
+
depth: 0 | 1 | 2;
|
|
38
|
+
blockedBy: TaskId[];
|
|
39
|
+
blocks: TaskId[];
|
|
40
|
+
}
|
|
41
|
+
export interface Learning {
|
|
42
|
+
id: LearningId;
|
|
43
|
+
taskId: TaskId;
|
|
44
|
+
content: string;
|
|
45
|
+
sourceTaskId: TaskId | null;
|
|
46
|
+
createdAt: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* CLI command errors
|
|
50
|
+
*/
|
|
51
|
+
export declare class CliError extends Error {
|
|
52
|
+
exitCode: number;
|
|
53
|
+
stderr: string;
|
|
54
|
+
constructor(message: string, exitCode: number, stderr: string);
|
|
55
|
+
}
|
|
56
|
+
export declare class CliTimeoutError extends Error {
|
|
57
|
+
constructor(message?: string);
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,CAAC,MAAM,WAAW,EAAE,OAAO,MAAM,CAAC;AACzC,OAAO,CAAC,MAAM,eAAe,EAAE,OAAO,MAAM,CAAC;AAE7C,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAGxE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,MAAM,CAE/C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,UAAU,CAEvD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAKrD;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,EAAE;QACT,SAAS,EAAE,QAAQ,EAAE,CAAC;QACtB,MAAM,EAAE,QAAQ,EAAE,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAGxB,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,MAAM;gBAFrB,OAAO,EAAE,MAAM,EACR,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAKxB;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,SAA8B;CAIlD"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core domain types mirroring the Rust CLI output
|
|
3
|
+
*/
|
|
4
|
+
// Validation helpers
|
|
5
|
+
export function isTaskId(s) {
|
|
6
|
+
return s.startsWith("task_") && s.length === 31; // "task_" + 26 ULID chars
|
|
7
|
+
}
|
|
8
|
+
export function isLearningId(s) {
|
|
9
|
+
return s.startsWith("lrn_") && s.length === 30; // "lrn_" + 26 ULID chars
|
|
10
|
+
}
|
|
11
|
+
export function parseTaskId(s) {
|
|
12
|
+
if (!isTaskId(s)) {
|
|
13
|
+
throw new Error(`Invalid TaskId: ${s}`);
|
|
14
|
+
}
|
|
15
|
+
return s;
|
|
16
|
+
}
|
|
17
|
+
export function parseLearningId(s) {
|
|
18
|
+
if (!isLearningId(s)) {
|
|
19
|
+
throw new Error(`Invalid LearningId: ${s}`);
|
|
20
|
+
}
|
|
21
|
+
return s;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* CLI command errors
|
|
25
|
+
*/
|
|
26
|
+
export class CliError extends Error {
|
|
27
|
+
exitCode;
|
|
28
|
+
stderr;
|
|
29
|
+
constructor(message, exitCode, stderr) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.exitCode = exitCode;
|
|
32
|
+
this.stderr = stderr;
|
|
33
|
+
this.name = "CliError";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class CliTimeoutError extends Error {
|
|
37
|
+
constructor(message = "CLI command timeout (30s)") {
|
|
38
|
+
super(message);
|
|
39
|
+
this.name = "CliTimeoutError";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,qBAAqB;AACrB,MAAM,UAAU,QAAQ,CAAC,CAAS;IAChC,OAAO,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,0BAA0B;AAC7E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,yBAAyB;AAC3E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAS;IACvC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAoCD;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGxB;IACA;IAHT,YACE,OAAe,EACR,QAAgB,EAChB,MAAc;QAErB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;QAGrB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAO,GAAG,2BAA2B;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dmmulroy/overseer",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Codemode MCP server for agent task management",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"os": "bin/os"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"bin/",
|
|
12
|
+
"dist/"
|
|
13
|
+
],
|
|
14
|
+
"optionalDependencies": {
|
|
15
|
+
"@dmmulroy/overseer-darwin-arm64": "0.1.0",
|
|
16
|
+
"@dmmulroy/overseer-darwin-x64": "0.1.0",
|
|
17
|
+
"@dmmulroy/overseer-linux-arm64": "0.1.0",
|
|
18
|
+
"@dmmulroy/overseer-linux-x64": "0.1.0",
|
|
19
|
+
"@dmmulroy/overseer-linux-arm64-musl": "0.1.0",
|
|
20
|
+
"@dmmulroy/overseer-linux-x64-musl": "0.1.0"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@modelcontextprotocol/sdk": "^1.0.4"
|
|
24
|
+
},
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=18"
|
|
27
|
+
},
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public",
|
|
30
|
+
"provenance": true
|
|
31
|
+
},
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/dmmulroy/overseer.git"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"mcp",
|
|
38
|
+
"task-management",
|
|
39
|
+
"agent",
|
|
40
|
+
"claude",
|
|
41
|
+
"ai"
|
|
42
|
+
],
|
|
43
|
+
"author": "Dillon Mulroy",
|
|
44
|
+
"license": "MIT"
|
|
45
|
+
}
|