diff --git a/README.md b/README.md index 51a1490..83372ed 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,19 @@ level, runs the tutoring session directly, remembers what you've mastered across sessions, and reviews your progress from the transcript. + + + +More screenshots and diagrams + + + + + + +More in [docs/diagrams.md](docs/diagrams.md). + + [](https://github.com/voidstackloop/expert-mentor/actions/workflows/ci.yml) [](https://pypi.org/project/expert-mentor/) [](https://pypi.org/project/expert-mentor/) diff --git a/docs/diagrams.md b/docs/diagrams.md new file mode 100644 index 0000000..6cc9291 --- /dev/null +++ b/docs/diagrams.md @@ -0,0 +1,98 @@ +# expert-mentor diagrams + +Rendered copies live in [`docs/images/`](images/). Related docs: +[commands](commands.md), [providers](providers.md), [learning](learning.md), +[configuration](configuration.md). + +## From field to mentor + +What happens between `mentor --field "Rust"` and a live session, and where the +learner's progress is kept afterwards. + + + +```mermaid +flowchart LR + subgraph IN["Learner input"] + F["--field · --level--goal · --context--style · --language"] + SAVED["saved mentormentor run rustbuddy"] + end + + subgraph BUILD["Prompt builder · expert_mentor.py"] + PROF["field profilereferences/fields.jsonconcepts · misconceptions · anchors"] + TPL["templates/mentor_system_prompt.mdcompact_prompt.md"] + SHAPE["shape_promptmarkdown or XML · compactfor small local models"] + HIST["learner historyinjected when --learner"] + end + + subgraph EMIT["Emit (no network)"] + TXT["text / markdownpaste into any chat"] + JSON["JSON request body"] + MF["Ollama Modelfile"] + end + + subgraph RT["Provider adapters · mentor_runtime.py (stdlib urllib, SSE streaming)"] + A["ClaudeMessages API · thinking"] + O["OpenAIreasoning effort"] + G["Gemini"] + OL["Ollamalocalhost:11434"] + LC["llama.cpp / LM StudioOpenAI-compatible"] + end + + SESS["mentor runinteractive sessionintake → roadmap → teach/practice → consolidate"] + + subgraph MEM["~/.config/expert-mentor"] + TR["sessions/<ts>-<name>.mdtranscript + metadata"] + LP["learners/<name>.jsonmastered · shaky · misconceptions"] + CARDS["learners/<name>.cards.jsonSM-2-lite schedule"] + end + + REV["mentor reviewstrict JSON assessment"] + QZ["mentor cards --generatementor quiz"] + + F --> PROF + SAVED --> PROF + PROF --> TPL --> SHAPE + HIST --> SHAPE + SHAPE --> TXT & JSON & MF + SHAPE --> SESS + SESS <--> A & O & G & OL & LC + SESS --> TR + TR --> REV --> LP + TR --> QZ --> CARDS + LP -. "--remember" .-> HIST +``` + +## A `mentor run --remember` session + +```mermaid +sequenceDiagram + autonumber + actor L as Learner + participant M as mentor CLI + participant P as Provider adapter + participant LLM as Model (cloud or local) + participant S as ~/.config/expert-mentor + + L->>M: mentor run --field Rust --provider claude --remember + M->>S: load learners/rust.json + M->>M: build system prompt + inject learner history + M->>P: stream(system, messages) + P->>LLM: HTTPS / localhost request + LLM-->>P: SSE chunks (text · thinking · usage) + P-->>L: streamed reply (Phase 1: intake) + loop teach / practice + L->>M: answer or exercise attempt + M->>P: history (last N turns) + new message + P->>LLM: request + LLM-->>L: feedback, next step + end + L->>M: /quit + M->>S: save transcript + metadata + Note over L,S: later, as separate commands + L->>M: mentor review rust --apply + M->>P: review prompt (strict JSON) + P->>LLM: assess latest transcript + LLM-->>M: mastered · shaky · misconceptions · next lesson + M->>S: merge into learners/rust.json +``` diff --git a/docs/images/diagram-flow.png b/docs/images/diagram-flow.png new file mode 100644 index 0000000..85703fe Binary files /dev/null and b/docs/images/diagram-flow.png differ diff --git a/docs/images/diagram-flow.svg b/docs/images/diagram-flow.svg new file mode 100644 index 0000000..acb6a09 --- /dev/null +++ b/docs/images/diagram-flow.svg @@ -0,0 +1,99 @@ +~/.config/expert-mentorProvider adapters · mentor_runtime.py (stdlib urllib, SSE streaming)Emit (no network)Prompt builder · expert_mentor.pyLearner input--remember--field · --level--goal · --context--style · --languagesaved mentormentor run rustbuddyfield profilereferences/fields.jsonconcepts · misconceptions · anchorstemplates/mentor_system_prompt.mdcompact_prompt.mdshape_promptmarkdown or XML · compactfor small local modelslearner historyinjected when --learnertext / markdownpaste into any chatJSON request bodyOllama ModelfileClaudeMessages API · thinkingOpenAIreasoning effortGeminiOllamalocalhost:11434llama.cpp / LM StudioOpenAI-compatiblementor runinteractive sessionintake → roadmap → teach/practice → consolidatesessions/<ts>-<name>.mdtranscript + metadatalearners/<name>.jsonmastered · shaky · misconceptionslearners/<name>.cards.jsonSM-2-lite schedulementor reviewstrict JSON assessmentmentor cards --generatementor quiz \ No newline at end of file diff --git a/docs/images/diagram-session-sequence.png b/docs/images/diagram-session-sequence.png new file mode 100644 index 0000000..330676c Binary files /dev/null and b/docs/images/diagram-session-sequence.png differ diff --git a/docs/images/diagram-session-sequence.svg b/docs/images/diagram-session-sequence.svg new file mode 100644 index 0000000..11d84e1 --- /dev/null +++ b/docs/images/diagram-session-sequence.svg @@ -0,0 +1,99 @@ +~/.config/expert-mentorModel (cloud or local)Provider adaptermentor CLI~/.config/expert-mentorModel (cloud or local)Provider adaptermentor CLIloop[teach / practice]later, as separate commandsLearnermentor run --field Rust --provider claude --remember1load learners/rust.json2build system prompt + inject learner history3stream(system, messages)4HTTPS / localhost request5SSE chunks (text · thinking · usage)6streamed reply (Phase 1: intake)7answer or exercise attempt8history (last N turns) + new message9request10feedback, next step11/quit12save transcript + metadata13mentor review rust --apply14review prompt (strict JSON)15assess latest transcript16mastered · shaky · misconceptions · next lesson17merge into learners/rust.json18Learner \ No newline at end of file diff --git a/docs/images/terminal-doctor.png b/docs/images/terminal-doctor.png new file mode 100644 index 0000000..e54a70b Binary files /dev/null and b/docs/images/terminal-doctor.png differ diff --git a/docs/images/terminal-fields.png b/docs/images/terminal-fields.png new file mode 100644 index 0000000..8cfc372 Binary files /dev/null and b/docs/images/terminal-fields.png differ diff --git a/docs/images/terminal-prompt-rust.png b/docs/images/terminal-prompt-rust.png new file mode 100644 index 0000000..8d51050 Binary files /dev/null and b/docs/images/terminal-prompt-rust.png differ diff --git a/docs/images/terminal-providers.png b/docs/images/terminal-providers.png new file mode 100644 index 0000000..2196068 Binary files /dev/null and b/docs/images/terminal-providers.png differ
~/.config/expert-mentor
Provider adapters · mentor_runtime.py (stdlib urllib, SSE streaming)
Emit (no network)
Prompt builder · expert_mentor.py
Learner input
--remember
--field · --level--goal · --context--style · --language
saved mentormentor run rustbuddy
field profilereferences/fields.jsonconcepts · misconceptions · anchors
templates/mentor_system_prompt.mdcompact_prompt.md
shape_promptmarkdown or XML · compactfor small local models
learner historyinjected when --learner
text / markdownpaste into any chat
JSON request body
Ollama Modelfile
ClaudeMessages API · thinking
OpenAIreasoning effort
Gemini
Ollamalocalhost:11434
llama.cpp / LM StudioOpenAI-compatible
mentor runinteractive sessionintake → roadmap → teach/practice → consolidate
sessions/<ts>-<name>.mdtranscript + metadata
learners/<name>.jsonmastered · shaky · misconceptions
learners/<name>.cards.jsonSM-2-lite schedule
mentor reviewstrict JSON assessment
mentor cards --generatementor quiz