Skip to content

Commit 93b27d2

Browse files
committed
chore(release): prepare 1.0.3 dependency refresh
Update runtime and tooling dependencies while preserving the 1.0.3 repo batch-limit release work under the documented verification gates.
1 parent 27081ab commit 93b27d2

12 files changed

Lines changed: 71 additions & 42 deletions

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ IDEs injecting context: don't re-link from rules.
1818
| [`src/server/tools.ts`](src/server/tools.ts) | `registerRethunkGitHubTools` — dispatches to `register*` below |
1919
| [`src/server/json.ts`](src/server/json.ts) | `MCP_JSON_FORMAT_VERSION="2"`, `jsonRespond()` (minified), `errorRespond`, `mkError`, `mkLocalRepoNoRemote`, `spreadDefined`, `truncateLines`, `truncateText` |
2020
| [`src/server/utils.ts`](src/server/utils.ts) | `timeAgo`, `parseSince`, `extractPRNumbers`, `extractFirstPR`, `tailTruncate`, `CheckNode` (interface), `normalizeFailedChecks` — shared across tool files |
21-
| [`src/server/schemas.ts`](src/server/schemas.ts) | `FormatSchema`, `RepoRefSchema`, `LocalOrRemoteRepoSchema`, `MaxCommitsSchema`, `MaxLogLinesSchema` |
21+
| [`src/server/schemas.ts`](src/server/schemas.ts) | `FormatSchema`, `RepoRefSchema`, `LocalOrRemoteRepoSchema`, `MaxCommitsSchema`, `MaxLogLinesSchema`, **`MAX_REPOS_PER_REQUEST`** (64; caps `repo_status` / `ecosystem_activity` `repos[]`) |
2222
| [`src/server/github-auth.ts`](src/server/github-auth.ts) | `gateAuth` (GITHUB_TOKEN → GH_TOKEN → gh CLI), `resetAuthCache` |
2323
| [`src/server/github-client.ts`](src/server/github-client.ts) | `getOctokit` (REST), `graphqlQuery` (typed GraphQL), `asyncPool`, `parallelApi`, `classifyError`, `parseGitHubRemoteUrl`, `resolveLocalRepoRemote`, `PRNode` (interface), `fetchPRMetadata`, `fetchLatestSemverTag` |
2424
| [`src/server/repo-status-tool.ts`](src/server/repo-status-tool.ts) | `repo_status` — multi-repo dashboard |

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ All notable changes to this project are documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.0.3] — 2026-04-21
9+
10+
### Changed
11+
12+
- **`repo_status`** and **`ecosystem_activity`**: raised the per-request cap on the `repos` array from **20** to **64**, via shared **`MAX_REPOS_PER_REQUEST`** in **`src/server/schemas.ts`** (aligned with **`@rethunk/mcp-multi-root-git`** inventory default). **`docs/mcp-tools.md`** and **`README.md`** updated.
13+
814
## [1.0.2] — 2026-04-21
915

1016
### Fixed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
| Tool | What it does |
1414
|------|-------------|
15-
| **`repo_status`** | Multi-repo dashboard: branch HEAD, CI, PRs, issues, latest commit — up to 20 repos in one call |
15+
| **`repo_status`** | Multi-repo dashboard: branch HEAD, CI, PRs, issues, latest commit — up to 64 repos in one call |
1616
| **`my_work`** | Cross-repo personal queue: your open PRs, review requests, assigned issues; `blockedOnMe` lens for action items |
1717
| **`pr_preflight`** | Pre-merge safety check: mergeable, reviews, CI, behind-base, computed `safe` verdict; batch-capable |
1818
| **`release_readiness`** | What would ship now: unreleased commits, associated PRs, CI on head, diff stats |

biome.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"$schema": "https://biomejs.dev/schemas/2.4.11/schema.json",
2+
"$schema": "https://biomejs.dev/schemas/2.4.13/schema.json",
33
"linter": {
44
"enabled": true,
55
"rules": {

bun.lock

Lines changed: 22 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/mcp-tools.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ MCP clients expose tools as `{serverName}_{toolName}`. With the server registere
1111

1212
| Short id | Client id (server `rethunk-github`) | Purpose |
1313
|----------|--------------------------------------|---------|
14-
| `repo_status` | `rethunk-github_repo_status` | Multi-repo dashboard: default branch HEAD, CI, open PRs/issues, latest commit. Up to 20 repos per call, optional local git state. |
14+
| `repo_status` | `rethunk-github_repo_status` | Multi-repo dashboard: default branch HEAD, CI, open PRs/issues, latest commit. Up to 64 repos per call, optional local git state. Very large batches may hit GitHub rate limits; concurrency stays at 4. |
1515
| `my_work` | `rethunk-github_my_work` | Cross-repo personal queue: authored PRs, review requests, assigned issues. `blockedOnMe` lens for action items. |
1616
| `pr_preflight` | `rethunk-github_pr_preflight` | Pre-merge safety check: mergeable, reviews, CI, behind-base, computed `safe` verdict with reasons. Batch-capable via `numbers[]`. |
1717
| `release_readiness` | `rethunk-github_release_readiness` | What would ship if we release now? Unreleased commits, associated PRs, CI on head, diff stats. Auto-picks latest semver tag as base. |
@@ -81,7 +81,7 @@ Future write-capable tools (e.g. a proposed `release_create`) will document thei
8181

8282
| Name | Type | Required | Default | Description |
8383
|------|------|----------|---------|-------------|
84-
| `repos` | `(RepoRef \| LocalPath)[]` | yes || 1–20 repos. Each is `{ owner, repo }` or `{ localPath }`. |
84+
| `repos` | `(RepoRef \| LocalPath)[]` | yes || 1–64 repos. Each is `{ owner, repo }` or `{ localPath }`. |
8585
| `format` | `"markdown" \| "json"` | no | `"json"` | Output format. |
8686

8787
**JSON output:**
@@ -353,7 +353,7 @@ The `attention` array is sorted by urgency: failing CI repos first, then by stal
353353

354354
| Name | Type | Required | Default | Description |
355355
|------|------|----------|---------|-------------|
356-
| `repos` | `(RepoRef \| LocalPath)[]` | yes || 1–20 repos. Each is `{ owner, repo }` or `{ localPath }`. |
356+
| `repos` | `(RepoRef \| LocalPath)[]` | yes || 1–64 repos. Each is `{ owner, repo }` or `{ localPath }`. |
357357
| `since` | `string` | yes || ISO8601 timestamp or relative duration: `"48h"`, `"7d"`. |
358358
| `paths` | `string[]` | no || Filter to commits touching these paths (applied per repo via GraphQL `history(path:...)`). Multiple paths are OR'd together. |
359359
| `grep` | `string` | no || Regex filter applied client-side to commit message subjects. |

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@rethunk/github-mcp",
3-
"version": "1.0.2",
3+
"version": "1.0.3",
44
"description": "MCP stdio server: high-value GitHub rollup tools for LLMs — multi-repo dashboards, PR preflight, CI diagnosis, and more.",
55
"type": "module",
66
"private": false,
@@ -57,15 +57,15 @@
5757
"access": "public"
5858
},
5959
"dependencies": {
60-
"fastmcp": "^3.35.0",
60+
"fastmcp": "^4.0.1",
6161
"zod": "^4.3.6",
6262
"@octokit/rest": "^22.0.1",
6363
"@octokit/graphql": "^9.0.3"
6464
},
6565
"devDependencies": {
66-
"@biomejs/biome": "^2.4.11",
67-
"@types/node": "^22.19.17",
66+
"@biomejs/biome": "^2.4.13",
67+
"@types/node": "^25.6.0",
6868
"rimraf": "^6.1.3",
69-
"typescript": "^6.0.2"
69+
"typescript": "^6.0.3"
7070
}
7171
}

src/server/compare-refs.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ describe("fetchCommitHistory", () => {
129129
}
130130
expect(result.defaultBranch).toBe("main");
131131
expect(Array.isArray(result.commits)).toBe(true);
132-
if (result.commits.length > 0) {
133-
const c = result.commits[0]!;
132+
const c = result.commits[0];
133+
if (c) {
134134
expect(c.sha7).toHaveLength(7);
135135
expect(typeof c.message).toBe("string");
136136
expect(typeof c.author).toBe("string");

src/server/ecosystem-activity-tool.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
mkLocalRepoNoRemote,
1515
truncateText,
1616
} from "./json.js";
17-
import { FormatSchema, LocalOrRemoteRepoSchema } from "./schemas.js";
17+
import { FormatSchema, LocalOrRemoteRepoSchema, MAX_REPOS_PER_REQUEST } from "./schemas.js";
1818
import { extractFirstPR, parseSince } from "./utils.js";
1919

2020
// ---------------------------------------------------------------------------
@@ -149,8 +149,10 @@ export function registerEcosystemActivityTool(server: FastMCP): void {
149149
repos: z
150150
.array(LocalOrRemoteRepoSchema)
151151
.min(1)
152-
.max(20)
153-
.describe("1–20 repos. Each is { owner, repo } or { localPath }."),
152+
.max(MAX_REPOS_PER_REQUEST)
153+
.describe(
154+
`1–${MAX_REPOS_PER_REQUEST} repos. Each is { owner, repo } or { localPath }. GitHub may throttle very large batches.`,
155+
),
154156
since: z.string().describe("ISO8601 or relative duration (e.g. '48h', '7d')."),
155157
paths: z.array(z.string()).optional().describe("Limit to commits touching these paths."),
156158
grep: z.string().optional().describe("Client-side regex filter on commit subjects."),

src/server/repo-status-tool.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { describe, expect, test } from "bun:test";
22

33
import { registerRepoStatusTool } from "./repo-status-tool.js";
4+
import { MAX_REPOS_PER_REQUEST } from "./schemas.js";
45
import { captureTool } from "./test-harness.js";
56
import { timeAgo } from "./utils.js";
67

@@ -51,6 +52,20 @@ describe("timeAgo", () => {
5152
// ---------------------------------------------------------------------------
5253

5354
describe("repo_status tool (captureTool)", () => {
55+
test(`batch size above legacy 20: ${MAX_REPOS_PER_REQUEST} localPath entries accepted`, async () => {
56+
const run = captureTool(registerRepoStatusTool);
57+
const repos = Array.from({ length: MAX_REPOS_PER_REQUEST }, () => ({
58+
localPath: "/tmp",
59+
}));
60+
const text = await run({ repos, format: "json" });
61+
const parsed = JSON.parse(text) as {
62+
repos?: Array<{ error?: { code: string } }>;
63+
};
64+
if (!parsed.repos) return; // no auth
65+
expect(parsed.repos).toHaveLength(MAX_REPOS_PER_REQUEST);
66+
expect(parsed.repos[0]?.error?.code).toBe("LOCAL_REPO_NO_REMOTE");
67+
});
68+
5469
test("LOCAL_REPO_NO_REMOTE: JSON format", async () => {
5570
const run = captureTool(registerRepoStatusTool);
5671
const text = await run({ repos: [{ localPath: "/tmp" }], format: "json" });

0 commit comments

Comments
 (0)