kodelyth-ecc 2.21.2 → 2.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,89 @@
2
2
 
3
3
  All notable changes to Kodelyth ECC are documented here.
4
4
 
5
+ ## v2.22.0 — Windows actually works now (September 2026)
6
+
7
+ The Windows install was broken in three separate ways. Windows CI had been green
8
+ throughout, because the test suite only ever exercised library functions — it
9
+ never ran the installer, which takes a completely different path there
10
+ (`install.ps1` through PowerShell rather than `install.sh` through bash).
11
+
12
+ Every finding below was measured on a real `windows-latest` runner, not inferred
13
+ from reading the code.
14
+
15
+ ### The documented command failed outright
16
+
17
+ `install.sh` matches `claude-home|claude-code` in every case arm, so both
18
+ spellings work on macOS and Linux. `install.ps1` had three separate
19
+ `switch ($Target)` blocks that each matched only `claude-home`, so the other
20
+ spelling hit the default arm:
21
+
22
+ ```
23
+ Unknown target: claude-code
24
+ Valid targets: claude-home, windsurf-project, ...
25
+ ```
26
+
27
+ `claude-code` is what the README, the docs and the website install page all tell
28
+ people to use. **Every Windows user following the documented instructions got a
29
+ hard failure.** Aliases are now normalised once at the top of the file, which
30
+ covers all three switches and keeps the accepted set identical to `install.sh`
31
+ rather than merely similar.
32
+
33
+ ### None of the post-install wiring ever ran
34
+
35
+ The Windows branch called `process.exit()` immediately after `install.ps1`, while
36
+ the POSIX branch continued into MCP registration, RTK, Terse mode and the
37
+ codebase graph. A Windows user got agents, skills and commands on disk and
38
+ silently none of those, with no message explaining why.
39
+
40
+ That block is now a shared `runPostInstall()` called by both branches.
41
+
42
+ ### Hooks shipped without their scripts, and were never registered
43
+
44
+ `install.ps1` copied only `hooks/hooks.json` — the same defect `install.sh` had
45
+ before 2.21.0, where Windows was missed. So the manifest landed with none of the
46
+ scripts it points at, and `settings.json` was never written at all. Claude Code
47
+ reads hooks from `settings.json`, so every hook was inert.
48
+
49
+ ### Before and after, measured
50
+
51
+ ```
52
+ before after
53
+ --target claude-code hard fail works
54
+ hook files 1 12
55
+ settings.json ABSENT present, 8 events
56
+ Terse mode absent present
57
+ MCP registration absent present
58
+ total files installed — 502
59
+ ```
60
+
61
+ ### Guarded so it cannot regress
62
+
63
+ A `Windows install` workflow now runs on every push to main: it packs the
64
+ package as npm would, installs it globally on `windows-latest`, runs a real
65
+ install into a scratch HOME, and asserts on what lands — counts per module,
66
+ whether `settings.json` was written and with how many events, whether Terse and
67
+ MCP registration happened, then runs `doctor`. Green CI now means the Windows
68
+ install works, which it never did before.
69
+
70
+ ### Also
71
+
72
+ `doctor` was telling Windows users to run `kodelythecc rtk install` and
73
+ `kodelythecc codebase install`. Neither has a Windows installer, so both
74
+ commands report that they cannot proceed and the user follows a dead end. Both
75
+ hints now point at the release page on Windows. Remediation that fails on the
76
+ reader's platform is worse than none.
77
+
78
+ RTK and the codebase graph remain manual on Windows — they are native binaries
79
+ without a Windows installer script. The difference is that ECC now says so
80
+ during install rather than the feature being silently absent.
81
+
82
+ README gains a Windows section covering what is automatic, what is not, and why
83
+ no execution-policy change is needed. Two stale claims corrected there: 373
84
+ tests became 647, and 22 hooks became 44 hook entries.
85
+
86
+ **647 tests passing.**
87
+
5
88
  ## v2.21.2 — same content, with a GitHub release attached (September 2026)
6
89
 
7
90
  Identical to 2.21.1 in every shipped file. It exists because 2.21.1 could not be
package/README.md CHANGED
@@ -96,7 +96,7 @@ You never typed `use debug-detective`. You didn't have to. The toolkit read the
96
96
  | Quality hooks | ✅ 22+ | Some | ❌ | ❌ |
97
97
  | IDE platforms | **11** (Claude Code, Windsurf, Cursor, Codex, Antigravity, OpenCode, Cline, Roo Code, Aider, Kimi, Gemini CLI) | 1-2 | 1 | Varies |
98
98
  | Telemetry | ❌ none | Varies | ❌ | Varies |
99
- | Test coverage | ✅ 373 tests | ❌ | ❌ | ❌ |
99
+ | Test coverage | ✅ 647 tests | ❌ | ❌ | ❌ |
100
100
  | Distributed via | `npx`, curl, clone | Manual | Manual | Manual |
101
101
 
102
102
  ---
@@ -118,7 +118,7 @@ kodelythecc --target claude-code --codebase-graph
118
118
  That's it. This single flow:
119
119
 
120
120
  1. Installs both binaries (`kodelyth-ecc` and short-form `kodelythecc`) to your PATH
121
- 2. Copies 70 agents + 196 skills + 103 commands + 22 hooks + 15 rules into your AI tool's config dir
121
+ 2. Copies 70 agents + 196 skills + 103 commands + 44 hook entries + 15 rules into your AI tool's config dir
122
122
  3. Auto-installs **RTK** binary and wires its PreToolUse hook (input compression starts on next AI restart)
123
123
  4. Installs **Terse mode** skill + `/terse` and `/terse-compress` slash commands (dormant — user types `/terse` to activate)
124
124
  5. Auto-installs **codebase-memory-mcp** and registers its MCP entries in your AI tool (with `--codebase-graph`)
@@ -190,6 +190,44 @@ export KODELYTH_EXTRA_IDE_WATCH="$HOME/my-agent-logs,$HOME/other-tool/state"
190
190
  npx kodelyth-ecc dashboard
191
191
  ```
192
192
 
193
+ ### Windows
194
+
195
+ The same command works. `npx kodelyth-ecc` detects Windows and runs `install.ps1`
196
+ through PowerShell for you — there is nothing separate to download.
197
+
198
+ ```powershell
199
+ npx kodelyth-ecc # Claude Code (default)
200
+ npx kodelyth-ecc --target cursor-project # any target works the same way
201
+ ```
202
+
203
+ **Requirements.** Node.js 18+ and either PowerShell 7 (`pwsh`) or the Windows
204
+ PowerShell 5.1 that ships with the OS. The installer tries `pwsh` first and falls
205
+ back automatically, and it passes `-ExecutionPolicy Bypass` for its own process
206
+ only, so you do not need to change your machine's execution policy.
207
+
208
+ **What is fully automatic on Windows:** the 70 agents, 196 skills, 103 commands,
209
+ 15 rules, all 44 hook entries registered into `settings.json`, the ECC MCP server
210
+ (16 tools), and Terse mode.
211
+
212
+ **What still needs one manual step:** RTK and the codebase graph ship as native
213
+ binaries without a Windows installer script. ECC tells you so during install and
214
+ prints the download link rather than failing or skipping silently:
215
+
216
+ | Component | Windows | Get it |
217
+ |---|---|---|
218
+ | RTK (token savings) | manual | [rtk-ai/rtk releases](https://github.com/rtk-ai/rtk/releases) |
219
+ | Codebase graph | manual | [codebase-memory-mcp releases](https://github.com/DeusData/codebase-memory-mcp/releases) |
220
+
221
+ **Verify:**
222
+
223
+ ```powershell
224
+ kodelythecc doctor
225
+ ```
226
+
227
+ Every install is exercised on a real `windows-latest` runner on each push — it
228
+ packs the package, installs it globally, runs a real install, and asserts on
229
+ what lands. See the `Windows install` workflow.
230
+
193
231
  ### Option 2 — npx from GitHub (always latest commit)
194
232
 
195
233
  ```bash
@@ -973,7 +1011,9 @@ npx kodelyth-ecc typescript python golang rust java kotlin php swift cpp dart ru
973
1011
  | Google Antigravity | Full | `antigravity` | Agents → skills, commands → workflows, rules |
974
1012
  | OpenCode | Rules only | `opencode` | Rules (agents + skills not yet supported by OpenCode) |
975
1013
 
976
- **OS support:** macOS, Linux (`install.sh`), Windows (`install.ps1`), or any OS with Node.js 18+ (`npx`).
1014
+ **OS support:** macOS, Linux and Windows. `npx kodelyth-ecc` is the same command on all
1015
+ three — it dispatches to `install.sh` on macOS/Linux and `install.ps1` on Windows for you.
1016
+ See [Windows](#windows) for the two pieces that still need a manual step there.
977
1017
 
978
1018
  ---
979
1019
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 2.21.2
1
+ 2.22.0
@@ -1806,79 +1806,20 @@ if (args.includes('--version') || args.includes('-v')) {
1806
1806
  }
1807
1807
 
1808
1808
  // ── Run installer ─────────────────────────────────────────────────────────────
1809
- if (isWin) {
1810
- const ps1 = path.join(ROOT, 'install.ps1');
1811
- if (!fs.existsSync(ps1)) {
1812
- console.error('Error: install.ps1 not found. Please clone the repo and run install.ps1 manually.');
1813
- process.exit(1);
1814
- }
1815
-
1816
- // Map CLI args (--target X, --bundle X, --profile X) → PowerShell named params (-Target X, -Bundle X)
1817
- // Positional language args (e.g. "typescript python") → collected for -Languages
1818
- const psArgs = [];
1819
- const languages = [];
1820
- for (let i = 0; i < args.length; i++) {
1821
- const a = args[i];
1822
- if ((a === '--target' || a === '-target') && args[i + 1]) {
1823
- psArgs.push('-Target', args[++i]); continue;
1824
- }
1825
- if ((a === '--bundle' || a === '-bundle') && args[i + 1]) {
1826
- psArgs.push('-Bundle', args[++i]); continue;
1827
- }
1828
- if ((a === '--profile' || a === '-profile') && args[i + 1]) {
1829
- // profile maps to languages in ps1
1830
- languages.push(args[++i]); continue;
1831
- }
1832
- if (!a.startsWith('-')) {
1833
- // positional = language module
1834
- languages.push(a); continue;
1835
- }
1836
- // pass through any other flags unmapped
1837
- psArgs.push(a);
1838
- }
1839
- if (languages.length > 0) {
1840
- psArgs.push('-Languages', languages.join(','));
1841
- }
1842
-
1843
- // Try pwsh (PowerShell 7+) first, then fall back to powershell (5.1)
1844
- function trySpawn(bin) {
1845
- return spawnSync(bin, ['-NoLogo', '-ExecutionPolicy', 'Bypass', '-File', ps1, ...psArgs], {
1846
- stdio: 'inherit',
1847
- shell: false,
1848
- env: { ...process.env, KODELYTH_NONINTERACTIVE: '1' },
1849
- });
1850
- }
1851
-
1852
- let result = trySpawn('pwsh');
1853
- if (result.error && result.error.code === 'ENOENT') {
1854
- // pwsh not found — try legacy powershell.exe
1855
- result = trySpawn('powershell');
1856
- }
1857
-
1858
- if (result.error) {
1859
- console.error(
1860
- '\nError: Could not launch PowerShell to run the installer.\n' +
1861
- 'Make sure PowerShell is installed and accessible in your PATH.\n' +
1862
- ' • Try: pwsh --version\n' +
1863
- ' • Or: powershell -Version\n' +
1864
- '\nAlternatively, run the installer manually:\n' +
1865
- ` powershell -ExecutionPolicy Bypass -File "${ps1}"\n`
1866
- );
1867
- process.exit(1);
1868
- }
1869
- process.exit(result.status ?? 1);
1870
- } else {
1871
- try { require(path.join(ROOT, 'scripts', 'migrate-legacy.js')).main(); } catch {}
1872
- const sh = path.join(ROOT, 'install.sh');
1873
- if (!fs.existsSync(sh)) {
1874
- console.error('Error: install.sh not found in package root:', ROOT);
1875
- process.exit(1);
1876
- }
1877
- fs.chmodSync(sh, 0o755);
1878
- const result = spawnSync('bash', [sh, ...args], { stdio: 'inherit', shell: false });
1879
-
1809
+ // Post-install wiring: MCP registration, RTK, Terse mode, codebase graph.
1810
+ //
1811
+ // This lived inside the POSIX branch, and the Windows branch called
1812
+ // process.exit() straight after install.ps1 — so none of it ran on Windows. A
1813
+ // Windows user got agents, skills and commands on disk and silently none of:
1814
+ // the MCP server (16 tools), RTK token savings, /terse and /terse-compress, or
1815
+ // the codebase graph. Five advertised features, absent with no message.
1816
+ //
1817
+ // Every block below already guards itself and reports a reason when it cannot
1818
+ // proceed, which is what makes sharing it safe: on Windows the parts that work
1819
+ // now run, and the parts that cannot say so instead of vanishing.
1820
+ function runPostInstall(status, args) {
1880
1821
  // Post-install: auto-register ECC's own MCP server in Claude Code + Desktop.
1881
- if (result.status === 0 && !args.includes('--no-mcp-register')) {
1822
+ if (status === 0 && !args.includes('--no-mcp-register')) {
1882
1823
  try {
1883
1824
  const reg = require(path.join(ROOT, 'scripts', 'mcp', 'register-self.js'));
1884
1825
  process.stdout.write('\n━ ECC MCP server registration ' + '─'.repeat(31) + '\n');
@@ -1894,7 +1835,7 @@ if (isWin) {
1894
1835
  }
1895
1836
 
1896
1837
  // Post-install: auto-install + wire RTK for the target IDE (opt-out via --no-rtk).
1897
- if (result.status === 0 && !args.includes('--no-rtk')) {
1838
+ if (status === 0 && !args.includes('--no-rtk')) {
1898
1839
  try {
1899
1840
  const rtk = require(path.join(ROOT, 'scripts', 'rtk', 'index.js'));
1900
1841
  const targetIdx = args.indexOf('--target');
@@ -1972,5 +1913,80 @@ if (isWin) {
1972
1913
  }
1973
1914
  }
1974
1915
 
1975
- process.exit(result.status ?? 1);
1976
1916
  }
1917
+
1918
+ if (isWin) {
1919
+ const ps1 = path.join(ROOT, 'install.ps1');
1920
+ if (!fs.existsSync(ps1)) {
1921
+ console.error('Error: install.ps1 not found. Please clone the repo and run install.ps1 manually.');
1922
+ process.exit(1);
1923
+ }
1924
+
1925
+ // Map CLI args (--target X, --bundle X, --profile X) → PowerShell named params (-Target X, -Bundle X)
1926
+ // Positional language args (e.g. "typescript python") → collected for -Languages
1927
+ const psArgs = [];
1928
+ const languages = [];
1929
+ for (let i = 0; i < args.length; i++) {
1930
+ const a = args[i];
1931
+ if ((a === '--target' || a === '-target') && args[i + 1]) {
1932
+ psArgs.push('-Target', args[++i]); continue;
1933
+ }
1934
+ if ((a === '--bundle' || a === '-bundle') && args[i + 1]) {
1935
+ psArgs.push('-Bundle', args[++i]); continue;
1936
+ }
1937
+ if ((a === '--profile' || a === '-profile') && args[i + 1]) {
1938
+ // profile maps to languages in ps1
1939
+ languages.push(args[++i]); continue;
1940
+ }
1941
+ if (!a.startsWith('-')) {
1942
+ // positional = language module
1943
+ languages.push(a); continue;
1944
+ }
1945
+ // pass through any other flags unmapped
1946
+ psArgs.push(a);
1947
+ }
1948
+ if (languages.length > 0) {
1949
+ psArgs.push('-Languages', languages.join(','));
1950
+ }
1951
+
1952
+ // Try pwsh (PowerShell 7+) first, then fall back to powershell (5.1)
1953
+ function trySpawn(bin) {
1954
+ return spawnSync(bin, ['-NoLogo', '-ExecutionPolicy', 'Bypass', '-File', ps1, ...psArgs], {
1955
+ stdio: 'inherit',
1956
+ shell: false,
1957
+ env: { ...process.env, KODELYTH_NONINTERACTIVE: '1' },
1958
+ });
1959
+ }
1960
+
1961
+ let result = trySpawn('pwsh');
1962
+ if (result.error && result.error.code === 'ENOENT') {
1963
+ // pwsh not found — try legacy powershell.exe
1964
+ result = trySpawn('powershell');
1965
+ }
1966
+
1967
+ if (result.error) {
1968
+ console.error(
1969
+ '\nError: Could not launch PowerShell to run the installer.\n' +
1970
+ 'Make sure PowerShell is installed and accessible in your PATH.\n' +
1971
+ ' • Try: pwsh --version\n' +
1972
+ ' • Or: powershell -Version\n' +
1973
+ '\nAlternatively, run the installer manually:\n' +
1974
+ ` powershell -ExecutionPolicy Bypass -File "${ps1}"\n`
1975
+ );
1976
+ process.exit(1);
1977
+ }
1978
+ runPostInstall(result.status, args);
1979
+ process.exit(result.status ?? 1);
1980
+ } else {
1981
+ try { require(path.join(ROOT, 'scripts', 'migrate-legacy.js')).main(); } catch {}
1982
+ const sh = path.join(ROOT, 'install.sh');
1983
+ if (!fs.existsSync(sh)) {
1984
+ console.error('Error: install.sh not found in package root:', ROOT);
1985
+ process.exit(1);
1986
+ }
1987
+ fs.chmodSync(sh, 0o755);
1988
+ const result = spawnSync('bash', [sh, ...args], { stdio: 'inherit', shell: false });
1989
+
1990
+ runPostInstall(result.status, args);
1991
+ process.exit(result.status ?? 1);
1992
+ }
package/install.ps1 CHANGED
@@ -32,6 +32,33 @@ $ErrorActionPreference = "Stop"
32
32
  # Non-interactive mode: set by npx launcher (KODELYTH_NONINTERACTIVE=1) or --yes flag
33
33
  $NonInteractive = ($env:KODELYTH_NONINTERACTIVE -eq '1')
34
34
 
35
+ # -- Target aliases -----------------------------------------------------------
36
+ # install.sh matches "claude-home|claude-code" in every one of its case arms, so
37
+ # both spellings work on macOS and Linux. This file had three separate
38
+ # switch ($Target) blocks that each matched only "claude-home", so
39
+ # "--target claude-code" fell through to the default arm and exited 1.
40
+ #
41
+ # That is the spelling the README, the docs and the website install page all
42
+ # tell people to use, so the documented primary command failed outright on
43
+ # Windows while working everywhere else. Measured on a windows-latest runner:
44
+ #
45
+ # Unknown target: claude-code
46
+ # Valid targets: claude-home, windsurf-project, ...
47
+ #
48
+ # Normalising once here fixes all three switches at the same time, and keeps the
49
+ # accepted set identical to install.sh rather than merely similar. Matching is
50
+ # case-insensitive because PowerShell users reasonably type -Target Claude-Code.
51
+ $TargetAliases = @{
52
+ 'claude-code' = 'claude-home'
53
+ 'claude' = 'claude-home'
54
+ }
55
+ $targetKey = $Target.ToLower()
56
+ if ($TargetAliases.ContainsKey($targetKey)) {
57
+ $Target = $TargetAliases[$targetKey]
58
+ } else {
59
+ $Target = $targetKey
60
+ }
61
+
35
62
  # -- Bundle handling (audience-tailored cheat sheets) -------------------------
36
63
  if ($Bundle) {
37
64
  switch ($Bundle.ToLower()) {
@@ -233,10 +260,38 @@ switch ($Target) {
233
260
  Install-Dir "$ScriptDir\commands" $CommandsDest "Commands (79)"
234
261
 
235
262
  # Hooks
263
+ #
264
+ # Copy the whole tree, not just the manifest. Every command inside
265
+ # hooks.json points at ${CLAUDE_PLUGIN_ROOT}/hooks/{memory,safety}/*.js,
266
+ # so copying hooks.json alone registers hooks whose scripts are absent.
267
+ #
268
+ # Then register them into settings.json. Claude Code reads hooks from
269
+ # settings.json, NOT from hooks.json — a manifest sitting on disk does
270
+ # nothing. install.sh was fixed for this in 2.21.0; this file was missed,
271
+ # so Windows installs shipped 1 hook file and no settings.json at all
272
+ # (measured on a windows-latest runner).
236
273
  if ($HooksDest) {
237
274
  if (-not (Test-Path $HooksDest)) { New-Item -ItemType Directory -Path $HooksDest -Force | Out-Null }
238
- Copy-Item "$ScriptDir\hooks\hooks.json" "$HooksDest\hooks.json" -Force
239
- Write-Host " [OK] Hooks -> $HooksDest" -ForegroundColor Green
275
+ Copy-Item "$ScriptDir\hooks\*" $HooksDest -Recurse -Force
276
+ $hookScripts = (Get-ChildItem -Path $HooksDest -Recurse -Filter "*.js" -ErrorAction SilentlyContinue).Count
277
+ Write-Host " [OK] Hooks -> $HooksDest ($hookScripts scripts)" -ForegroundColor Green
278
+
279
+ $registrar = Join-Path $ScriptDir "scripts\install\register-hooks.js"
280
+ if (Test-Path $registrar) {
281
+ $nodeCmd = Get-Command node -ErrorAction SilentlyContinue
282
+ if ($nodeCmd) {
283
+ $summary = & node $registrar $Dest 2>&1
284
+ if ($LASTEXITCODE -eq 0) {
285
+ Write-Host " [OK] Hooks registered ($summary)" -ForegroundColor Green
286
+ } else {
287
+ Write-Host " [!] Hook registration failed: $summary" -ForegroundColor Yellow
288
+ Write-Host " Retry: node `"$registrar`" `"$Dest`"" -ForegroundColor Gray
289
+ }
290
+ } else {
291
+ Write-Host " [!] Hooks copied but not registered -- node not found" -ForegroundColor Yellow
292
+ Write-Host " Run after installing Node: node `"$registrar`" `"$Dest`"" -ForegroundColor Gray
293
+ }
294
+ }
240
295
  }
241
296
 
242
297
  # Rules
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kodelyth-ecc",
3
- "version": "2.21.2",
3
+ "version": "2.22.0",
4
4
  "description": "Production-grade AI coding toolkit — 70 agents (incl. devil-mode adversarial crew), 194 skills, 97 commands, parallel multi-agent commands, semantic intent routing, self-learning memory, and a built-in MCP server (16 tools / 6 prompts / 377 resources) that bridges to Claude Desktop, LangGraph, AutoGen, CrewAI, and OpenAI Agents SDK. Works with Claude Code, Windsurf, Cursor, Codex, Antigravity, OpenCode, Cline, RooCode, Aider, Kimi, and Gemini CLI.",
5
5
  "author": "Kodelyth <github.com/sifxprime>",
6
6
  "license": "MIT",
@@ -115,8 +115,20 @@ function checkPromptInjectionGuard() {
115
115
  return { status: PASS, detail: `prompt-injection guard active (mode=${mode})` };
116
116
  }
117
117
 
118
+ // Remediation has to be platform-correct or it is worse than none. RTK and the
119
+ // codebase graph ship as native binaries with no Windows installer, so
120
+ // "kodelythecc rtk install" on Windows just reports that it cannot, and the user
121
+ // follows a dead end. Point at the release page there instead.
122
+ const IS_WIN = process.platform === 'win32';
123
+
118
124
  function checkRtk() {
119
- if (!onPath('rtk')) return { status: WARN, detail: 'RTK not installed (input savings inactive)', fix: 'kodelythecc rtk install' };
125
+ if (!onPath('rtk')) return {
126
+ status: WARN,
127
+ detail: 'RTK not installed (input savings inactive)',
128
+ fix: IS_WIN
129
+ ? 'no Windows installer yet — download: https://github.com/rtk-ai/rtk/releases'
130
+ : 'kodelythecc rtk install',
131
+ };
120
132
  try {
121
133
  const v = execFileSync('rtk', ['--version'], { encoding: 'utf8' }).trim();
122
134
  return { status: PASS, detail: `${v} installed`, };
@@ -130,7 +142,13 @@ function checkTerse() {
130
142
  }
131
143
 
132
144
  function checkCodebaseGraph() {
133
- if (!onPath('codebase-memory-mcp')) return { status: WARN, detail: 'codebase graph not installed (optional)', fix: 'kodelythecc codebase install' };
145
+ if (!onPath('codebase-memory-mcp')) return {
146
+ status: WARN,
147
+ detail: 'codebase graph not installed (optional)',
148
+ fix: IS_WIN
149
+ ? 'no Windows installer yet — download: https://github.com/DeusData/codebase-memory-mcp/releases'
150
+ : 'kodelythecc codebase install',
151
+ };
134
152
  return { status: PASS, detail: 'codebase-memory-mcp installed' };
135
153
  }
136
154