Repository navigation
eidolons v1.42.2
Patch release: stop .mcp.json from churning on a no-op OCI install/sync/upgrade — the fix for the "my MCP got disabled after eidolons sync" symptom (#371).
Fixed
fix(mcp):eidolons mcp install/sync/upgradeno longer churn.mcp.jsonon a no-op. The OCI-image driver (mcp_driver_oci_image_install) re-rendered and re-wrote.mcp.jsonon every run with no idempotency guard. Becausejqis deterministic the bytes were identical on a no-op (so the existing byte-equality test passed), but themv-based write advanced the file's mtime every time — and a host harness (e.g. Claude Code) that watches.mcp.jsonfor changes treats that as a changed server and re-prompts for approval. The driver now compares the digest already baked into the.mcp.jsonserver entry against the freshly-resolved catalogue digest and, when they match (and--forceis not set), skips the render+merge entirely —.mcp.jsonis left byte- and mtime-identical. A genuine digest bump,--force, a missing.mcp.json, or an unresolved digest all still re-render. Note: a legitimate digest bump still rewrites.mcp.jsonand the harness will re-prompt — that approval state lives in the host's own per-project trust file, which the CLI does not write.eidolons syncitself never touched.mcp.json; the realistic churn vector was always the install/refresh path (which runsnexus_refreshfirst, so a roster digest bump is auto-picked-up and feels like "it happened after I changed something").fix(mcp): defense-in-depth —_mcp_merge_into_json_filenow carries a canonicaljq -cSno-op guard (matching the establishedharness_install.shpattern): a merge whose canonical form is unchanged skips themventirely, so.mcp.json(and.cursor/mcp.json) keep their inode and mtime even when the higher-level digest guard is bypassed (e.g. a concurrent re-render).--forcestill re-writes.
Upgrade: eidolons upgrade self
Full changelog: CHANGELOG.md