learningfoundry 0.2.0__tar.gz → 0.25.0__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 (137) hide show
  1. {learningfoundry-0.2.0 → learningfoundry-0.25.0}/.gitignore +1 -0
  2. learningfoundry-0.25.0/CHANGELOG.md +291 -0
  3. learningfoundry-0.25.0/PKG-INFO +346 -0
  4. learningfoundry-0.25.0/README.md +317 -0
  5. learningfoundry-0.25.0/pyproject.toml +79 -0
  6. {learningfoundry-0.2.0 → learningfoundry-0.25.0}/src/learningfoundry/__init__.py +1 -1
  7. learningfoundry-0.25.0/src/learningfoundry/cli.py +218 -0
  8. learningfoundry-0.25.0/src/learningfoundry/config.py +95 -0
  9. learningfoundry-0.25.0/src/learningfoundry/exceptions.py +40 -0
  10. learningfoundry-0.25.0/src/learningfoundry/generator.py +99 -0
  11. learningfoundry-0.25.0/src/learningfoundry/integrations/d3foundry_stub.py +28 -0
  12. learningfoundry-0.25.0/src/learningfoundry/integrations/nbfoundry_stub.py +31 -0
  13. learningfoundry-0.25.0/src/learningfoundry/integrations/protocols.py +36 -0
  14. learningfoundry-0.25.0/src/learningfoundry/integrations/quizazz.py +50 -0
  15. learningfoundry-0.25.0/src/learningfoundry/logging_config.py +34 -0
  16. learningfoundry-0.25.0/src/learningfoundry/parser.py +116 -0
  17. learningfoundry-0.25.0/src/learningfoundry/pipeline.py +180 -0
  18. learningfoundry-0.25.0/src/learningfoundry/py.typed +0 -0
  19. learningfoundry-0.25.0/src/learningfoundry/resolver.py +293 -0
  20. learningfoundry-0.25.0/src/learningfoundry/schema_v1.py +141 -0
  21. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/package.json +35 -0
  22. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/pnpm-lock.yaml +2046 -0
  23. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/app.css +3 -0
  24. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/app.html +12 -0
  25. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/ContentBlock.svelte +44 -0
  26. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/ExerciseBlock.svelte +35 -0
  27. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/LessonList.svelte +45 -0
  28. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/LessonView.svelte +44 -0
  29. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/ModuleList.svelte +67 -0
  30. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/Navigation.svelte +48 -0
  31. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/PlaceholderBlock.svelte +13 -0
  32. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/ProgressBar.svelte +29 -0
  33. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/ProgressDashboard.svelte +85 -0
  34. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/QuizBlock.svelte +53 -0
  35. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/TextBlock.svelte +16 -0
  36. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/VideoBlock.svelte +28 -0
  37. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/components/VisualizationBlock.svelte +42 -0
  38. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/db/database.ts +118 -0
  39. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/db/index.ts +12 -0
  40. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/db/progress.ts +165 -0
  41. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/stores/curriculum.ts +128 -0
  42. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/types/index.ts +133 -0
  43. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/lib/utils/markdown.ts +13 -0
  44. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/routes/+layout.svelte +51 -0
  45. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/routes/+page.svelte +44 -0
  46. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/src/routes/[module]/[lesson]/+page.svelte +43 -0
  47. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/static/.gitkeep +0 -0
  48. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/svelte.config.js +23 -0
  49. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/tsconfig.json +13 -0
  50. learningfoundry-0.25.0/src/learningfoundry/sveltekit_template/vite.config.ts +9 -0
  51. learningfoundry-0.25.0/sveltekit_template/src/app.css +3 -0
  52. learningfoundry-0.25.0/sveltekit_template/src/app.html +12 -0
  53. learningfoundry-0.25.0/sveltekit_template/src/lib/components/ContentBlock.svelte +44 -0
  54. learningfoundry-0.25.0/sveltekit_template/src/lib/components/ExerciseBlock.svelte +35 -0
  55. learningfoundry-0.25.0/sveltekit_template/src/lib/components/LessonList.svelte +45 -0
  56. learningfoundry-0.25.0/sveltekit_template/src/lib/components/LessonView.svelte +44 -0
  57. learningfoundry-0.25.0/sveltekit_template/src/lib/components/ModuleList.svelte +67 -0
  58. learningfoundry-0.25.0/sveltekit_template/src/lib/components/Navigation.svelte +48 -0
  59. learningfoundry-0.25.0/sveltekit_template/src/lib/components/PlaceholderBlock.svelte +13 -0
  60. learningfoundry-0.25.0/sveltekit_template/src/lib/components/ProgressBar.svelte +29 -0
  61. learningfoundry-0.25.0/sveltekit_template/src/lib/components/ProgressDashboard.svelte +85 -0
  62. learningfoundry-0.25.0/sveltekit_template/src/lib/components/QuizBlock.svelte +53 -0
  63. learningfoundry-0.25.0/sveltekit_template/src/lib/components/TextBlock.svelte +16 -0
  64. learningfoundry-0.25.0/sveltekit_template/src/lib/components/VideoBlock.svelte +28 -0
  65. learningfoundry-0.25.0/sveltekit_template/src/lib/components/VisualizationBlock.svelte +42 -0
  66. learningfoundry-0.25.0/sveltekit_template/src/lib/db/database.ts +118 -0
  67. learningfoundry-0.25.0/sveltekit_template/src/lib/db/index.ts +12 -0
  68. learningfoundry-0.25.0/sveltekit_template/src/lib/db/progress.ts +165 -0
  69. learningfoundry-0.25.0/sveltekit_template/src/lib/stores/curriculum.ts +128 -0
  70. learningfoundry-0.25.0/sveltekit_template/src/lib/types/index.ts +133 -0
  71. learningfoundry-0.25.0/sveltekit_template/src/lib/utils/markdown.ts +13 -0
  72. learningfoundry-0.25.0/sveltekit_template/src/routes/+layout.svelte +51 -0
  73. learningfoundry-0.25.0/sveltekit_template/src/routes/+page.svelte +44 -0
  74. learningfoundry-0.25.0/sveltekit_template/src/routes/[module]/[lesson]/+page.svelte +43 -0
  75. learningfoundry-0.2.0/.github/workflows/publish.yml +0 -49
  76. learningfoundry-0.2.0/.project-guide.yml +0 -5
  77. learningfoundry-0.2.0/.pyve/config +0 -6
  78. learningfoundry-0.2.0/.tool-versions +0 -1
  79. learningfoundry-0.2.0/CHANGELOG.md +0 -23
  80. learningfoundry-0.2.0/PKG-INFO +0 -13
  81. learningfoundry-0.2.0/README.md +0 -19
  82. learningfoundry-0.2.0/docs/project-guide/.metadata.yml +0 -195
  83. learningfoundry-0.2.0/docs/project-guide/developer/best-practices-guide.md +0 -342
  84. learningfoundry-0.2.0/docs/project-guide/developer/brand-descriptions-guide.md +0 -461
  85. learningfoundry-0.2.0/docs/project-guide/developer/codecov-setup-guide.md +0 -181
  86. learningfoundry-0.2.0/docs/project-guide/developer/debug-guide.md +0 -469
  87. learningfoundry-0.2.0/docs/project-guide/developer/landing-page-guide.md +0 -808
  88. learningfoundry-0.2.0/docs/project-guide/developer/production-github-guide.md +0 -437
  89. learningfoundry-0.2.0/docs/project-guide/developer/project-guide.md +0 -452
  90. learningfoundry-0.2.0/docs/project-guide/go.md +0 -233
  91. learningfoundry-0.2.0/docs/project-guide/templates/artifacts/brand-descriptions.md +0 -54
  92. learningfoundry-0.2.0/docs/project-guide/templates/artifacts/concept.md +0 -37
  93. learningfoundry-0.2.0/docs/project-guide/templates/artifacts/features.md +0 -77
  94. learningfoundry-0.2.0/docs/project-guide/templates/artifacts/project-essentials.md +0 -43
  95. learningfoundry-0.2.0/docs/project-guide/templates/artifacts/stories.md +0 -21
  96. learningfoundry-0.2.0/docs/project-guide/templates/artifacts/tech-spec.md +0 -77
  97. learningfoundry-0.2.0/docs/project-guide/templates/llm_entry_point.md +0 -5
  98. learningfoundry-0.2.0/docs/project-guide/templates/modes/_header-common.md +0 -46
  99. learningfoundry-0.2.0/docs/project-guide/templates/modes/_header-cycle.md +0 -4
  100. learningfoundry-0.2.0/docs/project-guide/templates/modes/_header-sequence.md +0 -7
  101. learningfoundry-0.2.0/docs/project-guide/templates/modes/_phase-letters.md +0 -27
  102. learningfoundry-0.2.0/docs/project-guide/templates/modes/archive-stories-mode.md +0 -80
  103. learningfoundry-0.2.0/docs/project-guide/templates/modes/code-test-first-mode.md +0 -58
  104. learningfoundry-0.2.0/docs/project-guide/templates/modes/code-velocity-mode.md +0 -58
  105. learningfoundry-0.2.0/docs/project-guide/templates/modes/debug-mode.md +0 -462
  106. learningfoundry-0.2.0/docs/project-guide/templates/modes/default-mode.md +0 -100
  107. learningfoundry-0.2.0/docs/project-guide/templates/modes/document-brand-mode.md +0 -484
  108. learningfoundry-0.2.0/docs/project-guide/templates/modes/document-landing-mode.md +0 -808
  109. learningfoundry-0.2.0/docs/project-guide/templates/modes/plan-concept-mode.md +0 -50
  110. learningfoundry-0.2.0/docs/project-guide/templates/modes/plan-features-mode.md +0 -57
  111. learningfoundry-0.2.0/docs/project-guide/templates/modes/plan-phase-mode.md +0 -75
  112. learningfoundry-0.2.0/docs/project-guide/templates/modes/plan-stories-mode.md +0 -73
  113. learningfoundry-0.2.0/docs/project-guide/templates/modes/plan-tech-spec-mode.md +0 -74
  114. learningfoundry-0.2.0/docs/project-guide/templates/modes/production-mode.md +0 -16
  115. learningfoundry-0.2.0/docs/project-guide/templates/modes/project-scaffold-mode.md +0 -139
  116. learningfoundry-0.2.0/docs/project-guide/templates/modes/refactor-document-mode.md +0 -104
  117. learningfoundry-0.2.0/docs/project-guide/templates/modes/refactor-plan-mode.md +0 -123
  118. learningfoundry-0.2.0/docs/specs/concept.md +0 -140
  119. learningfoundry-0.2.0/docs/specs/d3foundry/dependency-spec.md +0 -334
  120. learningfoundry-0.2.0/docs/specs/d802-curriculum-idea-statement.md +0 -250
  121. learningfoundry-0.2.0/docs/specs/features.md +0 -344
  122. learningfoundry-0.2.0/docs/specs/idea.md +0 -33
  123. learningfoundry-0.2.0/docs/specs/lmentry/features.md +0 -282
  124. learningfoundry-0.2.0/docs/specs/nbfoundry/dependency-spec.md +0 -356
  125. learningfoundry-0.2.0/docs/specs/project-essentials.md +0 -75
  126. learningfoundry-0.2.0/docs/specs/quizazz/concept.md +0 -118
  127. learningfoundry-0.2.0/docs/specs/quizazz/dependency-spec.md +0 -191
  128. learningfoundry-0.2.0/docs/specs/quizazz/features.md +0 -382
  129. learningfoundry-0.2.0/docs/specs/quizazz/tech_spec.md +0 -641
  130. learningfoundry-0.2.0/docs/specs/stories.md +0 -394
  131. learningfoundry-0.2.0/docs/specs/tech-spec.md +0 -1099
  132. learningfoundry-0.2.0/pyproject.toml +0 -43
  133. learningfoundry-0.2.0/src/learningfoundry/cli.py +0 -12
  134. {learningfoundry-0.2.0 → learningfoundry-0.25.0}/LICENSE +0 -0
  135. {learningfoundry-0.2.0 → learningfoundry-0.25.0}/docs/project-guide/README.md +0 -0
  136. {learningfoundry-0.2.0 → learningfoundry-0.25.0}/src/learningfoundry/__main__.py +0 -0
  137. /learningfoundry-0.2.0/src/learningfoundry/py.typed → /learningfoundry-0.25.0/src/learningfoundry/integrations/__init__.py +0 -0
@@ -34,6 +34,7 @@ node_modules/
34
34
  .output/
35
35
  .vercel/
36
36
  .netlify/
37
+ **/sveltekit_template/static/sql-wasm.wasm
37
38
 
38
39
  # TypeScript
39
40
  *.tsbuildinfo
@@ -0,0 +1,291 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.25.0] - 2026-04-15
11
+
12
+ ### Added
13
+
14
+ - `pyproject.toml` — `readme`, `keywords`, `classifiers` (Beta, Apache, Python 3.12, Education, Code Generators, Typed), `[project.urls]` (Homepage, Repository, Bug Tracker, Changelog), `[tool.hatch.build.targets.sdist]` include list
15
+ - `src/learningfoundry/sveltekit_template/` — template copied into package so it ships in the wheel
16
+
17
+ ### Fixed
18
+
19
+ - `src/learningfoundry/generator.py` — `_TEMPLATE_DIR` now uses `Path(__file__).parent / "sveltekit_template"` (was `../../../sveltekit_template`); template now resolves correctly in installed environments
20
+
21
+ ### Verified
22
+
23
+ - `pyve run hatch build` — `dist/learningfoundry-0.25.0-py3-none-any.whl` and `.tar.gz` produced
24
+ - Wheel contains 31 `sveltekit_template/` files
25
+ - `pip install dist/learningfoundry-0.25.0-py3-none-any.whl` in clean venv — `learningfoundry --version` → `0.25.0`; `_TEMPLATE_DIR.exists()` → `True`
26
+ - `pyve test -q` — 195 passed
27
+
28
+ ## [0.24.0] - 2026-04-15
29
+
30
+ ### Added
31
+
32
+ - `README.md` — full user-facing documentation: overview, installation, quick start, CLI reference (build/validate/preview with all flags and exit codes), curriculum YAML format with all 5 block types, configuration file reference, development setup, project structure
33
+
34
+ ## [0.23.0] - 2026-04-15
35
+
36
+ ### Added
37
+
38
+ - `tests/test_smoke_sveltekit.py` — 6 end-to-end smoke tests (marked `smoke`, excluded from default `pyve test` run):
39
+ - `test_pnpm_install_succeeds` — `node_modules/` created
40
+ - `test_pnpm_build_produces_build_dir` — `build/` directory exists
41
+ - `test_build_produces_index_html` — `build/index.html` present
42
+ - `test_curriculum_json_present_in_build` — `build/curriculum.json` copied by vite
43
+ - `test_curriculum_json_valid_in_build` — JSON is valid with 2 modules
44
+ - `test_build_contains_js_assets` — at least one `.js` file in build output
45
+ - `pyproject.toml` — registered `smoke` marker; smoke file excluded from `addopts` so `pyve test` stays fast
46
+ - Smoke tests use `scope="module"` fixtures so `pnpm install` + `pnpm build` run once per session
47
+
48
+ ### Verified
49
+
50
+ - `pyve test tests/test_smoke_sveltekit.py -v` — 6 passed in ~13 s
51
+ - `pyve test -q` — 195 passed (smoke excluded, fast)
52
+ - `ruff check .` and `mypy src/` — clean
53
+
54
+ ## [0.22.0] - 2026-04-15
55
+
56
+ ### Added
57
+
58
+ - `pyproject.toml [tool.mypy]` — `strict = true`, `python_version = "3.12"`, `[[tool.mypy.overrides]]` for `quizazz_builder` (`ignore_missing_imports = true`)
59
+ - `pyproject.toml [tool.ruff.lint]` — expanded select to `["E", "F", "I", "UP", "W", "B"]` (adds pycodestyle warnings + flake8-bugbear)
60
+ - Installed `mypy` and `types-PyYAML` into testenv
61
+
62
+ ### Fixed
63
+
64
+ - `src/learningfoundry/integrations/quizazz.py` — removed stale `# type: ignore[import-untyped]`; now covered by mypy overrides
65
+ - `scripts/spike_e2e.py` — removed unused `shutil` import
66
+
67
+ ### Verified
68
+
69
+ - `pyve testenv run ruff check .` — 0 errors (with W + B rules)
70
+ - `pyve testenv run mypy src/` — 0 errors (16 source files, strict)
71
+ - `pyve test -q` — 195 passed
72
+
73
+ ## [0.21.0] - 2026-04-15
74
+
75
+ ### Added
76
+
77
+ - `tests/test_edge_cases.py` — 22 new tests across 6 classes:
78
+ - `TestEmptyCurriculum` — schema rejects empty modules/lessons; generator handles zero-module `ResolvedCurriculum`; `run_validate` returns False for empty-module YAML; lesson-with-no-blocks resolves fine
79
+ - `TestAllBlockTypesTogether` — all 5 block types resolved in order; all are `ResolvedContentBlock`; `curriculum.json` contains all 5 types
80
+ - `TestLargeCurriculum` — 5 modules × 4 lessons; all modules/lessons resolved; generated JSON counts correct; spot-check text content
81
+ - `TestIntegrationRunBuild` — full `run_build` with fixture curriculum (all block types) through real generator; `curriculum.json` has 2 modules; mod-01 has all 5 block types; `package.json` present
82
+ - `TestValidateResolutionErrors` — missing text-block file returns False with error; error message includes location context
83
+ - `TestOptionalFields` — missing `description` defaults to `""`; missing assessments resolve to `None`
84
+
85
+ ### Verified
86
+
87
+ - `pyve test` — 195 passed, 0 failed
88
+
89
+ ## [0.20.0] - 2026-04-15
90
+
91
+ ### Added
92
+
93
+ - `src/learningfoundry/cli.py` — `preview` subcommand: calls `run_preview()`, accepts `--port` (default 5173), prints `http://localhost:{port}` on success; same error/exit-code handling as `build`
94
+ - `tests/test_cli.py` — 6 new preview tests: help, delegation to `run_preview`, URL output, default port, validation error exit, generation error exit (21 total CLI tests)
95
+
96
+ ## [0.19.0] - 2026-04-15
97
+
98
+ ### Added
99
+
100
+ - `src/learningfoundry/cli.py` — `build` subcommand (parse→resolve→generate, `--config`, `--output`, `--base-dir`, `--log-level`); `validate` subcommand (parse→resolve only, reports OK/errors); exit codes 1=validation, 2=resolution, 3=generation, 4=config
101
+ - `tests/test_cli.py` — 15 tests: `--help`/`--version`, build success/error paths, validate OK/invalid/missing/config-error
102
+ - `tests/conftest.py` — `reset_learningfoundry_logger` autouse fixture; fixes caplog isolation across all test modules
103
+
104
+ ### Fixed
105
+
106
+ - Cross-module `caplog` interference caused by `setup_logging()` leaving handlers on the `learningfoundry` logger — now reset after every test via `conftest.py`
107
+
108
+ ## [0.18.0] - 2026-04-15
109
+
110
+ ### Added
111
+
112
+ - `sveltekit_template/src/lib/components/LessonView.svelte` — renders all content blocks for a lesson, marks lesson in-progress on mount, marks complete on nav-next, propagates quiz scores
113
+ - `sveltekit_template/src/routes/+layout.svelte` — app shell: sidebar (`ModuleList`) + main content slot; loads module progress from SQLite reactively
114
+ - `sveltekit_template/src/routes/+page.svelte` — landing page with `ProgressDashboard`
115
+ - `sveltekit_template/src/routes/[module]/[lesson]/+page.svelte` — lesson route; syncs URL params to curriculum store; renders `LessonView`
116
+
117
+ ### Verified
118
+
119
+ - `pnpm exec svelte-check` — 0 errors, 0 warnings
120
+ - `pnpm build` — full adapter-static build succeeds; all routes compiled
121
+
122
+ ## [0.17.0] - 2026-04-15
123
+
124
+ ### Added
125
+
126
+ - `sveltekit_template/src/lib/components/ProgressBar.svelte` — accessible progress bar with clamped percent and optional label
127
+ - `sveltekit_template/src/lib/components/LessonList.svelte` — lesson list with status icons (✓/…/○) and active highlight
128
+ - `sveltekit_template/src/lib/components/ModuleList.svelte` — collapsible module sidebar with per-module `ProgressBar`; auto-expands active module via `$effect`
129
+ - `sveltekit_template/src/lib/components/Navigation.svelte` — prev/next lesson buttons using `lucide-svelte` chevrons; "Finish" on last lesson; fires `onComplete`
130
+ - `sveltekit_template/src/lib/components/ProgressDashboard.svelte` — overall + per-module progress bars, pre/post assessment scores, start/continue/complete actions
131
+
132
+ ### Verified
133
+
134
+ - `pnpm exec svelte-check` — 0 errors, 0 warnings
135
+
136
+ ## [0.16.0] - 2026-04-15
137
+
138
+ ### Added
139
+
140
+ - `sveltekit_template/src/lib/utils/markdown.ts` — `renderMarkdown()` using `marked`
141
+ - `sveltekit_template/src/lib/components/PlaceholderBlock.svelte` — generic "coming soon" placeholder
142
+ - `sveltekit_template/src/lib/components/TextBlock.svelte` — renders markdown via `{@html}` with `$derived`
143
+ - `sveltekit_template/src/lib/components/VideoBlock.svelte` — YouTube embed (converts watch/youtu.be URLs to embed URLs)
144
+ - `sveltekit_template/src/lib/components/QuizBlock.svelte` — quizazz manifest placeholder; writes score to SQLite on complete
145
+ - `sveltekit_template/src/lib/components/ExerciseBlock.svelte` — renders exercise content or stub placeholder
146
+ - `sveltekit_template/src/lib/components/VisualizationBlock.svelte` — renders SVG/image or stub placeholder
147
+ - `sveltekit_template/src/lib/components/ContentBlock.svelte` — type dispatcher for all block types
148
+ - `sveltekit_template/package.json` — added `marked ^18.0.0`
149
+
150
+ ### Verified
151
+
152
+ - `pnpm exec svelte-check` — 0 errors, 0 warnings
153
+
154
+ ## [0.15.0] - 2026-04-15
155
+
156
+ ### Added
157
+
158
+ - `sveltekit_template/src/lib/db/database.ts` — sql.js init with WASM locator, IndexedDB persistence (`getDb()`, `persistDb()`), DDL for `lesson_progress`, `quiz_scores`, `exercise_status`
159
+ - `sveltekit_template/src/lib/db/progress.ts` — `markLessonComplete()`, `markLessonInProgress()`, `getLessonProgress()`, `saveQuizScore()`, `getQuizScore()`, `updateExerciseStatus()`, `getModuleProgress()`
160
+ - `sveltekit_template/src/lib/db/index.ts` — barrel re-export
161
+ - `sveltekit_template/package.json` — `postinstall` script copies `sql-wasm.wasm` to `static/`; added `@types/sql.js ^1.4.11`
162
+ - `sveltekit_template/static/.gitkeep` — tracks static dir in git
163
+ - `.gitignore` — ignores `sveltekit_template/static/sql-wasm.wasm`
164
+
165
+ ### Verified
166
+
167
+ - `pnpm exec svelte-check` — 0 errors
168
+
169
+ ## [0.14.0] - 2026-04-15
170
+
171
+ ### Added
172
+
173
+ - `sveltekit_template/src/lib/types/index.ts` — all TypeScript interfaces: `TextContent`, `VideoContent`, `QuizManifest`, `QuizQuestion`, `QuizAnswer`, `ExerciseContent`, `VisualizationContent`, `ContentBlock`, `Lesson`, `Module`, `Curriculum`, `LessonProgress`, `QuizScore`, `ModuleProgress`, `CurriculumProgress`
174
+ - `sveltekit_template/src/lib/stores/curriculum.ts` — `curriculum` readable (loads `curriculum.json`), `currentPosition` writable, derived stores `modules`, `currentModule`, `currentLesson`, `lessonSequence`, `currentIndex`, `previousLesson`, `nextLesson`, and `navigateTo/navigateNext/navigatePrev` helpers
175
+
176
+ ### Verified
177
+
178
+ - `pnpm exec svelte-kit sync && pnpm exec svelte-check` — 0 errors
179
+
180
+ ## [0.13.0] - 2026-04-15
181
+
182
+ ### Added
183
+
184
+ - `sveltekit_template/package.json` — full deps: `svelte@^5`, `@sveltejs/kit@^2`, `@sveltejs/adapter-static@^3`, `sql.js`, `lucide-svelte`; devDeps: `typescript`, `tailwindcss@^4`, `@tailwindcss/vite`, `vite@^8`, `@sveltejs/vite-plugin-svelte@^7`, `vitest@^3`, `prettier`, `prettier-plugin-svelte`, `svelte-check`
185
+ - `sveltekit_template/svelte.config.js` — `adapter-static` with `vitePreprocess()`, `fallback: 'index.html'`
186
+ - `sveltekit_template/vite.config.ts` — `tailwindcss()` + `sveltekit()` plugins
187
+ - `sveltekit_template/tsconfig.json` — strict TypeScript config extending `.svelte-kit/tsconfig.json`
188
+ - `sveltekit_template/src/app.html` — SvelteKit shell with `%sveltekit.head%` and `%sveltekit.body%`
189
+ - `sveltekit_template/src/app.css` — Tailwind v4 `@import 'tailwindcss'`
190
+
191
+ ### Verified
192
+
193
+ - `pnpm install && pnpm build` succeeds in `sveltekit_template/` (vite 8.0.8, adapter-static output to `build/`)
194
+
195
+ ## [0.12.0] - 2026-04-15
196
+
197
+ ### Added
198
+
199
+ - `src/learningfoundry/generator.py` — `generate_app()`: atomically copies `sveltekit_template/` to output dir, writes `curriculum.json` to `static/`; overwrites with warning; raises `GenerationError` if template is missing
200
+ - `sveltekit_template/package.json`, `sveltekit_template/svelte.config.js` — minimal template stubs (expanded in D.a)
201
+ - `tests/test_generator.py` — 11 tests covering output structure, `curriculum.json` content, overwrite behavior, and missing template
202
+
203
+ ### Fixed
204
+
205
+ - `tests/test_exceptions.py` — added `teardown_method` to `TestLoggingSetup` to restore `learningfoundry` logger state, fixing `caplog` interference in cross-module test runs
206
+
207
+ ## [0.11.0] - 2026-04-15
208
+
209
+ ### Added
210
+
211
+ - `src/learningfoundry/pipeline.py` — `run_build()`, `run_validate()`, `run_preview()` orchestrating parse → resolve → generate; `run_validate()` returns `(bool, list[str])` without generating; `run_preview()` runs `pnpm install` + `pnpm run dev`
212
+ - `tests/test_pipeline.py` — 11 tests covering end-to-end build, generator injection, error propagation, validate-only mode, and error capture
213
+ - `tests/fixtures/content/mod-01/lesson-01.md`, `tests/fixtures/content/mod-02/lesson-02.md` — stub markdown content for fixture curriculum
214
+
215
+ ## [0.10.0] - 2026-04-15
216
+
217
+ ### Added
218
+
219
+ - `src/learningfoundry/resolver.py` — `resolve_curriculum()` with `ResolvedCurriculum`, `ResolvedModule`, `ResolvedLesson`, `ResolvedContentBlock` dataclasses; resolves text (markdown read), video (URL pass-through), quiz/exercise/visualization (provider delegation), and pre/post assessments; raises `ContentResolutionError` with block location context
220
+ - `tests/test_resolver.py` — 16 tests covering all block types, missing files, empty markdown warning, provider delegation, error wrapping with location, and assessment resolution
221
+
222
+ ## [0.9.0] - 2026-04-15
223
+
224
+ ### Added
225
+
226
+ - `src/learningfoundry/integrations/quizazz.py` — `QuizazzProvider` delegating to `quizazz_builder.compile_assessment()`; wraps all errors in `IntegrationError`; raises `ImportError` with install instructions if `quizazz-builder` is not installed
227
+ - `tests/test_integrations/test_quizazz.py` — 8 tests covering delegation, return value, error wrapping, error chaining, and missing package
228
+
229
+ ## [0.8.0] - 2026-04-15
230
+
231
+ ### Added
232
+
233
+ - `src/learningfoundry/integrations/__init__.py` — integrations package
234
+ - `src/learningfoundry/integrations/protocols.py` — `QuizProvider`, `ExerciseProvider`, `VisualizationProvider` Protocol classes
235
+ - `src/learningfoundry/integrations/nbfoundry_stub.py` — `NbfoundryStub` returning placeholder `ExerciseContent` dict with `"status": "stub"`
236
+ - `src/learningfoundry/integrations/d3foundry_stub.py` — `D3foundryStub` returning placeholder `VisualizationContent` dict with `"status": "stub"`
237
+ - `tests/test_integrations/test_nbfoundry_stub.py` — 12 tests verifying stub structure matches `ExerciseContent` TypeScript interface
238
+ - `tests/test_integrations/test_d3foundry_stub.py` — 13 tests verifying stub structure matches `VisualizationContent` TypeScript interface
239
+
240
+ ## [0.7.0] - 2026-04-15
241
+
242
+ ### Added
243
+
244
+ - `src/learningfoundry/parser.py` — `parse_curriculum()` and `_dispatch_parser()`: loads YAML, extracts version, dispatches to schema, raises `CurriculumVersionError` / `CurriculumValidationError` on failure
245
+ - `tests/test_parser.py` — 13 tests covering valid parsing, missing/null/unsupported/malformed version, malformed YAML, schema errors, and missing file
246
+
247
+ ## [0.6.0] - 2026-04-15
248
+
249
+ ### Added
250
+
251
+ - `src/learningfoundry/schema_v1.py` — Pydantic v1 curriculum schema: all block types (`TextBlock`, `VideoBlock`, `QuizBlock`, `ExerciseBlock`, `VisualizationBlock`), `Lesson`, `Module`, `CurriculumDef`, `CurriculumV1` with validators for IDs, YouTube URLs, uniqueness, and minimum counts
252
+ - `tests/fixtures/valid-curriculum.yml` — full fixture curriculum exercising all block types and assessments
253
+ - `tests/test_schema_v1.py` — 35 tests covering valid parsing, all block types, invalid URLs, ID format, duplicate IDs, and missing required fields
254
+
255
+ ## [0.5.0] - 2026-04-15
256
+
257
+ ### Added
258
+
259
+ - `src/learningfoundry/config.py` — `LoggingConfig`, `AppConfig` dataclasses and `load_config()` with CLI > config file > defaults precedence
260
+ - `tests/test_config.py` — 16 tests covering defaults, file overrides, CLI overrides, malformed YAML, and unknown key warnings
261
+
262
+ ## [0.4.0] - 2026-04-15
263
+
264
+ ### Added
265
+
266
+ - `src/learningfoundry/exceptions.py` — full exception hierarchy: `LearningFoundryError`, `ConfigError`, `CurriculumVersionError`, `CurriculumValidationError`, `ContentResolutionError`, `IntegrationError`, `GenerationError`
267
+ - `src/learningfoundry/logging_config.py` — `setup_logging(level, output)` using stdlib `logging`
268
+ - `tests/test_exceptions.py` — 17 tests covering hierarchy, string representations, and logging setup
269
+
270
+ ## [0.3.0] - 2026-04-15
271
+
272
+ ### Added
273
+
274
+ - `scripts/spike_e2e.py` — throwaway end-to-end spike: YAML parse → content resolve → SvelteKit skeleton generation
275
+ - `scripts/fixtures/spike-curriculum.yml` — minimal 1-module/1-lesson fixture curriculum
276
+ - `scripts/fixtures/content/lesson-01.md` — stub markdown content for the spike
277
+
278
+ ## [0.2.0] - 2026-04-15
279
+
280
+ ### Added
281
+
282
+ - `.github/workflows/publish.yml` — publishes sdist + wheel to PyPI on `v*` tag push via OIDC trusted publishing
283
+
284
+ ## [0.1.0] - 2026-04-15
285
+
286
+ ### Added
287
+
288
+ - `src/learningfoundry/__init__.py` with `__version__ = "0.1.0"`
289
+ - `src/learningfoundry/py.typed` PEP 561 marker
290
+ - `src/learningfoundry/cli.py` Click entry point with `--version` flag
291
+ - `src/learningfoundry/__main__.py` enabling `python -m learningfoundry`
@@ -0,0 +1,346 @@
1
+ Metadata-Version: 2.4
2
+ Name: learningfoundry
3
+ Version: 0.25.0
4
+ Summary: A curriculum engine that turns a YAML curriculum definition into a deployable SvelteKit learning application.
5
+ Project-URL: Homepage, https://github.com/pointmatic/learningfoundry
6
+ Project-URL: Repository, https://github.com/pointmatic/learningfoundry
7
+ Project-URL: Bug Tracker, https://github.com/pointmatic/learningfoundry/issues
8
+ Project-URL: Changelog, https://github.com/pointmatic/learningfoundry/blob/main/CHANGELOG.md
9
+ Author: Pointmatic
10
+ License-Expression: Apache-2.0
11
+ License-File: LICENSE
12
+ Keywords: curriculum,education,elearning,lms,sveltekit
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Education
16
+ Classifier: License :: OSI Approved :: Apache Software License
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Education
20
+ Classifier: Topic :: Software Development :: Code Generators
21
+ Classifier: Typing :: Typed
22
+ Requires-Python: >=3.12
23
+ Requires-Dist: click>=8.1
24
+ Requires-Dist: pydantic>=2.0
25
+ Requires-Dist: pyyaml>=6.0
26
+ Provides-Extra: quizazz
27
+ Requires-Dist: quizazz-builder>=0.1; extra == 'quizazz'
28
+ Description-Content-Type: text/markdown
29
+
30
+ # learningfoundry
31
+
32
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
33
+ [![Python](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org)
34
+
35
+ A curriculum engine that turns a YAML curriculum definition into a deployable SvelteKit learning application — with interactive assessments, executable notebooks, and data visualizations — in a single pipeline.
36
+
37
+ ---
38
+
39
+ ## Table of Contents
40
+
41
+ - [Overview](#overview)
42
+ - [Installation](#installation)
43
+ - [Quick Start](#quick-start)
44
+ - [CLI Reference](#cli-reference)
45
+ - [Curriculum YAML Format](#curriculum-yaml-format)
46
+ - [Configuration File](#configuration-file)
47
+ - [Development Setup](#development-setup)
48
+
49
+ ---
50
+
51
+ ## Overview
52
+
53
+ `learningfoundry` takes a single `curriculum.yml` file and generates a fully self-contained [SvelteKit](https://kit.svelte.dev/) learning application. The generated app supports:
54
+
55
+ - **Text** — Markdown content rendered in the browser
56
+ - **Video** — YouTube embeds
57
+ - **Quiz** — Interactive assessments via [quizazz-builder](https://github.com/pointmatic/quizazz-builder) (optional)
58
+ - **Exercise** — Executable notebooks via nbfoundry (stub provided)
59
+ - **Visualization** — D3-based charts via d3foundry (stub provided)
60
+
61
+ Learner progress is persisted locally in SQLite (via sql.js) — no backend required.
62
+
63
+ ---
64
+
65
+ ## Installation
66
+
67
+ ```bash
68
+ pip install learningfoundry
69
+ ```
70
+
71
+ **With optional quizazz support:**
72
+
73
+ ```bash
74
+ pip install "learningfoundry[quizazz]"
75
+ ```
76
+
77
+ **Requirements:**
78
+
79
+ - Python 3.12+
80
+ - [pnpm](https://pnpm.io) (for `preview` command and generated app development)
81
+ - Node.js 18+ (for the generated SvelteKit app)
82
+
83
+ ---
84
+
85
+ ## Quick Start
86
+
87
+ 1. **Create a curriculum file** (see [Curriculum YAML Format](#curriculum-yaml-format)):
88
+
89
+ ```bash
90
+ cat > curriculum.yml << 'EOF'
91
+ version: "1.0.0"
92
+ curriculum:
93
+ title: "My Course"
94
+ description: "A short description."
95
+ modules:
96
+ - id: mod-01
97
+ title: "Module One"
98
+ lessons:
99
+ - id: lesson-01
100
+ title: "Getting Started"
101
+ content_blocks:
102
+ - type: text
103
+ ref: content/lesson-01.md
104
+ - type: video
105
+ url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
106
+ EOF
107
+ ```
108
+
109
+ 2. **Validate** the curriculum:
110
+
111
+ ```bash
112
+ learningfoundry validate
113
+ # OK — curriculum is valid.
114
+ ```
115
+
116
+ 3. **Build** the SvelteKit app:
117
+
118
+ ```bash
119
+ learningfoundry build
120
+ # Build complete → dist/
121
+ ```
122
+
123
+ 4. **Preview** locally (builds then starts a dev server):
124
+
125
+ ```bash
126
+ learningfoundry preview
127
+ # Preview server started at http://localhost:5173
128
+ ```
129
+
130
+ ---
131
+
132
+ ## CLI Reference
133
+
134
+ ### `learningfoundry build`
135
+
136
+ Parse → resolve → generate a SvelteKit project.
137
+
138
+ ```
139
+ Usage: learningfoundry build [OPTIONS]
140
+
141
+ Options:
142
+ -c, --config PATH Path to the curriculum YAML file. [default: curriculum.yml]
143
+ --log-level LEVEL Logging verbosity. [default: INFO]
144
+ Choices: DEBUG, INFO, WARNING, ERROR
145
+ -o, --output PATH Output directory for the generated SvelteKit project.
146
+ [default: dist]
147
+ --base-dir PATH Base directory for content refs.
148
+ (default: curriculum file's parent directory)
149
+ --help Show this message and exit.
150
+ ```
151
+
152
+ **Exit codes:**
153
+
154
+ | Code | Meaning |
155
+ |------|---------|
156
+ | 0 | Success |
157
+ | 1 | Curriculum validation error |
158
+ | 2 | Content resolution error (missing file, bad URL, etc.) |
159
+ | 3 | SvelteKit generation error |
160
+ | 4 | Configuration file error |
161
+
162
+ ---
163
+
164
+ ### `learningfoundry validate`
165
+
166
+ Validate a curriculum YAML without generating any output.
167
+
168
+ ```
169
+ Usage: learningfoundry validate [OPTIONS]
170
+
171
+ Options:
172
+ -c, --config PATH Path to the curriculum YAML file. [default: curriculum.yml]
173
+ --log-level LEVEL Logging verbosity. [default: INFO]
174
+ --base-dir PATH Base directory for resolving content refs.
175
+ --help Show this message and exit.
176
+ ```
177
+
178
+ Prints `OK — curriculum is valid.` on success, or a list of errors and exits with code 1.
179
+
180
+ ---
181
+
182
+ ### `learningfoundry preview`
183
+
184
+ Build then launch a local Vite dev server.
185
+
186
+ ```
187
+ Usage: learningfoundry preview [OPTIONS]
188
+
189
+ Options:
190
+ -c, --config PATH Path to the curriculum YAML file. [default: curriculum.yml]
191
+ --log-level LEVEL Logging verbosity. [default: INFO]
192
+ -o, --output PATH Output directory for the generated SvelteKit project.
193
+ [default: dist]
194
+ --base-dir PATH Base directory for content refs.
195
+ --port INTEGER Port for the local dev server. [default: 5173]
196
+ --help Show this message and exit.
197
+ ```
198
+
199
+ Runs `pnpm install` and `pnpm run dev` in the generated project directory. Requires `pnpm` on `PATH`.
200
+
201
+ ---
202
+
203
+ ## Curriculum YAML Format
204
+
205
+ ```yaml
206
+ version: "1.0.0"
207
+
208
+ curriculum:
209
+ title: "Course Title" # required
210
+ description: "Course overview." # optional
211
+
212
+ modules:
213
+ - id: mod-01 # required, kebab-case
214
+ title: "Module One" # required
215
+ description: "..." # optional
216
+
217
+ # Optional pre/post assessments (requires quizazz-builder)
218
+ pre_assessment:
219
+ source: quizazz
220
+ ref: assessments/mod-01-pre.yml
221
+
222
+ post_assessment:
223
+ source: quizazz
224
+ ref: assessments/mod-01-post.yml
225
+
226
+ lessons:
227
+ - id: lesson-01 # required, kebab-case; unique within module
228
+ title: "Lesson One" # required
229
+
230
+ content_blocks:
231
+
232
+ # Text block — Markdown file
233
+ - type: text
234
+ ref: content/mod-01/lesson-01.md
235
+
236
+ # Video block — YouTube URL only
237
+ - type: video
238
+ url: "https://www.youtube.com/watch?v=XXXXXXXXXXX"
239
+
240
+ # Quiz block — requires learningfoundry[quizazz]
241
+ - type: quiz
242
+ source: quizazz
243
+ ref: assessments/mod-01-quiz.yml
244
+
245
+ # Exercise block — requires nbfoundry (stub included)
246
+ - type: exercise
247
+ source: nbfoundry
248
+ ref: exercises/mod-01-exercise.yml
249
+
250
+ # Visualization block — requires d3foundry (stub included)
251
+ - type: visualization
252
+ source: d3foundry
253
+ ref: visualizations/mod-01-vis.yml
254
+ ```
255
+
256
+ **Rules:**
257
+
258
+ - Module and lesson `id` values must be unique within their scope, and match the pattern `[a-z0-9][a-z0-9-]*`.
259
+ - Every curriculum must have at least one module; every module at least one lesson.
260
+ - All `ref` paths are resolved relative to `--base-dir` (default: directory containing the curriculum YAML).
261
+ - Only YouTube URLs are accepted for `video` blocks (`youtube.com/watch?v=` or `youtu.be/`).
262
+
263
+ ---
264
+
265
+ ## Configuration File
266
+
267
+ An optional config file can set defaults for logging. The CLI always takes precedence.
268
+
269
+ **Default location:** `~/.config/learningfoundry/config.yml`
270
+
271
+ ```yaml
272
+ logging:
273
+ level: INFO # DEBUG | INFO | WARNING | ERROR
274
+ output: stdout # stdout | stderr
275
+ ```
276
+
277
+ Pass a custom config location with `-c / --config`.
278
+
279
+ ---
280
+
281
+ ## Development Setup
282
+
283
+ ### Prerequisites
284
+
285
+ - Python 3.12+
286
+ - [pyve](https://github.com/pointmatic/pyve) (virtual env manager used in this project)
287
+ - pnpm 9+ and Node.js 18+
288
+
289
+ ### Setup
290
+
291
+ ```bash
292
+ git clone https://github.com/pointmatic/learningfoundry.git
293
+ cd learningfoundry
294
+
295
+ # Create the Python environment and install the package in editable mode
296
+ pyve init
297
+ pip install -e .
298
+
299
+ # Create the test runner environment and install dev dependencies
300
+ pyve testenv --init
301
+ pyve testenv --install -r requirements-dev.txt
302
+ ```
303
+
304
+ ### Running Tests
305
+
306
+ ```bash
307
+ # Fast unit + integration tests (~2 min)
308
+ pyve test
309
+
310
+ # End-to-end SvelteKit smoke tests (requires pnpm, ~15 s extra)
311
+ pyve test tests/test_smoke_sveltekit.py -v
312
+ ```
313
+
314
+ ### Linting and Type Checking
315
+
316
+ ```bash
317
+ pyve testenv run ruff check .
318
+ pyve testenv run mypy src/
319
+ ```
320
+
321
+ ### Project Structure
322
+
323
+ ```
324
+ learningfoundry/
325
+ ├── src/learningfoundry/
326
+ │ ├── cli.py # Click CLI entry point
327
+ │ ├── config.py # Configuration loading
328
+ │ ├── exceptions.py # Exception hierarchy
329
+ │ ├── generator.py # SvelteKit project generator
330
+ │ ├── integrations/ # Quiz / exercise / visualization providers
331
+ │ ├── logging_config.py # Logging setup
332
+ │ ├── parser.py # YAML parser + version dispatch
333
+ │ ├── pipeline.py # run_build / run_validate / run_preview
334
+ │ ├── resolver.py # Content reference resolver
335
+ │ └── schema_v1.py # Pydantic v1 curriculum schema
336
+ ├── sveltekit_template/ # SvelteKit app template (copied on build)
337
+ ├── tests/ # pytest test suite
338
+ ├── requirements-dev.txt # Dev dependencies
339
+ └── pyproject.toml # Build config, ruff, mypy, pytest settings
340
+ ```
341
+
342
+ ---
343
+
344
+ ## License
345
+
346
+ Apache 2.0 — see [LICENSE](LICENSE).