@jamestesting888/tum-mcp 0.8.1 → 0.9.1

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # Changes
2
2
 
3
+ ## 0.9.1 — 2026-10-27
4
+
5
+ - Make Audio Notes an optional `audio-notes` extension. Keep five base skills,
6
+ preserve existing audio files, and describe all extensions in a compact README table.
7
+
8
+ - Use one compact terminal layout for help, connection status, extensions,
9
+ skills and permissions. Keep automation output available through `--json`.
10
+ - Give setup, install and uninstall matching status-aware pickers. Uninstall
11
+ offers full package removal through All. Keep named commands for scripts and
12
+ show optional workflow state through status, connect and doctor; remove the
13
+ separate extensions command group. Studocu browser sign-in stays unverified.
14
+ - Include TUMonline connection and permission status in doctor. Default checks
15
+ do not read credentials or create policy files; live checks verify identity
16
+ without fetching studies or grades.
17
+ - Make unverified status dots blue, ready/enabled green, action needed amber,
18
+ failures red and inactive states muted. Preserve labels with color disabled.
19
+
20
+ ## 0.9.0 — 2026-10-26
21
+
22
+ - Add read-only TUMonline study, public catalog and partial curriculum-position
23
+ tools, with separate account permissions, verified identity and bounded paging.
24
+ - Add optional Studocu search and reviewed personal PDF collection through
25
+ `tum-mcp install studocu`. Preserve originals, course bindings and recovery
26
+ history; supplementary personal-use sources are excluded from publication.
27
+ - Add optional `tum-mcp install lecture` and Prepare Lecture for timestamped
28
+ Lecture Notes in the existing course app. Prefer transcripts and supplied
29
+ materials, skip whole-silent recordings, preserve original-time coverage and
30
+ request only critical video frames. Publication remains an explicit opt-in.
31
+ - Support isolated, pinned CPU recognition on Windows x64, Intel Mac and supported
32
+ Linux/WSL hosts, alongside Apple Silicon MLX acceleration. Keep heavy recognizer
33
+ dependencies optional; captions/imported WebVTT need no recognizer installation.
34
+ - Handle persistent Studocu SSE replies, enforce response IDs/search limits and
35
+ bound TUMonline policy reads and catalog output. Unify extension status/removal
36
+ and verify both optional workflows together. Shorten the getting-started guide.
37
+ - Preserve existing Moodle compatibility tools, sessions, downloads, customized
38
+ skills and existing course layouts during installation and upgrades.
39
+
3
40
  ## 0.8.1 — 2026-10-26
4
41
 
5
42
  - Give every doctor/update status a dot: yellow for unverified or attention-needed
package/README.md CHANGED
@@ -1,196 +1,89 @@
1
1
  # TUM MCP
2
2
 
3
- Connect your coding agent to Moodle, Artemis and Zulip. Read course content and
4
- build a private, source-backed study workspace. Unofficial; independent of TUM.
3
+ Connect your coding agent to **Moodle, Artemis, Zulip and TUMonline**. Read course
4
+ sources with citations and turn them into a private study app. Unofficial and
5
+ independent of TUM.
5
6
 
6
- **Package: [@jamestesting888/tum-mcp](https://www.npmjs.com/package/@jamestesting888/tum-mcp).**
7
- [Release notes](CHANGELOG.md).
7
+ [**npm package**](https://www.npmjs.com/package/@jamestesting888/tum-mcp) ·
8
+ [Release notes](CHANGELOG.md) · [Setup guide](docs/setup.md)
8
9
 
9
- ## Agent setup
10
+ ## Get started
10
11
 
11
- Paste this into your coding agent to install the published package:
12
-
13
- ```text
14
- Install @jamestesting888/tum-mcp on this computer. Check Node.js is 22.14+.
15
- Run npm install --global @jamestesting888/tum-mcp@latest, then:
16
- tum-mcp setup --client codex
17
- Use --client claude, cursor, antigravity, or generic for a different client.
18
- Preserve existing settings and customized skills. Follow the activation steps.
19
- Help me run tum-mcp connect in an interactive terminal and choose services.
20
- I will complete sign-in/MFA in the browser. Never request secrets in chat.
21
- Run tum-mcp doctor to explain what is available and what still needs setup.
22
- ```
23
-
24
- ## Connect
25
-
26
- You need **Node.js 22.14+**, **a Chromium browser**, and your TUM account.
12
+ Requires **Node.js 22.14+**, a Chromium browser and your TUM account.
27
13
 
28
14
  ```sh
29
15
  npm install --global @jamestesting888/tum-mcp@latest
30
- tum-mcp setup --client codex
16
+ tum-mcp setup
31
17
  tum-mcp connect
32
18
  tum-mcp doctor
33
- tum-mcp --help
34
19
  ```
35
20
 
36
- Select services with **Space**, then **Enter**. Choose an installed browser and
37
- complete sign-in there. Only selected tabs open; Zulip needs no API key.
38
- Read access follows your campus account's permissions; no course/channel scope setup is needed.
39
- Use `tum-mcp study build --help` for a command's options.
40
-
41
- Choose a client with `--client`: `codex`, `claude`, `cursor` or `antigravity`.
42
- Setup configures MCP and installs all six skills; follow any activation or
43
- restart prompts. Use `generic` for manual MCP setup.
44
-
45
- For existing Cursor and Antigravity setups, run `tum-mcp update` to add the skills.
46
- Updates and uninstall preserve customized files and report them for review.
21
+ Select `codex`, `claude`, `cursor`, `antigravity` or `generic`, or pass `--client NAME`.
22
+ Follow the activation/restart instructions. In `connect`, select services with
23
+ **Space**, then **Enter**, and complete sign-in/MFA in the browser. Never paste
24
+ credentials into chat. Setup supplies its own Python runtime; Git, Docker and a
25
+ native keyring are unnecessary.
47
26
 
48
- Supports macOS, Windows, glibc Linux x86_64/ARM64 and WSL 3.x. In WSL, sign-in
49
- opens a Windows browser. Add `--host windows` to setup for a Windows client that
50
- uses the WSL backend. [Browser and WSL setup](docs/setup.md#wsl).
51
-
52
- Setup supplies a private Python runtime. Connections use encrypted local
53
- files and need no native keyring, Git or Docker.
27
+ Works on macOS, Windows, glibc Linux x86_64/ARM64 and WSL. For a Windows client
28
+ using a WSL backend, add `--host windows` to setup.
29
+ [Browser and platform details](docs/setup.md).
54
30
 
55
31
  ## Read and study
56
32
 
57
- | Source | Available content |
58
- | --- | --- |
59
- | Moodle | Materials, pages, announcements, forums, original downloads and cited PDF pages |
60
- | Artemis | Lectures, text/online/video units, student slide PDFs, released exercise statements and permitted own feedback |
61
- | Zulip | Selected course channels, discussion search and cited catch-up |
62
-
63
- Campus access is read-only. Exercise start, deployment, execution, submission,
64
- posting and read-state changes are unavailable.
65
-
66
- ### Skills and example requests
67
-
68
- The package includes six skills. Once you've chosen a course from
69
- your connections, try requests like these:
70
-
71
- | Skill | Use it to | Example request |
72
- | --- | --- | --- |
73
- | `read-content` | Read and explain course sources with citations | "Can you explain what we covered in last week's lecture?" |
74
- | `sync-course` | Create or refresh a course project | "Set up a study project for this course." |
75
- | `prepare-study` | Build lessons, flashcards and practice | "Make me a study website with flashcards and practice questions." |
76
- | `prepare-exercises` | Prepare optional hints, checks and worked solutions | "Help me work through this week's exercises in the same app." |
77
- | `publish-course` | Put a prepared website on GitHub Pages | "Put my study site online so I can open it on my phone." |
78
- | `audio-notes` | Save spoken lessons under `audio/` | "Turn this into audio notes I can listen to on the go." |
79
-
80
- Useful follow-ups in an existing project:
81
-
82
- - "Did I miss anything important on Zulip this week?"
83
- - "There's new course material. Can you update my study site?"
84
- - "I've left some comments on the site. Can you fix those parts?"
85
- - "Can you update the audio notes too?"
86
-
87
- Client setup installs managed copies of the
88
- [skill sources](src/tum_mcp/bundled/skills/). Develop or review skills in this repository.
89
-
90
- ### Recommended study flow
91
-
92
- 1. **`sync-course`**: Set up a project for your course and collect its material.
93
- Use it again when new material is available.
94
- 2. **`prepare-study`**: Turn that material into a study website with explanations,
95
- flashcards and practice questions. Use **`prepare-exercises`** for released sheets
96
- with prepared interactive guidance. Both workspaces share one app; either can come first.
97
- 3. **`publish-course`** (optional): Put the website online so you can study on your
98
- phone. Check the [publishing requirements](#publish-for-phone-access-optional) first.
99
- 4. **`audio-notes`** (optional): Turn the prepared content into spoken lessons.
100
- Use them to revisit prepared topics while walking or commuting.
101
-
102
- Each project holds one course. To open the website locally, run this from the
103
- course project folder:
104
-
105
- ```sh
106
- tum-mcp study
107
- ```
33
+ Ask your agent to explain course material, find announcements or catch up on a
34
+ Zulip channel. Campus access is read-only and follows your account permissions;
35
+ submissions, posting and exercise execution are unavailable.
108
36
 
109
- Your browser opens at `http://127.0.0.1:8765`. Press **Ctrl+C** in the terminal to stop.
110
- See the [study guide and local demo](docs/study.md) for more examples.
37
+ | Workflow | Example request |
38
+ | --- | --- |
39
+ | `read-content` | “Explain this week's lecture with source citations.” |
40
+ | `sync-course` | “Set up a project for this course and collect its materials.” |
41
+ | `prepare-study` | “Build lessons, flashcards and practice in a study website.” |
42
+ | `prepare-exercises` | “Add guided exercises from this week's released sheet.” |
43
+ | `publish-course` | “Publish my reviewed study site for phone access.” |
111
44
 
112
- ### Publish for phone access (optional)
45
+ Each project holds one course. Run `tum-mcp study` in its folder to open the app.
46
+ Ask the agent to refresh it when sources change or address comments left in the
47
+ app. [Study guide and demo](docs/study.md).
113
48
 
114
- Publishing requires [GitHub CLI](https://cli.github.com/) on the computer where
115
- your agent runs and an eligible paid GitHub plan. Sign in locally, then check it:
49
+ TUMonline currently provides study names/degrees, public course catalog metadata
50
+ and partial course curriculum positions. The catalog does not show enrollments.
51
+ Grades, exams, progress and full curricula are unavailable. Review its local
52
+ account policy with `tum-mcp manage tumonline`.
53
+ [TUMonline permissions](docs/tum-mcp.md#tumonline-permissions).
116
54
 
117
- ```sh
118
- gh auth login --hostname github.com
119
- tum-mcp doctor --live
120
- ```
55
+ ## Optional extensions
121
56
 
122
- `doctor` checks CLI availability; `--live` also verifies GitHub authentication.
123
- A coding platform's GitHub connector does not sign in the local CLI. No token
124
- needs to be pasted into the agent or stored by TUM MCP.
125
-
126
- **The repository is private. The website is public.** Review the lesson text,
127
- quotations and source links before asking your agent to publish.
128
-
129
- Later builds update the same site. `tum-mcp study` also prints its hosted URL.
130
- See [publishing details](docs/study.md#publish-a-study-website).
131
-
132
- ## Sign-in and session privacy
133
-
134
- Sign-in and MFA happen in a temporary browser window. Only service-owned session
135
- cookies are retained; identity-provider cookies are discarded when it closes.
136
- Sessions stay on your computer in encrypted files with owner-restricted keys.
137
- Configured local clients share those connections and saved preferences.
138
-
139
- ## Your study project
140
-
141
- The agent keeps each course in its own folder. After preparing the website,
142
- your project looks like this, with audio added when requested:
143
-
144
- ```text
145
- my-course/
146
- ├── AGENTS.md Your rules and a short pointer to agent context
147
- ├── materials/
148
- │ ├── content/ Lectures, slides and reading
149
- │ ├── exercises/ Exercise sheets and practice material
150
- │ ├── exams/ Available exam and revision material
151
- │ └── other/ Announcements and course information
152
- ├── app/
153
- │ ├── content.json Lessons, flashcards and practice questions
154
- │ └── index.html Your study website
155
- ├── audio/ Optional audio notes
156
- │ ├── scripts/ Narration text
157
- │ └── tracks/ Audio lessons
158
- └── .tum-mcp/
159
- ├── course.md Cited course orientation, rules and unknowns
160
- ├── state.json Course identity and source versions
161
- └── comments.json Passage comments, when added
162
- ```
57
+ Run `tum-mcp install` to choose extensions, then reload your client.
163
58
 
164
- Your agent uses your configured AI provider to work with course material.
165
- Publishing uploads only the generated website; materials, audio and comments
166
- stay local. Study progress is saved in your browser.
59
+ | Extension | Skill added | What it offers |
60
+ | --- | --- | --- |
61
+ | `lecture` | `prepare-lecture` | Lecture Notes with the professor's extra explanations, timestamps and selected critical visuals. Prefers transcripts and slides; local recognition is optional. |
62
+ | `studocu` | `sync-studocu` | Search and collect selected supplementary PDFs saved in your browser. Personal use only; excluded from published sites. |
63
+ | `audio-notes` | `audio-notes` | Turn prepared Study lessons into concise audio tracks, with resumable generation and coverage tracking. Voice setup happens when used. |
167
64
 
168
- ## Update
65
+ Use `tum-mcp status` to see installed workflows and `tum-mcp uninstall` to remove
66
+ them. Named commands also work, such as `tum-mcp install audio-notes` and
67
+ `tum-mcp uninstall lecture`. Existing notes, audio and customizations are retained.
68
+ Audio Notes needs no additional campus sign-in. Studocu uses your own browser.
169
69
 
170
- ```sh
171
- tum-mcp update
172
- ```
70
+ [Lecture and recognition](docs/lecture-notes.md) ·
71
+ [Studocu collection](docs/study.md#studocu-materials) · [Setup details](docs/setup.md)
173
72
 
174
- `update` downloads the latest release, validates its backend, installs it in the
175
- same npm location and refreshes configured clients. It never downgrades a newer
176
- installation. Use `tum-mcp update --local` to refresh the installed version without checking npm.
177
- From 0.6.0 or earlier, upgrade the npm package once to obtain this command.
178
- Sessions, preferences and downloads carry forward. User-edited entries and skills are
179
- preserved and reported for review. Reload the client; refresh its cached plugin
180
- if needed. Study sites are updated separately through the study workflows.
73
+ ## Privacy, updates and removal
181
74
 
182
- ## Remove
75
+ Sessions are encrypted locally. Your agent uses your configured AI provider to
76
+ process selected material. Publishing requires local GitHub CLI authentication
77
+ and an eligible GitHub plan: **the repository is private; the website is public**.
78
+ Review content before publishing. [Publishing details](docs/study.md#publish-a-study-website).
183
79
 
184
80
  ```sh
81
+ tum-mcp update # Upgrade the package and refresh managed clients
185
82
  tum-mcp uninstall
186
83
  ```
187
84
 
188
- The npm package, managed registrations and unchanged skills are removed. Settings, sessions,
189
- downloads and study projects are preserved. After closing clients, add
190
- `--purge-runtime` to remove generated runtimes or `--forget-credentials` to
191
- remove saved local credentials. [Removal details](docs/setup.md#update-and-remove).
192
- Use `--client NAME` to remove just one client, or `--keep-package` to retain npm.
193
-
194
- [Guide](docs/tum-mcp.md) · [Setup](docs/setup.md) · [Study workflows](docs/study.md) · [Development](docs/development.md)
85
+ Sessions, downloads, course projects and edited skills are preserved. Reload the
86
+ client after updates. [Update and removal options](docs/setup.md#update-and-remove).
195
87
 
88
+ [Command guide](docs/tum-mcp.md) · [Development](docs/development.md) ·
196
89
  [MIT](LICENSE) · [NOTICE](NOTICE) · [Report a problem](https://github.com/jamestesting0/tum-mcp/issues)
@@ -22,6 +22,9 @@ npm run test:package-lifecycle
22
22
 
23
23
  Python 3.13 is the managed runtime. Install Tesseract for OCR tests. Default tests
24
24
  use synthetic sources and credentials. No language-server installation is needed.
25
+ Studocu fixtures must likewise use synthetic documents and local transports, never
26
+ browser cookies, personal account details or live downloaded PDFs. The extension
27
+ is off by default; validate both selected and unselected skill packs.
25
28
  Set `TUM_MOODLE_SYSTEM_KEYRING=1` for a unique synthetic native-store round trip.
26
29
  The ordinary campus runtime uses encrypted local files and owner-restricted keys.
27
30
  Set `TUM_MCP_BROWSER_INTEGRATION=1` to include the real HTTP static-export browser
@@ -37,7 +40,7 @@ Each layer owns a different failure boundary:
37
40
  | Unit | Parsing, policy, malformed input and failure branches with synthetic collaborators |
38
41
  | Integration | Real files, CLI/MCP, transactions, HTTP confinement and isolated project updates |
39
42
  | Installed consumer | Actual npm/wheel contents, managed runtime and complete browser workflows |
40
- | Public upgrade | Earlier published versions, repair, ownership conflicts and removal |
43
+ | Public upgrade | Published 0.9.0, repair, ownership conflicts and removal |
41
44
  | Native platform | OS credential/ACL behavior; WSL Windows browser transport on both engines |
42
45
 
43
46
  Study integration fixtures build the private rich regression fixture once, then copy it into a fresh
@@ -56,12 +59,21 @@ CI runs macOS, Windows and Linux, plus both distribution engines on WSL 3.x.
56
59
  Consumer checks install the actual npm artifact, discover tools, build a study
57
60
  site and test available Chromium browsers with temporary profiles and synthetic
58
61
  pages. WSL verifies Windows browser transport. No live account is used.
59
- Upgrade checks cover public 0.8.0, client refresh, customized-file conflicts,
60
- failed preparation, runtime repair and removal that preserves work/credentials.
62
+ Upgrade checks start from public 0.9.0 and cover all five clients, optional-extension
63
+ retention, customized-file conflicts, failed preparation, runtime repair and
64
+ removal that preserves work/credentials. Earlier releases are outside this matrix.
61
65
  The package-lifecycle check uses a local synthetic registry and real isolated
62
66
  global npm prefixes to verify downloads, backend validation, replacement,
63
67
  failure ordering and one-command removal. It does not publish a test release.
64
68
  All five jobs must pass on the exact pushed commit before completion is claimed.
69
+ Desktop jobs additionally install the optional hash-locked CPU recognizer and
70
+ transcribe the synthetic speech fixture; supported Apple Silicon runners also
71
+ exercise MLX. This explicit test downloads public pinned model files, never campus
72
+ recordings. Ordinary test runs skip it unless `TUM_MCP_LECTURE_ASR_INTEGRATION=1`.
73
+ Recognition runs before package lifecycle checks to expose native dependency
74
+ failures early. Windows also runs the affected browser/UTF-8 fixture checks first.
75
+ Its complete job budget is 35 minutes for native ACL and subprocess coverage;
76
+ the macOS and Linux budgets remain 25 minutes.
65
77
 
66
78
  Live Moodle checks are opt-in: `TUM_MOODLE_LIVE=1 uv run pytest tests/live -q`.
67
79
  They use the developer's selected course and saved session. Keep them out of CI.
@@ -129,3 +141,20 @@ Chromium sign-in/MFA, read a PDF and forum, download a file, then restart and ch
129
141
  session reuse. Automated synthetic sign-in does not certify human SSO on every OS.
130
142
  For UI changes, exercise the generated app at narrow/wide widths in both themes;
131
143
  check keyboard navigation, reduced motion, source links and retained progress.
144
+
145
+ ## Optional Lecture extension
146
+
147
+ Base setup exposes five workflows and no `tum_live_*` tools. `install lecture`
148
+ records explicit selection, refreshes managed clients and provisions the optional
149
+ recognizer only when requested/supported. `--no-asr` keeps captions/imported WebVTT.
150
+ Heavy recognition dependencies and model weights stay outside the base environment
151
+ and package artifacts. `lecture_processing/` owns bounded media/ASR evidence;
152
+ `lecture_content.py`, `lecture_data.py` and `lecture_assets.py` validate the notes
153
+ and figures used by the static app. See [the workflow guide](lecture-notes.md).
154
+
155
+ Use `skills validate --all` to check the packaged optional workflow without installing
156
+ it; default validation checks the selected workflows. Activation statistics remain
157
+ unmeasured until genuine fresh-session trial records exist. Default tests use
158
+ synthetic media and course data. `test:consumer` and `test:upgrade` exercise optional
159
+ install/update/export/removal from an actual local npm artifact. Never publish or
160
+ stage npm as a test.
@@ -0,0 +1,138 @@
1
+ # Lecture Notes
2
+
3
+ Install the optional extension only when needed:
4
+
5
+ ```sh
6
+ tum-mcp install lecture
7
+ # Captions/imported WebVTT without provisioning recognition:
8
+ tum-mcp install lecture --no-asr
9
+ ```
10
+
11
+ Restart the coding client to load Prepare Lecture and the three TUM-Live metadata
12
+ tools. Base setup keeps its five skills and existing services. Removing the option
13
+ with `tum-mcp uninstall lecture` preserves course notes, evidence, sessions,
14
+ model caches and customizations. Reinstalling can reuse them.
15
+
16
+ Ask: “Prepare Lecture Notes from this recording and these slides, focusing on
17
+ what the professor explains beyond the material.” It adds Lecture Notes to the
18
+ same course app, alongside Study and Exercises. Notes have coherent explanations,
19
+ examples, important qualifications, formulas, selective source images and direct
20
+ timestamp access. Attribution review stays private, so the reading flow is clean.
21
+ Lecture Notes has no quizzes or flashcards; broader teaching/practice stays in Study.
22
+
23
+ ## Processing order and cost
24
+
25
+ 1. Validate the selected recording. Whole-recording silence markers make it invalid;
26
+ stop before content, including cached transcripts/images. Missing duration can
27
+ be resolved from bounded playlist metadata. Partial silence/cuts retain the
28
+ original recording clock.
29
+ 2. Prefer existing captions or supplied original-time WebVTT. Otherwise the optional
30
+ pinned local recognizer scans retained audio in resumable chunks. It checks all
31
+ channels, preserves coverage gaps and flags uncertain/repetitive recognition.
32
+ Three quiet samples alone cannot invalidate a recording.
33
+ 3. Read compact transcript passages, map the full retained lecture and compare with
34
+ verified slides/materials. Select additional reasoning, examples, corrections,
35
+ caveats and advice; do not claim novelty when comparison materials are missing.
36
+ 4. Use only a few critical recording frames when text/materials leave a consequential
37
+ visual question unresolved. No default previews or frame-by-frame model calls.
38
+ Captures use measured times and verified image bytes. Supporting diagrams use
39
+ normal content blocks, with private attribution review.
40
+ 5. Review the notes, citations and selected figures, then build a coherent batch.
41
+
42
+ Vision cost depends on the chosen model and image size. This workflow reduces
43
+ unnecessary images and model context; it does not promise a fixed price or a
44
+ measured accuracy improvement. In the selected 81-minute retained-audio experiment,
45
+ compact text for 200 passages used 39,412 bytes versus 372,519 with word details,
46
+ with identical text/times. An unchanged preparation reused 12 recognition
47
+ checkpoints with zero inference and fetched about 456 KB of playlist metadata.
48
+ These are observations from that source and cache, not universal benchmarks.
49
+ A direct media playlist offered no separate audio rendition; the processor used
50
+ bounded muxed segments rather than guessing alternative download URLs.
51
+
52
+ ## Host commands
53
+
54
+ Use the existing course binding and campus connection. Authentication is separate
55
+ from HTTP media retrieval; do not export cookies or pass signed URLs to download
56
+ commands. Captions and imported original-time WebVTT work without a recognizer.
57
+ Automatic ASR installs separately with hash-locked CPython 3.13 wheels and lazy,
58
+ revision-pinned public model weights; neither is part of the base runtime.
59
+
60
+ | Host | Local recognizer |
61
+ | --- | --- |
62
+ | Apple Silicon macOS 15+ | MLX acceleration by default |
63
+ | Apple Silicon macOS 14 | CPU int8 |
64
+ | Intel macOS 13+ | CPU int8 |
65
+ | Windows x64 | CPU int8; Microsoft Visual C++ runtime required |
66
+ | Linux/WSL x86_64 or ARM64, glibc 2.28+ | CPU int8 |
67
+
68
+ Native Windows ARM64, 32-bit systems and musl Linux have no supported locked
69
+ runtime. Use captions/imported WebVTT there. CPU inference requires compatible
70
+ CTranslate2 instructions (SSE4.1 on x86); installation verifies native imports and
71
+ int8 support before selecting the runtime. See the upstream
72
+ [CTranslate2 requirements](https://opennmt.net/CTranslate2/installation.html).
73
+ Windows, Linux x64 and Apple Silicon recognition have native CI smoke checks;
74
+ Intel Mac and Linux ARM64 compatibility also depends on the published wheels.
75
+
76
+ FFmpeg and ffprobe must be on PATH for recording audio extraction or selected
77
+ video frames. They are unnecessary for imported captions and cached text.
78
+ `lecture runtime status` reports the selected engine and missing prerequisites.
79
+ Use `lecture runtime install` to retry after fixing a prerequisite. Advanced users
80
+ can set `TUM_MCP_LECTURE_ENGINE=cpu` consistently for installation and preparation
81
+ to bypass Metal; the default `auto` retains existing MLX runtimes and model caches.
82
+ An engine switch uses separate caches. No cloud transcription API is configured.
83
+
84
+ CPU decoding uses int8, one worker and at most four threads. It consumes the full
85
+ retained audio, with word timestamps and no VAD retiming. ASR remains fallible,
86
+ especially for names and notation; compare important wording with slides and the
87
+ recording rather than treating confidence scores as proof.
88
+
89
+ ```sh
90
+ tum-mcp lecture inspect PROJECT
91
+ tum-mcp lecture runtime status
92
+ tum-mcp lecture prepare PROJECT --recording URL
93
+ # One selected recording with supplied captions:
94
+ tum-mcp lecture prepare PROJECT --recording URL --transcript lecture.vtt
95
+ # Read bounded compact pages; continue with returned next_offset:
96
+ tum-mcp lecture transcript PROJECT --recording KEY --start 0 --end 28800 --limit 200 --offset 0
97
+ # Only after identifying an unresolved visual question:
98
+ tum-mcp lecture prepare PROJECT --recording URL --frame-at SECONDS
99
+ tum-mcp lecture frames PROJECT --recording KEY --start START --end END
100
+ ```
101
+
102
+ `--words` adds word alignment details to transcript reads. `prepare --previews`
103
+ explicitly requests approximate seek candidates; they are not verified capture
104
+ times. `--language en` is appropriate only for a known English recording.
105
+
106
+ Prepared media, raw transcripts, receipts and review notes stay under `.tum-mcp/`.
107
+ Safe source receipts can be reconciled into the shared inventory:
108
+
109
+ ```sh
110
+ tum-mcp lecture export-snapshot PROJECT --output snapshot.json
111
+ tum-mcp study sync PROJECT --snapshot snapshot.json
112
+ tum-mcp study schema lectures
113
+ tum-mcp study build PROJECT --local-only
114
+ tum-mcp study inspect PROJECT
115
+ ```
116
+
117
+ The agent authors `app/lectures.json` using real source hashes and coverage; the
118
+ legacy `study/` layout stays supported. Captured images stage in
119
+ `.tum-mcp/lecture-assets/` and copy only when selected. Source freshness and note
120
+ semantic revision are separate, preserving passage comments through harmless
121
+ receipt/image updates. Local comments support `--view lectures --lecture KEY`.
122
+
123
+ Open with `tum-mcp study` from the course folder. For a credential-free synthetic
124
+ preview after installing the extension, use `tum-mcp study demo PROJECT --lectures`.
125
+ The default demo still has only Study and Exercises. Synthetic teaching/timestamps
126
+ exercise the product and do not establish real lecture accuracy.
127
+
128
+ ## Publication
129
+
130
+ Lecture Notes is excluded from publication by default, including old saved
131
+ configurations. After reviewing public exposure, use the existing publish-course
132
+ workflow with `--include-lectures`; Exercises has a separate choice. Exclusion
133
+ removes lecture text, lecture-only sources/math and referenced images from exports,
134
+ and removes previously managed remote images while preserving unrelated files.
135
+ Raw media/transcripts, comments and private review metadata are never exported.
136
+ The entire export, including its ownership marker, must fit 16 MiB and 100 files.
137
+ Essential figures are not silently omitted/compressed; a notes-only app excluded
138
+ from publication cannot produce an empty site.
package/docs/setup.md CHANGED
@@ -19,24 +19,59 @@ tum-mcp doctor
19
19
  tum-mcp --help
20
20
  ```
21
21
 
22
- Use `--client claude`, `cursor`, `antigravity`, or `generic` for another client.
22
+ Run `tum-mcp setup` to choose clients interactively, or pass `--client claude`,
23
+ `cursor`, `antigravity`, or `generic` directly. Existing registrations have status dots.
23
24
  Codex needs the plugin enabled and a restart when prompted. Cursor and
24
- Antigravity setup installs all six skills and MCP configuration; restart each
25
+ Antigravity setup installs all five base skills and MCP configuration; restart each
25
26
  client afterward. Existing MCP-only setups gain the skills through `tum-mcp update`
26
27
  or another setup run. Generic setup writes configuration for manual installation.
28
+
29
+ Studocu is optional: run `tum-mcp install studocu`, then reload the client. The
30
+ extension adds the `sync-studocu` skill and its tools. `tum-mcp status`
31
+ reports the local selection; `tum-mcp uninstall studocu` disables it and
32
+ preserves course materials and customized files. Generic clients use
33
+ `tum-mcp skills export DESTINATION` to install the active pack manually.
27
34
  Setup preserves unrelated settings and refuses to
28
35
  replace customized entries. It does not authenticate or fetch courses.
29
36
 
37
+ Audio Notes is optional: use `tum-mcp install audio-notes`. It adds the
38
+ `audio-notes` skill for prepared Study content; synthesis is set up when used.
39
+ Existing course audio is retained when the extension is disabled.
40
+
41
+ ## Terminal output
42
+
43
+ `tum-mcp status` shows saved connections and optional workflows;
44
+ `tum-mcp doctor` also checks clients and prerequisites, including TUMonline.
45
+ Green dots mean ready or enabled, blue means not verified, amber means action
46
+ needed, red means failed, and muted dots mean inactive. Every dot has a text
47
+ label. `NO_COLOR` disables color; narrow terminals use stacked rows.
48
+
49
+ Bare `tum-mcp setup`, `tum-mcp install` and `tum-mcp uninstall` share the same
50
+ keyboard controls as connect. Nothing is preselected; Ctrl+C cancels. Uninstall
51
+ also offers **All — TUM MCP**, which removes the package and managed client setup.
52
+ Personal notes, sessions and customized files are retained. Scripts can name one or both:
53
+ `tum-mcp uninstall lecture studocu --json`.
54
+
55
+ Use `--json` for machine-readable status, named extension removal/installation,
56
+ skill listing/validation, lecture runtime status or TUMonline permissions.
57
+ The default human output changed in 0.9.1; scripts that parsed those commands
58
+ must add `--json`. The former `extensions` group is removed; use `status` and
59
+ `uninstall NAME`. Named client/extension arguments remain suitable for scripts.
60
+ Data-oriented course authoring commands retain JSON output.
61
+
30
62
  ## Connect
31
63
 
32
64
  Run **`tum-mcp connect`**, with no arguments, in an interactive terminal:
33
65
 
34
- 1. Use up/down to move and Space to select Moodle, Artemis and/or Zulip.
66
+ 1. Use up/down to move and Space to select services. Installed Lecture adds TUM-Live;
67
+ installed Studocu adds Studocu.
35
68
  2. Press Enter. If several browsers are installed, choose one and press Enter.
36
69
  3. Complete TUM sign-in/MFA in the opened window. Only selected service tabs open.
37
70
  4. Return to the terminal for the saved-connection result.
38
71
 
39
- All three services use the same sign-in and encrypted session storage flow.
72
+ Campus services use temporary-browser sign-in and encrypted session storage.
73
+ Studocu opens your own default browser (the Windows browser from WSL); sign in
74
+ there. Its browser session is neither copied nor claimed as verified.
40
75
  No API key or native credential-store prompt is needed. A temporary browser
41
76
  profile keeps the connection separate from your everyday browser. Ctrl+C closes it and preserves
42
77
  connections that already completed. A dumb terminal uses numbered prompts.
@@ -51,6 +86,12 @@ After sign-in, Artemis and Zulip can read content available to your campus accou
51
86
  No local course/channel grants are required. Your agent uses status/discover and
52
87
  course metadata to find relevant current-semester material, then makes bounded reads.
53
88
  An account ID identifies a saved service connection; it is not your TUM login.
89
+ TUMonline additionally has a local policy: `tum-mcp manage tumonline --show`
90
+ shows it, `tum-mcp manage tumonline` changes the studies and courses permission,
91
+ and `tum-mcp manage tumonline --disconnect` removes its saved local session.
92
+ Use `--account ACCOUNT_ID` if more than one TUMonline account is configured.
93
+ Study names, public course metadata and public course curriculum positions are available by default; full curriculum and
94
+ grades or progress are not yet available. [Details and limitations](tum-mcp.md#tumonline-permissions).
54
95
  `tum-mcp --help` lists commands; `tum-mcp study build --help` shows command options.
55
96
 
56
97
  ## WSL
@@ -155,6 +196,7 @@ the npm package and all managed registrations:
155
196
 
156
197
  ```sh
157
198
  tum-mcp uninstall
199
+ # Choose All to remove TUM MCP and its managed client setup.
158
200
  ```
159
201
 
160
202
  Custom edits and user-added files are preserved. Codex's local source/catalog
package/docs/study.md CHANGED
@@ -1,13 +1,46 @@
1
1
  # Course study projects
2
2
 
3
- Six focused skills cover source reading, course sync, Study preparation, Exercises preparation, audio and publishing.
4
- They run in your local agent, using the connected
3
+ Five base skills cover source reading, course sync, Study preparation, Exercises
4
+ preparation and publishing. They run in your local agent, using the connected
5
5
  MCP tools to read course sources. The CLI validates and stores the resulting local
6
6
  files; it does not run an AI model.
7
+ The optional `prepare-lecture` skill adds a Lecture Notes workspace; install it with
8
+ `tum-mcp install lecture`. See [Lecture Notes](lecture-notes.md).
9
+ The optional `sync-studocu` skill collects selected student-uploaded material separately.
10
+ The optional `audio-notes` skill turns prepared lessons into spoken tracks; install
11
+ it with `tum-mcp install audio-notes`.
12
+
13
+ ## Studocu materials
14
+
15
+ Install the optional extension with `tum-mcp install studocu` and reload your
16
+ client. Ask `sync-studocu` to collect materials for a course project. It can
17
+ initialize a Studocu-only project with a verified course and semester.
18
+ Search is anonymous and bounded; a limited result set is not a complete inventory.
19
+ `tum-mcp studocu connect` explains how to sign in to Studocu in your own browser.
20
+ The extension cannot infer account entitlement or download original files through
21
+ the public MCP. Save an original that your account permits in the browser.
22
+
23
+ The skill records a reviewed selection with `tum-mcp studocu plan PROJECT
24
+ --selection FILE` and tracks it with `tum-mcp studocu status PROJECT --json`.
25
+ Import a selected original with `tum-mcp studocu import PROJECT --document-id ID
26
+ --file FILE`. The document-to-file association is user-selected. Originals go to
27
+ `materials/studocu/summaries`, `materials/studocu/exams` (including mocks and
28
+ solutions), or `materials/studocu/other`. Files remain local and retain their
29
+ original bytes. Consult the skill's collection reference for the selection schema.
30
+ Exact matches in the same group, type and known year share one original through
31
+ a private alias. Each selected document retains its own source identity and URL.
32
+ Changing a document's classification or refreshing its original separates aliases
33
+ when they no longer match; previous versions remain in private history.
34
+ When an existing selection is planned again, unchanged duplicate originals are
35
+ consolidated. Edited or missing files are preserved for review.
36
+
37
+ Local study material can cite student uploads. Publishing rejects included
38
+ Studocu-backed sources; this source check cannot identify uncited copied text or
39
+ replace a review of the published content.
7
40
 
8
41
  ## Publish a study website
9
42
 
10
- The optional `publish-course` skill makes a prepared site accessible from a phone
43
+ The `publish-course` skill makes a prepared site accessible from a phone
11
44
  or another computer. Its GitHub repository is private; the Pages website is
12
45
  public. An eligible paid GitHub plan is required for Pages from private repositories.
13
46
  This workflow does not provide private website access. Review lesson text,
@@ -35,8 +68,10 @@ failed setup retries the same saved repository rather than creating duplicates.
35
68
  Study is the default hosted workspace, including for old settings. Exercise
36
69
  statements, hints and full solutions need explicit `--include-exercises` on the
37
70
  publish command after reviewing their public exposure. `--exclude-exercises`
38
- returns a combined site to Study only, using the same repository and URL. An
39
- Exercises-only site also requires explicit inclusion.
71
+ removes Exercises from subsequent eligible exports, using the same repository and URL. An
72
+ Exercises-only site also requires explicit inclusion. Lecture Notes separately requires
73
+ `--include-lectures`; old settings default to exclusion. `--exclude-lectures` also removes
74
+ previously managed lecture images. A notes-only export with notes excluded is refused.
40
75
 
41
76
  Only the selected generated website renderer and data are uploaded. Downloaded
42
77
  originals, credentials, AGENTS.md, study inventory, passage comments, progress,
@@ -96,7 +131,7 @@ pse-ws26/
96
131
  course.md Cited course structure, logistics, rules and unknowns
97
132
  state.json Course binding, source versions and coverage
98
133
  notes/ Detailed course/agent notes when needed
99
- app/ Shared Study and Exercises website
134
+ app/ Shared Study, Exercises and optional Lecture Notes website
100
135
  content.json Optional source-backed Study content
101
136
  exercises.json Optional prepared exercise guidance
102
137
  audio/ Optional category audio derived from the prepared website
@@ -279,6 +314,7 @@ is a no-op. Do not create `app/` alongside an existing `study/` by hand.
279
314
 
280
315
  ## Create and maintain audio notes
281
316
 
317
+ Install the optional workflow with `tum-mcp install audio-notes`.
282
318
  Use `prepare-study` to author the interactive course, then ask `audio-notes` to
283
319
  convert that prepared content into spoken lessons. For example:
284
320
 
package/docs/tum-mcp.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Package: `@jamestesting888/tum-mcp`, CLI: `tum-mcp`, backend: Python 3.13.
4
4
  The package combines read-only course retrieval, managed client installation and
5
- six local course workflows.
5
+ five base course workflows and three optional extensions.
6
6
 
7
7
  ## Current capabilities
8
8
 
@@ -107,7 +107,7 @@ tum-mcp study build --help
107
107
  `connect` takes no arguments or connection options. Move with up/down, toggle
108
108
  services with Space, and press Enter. Choose a browser when more than one is
109
109
  installed. Only selected tabs open in one temporary browser context. Moodle,
110
- Artemis and Zulip all follow this flow.
110
+ Artemis, Zulip and TUMonline all follow this flow.
111
111
  Sign-in/MFA stays in the browser. `TERM=dumb` uses numbered prompts. Ctrl+C
112
112
  cancels and retains completed connections.
113
113
 
@@ -121,15 +121,53 @@ when the temporary browser closes. Existing browser profiles are never imported.
121
121
  Zulip uses its read-only `/json/` routes with the browser session; no API key is
122
122
  required. Reconnect through the same selector when a session expires.
123
123
  See [Zulip's dispatcher](https://github.com/zulip/zulip/blob/12.0/zerver/lib/rest.py).
124
- Read access follows the authenticated account's server permissions. No local course,
124
+ For Moodle, Artemis and Zulip, read access follows the authenticated account's server permissions. No local course,
125
125
  channel, private-channel or personal-feedback grant is required. Older saved grant
126
126
  fields remain readable for compatibility and do not restrict read access. Agents
127
127
  prefer relevant current-semester courses and channels, inspect metadata first, and
128
128
  page through only the content needed for the request. Explicit older-course requests
129
129
  remain supported. Server-denied content, staff-only material and remote writes stay unavailable.
130
130
 
131
+ ### TUMonline permissions
132
+
133
+ TUMonline has a separate, account-specific policy. New connections allow study
134
+ names and degrees, public course catalog metadata and public curriculum positions
135
+ for a selected course by default. The position endpoint is anonymous: no student
136
+ session or identifier is sent. These positions are a partial view, not a full
137
+ program curriculum or personal enrollment list; page order can change upstream.
138
+ Course catalog searches accept a title or course number using 2–80 letters,
139
+ numbers, spaces, dots, underscores, plus signs, slashes or hyphens; continue pages
140
+ with the same query.
141
+ Full curriculum structure is unavailable because its public API requires a separate
142
+ service account. Grades and progress need
143
+ separate consent, but their readers are not yet available; exams, admission,
144
+ account, other IT and miscellaneous readers are also unavailable. No campus write
145
+ operations are provided.
146
+
147
+ Run `tum-mcp manage tumonline --show` to inspect the policy and
148
+ `tum-mcp manage tumonline` in a terminal to select permissions with Space and
149
+ save with Enter. Studies and courses can be allowed or revoked; the remaining
150
+ categories are shown as unavailable and cannot be selected. On basic terminals,
151
+ the command offers a numbered text prompt instead.
152
+ When multiple accounts exist, add `--account ACCOUNT_ID`. Reconnecting preserves
153
+ the policy. `tum-mcp manage tumonline --disconnect` removes the local TUMonline
154
+ credential and retains the policy; it does not revoke remote sessions. An expired
155
+ session requires `tum-mcp connect` again. If the policy is missing or corrupt, use
156
+ `tum-mcp manage tumonline --account ACCOUNT_ID --disconnect` to remove that saved
157
+ session without resetting permissions or affecting other providers.
158
+
159
+ The policy governs what these TUMonline tools return to all MCP clients sharing
160
+ the same local configuration. A local program running as the same user can access
161
+ local files independently, and this policy does not govern other providers' tools,
162
+ including Moodle's own grades tools. Study names are personal and permitted results
163
+ may be transmitted to your configured agent or its AI provider. TUMonline's study
164
+ chooser can contain extra personal fields in its upstream response; the integration
165
+ holds that bounded response only in memory, projects the permitted fields, and does
166
+ not save the response body. Revoking a permission prevents subsequent reads, but
167
+ cannot recall a response already delivered to a client.
168
+
131
169
  Settings live outside the installed package in `TUMMCP/config/preferences.json`.
132
- Moodle sessions live under `TUMMoodle/local-session/`; Artemis and Zulip credentials
170
+ Moodle sessions live under `TUMMoodle/local-session/`; Artemis, Zulip and TUMonline credentials
133
171
  live under `TUMMCP/credentials/local/`. Each directory has an independent `session.key`.
134
172
  Encrypted records and keys have owner-only permissions: 0700 directories / 0600
135
173
  keys on POSIX; protected current-user DACLs on Windows through PowerShell. No
@@ -187,9 +225,11 @@ writing files with activation.
187
225
 
188
226
  The Codex adapter uses a contained Node launcher to pin the managed Python in
189
227
  isolated mode; portable stdio manifests require a bare or contained executable.
190
- The shipped pack contains six skills: `read-content`, `sync-course`,
191
- `prepare-study`, `prepare-exercises`, `audio-notes` and `publish-course`. Website-specific retrieval
192
- guidance is loaded from references within read-content. Teaching, schema and design contracts live
228
+ The base pack contains five skills: `read-content`, `sync-course`,
229
+ `prepare-study`, `prepare-exercises` and `publish-course`. Optional extensions add
230
+ `prepare-lecture`, `sync-studocu` and `audio-notes`; choose them with `tum-mcp install`.
231
+ Website-specific retrieval guidance is loaded from references within read-content.
232
+ Teaching, schema and design contracts live
193
233
  with prepare-study; the renderer and synthetic example ship as reusable assets.
194
234
  Audio Notes converts prepared content into category tracks and maintains coverage,
195
235
  scripts, voice settings, candidates and archives under the course's `audio/` root.
@@ -208,7 +248,7 @@ routing quality is a separate evaluation from structural and discovery checks.
208
248
  Claude's invocation metadata follows each workflow's selected policy; automatic
209
249
  selection is enabled by default and never grants permission for a mutation.
210
250
 
211
- `setup --client cursor` writes `~/.cursor/mcp.json` and installs all six skills
251
+ `setup --client cursor` writes `~/.cursor/mcp.json` and installs the active skills
212
252
  under `~/.cursor/skills/`.
213
253
  `setup --client antigravity` installs the same skills under `~/.gemini/config/skills/`
214
254
  and writes `~/.gemini/config/mcp_config.json`; an existing
@@ -1,5 +1,5 @@
1
1
  {
2
- "wheel": "tum_mcp-0.8.1-py3-none-any.whl",
3
- "wheelSha256": "eb55c85f6b1edfb538ff19ddad3b020625dbaf91df7790f5efd4294f337363d8",
4
- "requirementsSha256": "25f9efa7a4ffb0b97abcfeb9d4706d04808273ab1b35abcfaa1ef0b66e87591b"
2
+ "wheel": "tum_mcp-0.9.1-py3-none-any.whl",
3
+ "wheelSha256": "69d65afa35c27518f03c95e47ddfc23cc77a3d442853804fcb58c2e78b539fe0",
4
+ "requirementsSha256": "39a401b6e606d3292eb91b8fe9ef60367d4852f203eb409dc52f38b76e513ccf"
5
5
  }
@@ -342,6 +342,10 @@ latex2mathml==3.81.1 \
342
342
  --hash=sha256:c337668441b71c819b6733905a8058ba9a9d767bae11a0c5fdacb3aff31361bd \
343
343
  --hash=sha256:c95add0c0fcdecad2d70567e0643050d5ea1149fb2e98a5d5792fb1c8eea2ed5
344
344
  # via tum-mcp
345
+ m3u8==6.0.0 \
346
+ --hash=sha256:566d0748739c552dad10f8c87150078de6a0ec25071fa48e6968e96fc6dcba5d \
347
+ --hash=sha256:7ade990a1667d7a653bcaf9413b16c3eb5cd618982ff46aaff57fe6d9fa9c0fd
348
+ # via tum-mcp
345
349
  markdown-it-py==4.2.0 \
346
350
  --hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \
347
351
  --hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a
@@ -368,6 +372,10 @@ opentelemetry-api==1.45.1 \
368
372
  --hash=sha256:aa38ed19bcc084ba42782a73255b3582283eced7ad6dddbd6695189e69adfb75 \
369
373
  --hash=sha256:b31553efa588ae44bc306f863c785c5333a9ecc091248c6ee68b4b6c87fdedfb
370
374
  # via mcp
375
+ packaging==26.3 \
376
+ --hash=sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79 \
377
+ --hash=sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c
378
+ # via tum-mcp
371
379
  pillow==12.3.0 \
372
380
  --hash=sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59 \
373
381
  --hash=sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45 \
@@ -72,7 +72,7 @@ async function operate(job) {
72
72
  const staging = join(job.temporary, 'prepared');
73
73
  runNpm(job.npm, ['install', '--prefix', staging, '--global=false', archive], true);
74
74
  const prepared = join(staging, 'node_modules', packageName);
75
- runLauncher(prepared, ['setup'], true);
75
+ runLauncher(prepared, ['setup', '--runtime-only'], true);
76
76
  // Only a healthy prepared release may replace the user's npm installation.
77
77
  runNpm(job.npm, ['install', ...scope, job.target.global ? archive : `${packageName}@${latest}`]);
78
78
  if (JSON.parse(readFileSync(join(job.root, 'package.json'), 'utf8')).version !== latest) throw new Error('npm did not install the selected version; client activation was stopped.');
package/npm/tum-mcp.mjs CHANGED
@@ -4,71 +4,107 @@ import { readFileSync } from 'node:fs';
4
4
  import { parseArgs } from 'node:util';
5
5
  import { acquireSetupLock, currentPython, dataRoot, ensureRuntime, removeRuntimeFiles } from './runtime.mjs';
6
6
  import { managePackage } from './package-manager.mjs';
7
+ import { printHelp } from './ui.mjs';
7
8
 
8
9
  let args = process.argv.slice(2);
9
10
  const version = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
10
11
  try {
11
- if (args.length === 0 || (args.length === 1 && ['--help', '-h'].includes(args[0]))) {
12
- console.log(`TUM MCP ${version}
13
- Usage: tum-mcp COMMAND [OPTIONS]
14
-
15
- setup Configure your coding client and managed runtime
16
- connect Sign in to selected campus services
17
- status Show saved connections
18
- discover List accessible courses or channels
19
- doctor Check installation and authentication
20
- update Update the package and configured clients
21
- uninstall Remove managed setup and the npm package
22
- logout Remove one saved connection
23
- serve Run the MCP server over stdio
24
- version Show the installed version
25
- skills Manage local workflow skills
26
- study Prepare, preview and publish a course app
27
-
28
- Use --help for options, for example: tum-mcp study build --help
29
- Run setup to provision the managed backend, then connect to sign in.
30
- Reads use your campus account permissions; no local scope selection is needed.`);
12
+ const wantsHelp = args.length === 0 || args.some(arg => ['--help', '-h'].includes(arg));
13
+ const helpPython = wantsHelp ? currentPython() : null;
14
+ if (helpPython) {
15
+ const forwarded = args.length ? args.filter(arg => !['--local', '--keep-package'].includes(arg)) : ['--help'];
16
+ const env = { ...process.env }; delete env.PYTHONPATH; delete env.PYTHONHOME;
17
+ const child = spawnSync(helpPython, ['-I', '-m', 'tum_mcp', ...forwarded], { env, stdio: 'inherit', shell: false });
18
+ if (child.error) throw new Error('Managed backend could not start; run setup again.');
19
+ process.exitCode = child.status ?? 1;
20
+ } else if (args.length === 0 || (args.length === 1 && ['--help', '-h'].includes(args[0]))) {
21
+ printHelp(version, 'Campus tools and local study workflows.', 'tum-mcp [OPTIONS] COMMAND [ARGS]...', [
22
+ ['Options', [['--version', 'Show the installed version.'], ['-h, --help', 'Show this help.']]],
23
+ ['Commands', [
24
+ ['setup', 'Configure your coding client and managed runtime.'],
25
+ ['connect', 'Sign in to selected campus services.'],
26
+ ['status', 'Show saved connections and optional workflows.'],
27
+ ['doctor', 'Check installation and authentication.'],
28
+ ['install', 'Choose optional Lecture, Studocu or Audio Notes workflows.'],
29
+ ['uninstall', 'Choose extensions or All to remove TUM MCP.'],
30
+ ['manage', 'Manage TUMonline permissions.'],
31
+ ['skills', 'Inspect and validate workflow skills.'],
32
+ ['study', 'Prepare, preview and publish a course app.'],
33
+ ['lecture', 'Prepare lecture recording evidence (optional extension).'],
34
+ ['studocu', 'Collect selected supplementary materials (optional extension).'],
35
+ ['discover', 'List accessible courses or channels.'],
36
+ ['update', 'Update the package and configured clients.'],
37
+ ['logout', 'Remove one saved connection.'],
38
+ ['serve', 'Run the MCP server over stdio.'],
39
+ ['version', 'Show the installed version.'],
40
+ ]],
41
+ ['Get started', [['tum-mcp setup --client codex', 'Prepare the backend and a client.'], ['tum-mcp connect', 'Choose services and sign in.']]],
42
+ ]);
31
43
  } else if (['--version', 'version'].includes(args[0])) {
32
44
  console.log(version);
45
+ } else if (args[0] === 'install' && args.some(arg => ['--help', '-h'].includes(arg))) {
46
+ printHelp(version, 'Choose optional workflows to install, or provide their names.', 'tum-mcp install [lecture|studocu|audio-notes]... [OPTIONS]', [
47
+ ['Options', [['--asr / --no-asr', 'Provision isolated lecture recognition; models load on demand.'], ['--json', 'Print machine-readable results.'], ['-h, --help', 'Show this help.']]],
48
+ ]);
33
49
  } else if (['setup', 'update', 'uninstall'].includes(args[0]) && args.some(arg => ['--help', '-h'].includes(arg))) {
34
50
  const help = {
35
- update: 'Usage: tum-mcp update [--local]\nInstall the latest npm release and refresh configured clients.\n--local refreshes this installed version without contacting npm.',
36
- setup: 'Usage: tum-mcp setup [--client codex|claude|cursor|antigravity|generic] [--host local|windows]\nProvision the managed runtime and register explicitly selected clients.',
37
- uninstall: 'Usage: tum-mcp uninstall [--all] [--purge-runtime] [--forget-credentials]\nRemove managed client setup and this npm installation. Saved data is retained by default.\n--client NAME removes one client only. --keep-package keeps npm installed.',
51
+ update: {
52
+ description: 'Install the latest npm release and refresh configured clients.',
53
+ usage: 'tum-mcp update [OPTIONS]',
54
+ options: [['--local', 'Refresh the installed version without contacting npm.']],
55
+ },
56
+ setup: {
57
+ description: 'Prepare the runtime and choose coding clients to configure.',
58
+ usage: 'tum-mcp setup [OPTIONS]',
59
+ options: [['--client NAME', 'Choose codex, claude, cursor, antigravity or generic; repeat as needed.'], ['--host local|windows', 'Choose the client host; windows is for WSL registrations.']],
60
+ },
61
+ uninstall: {
62
+ description: 'Remove managed setup while retaining saved user data by default.',
63
+ usage: 'tum-mcp uninstall [lecture|studocu|audio-notes]... [OPTIONS]',
64
+ options: [['(no arguments)', 'Choose extensions or All in the interactive picker.'], ['--client NAME', 'Remove one client registration.'], ['--host local|windows', 'Choose the client host.'], ['--purge-runtime', 'Remove verified runtimes when All is selected.'], ['--forget-credentials', 'Forget saved credentials when All is selected.']],
65
+ },
38
66
  };
39
- console.log(help[args[0]]);
67
+ const selected = help[args[0]];
68
+ printHelp(version, selected.description, selected.usage, [
69
+ ['Options', [...selected.options, ['-h, --help', 'Show this help.']]],
70
+ ]);
40
71
  } else {
72
+ const hasExtension = args.slice(1).some(arg => ['lecture', 'studocu', 'audio-notes'].includes(arg));
41
73
  let packageAction = args[0] === 'update';
42
74
  if (args[0] === 'update') {
43
75
  if (args.length > 2 || (args.length === 2 && args[1] !== '--local')) throw new Error('Usage: tum-mcp update [--local]. Use --help for details.');
44
76
  if (args[1] === '--local') { packageAction = false; args = ['update']; }
45
77
  }
46
- if (args[0] === 'uninstall') {
78
+ if (args[0] === 'uninstall' && !hasExtension) {
47
79
  const { values } = parseArgs({ args: args.slice(1), options: {
48
80
  all: { type: 'boolean' }, client: { type: 'string' }, host: { type: 'string' },
49
- 'keep-package': { type: 'boolean' }, 'purge-runtime': { type: 'boolean' }, 'forget-credentials': { type: 'boolean' },
81
+ 'keep-package': { type: 'boolean' }, 'purge-runtime': { type: 'boolean' }, 'forget-credentials': { type: 'boolean' }, json: { type: 'boolean' },
50
82
  } });
51
83
  if (values.host && !['local', 'windows'].includes(values.host)) throw new Error('Choose --host local or windows.');
52
84
  if (values.client !== undefined && !['codex', 'claude', 'cursor', 'antigravity', 'generic'].includes(values.client)) throw new Error('Choose a supported --client name.');
53
85
  if (values.client && (values.all || values['purge-runtime'] || values['forget-credentials'])) throw new Error('Client-only removal cannot use --all or data/runtime cleanup options.');
54
- if (!values.client && !values.all) args.push('--all');
55
- packageAction = !values.client && !values['keep-package'];
86
+ if (values.all && values.json) throw new Error('--json requires named extensions.');
87
+ if (values['keep-package'] && !values.all && !values.client) throw new Error('Use --client for registration-only removal.');
88
+ packageAction = Boolean(values.all) && !values['keep-package'];
56
89
  args = args.filter(arg => arg !== '--keep-package');
57
90
  }
58
91
  if (packageAction) {
59
92
  process.exitCode = await managePackage(args[0], args.slice(1), dataRoot());
60
93
  } else {
61
- let python = ['setup', 'update'].includes(args[0]) ? await ensureRuntime() : currentPython();
94
+ let python = ['setup', 'update', 'install'].includes(args[0]) ? await ensureRuntime() : currentPython();
62
95
  if (args[0] === 'uninstall' && !python) python = await ensureRuntime();
63
96
  if (!python) throw new Error('SETUP_REQUIRED: Run tum-mcp setup first.');
64
97
  const forwarded = args;
65
98
  const env = { ...process.env, TUM_MCP_NPM_LAUNCHER: '1' }; delete env.PYTHONPATH; delete env.PYTHONHOME;
66
- const purge = args[0] === 'uninstall' && args.includes('--purge-runtime');
99
+ const purge = args[0] === 'uninstall' && args.includes('--purge-runtime') && args.includes('--all');
67
100
  const release = purge ? await acquireSetupLock() : null;
68
101
  try {
69
102
  const child = spawnSync(python, ['-I', '-m', 'tum_mcp', ...forwarded], { env, stdio: 'inherit', shell: false });
70
103
  if (child.error) throw new Error('Managed backend could not start; run setup again.');
71
104
  process.exitCode = child.status ?? (child.signal === 'SIGINT' ? 130 : 1);
105
+ if (args[0] === 'uninstall' && child.status === 20) {
106
+ process.exitCode = await managePackage('uninstall', [...args.slice(1), '--all'], dataRoot());
107
+ }
72
108
  if (purge && child.status === 0) await removeRuntimeFiles();
73
109
  } finally { if (release) await release(); }
74
110
  }
package/npm/ui.mjs ADDED
@@ -0,0 +1,51 @@
1
+ // Bootstrap help stays available before Python setup; installed help uses the backend.
2
+ const color = process.stdout.isTTY && !('NO_COLOR' in process.env) && process.env.TERM !== 'dumb';
3
+ const width = Math.min(Number(process.env.COLUMNS) || process.stdout.columns || 80, 100);
4
+ const styled = (text, code) => color ? `\x1b[${code}m${text}\x1b[0m` : text;
5
+
6
+ function line(text, indent = '') {
7
+ const available = Math.max(16, width - indent.length);
8
+ let remaining = text;
9
+ while (remaining.length > available) {
10
+ const space = remaining.lastIndexOf(' ', available);
11
+ const end = space > 0 ? space : available;
12
+ console.log(indent + remaining.slice(0, end));
13
+ remaining = remaining.slice(end).trimStart();
14
+ }
15
+ console.log(indent + remaining);
16
+ }
17
+
18
+ export function printHelp(version, description, usage, sections = []) {
19
+ console.log(`${styled('TUM MCP', '1')} Help ${styled(version, '2')}`);
20
+ line(description);
21
+ console.log();
22
+ line('Usage');
23
+ line(usage, ' ');
24
+ console.log();
25
+ for (const [title, rows] of sections) {
26
+ console.log(styled(title, '1'));
27
+ const labelWidth = Math.max(...rows.map(([label]) => label.length)) + 2;
28
+ for (const [label, detail] of rows) {
29
+ if (width < 70 || labelWidth > width / 2) {
30
+ line(label);
31
+ line(detail, ' ');
32
+ } else {
33
+ const prefix = label.padEnd(labelWidth);
34
+ const available = Math.max(16, width - prefix.length);
35
+ const words = detail.split(' ');
36
+ let row = '';
37
+ let first = true;
38
+ for (const word of words) {
39
+ if (row && row.length + word.length + 1 > available) {
40
+ console.log((first ? prefix : ' '.repeat(labelWidth)) + row);
41
+ first = false;
42
+ row = '';
43
+ }
44
+ row += (row ? ' ' : '') + word;
45
+ }
46
+ console.log((first ? prefix : ' '.repeat(labelWidth)) + row);
47
+ }
48
+ }
49
+ console.log();
50
+ }
51
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jamestesting888/tum-mcp",
3
- "version": "0.8.1",
4
- "description": "Read-only TUM Moodle, Artemis and Zulip integration with source-backed study workflows",
3
+ "version": "0.9.1",
4
+ "description": "Read-only TUM campus tools and source-backed study, exercise and lecture workflows",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
@@ -12,6 +12,7 @@
12
12
  },
13
13
  "files": [
14
14
  "npm/tum-mcp.mjs",
15
+ "npm/ui.mjs",
15
16
  "npm/runtime.mjs",
16
17
  "npm/download.mjs",
17
18
  "npm/lock.mjs",
@@ -28,7 +29,8 @@
28
29
  "docs/setup.md",
29
30
  "docs/development.md",
30
31
  "docs/tum-mcp.md",
31
- "docs/study.md"
32
+ "docs/study.md",
33
+ "docs/lecture-notes.md"
32
34
  ],
33
35
  "scripts": {
34
36
  "prepack": "node npm/build.mjs",
@@ -54,6 +56,9 @@
54
56
  "moodle",
55
57
  "artemis",
56
58
  "zulip",
57
- "codex"
59
+ "codex",
60
+ "tumonline",
61
+ "studocu",
62
+ "lecture-notes"
58
63
  ]
59
64
  }