fix(plugin): survive missing Xcode git and ship 2.1.0 - #8
Conversation
Cursor's plugin page showed Error loading plugin because macOS without Command Line Tools turns /usr/bin/git into a stub that fails git init. Hooks now detect repos on the filesystem, refuse init/clone, and never spawn that stub. Also add Configure variables, search query, evolver_report_reuse, and tests. Co-authored-by: autogame-17 <autogame-17@users.noreply.github.com>
Empty or literal ${EVOMAP_PROXY_PORT} from plugin variables must not
become the Proxy port; fall back to 19820.
Co-authored-by: autogame-17 <autogame-17@users.noreply.github.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 42aeae5. Configure here.
| const reason = diff.isRepo | ||
| ? 'no changes detected this session' | ||
| : 'not a git workspace'; | ||
| : 'git unavailable or not a git workspace'; |
There was a problem hiding this comment.
Session-end dedupe race
Medium Severity
stop and sessionEnd now both launch session-end.js as separate processes, but claimSessionRecord still does a non-atomic read-modify-write on session-end-state.json with no locking. Concurrent firings can both observe an empty claim and both append the same outcome to the memory graph, so the new dual-hook wiring does not reliably dedupe.
Additional Locations (1)
Triggered by team rule: Mandatory review after completing all tasks
Reviewed by Cursor Bugbot for commit 42aeae5. Configure here.
| typeof raw === 'string' && raw.length > 0 && !raw.includes('${') | ||
| ? raw | ||
| : '19820'; | ||
| return `http://127.0.0.1:${port}`; |
There was a problem hiding this comment.
Configure env vars unused
Medium Severity
Plugin Configure ships EVOMAP_HUB_URL, EVOMAP_NODE_ID, and EVOLVE_STRATEGY into the MCP process via mcp.json, but the bridge only ever reads EVOMAP_PROXY_PORT. Those three settings are dead for the MCP server, so Configure does not actually steer Hub identity or strategy through the bridge the release claims to wire up.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 42aeae5. Configure here.




Touches hot-path: yes
Phase: fix
Risk vector: reverse
Summary
Cursor showed Error loading plugin on Evolver because the installer runs
git -c credential.interactive=false -c core.fsmonitor=false init, and on macOS without Xcode Command Line Tools/usr/bin/gitis a stub that printsxcode-select: No developer tools were found.This release (manifest 2.1.0) makes the plugin's own hooks survive that environment and ships the missing settings/MCP surface so a refresh is a real upgrade, not just a version bump.
.git). Hooks never spawn Apple's git stub; Homebrew git is used when present.runGitrefusesinit/clone/daemon, including Cursor's-c … initargv shape.git init(that string was an actionable command). Missing-repo and unusable-git notices are separate.mcp.json.queryonevolver_search_assets; newevolver_report_reuse; fetch responses actually include the reuse nudge ondata.sessionEndalias for the same recorder asstop(deduped).Cursor's installer still needs a working git to copy the plugin into
~/.cursor/plugins/cache. Afterxcode-select --installorbrew install git, reinstall/refresh. The plugin will no longer re-trigger the CLT dialog from its hooks.Scope and cuts
Who can now do what: a Cursor user on macOS without CLT can keep Evolver loaded (hooks + MCP + commands) instead of seeing a hard plugin-load failure from our git spawns; once real git is installed, recall/record works as before; Hub settings are configurable in the plugin UI; agents can search with a natural-language query and credit reused assets.
nothing cut — GitHub Release/tag
v2.1.0is created from this branch's version bump after merge (marketplace clients pick up the newplugin.jsonversion). Cursor's owngit initduring cache install cannot be replaced from plugin code; the README states the installer-side CLT/Homebrew step.Module boundary
Cursor plugin only (
evolver-cursor-plugin): hooks, MCP bridge, manifest, commands/skill copy. No engine (@evomap/evolver) or Hub changes.Alternative considered
Restructure the repo into
plugins/evolver/like the official template so team-marketplacesourceis a subdirectory. Rejected: this is a single-plugin repo already consumed at the root; moving it would break existing marketplace imports. Changedsourcefrom./to.only.Leaving MCP/settings for a follow-up was rejected: AGENTS.md treats the settings surface and failure path as part of a complete plugin delivery.
Validation
node --test test/*.test.js— 16 passed locally (path/git guards, MCP tools/list + empty search, manifest/variables, session-start nongit notice)..github/workflows/test.ymlruns the same command on PRs.Rollback / recovery
Revert this PR / pin marketplace to the previous commit. Manifest version returns to 2.0.0. No data migration. Local
~/.evolvermemory graphs are unchanged.