agent2learn 0.1.2__tar.gz → 0.1.6__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 (48) hide show
  1. {agent2learn-0.1.2 → agent2learn-0.1.6}/PKG-INFO +53 -37
  2. {agent2learn-0.1.2 → agent2learn-0.1.6}/README.md +50 -34
  3. {agent2learn-0.1.2 → agent2learn-0.1.6}/pyproject.toml +5 -5
  4. {agent2learn-0.1.2 → agent2learn-0.1.6}/pyproject.toml.orig +8 -8
  5. {agent2learn-0.1.2 → agent2learn-0.1.6}/skills/a2l-coursework/SKILL.md +1 -1
  6. {agent2learn-0.1.2 → agent2learn-0.1.6}/skills/a2l-setup/SKILL.md +1 -1
  7. {agent2learn-0.1.2 → agent2learn-0.1.6}/skills/a2l-study/SKILL.md +1 -1
  8. {agent2learn-0.1.2 → agent2learn-0.1.6}/skills/a2l-sync/SKILL.md +1 -1
  9. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/__init__.py +1 -1
  10. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/audit.py +17 -6
  11. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/auth/__init__.py +5 -2
  12. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/auth/cdp.py +2 -2
  13. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/calendar.py +38 -5
  14. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/cli.py +63 -11
  15. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/convert.py +98 -16
  16. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/doctor.py +103 -24
  17. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/errors.py +5 -1
  18. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/ground.py +4 -0
  19. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/index.py +97 -0
  20. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/ingest.py +96 -15
  21. agent2learn-0.1.6/src/agent2learn/metadata_coverage.py +137 -0
  22. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/pipeline.py +12 -4
  23. {agent2learn-0.1.2 → agent2learn-0.1.6}/LICENSE +0 -0
  24. {agent2learn-0.1.2 → agent2learn-0.1.6}/skills.sh.json +0 -0
  25. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/_release.py +0 -0
  26. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/aipolicy.py +0 -0
  27. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/api.py +0 -0
  28. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/auth/paste.py +0 -0
  29. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/calibrate.py +0 -0
  30. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/check.py +0 -0
  31. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/clock.py +0 -0
  32. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/config.py +0 -0
  33. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/console.py +0 -0
  34. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/locations.py +0 -0
  35. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/outlines.py +0 -0
  36. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/paths.py +0 -0
  37. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/privacy.py +0 -0
  38. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/schools/__init__.py +0 -0
  39. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/schools/_base.py +0 -0
  40. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/schools/generic.py +0 -0
  41. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/schools/uwaterloo.py +0 -0
  42. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/session.py +0 -0
  43. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/skills.py +0 -0
  44. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/snapshot.py +0 -0
  45. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/submit.py +0 -0
  46. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/transactions.py +0 -0
  47. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/upgrade.py +0 -0
  48. {agent2learn-0.1.2 → agent2learn-0.1.6}/src/agent2learn/vault.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent2learn
3
- Version: 0.1.2
3
+ Version: 0.1.6
4
4
  Summary: A local, source-cited course vault for AI agents
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
7
- Requires-Dist: typer>=0.15,<1
7
+ Requires-Dist: typer>=0.16,<1
8
8
  Requires-Dist: click>=8.2,<9
9
- Requires-Dist: rich>=13,<15
9
+ Requires-Dist: rich>=13,<16
10
10
  Requires-Dist: requests>=2.32,<3
11
11
  Requires-Dist: platformdirs>=4.2,<5
12
12
  Requires-Dist: keyring>=25,<27
@@ -34,19 +34,19 @@ a durable local vault: original files beside Markdown twins, a stable index, and
34
34
  resolve to ordinary paths and line numbers. Your agent stops guessing about your course and starts
35
35
  quoting it.
36
36
 
37
- > **Walkthrough recording:** not yet attached. It is a release artifact, recorded against the
38
- > synthetic fixture course in `tests/fixtures/` — never against a real account — so no course,
39
- > student, grade, or session data appears in it. Recording it is a launch gate in
40
- > [docs/LAUNCH.md](docs/LAUNCH.md); this README will not link a file that does not exist.
41
-
42
37
  ## Install
43
38
 
44
- Three supported options. Pick one.
39
+ For the measured macOS workflow, repaired defects, PDF coverage gaps, and still-unverified
40
+ human/platform checks, see the [release validation scope](https://github.com/ManagementMO/agent2learn/blob/main/docs/RELEASE_VALIDATION.md).
41
+ Automated cross-platform tests are not a claim that every live login or course conversion works.
42
+
43
+ For most students, use the command for your operating system. In a real terminal it installs
44
+ Agent2Learn and starts guided setup immediately. If you already have uv, use the uv option below.
45
45
 
46
46
  **macOS and Linux**
47
47
 
48
48
  ```bash
49
- curl -fsSL https://raw.githubusercontent.com/ManagementMO/agent2learn/main/install.sh | bash
49
+ (installer="$(curl -fsSL https://raw.githubusercontent.com/ManagementMO/agent2learn/main/install.sh)" && bash -c "$installer")
50
50
  ```
51
51
 
52
52
  **Windows (PowerShell)**
@@ -57,21 +57,35 @@ irm https://raw.githubusercontent.com/ManagementMO/agent2learn/main/install.ps1
57
57
 
58
58
  **Already have [uv](https://docs.astral.sh/uv/)?**
59
59
 
60
+ Bash or zsh:
61
+
60
62
  ```bash
61
- uv tool install agent2learn
62
- a2l init
63
+ uv tool install agent2learn && uv tool run --from agent2learn a2l init
64
+ ```
65
+
66
+ Windows PowerShell:
67
+
68
+ ```powershell
69
+ uv tool install agent2learn; if ($LASTEXITCODE -eq 0) { uv tool run --from agent2learn a2l init } else { throw "Agent2Learn installation failed" }
63
70
  ```
64
71
 
72
+ These uv commands start setup through uv itself, so a newly installed `a2l` does not need to be
73
+ on the current shell's PATH first. `uv tool install agent2learn` remains the install-only command.
74
+
65
75
  These commands install the published package from PyPI, not an unreleased repository checkout.
66
76
  Python 3.11–3.14 is supported. If uv selects an older system Python or your shell cannot find
67
- `a2l`, see [setup troubleshooting](docs/FAQ.md#setup-and-path).
77
+ `a2l`, see [setup troubleshooting](https://github.com/ManagementMO/agent2learn/blob/main/docs/FAQ.md#setup-and-path).
68
78
 
69
- `install.sh` and `install.ps1` install a pinned Agent2Learn (currently 0.1.2), verify that `a2l`
70
- runs, and then **continue straight into interactive `a2l init`** in the same command. If they are
71
- run without a terminal on both ends — in CI, or through a pipe — they stop after verifying and
72
- print the exact next step instead of setting anything up. Neither script needs administrator
73
- rights, and neither creates a vault, installs agent skills, or opens a browser by itself.
74
- Onboarding does those things, after showing you a preview and asking.
79
+ `install.sh` and `install.ps1` install a pinned Agent2Learn release, verify that `a2l` runs,
80
+ and then **continue straight into interactive `a2l init`** in the same command. The
81
+ macOS/Linux launcher waits for a successful download and preserves your terminal for setup prompts.
82
+ If a script runs without a terminal on both ends, such as in CI or a headless agent tool, it stops
83
+ after verification and prints the next step instead of setting anything up.
84
+
85
+ Neither script needs administrator rights or creates a vault, installs agent skills, or opens a
86
+ browser by itself. Onboarding does those things after showing you a preview and asking; you still
87
+ complete LEARN sign-in and Duo yourself. Already-open terminals or agents may need to be restarted
88
+ to pick up the new executable path, but you do not need to repeat completed setup.
75
89
 
76
90
  ### Agent skills
77
91
 
@@ -83,7 +97,7 @@ Separately, `npx skills add ManagementMO/agent2learn` is an optional skills-only
83
97
  skills ecosystem. It **does not install** the `a2l` engine — only the skill documents — so the
84
98
  commands they describe will not exist until you install Agent2Learn itself with one of the three
85
99
  options above. That route also runs a third-party CLI with its own network behaviour; see
86
- [docs/PRIVACY.md](docs/PRIVACY.md).
100
+ [docs/PRIVACY.md](https://github.com/ManagementMO/agent2learn/blob/main/docs/PRIVACY.md).
87
101
 
88
102
  ## Then just ask
89
103
 
@@ -146,7 +160,7 @@ a2l submit COURSE ITEM FILE preview an upload, then require your typed conf
146
160
 
147
161
  Agent2Learn is **not affiliated with, endorsed by, or supported by the University of Waterloo or
148
162
  D2L Corporation**. You are responsible for using it within your course rules and your institution's
149
- policies. See [DISCLAIMER.md](DISCLAIMER.md).
163
+ policies. See [DISCLAIMER.md](https://github.com/ManagementMO/agent2learn/blob/main/DISCLAIMER.md).
150
164
 
151
165
  ## Privacy defaults
152
166
 
@@ -161,26 +175,28 @@ policies. See [DISCLAIMER.md](DISCLAIMER.md).
161
175
 
162
176
  Turning collection off does not delete what is already on disk; `a2l privacy purge` does that, and
163
177
  it previews the exact targets and requires a typed phrase first. Full detail, including every
164
- external request Agent2Learn can make, is in [docs/PRIVACY.md](docs/PRIVACY.md).
178
+ external request Agent2Learn can make, is in [docs/PRIVACY.md](https://github.com/ManagementMO/agent2learn/blob/main/docs/PRIVACY.md).
165
179
 
166
180
  ## Documentation
167
181
 
168
- - [Install guide for agents](docs/install.md) — point your agent here and let it handle setup.
169
- - [Authentication](docs/AUTHENTICATION.md) — the dedicated profile, Duo, expiry, and recovery.
170
- - [Privacy](docs/PRIVACY.md) — what is stored, where, every network action, and how to delete it.
171
- - [FAQ](docs/FAQ.md) — the things that actually go wrong.
172
- - [Porting to another school](docs/PORTING.md) — the `School` protocol and a worked reference.
173
- - [What is deferred, and why](docs/FUTURE.md)
174
- - [Security policy](SECURITY.md) · [Disclaimer](DISCLAIMER.md) · [Licence](LICENSE) ·
175
- [Third-party notices](THIRD_PARTY_NOTICES.md)
182
+ - [Install guide for agents](https://github.com/ManagementMO/agent2learn/blob/main/docs/install.md) — point your agent here and let it handle setup.
183
+ - [Authentication](https://github.com/ManagementMO/agent2learn/blob/main/docs/AUTHENTICATION.md) — the dedicated profile, Duo, expiry, and recovery.
184
+ - [Privacy](https://github.com/ManagementMO/agent2learn/blob/main/docs/PRIVACY.md) — what is stored, where, every network action, and how to delete it.
185
+ - [FAQ](https://github.com/ManagementMO/agent2learn/blob/main/docs/FAQ.md) — the things that actually go wrong.
186
+ - [Porting to another school](https://github.com/ManagementMO/agent2learn/blob/main/docs/PORTING.md) — the `School` protocol and a worked reference.
187
+ - [What is deferred, and why](https://github.com/ManagementMO/agent2learn/blob/main/docs/FUTURE.md)
188
+ - [Security policy](https://github.com/ManagementMO/agent2learn/blob/main/SECURITY.md) · [Disclaimer](https://github.com/ManagementMO/agent2learn/blob/main/DISCLAIMER.md) · [Licence](https://github.com/ManagementMO/agent2learn/blob/main/LICENSE) ·
189
+ [Third-party notices](https://github.com/ManagementMO/agent2learn/blob/main/THIRD_PARTY_NOTICES.md)
176
190
 
177
191
  ## Status
178
192
 
179
- Agent2Learn is in active development. This branch targets **0.1.2**; the pinned installers require
180
- that version to be available on PyPI before they can install it. A release-preparation branch is
181
- not evidence of publication. The repository holds the tested implementation of the full v0.1
182
- command surface; publication is gated on the release checks in [docs/LAUNCH.md](docs/LAUNCH.md),
183
- including live same-device authentication records on Windows, macOS, and Linux, and a supervised
184
- upload test before the submission path is enabled in any published build.
193
+ Agent2Learn is available on [PyPI](https://pypi.org/project/agent2learn/).
194
+ The latest [GitHub release](https://github.com/ManagementMO/agent2learn/releases/latest) carries the
195
+ same verified wheel and source distribution. Use one install command above to start guided setup.
196
+ If you are already installed or resuming setup, run `a2l init` in your terminal.
197
+
198
+ The project remains in active development. Release checks are documented in
199
+ [docs/LAUNCH.md](https://github.com/ManagementMO/agent2learn/blob/main/docs/LAUNCH.md), including same-device authentication and a fresh supervised upload
200
+ test before submission capability can be enabled. **LEARN uploads remain disabled in this build.**
185
201
 
186
- Licensed under [Apache-2.0](LICENSE).
202
+ Licensed under [Apache-2.0](https://github.com/ManagementMO/agent2learn/blob/main/LICENSE).
@@ -7,19 +7,19 @@ a durable local vault: original files beside Markdown twins, a stable index, and
7
7
  resolve to ordinary paths and line numbers. Your agent stops guessing about your course and starts
8
8
  quoting it.
9
9
 
10
- > **Walkthrough recording:** not yet attached. It is a release artifact, recorded against the
11
- > synthetic fixture course in `tests/fixtures/` — never against a real account — so no course,
12
- > student, grade, or session data appears in it. Recording it is a launch gate in
13
- > [docs/LAUNCH.md](docs/LAUNCH.md); this README will not link a file that does not exist.
14
-
15
10
  ## Install
16
11
 
17
- Three supported options. Pick one.
12
+ For the measured macOS workflow, repaired defects, PDF coverage gaps, and still-unverified
13
+ human/platform checks, see the [release validation scope](https://github.com/ManagementMO/agent2learn/blob/main/docs/RELEASE_VALIDATION.md).
14
+ Automated cross-platform tests are not a claim that every live login or course conversion works.
15
+
16
+ For most students, use the command for your operating system. In a real terminal it installs
17
+ Agent2Learn and starts guided setup immediately. If you already have uv, use the uv option below.
18
18
 
19
19
  **macOS and Linux**
20
20
 
21
21
  ```bash
22
- curl -fsSL https://raw.githubusercontent.com/ManagementMO/agent2learn/main/install.sh | bash
22
+ (installer="$(curl -fsSL https://raw.githubusercontent.com/ManagementMO/agent2learn/main/install.sh)" && bash -c "$installer")
23
23
  ```
24
24
 
25
25
  **Windows (PowerShell)**
@@ -30,21 +30,35 @@ irm https://raw.githubusercontent.com/ManagementMO/agent2learn/main/install.ps1
30
30
 
31
31
  **Already have [uv](https://docs.astral.sh/uv/)?**
32
32
 
33
+ Bash or zsh:
34
+
33
35
  ```bash
34
- uv tool install agent2learn
35
- a2l init
36
+ uv tool install agent2learn && uv tool run --from agent2learn a2l init
37
+ ```
38
+
39
+ Windows PowerShell:
40
+
41
+ ```powershell
42
+ uv tool install agent2learn; if ($LASTEXITCODE -eq 0) { uv tool run --from agent2learn a2l init } else { throw "Agent2Learn installation failed" }
36
43
  ```
37
44
 
45
+ These uv commands start setup through uv itself, so a newly installed `a2l` does not need to be
46
+ on the current shell's PATH first. `uv tool install agent2learn` remains the install-only command.
47
+
38
48
  These commands install the published package from PyPI, not an unreleased repository checkout.
39
49
  Python 3.11–3.14 is supported. If uv selects an older system Python or your shell cannot find
40
- `a2l`, see [setup troubleshooting](docs/FAQ.md#setup-and-path).
50
+ `a2l`, see [setup troubleshooting](https://github.com/ManagementMO/agent2learn/blob/main/docs/FAQ.md#setup-and-path).
41
51
 
42
- `install.sh` and `install.ps1` install a pinned Agent2Learn (currently 0.1.2), verify that `a2l`
43
- runs, and then **continue straight into interactive `a2l init`** in the same command. If they are
44
- run without a terminal on both ends — in CI, or through a pipe — they stop after verifying and
45
- print the exact next step instead of setting anything up. Neither script needs administrator
46
- rights, and neither creates a vault, installs agent skills, or opens a browser by itself.
47
- Onboarding does those things, after showing you a preview and asking.
52
+ `install.sh` and `install.ps1` install a pinned Agent2Learn release, verify that `a2l` runs,
53
+ and then **continue straight into interactive `a2l init`** in the same command. The
54
+ macOS/Linux launcher waits for a successful download and preserves your terminal for setup prompts.
55
+ If a script runs without a terminal on both ends, such as in CI or a headless agent tool, it stops
56
+ after verification and prints the next step instead of setting anything up.
57
+
58
+ Neither script needs administrator rights or creates a vault, installs agent skills, or opens a
59
+ browser by itself. Onboarding does those things after showing you a preview and asking; you still
60
+ complete LEARN sign-in and Duo yourself. Already-open terminals or agents may need to be restarted
61
+ to pick up the new executable path, but you do not need to repeat completed setup.
48
62
 
49
63
  ### Agent skills
50
64
 
@@ -56,7 +70,7 @@ Separately, `npx skills add ManagementMO/agent2learn` is an optional skills-only
56
70
  skills ecosystem. It **does not install** the `a2l` engine — only the skill documents — so the
57
71
  commands they describe will not exist until you install Agent2Learn itself with one of the three
58
72
  options above. That route also runs a third-party CLI with its own network behaviour; see
59
- [docs/PRIVACY.md](docs/PRIVACY.md).
73
+ [docs/PRIVACY.md](https://github.com/ManagementMO/agent2learn/blob/main/docs/PRIVACY.md).
60
74
 
61
75
  ## Then just ask
62
76
 
@@ -119,7 +133,7 @@ a2l submit COURSE ITEM FILE preview an upload, then require your typed conf
119
133
 
120
134
  Agent2Learn is **not affiliated with, endorsed by, or supported by the University of Waterloo or
121
135
  D2L Corporation**. You are responsible for using it within your course rules and your institution's
122
- policies. See [DISCLAIMER.md](DISCLAIMER.md).
136
+ policies. See [DISCLAIMER.md](https://github.com/ManagementMO/agent2learn/blob/main/DISCLAIMER.md).
123
137
 
124
138
  ## Privacy defaults
125
139
 
@@ -134,26 +148,28 @@ policies. See [DISCLAIMER.md](DISCLAIMER.md).
134
148
 
135
149
  Turning collection off does not delete what is already on disk; `a2l privacy purge` does that, and
136
150
  it previews the exact targets and requires a typed phrase first. Full detail, including every
137
- external request Agent2Learn can make, is in [docs/PRIVACY.md](docs/PRIVACY.md).
151
+ external request Agent2Learn can make, is in [docs/PRIVACY.md](https://github.com/ManagementMO/agent2learn/blob/main/docs/PRIVACY.md).
138
152
 
139
153
  ## Documentation
140
154
 
141
- - [Install guide for agents](docs/install.md) — point your agent here and let it handle setup.
142
- - [Authentication](docs/AUTHENTICATION.md) — the dedicated profile, Duo, expiry, and recovery.
143
- - [Privacy](docs/PRIVACY.md) — what is stored, where, every network action, and how to delete it.
144
- - [FAQ](docs/FAQ.md) — the things that actually go wrong.
145
- - [Porting to another school](docs/PORTING.md) — the `School` protocol and a worked reference.
146
- - [What is deferred, and why](docs/FUTURE.md)
147
- - [Security policy](SECURITY.md) · [Disclaimer](DISCLAIMER.md) · [Licence](LICENSE) ·
148
- [Third-party notices](THIRD_PARTY_NOTICES.md)
155
+ - [Install guide for agents](https://github.com/ManagementMO/agent2learn/blob/main/docs/install.md) — point your agent here and let it handle setup.
156
+ - [Authentication](https://github.com/ManagementMO/agent2learn/blob/main/docs/AUTHENTICATION.md) — the dedicated profile, Duo, expiry, and recovery.
157
+ - [Privacy](https://github.com/ManagementMO/agent2learn/blob/main/docs/PRIVACY.md) — what is stored, where, every network action, and how to delete it.
158
+ - [FAQ](https://github.com/ManagementMO/agent2learn/blob/main/docs/FAQ.md) — the things that actually go wrong.
159
+ - [Porting to another school](https://github.com/ManagementMO/agent2learn/blob/main/docs/PORTING.md) — the `School` protocol and a worked reference.
160
+ - [What is deferred, and why](https://github.com/ManagementMO/agent2learn/blob/main/docs/FUTURE.md)
161
+ - [Security policy](https://github.com/ManagementMO/agent2learn/blob/main/SECURITY.md) · [Disclaimer](https://github.com/ManagementMO/agent2learn/blob/main/DISCLAIMER.md) · [Licence](https://github.com/ManagementMO/agent2learn/blob/main/LICENSE) ·
162
+ [Third-party notices](https://github.com/ManagementMO/agent2learn/blob/main/THIRD_PARTY_NOTICES.md)
149
163
 
150
164
  ## Status
151
165
 
152
- Agent2Learn is in active development. This branch targets **0.1.2**; the pinned installers require
153
- that version to be available on PyPI before they can install it. A release-preparation branch is
154
- not evidence of publication. The repository holds the tested implementation of the full v0.1
155
- command surface; publication is gated on the release checks in [docs/LAUNCH.md](docs/LAUNCH.md),
156
- including live same-device authentication records on Windows, macOS, and Linux, and a supervised
157
- upload test before the submission path is enabled in any published build.
166
+ Agent2Learn is available on [PyPI](https://pypi.org/project/agent2learn/).
167
+ The latest [GitHub release](https://github.com/ManagementMO/agent2learn/releases/latest) carries the
168
+ same verified wheel and source distribution. Use one install command above to start guided setup.
169
+ If you are already installed or resuming setup, run `a2l init` in your terminal.
170
+
171
+ The project remains in active development. Release checks are documented in
172
+ [docs/LAUNCH.md](https://github.com/ManagementMO/agent2learn/blob/main/docs/LAUNCH.md), including same-device authentication and a fresh supervised upload
173
+ test before submission capability can be enabled. **LEARN uploads remain disabled in this build.**
158
174
 
159
- Licensed under [Apache-2.0](LICENSE).
175
+ Licensed under [Apache-2.0](https://github.com/ManagementMO/agent2learn/blob/main/LICENSE).
@@ -1,15 +1,15 @@
1
1
  [project]
2
2
  name = "agent2learn"
3
- version = "0.1.2"
3
+ version = "0.1.6"
4
4
  description = "A local, source-cited course vault for AI agents"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
7
7
  license = "Apache-2.0"
8
8
  license-files = ["LICENSE"]
9
9
  dependencies = [
10
- "typer>=0.15,<1",
10
+ "typer>=0.16,<1",
11
11
  "click>=8.2,<9",
12
- "rich>=13,<15",
12
+ "rich>=13,<16",
13
13
  "requests>=2.32,<3",
14
14
  "platformdirs>=4.2,<5",
15
15
  "keyring>=25,<27",
@@ -38,7 +38,7 @@ dev = [
38
38
  "pytest-cov>=6,<8",
39
39
  "pytest-httpserver>=1.1,<2",
40
40
  "ruff>=0.8,<1",
41
- "mypy>=1.13,<2",
41
+ "mypy>=1.13,<3",
42
42
  "pip-audit>=2.7,<3",
43
43
  "cyclonedx-bom>=5,<8",
44
44
  "detect-secrets>=1.5,<2",
@@ -46,7 +46,7 @@ dev = [
46
46
  ]
47
47
 
48
48
  [build-system]
49
- requires = ["uv_build>=0.11.32,<0.12.0"]
49
+ requires = ["uv_build>=0.11.32,<0.13.0"]
50
50
  build-backend = "uv_build"
51
51
 
52
52
  [tool.ruff]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agent2learn"
3
- version = "0.1.2"
3
+ version = "0.1.6"
4
4
  description = "A local, source-cited course vault for AI agents"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -15,12 +15,12 @@ license-files = ["LICENSE"]
15
15
  # bump requires a release that reruns the 262-PDF acceptance corpus, explains the output
16
16
  # diff, regenerates the golden vault, and verifies bytes on all three operating systems.
17
17
  dependencies = [
18
- "typer>=0.15,<1",
19
- # Typer's command objects are Click groups at runtime. Keep Click explicit rather than
20
- # relying on an incidental transitive dependency (the strict doctor CLI-contract test
21
- # imports ``click.Group`` directly).
18
+ # 0.16 adds Click 8.2+ help compatibility; 0.15 permits an install that crashes on --help.
19
+ "typer>=0.16,<1",
20
+ # Keep Click explicit for older supported Typer versions and CLI-contract typing.
21
+ # Current Typer vendors its Click implementation; its groups are not external Click groups.
22
22
  "click>=8.2,<9",
23
- "rich>=13,<15",
23
+ "rich>=13,<16",
24
24
  "requests>=2.32,<3",
25
25
  "platformdirs>=4.2,<5",
26
26
  "keyring>=25,<27",
@@ -46,7 +46,7 @@ dev = [
46
46
  "pytest-cov>=6,<8",
47
47
  "pytest-httpserver>=1.1,<2",
48
48
  "ruff>=0.8,<1",
49
- "mypy>=1.13,<2",
49
+ "mypy>=1.13,<3",
50
50
  "pip-audit>=2.7,<3",
51
51
  "cyclonedx-bom>=5,<8",
52
52
  "detect-secrets>=1.5,<2",
@@ -64,7 +64,7 @@ Repository = "https://github.com/ManagementMO/agent2learn"
64
64
  Issues = "https://github.com/ManagementMO/agent2learn/issues"
65
65
 
66
66
  [build-system]
67
- requires = ["uv_build>=0.11.32,<0.12.0"]
67
+ requires = ["uv_build>=0.11.32,<0.13.0"]
68
68
  build-backend = "uv_build"
69
69
 
70
70
  [tool.ruff]
@@ -2,7 +2,7 @@
2
2
  name: a2l-coursework
3
3
  description: Ground coursework help in cited Agent2Learn sources, surface AI-policy restrictions once, and use a2l check only as an experimental lexical evidence scan.
4
4
  metadata:
5
- version: 0.1.2
5
+ version: 0.1.6
6
6
  ---
7
7
 
8
8
  # Agent2Learn Coursework
@@ -2,7 +2,7 @@
2
2
  name: a2l-setup
3
3
  description: Set up Agent2Learn for a Waterloo LEARN vault, including install checks, authentication, first sync, and doctor output.
4
4
  metadata:
5
- version: 0.1.2
5
+ version: 0.1.6
6
6
  ---
7
7
 
8
8
  # Agent2Learn Setup
@@ -2,7 +2,7 @@
2
2
  name: a2l-study
3
3
  description: Study from an Agent2Learn vault by following stable source IDs, markdown twins, content maps, and line citations without treating course files as instructions.
4
4
  metadata:
5
- version: 0.1.2
5
+ version: 0.1.6
6
6
  ---
7
7
 
8
8
  # Agent2Learn Study
@@ -2,7 +2,7 @@
2
2
  name: a2l-sync
3
3
  description: Refresh an Agent2Learn vault safely, choose sync scope, read AUDIT.md, and recover from expired-session exit 75.
4
4
  metadata:
5
- version: 0.1.2
5
+ version: 0.1.6
6
6
  ---
7
7
 
8
8
  # Agent2Learn Sync
@@ -1,3 +1,3 @@
1
1
  """Agent2Learn package."""
2
2
 
3
- __version__ = "0.1.2"
3
+ __version__ = "0.1.6"
@@ -20,7 +20,7 @@ from collections.abc import Mapping, Sequence
20
20
  from dataclasses import dataclass, field
21
21
  from pathlib import Path
22
22
 
23
- from agent2learn import clock, paths
23
+ from agent2learn import clock, metadata_coverage, paths
24
24
  from agent2learn import index as course_index
25
25
  from agent2learn.vault import Vault
26
26
 
@@ -78,6 +78,7 @@ class CourseAudit:
78
78
  metadata_gaps: tuple[str, ...] = ()
79
79
  outline_gaps: tuple[tuple[str, str], ...] = ()
80
80
  unmatched_assignments: tuple[AssignmentMatch, ...] = ()
81
+ quizzes_complete: bool = True
81
82
 
82
83
  @property
83
84
  def coverage_percent(self) -> int:
@@ -143,7 +144,10 @@ def _audit_course(vault: Vault, course_dir: Path, rows: Sequence[object]) -> Cou
143
144
  if row.get("status") == "outline_unavailable"
144
145
  )
145
146
  unmatched = _unmatched_assignments(assignments, titles)
146
- metadata_gaps = tuple(gap for gap in (assignments_gap, quizzes_gap) if gap is not None)
147
+ quiz_coverage = metadata_coverage.read_quiz_coverage(course_dir)
148
+ metadata_gaps = tuple(
149
+ gap for gap in (assignments_gap, quizzes_gap, quiz_coverage.gap) if gap is not None
150
+ )
147
151
 
148
152
  first = next((row for row in rows if isinstance(row, Mapping)), {})
149
153
  return CourseAudit(
@@ -161,6 +165,7 @@ def _audit_course(vault: Vault, course_dir: Path, rows: Sequence[object]) -> Cou
161
165
  metadata_gaps=metadata_gaps,
162
166
  outline_gaps=outline_gaps,
163
167
  unmatched_assignments=unmatched,
168
+ quizzes_complete=quiz_coverage.status == "complete" and quizzes_gap is None,
164
169
  )
165
170
 
166
171
 
@@ -295,8 +300,8 @@ def _render(audits: Sequence[CourseAudit], stamp: str) -> str:
295
300
  [
296
301
  "### Metadata gaps",
297
302
  "",
298
- "The local metadata projection could not be read completely; inventory "
299
- "counts below may be incomplete.",
303
+ "Metadata coverage is incomplete or unknown; the records below may be "
304
+ "cached and do not establish the current complete inventory.",
300
305
  "",
301
306
  *[f"- {gap}" for gap in audit.metadata_gaps],
302
307
  "",
@@ -327,10 +332,16 @@ def _render(audits: Sequence[CourseAudit], stamp: str) -> str:
327
332
  ["", "These are external or licensed targets. Open them in LEARN directly.", ""]
328
333
  )
329
334
 
335
+ quiz_inventory = (
336
+ f"- {_plural(audit.quizzes, 'quiz', 'quizzes')}"
337
+ f" ({audit.quizzes_with_due_dates} with due dates)"
338
+ if audit.quizzes_complete
339
+ else f"- Quiz inventory not confirmed; {audit.quizzes} cached quiz record(s)"
340
+ f" ({audit.quizzes_with_due_dates} with due dates)"
341
+ )
330
342
  counts = [
331
343
  f"- {_plural(audit.assignments, 'assignment')}",
332
- f"- {_plural(audit.quizzes, 'quiz', 'quizzes')}"
333
- f" ({audit.quizzes_with_due_dates} with due dates)",
344
+ quiz_inventory,
334
345
  f"- {_plural(audit.media, 'media file')}",
335
346
  ]
336
347
  lines.extend(["### Inventory", "", *counts, ""])
@@ -10,7 +10,7 @@ from urllib.parse import urljoin, urlsplit
10
10
  import requests
11
11
 
12
12
  from agent2learn import __version__, config, paths, session
13
- from agent2learn.errors import AuthenticationError
13
+ from agent2learn.errors import AuthenticationError, BrowserNotFound
14
14
  from agent2learn.schools import School
15
15
 
16
16
  from . import paste
@@ -212,7 +212,10 @@ def _verified_id_from_cdp_result(value: object) -> str | None:
212
212
 
213
213
 
214
214
  def _safe_cdp_error(exc: AuthenticationError) -> str:
215
- """Keep the public auth error generic while retaining a sanitized blocked hostname."""
215
+ """Expose fixed local prerequisite diagnostics, never arbitrary browser exception text."""
216
+
217
+ if isinstance(exc, BrowserNotFound):
218
+ return "Chrome or Edge was not found; install one for dedicated-browser sign-in"
216
219
 
217
220
  prefix = "authentication stopped at undeclared host "
218
221
  raw = str(exc)
@@ -21,7 +21,7 @@ import requests
21
21
  import websocket
22
22
 
23
23
  from agent2learn import config, paths
24
- from agent2learn.errors import AuthenticationError
24
+ from agent2learn.errors import AuthenticationError, BrowserNotFound
25
25
  from agent2learn.schools import School
26
26
  from agent2learn.session import Session
27
27
 
@@ -493,7 +493,7 @@ def locate_browser() -> Path:
493
493
  for candidate in candidates:
494
494
  if paths.long_path(candidate).is_file():
495
495
  return candidate
496
- raise AuthenticationError(
496
+ raise BrowserNotFound(
497
497
  "Chrome or Edge was not found; install one or use the fallback: a2l auth --paste"
498
498
  )
499
499