Skip to content

Commit b26bb55

Browse files
authored
Merge pull request #146 from karthikcsq/t3code/contributing-138
Add CONTRIBUTING.md (#138); 3.4.4
2 parents 665a605 + e2bd6ed commit b26bb55

7 files changed

Lines changed: 185 additions & 21 deletions

File tree

CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,29 @@ came from. Planning notes under `docs/plans/` and `.planning/` are not logged.
1818
The 2.0.0 entry predates this convention and collapses thirteen pull requests
1919
into one release.
2020

21+
## [3.4.4] - 2026-09-03
22+
23+
PR [#146](https://github.com/karthikcsq/google-tools-mcp/pull/146) by
24+
[@ElliotDrel](https://github.com/ElliotDrel): `CONTRIBUTING.md`; version 3.4.4.
25+
26+
### Added
27+
28+
- `CONTRIBUTING.md` (#138): the rules a change has to follow that no single
29+
file in the repo stated. The read-before-write model (`guardMutation`, the
30+
fifteen Docs tools that open a lease through `beginDocsMutation`, the three
31+
Sheets tools and `deleteFile` that call the guard directly, and how a read
32+
handle differs from the in-process tracker), the seeding rule for any tool
33+
that creates or copies a file ("trustworthy or not at all", with the #135
34+
`createSpreadsheet` / `copyFile` gap as the reason the rule is written down),
35+
the working-copy lifecycle (which copy is canonical, rewrite, staleness,
36+
cleanup and retention), the error boundary (caught error text never reaches
37+
`publicError` or a persisted diagnostic), how to read a test run (`Test
38+
Suites:` is the line that matters, since a suite that fails to link reports
39+
zero failed tests), the inventory snapshot, the one-entry-per-PR changelog
40+
and version bump, and the live-testing safety boundary. Every file, function,
41+
anchor, and test named in it was checked against `main` before it landed.
42+
`README.md` and `docs/README.md` link to it.
43+
2144
## [3.4.3] - 2026-09-02
2245

2346
PR [#144](https://github.com/karthikcsq/google-tools-mcp/pull/144) by

CONTRIBUTING.md

Lines changed: 133 additions & 0 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ npm install -g google-tools-mcp@latest
316316
(or just re-run `npx -y google-tools-mcp setup`, which does the same install and re-points your MCP config). The server also helps you notice: on startup, after the MCP connection is already established, it makes a strictly time-boxed (2s), non-blocking, at-most-once-per-24-hours check against the npm registry for the latest published version, and logs a one-line warning if you're behind. This check runs after the connection handshake and is never awaited, so a slow or unreachable network can't delay or reintroduce the `npx` startup-timeout race this section is about; worst case, it just never gets to print the notice.
317317
## Development / Contributing
318318

319-
Contributor-facing deep dives live in [`docs/`](docs/README.md), indexed there.
319+
Contributor-facing deep dives live in [`docs/`](docs/README.md), indexed there. The rules a change has to follow (read-before-write guard, seeding after create/copy, working copies, the error boundary, how to read a test run, changelog and version) are in [`CONTRIBUTING.md`](CONTRIBUTING.md).
320320

321321
`dist/` is the hand-edited source for this repository. It contains plain JavaScript; there is no TypeScript, bundler, or build step.
322322

docs/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ The main README is the user-facing guide: install, configure, tool reference, tr
66

77
## Index
88

9+
- [Contributing](../CONTRIBUTING.md) — the rules a change has to follow that no single file states: the read-before-write guard and which surfaces it covers, seeding read state after create/copy ("trustworthy or not at all"), working-copy lifecycle, the error boundary, reading the `Test Suites:` line, the inventory snapshot, and the one-entry-per-PR changelog and version bump.
910
- [How this repo works](architecture.md) — why `dist/` is the source and there is no build step, the entry point and its subcommands, transports, how the 12 tool categories load and what the `addTool` wrapper does for free, auth and config layout, tests, and how to add a tool.
1011
- [Shared HTTP mode](http-mode.md) — running one long-lived server for many clients, the 3.0.0 stateless-HTTP breaking change (removed `/sse`, `/messages`, `/ping`, session routes, and `Mcp-Session-Id`), the `readHandle` contract for edits over HTTP, and exact Claude Code / Codex reconfiguration steps.
1112
- [Remote OAuth tunnel](remote-oauth-tunnel.md) — completing the OAuth flow when the server runs on a machine with no browser.

docs/plans/SESSION-STATE.md

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,16 @@ the `v*` tag. Merging is allowed. Only Elliot clears #50, and no tag is pushed b
1111

1212
## Where things stand
1313

14-
`main` = `55d8c65` (PR #143 merged 2026-09-02). Work in flight is on branch
15-
`t3code/release-readiness` in worktree
16-
`C:\Users\2supe\.t3\worktrees\google-tools-mcp\t3code-55278c06`, going out as PR #144.
14+
`main` = `665a605` (PR #144 merged 2026-09-02; #143 before it). Work in flight is on branch
15+
`t3code/contributing-138` in worktree
16+
`C:\Users\2supe\.t3\worktrees\google-tools-mcp\t3code-55278c06`: CONTRIBUTING.md for #138,
17+
going out as PR #146 with changelog entry 3.4.4 and `package.json` 3.4.4. It changes no
18+
runtime code, so the live missions and `live-smoke` were re-run on `665a605` while it was
19+
being written and only the static gates need a re-run after it merges. The subagent that
20+
drafted it was cut off by a rate limit on 2026-09-02 before verifying anything; every file,
21+
function, anchor, test, and PR number in the draft was then checked by hand on 2026-09-03
22+
(all held), and the README / docs index pointers, changelog entry, and bump were added by hand.
23+
Gates on the branch: 96 suites / 1419 passed / 2 skipped, audit 0, pack 185 files 396.7 kB.
1724

1825
Versioning changed on 2026-09-02: `CHANGELOG.md` now has one entry per merged PR with its own
1926
semantic version (Elliot's convention; "it's OK if we end up at a different version than 3").
@@ -28,10 +35,10 @@ entry and bumps `package.json` to it (RELEASING.md, "Release a version").
2835
| `npm pack --dry-run` | 185 files, 396.6 kB; no `tests/`, `live/`, `scripts/live-*`, `.husky`, `.planning` |
2936
| `package.json` version | 3.4.3 |
3037
| `npm run live-coverage` | 31 covered / 129 not covered / 2 blocked by design, exit 0 |
31-
| Live vs real API (2026-09-02) | `verify-comment-collateral` PASS 15 calls (1 intended block refusal), 1/1 cleaned, sandbox 0 after; earlier the same day on `main`: `harness-selftest` PASS, `verify-created-resource-tracking` PASS, `agent-loop-2-fixes` PASS, `live-smoke` 22/22 with 0 leftovers |
38+
| Live vs real API on `main` `665a605` (2026-09-02 20:13-20:20 UTC) | `harness-selftest` PASS (7 calls, 1 intended refusal, 3/3 trashed), `verify-created-resource-tracking` PASS (Slides deny holds, 2/2 trashed), `agent-loop-2-fixes` PASS (19 calls, 3 intended wrong-shape failures, 5/5 trashed), `verify-comment-collateral` PASS (15 calls, 1 intended block refusal, 1/1 trashed); sandbox 0 items after every run. `live-smoke` run `2026-09-02T20-15-21-994-96c4`: 22 passed / 0 failed / 0 skipped, cleanup 28/28 trashed with 0 failures, 0 drafts left, 0 stdout leaks |
3239
| #50 protection rules | still `[]` as of 2026-09-02 |
3340

34-
## What PR #144 carries
41+
## What PR #144 carried (merged as `665a605`)
3542

3643
1. **Fix: comment tools left the tracked Docs revision stale.** `addComment`, `replyToComment`,
3744
`resolveComment`, `updateComment`, `deleteComment` each advance the Docs `revisionId` while
@@ -48,10 +55,10 @@ entry and bumps `package.json` to it (RELEASING.md, "Release a version").
4855
the 5 the split deliberately re-wrapped; chain order matches `git log --first-parent`).
4956
3. `package.json`/lock 3.4.3, RELEASING.md per-PR convention, this file.
5057

51-
Not fixed, filed as a follow-up (see "Open issues"): a **collaborator's** comment made in the
52-
Docs UI moves the revision the same way, and nothing in-process can see it, so the next write
53-
reports the same conflict and a re-read clears it. The message is correct; it is just one round
54-
trip more than necessary.
58+
Not fixed, filed as [#145](https://github.com/karthikcsq/google-tools-mcp/issues/145): a
59+
**collaborator's** comment made in the Docs UI moves the revision the same way, and nothing
60+
in-process can see it, so the next write reports the same conflict and a re-read clears it. The
61+
message is correct; it is just one round trip more than necessary.
5562

5663
## The one blocker
5764

@@ -89,13 +96,13 @@ doctor` on a machine with Codex or Claude Code installed (CI has neither client)
8996
| Issue | Disposition |
9097
| --- | --- |
9198
| [#50](https://github.com/karthikcsq/google-tools-mcp/issues/50) | **The blocker.** Elliot's repo-settings action. |
92-
| [#141](https://github.com/karthikcsq/google-tools-mcp/issues/141) | Fixed on `main` since #86 (PR #110): `listComments` field mask includes `replies(...)` and `replyCount` is derived from it. Confirmed live 2026-09-02 by `issue-86-comment-reply-awareness` and `verify-comment-collateral`. Close with the evidence. |
93-
| [#142](https://github.com/karthikcsq/google-tools-mcp/issues/142) | Suggestion 2 (warn at push time) shipped in #88 (PR #110): `replaceDocumentWithMarkdown` names every unresolved comment anchor it removes, `onCollateral='block'` refuses, `dryRun` previews. Confirmed live 2026-09-02. Suggestion 1 (listComments flags orphaned threads) not built: Drive keeps the thread record and its `quotedFileContent` after the anchor is gone, so the only way to detect an orphan is to search the current body for the quoted text, which false-positives on any repeated sentence. Close: the push-time warning is the signal. |
94-
| [#136](https://github.com/karthikcsq/google-tools-mcp/issues/136) | Out of scope for this release, flagged. #119 already handles a backwards `modifiedTime` (keeps the newer baseline, warns, lets the WriteControl revision guard the write). New data point for whoever builds it: comment writes move `revisionId` with `modifiedTime` unchanged, so "revision moved, timestamp did not" is a coherent transition, not an incoherent one. |
95-
| [#137](https://github.com/karthikcsq/google-tools-mcp/issues/137) | Out of scope for this release, flagged: a workspace-path refactor of two tools with a concurrency test, not a bug in shipped behaviour. |
96-
| [#138](https://github.com/karthikcsq/google-tools-mcp/issues/138) | Relevant and cheap: CONTRIBUTING.md. Being written on its own branch/PR after #144 merges (entry 3.4.4). |
99+
| [#141](https://github.com/karthikcsq/google-tools-mcp/issues/141) | **CLOSED 2026-09-02** ([comment](https://github.com/karthikcsq/google-tools-mcp/issues/141#issuecomment-5515730313)). Fixed since #86 (PR #110): `listComments` field mask includes `replies(...)`, `replyCount` derived from it; `resolveComment` verifies and throws. Confirmed live by `verify-comment-collateral`. |
100+
| [#142](https://github.com/karthikcsq/google-tools-mcp/issues/142) | **CLOSED 2026-09-02** ([comment](https://github.com/karthikcsq/google-tools-mcp/issues/142#issuecomment-5515730779)). Suggestion 2 shipped in #88 (PR #110): collateral report, `onCollateral='block'`, `dryRun`. Suggestion 1 declined with reasoning (no anchor-validity field; quoted-text search false-positives on repeated sentences). |
101+
| [#136](https://github.com/karthikcsq/google-tools-mcp/issues/136) | **Flagged out of scope, labelled `enhancement`, stays open** ([comment](https://github.com/karthikcsq/google-tools-mcp/issues/136#issuecomment-5515741565)): #119's `modifiedTimeWentBackwards` already covers the backwards timestamp; noted that "revision moved, modifiedTime did not" is a coherent comment-write transition. |
102+
| [#137](https://github.com/karthikcsq/google-tools-mcp/issues/137) | **Flagged out of scope, labelled `enhancement`, stays open** ([comment](https://github.com/karthikcsq/google-tools-mcp/issues/137#issuecomment-5515742120)): gap re-checked on `main`, still as described; refactor + concurrency test, not a shipped defect. |
103+
| [#138](https://github.com/karthikcsq/google-tools-mcp/issues/138) | **In progress**: CONTRIBUTING.md on `t3code/contributing-138` (subagent writing, every claim to be verified against the repo before the PR opens). Entry 3.4.4. |
104+
| [#145](https://github.com/karthikcsq/google-tools-mcp/issues/145) | **Filed 2026-09-02** as the #144 follow-up: collaborator UI comment -> conflict until re-read; target-less handle writes stay pinned (`guardTargets` returns at `normalized.length === 0` without re-arming). Not a blocker. |
97105
| [#130](https://github.com/karthikcsq/google-tools-mcp/issues/130) | Elliot ruled it deferred on 2026-09-01. Flagged, untouched. |
98-
| follow-up (to file) | Collaborator UI comment -> next write reports a revision conflict until re-read. Also note the handle path: `docsHandles.guardTargets` re-arms on a revision-only change when targets are given, but a target-less write (`replaceDocumentWithMarkdown` over HTTP) still conflicts. |
99106

100107
## Standing rules that must survive compaction
101108

@@ -136,5 +143,5 @@ verify/live-smoke-on-fixes 5e5d0e6ffcb51d84b573e7b605f8fbf5e584ec6f
136143
stash@{0} (WIP #71) 5579ea3f2a7e470047466ce067dade9c40ca042c
137144
```
138145

139-
Remote branch `t3code/review-main-changes-npm-readiness` (PR #143, merged) can be deleted once
140-
nothing checks it out.
146+
Remote branches `t3code/review-main-changes-npm-readiness` (#143) and `t3code/release-readiness`
147+
(#144) were deleted on 2026-09-02 after their merges; both are reachable from `main`.

package-lock.json

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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "google-tools-mcp",
3-
"version": "3.4.3",
3+
"version": "3.4.4",
44
"description": "The easiest MCP server for Google Workspace — Drive, Docs, Sheets, Gmail, Calendar, Forms, Slides, and Tasks. 160 tools with one-click browser auth. Read Word docs, PDFs, and spreadsheets straight from Drive.",
55
"type": "module",
66
"bin": {

0 commit comments

Comments
 (0)