@remixhq/mcp 0.1.2 → 0.1.5

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 CHANGED
@@ -405,6 +405,14 @@ function makeErrorResult(envelope) {
405
405
  // src/contracts/collab.ts
406
406
  var genericRecordSchema = z2.record(z2.string(), z2.unknown());
407
407
  var genericArraySchema = z2.array(genericRecordSchema);
408
+ var mergeRequestQueueSchema = z2.enum([
409
+ "reviewable",
410
+ "created_by_me",
411
+ "app_reviewable",
412
+ "app_outgoing",
413
+ "app_related_visible"
414
+ ]);
415
+ var appScopedMergeRequestQueueSchema = z2.enum(["app_reviewable", "app_outgoing", "app_related_visible"]);
408
416
  var statusInputSchema = {
409
417
  ...commonRequestFieldsSchema,
410
418
  includeRemote: z2.boolean().optional()
@@ -452,10 +460,24 @@ var applyInputSchema = {
452
460
  var requestMergeInputSchema = {
453
461
  ...commonRequestFieldsSchema
454
462
  };
455
- var inboxInputSchema = {
463
+ var reviewQueueInputSchema = {
456
464
  requestId: z2.string().trim().min(1).optional(),
457
465
  outputMode: z2.enum(["summary", "full"]).optional(),
458
- status: z2.string().trim().min(1).optional()
466
+ status: z2.string().trim().min(1).optional(),
467
+ kind: z2.enum(["merge", "sync", "all"]).optional()
468
+ };
469
+ var myMergeRequestsInputSchema = {
470
+ requestId: z2.string().trim().min(1).optional(),
471
+ outputMode: z2.enum(["summary", "full"]).optional(),
472
+ status: z2.string().trim().min(1).optional(),
473
+ kind: z2.enum(["merge", "sync", "all"]).optional()
474
+ };
475
+ var appMergeRequestsInputSchema = {
476
+ ...commonRequestFieldsSchema,
477
+ queue: appScopedMergeRequestQueueSchema,
478
+ appId: z2.string().trim().min(1).optional(),
479
+ status: z2.string().trim().min(1).optional(),
480
+ kind: z2.enum(["merge", "sync", "all"]).optional()
459
481
  };
460
482
  var viewMergeRequestInputSchema = {
461
483
  requestId: z2.string().trim().min(1).optional(),
@@ -512,7 +534,9 @@ var addDataSchema = z2.object({
512
534
  var recordTurnDataSchema = genericRecordSchema;
513
535
  var syncDataSchema = genericRecordSchema;
514
536
  var requestMergeDataSchema = genericRecordSchema;
515
- var inboxDataSchema = z2.object({
537
+ var mergeRequestQueueDataSchema = z2.object({
538
+ queue: mergeRequestQueueSchema,
539
+ appId: z2.string().nullable(),
516
540
  mergeRequests: z2.array(genericRecordSchema)
517
541
  });
518
542
  var viewMergeRequestDataSchema = genericRecordSchema;
@@ -529,7 +553,7 @@ var addSuccessSchema = makeSuccessSchema(addDataSchema);
529
553
  var recordTurnSuccessSchema = makeSuccessSchema(recordTurnDataSchema);
530
554
  var syncSuccessSchema = makeSuccessSchema(syncDataSchema);
531
555
  var requestMergeSuccessSchema = makeSuccessSchema(requestMergeDataSchema);
532
- var inboxSuccessSchema = makeSuccessSchema(inboxDataSchema);
556
+ var mergeRequestQueueSuccessSchema = makeSuccessSchema(mergeRequestQueueDataSchema);
533
557
  var viewMergeRequestSuccessSchema = makeSuccessSchema(viewMergeRequestDataSchema);
534
558
  var approveSuccessSchema = makeSuccessSchema(approveDataSchema);
535
559
  var rejectSuccessSchema = makeSuccessSchema(rejectDataSchema);
@@ -542,7 +566,7 @@ import {
542
566
  collabAdd as coreCollabAdd,
543
567
  collabRecordTurn as coreCollabRecordTurn,
544
568
  collabApprove as coreCollabApprove,
545
- collabInbox as coreCollabInbox,
569
+ collabListMergeRequests as coreCollabListMergeRequests,
546
570
  collabInit as coreCollabInit,
547
571
  collabInvite as coreCollabInvite,
548
572
  collabReconcile as coreCollabReconcile,
@@ -562,13 +586,6 @@ function unwrapResponseObject(resp, label) {
562
586
  }
563
587
  return obj;
564
588
  }
565
- function normalizeMergeRequestsPayload(payload) {
566
- if (Array.isArray(payload)) return payload;
567
- if (!payload || typeof payload !== "object") return [];
568
- return Object.values(payload).flatMap(
569
- (value) => Array.isArray(value) ? value : []
570
- );
571
- }
572
589
  function getRiskLevel(status) {
573
590
  if (status.recommendedAction === "reconcile") return "high";
574
591
  if (status.recommendedAction === "sync" || status.remote.incomingOpenMergeRequestCount) return "medium";
@@ -578,18 +595,18 @@ function getRiskLevel(status) {
578
595
  function getRecommendedNextActions(status) {
579
596
  if (status.repo.branchMismatch) {
580
597
  return [
581
- `Switch to the preferred branch (${status.binding.preferredBranch ?? "configured in the binding"}) before mutating Remix state, or rerun with allowBranchMismatch=true if intentional.`
598
+ `Switch to the preferred branch (${status.binding.preferredBranch ?? "configured in the binding"}) before using Remix mutation tools, or rerun with allowBranchMismatch=true if this deviation is intentional.`
582
599
  ];
583
600
  }
584
601
  switch (status.recommendedAction) {
585
602
  case "init":
586
- return ["Run remix_collab_init to bind the repository to Remix."];
603
+ return ["Run remix_collab_init to bind the repository to Remix before using any Remix collaboration mutation flow."];
587
604
  case "sync":
588
- return ["Run remix_collab_sync_preview, then remix_collab_sync_apply if the preview is acceptable."];
605
+ return ["Run remix_collab_sync_preview, then remix_collab_sync_apply if the preview is acceptable. Use this instead of raw git pull or rebase for bound-repo alignment."];
589
606
  case "reconcile":
590
- return ["Run remix_collab_reconcile_preview before attempting remix_collab_reconcile_apply."];
591
- case "review_inbox":
592
- return ["Run remix_collab_inbox to inspect open merge requests."];
607
+ return ["Run remix_collab_reconcile_preview before attempting remix_collab_reconcile_apply. Reconcile is the explicit Remix recovery path when fast-forward sync is no longer possible."];
608
+ case "review_queue":
609
+ return ["Run remix_collab_review_queue to inspect reviewable merge requests instead of using local git merge flows."];
593
610
  default:
594
611
  return [];
595
612
  }
@@ -647,7 +664,7 @@ async function initCollab(params) {
647
664
  return {
648
665
  data: result,
649
666
  warnings: collectResultWarnings(result),
650
- recommendedNextActions: ["Run remix_collab_status to inspect sync and merge readiness."],
667
+ recommendedNextActions: ["Run remix_collab_status to inspect sync, reconcile, and merge-request readiness before mutating bound-repo state."],
651
668
  logContext: {
652
669
  repoRoot: result.repoRoot,
653
670
  appId: result.appId
@@ -677,7 +694,7 @@ async function remixCollab(params) {
677
694
  return {
678
695
  data: result,
679
696
  warnings: collectResultWarnings(result),
680
- recommendedNextActions: ["Run remix_collab_status inside the remix checkout to inspect its state."],
697
+ recommendedNextActions: ["Run remix_collab_status inside the remix checkout before using Remix mutation tools there."],
681
698
  logContext: {
682
699
  repoRoot: result.repoRoot,
683
700
  appId: result.appId
@@ -762,7 +779,7 @@ async function syncCollab(params) {
762
779
  return {
763
780
  data: result,
764
781
  warnings: collectResultWarnings(result),
765
- recommendedNextActions: params.dryRun ? ["Run remix_collab_sync_apply with confirm=true to apply this fast-forward update."] : [],
782
+ recommendedNextActions: params.dryRun ? ["Run remix_collab_sync_apply with confirm=true to apply this fast-forward update instead of using raw git pull or rebase."] : [],
766
783
  logContext: {
767
784
  repoRoot: result.repoRoot
768
785
  }
@@ -777,25 +794,73 @@ async function requestMerge(params) {
777
794
  return {
778
795
  data: result,
779
796
  warnings: [],
780
- recommendedNextActions: result.id ? [`Run remix_collab_view_merge_request with mrId=${String(result.id)} to inspect the request.`] : [],
797
+ recommendedNextActions: result.id ? [`Run remix_collab_view_merge_request with mrId=${String(result.id)} to inspect the request before deciding whether to approve or reject it.`] : [],
781
798
  logContext: {
782
799
  mrId: typeof result.id === "string" ? result.id : null
783
800
  }
784
801
  };
785
802
  }
786
- async function inbox(params) {
803
+ async function reviewQueue(params) {
787
804
  const api = await createCollabApiClient();
788
- const result = await coreCollabInbox({ api });
789
- const mergeRequests = normalizeMergeRequestsPayload(result.mergeRequests).filter(
790
- (mr) => params.status ? String(mr.status ?? "") === params.status : true
791
- );
805
+ const result = await coreCollabListMergeRequests({
806
+ api,
807
+ queue: "reviewable",
808
+ status: params.status ?? "open",
809
+ kind: params.kind ?? "merge"
810
+ });
811
+ return {
812
+ data: {
813
+ queue: result.queue,
814
+ appId: result.appId,
815
+ mergeRequests: result.mergeRequests
816
+ },
817
+ warnings: [],
818
+ recommendedNextActions: [],
819
+ logContext: {}
820
+ };
821
+ }
822
+ async function myMergeRequests(params) {
823
+ const api = await createCollabApiClient();
824
+ const result = await coreCollabListMergeRequests({
825
+ api,
826
+ queue: "created_by_me",
827
+ status: params.status ?? "open",
828
+ kind: params.kind ?? "merge"
829
+ });
792
830
  return {
793
- data: { mergeRequests },
831
+ data: {
832
+ queue: result.queue,
833
+ appId: result.appId,
834
+ mergeRequests: result.mergeRequests
835
+ },
794
836
  warnings: [],
795
837
  recommendedNextActions: [],
796
838
  logContext: {}
797
839
  };
798
840
  }
841
+ async function listAppMergeRequests(params) {
842
+ const api = await createCollabApiClient();
843
+ const result = await coreCollabListMergeRequests({
844
+ api,
845
+ cwd: params.cwd,
846
+ appId: params.appId,
847
+ queue: params.queue,
848
+ status: params.status ?? "open",
849
+ kind: params.kind ?? "merge"
850
+ });
851
+ return {
852
+ data: {
853
+ queue: result.queue,
854
+ appId: result.appId,
855
+ mergeRequests: result.mergeRequests
856
+ },
857
+ warnings: [],
858
+ recommendedNextActions: [],
859
+ logContext: {
860
+ appId: result.appId
861
+ }
862
+ };
863
+ }
799
864
  async function viewMergeRequest(params) {
800
865
  const api = await createCollabApiClient();
801
866
  const review = await coreCollabView({
@@ -884,7 +949,7 @@ async function reconcile(params) {
884
949
  return {
885
950
  data: result,
886
951
  warnings: collectWarnings(result.warnings),
887
- recommendedNextActions: params.dryRun ? ["Run remix_collab_reconcile_apply with confirm=true only if the preview is acceptable."] : [],
952
+ recommendedNextActions: params.dryRun ? ["Run remix_collab_reconcile_apply with confirm=true only if the preview is acceptable. Do not replace this with raw git history-rewrite commands."] : [],
888
953
  risks: params.dryRun ? ["Reconcile apply rewrites local history and creates a backup branch."] : [],
889
954
  logContext: {
890
955
  repoRoot: result.repoRoot ?? null
@@ -939,7 +1004,7 @@ function buildSuccessEnvelope(tool, requestId, result) {
939
1004
  };
940
1005
  }
941
1006
  function deriveErrorRisks(tool, normalized) {
942
- if (tool === "remix_collab_add" && normalized.message === "Change step succeeded remotely, but automatic local sync failed.") {
1007
+ if ((tool === "remix_collab_add" || tool === "remix_collab_add_change_step") && normalized.message === "Change step succeeded remotely, but automatic local sync failed.") {
943
1008
  return ["The change step succeeded remotely, but the local repository may need manual recovery or a follow-up sync."];
944
1009
  }
945
1010
  if (normalized.code === "DESTRUCTIVE_OPERATION_BLOCKED") {
@@ -1019,7 +1084,7 @@ function registerTool(server, context, params) {
1019
1084
  function registerCollabTools(server, context) {
1020
1085
  registerTool(server, context, {
1021
1086
  name: "remix_collab_status",
1022
- description: "Summarize repository binding, worktree state, merge request counts, and sync or reconcile readiness.",
1087
+ description: "Required first read for a bound repository: summarize binding, worktree state, merge request counts, and sync or reconcile readiness before Remix mutations.",
1023
1088
  access: "read",
1024
1089
  inputSchema: statusInputSchema,
1025
1090
  outputSchema: statusSuccessSchema,
@@ -1078,7 +1143,33 @@ function registerCollabTools(server, context) {
1078
1143
  });
1079
1144
  registerTool(server, context, {
1080
1145
  name: "remix_collab_add",
1081
- description: "Record one collaboration change step for the current bound repository, using the live worktree by default.",
1146
+ description: "Authoritative way to record completed code changes for the current bound repository, using the live worktree diff by default instead of raw git commit or push.",
1147
+ access: "local_write",
1148
+ inputSchema: addInputSchema,
1149
+ outputSchema: addSuccessSchema,
1150
+ run: async (args) => {
1151
+ const input = z3.object(addInputSchema).parse(args);
1152
+ const cwd = resolvePolicyCwd(context.policy, input.cwd);
1153
+ const diffSource = input.diffSource ?? "worktree";
1154
+ if (diffSource === "external") {
1155
+ const externalDiff = input.externalDiff ?? "";
1156
+ assertDiffWithinLimit(context.policy, externalDiff);
1157
+ }
1158
+ return addCollabStep({
1159
+ cwd,
1160
+ prompt: input.prompt,
1161
+ assistantResponse: input.assistantResponse,
1162
+ diffSource,
1163
+ externalDiff: input.externalDiff,
1164
+ allowBranchMismatch: input.allowBranchMismatch ?? false,
1165
+ idempotencyKey: input.idempotencyKey,
1166
+ agent: context.agentMetadata
1167
+ });
1168
+ }
1169
+ });
1170
+ registerTool(server, context, {
1171
+ name: "remix_collab_add_change_step",
1172
+ description: "Alias of remix_collab_add with a more explicit name: record a code-diff change step for the current bound repository.",
1082
1173
  access: "local_write",
1083
1174
  inputSchema: addInputSchema,
1084
1175
  outputSchema: addSuccessSchema,
@@ -1104,7 +1195,26 @@ function registerCollabTools(server, context) {
1104
1195
  });
1105
1196
  registerTool(server, context, {
1106
1197
  name: "remix_collab_record_turn",
1107
- description: "Record one no-diff collaboration turn for the current bound repository after a completed assistant response.",
1198
+ description: "Record one no-diff collaboration turn for the current bound repository after a completed assistant response. This is for prompt/response history only and will fail if the worktree has code changes.",
1199
+ access: "remote_write",
1200
+ inputSchema: recordTurnInputSchema,
1201
+ outputSchema: recordTurnSuccessSchema,
1202
+ run: async (args) => {
1203
+ const input = z3.object(recordTurnInputSchema).parse(args);
1204
+ const cwd = resolvePolicyCwd(context.policy, input.cwd);
1205
+ return recordCollabTurn({
1206
+ cwd,
1207
+ prompt: input.prompt,
1208
+ assistantResponse: input.assistantResponse,
1209
+ allowBranchMismatch: input.allowBranchMismatch ?? false,
1210
+ idempotencyKey: input.idempotencyKey,
1211
+ agent: context.agentMetadata
1212
+ });
1213
+ }
1214
+ });
1215
+ registerTool(server, context, {
1216
+ name: "remix_collab_record_no_diff_turn",
1217
+ description: "Alias of remix_collab_record_turn with a more explicit name: record a prompt/response turn only when the worktree has no code diff.",
1108
1218
  access: "remote_write",
1109
1219
  inputSchema: recordTurnInputSchema,
1110
1220
  outputSchema: recordTurnSuccessSchema,
@@ -1123,7 +1233,7 @@ function registerCollabTools(server, context) {
1123
1233
  });
1124
1234
  registerTool(server, context, {
1125
1235
  name: "remix_collab_sync_preview",
1126
- description: "Preview whether the current bound repository can be fast-forward synced to the Remix app state.",
1236
+ description: "Preview whether the current bound repository can be fast-forward synced to the Remix app state. Use this instead of raw git pull or rebase for bound-repo alignment.",
1127
1237
  access: "read",
1128
1238
  inputSchema: previewInputSchema,
1129
1239
  outputSchema: syncSuccessSchema,
@@ -1135,7 +1245,7 @@ function registerCollabTools(server, context) {
1135
1245
  });
1136
1246
  registerTool(server, context, {
1137
1247
  name: "remix_collab_sync_apply",
1138
- description: "Fast-forward sync the current bound repository to the Remix app state.",
1248
+ description: "Fast-forward sync the current bound repository to the Remix app state. This is the Remix-native replacement for raw git pull or rebase in a bound repo.",
1139
1249
  access: "local_write",
1140
1250
  inputSchema: applyInputSchema,
1141
1251
  outputSchema: syncSuccessSchema,
@@ -1148,7 +1258,7 @@ function registerCollabTools(server, context) {
1148
1258
  });
1149
1259
  registerTool(server, context, {
1150
1260
  name: "remix_collab_request_merge",
1151
- description: "Open a merge request from the current bound repository to its upstream app.",
1261
+ description: "Open a Remix merge request from the current bound repository to its upstream app instead of merging locally with raw git.",
1152
1262
  access: "remote_write",
1153
1263
  inputSchema: requestMergeInputSchema,
1154
1264
  outputSchema: requestMergeSuccessSchema,
@@ -1159,19 +1269,48 @@ function registerCollabTools(server, context) {
1159
1269
  }
1160
1270
  });
1161
1271
  registerTool(server, context, {
1162
- name: "remix_collab_inbox",
1163
- description: "List merge requests available for review.",
1272
+ name: "remix_collab_review_queue",
1273
+ description: "List reviewable merge requests: open requests the current user can actively approve or reject on target apps they administer or maintain. Optional `status` filters the results; optional `kind` defaults to `merge`.",
1164
1274
  access: "read",
1165
- inputSchema: inboxInputSchema,
1166
- outputSchema: inboxSuccessSchema,
1275
+ inputSchema: reviewQueueInputSchema,
1276
+ outputSchema: mergeRequestQueueSuccessSchema,
1167
1277
  run: async (args) => {
1168
- const input = z3.object(inboxInputSchema).parse(args);
1169
- return inbox({ status: input.status });
1278
+ const input = z3.object(reviewQueueInputSchema).parse(args);
1279
+ return reviewQueue({ status: input.status, kind: input.kind });
1280
+ }
1281
+ });
1282
+ registerTool(server, context, {
1283
+ name: "remix_collab_my_merge_requests",
1284
+ description: "List merge requests created by the current user across all apps visible to that user, not just the current bound checkout. This still works even when the user is not a reviewer on the target app. Optional `status` filters the results; optional `kind` defaults to `merge`.",
1285
+ access: "read",
1286
+ inputSchema: myMergeRequestsInputSchema,
1287
+ outputSchema: mergeRequestQueueSuccessSchema,
1288
+ run: async (args) => {
1289
+ const input = z3.object(myMergeRequestsInputSchema).parse(args);
1290
+ return myMergeRequests({ status: input.status, kind: input.kind });
1291
+ }
1292
+ });
1293
+ registerTool(server, context, {
1294
+ name: "remix_collab_list_app_merge_requests",
1295
+ description: "List app-scoped merge requests for the current bound checkout or an explicit `appId`. Required `queue` must be one of: `app_reviewable` (incoming requests this app can review), `app_outgoing` (requests created from this app), or `app_related_visible` (all open visible requests where this app is either source or target). Optional `status` filters the results; optional `kind` defaults to `merge`.",
1296
+ access: "read",
1297
+ inputSchema: appMergeRequestsInputSchema,
1298
+ outputSchema: mergeRequestQueueSuccessSchema,
1299
+ run: async (args) => {
1300
+ const input = z3.object(appMergeRequestsInputSchema).parse(args);
1301
+ const cwd = input.cwd ? resolvePolicyCwd(context.policy, input.cwd) : void 0;
1302
+ return listAppMergeRequests({
1303
+ cwd,
1304
+ appId: input.appId,
1305
+ queue: input.queue,
1306
+ status: input.status,
1307
+ kind: input.kind
1308
+ });
1170
1309
  }
1171
1310
  });
1172
1311
  registerTool(server, context, {
1173
1312
  name: "remix_collab_view_merge_request",
1174
- description: "View merge request metadata, prompts, change steps, and optionally a bounded unified diff.",
1313
+ description: "View Remix merge request metadata, prompts, change steps, and optionally a bounded unified diff before approval or rejection.",
1175
1314
  access: "read",
1176
1315
  inputSchema: viewMergeRequestInputSchema,
1177
1316
  outputSchema: viewMergeRequestSuccessSchema,
@@ -1186,7 +1325,7 @@ function registerCollabTools(server, context) {
1186
1325
  });
1187
1326
  registerTool(server, context, {
1188
1327
  name: "remix_collab_approve_remote",
1189
- description: "Approve a merge request remotely and wait for terminal completion without mutating the local repository.",
1328
+ description: "Approve a merge request remotely and wait for terminal completion without mutating the local repository, preserving Remix as the merge authority.",
1190
1329
  access: "remote_write",
1191
1330
  inputSchema: approveInputSchema,
1192
1331
  outputSchema: approveSuccessSchema,
@@ -1202,7 +1341,7 @@ function registerCollabTools(server, context) {
1202
1341
  });
1203
1342
  registerTool(server, context, {
1204
1343
  name: "remix_collab_approve_and_sync_target",
1205
- description: "Approve a merge request, wait for completion, and sync the target repository locally.",
1344
+ description: "Approve a merge request, wait for completion, and sync the target repository locally through Remix rather than a local git merge flow.",
1206
1345
  access: "local_write",
1207
1346
  inputSchema: approveInputSchema,
1208
1347
  outputSchema: approveSuccessSchema,
@@ -1232,7 +1371,7 @@ function registerCollabTools(server, context) {
1232
1371
  });
1233
1372
  registerTool(server, context, {
1234
1373
  name: "remix_collab_sync_upstream",
1235
- description: "Sync upstream changes into the current remix and update the local checkout.",
1374
+ description: "Sync upstream changes into the current remix and update the local checkout through Remix-native lineage management rather than raw git pull or merge.",
1236
1375
  access: "local_write",
1237
1376
  inputSchema: applyInputSchema,
1238
1377
  outputSchema: syncUpstreamSuccessSchema,
@@ -1245,7 +1384,7 @@ function registerCollabTools(server, context) {
1245
1384
  });
1246
1385
  registerTool(server, context, {
1247
1386
  name: "remix_collab_reconcile_preview",
1248
- description: "Preview reconcile readiness when the local repository cannot be fast-forward synced.",
1387
+ description: "Preview reconcile readiness when the local repository cannot be fast-forward synced. Use this before any explicit Remix history-repair workflow.",
1249
1388
  access: "read",
1250
1389
  inputSchema: previewInputSchema,
1251
1390
  outputSchema: reconcileSuccessSchema,
@@ -1257,7 +1396,7 @@ function registerCollabTools(server, context) {
1257
1396
  });
1258
1397
  registerTool(server, context, {
1259
1398
  name: "remix_collab_reconcile_apply",
1260
- description: "Reconcile divergent local history against the bound Remix app and update the local checkout.",
1399
+ description: "Reconcile divergent local history against the bound Remix app and update the local checkout. This is the explicit Remix recovery path for divergent history.",
1261
1400
  access: "local_write",
1262
1401
  inputSchema: applyInputSchema,
1263
1402
  outputSchema: reconcileSuccessSchema,
@@ -1384,7 +1523,7 @@ function buildSearchNextActions(result) {
1384
1523
  ];
1385
1524
  }
1386
1525
  const actions = [
1387
- "Review the top matched memory items before falling back to raw git history so you keep the reasoning context in view."
1526
+ "Review the top matched memory items before reaching for raw git so the relevant Remix reasoning context stays in view."
1388
1527
  ];
1389
1528
  const changeStepId = getFirstChangeStepId(result.items);
1390
1529
  if (changeStepId) {
@@ -1419,7 +1558,7 @@ function buildTimelineNextActions(result) {
1419
1558
  }
1420
1559
  function buildChangeStepDiffNextActions(changeStepId) {
1421
1560
  return [
1422
- `Inspect the stored diff for \`changeStepId=${changeStepId}\`, then use raw git only if you still need exact repository-level commit or ancestry details.`
1561
+ `Inspect the stored diff for \`changeStepId=${changeStepId}\`, then use raw git only if you still need exact repository-level commit, blame, ancestry, or raw patch details.`
1423
1562
  ];
1424
1563
  }
1425
1564
  function unwrapResponseObject2(resp, label) {
@@ -1613,7 +1752,7 @@ function registerTool2(server, context, params) {
1613
1752
  function registerMemoryTools(server, context) {
1614
1753
  registerTool2(server, context, {
1615
1754
  name: "remix_collab_memory_summary",
1616
- description: "First read for a bound app's current collaboration state, recent reasoning context, and merge or reconcile history before deeper inspection.",
1755
+ description: "First read for a bound app's current collaboration state, recent reasoning context, and merge or reconcile history before deeper inspection or any raw git history lookup.",
1617
1756
  access: "read",
1618
1757
  inputSchema: memorySummaryInputSchema,
1619
1758
  outputSchema: memorySummarySuccessSchema,
@@ -1628,7 +1767,7 @@ function registerMemoryTools(server, context) {
1628
1767
  });
1629
1768
  registerTool2(server, context, {
1630
1769
  name: "remix_collab_memory_search",
1631
- description: "Default tool for why/history/failed-attempt/user-intent questions. Search prompts, diffs, merge activity, reconciles, and other historical context before using raw git history.",
1770
+ description: "Default tool for why/history/failed-attempt/user-intent questions. Search prompts, diffs, merge activity, reconciles, and other historical context before using raw git for exact repository facts.",
1632
1771
  access: "read",
1633
1772
  inputSchema: memorySearchInputSchema,
1634
1773
  outputSchema: memorySearchSuccessSchema,
@@ -1649,7 +1788,7 @@ function registerMemoryTools(server, context) {
1649
1788
  });
1650
1789
  registerTool2(server, context, {
1651
1790
  name: "remix_collab_memory_timeline",
1652
- description: "Chronological view of collaboration memory for understanding what happened and in what order, with optional filters for bounded historical inspection.",
1791
+ description: "Chronological view of collaboration memory for understanding what happened and in what order, with optional filters for bounded historical inspection before any exact-facts raw git follow-up.",
1653
1792
  access: "read",
1654
1793
  inputSchema: memoryTimelineInputSchema,
1655
1794
  outputSchema: memoryTimelineSuccessSchema,
@@ -1669,7 +1808,7 @@ function registerMemoryTools(server, context) {
1669
1808
  });
1670
1809
  registerTool2(server, context, {
1671
1810
  name: "remix_collab_memory_change_step_diff",
1672
- description: "Second-hop expansion tool that fetches the full stored diff for a specific change step after memory search, timeline, or review work has identified the relevant `changeStepId`.",
1811
+ description: "Second-hop expansion tool that fetches the full stored diff for a specific change step after memory search, timeline, or review work has identified the relevant `changeStepId`, keeping historical inspection inside Remix before raw git fallback.",
1673
1812
  access: "read",
1674
1813
  inputSchema: changeStepDiffInputSchema,
1675
1814
  outputSchema: changeStepDiffSuccessSchema,