kodelyth-ecc 1.9.0 → 1.9.1

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,25 @@
2
2
 
3
3
  All notable changes to Kodelyth ECC are documented here.
4
4
 
5
+ ## v1.9.1 — Smoothness pass on RTK integration (July 2026)
6
+
7
+ Follow-up polish on 1.9.0. Cleaner output, agents now say the right paths, one-shot multi-IDE RTK setup.
8
+
9
+ ### Fixed
10
+
11
+ - `rtk init --codex/--gemini/--opencode/--agent X` rejected `--auto-patch` and silently failed. `enableFor()` now only passes `--auto-patch` to the default Claude Code hook flow, where RTK accepts it. Multi-IDE enable now succeeds 3/3 instead of 2/3
12
+ - 24 memory-path references across 11 agent/skill/rule/command markdown files still said `~/.kodelyth/` — agents were teaching users the wrong path. Now all say `~/.kodelythecc/` (matches the 1.8.6 runtime rename)
13
+
14
+ ### Added
15
+
16
+ - `kodelyth-ecc rtk enable --all` — auto-detects every IDE ECC has been installed for on this machine (checks `~/.claude/agents`, `~/.cursor/rules`, `~/.codeium/windsurf`, `~/.antigravity`, `~/.codex`, `~/.config/opencode`, `~/.gemini`) and wires RTK into all of them in one command
17
+ - `scripts/rtk/index.js` — `detectInstalledTargets()` export
18
+
19
+ ### Changed
20
+
21
+ - Post-install output: replaced the raw JSON dumps with a tight 3-line summary (RTK version, target IDE, next step)
22
+ - `kodelyth-ecc rtk status`: human-readable by default (was JSON); use `--json` for machine output. Now also lists detected ECC-installed IDEs so you can see which ones `--all` will wire
23
+
5
24
  ## v1.9.0 — RTK integration + revived dashboard (July 2026)
6
25
 
7
26
  ECC now auto-installs [RTK](https://github.com/rtk-ai/rtk) (Rust Token Killer) and wires its transparent command filter into whichever IDE ECC was installed for. Real token savings (60-90% on shell commands) show up in the dashboard, pulled straight from RTK's own ledger — no synthetic numbers.
@@ -72,7 +72,7 @@ Anthropic's prompt cache (5-min TTL, 10% cost on hits) and OpenAI's automatic ca
72
72
  ## Honest limits
73
73
 
74
74
  - Retrieval is **BM25 keyword + tag matching**, not semantic. It finds memories that share vocabulary with the query. It will miss semantic matches with no shared words.
75
- - Memory is **per-machine**. Sync across machines requires the user opting in (Dropbox/iCloud/git on `~/.kodelyth/memory/`).
75
+ - Memory is **per-machine**. Sync across machines requires the user opting in (Dropbox/iCloud/git on `~/.kodelythecc/memory/`).
76
76
  - On cloud-AI platforms (Windsurf, Antigravity), session data is server-side. Memory still works for capture (manual `/memory remember`) but auto-extract from past sessions is unavailable there.
77
77
 
78
78
  ## Example interaction
@@ -200,6 +200,23 @@ if (args[0] === 'rtk') {
200
200
  process.exit(r.installed || r.skipped ? 0 : 1);
201
201
  }
202
202
  if (sub === 'enable') {
203
+ // --all mode: wire RTK into every IDE that already has ECC installed.
204
+ if (rest.includes('--all')) {
205
+ rtk.install({ log });
206
+ if (!rtk.isInstalled()) { process.stderr.write('rtk install failed — cannot enable\n'); process.exit(1); }
207
+ const targets = rtk.detectInstalledTargets();
208
+ if (targets.length === 0) {
209
+ log('No IDE installs detected. Install ECC first: npx kodelyth-ecc --target claude-code');
210
+ process.exit(0);
211
+ }
212
+ let ok = 0, fail = 0;
213
+ for (const t of targets) {
214
+ const r = rtk.enableFor(t, { log: () => {} });
215
+ if (r.enabled) { log(` ✓ ${t}`); ok++; } else { log(` · ${t} — ${r.reason || 'skipped'}`); fail++; }
216
+ }
217
+ log(`\nRTK enabled on ${ok}/${targets.length} IDE${targets.length === 1 ? '' : 's'}. Restart each to activate.`);
218
+ process.exit(fail && !ok ? 1 : 0);
219
+ }
203
220
  const target = flag('--target', 'claude-code');
204
221
  const inst = rtk.install({ log });
205
222
  if (!rtk.isInstalled()) { log(JSON.stringify(inst, null, 2)); process.exit(1); }
@@ -214,7 +231,20 @@ if (args[0] === 'rtk') {
214
231
  process.exit(r.disabled ? 0 : 1);
215
232
  }
216
233
  if (sub === 'status') {
217
- log(JSON.stringify(rtk.status(), null, 2));
234
+ const st = rtk.status();
235
+ if (rest.includes('--json')) { log(JSON.stringify(st, null, 2)); process.exit(0); }
236
+ if (!st.installed) {
237
+ log('RTK: not installed');
238
+ log(' → install: kodelyth-ecc rtk install');
239
+ process.exit(0);
240
+ }
241
+ log(`RTK: ${st.version}`);
242
+ const ecc = rtk.detectInstalledTargets();
243
+ log(`ECC-installed IDEs: ${ecc.length ? ecc.join(', ') : 'none detected'}`);
244
+ log('RTK integrations:');
245
+ for (const line of st.active) log(' ' + line);
246
+ log('');
247
+ log('Commands: install | enable [--target X | --all] | disable | gain | status --json');
218
248
  process.exit(0);
219
249
  }
220
250
  if (sub === 'gain') {
@@ -1084,20 +1114,24 @@ if (isWin) {
1084
1114
  const targetIdx = args.indexOf('--target');
1085
1115
  const target = targetIdx >= 0 && args[targetIdx + 1] ? args[targetIdx + 1] : 'claude-code';
1086
1116
  if (rtk.TARGET_MAP[target]) {
1087
- process.stdout.write('\n' + '─'.repeat(60) + '\n');
1088
- process.stdout.write('[rtk] setting up token savings (60-90% on shell commands)\n');
1089
- const inst = rtk.install({ log: (m) => process.stdout.write(m + '\n') });
1117
+ const w = (m) => process.stdout.write(m + '\n');
1118
+ w('');
1119
+ w('━ RTK token savings ' + ''.repeat(41));
1120
+ const inst = rtk.install({ log: () => {} }); // silent — we summarise
1090
1121
  if (inst.installed || inst.reason === 'already installed') {
1091
- const en = rtk.enableFor(target, { log: (m) => process.stdout.write(m + '\n') });
1122
+ const en = rtk.enableFor(target, { log: () => {} });
1092
1123
  if (en.enabled) {
1093
- process.stdout.write(`[rtk] enabled for ${target} restart your AI tool to activate\n`);
1124
+ w(` RTK ${(rtk.getVersion() || '').replace(/^rtk /,'')} wired for ${target}`);
1125
+ w(` ✓ Restart your AI tool to activate. 60-90% token savings on shell commands.`);
1094
1126
  } else {
1095
- process.stdout.write(`[rtk] enable skipped: ${en.reason}\n`);
1127
+ w(` · skipped: ${en.reason}`);
1128
+ w(` → retry: kodelyth-ecc rtk enable --target ${target}`);
1096
1129
  }
1097
1130
  } else {
1098
- process.stdout.write(`[rtk] install skipped: ${inst.reason}\n`);
1099
- process.stdout.write('[rtk] you can retry later with: kodelyth-ecc rtk enable --target ' + target + '\n');
1131
+ w(` · install skipped: ${inst.reason}`);
1132
+ w(` → retry: kodelyth-ecc rtk enable --target ${target}`);
1100
1133
  }
1134
+ w('');
1101
1135
  }
1102
1136
  } catch (e) {
1103
1137
  process.stderr.write(`[rtk] setup skipped: ${e.message}\n`);
@@ -24,7 +24,7 @@ Run the self-evolving memory loop. Inspect what ECC has learned from your sessio
24
24
  1. **stats** prints the current signal snapshot:
25
25
  - reuse: how many memories are tracked, total surfaces, top reused
26
26
  - routing misses: how many substantive prompts had zero memory matches, top token clusters
27
- 2. **analyze** applies thresholds and writes proposals to `~/.kodelyth/evolve/proposals.jsonl`. Stable IDs — re-running does NOT duplicate.
27
+ 2. **analyze** applies thresholds and writes proposals to `~/.kodelythecc/evolve/proposals.jsonl`. Stable IDs — re-running does NOT duplicate.
28
28
  3. **list** filters by state. **show** prints the full draft markdown + evidence.
29
29
  4. **accept** writes the draft to its target path under `--root` (defaults to package root). Refuses to overwrite without `--overwrite`. Marks the proposal `accepted` with the absolute path.
30
30
  5. **reject** marks a proposal rejected with optional note.
@@ -63,7 +63,7 @@ Run the self-evolving memory loop. Inspect what ECC has learned from your sessio
63
63
 
64
64
  Backed by:
65
65
 
66
- - `scripts/evolve/stats.js` — pure record/read of `~/.kodelyth/evolve/{reuse.json, routing-misses.jsonl}`
66
+ - `scripts/evolve/stats.js` — pure record/read of `~/.kodelythecc/evolve/{reuse.json, routing-misses.jsonl}`
67
67
  - `scripts/evolve/analyze.js` — pure functions: signals → proposals
68
68
  - `scripts/evolve/proposals.js` — append-only proposal log with state transitions
69
69
  - `hooks/memory/auto-recall.js` — fire-and-forget signal recording on every UserPromptSubmit
@@ -30,7 +30,7 @@ Capture a new memory. The agent will:
30
30
  Show the queue of candidate memories extracted automatically by the Stop hook from your last session. Confirm each one to store, or skip.
31
31
 
32
32
  ### `/memory forget <id>`
33
- Mark a memory deleted. It's a soft-delete (the row stays in the log marked `deleted: true`) so you can recover it by editing `~/.kodelyth/memory/memories.jsonl`.
33
+ Mark a memory deleted. It's a soft-delete (the row stays in the log marked `deleted: true`) so you can recover it by editing `~/.kodelythecc/memory/memories.jsonl`.
34
34
 
35
35
  ### `/memory list`
36
36
  Show all stored memories — id, date, language, problem, tags.
@@ -55,7 +55,7 @@ use kodelyth-memory
55
55
 
56
56
  ## Storage location
57
57
 
58
- `~/.kodelyth/memory/` (override with `KODELYTH_MEMORY_DIR` env var)
58
+ `~/.kodelythecc/memory/` (override with `KODELYTH_MEMORY_DIR` env var)
59
59
 
60
60
  - `memories.jsonl` — the source of truth
61
61
  - `index.json` — BM25 inverted index
@@ -5,7 +5,7 @@ argument-hint: "[task description]"
5
5
 
6
6
  # /route-model
7
7
 
8
- Get an immediate model-tier recommendation for the current task. Combines the `cost-aware-model-routing` rule, the project's `.kodelyth/router.json` config, and the active session's token-budget pressure.
8
+ Get an immediate model-tier recommendation for the current task. Combines the `cost-aware-model-routing` rule, the project's `.kodelythecc/router.json` config, and the active session's token-budget pressure.
9
9
 
10
10
  ## Usage
11
11
 
@@ -33,7 +33,7 @@ If you're already on the right tier, the AI routes silently and confirms in one
33
33
  ## Behind the scenes
34
34
 
35
35
  - Pure deterministic classifier (no LLM call) at `scripts/router/classify.js`.
36
- - Project config: `.kodelyth/router.json` (override per team).
36
+ - Project config: `.kodelythecc/router.json` (override per team).
37
37
  - Env-var overrides: `KODELYTH_ROUTER_{TRIVIAL,STANDARD,HARD,DEFAULT}`.
38
38
  - Disable with `KODELYTH_ROUTER=off`.
39
39
  - Pairs with the `token-budget` safety hook for spend control.
@@ -17,7 +17,7 @@ Upgrades your ECC install to the latest version from npm. Reads your existing in
17
17
  1. Reads `kodelyth-ecc-install-state.json` from your install directory to recover the original `target` and `languages`
18
18
  2. Runs `npx kodelyth-ecc@latest` with those same flags
19
19
  3. Overwrites agents, skills, rules, and commands with the latest versions
20
- 4. Leaves your memory store (`~/.kodelyth/memory/`) and `tasks/lessons.md` untouched — your learned context is never overwritten
20
+ 4. Leaves your memory store (`~/.kodelythecc/memory/`) and `tasks/lessons.md` untouched — your learned context is never overwritten
21
21
 
22
22
  ## Implementation
23
23
 
@@ -76,7 +76,7 @@ npx kodelyth-ecc@latest --target cursor-project # Cursor
76
76
 
77
77
  | Path | Protected |
78
78
  |------|-----------|
79
- | `~/.kodelyth/memory/` | Your BM25 memory store |
79
+ | `~/.kodelythecc/memory/` | Your BM25 memory store |
80
80
  | `tasks/lessons.md` | Project correction rules |
81
81
  | `tasks/todo.md` | Open todos |
82
82
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kodelyth-ecc",
3
- "version": "1.9.0",
3
+ "version": "1.9.1",
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",
@@ -79,7 +79,7 @@ Emit exactly one block, then proceed normally:
79
79
 
80
80
  ## Per-team configurability
81
81
 
82
- Teams override the defaults via env vars or `.kodelyth/router.json`:
82
+ Teams override the defaults via env vars or `.kodelythecc/router.json`:
83
83
 
84
84
  ### Env vars
85
85
 
@@ -91,7 +91,7 @@ Teams override the defaults via env vars or `.kodelyth/router.json`:
91
91
  | `KODELYTH_ROUTER_HARD=<model-id>` | Override hard tier. |
92
92
  | `KODELYTH_ROUTER_DEFAULT=<trivial\|standard\|hard>` | Default tier for ambiguous tasks (default `standard`). |
93
93
 
94
- ### Project file: `.kodelyth/router.json`
94
+ ### Project file: `.kodelythecc/router.json`
95
95
 
96
96
  ```json
97
97
  {
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## What is Kodelyth Memory
6
6
 
7
- A local file at `~/.kodelyth/memory/memories.jsonl` storing solutions, patterns, and gotchas extracted from past sessions. Retrieval is BM25 (keyword + tag matching). It is **not** a learned model — it is a retrieval store that gives you better context.
7
+ A local file at `~/.kodelythecc/memory/memories.jsonl` storing solutions, patterns, and gotchas extracted from past sessions. Retrieval is BM25 (keyword + tag matching). It is **not** a learned model — it is a retrieval store that gives you better context.
8
8
 
9
9
  **Cross-IDE: the same file is read/written by every IDE on this machine.** A memory captured in Claude Code is recall-able from Windsurf, Cursor, Antigravity, Codex, and any other MCP-capable client. There is one shared store.
10
10
 
@@ -84,4 +84,4 @@ The injected memory block is structured so its prefix is identical across calls
84
84
 
85
85
  If the user asks "how do you know that about me?", answer plainly:
86
86
 
87
- > "It's in your local Kodelyth Memory at `~/.kodelyth/memory/`. You can inspect it, edit it, or delete it any time. Nothing was sent anywhere."
87
+ > "It's in your local Kodelyth Memory at `~/.kodelythecc/memory/`. You can inspect it, edit it, or delete it any time. Nothing was sent anywhere."
@@ -117,7 +117,7 @@ ECC uses three compounding memory layers — together they make Claude increasin
117
117
  - Edit freely — these are YOUR rules for this project
118
118
  - Example: "Always use pnpm. Never npm. Never yarn."
119
119
 
120
- ### Layer 2 — Global Memory (`~/.kodelyth/memory/`)
120
+ ### Layer 2 — Global Memory (`~/.kodelythecc/memory/`)
121
121
  - Cross-project. BM25 fuzzy search. Solution patterns.
122
122
  - Captures solutions from every session
123
123
  - Auto-recalls relevant past solutions on every prompt you type
@@ -31,6 +31,28 @@ const TARGET_MAP = {
31
31
  'gemini-cli': ['init', '-g', '--gemini'],
32
32
  };
33
33
 
34
+ // ── Detect which IDEs ECC has already been installed for on this machine ─────
35
+ // Returns list of ECC install-target strings that have visible ECC artifacts.
36
+ function detectInstalledTargets() {
37
+ const home = os.homedir();
38
+ const targets = [];
39
+ const checks = [
40
+ { target: 'claude-code', dir: path.join(home, '.claude', 'agents') },
41
+ { target: 'cursor', dir: path.join(home, '.cursor', 'rules') },
42
+ { target: 'windsurf-home', dir: path.join(home, '.codeium', 'windsurf', 'memories') },
43
+ { target: 'antigravity', dir: path.join(home, '.antigravity') },
44
+ { target: 'codex-home', dir: path.join(home, '.codex') },
45
+ { target: 'opencode', dir: path.join(home, '.config', 'opencode') },
46
+ { target: 'gemini-cli', dir: path.join(home, '.gemini') },
47
+ ];
48
+ for (const { target, dir } of checks) {
49
+ try {
50
+ if (fs.existsSync(dir) && fs.readdirSync(dir).length > 0) targets.push(target);
51
+ } catch { /* skip */ }
52
+ }
53
+ return targets;
54
+ }
55
+
34
56
  function isInstalled() {
35
57
  try {
36
58
  execFileSync('rtk', ['--version'], { stdio: 'ignore' });
@@ -100,7 +122,10 @@ function enableFor(target, { log = () => {} } = {}) {
100
122
  }
101
123
 
102
124
  log(`[rtk] wiring RTK into ${target} …`);
103
- const r = spawnSync('rtk', [...rtkArgs, '--auto-patch'], { encoding: 'utf8' });
125
+ // --auto-patch is only accepted by the default Claude Code hook flow.
126
+ // Other agent flags (--codex, --gemini, --opencode, --agent X) reject it.
127
+ const finalArgs = target === 'claude-code' ? [...rtkArgs, '--auto-patch'] : rtkArgs;
128
+ const r = spawnSync('rtk', finalArgs, { encoding: 'utf8' });
104
129
  const output = (r.stdout || '') + (r.stderr || '');
105
130
  if (r.status !== 0) {
106
131
  return { enabled: false, skipped: true, reason: 'rtk init failed', output };
@@ -150,6 +175,7 @@ function savings({ days = 30 } = {}) {
150
175
 
151
176
  module.exports = {
152
177
  TARGET_MAP,
178
+ detectInstalledTargets,
153
179
  isInstalled,
154
180
  getVersion,
155
181
  install,
@@ -44,7 +44,7 @@ Weight signals together. Single signals are noisy; three or four together are re
44
44
 
45
45
  ### 2. Read the team's config
46
46
 
47
- Check for `.kodelyth/router.json` at the project root and these env vars:
47
+ Check for `.kodelythecc/router.json` at the project root and these env vars:
48
48
 
49
49
  ```
50
50
  KODELYTH_ROUTER off | (unset)
@@ -16,7 +16,7 @@ description: Local self-learning memory for AI coding sessions. Captures what wo
16
16
 
17
17
  ```
18
18
  ┌─────────────────┐ capture ┌─────────────────┐ inject ┌─────────────────┐
19
- │ Past session │ ─────────────→│ ~/.kodelyth/ │─────────────→│ Next session │
19
+ │ Past session │ ─────────────→│ ~/.kodelythecc/ │─────────────→│ Next session │
20
20
  │ (you solved X) │ │ memory/ │ │ (X comes up) │
21
21
  └─────────────────┘ └─────────────────┘ └─────────────────┘
22
22
 
@@ -29,7 +29,7 @@ description: Local self-learning memory for AI coding sessions. Captures what wo
29
29
 
30
30
  ## Storage layout
31
31
 
32
- All under `~/.kodelyth/memory/` (override with `KODELYTH_MEMORY_DIR`):
32
+ All under `~/.kodelythecc/memory/` (override with `KODELYTH_MEMORY_DIR`):
33
33
 
34
34
  | File | Purpose |
35
35
  |---|---|
@@ -109,9 +109,9 @@ For Anthropic models the cache TTL is 5 minutes — typing back-to-back during a
109
109
  ## Honest limits
110
110
 
111
111
  - **Not "the model learns"** — the model is unchanged. We're just feeding it better context.
112
- - **Per-machine by default** — sync via Dropbox/iCloud/git on `~/.kodelyth/memory/` if needed.
112
+ - **Per-machine by default** — sync via Dropbox/iCloud/git on `~/.kodelythecc/memory/` if needed.
113
113
  - **Cloud-AI platforms** (Windsurf, Antigravity, partial Cursor) — session data is server-side. Auto-extract from past sessions doesn't work there. Manual `/memory remember` still does.
114
- - **Privacy** — every byte stays on your disk. Verify with `ls -la ~/.kodelyth/memory/`.
114
+ - **Privacy** — every byte stays on your disk. Verify with `ls -la ~/.kodelythecc/memory/`.
115
115
 
116
116
  ## Anti-patterns
117
117
 
@@ -77,7 +77,7 @@ Snapshot of currently recorded signals:
77
77
 
78
78
  ### `kodelyth-ecc evolve analyze`
79
79
 
80
- Reads signals + your `~/.kodelyth/memory/` store, applies thresholds, and writes proposals to `~/.kodelyth/evolve/proposals.jsonl`. Idempotent — re-running with the same evidence produces the same proposal IDs and does NOT duplicate.
80
+ Reads signals + your `~/.kodelythecc/memory/` store, applies thresholds, and writes proposals to `~/.kodelythecc/evolve/proposals.jsonl`. Idempotent — re-running with the same evidence produces the same proposal IDs and does NOT duplicate.
81
81
 
82
82
  | Flag | Default | Effect |
83
83
  |---|---|---|
@@ -111,8 +111,8 @@ Marks a proposal `rejected`. Optional `--note` is preserved for the audit trail.
111
111
 
112
112
  The auto-recall hook (`hooks/memory/auto-recall.js`) does two things in addition to its normal job:
113
113
 
114
- 1. **On a memory surface** — calls `evolve.recordSurface({ memoryId, sessionId, projectRoot })`. This bumps the per-memory counter in `~/.kodelyth/evolve/reuse.json`. Idempotent per `(memoryId, sessionId)` — you can't game the counter by surfacing the same memory ten times in one session.
115
- 2. **On a substantive prompt with zero memory matches** — calls `evolve.recordRoutingMiss({ prompt, sessionId, projectRoot })`. Appends one line to `~/.kodelyth/evolve/routing-misses.jsonl`. The prompt is capped to 1000 chars and stored alongside its top tokens for clustering.
114
+ 1. **On a memory surface** — calls `evolve.recordSurface({ memoryId, sessionId, projectRoot })`. This bumps the per-memory counter in `~/.kodelythecc/evolve/reuse.json`. Idempotent per `(memoryId, sessionId)` — you can't game the counter by surfacing the same memory ten times in one session.
115
+ 2. **On a substantive prompt with zero memory matches** — calls `evolve.recordRoutingMiss({ prompt, sessionId, projectRoot })`. Appends one line to `~/.kodelythecc/evolve/routing-misses.jsonl`. The prompt is capped to 1000 chars and stored alongside its top tokens for clustering.
116
116
 
117
117
  Both calls are **fire-and-forget**: any error is swallowed silently. The hook NEVER blocks recall on stats failure.
118
118
 
@@ -157,7 +157,7 @@ Proposal IDs are deterministic over their evidence — the same evidence always
157
157
  ## Storage layout
158
158
 
159
159
  ```
160
- ~/.kodelyth/evolve/
160
+ ~/.kodelythecc/evolve/
161
161
  ├── reuse.json # per-memory reuse counters
162
162
  ├── routing-misses.jsonl # append-only miss log
163
163
  └── proposals.jsonl # append-only proposal events