feat(install): wire the code graph into every agent via the upstream installer

make install now runs the codebase-memory-mcp upstream installer: checksum-verified release (static on Linux) into ~/.local/bin, configuring every detected agent (Claude Code, Codex, Gemini, Hermes, OpenClaw, ...); rerunning it updates. This replaces the Arch-only yay install, whose 0.12 build segfaults on glibc 2.44 (DeusData/codebase-memory-mcp#2763), and the Claude-only plugin, which enable-plugins.js now retires so the server never runs twice. Every failure warns instead of aborting make install.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kevin Veen-BirkenbachandClaude Opus 5.5 committed 2026-11-04 17:07:24 +01:00
1 parent 997a01ccfa
commit ca98ab4a30
4 files changed
+30 -21

No files matched your search

+7 -3
View File
@@ -13,13 +13,13 @@ if (!settingsPath) {
const MARKETPLACES = {
caveman: { source: { source: "github", repo: "JuliusBrussee/caveman" } },
ponytail: { source: { source: "github", repo: "DietrichGebert/ponytail" } },
"codebase-memory": { source: { source: "github", repo: "DeusData/codebase-memory-mcp" } },
};
const PLUGINS = {
"caveman@caveman": true,
"ponytail@ponytail": true,
"codebase-memory@codebase-memory": true,
};
// Trip-wire: `codebase-memory-mcp install` registers the same server for every agent, Claude Code included; the plugin on top runs it twice.
const RETIRED_PLUGINS = { "codebase-memory@codebase-memory": "codebase-memory" };
const REMINDERS = ["kvb-dream", "kvb-coach"];
const RETIRED = [
"autotune/hooks/reminder.sh",
@@ -53,6 +53,10 @@ for (const [name, entry] of Object.entries(MARKETPLACES)) {
if (!data.extraKnownMarketplaces[name]) data.extraKnownMarketplaces[name] = entry;
}
data.enabledPlugins = Object.assign(data.enabledPlugins || {}, PLUGINS);
for (const [plugin, marketplace] of Object.entries(RETIRED_PLUGINS)) {
delete data.enabledPlugins[plugin];
delete data.extraKnownMarketplaces[marketplace];
}
data.env = data.env || {};
if (!data.env.CLAUDE_CODE_AUTO_COMPACT_WINDOW) data.env.CLAUDE_CODE_AUTO_COMPACT_WINDOW = "500000";
@@ -124,4 +128,4 @@ for (const [script, event, matcher, sub] of SCRIPT_HOOKS) {
}
fs.writeFileSync(settingsPath, JSON.stringify(data, null, 2) + "\n");
console.log(`skills: enabled the caveman, ponytail and codebase-memory plugins (plugin skill copies dropped from this .claude), the ${REMINDERS.join(" + ")} reminders, the kvb-org-organize claim gate, news hook and resource watch, and the kvb-org-perform log in ${settingsPath}`);
console.log(`skills: enabled the caveman and ponytail plugins (plugin skill copies dropped from this .claude), the ${REMINDERS.join(" + ")} reminders, the kvb-org-organize claim gate, news hook and resource watch, and the kvb-org-perform log in ${settingsPath}`);
+5 -6
View File
@@ -64,15 +64,14 @@ if [[ "${TARGET}" == "${HOME}" ]]; then
else
warn "skills: no systemd user session; skipped the kvb-dream notification timer."
fi
if ! command -v codebase-memory-mcp &>/dev/null && command -v yay &>/dev/null; then
log "skills: installing the codebase-memory-mcp code graph"
yay -S --needed codebase-memory-mcp-bin
log "skills: installing or updating the codebase-memory-mcp code graph for every detected agent"
if ! curl -fsSL --proto '=https' https://raw.githubusercontent.com/DeusData/codebase-memory-mcp/main/install.sh | bash; then
warn "skills: the codebase-memory-mcp installer failed; the code graph keeps its previous setup."
fi
if command -v codebase-memory-mcp &>/dev/null; then
if (ulimit -c 0; codebase-memory-mcp config set auto_index true); then
log "skills: auto-indexing every repository a session opens into the code graph"
codebase-memory-mcp config set auto_index true
else
warn "skills: codebase-memory-mcp not installed; the code graph stays off (see kvb-agent-optimize)."
warn "skills: codebase-memory-mcp is not runnable from PATH; the code graph stays off (see kvb-agent-optimize)."
fi
fi
+7 -7
View File
@@ -22,13 +22,13 @@ installed, and the state of the shared snapshot
## Step 2: index
- **Binary missing**: the skills repository's `make install` installs it
(`yay -S --needed codebase-memory-mcp-bin` where yay exists) and enables
the `codebase-memory@codebase-memory` plugin with its marketplace in the
settings. Installing touches the agent configuration and needs sudo, so it
is the operator's step: hand `make install` (or, without yay, the
package's install on that system) to the `kvb-org-operator` skill and
continue after the restart.
- **Binary missing**: the skills repository's `make install` runs the
upstream installer, which installs the checksum-verified release (static
on Linux) into `~/.local/bin` and wires the graph into every agent it
detects (Claude Code, Codex, Gemini, Hermes, OpenClaw and more); rerunning
it updates. It writes the agents' configuration, so it is the operator's
step: hand `make install` to the `kvb-org-operator` skill and continue
after the restart.
- **Index**: once installed, the skills repository's `make install` switches
`auto_index` on, so every repository a session opens is indexed and
+11 -5
View File
@@ -162,12 +162,18 @@ class TestSettingsRegistration(unittest.TestCase):
self.assertEqual(gate.count("kvb-org-perform/scripts/log.py"), 1)
self.assertEqual(post.count("kvb-org-perform/scripts/log.py"), 1)
def test_code_graph_plugin_is_enabled_with_its_marketplace(self):
data = self._patch()
self.assertTrue(data["enabledPlugins"]["codebase-memory@codebase-memory"])
self.assertEqual(
data["extraKnownMarketplaces"]["codebase-memory"]["source"]["repo"], "DeusData/codebase-memory-mcp"
def test_code_graph_plugin_is_retired_for_the_agent_agnostic_installer(self):
self.settings.write_text(
json.dumps({
"enabledPlugins": {"codebase-memory@codebase-memory": True},
"extraKnownMarketplaces": {"codebase-memory": {"source": {"source": "github", "repo": "x/y"}}},
}),
encoding="utf-8",
)
data = self._patch()
self.assertNotIn("codebase-memory@codebase-memory", data["enabledPlugins"])
self.assertNotIn("codebase-memory", data["extraKnownMarketplaces"])
self.assertTrue(data["enabledPlugins"]["caveman@caveman"])
def test_compact_window_is_set_once_and_never_overwritten(self):
self.assertEqual(self._patch()["env"]["CLAUDE_CODE_AUTO_COMPACT_WINDOW"], "500000")