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.
- {codemble-0.3.1 → codemble-0.5.0}/.github/workflows/ci.yml +4 -4
- {codemble-0.3.1 → codemble-0.5.0}/.github/workflows/pages.yml +4 -4
- {codemble-0.3.1 → codemble-0.5.0}/.gitignore +6 -0
- codemble-0.5.0/CHANGELOG.md +344 -0
- {codemble-0.3.1 → codemble-0.5.0}/CLAUDE.md +107 -6
- {codemble-0.3.1 → codemble-0.5.0}/PKG-INFO +133 -19
- {codemble-0.3.1 → codemble-0.5.0}/README.md +132 -18
- {codemble-0.3.1 → codemble-0.5.0}/TESTING.md +9 -3
- {codemble-0.3.1 → codemble-0.5.0}/codemble/__init__.py +1 -1
- codemble-0.5.0/codemble/adapters/parse_progress.py +99 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/project.py +50 -16
- {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/python_ast.py +23 -5
- {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/typescript_tree_sitter.py +4 -1
- codemble-0.5.0/codemble/checks/service.py +448 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/graph/__init__.py +3 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/graph/finalize.py +8 -7
- {codemble-0.3.1 → codemble-0.5.0}/codemble/graph/layout.py +82 -23
- codemble-0.5.0/codemble/graph/mapview.py +315 -0
- codemble-0.5.0/codemble/lens/javascript_typescript.py +112 -0
- codemble-0.5.0/codemble/lens/python.py +95 -0
- codemble-0.5.0/codemble/llm/local_status.py +66 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/llm/providers.py +91 -1
- codemble-0.5.0/codemble/llm/structural.py +127 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/llm/study.py +117 -36
- codemble-0.5.0/codemble/paths.py +27 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/progress/store.py +60 -17
- codemble-0.5.0/codemble/server/app.py +520 -0
- codemble-0.5.0/codemble/server/parse_job.py +153 -0
- codemble-0.5.0/codemble/server/runtime.py +141 -0
- codemble-0.5.0/codemble/web_dist/assets/index-BlkEA_-c.js +5352 -0
- codemble-0.5.0/codemble/web_dist/assets/index-xOQxhaMB.css +1 -0
- codemble-0.5.0/codemble/web_dist/index.html +28 -0
- codemble-0.5.0/docs/plans/2026-07-19-audience-modes-and-local-narration-design.md +292 -0
- codemble-0.5.0/docs/plans/2026-07-19-audience-modes-backend-plan.md +1701 -0
- codemble-0.5.0/docs/plans/2026-07-19-audience-modes-frontend-plan.md +539 -0
- codemble-0.5.0/docs/releases/checklist.md +35 -0
- codemble-0.5.0/docs/releases/v0.4.0.md +118 -0
- codemble-0.5.0/docs/releases/v0.5.0.md +94 -0
- codemble-0.5.0/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-a.md +3480 -0
- codemble-0.5.0/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-b.md +3556 -0
- codemble-0.5.0/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-c.md +3905 -0
- codemble-0.5.0/docs/superpowers/plans/2026-07-19-galaxy-ux-shared-contract.md +105 -0
- codemble-0.5.0/docs/superpowers/specs/2026-07-19-galaxy-ux-overhaul-design.md +352 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/astro.config.mjs +3 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/package.json +1 -1
- codemble-0.5.0/docs-site/public/brand/icons/asterism.svg +6 -0
- codemble-0.5.0/docs-site/public/brand/icons/install.svg +5 -0
- codemble-0.5.0/docs-site/public/shots/easy-mode.png +0 -0
- codemble-0.5.0/docs-site/public/shots/galaxy-lit.png +0 -0
- codemble-0.5.0/docs-site/public/shots/galaxy.png +0 -0
- codemble-0.5.0/docs-site/public/shots/loading.png +0 -0
- codemble-0.5.0/docs-site/public/shots/map-architecture.png +0 -0
- codemble-0.5.0/docs-site/public/shots/map-workflow.png +0 -0
- codemble-0.5.0/docs-site/public/shots/study-panel.png +0 -0
- codemble-0.5.0/docs-site/public/shots/system.png +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/architecture.md +7 -1
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/checks-and-lighting.md +27 -1
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/early-testing.md +7 -1
- codemble-0.5.0/docs-site/src/content/docs/installation.md +128 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/introduction.md +12 -8
- codemble-0.5.0/docs-site/src/content/docs/progress/m12-galaxy-look.md +60 -0
- codemble-0.5.0/docs-site/src/content/docs/progress/m13-scale.md +53 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/quickstart.md +37 -13
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/roadmap.md +3 -1
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/star-chart.md +5 -0
- codemble-0.5.0/docs-site/src/content/docs/study-panel.md +74 -0
- codemble-0.5.0/docs-site/src/content/docs/the-galaxy.md +141 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/pages/index.astro +56 -9
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/styles/custom.css +70 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/styles/landing.css +61 -0
- {codemble-0.3.1 → codemble-0.5.0}/pyproject.toml +1 -1
- codemble-0.5.0/tests/conftest.py +57 -0
- codemble-0.5.0/tests/fixtures/check_suites.json +1240 -0
- codemble-0.5.0/tests/fixtures/impact/alpha.py +6 -0
- codemble-0.5.0/tests/fixtures/impact/beta.py +5 -0
- codemble-0.5.0/tests/fixtures/impact/gamma.py +5 -0
- codemble-0.5.0/tests/fixtures/impact/helpers.py +6 -0
- codemble-0.5.0/tests/fixtures/impact/noisy.py +9 -0
- codemble-0.5.0/tests/fixtures/repeated_calls.py +9 -0
- codemble-0.5.0/tests/test_checks.py +383 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/test_graph_finalization.py +39 -0
- codemble-0.5.0/tests/test_mapview.py +262 -0
- codemble-0.5.0/tests/test_parse_job.py +167 -0
- codemble-0.5.0/tests/test_parse_progress.py +134 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/test_progress.py +25 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/test_project_parser.py +29 -0
- codemble-0.5.0/tests/test_providers.py +260 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/test_python_ast.py +127 -2
- codemble-0.5.0/tests/test_server.py +1235 -0
- codemble-0.5.0/tests/test_smoke.py +214 -0
- codemble-0.5.0/tests/test_structural.py +121 -0
- codemble-0.5.0/tests/test_study.py +589 -0
- codemble-0.5.0/web/index.html +27 -0
- {codemble-0.3.1 → codemble-0.5.0}/web/package-lock.json +2 -2
- {codemble-0.3.1 → codemble-0.5.0}/web/package.json +1 -1
- codemble-0.5.0/web/scripts/check_graph_data.mjs +234 -0
- codemble-0.5.0/web/scripts/check_learner_session.mjs +2063 -0
- codemble-0.5.0/web/src/App.jsx +1187 -0
- codemble-0.5.0/web/src/GalaxyCanvas.jsx +466 -0
- codemble-0.5.0/web/src/GuidanceLayer.jsx +117 -0
- codemble-0.5.0/web/src/MapView.jsx +305 -0
- codemble-0.5.0/web/src/ModeControl.jsx +112 -0
- codemble-0.5.0/web/src/StudyPanel.jsx +390 -0
- codemble-0.5.0/web/src/galaxyEffects.js +122 -0
- codemble-0.5.0/web/src/galaxyMaterials.js +199 -0
- {codemble-0.3.1 → codemble-0.5.0}/web/src/graphData.js +112 -18
- codemble-0.5.0/web/src/learnerSession.js +1472 -0
- codemble-0.5.0/web/src/main.jsx +58 -0
- {codemble-0.3.1 → codemble-0.5.0}/web/src/styles.css +930 -21
- codemble-0.5.0/web/src/tokens.css +45 -0
- codemble-0.3.1/CHANGELOG.md +0 -154
- codemble-0.3.1/codemble/checks/service.py +0 -380
- codemble-0.3.1/codemble/lens/javascript_typescript.py +0 -82
- codemble-0.3.1/codemble/lens/python.py +0 -71
- codemble-0.3.1/codemble/server/app.py +0 -273
- codemble-0.3.1/codemble/server/runtime.py +0 -68
- codemble-0.3.1/codemble/web_dist/assets/index-DOBVd_-M.css +0 -1
- codemble-0.3.1/codemble/web_dist/assets/index-cIG6GGIB.js +0 -5238
- codemble-0.3.1/codemble/web_dist/index.html +0 -18
- codemble-0.3.1/docs/releases/checklist.md +0 -14
- codemble-0.3.1/docs-site/src/content/docs/installation.md +0 -69
- codemble-0.3.1/docs-site/src/content/docs/the-galaxy.md +0 -44
- codemble-0.3.1/tests/test_checks.py +0 -103
- codemble-0.3.1/tests/test_server.py +0 -323
- codemble-0.3.1/tests/test_smoke.py +0 -75
- codemble-0.3.1/tests/test_study.py +0 -229
- codemble-0.3.1/web/index.html +0 -17
- codemble-0.3.1/web/scripts/check_graph_data.mjs +0 -77
- codemble-0.3.1/web/scripts/check_learner_session.mjs +0 -417
- codemble-0.3.1/web/src/App.jsx +0 -689
- codemble-0.3.1/web/src/GalaxyCanvas.jsx +0 -235
- codemble-0.3.1/web/src/learnerSession.js +0 -681
- codemble-0.3.1/web/src/main.jsx +0 -20
- codemble-0.3.1/web/src/tokens.css +0 -23
- {codemble-0.3.1 → codemble-0.5.0}/.env.example +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/.gitattributes +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/.github/ISSUE_TEMPLATE/early_tester.yml +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/.github/dependabot.yml +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/.github/workflows/publish-pypi.yml +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/AGENTS.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/CODE_OF_CONDUCT.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/CONTRIBUTING.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/LICENSE +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/NOTICE +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/SECURITY.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/assets/demo.gif +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/__init__.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/base.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/adapters/discovery.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/checks/__init__.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/cli.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/lens/__init__.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/llm/__init__.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/progress/__init__.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/server/__init__.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/shippori-mincho-latin-500-normal-C-QwvIb3.woff +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/shippori-mincho-latin-500-normal-XI1O8euf.woff2 +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/shippori-mincho-latin-700-normal-CkoCYOiI.woff +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/shippori-mincho-latin-700-normal-DHcmzUO5.woff2 +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/zen-kaku-gothic-new-latin-400-normal-BEdayliK.woff2 +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/codemble/web_dist/assets/zen-kaku-gothic-new-latin-400-normal-CPSmNJAU.woff +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs/adr/README.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs/plans/2026-07-19-install-ux-folder-picker-design.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs/plans/2026-07-19-install-ux-folder-picker-plan.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs/plans/README.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs/plans/phase-1.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs/releases/v0.1.0.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs/releases/v0.2.0.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs/research/README.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/.gitignore +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/design.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/favicon-16.png +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/favicon-32.png +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/icon-180.png +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/icon-192.png +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/icon-512.png +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/icon.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/mark-animated.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/mark.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/hero-chart.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/hero-field.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/hero-gold.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/kasumi-rule.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/plate-galaxy.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/plate-study.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/plate-system.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/brand/plates/seal.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/public/favicon.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/scripts/build-plates.mjs +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/assets/codemble-mark-dark.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/assets/codemble-mark-light.svg +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/components/Search.astro +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/components/Tatebanko.astro +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/build-from-source.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/contributing.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/correctness.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m1-parser.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m10-polyglot-release.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m2-galaxy.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m3-study.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m4-lens.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m5-checks.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m6-release.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m8-typescript.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content/docs/progress/m9-typescript-lens.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/content.config.ts +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/docs-site/src/styles/tokens.css +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/scripts/dev.sh +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/scripts/record_demo.sh +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/concepts_sample.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/python_worker.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/broken.ts +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/legacy.js +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/local.js +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/main.ts +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/reexport.ts +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/util.ts +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/polyglot/src/widget.tsx +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/.gitignore +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/ambiguous.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/api.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/app.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/broken.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/cli.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/pkg/__init__.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/pkg/helpers.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/pkg/service.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/pkg/util.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/runner/__main__.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/fixtures/sampleproj/shared.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/tests/test_typescript_tree_sitter.py +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/web/README.md +0 -0
- {codemble-0.3.1 → codemble-0.5.0}/web/scripts/record_demo.mjs +0 -0
- {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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
25
|
+
- uses: actions/setup-node@v7
|
|
26
26
|
with:
|
|
27
27
|
node-version: "22"
|
|
28
|
-
- uses: actions/configure-pages@
|
|
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@
|
|
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@
|
|
45
|
+
uses: actions/deploy-pages@v5
|
|
@@ -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-
|
|
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
|
|
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
|
|
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
|
-
- >~
|
|
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"
|