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.
- {learn_cli-0.5.2 → learn_cli-0.5.3}/CHANGELOG.md +10 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/PKG-INFO +1 -1
- {learn_cli-0.5.2 → learn_cli-0.5.3}/pyproject.toml +1 -1
- {learn_cli-0.5.2 → learn_cli-0.5.3}/uv.lock +1 -1
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/index.js +11 -1
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/test/worker.test.js +11 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/wrangler.toml +6 -6
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/agent-config/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/agent-config/scripts/show.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/ask-colleague/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/ask-colleague/prompts/review.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/ask-colleague/prompts/write.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/recall/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/recall/scripts/recall.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/remember/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/remember/scripts/remember.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/run-tests/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/think/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/think/scripts/think.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/version-bump/SKILL.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills.local.yaml.example +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.devague/current +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.devague/current_plan +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.devague/frames/agentculture-org-learn-is-live-one-learning-hub-in.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.devague/plans/agentculture-org-learn-is-live-one-learning-hub-in.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.flake8 +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.github/workflows/deploy-site.yml +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.github/workflows/publish.yml +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.github/workflows/tests.yml +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.gitignore +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/.markdownlint-cli2.yaml +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/AGENTS.colleague.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/CLAUDE.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/LICENSE +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/README.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/culture.yaml +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/hosting.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/plans/.markdownlint-cli2.yaml +0 -0
- {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
- {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/skill-sources.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/specs/.markdownlint-cli2.yaml +0 -0
- {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
- {learn_cli-0.5.2 → learn_cli-0.5.3}/docs/specs/subject-plugin-contract.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/__init__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/__main__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/__init__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/__init__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/auth.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/cli.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/doctor.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/explain.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/learn.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/mcp.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/next_cmd.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/overview.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/progress.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/record.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/site.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/subject.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/subjects.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_commands/whoami.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_errors.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/cli/_output.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/__init__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/_validate.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/advice.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/doctor.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/error.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/lesson.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/overview.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/practice.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/progress.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/record.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/story.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/story_list.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/contract/schemas/story_read.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/explain/__init__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/explain/catalog.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/front/__init__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/front/_docs.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/front/_driver.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/front/_export.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/__init__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_constants.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_decay.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_models.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_review.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_scoring.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_state.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_streaks.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/motivation/_whatnext.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/__init__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_api.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_auth.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_ledger.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_paths.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_sync.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/profile/_syncstate.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/subjects/__init__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/subjects/conformance.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/subjects/driver.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/learn/subjects/registry.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/.gitignore +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/.nvmrc +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/README.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/astro.config.mjs +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/package-lock.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/package.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/public/apple-touch-icon.png +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/public/favicon.ico +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/public/favicon.svg +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/scripts/check-export-pages.mjs +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/scripts/check-static-auth.mjs +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/Footer.astro +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/Header.astro +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/LearnerPanelOverview.astro +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/LearnerPanelSubject.astro +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/Mark.astro +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/components/PageHero.astro +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/docs/portal.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/docs/subject-plugin-contract.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/docs/subjects.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/meta.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/stories-culture-guide.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/stories-french.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/stories-spanish.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/subjects.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/data/site.ts +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/layouts/Layout.astro +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/lib/api.ts +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/lib/content.ts +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/pages/[subject]/index.astro +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/pages/[subject]/stories/[id]/index.astro +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/pages/index.astro +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/scripts/learner.js +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/styles/global.css +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/tsconfig.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/sonar-project.properties +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/__init__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/conftest.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/e2e/__init__.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/e2e/conftest.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/e2e/test_cli_golden.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/e2e/test_mcp_harness.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/motivation/completed_track_current.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/motivation/completed_track_decayed.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/motivation/cross_subject.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/motivation/single_subject_progression.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/advice.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/doctor.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/error.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/lesson.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/overview.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/practice.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/progress.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/record.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/story.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/story_list.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/payloads/story_read.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/stories/culture-guide-scenario-overloaded-agent.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/stories/french-beginner-le-marche.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/stories/spanish-beginner-la-panaderia.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/subjects/conformant_subject.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/subjects/drifted_subject.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_auth_cli.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_cli.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_cli_faces.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_cli_introspection.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_contract_schemas.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_contract_validator.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_front_app.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_front_driver.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_decay_review.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_extras.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_golden.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_purity.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_scoring.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_streaks.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_motivation_whatnext.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_profile_store.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_progress_next_record.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_site_export.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_story_fixtures.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_subject_doctor.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_subject_driver.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_subject_registry.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tests/test_surfaces_agree.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/.gitignore +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/README.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/api-server.mjs +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/launch_bar.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/package.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/report.py +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/run.sh +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/tools/launch-gate/walk.mjs +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/.gitignore +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/README.md +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/package.json +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/schema.sql +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/auth.js +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/db.js +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/github.js +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/progress.js +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/session.js +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/util.js +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/src/validate.js +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/test/helpers.js +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/test/session.test.js +0 -0
- {learn_cli-0.5.2 → learn_cli-0.5.3}/workers/learn-api/test/validate.test.js +0 -0
- {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.
|
|
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.
|
|
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"
|
|
@@ -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 =
|
|
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
|
|
39
|
-
#
|
|
40
|
-
GITHUB_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 = "
|
|
60
|
-
preview_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 = "
|
|
69
|
+
database_id = "c32b7bf6-b0a8-4c22-86f7-b50b3aa22a2e"
|
|
70
70
|
|
|
71
71
|
# --- Observability ----------------------------------------------------------
|
|
72
72
|
[observability]
|
|
File without changes
|
{learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/agent-config/data/backend-fingerprints.yaml
RENAMED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{learn_cli-0.5.2 → learn_cli-0.5.3}/.claude/skills/communicate/scripts/templates/skill-new-brief.md
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
{learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/docs/subject-plugin-contract.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{learn_cli-0.5.2 → learn_cli-0.5.3}/site-astro/src/content-export/stories-culture-guide.json
RENAMED
|
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
|
|
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
|
{learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/motivation/single_subject_progression.json
RENAMED
|
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
|
{learn_cli-0.5.2 → learn_cli-0.5.3}/tests/fixtures/stories/spanish-beginner-la-panaderia.json
RENAMED
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|