eklavya 1.43.1 → 1.43.2
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/dist/hooks/changes-lib.js +93 -13
- package/dist/hooks/changes-lib.js.map +1 -1
- package/dist/hooks/checkpoint-quiz.js +5 -1
- package/dist/hooks/checkpoint-quiz.js.map +1 -1
- package/dist/hooks/delegate-nudge.js +1 -15
- package/dist/hooks/delegate-nudge.js.map +1 -1
- package/dist/hooks/stop-quiz-check.js +44 -21
- package/dist/hooks/stop-quiz-check.js.map +1 -1
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/hooks/CLAUDE.md +6 -3
- package/package.json +1 -1
|
@@ -28,6 +28,15 @@
|
|
|
28
28
|
* notes, plans, a scratchpad -- are outside any tree and do not count. Git
|
|
29
29
|
* still covers Bash edits in the session's own tree.
|
|
30
30
|
*
|
|
31
|
+
* Bash edits in that sibling worktree are the same layout through the other
|
|
32
|
+
* door: `cd <worktree>; sed -i …` touches no edit tool and leaves the session's
|
|
33
|
+
* own tree alone, so a quietflip session of 250 Bash calls and no Edit got no
|
|
34
|
+
* question at all while the delegate nudge, which follows the `cd`, fired. So
|
|
35
|
+
* the checkpoint hook also marks the session (`noteBashEdit`) when the tree a
|
|
36
|
+
* Bash command's leading `cd` names lists a file modified since the session
|
|
37
|
+
* began. The session-start time is the baseline's own stamp, so the first
|
|
38
|
+
* command in a tree counts without any snapshot of it.
|
|
39
|
+
*
|
|
31
40
|
* Known edges, all accepted:
|
|
32
41
|
* - a file already dirty at session start, edited and then reverted, still
|
|
33
42
|
* counts (its mtime moved; a clean file reverted is clean again and does not);
|
|
@@ -38,6 +47,7 @@
|
|
|
38
47
|
import { spawnSync } from 'node:child_process';
|
|
39
48
|
import { createHash } from 'node:crypto';
|
|
40
49
|
import fs from 'node:fs';
|
|
50
|
+
import os from 'node:os';
|
|
41
51
|
import path from 'node:path';
|
|
42
52
|
const KEY_PREFIX = 'tree_fp:';
|
|
43
53
|
/** A hook has ten seconds in all; git gets a fraction of it. */
|
|
@@ -52,21 +62,13 @@ export function treeFingerprint(cwd) {
|
|
|
52
62
|
const root = git(cwd, ['rev-parse', '--show-toplevel'])?.trim();
|
|
53
63
|
if (!root)
|
|
54
64
|
return null;
|
|
55
|
-
const
|
|
56
|
-
if (
|
|
65
|
+
const entries = statusEntries(root);
|
|
66
|
+
if (entries === null)
|
|
57
67
|
return null;
|
|
58
68
|
// An unborn branch has no HEAD; the status entries still fingerprint it.
|
|
59
69
|
const head = git(root, ['rev-parse', '--verify', '-q', 'HEAD'])?.trim() ?? '';
|
|
60
70
|
const hash = createHash('sha1').update(head);
|
|
61
|
-
const
|
|
62
|
-
for (let i = 0; i < entries.length; i++) {
|
|
63
|
-
const entry = entries[i];
|
|
64
|
-
if (entry.length < 4)
|
|
65
|
-
continue;
|
|
66
|
-
// `R` and `C` entries carry the source path as the next NUL field.
|
|
67
|
-
if (entry[0] === 'R' || entry[0] === 'C')
|
|
68
|
-
i++;
|
|
69
|
-
const rel = entry.slice(3);
|
|
71
|
+
for (const { entry, rel } of entries) {
|
|
70
72
|
let stamp = 'gone';
|
|
71
73
|
try {
|
|
72
74
|
const st = fs.statSync(path.join(root, rel));
|
|
@@ -83,6 +85,24 @@ export function treeFingerprint(cwd) {
|
|
|
83
85
|
return null;
|
|
84
86
|
}
|
|
85
87
|
}
|
|
88
|
+
/** Every entry `git status` reports under `root`, with its path relative to it; null on failure. */
|
|
89
|
+
function statusEntries(root) {
|
|
90
|
+
const status = git(root, ['status', '--porcelain=v1', '-z', '-uall']);
|
|
91
|
+
if (status === null)
|
|
92
|
+
return null;
|
|
93
|
+
const out = [];
|
|
94
|
+
const entries = status.split('\0');
|
|
95
|
+
for (let i = 0; i < entries.length; i++) {
|
|
96
|
+
const entry = entries[i];
|
|
97
|
+
if (entry.length < 4)
|
|
98
|
+
continue;
|
|
99
|
+
// `R` and `C` entries carry the source path as the next NUL field.
|
|
100
|
+
if (entry[0] === 'R' || entry[0] === 'C')
|
|
101
|
+
i++;
|
|
102
|
+
out.push({ entry, rel: entry.slice(3) });
|
|
103
|
+
}
|
|
104
|
+
return out;
|
|
105
|
+
}
|
|
86
106
|
/**
|
|
87
107
|
* Records the session's baseline, once. `session-start` also fires on resume
|
|
88
108
|
* and after a compaction with the same session id, and overwriting there would
|
|
@@ -179,11 +199,71 @@ export function noteEdit(db, sessionId, file) {
|
|
|
179
199
|
try {
|
|
180
200
|
if (!path.isAbsolute(file) || editMarked(db, sessionId) || !inWorkTree(file))
|
|
181
201
|
return;
|
|
182
|
-
db
|
|
183
|
-
db.prepare('INSERT OR IGNORE INTO meta (key, value) VALUES (?, ?)').run(`${EDIT_PREFIX}${sessionId}`, new Date().toISOString());
|
|
202
|
+
markEdit(db, sessionId);
|
|
184
203
|
}
|
|
185
204
|
catch {
|
|
186
205
|
/* Unmarked falls back to the git comparison. */
|
|
187
206
|
}
|
|
188
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* The directory a command's leading `cd` moves to, or null. Only the first
|
|
210
|
+
* word: `cd <dir> && …` is how agents work in another checkout. A `cd` later in
|
|
211
|
+
* the command, `pushd`, a subshell or a variable is not followed.
|
|
212
|
+
*/
|
|
213
|
+
export function leadingCd(command, cwd) {
|
|
214
|
+
const m = /^\s*cd\s+(?:"([^"]+)"|'([^']+)'|([^\s;&|]+))\s*(?:&&|;|\n|$)/.exec(command);
|
|
215
|
+
const dir = m?.[1] ?? m?.[2] ?? m?.[3];
|
|
216
|
+
if (!dir || dir.includes('$'))
|
|
217
|
+
return null;
|
|
218
|
+
const home = dir === '~' || dir.startsWith('~/') ? path.join(os.homedir(), dir.slice(1)) : dir;
|
|
219
|
+
return path.resolve(cwd, home);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Marks the session, once, when a Bash command's leading `cd` names a git tree
|
|
223
|
+
* that lists a file modified since the session began -- the sibling-worktree
|
|
224
|
+
* edit no edit tool and no fingerprint of the session's own tree sees. Ignored
|
|
225
|
+
* files never appear in `git status`, so build output does not count. Without
|
|
226
|
+
* a baseline (a session started outside any repository) there is no start time
|
|
227
|
+
* to compare against, and nothing is marked.
|
|
228
|
+
*
|
|
229
|
+
* Known edges, accepted with the rest above: a file the developer edits in that
|
|
230
|
+
* tree by hand during the session counts, and so does a command that only
|
|
231
|
+
* reads there after such an edit. Both err towards asking.
|
|
232
|
+
*/
|
|
233
|
+
export function noteBashEdit(db, sessionId, cwd, command) {
|
|
234
|
+
try {
|
|
235
|
+
if (editMarked(db, sessionId))
|
|
236
|
+
return;
|
|
237
|
+
const target = leadingCd(command, cwd);
|
|
238
|
+
if (!target)
|
|
239
|
+
return;
|
|
240
|
+
const row = db.prepare('SELECT value FROM meta WHERE key = ?').get(`${KEY_PREFIX}${sessionId}`);
|
|
241
|
+
const since = row ? Date.parse(row.value.slice(0, row.value.indexOf('|'))) : NaN;
|
|
242
|
+
if (Number.isNaN(since))
|
|
243
|
+
return;
|
|
244
|
+
const root = git(target, ['rev-parse', '--show-toplevel'])?.trim();
|
|
245
|
+
if (!root)
|
|
246
|
+
return;
|
|
247
|
+
const entries = statusEntries(root);
|
|
248
|
+
if (!entries)
|
|
249
|
+
return;
|
|
250
|
+
const moved = entries.some(({ rel }) => {
|
|
251
|
+
try {
|
|
252
|
+
return fs.statSync(path.join(root, rel)).mtimeMs >= since;
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
return false; // Deleted: no mtime to say when. The fingerprint still sees it in the session's own tree.
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
if (moved)
|
|
259
|
+
markEdit(db, sessionId);
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
/* Unmarked falls back to the git comparison. */
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
function markEdit(db, sessionId) {
|
|
266
|
+
db.prepare(`DELETE FROM meta WHERE key LIKE ? AND substr(value, 1, 10) < date('now', '-7 day')`).run(`${EDIT_PREFIX}%`);
|
|
267
|
+
db.prepare('INSERT OR IGNORE INTO meta (key, value) VALUES (?, ?)').run(`${EDIT_PREFIX}${sessionId}`, new Date().toISOString());
|
|
268
|
+
}
|
|
189
269
|
//# sourceMappingURL=changes-lib.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changes-lib.js","sourceRoot":"","sources":["../../src/hooks/changes-lib.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"changes-lib.js","sourceRoot":"","sources":["../../src/hooks/changes-lib.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,7 +43,7 @@ import { attributionRule } from '../surface.js';
|
|
|
43
43
|
import { run, openExisting, config, cwdOf, sessionId, minutesSince, framingFor } from './lib.js';
|
|
44
44
|
import { isSessionOff, noteActivity, workSince } from '../session.js';
|
|
45
45
|
import { countUse } from '../telemetry.js';
|
|
46
|
-
import { noteEdit, sessionChangedCode } from './changes-lib.js';
|
|
46
|
+
import { noteBashEdit, noteEdit, sessionChangedCode } from './changes-lib.js';
|
|
47
47
|
const EDIT_TOOLS = /^(Edit|Write|MultiEdit|NotebookEdit)$/;
|
|
48
48
|
await run(async (input) => {
|
|
49
49
|
const cwd = cwdOf(input);
|
|
@@ -70,6 +70,10 @@ await run(async (input) => {
|
|
|
70
70
|
if (quiz.only_on_changes && !quiz.enforced && EDIT_TOOLS.test(input.tool_name ?? '') && typeof file === 'string') {
|
|
71
71
|
noteEdit(db, workSid, file);
|
|
72
72
|
}
|
|
73
|
+
const command = input.tool_input?.command;
|
|
74
|
+
if (quiz.only_on_changes && !quiz.enforced && input.tool_name === 'Bash' && typeof command === 'string') {
|
|
75
|
+
noteBashEdit(db, workSid, cwd, command);
|
|
76
|
+
}
|
|
73
77
|
}
|
|
74
78
|
// `agent_id` is present only inside a subagent, and a subagent cannot ask the
|
|
75
79
|
// developer anything -- AskUserQuestion is not in its toolset, and the human
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint-quiz.js","sourceRoot":"","sources":["../../src/hooks/checkpoint-quiz.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAW,MAAM,UAAU,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"checkpoint-quiz.js","sourceRoot":"","sources":["../../src/hooks/checkpoint-quiz.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,10 +35,9 @@
|
|
|
35
35
|
* costs no git. No inference; fails open.
|
|
36
36
|
*/
|
|
37
37
|
import fs from 'node:fs';
|
|
38
|
-
import os from 'node:os';
|
|
39
38
|
import path from 'node:path';
|
|
40
39
|
import { run, openExisting, config, cwdOf, sessionId } from './lib.js';
|
|
41
|
-
import { git } from './changes-lib.js';
|
|
40
|
+
import { git, leadingCd } from './changes-lib.js';
|
|
42
41
|
const EDIT_TOOLS = /^(Edit|Write|MultiEdit|NotebookEdit)$/;
|
|
43
42
|
const KEY_PREFIX = 'delegate_nudge:';
|
|
44
43
|
/** More dirty entries than this and the Bash snapshot is skipped: the row would be large and the signal is noise. */
|
|
@@ -55,19 +54,6 @@ function canonical(file) {
|
|
|
55
54
|
return path.resolve(file);
|
|
56
55
|
}
|
|
57
56
|
}
|
|
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('$'))
|
|
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
57
|
/** The repository root `dir` sits in, or null. */
|
|
72
58
|
function rootOf(dir) {
|
|
73
59
|
return git(dir, ['rev-parse', '--show-toplevel'])?.trim() || null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegate-nudge.js","sourceRoot":"","sources":["../../src/hooks/delegate-nudge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"delegate-nudge.js","sourceRoot":"","sources":["../../src/hooks/delegate-nudge.ts"],"names":[],"mappings":"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"}
|
|
@@ -151,10 +151,25 @@ await run(async (input) => {
|
|
|
151
151
|
// Same helper and scope as the plan, so a block here is a plan there. Never
|
|
152
152
|
// under `quiz.enforced`, where an open gate asks only this session's work,
|
|
153
153
|
// nor under `learn` focus, where the plan asks from the topic instead.
|
|
154
|
+
//
|
|
155
|
+
// Unless the session logged nothing at all. That is the model skipping
|
|
156
|
+
// `log_session_concepts`, not a session with nothing to ask, and the fill
|
|
157
|
+
// above cannot cover it with a provider configured: it mines this session's
|
|
158
|
+
// memory entries, and the batch it just queued is summarised after this hook
|
|
159
|
+
// returns. One quietflip turn stopped at 10:28:30 and got its entries at
|
|
160
|
+
// 10:29:50 -- a whole task, no question. So a session that changed code and
|
|
161
|
+
// logged nothing is told to log first, then ask; review waits for a turn
|
|
162
|
+
// that has its own work behind it. Whatever `only_on_changes` says: with
|
|
163
|
+
// nothing logged, the change is the only evidence there was work to ask
|
|
164
|
+
// about, and a session without one keeps the review it always had.
|
|
154
165
|
let due = [];
|
|
166
|
+
let logFirst = false;
|
|
155
167
|
if (stats.unmastered <= 0) {
|
|
156
168
|
if (quiz.enforced || focus === 'learn')
|
|
157
169
|
return 0;
|
|
170
|
+
logFirst = stats.logged === 0 && sessionChangedCode(db, sid, cwd);
|
|
171
|
+
}
|
|
172
|
+
if (stats.unmastered <= 0 && !logFirst) {
|
|
158
173
|
const domains = [...new Set(sessionConcepts(db, sid).map((c) => c.domain))];
|
|
159
174
|
due = dueInProject(db, repoRoot, new Date(), domains, max_questions_per_task).map((c) => c.slug);
|
|
160
175
|
if (due.length === 0)
|
|
@@ -242,25 +257,27 @@ await run(async (input) => {
|
|
|
242
257
|
// earlier session's work. Enforced quizzing is exempt -- the gate exists for
|
|
243
258
|
// commits, and a commit is a change. Last among the guards because it spawns
|
|
244
259
|
// git, and before the stamp so a skipped sweep spends no block.
|
|
245
|
-
if (quiz.only_on_changes && !quiz.enforced && !sessionChangedCode(db, sid, cwd))
|
|
260
|
+
if (quiz.only_on_changes && !quiz.enforced && !logFirst && !sessionChangedCode(db, sid, cwd))
|
|
246
261
|
return 0;
|
|
247
|
-
const rows =
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
(
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
262
|
+
const rows = logFirst
|
|
263
|
+
? []
|
|
264
|
+
: db
|
|
265
|
+
.prepare(`SELECT c.slug AS line
|
|
266
|
+
FROM session_concepts sc
|
|
267
|
+
JOIN concepts c ON c.id = sc.concept_id
|
|
268
|
+
LEFT JOIN mastery m ON m.concept_id = c.id
|
|
269
|
+
WHERE sc.session_id = @sid
|
|
270
|
+
AND COALESCE(sc.origin,'work') = 'work'
|
|
271
|
+
${recent}
|
|
272
|
+
AND NOT (COALESCE(m.score,0) >= 0.7 AND COALESCE(m.reps,0) >= 2)
|
|
273
|
+
AND sc.concept_id NOT IN
|
|
274
|
+
(SELECT concept_id FROM attempts WHERE session_id = @sid)
|
|
275
|
+
ORDER BY sc.ts DESC, sc.rowid DESC
|
|
276
|
+
LIMIT @take`)
|
|
277
|
+
.all({ ...bind, take });
|
|
261
278
|
const names = due.length ? due.slice(0, take) : rows.map((r) => r.line);
|
|
262
279
|
/* c8 ignore next -- a concurrent answer between the two reads; the count above found one */
|
|
263
|
-
if (names.length === 0)
|
|
280
|
+
if (names.length === 0 && !logFirst)
|
|
264
281
|
return 0;
|
|
265
282
|
const concepts = names.join(', ');
|
|
266
283
|
// Stamp the guard BEFORE blocking. If anything below fails, the worst case is a
|
|
@@ -286,15 +303,21 @@ await run(async (input) => {
|
|
|
286
303
|
// each item's `context`). It is the next call the model makes, and only the
|
|
287
304
|
// model reads its result. This hook has been re-grown into a page of
|
|
288
305
|
// instructions before; do not put them back here.
|
|
289
|
-
const
|
|
290
|
-
const
|
|
291
|
-
|
|
292
|
-
|
|
306
|
+
const asked = logFirst ? take : names.length;
|
|
307
|
+
const count = asked === 1 ? 'one question' : `up to ${asked} questions, one at a time,`;
|
|
308
|
+
const what = logFirst
|
|
309
|
+
? `${count} on this work`
|
|
310
|
+
: due.length
|
|
311
|
+
? `${count} on earlier work in this project that is due again (${concepts})`
|
|
312
|
+
: `${count} on ${concepts}`;
|
|
313
|
+
const call = logFirst
|
|
314
|
+
? 'call log_session_concepts with the concepts it used, then get_session_quiz_plan, and follow it.'
|
|
315
|
+
: 'call get_session_quiz_plan and follow it.';
|
|
293
316
|
// The gate clause is true everywhere the gate can fire. On Cowork it cannot
|
|
294
317
|
// -- it matches `git commit`, and Cowork does not commit -- and session-start
|
|
295
318
|
// has already told this session that nothing is blocked.
|
|
296
319
|
const gate = quiz.enforced && !isCowork() ? ' The commit gate needs it.' : '';
|
|
297
|
-
const context = `Eklavya: ${what} before this turn ends -- call
|
|
320
|
+
const context = `Eklavya: ${what} before this turn ends -- ${call}${gate}`;
|
|
298
321
|
// exit 0 + JSON, not exit 2 + stderr. Both continue the turn and both pass
|
|
299
322
|
// through the same loop protections; only one of them tells the developer
|
|
300
323
|
// their session just hit an error. No `systemMessage` -- that field is a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-quiz-check.js","sourceRoot":"","sources":["../../src/hooks/stop-quiz-check.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"stop-quiz-check.js","sourceRoot":"","sources":["../../src/hooks/stop-quiz-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eklavya",
|
|
3
3
|
"displayName": "Eklavya",
|
|
4
|
-
"version": "1.43.
|
|
4
|
+
"version": "1.43.2",
|
|
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"
|
|
@@ -19,9 +19,9 @@ registrations, for ten rows total.
|
|
|
19
19
|
| PreToolUse (`^Read$`) | `file-context` | Add the file's past observations as `additionalContext`, once per file per session; parent only; never a permission decision; capture-path imports only |
|
|
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 as-you-go question after concepts are logged |
|
|
22
|
-
| PostToolUse (`^(Bash|Edit|Write|MultiEdit|NotebookEdit)$`) | `checkpoint-quiz` | Mark an edit into a git tree for `only_on_changes
|
|
22
|
+
| PostToolUse (`^(Bash|Edit|Write|MultiEdit|NotebookEdit)$`) | `checkpoint-quiz` | Mark an edit into a git tree for `only_on_changes` (edit tool path, or a Bash command whose leading `cd` tree lists a file modified since session start); recheck pacing as work continues; no spinner on every tool call |
|
|
23
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
|
-
| Stop | `stop-quiz-check` | Record the turn's final message (parent only), flush the memory seam and request the remaining eligible quiz |
|
|
24
|
+
| Stop | `stop-quiz-check` | Record the turn's final message (parent only), flush the memory seam and request the remaining eligible quiz; a session that changed code and logged nothing is asked to call `log_session_concepts` first |
|
|
25
25
|
|
|
26
26
|
The MCP matcher accepts both standalone and plugin-scoped names. Do not narrow
|
|
27
27
|
it to one prefix. Keep the work-tool regex anchored. Hook timeouts are 10 seconds,
|
|
@@ -108,7 +108,10 @@ work tool call, and a gap over `IDLE_BREAK_MINUTES` starts a new stretch),
|
|
|
108
108
|
newest first then last inserted, and so does the planner;
|
|
109
109
|
enforced gates are exempt. `quiz.only_on_changes` counts an edit-tool write
|
|
110
110
|
into any git working tree, not ignored (`noteEdit`, marked by the checkpoint
|
|
111
|
-
before its subagent and cadence exits),
|
|
111
|
+
before its subagent and cadence exits), and a Bash command whose leading
|
|
112
|
+
`cd` names a git tree with a file modified since the session's baseline was
|
|
113
|
+
recorded (`noteBashEdit`; `leadingCd` is shared with `delegate-nudge`), before
|
|
114
|
+
comparing git trees.
|
|
112
115
|
|
|
113
116
|
The shell lexer in `commit-lib.ts` recognizes common wrappers and nested shell
|
|
114
117
|
forms, with deliberate misses for aliases, variables and scripts. The optional
|
package/package.json
CHANGED