@vibetasks/mcp-server 0.2.1 → 0.2.2
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/index.js +165 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -303,6 +303,171 @@ function setupTools(taskOps) {
|
|
|
303
303
|
};
|
|
304
304
|
}
|
|
305
305
|
},
|
|
306
|
+
// start_vibing
|
|
307
|
+
{
|
|
308
|
+
name: "start_vibing",
|
|
309
|
+
description: 'Start vibing on a task (move to "vibing" status). Max 3 tasks vibing at once - research shows more causes 40% productivity loss.',
|
|
310
|
+
inputSchema: z.object({
|
|
311
|
+
task_id: z.string().describe("Task ID to start vibing on")
|
|
312
|
+
}),
|
|
313
|
+
handler: async (args, taskOps2) => {
|
|
314
|
+
const allTasks = await taskOps2.getTasks("all");
|
|
315
|
+
const vibingTasks = allTasks.filter((t) => t.status === "vibing");
|
|
316
|
+
const WIP_LIMIT = 3;
|
|
317
|
+
if (vibingTasks.length >= WIP_LIMIT) {
|
|
318
|
+
return {
|
|
319
|
+
content: [
|
|
320
|
+
{
|
|
321
|
+
type: "text",
|
|
322
|
+
text: JSON.stringify(
|
|
323
|
+
{
|
|
324
|
+
success: false,
|
|
325
|
+
error: `WIP limit reached! You have ${vibingTasks.length} tasks vibing. Complete one before starting another.`,
|
|
326
|
+
vibing_tasks: vibingTasks.map((t) => ({ id: t.id, title: t.title })),
|
|
327
|
+
wip_limit: WIP_LIMIT
|
|
328
|
+
},
|
|
329
|
+
null,
|
|
330
|
+
2
|
|
331
|
+
)
|
|
332
|
+
}
|
|
333
|
+
]
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
const task = await taskOps2.updateTask(args.task_id, { status: "vibing" });
|
|
337
|
+
return {
|
|
338
|
+
content: [
|
|
339
|
+
{
|
|
340
|
+
type: "text",
|
|
341
|
+
text: JSON.stringify(
|
|
342
|
+
{
|
|
343
|
+
success: true,
|
|
344
|
+
task: {
|
|
345
|
+
id: task.id,
|
|
346
|
+
title: task.title,
|
|
347
|
+
status: "vibing"
|
|
348
|
+
},
|
|
349
|
+
wip_count: vibingTasks.length + 1,
|
|
350
|
+
wip_limit: WIP_LIMIT
|
|
351
|
+
},
|
|
352
|
+
null,
|
|
353
|
+
2
|
|
354
|
+
)
|
|
355
|
+
}
|
|
356
|
+
]
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
// get_vibing_tasks
|
|
361
|
+
{
|
|
362
|
+
name: "get_vibing_tasks",
|
|
363
|
+
description: 'Get all tasks currently in "vibing" status. Use this to check what the user is actively working on.',
|
|
364
|
+
inputSchema: z.object({}),
|
|
365
|
+
handler: async (args, taskOps2) => {
|
|
366
|
+
const allTasks = await taskOps2.getTasks("all");
|
|
367
|
+
const vibingTasks = allTasks.filter((t) => t.status === "vibing");
|
|
368
|
+
const WIP_LIMIT = 3;
|
|
369
|
+
return {
|
|
370
|
+
content: [
|
|
371
|
+
{
|
|
372
|
+
type: "text",
|
|
373
|
+
text: JSON.stringify(
|
|
374
|
+
{
|
|
375
|
+
success: true,
|
|
376
|
+
vibing_tasks: vibingTasks.map((t) => ({
|
|
377
|
+
id: t.id,
|
|
378
|
+
title: t.title,
|
|
379
|
+
context_notes: t.context_notes,
|
|
380
|
+
priority: t.priority,
|
|
381
|
+
due_date: t.due_date
|
|
382
|
+
})),
|
|
383
|
+
count: vibingTasks.length,
|
|
384
|
+
wip_limit: WIP_LIMIT,
|
|
385
|
+
at_limit: vibingTasks.length >= WIP_LIMIT
|
|
386
|
+
},
|
|
387
|
+
null,
|
|
388
|
+
2
|
|
389
|
+
)
|
|
390
|
+
}
|
|
391
|
+
]
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
},
|
|
395
|
+
// set_context_notes
|
|
396
|
+
{
|
|
397
|
+
name: "set_context_notes",
|
|
398
|
+
description: 'Save "where I left off" notes for a task. Use this before pausing work or ending a session to capture context for later.',
|
|
399
|
+
inputSchema: z.object({
|
|
400
|
+
task_id: z.string().describe("Task ID"),
|
|
401
|
+
context_notes: z.string().describe("Where you left off - file, line, next step, blockers")
|
|
402
|
+
}),
|
|
403
|
+
handler: async (args, taskOps2) => {
|
|
404
|
+
const task = await taskOps2.updateTask(args.task_id, {
|
|
405
|
+
context_notes: args.context_notes
|
|
406
|
+
});
|
|
407
|
+
return {
|
|
408
|
+
content: [
|
|
409
|
+
{
|
|
410
|
+
type: "text",
|
|
411
|
+
text: JSON.stringify(
|
|
412
|
+
{
|
|
413
|
+
success: true,
|
|
414
|
+
task: {
|
|
415
|
+
id: task.id,
|
|
416
|
+
title: task.title,
|
|
417
|
+
context_notes: task.context_notes
|
|
418
|
+
},
|
|
419
|
+
message: "Context notes saved. You can resume seamlessly later."
|
|
420
|
+
},
|
|
421
|
+
null,
|
|
422
|
+
2
|
|
423
|
+
)
|
|
424
|
+
}
|
|
425
|
+
]
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
// list_tasks (with status filter)
|
|
430
|
+
{
|
|
431
|
+
name: "list_tasks",
|
|
432
|
+
description: "List tasks filtered by status (todo, vibing, done) or all tasks",
|
|
433
|
+
inputSchema: z.object({
|
|
434
|
+
status: z.enum(["todo", "vibing", "done", "all"]).default("all").describe("Filter by status"),
|
|
435
|
+
limit: z.number().default(50).describe("Maximum results")
|
|
436
|
+
}),
|
|
437
|
+
handler: async (args, taskOps2) => {
|
|
438
|
+
const allTasks = await taskOps2.getTasks("all");
|
|
439
|
+
let tasks = allTasks;
|
|
440
|
+
if (args.status !== "all") {
|
|
441
|
+
tasks = allTasks.filter((t) => t.status === args.status);
|
|
442
|
+
}
|
|
443
|
+
tasks = tasks.slice(0, args.limit);
|
|
444
|
+
return {
|
|
445
|
+
content: [
|
|
446
|
+
{
|
|
447
|
+
type: "text",
|
|
448
|
+
text: JSON.stringify(
|
|
449
|
+
{
|
|
450
|
+
success: true,
|
|
451
|
+
tasks: tasks.map((t) => ({
|
|
452
|
+
id: t.id,
|
|
453
|
+
title: t.title,
|
|
454
|
+
status: t.status,
|
|
455
|
+
priority: t.priority,
|
|
456
|
+
due_date: t.due_date,
|
|
457
|
+
context_notes: t.context_notes,
|
|
458
|
+
tags: t.tags?.map((tag) => tag.name) || []
|
|
459
|
+
})),
|
|
460
|
+
count: tasks.length,
|
|
461
|
+
filter: args.status
|
|
462
|
+
},
|
|
463
|
+
null,
|
|
464
|
+
2
|
|
465
|
+
)
|
|
466
|
+
}
|
|
467
|
+
]
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
},
|
|
306
471
|
// log_ai_session
|
|
307
472
|
{
|
|
308
473
|
name: "log_ai_session",
|
package/package.json
CHANGED