eklavya 1.67.1 → 1.68.0

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.
@@ -0,0 +1,290 @@
1
+ /**
2
+ * The deterministic half of the explainer eval.
3
+ *
4
+ * `agents/explainer.md` makes a dozen precise promises about the page it
5
+ * writes: the sections and their order, every option restated verbatim with
6
+ * the pick and the right one marked, a captioned inline-SVG figure, the
7
+ * template left alone, the missed attempt linked, role tokens only. Nobody
8
+ * reads the agent's transcript, so the page is the only evidence; this module
9
+ * checks those promises against it. Whether the page is *clear* is left to the
10
+ * judge in the harness, and to the metrics returned beside the gates.
11
+ *
12
+ * Pure like `conversation-score.ts`: no model, no files, no clock. Regex rather
13
+ * than an HTML parser, because every page starts from one known template.
14
+ */
15
+ /** The home paths `agents/explainer.md` names, which the harness points at one trial's copies. */
16
+ export const SKILL_PATH = '~/.claude/skills/eklavya-artifacts/SKILL.md';
17
+ export const RUNTIME_BIN = '$HOME/.eklavya/runtime/node_modules/.bin/eklavya';
18
+ const letter = (i) => String.fromCharCode(65 + i);
19
+ /** The brief, in the shape of the tutor's handoff block (`agents/tutor.md`), plus the code. */
20
+ export function brief(c) {
21
+ if (c.request) {
22
+ return [`The developer asked: "${c.request}"`, `concept: ${c.concept.slug} (${c.concept.name})`, '', 'The code it is about:', c.code ?? ''].join('\n');
23
+ }
24
+ const opts = c.options ?? [];
25
+ const answer = c.dont_know ? "I don't know" : c.typed !== undefined ? c.typed : `${letter(c.pick)}. ${opts[c.pick]}`;
26
+ const right = typeof c.right === 'number' ? `${letter(c.right)}. ${opts[c.right]}` : String(c.right ?? '');
27
+ return [
28
+ 'Write the explainer page for this missed question.',
29
+ '',
30
+ '[Eklavya explainer handoff]',
31
+ `concept: ${c.concept.slug} (${c.concept.name})`,
32
+ `question: ${c.stem}`,
33
+ `options: ${opts.length ? opts.map((o, i) => `${letter(i)}. ${o}`).join(' | ') : 'none (typed answer)'}`,
34
+ `option_notes: ${c.notes ? c.notes.map((n) => n ?? 'none').join(' | ') : 'none'}`,
35
+ `learner answer: ${answer}`,
36
+ `right answer: ${right}`,
37
+ `attempt_id: ${c.attempt_id ?? 'none'}`,
38
+ 'context: none',
39
+ '',
40
+ 'The code it came from:',
41
+ c.code ?? '',
42
+ ].join('\n');
43
+ }
44
+ /**
45
+ * Points the home paths a prompt names at one trial's copies. Claude Code
46
+ * cannot run under a throwaway HOME, so this is how a trial gets its own skill
47
+ * and runtime binary. `strict` (the agent file) throws when a path is no longer
48
+ * named, so a reworded prompt cannot run against the real home unnoticed.
49
+ */
50
+ export function pointHome(text, to, strict) {
51
+ const pairs = [[SKILL_PATH, to.skill], [RUNTIME_BIN, to.runtimeBin]];
52
+ let out = text;
53
+ for (const [from, dest] of pairs) {
54
+ if (dest === undefined)
55
+ continue;
56
+ if (strict && !out.includes(from))
57
+ throw new Error(`the prompt no longer names ${from}; update pointHome`);
58
+ out = out.split(from).join(dest);
59
+ }
60
+ return out;
61
+ }
62
+ const CONTENT = /<!--\s*CONTENT[\s\S]*?-->/;
63
+ const LEDE = /<p class="lede">[\s\S]*?<\/p>/;
64
+ const STYLE = /<style>([\s\S]*?)<\/style>/g;
65
+ const ENTITIES = { amp: '&', lt: '<', gt: '>', quot: '"', '#39': "'", apos: "'", nbsp: ' ' };
66
+ function decode(s) {
67
+ return s.replace(/&(#x[\da-f]+|#\d+|[a-z]+\d*);/gi, (m, e) => {
68
+ if (e[0] === '#')
69
+ return String.fromCodePoint(e[1] === 'x' || e[1] === 'X' ? parseInt(e.slice(2), 16) : Number(e.slice(1)));
70
+ return ENTITIES[e.toLowerCase()] ?? m;
71
+ });
72
+ }
73
+ /** Visible text, whitespace collapsed and quotes straightened, so "verbatim" survives escaping. */
74
+ export function text(html) {
75
+ return decode(html.replace(/<[^>]+>/g, ' '))
76
+ .replace(/[‘’]/g, "'")
77
+ .replace(/[“”]/g, '"')
78
+ .replace(/\s+/g, ' ')
79
+ .trim();
80
+ }
81
+ function meta(page, name) {
82
+ const m = new RegExp(`<meta\\s+name="eklavya:${name}"\\s+content="([^"]*)"`).exec(page);
83
+ return m ? decode(m[1]) : null;
84
+ }
85
+ /**
86
+ * The page minus everything the agent may legitimately change -- the lede, and
87
+ * CSS it adds -- so what is left must equal the template around the content.
88
+ */
89
+ function frame(html) {
90
+ return html.replace(LEDE, '<p class="lede"></p>').replace(STYLE, '<style></style>');
91
+ }
92
+ /** The content the agent wrote, or null when the frame around it was touched. */
93
+ export function contentOf(page, template) {
94
+ const t = frame(template);
95
+ const m = CONTENT.exec(t);
96
+ if (!m)
97
+ return null;
98
+ const pre = t.slice(0, m.index);
99
+ const post = t.slice(m.index + m[0].length);
100
+ const p = frame(page);
101
+ if (CONTENT.test(p) || p.length < pre.length + post.length || !p.startsWith(pre) || !p.endsWith(post))
102
+ return null;
103
+ return p.slice(pre.length, p.length - post.length);
104
+ }
105
+ /** CSS lines in the page's `<style>` blocks that the template did not have. */
106
+ function addedCss(page, template) {
107
+ const had = new Set([...template.matchAll(STYLE)].flatMap((m) => m[1].split('\n').map((l) => l.trim())));
108
+ return [...page.matchAll(STYLE)].flatMap((m) => m[1].split('\n').map((l) => l.trim()).filter((l) => l && !had.has(l))).join('\n');
109
+ }
110
+ // Order matters: "Where the answer went wrong" must not read as the question.
111
+ const HEADINGS = [
112
+ ['short', /short answer|in short|short version|the gist|in one sentence|in a sentence/i],
113
+ ['wrong', /wrong|misconception|tripped|tempting|mix-?up/i],
114
+ ['how', /how .*works?\b|mechanism|under the hood|what actually happens/i],
115
+ ['example', /example/i],
116
+ ['rule', /rule|transfer|takeaway|gotcha|elsewhere|carry|next time|watch for/i],
117
+ ['question', /question/i],
118
+ ];
119
+ export function sectionOf(heading) {
120
+ for (const [s, re] of HEADINGS)
121
+ if (re.test(heading))
122
+ return s;
123
+ return null;
124
+ }
125
+ const v = (id, ok, detail = '') => ({ id, ok, detail });
126
+ function checkSections(found, c) {
127
+ const want = [];
128
+ if (c.stem)
129
+ want.push('question');
130
+ want.push('short');
131
+ const answered = !c.dont_know && (c.pick !== undefined || c.typed !== undefined);
132
+ if (answered)
133
+ want.push('wrong');
134
+ want.push('how', 'example', 'rule');
135
+ const at = want.map((s) => found.indexOf(s));
136
+ const missing = want.filter((_, i) => at[i] < 0);
137
+ if (missing.length)
138
+ return v('sections_in_order', false, `missing ${missing.join(', ')}`);
139
+ for (let i = 1; i < at.length; i++)
140
+ if (at[i] < at[i - 1])
141
+ return v('sections_in_order', false, `${want[i]} before ${want[i - 1]}`);
142
+ if (!c.stem && found.includes('question'))
143
+ return v('sections_in_order', false, 'a question section on a page nobody asked a question for');
144
+ if (!answered && found.includes('wrong'))
145
+ return v('sections_in_order', false, 'a "went wrong" section with no answer given');
146
+ return v('sections_in_order', true);
147
+ }
148
+ function items(content) {
149
+ const ol = /<ol\s+class="options"[^>]*>([\s\S]*?)<\/ol>/.exec(content);
150
+ if (!ol)
151
+ return null;
152
+ return [...ol[1].matchAll(/<li([^>]*)>([\s\S]*?)<\/li>/g)].map((m) => {
153
+ const cls = /class="([^"]*)"/.exec(m[1])?.[1] ?? '';
154
+ const note = /<span\s+class="note"[^>]*>([\s\S]*?)<\/span>/.exec(m[2]);
155
+ return { cls, body: text(m[2].replace(/<span\s+class="note"[^>]*>[\s\S]*?<\/span>/, '')), note: note ? text(note[1]) : null };
156
+ });
157
+ }
158
+ const has = (it, c) => !!it && it.cls.split(/\s+/).includes(c);
159
+ function checkOptions(content, c) {
160
+ if (!c.stem)
161
+ return [];
162
+ const list = items(content);
163
+ if (!list)
164
+ return [v('options_verbatim', false, 'no <ol class="options">'), v('option_classes', false, 'no list')];
165
+ const opts = c.options ?? [];
166
+ const out = [];
167
+ const picked = list.flatMap((it, i) => (has(it, 'picked') ? [i] : []));
168
+ const right = list.flatMap((it, i) => (has(it, 'right') ? [i] : []));
169
+ if (!opts.length) {
170
+ // A typed answer to an open question: their words and the right answer, in one list.
171
+ const typed = text(c.typed ?? '');
172
+ const r = text(String(c.right));
173
+ const p = list[picked[0] ?? -1];
174
+ const ok = picked.length === 1 && right.length === 1 && !!p && p.body.includes(typed) && list[right[0]].body.includes(r);
175
+ return [v('options_verbatim', list.length >= 2, `${list.length} items`), v('option_classes', ok, ok ? '' : `picked ${picked}, right ${right}`)];
176
+ }
177
+ // Every option in order, verbatim, then their own words when they typed instead.
178
+ const extra = c.typed !== undefined ? 1 : 0;
179
+ const wrongText = opts.flatMap((o, i) => (list[i]?.body === text(o) ? [] : [`${String.fromCharCode(65 + i)}: ${JSON.stringify(list[i]?.body ?? null)}`]));
180
+ const countOk = list.length === opts.length + extra || (c.dont_know && list.length === opts.length + 1);
181
+ const notesBad = (c.notes ?? []).flatMap((n, i) => (n && list[i]?.note !== text(n) ? [String.fromCharCode(65 + i)] : []));
182
+ const detail = [!countOk && `${list.length} items for ${opts.length + extra}`, wrongText.length && `not verbatim ${wrongText.join('; ')}`, notesBad.length && `note missing or changed on ${notesBad.join(',')}`].filter(Boolean).join('; ');
183
+ out.push(v('options_verbatim', !!countOk && !wrongText.length && !notesBad.length, detail));
184
+ let wantPick = c.pick ?? null;
185
+ if (c.typed !== undefined)
186
+ wantPick = opts.length;
187
+ const pickOk = c.dont_know ? picked.length === 0 || (picked.length === 1 && picked[0] === opts.length) : picked.length === 1 && picked[0] === wantPick;
188
+ const typedOk = c.typed === undefined || list[opts.length]?.body.includes(text(c.typed)) === true;
189
+ const rightOk = right.length === 1 && right[0] === c.right;
190
+ out.push(v('option_classes', pickOk && rightOk && typedOk, pickOk && rightOk && typedOk ? '' : `picked ${JSON.stringify(picked)} want ${wantPick}, right ${JSON.stringify(right)} want ${c.right}${typedOk ? '' : ', typed answer not the extra item'}`));
191
+ return out;
192
+ }
193
+ /** A raw colour where a role token belongs: hex, rgb/hsl, a `--vd-*` step, or a named fill. */
194
+ function rawColours(content, css) {
195
+ const bad = [];
196
+ const styleAttrs = [...content.matchAll(/\sstyle="([^"]*)"/g)].map((m) => m[1]).join('\n');
197
+ for (const m of `${css}\n${styleAttrs}`.matchAll(/#[0-9a-fA-F]{3,8}\b|\b(?:rgba?|hsla?)\(|--vd-[\w-]*/g))
198
+ bad.push(m[0]);
199
+ for (const m of content.matchAll(/\s(?:fill|stroke|stop-color|color)="([^"]*)"/g)) {
200
+ if (!/^(none|currentColor|transparent|inherit|var\(--[\w-]+\)|url\(#[\w-]+\))$/.test(m[1].trim()))
201
+ bad.push(m[0].trim());
202
+ }
203
+ return bad;
204
+ }
205
+ /** Sentences end in . ! or ? before a space or the end; "Go 1.22" and "e.g." do not end one. */
206
+ export function sentenceCount(s) {
207
+ const t = s.replace(/\b(?:e\.g|i\.e|etc|vs)\./gi, '_').trim();
208
+ return t ? t.split(/[.!?]["')\]]?(?:\s+|$)/).filter((x) => /\w/.test(x)).length : 0;
209
+ }
210
+ const EMOJI = /\p{Extended_Pictographic}/u;
211
+ const words = (s) => (s.match(/\S+/g) ?? []).length;
212
+ export function scorePage(input) {
213
+ const { page, template, case: c } = input;
214
+ const gates = [];
215
+ gates.push(v('one_file', input.files === 1, `${input.files} pages`));
216
+ const content = contentOf(page, template);
217
+ gates.push(v('template_intact', content !== null, content === null ? 'the frame around <!-- CONTENT --> changed, or the comment is still there' : ''));
218
+ const body = content ?? '';
219
+ gates.push(v('no_script_added', !/<script\b/i.test(body), ''));
220
+ const kind = meta(page, 'kind');
221
+ const concept = meta(page, 'concept');
222
+ const attempt = meta(page, 'attempt');
223
+ const wantAttempt = c.attempt_id ? String(c.attempt_id) : '';
224
+ gates.push(v('metadata', kind === 'explainer' && concept === c.concept.slug, `kind ${kind}, concept ${concept}`));
225
+ gates.push(v('attempt_linked', attempt === wantAttempt, `attempt "${attempt}", want "${wantAttempt}"`));
226
+ const headings = [...body.matchAll(/<h2[^>]*>([\s\S]*?)<\/h2>/g)].map((m) => text(m[1]));
227
+ const found = headings.map(sectionOf);
228
+ gates.push(checkSections(found, c));
229
+ gates.push(...checkOptions(body, c));
230
+ // "Two or three sentences a newcomer could repeat": countable, so counted.
231
+ const short = sectionText(page, template).short ?? '';
232
+ const sentences = sentenceCount(short);
233
+ gates.push(v('short_answer_brief', sentences >= 1 && sentences <= 3, `${sentences} sentences`));
234
+ const figures = [...body.matchAll(/<figure[^>]*>([\s\S]*?)<\/figure>/g)].map((m) => m[1]);
235
+ const good = figures.filter((f) => /<svg\b/.test(f) && /<figcaption[^>]*>[\s\S]*?\S[\s\S]*?<\/figcaption>/.test(f) && /class="[^"]*\bsvg-/.test(f));
236
+ gates.push(v('figure_svg', good.length > 0 && /<svg\b/.test(figures[0]), `${good.length}/${figures.length} figures with svg, caption and .svg-* classes`));
237
+ const langs = [...body.matchAll(/<pre\s[^>]*data-lang="([^"]*)"/g)].map((m) => m[1]);
238
+ const langOk = langs.length > 0 && (!c.lang || langs.some((l) => new RegExp(`^(?:${c.lang})$`, 'i').test(l)));
239
+ gates.push(v('example_labelled', langOk, `data-lang ${JSON.stringify(langs)}${c.lang ? `, want ${c.lang}` : ''}`));
240
+ const bad = rawColours(body, addedCss(page, template));
241
+ gates.push(v('tokens_only', bad.length === 0, bad.slice(0, 4).join(' ')));
242
+ gates.push(v('no_emoji', !EMOJI.test(text(body)), ''));
243
+ gates.push(v('opened', input.opened.includes(input.path), `opened ${JSON.stringify(input.opened)}`));
244
+ const reply = input.reply.trim();
245
+ gates.push(v('path_reply', reply.includes(input.path) && reply.split('\n').length <= 2, reply.slice(0, 120)));
246
+ const plain = text(body.replace(/<svg[\s\S]*?<\/svg>/g, ' '));
247
+ const used = (c.identifiers ?? []).filter((id) => body.includes(id));
248
+ return {
249
+ gates,
250
+ metrics: { words: words(plain), figures: figures.length, sections: headings, identifiers_used: used.length, identifiers_offered: c.identifiers?.length ?? 0 },
251
+ };
252
+ }
253
+ /** The text under each `<h2>`, by section, for the judge. */
254
+ export function sectionText(page, template) {
255
+ const body = contentOf(page, template) ?? '';
256
+ const out = {};
257
+ const parts = body.split(/(?=<h2[^>]*>)/);
258
+ for (const part of parts) {
259
+ const h = /<h2[^>]*>([\s\S]*?)<\/h2>/.exec(part);
260
+ if (!h)
261
+ continue;
262
+ const s = sectionOf(text(h[1]));
263
+ if (s && !out[s])
264
+ out[s] = text(part.slice(h.index + h[0].length).replace(/<svg[\s\S]*?<\/svg>/g, ' '));
265
+ }
266
+ return out;
267
+ }
268
+ export function summarise(results) {
269
+ const failed = {};
270
+ let clean = 0;
271
+ let errored = 0;
272
+ const byCase = {};
273
+ for (const r of results) {
274
+ const row = (byCase[r.case] ??= { trials: 0, clean: 0 });
275
+ row.trials += 1;
276
+ if (r.error) {
277
+ errored += 1;
278
+ continue;
279
+ }
280
+ const bad = r.gates.filter((g) => !g.ok);
281
+ for (const g of bad)
282
+ failed[g.id] = (failed[g.id] ?? 0) + 1;
283
+ if (!bad.length) {
284
+ clean += 1;
285
+ row.clean += 1;
286
+ }
287
+ }
288
+ return { trials: results.length, clean, errored, failed, byCase };
289
+ }
290
+ //# sourceMappingURL=explainer-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainer-score.js","sourceRoot":"","sources":["../../src/eval/explainer-score.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "eklavya",
3
3
  "displayName": "Eklavya",
4
- "version": "1.67.1",
4
+ "version": "1.68.0",
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"
@@ -49,8 +49,11 @@ In this order, each under its own `<h2>`:
49
49
  the same list. When they typed their own answer although options were
50
50
  offered, list every option, then their words as one more item with
51
51
  `class="picked"`. Skip this section for a page someone asked for.
52
- - **The short answer.** Two or three sentences a newcomer could repeat: what the
53
- thing *does*, before what it is called.
52
+ - **The short answer.** At most three sentences a newcomer could repeat. The
53
+ first says what the thing *does*, in plain words; the second says what that
54
+ means for the code in the question (the right answer, and why); a third, if
55
+ needed, gives its name. Use no term the reader would have to look up. Every
56
+ further detail, caveat and name belongs under "How it works".
54
57
  - **Where the answer went wrong.** Name the misconception in the answer given
55
58
  — kindly, specifically — and why it is tempting. If there was no answer
56
59
  ("I don't know"), skip this and start from the mechanism.
@@ -63,9 +66,13 @@ In this order, each under its own `<h2>`:
63
66
  ideally in the language the developer was working in, as
64
67
  `<pre data-lang="…"><code>` so the template labels and colours it.
65
68
  - **The rule that transfers.** When this applies in a different codebase, and
66
- the one gotcha to watch for.
69
+ the one gotcha to watch for. Compare with another language or library only
70
+ when you are sure it behaves that way: a wrong comparison teaches the wrong
71
+ thing.
67
72
 
68
- Plain English, short sentences, no jargon without a gloss. Any CSS you add
73
+ Plain English, short sentences, no jargon without a gloss. State a claim no
74
+ more strongly than the page later supports: a guarantee the gotcha qualifies
75
+ is stated as qualified the first time. Any CSS you add
69
76
  follows the design rules in the `eklavya-artifacts` skill: role tokens only
70
77
  (`--ink --dim --faint --line --spot …`, never a raw hex or `--vd-*` step), one
71
78
  verdigris accent, square corners, hairlines instead of shadows, the three font
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eklavya",
3
- "version": "1.67.1",
3
+ "version": "1.68.0",
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": {