eklavya 1.42.2 → 1.42.3

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.
@@ -17,6 +17,10 @@
17
17
  * snapshot the previous Bash call left. Agents edit through heredocs and
18
18
  * `sed -i` as often as through Edit -- a 39-call session made no Edit at all.
19
19
  * Files already dirty at the first snapshot count only if they move again.
20
+ * The snapshot covers the session's own tree and the one a leading
21
+ * `cd <dir> &&` names, one per repository: a session started in the main
22
+ * checkout that works in a sibling worktree edits only there, and the
23
+ * session's cwd never moves (36 Bash calls in one talea session, no nudge).
20
24
  *
21
25
  * PostToolUse rather than PreToolUse: a failed edit never gets here, so only an
22
26
  * edit that happened counts, and the nudge lands after the tool result the model
@@ -31,6 +35,7 @@
31
35
  * costs no git. No inference; fails open.
32
36
  */
33
37
  import fs from 'node:fs';
38
+ import os from 'node:os';
34
39
  import path from 'node:path';
35
40
  import { run, openExisting, config, cwdOf, sessionId } from './lib.js';
36
41
  import { git } from './changes-lib.js';
@@ -38,6 +43,8 @@ const EDIT_TOOLS = /^(Edit|Write|MultiEdit|NotebookEdit)$/;
38
43
  const KEY_PREFIX = 'delegate_nudge:';
39
44
  /** More dirty entries than this and the Bash snapshot is skipped: the row would be large and the signal is noise. */
40
45
  const MAX_SNAPSHOT = 2000;
46
+ /** Repositories whose snapshots are kept; the least recently touched goes first. */
47
+ const MAX_ROOTS = 4;
41
48
  const NUDGE = `[Eklavya] This task now edits more than one file. Hand the remaining work to one or more agents run in the background, each with a self-contained brief (goal, files, constraints, how to verify), and take back a short report. While they build, ask questions: get_session_quiz_plan with while_waiting: true, then AskUserQuestion, record_attempt and the verdict, one at a time, until an agent reports or questions_needed is 0. If the rest is a line or two, or agents cannot run in the background here, carry on inline.`;
42
49
  /** The same file under every spelling: a symlinked temp dir, `./a.ts`, `a.ts`. */
43
50
  function canonical(file) {
@@ -48,11 +55,25 @@ function canonical(file) {
48
55
  return path.resolve(file);
49
56
  }
50
57
  }
51
- /** Every entry `git status` reports, by absolute path, with its size and mtime; null outside a repository. */
52
- function dirtyStamps(cwd) {
53
- const root = git(cwd, ['rev-parse', '--show-toplevel'])?.trim();
54
- if (!root)
58
+ /**
59
+ * The directory a command's leading `cd` moves to, or null. Only the first
60
+ * word: `cd <dir> && …` is how agents work in another checkout. A `cd` later in
61
+ * the command, `pushd`, a subshell or a variable is not followed.
62
+ */
63
+ function leadingCd(command, cwd) {
64
+ const m = /^\s*cd\s+(?:"([^"]+)"|'([^']+)'|([^\s;&|]+))\s*(?:&&|;|\n|$)/.exec(command);
65
+ const dir = m?.[1] ?? m?.[2] ?? m?.[3];
66
+ if (!dir || dir.includes('$'))
55
67
  return null;
68
+ const home = dir === '~' || dir.startsWith('~/') ? path.join(os.homedir(), dir.slice(1)) : dir;
69
+ return path.resolve(cwd, home);
70
+ }
71
+ /** The repository root `dir` sits in, or null. */
72
+ function rootOf(dir) {
73
+ return git(dir, ['rev-parse', '--show-toplevel'])?.trim() || null;
74
+ }
75
+ /** Every entry `git status` reports under `root`, by absolute path, with its size and mtime; null on failure. */
76
+ function dirtyStamps(root) {
56
77
  const status = git(root, ['status', '--porcelain=v1', '-z', '-uall']);
57
78
  if (status === null)
58
79
  return null;
@@ -114,13 +135,20 @@ await run(async (input) => {
114
135
  return 0;
115
136
  // Outside the lock: git can take a moment, and nothing here needs the row.
116
137
  let changed;
117
- let snap;
138
+ let snaps;
118
139
  if (isBash) {
119
- const now = dirtyStamps(cwd);
120
- if (!now)
140
+ const command = typeof input.tool_input?.command === 'string' ? input.tool_input.command : '';
141
+ const target = leadingCd(command, cwd);
142
+ const roots = new Set([cwd, target].filter((d) => Boolean(d)).map(rootOf).filter((r) => Boolean(r)));
143
+ snaps = {};
144
+ for (const root of roots) {
145
+ const now = dirtyStamps(root);
146
+ if (now)
147
+ snaps[root] = now;
148
+ }
149
+ if (!Object.keys(snaps).length)
121
150
  return 0;
122
- snap = now;
123
- changed = []; // filled against the stored snapshot below
151
+ changed = []; // filled against the stored snapshots below
124
152
  }
125
153
  else {
126
154
  changed = [canonical(path.resolve(cwd, raw))];
@@ -131,23 +159,28 @@ await run(async (input) => {
131
159
  const state = read();
132
160
  if (state.done)
133
161
  return false;
134
- if (snap) {
135
- // ponytail: the first snapshot is taken after the first Bash call, so a
136
- // first command that already changed two files is caught only when a
137
- // later call changes one more. A PreToolUse snapshot would close it at
138
- // the cost of a second process on every Bash call.
139
- if (state.snap) {
140
- const before = state.snap;
141
- changed = Object.keys(snap).filter((f) => before[f] !== snap[f]);
162
+ if (snaps) {
163
+ // ponytail: a repository's first snapshot is taken after the first Bash
164
+ // call that reaches it, so a first command there that already changed
165
+ // two files is caught only when a later call changes one more. A
166
+ // PreToolUse snapshot would close it at the cost of a second process on
167
+ // every Bash call.
168
+ const kept = { ...state.snaps };
169
+ for (const [root, now] of Object.entries(snaps)) {
170
+ const before = kept[root];
171
+ if (before)
172
+ changed.push(...Object.keys(now).filter((f) => before[f] !== now[f]));
173
+ delete kept[root];
174
+ kept[root] = now; // re-inserted last: most recently touched
142
175
  }
143
- state.snap = snap;
176
+ state.snaps = Object.fromEntries(Object.entries(kept).slice(-MAX_ROOTS));
144
177
  }
145
178
  const others = [...new Set(changed)].filter((f) => f !== state.first);
146
179
  if (!state.first && others.length)
147
180
  state.first = others.shift();
148
181
  if (others.length) {
149
182
  state.done = true;
150
- delete state.snap;
183
+ delete state.snaps;
151
184
  }
152
185
  db.prepare('INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value').run(key, `${new Date().toISOString()}|${JSON.stringify(state)}`);
153
186
  return Boolean(state.done);
@@ -1 +1 @@
1
- {"version":3,"file":"delegate-nudge.js","sourceRoot":"","sources":["../../src/hooks/delegate-nudge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"delegate-nudge.js","sourceRoot":"","sources":["../../src/hooks/delegate-nudge.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "eklavya",
3
3
  "displayName": "Eklavya",
4
- "version": "1.42.2",
4
+ "version": "1.42.3",
5
5
  "description": "Learn while your agent works. Turns coding-agent generation time into adaptive, Socratic learning grounded in the code being written.",
6
6
  "author": {
7
7
  "name": "Ajay Kumar"
@@ -20,7 +20,7 @@ registrations, for ten rows total.
20
20
  | PostToolUse (all tools) | `capture-tool` | Record one memory event with a bounded result excerpt (none for reads and edits); no quiz, summarization or provider call |
21
21
  | PostToolUse (`mcp__.*log_session_concepts`) | `checkpoint-quiz` | Ask a due interleaved question after concepts are logged |
22
22
  | PostToolUse (`^(Bash|Edit|Write|MultiEdit|NotebookEdit)$`) | `checkpoint-quiz` | Mark an edit into a git tree for `only_on_changes`; recheck pacing as work continues; no spinner on every tool call |
23
- | PostToolUse (`^(Bash|Edit|Write|MultiEdit|NotebookEdit)$`) | `delegate-nudge` | With questions on and `delegate_work`, tell the parent once per session, at its second distinct changed file (edit tool path, or `git status` moving between Bash calls), to hand the rest to background agents; parent only; one git call per Bash until it fires; no inference |
23
+ | PostToolUse (`^(Bash|Edit|Write|MultiEdit|NotebookEdit)$`) | `delegate-nudge` | With questions on and `delegate_work`, tell the parent once per session, at its second distinct changed file (edit tool path, or `git status` moving between Bash calls in the session's repository and in the one a leading `cd <dir> &&` names), to hand the rest to background agents; parent only; git for at most two repositories per Bash until it fires; no inference |
24
24
  | Stop | `stop-quiz-check` | Record the turn's final message (parent only), flush the memory seam and request the remaining eligible quiz |
25
25
 
26
26
  The MCP matcher accepts both standalone and plugin-scoped names. Do not narrow
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eklavya",
3
- "version": "1.42.2",
3
+ "version": "1.42.3",
4
4
  "description": "Learn while your agent works — local knowledge graph, spaced repetition, and quiz gating for agent-assisted development.",
5
5
  "license": "MIT",
6
6
  "repository": {