@jamestesting888/tum-mcp 0.9.4 → 0.10.0

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,30 @@
1
1
  # Changes
2
2
 
3
+ ## 0.10.0 — 2026-10-27
4
+
5
+ - Add the optional `video-notes` extension (`tum-mcp install video-notes`): short
6
+ narrated, animated explainers from prepared Study topics, one per selected topic,
7
+ under the course's `videos/` folder. The skill plans storyboards from the prepared
8
+ content only; `tum-mcp video-notes` checks storyboards, measures narration, renders
9
+ with a pinned Manim/Typst runtime installed on first use, verifies sync, loudness,
10
+ captions and layout, and publishes with receipts, archives and crash recovery.
11
+ - Play published videos in the local app above each topic's Content, with chapters,
12
+ captions, a transcript and a notice when the topic changed after the video was made.
13
+ Hosted study sites never request or include videos.
14
+ - Keep extension selections forward compatible: unknown on/off settings from newer
15
+ releases are preserved, and the video setting is only written when enabled.
16
+ - Use NVIDIA GPUs for Prepare Lecture recognition on Windows x64 and Linux/WSL x86_64.
17
+ `auto` selects CUDA for a CUDA 12 GPU of compute capability 7.0+, adds a pinned cuBLAS to
18
+ the runtime (no CUDA toolkit or cuDNN), checks the GPU during installation and
19
+ otherwise stays on CPU int8. `TUM_MCP_LECTURE_ENGINE` also accepts `cuda`.
20
+ - Document the eSpeak data path limit that breaks local Kokoro on macOS in Audio Notes.
21
+ - Keep the local course app loading on Windows: the preview server now queues the
22
+ app's burst of parallel module requests instead of refusing all but five.
23
+
24
+ ## 0.9.5 — 2026-10-27
25
+
26
+ - Simplify the course project overview wording.
27
+
3
28
  ## 0.9.4 — 2026-10-27
4
29
 
5
30
  - Document the course project folders, including optional extension outputs.
package/README.md CHANGED
@@ -51,16 +51,18 @@ Run `tum-mcp install` to choose extensions, then reload your client.
51
51
  | `lecture` | `prepare-lecture` | Lecture Notes with the professor's extra explanations, timestamps and selected critical visuals. Prefers transcripts and slides; local recognition is optional. |
52
52
  | `studocu` | `sync-studocu` | Search and collect selected supplementary PDFs saved in your browser. Personal use only; excluded from published sites. |
53
53
  | `audio-notes` | `audio-notes` | Turn prepared Study lessons into concise audio tracks, with resumable generation and coverage tracking. Voice setup happens when used. |
54
+ | `video-notes` | `video-notes` | Turn prepared Study topics into short narrated, animated explainers that play inside the local app, with checked sync, captions and layout. The render runtime installs when first used. |
54
55
 
55
56
  Use `tum-mcp doctor` to see installed workflows and `tum-mcp uninstall` to remove
56
57
  them.
57
58
 
58
59
  [Lecture and recognition](docs/lecture-notes.md) ·
59
- [Studocu collection](docs/study.md#studocu-materials) · [Setup details](docs/setup.md)
60
+ [Studocu collection](docs/study.md#studocu-materials) ·
61
+ [Video Notes](docs/study.md#create-and-maintain-video-notes) · [Setup details](docs/setup.md)
60
62
 
61
63
  ## Course project
62
64
 
63
- Each course has its own folder. Optional extension files appear when used:
65
+ After initialization, a course project looks something like this:
64
66
 
65
67
  ```text
66
68
  course/
@@ -74,10 +76,9 @@ course/
74
76
  lecture-assets/ Optional: selected lecture figures
75
77
  .tum-mcp/ Private course state, comments and lecture evidence
76
78
  audio/ Optional: scripts, tracks and chapters for Audio Notes
79
+ videos/ Optional: storyboards, scenes and explainer videos for Video Notes
77
80
  ```
78
81
 
79
- Existing projects may use `study/` instead of `app/`.
80
-
81
82
  ## Privacy, updates and removal
82
83
 
83
84
  Sessions are encrypted locally. Your agent uses your configured AI provider to
@@ -70,6 +70,9 @@ Desktop jobs additionally install the optional hash-locked CPU recognizer and
70
70
  transcribe the synthetic speech fixture; supported Apple Silicon runners also
71
71
  exercise MLX. This explicit test downloads public pinned model files, never campus
72
72
  recordings. Ordinary test runs skip it unless `TUM_MCP_LECTURE_ASR_INTEGRATION=1`.
73
+ Linux and Windows jobs also install the hash-locked CUDA runtime and load its pinned
74
+ cuBLAS the way CTranslate2 does, without a GPU (`TUM_MCP_LECTURE_CUDA_LIBRARIES=1`);
75
+ GPU inference itself runs in the native test only on a host with an NVIDIA GPU.
73
76
  Recognition runs before package lifecycle checks to expose native dependency
74
77
  failures early. Windows also runs the affected browser/UTF-8 fixture checks first.
75
78
  Its complete job budget is 35 minutes for native ACL and subprocess coverage;
@@ -105,7 +108,8 @@ tag and artifact integrity before pushing the release documentation.
105
108
  | `src/tum_mcp/credentials.py`, `transport.py`, `settings.py` | Shared campus credential vault, HTTP transport and account policy |
106
109
  | `src/tum_mcp/client_*.py` | Host-specific configuration and managed skill installation |
107
110
  | `src/tum_mcp/study_*.py` | Course snapshots, teaching, build, preview and project-local passage comments |
108
- | `src/tum_mcp/bundled/skills/` | Canonical versioned source of reading, study and audio skills and their references/assets |
111
+ | `src/tum_mcp/bundled/skills/` | Canonical versioned source of reading, study, audio and video skills and their references/assets |
112
+ | `src/tum_mcp/video_*.py`, `bundled/video_runtime/` | Video Notes contracts, lint, media checks, orchestration and the isolated render worker |
109
113
  | `npm/` | Private-runtime installation, updates, integrity and cleanup |
110
114
  | `tests/` | Synthetic backend, package and owned-browser checks |
111
115
 
@@ -147,6 +151,21 @@ session reuse. Automated synthetic sign-in does not certify human SSO on every O
147
151
  For UI changes, exercise the generated app at narrow/wide widths in both themes;
148
152
  check keyboard navigation, reduced motion, source links and retained progress.
149
153
 
154
+ ## Optional Video Notes runtime
155
+
156
+ `install video-notes` only selects the workflow. `tum-mcp video-notes runtime install`
157
+ creates a uv venv per lock under the data directory from
158
+ `bundled/video_runtime/requirements.lock` (universal, hash-pinned). Everything is a
159
+ wheel except `pycairo`, `manimpango` and `srt`, which build from hashed sources; the
160
+ locked `pkgconf` wheel is installed first and provides `pkg-config`. Regenerate the
161
+ lock with the command in its header. Helper code (`vnotes/`, `worker.py`, fonts) runs
162
+ from the package, so changing it never reinstalls the runtime; it does change the
163
+ render profile and therefore the chapter cache. Default tests use a fake worker and
164
+ the synthetic media in `tests/fixtures/video/` (`generate.py` recreates them). Set
165
+ `TUM_MCP_VIDEO_RENDER_INTEGRATION=1` to install the real runtime into a temporary
166
+ data directory and render, mix, check and publish a synthetic video; the browser
167
+ playback tests also run WebKit when Playwright's WebKit is installed.
168
+
150
169
  ## Optional Lecture extension
151
170
 
152
171
  Base setup exposes five workflows and no `tum_live_*` tools. `install lecture`
@@ -64,8 +64,9 @@ revision-pinned public model weights; neither is part of the base runtime.
64
64
  | Apple Silicon macOS 15+ | MLX acceleration by default |
65
65
  | Apple Silicon macOS 14 | CPU int8 |
66
66
  | Intel macOS 13+ | CPU int8 |
67
- | Windows x64 | CPU int8; Microsoft Visual C++ runtime required |
68
- | Linux/WSL x86_64 or ARM64, glibc 2.28+ | CPU int8 |
67
+ | Windows x64 | NVIDIA CUDA when a GPU is detected, otherwise CPU int8; Microsoft Visual C++ runtime required |
68
+ | Linux/WSL x86_64, glibc 2.28+ | NVIDIA CUDA when a GPU is detected, otherwise CPU int8 |
69
+ | Linux ARM64, glibc 2.28+ | CPU int8 |
69
70
 
70
71
  Native Windows ARM64, 32-bit systems and musl Linux have no supported locked
71
72
  runtime. Use captions/imported WebVTT there. CPU inference requires compatible
@@ -80,9 +81,20 @@ video frames. They are unnecessary for imported captions and cached text.
80
81
  `lecture runtime status` reports the selected engine and missing prerequisites.
81
82
  Use `lecture runtime install` to retry after fixing a prerequisite. Advanced users
82
83
  can set `TUM_MCP_LECTURE_ENGINE=cpu` consistently for installation and preparation
83
- to bypass Metal; the default `auto` retains existing MLX runtimes and model caches.
84
+ to bypass Metal or CUDA; the default `auto` retains existing MLX runtimes and model caches.
84
85
  An engine switch uses separate caches. No cloud transcription API is configured.
85
86
 
87
+ On Windows x64 and Linux/WSL x86_64, `auto` uses an NVIDIA GPU of compute capability
88
+ 7.0 or newer (GTX 16, RTX 20 series and later) when its driver supports CUDA 12
89
+ (driver 525 or newer); older GPUs stay on CPU. Only the driver is needed: the runtime
90
+ adds a pinned cuBLAS (about 600 MB) and decodes in float16, without a CUDA toolkit
91
+ or cuDNN. Installation first creates a cuBLAS handle on the GPU. If that fails,
92
+ automatic selection records it (`lecture-runtime/cuda-unusable.json` in the data
93
+ directory) and installs the CPU runtime instead, so `tum-mcp update` keeps working.
94
+ After a driver fix, `TUM_MCP_LECTURE_ENGINE=cuda tum-mcp lecture runtime install`
95
+ retries and, on success, clears that record. `cuda` never falls back silently;
96
+ `lecture runtime status` shows when a GPU was declined.
97
+
86
98
  CPU decoding uses int8, one worker and at most four threads. It consumes the full
87
99
  retained audio, with word timestamps and no VAD retiming. ASR remains fallible,
88
100
  especially for names and notation; compare important wording with slides and the
package/docs/setup.md CHANGED
@@ -38,6 +38,15 @@ Audio Notes is optional: use `tum-mcp install audio-notes`. It adds the
38
38
  `audio-notes` skill for prepared Study content; synthesis is set up when used.
39
39
  Existing course audio is retained when the extension is disabled.
40
40
 
41
+ Video Notes is optional: use `tum-mcp install video-notes`. It adds the
42
+ `video-notes` skill and the `tum-mcp video-notes` commands for prepared Study content.
43
+ Its render runtime (about 320 MB) installs on first use; `tum-mcp video-notes runtime
44
+ status` lists any prerequisite (macOS: `brew install cairo`; Linux/WSL: Cairo and
45
+ Pango development packages and a C compiler) without installing it. Course videos are
46
+ retained when the extension is disabled. Clients pinned to a runtime generation older
47
+ than this release cannot read the enabled Video Notes setting and would hide Studocu
48
+ tools; refresh them with `tum-mcp update` or `setup --client NAME`.
49
+
41
50
  ## Terminal output
42
51
 
43
52
  `tum-mcp doctor` is the overview for saved connections, optional extensions,
@@ -229,7 +238,8 @@ protected. `--forget-credentials` removes saved local credentials and session
229
238
  keys; it does not revoke remote credentials. Settings, custom skills, course
230
239
  cache, downloads and assignment work are retained by these commands.
231
240
  No command recursively deletes the campus
232
- data root. Course audio and optional shared speech models/runtimes also remain.
241
+ data root. Course audio and videos, the optional video render runtime and shared
242
+ speech models/runtimes also remain.
233
243
  Remove a shared speech cache only when explicitly requested and no other course
234
244
  needs it; its host paths are documented in the audio skill. If removal is
235
245
  interrupted, run `tum-mcp setup --client NAME` to recover before reuse.
package/docs/study.md CHANGED
@@ -8,7 +8,8 @@ The optional `prepare-lecture` skill adds a Lecture Notes workspace; install it
8
8
  `tum-mcp install lecture`. See [Lecture Notes](lecture-notes.md).
9
9
  The optional `sync-studocu` skill collects selected student-uploaded material separately.
10
10
  The optional `audio-notes` skill turns prepared lessons into spoken tracks; install
11
- it with `tum-mcp install audio-notes`.
11
+ it with `tum-mcp install audio-notes`. The optional `video-notes` skill turns prepared
12
+ topics into short narrated explainer videos; install it with `tum-mcp install video-notes`.
12
13
 
13
14
  ## Start with one course
14
15
 
@@ -43,6 +44,7 @@ pse-ws26/
43
44
  content.json Optional source-backed Study content
44
45
  exercises.json Optional prepared exercise guidance
45
46
  audio/ Optional category audio derived from the prepared website
47
+ videos/ Optional explainer videos derived from the prepared website
46
48
  ```
47
49
 
48
50
  `AGENTS.md` retains user rules and points agents to `.tum-mcp/course.md`. That short
@@ -241,7 +243,7 @@ previously managed lecture images. A notes-only export with notes excluded is re
241
243
 
242
244
  Only the selected generated website renderer and data are uploaded. Downloaded
243
245
  originals, credentials, AGENTS.md, study inventory, passage comments, progress,
244
- audio and arbitrary files stay local. Git itself is not required: the publisher
246
+ audio, videos and arbitrary files stay local. Git itself is not required: the publisher
245
247
  uses authenticated GitHub API calls through `gh`. Local publication settings do
246
248
  not contain credentials.
247
249
 
@@ -339,6 +341,73 @@ for the updated study website”** to reconcile added, changed, removed or moved
339
341
  material with the previous verified coverage. This is an agent skill, not a new
340
342
  `tum-mcp study` CLI subcommand or a built-in speech service.
341
343
 
344
+ ## Create and maintain video notes
345
+
346
+ Install the optional workflow with `tum-mcp install video-notes`. After
347
+ `prepare-study` has authored the course, ask for explainer videos, for example:
348
+
349
+ ```text
350
+ Plan explainer videos for the topics in this study website that benefit from animation,
351
+ then make the BFS one first.
352
+ ```
353
+
354
+ The agent proposes which topics get a video and records a reason for each topic it
355
+ leaves text-first. Each video covers one topic, usually 3 to 8 minutes, in short
356
+ chapters. It is a visual adaptation of the prepared lesson: the problem first, the
357
+ course's own example before the general rule, consistent colors per symbol, one or
358
+ two pause-and-think questions from the topic's practice, and a short recap. Nothing
359
+ outside the prepared content is added; a missing example is reported back to
360
+ `prepare-study`.
361
+
362
+ Behind the skill, `tum-mcp video-notes` does the checkable work. It prints the
363
+ fingerprints a storyboard cites and rejects storyboards whose sources changed. It
364
+ measures one narration file per sentence and renders the scenes with a pinned Manim
365
+ and Typst runtime (no LaTeX needed). It enforces that animations fit their narration
366
+ frame by frame and reports overlapping or off-screen text. Each run produces a
367
+ contact sheet per chapter for review, and the final video is checked for codec,
368
+ sync, loudness, captions and chapters before publication. Unchanged chapters are
369
+ reused, interrupted runs resume, and a failed publication restores the previous
370
+ files.
371
+
372
+ Narration follows the Audio Notes policy: the free ElevenLabs website when it really
373
+ generates and downloads the text, otherwise local Kokoro, with no accounts or
374
+ payments. Kokoro has no German voice, so a German topic without a working voice
375
+ keeps its narration pending; a silent draft can be rendered for review but is never
376
+ published.
377
+
378
+ ```text
379
+ videos/
380
+ plan.json Which topics get videos, and why others are text-first
381
+ storyboards/03_topic.json Beats, narration, on-screen items and source locators
382
+ scenes/03_topic/chapters.py Manim scenes using the bundled helpers
383
+ tracks/03_topic.mp4 Published H.264/AAC video
384
+ captions/03_topic.vtt Captions from measured narration
385
+ chapters/03_topic.vtt Chapter markers (and a JSON copy)
386
+ posters/03_topic.jpg Poster frame
387
+ narration/03_topic.txt Transcript
388
+ manifest.json Verified receipts for published videos
389
+ style.json, voice.json Course look and actual narrator profiles
390
+ README.md, COVERAGE.md Generated overview and coverage
391
+ .build/ Narration audio, timing, runs and caches
392
+ archive/ Superseded published files
393
+ ```
394
+
395
+ Published videos appear above the topic's Content in the local app (`tum-mcp study`)
396
+ with chapters, captions and a transcript link, and show a notice when the topic
397
+ changed after the video was made. They load when you press play. Hosted study sites
398
+ never include or request videos; copy files from `videos/tracks/` to watch them
399
+ elsewhere. `tum-mcp video-notes inspect PROJECT` reports planned, stale, pending and
400
+ published videos, and `tum-mcp study demo PROJECT --videos` adds a synthetic preview
401
+ clip.
402
+
403
+ The render runtime (about 320 MB) installs on first use with
404
+ `tum-mcp video-notes runtime install`. Windows x64 needs nothing else. macOS 14+ on
405
+ Apple Silicon needs `brew install cairo` and the Xcode Command Line Tools; Linux and
406
+ WSL on x86_64 with glibc 2.28+ need `libcairo2-dev`, `libpango1.0-dev` and a C
407
+ compiler. `runtime status` prints the exact command and never runs it for you.
408
+ Windows on ARM, Intel Macs, Linux ARM64 and musl Linux are not supported: Manim's
409
+ OpenGL dependencies publish no wheels there.
410
+
342
411
  ## Studocu materials
343
412
 
344
413
  Install the optional extension with `tum-mcp install studocu` and reload your
package/docs/tum-mcp.md CHANGED
@@ -227,12 +227,16 @@ The Codex adapter uses a contained Node launcher to pin the managed Python in
227
227
  isolated mode; portable stdio manifests require a bare or contained executable.
228
228
  The base pack contains five skills: `read-content`, `sync-course`,
229
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`.
230
+ `prepare-lecture`, `sync-studocu`, `audio-notes` and `video-notes`; choose them with
231
+ `tum-mcp install`.
231
232
  Website-specific retrieval guidance is loaded from references within read-content.
232
233
  Teaching and content guidance lives with prepare-study; the course app and its
233
234
  synthetic example ship as reusable assets and define the site's design.
234
235
  Audio Notes converts prepared content into category tracks and maintains coverage,
235
236
  scripts, voice settings, candidates and archives under the course's `audio/` root.
237
+ Video Notes turns prepared topics into narrated explainer videos under `videos/`;
238
+ `tum-mcp video-notes` validates storyboards, measures narration, renders with an
239
+ optional pinned runtime and publishes checked videos for the local app only.
236
240
  Publish Course uses host GitHub CLI authentication to create a private repository
237
241
  and a public Pages website after explicit publication consent. It chooses a course
238
242
  and semester name, updates the same site after successful study builds, and shows
@@ -1,5 +1,5 @@
1
1
  {
2
- "wheel": "tum_mcp-0.9.4-py3-none-any.whl",
3
- "wheelSha256": "9014825fc2571531a52db0020fe39aa993638694e816c631318b923257e5a3c6",
2
+ "wheel": "tum_mcp-0.10.0-py3-none-any.whl",
3
+ "wheelSha256": "69a13997a3c5630f411e0237f33f7b59224b56d96bbcea07f263b939df1a5eff",
4
4
  "requirementsSha256": "39a401b6e606d3292eb91b8fe9ef60367d4852f203eb409dc52f38b76e513ccf"
5
5
  }
package/npm/tum-mcp.mjs CHANGED
@@ -24,13 +24,14 @@ try {
24
24
  ['setup', 'Configure your coding client and managed runtime.'],
25
25
  ['login', 'Sign in to selected campus services.'],
26
26
  ['doctor', 'Show connections, extensions and relevant client/runtime health.'],
27
- ['install', 'Choose optional Lecture, Studocu or Audio Notes workflows.'],
27
+ ['install', 'Choose optional Lecture, Studocu, Audio Notes or Video Notes workflows.'],
28
28
  ['uninstall', 'Choose extensions or All to remove TUM MCP.'],
29
29
  ['manage', 'Manage TUMonline permissions.'],
30
30
  ['skills', 'Inspect and validate workflow skills.'],
31
31
  ['study', 'Prepare, preview and publish a course app.'],
32
32
  ['lecture', 'Prepare lecture recording evidence (optional extension).'],
33
33
  ['studocu', 'Collect selected supplementary materials (optional extension).'],
34
+ ['video-notes', 'Render and maintain explainer videos (optional extension).'],
34
35
  ['discover', 'List accessible courses or channels.'],
35
36
  ['update', 'Update the package and configured clients.'],
36
37
  ['logout', 'Remove one saved connection.'],
@@ -42,7 +43,7 @@ try {
42
43
  } else if (['--version', 'version'].includes(args[0])) {
43
44
  console.log(version);
44
45
  } else if (args[0] === 'install' && args.some(arg => ['--help', '-h'].includes(arg))) {
45
- printHelp(version, 'Choose optional workflows to install, or provide their names.', 'tum-mcp install [lecture|studocu|audio-notes]... [OPTIONS]', [
46
+ printHelp(version, 'Choose optional workflows to install, or provide their names.', 'tum-mcp install [lecture|studocu|audio-notes|video-notes]... [OPTIONS]', [
46
47
  ['Options', [['--asr / --no-asr', 'Provision isolated lecture recognition; models load on demand.'], ['--json', 'Print machine-readable results.'], ['-h, --help', 'Show this help.']]],
47
48
  ]);
48
49
  } else if (['setup', 'update', 'uninstall'].includes(args[0]) && args.some(arg => ['--help', '-h'].includes(arg))) {
@@ -59,7 +60,7 @@ try {
59
60
  },
60
61
  uninstall: {
61
62
  description: 'Remove managed setup while retaining saved user data by default.',
62
- usage: 'tum-mcp uninstall [lecture|studocu|audio-notes]... [OPTIONS]',
63
+ usage: 'tum-mcp uninstall [lecture|studocu|audio-notes|video-notes]... [OPTIONS]',
63
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.']],
64
65
  },
65
66
  };
@@ -68,7 +69,7 @@ try {
68
69
  ['Options', [...selected.options, ['-h, --help', 'Show this help.']]],
69
70
  ]);
70
71
  } else {
71
- const hasExtension = args.slice(1).some(arg => ['lecture', 'studocu', 'audio-notes'].includes(arg));
72
+ const hasExtension = args.slice(1).some(arg => ['lecture', 'studocu', 'audio-notes', 'video-notes'].includes(arg));
72
73
  let packageAction = args[0] === 'update';
73
74
  if (args[0] === 'update') {
74
75
  if (args.length > 2 || (args.length === 2 && args[1] !== '--local')) throw new Error('Usage: tum-mcp update [--local]. Use --help for details.');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jamestesting888/tum-mcp",
3
- "version": "0.9.4",
3
+ "version": "0.10.0",
4
4
  "description": "Read-only TUM campus tools and source-backed study, exercise and lecture workflows",
5
5
  "license": "MIT",
6
6
  "type": "module",