eklavya 1.25.0 → 1.25.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.
Files changed (82) hide show
  1. package/dist/assets/dashboard.html +1 -1
  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 +36 -14
  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 -20
  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 +26 -10
  82. package/package.json +1 -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
@@ -287,5 +302,6 @@ skill, not this one.
287
302
  entry and its vectors are gone. Confirm before the hard one, and never offer
288
303
  it as a tidying-up suggestion.
289
304
  - Do not configure `providers.observer` on the user's behalf. It is the one
290
- setting that sends this machine's work to an API, and it needs their explicit
291
- 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.25.0",
3
+ "version": "1.25.2",
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": {