@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/cli.js +193 -54
- package/dist/cli.js.map +1 -1
- package/dist/index.js +193 -54
- package/dist/index.js.map +1 -1
- package/dist/server.js +193 -54
- package/dist/server.js.map +1 -1
- package/package.json +2 -2
package/dist/server.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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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 "
|
|
592
|
-
return ["Run
|
|
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
|
|
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
|
|
803
|
+
async function reviewQueue(params) {
|
|
787
804
|
const api = await createCollabApiClient();
|
|
788
|
-
const result = await
|
|
789
|
-
|
|
790
|
-
|
|
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: {
|
|
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: "
|
|
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: "
|
|
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: "
|
|
1163
|
-
description: "List merge requests
|
|
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:
|
|
1166
|
-
outputSchema:
|
|
1275
|
+
inputSchema: reviewQueueInputSchema,
|
|
1276
|
+
outputSchema: mergeRequestQueueSuccessSchema,
|
|
1167
1277
|
run: async (args) => {
|
|
1168
|
-
const input = z3.object(
|
|
1169
|
-
return
|
|
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
|
|
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
|
|
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
|
|
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,
|