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.
Files changed (82) hide show
  1. package/dist/assets/dashboard.html +1012 -255
  2. package/dist/assets/tutor/references/focus-and-level.md +7 -0
  3. package/dist/claude-mem.js +9 -7
  4. package/dist/claude-mem.js.map +1 -1
  5. package/dist/cli-memory.js +786 -0
  6. package/dist/cli-memory.js.map +1 -0
  7. package/dist/cli.js +95 -773
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config.js +79 -13
  10. package/dist/config.js.map +1 -1
  11. package/dist/dashboard.js +289 -15
  12. package/dist/dashboard.js.map +1 -1
  13. package/dist/db.js +33 -6
  14. package/dist/db.js.map +1 -1
  15. package/dist/hooks/capture-lib.js +55 -0
  16. package/dist/hooks/capture-lib.js.map +1 -0
  17. package/dist/hooks/capture-tool.js +1 -1
  18. package/dist/hooks/capture-tool.js.map +1 -1
  19. package/dist/hooks/commit-lib.js +255 -0
  20. package/dist/hooks/commit-lib.js.map +1 -0
  21. package/dist/hooks/lib.js +37 -5
  22. package/dist/hooks/lib.js.map +1 -1
  23. package/dist/hooks/memory-lib.js +93 -78
  24. package/dist/hooks/memory-lib.js.map +1 -1
  25. package/dist/hooks/pre-tool-gate.js +5 -10
  26. package/dist/hooks/pre-tool-gate.js.map +1 -1
  27. package/dist/hooks/prompt-submit-nudge.js +26 -1
  28. package/dist/hooks/prompt-submit-nudge.js.map +1 -1
  29. package/dist/hooks/session-start.js +13 -4
  30. package/dist/hooks/session-start.js.map +1 -1
  31. package/dist/install.js +280 -67
  32. package/dist/install.js.map +1 -1
  33. package/dist/memory/capture.js +25 -5
  34. package/dist/memory/capture.js.map +1 -1
  35. package/dist/memory/privacy.js +105 -7
  36. package/dist/memory/privacy.js.map +1 -1
  37. package/dist/memory/provider.js +13 -3
  38. package/dist/memory/provider.js.map +1 -1
  39. package/dist/memory/recall.js +18 -6
  40. package/dist/memory/recall.js.map +1 -1
  41. package/dist/memory/spool.js +105 -23
  42. package/dist/memory/spool.js.map +1 -1
  43. package/dist/memory/store.js +32 -2
  44. package/dist/memory/store.js.map +1 -1
  45. package/dist/memory/summarize.js +5 -5
  46. package/dist/memory/summarize.js.map +1 -1
  47. package/dist/memory/worker.js +71 -10
  48. package/dist/memory/worker.js.map +1 -1
  49. package/dist/migrate.js +60 -14
  50. package/dist/migrate.js.map +1 -1
  51. package/dist/paths.js +49 -0
  52. package/dist/paths.js.map +1 -1
  53. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  54. package/dist/plugin/cli/CLAUDE.md +16 -4
  55. package/dist/plugin/hooks/CLAUDE.md +33 -3
  56. package/dist/plugin/hooks/run.mjs +69 -5
  57. package/dist/plugin/scripts/install-git-hook.sh +114 -24
  58. package/dist/plugin/skills/CLAUDE.md +1 -1
  59. package/dist/plugin/skills/setup/SKILL.md +9 -2
  60. package/dist/plugin/skills/tutor/references/focus-and-level.md +7 -0
  61. package/dist/safe-write.js +146 -0
  62. package/dist/safe-write.js.map +1 -0
  63. package/dist/slug.js +4 -1
  64. package/dist/slug.js.map +1 -1
  65. package/dist/srs.js +33 -1
  66. package/dist/srs.js.map +1 -1
  67. package/dist/store.js +29 -19
  68. package/dist/store.js.map +1 -1
  69. package/dist/tools/config_tools.js +23 -1
  70. package/dist/tools/config_tools.js.map +1 -1
  71. package/dist/tools/get_session_quiz_plan.js +51 -30
  72. package/dist/tools/get_session_quiz_plan.js.map +1 -1
  73. package/dist/tools/log_session_concepts.js +30 -23
  74. package/dist/tools/log_session_concepts.js.map +1 -1
  75. package/dist/tools/record_attempt.js +18 -8
  76. package/dist/tools/record_attempt.js.map +1 -1
  77. package/dist/tools/types.js +29 -0
  78. package/dist/tools/types.js.map +1 -1
  79. package/dist/tools/upsert_concepts.js +12 -10
  80. package/dist/tools/upsert_concepts.js.map +1 -1
  81. package/dist/user-skill/eklavya/SKILL.md +46 -21
  82. 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, which is an explicit choice with its own key.
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 a repo is overriding, and they need no subprocess.
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
- Repo config wins over global. When someone's personal setting has stopped
134
- applying, that is why — `config get` prints both paths, and `eklavya doctor` or
135
- `get_config` names the keys the repo is overriding.
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 four lines are the install itself: `runtime`,
197
- `driver`, `plugin`, `skill`. If any says `FAILED`, it exits non-zero and prints
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
- Six sections, each deep-linkable — hand back the one that answers what was
231
- actually asked rather than the bare root:
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 | `/#/overview` |
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
- | what does this project remember | `/#/memory`, `/#/entry/<id>` for one observation and its evidence |
240
- | what has recall actually saved | `/#/reuse` |
241
- | is capture healthy | `/#/health` |
242
- | how hard is this repo allowed to get | `/#/projects` |
243
- | where are the gaps | `/#/domains` |
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 an API, and it needs their explicit
282
- yes and their own key in an environment variable.
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.24.2",
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"