e3cli 0.3.2__tar.gz → 0.4.1__tar.gz

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.
Files changed (51) hide show
  1. e3cli-0.4.1/CLAUDE.md +41 -0
  2. e3cli-0.4.1/Formula/e3cli.rb +84 -0
  3. e3cli-0.4.1/PKG-INFO +346 -0
  4. e3cli-0.4.1/README.md +312 -0
  5. e3cli-0.4.1/README_zh-TW.md +312 -0
  6. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/__init__.py +1 -1
  7. e3cli-0.4.1/e3cli/agent_prompt.md +132 -0
  8. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/api/courses.py +6 -13
  9. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/cli.py +2 -0
  10. e3cli-0.4.1/e3cli/commands/courses.py +63 -0
  11. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/commands/download.py +72 -31
  12. e3cli-0.4.1/e3cli/commands/interactive.py +589 -0
  13. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/commands/sync.py +56 -6
  14. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/i18n.py +52 -0
  15. e3cli-0.4.1/e3cli/semester.py +93 -0
  16. {e3cli-0.3.2 → e3cli-0.4.1}/pyproject.toml +1 -1
  17. e3cli-0.3.2/Formula/e3cli.rb +0 -35
  18. e3cli-0.3.2/PKG-INFO +0 -369
  19. e3cli-0.3.2/README.md +0 -335
  20. e3cli-0.3.2/e3cli/commands/courses.py +0 -39
  21. {e3cli-0.3.2 → e3cli-0.4.1}/.github/workflows/ci.yml +0 -0
  22. {e3cli-0.3.2 → e3cli-0.4.1}/.github/workflows/release.yml +0 -0
  23. {e3cli-0.3.2 → e3cli-0.4.1}/.gitignore +0 -0
  24. {e3cli-0.3.2 → e3cli-0.4.1}/LICENSE +0 -0
  25. {e3cli-0.3.2 → e3cli-0.4.1}/Makefile +0 -0
  26. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/__main__.py +0 -0
  27. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/ai/__init__.py +0 -0
  28. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/api/__init__.py +0 -0
  29. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/api/assignments.py +0 -0
  30. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/api/client.py +0 -0
  31. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/api/files.py +0 -0
  32. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/api/site.py +0 -0
  33. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/auth.py +0 -0
  34. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/commands/__init__.py +0 -0
  35. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/commands/_common.py +0 -0
  36. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/commands/assignments.py +0 -0
  37. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/commands/login.py +0 -0
  38. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/commands/logout.py +0 -0
  39. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/commands/schedule.py +0 -0
  40. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/commands/setup.py +0 -0
  41. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/commands/submit.py +0 -0
  42. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/config.py +0 -0
  43. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/credential.py +0 -0
  44. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/scheduler/__init__.py +0 -0
  45. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/scheduler/cron.py +0 -0
  46. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/storage/__init__.py +0 -0
  47. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/storage/db.py +0 -0
  48. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/storage/models.py +0 -0
  49. {e3cli-0.3.2 → e3cli-0.4.1}/e3cli/storage/tracking.py +0 -0
  50. {e3cli-0.3.2 → e3cli-0.4.1}/tests/__init__.py +0 -0
  51. {e3cli-0.3.2 → e3cli-0.4.1}/tests/test_basic.py +0 -0
e3cli-0.4.1/CLAUDE.md ADDED
@@ -0,0 +1,41 @@
1
+ # E3CLI — Claude Code Integration
2
+
3
+ ## What is this?
4
+
5
+ e3cli is a CLI tool for NYCU's E3 Moodle platform. It can sync courses, download materials, check assignments, and submit homework.
6
+
7
+ ## How to use e3cli in this project
8
+
9
+ ```bash
10
+ # Check for new assignments
11
+ e3cli sync
12
+
13
+ # List upcoming assignments
14
+ e3cli assignments --due-soon 7
15
+
16
+ # Download course materials
17
+ e3cli download --course "COURSE_NAME"
18
+
19
+ # Submit completed assignment
20
+ e3cli submit <ASSIGNMENT_ID> <FILE_PATH>
21
+
22
+ # Interactive mode
23
+ e3cli i
24
+ ```
25
+
26
+ ## When a new assignment is detected
27
+
28
+ 1. Run `e3cli sync` to pull latest data
29
+ 2. Run `e3cli assignments` to see what's new
30
+ 3. Check `~/e3-downloads/` for assignment descriptions
31
+ 4. **Always confirm with the user before submitting**
32
+
33
+ ## Token expired?
34
+
35
+ ```bash
36
+ e3cli login --refresh
37
+ ```
38
+
39
+ ## Full agent instructions
40
+
41
+ See `e3cli/agent_prompt.md` for detailed automation workflow.
@@ -0,0 +1,84 @@
1
+ class E3cli < Formula
2
+ include Language::Python::Virtualenv
3
+
4
+ desc "NYCU E3 Moodle automation CLI — sync courses, download materials, submit assignments"
5
+ homepage "https://github.com/junlinwk/e3cli"
6
+ url "https://github.com/junlinwk/e3cli/archive/refs/tags/v0.3.2.tar.gz"
7
+ sha256 "81fdd7e59817afbe9863c4c8533355297daaf59a37e526f47ca26d161a6ce7d3"
8
+ license "MIT"
9
+
10
+ depends_on "python@3.12"
11
+
12
+ resource "typer" do
13
+ url "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz"
14
+ sha256 "e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45"
15
+ end
16
+
17
+ resource "click" do
18
+ url "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz"
19
+ sha256 "12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"
20
+ end
21
+
22
+ resource "shellingham" do
23
+ url "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz"
24
+ sha256 "8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"
25
+ end
26
+
27
+ resource "annotated-doc" do
28
+ url "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz"
29
+ sha256 "fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4"
30
+ end
31
+
32
+ resource "requests" do
33
+ url "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz"
34
+ sha256 "c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652"
35
+ end
36
+
37
+ resource "charset_normalizer" do
38
+ url "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz"
39
+ sha256 "1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6"
40
+ end
41
+
42
+ resource "idna" do
43
+ url "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz"
44
+ sha256 "795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"
45
+ end
46
+
47
+ resource "urllib3" do
48
+ url "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz"
49
+ sha256 "1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"
50
+ end
51
+
52
+ resource "certifi" do
53
+ url "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz"
54
+ sha256 "e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"
55
+ end
56
+
57
+ resource "rich" do
58
+ url "https://files.pythonhosted.org/packages/b3/c6/f3b320c27991c46f43ee9d856302c70dc2d0fb2dba4842ff739d5f46b393/rich-14.3.3.tar.gz"
59
+ sha256 "b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b"
60
+ end
61
+
62
+ resource "markdown-it-py" do
63
+ url "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz"
64
+ sha256 "cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"
65
+ end
66
+
67
+ resource "mdurl" do
68
+ url "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz"
69
+ sha256 "bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"
70
+ end
71
+
72
+ resource "pygments" do
73
+ url "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz"
74
+ sha256 "636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"
75
+ end
76
+
77
+ def install
78
+ virtualenv_install_with_resources
79
+ end
80
+
81
+ test do
82
+ assert_match "e3cli", shell_output("#{bin}/e3cli version")
83
+ end
84
+ end
e3cli-0.4.1/PKG-INFO ADDED
@@ -0,0 +1,346 @@
1
+ Metadata-Version: 2.4
2
+ Name: e3cli
3
+ Version: 0.4.1
4
+ Summary: NYCU E3 Moodle automation CLI — sync courses, download materials, submit assignments.
5
+ Project-URL: Homepage, https://github.com/junlinwk/e3cli
6
+ Project-URL: Repository, https://github.com/junlinwk/e3cli
7
+ Project-URL: Issues, https://github.com/junlinwk/e3cli/issues
8
+ Author: E3CLI Contributors
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: automation,cli,e3,moodle,nycu
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Education
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Education
22
+ Requires-Python: >=3.11
23
+ Requires-Dist: requests>=2.31
24
+ Requires-Dist: rich>=13.0
25
+ Requires-Dist: typer>=0.9
26
+ Provides-Extra: ai
27
+ Requires-Dist: anthropic>=0.18; extra == 'ai'
28
+ Requires-Dist: pymupdf>=1.23; extra == 'ai'
29
+ Provides-Extra: dev
30
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
31
+ Requires-Dist: pytest>=8.0; extra == 'dev'
32
+ Requires-Dist: ruff>=0.4; extra == 'dev'
33
+ Description-Content-Type: text/markdown
34
+
35
+ <p align="center">
36
+ <img src="https://img.shields.io/badge/python-3.11+-blue?logo=python&logoColor=white" alt="Python">
37
+ <img src="https://img.shields.io/badge/platform-macOS%20%7C%20Linux-lightgrey?logo=apple&logoColor=white" alt="Platform">
38
+ <img src="https://img.shields.io/github/license/junlinwk/e3cli?color=green" alt="License">
39
+ <img src="https://img.shields.io/github/v/tag/junlinwk/e3cli?label=version&color=orange" alt="Version">
40
+ </p>
41
+
42
+ <h1 align="center">e3cli</h1>
43
+
44
+ <p align="center">
45
+ <b>NYCU E3 Moodle automation CLI</b><br>
46
+ Sync courses, download materials, submit assignments — all from your terminal.
47
+ </p>
48
+
49
+ <p align="center">
50
+ <a href="#installation">Install</a> &bull;
51
+ <a href="#quick-start">Quick Start</a> &bull;
52
+ <a href="#commands">Commands</a> &bull;
53
+ <a href="#security">Security</a> &bull;
54
+ <a href="./README_zh-TW.md">繁體中文</a>
55
+ </p>
56
+
57
+ ---
58
+
59
+ > **Intended use:** Finished your homework? Too lazy to open the browser? Submit it from CLI.
60
+ >
61
+ > ~~**Unintended use:** Let Claude Code auto-pull new assignments, finish them, and upload. (Please don't.)~~
62
+
63
+ ## Features
64
+
65
+ - **Login** — Moodle Web Service API authentication with encrypted credential storage
66
+ - **Courses** — List all enrolled courses
67
+ - **Assignments** — View assignments, deadlines, and submission status
68
+ - **Download** — Batch download course materials, skip already-downloaded files
69
+ - **Submit** — Upload and submit assignments directly from CLI
70
+ - **Sync** — One command to pull everything new (materials + assignment status)
71
+ - **Schedule** — Cron-based automatic sync
72
+ - **Bilingual** — Full Chinese/English support
73
+
74
+ ## Supported Platforms
75
+
76
+ | Platform | Architecture | Status |
77
+ |----------|-------------|--------|
78
+ | macOS | Apple Silicon (ARM64) | :white_check_mark: Supported |
79
+ | macOS | Intel (x86_64) | :white_check_mark: Supported |
80
+ | Linux | x86_64 | :white_check_mark: Supported |
81
+ | Linux | ARM64 | :white_check_mark: Supported |
82
+
83
+ Requires **Python 3.11+**.
84
+
85
+ ---
86
+
87
+ ## Installation
88
+
89
+ ### Homebrew (recommended)
90
+
91
+ ```bash
92
+ brew tap junlinwk/e3cli
93
+ brew install e3cli
94
+ ```
95
+
96
+ ### pipx
97
+
98
+ ```bash
99
+ pipx install git+https://github.com/junlinwk/e3cli.git
100
+ ```
101
+
102
+ ### pip
103
+
104
+ ```bash
105
+ pip install git+https://github.com/junlinwk/e3cli.git
106
+ ```
107
+
108
+ ### From source
109
+
110
+ ```bash
111
+ git clone https://github.com/junlinwk/e3cli.git
112
+ cd e3cli
113
+ pip install -e ".[dev]"
114
+ ```
115
+
116
+ > After installation, `e3cli` is available as a system-wide command.
117
+
118
+ ### Upgrade
119
+
120
+ | Method | Command |
121
+ |--------|---------|
122
+ | Homebrew | `brew update && brew upgrade e3cli` |
123
+ | pipx (GitHub) | `pipx install git+https://github.com/junlinwk/e3cli.git --force` |
124
+ | pipx (PyPI) | `pipx upgrade e3cli` |
125
+ | pip (PyPI) | `pip install e3cli --upgrade` |
126
+
127
+ ---
128
+
129
+ ## Quick Start
130
+
131
+ ```bash
132
+ # 1. Login (first time — interactive setup wizard will guide you)
133
+ e3cli login --save
134
+
135
+ # 2. List your courses
136
+ e3cli courses
137
+
138
+ # 3. Download all course materials
139
+ e3cli download --all
140
+
141
+ # 4. Check assignments and deadlines
142
+ e3cli assignments
143
+
144
+ # 5. Submit an assignment
145
+ e3cli submit <assignment-id> homework.pdf
146
+
147
+ # 6. Enable automatic sync (every hour)
148
+ e3cli schedule enable
149
+ ```
150
+
151
+ ---
152
+
153
+ ## Commands
154
+
155
+ ### `e3cli login`
156
+
157
+ Authenticate with your Moodle account and store the API token.
158
+
159
+ ```bash
160
+ e3cli login # Interactive prompt
161
+ e3cli login -u <student-id> # Specify username
162
+ e3cli login --save # Save credentials (encrypted) for auto-refresh
163
+ e3cli login --refresh # Re-authenticate using saved credentials
164
+ ```
165
+
166
+ ### `e3cli logout`
167
+
168
+ Securely erase all stored credentials and tokens.
169
+
170
+ ```bash
171
+ e3cli logout
172
+ ```
173
+
174
+ ### `e3cli courses`
175
+
176
+ List all enrolled courses in a formatted table.
177
+
178
+ ```bash
179
+ e3cli courses
180
+ ```
181
+
182
+ ### `e3cli assignments`
183
+
184
+ View assignments with deadlines and submission status.
185
+
186
+ ```bash
187
+ e3cli assignments # All assignments
188
+ e3cli assignments --due-soon 7 # Due within 7 days
189
+ ```
190
+
191
+ ### `e3cli download`
192
+
193
+ Download course materials to local disk.
194
+
195
+ ```bash
196
+ e3cli download --all # All courses
197
+ e3cli download --course "OS" # Filter by course name/code
198
+ ```
199
+
200
+ Files are saved to `~/e3-downloads/<course>/<section>/` by default. Already-downloaded files are skipped automatically (tracked via SQLite).
201
+
202
+ ### `e3cli submit`
203
+
204
+ Upload and submit an assignment.
205
+
206
+ ```bash
207
+ e3cli submit <assignment-id> file1.pdf file2.zip
208
+ e3cli submit <assignment-id> report.pdf --text "Some notes"
209
+ e3cli submit <assignment-id> late-hw.pdf --force # Submit past deadline
210
+ ```
211
+
212
+ ### `e3cli sync`
213
+
214
+ Pull all new materials and update assignment status in one command.
215
+
216
+ ```bash
217
+ e3cli sync # Interactive output
218
+ e3cli sync --quiet # Silent mode (for cron)
219
+ ```
220
+
221
+ ### `e3cli schedule`
222
+
223
+ Manage automatic sync via system crontab.
224
+
225
+ ```bash
226
+ e3cli schedule enable # Default: every 60 minutes
227
+ e3cli schedule enable --interval 30 # Every 30 minutes
228
+ e3cli schedule disable # Remove cron job
229
+ e3cli schedule status # Show current schedule
230
+ ```
231
+
232
+ ### `e3cli setup`
233
+
234
+ Re-run the interactive setup wizard (language, Moodle URL, download directory, login).
235
+
236
+ ```bash
237
+ e3cli setup
238
+ ```
239
+
240
+ ### `e3cli version`
241
+
242
+ ```bash
243
+ e3cli version
244
+ ```
245
+
246
+ ---
247
+
248
+ ## Configuration
249
+
250
+ Config file location: `~/.e3cli/config.toml`
251
+
252
+ ```toml
253
+ [moodle]
254
+ url = "https://e3p.nycu.edu.tw"
255
+ service = "moodle_mobile_app"
256
+
257
+ [storage]
258
+ download_dir = "~/e3-downloads"
259
+
260
+ [schedule]
261
+ interval_minutes = 60
262
+ notify = true
263
+
264
+ [general]
265
+ lang = "zh" # "zh" or "en", or omit for auto-detect
266
+ ```
267
+
268
+ Auto-created with defaults on first run. Edit to customize, or run `e3cli setup` to reconfigure interactively.
269
+
270
+ ---
271
+
272
+ ## Security
273
+
274
+ ### Credential Storage
275
+
276
+ e3cli uses **PBKDF2-HMAC-SHA256** key derivation with integrity verification to protect stored credentials:
277
+
278
+ ```
279
+ ~/.e3cli/
280
+ key # 256-bit random encryption key (chmod 600)
281
+ credentials.enc # Encrypted username + password (chmod 600)
282
+ token # Moodle API token (chmod 600)
283
+ ```
284
+
285
+ | Measure | Detail |
286
+ |---------|--------|
287
+ | Encryption | PBKDF2-HMAC-SHA256 (100k iterations) + XOR stream cipher |
288
+ | Integrity | HMAC-SHA256 verification on every read |
289
+ | File permissions | `chmod 600` — owner-only read/write |
290
+ | Password input | `getpass` — never appears in shell history or CLI args |
291
+ | Logout | `e3cli logout` overwrites files with zeros before deletion |
292
+ | Key separation | Encryption key and encrypted data stored in separate files |
293
+
294
+ ### What's NOT Stored
295
+
296
+ - :x: No plaintext passwords on disk
297
+ - :x: No credentials in `config.toml`
298
+ - :x: No credentials in environment variables
299
+ - :x: No credentials in shell history
300
+
301
+ ### Recommendations
302
+
303
+ - Use `e3cli login --save` only on machines you trust
304
+ - Run `e3cli logout` when done on shared machines
305
+ - The `~/.e3cli/` directory is in `.gitignore` — never commit it
306
+
307
+ ---
308
+
309
+ ## Local Data
310
+
311
+ | Path | Purpose |
312
+ |------|---------|
313
+ | `~/.e3cli/config.toml` | User configuration |
314
+ | `~/.e3cli/token` | Moodle API token (chmod 600) |
315
+ | `~/.e3cli/key` | Encryption key (chmod 600) |
316
+ | `~/.e3cli/credentials.enc` | Encrypted credentials (chmod 600) |
317
+ | `~/.e3cli/data/e3cli.db` | SQLite tracking DB |
318
+ | `~/e3-downloads/` | Downloaded course materials |
319
+
320
+ ---
321
+
322
+ ## Development
323
+
324
+ ```bash
325
+ git clone https://github.com/junlinwk/e3cli.git
326
+ cd e3cli
327
+ make dev # pip install -e ".[dev]"
328
+ make lint # ruff check
329
+ make test # pytest
330
+ make build # python -m build
331
+ ```
332
+
333
+ ## Roadmap
334
+
335
+ - [ ] AI-powered material summarization
336
+ - [ ] AI-assisted assignment drafting
337
+ - [ ] Smart deadline notifications with priority scoring
338
+ - [ ] Desktop notifications (Linux `notify-send`, macOS `osascript`)
339
+ - [ ] Course filtering by semester
340
+ - [ ] Parallel downloads
341
+
342
+ ---
343
+
344
+ ## License
345
+
346
+ [MIT](./LICENSE)