@limeadelabs/launchpad-mcp 1.2.0 → 1.2.1
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 +34 -34
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -184,7 +184,7 @@ function registerProjectTools(server2, client2) {
|
|
|
184
184
|
"lp_get_project",
|
|
185
185
|
"Get project details including agent_instructions",
|
|
186
186
|
{
|
|
187
|
-
project_id: z.number().describe("Project ID")
|
|
187
|
+
project_id: z.coerce.number().describe("Project ID")
|
|
188
188
|
},
|
|
189
189
|
async (params) => {
|
|
190
190
|
try {
|
|
@@ -204,11 +204,11 @@ function registerTaskTools(server2, client2) {
|
|
|
204
204
|
"lp_list_tasks",
|
|
205
205
|
"List tasks from LaunchPad with optional filters (project, status, priority, label, assignee)",
|
|
206
206
|
{
|
|
207
|
-
project_id: z2.number().optional().describe("Filter by project ID"),
|
|
207
|
+
project_id: z2.coerce.number().optional().describe("Filter by project ID"),
|
|
208
208
|
status: z2.string().optional().describe("Filter by status: todo, ready, in_progress, review, done"),
|
|
209
209
|
priority: z2.string().optional().describe("Filter by priority: low, medium, high"),
|
|
210
210
|
label: z2.string().optional().describe("Filter by label name"),
|
|
211
|
-
assignee_id: z2.number().optional().describe("Filter by assignee user ID")
|
|
211
|
+
assignee_id: z2.coerce.number().optional().describe("Filter by assignee user ID")
|
|
212
212
|
},
|
|
213
213
|
async (params) => {
|
|
214
214
|
try {
|
|
@@ -223,7 +223,7 @@ function registerTaskTools(server2, client2) {
|
|
|
223
223
|
"lp_get_task",
|
|
224
224
|
"Get full task context \u2014 description, comments, links, specs",
|
|
225
225
|
{
|
|
226
|
-
task_id: z2.number().describe("Task ID")
|
|
226
|
+
task_id: z2.coerce.number().describe("Task ID")
|
|
227
227
|
},
|
|
228
228
|
async (params) => {
|
|
229
229
|
try {
|
|
@@ -238,7 +238,7 @@ function registerTaskTools(server2, client2) {
|
|
|
238
238
|
"lp_create_task",
|
|
239
239
|
"Create a new task in LaunchPad",
|
|
240
240
|
{
|
|
241
|
-
project_id: z2.number().describe("Project ID to create the task in"),
|
|
241
|
+
project_id: z2.coerce.number().describe("Project ID to create the task in"),
|
|
242
242
|
title: z2.string().describe("Task title"),
|
|
243
243
|
description: z2.string().optional().describe("Task description"),
|
|
244
244
|
status: z2.string().optional().describe("Initial status: todo, ready, in_progress, review, done"),
|
|
@@ -257,10 +257,10 @@ function registerTaskTools(server2, client2) {
|
|
|
257
257
|
"lp_update_task",
|
|
258
258
|
"Update task status and/or fields. LaunchPad enforces workflow transitions \u2014 use lp_get_workflow to check valid transitions before changing status.",
|
|
259
259
|
{
|
|
260
|
-
task_id: z2.number().describe("Task ID"),
|
|
260
|
+
task_id: z2.coerce.number().describe("Task ID"),
|
|
261
261
|
status: z2.string().optional().describe("New status (must be a valid workflow transition)"),
|
|
262
262
|
priority: z2.string().optional().describe("New priority: low, medium, high"),
|
|
263
|
-
assignee_id: z2.number().optional().describe("Assignee user ID"),
|
|
263
|
+
assignee_id: z2.coerce.number().optional().describe("Assignee user ID"),
|
|
264
264
|
title: z2.string().optional().describe("New title"),
|
|
265
265
|
description: z2.string().optional().describe("New description")
|
|
266
266
|
},
|
|
@@ -283,7 +283,7 @@ function registerClaimTools(server2, client2) {
|
|
|
283
283
|
"lp_claim_task",
|
|
284
284
|
"Claim a task before working on it. Prevents other agents from picking it up.",
|
|
285
285
|
{
|
|
286
|
-
task_id: z3.number().describe("Task ID to claim")
|
|
286
|
+
task_id: z3.coerce.number().describe("Task ID to claim")
|
|
287
287
|
},
|
|
288
288
|
async (params) => {
|
|
289
289
|
try {
|
|
@@ -298,7 +298,7 @@ function registerClaimTools(server2, client2) {
|
|
|
298
298
|
"lp_release_task",
|
|
299
299
|
"Release a claimed task so others can pick it up",
|
|
300
300
|
{
|
|
301
|
-
task_id: z3.number().describe("Task ID to release")
|
|
301
|
+
task_id: z3.coerce.number().describe("Task ID to release")
|
|
302
302
|
},
|
|
303
303
|
async (params) => {
|
|
304
304
|
try {
|
|
@@ -313,7 +313,7 @@ function registerClaimTools(server2, client2) {
|
|
|
313
313
|
"lp_heartbeat",
|
|
314
314
|
"Send a heartbeat for a claimed task to keep the claim alive. Claims expire after 30 minutes without a heartbeat.",
|
|
315
315
|
{
|
|
316
|
-
task_id: z3.number().describe("Task ID to heartbeat")
|
|
316
|
+
task_id: z3.coerce.number().describe("Task ID to heartbeat")
|
|
317
317
|
},
|
|
318
318
|
async (params) => {
|
|
319
319
|
try {
|
|
@@ -333,7 +333,7 @@ function registerCommentTools(server2, client2) {
|
|
|
333
333
|
"lp_add_comment",
|
|
334
334
|
"Post a comment on a task (progress updates, notes, questions)",
|
|
335
335
|
{
|
|
336
|
-
task_id: z4.number().describe("Task ID to comment on"),
|
|
336
|
+
task_id: z4.coerce.number().describe("Task ID to comment on"),
|
|
337
337
|
body: z4.string().describe("Comment body text")
|
|
338
338
|
},
|
|
339
339
|
async (params) => {
|
|
@@ -354,8 +354,8 @@ function registerTimeTools(server2, client2) {
|
|
|
354
354
|
"lp_log_time",
|
|
355
355
|
"Track time spent on a task",
|
|
356
356
|
{
|
|
357
|
-
task_id: z5.number().describe("Task ID"),
|
|
358
|
-
duration_minutes: z5.number().positive().describe("Duration in minutes"),
|
|
357
|
+
task_id: z5.coerce.number().describe("Task ID"),
|
|
358
|
+
duration_minutes: z5.coerce.number().positive().describe("Duration in minutes"),
|
|
359
359
|
description: z5.string().optional().describe("Description of work done")
|
|
360
360
|
},
|
|
361
361
|
async (params) => {
|
|
@@ -376,7 +376,7 @@ function registerPromptTools(server2, client2) {
|
|
|
376
376
|
"lp_generate_prompt",
|
|
377
377
|
"Generate a build-ready prompt/spec for a task with full context, conventions, and acceptance criteria",
|
|
378
378
|
{
|
|
379
|
-
task_id: z6.number().describe("Task ID")
|
|
379
|
+
task_id: z6.coerce.number().describe("Task ID")
|
|
380
380
|
},
|
|
381
381
|
async (params) => {
|
|
382
382
|
try {
|
|
@@ -396,7 +396,7 @@ function registerPageTools(server2, client2) {
|
|
|
396
396
|
"lp_list_pages",
|
|
397
397
|
"List spec/doc pages for a project",
|
|
398
398
|
{
|
|
399
|
-
project_id: z7.number().describe("Project ID")
|
|
399
|
+
project_id: z7.coerce.number().describe("Project ID")
|
|
400
400
|
},
|
|
401
401
|
async (params) => {
|
|
402
402
|
try {
|
|
@@ -411,8 +411,8 @@ function registerPageTools(server2, client2) {
|
|
|
411
411
|
"lp_get_page",
|
|
412
412
|
"Get a page's full content",
|
|
413
413
|
{
|
|
414
|
-
project_id: z7.number().describe("Project ID"),
|
|
415
|
-
page_id: z7.number().describe("Page ID")
|
|
414
|
+
project_id: z7.coerce.number().describe("Project ID"),
|
|
415
|
+
page_id: z7.coerce.number().describe("Page ID")
|
|
416
416
|
},
|
|
417
417
|
async (params) => {
|
|
418
418
|
try {
|
|
@@ -427,7 +427,7 @@ function registerPageTools(server2, client2) {
|
|
|
427
427
|
"lp_get_workflow",
|
|
428
428
|
"Get valid workflow states and transitions for a project",
|
|
429
429
|
{
|
|
430
|
-
project_id: z7.number().describe("Project ID")
|
|
430
|
+
project_id: z7.coerce.number().describe("Project ID")
|
|
431
431
|
},
|
|
432
432
|
async (params) => {
|
|
433
433
|
try {
|
|
@@ -447,11 +447,11 @@ function registerContextTools(server2, client2) {
|
|
|
447
447
|
"lp_context_list",
|
|
448
448
|
"List available context entries with optional filters",
|
|
449
449
|
{
|
|
450
|
-
project_id: z8.number().optional().describe("Filter by project ID"),
|
|
450
|
+
project_id: z8.coerce.number().optional().describe("Filter by project ID"),
|
|
451
451
|
entry_type: z8.string().optional().describe("Filter by entry type"),
|
|
452
452
|
search: z8.string().optional().describe("Text search on entry name"),
|
|
453
|
-
limit: z8.number().min(1).max(100).optional().describe("Max entries to return (default 50)"),
|
|
454
|
-
offset: z8.number().min(0).optional().describe("Offset for pagination")
|
|
453
|
+
limit: z8.coerce.number().min(1).max(100).optional().describe("Max entries to return (default 50)"),
|
|
454
|
+
offset: z8.coerce.number().min(0).optional().describe("Offset for pagination")
|
|
455
455
|
},
|
|
456
456
|
async (params) => {
|
|
457
457
|
try {
|
|
@@ -467,7 +467,7 @@ function registerContextTools(server2, client2) {
|
|
|
467
467
|
"Fetch a specific context entry by slug or ID",
|
|
468
468
|
{
|
|
469
469
|
slug: z8.string().optional().describe("Entry slug"),
|
|
470
|
-
id: z8.number().optional().describe("Entry ID")
|
|
470
|
+
id: z8.coerce.number().optional().describe("Entry ID")
|
|
471
471
|
},
|
|
472
472
|
async (params) => {
|
|
473
473
|
const identifier = params.slug || (params.id !== void 0 ? String(params.id) : void 0);
|
|
@@ -489,7 +489,7 @@ function registerContextTools(server2, client2) {
|
|
|
489
489
|
"lp_context_package",
|
|
490
490
|
"Get the assembled context package for a task \u2014 task details, context entries, specs, pages, comments",
|
|
491
491
|
{
|
|
492
|
-
task_id: z8.number().describe("Task ID")
|
|
492
|
+
task_id: z8.coerce.number().describe("Task ID")
|
|
493
493
|
},
|
|
494
494
|
async (params) => {
|
|
495
495
|
try {
|
|
@@ -505,7 +505,7 @@ function registerContextTools(server2, client2) {
|
|
|
505
505
|
"Update a context entry's content (requires write access)",
|
|
506
506
|
{
|
|
507
507
|
slug: z8.string().optional().describe("Entry slug"),
|
|
508
|
-
id: z8.number().optional().describe("Entry ID"),
|
|
508
|
+
id: z8.coerce.number().optional().describe("Entry ID"),
|
|
509
509
|
content: z8.string().describe("New markdown content"),
|
|
510
510
|
change_summary: z8.string().describe("What changed and why")
|
|
511
511
|
},
|
|
@@ -563,7 +563,7 @@ function registerSessionTools(server2, client2) {
|
|
|
563
563
|
"lp_session_start",
|
|
564
564
|
"Start a new agent session for a task. Creates session via API and saves session_id to disk for later lookup.",
|
|
565
565
|
{
|
|
566
|
-
task_id: z9.number().describe("LaunchPad task ID"),
|
|
566
|
+
task_id: z9.coerce.number().describe("LaunchPad task ID"),
|
|
567
567
|
agent_type: z9.string().optional().describe("Agent type (default: claude_code)")
|
|
568
568
|
},
|
|
569
569
|
async ({ task_id, agent_type }) => {
|
|
@@ -582,8 +582,8 @@ function registerSessionTools(server2, client2) {
|
|
|
582
582
|
"lp_session_heartbeat",
|
|
583
583
|
"Send a heartbeat for an active session. Provide session_id directly or task_id to look up session from disk. Graceful no-op if neither provided.",
|
|
584
584
|
{
|
|
585
|
-
session_id: z9.number().optional().describe("Session ID"),
|
|
586
|
-
task_id: z9.number().optional().describe("Task ID to look up session from disk")
|
|
585
|
+
session_id: z9.coerce.number().optional().describe("Session ID"),
|
|
586
|
+
task_id: z9.coerce.number().optional().describe("Task ID to look up session from disk")
|
|
587
587
|
},
|
|
588
588
|
async ({ session_id, task_id }) => {
|
|
589
589
|
try {
|
|
@@ -606,7 +606,7 @@ function registerSessionTools(server2, client2) {
|
|
|
606
606
|
"lp_session_progress",
|
|
607
607
|
'Report progress on an active session. Sends an activity update with action "progress".',
|
|
608
608
|
{
|
|
609
|
-
session_id: z9.number().describe("Session ID"),
|
|
609
|
+
session_id: z9.coerce.number().describe("Session ID"),
|
|
610
610
|
detail: z9.string().describe("Description of progress made")
|
|
611
611
|
},
|
|
612
612
|
async ({ session_id, detail }) => {
|
|
@@ -626,7 +626,7 @@ function registerSessionTools(server2, client2) {
|
|
|
626
626
|
"lp_session_event",
|
|
627
627
|
"Log a discrete event for a session (commit, ci_pass, ci_fail, pr_opened, blocker, cost_update).",
|
|
628
628
|
{
|
|
629
|
-
session_id: z9.number().describe("Session ID"),
|
|
629
|
+
session_id: z9.coerce.number().describe("Session ID"),
|
|
630
630
|
event_type: z9.enum(["commit", "ci_pass", "ci_fail", "pr_opened", "blocker", "cost_update"]).describe("Type of event"),
|
|
631
631
|
payload: z9.record(z9.unknown()).describe("Event payload data")
|
|
632
632
|
},
|
|
@@ -645,7 +645,7 @@ function registerSessionTools(server2, client2) {
|
|
|
645
645
|
"lp_session_blocked",
|
|
646
646
|
'Mark a session as blocked. Updates status to "blocked" and logs a blocker event.',
|
|
647
647
|
{
|
|
648
|
-
session_id: z9.number().describe("Session ID"),
|
|
648
|
+
session_id: z9.coerce.number().describe("Session ID"),
|
|
649
649
|
reason: z9.string().describe("Reason the session is blocked")
|
|
650
650
|
},
|
|
651
651
|
async ({ session_id, reason }) => {
|
|
@@ -669,9 +669,9 @@ function registerSessionTools(server2, client2) {
|
|
|
669
669
|
"lp_session_complete",
|
|
670
670
|
"Mark a session as completed with a result summary. Clears session from disk.",
|
|
671
671
|
{
|
|
672
|
-
session_id: z9.number().describe("Session ID"),
|
|
672
|
+
session_id: z9.coerce.number().describe("Session ID"),
|
|
673
673
|
result_summary: z9.string().describe("Summary of what was accomplished"),
|
|
674
|
-
task_id: z9.number().optional().describe("Task ID to clear from disk (if not provided, derived from session)")
|
|
674
|
+
task_id: z9.coerce.number().optional().describe("Task ID to clear from disk (if not provided, derived from session)")
|
|
675
675
|
},
|
|
676
676
|
async ({ session_id, result_summary, task_id }) => {
|
|
677
677
|
try {
|
|
@@ -693,9 +693,9 @@ function registerSessionTools(server2, client2) {
|
|
|
693
693
|
"lp_session_fail",
|
|
694
694
|
"Mark a session as failed with an error detail. Clears session from disk.",
|
|
695
695
|
{
|
|
696
|
-
session_id: z9.number().describe("Session ID"),
|
|
696
|
+
session_id: z9.coerce.number().describe("Session ID"),
|
|
697
697
|
error_detail: z9.string().describe("Description of the failure"),
|
|
698
|
-
task_id: z9.number().optional().describe("Task ID to clear from disk (if not provided, derived from session)")
|
|
698
|
+
task_id: z9.coerce.number().optional().describe("Task ID to clear from disk (if not provided, derived from session)")
|
|
699
699
|
},
|
|
700
700
|
async ({ session_id, error_detail, task_id }) => {
|
|
701
701
|
try {
|