@@ -1224,23 +1224,48 @@ <h2 id="running-tests">Running Tests<a class="headerlink" href="#running-tests"
12241224uv< span class ="w "> </ span > run< span class ="w "> </ span > pytest< span class ="w "> </ span > -k< span class ="w "> </ span > < span class ="s2 "> "test_search"</ span >
12251225</ code > </ pre > </ div >
12261226< p > Tests live in:
1227- - < code > packages/agent-session-tools /tests/</ code > — session tools tests
1228- - < code > tests/</ code > — workspace-level integration tests (if any) </ p >
1227+ - < code > packages/studyctl /tests/</ code > — studyctl CLI and review tests
1228+ - < code > packages/agent-session-tools/ tests/</ code > — session tools tests</ p >
12291229< h2 id ="project-structure "> Project Structure< a class ="headerlink " href ="#project-structure " title ="Permanent link "> ¶</ a > </ h2 >
12301230< div class ="highlight "> < pre > < span > </ span > < code > socratic-study-mentor/
12311231├── packages/
12321232│ ├── studyctl/ # Study pipeline CLI
12331233│ │ ├── src/studyctl/
1234- │ │ │ ├── cli.py # Click CLI commands
1235- │ │ │ ├── config.py # Topic configuration
1236- │ │ │ ├── settings.py # Config file loader
1234+ │ │ │ ├── cli/ # Click CLI (LazyGroup package)
1235+ │ │ │ │ ├── __init__.py # Root group + lazy registration
1236+ │ │ │ │ ├── _lazy.py # LazyGroup class
1237+ │ │ │ │ ├── _shared.py # Console, helpers, constants
1238+ │ │ │ │ ├── _sync.py # sync, status, audio, topics, dedup
1239+ │ │ │ │ ├── _review.py # review, struggles, wins, progress, bridges
1240+ │ │ │ │ ├── _config.py # config init, config show
1241+ │ │ │ │ ├── _state.py # state push/pull/status/init
1242+ │ │ │ │ ├── _content.py # content group (split, process, syllabus, etc.)
1243+ │ │ │ │ ├── _schedule.py # schedule group + calendar blocks
1244+ │ │ │ │ └── _web.py # web, tui, docs commands
1245+ │ │ │ ├── content/ # Content pipeline (absorbed from pdf-by-chapters)
1246+ │ │ │ │ ├── __init__.py
1247+ │ │ │ │ ├── splitter.py # PDF splitting by TOC bookmarks or page ranges
1248+ │ │ │ │ ├── notebooklm_client.py # NotebookLM API (upload, generate, download)
1249+ │ │ │ │ ├── syllabus.py # Podcast syllabus chunking and state machine
1250+ │ │ │ │ ├── markdown_converter.py # Obsidian markdown → PDF conversion
1251+ │ │ │ │ ├── models.py # Shared data models (UploadResult, etc.)
1252+ │ │ │ │ └── storage.py # Course directory management
1253+ │ │ │ ├── services/ # Framework-agnostic service layer
1254+ │ │ │ │ ├── review.py # Review operations (cards, stats, SM-2)
1255+ │ │ │ │ └── content.py # Content service wrappers
1256+ │ │ │ ├── settings.py # All configuration, topics, path resolution
1257+ │ │ │ ├── review_db.py # SQLite SM-2 spaced repetition (WAL mode)
1258+ │ │ │ ├── review_loader.py # Flashcard/quiz JSON loader + validation
12371259│ │ │ ├── sync.py # NotebookLM sync
12381260│ │ │ ├── state.py # Sync state tracking
12391261│ │ │ ├── history.py # Session history queries
12401262│ │ │ ├── scheduler.py # launchd/cron jobs
12411263│ │ │ ├── shared.py # Cross-machine sync
12421264│ │ │ ├── maintenance.py # Notebook deduplication
1265+ │ │ │ ├── tui/ # Textual TUI app
1266+ │ │ │ ├── web/ # Web PWA server + static assets
12431267│ │ │ └── pdf.py # Markdown→PDF export
1268+ │ │ ├── tests/
12441269│ │ └── pyproject.toml
12451270│ └── agent-session-tools/ # Session management CLI
12461271│ ├── src/agent_session_tools/
@@ -1340,7 +1365,7 @@ <h2 id="how-to-add-a-new-study-topic">How to Add a New Study Topic<a class="head
13401365< span class ="w "> </ span > < span class ="nt "> tags</ span > < span class ="p "> :</ span > < span class ="w "> </ span > < span class ="p p-Indicator "> [</ span > < span class ="nv "> kubernetes</ span > < span class ="p p-Indicator "> ,</ span > < span class ="w "> </ span > < span class ="nv "> k8s</ span > < span class ="p p-Indicator "> ,</ span > < span class ="w "> </ span > < span class ="nv "> containers</ span > < span class ="p p-Indicator "> ,</ span > < span class ="w "> </ span > < span class ="nv "> orchestration</ span > < span class ="p p-Indicator "> ]</ span >
13411366</ code > </ pre > </ div >
13421367< p > The < code > tags</ code > list is used by < code > studyctl struggles</ code > and < code > studyctl review</ code > to match session content to topics.</ p >
1343- < p > If you want to add default topics that ship with the project, edit < code > packages/studyctl/src/studyctl/config .py</ code > and add to the fallback list in < code > get_topics()</ code > .</ p >
1368+ < p > If you want to add default topics that ship with the project, edit < code > packages/studyctl/src/studyctl/settings .py</ code > and add to the fallback list in < code > get_topics()</ code > .</ p >
13441369< h2 id ="how-to-modify-agent-behaviour "> How to Modify Agent Behaviour< a class ="headerlink " href ="#how-to-modify-agent-behaviour " title ="Permanent link "> ¶</ a > </ h2 >
13451370< table >
13461371< thead >
0 commit comments