eklavya 1.52.0 → 1.52.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/README.md +1 -1
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/agents/explainer.md +3 -1
- package/dist/plugin/hooks/panel/model.ts +34 -0
- package/dist/plugin/hooks/panel/register.tsx +9 -3
- package/dist/tools/record_attempt.js +7 -3
- package/dist/tools/record_attempt.js.map +1 -1
- package/dist/user-skill/eklavya/SKILL.md +14 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -72,7 +72,7 @@ level.
|
|
|
72
72
|
right one, 2 for a near miss, 1 for a misconception), the right one in the
|
|
73
73
|
plan's `answer_position` slot, and an explanation. It stores the question and
|
|
74
74
|
returns at once; it writes no attempt. The panel records the answer through
|
|
75
|
-
`panel_answer` with the same code `record_attempt` uses, exactly once. `present_question` returns `panel_disabled` while `quiz.panel` is off, and
|
|
75
|
+
`panel_answer` with the same code `record_attempt` uses, exactly once. On a miss with `explain_on_wrong` on, its reply carries the same `explain` block `record_attempt` returns, and the panel starts the explainer agent from it. `present_question` returns `panel_disabled` while `quiz.panel` is off, and
|
|
76
76
|
`panel_sync` returns `{disabled: true}` and expires the session's open question without recording an attempt, so turning the panel back on cannot revive it; `panel_answer` answers only a question
|
|
77
77
|
that already exists. A round the learner asked for (a topic, `max`) is remembered per session: `present_question` takes each question off it and sets the last one's `more` false, and `get_session_quiz_plan` with `resume_round: true` plans what is left. This is
|
|
78
78
|
a Claude Code mod feature: a standalone MCP client has the tools but not the
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eklavya",
|
|
3
3
|
"displayName": "Eklavya",
|
|
4
|
-
"version": "1.52.
|
|
4
|
+
"version": "1.52.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"
|
|
@@ -46,7 +46,9 @@ In this order, each under its own `<h2>`:
|
|
|
46
46
|
signal. Under each option's text, its note as `<span class="note">…</span>`
|
|
47
47
|
when you were handed one, so the page reads like the question did. With no
|
|
48
48
|
options (a typed answer), show the stem, their answer and the right answer in
|
|
49
|
-
the same list.
|
|
49
|
+
the same list. When they typed their own answer although options were
|
|
50
|
+
offered, list every option, then their words as one more item with
|
|
51
|
+
`class="picked"`. Skip this section for a page someone asked for.
|
|
50
52
|
- **The short answer.** Two or three sentences a newcomer could repeat: what the
|
|
51
53
|
thing *does*, before what it is called.
|
|
52
54
|
- **Where the answer went wrong.** Name the misconception in the answer given
|
|
@@ -44,6 +44,40 @@ export const STR = {
|
|
|
44
44
|
off: 'The quiz panel is off. Turn it on with: eklavya config set quiz.panel true',
|
|
45
45
|
} as const
|
|
46
46
|
|
|
47
|
+
/** The explainer agent the panel starts itself, so no prompt lands in the transcript. */
|
|
48
|
+
export const EXPLAINER = 'eklavya:eklavya-explainer'
|
|
49
|
+
|
|
50
|
+
/** What `panel_answer`'s explain block carries; `record_attempt` builds it. */
|
|
51
|
+
export type ExplainBlock = {
|
|
52
|
+
concept: string
|
|
53
|
+
name: string
|
|
54
|
+
question: string
|
|
55
|
+
options: string[] | null
|
|
56
|
+
option_notes: (string | null)[] | null
|
|
57
|
+
answer: string | null
|
|
58
|
+
correct: string | null
|
|
59
|
+
attempt_id: number
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The explainer's task, written from the explain block alone: nothing else saw the question. */
|
|
63
|
+
export function explainerBrief(x: ExplainBlock): string {
|
|
64
|
+
const options = (x.options ?? []).map((o, i) => {
|
|
65
|
+
const note = x.option_notes?.[i]
|
|
66
|
+
return `${String.fromCharCode(65 + i)}. ${o}${note ? ` (note: ${note})` : ''}`
|
|
67
|
+
})
|
|
68
|
+
return [
|
|
69
|
+
`Write an explainer page on ${x.name} (concept slug ${x.concept}) for a question the learner missed.`,
|
|
70
|
+
`Question: ${x.question}`,
|
|
71
|
+
...(options.length ? ['Options, in order:', ...options] : []),
|
|
72
|
+
// Words typed under Other match no option, so say so; the page lists them as their own item.
|
|
73
|
+
x.answer && options.length && !x.options!.includes(x.answer)
|
|
74
|
+
? `The learner typed their own answer instead of picking: ${x.answer}`
|
|
75
|
+
: `The learner answered: ${x.answer ?? '(no answer)'}`,
|
|
76
|
+
...(x.correct ? [`The right answer: ${x.correct}`] : []),
|
|
77
|
+
`Pass --attempt ${x.attempt_id} to eklavya artifacts new.`,
|
|
78
|
+
].join('\n')
|
|
79
|
+
}
|
|
80
|
+
|
|
47
81
|
export const answerWas = (label: string): string => `The answer was: ${label}`
|
|
48
82
|
export const unplacedNotice = (): string => `A question is waiting. ${REOPEN} to open it.`
|
|
49
83
|
export const levelLine = (level: string, project: string): string => `You've cleared ${level} on ${project}.`
|
|
@@ -3,11 +3,13 @@ import type { EngineInterface, Register } from 'claude-code'
|
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
EMPTY,
|
|
6
|
+
EXPLAINER,
|
|
6
7
|
NEXT_PROMPT,
|
|
7
8
|
PANE,
|
|
8
9
|
REOPEN,
|
|
9
10
|
STR,
|
|
10
11
|
answerWas,
|
|
12
|
+
explainerBrief,
|
|
11
13
|
gradingRequest,
|
|
12
14
|
levelLine,
|
|
13
15
|
parseVerdict,
|
|
@@ -217,11 +219,15 @@ async function submit($: EngineInterface, wanted: PanelPending | null): Promise<
|
|
|
217
219
|
message: null,
|
|
218
220
|
}))
|
|
219
221
|
|
|
220
|
-
// A miss with explain_on_wrong on: the
|
|
221
|
-
//
|
|
222
|
+
// A miss with explain_on_wrong on: the panel starts the explainer itself in
|
|
223
|
+
// the background, so no prompt shows in the transcript and nothing waits.
|
|
224
|
+
// A refused spawn falls back to the queued prompt the model acts on.
|
|
222
225
|
if (out.explain?.instruction && explainedAttempt !== out.attempt_id) {
|
|
223
226
|
explainedAttempt = out.attempt_id
|
|
224
|
-
|
|
227
|
+
const spawned = await $.agent
|
|
228
|
+
.spawn({ subagentType: EXPLAINER, description: 'Eklavya explainer', prompt: explainerBrief(out.explain) })
|
|
229
|
+
.catch(() => null)
|
|
230
|
+
if (!spawned || spawned.deny) await $.prompt.submit({ text: String(out.explain.instruction) })
|
|
225
231
|
}
|
|
226
232
|
} catch {
|
|
227
233
|
if (epoch === mine) await fail($, STR.unreachable)
|
|
@@ -11,7 +11,7 @@ import { CWD_HINT, LIMITS, SESSION_HINT } from './types.js';
|
|
|
11
11
|
* contract: the grade and the one-line verdict are already given, the page is
|
|
12
12
|
* written by a background agent, and the session goes back to the work.
|
|
13
13
|
*/
|
|
14
|
-
export function explainInstruction(name, options, attemptId, notes) {
|
|
14
|
+
export function explainInstruction(name, options, attemptId, notes, answer = null, correct = null) {
|
|
15
15
|
// The tutor relays this in its own words, and a paraphrase kept only the
|
|
16
16
|
// picked and right options. Spelling them out makes the full list the thing
|
|
17
17
|
// it copies.
|
|
@@ -21,10 +21,14 @@ export function explainInstruction(name, options, attemptId, notes) {
|
|
|
21
21
|
// The note under each option is what the learner read in the question; the
|
|
22
22
|
// page shows it too, so the two look alike.
|
|
23
23
|
const noteLine = notes?.length ? ' Hand it the one-line note under each option as well, so the page shows each note under its option.' : '';
|
|
24
|
+
// The panel takes the answer itself, so the agent reading this never saw the
|
|
25
|
+
// pick; without it spelled out the page cannot mark the learner's option.
|
|
26
|
+
const picked = answer ? ` The learner answered: ${answer}.` : '';
|
|
27
|
+
const right = correct ? ` The right answer is: ${correct}.` : '';
|
|
24
28
|
// The attempt id links the page to this row, which is what lets the
|
|
25
29
|
// dashboard offer "Correct your answer" on it.
|
|
26
30
|
const link = ` Tell it to pass --attempt ${attemptId} to eklavya artifacts new.`;
|
|
27
|
-
return `Do not wait for this and do not explain further here. Start the eklavya-explainer agent (eklavya:eklavya-explainer when Eklavya is installed as a plugin) in the background, handing it the concept slug, the question, every option offered, the learner's answer and the right answer, so the page can show the question as it was asked.${list}${noteLine}${link} It writes an explainer page on ${name} and opens it. Tell the learner in one line that they missed it, what the right answer is, and that a page on it is on its way, then carry on with the task.`;
|
|
31
|
+
return `Do not wait for this and do not explain further here. Start the eklavya-explainer agent (eklavya:eklavya-explainer when Eklavya is installed as a plugin) in the background, handing it the concept slug, the question, every option offered, the learner's answer and the right answer, so the page can show the question as it was asked.${list}${picked}${right}${noteLine}${link} It writes an explainer page on ${name} and opens it. Tell the learner in one line that they missed it, what the right answer is, and that a page on it is on its way, then carry on with the task.`;
|
|
28
32
|
}
|
|
29
33
|
export const recordAttempt = {
|
|
30
34
|
name: 'record_attempt',
|
|
@@ -197,7 +201,7 @@ export function recordAttemptCore(db, args) {
|
|
|
197
201
|
answer: args.answer ?? null,
|
|
198
202
|
correct,
|
|
199
203
|
attempt_id: state.attemptId,
|
|
200
|
-
instruction: explainInstruction(concept.name, options, state.attemptId, optionNotes),
|
|
204
|
+
instruction: explainInstruction(concept.name, options, state.attemptId, optionNotes, args.answer ?? null, correct),
|
|
201
205
|
}
|
|
202
206
|
: null;
|
|
203
207
|
const after = levelStanding(db, config, repoRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record_attempt.js","sourceRoot":"","sources":["../../src/tools/record_attempt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,aAAa,EACb,aAAa,GAGd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAC;AAE1E;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,OAAwB,EACxB,SAAiB,EACjB,KAAsB;
|
|
1
|
+
{"version":3,"file":"record_attempt.js","sourceRoot":"","sources":["../../src/tools/record_attempt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: eklavya
|
|
3
|
-
description: "Operate Eklavya, the local memory and learning tool that records what this developer's agent did and quizzes them on it. Use when the user mentions Eklavya by name, asks what Eklavya remembers about a project or whether it is still capturing, or asks to change how often or how hard it quizzes them (its quiz, focus, cadence or difficulty dials), see their learning progress or mastery, open the dashboard, check the commit gate, update Eklavya, or find where their data lives. Do not use for ordinary coding help, for teaching a concept, or merely because a task is educational."
|
|
3
|
+
description: "Operate Eklavya, the local memory and learning tool that records what this developer's agent did and quizzes them on it. Use when the user mentions Eklavya by name, asks what Eklavya remembers about a project or whether it is still capturing, or asks to change how often or how hard it quizzes them (its quiz, focus, cadence or difficulty dials), see their learning progress or mastery, open the dashboard, check the commit gate, update Eklavya, allow its quiz panel tools after auto mode denied them, or find where their data lives. Do not use for ordinary coding help, for teaching a concept, or merely because a task is educational."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Eklavya
|
|
@@ -258,6 +258,19 @@ the learning history. Two cases it can't fix on its own, and `doctor` says which
|
|
|
258
258
|
`~/.claude/skills/eklavya/`. Never overwrite it. Tell them to move theirs
|
|
259
259
|
first, then run `eklavya install`.
|
|
260
260
|
|
|
261
|
+
**Auto mode denied a panel tool.** A message such as `plugin:eklavya:eklavya -
|
|
262
|
+
panel_sync (mcp) denied by auto mode` means Claude Code's auto mode refused a
|
|
263
|
+
call the quiz panel made on its own; a plugin cannot grant its own permissions.
|
|
264
|
+
When they ask you to fix it, read `~/.claude/settings.json` and add these to
|
|
265
|
+
`permissions.allow`, keeping every existing entry and adding none twice:
|
|
266
|
+
`mcp__plugin_eklavya_eklavya__panel_sync`,
|
|
267
|
+
`mcp__plugin_eklavya_eklavya__panel_answer` and
|
|
268
|
+
`mcp__plugin_eklavya_eklavya__present_question`. Create `permissions.allow` if
|
|
269
|
+
it is missing, and leave the file valid JSON. Do not allow the whole
|
|
270
|
+
`mcp__plugin_eklavya_eklavya` server instead: that would also let
|
|
271
|
+
`memory_delete` and `set_config` run unasked. Show them the entries you added.
|
|
272
|
+
If the denial continues, a restart of Claude Code reloads the settings.
|
|
273
|
+
|
|
261
274
|
**Updates are automatic.** Eklavya checks npm at session start, at most hourly,
|
|
262
275
|
and installs a newer release on its own, settings untouched. So "update
|
|
263
276
|
Eklavya" needs nothing, and if they want it now, run `eklavya update`. If
|
package/package.json
CHANGED