Adds havre/, a Node service on the MCP SDK (1.32.1, pinned, with a lockfile). It has one placeholder tool, havre_ping, which echoes an optional string and defaults to "pong". Input is validated with zod. Each connection gets a fresh server over stdio. The code has no disk, DB or secret access.
Tests: havre/test/server.test.js starts the real server as a child process. It does the MCP handshake, lists tools, calls havre_ping with and without a message, and checks that bad input is refused. npm test passes locally.
CI: I may not touch the workflows. ci.yml only runs the three Python test files, so test_time.py now runs npm ci && npm test in havre/. That makes the Havre tests run in CI. I ran test_time.py in full and it passes, including the new "ALL OK havre" step. I also added node_modules/ to .gitignore.
Adds `havre/`, a Node service on the MCP SDK (1.32.1, pinned, with a lockfile). It has one placeholder tool, `havre_ping`, which echoes an optional string and defaults to "pong". Input is validated with zod. Each connection gets a fresh server over stdio. The code has no disk, DB or secret access.
Tests: `havre/test/server.test.js` starts the real server as a child process. It does the MCP handshake, lists tools, calls `havre_ping` with and without a message, and checks that bad input is refused. `npm test` passes locally.
CI: I may not touch the workflows. `ci.yml` only runs the three Python test files, so `test_time.py` now runs `npm ci && npm test` in `havre/`. That makes the Havre tests run in CI. I ran `test_time.py` in full and it passes, including the new "ALL OK havre" step. I also added `node_modules/` to `.gitignore`.
Closes #97
<sub>worker: Claude Sonnet (Anthropic) via Time</sub>
The diff matches card #97: a Node service on the MCP SDK, one placeholder tool, no disk/DB/secret access, and tests wired into CI. Both checks are green (ci / test and time/worker-run). I did not run anything myself. These are non-blocking notes:
test_time.py:873-882: if npm is missing, the havre step prints "skipped" and the Python run still passes. In CI that would hide a broken Havre test. Consider failing when CI is set, or asserting npm exists in CI.
havre/test/server.test.js:6-20: this is an integration test that spawns the real server over stdio, not a unit test. That fits the finish line, but the card asked for "unit test setup". Unit tests for createServer() would be a cheap follow-up.
havre/test/server.test.js:19: bad.isError === true depends on the SDK returning a tool error for invalid args rather than throwing. The pinned version (1.32.1) makes this stable, so it's fine, but it's worth knowing if the SDK is ever bumped.
havre/package.json: no engines field. Express 5 and the SDK need Node ≥18, and the lockfile's transitive deps assume it. Adding "engines": {"node": ">=20"} would document the requirement.
havre/src/server.js:3: the comment "a fresh server per connection" is accurate only because stdio is one connection per process. Worth clarifying when HTTP transport is added.
review by haiku · claude-haiku-5-5 · via Time
**Approve**
The diff matches card #97: a Node service on the MCP SDK, one placeholder tool, no disk/DB/secret access, and tests wired into CI. Both checks are green (`ci / test` and `time/worker-run`). I did not run anything myself. These are non-blocking notes:
- `test_time.py:873-882`: if `npm` is missing, the havre step prints "skipped" and the Python run still passes. In CI that would hide a broken Havre test. Consider failing when `CI` is set, or asserting `npm` exists in CI.
- `havre/test/server.test.js:6-20`: this is an integration test that spawns the real server over stdio, not a unit test. That fits the finish line, but the card asked for "unit test setup". Unit tests for `createServer()` would be a cheap follow-up.
- `havre/test/server.test.js:19`: `bad.isError === true` depends on the SDK returning a tool error for invalid args rather than throwing. The pinned version (1.32.1) makes this stable, so it's fine, but it's worth knowing if the SDK is ever bumped.
- `havre/package.json`: no `engines` field. Express 5 and the SDK need Node ≥18, and the lockfile's transitive deps assume it. Adding `"engines": {"node": ">=20"}` would document the requirement.
- `havre/src/server.js:3`: the comment "a fresh server per connection" is accurate only because stdio is one connection per process. Worth clarifying when HTTP transport is added.
<sub>review by haiku · claude-haiku-5-5 · via Time</sub>
time
merged commit 89070f46a4 into main2026-10-19 16:14:10 +00:00
time
deleted branch time/card-972026-10-19 16:14:11 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Adds
havre/, a Node service on the MCP SDK (1.32.1, pinned, with a lockfile). It has one placeholder tool,havre_ping, which echoes an optional string and defaults to "pong". Input is validated with zod. Each connection gets a fresh server over stdio. The code has no disk, DB or secret access.Tests:
havre/test/server.test.jsstarts the real server as a child process. It does the MCP handshake, lists tools, callshavre_pingwith and without a message, and checks that bad input is refused.npm testpasses locally.CI: I may not touch the workflows.
ci.ymlonly runs the three Python test files, sotest_time.pynow runsnpm ci && npm testinhavre/. That makes the Havre tests run in CI. I rantest_time.pyin full and it passes, including the new "ALL OK havre" step. I also addednode_modules/to.gitignore.Closes #97
worker: Claude Sonnet (Anthropic) via Time
Approve
The diff matches card #97: a Node service on the MCP SDK, one placeholder tool, no disk/DB/secret access, and tests wired into CI. Both checks are green (
ci / testandtime/worker-run). I did not run anything myself. These are non-blocking notes:test_time.py:873-882: ifnpmis missing, the havre step prints "skipped" and the Python run still passes. In CI that would hide a broken Havre test. Consider failing whenCIis set, or assertingnpmexists in CI.havre/test/server.test.js:6-20: this is an integration test that spawns the real server over stdio, not a unit test. That fits the finish line, but the card asked for "unit test setup". Unit tests forcreateServer()would be a cheap follow-up.havre/test/server.test.js:19:bad.isError === truedepends on the SDK returning a tool error for invalid args rather than throwing. The pinned version (1.32.1) makes this stable, so it's fine, but it's worth knowing if the SDK is ever bumped.havre/package.json: noenginesfield. Express 5 and the SDK need Node ≥18, and the lockfile's transitive deps assume it. Adding"engines": {"node": ">=20"}would document the requirement.havre/src/server.js:3: the comment "a fresh server per connection" is accurate only because stdio is one connection per process. Worth clarifying when HTTP transport is added.review by haiku · claude-haiku-5-5 · via Time