studykit
v0.3.0
Published
Turn any project directory into a spaced-repetition study workspace driven by Claude skills. Zero-dependency Node engine + sk:init / sk:learn / sk:stats / sk:summary / sk:judge / sk:certs skills.
Maintainers
Readme
StudyKit
Turn any project directory into a spaced-repetition study workspace, driven by Claude skills.
StudyKit installs a small set of Claude Code skills plus a zero-dependency Node engine into a project directory. You study one certification per project; your learning state lives as flat markdown + JSONL on disk, so any session resumes exactly where you left off with a single command — no manual context reload.
- 📚 Two phases, one driver — a daily study loop (review → learn → recall) that graduates to an exam-prep loop (targeted revision + full mock exams), switched only with your confirmation.
- 🎯 Deterministic spaced repetition — a seeded selector resurfaces the topics you're weakest on and haven't seen in a while.
- 🧮 Honest progress — coverage, accuracy, streaks, and pace vs. your target date, computed from your real attempt log.
- ✍️ Open-ended grading — rubric-based judging of Feynman teach-backs and "explain X" answers, fed back into spaced repetition.
- 🗂️ Multi-cert overview — one read-only dashboard across every cert you're studying.
- 🪶 Zero runtime dependencies — pure Node (
>=18), tested with the built-innode --test.
Table of contents
- Install
- Quickstart
- Skills
- What
/sk:initcreates - How it works
- Multiple certifications
- Development
- Releasing
- License
Install
The npm package is
studykit(lowercase, an npm requirement); the project name is StudyKit.
Install the skills into a study project — a directory for one exam or topic:
# from npm
npx studykit@latest init ~/study/aws-saa
# from a git checkout
node bin/studykit.cjs init ~/study/aws-saainit only installs skills into <project>/.claude/skills/. It never creates or touches study/ — that belongs to /sk:init.
Quickstart
Open the study project in Claude Code, then:
| Step | Command | What it does |
|------|---------|--------------|
| 1 | /sk:init | Once per project. Researches the exam blueprint, writes profile.md / syllabus.md / knowledge/, captures your background, pass mark, and mock size. |
| 2 | /sk:learn | Every session. Runs the daily loop one question at a time and resumes the exact step + question across sessions. |
| 3 | /sk:stats · /sk:summary | Anytime. The numbers, or a narrative with pace vs. your target date (sk:summary also saves study/progress.md). |
| 4 | Exam-prep | When coverage is high or the exam is near, /sk:learn proposes switching phases (you confirm), then runs revision + blueprint-weighted, resumable, scored mock exams. |
| 5 | /sk:judge | Grade an open-ended explanation against a rubric; tracked topics get recorded so the result feeds spaced repetition. |
Studying more than one cert? See Multiple certifications.
Skills
| Skill | Role |
| ----- | ---- |
| sk-init | One-time setup: builds the exam blueprint + knowledge base |
| sk-learn | The daily driver: study loop + exam-prep loop, with exact resume |
| sk-stats | Read-only progress metrics (totals, coverage, weak/stale topics) |
| sk-summary | Narrative progress + pace vs. target; writes study/progress.md |
| sk-judge | Rubric grader for open-ended answers (Feynman teach-back, "explain X") |
| sk-certs | Read-only overview across multiple cert projects |
| _engine | Zero-dependency Node helpers (state · select · stats · scan) |
What /sk:init creates
<study-project>/
study/
state.json # machine cursor (the engine owns this schema)
profile.md # exam meta + structure + your background + target date
syllabus.md # topic | domain | status | last_studied
knowledge/<topic>.md # knowledge base, grows as you study
daily/YYYY-MM-DD.md # human-readable daily record
progress.md # latest snapshot (written by /sk:summary)
results.jsonl # append-only attempt log the engine readsHow it works
- Markdown is the human source of truth;
results.jsonlis the machine index. Only the engine reads the attempt log; skills load the small aggregate it returns. - State-first resume. Every skill reads the tiny
state.jsoncursor first, then loads only the slice it needs — reads stay token-bounded no matter how long your history grows. Resume readsstate.jsononly, never markdown, even mid-mock-exam. - Deterministic, topic-level selection.
select.cjsis seeded and resurfaces topics (older-within-window and previously-wrong weighted heavier);sk-learnthen generates a fresh question per topic. There is no question bank. - Two phases, one driver.
state.phaseisstudyorexam-prep. The switch is always user-confirmed and reversible; the schema change is additive (no migration needed). - Binary scoring everywhere. Multiple-choice and rubric-judged open-ended answers both resolve to one binary
results.jsonlline; rich rubric detail stays human-facing indaily/. - Zero dependencies. Pure Node CommonJS (
>=18), tested with the built-innode --test.
Multiple certifications
StudyKit keeps 1 project = 1 cert, so each study/ stays isolated and token-bounded. To study several, create sibling projects under one parent and use the read-only overview:
npx studykit@latest init ~/study/aws-saa
npx studykit@latest init ~/study/terraform
# run /sk:init in each, study as usual, then from any project:
# /sk:certs ~/study
# -> combined table: phase, coverage, streak, days-to-target, next action/sk:certs reads each cert's state.json + stats aggregate only — never raw attempt logs — and suggests which cert to study next. It mutates nothing.
Development
npm test # node --test skills/_engine/test/The engine is pure Node CommonJS with zero runtime dependencies. Every .cjs ships with a node:test suite; keep it green.
Releasing
See docs/release-process.md for the full publish runbook: semantic versioning, the pre-publish audit, git tagging, GitHub push, and npm publish (including the 2FA one-time-password step).
License
MIT © Thuan Bui
