From 8cd3c6dc17bbb8219f6cb30db1646dbe5262009c Mon Sep 17 00:00:00 2001 From: MongLong0214 Date: Fri, 7 Aug 2026 18:49:01 +0900 Subject: [PATCH] Let the MCP server say whether it closed or was killed A session lost all seven commitlore tools mid-conversation, after four of them had returned real data. Afterwards nothing could establish whether the server had ever been running: `claude mcp list` reported it connected while no process existed, the client was not started with `--debug` so the server's stderr went to a pipe, and `ToolSearch` answers "no matching tools" for a withdrawn capability exactly as for one that never existed. The agent in that session fell back to the CLI without recognising a regression had happened. This does not fix that. The registration lives in the client and nothing here can restore it. What it fixes is the other half: the server now records its own start and exit under `.git/commitlore/`, so the question has an answer. The absent line is the signal. A start with no exit beside it, whose pid is not running, is a server that was killed rather than one that closed its session -- and the start line carries the version and the path it was launched from, which is how a stale plugin cache is identified after the fact. `doctor` reports it. Three things this file will not trade away: it swallows every failure, because a server refusing to start over a log would be worse than the bug being investigated; it writes inside `.git/`, which is already ignored; and it truncates itself, oldest half first, so a checkout that starts a server per session cannot accumulate without bound. Limit: the tool registration that was lost belongs to the client, so nothing in this repository can detect the loss from inside a session or restore it Ruled-out: reporting the loss from `doctor` by probing the MCP server | the server starts and answers on demand -- measured, 60 protocol requests and 24 tool calls with no crash -- so a probe reports healthy in exactly the situation being investigated Ruled-out: writing the log outside `.git/` so it survives a clone | it is evidence about one machine's processes, and a path that can reach a commit is a path that will Warn: this makes a silent withdrawal findable afterwards; it is not a fix and must not be described as one Blast: module Undo: easy Certainty: firm Verified: a session closed through stdin writes both lines and `doctor` stays ok; a SIGKILLed session leaves the start alone and `doctor` names its pid and time; a running server is not reported, so the check cannot fire on every healthy session Unverified: whether a killed server is what happened in the reported session -- the ordering of the plugin refresh against the loss was not establishable from any artifact, and this change exists so the next one is Provenance: authored Record-Id: r-mcplife424 --- dist/commands/doctor.js | 30 ++++ dist/commands/doctor.js.map | 2 +- dist/commitlore.mjs | 276 +++++++++++++++++++++++++----------- dist/mcp/lifecycle.d.ts | 68 +++++++++ dist/mcp/lifecycle.js | 165 +++++++++++++++++++++ dist/mcp/lifecycle.js.map | 1 + dist/mcp/server.js | 5 + dist/mcp/server.js.map | 2 +- src/commands/doctor.ts | 39 +++++ src/mcp/lifecycle.ts | 173 ++++++++++++++++++++++ src/mcp/server.ts | 5 + test/doctor.test.ts | 5 +- test/mcp-lifecycle.test.ts | Bin 0 -> 6194 bytes test/mcp.test.ts | 11 +- 14 files changed, 691 insertions(+), 91 deletions(-) create mode 100644 dist/mcp/lifecycle.d.ts create mode 100644 dist/mcp/lifecycle.js create mode 100644 dist/mcp/lifecycle.js.map create mode 100644 src/mcp/lifecycle.ts create mode 100644 test/mcp-lifecycle.test.ts diff --git a/dist/commands/doctor.js b/dist/commands/doctor.js index 7952ef72..d29857e7 100644 --- a/dist/commands/doctor.js +++ b/dist/commands/doctor.js @@ -37,6 +37,7 @@ import { collectRange } from '../core/squash.js'; import { parseCommitMessage } from '../core/trailers.js'; import { CLAUDE_HOOK_COMMAND, CLAUDE_HOOK_MARKER, claudeSettingsPath, readClaudeHookStatus, } from '../hooks/claude-settings.js'; import { HOOK_MARKER, commitMsgStub } from '../hooks/commit-msg.js'; +import { unfinishedRuns } from '../mcp/lifecycle.js'; /** Probe message for the git capability check — one trailer of each shape. */ const PROBE_MESSAGE = 'commitlore doctor probe\n\nLimit: probe\nBlast: local\n'; const EXACT_NOTES_REFSPEC = `+${NOTES_REF}:${NOTES_REF}`; @@ -505,6 +506,34 @@ const checkInjectVersion = (opts) => { } return check(id, title, 'warn', `the agent's hook runs ${theirs} but this CLI is ${mine} — every edit is graded by ${theirs}'s rules, not this one's`, 'update the installation the hook resolves to (for the plugin: /plugin marketplace update commitlore), then rerun: commitlore doctor'); }; +/** + * MCP servers that started here and never recorded an exit (#424). + * + * A session lost all seven commitlore tools mid-conversation while + * `claude mcp list` still reported the server connected and no process was + * running. Nothing on disk could say whether it had ever come up, because the + * client was not started with `--debug` and the server's stderr went to a pipe. + * + * `mcp/lifecycle.ts` now leaves a start and an exit line. A start with neither + * an exit beside it nor a live process is a server that was killed rather than + * one that closed its session — which is the observation nobody could make. + * + * A `warn`, and only about the past: it says what happened, not that anything + * is wrong now. Nothing here can restore a lost registration. + */ +const checkMcpLifecycle = (opts) => { + const title = 'MCP server sessions'; + const id = 'mcp-lifecycle'; + const cwd = opts.cwd ?? process.cwd(); + const unfinished = unfinishedRuns(cwd); + if (unfinished.length === 0) { + return check(id, title, 'ok', 'every recorded MCP session ended cleanly, or is still running'); + } + const last = unfinished[unfinished.length - 1]; + return check(id, title, 'warn', `${unfinished.length} MCP server session(s) started here and never recorded an exit — ` + + `most recently pid ${String(last?.pid ?? 0)} at ${last?.at ?? 'unknown'}. ` + + 'A killed server loses its tool registration in the client, which reports the same as a tool that never existed (#424)', 'restart the client session; if this repeats, capture it with a client started under --debug'); +}; const checkIndex = (opts) => { const cwd = opts.cwd ?? process.cwd(); let handle; @@ -679,6 +708,7 @@ export const runDoctor = (opts = {}) => { hookRuntime, checkInjectRuntime(opts), checkInjectVersion(opts), + checkMcpLifecycle(opts), checkGit(opts), checkHistoryDepth(opts), checkIndex(opts), diff --git a/dist/commands/doctor.js.map b/dist/commands/doctor.js.map index 9449cc19..3a39804c 100644 --- a/dist/commands/doctor.js.map +++ b/dist/commands/doctor.js.map @@ -1 +1 @@ -{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/commitlore.mjs b/dist/commitlore.mjs index dfcaebdf..a2656f71 100755 --- a/dist/commitlore.mjs +++ b/dist/commitlore.mjs @@ -7720,7 +7720,7 @@ var require_dist = __commonJS({ }); // src/cli.ts -import { readFileSync as readFileSync21 } from "node:fs"; +import { readFileSync as readFileSync22 } from "node:fs"; // node_modules/commander/lib/error.js var CommanderError = class extends Error { @@ -8897,7 +8897,7 @@ var Command = class _Command extends EventEmitter { this._outputConfiguration = { writeOut: (str) => process2.stdout.write(str), writeErr: (str) => process2.stderr.write(str), - outputError: (str, write) => write(str), + outputError: (str, write2) => write2(str), getOutHelpWidth: () => process2.stdout.isTTY ? process2.stdout.columns : void 0, getErrHelpWidth: () => process2.stderr.isTTY ? process2.stderr.columns : void 0, getOutHasColors: () => useColor() ?? (process2.stdout.isTTY && process2.stdout.hasColors?.()), @@ -10882,11 +10882,11 @@ Expecting one of '${allowedValues.join("', '")}'`); hasColors = this._outputConfiguration.getOutHasColors(); helpWidth = this._outputConfiguration.getOutHelpWidth(); } - const write = (str) => { + const write2 = (str) => { if (!hasColors) str = this._outputConfiguration.stripColor(str); return baseWrite(str); }; - return { error: error2, write, hasColors, helpWidth }; + return { error: error2, write: write2, hasColors, helpWidth }; } /** * Output help information for this command. @@ -14156,8 +14156,8 @@ var decodedCandidates = (text) => { ]) { for (const match of text.matchAll(scanner)) { const token = match[0].replace(/\s+/g, "").replace(/=+$/, ""); - for (let trim = 0; trim <= 3 && token.length - trim >= 16; trim += 1) { - const candidate = token.slice(0, trim === 0 ? void 0 : -trim); + for (let trim2 = 0; trim2 <= 3 && token.length - trim2 >= 16; trim2 += 1) { + const candidate = token.slice(0, trim2 === 0 ? void 0 : -trim2); if (candidate.length % 4 !== 1) { addDecoded(decoded, Buffer2.from(candidate, "base64")); } @@ -16179,9 +16179,9 @@ var register2 = (program3) => { // src/commands/demo.ts import { execFileSync } from "node:child_process"; -import { mkdtempSync, rmSync as rmSync3, writeFileSync as writeFileSync9, mkdirSync as mkdirSync8 } from "node:fs"; +import { mkdtempSync, rmSync as rmSync3, writeFileSync as writeFileSync10, mkdirSync as mkdirSync9 } from "node:fs"; import { tmpdir } from "node:os"; -import { dirname as dirname5, join as join7, resolve as resolve11 } from "node:path"; +import { dirname as dirname6, join as join8, resolve as resolve11 } from "node:path"; // src/demo/fixture.ts var targetPath = "src/services/cache.ts"; @@ -16219,9 +16219,9 @@ CommitLore-Version: 2.0.0 // src/commands/doctor.ts import { spawnSync as spawnSync3 } from "node:child_process"; -import { existsSync as existsSync7, readFileSync as readFileSync9, rmSync as rmSync2, writeFileSync as writeFileSync4 } from "node:fs"; +import { existsSync as existsSync7, readFileSync as readFileSync10, rmSync as rmSync2, writeFileSync as writeFileSync5 } from "node:fs"; import { tmpdir as tmpdirPath } from "node:os"; -import { join as join5, resolve as resolve6 } from "node:path"; +import { join as join6, resolve as resolve6 } from "node:path"; // src/core/hook-target.ts import { lstatSync, readFileSync as readFileSync7, realpathSync, statSync } from "node:fs"; @@ -16967,6 +16967,93 @@ var stubText = (unresolved) => [ var commitMsgStub = () => stubText(UNRESOLVED_GATE); var captureHookStub = () => stubText(UNRESOLVED_CAPTURE); +// src/mcp/lifecycle.ts +import { appendFileSync, mkdirSync as mkdirSync4, readFileSync as readFileSync9, writeFileSync as writeFileSync4, statSync as statSync3 } from "node:fs"; +import { dirname as dirname5, join as join5 } from "node:path"; +var MAX_BYTES = 64 * 1024; +var LIFECYCLE_FILE = "mcp-lifecycle.log"; +var lifecyclePath = (cwd = process.cwd()) => { + const result = execGit(["rev-parse", "--git-path", join5("commitlore", LIFECYCLE_FILE)], { cwd }); + if (result.code !== 0) return null; + const path2 = result.stdout.trim(); + return path2 === "" ? null : join5(cwd, path2); +}; +var trim = (path2) => { + try { + if (statSync3(path2).size <= MAX_BYTES) return; + const lines = readFileSync9(path2, "utf8").split("\n"); + writeFileSync4(path2, `${lines.slice(Math.floor(lines.length / 2)).join("\n")}`); + } catch { + } +}; +var write = (cwd, line2) => { + try { + const path2 = lifecyclePath(cwd); + if (path2 === null) return; + mkdirSync4(dirname5(path2), { recursive: true }); + appendFileSync(path2, `${line2} +`); + trim(path2); + } catch { + } +}; +var stamp = (at) => `${at.toISOString().slice(0, 19)}Z`; +var recordServerStart = (cwd = process.cwd(), at = /* @__PURE__ */ new Date()) => { + const entry = process.argv[1] ?? "unknown"; + write(cwd, `started ${stamp(at)} pid ${String(process.pid)} ${packageVersion()} ${entry}`); + let done = false; + const exit = (how) => { + if (done) return; + done = true; + write(cwd, `exited ${stamp(/* @__PURE__ */ new Date())} pid ${String(process.pid)} ${how}`); + }; + process.once("exit", () => { + exit("clean"); + }); + process.stdin.once("end", () => { + exit("stdin closed"); + }); + for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) { + process.once(signal, () => { + exit(signal); + process.exit(0); + }); + } +}; +var readLifecycle = (cwd = process.cwd()) => { + try { + const path2 = lifecyclePath(cwd); + if (path2 === null) return []; + return readFileSync9(path2, "utf8").split("\n").flatMap((line2) => { + const match = /^(started|exited)\s+(\S+)\s+pid\s+(\d+)\s*(.*)$/.exec(line2.trim()); + if (match === null) return []; + return [ + { + kind: match[1], + at: match[2] ?? "", + pid: Number(match[3]), + detail: (match[4] ?? "").trim() + } + ]; + }); + } catch { + return []; + } +}; +var unfinishedRuns = (cwd = process.cwd()) => { + const entries = readLifecycle(cwd); + const exited = new Set(entries.filter((e) => e.kind === "exited").map((e) => e.pid)); + return entries.filter((entry) => { + if (entry.kind !== "started" || exited.has(entry.pid)) return false; + try { + process.kill(entry.pid, 0); + return false; + } catch { + return true; + } + }); +}; + // src/commands/doctor.ts var PROBE_MESSAGE = "commitlore doctor probe\n\nLimit: probe\nBlast: local\n"; var EXACT_NOTES_REFSPEC = `+${NOTES_REF}:${NOTES_REF}`; @@ -17109,7 +17196,7 @@ var checkHook = (opts, runtime) => { if (!existsSync7(path2)) { return check(id, title, "warn", `no commit-msg hook at ${path2}; ${targetDetail}`, install); } - const contents = readFileSync9(path2, "utf8"); + const contents = readFileSync10(path2, "utf8"); if (!contents.includes(HOOK_MARKER)) { return check( id, @@ -17200,9 +17287,9 @@ var checkHookRuntime = (opts) => { if (located.code !== 0) return check(id, title, "warn", "not inside a git repository", fix); const hook = resolve6(cwd, located.stdout.trim()); if (!existsSync7(hook)) return check(id, title, "ok", "no hook installed \u2014 nothing to run"); - const probe = join5(tmpdirPath(), `commitlore-doctor-${String(process.pid)}.txt`); + const probe = join6(tmpdirPath(), `commitlore-doctor-${String(process.pid)}.txt`); try { - writeFileSync4(probe, PROBE_MESSAGE); + writeFileSync5(probe, PROBE_MESSAGE); const run = spawnSync3("/bin/sh", [hook, probe], { shell: false, encoding: "utf8", @@ -17385,6 +17472,23 @@ var checkInjectVersion = (opts) => { "update the installation the hook resolves to (for the plugin: /plugin marketplace update commitlore), then rerun: commitlore doctor" ); }; +var checkMcpLifecycle = (opts) => { + const title = "MCP server sessions"; + const id = "mcp-lifecycle"; + const cwd = opts.cwd ?? process.cwd(); + const unfinished = unfinishedRuns(cwd); + if (unfinished.length === 0) { + return check(id, title, "ok", "every recorded MCP session ended cleanly, or is still running"); + } + const last = unfinished[unfinished.length - 1]; + return check( + id, + title, + "warn", + `${unfinished.length} MCP server session(s) started here and never recorded an exit \u2014 most recently pid ${String(last?.pid ?? 0)} at ${last?.at ?? "unknown"}. A killed server loses its tool registration in the client, which reports the same as a tool that never existed (#424)`, + "restart the client session; if this repeats, capture it with a client started under --debug" + ); +}; var checkIndex = (opts) => { const cwd = opts.cwd ?? process.cwd(); let handle; @@ -17540,6 +17644,7 @@ var runDoctor = (opts = {}) => { hookRuntime, checkInjectRuntime(opts), checkInjectVersion(opts), + checkMcpLifecycle(opts), checkGit(opts), checkHistoryDepth(opts), checkIndex(opts), @@ -17577,19 +17682,19 @@ import { randomBytes as randomBytes7 } from "node:crypto"; import { chmodSync as chmodSync4, existsSync as existsSync11, - mkdirSync as mkdirSync7, - readFileSync as readFileSync13, + mkdirSync as mkdirSync8, + readFileSync as readFileSync14, realpathSync as realpathSync2, renameSync as renameSync6, - statSync as statSync3, + statSync as statSync4, unlinkSync as unlinkSync4, - writeFileSync as writeFileSync8 + writeFileSync as writeFileSync9 } from "node:fs"; -import { join as join6, resolve as resolve10 } from "node:path"; +import { join as join7, resolve as resolve10 } from "node:path"; // src/hooks/post-commit.ts import { createHash as createHash5, randomBytes as randomBytes4 } from "node:crypto"; -import { chmodSync, existsSync as existsSync8, mkdirSync as mkdirSync4, readFileSync as readFileSync10, readdirSync as readdirSync3, renameSync as renameSync3, writeFileSync as writeFileSync5 } from "node:fs"; +import { chmodSync, existsSync as existsSync8, mkdirSync as mkdirSync5, readFileSync as readFileSync11, readdirSync as readdirSync3, renameSync as renameSync3, writeFileSync as writeFileSync6 } from "node:fs"; import { resolve as resolve7 } from "node:path"; var POST_COMMIT_HOOK_MARKER = "# commitlore:post-commit:v1"; var POST_COMMIT_HOOK_NAME = "post-commit"; @@ -17601,7 +17706,7 @@ var hookFailure = (line2) => ({ code: 2, stdout: "", stderr: `commitlore: ${line var postCommitStub = () => captureHookStub().replaceAll("commit-msg", POST_COMMIT_HOOK_NAME).replaceAll('validate --message-file "$1"', "post-commit"); var writePostCommitHook = (path2) => { const temporary = `${path2}.tmp-${process.pid}-${randomBytes4(4).toString("hex")}`; - writeFileSync5(temporary, postCommitStub(), { mode: HOOK_MODE }); + writeFileSync6(temporary, postCommitStub(), { mode: HOOK_MODE }); chmodSync(temporary, HOOK_MODE); renameSync3(temporary, path2); }; @@ -17611,13 +17716,13 @@ var installPostCommitHook = (cwd = process.cwd()) => { const result = execGit(["rev-parse", "--git-path", `hooks/${POST_COMMIT_HOOK_NAME}`], { cwd }); if (result.code !== 0) return hookFailure(result.stderr.trim() || "not a git repository"); hookPath = resolve7(cwd, result.stdout.trim()); - mkdirSync4(resolve7(hookPath, ".."), { recursive: true }); + mkdirSync5(resolve7(hookPath, ".."), { recursive: true }); } catch (error2) { return hookFailure(error2 instanceof Error ? error2.message : String(error2)); } try { if (existsSync8(hookPath)) { - const current = readFileSync10(hookPath, "utf8"); + const current = readFileSync11(hookPath, "utf8"); if (!current.includes(POST_COMMIT_HOOK_MARKER)) { return hookFailure(`${hookPath} is not a commitlore hook \u2014 left in place`); } @@ -17642,7 +17747,7 @@ var resolvePendingDir2 = (cwd) => { }; var readPendingFile = (filePath) => { try { - const content = readFileSync10(filePath, "utf8"); + const content = readFileSync11(filePath, "utf8"); const parsed = JSON.parse(content); if (parsed["version"] !== 1) return null; return parsed; @@ -17739,7 +17844,7 @@ var register4 = (program3) => { // src/hooks/pre-push.ts import { randomBytes as randomBytes5 } from "node:crypto"; -import { chmodSync as chmodSync2, existsSync as existsSync9, mkdirSync as mkdirSync5, readFileSync as readFileSync11, renameSync as renameSync4, writeFileSync as writeFileSync6 } from "node:fs"; +import { chmodSync as chmodSync2, existsSync as existsSync9, mkdirSync as mkdirSync6, readFileSync as readFileSync12, renameSync as renameSync4, writeFileSync as writeFileSync7 } from "node:fs"; import { resolve as resolve8 } from "node:path"; // src/core/sync.ts @@ -17835,7 +17940,7 @@ var hookFailure2 = (line2) => ({ code: 2, stdout: "", stderr: `commitlore: ${lin var prePushStub = () => captureHookStub().replaceAll("commit-msg", PRE_PUSH_HOOK_NAME).replaceAll('validate --message-file "$1"', 'pre-push "$@"'); var writePrePushHook = (path2) => { const temporary = `${path2}.tmp-${process.pid}-${randomBytes5(4).toString("hex")}`; - writeFileSync6(temporary, prePushStub(), { mode: HOOK_MODE }); + writeFileSync7(temporary, prePushStub(), { mode: HOOK_MODE }); chmodSync2(temporary, HOOK_MODE); renameSync4(temporary, path2); }; @@ -17845,13 +17950,13 @@ var installPrePushHook = (cwd = process.cwd()) => { const result = execGit(["rev-parse", "--git-path", `hooks/${PRE_PUSH_HOOK_NAME}`], { cwd }); if (result.code !== 0) return hookFailure2(result.stderr.trim() || "not a git repository"); hookPath = resolve8(cwd, result.stdout.trim()); - mkdirSync5(resolve8(hookPath, ".."), { recursive: true }); + mkdirSync6(resolve8(hookPath, ".."), { recursive: true }); } catch (error2) { return hookFailure2(error2 instanceof Error ? error2.message : String(error2)); } try { if (existsSync9(hookPath)) { - const current = readFileSync11(hookPath, "utf8"); + const current = readFileSync12(hookPath, "utf8"); if (!current.includes(PRE_PUSH_HOOK_MARKER)) { return hookFailure2(`${hookPath} is not a commitlore hook \u2014 left in place`); } @@ -17887,7 +17992,7 @@ var register5 = (program3) => { // src/hooks/prepare-commit-msg.ts import { createHash as createHash6, randomBytes as randomBytes6 } from "node:crypto"; -import { chmodSync as chmodSync3, existsSync as existsSync10, mkdirSync as mkdirSync6, readFileSync as readFileSync12, readdirSync as readdirSync4, renameSync as renameSync5, writeFileSync as writeFileSync7 } from "node:fs"; +import { chmodSync as chmodSync3, existsSync as existsSync10, mkdirSync as mkdirSync7, readFileSync as readFileSync13, readdirSync as readdirSync4, renameSync as renameSync5, writeFileSync as writeFileSync8 } from "node:fs"; import { resolve as resolve9 } from "node:path"; var PREPARE_COMMIT_MSG_HOOK_MARKER = "# commitlore:prepare-commit-msg:v1"; var PREPARE_COMMIT_MSG_HOOK_NAME = "prepare-commit-msg"; @@ -17922,12 +18027,12 @@ var recordsFromSquashMessage = (cwd, message) => { var preserveSquashRecords = (messageFile, cwd = process.cwd()) => { const squashPath = squashMessagePath(cwd); if (squashPath === null || !existsSync10(squashPath)) return false; - const draft = readFileSync12(messageFile, "utf8"); + const draft = readFileSync13(messageFile, "utf8"); if (parseRecordBlocks(draft).some(isRecordBlock)) return false; - const blocks = recordsFromSquashMessage(cwd, readFileSync12(squashPath, "utf8")); + const blocks = recordsFromSquashMessage(cwd, readFileSync13(squashPath, "utf8")); if (blocks.length === 0) return false; const separator = draft.endsWith("\n\n") ? "" : draft.endsWith("\n") ? "\n" : "\n\n"; - writeFileSync7(messageFile, `${draft}${separator}${blocks.map((block) => serializeTrailers([...block])).join("\n")}`); + writeFileSync8(messageFile, `${draft}${separator}${blocks.map((block) => serializeTrailers([...block])).join("\n")}`); return true; }; var prepareHookPath = (cwd) => { @@ -17941,7 +18046,7 @@ var hookFailure3 = (line2) => ({ code: 2, stdout: "", stderr: `commitlore: ${lin ` }); var writePrepareHook = (path2) => { const temporary = `${path2}.tmp-${process.pid}-${randomBytes6(4).toString("hex")}`; - writeFileSync7(temporary, prepareCommitMsgStub(), { mode: HOOK_MODE }); + writeFileSync8(temporary, prepareCommitMsgStub(), { mode: HOOK_MODE }); chmodSync3(temporary, HOOK_MODE); renameSync5(temporary, path2); }; @@ -17949,13 +18054,13 @@ var installPrepareCommitMsgHook = (cwd = process.cwd()) => { let path2; try { path2 = prepareHookPath(cwd); - mkdirSync6(resolve9(path2, ".."), { recursive: true }); + mkdirSync7(resolve9(path2, ".."), { recursive: true }); } catch (error2) { return hookFailure3(error2 instanceof Error ? error2.message : String(error2)); } try { if (existsSync10(path2)) { - const current = readFileSync12(path2, "utf8"); + const current = readFileSync13(path2, "utf8"); if (!current.includes(PREPARE_COMMIT_MSG_HOOK_MARKER)) { return hookFailure3(`${path2} is not a commitlore hook \u2014 left in place`); } @@ -17978,7 +18083,7 @@ var resolvePendingDir3 = (cwd) => { }; var readPendingFile2 = (filePath) => { try { - const content = readFileSync12(filePath, "utf8"); + const content = readFileSync13(filePath, "utf8"); const parsed = JSON.parse(content); if (parsed["version"] !== 1) return null; return parsed; @@ -18031,7 +18136,7 @@ var applyCaptureRecord = (messageFile, cwd) => { const now = Date.now(); let currentMessage; try { - currentMessage = readFileSync12(messageFile, "utf8"); + currentMessage = readFileSync13(messageFile, "utf8"); } catch { return; } @@ -18050,7 +18155,7 @@ var applyCaptureRecord = (messageFile, cwd) => { const trailerBlock = buildTrailerBlock(pending.records); if (!trailerBlock) return; const separator = currentMessage.endsWith("\n\n") ? "" : currentMessage.endsWith("\n") ? "\n" : "\n\n"; - writeFileSync7(messageFile, `${currentMessage}${separator}${trailerBlock}`); + writeFileSync8(messageFile, `${currentMessage}${separator}${trailerBlock}`); const recordHash = createHash6("sha256").update(trailerBlock).digest("hex"); try { markApplied(pending.nonce, recordHash, { cwd }); @@ -18098,7 +18203,7 @@ var resolveHooksDir = (cwd) => { }; var isExecutable = (path2) => { try { - return (statSync3(path2).mode & 73) !== 0; + return (statSync4(path2).mode & 73) !== 0; } catch { return false; } @@ -18107,7 +18212,7 @@ var readHookState = (hookPath) => { if (!existsSync11(hookPath)) return "absent"; let contents; try { - contents = readFileSync13(hookPath, "utf8"); + contents = readFileSync14(hookPath, "utf8"); } catch { return "foreign"; } @@ -18116,8 +18221,8 @@ var readHookState = (hookPath) => { }; var readHookStatus = (cwd = process.cwd()) => { const hooksDir = resolveHooksDir(cwd); - const hookPath = join6(hooksDir, HOOK_NAME); - const chainedPath = join6(hooksDir, CHAINED_HOOK_NAME); + const hookPath = join7(hooksDir, HOOK_NAME); + const chainedPath = join7(hooksDir, CHAINED_HOOK_NAME); return { hooksDir, hookPath, @@ -18130,7 +18235,7 @@ var readHookStatus = (cwd = process.cwd()) => { }; var writeStub = (hookPath) => { const temporary = `${hookPath}.tmp-${process.pid}-${randomBytes7(4).toString("hex")}`; - writeFileSync8(temporary, commitMsgStub(), { mode: HOOK_MODE }); + writeFileSync9(temporary, commitMsgStub(), { mode: HOOK_MODE }); chmodSync4(temporary, HOOK_MODE); renameSync6(temporary, hookPath); }; @@ -18138,7 +18243,7 @@ var resolveEntryForRecord = (entry, cwd) => { if (entry === void 0 || entry === "") return null; const existingFile = (candidate) => { try { - return statSync3(candidate).isFile() ? candidate : null; + return statSync4(candidate).isFile() ? candidate : null; } catch { return null; } @@ -18170,7 +18275,7 @@ var installHook = (input = {}) => { const cwd = input.cwd ?? process.cwd(); let before; try { - mkdirSync7(resolveHooksDir(cwd), { recursive: true }); + mkdirSync8(resolveHooksDir(cwd), { recursive: true }); before = readHookStatus(cwd); } catch (error2) { return failure3(messageOf3(error2)); @@ -18218,12 +18323,12 @@ var CAPTURE_HOOKS = [ } ]; var removeCaptureHook = (hooksDir, hook) => { - const hookPath = join6(hooksDir, hook.name); - const chainedPath = join6(hooksDir, hook.chainedName); + const hookPath = join7(hooksDir, hook.name); + const chainedPath = join7(hooksDir, hook.chainedName); if (!existsSync11(hookPath)) return [`no ${hook.name} hook to remove: ${hookPath}`]; let contents; try { - contents = readFileSync13(hookPath, "utf8"); + contents = readFileSync14(hookPath, "utf8"); } catch { return [`${hookPath} was not installed by commitlore \u2014 left in place`]; } @@ -18535,25 +18640,25 @@ var runDemo = async (opts = {}) => { process.prependOnceListener("SIGINT", onSignal); process.prependOnceListener("SIGTERM", onSignal); try { - tmpDir = mkdtempSync(join7(opts.tmpRoot ?? tmpdir(), "commitlore-demo-")); + tmpDir = mkdtempSync(join8(opts.tmpRoot ?? tmpdir(), "commitlore-demo-")); const userCwd = resolve11(opts.cwd ?? process.cwd()); const tmpResolved = resolve11(tmpDir); if (tmpResolved === userCwd || tmpResolved.startsWith(userCwd + "/") || userCwd.startsWith(tmpResolved + "/")) { throw new Error("demo: temporary directory overlaps with user repository \u2014 aborting"); } - git(["init", "--quiet", "--template=", "--initial-branch=main", tmpDir], dirname5(tmpDir)); + git(["init", "--quiet", "--template=", "--initial-branch=main", tmpDir], dirname6(tmpDir)); git(["config", "user.name", "CommitLore Demo"], tmpDir); git(["config", "user.email", "demo@commitlore.example"], tmpDir); git(["config", "commit.gpgsign", "false"], tmpDir); - const targetFullPath = join7(tmpDir, targetPath); - mkdirSync8(dirname5(targetFullPath), { recursive: true }); - writeFileSync9(targetFullPath, "// session cache module\n"); + const targetFullPath = join8(tmpDir, targetPath); + mkdirSync9(dirname6(targetFullPath), { recursive: true }); + writeFileSync10(targetFullPath, "// session cache module\n"); git(["add", "."], tmpDir); git(["commit", "-m", predecessorCommitMessage], tmpDir); if (opts.crashTest === true) { throw new Error("demo: simulated crash for testing cleanup"); } - writeFileSync9(targetFullPath, "// session cache module \u2014 now using SQLite\n"); + writeFileSync10(targetFullPath, "// session cache module \u2014 now using SQLite\n"); git(["add", "."], tmpDir); git(["commit", "-m", successorCommitMessage], tmpDir); runInit({ cwd: tmpDir }); @@ -18610,7 +18715,7 @@ var register9 = (program3) => { }; // src/commands/harvest.ts -import { readFileSync as readFileSync14, writeFileSync as writeFileSync10 } from "node:fs"; +import { readFileSync as readFileSync15, writeFileSync as writeFileSync11 } from "node:fs"; var PREFIX2 = "commitlore:"; var USAGE_EXIT_CODE = 2; var skip2 = (reason) => ({ @@ -18621,7 +18726,7 @@ var skip2 = (reason) => ({ }); var readTextFile = (path2, label) => { try { - return readFileSync14(path2, "utf8"); + return readFileSync15(path2, "utf8"); } catch (error2) { const detail = error2 instanceof Error ? error2.message : String(error2); throw new Error(`cannot read ${label}: ${detail}`); @@ -18630,7 +18735,7 @@ var readTextFile = (path2, label) => { var emit2 = (payload, out) => { if (out === void 0) return { stdout: payload, stderr: "", exitCode: 0 }; try { - writeFileSync10(out, payload); + writeFileSync11(out, payload); } catch (error2) { const detail = error2 instanceof Error ? error2.message : String(error2); throw new Error(`cannot write --out: ${detail}`); @@ -18706,7 +18811,7 @@ var register10 = (program3) => { }; // src/commands/guard.ts -import { readFileSync as readFileSync15 } from "node:fs"; +import { readFileSync as readFileSync16 } from "node:fs"; var FLAGGED_EXIT_CODE = 1; var USAGE_EXIT_CODE2 = 2; var INCOMPLETE_EXIT_CODE = 3; @@ -18714,8 +18819,8 @@ var STDIN_FD = 0; var readProposal = (raw) => { if (!raw.startsWith("@")) return raw; const path2 = raw.slice(1); - if (path2 === "-") return readFileSync15(STDIN_FD, "utf8"); - return readFileSync15(path2, "utf8"); + if (path2 === "-") return readFileSync16(STDIN_FD, "utf8"); + return readFileSync16(path2, "utf8"); }; var matchThreshold = (raw) => { if (raw === void 0) return void 0; @@ -18906,12 +19011,12 @@ var register11 = (program3) => { }; // src/commands/harvest-verify.ts -import { readFileSync as readFileSync16, writeFileSync as writeFileSync11 } from "node:fs"; +import { readFileSync as readFileSync17, writeFileSync as writeFileSync12 } from "node:fs"; var PREFIX3 = "commitlore:"; var BAD_INPUT = 2; var readTextFile2 = (path2, label) => { try { - return readFileSync16(path2, "utf8"); + return readFileSync17(path2, "utf8"); } catch (error2) { const detail = error2 instanceof Error ? error2.message : String(error2); throw new Error(`cannot read ${label}: ${detail}`); @@ -18948,7 +19053,7 @@ var recordsPayload = (records) => `${JSON.stringify({ records }, null, 2)} var emit3 = (payload, out) => { if (out === void 0) return payload; try { - writeFileSync11(out, payload); + writeFileSync12(out, payload); } catch (error2) { const detail = error2 instanceof Error ? error2.message : String(error2); throw new Error(`cannot write --out: ${detail}`); @@ -19098,8 +19203,8 @@ var register13 = (program3) => { }; // src/commands/inject.ts -import { readFileSync as readFileSync17, realpathSync as realpathSync3 } from "node:fs"; -import { basename as basename2, dirname as dirname6, isAbsolute as isAbsolute2, join as join8, relative as relative2, resolve as resolve12, sep as sep2 } from "node:path"; +import { readFileSync as readFileSync18, realpathSync as realpathSync3 } from "node:fs"; +import { basename as basename2, dirname as dirname7, isAbsolute as isAbsolute2, join as join9, relative as relative2, resolve as resolve12, sep as sep2 } from "node:path"; // src/core/inject.ts import { createHash as createHash7 } from "node:crypto"; @@ -19446,7 +19551,7 @@ var MAX_PAYLOAD_PATH_LENGTH = 4096; var isPlainObject2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value); var readStdin = () => { try { - return readFileSync17(0, "utf8"); + return readFileSync18(0, "utf8"); } catch { return ""; } @@ -19475,9 +19580,9 @@ var canonical = (target) => { for (; ; ) { try { const real = realpathSync3(current); - return tail.length === 0 ? real : join8(real, ...tail); + return tail.length === 0 ? real : join9(real, ...tail); } catch { - const parent = dirname6(current); + const parent = dirname7(current); if (parent === current) return absolute; tail.unshift(basename2(current)); current = parent; @@ -29134,6 +29239,7 @@ var routeConsoleToStderr = () => { }; var startStdioServer = async (opts = {}) => { routeConsoleToStderr(); + recordServerStart(opts.cwd ?? process.cwd()); const server = createServer(opts); await server.connect(new StdioServerTransport()); return server; @@ -29342,7 +29448,7 @@ var register18 = (program3) => { }; // src/commands/squash-preserve.ts -import { readFileSync as readFileSync18, writeFileSync as writeFileSync12 } from "node:fs"; +import { readFileSync as readFileSync19, writeFileSync as writeFileSync13 } from "node:fs"; var PREFIX4 = "commitlore:"; var USAGE = "usage: commitlore squash-preserve .. [--target ] [--message-file ] [--json] [--force]"; var SHORT_SHA = 8; @@ -29383,14 +29489,14 @@ var warningsFor = (plan) => { }; var readDraft2 = (path2) => { try { - return readFileSync18(path2, "utf8"); + return readFileSync19(path2, "utf8"); } catch (error2) { throw new Error(`cannot read ${JSON.stringify(path2)}: ${messageOf5(error2)}`); } }; var writeDraft = (path2, text) => { try { - writeFileSync12(path2, text); + writeFileSync13(path2, text); } catch (error2) { throw new Error(`cannot write ${JSON.stringify(path2)}: ${messageOf5(error2)}`); } @@ -29527,7 +29633,7 @@ var register20 = (program3) => { }; // src/commands/validate.ts -import { readFileSync as readFileSync19 } from "node:fs"; +import { readFileSync as readFileSync20 } from "node:fs"; // src/hooks/secret-rules.ts var PLACEHOLDER_WORDS = /example|sample|placeholder|redacted|change[_-]?me|dummy|fake|your[_-]?|insert[_-]?|not[_-]?a?[_-]?real|test[_-]?(?:key|token|secret)/i; @@ -29890,14 +29996,14 @@ var readRange = (range, cwd) => { }; var readMessageFile = (path2) => { try { - return readFileSync19(path2, "utf8"); + return readFileSync20(path2, "utf8"); } catch (error2) { throw new Error(`cannot read ${JSON.stringify(path2)}: ${messageOf6(error2)}`); } }; var readStdinSync = () => { try { - return readFileSync19(0, "utf8"); + return readFileSync20(0, "utf8"); } catch (error2) { throw new Error(`cannot read the commit message from stdin: ${messageOf6(error2)}`); } @@ -30174,9 +30280,9 @@ var register21 = (program3) => { }; // src/commands/uninstall.ts -import { existsSync as existsSync12, readFileSync as readFileSync20, rmSync as rmSync4, writeFileSync as writeFileSync13 } from "node:fs"; +import { existsSync as existsSync12, readFileSync as readFileSync21, rmSync as rmSync4, writeFileSync as writeFileSync14 } from "node:fs"; import { homedir } from "node:os"; -import { join as join9 } from "node:path"; +import { join as join10 } from "node:path"; // src/core/agent-configs.ts var AGENT_CONFIGS = [ @@ -30239,17 +30345,17 @@ var withoutTomlBlock = (contents, wrapper) => { }; var runUninstall = async (options = {}) => { const home = options.home ?? homedir(); - const dataHome = options.dataHome ?? join9(home, ".local", "share"); + const dataHome = options.dataHome ?? join10(home, ".local", "share"); const dryRun = options.dryRun === true; const say = dryRun ? "would remove" : "removed"; const report = []; const removed = []; const kept = []; - const wrapper = join9(home, ".local", "bin", "commitlore"); + const wrapper = join10(home, ".local", "bin", "commitlore"); if (existsSync12(wrapper)) { const contents = (() => { try { - return readFileSync20(wrapper, "utf8"); + return readFileSync21(wrapper, "utf8"); } catch { return ""; } @@ -30263,18 +30369,18 @@ var runUninstall = async (options = {}) => { report.push(`kept: ${wrapper} \u2014 it carries no commitlore marker, so it was not written by this installer`); } } - const dataRoot = join9(dataHome, "commitlore"); + const dataRoot = join10(dataHome, "commitlore"); if (existsSync12(dataRoot)) { if (!dryRun) rmSync4(dataRoot, { recursive: true, force: true }); removed.push(dataRoot); report.push(`${say}: ${dataRoot}`); } for (const config2 of AGENT_CONFIGS) { - const path2 = join9(home, ...config2.homeRelativePath); + const path2 = join10(home, ...config2.homeRelativePath); if (!existsSync12(path2)) continue; let contents; try { - contents = readFileSync20(path2, "utf8"); + contents = readFileSync21(path2, "utf8"); } catch { kept.push(path2); report.push(`kept: ${path2} \u2014 it could not be read, so it was left untouched`); @@ -30283,7 +30389,7 @@ var runUninstall = async (options = {}) => { if (config2.format === "toml-mcp_servers") { const next2 = withoutTomlBlock(contents, wrapper); if (next2 === null) continue; - if (!dryRun) writeFileSync13(path2, next2); + if (!dryRun) writeFileSync14(path2, next2); removed.push(`${path2} (${SERVER_KEY} entry)`); report.push(`${say}: the ${SERVER_KEY} entry in ${path2}`); continue; @@ -30298,7 +30404,7 @@ var runUninstall = async (options = {}) => { } const next = withoutJsonEntry(parsed, config2.format, wrapper); if (next === null) continue; - if (!dryRun) writeFileSync13(path2, `${JSON.stringify(next, null, 2)} + if (!dryRun) writeFileSync14(path2, `${JSON.stringify(next, null, 2)} `); removed.push(`${path2} (${SERVER_KEY} entry)`); report.push(`${say}: the ${SERVER_KEY} entry in ${path2}`); @@ -30328,11 +30434,11 @@ var registerUninstall = (program3) => { var pkg = { version: packageVersion() }; var STDIN_FD2 = 0; var readMessage = (messageFile) => { - if (messageFile !== void 0) return readFileSync21(messageFile, "utf8"); + if (messageFile !== void 0) return readFileSync22(messageFile, "utf8"); if (process.stdin.isTTY) { throw new Error("no commit message on stdin \u2014 pipe one in or pass --message-file "); } - return readFileSync21(STDIN_FD2, "utf8"); + return readFileSync22(STDIN_FD2, "utf8"); }; var recordIdOf3 = (block) => block.trailers.find((trailer) => trailer.key === "Record-Id")?.value; var recordLabel = (index, total, block) => { diff --git a/dist/mcp/lifecycle.d.ts b/dist/mcp/lifecycle.d.ts new file mode 100644 index 00000000..5b4ae198 --- /dev/null +++ b/dist/mcp/lifecycle.d.ts @@ -0,0 +1,68 @@ +/** + * A record of this MCP server's own life, so a disconnect leaves evidence + * (#424). + * + * A session lost all seven commitlore tools mid-conversation after four of them + * had returned real data. From inside that session the failure was invisible: + * `ToolSearch` answers "no matching tools" for a capability that was withdrawn + * exactly as it does for one that never existed, so an agent cannot tell a + * regression from a repository that simply lacks the feature. `claude mcp list` + * reported the server connected while no process was running at all, so it + * cannot be used to check either. And the client was not started with + * `--debug`, so the server's stderr went to a pipe and nothing reached disk. + * + * **This does not fix that, and must not be described as fixing it.** The + * registration lives in the client. What is reachable from here is the other + * half of the problem: that nobody could say afterwards whether the server had + * even been running. Two lines on disk answer it — + * + * started 16:14:02 pid 49700 0.4.0 /…/cache/commitlore/commitlore/0.4.0 + * exited 16:16:31 pid 49700 clean + * + * — and their absence is itself the answer, because a start with no exit beside + * it is a server that was killed rather than one that closed its session. + * + * Three properties this file will not trade away: + * + * - **It never breaks the server.** Every failure is swallowed. A server that + * refused to start because it could not write a log would be a worse bug than + * the one being investigated. + * - **It stays inside `.git/`**, which is already ignored, so nothing here can + * reach a commit or a diff. + * - **It is bounded.** The file is truncated once it passes `MAX_BYTES`, oldest + * first, so a long-lived checkout cannot accumulate an unbounded log from a + * server that starts on every session. + */ +export declare const LIFECYCLE_FILE = "mcp-lifecycle.log"; +/** + * `.git/commitlore/mcp-lifecycle.log`, or `null` outside a repository. + * + * `rev-parse --git-path` rather than `.git/` by hand, so a linked worktree + * writes where its own git directory is. + */ +export declare const lifecyclePath: (cwd?: string) => string | null; +/** + * Records that this server came up, and arranges for its exit to be recorded + * too. + * + * The exit handlers are the point. A `started` line with no `exited` beside it + * is a server that was killed — which is exactly the shape #424 describes and + * exactly what nobody could establish afterwards. + */ +export declare const recordServerStart: (cwd?: string, at?: Date) => void; +export interface LifecycleEntry { + readonly kind: 'started' | 'exited'; + readonly at: string; + readonly pid: number; + readonly detail: string; +} +/** Parses the log. Unreadable or absent reads as empty — it is a breadcrumb trail. */ +export declare const readLifecycle: (cwd?: string) => LifecycleEntry[]; +/** + * Servers that started and never recorded an exit. + * + * The signal #424 needs: a start with no exit beside it did not close its + * session, it was killed. A pid still running is excluded — that one is simply + * the server currently serving. + */ +export declare const unfinishedRuns: (cwd?: string) => LifecycleEntry[]; diff --git a/dist/mcp/lifecycle.js b/dist/mcp/lifecycle.js new file mode 100644 index 00000000..4f7659b1 --- /dev/null +++ b/dist/mcp/lifecycle.js @@ -0,0 +1,165 @@ +/** + * A record of this MCP server's own life, so a disconnect leaves evidence + * (#424). + * + * A session lost all seven commitlore tools mid-conversation after four of them + * had returned real data. From inside that session the failure was invisible: + * `ToolSearch` answers "no matching tools" for a capability that was withdrawn + * exactly as it does for one that never existed, so an agent cannot tell a + * regression from a repository that simply lacks the feature. `claude mcp list` + * reported the server connected while no process was running at all, so it + * cannot be used to check either. And the client was not started with + * `--debug`, so the server's stderr went to a pipe and nothing reached disk. + * + * **This does not fix that, and must not be described as fixing it.** The + * registration lives in the client. What is reachable from here is the other + * half of the problem: that nobody could say afterwards whether the server had + * even been running. Two lines on disk answer it — + * + * started 16:14:02 pid 49700 0.4.0 /…/cache/commitlore/commitlore/0.4.0 + * exited 16:16:31 pid 49700 clean + * + * — and their absence is itself the answer, because a start with no exit beside + * it is a server that was killed rather than one that closed its session. + * + * Three properties this file will not trade away: + * + * - **It never breaks the server.** Every failure is swallowed. A server that + * refused to start because it could not write a log would be a worse bug than + * the one being investigated. + * - **It stays inside `.git/`**, which is already ignored, so nothing here can + * reach a commit or a diff. + * - **It is bounded.** The file is truncated once it passes `MAX_BYTES`, oldest + * first, so a long-lived checkout cannot accumulate an unbounded log from a + * server that starts on every session. + */ +import { appendFileSync, mkdirSync, readFileSync, writeFileSync, statSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { execGit } from '../core/git.js'; +import { packageVersion } from '../core/paths.js'; +/** Kept small: this is a breadcrumb trail, not telemetry. */ +const MAX_BYTES = 64 * 1024; +export const LIFECYCLE_FILE = 'mcp-lifecycle.log'; +/** + * `.git/commitlore/mcp-lifecycle.log`, or `null` outside a repository. + * + * `rev-parse --git-path` rather than `.git/` by hand, so a linked worktree + * writes where its own git directory is. + */ +export const lifecyclePath = (cwd = process.cwd()) => { + const result = execGit(['rev-parse', '--git-path', join('commitlore', LIFECYCLE_FILE)], { cwd }); + if (result.code !== 0) + return null; + const path = result.stdout.trim(); + return path === '' ? null : join(cwd, path); +}; +const trim = (path) => { + try { + if (statSync(path).size <= MAX_BYTES) + return; + const lines = readFileSync(path, 'utf8').split('\n'); + // Halve rather than clear: a truncation that emptied the file would destroy + // the start line whose absence is the thing worth noticing. + writeFileSync(path, `${lines.slice(Math.floor(lines.length / 2)).join('\n')}`); + } + catch { + // A log that cannot be trimmed is still a log. + } +}; +const write = (cwd, line) => { + try { + const path = lifecyclePath(cwd); + if (path === null) + return; + mkdirSync(dirname(path), { recursive: true }); + appendFileSync(path, `${line}\n`); + trim(path); + } + catch { + // Never break the server for a breadcrumb. + } +}; +/** ISO 8601, second precision — enough to line up against a client transcript. */ +const stamp = (at) => `${at.toISOString().slice(0, 19)}Z`; +/** + * Records that this server came up, and arranges for its exit to be recorded + * too. + * + * The exit handlers are the point. A `started` line with no `exited` beside it + * is a server that was killed — which is exactly the shape #424 describes and + * exactly what nobody could establish afterwards. + */ +export const recordServerStart = (cwd = process.cwd(), at = new Date()) => { + const entry = process.argv[1] ?? 'unknown'; + write(cwd, `started ${stamp(at)} pid ${String(process.pid)} ${packageVersion()} ${entry}`); + let done = false; + const exit = (how) => { + if (done) + return; + done = true; + write(cwd, `exited ${stamp(new Date())} pid ${String(process.pid)} ${how}`); + }; + process.once('exit', () => { + exit('clean'); + }); + // A client that goes away closes our stdin. That is the ordinary end of an + // MCP session and is worth telling apart from a signal. + process.stdin.once('end', () => { + exit('stdin closed'); + }); + for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) { + process.once(signal, () => { + exit(signal); + process.exit(0); + }); + } +}; +/** Parses the log. Unreadable or absent reads as empty — it is a breadcrumb trail. */ +export const readLifecycle = (cwd = process.cwd()) => { + try { + const path = lifecyclePath(cwd); + if (path === null) + return []; + return readFileSync(path, 'utf8') + .split('\n') + .flatMap((line) => { + const match = /^(started|exited)\s+(\S+)\s+pid\s+(\d+)\s*(.*)$/.exec(line.trim()); + if (match === null) + return []; + return [ + { + kind: match[1], + at: match[2] ?? '', + pid: Number(match[3]), + detail: (match[4] ?? '').trim(), + }, + ]; + }); + } + catch { + return []; + } +}; +/** + * Servers that started and never recorded an exit. + * + * The signal #424 needs: a start with no exit beside it did not close its + * session, it was killed. A pid still running is excluded — that one is simply + * the server currently serving. + */ +export const unfinishedRuns = (cwd = process.cwd()) => { + const entries = readLifecycle(cwd); + const exited = new Set(entries.filter((e) => e.kind === 'exited').map((e) => e.pid)); + return entries.filter((entry) => { + if (entry.kind !== 'started' || exited.has(entry.pid)) + return false; + try { + process.kill(entry.pid, 0); + return false; // still alive: this is the running server + } + catch { + return true; + } + }); +}; +//# sourceMappingURL=lifecycle.js.map \ No newline at end of file diff --git a/dist/mcp/lifecycle.js.map b/dist/mcp/lifecycle.js.map new file mode 100644 index 00000000..9ca16915 --- /dev/null +++ b/dist/mcp/lifecycle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/mcp/lifecycle.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/mcp/server.js b/dist/mcp/server.js index 65993df2..e71e3fa6 100644 --- a/dist/mcp/server.js +++ b/dist/mcp/server.js @@ -47,6 +47,7 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ListResourceTemplatesRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; import { toJson, withholdBlocked } from '../commands/query.js'; +import { recordServerStart } from './lifecycle.js'; import { buildReport, collectRecords } from '../commands/stale.js'; import { beforeChange } from '../core/before-change.js'; import { DEFAULT_THRESHOLD, guard, renderGuardMatch } from '../core/guard.js'; @@ -593,6 +594,10 @@ const routeConsoleToStderr = () => { /** Connects the server to this process's stdin/stdout. Resolves once listening. */ export const startStdioServer = async (opts = {}) => { routeConsoleToStderr(); + // #424: a session lost every commitlore tool mid-conversation and nothing on + // disk could say whether the server had been running. This leaves that much + // behind. It cannot fail the start — see `mcp/lifecycle.ts`. + recordServerStart(opts.cwd ?? process.cwd()); const server = createServer(opts); await server.connect(new StdioServerTransport()); return server; diff --git a/dist/mcp/server.js.map b/dist/mcp/server.js.map index a9141dde..cd6306f5 100644 --- a/dist/mcp/server.js.map +++ b/dist/mcp/server.js.map @@ -1 +1 @@ -{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/commands/doctor.ts b/src/commands/doctor.ts index 5238ce51..d21bb5be 100644 --- a/src/commands/doctor.ts +++ b/src/commands/doctor.ts @@ -57,6 +57,7 @@ import { readClaudeHookStatus, } from '../hooks/claude-settings.js'; import { HOOK_MARKER, commitMsgStub } from '../hooks/commit-msg.js'; +import { unfinishedRuns } from '../mcp/lifecycle.js'; /** * `skipped` is a check that exists but has nothing to inspect yet — it is not @@ -746,6 +747,43 @@ const checkInjectVersion = (opts: DoctorOptions): DoctorCheck => { ); }; +/** + * MCP servers that started here and never recorded an exit (#424). + * + * A session lost all seven commitlore tools mid-conversation while + * `claude mcp list` still reported the server connected and no process was + * running. Nothing on disk could say whether it had ever come up, because the + * client was not started with `--debug` and the server's stderr went to a pipe. + * + * `mcp/lifecycle.ts` now leaves a start and an exit line. A start with neither + * an exit beside it nor a live process is a server that was killed rather than + * one that closed its session — which is the observation nobody could make. + * + * A `warn`, and only about the past: it says what happened, not that anything + * is wrong now. Nothing here can restore a lost registration. + */ +const checkMcpLifecycle = (opts: DoctorOptions): DoctorCheck => { + const title = 'MCP server sessions'; + const id = 'mcp-lifecycle'; + const cwd = opts.cwd ?? process.cwd(); + const unfinished = unfinishedRuns(cwd); + + if (unfinished.length === 0) { + return check(id, title, 'ok', 'every recorded MCP session ended cleanly, or is still running'); + } + + const last = unfinished[unfinished.length - 1]; + return check( + id, + title, + 'warn', + `${unfinished.length} MCP server session(s) started here and never recorded an exit — ` + + `most recently pid ${String(last?.pid ?? 0)} at ${last?.at ?? 'unknown'}. ` + + 'A killed server loses its tool registration in the client, which reports the same as a tool that never existed (#424)', + 'restart the client session; if this repeats, capture it with a client started under --debug', + ); +}; + const checkIndex = (opts: DoctorOptions): DoctorCheck => { const cwd = opts.cwd ?? process.cwd(); let handle; @@ -990,6 +1028,7 @@ export const runDoctor = (opts: DoctorOptions = {}): DoctorReport => { hookRuntime, checkInjectRuntime(opts), checkInjectVersion(opts), + checkMcpLifecycle(opts), checkGit(opts), checkHistoryDepth(opts), checkIndex(opts), diff --git a/src/mcp/lifecycle.ts b/src/mcp/lifecycle.ts new file mode 100644 index 00000000..f9bc9843 --- /dev/null +++ b/src/mcp/lifecycle.ts @@ -0,0 +1,173 @@ +/** + * A record of this MCP server's own life, so a disconnect leaves evidence + * (#424). + * + * A session lost all seven commitlore tools mid-conversation after four of them + * had returned real data. From inside that session the failure was invisible: + * `ToolSearch` answers "no matching tools" for a capability that was withdrawn + * exactly as it does for one that never existed, so an agent cannot tell a + * regression from a repository that simply lacks the feature. `claude mcp list` + * reported the server connected while no process was running at all, so it + * cannot be used to check either. And the client was not started with + * `--debug`, so the server's stderr went to a pipe and nothing reached disk. + * + * **This does not fix that, and must not be described as fixing it.** The + * registration lives in the client. What is reachable from here is the other + * half of the problem: that nobody could say afterwards whether the server had + * even been running. Two lines on disk answer it — + * + * started 16:14:02 pid 49700 0.4.0 /…/cache/commitlore/commitlore/0.4.0 + * exited 16:16:31 pid 49700 clean + * + * — and their absence is itself the answer, because a start with no exit beside + * it is a server that was killed rather than one that closed its session. + * + * Three properties this file will not trade away: + * + * - **It never breaks the server.** Every failure is swallowed. A server that + * refused to start because it could not write a log would be a worse bug than + * the one being investigated. + * - **It stays inside `.git/`**, which is already ignored, so nothing here can + * reach a commit or a diff. + * - **It is bounded.** The file is truncated once it passes `MAX_BYTES`, oldest + * first, so a long-lived checkout cannot accumulate an unbounded log from a + * server that starts on every session. + */ + +import { appendFileSync, mkdirSync, readFileSync, writeFileSync, statSync } from 'node:fs'; +import { dirname, join } from 'node:path'; + +import { execGit } from '../core/git.js'; +import { packageVersion } from '../core/paths.js'; + +/** Kept small: this is a breadcrumb trail, not telemetry. */ +const MAX_BYTES = 64 * 1024; + +export const LIFECYCLE_FILE = 'mcp-lifecycle.log'; + +/** + * `.git/commitlore/mcp-lifecycle.log`, or `null` outside a repository. + * + * `rev-parse --git-path` rather than `.git/` by hand, so a linked worktree + * writes where its own git directory is. + */ +export const lifecyclePath = (cwd: string = process.cwd()): string | null => { + const result = execGit(['rev-parse', '--git-path', join('commitlore', LIFECYCLE_FILE)], { cwd }); + if (result.code !== 0) return null; + const path = result.stdout.trim(); + return path === '' ? null : join(cwd, path); +}; + +const trim = (path: string): void => { + try { + if (statSync(path).size <= MAX_BYTES) return; + const lines = readFileSync(path, 'utf8').split('\n'); + // Halve rather than clear: a truncation that emptied the file would destroy + // the start line whose absence is the thing worth noticing. + writeFileSync(path, `${lines.slice(Math.floor(lines.length / 2)).join('\n')}`); + } catch { + // A log that cannot be trimmed is still a log. + } +}; + +const write = (cwd: string, line: string): void => { + try { + const path = lifecyclePath(cwd); + if (path === null) return; + mkdirSync(dirname(path), { recursive: true }); + appendFileSync(path, `${line}\n`); + trim(path); + } catch { + // Never break the server for a breadcrumb. + } +}; + +/** ISO 8601, second precision — enough to line up against a client transcript. */ +const stamp = (at: Date): string => `${at.toISOString().slice(0, 19)}Z`; + +/** + * Records that this server came up, and arranges for its exit to be recorded + * too. + * + * The exit handlers are the point. A `started` line with no `exited` beside it + * is a server that was killed — which is exactly the shape #424 describes and + * exactly what nobody could establish afterwards. + */ +export const recordServerStart = (cwd: string = process.cwd(), at: Date = new Date()): void => { + const entry = process.argv[1] ?? 'unknown'; + write(cwd, `started ${stamp(at)} pid ${String(process.pid)} ${packageVersion()} ${entry}`); + + let done = false; + const exit = (how: string): void => { + if (done) return; + done = true; + write(cwd, `exited ${stamp(new Date())} pid ${String(process.pid)} ${how}`); + }; + + process.once('exit', () => { + exit('clean'); + }); + // A client that goes away closes our stdin. That is the ordinary end of an + // MCP session and is worth telling apart from a signal. + process.stdin.once('end', () => { + exit('stdin closed'); + }); + for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP'] as const) { + process.once(signal, () => { + exit(signal); + process.exit(0); + }); + } +}; + +export interface LifecycleEntry { + readonly kind: 'started' | 'exited'; + readonly at: string; + readonly pid: number; + readonly detail: string; +} + +/** Parses the log. Unreadable or absent reads as empty — it is a breadcrumb trail. */ +export const readLifecycle = (cwd: string = process.cwd()): LifecycleEntry[] => { + try { + const path = lifecyclePath(cwd); + if (path === null) return []; + return readFileSync(path, 'utf8') + .split('\n') + .flatMap((line) => { + const match = /^(started|exited)\s+(\S+)\s+pid\s+(\d+)\s*(.*)$/.exec(line.trim()); + if (match === null) return []; + return [ + { + kind: match[1] as 'started' | 'exited', + at: match[2] ?? '', + pid: Number(match[3]), + detail: (match[4] ?? '').trim(), + }, + ]; + }); + } catch { + return []; + } +}; + +/** + * Servers that started and never recorded an exit. + * + * The signal #424 needs: a start with no exit beside it did not close its + * session, it was killed. A pid still running is excluded — that one is simply + * the server currently serving. + */ +export const unfinishedRuns = (cwd: string = process.cwd()): LifecycleEntry[] => { + const entries = readLifecycle(cwd); + const exited = new Set(entries.filter((e) => e.kind === 'exited').map((e) => e.pid)); + return entries.filter((entry) => { + if (entry.kind !== 'started' || exited.has(entry.pid)) return false; + try { + process.kill(entry.pid, 0); + return false; // still alive: this is the running server + } catch { + return true; + } + }); +}; diff --git a/src/mcp/server.ts b/src/mcp/server.ts index 0feb9aa4..1fc4f4b6 100644 --- a/src/mcp/server.ts +++ b/src/mcp/server.ts @@ -59,6 +59,7 @@ import { } from '@modelcontextprotocol/sdk/types.js'; import { toJson, withholdBlocked, type JsonOutput } from '../commands/query.js'; +import { recordServerStart } from './lifecycle.js'; import { buildReport, collectRecords } from '../commands/stale.js'; import { beforeChange } from '../core/before-change.js'; import { DEFAULT_THRESHOLD, guard, renderGuardMatch } from '../core/guard.js'; @@ -672,6 +673,10 @@ const routeConsoleToStderr = (): void => { /** Connects the server to this process's stdin/stdout. Resolves once listening. */ export const startStdioServer = async (opts: McpServerOptions = {}): Promise => { routeConsoleToStderr(); + // #424: a session lost every commitlore tool mid-conversation and nothing on + // disk could say whether the server had been running. This leaves that much + // behind. It cannot fail the start — see `mcp/lifecycle.ts`. + recordServerStart(opts.cwd ?? process.cwd()); const server = createServer(opts); await server.connect(new StdioServerTransport()); return server; diff --git a/test/doctor.test.ts b/test/doctor.test.ts index 52c24249..87ce5190 100644 --- a/test/doctor.test.ts +++ b/test/doctor.test.ts @@ -540,7 +540,7 @@ describe('doctor: the pinned CLI is a different version than the running one (#3 expect(check?.status).not.toBe('ok'); expect(check?.detail).toContain('version'); expect(check?.fix).toContain('hooks install'); - expect(report.checks).toHaveLength(11); + expect(report.checks).toHaveLength(12); }); }); @@ -947,6 +947,7 @@ describe('doctor: report', () => { 'hook-runtime', 'inject-runtime', 'inject-version', + 'mcp-lifecycle', 'git-trailers', 'history-depth', 'index-health', @@ -968,7 +969,7 @@ describe('doctor: report', () => { const parsed = JSON.parse(JSON.stringify(report, null, 2)) as DoctorReport; expect(parsed).toEqual(report); - expect(parsed.checks).toHaveLength(11); + expect(parsed.checks).toHaveLength(12); for (const entry of parsed.checks) { expect(entry.status).toBeTypeOf('string'); expect(entry.id).toBeTypeOf('string'); diff --git a/test/mcp-lifecycle.test.ts b/test/mcp-lifecycle.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..b03d71d8f89792bcc4b608ebc90bfe4c471f7d3a GIT binary patch literal 6194 zcmb_g?QYz-6>b0eDcE!YX<~WEu?6 zhv*abNqP=RX*70rlK>46+mgu3d(S=hiHwVGL)3drM%LmZq`D5ka<(Cg>-&lZK56q_F8<^ zu7SopP?{nbx01GS!qkmFrS=jF?XH1NTNc8}wOB0_46w8v7FmiS0$%2o0+6;f20CV9 znwPSL@m0PQB@UZXKdY9t<+-|nP-9fiht)#Ec38Nybq@b@+CB2e_9bmq|hFvLaQhDAlBh!WP>p30}RsDz!rt|kY{o)lbV$EJm47o4|T3ov!aW( zLEshL-_K#FD)#qzE)D9rLe=*7uXS1Sv)BC!><|*%Ei4c*o?D*wz$_30dOBUTrG%FV z_GE8QS9H7hDBKc66`O!ZV(LO2fzoC1HhMmJv|Z~d>dw|CKM>V*p>6+XqpD?iz{$lA zAW#2PE}=$zs>1J;)s5;F?Vdez!vmXYiBoo0)H^Hi*~kh`d{=8^1gl(K-l*LjRA4A| z2K9b^eR^KM!iU|Ztu3)~Yq8HTe=W-cQ7D&NeT9?Mhb4mKfC1CNb_07{v$IouQ2CF8 zC0RCcHlKi(YBJYN_HM_FQqNSr&Pzp=Xof6KyH^LIH8X9rTd3l7Yg~V76p3)2^!sng z%^|5#=TPo7;(WW4DvS|f$dby1J$s0LB;eQ2UcG$#`sK@WaonMqMv&7T;L<>$tWrp> zz-=@-5J{FLqeoHF)1O~_fBFn!=$f>bi&YGa1i!Z_KC6HScE+uMnwj+o`NAS~U0g!S z#U(y>{z%i2IDRZX?g>x#H0VyQpbEs@BVj$?sQv+%ZdKk|hY&dujcwsbWa~UWhz$0pweWv(UwWpwMv`f_vcTE7Wc6)VCkeIsg~bR#(bCf*~lF zMHI4A6RfT-tYCzGl{NfQlMGgHV~GpG-0=VN8An~G5&docR~9Qh3G$4}qA>f3E}X4*)r(FrTC0ofS6QEVya?Ed5mZ7rY|zOknu{DUmwhq-{B zc4%Ybza7u_=4g{acpM-(KxXK#(zq}~(}5{3_0MY`0sOMgt~D5PjOv-h`6C&PvZj76 zZ`7$W^JbCWkM`^eyg0mkl7XvS{8Xi3Wb!Y9^&r|gM=1|!K%^2-oxH-1+e$Uq|57U;eoqvIkXo^4Qy z_HBo%N?tQ$BXPS4v{5CBYBy%dNODgDNMm?$Gz6_6PdfO3L+5Z_!OOPl%npR)`Q*)) z6N5Wc(b2jCk77Q<6fXH3PolWp-rUoe!k@iwWtpN)B&jwB;!lTf4-XIVghvK6;*Ha* zcRT{x&&?ROcOyD*lNg1x5XaCuZ;&l=PIU@2VebFpK#%z)(&FnQ-RI1>`_}_~3k-a= zec%LhH`uq|vq~=S20P=Guy$0v6}7hjMsGr@@kT*)*B>1-s}@5JZ!OBYzQ!HGwSp6J z>ENzror!|3lM-Ctr2;+kPHlep5s zc`RtS?qIA48HGv9TN$C}1|uQIawt5(PqL%G1PQk@q)Eue-8}{_7I0A(Z+5=M|J|0a zBLJ1_lF!yvy(@1K-mi`x`V3z_85^KqJN=13{xd1<-m%%WH zK@L}8V4S~}lqf69+G)i1dM6$F!4PzT$X~Mci|4R`PGevEO$}woQ9so5FnsS$VZHnB z!bR^tRi8lSZh^l=l&@mdU@@|!Yy3S_m^k5VKoI*9o#u-|2pi0CTcG2m7J^pFUxpe5SWTq$AEsg*6^3xp&$pM!hk=`R$v&D~xpi8mDq?cg@!w)Hbs}hfb}_ O<)1t|fXI%T|NjTcsN3cM literal 0 HcmV?d00001 diff --git a/test/mcp.test.ts b/test/mcp.test.ts index 7601e48c..6cf2446b 100644 --- a/test/mcp.test.ts +++ b/test/mcp.test.ts @@ -45,7 +45,7 @@ const SERVER_MODULE = fileURLToPath(new URL('../dist/mcp/server.js', import.meta const CLI = fileURLToPath(new URL('../dist/cli.js', import.meta.url)); /** The files this ticket owns. The source guards below scan exactly these. */ -const OWNED_SOURCES = ['mcp/server.ts', 'mcp/main.ts', 'commands/mcp.ts']; +const OWNED_SOURCES = ['mcp/server.ts', 'mcp/main.ts', 'mcp/lifecycle.ts', 'commands/mcp.ts']; const PROTOCOL_VERSION = '2025-11-25'; const SUPPORTED_PROTOCOL_VERSIONS = ['2025-11-25', '2025-06-18', '2025-03-26', '2024-11-05']; @@ -1046,7 +1046,14 @@ describe('no network, by inspection', () => { readFileSync(join(PACKAGE_ROOT, 'src', relative), 'utf8'); it('scans every file this ticket owns', () => { - expect(readdirSync(join(PACKAGE_ROOT, 'src', 'mcp')).sort()).toEqual(['main.ts', 'server.ts']); + // The point of this list: a file added to `src/mcp/` must be added to + // `OWNED_SOURCES` too, or the no-network inspection below would silently + // stop covering the whole directory. + expect(readdirSync(join(PACKAGE_ROOT, 'src', 'mcp')).sort()).toEqual([ + 'lifecycle.ts', + 'main.ts', + 'server.ts', + ]); }); it('contains no HTTP client of any kind', () => {