codemble 0.3.1__tar.gz → 0.5.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 (242) hide show
  1. {codemble-0.3.1 → codemble-0.5.0}/.github/workflows/ci.yml +4 -4
  2. {codemble-0.3.1 → codemble-0.5.0}/.github/workflows/pages.yml +4 -4
  3. {codemble-0.3.1 → codemble-0.5.0}/.gitignore +6 -0
  4. codemble-0.5.0/CHANGELOG.md +344 -0
  5. {codemble-0.3.1 → codemble-0.5.0}/CLAUDE.md +107 -6
  6. {codemble-0.3.1 → codemble-0.5.0}/PKG-INFO +133 -19
  7. {codemble-0.3.1 → codemble-0.5.0}/README.md +132 -18
  8. {codemble-0.3.1 → codemble-0.5.0}/TESTING.md +9 -3
  9. {codemble-0.3.1 → codemble-0.5.0}/codemble/__init__.py +1 -1
  10. codemble-0.5.0/codemble/adapters/parse_progress.py +99 -0
  11. {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/project.py +50 -16
  12. {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/python_ast.py +23 -5
  13. {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/typescript_tree_sitter.py +4 -1
  14. codemble-0.5.0/codemble/checks/service.py +448 -0
  15. {codemble-0.3.1 → codemble-0.5.0}/codemble/graph/__init__.py +3 -0
  16. {codemble-0.3.1 → codemble-0.5.0}/codemble/graph/finalize.py +8 -7
  17. {codemble-0.3.1 → codemble-0.5.0}/codemble/graph/layout.py +82 -23
  18. codemble-0.5.0/codemble/graph/mapview.py +315 -0
  19. codemble-0.5.0/codemble/lens/javascript_typescript.py +112 -0
  20. codemble-0.5.0/codemble/lens/python.py +95 -0
  21. codemble-0.5.0/codemble/llm/local_status.py +66 -0
  22. {codemble-0.3.1 → codemble-0.5.0}/codemble/llm/providers.py +91 -1
  23. codemble-0.5.0/codemble/llm/structural.py +127 -0
  24. {codemble-0.3.1 → codemble-0.5.0}/codemble/llm/study.py +117 -36
  25. codemble-0.5.0/codemble/paths.py +27 -0
  26. {codemble-0.3.1 → codemble-0.5.0}/codemble/progress/store.py +60 -17
  27. codemble-0.5.0/codemble/server/app.py +520 -0
  28. codemble-0.5.0/codemble/server/parse_job.py +153 -0
  29. codemble-0.5.0/codemble/server/runtime.py +141 -0
  30. codemble-0.5.0/codemble/web_dist/assets/index-BlkEA_-c.js +5352 -0
  31. codemble-0.5.0/codemble/web_dist/assets/index-xOQxhaMB.css +1 -0
  32. codemble-0.5.0/codemble/web_dist/index.html +28 -0
  33. codemble-0.5.0/docs/plans/2026-07-19-audience-modes-and-local-narration-design.md +292 -0
  34. codemble-0.5.0/docs/plans/2026-07-19-audience-modes-backend-plan.md +1701 -0
  35. codemble-0.5.0/docs/plans/2026-07-19-audience-modes-frontend-plan.md +539 -0
  36. codemble-0.5.0/docs/releases/checklist.md +35 -0
  37. codemble-0.5.0/docs/releases/v0.4.0.md +118 -0
  38. codemble-0.5.0/docs/releases/v0.5.0.md +94 -0
  39. codemble-0.5.0/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-a.md +3480 -0
  40. codemble-0.5.0/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-b.md +3556 -0
  41. codemble-0.5.0/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-c.md +3905 -0
  42. codemble-0.5.0/docs/superpowers/plans/2026-07-19-galaxy-ux-shared-contract.md +105 -0
  43. codemble-0.5.0/docs/superpowers/specs/2026-07-19-galaxy-ux-overhaul-design.md +352 -0
  44. {codemble-0.3.1 → codemble-0.5.0}/docs-site/astro.config.mjs +3 -0
  45. {codemble-0.3.1 → codemble-0.5.0}/docs-site/package.json +1 -1
  46. codemble-0.5.0/docs-site/public/brand/icons/asterism.svg +6 -0
  47. codemble-0.5.0/docs-site/public/brand/icons/install.svg +5 -0
  48. codemble-0.5.0/docs-site/public/shots/easy-mode.png +0 -0
  49. codemble-0.5.0/docs-site/public/shots/galaxy-lit.png +0 -0
  50. codemble-0.5.0/docs-site/public/shots/galaxy.png +0 -0
  51. codemble-0.5.0/docs-site/public/shots/loading.png +0 -0
  52. codemble-0.5.0/docs-site/public/shots/map-architecture.png +0 -0
  53. codemble-0.5.0/docs-site/public/shots/map-workflow.png +0 -0
  54. codemble-0.5.0/docs-site/public/shots/study-panel.png +0 -0
  55. codemble-0.5.0/docs-site/public/shots/system.png +0 -0
  56. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/architecture.md +7 -1
  57. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/checks-and-lighting.md +27 -1
  58. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/early-testing.md +7 -1
  59. codemble-0.5.0/docs-site/src/content/docs/installation.md +128 -0
  60. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/introduction.md +12 -8
  61. codemble-0.5.0/docs-site/src/content/docs/progress/m12-galaxy-look.md +60 -0
  62. codemble-0.5.0/docs-site/src/content/docs/progress/m13-scale.md +53 -0
  63. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/quickstart.md +37 -13
  64. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/roadmap.md +3 -1
  65. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/star-chart.md +5 -0
  66. codemble-0.5.0/docs-site/src/content/docs/study-panel.md +74 -0
  67. codemble-0.5.0/docs-site/src/content/docs/the-galaxy.md +141 -0
  68. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/pages/index.astro +56 -9
  69. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/styles/custom.css +70 -0
  70. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/styles/landing.css +61 -0
  71. {codemble-0.3.1 → codemble-0.5.0}/pyproject.toml +1 -1
  72. codemble-0.5.0/tests/conftest.py +57 -0
  73. codemble-0.5.0/tests/fixtures/check_suites.json +1240 -0
  74. codemble-0.5.0/tests/fixtures/impact/alpha.py +6 -0
  75. codemble-0.5.0/tests/fixtures/impact/beta.py +5 -0
  76. codemble-0.5.0/tests/fixtures/impact/gamma.py +5 -0
  77. codemble-0.5.0/tests/fixtures/impact/helpers.py +6 -0
  78. codemble-0.5.0/tests/fixtures/impact/noisy.py +9 -0
  79. codemble-0.5.0/tests/fixtures/repeated_calls.py +9 -0
  80. codemble-0.5.0/tests/test_checks.py +383 -0
  81. {codemble-0.3.1 → codemble-0.5.0}/tests/test_graph_finalization.py +39 -0
  82. codemble-0.5.0/tests/test_mapview.py +262 -0
  83. codemble-0.5.0/tests/test_parse_job.py +167 -0
  84. codemble-0.5.0/tests/test_parse_progress.py +134 -0
  85. {codemble-0.3.1 → codemble-0.5.0}/tests/test_progress.py +25 -0
  86. {codemble-0.3.1 → codemble-0.5.0}/tests/test_project_parser.py +29 -0
  87. codemble-0.5.0/tests/test_providers.py +260 -0
  88. {codemble-0.3.1 → codemble-0.5.0}/tests/test_python_ast.py +127 -2
  89. codemble-0.5.0/tests/test_server.py +1235 -0
  90. codemble-0.5.0/tests/test_smoke.py +214 -0
  91. codemble-0.5.0/tests/test_structural.py +121 -0
  92. codemble-0.5.0/tests/test_study.py +589 -0
  93. codemble-0.5.0/web/index.html +27 -0
  94. {codemble-0.3.1 → codemble-0.5.0}/web/package-lock.json +2 -2
  95. {codemble-0.3.1 → codemble-0.5.0}/web/package.json +1 -1
  96. codemble-0.5.0/web/scripts/check_graph_data.mjs +234 -0
  97. codemble-0.5.0/web/scripts/check_learner_session.mjs +2063 -0
  98. codemble-0.5.0/web/src/App.jsx +1187 -0
  99. codemble-0.5.0/web/src/GalaxyCanvas.jsx +466 -0
  100. codemble-0.5.0/web/src/GuidanceLayer.jsx +117 -0
  101. codemble-0.5.0/web/src/MapView.jsx +305 -0
  102. codemble-0.5.0/web/src/ModeControl.jsx +112 -0
  103. codemble-0.5.0/web/src/StudyPanel.jsx +390 -0
  104. codemble-0.5.0/web/src/galaxyEffects.js +122 -0
  105. codemble-0.5.0/web/src/galaxyMaterials.js +199 -0
  106. {codemble-0.3.1 → codemble-0.5.0}/web/src/graphData.js +112 -18
  107. codemble-0.5.0/web/src/learnerSession.js +1472 -0
  108. codemble-0.5.0/web/src/main.jsx +58 -0
  109. {codemble-0.3.1 → codemble-0.5.0}/web/src/styles.css +930 -21
  110. codemble-0.5.0/web/src/tokens.css +45 -0
  111. codemble-0.3.1/CHANGELOG.md +0 -154
  112. codemble-0.3.1/codemble/checks/service.py +0 -380
  113. codemble-0.3.1/codemble/lens/javascript_typescript.py +0 -82
  114. codemble-0.3.1/codemble/lens/python.py +0 -71
  115. codemble-0.3.1/codemble/server/app.py +0 -273
  116. codemble-0.3.1/codemble/server/runtime.py +0 -68
  117. codemble-0.3.1/codemble/web_dist/assets/index-DOBVd_-M.css +0 -1
  118. codemble-0.3.1/codemble/web_dist/assets/index-cIG6GGIB.js +0 -5238
  119. codemble-0.3.1/codemble/web_dist/index.html +0 -18
  120. codemble-0.3.1/docs/releases/checklist.md +0 -14
  121. codemble-0.3.1/docs-site/src/content/docs/installation.md +0 -69
  122. codemble-0.3.1/docs-site/src/content/docs/the-galaxy.md +0 -44
  123. codemble-0.3.1/tests/test_checks.py +0 -103
  124. codemble-0.3.1/tests/test_server.py +0 -323
  125. codemble-0.3.1/tests/test_smoke.py +0 -75
  126. codemble-0.3.1/tests/test_study.py +0 -229
  127. codemble-0.3.1/web/index.html +0 -17
  128. codemble-0.3.1/web/scripts/check_graph_data.mjs +0 -77
  129. codemble-0.3.1/web/scripts/check_learner_session.mjs +0 -417
  130. codemble-0.3.1/web/src/App.jsx +0 -689
  131. codemble-0.3.1/web/src/GalaxyCanvas.jsx +0 -235
  132. codemble-0.3.1/web/src/learnerSession.js +0 -681
  133. codemble-0.3.1/web/src/main.jsx +0 -20
  134. codemble-0.3.1/web/src/tokens.css +0 -23
  135. {codemble-0.3.1 → codemble-0.5.0}/.env.example +0 -0
  136. {codemble-0.3.1 → codemble-0.5.0}/.gitattributes +0 -0
  137. {codemble-0.3.1 → codemble-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  138. {codemble-0.3.1 → codemble-0.5.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  139. {codemble-0.3.1 → codemble-0.5.0}/.github/ISSUE_TEMPLATE/early_tester.yml +0 -0
  140. {codemble-0.3.1 → codemble-0.5.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  141. {codemble-0.3.1 → codemble-0.5.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  142. {codemble-0.3.1 → codemble-0.5.0}/.github/dependabot.yml +0 -0
  143. {codemble-0.3.1 → codemble-0.5.0}/.github/workflows/publish-pypi.yml +0 -0
  144. {codemble-0.3.1 → codemble-0.5.0}/AGENTS.md +0 -0
  145. {codemble-0.3.1 → codemble-0.5.0}/CODE_OF_CONDUCT.md +0 -0
  146. {codemble-0.3.1 → codemble-0.5.0}/CONTRIBUTING.md +0 -0
  147. {codemble-0.3.1 → codemble-0.5.0}/LICENSE +0 -0
  148. {codemble-0.3.1 → codemble-0.5.0}/NOTICE +0 -0
  149. {codemble-0.3.1 → codemble-0.5.0}/SECURITY.md +0 -0
  150. {codemble-0.3.1 → codemble-0.5.0}/assets/demo.gif +0 -0
  151. {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/__init__.py +0 -0
  152. {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/base.py +0 -0
  153. {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/discovery.py +0 -0
  154. {codemble-0.3.1 → codemble-0.5.0}/codemble/checks/__init__.py +0 -0
  155. {codemble-0.3.1 → codemble-0.5.0}/codemble/cli.py +0 -0
  156. {codemble-0.3.1 → codemble-0.5.0}/codemble/lens/__init__.py +0 -0
  157. {codemble-0.3.1 → codemble-0.5.0}/codemble/llm/__init__.py +0 -0
  158. {codemble-0.3.1 → codemble-0.5.0}/codemble/progress/__init__.py +0 -0
  159. {codemble-0.3.1 → codemble-0.5.0}/codemble/server/__init__.py +0 -0
  160. {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  161. {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  162. {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  163. {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  164. {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/shippori-mincho-latin-500-normal-C-QwvIb3.woff +0 -0
  165. {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/shippori-mincho-latin-500-normal-XI1O8euf.woff2 +0 -0
  166. {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/shippori-mincho-latin-700-normal-CkoCYOiI.woff +0 -0
  167. {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/shippori-mincho-latin-700-normal-DHcmzUO5.woff2 +0 -0
  168. {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/zen-kaku-gothic-new-latin-400-normal-BEdayliK.woff2 +0 -0
  169. {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/zen-kaku-gothic-new-latin-400-normal-CPSmNJAU.woff +0 -0
  170. {codemble-0.3.1 → codemble-0.5.0}/docs/adr/README.md +0 -0
  171. {codemble-0.3.1 → codemble-0.5.0}/docs/plans/2026-07-19-install-ux-folder-picker-design.md +0 -0
  172. {codemble-0.3.1 → codemble-0.5.0}/docs/plans/2026-07-19-install-ux-folder-picker-plan.md +0 -0
  173. {codemble-0.3.1 → codemble-0.5.0}/docs/plans/README.md +0 -0
  174. {codemble-0.3.1 → codemble-0.5.0}/docs/plans/phase-1.md +0 -0
  175. {codemble-0.3.1 → codemble-0.5.0}/docs/releases/v0.1.0.md +0 -0
  176. {codemble-0.3.1 → codemble-0.5.0}/docs/releases/v0.2.0.md +0 -0
  177. {codemble-0.3.1 → codemble-0.5.0}/docs/research/README.md +0 -0
  178. {codemble-0.3.1 → codemble-0.5.0}/docs-site/.gitignore +0 -0
  179. {codemble-0.3.1 → codemble-0.5.0}/docs-site/design.md +0 -0
  180. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/favicon-16.png +0 -0
  181. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/favicon-32.png +0 -0
  182. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/icon-180.png +0 -0
  183. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/icon-192.png +0 -0
  184. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/icon-512.png +0 -0
  185. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/icon.svg +0 -0
  186. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/mark-animated.svg +0 -0
  187. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/mark.svg +0 -0
  188. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/hero-chart.svg +0 -0
  189. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/hero-field.svg +0 -0
  190. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/hero-gold.svg +0 -0
  191. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/kasumi-rule.svg +0 -0
  192. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/plate-galaxy.svg +0 -0
  193. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/plate-study.svg +0 -0
  194. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/plate-system.svg +0 -0
  195. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/seal.svg +0 -0
  196. {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/favicon.svg +0 -0
  197. {codemble-0.3.1 → codemble-0.5.0}/docs-site/scripts/build-plates.mjs +0 -0
  198. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/assets/codemble-mark-dark.svg +0 -0
  199. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/assets/codemble-mark-light.svg +0 -0
  200. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/components/Search.astro +0 -0
  201. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/components/Tatebanko.astro +0 -0
  202. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/build-from-source.md +0 -0
  203. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/contributing.md +0 -0
  204. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/correctness.md +0 -0
  205. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m1-parser.md +0 -0
  206. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m10-polyglot-release.md +0 -0
  207. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m2-galaxy.md +0 -0
  208. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m3-study.md +0 -0
  209. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m4-lens.md +0 -0
  210. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m5-checks.md +0 -0
  211. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m6-release.md +0 -0
  212. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m8-typescript.md +0 -0
  213. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m9-typescript-lens.md +0 -0
  214. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content.config.ts +0 -0
  215. {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/styles/tokens.css +0 -0
  216. {codemble-0.3.1 → codemble-0.5.0}/scripts/dev.sh +0 -0
  217. {codemble-0.3.1 → codemble-0.5.0}/scripts/record_demo.sh +0 -0
  218. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/concepts_sample.py +0 -0
  219. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/python_worker.py +0 -0
  220. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/broken.ts +0 -0
  221. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/legacy.js +0 -0
  222. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/local.js +0 -0
  223. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/main.ts +0 -0
  224. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/reexport.ts +0 -0
  225. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/util.ts +0 -0
  226. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/widget.tsx +0 -0
  227. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/.gitignore +0 -0
  228. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/ambiguous.py +0 -0
  229. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/api.py +0 -0
  230. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/app.py +0 -0
  231. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/broken.py +0 -0
  232. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/cli.py +0 -0
  233. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/pkg/__init__.py +0 -0
  234. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/pkg/helpers.py +0 -0
  235. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/pkg/service.py +0 -0
  236. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/pkg/util.py +0 -0
  237. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/runner/__main__.py +0 -0
  238. {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/shared.py +0 -0
  239. {codemble-0.3.1 → codemble-0.5.0}/tests/test_typescript_tree_sitter.py +0 -0
  240. {codemble-0.3.1 → codemble-0.5.0}/web/README.md +0 -0
  241. {codemble-0.3.1 → codemble-0.5.0}/web/scripts/record_demo.mjs +0 -0
  242. {codemble-0.3.1 → codemble-0.5.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/
@@ -0,0 +1,344 @@
1
+ # Changelog
2
+
3
+ All notable changes to Codemble are documented here.
4
+ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) · Versioning: [SemVer](https://semver.org/).
5
+
6
+ ## [Unreleased]
7
+
8
+ ## [0.5.0] - 2026-07-20
9
+
10
+ ### Added
11
+ - Large projects now show a staged loading screen instead of a frozen tab.
12
+ Parsing runs on a worker thread; the app polls `GET /api/picker/progress` and
13
+ names the stage it is in — discovering, parsing, resolving, checks, layout —
14
+ with a real file count while files are read, and a narrated sub-step
15
+ (resolving imports, resolving calls, building the galaxy map, composing the
16
+ project) once the parse moves past counting files. A failed parse reports
17
+ the parser's own message and offers an in-app retry; cancelling stops the
18
+ parse at the next file boundary. A realistic 1,000-file Python project
19
+ parses and renders an interactive galaxy end to end; the parse itself is
20
+ 1.56x faster after removing a parser hotspot (below), and the one-pass check
21
+ index builds a full 1,000-region suite in under a second.
22
+ - The over-cap prompt is actionable in-app: the busiest subdirectories are
23
+ buttons that navigate the picker, and a typed path field accepts any folder
24
+ inside your home directory. Outside-home paths are still refused.
25
+ - A **Clear this project's progress** control on the star chart, behind a
26
+ confirmation, scoped to the open project only.
27
+ - A non-interactive `codemble` run now prints the busiest-scope suggestions
28
+ with the scale refusal instead of a bare message.
29
+
30
+ ### Changed
31
+ - The scale cap moved from 300 to 1,000 supported source files. LOD and
32
+ clustering remain Phase 2 work.
33
+ - `POST /api/picker/select` returns `202 {"state": "parsing"}` instead of
34
+ blocking until the graph is ready.
35
+ - `CODEMBLE_DATA_DIR` now relocates **everything** Codemble keeps under your home
36
+ directory — saved progress, the narration cache, and the `config` file — rather
37
+ than progress alone. All three resolve through one helper, so pointing the
38
+ variable somewhere else moves them together. Unset, the default is unchanged:
39
+ `~/.codemble`.
40
+ - Language focus now also projects onto the **2D Map**, matching the galaxy: a
41
+ focused language keeps its boxes, rows, and edges while the others are dropped,
42
+ and the survivors keep their backend-computed coordinates. The projection
43
+ happens in the frontend and never re-lays-out or mutates the immutable graph,
44
+ so focus finally means the same thing on both layers.
45
+ - The no-WebGL message now points the learner to the Map/Diagram layer, which
46
+ draws the same parser evidence as plain SVG and is one switch away, instead of
47
+ only stating that the galaxy needs WebGL.
48
+
49
+ ### Fixed
50
+ - Check generation walked every graph edge up to four times per region, and
51
+ rebuilt the node lookup and the option pool per region — an O(regions × graph)
52
+ freeze at bind. One index is now built per bind in a single pass, measured
53
+ ~16x faster at 1,000 files. A committed golden fixture proves the generated
54
+ suites and answers are byte-identical for the Python and mixed fixtures.
55
+ - `GET /api/graph` and `GET /api/map` re-hydrated progress and re-sorted every
56
+ node and edge on every request. The serialized document is cached and
57
+ invalidated on region light-up, Home selection, and project bind or reset —
58
+ measured ~25-26x faster warm.
59
+ - The Python adapter resolved a node's owning module with an O(definitions ×
60
+ modules) scan; it now walks the node id's own dotted prefixes in O(depth),
61
+ a further 1.56x on total parse wall-clock. Output is byte-identical.
62
+ - The test suite no longer reads the developer's `~/.codemble/config` or their
63
+ `ANTHROPIC_API_KEY` / `OPENAI_API_KEY`. Every server test that built an app
64
+ without an explicit study service inherited whatever the machine had
65
+ configured, so the same test could construct a live provider locally and none
66
+ in CI. The two tests that request `/explanation` would then make a real, billed
67
+ API call and cache the reply under the developer's home directory.
68
+ - First-run onboarding assumed the learner was on the galaxy, but Easy — the
69
+ default audience — opens on the 2D Map. The coach-marks and the footer control
70
+ hint now key on the active layer, so a learner on the Map reads map guidance
71
+ ("click a box or row to study, switch tabs") instead of galaxy scroll/camera
72
+ controls that are not on screen.
73
+ - The audience-mode gate and the first-run coach-marks no longer open as two
74
+ stacked modals on a genuine first run; the coach-marks wait until a mode has
75
+ been chosen, so the gate resolves first.
76
+ - With no parser-recognisable entrypoint the "Change Home" control is not
77
+ rendered, so both Map tabs now state that reason instead of pointing at a
78
+ button that is not there. The has-candidates-but-unselected copy is unchanged.
79
+ - A project bind slow enough to outlast a parse cancellation could commit after
80
+ the picker had already been reset, resurrecting the just-released project or
81
+ clobbering the next selection. The commit now re-checks cancellation under the
82
+ same lock that performs it, so a stale bind can never rebind a released project.
83
+
84
+ ## [0.4.0] - 2026-07-20
85
+
86
+ The galaxy read as flat spheres on a plain background, connections were hard to
87
+ follow at any zoom level, and once a project was bound the only way to open a
88
+ different one was killing the server. This release lands the redesign, adds a
89
+ second way to look at the same graph, and puts what the parser already knew on
90
+ screen.
91
+
92
+ ### Added
93
+ - A second **Map** layer beside the galaxy, switchable from the header. Its
94
+ *Architecture* tab lays modules out as boxes grouped by directory and layered
95
+ by import distance from Home; its *Workflow* tab walks the call tree from your
96
+ entrypoint, where the first hop is the `defines` relation the parser recorded
97
+ and deeper hops are `calls`. Both layouts are computed by the parser-backed
98
+ graph layer and served by a new `GET /api/map`, so the map and the galaxy can
99
+ never disagree.
100
+ - The Map layer is plain SVG and needs no WebGL, so a machine that cannot draw
101
+ the galaxy can still read the project.
102
+ - The study panel now shows what the parser knows before any model is asked: a
103
+ structural summary rendered from parser facts through fixed templates, with no
104
+ key, no network, and no provider involved.
105
+ - Grounded narration finally reaches the panel. The explanation endpoint had
106
+ shipped but was never called, so the narration block always rendered empty.
107
+ - A Connections section lists every parser relationship into and out of the
108
+ selected structure, grouped inbound and outbound, each row stating direction,
109
+ certainty, and a `file:line` citation for where that structure is defined —
110
+ plus a small SVG diagram of callers, this structure, and callees. Clicking a
111
+ row opens that structure's study.
112
+ - Local narration through Ollama, so a learner with no API key can still get
113
+ grounded prose without their source leaving the machine. It is explicit
114
+ opt-in (`CODEMBLE_PROVIDER=ollama`, or `provider = "ollama"` in
115
+ `~/.codemble/config`) with no auto-detection, the host is refused at
116
+ construction unless it is plain `http` on loopback, no credential is ever
117
+ sent, and the output passes exactly the same grounding validation as a cloud
118
+ provider. Honest caveat: that validation catches an invented identifier, not
119
+ a wrong claim about a real one, and smaller local models make the second kind
120
+ of mistake more often.
121
+ - Guidance when no model is configured, including the local Ollama path, driven
122
+ by whether a loopback Ollama is actually reachable and which models it has.
123
+ - An Easy/Expert audience toggle in the header. Easy uses plain language for
124
+ narration, check questions, panel labels, Lens notes, and the legend; Expert
125
+ keeps full terminology. The choice persists per project and never changes
126
+ graph truth, coordinates, progress, or how a check is scored.
127
+ - Easy mode opens on the Map, hides galaxy links unrelated to the selected
128
+ structure, and shows a hint chip naming the nearest unlit region to Home. The
129
+ hint is counted in import-route hops over the graph; no model chooses it.
130
+ - Switch project: a header control releases the current project and returns to
131
+ the picker, so a second project no longer needs a terminal.
132
+ - Change Home: the entrypoint picker can be reopened whenever the parser ranked
133
+ at least one candidate, and the Home you select is remembered for the next run
134
+ of the same project.
135
+ - Edge arrowheads below the galaxy level, hover tooltips on every edge naming
136
+ both structures, the relationship, its certainty and the line it was seen on,
137
+ and hover/selection highlighting.
138
+ - First-run coach-marks explain what you see, how to move, and what lights
139
+ stars. Dismissing them is a local UI preference, not progress.
140
+ - A clickable breadcrumb, and a legend naming dim, amber-understood, unchartable
141
+ syntax-error files, certain versus possible relationships, and one swatch per
142
+ language. It describes only the encodings the layer on screen actually draws:
143
+ size and brightness are galaxy-only, language tint appears at galaxy level and
144
+ on the Architecture tab, and the possible-relationship swatch dashes on the Map
145
+ to match the SVG while staying colour-only for the galaxy.
146
+ - Correct check answers now get an affirmation, not just silence.
147
+ - A `<noscript>` message and a React error boundary, so a render failure
148
+ explains itself and offers a reload instead of showing a blank page.
149
+
150
+ ### Changed
151
+ - The galaxy gained depth: nodes carry a canvas-generated halo, an
152
+ `UnrealBloomPass` is tuned so lit amber blooms hard while the unlit ramp
153
+ barely registers, and a background starfield is seeded by hashing the
154
+ project's own file hashes — the same code always produces the same sky.
155
+ - At galaxy level, Python, JavaScript and TypeScript systems sit in a faint
156
+ language-tinted nebula. A system in any other language renders no fog rather
157
+ than borrowing another language's hue.
158
+ - Keyboard focus in the galaxy now carries a visible reticle as well as its
159
+ live text readout.
160
+ - Passing a region's checks plays a 1.2s "nebula dawn" the next time you are at
161
+ galaxy level: amber washes across that system's halo and fog and recedes. The
162
+ lit state is already committed before it runs, so the animation celebrates a
163
+ fact rather than delivering it. `prefers-reduced-motion` skips it entirely and
164
+ goes straight to the finished lit state.
165
+ - System orbits are laid out by call depth instead of by member index, so an
166
+ inner ring means "this runs first". Ring 1 is what the module's entry node
167
+ calls directly plus every member no sibling calls; members no certain call
168
+ reaches keep the outermost ring rather than being placed by guesswork. Only
169
+ certain calls decide placement. Layout coordinates changed once; saved
170
+ progress is unaffected because region signatures derive from file hashes, not
171
+ coordinates.
172
+ - Drifting particles mark **certain** call edges only, at system and study
173
+ level. A possible call stays still, so motion can never imply proof.
174
+ `prefers-reduced-motion` stops them too.
175
+ - Centrality now counts the distinct structures that call a node, not the call
176
+ sites they contain, so a helper hammered from one loop no longer outshines a
177
+ shared utility. The study panel's label follows: "Callers", not "Calls in".
178
+ - The study panel leads with the structural summary and narration, then
179
+ connections, then source and lens notes.
180
+ - The study level keeps the selected structure's connections visible instead of
181
+ dimming the whole scene.
182
+ - A region with no safe check now explains that Codemble refuses to ask a
183
+ question the graph cannot answer, rather than only stating that none exists.
184
+ - The zero-candidate Home screen no longer tells you to restart with a CLI
185
+ flag; every option is in the app.
186
+ - The star chart labels studied counts "this session", which is what they have
187
+ always measured.
188
+
189
+ ### Fixed
190
+ - The partial-parse notice rode a code path that never executed; it now renders
191
+ with the narration block, and the structural summary states it as well.
192
+ - A failed graph load offered only "Restart Codemble and reload this page"; it
193
+ now retries in place.
194
+ - Contributors only: pinned the docs site back to TypeScript 6.x. An automated
195
+ 7.0.2 bump had broken the `astro check` CI gate, because TypeScript's native
196
+ 7.x compiler does not yet expose the programmatic API that check relies on.
197
+
198
+ ## [0.3.1] - 2026-07-19
199
+
200
+ ### Changed
201
+ - Packaging metadata only, no behavior change: added PyPI classifiers (Beta
202
+ status, Python 3.11-3.13, Apache-2.0 license, dev/education audience), moved
203
+ license metadata to the PEP 639 SPDX form so the License field is concise
204
+ instead of dumping the full Apache text, made README links absolute so the
205
+ PyPI project page renders them, and excluded internal tooling directories
206
+ from the sdist.
207
+
208
+ ## [0.3.0] - 2026-07-19
209
+
210
+ ### Added
211
+ - Bare `codemble` now opens the browser to an in-app project picker: browse
212
+ home folders, reopen recent projects, and re-scope over-cap projects without
213
+ touching the terminal.
214
+ - The local server rejects foreign `Host` headers, keeping the picker API
215
+ reachable only from the learner's own machine.
216
+ - Codemble is published to PyPI, so installing is `uvx codemble` or
217
+ `pipx install codemble` with no git URL or tag.
218
+
219
+ ### Changed
220
+ - `codemble` with flags but no path serves the picker instead of the current
221
+ directory; pass a path (or `--path`) for the previous behaviour.
222
+ - Rebuilt the packaged app on the Formal Edo palette, so the galaxy and the
223
+ public site finally share one set of values. The app's tokens already imported
224
+ the site's, but `codemble/web_dist` had not been rebuilt since before the
225
+ redesign, so every shipped build still rendered the retired palette.
226
+ - Self-hosted Shippori Mincho and Zen Kaku Gothic New in the app and dropped
227
+ Sora and Inter. The site loads these faces from the Google Fonts CDN; the app
228
+ must not, because it runs locally and offline. Net bundle change is smaller.
229
+ - Illumination now owns the top of the brightness range: the unlit centrality
230
+ ramp stops at `--cm-ink-2` (8.2:1) and a lit star uses `--cm-star-high`
231
+ (12.1:1). Previously a busy un-understood module outshone an understood one
232
+ 17.4:1 to 8.5:1, which inverted the meaning of lighting a region.
233
+
234
+ ### Fixed
235
+ - Canvas colours authored as `color-mix()` reached WebGL as unparsed text and
236
+ rendered black, because a custom property returns its authored value rather
237
+ than a resolved colour. Affected unchartable nodes and every "possible call"
238
+ edge — exactly the uncertainty the Correctness Contract requires to stay
239
+ visible. Palette values are now resolved to plain `rgb()` before rendering.
240
+ - The partial-parse notice said "its language parser" when reporting more than
241
+ one file.
242
+ - Multi-answer checks offered no wrong option once a question had four or more
243
+ correct answers, so selecting every option lit the region without proving
244
+ anything. Checks now always offer wrong options alongside their answers, and a
245
+ question the graph cannot supply a wrong option for is dropped rather than
246
+ asked. On this repository the change removed all 17 such questions out of 107
247
+ while leaving every region's check count unchanged.
248
+
249
+ ### Added
250
+ - Expanding site search in the header of both the landing page and every docs
251
+ page, backed by Pagefind with keyboard shortcut, arrow-key navigation, and an
252
+ explicit message when the index has not been built yet.
253
+ - Generated Edo star-atlas plate artwork (`docs-site/scripts/build-plates.mjs`),
254
+ emitted from a fixed seed so the same script always produces the same sky.
255
+ - A standalone landing page at `docs-site/src/pages/index.astro`, structured as
256
+ four numbered plates in 起承転結 order with a layered tatebanko hero.
257
+
258
+ ### Changed
259
+ - Centralized graph canonicalization, Home selection, centrality, annotation
260
+ normalization, edge deduplication, and deterministic layout behind one graph
261
+ finalization interface shared by every language adapter and project composition.
262
+ - Moved scale guarding and scope selection into `ProjectParser`, with one
263
+ reusable project intake that preserves adapter file ownership through parsing
264
+ instead of rediscovering the same scope in each adapter.
265
+ - Moved learner navigation, language focus, study/check/Home requests, progress
266
+ refresh, and illumination sequencing behind one testable learner-session
267
+ interface with HTTP and in-memory adapters, leaving React to render snapshots.
268
+ - Reused one internal JavaScript/TypeScript syntax-evidence index across
269
+ entrypoint, concept, call, binding, and imported-symbol resolution passes,
270
+ eliminating repeated ownership maps and whole-graph symbol scans.
271
+ - Rebuilt the public site on the Formal Edo palette (kachi indigo, ruri lapis,
272
+ kohaku amber, gofun white) with Shippori Mincho and Zen Kaku Gothic New. The
273
+ accent contracts are unchanged: kohaku still means understanding, ruri still
274
+ means interaction.
275
+
276
+ ### Fixed
277
+ - The current docs page was marked with a filled kohaku pill, which claimed
278
+ "understood" about a navigation state; it now uses ruri, the interaction accent.
279
+ - The landing hero overflowed a 320px viewport, putting a call to action and the
280
+ install command outside the clipped area where they could not be reached.
281
+
282
+ ### Removed
283
+ - `docs-site/src/content/docs/index.mdx`, replaced by the standalone landing
284
+ page; its content moved there.
285
+
286
+ ## [0.2.0] - 2026-07-19
287
+
288
+ ### Added
289
+ - Language-neutral `ProjectParser` discovery and graph composition with global
290
+ Home selection, adapter collision checks, and Python graph-byte compatibility.
291
+ - Official tree-sitter JavaScript/TypeScript adapter for JS, JSX, MJS, CJS, TS,
292
+ TSX, MTS, and CTS modules, definitions, imports, calls, entrypoint ranking,
293
+ exact source spans, file hashes, and honest partial-parse recovery.
294
+ - Language-tagged graph schema 4 concept annotations plus deterministic
295
+ JavaScript/TypeScript Lens notes for async/await, arrows, destructuring,
296
+ optional chaining, nullish coalescing, modules, types, interfaces, generics,
297
+ and JSX.
298
+ - Accessible language focus for mixed galaxies, systems, Study navigation, and
299
+ the star chart. It filters a view of the graph without changing coordinates,
300
+ progress, source truth, uncertainty, or cross-language navigation.
301
+ - Phase 1 mixed-project fixtures, pure frontend focus/chart contracts, packaged
302
+ production SPA, public documentation, and a versioned `v0.2.0` wheel.
303
+
304
+ ## [0.1.0] - 2026-07-19
305
+
306
+ ### Added
307
+ - Repository scaffold: README, CLAUDE.md agent brief, docs, docs-site (Astro + Starlight), CI, community files.
308
+ - Deterministic Python AST parser with language-neutral graph models, source spans,
309
+ imports and calls with explicit certainty, entrypoint ranking, render metadata,
310
+ file hashes, partial-parse reporting, and schema-versioned JSON.
311
+ - `codemble parse <path> --out graph.json` CLI command.
312
+ - Parser fixture suite covering exact resolution, ambiguity, external calls,
313
+ ignored files, syntax errors, entrypoints, centrality, and byte determinism.
314
+ - Deterministic galaxy and system coordinates with one source module per region,
315
+ aggregated import routes, LOC sizing, centrality brightness, and Home markers.
316
+ - `codemble <path>` local FastAPI server with graph/source APIs, production SPA
317
+ serving, scripted three-level semantic zoom, keyboard navigation, responsive
318
+ observatory UI, WebGL failure handling, and a 1,000-node renderer probe.
319
+ - Web build gate in CI and `scripts/dev.sh` for the backend/Vite development loop.
320
+ - Study payloads with exact source lines, parser-proven neighbor evidence, and
321
+ clickable `file:line` citations in the responsive study panel.
322
+ - Deep narration module with direct Anthropic Messages and OpenAI Responses
323
+ adapters, environment/TOML BYO-key configuration, file-hash disk caching,
324
+ response grounding validation, and explicit no-key/error states.
325
+ - Parser-proven Python concept annotations for decorators, comprehensions,
326
+ generators, context managers, async/await, dunder methods, exception handling,
327
+ and type hints, serialized in graph schema 2.
328
+ - Python Lens notes anchored to exact source lines plus a language star chart
329
+ that separates concepts encountered, structures studied this session, and
330
+ graph-derived understanding without inventing progress.
331
+ - Four deterministic active-check families derived and scored only from call
332
+ edges, import edges, direct callers, and parser-ranked entrypoints.
333
+ - Region illumination persisted atomically under `~/.codemble/progress`, with
334
+ per-region file signatures so editing one file re-dims only its own system.
335
+ - Responsive System check flow with explicit wrong-answer evidence, suite
336
+ progress, restart-safe completion, and star-chart understanding updates.
337
+ - Honest Home calibration when top-ranked entrypoints are ambiguous, plus a
338
+ parser-validated `--entrypoint` override.
339
+ - A 300-file Phase 0 guard with interactive subdirectory selection and an
340
+ explicit non-interactive `--path` route.
341
+ - Unchartable syntax-error nodes, raw-source access, and model narration
342
+ suppression for partial parses.
343
+ - Production SPA assets inside the Python wheel, versioned `pipx`/`uvx` Git
344
+ install routes, an automated real-app demo recorder, and the v0.1.0 GIF.
@@ -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,55 @@ 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, and were released together as **v0.4.0** (tag `v0.4.0`, published
198
+ to PyPI, verified end to end from a clean `uvx codemble==0.4.0` install: the
199
+ wheel's SPA bundle is byte-identical to the tag, all 27 regions draw unclipped,
200
+ and the galaxy renders deep space with no console errors). Phase C (M13:
201
+ ~1,000-file scale with staged parse progress) has since shipped from that
202
+ plan: parsing now runs on a worker thread behind a `202`-accepted picker
203
+ select and a polled `GET /api/picker/progress` through five honest stages,
204
+ cancellation is checked between files and a crashed worker reports as an
205
+ in-app error rather than a hung server, the scale cap moved 300 → 1,000 with
206
+ the over-cap prompt offering clickable busiest scopes plus a home-jailed typed
207
+ path, a one-pass check index replaced the per-region edge scans
208
+ (byte-identical suites, pinned by a golden fixture before the refactor),
209
+ `/api/graph` and `/api/map` responses are now cached with invalidation on
210
+ light-up, Home change, and binding, and a Clear this project's progress
211
+ control was added to the star chart. A dedicated verification pass at a
212
+ realistic ~1,000-file project then found the `resolving` stage — the slowest
213
+ one — showed no moving signal for most of the wait; the fix narrates its real
214
+ sub-steps instead of leaving the screen static, and a parser hotspot found
215
+ alongside it (an O(definitions × modules) module-resolution scan in the Python
216
+ adapter) was fixed too, together taking real parse wall-clock on a 1,000-file
217
+ Python project from roughly 11.5s to roughly 7.5s with byte-identical output.
218
+ Suite hermeticity was also closed on the read side: `CODEMBLE_DATA_DIR` now
219
+ relocates the narration cache and the `config` file as well as saved progress
220
+ through one `codemble/paths.py` helper, and the test suite clears every
221
+ provider variable `from_environment` reads, so a server test can no longer make
222
+ a real billed API call against a developer's exported key. A pre-release
223
+ re-audit then closed a cluster of first-run gaps that converged on the
224
+ Easy-default learner (who lands on the 2D Map): the coach-marks and footer now
225
+ teach the layer the learner is actually on, the audience gate and coach-marks
226
+ no longer stack as two modals, the no-entrypoint Map tabs stop pointing at a
227
+ Change Home button that isn't shown, language focus now filters the Map as a
228
+ frontend projection, and a parse `bind` that outlasts a cancel can no longer
229
+ rebind a released project. Phase C plus that gap-fix wave shipped as **v0.5.0**;
230
+ the parse work collided with an independent implementation of the same three
231
+ foundational commits on `main`, reconciled by taking the branch's verified
232
+ superset while preserving main's unique `CODEMBLE_DATA_DIR`/config-isolation
233
+ fix, which lived in files the branch never touched.
189
234
 
190
235
  ### M0 — Repo, docs & website scaffold ✅ (2026-07-19)
191
236
  - [x] Root: README, LICENSE (Apache-2.0), CoC, SECURITY, CONTRIBUTING,
@@ -309,6 +354,48 @@ intake avoids repeated discovery; learner transitions are tested above local HTT
309
354
  JS/TS certainty and concept evidence remain parser-proven through the unchanged
310
355
  `LanguageAdapter` interface.
311
356
 
357
+ ### M12 — Living cosmos + 2D map (galaxy UX overhaul, Phase B) ✅ (2026-07-20)
358
+ - [x] System orbits by call depth from the region's entry node, hash-seeded and
359
+ deterministic; layout coordinates changed once, saved progress did not
360
+ - [x] `GET /api/map`: deterministic Architecture and Workflow 2D layouts
361
+ computed in `codemble/graph/`, reading the same graph as `GET /api/graph`
362
+ - [x] A 2D Map layer (Architecture + Workflow tabs) switchable from the header,
363
+ plain SVG, no WebGL dependency
364
+ - [x] Canvas-generated halos, language-tinted nebulae, a hash-seeded starfield,
365
+ composited bloom, and drifting particles on certain call edges only
366
+ - [x] The ~1.2s nebula-dawn light-up moment, with an instantly finished lit
367
+ state under reduced motion
368
+ - [x] Easy mode defaults to the Map with reduced edge density and a
369
+ graph-derived hint chip; Expert defaults to the galaxy; an explicit
370
+ layer choice always beats the mode default
371
+ - [x] First-run coach-marks, a clickable breadcrumb, and a language-tint
372
+ legend key
373
+
374
+ **Acceptance:** the map and the galaxy read one graph and cannot disagree;
375
+ uncertainty renders distinctly in both — colour-only in the 3D galaxy (no
376
+ line-dash support there), genuinely dashed in the 2D map; region signatures
377
+ hash file content, never coordinates, so the orbit relayout did not re-dim any
378
+ region; reduced motion always yields the finished lit state with zero
379
+ animation.
380
+
381
+ ### M13 — Galaxy UX Phase C: scale ✅ (2026-07-20)
382
+ - [x] Threaded parse behind `202` select, `GET /api/picker/progress`, and a
383
+ staged loading screen with real file counts
384
+ - [x] Cancellation checked between files; a crashed worker becomes an error
385
+ state, never a hung server
386
+ - [x] Scale cap 300 → 1,000; clickable busiest scopes plus a jailed path field;
387
+ suggestions in the non-TTY CLI refusal
388
+ - [x] One per-bind check index replacing the per-region edge scans, pinned by a
389
+ golden suite fixture
390
+ - [x] Cached `/api/graph` and `/api/map` documents invalidated on light-up,
391
+ Home, and binding
392
+ - [x] Terminal stage lines for `codemble <path>`; reset-progress control
393
+
394
+ **Acceptance:** a ~1,000-file project parses with live progress and reaches an
395
+ interactive galaxy; re-fetching the graph does not re-sort the world; the scale
396
+ prompt is actionable entirely in-app; generated check suites are byte-identical
397
+ to before the index change.
398
+
312
399
  ## Decision Log **[AGENT-MAINTAINED — append only]**
313
400
 
314
401
  | Date | Decision | Why |
@@ -360,14 +447,28 @@ JS/TS certainty and concept evidence remain parser-proven through the unchanged
360
447
  | 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
448
  | 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
449
  | 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 |
450
+ | 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 |
451
+ | 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 |
452
+ | 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 |
453
+ | 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 |
454
+ | 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 |
455
+ | 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 |
456
+ | 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 |
457
+ | 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 |
458
+ | 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 |
459
+ | 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 |
460
+ | 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 |
461
+ | 2026-07-20 | `CODEMBLE_DATA_DIR` owns every home-directory path — progress, the narration cache, and the `config` file — through one `codemble/paths.py` helper; the test suite additionally clears every provider variable `StudyService.from_environment` reads | The variable redirected progress only, while `StudyService` hardcoded `Path.home()` for the other two, so `create_app`'s default study service read the developer's real config and `ANTHROPIC_API_KEY`. Two server tests GET `/explanation` and assert only that a `status` key came back — true of `no_key`, `ready`, and `error` alike — so on a machine with a key they made a real billed API call and cached the reply under the developer's home while still passing. Redirecting the directory does nothing about the process environment, which is why the suite must clear the keys as well. No new variable is introduced, the default stays `~/.codemble`, and explicit `environ`/`config_path`/`cache_root` arguments still win over both channels |
462
+ | 2026-07-20 | Progress reporting is a thread-scoped per-file hook (`note_file_parsed`) bound by `ProjectParser`, not a new `LanguageAdapter` parameter | The public adapter seam must stay unchanged for Phase 2 languages; one hook site per adapter also gives cancellation its exact "between files" meaning |
463
+ | 2026-07-20 | Phase C adds `DELETE /api/progress`, the `CLEAR_PROGRESS` session event, and a `clearProgress` adapter method beyond the shared contract's Phase C rows | The contract's Phase C rows covered parse progress only, while the no-reset-progress-control gap is mapped to Phase C by the spec; recorded here rather than silently widened |
464
+ | 2026-07-20 | Generated check suites are pinned by a committed golden fixture before any performance work touches `checks/service.py` | The Correctness Contract makes suite drift top-severity, and a refactor that changes an answer is invisible without a byte-level pin |
363
465
 
364
466
  ## Non-Goals — do NOT build (point here when asked)
365
467
 
366
468
  - ❌ Free-flight 3D navigation — semantic zoom only
367
469
  - ❌ XP, streaks, levels, leaderboards
368
- - ❌ A second 2D renderer/toggle in v1 (render-ready graph keeps one possible later)
470
+ - ❌ ~~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
471
  - ❌ Accounts, cloud hosting, multi-user; share link waits for Phase 3
370
- - ❌ Local models (Ollama)
371
472
  - ❌ Extra quest types before Phase 3
372
473
  - ❌ GitHub-URL ingestion in v1
373
474
  - ❌ Elaborate game art before the loop teaches well
@@ -401,7 +502,7 @@ JS/TS certainty and concept evidence remain parser-proven through the unchanged
401
502
 
402
503
  ## Edge cases & limits
403
504
 
404
- - >~300 supported source files → prompt to scope to a subdirectory (LOD arrives Phase 2)
505
+ - >~1,000 supported source files → prompt to scope to a subdirectory (LOD arrives Phase 2)
405
506
  - No clear entrypoint → ranked candidates; user picks Home
406
507
  - Syntax errors / partial parses → parse what you can, flag the rest, never crash
407
508
  - Missing/invalid key → galaxy + structure + checks work; explanations show "add your key"