feat(install): install the codebase-memory code graph with make install

The operator's three manual steps become part of the global install: install.sh runs yay -S --needed codebase-memory-mcp-bin when the binary is missing and yay exists, right before the existing auto_index switch; enable-plugins.js registers the DeusData/codebase-memory-mcp marketplace and enables codebase-memory@codebase-memory declaratively, the way it already handles caveman and ponytail, instead of claude plugin marketplace add and claude plugin install. kvb-agent-optimize now hands the operator make install instead of the single commands. test_dream checks the plugin and its marketplace.

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:23 +01:00
1 parent 4c6f60bd8a
commit 713267dd15
4 files changed
+25 -11

No files matched your search

+7 -2
View File
@@ -13,8 +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,
};
const PLUGINS = { "caveman@caveman": true, "ponytail@ponytail": true };
const REMINDERS = ["kvb-dream", "kvb-coach"];
const RETIRED = [
"autotune/hooks/reminder.sh",
@@ -119,4 +124,4 @@ for (const [script, event, matcher, sub] of SCRIPT_HOOKS) {
}
fs.writeFileSync(settingsPath, JSON.stringify(data, null, 2) + "\n");
console.log(`skills: enabled caveman + ponytail plugins (their 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, 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}`);
+4
View File
@@ -64,6 +64,10 @@ 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
fi
if command -v codebase-memory-mcp &>/dev/null; then
log "skills: auto-indexing every repository a session opens into the code graph"
codebase-memory-mcp config set auto_index true
+7 -9
View File
@@ -22,15 +22,13 @@ installed, and the state of the shared snapshot
## Step 2: index
- **Binary missing**: installing registers an MCP server in the agent
configuration, so it is the operator's step; hand these to the
`kvb-org-operator` skill and continue after the restart:
```bash
yay -S codebase-memory-mcp-bin
claude plugin marketplace add DeusData/codebase-memory-mcp
claude plugin install codebase-memory@codebase-memory
```
- **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.
- **Index**: once installed, the skills repository's `make install` switches
`auto_index` on, so every repository a session opens is indexed and
+7
View File
@@ -162,6 +162,13 @@ 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_compact_window_is_set_once_and_never_overwritten(self):
self.assertEqual(self._patch()["env"]["CLAUDE_CODE_AUTO_COMPACT_WINDOW"], "500000")
self.settings.write_text(json.dumps({"env": {"CLAUDE_CODE_AUTO_COMPACT_WINDOW": "300000"}}), encoding="utf-8")