eklavya 1.19.1 → 1.19.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/checkpoint-quiz.js +4 -2
- package/dist/hooks/checkpoint-quiz.js.map +1 -1
- package/dist/hooks/session-start.js +36 -13
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/hooks/CLAUDE.md +18 -2
- package/package.json +1 -1
|
@@ -144,12 +144,14 @@ If they pick Other or say skip, record it as grade 0, teach the answer in two li
|
|
|
144
144
|
// warning -- an error face on a feature that is working. The Stop sweep reached
|
|
145
145
|
// the same conclusion later and by the same route. So: additionalContext
|
|
146
146
|
// carries the instruction to the model, systemMessage tells the human why their
|
|
147
|
-
// agent just stopped to ask them something.
|
|
147
|
+
// agent just stopped to ask them something. `systemMessage` is a top-level
|
|
148
|
+
// field: it sat inside `hookSpecificOutput` for months, where the harness drops
|
|
149
|
+
// it, so the developer never saw that line at all.
|
|
148
150
|
process.stdout.write(`${JSON.stringify({
|
|
151
|
+
systemMessage: 'Eklavya: quick question on what you just built',
|
|
149
152
|
hookSpecificOutput: {
|
|
150
153
|
hookEventName: 'PostToolUse',
|
|
151
154
|
additionalContext: context,
|
|
152
|
-
systemMessage: 'Eklavya: quick question on what you just built',
|
|
153
155
|
},
|
|
154
156
|
})}\n`);
|
|
155
157
|
return 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint-quiz.js","sourceRoot":"","sources":["../../src/hooks/checkpoint-quiz.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"checkpoint-quiz.js","sourceRoot":"","sources":["../../src/hooks/checkpoint-quiz.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;IACxB,0EAA0E;IAC1E,8EAA8E;IAC9E,2EAA2E;IAC3E,gEAAgE;IAChE,IAAI,KAAK,CAAC,QAAQ;QAAE,OAAO,CAAC,CAAC;IAE7B,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IAElB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACzB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,GAClG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAErB,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IAC5B,+EAA+E;IAC/E,cAAc;IACd,IAAI,OAAO,KAAK,aAAa;QAAE,OAAO,CAAC,CAAC;IAExC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC;IACnB,IAAI,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAEpC,kDAAkD;IAClD,EAAE;IACF,+EAA+E;IAC/E,+EAA+E;IAC/E,4EAA4E;IAC5E,wCAAwC;IACxC,MAAM,KAAK,GAAG,EAAE;SACb,OAAO,CACN;;;;;;;;;;;;;;;;;;mGAkB6F,CAC9F;SACA,GAAG,CAAC,EAAE,GAAG,EAAE,CAED,CAAC;IAEd,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IAErB,8EAA8E;IAC9E,8CAA8C;IAC9C,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAEpC,8EAA8E;IAC9E,IAAI,KAAK,CAAC,KAAK,IAAI,sBAAsB;QAAE,OAAO,CAAC,CAAC;IACpD,IAAI,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,+BAA+B;QAAE,OAAO,CAAC,CAAC;IACpF,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,+BAA+B;QAAE,OAAO,CAAC,CAAC;IAChF,8EAA8E;IAE9E,6EAA6E;IAC7E,gFAAgF;IAChF,gFAAgF;IAChF,aAAa;IACb,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CACN;;;;;;;;;;gBAUU,CACX;SACA,GAAG,CAAC,EAAE,GAAG,EAAE,CAAoC,CAAC;IAEnD,IAAI,CAAC,GAAG,EAAE,OAAO;QAAE,OAAO,CAAC,CAAC;IAE5B,4EAA4E;IAC5E,iFAAiF;IACjF,kEAAkE;IAClE,EAAE,CAAC,OAAO,CACR;;;;kDAI8C,CAC/C,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAEf,MAAM,SAAS,GAAG,sBAAsB,GAAG,KAAK,CAAC,KAAK,CAAC;IACvD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG;;WAEP,GAAG,CAAC,OAAO;;;;;OAKf,eAAe,EAAE;;;;6CAIqB,SAAS;EACpD,OAAO;qHAC4G,CAAC;IAEpH,gFAAgF;IAChF,gFAAgF;IAChF,yEAAyE;IACzE,gFAAgF;IAChF,2EAA2E;IAC3E,gFAAgF;IAChF,mDAAmD;IACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CAAC;QAChB,aAAa,EAAE,gDAAgD;QAC/D,kBAAkB,EAAE;YAClB,aAAa,EAAE,aAAa;YAC5B,iBAAiB,EAAE,OAAO;SAC3B;KACF,CAAC,IAAI,CACP,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC,CAAC,CAAC"}
|
|
@@ -65,7 +65,6 @@ await run(async (input) => {
|
|
|
65
65
|
// holds, mark the seam, and drain any batch the last session left queued.
|
|
66
66
|
const identity = identityOf(input, cwd, sid);
|
|
67
67
|
const memoryContext = [];
|
|
68
|
-
const dormant = [];
|
|
69
68
|
const memoryEnabled = resolved.config.memory.enabled;
|
|
70
69
|
if (memoryEnabled) {
|
|
71
70
|
replaySpool(db);
|
|
@@ -93,21 +92,22 @@ await run(async (input) => {
|
|
|
93
92
|
// silence is a plugin you conclude is broken. It was not: memory was
|
|
94
93
|
// recording the entire time, with no way to tell from the outside. One line
|
|
95
94
|
// costs nothing and answers the question before it is asked.
|
|
95
|
+
const shown = [];
|
|
96
96
|
if (!quiet) {
|
|
97
|
-
|
|
97
|
+
shown.push(memoryEnabled
|
|
98
98
|
? '[Eklavya] Questions are off for this project (`quiz.enabled: false`). Memory is still recording and recalling — `memory.enabled: false` is the dial for that.'
|
|
99
99
|
: '[Eklavya] Questions and memory are both off for this project. Nothing is being recorded.');
|
|
100
100
|
}
|
|
101
|
-
|
|
102
|
-
if (dormant.length)
|
|
103
|
-
process.stdout.write(`${dormant.join('\n')}\n`);
|
|
104
|
-
return 0;
|
|
101
|
+
return emit(shown, memoryContext);
|
|
105
102
|
}
|
|
106
103
|
// Fires on resume and after a compaction too, with the same session id, so a
|
|
107
104
|
// session silenced an hour ago stays silent rather than greeting its way back.
|
|
108
105
|
if (isSessionOff(db, sid))
|
|
109
106
|
return 0;
|
|
110
|
-
|
|
107
|
+
// Two audiences, two channels. `shown` is for the developer; `context` is for
|
|
108
|
+
// the model. See `emit` for why they cannot share one.
|
|
109
|
+
const shown = [];
|
|
110
|
+
const context = [];
|
|
111
111
|
// `quiet` suppresses the banner, and only the banner. It used to return here,
|
|
112
112
|
// which also dropped the directive below -- so a developer who turned the
|
|
113
113
|
// greeting off silently turned the whole product off: nothing was logged, so
|
|
@@ -126,7 +126,7 @@ await run(async (input) => {
|
|
|
126
126
|
const standing = levelStanding(db, resolved.config, resolved.repoRoot);
|
|
127
127
|
levelLabel = `${standing.level} (${standing.counts.passed}/${standing.needed.answers})`;
|
|
128
128
|
}
|
|
129
|
-
banner(db,
|
|
129
|
+
banner(db, shown, {
|
|
130
130
|
project: identity.project,
|
|
131
131
|
memory: resolved.config.memory.enabled,
|
|
132
132
|
levelLabel,
|
|
@@ -139,7 +139,7 @@ await run(async (input) => {
|
|
|
139
139
|
// a Bash call, and Cowork sessions do not commit. Better to say so once per
|
|
140
140
|
// session than to let someone believe an unenforceable setting is enforcing.
|
|
141
141
|
if (quiz.enforced && isCowork()) {
|
|
142
|
-
|
|
142
|
+
shown.push('[Eklavya] Quizzing is enforced, but this is a Cowork session: the commit gate holds `git commit`, ' +
|
|
143
143
|
'and there are no commits here. Questions still come and the gate still records — nothing is blocked.');
|
|
144
144
|
}
|
|
145
145
|
// The directive is on screen again, so the nudge's clock starts again. This
|
|
@@ -150,11 +150,34 @@ await run(async (input) => {
|
|
|
150
150
|
clearNudgeState(db, sid);
|
|
151
151
|
// Before the directive: it is what the session is *about*, and the directive
|
|
152
152
|
// is what to do about it.
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
return 0;
|
|
153
|
+
context.push(...memoryContext);
|
|
154
|
+
context.push(withSurfaceNote(DIRECTIVE));
|
|
155
|
+
return emit(shown, context);
|
|
157
156
|
});
|
|
157
|
+
/**
|
|
158
|
+
* One envelope, split by audience.
|
|
159
|
+
*
|
|
160
|
+
* This hook used to print everything as plain stdout, and on SessionStart plain
|
|
161
|
+
* stdout is context: the model reads it and the developer never sees it. So the
|
|
162
|
+
* banner -- three lines written for a person, and the "questions are off, memory
|
|
163
|
+
* is still recording" line that exists precisely so a quiet install does not
|
|
164
|
+
* look broken -- went to the one reader it was not for, and every session opened
|
|
165
|
+
* in silence. `systemMessage` is the only field the harness renders to the
|
|
166
|
+
* developer (top level, not inside `hookSpecificOutput`, where it is dropped);
|
|
167
|
+
* `additionalContext` is the model's. Nothing is sent to both: the model has
|
|
168
|
+
* `get_config` and `get_learner_profile` for anything the banner says.
|
|
169
|
+
*/
|
|
170
|
+
function emit(shown, context) {
|
|
171
|
+
if (!shown.length && !context.length)
|
|
172
|
+
return 0;
|
|
173
|
+
process.stdout.write(`${JSON.stringify({
|
|
174
|
+
...(shown.length > 0 && { systemMessage: shown.join('\n') }),
|
|
175
|
+
...(context.length > 0 && {
|
|
176
|
+
hookSpecificOutput: { hookEventName: 'SessionStart', additionalContext: context.join('\n') },
|
|
177
|
+
}),
|
|
178
|
+
})}\n`);
|
|
179
|
+
return 0;
|
|
180
|
+
}
|
|
158
181
|
/**
|
|
159
182
|
* The developer-facing greeting, and everything `quiet` is about.
|
|
160
183
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAW,MAAM,UAAU,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,SAAS,GAAG;;;;;;;;;;;kEAWgD,CAAC;AAEnE,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;IACxB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzB,6EAA6E;IAC7E,6EAA6E;IAC7E,6EAA6E;IAC7E,6EAA6E;IAC7E,iEAAiE;IACjE,EAAE;IACF,6EAA6E;IAC7E,+EAA+E;IAC/E,2EAA2E;IAC3E,8EAA8E;IAC9E,sEAAsE;IACtE,MAAM,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,QAAQ;QAAE,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IAExE,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IAElB,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEjC,8EAA8E;IAC9E,kEAAkE;IAClE,IAAI,GAAG;QAAE,iBAAiB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC;IAEpD,2EAA2E;IAC3E,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAW,MAAM,UAAU,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,SAAS,GAAG;;;;;;;;;;;kEAWgD,CAAC;AAEnE,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;IACxB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzB,6EAA6E;IAC7E,6EAA6E;IAC7E,6EAA6E;IAC7E,6EAA6E;IAC7E,iEAAiE;IACjE,EAAE;IACF,6EAA6E;IAC7E,+EAA+E;IAC/E,2EAA2E;IAC3E,8EAA8E;IAC9E,sEAAsE;IACtE,MAAM,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,QAAQ;QAAE,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IAExE,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IAElB,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEjC,8EAA8E;IAC9E,kEAAkE;IAClE,IAAI,GAAG;QAAE,iBAAiB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC;IAEpD,2EAA2E;IAC3E,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;IACrD,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,yEAAyE;QACzE,2EAA2E;QAC3E,WAAW;QACX,MAAM,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAC7B,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB;YACxE,IAAI,EAAE,UAAU,KAAK,CAAC,MAAM,IAAI,SAAS,QAAQ,GAAG,EAAE;SACvD,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QACnE,IAAI,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,sEAAsE;QACtE,uDAAuD;QACvD,EAAE;QACF,0EAA0E;QAC1E,4EAA4E;QAC5E,4EAA4E;QAC5E,sEAAsE;QACtE,qEAAqE;QACrE,4EAA4E;QAC5E,6DAA6D;QAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,CAAC,IAAI,CACR,aAAa;gBACX,CAAC,CAAC,+JAA+J;gBACjK,CAAC,CAAC,0FAA0F,CAC/F,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACpC,CAAC;IACD,6EAA6E;IAC7E,+EAA+E;IAC/E,IAAI,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAEpC,8EAA8E;IAC9E,uDAAuD;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,8EAA8E;IAC9E,0EAA0E;IAC1E,6EAA6E;IAC7E,0EAA0E;IAC1E,iFAAiF;IACjF,4EAA4E;IAC5E,yEAAyE;IACzE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,4EAA4E;QAC5E,uEAAuE;QACvE,0EAA0E;QAC1E,yEAAyE;QACzE,0DAA0D;QAC1D,IAAI,UAAU,GAAG,GAAG,UAAU,WAAW,CAAC;QAC1C,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACvE,UAAU,GAAG,GAAG,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC;QAC1F,CAAC;QACD,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE;YAChB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;YACtC,UAAU;YACV,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,8EAA8E;IAC9E,+EAA+E;IAC/E,4EAA4E;IAC5E,6EAA6E;IAC7E,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CACR,oGAAoG;YAClG,sGAAsG,CACzG,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,6EAA6E;IAC7E,yCAAyC;IACzC,IAAI,GAAG;QAAE,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAElC,6EAA6E;IAC7E,0BAA0B;IAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,SAAS,IAAI,CAAC,KAAe,EAAE,OAAiB;IAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CAAC;QAChB,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI;YACxB,kBAAkB,EAAE,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC7F,CAAC;KACH,CAAC,IAAI,CACP,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AASD;;;;;;;;;;;;GAYG;AACH,SAAS,MAAM,CAAC,EAAM,EAAE,GAAa,EAAE,KAAkB;IACvD,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,KAAiC,CAAC;IAC7E,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClB,0EAA0E;IAC1E,wEAAwE;IACxE,IAAI,KAAK,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,4EAA4E;IAC5E,4EAA4E;IAC5E,oDAAoD;IACpD,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAElD,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,qEAAqE;QACrE,mDAAmD;QACnD,GAAG,CAAC,IAAI,CACN,iEAAiE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAC9F,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eklavya",
|
|
3
3
|
"displayName": "Eklavya",
|
|
4
|
-
"version": "1.19.
|
|
4
|
+
"version": "1.19.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"
|
|
@@ -34,7 +34,7 @@ else.
|
|
|
34
34
|
|
|
35
35
|
| Event | Matcher | Timeout | Script | Job |
|
|
36
36
|
|---|---|---|---|---|
|
|
37
|
-
| SessionStart | — | 10s | `session-start` | stamp this checkout's session pointer (`meta.current_session:<repo root>`), replay the spool, summarise the last session's batch, recall this project's memory,
|
|
37
|
+
| SessionStart | — | 10s | `session-start` | stamp this checkout's session pointer (`meta.current_session:<repo root>`), replay the spool, summarise the last session's batch, recall this project's memory, show the developer the profile banner (`systemMessage`) and hand the model the recall and the standing log directive (`additionalContext`) |
|
|
38
38
|
| UserPromptSubmit | — | 10s | `prompt-submit-nudge` | re-stamp this checkout's session pointer, then re-state the log directive in one line, but only for a session that has logged nothing after a grace window |
|
|
39
39
|
| SubagentStart | — | 10s | `subagent-start` | give a delegated agent the log directive the parent's SessionStart never reached it with |
|
|
40
40
|
| PreToolUse | `Bash` | 10s | `pre-tool-gate` | with `quiz.enforced` only, deny a `git commit` whose session gate has not passed |
|
|
@@ -72,9 +72,25 @@ the prefix depends on how the plugin was installed —
|
|
|
72
72
|
catches both; anchoring it to one spelling silently disables the checkpoint for
|
|
73
73
|
half the installs.
|
|
74
74
|
|
|
75
|
+
## Two audiences, two channels
|
|
76
|
+
|
|
77
|
+
Every line a hook writes is for the developer or for the model, and each has
|
|
78
|
+
exactly one channel: top-level `systemMessage` is rendered to the developer,
|
|
79
|
+
`hookSpecificOutput.additionalContext` is read by the model. Plain stdout is
|
|
80
|
+
never used. On `SessionStart` it is accepted, but as context only — the banner
|
|
81
|
+
went out that way for months and every session opened in apparent silence while
|
|
82
|
+
the model read three lines meant for a person. And `systemMessage` is **top
|
|
83
|
+
level**: nested inside `hookSpecificOutput` the harness drops it, which is how
|
|
84
|
+
the checkpoint's one line to the developer went unseen for just as long.
|
|
85
|
+
`docs/verified-schemas.md` has the per-hook table; `mcp/test/hooks.test.ts`
|
|
86
|
+
asserts on `shown` and `context` separately, and its `systemMessage()` helper
|
|
87
|
+
throws on the nested placement, so a new hook cannot repeat either mistake
|
|
88
|
+
without a test saying so.
|
|
89
|
+
|
|
75
90
|
## SubagentStart needs the JSON form, and skips the tutor
|
|
76
91
|
|
|
77
|
-
`SessionStart`
|
|
92
|
+
`SessionStart` accepts raw stdout as context (Eklavya no longer uses it — see
|
|
93
|
+
above). `SubagentStart` does not: it
|
|
78
94
|
reads `hookSpecificOutput.additionalContext` and drops anything else in silence,
|
|
79
95
|
so the wrong form is a hook that runs, exits 0, and does nothing. That is the
|
|
80
96
|
one thing `subagent-start.ts` cannot get wrong, and `mcp/test/hooks.test.ts`
|
package/package.json
CHANGED