eklavya 1.24.2 → 1.25.1
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/assets/dashboard.html +1012 -255
- package/dist/assets/tutor/references/focus-and-level.md +7 -0
- package/dist/claude-mem.js +9 -7
- package/dist/claude-mem.js.map +1 -1
- package/dist/cli-memory.js +786 -0
- package/dist/cli-memory.js.map +1 -0
- package/dist/cli.js +95 -773
- package/dist/cli.js.map +1 -1
- package/dist/config.js +79 -13
- package/dist/config.js.map +1 -1
- package/dist/dashboard.js +289 -15
- package/dist/dashboard.js.map +1 -1
- package/dist/db.js +33 -6
- package/dist/db.js.map +1 -1
- package/dist/hooks/capture-lib.js +55 -0
- package/dist/hooks/capture-lib.js.map +1 -0
- package/dist/hooks/capture-tool.js +1 -1
- package/dist/hooks/capture-tool.js.map +1 -1
- package/dist/hooks/commit-lib.js +255 -0
- package/dist/hooks/commit-lib.js.map +1 -0
- package/dist/hooks/lib.js +37 -5
- package/dist/hooks/lib.js.map +1 -1
- package/dist/hooks/memory-lib.js +93 -78
- package/dist/hooks/memory-lib.js.map +1 -1
- package/dist/hooks/pre-tool-gate.js +5 -10
- package/dist/hooks/pre-tool-gate.js.map +1 -1
- package/dist/hooks/prompt-submit-nudge.js +26 -1
- package/dist/hooks/prompt-submit-nudge.js.map +1 -1
- package/dist/hooks/session-start.js +13 -4
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/install.js +280 -67
- package/dist/install.js.map +1 -1
- package/dist/memory/capture.js +25 -5
- package/dist/memory/capture.js.map +1 -1
- package/dist/memory/privacy.js +105 -7
- package/dist/memory/privacy.js.map +1 -1
- package/dist/memory/provider.js +13 -3
- package/dist/memory/provider.js.map +1 -1
- package/dist/memory/recall.js +18 -6
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/spool.js +105 -23
- package/dist/memory/spool.js.map +1 -1
- package/dist/memory/store.js +32 -2
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/summarize.js +5 -5
- package/dist/memory/summarize.js.map +1 -1
- package/dist/memory/worker.js +71 -10
- package/dist/memory/worker.js.map +1 -1
- package/dist/migrate.js +60 -14
- package/dist/migrate.js.map +1 -1
- package/dist/paths.js +49 -0
- package/dist/paths.js.map +1 -1
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/cli/CLAUDE.md +16 -4
- package/dist/plugin/hooks/CLAUDE.md +33 -3
- package/dist/plugin/hooks/run.mjs +69 -5
- package/dist/plugin/scripts/install-git-hook.sh +114 -24
- package/dist/plugin/skills/CLAUDE.md +1 -1
- package/dist/plugin/skills/setup/SKILL.md +9 -2
- package/dist/plugin/skills/tutor/references/focus-and-level.md +7 -0
- package/dist/safe-write.js +146 -0
- package/dist/safe-write.js.map +1 -0
- package/dist/slug.js +4 -1
- package/dist/slug.js.map +1 -1
- package/dist/srs.js +33 -1
- package/dist/srs.js.map +1 -1
- package/dist/store.js +29 -19
- package/dist/store.js.map +1 -1
- package/dist/tools/config_tools.js +23 -1
- package/dist/tools/config_tools.js.map +1 -1
- package/dist/tools/get_session_quiz_plan.js +51 -30
- package/dist/tools/get_session_quiz_plan.js.map +1 -1
- package/dist/tools/log_session_concepts.js +30 -23
- package/dist/tools/log_session_concepts.js.map +1 -1
- package/dist/tools/record_attempt.js +18 -8
- package/dist/tools/record_attempt.js.map +1 -1
- package/dist/tools/types.js +29 -0
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/upsert_concepts.js +12 -10
- package/dist/tools/upsert_concepts.js.map +1 -1
- package/dist/user-skill/eklavya/SKILL.md +46 -21
- package/package.json +2 -1
|
@@ -13,7 +13,8 @@ and tracks mastery with spaced repetition.
|
|
|
13
13
|
|
|
14
14
|
Both halves are local by default: the summariser and the search index run on
|
|
15
15
|
this machine and nothing leaves it unless `providers.observer` has been
|
|
16
|
-
configured
|
|
16
|
+
configured — an explicit choice that sends session batches to a Claude model
|
|
17
|
+
through `claude -p`, on the developer's own Claude subscription.
|
|
17
18
|
|
|
18
19
|
The two halves are switched separately, and their names now say so.
|
|
19
20
|
`quiz.enabled: false` stops the questions and leaves memory recording;
|
|
@@ -54,7 +55,7 @@ above resolved to.
|
|
|
54
55
|
In a Claude Code session with the Eklavya plugin loaded, `get_config`,
|
|
55
56
|
`set_config`, `get_learner_profile`, `get_concept_graph` and `get_gate_status`
|
|
56
57
|
are available as tools. Use them: they validate the values, they report which
|
|
57
|
-
settings
|
|
58
|
+
settings this project is overriding, and they need no subprocess.
|
|
58
59
|
|
|
59
60
|
The CLI is the fallback for everywhere else — a plain terminal, Cursor, a
|
|
60
61
|
session where the plugin is not enabled. The two write the same files, so it
|
|
@@ -130,9 +131,18 @@ they set it back.
|
|
|
130
131
|
eklavya config set focus learn --topic "database indexing"
|
|
131
132
|
```
|
|
132
133
|
|
|
133
|
-
|
|
134
|
-
applying, that is why — `config get` prints both paths, and `eklavya
|
|
135
|
-
`get_config` names the keys
|
|
134
|
+
Project settings win over global ones. When someone's global setting has
|
|
135
|
+
stopped applying, that is why — `config get` prints both paths, and `eklavya
|
|
136
|
+
doctor` or `get_config` names the keys this project is overriding. The project
|
|
137
|
+
file lives under `~/.eklavya/projects/`, never in the repository.
|
|
138
|
+
|
|
139
|
+
`providers` is the exception: global only. A project file that sets it is
|
|
140
|
+
ignored (`config get` and `get_config`'s `ignored_in_project` say so), and
|
|
141
|
+
`set_config` at project scope returns `global_only`. Set it globally or not at
|
|
142
|
+
all. `set_config` can also return `unreadable_config` — the config file does not
|
|
143
|
+
parse and was left untouched; name the file and let them fix it — and
|
|
144
|
+
`project_collision`, when another checkout's settings already sit in the file
|
|
145
|
+
this one would use.
|
|
136
146
|
|
|
137
147
|
Other keys, same `config set` shape: `pass_threshold`,
|
|
138
148
|
`max_questions_per_task`, `min_minutes_between_quizzes`,
|
|
@@ -193,9 +203,14 @@ questions, or seems to have switched itself off. It never fails loudly — every
|
|
|
193
203
|
hook exits successfully by design, so it can't break a session — which means a
|
|
194
204
|
broken install and a quiet one look the same from the outside.
|
|
195
205
|
|
|
196
|
-
Run `eklavya doctor`. Its first
|
|
197
|
-
`driver`, `plugin`, `skill`. If any says `FAILED`, it exits non-zero
|
|
198
|
-
the fix.
|
|
206
|
+
Run `eklavya doctor`. Its first lines are the install itself: `runtime`,
|
|
207
|
+
`driver`, `plugin`, `versions`, `skill`. If any says `FAILED`, it exits non-zero
|
|
208
|
+
and prints the fix. Later rows also flag a config file that does not parse and a
|
|
209
|
+
terminal commit gate missing `jq` or `sqlite3`.
|
|
210
|
+
|
|
211
|
+
If session start printed `Eklavya paused · can't open its database · run:
|
|
212
|
+
eklavya doctor` (or the variant naming a SQLite module and Node version
|
|
213
|
+
mismatch), the database exists but would not open — `doctor` names why.
|
|
199
214
|
|
|
200
215
|
The fix is almost always `eklavya install`. It is idempotent — it reinstalls the
|
|
201
216
|
runtime, re-copies the plugin and rewrites the registration, and never touches
|
|
@@ -227,20 +242,29 @@ It opens the browser itself, so do not tell them to click the URL. Use
|
|
|
227
242
|
`--no-open` when they only asked *where* the dashboard is, or when the session
|
|
228
243
|
is on a machine with no desktop.
|
|
229
244
|
|
|
230
|
-
|
|
231
|
-
|
|
245
|
+
Two workflows, Learning and Memory, each with its own Dashboard and every page
|
|
246
|
+
deep-linkable — hand back the one that answers what was actually asked rather
|
|
247
|
+
than the bare root. Add `?project=<absolute repo path>` to open it scoped to one
|
|
248
|
+
project; the ids are the ones `/api/projects` lists.
|
|
232
249
|
|
|
233
250
|
| Ask | Link |
|
|
234
251
|
|---|---|
|
|
235
|
-
| how am I doing, streaks, activity | `/#/
|
|
236
|
-
| what am I learning, search a concept | `/#/concepts` (or `/#/concepts/due`, `/mastered`, `/unseen`), `/#/concept/<slug>` for one |
|
|
237
|
-
| what is due, what is scheduled, what I skipped | `/#/review`, `/#/review/upcoming`, `/#/review/skipped` |
|
|
238
|
-
| what did that session teach me | `/#/sessions
|
|
239
|
-
|
|
|
240
|
-
|
|
|
241
|
-
|
|
|
242
|
-
|
|
|
243
|
-
|
|
|
252
|
+
| how am I doing, streaks, activity | `/#/learning/dashboard` |
|
|
253
|
+
| what am I learning, search a concept | `/#/learning/concepts` (or `/#/learning/concepts/due`, `/mastered`, `/unseen`), `/#/learning/concept/<slug>` for one |
|
|
254
|
+
| what is due, what is scheduled, what I skipped | `/#/learning/review`, `/#/learning/review/upcoming`, `/#/learning/review/skipped` |
|
|
255
|
+
| what did that session teach me | `/#/learning/sessions`, `/#/learning/session/<id>` |
|
|
256
|
+
| how hard is this repo allowed to get, which projects have no answers yet | `/#/learning/projects` |
|
|
257
|
+
| where are the gaps | `/#/learning/domains` |
|
|
258
|
+
| what does memory hold, at a glance | `/#/memory/dashboard` |
|
|
259
|
+
| what does this project remember | `/#/memory/timeline` (or `/#/memory/timeline/<type>`), `/#/memory/entry/<id>` for one observation and its evidence |
|
|
260
|
+
| which sessions captured anything | `/#/memory/sessions` |
|
|
261
|
+
| which projects has memory recorded | `/#/memory/projects` |
|
|
262
|
+
| what has recall actually saved | `/#/memory/reuse` |
|
|
263
|
+
| is capture healthy | `/#/memory/health` |
|
|
264
|
+
|
|
265
|
+
The older single-workflow links (`/#/overview`, `/#/concepts`, `/#/memory`,
|
|
266
|
+
`/#/entry/<id>` and the rest) still open the right page, but hand back the
|
|
267
|
+
canonical form.
|
|
244
268
|
|
|
245
269
|
## When the plugin is loaded, point at the commands
|
|
246
270
|
|
|
@@ -278,5 +302,6 @@ skill, not this one.
|
|
|
278
302
|
entry and its vectors are gone. Confirm before the hard one, and never offer
|
|
279
303
|
it as a tidying-up suggestion.
|
|
280
304
|
- Do not configure `providers.observer` on the user's behalf. It is the one
|
|
281
|
-
setting that sends this machine's work to
|
|
282
|
-
|
|
305
|
+
setting that sends this machine's work off it — to a Claude model, on their
|
|
306
|
+
subscription — and it needs their explicit yes. It goes in the global config
|
|
307
|
+
only.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eklavya",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.25.1",
|
|
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": {
|
|
@@ -54,6 +54,7 @@
|
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@types/better-sqlite3": "^7.6.11",
|
|
56
56
|
"@types/node": "^22.0.0",
|
|
57
|
+
"playwright-core": "^1.63.0",
|
|
57
58
|
"tsx": "^4.19.0",
|
|
58
59
|
"typescript": "^5.6.0",
|
|
59
60
|
"vitest": "^4.1.11"
|