@schoolai/shipyard-mcp 0.1.3-next.466 → 0.1.3-next.467

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.
@@ -28494,7 +28494,7 @@ init_cjs_shims();
28494
28494
  // ../../packages/schema/dist/index.mjs
28495
28495
  init_cjs_shims();
28496
28496
 
28497
- // ../../packages/schema/dist/yjs-helpers-CFQmkNYl.mjs
28497
+ // ../../packages/schema/dist/yjs-helpers-BBG4tC2R.mjs
28498
28498
  init_cjs_shims();
28499
28499
 
28500
28500
  // ../../packages/schema/dist/plan.mjs
@@ -42665,7 +42665,7 @@ var PRReviewCommentSchema = external_exports.object({
42665
42665
  resolved: external_exports.boolean().optional()
42666
42666
  });
42667
42667
 
42668
- // ../../packages/schema/dist/yjs-helpers-CFQmkNYl.mjs
42668
+ // ../../packages/schema/dist/yjs-helpers-BBG4tC2R.mjs
42669
42669
  function assertNever2(value) {
42670
42670
  throw new Error(`Unhandled discriminated union member: ${JSON.stringify(value)}`);
42671
42671
  }
@@ -863,7 +863,7 @@ function createHandedOffConversationVersion(params) {
863
863
  return ConversationVersionSchema.parse(version);
864
864
  }
865
865
 
866
- // ../../packages/schema/dist/yjs-helpers-CFQmkNYl.mjs
866
+ // ../../packages/schema/dist/yjs-helpers-BBG4tC2R.mjs
867
867
  import { z as z2 } from "zod";
868
868
  import { nanoid as nanoid2 } from "nanoid";
869
869
  import * as Y from "yjs";
@@ -1176,6 +1176,30 @@ function applyStatusTransitionFields(map, transition) {
1176
1176
  assertNever(transition);
1177
1177
  }
1178
1178
  }
1179
+ function resetPlanToDraft(ydoc, actor) {
1180
+ const metadataResult = getPlanMetadataWithValidation(ydoc);
1181
+ if (!metadataResult.success) return {
1182
+ success: false,
1183
+ error: metadataResult.error
1184
+ };
1185
+ if (metadataResult.data.status === "draft") return {
1186
+ success: false,
1187
+ error: "Plan is already in draft status"
1188
+ };
1189
+ ydoc.transact(() => {
1190
+ const map = ydoc.getMap(YDOC_KEYS.METADATA);
1191
+ map.set("status", "draft");
1192
+ map.delete("reviewRequestId");
1193
+ map.delete("reviewedAt");
1194
+ map.delete("reviewedBy");
1195
+ map.delete("reviewComment");
1196
+ map.delete("completedAt");
1197
+ map.delete("completedBy");
1198
+ map.delete("snapshotUrl");
1199
+ map.set("updatedAt", Date.now());
1200
+ }, actor ? { actor } : void 0);
1201
+ return { success: true };
1202
+ }
1179
1203
  function transitionPlanStatus(ydoc, transition, actor) {
1180
1204
  const metadataResult = getPlanMetadataWithValidation(ydoc);
1181
1205
  if (!metadataResult.success) return {
@@ -2816,6 +2840,7 @@ export {
2816
2840
  getPlanMetadata,
2817
2841
  getPlanMetadataWithValidation,
2818
2842
  setPlanMetadata,
2843
+ resetPlanToDraft,
2819
2844
  transitionPlanStatus,
2820
2845
  initPlanMetadata,
2821
2846
  getStepCompletions,
@@ -3,7 +3,7 @@ import {
3
3
  YDOC_KEYS,
4
4
  createInputRequest,
5
5
  logPlanEvent
6
- } from "./chunk-75NZRAN5.js";
6
+ } from "./chunk-76JWRTPI.js";
7
7
  import {
8
8
  logger
9
9
  } from "./chunk-GSGLHRWX.js";
@@ -187,6 +187,7 @@ import {
187
187
  removePlanIndexEntry,
188
188
  removePlanTag,
189
189
  removeViewedByFromIndex,
190
+ resetPlanToDraft,
190
191
  resolvePRReviewComment,
191
192
  revokeUser,
192
193
  setAgentPresence,
@@ -203,7 +204,7 @@ import {
203
204
  updateLinkedPRStatus,
204
205
  updatePlanIndexViewedBy,
205
206
  validateA2AMessages
206
- } from "./chunk-75NZRAN5.js";
207
+ } from "./chunk-76JWRTPI.js";
207
208
  import "./chunk-JSBRDJBE.js";
208
209
  export {
209
210
  A2ADataPartSchema,
@@ -394,6 +395,7 @@ export {
394
395
  removePlanIndexEntry,
395
396
  removePlanTag,
396
397
  removeViewedByFromIndex,
398
+ resetPlanToDraft,
397
399
  resolvePRReviewComment,
398
400
  revokeUser,
399
401
  setAgentPresence,
@@ -19,7 +19,7 @@ import {
19
19
  } from "./chunk-EBNL5ZX7.js";
20
20
  import {
21
21
  InputRequestManager
22
- } from "./chunk-MZTJGBLT.js";
22
+ } from "./chunk-BWP37ADP.js";
23
23
  import {
24
24
  ArtifactSchema,
25
25
  DeliverableSchema,
@@ -63,12 +63,13 @@ import {
63
63
  logPlanEvent,
64
64
  parseClaudeCodeOrigin,
65
65
  parseThreads,
66
+ resetPlanToDraft,
66
67
  setAgentPresence,
67
68
  setPlanIndexEntry,
68
69
  setPlanMetadata,
69
70
  touchPlanIndexEntry,
70
71
  transitionPlanStatus
71
- } from "./chunk-75NZRAN5.js";
72
+ } from "./chunk-76JWRTPI.js";
72
73
  import {
73
74
  loadEnv,
74
75
  logger
@@ -4539,7 +4540,40 @@ async function applyOperation(blocks, operation, editor) {
4539
4540
 
4540
4541
  // src/tools/update-plan.ts
4541
4542
  import { ServerBlockNoteEditor as ServerBlockNoteEditor7 } from "@blocknote/server-util";
4543
+ import { nanoid as nanoid7 } from "nanoid";
4542
4544
  import { z as z11 } from "zod";
4545
+ function buildStatusTransition(targetStatus, actorName) {
4546
+ const now = Date.now();
4547
+ switch (targetStatus) {
4548
+ case "pending_review":
4549
+ return {
4550
+ status: "pending_review",
4551
+ reviewRequestId: nanoid7()
4552
+ };
4553
+ case "changes_requested":
4554
+ return {
4555
+ status: "changes_requested",
4556
+ reviewedAt: now,
4557
+ reviewedBy: actorName
4558
+ };
4559
+ case "in_progress":
4560
+ return {
4561
+ status: "in_progress",
4562
+ reviewedAt: now,
4563
+ reviewedBy: actorName
4564
+ };
4565
+ case "completed":
4566
+ return {
4567
+ status: "completed",
4568
+ completedAt: now,
4569
+ completedBy: actorName
4570
+ };
4571
+ case "draft":
4572
+ return null;
4573
+ default:
4574
+ return null;
4575
+ }
4576
+ }
4543
4577
  var UpdatePlanInput = z11.object({
4544
4578
  planId: z11.string().describe("The plan ID to update"),
4545
4579
  sessionToken: z11.string().describe("Session token from create_plan"),
@@ -4589,6 +4623,7 @@ STATUSES:
4589
4623
  required: ["planId", "sessionToken"]
4590
4624
  }
4591
4625
  },
4626
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: tool handler orchestrates validation, snapshots, and state transitions
4592
4627
  handler: async (args) => {
4593
4628
  const input = UpdatePlanInput.parse(args);
4594
4629
  const doc = await getOrCreateDoc3(input.planId);
@@ -4616,12 +4651,6 @@ STATUSES:
4616
4651
  isError: true
4617
4652
  };
4618
4653
  }
4619
- const updates = {
4620
- updatedAt: Date.now()
4621
- };
4622
- if (input.title) updates.title = input.title;
4623
- if (input.status) updates.status = input.status;
4624
- if (input.tags !== void 0) updates.tags = input.tags;
4625
4654
  const statusChanged = input.status && input.status !== existingMetadata.status;
4626
4655
  if (statusChanged && input.status) {
4627
4656
  const editor = ServerBlockNoteEditor7.create();
@@ -4630,8 +4659,52 @@ STATUSES:
4630
4659
  const reason = `Status changed to ${input.status}`;
4631
4660
  const snapshot = createPlanSnapshot(doc, reason, actorName, input.status, blocks);
4632
4661
  addSnapshot(doc, snapshot);
4662
+ if (input.status === "draft") {
4663
+ const resetResult = resetPlanToDraft(doc, actorName);
4664
+ if (!resetResult.success) {
4665
+ return {
4666
+ content: [
4667
+ {
4668
+ type: "text",
4669
+ text: `Failed to reset plan to draft: ${resetResult.error}`
4670
+ }
4671
+ ],
4672
+ isError: true
4673
+ };
4674
+ }
4675
+ } else {
4676
+ const transition = buildStatusTransition(input.status, actorName);
4677
+ if (!transition) {
4678
+ return {
4679
+ content: [
4680
+ {
4681
+ type: "text",
4682
+ text: `Invalid status: ${input.status}`
4683
+ }
4684
+ ],
4685
+ isError: true
4686
+ };
4687
+ }
4688
+ const transitionResult = transitionPlanStatus(doc, transition, actorName);
4689
+ if (!transitionResult.success) {
4690
+ return {
4691
+ content: [
4692
+ {
4693
+ type: "text",
4694
+ text: `Failed to transition status: ${transitionResult.error}`
4695
+ }
4696
+ ],
4697
+ isError: true
4698
+ };
4699
+ }
4700
+ }
4701
+ }
4702
+ const updates = {};
4703
+ if (input.title) updates.title = input.title;
4704
+ if (input.tags !== void 0) updates.tags = input.tags;
4705
+ if (Object.keys(updates).length > 0) {
4706
+ setPlanMetadata(doc, updates, actorName);
4633
4707
  }
4634
- setPlanMetadata(doc, updates, actorName);
4635
4708
  const indexDoc = await getOrCreateDoc3(PLAN_INDEX_DOC_NAME);
4636
4709
  if (existingMetadata.ownerId) {
4637
4710
  setPlanIndexEntry(indexDoc, {
@@ -5148,7 +5221,7 @@ async function setupReviewNotification(planId, pollIntervalSeconds) {
5148
5221
  return { script, fullResponse: text };
5149
5222
  }
5150
5223
  async function requestUserInput(opts) {
5151
- const { InputRequestManager: InputRequestManager2 } = await import("./input-request-manager-43QSOJS3.js");
5224
+ const { InputRequestManager: InputRequestManager2 } = await import("./input-request-manager-73GSTOIB.js");
5152
5225
  const ydoc = await getOrCreateDoc3(PLAN_INDEX_DOC_NAME);
5153
5226
  const manager = new InputRequestManager2();
5154
5227
  const params = opts.type === "choice" ? {
@@ -5192,12 +5265,12 @@ async function requestUserInput(opts) {
5192
5265
  };
5193
5266
  }
5194
5267
  async function postActivityUpdate(opts) {
5195
- const { logPlanEvent: logPlanEvent2 } = await import("./dist-HIDISXZO.js");
5268
+ const { logPlanEvent: logPlanEvent2 } = await import("./dist-ORKL4P3L.js");
5196
5269
  const { getGitHubUsername: getGitHubUsername2 } = await import("./server-identity-6PHKR2FY.js");
5197
- const { nanoid: nanoid7 } = await import("nanoid");
5270
+ const { nanoid: nanoid8 } = await import("nanoid");
5198
5271
  const doc = await getOrCreateDoc3(opts.planId);
5199
5272
  const actorName = await getGitHubUsername2();
5200
- const requestId = nanoid7();
5273
+ const requestId = nanoid8();
5201
5274
  const eventId = logPlanEvent2(
5202
5275
  doc,
5203
5276
  "agent_activity",
@@ -5215,7 +5288,7 @@ async function postActivityUpdate(opts) {
5215
5288
  return { success: true, eventId, requestId };
5216
5289
  }
5217
5290
  async function resolveActivityRequest(opts) {
5218
- const { logPlanEvent: logPlanEvent2, getPlanEvents } = await import("./dist-HIDISXZO.js");
5291
+ const { logPlanEvent: logPlanEvent2, getPlanEvents } = await import("./dist-ORKL4P3L.js");
5219
5292
  const { getGitHubUsername: getGitHubUsername2 } = await import("./server-identity-6PHKR2FY.js");
5220
5293
  const doc = await getOrCreateDoc3(opts.planId);
5221
5294
  const actorName = await getGitHubUsername2();
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  InputRequestManager
3
- } from "./chunk-MZTJGBLT.js";
4
- import "./chunk-75NZRAN5.js";
3
+ } from "./chunk-BWP37ADP.js";
4
+ import "./chunk-76JWRTPI.js";
5
5
  import "./chunk-GSGLHRWX.js";
6
6
  import "./chunk-JSBRDJBE.js";
7
7
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schoolai/shipyard-mcp",
3
- "version": "0.1.3-next.466",
3
+ "version": "0.1.3-next.467",
4
4
  "description": "Shipyard MCP server and CLI tools for distributed planning with CRDTs",
5
5
  "type": "module",
6
6
  "bin": {