@jamestesting888/tum-mcp 0.0.0-stage → 0.4.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 TUM Moodle integration contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/NOTICE ADDED
@@ -0,0 +1,6 @@
1
+ The project's original code and documentation are provided under the MIT License.
2
+
3
+ The TUM logo at plugin/assets/tum-logo.png (assets/tum-logo.png in the packaged
4
+ plugin) is excluded from the MIT License. It belongs to the Technical University
5
+ of Munich and remains subject to its original rights. No trademark rights are
6
+ granted by this project. See plugin/assets/README.md for the source of the image.
package/README.md CHANGED
@@ -1,3 +1,95 @@
1
- # Temporary Holding Version
1
+ # TUM MCP
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Use TUM Moodle, Artemis, and Zulip from your coding agent. Runs locally with
4
+ 36 tools and seven workflow skills. Unofficial; independent of TUM and OpenAI.
5
+
6
+ ## Agent setup
7
+
8
+ Paste this into your coding agent:
9
+
10
+ ```text
11
+ Install @jamestesting888/tum-mcp@0.4.1 from npm on this computer.
12
+ Check that Node.js is at least 22.14, then run:
13
+ npm install --global @jamestesting888/tum-mcp@0.4.1
14
+ tum-mcp setup --client codex
15
+ For Claude Code, use --client claude instead; other MCP clients use --client generic.
16
+ Preserve existing settings, plugins, sessions, downloads, and customized skills.
17
+ Follow the printed enablement/restart step. Then help me run tum-mcp connect campus
18
+ in an interactive terminal so I can complete TUM sign-in/MFA in Chrome.
19
+ Ask which Artemis courses and Zulip channels to enable before reading content.
20
+ For Moodle, use the plugin's separate Moodle sign-in. Never request secrets in chat.
21
+ ```
22
+
23
+ ## Manual setup
24
+
25
+ You need **Node.js 22.14+**, **Google Chrome**, and your TUM account.
26
+
27
+ ```sh
28
+ npm install --global @jamestesting888/tum-mcp@0.4.1
29
+ tum-mcp setup --client codex
30
+ tum-mcp connect campus
31
+ ```
32
+
33
+ `campus` connects **Artemis and Zulip together**. Complete sign-in and MFA in
34
+ Chrome; no Zulip API key is required. Moodle sign-in is separate: ask the loaded
35
+ plugin, **“Sign in to TUM Moodle.”** Follow any client enablement/restart instruction.
36
+ Disable the older Moodle plugin when enabling TUM MCP to avoid duplicate tools.
37
+
38
+ Select the courses and channels the backend may read. `status` shows account IDs;
39
+ `discover` lists metadata, and `scope` saves your choices. New accounts start
40
+ without content access. See the [connection and scope commands](docs/tum-mcp.md#connections-and-scopes).
41
+
42
+ Setup downloads a private Python runtime; consumers do not need Python or uv.
43
+ Git is needed for assignment workspaces and Docker for isolated assignment tests.
44
+ Linux also needs an unlocked Secret Service keyring in its desktop D-Bus session.
45
+
46
+ ## What you can do
47
+
48
+ | Service | Available |
49
+ | --- | --- |
50
+ | Moodle | Read/search course materials and forums, cite PDF pages, download originals |
51
+ | Artemis | Read released programming exercises and permitted feedback; prepare existing-participation workspaces, run approved local tests, preview submissions |
52
+ | Zulip | Search selected channels, read topics, and summarize recent discussions with citations |
53
+
54
+ Try “Find the lecture section about scheduling,” “Read this Artemis exercise,”
55
+ or “Catch me up on the selected Zulip channel.” Personal records, participation
56
+ feedback, and workspace writes require their own explicit permissions.
57
+
58
+ **0.4.1 is a public pilot.** Remote start, push, submit, and rebuild are disabled.
59
+ It cannot post to Zulip or read DMs. A submission preview never submits anything.
60
+ macOS ARM64 browser sign-in and live reads are verified; Windows, Intel Mac, and
61
+ Linux desktop checks remain incomplete. Bootstrap targets and test evidence are
62
+ listed in the [detailed guide](docs/tum-mcp.md#build-and-test-the-local-package).
63
+
64
+ ## Privacy
65
+
66
+ Sessions stay local and encrypted, with keys in macOS Keychain, Windows Credential
67
+ Manager, or Linux Secret Service. There is no plaintext credential fallback.
68
+ Relevant excerpts can be sent to your agent's configured AI provider. Zulip chat
69
+ text is fetched live; Moodle's document cache is unencrypted and limited to
70
+ 30 days / 1 GiB. Downloads remain until deleted.
71
+
72
+ Use the installed `tum-mcp` command for sign-in to keep the requesting runtime
73
+ consistent. Your OS may ask for credential-store access. See
74
+ [storage details](docs/credential-storage-options.md).
75
+
76
+ ## Update and support
77
+
78
+ Install the reviewed version you want, then rerun the client setup:
79
+
80
+ ```sh
81
+ npm install --global @jamestesting888/tum-mcp@latest
82
+ tum-mcp setup --client codex
83
+ ```
84
+
85
+ Existing Moodle sessions and downloads are preserved. Customized configurations
86
+ are kept for review. `tum-mcp doctor` checks local prerequisites; it does not
87
+ verify live authentication.
88
+
89
+ [Detailed guide](docs/tum-mcp.md) · [Moodle-only setup](docs/setup.md) ·
90
+ [Development](docs/development.md) · [Report a problem](https://github.com/jamestesting0/tum-moodle-integration/issues)
91
+
92
+ ## License
93
+
94
+ [MIT](LICENSE). The TUM logo retains its original rights; see [NOTICE](NOTICE).
95
+ No trademark rights are granted.
@@ -0,0 +1,86 @@
1
+ # Credential storage and setup experience
2
+
3
+ Checked against project code and primary upstream documentation on 24 October 2026.
4
+
5
+ ## What other projects do
6
+
7
+ | Project | Protected default | File alternative and trade-off |
8
+ | --- | --- | --- |
9
+ | [Git Credential Manager](https://github.com/git-ecosystem/git-credential-manager/blob/main/docs/credstores.md) | macOS Keychain and Windows Credential Manager; configurable Linux stores | Supports Windows DPAPI-protected files. Also offers explicitly insecure plaintext files and an ephemeral cache. |
10
+ | [Docker](https://docs.docker.com/reference/cli/docker/login/#credential-stores) | Native credential helpers; Docker Desktop configures one | Without a helper it stores base64-encoded credentials in configuration. Docker describes that as less secure. |
11
+ | [GitHub CLI](https://cli.github.com/manual/gh_auth_login) | System credential store | Supports `--insecure-storage` and documents a plain-file fallback when secure storage fails. [Its implementation](https://github.com/cli/cli/blob/trunk/internal/config/config.go#L496-L512) explicitly tracks whether insecure storage was used. |
12
+ | [Electron](https://www.electronjs.org/docs/latest/api/safe-storage) | macOS Keychain; Windows DPAPI; Linux desktop secret stores | macOS can still prompt. Its documentation recommends consistent code signing to prevent repeated approval after updates. Linux fallback backends need careful inspection because protection can be weaker. |
13
+
14
+ Saving a key elsewhere is technically possible, but location alone does not
15
+ protect it. A readable key file next to encrypted sessions lets a process that
16
+ can copy both decrypt the sessions. Restrictive file permissions help against
17
+ other OS users; they do not provide a separate secret-store boundary against
18
+ code running as the same user. This is why the protected defaults above still
19
+ use operating-system services.
20
+
21
+ ## Current TUM MCP implementation
22
+
23
+ | Platform | Implemented storage | Verification and expected setup |
24
+ | --- | --- | --- |
25
+ | macOS | Native Keychain item holds the encryption key; service cookies remain in encrypted files | Real saved sessions and scoped reads passed from the managed runtime after the user approved access. OS prompts remain possible for locked items, changed application identity, or temporary approval. |
26
+ | Windows | Windows Credential Locker through Python keyring | Implementation and CI configuration exist. Hands-on Windows verification is still pending; no claim of universally prompt-free operation is made. |
27
+ | Linux | Freedesktop Secret Service through Python keyring | ARM64 and x86_64 container bootstrap passed. On x86_64, an encrypted credential round trip across separate processes passed through real GNOME Secret Service in an isolated D-Bus session. Real desktop browser sign-in remains open. A usable, unlocked service and D-Bus session are required. |
28
+
29
+ The backend selection is in `tum_moodle.auth.system_keyring`; encryption and
30
+ account binding are in `tum_mcp.credentials.Vault`. There is no automatic
31
+ plaintext fallback. The data-encryption key's service name and storage location
32
+ are stable across backend-wheel updates.
33
+
34
+ Windows can also protect a file directly with per-user
35
+ [DPAPI](https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata).
36
+ That avoids an adjacent unprotected key file. It is a reasonable optional backend
37
+ if Credential Manager proves unsuitable, but it is not implemented in this build.
38
+ It does not remove the need for a usable Windows user/logon context.
39
+
40
+ ## Why this setup prompted repeatedly
41
+
42
+ The initial account connection ran under development Python. The installed
43
+ package then used managed Python to access the same existing Keychain item.
44
+ Those were different requesting executables. Python keyring documents that
45
+ access is associated with the
46
+ [Python executable](https://keyring.readthedocs.io/en/stable/#security-considerations).
47
+ Temporary **Allow** and persistent **Always Allow** are also different choices.
48
+
49
+ The fresh-install path was tested separately with a disposable native Keychain
50
+ item: managed Python created it, then a second process of that same runtime read
51
+ it successfully in about one second without another user interaction. The item
52
+ was deleted afterward. This supports using the installed runtime from the first
53
+ login; it does not guarantee every Mac policy will suppress all prompts.
54
+
55
+ A subsequent real MCP check passed through the installed Codex plugin, its Node
56
+ launcher, and managed Python: both provider identities verified, the selected
57
+ Zulip channel was readable, and an unselected channel was denied. No remote
58
+ submission or message write was performed.
59
+
60
+ ## Recommended direction
61
+
62
+ 1. Keep native protected storage as the default and use the installed `tum-mcp`
63
+ command for both onboarding and normal use.
64
+ 2. Add a foreground storage-access check before opening browser login, so any
65
+ necessary OS approval happens during setup rather than a later tool call.
66
+ This is a proposed UX improvement, not a shipped behavior change here.
67
+ 3. If future macOS interpreter updates keep changing identity, use a dedicated,
68
+ consistently signed credential helper. That needs separate packaging/signing
69
+ work and cannot guarantee that first-time OS approval never appears.
70
+ 4. Consider explicit DPAPI-file or session-only modes for their appropriate
71
+ platforms/use cases. Plain-file storage should require an informed choice;
72
+ session-only storage requires signing in again after the broker stops.
73
+
74
+ These recommendations change neither the existing stored credentials nor their
75
+ permissions. Keychain approval is scoped to Python's access to this item; scripts
76
+ using the same trusted executable can also request it. A restricted MCP API is
77
+ not a system-wide sandbox for an otherwise unrestricted coding agent.
78
+
79
+ ## Separate desktop-app permission
80
+
81
+ The macOS prompt naming **ChatGPT** and asking to access data from other apps is
82
+ separate from a Keychain request for `tum-mcp`. Apple associates that prompt with
83
+ [files in other apps' sandbox containers](https://developer.apple.com/documentation/BundleResources/Information-Property-List/NSAppDataUsageDescription).
84
+ The campus backend's default storage and HTTP read paths do not need that broad
85
+ host permission. The specific container behind the observed prompt was not
86
+ identified; computer-use inventory is a possible trigger, not a confirmed cause.
@@ -0,0 +1,96 @@
1
+ # Development
2
+
3
+ [README](../README.md) · [Setup](setup.md)
4
+
5
+ For the combined 0.4.1 campus pilot, see the [TUM MCP guide](tum-mcp.md) and
6
+ [current verification limits](tum-mcp.md#build-and-test-the-local-package). This page also
7
+ covers the preserved Moodle-only installer.
8
+
9
+ ## Checks
10
+
11
+ ```sh
12
+ uv sync --locked
13
+ uv run ruff check src tests plugin/scripts scripts
14
+ uv run ruff format --check src tests plugin/scripts scripts
15
+ uv run pytest -q
16
+ uv run python scripts/package_plugin.py
17
+ uv build
18
+ node npm/build.mjs
19
+ npm test
20
+ npm pack --ignore-scripts --pack-destination dist
21
+ npm run test:consumer -- dist/jamestesting888-tum-mcp-0.4.1.tgz
22
+ ```
23
+
24
+ Python 3.13 is the managed runtime on every platform. Install Tesseract for the
25
+ OCR integration test. Ordinary tests use synthetic materials and in-memory
26
+ credentials; no Moodle login is needed. No language-server installation is required.
27
+
28
+ GitHub Actions runs the suite on macOS, Windows, and Ubuntu, including packaged
29
+ MCP startup, PDF/OCR extraction, downloads, and real native credential-store
30
+ round trips. The Linux job starts its own D-Bus/Secret Service session.
31
+ The campus additions configure fresh npm consumer checks on all three runners;
32
+ those checks must pass for the release commit before claiming release coverage.
33
+
34
+ To test an installed package, set `TUM_MOODLE_PACKAGED` to its
35
+ `scripts/launch.py` path before running pytest. Set `TUM_MOODLE_SYSTEM_KEYRING=1`
36
+ to enable the native-store test; it creates and removes a unique synthetic entry.
37
+
38
+ Live Moodle checks are separate: `TUM_MOODLE_LIVE=1 uv run pytest tests/live -q`.
39
+ They require the developer's saved session and Real Time Systems enrollment;
40
+ one test downloads a lecture. Never supply personal credentials to public CI.
41
+
42
+ ## Architecture
43
+
44
+ | Module | Responsibility |
45
+ | --- | --- |
46
+ | `platforms.py` | Shared OS data/runtime paths; also imported by bootstrap and launcher |
47
+ | `auth.py`, `login.py` | Encrypted sessions, native credential stores, Chrome sign-in |
48
+ | `server.py`, `service.py` | MCP tools and retrieval coordination |
49
+ | `http_client.py` | Read-only Moodle network boundary |
50
+ | `parsing.py`, `forums.py`, `personal_records.py` | Moodle content and explicit private-record reads |
51
+ | `extraction.py`, `extract_worker.py` | Document/OCR extraction with process limits |
52
+ | `library.py`, `downloads.py` | Local search/cache and persistent exports |
53
+
54
+ The stdlib-only `scripts/install.py` owns packaging, runtime checks, activation,
55
+ and structured handoff. The updater pulls safely, then delegates to that installer.
56
+ Packaged `scripts/runtime_setup.py` is shared with bootstrap; its content receipt
57
+ and offline dependency check permit healthy reruns without synchronization.
58
+ Source changes force a package refresh even if the version/metadata timestamp
59
+ is unchanged. `--repair` reinstalls the locked runtime. The MCP smoke check lists
60
+ tools without reading a Moodle session or making Moodle requests.
61
+
62
+ Generated manifests launch the absolute private Python path on every OS.
63
+ Portable source templates contain no machine paths. Rebuild on each target
64
+ computer; moving/deleting the checkout does not affect the installed runtime.
65
+
66
+ CI enables `TUM_MOODLE_INSTALLER_INTEGRATION=1` for a real isolated-cache install,
67
+ offline rerun, same-version source update, damaged-runtime detection, and repair.
68
+ Set `TUM_MOODLE_INSTALLER_EVIDENCE` to write stage timings. The external Codex CLI
69
+ is synthetic in those tests; dependency installation and MCP startup are real.
70
+ Timings exclude agent latency, user sign-in/MFA, and application restart time.
71
+
72
+ Credentials use explicit OS backends. Unsupported or unavailable stores fail
73
+ with `SETUP_REQUIRED`; environment-selected plaintext alternatives are ignored.
74
+ Keep the existing macOS service name and account path to preserve saved sessions.
75
+
76
+ Extraction runs in a subprocess with a 60-second wall limit and 512 MiB aggregate
77
+ memory monitoring. POSIX also enforces a CPU limit and kills the process group;
78
+ Windows terminates the worker and its observed child processes.
79
+
80
+ ## Manual desktop verification
81
+
82
+ Automated tests do not replace a desktop check. On each target OS, verify:
83
+
84
+ 1. Register/install from a checkout with spaces in its path; restart the client.
85
+ 2. Confirm native tools appear, then complete Chrome sign-in and MFA.
86
+ 3. List current-semester courses, read a PDF, and check a forum.
87
+ 4. Download one material and open the returned file locally.
88
+ 5. Restart the client and confirm session reuse, then test logout and sign-in.
89
+
90
+ macOS has had a live course/sign-in test. Windows and Linux still require this
91
+ interactive check before claiming equivalent desktop verification.
92
+
93
+ Keep changes focused. Never commit session files, course materials, databases,
94
+ or `.env` files. The cache/search database is local and unencrypted; private
95
+ records are excluded from ordinary search. External recording links receive
96
+ no Moodle cookies.
package/docs/setup.md ADDED
@@ -0,0 +1,177 @@
1
+ # Desktop setup
2
+
3
+ This page covers the preserved **Moodle-only** installer. For the combined
4
+ Artemis/Zulip/Moodle 0.4.1 pilot, use [campus setup](../README.md#manual-setup) and
5
+ the [TUM MCP guide](tum-mcp.md).
6
+
7
+ [README](../README.md) · [macOS](#macos) · [Windows](#windows) · [Linux](#linux) ·
8
+ [Updates](#updates) · [Troubleshooting](#troubleshooting) · [Uninstall](#uninstall)
9
+
10
+ ## Prerequisites
11
+
12
+ Use your own TUM account and a Codex client that supports local plugin marketplaces.
13
+ This package runs on the local computer; it does not connect ChatGPT web.
14
+
15
+ ### macOS
16
+
17
+ Install Git, [uv](https://docs.astral.sh/uv/getting-started/installation/), and
18
+ [Google Chrome](https://www.google.com/chrome/). Homebrew users can run:
19
+
20
+ ```sh
21
+ brew install git uv
22
+ brew install --cask google-chrome
23
+ ```
24
+
25
+ Git can also come from Apple's Command Line Tools: `xcode-select --install`.
26
+ No system Python is needed. For scanned PDFs, optionally install `brew install tesseract`.
27
+ Unlock your login keychain if macOS asks. Apple Silicon has been tested locally;
28
+ Intel uses the same setup, but has not had a hands-on test.
29
+
30
+ ### Windows
31
+
32
+ Use a normal, non-administrator PowerShell window. Install prerequisites if missing:
33
+
34
+ ```powershell
35
+ winget install --exact --id Git.Git
36
+ winget install --exact --id astral-sh.uv
37
+ winget install --exact --id Google.Chrome
38
+ ```
39
+
40
+ Open a **new PowerShell window** after installation so PATH is refreshed.
41
+ uv supplies Python; a separate Python installation is not required. Ensure
42
+ `uv --version` works before running the installer. Codex then launches the private
43
+ interpreter directly, so it does not depend on PowerShell's PATH.
44
+
45
+ Windows Credential Manager stores the session-encryption key. Optional OCR needs
46
+ [Tesseract](https://tesseract-ocr.github.io/tessdoc/Installation.html), with its
47
+ installation directory on PATH. Restart Codex after changing PATH.
48
+
49
+ ### Linux
50
+
51
+ Use a graphical desktop session with Google Chrome, Git, uv, and an
52
+ unlocked **Secret Service** keyring, such as GNOME Keyring. The keyring must be
53
+ available in the same D-Bus session as Codex. A headless SSH session is insufficient
54
+ for interactive Moodle sign-in.
55
+
56
+ For Ubuntu/Debian prerequisites:
57
+
58
+ ```sh
59
+ sudo apt-get install git gnome-keyring
60
+ ```
61
+
62
+ Install [uv](https://docs.astral.sh/uv/getting-started/installation/) and
63
+ [Chrome](https://www.google.com/chrome/) using their official installers.
64
+ For OCR, optionally install `sudo apt-get install tesseract-ocr`.
65
+ On other distributions, use the equivalent packages. KWallet-only setups need
66
+ a running Secret Service provider; the plugin deliberately avoids plaintext
67
+ or arbitrary third-party credential backends.
68
+
69
+ ## Install and sign in
70
+
71
+ Run these commands on the target computer so packaging generates the correct launcher:
72
+
73
+ ```sh
74
+ git clone --depth 1 https://github.com/jamestesting0/tum-moodle-integration.git
75
+ cd tum-moodle-integration
76
+ uv run scripts/install.py
77
+ ```
78
+
79
+ Do not copy a Mac's generated plugin or session files to Windows/Linux.
80
+
81
+ The installer preserves existing marketplace entries and registers the source
82
+ under `~/.codex/plugins/local/tum-moodle/`. In PowerShell, `~` refers to your user
83
+ profile. You can also install through the Codex CLI:
84
+
85
+ ```text
86
+ codex plugin add tum-moodle@personal-local
87
+ ```
88
+
89
+ If you renamed your personal source, use its marketplace name instead.
90
+ When the installer requests it, restart the desktop app completely: **Cmd+Q** on macOS;
91
+ exit all app windows/background instances on Windows/Linux, then reopen it.
92
+
93
+ After installation, ask **“Sign in to TUM Moodle.”** The agent checks the existing
94
+ session before opening Chrome. Complete any TUM login/MFA there. Once connected,
95
+ the agent offers an optional course-list check; declining it leaves setup complete.
96
+
97
+ ### Installer results and repair
98
+
99
+ `uv run scripts/install.py --json` returns one structured result. Progress goes to
100
+ stderr; `next_actions` tells the agent exactly what remains.
101
+
102
+ | Result | Meaning |
103
+ | --- | --- |
104
+ | `ready` | Local checks pass and the installed plugin is current. Sign-in is separate. |
105
+ | `restart_required` | Software setup passed; fully restart Codex once to load it. |
106
+ | `action_required` | Follow the prerequisite, keyring, or manual enablement instruction. Completed software stages are retained. |
107
+ | `error` | A stage failed; the result includes the failed stage and error. |
108
+
109
+ Exit codes are 0 for software success, 2 for a required user action, and 1 for an
110
+ error. A local MCP check does not prove tools have reloaded in the current chat.
111
+ Do not keep restarting or reinstalling while waiting for the user.
112
+
113
+ If the runtime is damaged, run `uv run scripts/install.py --repair`. This reinstalls
114
+ locked runtime packages without removing sessions or downloads. Healthy reruns
115
+ check the existing runtime and reuse uv's cache. Native tools can work after the
116
+ original checkout is moved/deleted; keep a checkout for future updates.
117
+
118
+ ## Updates
119
+
120
+ Run `uv run scripts/update.py` from your checkout and follow the printed actions.
121
+ It uses your branch's configured upstream and a fast-forward-only pull; it never
122
+ stashes edits, switches branches, or creates a merge commit.
123
+
124
+ The shared installer refreshes TUM Moodle using the Codex CLI on PATH or in a standard
125
+ macOS app bundle. If it cannot find the CLI, it updates the code/runtime and tells
126
+ you to reinstall the plugin from your personal source in the Plugins screen.
127
+ Custom marketplace names are preserved. A failed step stops the update and
128
+ reports the error; fix that issue and rerun the command.
129
+
130
+ For a checkout created before the updater was added, first run `git pull --ff-only`.
131
+
132
+ ## Troubleshooting
133
+
134
+ | Problem | Fix |
135
+ | --- | --- |
136
+ | No personal plugin source | Repeat packaging with `--register`, then fully restart Codex. Check that your client supports local marketplaces. |
137
+ | Skills appear but tools do not | Repeat bootstrap, reinstall the plugin from your personal source, and restart Codex. Check loader errors before repeating restarts. |
138
+ | `uv` is missing | Install uv and open a new terminal/app session. Bootstrap also checks `~/.local/bin` and standard Homebrew locations. |
139
+ | Windows opens Microsoft Store for Python | Rerun the installer. The generated manifest must point to the private runtime's `Scripts/python.exe`. |
140
+ | Native credential store unavailable | Unlock the OS store. Linux needs Secret Service in the current desktop D-Bus session; there is no plaintext fallback. |
141
+ | Chrome fails to open | Install Google Chrome, then ask the plugin to sign in again. Chromium-only installations are not selected automatically. |
142
+ | Session expired | Ask Codex to sign in to Moodle again. |
143
+ | Scanned material fails | Install Tesseract and put it on PATH, then restart Codex and retry. Text PDFs do not require OCR. |
144
+ | Search returns little | Ask Codex to index/refresh the course and check coverage. |
145
+
146
+ Downloaded originals are in `~/Downloads/TUM Moodle/`. To use a different folder,
147
+ set `TUM_MOODLE_DOWNLOAD_DIR` in the environment inherited by Codex.
148
+ `TUM_MOODLE_DATA_DIR` overrides the session/cache location. The installed runtime
149
+ stays in the standard platform data folder.
150
+
151
+ For [bug reports](https://github.com/jamestesting0/tum-moodle-integration/issues),
152
+ include OS/client versions and the error message. Remove credentials, cookies,
153
+ personal records, and course content.
154
+
155
+ ## Data locations
156
+
157
+ | Platform | Moodle runtime, session, and cache |
158
+ | --- | --- |
159
+ | macOS | `~/Library/Application Support/TUMMoodle/` |
160
+ | Windows | `%LOCALAPPDATA%\TUMMoodle\` |
161
+ | Linux | `${XDG_DATA_HOME:-~/.local/share}/TUMMoodle/` |
162
+
163
+ Campus settings and encrypted credentials use a separate `TUMMCP/` folder beside
164
+ `TUMMoodle/`. Existing Moodle data remains in place when switching to TUM MCP.
165
+
166
+ ## Uninstall
167
+
168
+ 1. Ask Codex to sign out and clear the cache, then remove the plugin in Plugins.
169
+ 2. To remove the personal catalog entry, delete only `tum-moodle` from
170
+ `~/.agents/plugins/marketplace.json`, preserving the other entries.
171
+ 3. Delete `~/.codex/plugins/local/tum-moodle/` and the
172
+ [platform data folder](#data-locations) if no longer needed.
173
+ 4. Remove the `tum-moodle-integration` credential entry using the OS credential
174
+ manager: Keychain Access, Windows Credential Manager, or the Linux password/keyring app.
175
+
176
+ Delete downloaded files separately if desired. Signing out removes this plugin's
177
+ saved session; it does not sign you out of other browsers or revoke TUM sessions.