When using Bash to invoke a script, resolve the absolute path by
climbing two directories up from this SKILL.md and appending
scripts/<name>.
-
no arguments or status -> Respond with a profile snapshot:
enabled: <true|false>
level: <global_level> (<role for the level>)
mode: <learn|productive>
speed: <comprehension_speed>
copy: <copy_tendency>
streak: <streak_days> days
calibrated: <true|false>
If enabled is false, append: (hooks installed but skill inactive — run /socratiskill:socratic on to re-enable).
-
on -> Activate the skill: write enabled: true to profile.json.
Starting next turn, the UserPromptSubmit hook will inject SOCRATIC
CONTEXT and the Stop hook will record telemetry again. Respond:
socratiskill: enabled
SOCRATIC CONTEXT will inject on next turn.
-
off -> Deactivate the skill: write enabled: false to profile.json.
Hooks remain installed but inject only a short DISABLED silencer
(~30 tokens) telling the model to behave as default Claude Code.
Instant toggle; does NOT require /reload-plugins or touching
settings.json. Respond:
socratiskill: disabled
run /socratiskill:socratic on to re-enable.
-
pause -> True bypass — renames profile.json to profile.json.paused
so the hook short-circuits before generating ANY output. Zero token
cost per turn (vs ~30 tokens for off). Use when you want the plugin
truly invisible for a stretch of work without losing your level /
streak / error-map. Run bash <plugin-root>/scripts/pause.sh and
show stdout verbatim.
-
resume -> Reverse of pause — renames profile.json.paused back to
profile.json so hooks resume injecting SOCRATIC CONTEXT on the next
turn. Run bash <plugin-root>/scripts/resume.sh and show stdout
verbatim. Both pause and resume are idempotent: invoking them
twice in a row is a no-op the second time.
-
level <1-5> -> Update global_level in ~/.claude/socratic/profile.json.
Validate range. Respond:
level updated: <old> -> <new> (<role>)
If out of range (1-5), respond invalid level: <N> and write nothing.
-
mode <learn|productive> -> Update mode in profile.json. Validate
that it is one of the two values. Respond:
mode updated: <old> -> <new>
-
calibrate -> Run the initial calibration flow (self-assessment,
1 question). See "Calibration flow" below.
-
hint / faster -> Raise hint level +1 (more direct). Run
bun run <plugin-root>/scripts/adjust-hint.ts --delta +1 and show
stdout. Both subcommands are mechanical aliases; hint is the
user's shortcut when they need more help, faster is for when they
want you to be more direct.
-
slower -> Lower hint level -2 (more socratic). Run
bun run <plugin-root>/scripts/adjust-hint.ts --delta -2.
-
challenge -> Activate anti-adulation mode for 1 turn. Read
profile.json, add challenge_next_turn: true, rewrite with Write.
The UserPromptSubmit hook consumes it on the next turn and injects
the note. Respond:
challenge mode armed: will apply to your next message
-
accept -> Apply the last suggested calibration (raise or lower
global_level according to pending_calibration_change). Run
bun run <plugin-root>/scripts/accept-calibration.ts and show stdout.
If no pending change exists, the script exits 2; show stderr verbatim.
-
teach <topic> -> Activate Feynman mode (role inversion: the user
teaches the topic, the model probes and detects gaps). Run
bun run <plugin-root>/scripts/start-teach.ts --topic "<topic>" and
show stdout. If a teach session is already active, the script exits 2
and stderr instructs the user to run endteach first.
-
endteach -> Close Feynman mode, print a summary of detected gaps,
and leave feynman_summaries[] in the session file (the journal
harvests it). Run bun run <plugin-root>/scripts/end-teach.ts and
show stdout. If no teach session is active, exit 2 with stderr.
-
review -> Execute a spaced-repetition card. Run
bun run <plugin-root>/scripts/pick-review.ts. If the first stdout
line starts with "no review cards due", respond with that exact
message and stop. If a card is present, follow the protocol in
rules/review.md: pose ONE verifiable question about the topic,
wait for the user's response on the next turn, and close with
HINT_META using the EXACT topic slug returned by pick-review (so the
Leitner scheduler updates the correct card).
-
journal [today|week|month] -> Regenerate the journal for the
requested period (default: today) from the session files, and print
it. Run bun run <plugin-root>/scripts/build-journal.ts --period <p>
and show stdout verbatim. The script also writes
~/.claude/socratic/journal/<file>.md for later reference.
-
reset -> Wipe ALL local socratic state (profile, journal,
error-map, sessions, antipatterns). Destructive — requires confirmation
unless reset force is passed. Run
bash <plugin-root>/scripts/uninstall.sh --purge (the script has
hardened path-traversal guards — refuses any STATE_DIR not under
$HOME/.claude/socratic/). After the state is gone, print:
[ok] state wiped: ~/.claude/socratic/
the plugin itself is still installed. to fully remove it:
/plugin uninstall socratiskill
/plugin marketplace remove socratiskill
to keep using the plugin, run /socratiskill:socratic calibrate
again to create a fresh profile.
If the user passes bare reset (no force), ask once:
this will DELETE your entire socratic state (profile, journal,
error-map, sessions, antipatterns) at ~/.claude/socratic/.
this cannot be undone.
to proceed, run: /socratiskill:socratic reset force
and do NOT invoke the script.
-
Read ~/.claude/socratic/profile.json. If calibration_completed == true, respond:
already calibrated: level <N> (<role>)
to recalibrate, delete profile.json or run: /socratiskill:socratic calibrate force
If the argument is exactly calibrate force, proceed as if it were
not calibrated (the flow continues).
-
Present EXACTLY this message to the user (do not modify and do not
add extra emojis — the only one allowed is the one in the text):
Welcome to Socratiskill 🎓
To adapt my pedagogical style, I need to know your programming
experience level. Pick the option that best describes you:
1. Novice — Starting out. I need detailed explanations.
2. Basic — I know fundamentals but need frequent guidance.
3. Intermediate — I code regularly. I solve problems with some help.
4. Advanced — Solid experience. I prefer code review and challenges.
5. Expert — Fluent in multiple technologies. Silent colleague, that's it.
Respond with the number (1-5) or the level name.
-
Wait for the user's response. Parse using these rules (lowercase
after trimming):
- Direct number 1-5 -> that level.
- Keyword (substring match, bilingual for backward compatibility):
- "novice" | "beginner" | "novato" | "noob" | "principiante" -> 1
- "basic" | "basico" -> 2
- "intermediate" | "intermedio" -> 3
- "advanced" | "avanzado" -> 4
- "expert" | "pro" | "experto" -> 5
- If no rule matches, respond:
did not understand. respond with a number from 1 to 5
or one of these words: novice, basic, intermediate, advanced, expert.
And wait again.
-
Once the level N is parsed, run commit-calibration.sh via Bash:
bash <plugin-root>/scripts/commit-calibration.sh --level N
(Remember <plugin-root> resolves to two directories up from this
SKILL.md — see the "Path convention" section at the top.)
-
If the script exits 0, respond:
calibration complete: level N (<role>)
mode defaults to: learn
run /socratiskill:socratic mode productive if you prefer speed over depth.
On error, show stderr and stop without touching anything else.