codemble 0.3.0__tar.gz → 0.4.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 (232) hide show
  1. {codemble-0.3.0 → codemble-0.4.0}/.github/workflows/ci.yml +4 -4
  2. {codemble-0.3.0 → codemble-0.4.0}/.github/workflows/pages.yml +4 -4
  3. {codemble-0.3.0 → codemble-0.4.0}/.gitignore +6 -0
  4. {codemble-0.3.0 → codemble-0.4.0}/CHANGELOG.md +124 -0
  5. {codemble-0.3.0 → codemble-0.4.0}/CLAUDE.md +50 -5
  6. codemble-0.4.0/PKG-INFO +322 -0
  7. codemble-0.4.0/README.md +290 -0
  8. {codemble-0.3.0 → codemble-0.4.0}/TESTING.md +8 -5
  9. {codemble-0.3.0 → codemble-0.4.0}/codemble/__init__.py +1 -1
  10. {codemble-0.3.0 → codemble-0.4.0}/codemble/checks/service.py +56 -12
  11. {codemble-0.3.0 → codemble-0.4.0}/codemble/graph/__init__.py +3 -0
  12. {codemble-0.3.0 → codemble-0.4.0}/codemble/graph/finalize.py +8 -7
  13. {codemble-0.3.0 → codemble-0.4.0}/codemble/graph/layout.py +82 -23
  14. codemble-0.4.0/codemble/graph/mapview.py +315 -0
  15. codemble-0.4.0/codemble/lens/javascript_typescript.py +112 -0
  16. codemble-0.4.0/codemble/lens/python.py +95 -0
  17. codemble-0.4.0/codemble/llm/local_status.py +66 -0
  18. {codemble-0.3.0 → codemble-0.4.0}/codemble/llm/providers.py +91 -1
  19. codemble-0.4.0/codemble/llm/structural.py +127 -0
  20. {codemble-0.3.0 → codemble-0.4.0}/codemble/llm/study.py +114 -34
  21. {codemble-0.3.0 → codemble-0.4.0}/codemble/progress/store.py +44 -7
  22. {codemble-0.3.0 → codemble-0.4.0}/codemble/server/app.py +100 -1
  23. {codemble-0.3.0 → codemble-0.4.0}/codemble/server/runtime.py +9 -1
  24. codemble-0.4.0/codemble/web_dist/assets/index-BHcmQpjd.css +1 -0
  25. codemble-0.4.0/codemble/web_dist/assets/index-DKTfLRbf.js +5352 -0
  26. codemble-0.4.0/codemble/web_dist/index.html +28 -0
  27. codemble-0.4.0/docs/plans/2026-07-19-audience-modes-and-local-narration-design.md +292 -0
  28. codemble-0.4.0/docs/plans/2026-07-19-audience-modes-backend-plan.md +1701 -0
  29. codemble-0.4.0/docs/plans/2026-07-19-audience-modes-frontend-plan.md +539 -0
  30. codemble-0.4.0/docs/releases/checklist.md +35 -0
  31. codemble-0.4.0/docs/releases/v0.4.0.md +118 -0
  32. codemble-0.4.0/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-a.md +3480 -0
  33. codemble-0.4.0/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-b.md +3556 -0
  34. codemble-0.4.0/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-c.md +3905 -0
  35. codemble-0.4.0/docs/superpowers/plans/2026-07-19-galaxy-ux-shared-contract.md +105 -0
  36. codemble-0.4.0/docs/superpowers/specs/2026-07-19-galaxy-ux-overhaul-design.md +352 -0
  37. {codemble-0.3.0 → codemble-0.4.0}/docs-site/astro.config.mjs +2 -0
  38. {codemble-0.3.0 → codemble-0.4.0}/docs-site/package.json +1 -1
  39. codemble-0.4.0/docs-site/public/brand/icons/asterism.svg +6 -0
  40. codemble-0.4.0/docs-site/public/brand/icons/install.svg +5 -0
  41. codemble-0.4.0/docs-site/public/shots/easy-mode.png +0 -0
  42. codemble-0.4.0/docs-site/public/shots/galaxy-lit.png +0 -0
  43. codemble-0.4.0/docs-site/public/shots/galaxy.png +0 -0
  44. codemble-0.4.0/docs-site/public/shots/map-architecture.png +0 -0
  45. codemble-0.4.0/docs-site/public/shots/map-workflow.png +0 -0
  46. codemble-0.4.0/docs-site/public/shots/study-panel.png +0 -0
  47. codemble-0.4.0/docs-site/public/shots/system.png +0 -0
  48. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/architecture.md +7 -1
  49. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/checks-and-lighting.md +20 -1
  50. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/early-testing.md +8 -5
  51. codemble-0.4.0/docs-site/src/content/docs/installation.md +127 -0
  52. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/introduction.md +15 -10
  53. codemble-0.4.0/docs-site/src/content/docs/progress/m12-galaxy-look.md +60 -0
  54. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/quickstart.md +34 -13
  55. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/roadmap.md +4 -2
  56. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/star-chart.md +5 -0
  57. codemble-0.4.0/docs-site/src/content/docs/study-panel.md +74 -0
  58. codemble-0.4.0/docs-site/src/content/docs/the-galaxy.md +129 -0
  59. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/pages/index.astro +57 -22
  60. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/styles/custom.css +70 -0
  61. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/styles/landing.css +61 -0
  62. {codemble-0.3.0 → codemble-0.4.0}/pyproject.toml +19 -2
  63. codemble-0.4.0/tests/conftest.py +30 -0
  64. codemble-0.4.0/tests/fixtures/repeated_calls.py +9 -0
  65. codemble-0.4.0/tests/test_checks.py +306 -0
  66. {codemble-0.3.0 → codemble-0.4.0}/tests/test_graph_finalization.py +39 -0
  67. codemble-0.4.0/tests/test_mapview.py +262 -0
  68. codemble-0.4.0/tests/test_providers.py +260 -0
  69. {codemble-0.3.0 → codemble-0.4.0}/tests/test_python_ast.py +82 -2
  70. codemble-0.4.0/tests/test_server.py +689 -0
  71. codemble-0.4.0/tests/test_structural.py +121 -0
  72. codemble-0.4.0/tests/test_study.py +537 -0
  73. codemble-0.4.0/web/index.html +27 -0
  74. {codemble-0.3.0 → codemble-0.4.0}/web/package-lock.json +2 -2
  75. {codemble-0.3.0 → codemble-0.4.0}/web/package.json +1 -1
  76. codemble-0.4.0/web/scripts/check_graph_data.mjs +149 -0
  77. codemble-0.4.0/web/scripts/check_learner_session.mjs +1779 -0
  78. {codemble-0.3.0 → codemble-0.4.0}/web/src/App.jsx +379 -230
  79. codemble-0.4.0/web/src/GalaxyCanvas.jsx +459 -0
  80. codemble-0.4.0/web/src/GuidanceLayer.jsx +92 -0
  81. codemble-0.4.0/web/src/MapView.jsx +279 -0
  82. codemble-0.4.0/web/src/ModeControl.jsx +112 -0
  83. codemble-0.4.0/web/src/StudyPanel.jsx +390 -0
  84. codemble-0.4.0/web/src/galaxyEffects.js +122 -0
  85. codemble-0.4.0/web/src/galaxyMaterials.js +199 -0
  86. {codemble-0.3.0 → codemble-0.4.0}/web/src/graphData.js +70 -18
  87. codemble-0.4.0/web/src/learnerSession.js +1272 -0
  88. codemble-0.4.0/web/src/main.jsx +58 -0
  89. {codemble-0.3.0 → codemble-0.4.0}/web/src/styles.css +648 -21
  90. codemble-0.4.0/web/src/tokens.css +45 -0
  91. codemble-0.3.0/.hallmark/log.json +0 -37
  92. codemble-0.3.0/.hallmark/preflight.json +0 -9
  93. codemble-0.3.0/.remember/now.md +0 -3
  94. codemble-0.3.0/.remember/tmp/last-ndc.ts +0 -1
  95. codemble-0.3.0/.remember/tmp/last-save-ts +0 -1
  96. codemble-0.3.0/.remember/tmp/last-save.json +0 -1
  97. codemble-0.3.0/.remember/tmp/save-session.pid +0 -1
  98. codemble-0.3.0/.remember/today-2026-07-19.md +0 -10
  99. codemble-0.3.0/PKG-INFO +0 -417
  100. codemble-0.3.0/README.md +0 -194
  101. codemble-0.3.0/codemble/lens/javascript_typescript.py +0 -82
  102. codemble-0.3.0/codemble/lens/python.py +0 -71
  103. codemble-0.3.0/codemble/web_dist/assets/index-DOBVd_-M.css +0 -1
  104. codemble-0.3.0/codemble/web_dist/assets/index-cIG6GGIB.js +0 -5238
  105. codemble-0.3.0/codemble/web_dist/index.html +0 -18
  106. codemble-0.3.0/docs/releases/checklist.md +0 -14
  107. codemble-0.3.0/docs-site/src/content/docs/installation.md +0 -77
  108. codemble-0.3.0/docs-site/src/content/docs/the-galaxy.md +0 -44
  109. codemble-0.3.0/tests/test_checks.py +0 -103
  110. codemble-0.3.0/tests/test_server.py +0 -323
  111. codemble-0.3.0/tests/test_study.py +0 -229
  112. codemble-0.3.0/web/index.html +0 -17
  113. codemble-0.3.0/web/scripts/check_graph_data.mjs +0 -77
  114. codemble-0.3.0/web/scripts/check_learner_session.mjs +0 -417
  115. codemble-0.3.0/web/src/GalaxyCanvas.jsx +0 -235
  116. codemble-0.3.0/web/src/learnerSession.js +0 -681
  117. codemble-0.3.0/web/src/main.jsx +0 -20
  118. codemble-0.3.0/web/src/tokens.css +0 -23
  119. {codemble-0.3.0 → codemble-0.4.0}/.env.example +0 -0
  120. {codemble-0.3.0 → codemble-0.4.0}/.gitattributes +0 -0
  121. {codemble-0.3.0 → codemble-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  122. {codemble-0.3.0 → codemble-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  123. {codemble-0.3.0 → codemble-0.4.0}/.github/ISSUE_TEMPLATE/early_tester.yml +0 -0
  124. {codemble-0.3.0 → codemble-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  125. {codemble-0.3.0 → codemble-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  126. {codemble-0.3.0 → codemble-0.4.0}/.github/dependabot.yml +0 -0
  127. {codemble-0.3.0 → codemble-0.4.0}/.github/workflows/publish-pypi.yml +0 -0
  128. {codemble-0.3.0 → codemble-0.4.0}/AGENTS.md +0 -0
  129. {codemble-0.3.0 → codemble-0.4.0}/CODE_OF_CONDUCT.md +0 -0
  130. {codemble-0.3.0 → codemble-0.4.0}/CONTRIBUTING.md +0 -0
  131. {codemble-0.3.0 → codemble-0.4.0}/LICENSE +0 -0
  132. {codemble-0.3.0 → codemble-0.4.0}/NOTICE +0 -0
  133. {codemble-0.3.0 → codemble-0.4.0}/SECURITY.md +0 -0
  134. {codemble-0.3.0 → codemble-0.4.0}/assets/demo.gif +0 -0
  135. {codemble-0.3.0 → codemble-0.4.0}/codemble/adapters/__init__.py +0 -0
  136. {codemble-0.3.0 → codemble-0.4.0}/codemble/adapters/base.py +0 -0
  137. {codemble-0.3.0 → codemble-0.4.0}/codemble/adapters/discovery.py +0 -0
  138. {codemble-0.3.0 → codemble-0.4.0}/codemble/adapters/project.py +0 -0
  139. {codemble-0.3.0 → codemble-0.4.0}/codemble/adapters/python_ast.py +0 -0
  140. {codemble-0.3.0 → codemble-0.4.0}/codemble/adapters/typescript_tree_sitter.py +0 -0
  141. {codemble-0.3.0 → codemble-0.4.0}/codemble/checks/__init__.py +0 -0
  142. {codemble-0.3.0 → codemble-0.4.0}/codemble/cli.py +0 -0
  143. {codemble-0.3.0 → codemble-0.4.0}/codemble/lens/__init__.py +0 -0
  144. {codemble-0.3.0 → codemble-0.4.0}/codemble/llm/__init__.py +0 -0
  145. {codemble-0.3.0 → codemble-0.4.0}/codemble/progress/__init__.py +0 -0
  146. {codemble-0.3.0 → codemble-0.4.0}/codemble/server/__init__.py +0 -0
  147. {codemble-0.3.0 → codemble-0.4.0}/codemble/web_dist/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  148. {codemble-0.3.0 → codemble-0.4.0}/codemble/web_dist/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  149. {codemble-0.3.0 → codemble-0.4.0}/codemble/web_dist/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  150. {codemble-0.3.0 → codemble-0.4.0}/codemble/web_dist/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  151. {codemble-0.3.0 → codemble-0.4.0}/codemble/web_dist/assets/shippori-mincho-latin-500-normal-C-QwvIb3.woff +0 -0
  152. {codemble-0.3.0 → codemble-0.4.0}/codemble/web_dist/assets/shippori-mincho-latin-500-normal-XI1O8euf.woff2 +0 -0
  153. {codemble-0.3.0 → codemble-0.4.0}/codemble/web_dist/assets/shippori-mincho-latin-700-normal-CkoCYOiI.woff +0 -0
  154. {codemble-0.3.0 → codemble-0.4.0}/codemble/web_dist/assets/shippori-mincho-latin-700-normal-DHcmzUO5.woff2 +0 -0
  155. {codemble-0.3.0 → codemble-0.4.0}/codemble/web_dist/assets/zen-kaku-gothic-new-latin-400-normal-BEdayliK.woff2 +0 -0
  156. {codemble-0.3.0 → codemble-0.4.0}/codemble/web_dist/assets/zen-kaku-gothic-new-latin-400-normal-CPSmNJAU.woff +0 -0
  157. {codemble-0.3.0 → codemble-0.4.0}/docs/adr/README.md +0 -0
  158. {codemble-0.3.0 → codemble-0.4.0}/docs/plans/2026-07-19-install-ux-folder-picker-design.md +0 -0
  159. {codemble-0.3.0 → codemble-0.4.0}/docs/plans/2026-07-19-install-ux-folder-picker-plan.md +0 -0
  160. {codemble-0.3.0 → codemble-0.4.0}/docs/plans/README.md +0 -0
  161. {codemble-0.3.0 → codemble-0.4.0}/docs/plans/phase-1.md +0 -0
  162. {codemble-0.3.0 → codemble-0.4.0}/docs/releases/v0.1.0.md +0 -0
  163. {codemble-0.3.0 → codemble-0.4.0}/docs/releases/v0.2.0.md +0 -0
  164. {codemble-0.3.0 → codemble-0.4.0}/docs/research/README.md +0 -0
  165. {codemble-0.3.0 → codemble-0.4.0}/docs-site/.gitignore +0 -0
  166. {codemble-0.3.0 → codemble-0.4.0}/docs-site/design.md +0 -0
  167. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/favicon-16.png +0 -0
  168. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/favicon-32.png +0 -0
  169. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/icon-180.png +0 -0
  170. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/icon-192.png +0 -0
  171. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/icon-512.png +0 -0
  172. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/icon.svg +0 -0
  173. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/mark-animated.svg +0 -0
  174. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/mark.svg +0 -0
  175. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/plates/hero-chart.svg +0 -0
  176. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/plates/hero-field.svg +0 -0
  177. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/plates/hero-gold.svg +0 -0
  178. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/plates/kasumi-rule.svg +0 -0
  179. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/plates/plate-galaxy.svg +0 -0
  180. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/plates/plate-study.svg +0 -0
  181. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/plates/plate-system.svg +0 -0
  182. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/brand/plates/seal.svg +0 -0
  183. {codemble-0.3.0 → codemble-0.4.0}/docs-site/public/favicon.svg +0 -0
  184. {codemble-0.3.0 → codemble-0.4.0}/docs-site/scripts/build-plates.mjs +0 -0
  185. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/assets/codemble-mark-dark.svg +0 -0
  186. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/assets/codemble-mark-light.svg +0 -0
  187. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/components/Search.astro +0 -0
  188. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/components/Tatebanko.astro +0 -0
  189. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/build-from-source.md +0 -0
  190. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/contributing.md +0 -0
  191. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/correctness.md +0 -0
  192. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/progress/m1-parser.md +0 -0
  193. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/progress/m10-polyglot-release.md +0 -0
  194. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/progress/m2-galaxy.md +0 -0
  195. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/progress/m3-study.md +0 -0
  196. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/progress/m4-lens.md +0 -0
  197. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/progress/m5-checks.md +0 -0
  198. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/progress/m6-release.md +0 -0
  199. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/progress/m8-typescript.md +0 -0
  200. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content/docs/progress/m9-typescript-lens.md +0 -0
  201. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/content.config.ts +0 -0
  202. {codemble-0.3.0 → codemble-0.4.0}/docs-site/src/styles/tokens.css +0 -0
  203. {codemble-0.3.0 → codemble-0.4.0}/scripts/dev.sh +0 -0
  204. {codemble-0.3.0 → codemble-0.4.0}/scripts/record_demo.sh +0 -0
  205. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/concepts_sample.py +0 -0
  206. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/polyglot/python_worker.py +0 -0
  207. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/polyglot/src/broken.ts +0 -0
  208. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/polyglot/src/legacy.js +0 -0
  209. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/polyglot/src/local.js +0 -0
  210. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/polyglot/src/main.ts +0 -0
  211. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/polyglot/src/reexport.ts +0 -0
  212. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/polyglot/src/util.ts +0 -0
  213. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/polyglot/src/widget.tsx +0 -0
  214. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/.gitignore +0 -0
  215. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/ambiguous.py +0 -0
  216. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/api.py +0 -0
  217. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/app.py +0 -0
  218. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/broken.py +0 -0
  219. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/cli.py +0 -0
  220. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/pkg/__init__.py +0 -0
  221. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/pkg/helpers.py +0 -0
  222. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/pkg/service.py +0 -0
  223. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/pkg/util.py +0 -0
  224. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/runner/__main__.py +0 -0
  225. {codemble-0.3.0 → codemble-0.4.0}/tests/fixtures/sampleproj/shared.py +0 -0
  226. {codemble-0.3.0 → codemble-0.4.0}/tests/test_progress.py +0 -0
  227. {codemble-0.3.0 → codemble-0.4.0}/tests/test_project_parser.py +0 -0
  228. {codemble-0.3.0 → codemble-0.4.0}/tests/test_smoke.py +0 -0
  229. {codemble-0.3.0 → codemble-0.4.0}/tests/test_typescript_tree_sitter.py +0 -0
  230. {codemble-0.3.0 → codemble-0.4.0}/web/README.md +0 -0
  231. {codemble-0.3.0 → codemble-0.4.0}/web/scripts/record_demo.mjs +0 -0
  232. {codemble-0.3.0 → codemble-0.4.0}/web/vite.config.js +0 -0
@@ -10,7 +10,7 @@ jobs:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
12
  - uses: actions/checkout@v7
13
- - uses: actions/setup-python@v5
13
+ - uses: actions/setup-python@v6
14
14
  with:
15
15
  python-version: "3.11"
16
16
  - name: Install
@@ -23,7 +23,7 @@ jobs:
23
23
  runs-on: ubuntu-latest
24
24
  steps:
25
25
  - uses: actions/checkout@v7
26
- - uses: actions/setup-node@v4
26
+ - uses: actions/setup-node@v7
27
27
  with:
28
28
  node-version: "22"
29
29
  - name: astro check
@@ -35,7 +35,7 @@ jobs:
35
35
  runs-on: ubuntu-latest
36
36
  steps:
37
37
  - uses: actions/checkout@v7
38
- - uses: actions/setup-node@v4
38
+ - uses: actions/setup-node@v7
39
39
  with:
40
40
  node-version: "22"
41
41
  - name: build web app
@@ -47,7 +47,7 @@ jobs:
47
47
  runs-on: ubuntu-latest
48
48
  steps:
49
49
  - uses: actions/checkout@v7
50
- - uses: actions/setup-python@v5
50
+ - uses: actions/setup-python@v6
51
51
  with:
52
52
  python-version: "3.11"
53
53
  - name: Build wheel and verify packaged SPA
@@ -22,16 +22,16 @@ jobs:
22
22
  runs-on: ubuntu-latest
23
23
  steps:
24
24
  - uses: actions/checkout@v7
25
- - uses: actions/setup-node@v4
25
+ - uses: actions/setup-node@v7
26
26
  with:
27
27
  node-version: "22"
28
- - uses: actions/configure-pages@v5
28
+ - uses: actions/configure-pages@v6
29
29
  - name: Build Astro site
30
30
  run: |
31
31
  cd docs-site
32
32
  npm install
33
33
  npm run build
34
- - uses: actions/upload-pages-artifact@v3
34
+ - uses: actions/upload-pages-artifact@v5
35
35
  with:
36
36
  path: docs-site/dist
37
37
  deploy:
@@ -42,4 +42,4 @@ jobs:
42
42
  url: ${{ steps.deployment.outputs.page_url }}
43
43
  steps:
44
44
  - id: deployment
45
- uses: actions/deploy-pages@v4
45
+ uses: actions/deploy-pages@v5
@@ -28,3 +28,9 @@ logs/
28
28
  .idea/
29
29
  .vscode/
30
30
  _to_delete/
31
+
32
+ # graphify knowledge graph (build artifact, regenerate with: graphify update .)
33
+ graphify-out/
34
+
35
+ # Subagent-driven-development scratch coordination (not product truth)
36
+ .superpowers/
@@ -5,6 +5,130 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) · Versioning:
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.4.0] - 2026-07-20
9
+
10
+ The galaxy read as flat spheres on a plain background, connections were hard to
11
+ follow at any zoom level, and once a project was bound the only way to open a
12
+ different one was killing the server. This release lands the redesign, adds a
13
+ second way to look at the same graph, and puts what the parser already knew on
14
+ screen.
15
+
16
+ ### Added
17
+ - A second **Map** layer beside the galaxy, switchable from the header. Its
18
+ *Architecture* tab lays modules out as boxes grouped by directory and layered
19
+ by import distance from Home; its *Workflow* tab walks the call tree from your
20
+ entrypoint, where the first hop is the `defines` relation the parser recorded
21
+ and deeper hops are `calls`. Both layouts are computed by the parser-backed
22
+ graph layer and served by a new `GET /api/map`, so the map and the galaxy can
23
+ never disagree.
24
+ - The Map layer is plain SVG and needs no WebGL, so a machine that cannot draw
25
+ the galaxy can still read the project.
26
+ - The study panel now shows what the parser knows before any model is asked: a
27
+ structural summary rendered from parser facts through fixed templates, with no
28
+ key, no network, and no provider involved.
29
+ - Grounded narration finally reaches the panel. The explanation endpoint had
30
+ shipped but was never called, so the narration block always rendered empty.
31
+ - A Connections section lists every parser relationship into and out of the
32
+ selected structure, grouped inbound and outbound, each row stating direction,
33
+ certainty, and a `file:line` citation for where that structure is defined —
34
+ plus a small SVG diagram of callers, this structure, and callees. Clicking a
35
+ row opens that structure's study.
36
+ - Local narration through Ollama, so a learner with no API key can still get
37
+ grounded prose without their source leaving the machine. It is explicit
38
+ opt-in (`CODEMBLE_PROVIDER=ollama`, or `provider = "ollama"` in
39
+ `~/.codemble/config`) with no auto-detection, the host is refused at
40
+ construction unless it is plain `http` on loopback, no credential is ever
41
+ sent, and the output passes exactly the same grounding validation as a cloud
42
+ provider. Honest caveat: that validation catches an invented identifier, not
43
+ a wrong claim about a real one, and smaller local models make the second kind
44
+ of mistake more often.
45
+ - Guidance when no model is configured, including the local Ollama path, driven
46
+ by whether a loopback Ollama is actually reachable and which models it has.
47
+ - An Easy/Expert audience toggle in the header. Easy uses plain language for
48
+ narration, check questions, panel labels, Lens notes, and the legend; Expert
49
+ keeps full terminology. The choice persists per project and never changes
50
+ graph truth, coordinates, progress, or how a check is scored.
51
+ - Easy mode opens on the Map, hides galaxy links unrelated to the selected
52
+ structure, and shows a hint chip naming the nearest unlit region to Home. The
53
+ hint is counted in import-route hops over the graph; no model chooses it.
54
+ - Switch project: a header control releases the current project and returns to
55
+ the picker, so a second project no longer needs a terminal.
56
+ - Change Home: the entrypoint picker can be reopened whenever the parser ranked
57
+ at least one candidate, and the Home you select is remembered for the next run
58
+ of the same project.
59
+ - Edge arrowheads below the galaxy level, hover tooltips on every edge naming
60
+ both structures, the relationship, its certainty and the line it was seen on,
61
+ and hover/selection highlighting.
62
+ - First-run coach-marks explain what you see, how to move, and what lights
63
+ stars. Dismissing them is a local UI preference, not progress.
64
+ - A clickable breadcrumb, and a legend naming dim, amber-understood, unchartable
65
+ syntax-error files, certain versus possible relationships, and one swatch per
66
+ language. It describes only the encodings the layer on screen actually draws:
67
+ size and brightness are galaxy-only, language tint appears at galaxy level and
68
+ on the Architecture tab, and the possible-relationship swatch dashes on the Map
69
+ to match the SVG while staying colour-only for the galaxy.
70
+ - Correct check answers now get an affirmation, not just silence.
71
+ - A `<noscript>` message and a React error boundary, so a render failure
72
+ explains itself and offers a reload instead of showing a blank page.
73
+
74
+ ### Changed
75
+ - The galaxy gained depth: nodes carry a canvas-generated halo, an
76
+ `UnrealBloomPass` is tuned so lit amber blooms hard while the unlit ramp
77
+ barely registers, and a background starfield is seeded by hashing the
78
+ project's own file hashes — the same code always produces the same sky.
79
+ - At galaxy level, Python, JavaScript and TypeScript systems sit in a faint
80
+ language-tinted nebula. A system in any other language renders no fog rather
81
+ than borrowing another language's hue.
82
+ - Keyboard focus in the galaxy now carries a visible reticle as well as its
83
+ live text readout.
84
+ - Passing a region's checks plays a 1.2s "nebula dawn" the next time you are at
85
+ galaxy level: amber washes across that system's halo and fog and recedes. The
86
+ lit state is already committed before it runs, so the animation celebrates a
87
+ fact rather than delivering it. `prefers-reduced-motion` skips it entirely and
88
+ goes straight to the finished lit state.
89
+ - System orbits are laid out by call depth instead of by member index, so an
90
+ inner ring means "this runs first". Ring 1 is what the module's entry node
91
+ calls directly plus every member no sibling calls; members no certain call
92
+ reaches keep the outermost ring rather than being placed by guesswork. Only
93
+ certain calls decide placement. Layout coordinates changed once; saved
94
+ progress is unaffected because region signatures derive from file hashes, not
95
+ coordinates.
96
+ - Drifting particles mark **certain** call edges only, at system and study
97
+ level. A possible call stays still, so motion can never imply proof.
98
+ `prefers-reduced-motion` stops them too.
99
+ - Centrality now counts the distinct structures that call a node, not the call
100
+ sites they contain, so a helper hammered from one loop no longer outshines a
101
+ shared utility. The study panel's label follows: "Callers", not "Calls in".
102
+ - The study panel leads with the structural summary and narration, then
103
+ connections, then source and lens notes.
104
+ - The study level keeps the selected structure's connections visible instead of
105
+ dimming the whole scene.
106
+ - A region with no safe check now explains that Codemble refuses to ask a
107
+ question the graph cannot answer, rather than only stating that none exists.
108
+ - The zero-candidate Home screen no longer tells you to restart with a CLI
109
+ flag; every option is in the app.
110
+ - The star chart labels studied counts "this session", which is what they have
111
+ always measured.
112
+
113
+ ### Fixed
114
+ - The partial-parse notice rode a code path that never executed; it now renders
115
+ with the narration block, and the structural summary states it as well.
116
+ - A failed graph load offered only "Restart Codemble and reload this page"; it
117
+ now retries in place.
118
+ - Contributors only: pinned the docs site back to TypeScript 6.x. An automated
119
+ 7.0.2 bump had broken the `astro check` CI gate, because TypeScript's native
120
+ 7.x compiler does not yet expose the programmatic API that check relies on.
121
+
122
+ ## [0.3.1] - 2026-07-19
123
+
124
+ ### Changed
125
+ - Packaging metadata only, no behavior change: added PyPI classifiers (Beta
126
+ status, Python 3.11-3.13, Apache-2.0 license, dev/education audience), moved
127
+ license metadata to the PEP 639 SPDX form so the License field is concise
128
+ instead of dumping the full Apache text, made README links absolute so the
129
+ PyPI project page renders them, and excluded internal tooling directories
130
+ from the sdist.
131
+
8
132
  ## [0.3.0] - 2026-07-19
9
133
 
10
134
  ### Added
@@ -167,7 +167,7 @@ Polish, then the coordinated launch (Show HN / X; lit-galaxy GIF as hero).
167
167
 
168
168
  ## Current State **[AGENT-MAINTAINED]**
169
169
 
170
- **Current milestone: Phase 1 tester evidence** · Last updated: 2026-07-19 ·
170
+ **Current milestone: Phase 1 tester evidence** · Last updated: 2026-07-20 ·
171
171
  Session note: architecture-deepening maintenance is complete after the verified
172
172
  v0.2.0 release; all four report recommendations are merged in phases while issue
173
173
  #13 remains open for human tester evidence. The public site was then redesigned
@@ -182,10 +182,21 @@ repository were affected and no region lost a check. The root README was then
182
182
  restructured around the learning loop, fast tester setup, correctness, and the
183
183
  local/AI boundary. Its top mark now uses self-contained, GitHub-safe motion with
184
184
  a static reduced-motion state; no product or app behavior changed. Bare
185
- `codemble` now serves a one-shot in-app project picker (home-jailed browse +
185
+ `codemble` now serves an in-app project picker (home-jailed browse +
186
186
  recents, Host-header allowlisted) instead of the current directory; README,
187
187
  docs-site, the changelog, and a new PyPI release checklist now lead with
188
- `uvx codemble` ahead of the pending first PyPI publish.
188
+ `uvx codemble` ahead of the pending first PyPI publish. A galaxy UX overhaul
189
+ design was then interviewed and approved (spec
190
+ `docs/superpowers/specs/2026-07-19-galaxy-ux-overhaul-design.md`): three phases —
191
+ light up the shipped-but-inert narration/mode/connections surface plus project
192
+ switching, then the "living cosmos" visual overhaul with a 2D Map layer, then
193
+ ~1,000-file scale with staged parse progress; four Decision Log entries record
194
+ the approved Non-Goal and binding relaxations. Phase A (the narration/mode/
195
+ connections surface and project switching) and Phase B (M12: call-depth
196
+ orbits, the 2D Map layer, and the living-cosmos visual overhaul) have both
197
+ since shipped. Phase C (~1,000-file scale with staged parse progress) has not
198
+ started — there is still no threaded parse or parse-progress screen, and the
199
+ scale cap remains ~300 files.
189
200
 
190
201
  ### M0 — Repo, docs & website scaffold ✅ (2026-07-19)
191
202
  - [x] Root: README, LICENSE (Apache-2.0), CoC, SECURITY, CONTRIBUTING,
@@ -309,6 +320,30 @@ intake avoids repeated discovery; learner transitions are tested above local HTT
309
320
  JS/TS certainty and concept evidence remain parser-proven through the unchanged
310
321
  `LanguageAdapter` interface.
311
322
 
323
+ ### M12 — Living cosmos + 2D map (galaxy UX overhaul, Phase B) ✅ (2026-07-20)
324
+ - [x] System orbits by call depth from the region's entry node, hash-seeded and
325
+ deterministic; layout coordinates changed once, saved progress did not
326
+ - [x] `GET /api/map`: deterministic Architecture and Workflow 2D layouts
327
+ computed in `codemble/graph/`, reading the same graph as `GET /api/graph`
328
+ - [x] A 2D Map layer (Architecture + Workflow tabs) switchable from the header,
329
+ plain SVG, no WebGL dependency
330
+ - [x] Canvas-generated halos, language-tinted nebulae, a hash-seeded starfield,
331
+ composited bloom, and drifting particles on certain call edges only
332
+ - [x] The ~1.2s nebula-dawn light-up moment, with an instantly finished lit
333
+ state under reduced motion
334
+ - [x] Easy mode defaults to the Map with reduced edge density and a
335
+ graph-derived hint chip; Expert defaults to the galaxy; an explicit
336
+ layer choice always beats the mode default
337
+ - [x] First-run coach-marks, a clickable breadcrumb, and a language-tint
338
+ legend key
339
+
340
+ **Acceptance:** the map and the galaxy read one graph and cannot disagree;
341
+ uncertainty renders distinctly in both — colour-only in the 3D galaxy (no
342
+ line-dash support there), genuinely dashed in the 2D map; region signatures
343
+ hash file content, never coordinates, so the orbit relayout did not re-dim any
344
+ region; reduced motion always yields the finished lit state with zero
345
+ animation.
346
+
312
347
  ## Decision Log **[AGENT-MAINTAINED — append only]**
313
348
 
314
349
  | Date | Decision | Why |
@@ -360,14 +395,24 @@ JS/TS certainty and concept evidence remain parser-proven through the unchanged
360
395
  | 2026-07-19 | The root README uses a self-contained animated ensō mark; app icons and favicons remain static | GitHub strips page-level scripting, so motion belongs inside the referenced SVG. The loop is restrained to illumination, transforms, and opacity, and reduced-motion users receive the finished lit state |
361
396
  | 2026-07-19 | Bare `codemble` serves a one-shot in-app project picker (browse + recents) on a single two-phase server; binding is one-shot and the API is home-jailed with a Host-header allowlist | Approved by UD this session: easiest possible run flow for learners without a second server, without free filesystem enumeration, and without changing the one-graph app model |
362
397
  | 2026-07-19 | Codemble publishes to PyPI from the next tagged release; install collapses to `uvx codemble` | Approved by UD this session: the git+tag install was the biggest onboarding hurdle for the target learner |
398
+ | 2026-07-19 | Local models (Ollama) are now allowed, reversing the 2026-07-18 Non-Goal; guardrails: loopback-and-`http`-only enforced at construction, explicit opt-in with no auto-detection, the same grounding validation applied to every provider, and the deterministic Tier 0 summary always available as a floor | Approved by UD this session. Residual risk stated honestly: grounding validation catches an invented identifier, not a wrong claim about a real one, and small local models make that second kind of error more often |
399
+ | 2026-07-19 | A 2D Map layer (architecture + workflow-tree tabs) joins the 3D galaxy behind one switcher, superseding the "no second 2D renderer in v1" Non-Goal; layouts are computed deterministically in the graph layer and React stays a pure SVG renderer | Approved by UD in the galaxy UX overhaul interview (spec `docs/superpowers/specs/2026-07-19-galaxy-ux-overhaul-design.md`); beginners read flat maps more easily and the render-ready graph rule makes the second view cheap and truthful |
400
+ | 2026-07-19 | Scale target raised to ~1,000 supported files with a worker-thread parse, polled staged progress, and an honest loading screen; the subdirectory prompt moves to the new cap | Approved by UD: a deliberate partial pull-forward of Phase 2 scale work; full LOD/clustering stays in Phase 2 |
401
+ | 2026-07-19 | One-shot project binding relaxed to an explicit in-app reset (`POST /api/picker/reset`); home jail and Host allowlist unchanged | Approved by UD: learners must be able to switch projects without killing the server; per-project progress makes switching safe |
402
+ | 2026-07-19 | App art direction is "living cosmos" within the Formal Edo palette: halo sprites, bloom, hash-seeded starfield, language-tinted nebulae, call-depth system orbits (layout bytes change once, still deterministic), and an Easy/Expert UI toggle riding the shipped audience-mode backend | Approved by UD section-by-section; amber keeps its monopoly on understanding, uncertainty stays dashed in both layers, and Easy-mode guidance is graph-deterministic (nearest unlit region by route hops), never model-decided |
403
+ | 2026-07-20 | System orbits are call depth from the module's entry node, with the seed widened to include members no sibling calls | A module node makes no intra-project calls, so the spec's literal seed was always empty and stranded every member in the outermost ring. Both spec rules are preserved: the entry's callees are ring 1, and unreachable members take the outermost ring by node id |
404
+ | 2026-07-20 | The workflow tree's first hop is labelled `defines`, not `calls` | The selected entrypoint is usually a module, and the parser observed no call from a module to its own function. Containment is real parser truth (`Node.region`); relabelling it a call would have invented an edge |
405
+ | 2026-07-20 | Nebula tints ship lighter than the values in the design spec | The spec's starting values measured 3.19–4.46:1 against `--cm-ground-2` and failed the 4.5:1 legend floor. Hue is held; only lightness moved, and all three stay below `--cm-ink-2` so amber's monopoly is intact |
406
+ | 2026-07-20 | Bloom resolution is capped with `composer.setPixelRatio(1)`, not the `UnrealBloomPass` constructor | `EffectComposer.setSize` forwards the canvas size to every pass on resize, overwriting the constructor's `resolution`. The pixel ratio is the cap that survives |
407
+ | 2026-07-20 | **Corrects the row above**: bloom is capped by wrapping the bloom pass's own `setSize`, and the composer keeps the renderer's pixel ratio | The pixel ratio *did* cap bloom, but `EffectComposer.setSize` multiplies it into `renderTarget1/2` and every pass, so the whole scene rendered at 1x and upscaled — measured 1280x611 scene passes on a 2560x1221 buffer at dpr 2. Wrapping the one pass caps the one expensive thing: scene now 2560x1221, bloom mip 0 800x382 (1280x611 uncapped), `?benchmark` at 951 nodes unchanged at 928.8 → 961.5 fps median |
408
+ | 2026-07-20 | **Corrects "binding is one-shot"** (2026-07-19 picker row): binding is one-*at-a-time*. `serve_project` attaches `PickerConfig(browse_root=Path.home())` too, so a `codemble <path>` run also exposes the picker endpoints after a reset, and browse then enumerates non-hidden directories under `$HOME` | The Switch project control has to work without a process restart, which is what that config is for — but the earlier row still claimed a permanent 409 for the path-opened flow, and this file is the source of truth. The home jail and the Host-header allowlist are unchanged; only the "one-shot" claim was false. An app built with no `PickerConfig` at all remains genuinely one-shot and refuses reset |
363
409
 
364
410
  ## Non-Goals — do NOT build (point here when asked)
365
411
 
366
412
  - ❌ Free-flight 3D navigation — semantic zoom only
367
413
  - ❌ XP, streaks, levels, leaderboards
368
- - ❌ A second 2D renderer/toggle in v1 (render-ready graph keeps one possible later)
414
+ - ❌ ~~A second 2D renderer/toggle in v1~~ — superseded 2026-07-19: the 2D Map layer is approved (see Decision Log); free-form/client-computed 2D layouts remain out
369
415
  - ❌ Accounts, cloud hosting, multi-user; share link waits for Phase 3
370
- - ❌ Local models (Ollama)
371
416
  - ❌ Extra quest types before Phase 3
372
417
  - ❌ GitHub-URL ingestion in v1
373
418
  - ❌ Elaborate game art before the loop teaches well
@@ -0,0 +1,322 @@
1
+ Metadata-Version: 2.4
2
+ Name: codemble
3
+ Version: 0.4.0
4
+ Summary: A learning game that turns the code AI wrote for you into a galaxy you light up by understanding it.
5
+ Project-URL: Homepage, https://udhawan97.github.io/Codemble/
6
+ Project-URL: Repository, https://github.com/udhawan97/Codemble
7
+ Author-email: Umang Dhawan <umangdhawan97@gmail.com>
8
+ License-Expression: Apache-2.0
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: Web Environment
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Intended Audience :: Education
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Education
20
+ Classifier: Topic :: Software Development :: Documentation
21
+ Requires-Python: >=3.11
22
+ Requires-Dist: fastapi>=0.115
23
+ Requires-Dist: tree-sitter-javascript<0.26,>=0.25
24
+ Requires-Dist: tree-sitter-typescript<0.24,>=0.23.2
25
+ Requires-Dist: tree-sitter<0.27,>=0.25
26
+ Requires-Dist: uvicorn>=0.30
27
+ Provides-Extra: dev
28
+ Requires-Dist: httpx>=0.27; extra == 'dev'
29
+ Requires-Dist: pytest>=8; extra == 'dev'
30
+ Requires-Dist: ruff>=0.6; extra == 'dev'
31
+ Description-Content-Type: text/markdown
32
+
33
+
34
+ <p align="center">
35
+ <a href="https://udhawan97.github.io/Codemble/">
36
+ <img src="https://github.com/udhawan97/Codemble/raw/main/docs-site/public/brand/mark-animated.svg" alt="Codemble — an open lapis ensō whose amber star systems light up" width="152">
37
+ </a>
38
+ </p>
39
+
40
+ <h1 align="center">Codemble</h1>
41
+
42
+ <p align="center"><strong>Turn AI-built code into a galaxy you actually understand.</strong></p>
43
+
44
+ <p align="center">
45
+ Codemble is a local-first learning game for projects built with Claude Code,
46
+ Codex, and other coding agents. It maps real parser evidence into a 3D galaxy
47
+ and a flat architecture map, then lights each region only after you prove you
48
+ understand it.
49
+ </p>
50
+
51
+ <p align="center"><strong>Your project · Your key · Your machine · No invented structure</strong></p>
52
+
53
+ <p align="center">
54
+ <a href="https://github.com/udhawan97/Codemble/releases/latest"><img src="https://img.shields.io/github/v/release/udhawan97/Codemble?style=flat-square&label=release&color=2b4d96" alt="Latest release"></a>
55
+ <a href="https://github.com/udhawan97/Codemble/actions/workflows/ci.yml"><img src="https://github.com/udhawan97/Codemble/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI status"></a>
56
+ <img src="https://img.shields.io/badge/Python-3.11+-2b4d96?style=flat-square" alt="Python 3.11 or newer">
57
+ <img src="https://img.shields.io/badge/maps-Python_·_JavaScript_·_TypeScript-3f6ac0?style=flat-square" alt="Maps Python, JavaScript, and TypeScript projects">
58
+ <img src="https://img.shields.io/badge/license-Apache_2.0-070b1c?style=flat-square" alt="Apache 2.0 license">
59
+ </p>
60
+
61
+ <p align="center">
62
+ <a href="#quick-start">Quick start</a> ·
63
+ <a href="#how-the-learning-loop-works">Learning loop</a> ·
64
+ <a href="https://udhawan97.github.io/Codemble/">Documentation</a> ·
65
+ <a href="https://github.com/udhawan97/Codemble/blob/main/TESTING.md">Test Codemble</a>
66
+ </p>
67
+
68
+ <p align="center">
69
+ <img src="https://github.com/udhawan97/Codemble/raw/main/docs-site/public/shots/galaxy.png" alt="Codemble at galaxy level: eighty dim star systems parsed from real source, with a legend, language focus buttons, and a notice that two files are unchartable because their parser reported a syntax error" width="960">
70
+ </p>
71
+
72
+ <p align="center"><sub>
73
+ Galaxy level. Every system is one module; size is lines of code, brightness is
74
+ how many distinct structures call it. Files the parser could not read stay
75
+ visible and say so.
76
+ </sub></p>
77
+
78
+ > [!IMPORTANT]
79
+ > **Codemble is in its Phase 1 tester release.** It maps Python,
80
+ > JavaScript, TypeScript, and mixed projects in one parser-proven galaxy,
81
+ > installable straight from PyPI with an in-app project picker. The
82
+ > technical release is complete; unaided learner runs are the evidence still
83
+ > being collected. [Try the ten-minute tester loop](https://github.com/udhawan97/Codemble/blob/main/TESTING.md).
84
+
85
+ ## Quick start
86
+
87
+ Two steps. The first is once per machine; the second is how you run Codemble
88
+ from then on.
89
+
90
+ | | Step | Command |
91
+ | :---: | --- | --- |
92
+ | <img src="https://github.com/udhawan97/Codemble/raw/main/docs-site/public/brand/icons/install.svg" width="22" height="22" alt=""> | **1 · Install uv** — the runner that fetches Codemble on demand | `brew install uv` |
93
+ | <img src="https://github.com/udhawan97/Codemble/raw/main/docs-site/public/brand/icons/asterism.svg" width="22" height="22" alt=""> | **2 · Chart your project** — nothing to install, nothing left behind | `uvx codemble` |
94
+
95
+ <details>
96
+ <summary><strong>Installing uv without Homebrew</strong></summary>
97
+
98
+ ```bash
99
+ # macOS · Linux
100
+ curl -LsSf https://astral.sh/uv/install.sh | sh
101
+
102
+ # Windows (PowerShell)
103
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
104
+ ```
105
+
106
+ Already have `pipx`? You can skip uv entirely: `pipx install codemble`, then run
107
+ `codemble`. Plain `pip install codemble` works too. uv is the recommended path
108
+ because `uvx` runs the current release without adding anything to your system
109
+ Python.
110
+
111
+ </details>
112
+
113
+ Codemble opens your browser — pick your project folder there. To skip the
114
+ picker, pass a path: `codemble ./your-ai-built-project`.
115
+
116
+ The wheel already contains the web app, so Node.js is not required. No API key
117
+ is needed for the galaxy, the map, the structural summary, source viewer,
118
+ language Lens, checks, lighting, or saved progress. Add your own Anthropic or
119
+ OpenAI key only if you want grounded prose explanations:
120
+
121
+ ```bash
122
+ export ANTHROPIC_API_KEY=sk-ant-... # or OPENAI_API_KEY=sk-...
123
+ ```
124
+
125
+ Prefer to send nothing anywhere? Point Codemble at a local
126
+ [Ollama](https://ollama.com) instead — same grounding validation, loopback only,
127
+ never automatic:
128
+
129
+ ```bash
130
+ ollama pull gemma4:12b && export CODEMBLE_PROVIDER=ollama
131
+ ```
132
+
133
+ [Installation, configuration, and troubleshooting →](https://udhawan97.github.io/Codemble/installation/)
134
+
135
+ ## How the learning loop works
136
+
137
+ | Step | What Codemble does | What you gain |
138
+ | --- | --- | --- |
139
+ | **1. Chart** | Parses your project without running its code or package scripts | A deterministic map made from source evidence |
140
+ | **2. Navigate** | Two layers over one graph: a 3D galaxy on scripted camera rails, and a flat map of architecture and workflow | Orientation without getting lost in free flight |
141
+ | **3. Study** | Shows the real source, exact line numbers, neighbors, and parser-detected language idioms | Context tied to code you can inspect |
142
+ | **4. Prove** | Generates and scores checks from the graph—never from the model | A region lights only when understanding is demonstrated |
143
+ | **5. Return** | Saves progress locally; changing one file re-dims only its module | A living map that stays honest as the project changes |
144
+
145
+ No XP. No streaks. No leaderboard. The visible reward is the useful one: more
146
+ of your own code becomes a sky you understand.
147
+
148
+ ## What it looks like
149
+
150
+ <p align="center">
151
+ <img src="https://github.com/udhawan97/Codemble/raw/main/docs-site/public/shots/system.png" alt="A single star system, codemble.server.app, showing its functions and classes in orbits with call edges and a keyboard focus reticle" width="900">
152
+ </p>
153
+
154
+ <p align="center"><sub>
155
+ System level. Members orbit by call depth, so the inner ring runs first.
156
+ </sub></p>
157
+
158
+ <p align="center">
159
+ <img src="https://github.com/udhawan97/Codemble/raw/main/docs-site/public/shots/study-panel.png" alt="The study panel for create_app, showing kind, span, 36 callers, a structural summary marked no model needed, guidance for configuring a provider or a local Ollama, and a parser connections diagram with an inbound call citing a real file and line" width="900">
160
+ </p>
161
+
162
+ <p align="center"><sub>
163
+ Study. Everything on this panel except the narration comes from the parser —
164
+ and this one has no model configured at all.
165
+ </sub></p>
166
+
167
+ ## Two layers over one graph
168
+
169
+ Codemble draws the same parser evidence two ways, switchable in the header. The
170
+ map cannot show you a relationship the galaxy does not have — both layouts are
171
+ computed in the graph layer and served as data.
172
+
173
+ | Layer | What it is | When it helps |
174
+ | --- | --- | --- |
175
+ | **Galaxy** | 3D, camera on rails through galaxy → system → study | Orientation, and the shape of the whole project |
176
+ | **Map · Architecture** | Modules as boxes, grouped by folder, layered by import distance from Home | Seeing how the project fits together |
177
+ | **Map · Workflow** | The call tree from your entrypoint, depth by depth | Seeing what runs first |
178
+
179
+ The Map is plain SVG, so it still works on a machine that cannot draw WebGL.
180
+
181
+ ## Open a structure, read what the parser knows first
182
+
183
+ The study panel builds itself outward from the most certain evidence: a
184
+ structural summary written from parser facts alone — no key, no network, no
185
+ model — then grounded narration if you configured a provider, then every
186
+ connection into and out of the structure with its direction, its certainty, and
187
+ a `file:line` you can click, then the real source and the language Lens notes.
188
+
189
+ Sections other than the narration never involve a model at all.
190
+
191
+ ## Easy or Expert
192
+
193
+ A header toggle changes how Codemble talks to you and how much it puts on
194
+ screen: plain language, larger type, the Map by default, and a hint chip naming
195
+ the nearest unlit region to Home — counted in import hops over the graph, not
196
+ chosen by a model. It never changes graph truth, coordinates, progress, or how a
197
+ check is scored.
198
+
199
+ You can also switch project or change Home without leaving the app.
200
+
201
+ ## Read the galaxy
202
+
203
+ | In the galaxy | In your project |
204
+ | --- | --- |
205
+ | A star system | One source module |
206
+ | A planet | A function or class |
207
+ | The Home system | The selected parser-ranked entrypoint |
208
+ | A route or edge | An import or call; approximate calls are labeled **possible** |
209
+ | Size | Lines of code |
210
+ | Brightness and glow | How many **distinct** structures call it |
211
+ | Nebula tint | Language, at galaxy level |
212
+ | Orbit ring | Call depth — the inner ring runs first |
213
+ | Drifting particles | A call the parser proved; a possible call stays still |
214
+ | Dim → lit | Not yet proven → understood |
215
+
216
+ Understanding owns the top of the brightness range: the unlit ramp stops below
217
+ the amber a lit star uses, so a busy module you have not proven can never
218
+ outshine one you have. Pass a region's checks and that system plays a short
219
+ amber "nebula dawn" — after the light is already saved, so the animation marks
220
+ a fact rather than delivering one.
221
+
222
+ Python-only, JavaScript-only, TypeScript-only, and mixed projects share the same
223
+ graph contract. Language focus changes only what you are looking at; it never
224
+ changes coordinates, progress, or parser truth.
225
+
226
+ ## Honest by construction
227
+
228
+ Codemble is built for learners who may not yet be able to spot a confident
229
+ mistake. Accuracy therefore outranks spectacle:
230
+
231
+ - Structure, entrypoints, concepts, imports, and calls come from parsers.
232
+ - Every explanation points to a real `file:line` and may name only supplied
233
+ identifiers and relationships.
234
+ - Language Lens notes appear only where a parser detected the construct.
235
+ - Check answers come from the graph, never an LLM.
236
+ - Approximate relationships stay visibly uncertain — a distinct colour and no
237
+ drifting particles in the 3D galaxy, a genuinely dashed line in the 2D map,
238
+ and the legend swatch follows whichever layer is on screen.
239
+ - Provider output that fails grounding validation is withheld instead of being
240
+ softened into a guess.
241
+
242
+ Read the full [correctness contract](https://udhawan97.github.io/Codemble/correctness/).
243
+ A wrong explanation is a highest-severity bug—[report it without mercy](https://github.com/udhawan97/Codemble/issues).
244
+
245
+ ## Local-first, with an explicit AI boundary
246
+
247
+ | Stays on your machine | Leaves only when you ask |
248
+ | --- | --- |
249
+ | Project discovery and parsing | The bounded Study context sent to your configured provider |
250
+ | Graph, structural summary, language Lens, and checks | A request triggered only when you open Study |
251
+ | Local server and packaged web app | Nothing in the background |
252
+ | Progress and explanation cache in `~/.codemble/` | No accounts, telemetry, or Codemble cloud |
253
+ | Narration too, if you choose a local Ollama | Nothing at all in that case |
254
+
255
+ No model at all? Codemble remains a complete parser-backed map and learning
256
+ game; only the optional prose narration is unavailable.
257
+
258
+ ## Boundaries that keep the map truthful
259
+
260
+ - **Supported source:** Python 3.11+, JavaScript/JSX, TypeScript/TSX, and mixed
261
+ projects. Unsupported languages stay outside the graph rather than being guessed.
262
+ - **Scale:** above roughly 300 supported source files, choose a subdirectory —
263
+ the in-app picker prompts for the scope, or pass
264
+ `codemble --path ./project/subdirectory`.
265
+ - **Ambiguous Home:** choose a parser-ranked entrypoint in the app or pass
266
+ `--entrypoint NODE_ID`.
267
+ - **Broken source:** syntax errors remain visible; Codemble maps safe partial
268
+ evidence instead of crashing or inventing the missing structure.
269
+ - **Rendering:** the 3D galaxy needs WebGL. If your machine cannot draw it, the
270
+ Map layer still works — it is plain SVG over the same parser evidence, not a
271
+ degraded guess.
272
+
273
+ ## Help test the release
274
+
275
+ The most valuable contribution right now is not a feature request. It is a
276
+ first run on a real AI-built project:
277
+
278
+ 1. Follow the [ten-minute tester guide](https://github.com/udhawan97/Codemble/blob/main/TESTING.md).
279
+ 2. Light at least one system.
280
+ 3. Report confusion verbatim—never paste private source or API keys.
281
+
282
+ [Open an early-tester report →](https://github.com/udhawan97/Codemble/issues/new?template=early_tester.yml)
283
+
284
+ ## Develop
285
+
286
+ ```bash
287
+ python -m venv .venv && source .venv/bin/activate
288
+ pip install -e ".[dev]"
289
+ pytest && ruff check .
290
+
291
+ (cd web && npm install && npm run check)
292
+ (cd docs-site && npm install && npm run check && npm run build)
293
+ ```
294
+
295
+ The load-bearing design and architecture contracts are documented, not implied:
296
+
297
+ - [Architecture](https://udhawan97.github.io/Codemble/architecture/)
298
+ - [Contributing](https://github.com/udhawan97/Codemble/blob/main/CONTRIBUTING.md)
299
+ - [Formal Edo design system](https://github.com/udhawan97/Codemble/blob/main/docs-site/design.md)
300
+ - [Agent operating guide and current state](https://github.com/udhawan97/Codemble/blob/main/CLAUDE.md)
301
+
302
+ ## Roadmap
303
+
304
+ | Horizon | Work |
305
+ | --- | --- |
306
+ | **Now** | Collect unaided first-run evidence on the current release across supported project types |
307
+ | **Next** | Go, Rust, and Java adapters; level-of-detail rendering for larger repositories |
308
+ | **Later** | Read-only share links, new quest types, and the coordinated public launch |
309
+
310
+ The [public roadmap](https://udhawan97.github.io/Codemble/roadmap/) separates
311
+ shipped work from planned work. Milestones move only when their acceptance
312
+ evidence exists.
313
+
314
+ ## License
315
+
316
+ Codemble is released under the [Apache License 2.0](https://github.com/udhawan97/Codemble/blob/main/LICENSE).
317
+
318
+ ---
319
+
320
+ <p align="center"><sub>
321
+ Built for the moment after “AI made it work” and before “I know how it works.”
322
+ </sub></p>