learn-cli 0.5.2__tar.gz → 0.5.3__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 (238) hide show
  1. {learn_cli-0.5.2 → learn_cli-0.5.3}/CHANGELOG.md +10 -0
  2. {learn_cli-0.5.2 → learn_cli-0.5.3}/PKG-INFO +1 -1
  3. {learn_cli-0.5.2 → learn_cli-0.5.3}/pyproject.toml +1 -1
  4. {learn_cli-0.5.2 → learn_cli-0.5.3}/uv.lock +1 -1
  5. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/index.js +11 -1
  6. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/test/worker.test.js +11 -0
  7. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/wrangler.toml +6 -6
  8. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/agent-config/SKILL.md +0 -0
  9. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  10. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/agent-config/scripts/show.sh +0 -0
  11. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/ask-colleague/SKILL.md +0 -0
  12. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  13. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  14. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  15. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  16. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  17. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  18. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/SKILL.md +0 -0
  19. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  20. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  21. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  22. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  23. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  24. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/SKILL.md +0 -0
  25. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  26. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  27. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  28. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  29. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  30. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  31. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  32. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  33. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  34. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  35. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/recall/SKILL.md +0 -0
  36. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/recall/scripts/recall.sh +0 -0
  37. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/remember/SKILL.md +0 -0
  38. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/remember/scripts/remember.sh +0 -0
  39. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/run-tests/SKILL.md +0 -0
  40. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/run-tests/scripts/test.sh +0 -0
  41. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/sonarclaude/SKILL.md +0 -0
  42. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  43. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  44. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  45. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/think/SKILL.md +0 -0
  46. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/think/scripts/think.sh +0 -0
  47. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/version-bump/SKILL.md +0 -0
  48. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/version-bump/scripts/bump.py +0 -0
  49. {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills.local.yaml.example +0 -0
  50. {learn_cli-0.5.2 → learn_cli-0.5.3}/.devague/current +0 -0
  51. {learn_cli-0.5.2 → learn_cli-0.5.3}/.devague/current_plan +0 -0
  52. {learn_cli-0.5.2 → learn_cli-0.5.3}/.devague/frames/agentculture-org-learn-is-live-one-learning-hub-in.json +0 -0
  53. {learn_cli-0.5.2 → learn_cli-0.5.3}/.devague/plans/agentculture-org-learn-is-live-one-learning-hub-in.json +0 -0
  54. {learn_cli-0.5.2 → learn_cli-0.5.3}/.flake8 +0 -0
  55. {learn_cli-0.5.2 → learn_cli-0.5.3}/.github/workflows/deploy-site.yml +0 -0
  56. {learn_cli-0.5.2 → learn_cli-0.5.3}/.github/workflows/publish.yml +0 -0
  57. {learn_cli-0.5.2 → learn_cli-0.5.3}/.github/workflows/tests.yml +0 -0
  58. {learn_cli-0.5.2 → learn_cli-0.5.3}/.gitignore +0 -0
  59. {learn_cli-0.5.2 → learn_cli-0.5.3}/.markdownlint-cli2.yaml +0 -0
  60. {learn_cli-0.5.2 → learn_cli-0.5.3}/AGENTS.colleague.md +0 -0
  61. {learn_cli-0.5.2 → learn_cli-0.5.3}/CLAUDE.md +0 -0
  62. {learn_cli-0.5.2 → learn_cli-0.5.3}/LICENSE +0 -0
  63. {learn_cli-0.5.2 → learn_cli-0.5.3}/README.md +0 -0
  64. {learn_cli-0.5.2 → learn_cli-0.5.3}/culture.yaml +0 -0
  65. {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/hosting.md +0 -0
  66. {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/plans/.markdownlint-cli2.yaml +0 -0
  67. {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/plans/2026-07-10-agentculture-org-learn-is-live-one-learning-hub-in.md +0 -0
  68. {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/skill-sources.md +0 -0
  69. {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/specs/.markdownlint-cli2.yaml +0 -0
  70. {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/specs/2026-07-10-agentculture-org-learn-is-live-one-learning-hub-in.md +0 -0
  71. {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/specs/subject-plugin-contract.md +0 -0
  72. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/__init__.py +0 -0
  73. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/__main__.py +0 -0
  74. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/__init__.py +0 -0
  75. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/__init__.py +0 -0
  76. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/auth.py +0 -0
  77. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/cli.py +0 -0
  78. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/doctor.py +0 -0
  79. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/explain.py +0 -0
  80. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/learn.py +0 -0
  81. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/mcp.py +0 -0
  82. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/next_cmd.py +0 -0
  83. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/overview.py +0 -0
  84. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/progress.py +0 -0
  85. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/record.py +0 -0
  86. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/site.py +0 -0
  87. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/subject.py +0 -0
  88. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/subjects.py +0 -0
  89. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/whoami.py +0 -0
  90. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_errors.py +0 -0
  91. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_output.py +0 -0
  92. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/__init__.py +0 -0
  93. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/_validate.py +0 -0
  94. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/advice.json +0 -0
  95. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/doctor.json +0 -0
  96. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/error.json +0 -0
  97. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/lesson.json +0 -0
  98. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/overview.json +0 -0
  99. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/practice.json +0 -0
  100. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/progress.json +0 -0
  101. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/record.json +0 -0
  102. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/story.json +0 -0
  103. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/story_list.json +0 -0
  104. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/story_read.json +0 -0
  105. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/explain/__init__.py +0 -0
  106. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/explain/catalog.py +0 -0
  107. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/front/__init__.py +0 -0
  108. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/front/_docs.py +0 -0
  109. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/front/_driver.py +0 -0
  110. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/front/_export.py +0 -0
  111. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/__init__.py +0 -0
  112. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_constants.py +0 -0
  113. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_decay.py +0 -0
  114. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_models.py +0 -0
  115. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_review.py +0 -0
  116. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_scoring.py +0 -0
  117. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_state.py +0 -0
  118. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_streaks.py +0 -0
  119. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_whatnext.py +0 -0
  120. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/__init__.py +0 -0
  121. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_api.py +0 -0
  122. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_auth.py +0 -0
  123. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_ledger.py +0 -0
  124. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_paths.py +0 -0
  125. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_sync.py +0 -0
  126. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_syncstate.py +0 -0
  127. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/subjects/__init__.py +0 -0
  128. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/subjects/conformance.py +0 -0
  129. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/subjects/driver.py +0 -0
  130. {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/subjects/registry.json +0 -0
  131. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/.gitignore +0 -0
  132. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/.nvmrc +0 -0
  133. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/README.md +0 -0
  134. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/astro.config.mjs +0 -0
  135. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/package-lock.json +0 -0
  136. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/package.json +0 -0
  137. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/public/apple-touch-icon.png +0 -0
  138. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/public/favicon.ico +0 -0
  139. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/public/favicon.svg +0 -0
  140. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/scripts/check-export-pages.mjs +0 -0
  141. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/scripts/check-static-auth.mjs +0 -0
  142. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/Footer.astro +0 -0
  143. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/Header.astro +0 -0
  144. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/LearnerPanelOverview.astro +0 -0
  145. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/LearnerPanelSubject.astro +0 -0
  146. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/Mark.astro +0 -0
  147. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/PageHero.astro +0 -0
  148. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/docs/portal.md +0 -0
  149. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/docs/subject-plugin-contract.md +0 -0
  150. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/docs/subjects.md +0 -0
  151. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/meta.json +0 -0
  152. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/stories-culture-guide.json +0 -0
  153. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/stories-french.json +0 -0
  154. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/stories-spanish.json +0 -0
  155. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/subjects.json +0 -0
  156. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/data/site.ts +0 -0
  157. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/layouts/Layout.astro +0 -0
  158. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/lib/api.ts +0 -0
  159. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/lib/content.ts +0 -0
  160. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/pages/[subject]/index.astro +0 -0
  161. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/pages/[subject]/stories/[id]/index.astro +0 -0
  162. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/pages/index.astro +0 -0
  163. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/scripts/learner.js +0 -0
  164. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/styles/global.css +0 -0
  165. {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/tsconfig.json +0 -0
  166. {learn_cli-0.5.2 → learn_cli-0.5.3}/sonar-project.properties +0 -0
  167. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/__init__.py +0 -0
  168. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/conftest.py +0 -0
  169. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/e2e/__init__.py +0 -0
  170. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/e2e/conftest.py +0 -0
  171. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/e2e/test_cli_golden.py +0 -0
  172. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/e2e/test_mcp_harness.py +0 -0
  173. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/motivation/completed_track_current.json +0 -0
  174. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/motivation/completed_track_decayed.json +0 -0
  175. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/motivation/cross_subject.json +0 -0
  176. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/motivation/single_subject_progression.json +0 -0
  177. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/advice.json +0 -0
  178. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/doctor.json +0 -0
  179. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/error.json +0 -0
  180. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/lesson.json +0 -0
  181. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/overview.json +0 -0
  182. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/practice.json +0 -0
  183. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/progress.json +0 -0
  184. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/record.json +0 -0
  185. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/story.json +0 -0
  186. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/story_list.json +0 -0
  187. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/story_read.json +0 -0
  188. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/stories/culture-guide-scenario-overloaded-agent.json +0 -0
  189. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/stories/french-beginner-le-marche.json +0 -0
  190. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/stories/spanish-beginner-la-panaderia.json +0 -0
  191. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/subjects/conformant_subject.py +0 -0
  192. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/subjects/drifted_subject.py +0 -0
  193. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_auth_cli.py +0 -0
  194. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_cli.py +0 -0
  195. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_cli_faces.py +0 -0
  196. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_cli_introspection.py +0 -0
  197. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_contract_schemas.py +0 -0
  198. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_contract_validator.py +0 -0
  199. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_front_app.py +0 -0
  200. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_front_driver.py +0 -0
  201. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_decay_review.py +0 -0
  202. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_extras.py +0 -0
  203. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_golden.py +0 -0
  204. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_purity.py +0 -0
  205. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_scoring.py +0 -0
  206. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_streaks.py +0 -0
  207. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_whatnext.py +0 -0
  208. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_profile_store.py +0 -0
  209. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_progress_next_record.py +0 -0
  210. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_site_export.py +0 -0
  211. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_story_fixtures.py +0 -0
  212. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_subject_doctor.py +0 -0
  213. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_subject_driver.py +0 -0
  214. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_subject_registry.py +0 -0
  215. {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_surfaces_agree.py +0 -0
  216. {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/.gitignore +0 -0
  217. {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/README.md +0 -0
  218. {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/api-server.mjs +0 -0
  219. {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/launch_bar.py +0 -0
  220. {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/package.json +0 -0
  221. {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/report.py +0 -0
  222. {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/run.sh +0 -0
  223. {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/walk.mjs +0 -0
  224. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/.gitignore +0 -0
  225. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/README.md +0 -0
  226. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/package.json +0 -0
  227. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/schema.sql +0 -0
  228. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/auth.js +0 -0
  229. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/db.js +0 -0
  230. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/github.js +0 -0
  231. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/progress.js +0 -0
  232. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/session.js +0 -0
  233. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/util.js +0 -0
  234. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/validate.js +0 -0
  235. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/test/helpers.js +0 -0
  236. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/test/session.test.js +0 -0
  237. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/test/validate.test.js +0 -0
  238. {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/wrangler.signedout.toml +0 -0
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/). This project
6
6
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.5.3] - 2026-07-11
9
+
10
+ ### Added
11
+
12
+ - Phase-2 signed-in tier provisioned + deployed: KV namespace SESSIONS + D1 learn-ledger (schema applied), GITHUB_CLIENT_ID wired, SESSION_SECRET + GITHUB_CLIENT_SECRET set as worker secrets. learn-api now serves the full stack (sessions, ledger, tutoring broker) on the same agentculture.org/learn/* route.
13
+
14
+ ### Fixed
15
+
16
+ - Worker OAuth login built `redirect_uri` from the bare origin (`https://agentculture.org/api/auth/callback`), dropping the `/learn` zone-mount prefix — GitHub would reject the web flow on redirect_uri mismatch and the bare callback would miss the worker route entirely. `handleLogin` now derives the callback from `APP_URL` via `callbackUrl()`; regression test asserts the `/learn` prefix.
17
+
8
18
  ## [0.5.2] - 2026-07-11
9
19
 
10
20
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: learn-cli
3
- Version: 0.5.2
3
+ Version: 0.5.3
4
4
  Summary: A CLI, MCP server, and web front for learning — a hosted site where humans and agents learn a subject step by step. Fronts the french-cli and spanish-cli language tutors, and generalizes to other learnable domains such as leading teams of agents. The learn command is the local operator surface and how agents drive it.
5
5
  Project-URL: Homepage, https://github.com/agentculture/learn-cli
6
6
  Project-URL: Issues, https://github.com/agentculture/learn-cli/issues
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "learn-cli"
3
- version = "0.5.2"
3
+ version = "0.5.3"
4
4
  description = "A CLI, MCP server, and web front for learning — a hosted site where humans and agents learn a subject step by step. Fronts the french-cli and spanish-cli language tutors, and generalizes to other learnable domains such as leading teams of agents. The learn command is the local operator surface and how agents drive it."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -474,7 +474,7 @@ wheels = [
474
474
 
475
475
  [[package]]
476
476
  name = "learn-cli"
477
- version = "0.5.2"
477
+ version = "0.5.3"
478
478
  source = { editable = "." }
479
479
  dependencies = [
480
480
  { name = "agentfront", extra = ["mcp"] },
@@ -125,7 +125,7 @@ function handleHealth(env) {
125
125
  function handleLogin(request, env) {
126
126
  requireConfig(env, "GITHUB_CLIENT_ID");
127
127
  const url = new URL(request.url);
128
- const redirectUri = `${publicOrigin(env, url)}/api/auth/callback`;
128
+ const redirectUri = callbackUrl(env, url);
129
129
  const state = crypto.randomUUID();
130
130
  return redirect(authorizeUrl(env, redirectUri, state), {
131
131
  "Set-Cookie": cookie("oauth_state", state, { maxAge: 600, sameSite: "Lax" }),
@@ -311,6 +311,16 @@ function publicOrigin(env, url) {
311
311
  return env.PUBLIC_URL ? env.PUBLIC_URL.replace(/\/+$/, "") : url.origin;
312
312
  }
313
313
 
314
+ // The GitHub OAuth callback URL. It MUST carry the /learn zone-mount prefix so
315
+ // it (a) matches the GitHub app's registered callback and (b) routes back to
316
+ // THIS worker (agentculture.org/learn/*) rather than org's Pages site at the
317
+ // bare origin. APP_URL is the mount root (".../learn/") and the callback lives
318
+ // under it; fall back to origin + /learn/ when APP_URL is unset (local/dev).
319
+ function callbackUrl(env, url) {
320
+ const base = (env.APP_URL || `${publicOrigin(env, url)}/learn/`).replace(/\/+$/, "");
321
+ return `${base}/api/auth/callback`;
322
+ }
323
+
314
324
  async function readJson(request) {
315
325
  try {
316
326
  return await request.json();
@@ -281,6 +281,17 @@ test("GET /api/auth/login redirects to GitHub with a state cookie", async () =>
281
281
  assert.ok(res.headers.getSetCookie().some((c) => c.startsWith("oauth_state=")));
282
282
  });
283
283
 
284
+ test("login redirect_uri carries the /learn mount prefix (matches the GitHub app callback)", async () => {
285
+ // Regression: the callback must include /learn or GitHub rejects the flow
286
+ // (redirect_uri mismatch) AND the bare-origin callback would miss this
287
+ // worker's zone route and hit org's Pages site instead.
288
+ const env = makeEnv({ APP_URL: "https://agentculture.org/learn/" });
289
+ const res = await call(env, new Request(`${BASE}/learn/api/auth/login`));
290
+ assert.equal(res.status, 302);
291
+ const redirectUri = new URL(res.headers.get("Location")).searchParams.get("redirect_uri");
292
+ assert.equal(redirectUri, "https://agentculture.org/learn/api/auth/callback");
293
+ });
294
+
284
295
  test("GET /api/auth/callback exchanges code, upserts learner, sets session", async () => {
285
296
  const fetchStub = makeFetchStub({
286
297
  [GH.token]: () => jsonResp({ access_token: "gho_web", token_type: "bearer" }),
@@ -35,9 +35,9 @@ routes = [
35
35
  # (an OpenAI-shaped HTTP API), NEVER a bespoke provider SDK. The broker only
36
36
  # ever POSTs JSON to this URL. Leave it unset to disable tutoring (broker 503s).
37
37
  [vars]
38
- # GITHUB_CLIENT_ID is public; still REPLACE_ME until the GitHub OAuth app exists
39
- # (needed only for the signed-in tier see README "Phase 2").
40
- GITHUB_CLIENT_ID = "REPLACE_ME_github_oauth_client_id"
38
+ # GITHUB_CLIENT_ID is public (the OAuth/GitHub-App client id). The matching
39
+ # GITHUB_CLIENT_SECRET is set via `wrangler secret put`, never committed.
40
+ GITHUB_CLIENT_ID = "Ov23liX8uNduVkEqVeQB"
41
41
  PUBLIC_URL = "https://agentculture.org" # origin used to build the OAuth callback
42
42
  APP_URL = "https://agentculture.org/learn/" # where the web callback redirects post-login
43
43
  CORS_ORIGIN = "https://agentculture.org" # allow the /learn site to call the API with creds
@@ -56,8 +56,8 @@ PAGES_ORIGIN = "https://agentculture-learn.pages.dev" # static-site origin the
56
56
  # codes. Create with: wrangler kv namespace create SESSIONS
57
57
  [[kv_namespaces]]
58
58
  binding = "SESSIONS"
59
- id = "REPLACE_ME_kv_namespace_id"
60
- preview_id = "REPLACE_ME_kv_preview_namespace_id"
59
+ id = "9b32092755154bb5a1a72e1b92102254"
60
+ preview_id = "11ce3873085a4cee89fb791e0be901ab"
61
61
 
62
62
  # --- D1: learner ledger -----------------------------------------------------
63
63
  # learners (id, display_name, state) + records (append-only recorded results).
@@ -66,7 +66,7 @@ preview_id = "REPLACE_ME_kv_preview_namespace_id"
66
66
  [[d1_databases]]
67
67
  binding = "DB"
68
68
  database_name = "learn-ledger"
69
- database_id = "REPLACE_ME_d1_database_id"
69
+ database_id = "c32b7bf6-b0a8-4c22-86f7-b50b3aa22a2e"
70
70
 
71
71
  # --- Observability ----------------------------------------------------------
72
72
  [observability]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes