@vailent/pulse-mcp 1.9.0 → 1.10.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 (2) hide show
  1. package/dist/server.js +100 -1
  2. package/package.json +1 -1
package/dist/server.js CHANGED
@@ -39920,7 +39920,9 @@ async function handlePods(params) {
39920
39920
  if (params.name !== void 0) updates.name = params.name.trim();
39921
39921
  if (params.color !== void 0) updates.color = params.color;
39922
39922
  if (params.isActive !== void 0) updates.is_active = params.isActive;
39923
- if (params.slackChannelId !== void 0) updates.slack_channel_id = params.slackChannelId || null;
39923
+ if (params.slackChannelId !== void 0) {
39924
+ updates.slack_channel_ids = params.slackChannelId ? [params.slackChannelId] : [];
39925
+ }
39924
39926
  const { data, error: error2 } = await supabase.from("pods").update(updates).eq("id", podId).select().single();
39925
39927
  if (error2) return err(error2.message);
39926
39928
  return ok(data, `Updated pod: ${data?.name}`);
@@ -47386,6 +47388,87 @@ async function handleSearch(params) {
47386
47388
  );
47387
47389
  }
47388
47390
 
47391
+ // tools/milestones.ts
47392
+ async function handleMilestones(params) {
47393
+ const supabase = getAdminClient();
47394
+ const action = params.action;
47395
+ switch (action) {
47396
+ case "list": {
47397
+ const projectId = params.projectId;
47398
+ const slug = params.slug;
47399
+ let query = supabase.from("milestones").select("*").order("sort_order").order("target_date");
47400
+ if (projectId) {
47401
+ query = query.eq("project_id", projectId);
47402
+ } else if (slug) {
47403
+ const { data: project } = await supabase.from("projects").select("id").eq("slug", slug).single();
47404
+ if (!project) return err("Workstream not found", "NOT_FOUND");
47405
+ query = query.eq("project_id", project.id);
47406
+ } else {
47407
+ return err("projectId or slug is required", "MISSING_PARAM");
47408
+ }
47409
+ const { data, error: error2 } = await query;
47410
+ if (error2) return err(error2.message);
47411
+ return ok(data, `${(data || []).length} milestones`, (data || []).length);
47412
+ }
47413
+ case "create": {
47414
+ const title = params.title;
47415
+ if (!title?.trim()) return err("title is required", "MISSING_PARAM");
47416
+ let projectId = params.projectId;
47417
+ if (!projectId && params.slug) {
47418
+ const { data: project } = await supabase.from("projects").select("id").eq("slug", params.slug).single();
47419
+ if (!project) return err("Workstream not found", "NOT_FOUND");
47420
+ projectId = project.id;
47421
+ }
47422
+ if (!projectId) return err("projectId or slug is required", "MISSING_PARAM");
47423
+ const { data, error: error2 } = await supabase.from("milestones").insert({
47424
+ project_id: projectId,
47425
+ title: title.trim(),
47426
+ description: params.description || null,
47427
+ target_date: params.targetDate || null,
47428
+ status: "pending"
47429
+ }).select().single();
47430
+ if (error2) return err(error2.message);
47431
+ return ok(data, `Created milestone: ${title}`);
47432
+ }
47433
+ case "update": {
47434
+ const milestoneId = params.milestoneId;
47435
+ if (!milestoneId) return err("milestoneId is required", "MISSING_PARAM");
47436
+ const updates = { updated_at: (/* @__PURE__ */ new Date()).toISOString() };
47437
+ if (params.title !== void 0) updates.title = params.title;
47438
+ if (params.description !== void 0) updates.description = params.description;
47439
+ if (params.targetDate !== void 0) updates.target_date = params.targetDate;
47440
+ if (params.status !== void 0) {
47441
+ updates.status = params.status;
47442
+ updates.completed_at = params.status === "completed" ? (/* @__PURE__ */ new Date()).toISOString() : null;
47443
+ }
47444
+ if (params.sortOrder !== void 0) updates.sort_order = params.sortOrder;
47445
+ const { error: error2 } = await supabase.from("milestones").update(updates).eq("id", milestoneId);
47446
+ if (error2) return err(error2.message);
47447
+ return ok({ id: milestoneId }, "Milestone updated");
47448
+ }
47449
+ case "complete": {
47450
+ const milestoneId = params.milestoneId;
47451
+ if (!milestoneId) return err("milestoneId is required", "MISSING_PARAM");
47452
+ const { error: error2 } = await supabase.from("milestones").update({
47453
+ status: "completed",
47454
+ completed_at: (/* @__PURE__ */ new Date()).toISOString(),
47455
+ updated_at: (/* @__PURE__ */ new Date()).toISOString()
47456
+ }).eq("id", milestoneId);
47457
+ if (error2) return err(error2.message);
47458
+ return ok({ id: milestoneId }, "Milestone completed");
47459
+ }
47460
+ case "delete": {
47461
+ const milestoneId = params.milestoneId;
47462
+ if (!milestoneId) return err("milestoneId is required", "MISSING_PARAM");
47463
+ const { error: error2 } = await supabase.from("milestones").delete().eq("id", milestoneId);
47464
+ if (error2) return err(error2.message);
47465
+ return ok({ deleted: milestoneId }, "Milestone deleted");
47466
+ }
47467
+ default:
47468
+ return err(`Unknown action: ${action}`, "INVALID_ACTION");
47469
+ }
47470
+ }
47471
+
47389
47472
  // server.ts
47390
47473
  try {
47391
47474
  await import("./config-V5TD57MJ.js");
@@ -47479,6 +47562,22 @@ server.tool(
47479
47562
  },
47480
47563
  async (params) => handleWorkstreams(params)
47481
47564
  );
47565
+ server.tool(
47566
+ "pulse_milestones",
47567
+ "Manage workstream milestones (key dates/goals). Actions: list (by projectId or slug), create, update, complete, delete.",
47568
+ {
47569
+ action: external_exports.enum(["list", "create", "update", "complete", "delete"]),
47570
+ projectId: external_exports.string().optional().describe("Project UUID"),
47571
+ slug: external_exports.string().optional().describe("Workstream slug (alternative to projectId)"),
47572
+ milestoneId: external_exports.string().optional().describe("Milestone ID (for update/complete/delete)"),
47573
+ title: external_exports.string().optional().describe("Milestone title"),
47574
+ description: external_exports.string().optional().describe("Description"),
47575
+ targetDate: external_exports.string().optional().describe("Target date (YYYY-MM-DD)"),
47576
+ status: external_exports.string().optional().describe("Status: pending, completed"),
47577
+ sortOrder: external_exports.number().optional().describe("Sort order")
47578
+ },
47579
+ async (params) => handleMilestones(params)
47580
+ );
47482
47581
  server.tool(
47483
47582
  "pulse_requests",
47484
47583
  "Manage feature requests and feedback. Actions: list (by pod), create, triage (accept/decline/defer/convert/acknowledge).",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vailent/pulse-mcp",
3
- "version": "1.9.0",
3
+ "version": "1.10.0",
4
4
  "description": "Pulse MCP server — manage pods, features, workstreams, bugs, and more from Claude Code",
5
5
  "type": "module",
6
6
  "bin": {