@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.
Files changed (46) hide show
  1. package/bin/os +99 -0
  2. package/dist/api/index.d.ts +6 -0
  3. package/dist/api/index.d.ts.map +1 -0
  4. package/dist/api/index.js +6 -0
  5. package/dist/api/index.js.map +1 -0
  6. package/dist/api/learnings.d.ts +19 -0
  7. package/dist/api/learnings.d.ts.map +1 -0
  8. package/dist/api/learnings.js +31 -0
  9. package/dist/api/learnings.js.map +1 -0
  10. package/dist/api/tasks.d.ts +69 -0
  11. package/dist/api/tasks.d.ts.map +1 -0
  12. package/dist/api/tasks.js +108 -0
  13. package/dist/api/tasks.js.map +1 -0
  14. package/dist/cli.d.ts +5 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +52 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/executor.d.ts +12 -0
  19. package/dist/executor.d.ts.map +1 -0
  20. package/dist/executor.js +112 -0
  21. package/dist/executor.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +10 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/server.d.ts +13 -0
  27. package/dist/server.d.ts.map +1 -0
  28. package/dist/server.js +193 -0
  29. package/dist/server.js.map +1 -0
  30. package/dist/tests/executor.test.d.ts +2 -0
  31. package/dist/tests/executor.test.d.ts.map +1 -0
  32. package/dist/tests/executor.test.js +169 -0
  33. package/dist/tests/executor.test.js.map +1 -0
  34. package/dist/tests/integration.test.d.ts +2 -0
  35. package/dist/tests/integration.test.d.ts.map +1 -0
  36. package/dist/tests/integration.test.js +378 -0
  37. package/dist/tests/integration.test.js.map +1 -0
  38. package/dist/tests/server.test.d.ts +2 -0
  39. package/dist/tests/server.test.d.ts.map +1 -0
  40. package/dist/tests/server.test.js +53 -0
  41. package/dist/tests/server.test.js.map +1 -0
  42. package/dist/types.d.ts +60 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +42 -0
  45. package/dist/types.js.map +1 -0
  46. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.test.d.ts.map
@@ -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"}
@@ -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
+ }