@rethunk/mcp-multi-root-git 2.3.3 → 2.4.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 (42) hide show
  1. package/AGENTS.md +30 -3
  2. package/CHANGELOG.md +61 -0
  3. package/HUMANS.md +106 -2
  4. package/README.md +15 -1
  5. package/dist/server/batch-commit-tool.js +244 -19
  6. package/dist/server/coverage.js +22 -0
  7. package/dist/server/git-diff-tool.js +132 -0
  8. package/dist/server/git-fetch-tool.js +131 -0
  9. package/dist/server/git-push-tool.js +8 -1
  10. package/dist/server/git-show-tool.js +148 -0
  11. package/dist/server/git-stash-tool.js +131 -0
  12. package/dist/server/git-tag-tool.js +162 -0
  13. package/dist/server/git.js +18 -2
  14. package/dist/server/roots.js +8 -4
  15. package/dist/server/test-harness.js +77 -6
  16. package/dist/server/tool-parameter-schemas.js +94 -0
  17. package/dist/server/tools.js +11 -0
  18. package/docs/install.md +19 -2
  19. package/docs/mcp-tools.md +235 -5
  20. package/package.json +15 -8
  21. package/schemas/batch_commit.json +125 -0
  22. package/schemas/git_cherry_pick.json +63 -0
  23. package/schemas/git_diff.json +62 -0
  24. package/schemas/git_diff_summary.json +75 -0
  25. package/schemas/git_fetch.json +52 -0
  26. package/schemas/git_inventory.json +74 -0
  27. package/schemas/git_log.json +75 -0
  28. package/schemas/git_merge.json +79 -0
  29. package/schemas/git_parity.json +74 -0
  30. package/schemas/git_push.json +50 -0
  31. package/schemas/git_reset_soft.json +42 -0
  32. package/schemas/git_show.json +39 -0
  33. package/schemas/git_stash_apply.json +44 -0
  34. package/schemas/git_stash_list.json +30 -0
  35. package/schemas/git_status.json +49 -0
  36. package/schemas/git_tag.json +50 -0
  37. package/schemas/git_worktree_add.json +52 -0
  38. package/schemas/git_worktree_list.json +30 -0
  39. package/schemas/git_worktree_remove.json +48 -0
  40. package/schemas/index.json +108 -0
  41. package/schemas/list_presets.json +44 -0
  42. package/tool-parameters.schema.json +1125 -0
@@ -0,0 +1,1125 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "@rethunk/mcp-multi-root-git tool parameter schemas",
4
+ "description": "JSON Schema snapshots generated from registered FastMCP tool parameter schemas.",
5
+ "generatedBy": "scripts/generate-tool-parameters-schema.ts",
6
+ "tools": {
7
+ "git_status": {
8
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
9
+ "type": "object",
10
+ "properties": {
11
+ "workspaceRoot": {
12
+ "description": "Highest-priority override.",
13
+ "type": "string"
14
+ },
15
+ "rootIndex": {
16
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
17
+ "type": "integer",
18
+ "minimum": 0,
19
+ "maximum": 9007199254740991
20
+ },
21
+ "allWorkspaceRoots": {
22
+ "default": false,
23
+ "description": "Fan out across all MCP file roots.",
24
+ "type": "boolean"
25
+ },
26
+ "absoluteGitRoots": {
27
+ "description": "Absolute paths to git repo roots. Use for many sibling clones under a non-git parent directory.",
28
+ "maxItems": 256,
29
+ "type": "array",
30
+ "items": {
31
+ "type": "string"
32
+ }
33
+ },
34
+ "format": {
35
+ "default": "markdown",
36
+ "type": "string",
37
+ "enum": [
38
+ "markdown",
39
+ "json"
40
+ ]
41
+ },
42
+ "includeSubmodules": {
43
+ "default": true,
44
+ "type": "boolean"
45
+ }
46
+ },
47
+ "required": [
48
+ "allWorkspaceRoots",
49
+ "format",
50
+ "includeSubmodules"
51
+ ],
52
+ "additionalProperties": false
53
+ },
54
+ "git_inventory": {
55
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
56
+ "type": "object",
57
+ "properties": {
58
+ "workspaceRoot": {
59
+ "description": "Highest-priority override.",
60
+ "type": "string"
61
+ },
62
+ "rootIndex": {
63
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
64
+ "type": "integer",
65
+ "minimum": 0,
66
+ "maximum": 9007199254740991
67
+ },
68
+ "allWorkspaceRoots": {
69
+ "default": false,
70
+ "description": "Fan out across all MCP file roots.",
71
+ "type": "boolean"
72
+ },
73
+ "absoluteGitRoots": {
74
+ "description": "Absolute paths to git repo roots. Use for many sibling clones under a non-git parent directory.",
75
+ "maxItems": 256,
76
+ "type": "array",
77
+ "items": {
78
+ "type": "string"
79
+ }
80
+ },
81
+ "format": {
82
+ "default": "markdown",
83
+ "type": "string",
84
+ "enum": [
85
+ "markdown",
86
+ "json"
87
+ ]
88
+ },
89
+ "nestedRoots": {
90
+ "type": "array",
91
+ "items": {
92
+ "type": "string"
93
+ }
94
+ },
95
+ "preset": {
96
+ "type": "string"
97
+ },
98
+ "presetMerge": {
99
+ "default": false,
100
+ "description": "Merge with preset instead of replacing.",
101
+ "type": "boolean"
102
+ },
103
+ "remote": {
104
+ "description": "Pair with `branch`.",
105
+ "type": "string"
106
+ },
107
+ "branch": {
108
+ "description": "Pair with `remote`.",
109
+ "type": "string"
110
+ },
111
+ "maxRoots": {
112
+ "default": 64,
113
+ "type": "integer",
114
+ "minimum": 1,
115
+ "maximum": 256
116
+ }
117
+ },
118
+ "required": [
119
+ "allWorkspaceRoots",
120
+ "format",
121
+ "presetMerge",
122
+ "maxRoots"
123
+ ],
124
+ "additionalProperties": false
125
+ },
126
+ "git_parity": {
127
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
128
+ "type": "object",
129
+ "properties": {
130
+ "workspaceRoot": {
131
+ "description": "Highest-priority override.",
132
+ "type": "string"
133
+ },
134
+ "rootIndex": {
135
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
136
+ "type": "integer",
137
+ "minimum": 0,
138
+ "maximum": 9007199254740991
139
+ },
140
+ "allWorkspaceRoots": {
141
+ "default": false,
142
+ "description": "Fan out across all MCP file roots.",
143
+ "type": "boolean"
144
+ },
145
+ "absoluteGitRoots": {
146
+ "description": "Absolute paths to git repo roots. Use for many sibling clones under a non-git parent directory.",
147
+ "maxItems": 256,
148
+ "type": "array",
149
+ "items": {
150
+ "type": "string"
151
+ }
152
+ },
153
+ "format": {
154
+ "default": "markdown",
155
+ "type": "string",
156
+ "enum": [
157
+ "markdown",
158
+ "json"
159
+ ]
160
+ },
161
+ "pairs": {
162
+ "type": "array",
163
+ "items": {
164
+ "type": "object",
165
+ "properties": {
166
+ "left": {
167
+ "type": "string"
168
+ },
169
+ "right": {
170
+ "type": "string"
171
+ },
172
+ "label": {
173
+ "type": "string"
174
+ }
175
+ },
176
+ "required": [
177
+ "left",
178
+ "right"
179
+ ],
180
+ "additionalProperties": false
181
+ }
182
+ },
183
+ "preset": {
184
+ "type": "string"
185
+ },
186
+ "presetMerge": {
187
+ "default": false,
188
+ "type": "boolean"
189
+ }
190
+ },
191
+ "required": [
192
+ "allWorkspaceRoots",
193
+ "format",
194
+ "presetMerge"
195
+ ],
196
+ "additionalProperties": false
197
+ },
198
+ "list_presets": {
199
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
200
+ "type": "object",
201
+ "properties": {
202
+ "workspaceRoot": {
203
+ "description": "Highest-priority override.",
204
+ "type": "string"
205
+ },
206
+ "rootIndex": {
207
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
208
+ "type": "integer",
209
+ "minimum": 0,
210
+ "maximum": 9007199254740991
211
+ },
212
+ "allWorkspaceRoots": {
213
+ "default": false,
214
+ "description": "Fan out across all MCP file roots.",
215
+ "type": "boolean"
216
+ },
217
+ "absoluteGitRoots": {
218
+ "description": "Absolute paths to git repo roots. Use for many sibling clones under a non-git parent directory.",
219
+ "maxItems": 256,
220
+ "type": "array",
221
+ "items": {
222
+ "type": "string"
223
+ }
224
+ },
225
+ "format": {
226
+ "default": "markdown",
227
+ "type": "string",
228
+ "enum": [
229
+ "markdown",
230
+ "json"
231
+ ]
232
+ }
233
+ },
234
+ "required": [
235
+ "allWorkspaceRoots",
236
+ "format"
237
+ ],
238
+ "additionalProperties": false
239
+ },
240
+ "git_log": {
241
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
242
+ "type": "object",
243
+ "properties": {
244
+ "workspaceRoot": {
245
+ "description": "Highest-priority override.",
246
+ "type": "string"
247
+ },
248
+ "rootIndex": {
249
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
250
+ "type": "integer",
251
+ "minimum": 0,
252
+ "maximum": 9007199254740991
253
+ },
254
+ "allWorkspaceRoots": {
255
+ "default": false,
256
+ "description": "Fan out across all MCP file roots.",
257
+ "type": "boolean"
258
+ },
259
+ "absoluteGitRoots": {
260
+ "description": "Absolute paths to git repo roots. Use for many sibling clones under a non-git parent directory.",
261
+ "maxItems": 256,
262
+ "type": "array",
263
+ "items": {
264
+ "type": "string"
265
+ }
266
+ },
267
+ "format": {
268
+ "default": "markdown",
269
+ "type": "string",
270
+ "enum": [
271
+ "markdown",
272
+ "json"
273
+ ]
274
+ },
275
+ "since": {
276
+ "description": "Passed to `git log --since=`. Accepts ISO timestamps or git relative forms like `48.hours` or `2.weeks.ago`. Default: `7.days`.",
277
+ "type": "string"
278
+ },
279
+ "paths": {
280
+ "description": "Limit to commits touching these paths (passed as `-- <paths>`).",
281
+ "type": "array",
282
+ "items": {
283
+ "type": "string"
284
+ }
285
+ },
286
+ "grep": {
287
+ "description": "Filter commits whose message matches this regex (git `--grep`, case-insensitive).",
288
+ "type": "string"
289
+ },
290
+ "author": {
291
+ "description": "Filter by author name or email (passed as `--author=`).",
292
+ "type": "string"
293
+ },
294
+ "maxCommits": {
295
+ "default": 50,
296
+ "description": "Maximum commits to return per root (hard cap 500). Default 50.",
297
+ "type": "integer",
298
+ "minimum": 1,
299
+ "maximum": 500
300
+ },
301
+ "branch": {
302
+ "description": "Ref/branch to log from. Default: HEAD.",
303
+ "type": "string"
304
+ }
305
+ },
306
+ "required": [
307
+ "allWorkspaceRoots",
308
+ "format",
309
+ "maxCommits"
310
+ ],
311
+ "additionalProperties": false
312
+ },
313
+ "git_diff_summary": {
314
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
315
+ "type": "object",
316
+ "properties": {
317
+ "workspaceRoot": {
318
+ "description": "Highest-priority override.",
319
+ "type": "string"
320
+ },
321
+ "rootIndex": {
322
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
323
+ "type": "integer",
324
+ "minimum": 0,
325
+ "maximum": 9007199254740991
326
+ },
327
+ "allWorkspaceRoots": {
328
+ "default": false,
329
+ "description": "Fan out across all MCP file roots.",
330
+ "type": "boolean"
331
+ },
332
+ "absoluteGitRoots": {
333
+ "description": "Absolute paths to git repo roots. Use for many sibling clones under a non-git parent directory.",
334
+ "maxItems": 256,
335
+ "type": "array",
336
+ "items": {
337
+ "type": "string"
338
+ }
339
+ },
340
+ "format": {
341
+ "default": "markdown",
342
+ "type": "string",
343
+ "enum": [
344
+ "markdown",
345
+ "json"
346
+ ]
347
+ },
348
+ "range": {
349
+ "description": "Diff range. Examples: \"staged\", \"HEAD~3..HEAD\", \"main...feature\". Default: unstaged changes.",
350
+ "type": "string"
351
+ },
352
+ "fileFilter": {
353
+ "description": "Glob pattern to restrict output to matching files, e.g. \"*.ts\", \"src/**\".",
354
+ "type": "string"
355
+ },
356
+ "maxLinesPerFile": {
357
+ "default": 50,
358
+ "description": "Max diff lines to include per file. Default: 50.",
359
+ "type": "integer",
360
+ "minimum": 1,
361
+ "maximum": 2000
362
+ },
363
+ "maxFiles": {
364
+ "default": 30,
365
+ "description": "Max files to include in output. Default: 30.",
366
+ "type": "integer",
367
+ "minimum": 1,
368
+ "maximum": 500
369
+ },
370
+ "excludePatterns": {
371
+ "description": "Glob patterns to exclude. Defaults to common noise: lock files, dist, vendor, etc.",
372
+ "type": "array",
373
+ "items": {
374
+ "type": "string"
375
+ }
376
+ }
377
+ },
378
+ "required": [
379
+ "allWorkspaceRoots",
380
+ "format",
381
+ "maxLinesPerFile",
382
+ "maxFiles"
383
+ ],
384
+ "additionalProperties": false
385
+ },
386
+ "git_diff": {
387
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
388
+ "type": "object",
389
+ "properties": {
390
+ "workspaceRoot": {
391
+ "description": "Highest-priority override.",
392
+ "type": "string"
393
+ },
394
+ "rootIndex": {
395
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
396
+ "type": "integer",
397
+ "minimum": 0,
398
+ "maximum": 9007199254740991
399
+ },
400
+ "allWorkspaceRoots": {
401
+ "default": false,
402
+ "description": "Fan out across all MCP file roots.",
403
+ "type": "boolean"
404
+ },
405
+ "absoluteGitRoots": {
406
+ "description": "Absolute paths to git repo roots. Use for many sibling clones under a non-git parent directory.",
407
+ "maxItems": 256,
408
+ "type": "array",
409
+ "items": {
410
+ "type": "string"
411
+ }
412
+ },
413
+ "format": {
414
+ "default": "markdown",
415
+ "type": "string",
416
+ "enum": [
417
+ "markdown",
418
+ "json"
419
+ ]
420
+ },
421
+ "base": {
422
+ "description": "Base ref (e.g. \"main\", \"HEAD~3\"). Required for range diffs. If omitted and `staged: false`, shows unstaged changes.",
423
+ "type": "string"
424
+ },
425
+ "head": {
426
+ "description": "Head ref (e.g. \"feature-branch\"). If omitted, defaults to HEAD. Only used if `base` is provided.",
427
+ "type": "string"
428
+ },
429
+ "path": {
430
+ "description": "Scope diff to a single file path (e.g. \"src/main.ts\").",
431
+ "type": "string"
432
+ },
433
+ "staged": {
434
+ "default": false,
435
+ "description": "If true, show staged changes (git diff --staged). Ignored if `base` is provided.",
436
+ "type": "boolean"
437
+ }
438
+ },
439
+ "required": [
440
+ "allWorkspaceRoots",
441
+ "format",
442
+ "staged"
443
+ ],
444
+ "additionalProperties": false
445
+ },
446
+ "git_show": {
447
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
448
+ "type": "object",
449
+ "properties": {
450
+ "workspaceRoot": {
451
+ "description": "Highest-priority override.",
452
+ "type": "string"
453
+ },
454
+ "rootIndex": {
455
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
456
+ "type": "integer",
457
+ "minimum": 0,
458
+ "maximum": 9007199254740991
459
+ },
460
+ "format": {
461
+ "default": "markdown",
462
+ "type": "string",
463
+ "enum": [
464
+ "markdown",
465
+ "json"
466
+ ]
467
+ },
468
+ "ref": {
469
+ "type": "string",
470
+ "description": "Commit reference (SHA, branch, tag, or any git rev-spec)."
471
+ },
472
+ "path": {
473
+ "description": "Optional file path to inspect at the ref. If provided, shows that path's content at the ref instead of the diff.",
474
+ "type": "string"
475
+ }
476
+ },
477
+ "required": [
478
+ "format",
479
+ "ref"
480
+ ],
481
+ "additionalProperties": false
482
+ },
483
+ "git_worktree_list": {
484
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
485
+ "type": "object",
486
+ "properties": {
487
+ "workspaceRoot": {
488
+ "description": "Highest-priority override.",
489
+ "type": "string"
490
+ },
491
+ "rootIndex": {
492
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
493
+ "type": "integer",
494
+ "minimum": 0,
495
+ "maximum": 9007199254740991
496
+ },
497
+ "format": {
498
+ "default": "markdown",
499
+ "type": "string",
500
+ "enum": [
501
+ "markdown",
502
+ "json"
503
+ ]
504
+ }
505
+ },
506
+ "required": [
507
+ "format"
508
+ ],
509
+ "additionalProperties": false
510
+ },
511
+ "git_stash_list": {
512
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
513
+ "type": "object",
514
+ "properties": {
515
+ "workspaceRoot": {
516
+ "description": "Highest-priority override.",
517
+ "type": "string"
518
+ },
519
+ "rootIndex": {
520
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
521
+ "type": "integer",
522
+ "minimum": 0,
523
+ "maximum": 9007199254740991
524
+ },
525
+ "format": {
526
+ "default": "markdown",
527
+ "type": "string",
528
+ "enum": [
529
+ "markdown",
530
+ "json"
531
+ ]
532
+ }
533
+ },
534
+ "required": [
535
+ "format"
536
+ ],
537
+ "additionalProperties": false
538
+ },
539
+ "git_fetch": {
540
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
541
+ "type": "object",
542
+ "properties": {
543
+ "workspaceRoot": {
544
+ "description": "Highest-priority override.",
545
+ "type": "string"
546
+ },
547
+ "rootIndex": {
548
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
549
+ "type": "integer",
550
+ "minimum": 0,
551
+ "maximum": 9007199254740991
552
+ },
553
+ "format": {
554
+ "default": "markdown",
555
+ "type": "string",
556
+ "enum": [
557
+ "markdown",
558
+ "json"
559
+ ]
560
+ },
561
+ "remote": {
562
+ "default": "origin",
563
+ "description": "Remote to fetch from (default: origin).",
564
+ "type": "string"
565
+ },
566
+ "branch": {
567
+ "description": "If specified: fetch only this branch (e.g. 'main').",
568
+ "type": "string"
569
+ },
570
+ "prune": {
571
+ "default": false,
572
+ "description": "Pass --prune to remove deleted remote branches (default: false).",
573
+ "type": "boolean"
574
+ },
575
+ "tags": {
576
+ "default": false,
577
+ "description": "Pass --tags to also fetch all tags (default: false).",
578
+ "type": "boolean"
579
+ }
580
+ },
581
+ "required": [
582
+ "format",
583
+ "remote",
584
+ "prune",
585
+ "tags"
586
+ ],
587
+ "additionalProperties": false
588
+ },
589
+ "batch_commit": {
590
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
591
+ "type": "object",
592
+ "properties": {
593
+ "workspaceRoot": {
594
+ "description": "Highest-priority override.",
595
+ "type": "string"
596
+ },
597
+ "rootIndex": {
598
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
599
+ "type": "integer",
600
+ "minimum": 0,
601
+ "maximum": 9007199254740991
602
+ },
603
+ "allWorkspaceRoots": {
604
+ "default": false,
605
+ "description": "Fan out across all MCP file roots.",
606
+ "type": "boolean"
607
+ },
608
+ "format": {
609
+ "default": "markdown",
610
+ "type": "string",
611
+ "enum": [
612
+ "markdown",
613
+ "json"
614
+ ]
615
+ },
616
+ "commits": {
617
+ "minItems": 1,
618
+ "maxItems": 50,
619
+ "type": "array",
620
+ "items": {
621
+ "type": "object",
622
+ "properties": {
623
+ "message": {
624
+ "type": "string",
625
+ "minLength": 1,
626
+ "description": "Commit message."
627
+ },
628
+ "files": {
629
+ "minItems": 1,
630
+ "type": "array",
631
+ "items": {
632
+ "anyOf": [
633
+ {
634
+ "type": "string",
635
+ "minLength": 1
636
+ },
637
+ {
638
+ "type": "object",
639
+ "properties": {
640
+ "path": {
641
+ "type": "string",
642
+ "minLength": 1,
643
+ "description": "File path relative to git root."
644
+ },
645
+ "lines": {
646
+ "type": "object",
647
+ "properties": {
648
+ "from": {
649
+ "type": "integer",
650
+ "minimum": 1,
651
+ "maximum": 9007199254740991,
652
+ "description": "Start line number (1-indexed)."
653
+ },
654
+ "to": {
655
+ "type": "integer",
656
+ "minimum": 1,
657
+ "maximum": 9007199254740991,
658
+ "description": "End line number (1-indexed, inclusive)."
659
+ }
660
+ },
661
+ "required": [
662
+ "from",
663
+ "to"
664
+ ],
665
+ "additionalProperties": false,
666
+ "description": "Line range to stage. Only hunks overlapping [from, to] are staged."
667
+ }
668
+ },
669
+ "required": [
670
+ "path",
671
+ "lines"
672
+ ],
673
+ "additionalProperties": false
674
+ }
675
+ ]
676
+ },
677
+ "description": "Paths to stage, relative to the git root. Each can be a string path or { path, lines } for hunk-level staging."
678
+ }
679
+ },
680
+ "required": [
681
+ "message",
682
+ "files"
683
+ ],
684
+ "additionalProperties": false
685
+ },
686
+ "description": "Commits to create, applied in order."
687
+ },
688
+ "push": {
689
+ "default": "never",
690
+ "description": "`never` (default): no push. `after`: push the current branch to its upstream once all commits succeed; fails with `push_no_upstream` if the branch has no upstream (commits are NOT rolled back). Enum reserved for future modes such as `force-with-lease`.",
691
+ "type": "string",
692
+ "enum": [
693
+ "never",
694
+ "after"
695
+ ]
696
+ },
697
+ "dryRun": {
698
+ "default": false,
699
+ "description": "When true, stage files, collect preview (files staged, commit messages), return preview response without writing commits. Unstages any files that were staged for the preview. Response indicates DRY RUN mode.",
700
+ "type": "boolean"
701
+ }
702
+ },
703
+ "required": [
704
+ "allWorkspaceRoots",
705
+ "format",
706
+ "commits",
707
+ "push",
708
+ "dryRun"
709
+ ],
710
+ "additionalProperties": false
711
+ },
712
+ "git_push": {
713
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
714
+ "type": "object",
715
+ "properties": {
716
+ "workspaceRoot": {
717
+ "description": "Highest-priority override.",
718
+ "type": "string"
719
+ },
720
+ "rootIndex": {
721
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
722
+ "type": "integer",
723
+ "minimum": 0,
724
+ "maximum": 9007199254740991
725
+ },
726
+ "allWorkspaceRoots": {
727
+ "default": false,
728
+ "description": "Fan out across all MCP file roots.",
729
+ "type": "boolean"
730
+ },
731
+ "format": {
732
+ "default": "markdown",
733
+ "type": "string",
734
+ "enum": [
735
+ "markdown",
736
+ "json"
737
+ ]
738
+ },
739
+ "remote": {
740
+ "description": "Remote to push to. Defaults to the remote inferred from the current upstream tracking ref, or `origin` when `setUpstream` is true.",
741
+ "type": "string"
742
+ },
743
+ "branch": {
744
+ "description": "Branch to push. Defaults to the currently checked-out branch. Rejected when HEAD is detached.",
745
+ "type": "string"
746
+ },
747
+ "setUpstream": {
748
+ "default": false,
749
+ "description": "Set the upstream tracking reference (`git push -u`). Use when the branch has not been pushed yet. Remote defaults to `origin`.",
750
+ "type": "boolean"
751
+ }
752
+ },
753
+ "required": [
754
+ "allWorkspaceRoots",
755
+ "format",
756
+ "setUpstream"
757
+ ],
758
+ "additionalProperties": false
759
+ },
760
+ "git_merge": {
761
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
762
+ "type": "object",
763
+ "properties": {
764
+ "workspaceRoot": {
765
+ "description": "Highest-priority override.",
766
+ "type": "string"
767
+ },
768
+ "rootIndex": {
769
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
770
+ "type": "integer",
771
+ "minimum": 0,
772
+ "maximum": 9007199254740991
773
+ },
774
+ "allWorkspaceRoots": {
775
+ "default": false,
776
+ "description": "Fan out across all MCP file roots.",
777
+ "type": "boolean"
778
+ },
779
+ "format": {
780
+ "default": "markdown",
781
+ "type": "string",
782
+ "enum": [
783
+ "markdown",
784
+ "json"
785
+ ]
786
+ },
787
+ "sources": {
788
+ "minItems": 1,
789
+ "maxItems": 20,
790
+ "type": "array",
791
+ "items": {
792
+ "type": "string",
793
+ "minLength": 1
794
+ },
795
+ "description": "Branches to merge into the destination, in order."
796
+ },
797
+ "into": {
798
+ "description": "Destination branch. Defaults to the currently checked-out branch.",
799
+ "type": "string"
800
+ },
801
+ "strategy": {
802
+ "default": "auto",
803
+ "description": "`auto` (default): cascade fast-forward → rebase → merge-commit per source. `ff-only`: only fast-forward, fail if diverged. `rebase`: rebase source onto destination, then fast-forward (no merge-commit fallback). `merge`: always create a merge commit (no fast-forward).",
804
+ "type": "string",
805
+ "enum": [
806
+ "auto",
807
+ "ff-only",
808
+ "rebase",
809
+ "merge"
810
+ ]
811
+ },
812
+ "message": {
813
+ "description": "Merge commit message (used only when a merge commit is created).",
814
+ "type": "string"
815
+ },
816
+ "deleteMergedBranches": {
817
+ "default": false,
818
+ "description": "After all sources merge cleanly, delete each source branch locally (`git branch -d`). Protected names always skipped. Never affects remote branches.",
819
+ "type": "boolean"
820
+ },
821
+ "deleteMergedWorktrees": {
822
+ "default": false,
823
+ "description": "After all sources merge cleanly, remove any local worktree currently checked out on a source branch (`git worktree remove`). Protected tails always skipped.",
824
+ "type": "boolean"
825
+ }
826
+ },
827
+ "required": [
828
+ "allWorkspaceRoots",
829
+ "format",
830
+ "sources",
831
+ "strategy",
832
+ "deleteMergedBranches",
833
+ "deleteMergedWorktrees"
834
+ ],
835
+ "additionalProperties": false
836
+ },
837
+ "git_cherry_pick": {
838
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
839
+ "type": "object",
840
+ "properties": {
841
+ "workspaceRoot": {
842
+ "description": "Highest-priority override.",
843
+ "type": "string"
844
+ },
845
+ "rootIndex": {
846
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
847
+ "type": "integer",
848
+ "minimum": 0,
849
+ "maximum": 9007199254740991
850
+ },
851
+ "allWorkspaceRoots": {
852
+ "default": false,
853
+ "description": "Fan out across all MCP file roots.",
854
+ "type": "boolean"
855
+ },
856
+ "format": {
857
+ "default": "markdown",
858
+ "type": "string",
859
+ "enum": [
860
+ "markdown",
861
+ "json"
862
+ ]
863
+ },
864
+ "sources": {
865
+ "minItems": 1,
866
+ "maxItems": 50,
867
+ "type": "array",
868
+ "items": {
869
+ "type": "string",
870
+ "minLength": 1
871
+ },
872
+ "description": "Sources to cherry-pick: SHA, `A..B` range, or branch name. Branch sources resolve to `onto..<branch>` (only commits missing from destination)."
873
+ },
874
+ "onto": {
875
+ "description": "Destination branch. Defaults to the currently checked-out branch.",
876
+ "type": "string"
877
+ },
878
+ "deleteMergedBranches": {
879
+ "default": false,
880
+ "description": "After all commits apply, delete each branch-kind source locally (`git branch -d`) when it is fully merged into the destination. Protected names always skipped; never touches remote refs.",
881
+ "type": "boolean"
882
+ },
883
+ "deleteMergedWorktrees": {
884
+ "default": false,
885
+ "description": "After success, remove any local worktree attached to a branch-kind source (`git worktree remove`). Protected tails always skipped.",
886
+ "type": "boolean"
887
+ }
888
+ },
889
+ "required": [
890
+ "allWorkspaceRoots",
891
+ "format",
892
+ "sources",
893
+ "deleteMergedBranches",
894
+ "deleteMergedWorktrees"
895
+ ],
896
+ "additionalProperties": false
897
+ },
898
+ "git_reset_soft": {
899
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
900
+ "type": "object",
901
+ "properties": {
902
+ "workspaceRoot": {
903
+ "description": "Highest-priority override.",
904
+ "type": "string"
905
+ },
906
+ "rootIndex": {
907
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
908
+ "type": "integer",
909
+ "minimum": 0,
910
+ "maximum": 9007199254740991
911
+ },
912
+ "allWorkspaceRoots": {
913
+ "default": false,
914
+ "description": "Fan out across all MCP file roots.",
915
+ "type": "boolean"
916
+ },
917
+ "format": {
918
+ "default": "markdown",
919
+ "type": "string",
920
+ "enum": [
921
+ "markdown",
922
+ "json"
923
+ ]
924
+ },
925
+ "ref": {
926
+ "type": "string",
927
+ "minLength": 1,
928
+ "description": "Commit to reset to. Accepts ancestor notation (`HEAD~1`, `HEAD~3`), branch names, or full SHAs."
929
+ }
930
+ },
931
+ "required": [
932
+ "allWorkspaceRoots",
933
+ "format",
934
+ "ref"
935
+ ],
936
+ "additionalProperties": false
937
+ },
938
+ "git_tag": {
939
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
940
+ "type": "object",
941
+ "properties": {
942
+ "workspaceRoot": {
943
+ "description": "Highest-priority override.",
944
+ "type": "string"
945
+ },
946
+ "rootIndex": {
947
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
948
+ "type": "integer",
949
+ "minimum": 0,
950
+ "maximum": 9007199254740991
951
+ },
952
+ "format": {
953
+ "default": "markdown",
954
+ "type": "string",
955
+ "enum": [
956
+ "markdown",
957
+ "json"
958
+ ]
959
+ },
960
+ "tag": {
961
+ "type": "string",
962
+ "minLength": 1,
963
+ "description": "Tag name (e.g. 'v1.2.3')."
964
+ },
965
+ "message": {
966
+ "description": "If provided, create an annotated tag with this message. If absent, create a lightweight tag.",
967
+ "type": "string"
968
+ },
969
+ "ref": {
970
+ "description": "Commit/ref to tag (default: HEAD). Ignored if `delete` is true.",
971
+ "type": "string"
972
+ },
973
+ "delete": {
974
+ "default": false,
975
+ "description": "If true, delete the named tag instead of creating it.",
976
+ "type": "boolean"
977
+ }
978
+ },
979
+ "required": [
980
+ "format",
981
+ "tag",
982
+ "delete"
983
+ ],
984
+ "additionalProperties": false
985
+ },
986
+ "git_worktree_add": {
987
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
988
+ "type": "object",
989
+ "properties": {
990
+ "workspaceRoot": {
991
+ "description": "Highest-priority override.",
992
+ "type": "string"
993
+ },
994
+ "rootIndex": {
995
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
996
+ "type": "integer",
997
+ "minimum": 0,
998
+ "maximum": 9007199254740991
999
+ },
1000
+ "allWorkspaceRoots": {
1001
+ "default": false,
1002
+ "description": "Fan out across all MCP file roots.",
1003
+ "type": "boolean"
1004
+ },
1005
+ "format": {
1006
+ "default": "markdown",
1007
+ "type": "string",
1008
+ "enum": [
1009
+ "markdown",
1010
+ "json"
1011
+ ]
1012
+ },
1013
+ "path": {
1014
+ "type": "string",
1015
+ "minLength": 1,
1016
+ "description": "Filesystem path for the new worktree. Relative paths are resolved from the git toplevel."
1017
+ },
1018
+ "branch": {
1019
+ "type": "string",
1020
+ "minLength": 1,
1021
+ "description": "Branch to check out in the new worktree. Created from `baseRef` if absent."
1022
+ },
1023
+ "baseRef": {
1024
+ "description": "Commit-ish to base the new branch on when it does not yet exist. Default: HEAD.",
1025
+ "type": "string"
1026
+ }
1027
+ },
1028
+ "required": [
1029
+ "allWorkspaceRoots",
1030
+ "format",
1031
+ "path",
1032
+ "branch"
1033
+ ],
1034
+ "additionalProperties": false
1035
+ },
1036
+ "git_worktree_remove": {
1037
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1038
+ "type": "object",
1039
+ "properties": {
1040
+ "workspaceRoot": {
1041
+ "description": "Highest-priority override.",
1042
+ "type": "string"
1043
+ },
1044
+ "rootIndex": {
1045
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
1046
+ "type": "integer",
1047
+ "minimum": 0,
1048
+ "maximum": 9007199254740991
1049
+ },
1050
+ "allWorkspaceRoots": {
1051
+ "default": false,
1052
+ "description": "Fan out across all MCP file roots.",
1053
+ "type": "boolean"
1054
+ },
1055
+ "format": {
1056
+ "default": "markdown",
1057
+ "type": "string",
1058
+ "enum": [
1059
+ "markdown",
1060
+ "json"
1061
+ ]
1062
+ },
1063
+ "path": {
1064
+ "type": "string",
1065
+ "minLength": 1,
1066
+ "description": "Path of the worktree to remove. Must not be the main worktree."
1067
+ },
1068
+ "force": {
1069
+ "default": false,
1070
+ "description": "Pass `--force` to allow removal of worktrees with uncommitted changes.",
1071
+ "type": "boolean"
1072
+ }
1073
+ },
1074
+ "required": [
1075
+ "allWorkspaceRoots",
1076
+ "format",
1077
+ "path",
1078
+ "force"
1079
+ ],
1080
+ "additionalProperties": false
1081
+ },
1082
+ "git_stash_apply": {
1083
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1084
+ "type": "object",
1085
+ "properties": {
1086
+ "workspaceRoot": {
1087
+ "description": "Highest-priority override.",
1088
+ "type": "string"
1089
+ },
1090
+ "rootIndex": {
1091
+ "description": "0-based index into the MCP file roots list; ignored when workspaceRoot is set.",
1092
+ "type": "integer",
1093
+ "minimum": 0,
1094
+ "maximum": 9007199254740991
1095
+ },
1096
+ "format": {
1097
+ "default": "markdown",
1098
+ "type": "string",
1099
+ "enum": [
1100
+ "markdown",
1101
+ "json"
1102
+ ]
1103
+ },
1104
+ "index": {
1105
+ "default": 0,
1106
+ "description": "Stash index (defaults to 0 for stash@{0}).",
1107
+ "type": "integer",
1108
+ "minimum": 0,
1109
+ "maximum": 9007199254740991
1110
+ },
1111
+ "pop": {
1112
+ "default": false,
1113
+ "description": "If true, runs `git stash pop` instead of `git stash apply` (removes stash after applying).",
1114
+ "type": "boolean"
1115
+ }
1116
+ },
1117
+ "required": [
1118
+ "format",
1119
+ "index",
1120
+ "pop"
1121
+ ],
1122
+ "additionalProperties": false
1123
+ }
1124
+ }
1125
+ }