@rethunk/mcp-multi-root-git 2.9.0 → 2.9.1
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/CHANGELOG.md +34 -0
- package/dist/server/coverage.js +5 -1
- package/dist/server/git.js +2 -8
- package/package.json +5 -4
- package/schemas/batch_commit.json +7 -7
- package/schemas/git_blame.json +2 -2
- package/schemas/git_branch_list.json +3 -3
- package/schemas/git_cherry_pick.json +7 -7
- package/schemas/git_diff.json +8 -8
- package/schemas/git_diff_summary.json +4 -4
- package/schemas/git_fetch.json +2 -2
- package/schemas/git_inventory.json +4 -4
- package/schemas/git_log.json +10 -10
- package/schemas/git_merge.json +5 -5
- package/schemas/git_parity.json +4 -4
- package/schemas/git_push.json +3 -3
- package/schemas/git_reflog.json +2 -2
- package/schemas/git_reset_soft.json +4 -4
- package/schemas/git_show.json +2 -2
- package/schemas/git_stash_apply.json +3 -3
- package/schemas/git_stash_list.json +2 -2
- package/schemas/git_status.json +4 -4
- package/schemas/git_tag.json +2 -2
- package/schemas/git_worktree_add.json +6 -6
- package/schemas/git_worktree_list.json +2 -2
- package/schemas/git_worktree_remove.json +4 -4
- package/schemas/list_presets.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `@rethunk/mcp-multi-root-git` are documented here. Format loosely follows [Keep a Changelog](https://keepachangelog.com); the project uses [Semantic Versioning](https://semver.org).
|
|
4
4
|
|
|
5
|
+
## [2.9.1] — 2026-06-11
|
|
6
|
+
|
|
7
|
+
Patch release: security hardening, schema refresh, and developer-tooling correctness. No JSON-format change.
|
|
8
|
+
|
|
9
|
+
### Security
|
|
10
|
+
|
|
11
|
+
- **Insecure temp-file creation eliminated.** `scripts/publish-preflight.ts` and `src/server/git-merge-tool.test.ts` now use `fs.mkdtemp` instead of predictable paths (2 high `js/insecure-temporary-file` alerts resolved).
|
|
12
|
+
- **TOCTOU race in `.gitmodules` parsing fixed.** `parseGitSubmodulePaths` in `git.ts` previously called `existsSync` then `lstatSync` separately, creating a file-system race window. The redundant `existsSync` check is removed; `lstatSync` + `readFileSync` is now wrapped in a single `try/catch` (1 high `js/file-system-race` alert resolved).
|
|
13
|
+
- **GitHub Actions workflow permissions hardened.** `ci.yml` and `release.yml` gain `permissions: contents: read` blocks at workflow and job level. All third-party action tags are pinned to full commit SHAs (5 medium workflow-permission alerts resolved).
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **Schema artifacts regenerated.** `schemas/*.json` (23 files) were stale relative to tool-description changes in the 2.9.0 token-trim and allowlist commits; regenerated so `bun run schema:individual:check` passes in CI.
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- **Test files are now type-checked.** `tsconfig.json` includes `**/*.test.ts` with `@types/bun`, and a new `tsconfig.build.json` keeps tests out of the published `dist`. This surfaced and fixed latent type errors in the `tools`, `git-merge`, `list-presets`, and `tool-parameter-schemas` tests that the prior build never caught.
|
|
22
|
+
- **`coverage:check` is robust to ANSI color.** `parseAllFilesLineCoverage` strips ANSI escape codes before matching the summary rows, so coverage parsing no longer fails when `bun test --coverage` emits color (e.g. under `FORCE_COLOR`).
|
|
23
|
+
|
|
5
24
|
## [2.9.0] — 2026-06-05
|
|
6
25
|
|
|
7
26
|
Feature release: `RETHUNK_GIT_TOOLS` allowlist env var. Additive — no JSON format-version bump.
|
|
@@ -10,6 +29,14 @@ Feature release: `RETHUNK_GIT_TOOLS` allowlist env var. Additive — no JSON for
|
|
|
10
29
|
|
|
11
30
|
- **`RETHUNK_GIT_TOOLS`** — comma-separated allowlist of exact tool names. When set to a non-empty value, only the listed tools are registered; unknown names are warned to stderr and ignored. When unset or empty (default), all 23 tools are registered — zero behavioral change for existing consumers. If every name in the list is unrecognized, zero tools are registered and a loud warning is emitted (the restriction is honored literally rather than falling back to all tools). The presets resource (`rethunk-git://presets`) is always registered regardless of this setting. Cuts MCP token cost for agents that only need a small subset of tools. Example: `RETHUNK_GIT_TOOLS=git_status,git_diff_summary,git_diff,git_log,batch_commit,git_push`.
|
|
12
31
|
|
|
32
|
+
## [2.8.1] — 2026-06-05
|
|
33
|
+
|
|
34
|
+
Patch release: token-cost reduction. No behavior or JSON-format change.
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
|
|
38
|
+
- Tightened verbose tool parameter descriptions (shared `WorkspacePickSchema` plus several per-tool schemas) to cut the serialized MCP tool payload (~7% of the real `tools/list` size). Descriptions only — no parameter, type, enum, or default changes.
|
|
39
|
+
|
|
13
40
|
## [2.8.0] — 2026-05-29
|
|
14
41
|
|
|
15
42
|
Feature release: three new read-only inspection tools (tool count 20 → 23). Additive — no JSON format-version bump.
|
|
@@ -260,6 +287,13 @@ Mutating git operations: merge, cherry-pick, and optional push-after for `batch_
|
|
|
260
287
|
|
|
261
288
|
- Initial release: `git_status`, `git_inventory`, `git_parity`, `list_presets`.
|
|
262
289
|
|
|
290
|
+
[2.9.1]: https://github.com/Rethunk-AI/mcp-multi-root-git/releases/tag/v2.9.1
|
|
291
|
+
[2.9.0]: https://github.com/Rethunk-AI/mcp-multi-root-git/releases/tag/v2.9.0
|
|
292
|
+
[2.8.1]: https://github.com/Rethunk-AI/mcp-multi-root-git/releases/tag/v2.8.1
|
|
293
|
+
[2.8.0]: https://github.com/Rethunk-AI/mcp-multi-root-git/releases/tag/v2.8.0
|
|
294
|
+
[2.7.0]: https://github.com/Rethunk-AI/mcp-multi-root-git/releases/tag/v2.7.0
|
|
295
|
+
[2.6.0]: https://github.com/Rethunk-AI/mcp-multi-root-git/releases/tag/v2.6.0
|
|
296
|
+
[2.5.0]: https://github.com/Rethunk-AI/mcp-multi-root-git/releases/tag/v2.5.0
|
|
263
297
|
[2.4.0]: https://github.com/Rethunk-AI/mcp-multi-root-git/releases/tag/v2.4.0
|
|
264
298
|
[2.3.4]: https://github.com/Rethunk-AI/mcp-multi-root-git/releases/tag/v2.3.4
|
|
265
299
|
[2.3.3]: https://github.com/Rethunk-AI/mcp-multi-root-git/releases/tag/v2.3.3
|
package/dist/server/coverage.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
export function parseAllFilesLineCoverage(output) {
|
|
2
|
+
// Strip ANSI color codes (bun emits them when FORCE_COLOR is set, which would
|
|
3
|
+
// otherwise prefix the "All files"/"File" rows and defeat the matchers).
|
|
4
|
+
// Built via fromCharCode to keep a literal control character out of the source.
|
|
5
|
+
const ansi = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*m`, "g");
|
|
2
6
|
const rows = output
|
|
3
7
|
.split(/\r?\n/)
|
|
4
|
-
.map((line) => line.trim())
|
|
8
|
+
.map((line) => line.replace(ansi, "").trim())
|
|
5
9
|
.filter((line) => line.includes("|"));
|
|
6
10
|
const header = rows.find((line) => /^File\s*\|/i.test(line));
|
|
7
11
|
if (!header)
|
package/dist/server/git.js
CHANGED
|
@@ -95,19 +95,13 @@ export function gitRevParseHead(cwd) {
|
|
|
95
95
|
}
|
|
96
96
|
export function parseGitSubmodulePaths(gitRoot) {
|
|
97
97
|
const f = join(gitRoot, ".gitmodules");
|
|
98
|
-
if (!existsSync(f))
|
|
99
|
-
return [];
|
|
100
98
|
// Skip non-regular files (character devices, sockets, etc.) — common in
|
|
101
99
|
// Claude Code sandbox environments where stub device files shadow paths.
|
|
100
|
+
// Use a single try/catch to avoid TOCTOU between existence check and open.
|
|
101
|
+
let text;
|
|
102
102
|
try {
|
|
103
103
|
if (!lstatSync(f).isFile())
|
|
104
104
|
return [];
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
return [];
|
|
108
|
-
}
|
|
109
|
-
let text;
|
|
110
|
-
try {
|
|
111
105
|
text = readFileSync(f, "utf8");
|
|
112
106
|
}
|
|
113
107
|
catch {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rethunk/mcp-multi-root-git",
|
|
3
|
-
"version": "2.9.
|
|
3
|
+
"version": "2.9.1",
|
|
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,
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
}
|
|
31
31
|
},
|
|
32
32
|
"scripts": {
|
|
33
|
-
"build": "rimraf dist && tsc",
|
|
33
|
+
"build": "rimraf dist && tsc -p tsconfig.build.json",
|
|
34
34
|
"coverage:check": "bun scripts/check-coverage.ts",
|
|
35
35
|
"schema:tools": "bun scripts/generate-tool-parameters-schema.ts",
|
|
36
36
|
"schema:tools:check": "bun scripts/generate-tool-parameters-schema.ts --check",
|
|
@@ -67,12 +67,13 @@
|
|
|
67
67
|
"access": "public"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"fastmcp": "^4.0.
|
|
70
|
+
"fastmcp": "^4.0.2",
|
|
71
71
|
"zod": "^4.4.3"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
74
|
"@biomejs/biome": "^2.4.16",
|
|
75
|
-
"@types/
|
|
75
|
+
"@types/bun": "^1.3.14",
|
|
76
|
+
"@types/node": "^25.9.2",
|
|
76
77
|
"rimraf": "^6.1.3",
|
|
77
78
|
"typescript": "^6.0.3"
|
|
78
79
|
},
|
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"format": {
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
}
|
|
89
89
|
]
|
|
90
90
|
},
|
|
91
|
-
"description": "Paths to stage, relative to
|
|
91
|
+
"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."
|
|
92
92
|
}
|
|
93
93
|
},
|
|
94
94
|
"required": [
|
|
@@ -97,11 +97,11 @@
|
|
|
97
97
|
],
|
|
98
98
|
"additionalProperties": false
|
|
99
99
|
},
|
|
100
|
-
"description": "
|
|
100
|
+
"description": "Ordered list of commits to create."
|
|
101
101
|
},
|
|
102
102
|
"push": {
|
|
103
103
|
"default": "never",
|
|
104
|
-
"description": "`never` (default): no push. `after`: push
|
|
104
|
+
"description": "`never` (default): no push. `after`: push current branch to upstream after all commits succeed; fails with `push_no_upstream` if no upstream (commits are NOT rolled back).",
|
|
105
105
|
"type": "string",
|
|
106
106
|
"enum": [
|
|
107
107
|
"never",
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
},
|
|
111
111
|
"dryRun": {
|
|
112
112
|
"default": false,
|
|
113
|
-
"description": "
|
|
113
|
+
"description": "Stage files and return a preview without writing commits; unstages afterwards. Response is marked DRY RUN.",
|
|
114
114
|
"type": "boolean"
|
|
115
115
|
}
|
|
116
116
|
},
|
package/schemas/git_blame.json
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"includeRemotes": {
|
|
26
26
|
"default": false,
|
|
27
|
-
"description": "
|
|
27
|
+
"description": "Include remote-tracking branches from refs/remotes (symbolic origin/HEAD excluded).",
|
|
28
28
|
"type": "boolean"
|
|
29
29
|
}
|
|
30
30
|
},
|
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"format": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"type": "string",
|
|
36
36
|
"minLength": 1
|
|
37
37
|
},
|
|
38
|
-
"description": "Sources
|
|
38
|
+
"description": "Sources: SHA, `A..B` range, or branch name (resolves to `onto..<branch>`)."
|
|
39
39
|
},
|
|
40
40
|
"onto": {
|
|
41
41
|
"description": "Destination branch. Defaults to the currently checked-out branch.",
|
|
@@ -43,17 +43,17 @@
|
|
|
43
43
|
},
|
|
44
44
|
"deleteMergedBranches": {
|
|
45
45
|
"default": false,
|
|
46
|
-
"description": "
|
|
46
|
+
"description": "Delete branch-kind sources locally after success. Protected names and remote refs unaffected.",
|
|
47
47
|
"type": "boolean"
|
|
48
48
|
},
|
|
49
49
|
"deleteMergedWorktrees": {
|
|
50
50
|
"default": false,
|
|
51
|
-
"description": "
|
|
51
|
+
"description": "Remove local worktrees on branch-kind sources after success. Protected tails skipped.",
|
|
52
52
|
"type": "boolean"
|
|
53
53
|
},
|
|
54
54
|
"strictMergedRefEquality": {
|
|
55
55
|
"default": false,
|
|
56
|
-
"description": "
|
|
56
|
+
"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).",
|
|
57
57
|
"type": "boolean"
|
|
58
58
|
}
|
|
59
59
|
},
|
package/schemas/git_diff.json
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
@@ -23,19 +23,19 @@
|
|
|
23
23
|
]
|
|
24
24
|
},
|
|
25
25
|
"base": {
|
|
26
|
-
"description": "Base ref (e.g. \"main\", \"HEAD~3\").
|
|
26
|
+
"description": "Base ref (e.g. \"main\", \"HEAD~3\"). Omit for unstaged changes.",
|
|
27
27
|
"type": "string"
|
|
28
28
|
},
|
|
29
29
|
"head": {
|
|
30
|
-
"description": "Head ref (e.g. \"feature-branch\").
|
|
30
|
+
"description": "Head ref (e.g. \"feature-branch\"). Defaults to HEAD. Used only when `base` is set.",
|
|
31
31
|
"type": "string"
|
|
32
32
|
},
|
|
33
33
|
"path": {
|
|
34
|
-
"description": "Scope
|
|
34
|
+
"description": "Scope to a single file. Unioned with `paths` if both given.",
|
|
35
35
|
"type": "string"
|
|
36
36
|
},
|
|
37
37
|
"paths": {
|
|
38
|
-
"description": "Scope
|
|
38
|
+
"description": "Scope to multiple files (must be within repo root). Unioned with `path` if both given.",
|
|
39
39
|
"type": "array",
|
|
40
40
|
"items": {
|
|
41
41
|
"type": "string"
|
|
@@ -43,11 +43,11 @@
|
|
|
43
43
|
},
|
|
44
44
|
"staged": {
|
|
45
45
|
"default": false,
|
|
46
|
-
"description": "
|
|
46
|
+
"description": "Show staged changes (`git diff --staged`). Ignored if `base` is set.",
|
|
47
47
|
"type": "boolean"
|
|
48
48
|
},
|
|
49
49
|
"unified": {
|
|
50
|
-
"description": "
|
|
50
|
+
"description": "Context lines around each change (`-U<n>`). Default: 3. Use 0 for no context.",
|
|
51
51
|
"type": "integer",
|
|
52
52
|
"minimum": 0,
|
|
53
53
|
"maximum": 100
|
|
@@ -5,17 +5,17 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"absoluteGitRoots": {
|
|
18
|
-
"description": "Absolute paths to git repo roots
|
|
18
|
+
"description": "Absolute paths to git repo roots; use for sibling clones under a non-git parent.",
|
|
19
19
|
"maxItems": 256,
|
|
20
20
|
"type": "array",
|
|
21
21
|
"items": {
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"maximum": 500
|
|
54
54
|
},
|
|
55
55
|
"excludePatterns": {
|
|
56
|
-
"description": "Glob patterns to exclude.
|
|
56
|
+
"description": "Glob patterns to exclude. Default: lock files, dist, vendor, etc.",
|
|
57
57
|
"type": "array",
|
|
58
58
|
"items": {
|
|
59
59
|
"type": "string"
|
package/schemas/git_fetch.json
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
@@ -5,22 +5,22 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"absoluteGitRoots": {
|
|
23
|
-
"description": "Absolute paths to git repo roots
|
|
23
|
+
"description": "Absolute paths to git repo roots; use for sibling clones under a non-git parent.",
|
|
24
24
|
"maxItems": 256,
|
|
25
25
|
"type": "array",
|
|
26
26
|
"items": {
|
package/schemas/git_log.json
CHANGED
|
@@ -5,22 +5,22 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"absoluteGitRoots": {
|
|
23
|
-
"description": "Absolute paths to git repo roots
|
|
23
|
+
"description": "Absolute paths to git repo roots; use for sibling clones under a non-git parent.",
|
|
24
24
|
"maxItems": 256,
|
|
25
25
|
"type": "array",
|
|
26
26
|
"items": {
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"format": {
|
|
31
31
|
"default": "markdown",
|
|
32
|
-
"description": "`markdown` (default): headed sections per root. `json`:
|
|
32
|
+
"description": "`markdown` (default): headed sections per root. `json`: groups array. `oneline`: `<sha7> <subject>` per line; lowest-token option for post-commit verification.",
|
|
33
33
|
"type": "string",
|
|
34
34
|
"enum": [
|
|
35
35
|
"markdown",
|
|
@@ -38,27 +38,27 @@
|
|
|
38
38
|
]
|
|
39
39
|
},
|
|
40
40
|
"since": {
|
|
41
|
-
"description": "Passed to
|
|
41
|
+
"description": "Passed to `--since=`. ISO timestamp or git relative form (`48.hours`, `2.weeks.ago`). Default: `7.days`.",
|
|
42
42
|
"type": "string"
|
|
43
43
|
},
|
|
44
44
|
"paths": {
|
|
45
|
-
"description": "Limit to commits touching these paths (
|
|
45
|
+
"description": "Limit to commits touching these paths (`-- <paths>`).",
|
|
46
46
|
"type": "array",
|
|
47
47
|
"items": {
|
|
48
48
|
"type": "string"
|
|
49
49
|
}
|
|
50
50
|
},
|
|
51
51
|
"grep": {
|
|
52
|
-
"description": "Filter
|
|
52
|
+
"description": "Filter by commit message regex (git `--grep`, case-insensitive).",
|
|
53
53
|
"type": "string"
|
|
54
54
|
},
|
|
55
55
|
"author": {
|
|
56
|
-
"description": "Filter by author name or email (
|
|
56
|
+
"description": "Filter by author name or email (`--author=`).",
|
|
57
57
|
"type": "string"
|
|
58
58
|
},
|
|
59
59
|
"maxCommits": {
|
|
60
60
|
"default": 50,
|
|
61
|
-
"description": "
|
|
61
|
+
"description": "Max commits per root (hard cap 500, default 50).",
|
|
62
62
|
"type": "integer",
|
|
63
63
|
"minimum": 1,
|
|
64
64
|
"maximum": 500
|
package/schemas/git_merge.json
CHANGED
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"format": {
|
|
@@ -58,12 +58,12 @@
|
|
|
58
58
|
},
|
|
59
59
|
"deleteMergedBranches": {
|
|
60
60
|
"default": false,
|
|
61
|
-
"description": "
|
|
61
|
+
"description": "Delete each source branch locally after clean merge (`git branch -d`). Protected names and remote refs unaffected.",
|
|
62
62
|
"type": "boolean"
|
|
63
63
|
},
|
|
64
64
|
"deleteMergedWorktrees": {
|
|
65
65
|
"default": false,
|
|
66
|
-
"description": "
|
|
66
|
+
"description": "Remove local worktrees on source branches after clean merge (`git worktree remove`). Protected tails skipped.",
|
|
67
67
|
"type": "boolean"
|
|
68
68
|
}
|
|
69
69
|
},
|
package/schemas/git_parity.json
CHANGED
|
@@ -5,22 +5,22 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"absoluteGitRoots": {
|
|
23
|
-
"description": "Absolute paths to git repo roots
|
|
23
|
+
"description": "Absolute paths to git repo roots; use for sibling clones under a non-git parent.",
|
|
24
24
|
"maxItems": 256,
|
|
25
25
|
"type": "array",
|
|
26
26
|
"items": {
|
package/schemas/git_push.json
CHANGED
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"format": {
|
package/schemas/git_reflog.json
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"format": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"ref": {
|
|
31
31
|
"type": "string",
|
|
32
32
|
"minLength": 1,
|
|
33
|
-
"description": "Commit to reset to
|
|
33
|
+
"description": "Commit to reset to: ancestor notation (`HEAD~1`, `HEAD~3`), branch name, or SHA."
|
|
34
34
|
}
|
|
35
35
|
},
|
|
36
36
|
"required": [
|
package/schemas/git_show.json
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
"pop": {
|
|
33
33
|
"default": false,
|
|
34
|
-
"description": "
|
|
34
|
+
"description": "Run `git stash pop` instead of `git stash apply` (removes stash after applying).",
|
|
35
35
|
"type": "boolean"
|
|
36
36
|
}
|
|
37
37
|
},
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
package/schemas/git_status.json
CHANGED
|
@@ -5,22 +5,22 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"absoluteGitRoots": {
|
|
23
|
-
"description": "Absolute paths to git repo roots
|
|
23
|
+
"description": "Absolute paths to git repo roots; use for sibling clones under a non-git parent.",
|
|
24
24
|
"maxItems": 256,
|
|
25
25
|
"type": "array",
|
|
26
26
|
"items": {
|
package/schemas/git_tag.json
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"format": {
|
|
@@ -30,15 +30,15 @@
|
|
|
30
30
|
"path": {
|
|
31
31
|
"type": "string",
|
|
32
32
|
"minLength": 1,
|
|
33
|
-
"description": "Filesystem path for the new worktree
|
|
33
|
+
"description": "Filesystem path for the new worktree (relative paths resolved from git toplevel)."
|
|
34
34
|
},
|
|
35
35
|
"branch": {
|
|
36
36
|
"type": "string",
|
|
37
37
|
"minLength": 1,
|
|
38
|
-
"description": "Branch to check out
|
|
38
|
+
"description": "Branch to check out; created from `baseRef` if it doesn't exist."
|
|
39
39
|
},
|
|
40
40
|
"baseRef": {
|
|
41
|
-
"description": "Commit-ish to base the new branch on
|
|
41
|
+
"description": "Commit-ish to base the new branch on. Default: HEAD.",
|
|
42
42
|
"type": "string"
|
|
43
43
|
}
|
|
44
44
|
},
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"format": {
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
},
|
|
35
35
|
"force": {
|
|
36
36
|
"default": false,
|
|
37
|
-
"description": "
|
|
37
|
+
"description": "Allow removal of worktrees with uncommitted changes (`--force`).",
|
|
38
38
|
"type": "boolean"
|
|
39
39
|
}
|
|
40
40
|
},
|
|
@@ -5,22 +5,22 @@
|
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"workspaceRoot": {
|
|
8
|
-
"description": "Highest-priority override.",
|
|
8
|
+
"description": "Highest-priority root override.",
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
11
|
"rootIndex": {
|
|
12
|
-
"description": "0-based index into
|
|
12
|
+
"description": "0-based index into MCP roots; ignored if workspaceRoot set.",
|
|
13
13
|
"type": "integer",
|
|
14
14
|
"minimum": 0,
|
|
15
15
|
"maximum": 9007199254740991
|
|
16
16
|
},
|
|
17
17
|
"allWorkspaceRoots": {
|
|
18
18
|
"default": false,
|
|
19
|
-
"description": "Fan out across all MCP
|
|
19
|
+
"description": "Fan out across all MCP roots.",
|
|
20
20
|
"type": "boolean"
|
|
21
21
|
},
|
|
22
22
|
"absoluteGitRoots": {
|
|
23
|
-
"description": "Absolute paths to git repo roots
|
|
23
|
+
"description": "Absolute paths to git repo roots; use for sibling clones under a non-git parent.",
|
|
24
24
|
"maxItems": 256,
|
|
25
25
|
"type": "array",
|
|
26
26
|
"items": {
|