@rethunk/mcp-multi-root-git 3.1.0 → 4.0.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 (66) hide show
  1. package/AGENTS.md +21 -15
  2. package/CHANGELOG.md +114 -39
  3. package/HUMANS.md +20 -39
  4. package/README.md +30 -13
  5. package/dist/repo-paths.js +57 -13
  6. package/dist/server/batch-commit-tool.js +187 -46
  7. package/dist/server/error-codes.js +25 -7
  8. package/dist/server/git-blame-tool.js +6 -3
  9. package/dist/server/git-branch-tool.js +151 -0
  10. package/dist/server/git-cherry-pick-tool.js +220 -11
  11. package/dist/server/git-conflicts-tool.js +230 -0
  12. package/dist/server/git-diff-summary-tool.js +36 -25
  13. package/dist/server/git-diff-tool.js +55 -27
  14. package/dist/server/git-grep-tool.js +188 -0
  15. package/dist/server/git-inventory-tool.js +26 -6
  16. package/dist/server/git-log-tool.js +35 -4
  17. package/dist/server/git-merge-tool.js +70 -12
  18. package/dist/server/git-parity-tool.js +13 -4
  19. package/dist/server/git-push-tool.js +3 -1
  20. package/dist/server/git-refs.js +48 -17
  21. package/dist/server/git-revert-tool.js +160 -0
  22. package/dist/server/git-show-tool.js +7 -3
  23. package/dist/server/git-stash-tool.js +110 -67
  24. package/dist/server/git-tag-tool.js +7 -6
  25. package/dist/server/git-worktree-tool.js +65 -53
  26. package/dist/server/git.js +116 -24
  27. package/dist/server/inventory.js +90 -32
  28. package/dist/server/presets-resource.js +37 -20
  29. package/dist/server/presets.js +87 -15
  30. package/dist/server/roots.js +13 -1
  31. package/dist/server/schemas.js +9 -2
  32. package/dist/server/test-harness.js +11 -4
  33. package/dist/server/tool-parameter-schemas.js +44 -55
  34. package/dist/server/tools.js +36 -17
  35. package/dist/server.js +1 -1
  36. package/docs/install.md +52 -5
  37. package/docs/mcp-tools.md +385 -178
  38. package/package.json +6 -6
  39. package/schemas/batch_commit.json +2 -2
  40. package/schemas/git_blame.json +1 -1
  41. package/schemas/git_branch.json +54 -0
  42. package/schemas/git_cherry_pick.json +12 -2
  43. package/schemas/git_cherry_pick_continue.json +34 -0
  44. package/schemas/{git_reflog.json → git_conflicts.json} +12 -12
  45. package/schemas/git_diff.json +11 -3
  46. package/schemas/git_grep.json +85 -0
  47. package/schemas/git_inventory.json +19 -5
  48. package/schemas/git_log.json +7 -6
  49. package/schemas/git_merge.json +2 -2
  50. package/schemas/git_parity.json +0 -5
  51. package/schemas/git_revert.json +47 -0
  52. package/schemas/git_show.json +1 -1
  53. package/schemas/git_stash_push.json +47 -0
  54. package/schemas/git_status.json +0 -5
  55. package/schemas/git_worktree_add.json +1 -1
  56. package/schemas/git_worktree_remove.json +1 -1
  57. package/schemas/index.json +28 -23
  58. package/schemas/list_presets.json +0 -5
  59. package/tool-parameters.schema.json +326 -167
  60. package/dist/server/git-branch-list-tool.js +0 -132
  61. package/dist/server/git-fetch-tool.js +0 -257
  62. package/dist/server/git-reflog-tool.js +0 -120
  63. package/schemas/git_branch_list.json +0 -30
  64. package/schemas/git_fetch.json +0 -46
  65. package/schemas/git_stash_list.json +0 -24
  66. package/schemas/git_worktree_list.json +0 -24
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rethunk/mcp-multi-root-git",
3
- "version": "3.1.0",
3
+ "version": "4.0.0",
4
4
  "description": "MCP stdio server: multi-root git status, inventory, and HEAD parity checks. Generic tools usable by any workspace.",
5
5
  "type": "module",
6
6
  "private": false,
@@ -44,7 +44,7 @@
44
44
  "lint": "biome check .",
45
45
  "format": "biome check --write .",
46
46
  "typecheck": "tsc --noEmit",
47
- "ci": "bun run schema:tools:check && bun run lint && bun run typecheck && bun run test && bun run build"
47
+ "ci": "bun run schema:tools:check && bun run schema:individual:check && bun run lint && bun run typecheck && set -o pipefail && bun run test:coverage 2>&1 | tee .coverage-ci.txt && bun run coverage:check .coverage-ci.txt 80 && bun run build"
48
48
  },
49
49
  "keywords": [
50
50
  "mcp",
@@ -67,15 +67,15 @@
67
67
  "access": "public"
68
68
  },
69
69
  "dependencies": {
70
- "fastmcp": "^4.3.2",
70
+ "fastmcp": "^4.7.2",
71
71
  "zod": "^4.4.3"
72
72
  },
73
73
  "devDependencies": {
74
- "@biomejs/biome": "^2.5.2",
74
+ "@biomejs/biome": "^2.5.4",
75
75
  "@types/bun": "^1.3.14",
76
- "@types/node": "^26.1.0",
76
+ "@types/node": "^26.1.1",
77
77
  "rimraf": "^6.1.3",
78
- "typescript": "^6.0.3"
78
+ "typescript": "^7.0.2"
79
79
  },
80
80
  "overrides": {
81
81
  "@hono/node-server": "^1.19.14",
@@ -77,7 +77,7 @@
77
77
  }
78
78
  ]
79
79
  },
80
- "description": "Paths to stage, relative to git root. String or `{ path, lines }` for hunk-level staging. Deleted tracked files are staged via `git rm --cached`. Cannot combine `lines` with a deleted file."
80
+ "description": "Paths to stage, relative to git root. String or `{ path, lines }` for hunk-level staging. Each path is staged individually (`git add` / `git apply --cached` / `git rm --cached`); on mid-entry stage failure, already-staged paths for that entry are unstaged. Deleted tracked files are staged via `git rm --cached`. Cannot combine `lines` with a deleted file. Rejects `.`, the repo root, and directory pathspecs."
81
81
  }
82
82
  },
83
83
  "required": [
@@ -99,7 +99,7 @@
99
99
  },
100
100
  "dryRun": {
101
101
  "default": false,
102
- "description": "Stage files and return a preview without writing commits; unstages afterwards. Response is marked DRY RUN.",
102
+ "description": "Stage files and return a preview without writing commits; restores the index afterwards. Response is marked DRY RUN.",
103
103
  "type": "boolean"
104
104
  }
105
105
  },
@@ -22,7 +22,7 @@
22
22
  "description": "Repo-relative path to the file to blame."
23
23
  },
24
24
  "ref": {
25
- "description": "Optional commit-ish (SHA, branch, tag) to blame at.",
25
+ "description": "Optional commit-ish (SHA, branch, tag) to blame at. Ancestor notation is accepted (e.g. \"HEAD~3\", \"main^2\").",
26
26
  "type": "string"
27
27
  },
28
28
  "startLine": {
@@ -0,0 +1,54 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "@rethunk/mcp-multi-root-git: git_branch",
4
+ "description": "Parameter schema for the 'git_branch' MCP tool.",
5
+ "type": "object",
6
+ "properties": {
7
+ "workspaceRoot": {
8
+ "description": "Repo path. Default: first MCP root / cwd.",
9
+ "type": "string"
10
+ },
11
+ "format": {
12
+ "default": "markdown",
13
+ "type": "string",
14
+ "enum": [
15
+ "markdown",
16
+ "json"
17
+ ]
18
+ },
19
+ "action": {
20
+ "type": "string",
21
+ "enum": [
22
+ "create",
23
+ "delete",
24
+ "rename"
25
+ ],
26
+ "description": "Which branch operation to perform."
27
+ },
28
+ "name": {
29
+ "type": "string",
30
+ "minLength": 1,
31
+ "description": "Branch name to create/delete, or the existing branch name for rename."
32
+ },
33
+ "from": {
34
+ "description": "Commit-ish to base a new branch on (create only). Default: HEAD.",
35
+ "type": "string"
36
+ },
37
+ "newName": {
38
+ "description": "New branch name (required for rename).",
39
+ "type": "string"
40
+ },
41
+ "force": {
42
+ "default": false,
43
+ "description": "Force-delete an unmerged branch (`git branch -D`). Delete only; never overrides protected-branch rejection.",
44
+ "type": "boolean"
45
+ }
46
+ },
47
+ "required": [
48
+ "format",
49
+ "action",
50
+ "name",
51
+ "force"
52
+ ],
53
+ "additionalProperties": false
54
+ }
@@ -37,13 +37,22 @@
37
37
  },
38
38
  "deleteMergedWorktrees": {
39
39
  "default": false,
40
- "description": "Remove local worktrees on branch-kind sources after success. Protected tails skipped.",
40
+ "description": "Remove local worktrees on branch-kind sources after success. Protected names and path tails skipped.",
41
41
  "type": "boolean"
42
42
  },
43
43
  "strictMergedRefEquality": {
44
44
  "default": false,
45
45
  "description": "false (default): delete branch when every commit is content-equivalent on destination (patch-id, normal cherry-pick outcome). true: require strict ref ancestry (`git branch -d` semantics — will refuse after cherry-pick due to SHA mismatch).",
46
46
  "type": "boolean"
47
+ },
48
+ "onConflict": {
49
+ "default": "abort",
50
+ "description": "`abort` (default): on conflict, run `cherry-pick --abort` and roll back the whole range (unchanged behavior). `pause`: on conflict, leave the conflict and native cherry-pick sequencer state in place — commits already applied stay applied — so it can be resolved and resumed via `git_cherry_pick_continue`.",
51
+ "type": "string",
52
+ "enum": [
53
+ "abort",
54
+ "pause"
55
+ ]
47
56
  }
48
57
  },
49
58
  "required": [
@@ -51,7 +60,8 @@
51
60
  "sources",
52
61
  "deleteMergedBranches",
53
62
  "deleteMergedWorktrees",
54
- "strictMergedRefEquality"
63
+ "strictMergedRefEquality",
64
+ "onConflict"
55
65
  ],
56
66
  "additionalProperties": false
57
67
  }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "@rethunk/mcp-multi-root-git: git_cherry_pick_continue",
4
+ "description": "Parameter schema for the 'git_cherry_pick_continue' MCP tool.",
5
+ "type": "object",
6
+ "properties": {
7
+ "workspaceRoot": {
8
+ "description": "Repo path. Default: first MCP root / cwd.",
9
+ "type": "string"
10
+ },
11
+ "format": {
12
+ "default": "markdown",
13
+ "type": "string",
14
+ "enum": [
15
+ "markdown",
16
+ "json"
17
+ ]
18
+ },
19
+ "action": {
20
+ "default": "continue",
21
+ "description": "\"continue\" (default): resolve conflicts, stage them, then resume the sequencer. \"abort\": roll back to the pre-cherry-pick HEAD.",
22
+ "type": "string",
23
+ "enum": [
24
+ "continue",
25
+ "abort"
26
+ ]
27
+ }
28
+ },
29
+ "required": [
30
+ "format",
31
+ "action"
32
+ ],
33
+ "additionalProperties": false
34
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "title": "@rethunk/mcp-multi-root-git: git_reflog",
4
- "description": "Parameter schema for the 'git_reflog' MCP tool.",
3
+ "title": "@rethunk/mcp-multi-root-git: git_conflicts",
4
+ "description": "Parameter schema for the 'git_conflicts' MCP tool.",
5
5
  "type": "object",
6
6
  "properties": {
7
7
  "workspaceRoot": {
@@ -16,23 +16,23 @@
16
16
  "json"
17
17
  ]
18
18
  },
19
- "ref": {
20
- "default": "HEAD",
21
- "description": "Ref whose reflog to show (branch name, HEAD, etc.). Default: HEAD.",
22
- "type": "string"
19
+ "withHunks": {
20
+ "default": true,
21
+ "description": "Parse conflict-marker hunks per file. Set false for just the path list.",
22
+ "type": "boolean"
23
23
  },
24
- "maxEntries": {
25
- "default": 30,
26
- "description": "Maximum reflog entries to return (hard cap 200). Default 30.",
24
+ "maxLinesPerFile": {
25
+ "default": 200,
26
+ "description": "Cap on lines scanned per file before marking `truncated: true`.",
27
27
  "type": "integer",
28
28
  "minimum": 1,
29
- "maximum": 200
29
+ "maximum": 2000
30
30
  }
31
31
  },
32
32
  "required": [
33
33
  "format",
34
- "ref",
35
- "maxEntries"
34
+ "withHunks",
35
+ "maxLinesPerFile"
36
36
  ],
37
37
  "additionalProperties": false
38
38
  }
@@ -17,11 +17,11 @@
17
17
  ]
18
18
  },
19
19
  "base": {
20
- "description": "Base ref (e.g. \"main\", \"HEAD~3\"). Omit for unstaged changes.",
20
+ "description": "Base ref (e.g. \"main\"). Ancestor notation is accepted (e.g. \"HEAD~3\", \"main^2\"). Omit for unstaged changes.",
21
21
  "type": "string"
22
22
  },
23
23
  "head": {
24
- "description": "Head ref (e.g. \"feature-branch\"). Defaults to HEAD. Used only when `base` is set.",
24
+ "description": "Head ref (e.g. \"feature-branch\"). Ancestor notation is accepted (e.g. \"HEAD~3\", \"main^2\"). Defaults to HEAD. Used only when `base` is set.",
25
25
  "type": "string"
26
26
  },
27
27
  "path": {
@@ -45,11 +45,19 @@
45
45
  "type": "integer",
46
46
  "minimum": 0,
47
47
  "maximum": 100
48
+ },
49
+ "maxBytes": {
50
+ "default": 512000,
51
+ "description": "Max UTF-8 bytes of diff text to return (default 512000). Oversized output is truncated with truncated:true.",
52
+ "type": "integer",
53
+ "minimum": 1024,
54
+ "maximum": 10000000
48
55
  }
49
56
  },
50
57
  "required": [
51
58
  "format",
52
- "staged"
59
+ "staged",
60
+ "maxBytes"
53
61
  ],
54
62
  "additionalProperties": false
55
63
  }
@@ -0,0 +1,85 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "@rethunk/mcp-multi-root-git: git_grep",
4
+ "description": "Parameter schema for the 'git_grep' MCP tool.",
5
+ "type": "object",
6
+ "properties": {
7
+ "root": {
8
+ "description": "Repo path, array of paths, or \"*\" for all MCP roots.",
9
+ "anyOf": [
10
+ {
11
+ "type": "string"
12
+ },
13
+ {
14
+ "type": "array",
15
+ "items": {
16
+ "type": "string"
17
+ }
18
+ }
19
+ ]
20
+ },
21
+ "format": {
22
+ "default": "markdown",
23
+ "type": "string",
24
+ "enum": [
25
+ "markdown",
26
+ "json"
27
+ ]
28
+ },
29
+ "pickaxe": {
30
+ "type": "object",
31
+ "properties": {
32
+ "mode": {
33
+ "type": "string",
34
+ "enum": [
35
+ "S",
36
+ "G"
37
+ ],
38
+ "description": "`S` = pickaxe string (`git log -S`); `G` = pickaxe regex (`git log -G`)."
39
+ },
40
+ "term": {
41
+ "type": "string",
42
+ "minLength": 1,
43
+ "maxLength": 500,
44
+ "description": "Search term / regex for pickaxe history."
45
+ }
46
+ },
47
+ "required": [
48
+ "mode",
49
+ "term"
50
+ ],
51
+ "additionalProperties": false,
52
+ "description": "Pickaxe history search. Returns `commits[]` (sha + subject) per root."
53
+ },
54
+ "ref": {
55
+ "description": "Commit/branch/tag to use as the history tip. Must be a safe ref token.",
56
+ "type": "string"
57
+ },
58
+ "paths": {
59
+ "description": "Limit history to these paths (must resolve within the repo root).",
60
+ "type": "array",
61
+ "items": {
62
+ "type": "string"
63
+ }
64
+ },
65
+ "ignoreCase": {
66
+ "default": false,
67
+ "description": "Case-insensitive match (`-i`; affects `G` mode regexes).",
68
+ "type": "boolean"
69
+ },
70
+ "maxMatches": {
71
+ "default": 200,
72
+ "description": "Max commits per root (hard cap 1000, default 200).",
73
+ "type": "integer",
74
+ "minimum": 1,
75
+ "maximum": 1000
76
+ }
77
+ },
78
+ "required": [
79
+ "format",
80
+ "pickaxe",
81
+ "ignoreCase",
82
+ "maxMatches"
83
+ ],
84
+ "additionalProperties": false
85
+ }
@@ -11,15 +11,10 @@
11
11
  "type": "string"
12
12
  },
13
13
  {
14
- "maxItems": 256,
15
14
  "type": "array",
16
15
  "items": {
17
16
  "type": "string"
18
17
  }
19
- },
20
- {
21
- "type": "string",
22
- "const": "*"
23
18
  }
24
19
  ]
25
20
  },
@@ -53,6 +48,25 @@
53
48
  "description": "Pair with `remote`.",
54
49
  "type": "string"
55
50
  },
51
+ "compareRefs": {
52
+ "description": "Ahead/behind between two local refs (e.g. main vs a feature branch), independent of upstream tracking.",
53
+ "type": "object",
54
+ "properties": {
55
+ "left": {
56
+ "type": "string",
57
+ "description": "Base ref (ahead = commits in right not in left)."
58
+ },
59
+ "right": {
60
+ "type": "string",
61
+ "description": "Other ref (behind = commits in left not in right)."
62
+ }
63
+ },
64
+ "required": [
65
+ "left",
66
+ "right"
67
+ ],
68
+ "additionalProperties": false
69
+ },
56
70
  "maxRoots": {
57
71
  "default": 64,
58
72
  "type": "integer",
@@ -11,15 +11,10 @@
11
11
  "type": "string"
12
12
  },
13
13
  {
14
- "maxItems": 256,
15
14
  "type": "array",
16
15
  "items": {
17
16
  "type": "string"
18
17
  }
19
- },
20
- {
21
- "type": "string",
22
- "const": "*"
23
18
  }
24
19
  ]
25
20
  },
@@ -62,11 +57,17 @@
62
57
  "branch": {
63
58
  "description": "Ref/branch to log from. Default: HEAD.",
64
59
  "type": "string"
60
+ },
61
+ "follow": {
62
+ "default": false,
63
+ "description": "Pass `git log --follow` for rename-aware history. Requires exactly one entry in `paths`.",
64
+ "type": "boolean"
65
65
  }
66
66
  },
67
67
  "required": [
68
68
  "format",
69
- "maxCommits"
69
+ "maxCommits",
70
+ "follow"
70
71
  ],
71
72
  "additionalProperties": false
72
73
  }
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "strategy": {
34
34
  "default": "auto",
35
- "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).",
35
+ "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). Note: `auto`/`rebase` rewrite the source branch tip in place when rebasing (new SHAs).",
36
36
  "type": "string",
37
37
  "enum": [
38
38
  "auto",
@@ -52,7 +52,7 @@
52
52
  },
53
53
  "deleteMergedWorktrees": {
54
54
  "default": false,
55
- "description": "Remove local worktrees on source branches after clean merge (`git worktree remove`). Protected tails skipped.",
55
+ "description": "Remove local worktrees on source branches after clean merge (`git worktree remove`). Protected source names and path tails skipped.",
56
56
  "type": "boolean"
57
57
  }
58
58
  },
@@ -11,15 +11,10 @@
11
11
  "type": "string"
12
12
  },
13
13
  {
14
- "maxItems": 256,
15
14
  "type": "array",
16
15
  "items": {
17
16
  "type": "string"
18
17
  }
19
- },
20
- {
21
- "type": "string",
22
- "const": "*"
23
18
  }
24
19
  ]
25
20
  },
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "@rethunk/mcp-multi-root-git: git_revert",
4
+ "description": "Parameter schema for the 'git_revert' MCP tool.",
5
+ "type": "object",
6
+ "properties": {
7
+ "workspaceRoot": {
8
+ "description": "Repo path. Default: first MCP root / cwd.",
9
+ "type": "string"
10
+ },
11
+ "format": {
12
+ "default": "markdown",
13
+ "type": "string",
14
+ "enum": [
15
+ "markdown",
16
+ "json"
17
+ ]
18
+ },
19
+ "sources": {
20
+ "minItems": 1,
21
+ "maxItems": 20,
22
+ "type": "array",
23
+ "items": {
24
+ "type": "string",
25
+ "minLength": 1
26
+ },
27
+ "description": "Commits to revert, applied in order: SHA, branch/tag name, or ancestor notation (`HEAD~1`)."
28
+ },
29
+ "noCommit": {
30
+ "default": false,
31
+ "description": "Pass `--no-commit`: apply the revert(s) to the index/working tree without committing (changes are left staged instead).",
32
+ "type": "boolean"
33
+ },
34
+ "mainline": {
35
+ "description": "Parent number (`-m N`) to diff against — required when reverting a merge commit.",
36
+ "type": "integer",
37
+ "minimum": 1,
38
+ "maximum": 9007199254740991
39
+ }
40
+ },
41
+ "required": [
42
+ "format",
43
+ "sources",
44
+ "noCommit"
45
+ ],
46
+ "additionalProperties": false
47
+ }
@@ -19,7 +19,7 @@
19
19
  "ref": {
20
20
  "type": "string",
21
21
  "minLength": 1,
22
- "description": "Commit reference (SHA, branch, tag, or any git rev-spec)."
22
+ "description": "Commit reference (SHA, branch, tag, or ancestor notation like \"HEAD~3\", \"main^2\")."
23
23
  },
24
24
  "path": {
25
25
  "description": "Optional single file path to inspect at the ref. Merged with `paths` when both are provided.",
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "@rethunk/mcp-multi-root-git: git_stash_push",
4
+ "description": "Parameter schema for the 'git_stash_push' MCP tool.",
5
+ "type": "object",
6
+ "properties": {
7
+ "workspaceRoot": {
8
+ "description": "Repo path. Default: first MCP root / cwd.",
9
+ "type": "string"
10
+ },
11
+ "format": {
12
+ "default": "markdown",
13
+ "type": "string",
14
+ "enum": [
15
+ "markdown",
16
+ "json"
17
+ ]
18
+ },
19
+ "message": {
20
+ "description": "Stash subject message (`git stash push -m <message>`).",
21
+ "type": "string"
22
+ },
23
+ "includeUntracked": {
24
+ "default": false,
25
+ "description": "Include untracked files in the stash (`git stash push -u`).",
26
+ "type": "boolean"
27
+ },
28
+ "keepIndex": {
29
+ "default": false,
30
+ "description": "Keep staged changes in the index after stashing (`git stash push --keep-index`).",
31
+ "type": "boolean"
32
+ },
33
+ "paths": {
34
+ "description": "Scope the stash to specific paths, relative to git root (must resolve within repo root).",
35
+ "type": "array",
36
+ "items": {
37
+ "type": "string"
38
+ }
39
+ }
40
+ },
41
+ "required": [
42
+ "format",
43
+ "includeUntracked",
44
+ "keepIndex"
45
+ ],
46
+ "additionalProperties": false
47
+ }
@@ -11,15 +11,10 @@
11
11
  "type": "string"
12
12
  },
13
13
  {
14
- "maxItems": 256,
15
14
  "type": "array",
16
15
  "items": {
17
16
  "type": "string"
18
17
  }
19
- },
20
- {
21
- "type": "string",
22
- "const": "*"
23
18
  }
24
19
  ]
25
20
  },
@@ -19,7 +19,7 @@
19
19
  "path": {
20
20
  "type": "string",
21
21
  "minLength": 1,
22
- "description": "Filesystem path for the new worktree (relative paths resolved from git toplevel)."
22
+ "description": "Filesystem path for the new worktree (relative paths resolved from git toplevel). Sibling directories outside the repo toplevel are allowed; leading `-` and NUL are rejected."
23
23
  },
24
24
  "branch": {
25
25
  "type": "string",
@@ -19,7 +19,7 @@
19
19
  "path": {
20
20
  "type": "string",
21
21
  "minLength": 1,
22
- "description": "Path of the worktree to remove. Must not be the main worktree."
22
+ "description": "Path of the worktree to remove. Must not be the main worktree. Sibling paths outside the repo toplevel are allowed; leading `-` and NUL are rejected."
23
23
  },
24
24
  "force": {
25
25
  "default": false,