learningfoundry 0.83.0__tar.gz → 0.83.2__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 (123) hide show
  1. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/CHANGELOG.md +24 -0
  2. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/PKG-INFO +3 -3
  3. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/pyproject.toml +12 -3
  4. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/__init__.py +1 -1
  5. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/.gitignore +0 -0
  6. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/LICENSE +0 -0
  7. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/README.md +0 -0
  8. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/docs/specs/nbfoundry/README.md +0 -0
  9. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/docs/specs/pyve/README.md +0 -0
  10. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/docs/specs/quizazz/README.md +0 -0
  11. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/__main__.py +0 -0
  12. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/asset_resolver.py +0 -0
  13. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/cli.py +0 -0
  14. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/config.py +0 -0
  15. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/directives.py +0 -0
  16. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/exceptions.py +0 -0
  17. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/generator.py +0 -0
  18. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/integrations/__init__.py +0 -0
  19. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/integrations/d3foundry_stub.py +0 -0
  20. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/integrations/nbfoundry.py +0 -0
  21. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/integrations/nbfoundry_stub.py +0 -0
  22. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/integrations/protocols.py +0 -0
  23. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/integrations/quizazz.py +0 -0
  24. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/launch.py +0 -0
  25. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/logging_config.py +0 -0
  26. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/parser.py +0 -0
  27. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/pipeline.py +0 -0
  28. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/py.typed +0 -0
  29. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/resolver.py +0 -0
  30. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/schema_extensions.py +0 -0
  31. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/schema_v1.py +0 -0
  32. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/e2e/README.md +0 -0
  33. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/e2e/finish.spec.ts +0 -0
  34. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/e2e/fixtures/curriculum.json +0 -0
  35. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/e2e/global-teardown.ts +0 -0
  36. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/e2e/lifecycle.spec.ts +0 -0
  37. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/e2e/navigation.spec.ts +0 -0
  38. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/e2e/progress.spec.ts +0 -0
  39. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/e2e/reset.spec.ts +0 -0
  40. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/e2e/text-block-bottom.spec.ts +0 -0
  41. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/e2e/video.spec.ts +0 -0
  42. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/package.json +0 -0
  43. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/playwright.config.ts +0 -0
  44. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/pnpm-lock.yaml +0 -0
  45. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/pnpm-workspace.yaml +0 -0
  46. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/app.css +0 -0
  47. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/app.html +0 -0
  48. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/AssessmentBlock.svelte +0 -0
  49. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/AssessmentBlock.test.ts +0 -0
  50. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/ContentBlock.svelte +0 -0
  51. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/ExerciseBlock.svelte +0 -0
  52. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/ExerciseBlock.test.ts +0 -0
  53. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/LessonList.svelte +0 -0
  54. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/LessonList.test.ts +0 -0
  55. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/LessonView.svelte +0 -0
  56. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/LessonView.test.ts +0 -0
  57. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/LockedLessonPlaceholder.svelte +0 -0
  58. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/ModuleList.svelte +0 -0
  59. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/ModuleList.test.ts +0 -0
  60. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/Navigation.svelte +0 -0
  61. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/PlaceholderBlock.svelte +0 -0
  62. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/ProgressBar.svelte +0 -0
  63. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/ProgressDashboard.svelte +0 -0
  64. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/ProgressDashboard.test.ts +0 -0
  65. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/RecordingPausedBanner.svelte +0 -0
  66. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/RecordingPausedBanner.test.ts +0 -0
  67. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/ResetCourseButton.svelte +0 -0
  68. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/ResetCourseButton.test.ts +0 -0
  69. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/TextBlock.observer.test.ts +0 -0
  70. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/TextBlock.svelte +0 -0
  71. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/TextBlock.test.ts +0 -0
  72. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/VideoBlock.svelte +0 -0
  73. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/VideoBlock.test.ts +0 -0
  74. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/VisualizationBlock.svelte +0 -0
  75. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/lesson-view.helpers.ts +0 -0
  76. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/module-list.helpers.ts +0 -0
  77. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/module-list.test.ts +0 -0
  78. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/mount.test.ts +0 -0
  79. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/navigation.helpers.ts +0 -0
  80. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/navigation.test.ts +0 -0
  81. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/components/progress-dashboard.helpers.ts +0 -0
  82. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/db/database.test.ts +0 -0
  83. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/db/database.ts +0 -0
  84. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/db/index.ts +0 -0
  85. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/db/progress.test.ts +0 -0
  86. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/db/progress.ts +0 -0
  87. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/db/user-id.test.ts +0 -0
  88. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/db/user-id.ts +0 -0
  89. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/stores/curriculum.test.ts +0 -0
  90. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/stores/curriculum.ts +0 -0
  91. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/stores/db-init.test.ts +0 -0
  92. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/stores/db-init.ts +0 -0
  93. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/stores/progress.test.ts +0 -0
  94. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/stores/progress.ts +0 -0
  95. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/types/index.ts +0 -0
  96. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/assessment-passed.test.ts +0 -0
  97. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/assessment-passed.ts +0 -0
  98. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/duration.test.ts +0 -0
  99. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/duration.ts +0 -0
  100. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/locking.test.ts +0 -0
  101. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/locking.ts +0 -0
  102. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/markdown-directives.ts +0 -0
  103. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/markdown.test.ts +0 -0
  104. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/markdown.ts +0 -0
  105. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/progress.test.ts +0 -0
  106. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/progress.ts +0 -0
  107. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/lib/utils/viewport-completion.ts +0 -0
  108. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/routes/+layout.svelte +0 -0
  109. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/routes/+layout.ts +0 -0
  110. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/routes/+page.svelte +0 -0
  111. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/routes/[module]/[lesson]/+page.svelte +0 -0
  112. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/routes/[module]/[lesson]/page.test.ts +0 -0
  113. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/routes/[module]/assessment/[id]/+page.svelte +0 -0
  114. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/routes/[module]/assessment/[id]/page.test.ts +0 -0
  115. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/routes/layout.helpers.ts +0 -0
  116. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/routes/layout.scroll.test.ts +0 -0
  117. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/routes/layout.scroll.ts +0 -0
  118. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/src/routes/layout.test.ts +0 -0
  119. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/static/.gitkeep +0 -0
  120. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/svelte.config.js +0 -0
  121. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/test-results/.last-run.json +0 -0
  122. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/tsconfig.json +0 -0
  123. {learningfoundry-0.83.0 → learningfoundry-0.83.2}/src/learningfoundry/sveltekit_template/vite.config.ts +0 -0
@@ -7,6 +7,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.83.2] - 2026-06-18
11
+
12
+ **Single-source the package version** (Story K.k) — build hygiene.
13
+
14
+ ### Changed
15
+
16
+ - **`pyproject.toml` derives the version dynamically from `src/learningfoundry/__init__.py`** via Hatchling (`[project].dynamic = ["version"]` + `[tool.hatch.version]`). `__version__` is now the single source of truth; the version can no longer drift between the two files, and a release bumps **only** `__init__.py`. A new `tests/test_packaging.py` guards the wiring against a silent revert to a static `[project].version`.
17
+
18
+ ## [0.83.1] - 2026-06-18
19
+
20
+ **nbfoundry dependency floor pin** (Story K.j.3) — a bugfix patch after verifying the Option-C integration against the now-published real package.
21
+
22
+ ### Fixed
23
+
24
+ - **`[nbfoundry]` extra floor raised `>=0.1` → `>=0.46.0`.** `0.46.0` is the first nbfoundry release honoring the Option-C `compile_exercise` contract (returns `notebook_source` + banner metadata; consumer-dependency-spec BR-1). A pre-0.46 nbfoundry returns the retired Option-B dict, on which the resolver's `notebook_source` pop raises an opaque `KeyError: 'notebook_source'` at the first `ready` exercise — so the old floor could install a broken combination.
25
+
26
+ ### Added
27
+
28
+ - **Live nbfoundry integration test** (`tests/test_integrations/test_nbfoundry_live.py`, `importorskip`-gated) — replaces mock-only coverage of the contract: real `nbfoundry.compile_exercise` returns the Option-C banner shape with a runnable `marimo.App()` `notebook_source` (and `import torch` as *source text*, never imported at build time), then flows resolver → generator into the staged `exercises/<id>/<id>.py` + `exercises-manifest.json`. `nbfoundry>=0.46.0` added to `requirements-dev.txt`.
29
+
30
+ ### Notes
31
+
32
+ - **Integration spike outcome (clean).** Installing nbfoundry 0.46.0 pulls `marimo` + light markdown/ASGI deps but **no torch / modelfoundry** — confirming the contract's torch-free build-time codegen. The published package honors BR-1 end-to-end.
33
+
10
34
  ## [0.83.0] - 2026-06-18
11
35
 
12
36
  **Option C — live marimo exercises** (Subphase K-2, Stories K.g–K.j). The single release for the subphase: nbfoundry now compiles a `ready` exercise to a runnable **marimo notebook** instead of a static `sections`/`expected_outputs` dict (which rendered as inert source in a `<pre>` — no executed cells, plots, or metrics). learningfoundry stages the notebook + an `exercises-manifest.json` sidecar, ships a learner-side `launch`/`stop` CLI that owns the notebook's lifecycle, and the frontend `ready` renderer becomes a launch banner.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: learningfoundry
3
- Version: 0.83.0
3
+ Version: 0.83.2
4
4
  Summary: A curriculum engine that turns a YAML curriculum definition into a deployable SvelteKit learning application.
5
5
  Project-URL: Homepage, https://github.com/pointmatic/learningfoundry
6
6
  Project-URL: Repository, https://github.com/pointmatic/learningfoundry
@@ -24,9 +24,9 @@ Requires-Dist: click>=8.1
24
24
  Requires-Dist: pydantic>=2.0
25
25
  Requires-Dist: pyyaml>=6.0.3
26
26
  Provides-Extra: nbfoundry
27
- Requires-Dist: nbfoundry>=0.1; extra == 'nbfoundry'
27
+ Requires-Dist: nbfoundry>=0.46; extra == 'nbfoundry'
28
28
  Provides-Extra: quizazz
29
- Requires-Dist: quizazz>=0.1; extra == 'quizazz'
29
+ Requires-Dist: quizazz>=1.4; extra == 'quizazz'
30
30
  Description-Content-Type: text/markdown
31
31
 
32
32
  # learningfoundry
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "learningfoundry"
7
- version = "0.83.0"
7
+ dynamic = ["version"]
8
8
  description = "A curriculum engine that turns a YAML curriculum definition into a deployable SvelteKit learning application."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -32,10 +32,14 @@ dependencies = [
32
32
 
33
33
  [project.optional-dependencies]
34
34
  quizazz = [
35
- "quizazz>=0.1",
35
+ "quizazz>=1.4",
36
36
  ]
37
37
  nbfoundry = [
38
- "nbfoundry>=0.1",
38
+ # >=0.46.0 is the first release honoring the Option-C `compile_exercise`
39
+ # contract (returns `notebook_source` + banner metadata; consumer-
40
+ # dependency-spec BR-1). Pre-0.46 returns the retired Option-B dict, which
41
+ # the resolver's `notebook_source` pop cannot consume (Story K.j.3).
42
+ "nbfoundry>=0.46",
39
43
  ]
40
44
 
41
45
  [project.urls]
@@ -47,6 +51,11 @@ Changelog = "https://github.com/pointmatic/learningfoundry/blob/main/CHANGELOG.m
47
51
  [project.scripts]
48
52
  learningfoundry = "learningfoundry.cli:main"
49
53
 
54
+ # Single-source the package version from `__version__` in the package's
55
+ # `__init__.py` (Story K.k). The default `regex` source reads `__version__`.
56
+ [tool.hatch.version]
57
+ path = "src/learningfoundry/__init__.py"
58
+
50
59
  [tool.hatch.build.targets.wheel]
51
60
  packages = ["src/learningfoundry"]
52
61
 
@@ -1,4 +1,4 @@
1
1
  # Copyright 2026 Pointmatic
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
- __version__ = "0.83.0"
4
+ __version__ = "0.83.2"