codebeacon 0.6.9__tar.gz → 0.7.1__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.
- {codebeacon-0.6.9 → codebeacon-0.7.1}/PKG-INFO +177 -3
- {codebeacon-0.6.9 → codebeacon-0.7.1}/README.de.md +34 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/README.es.md +34 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/README.fr.md +34 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/README.ja.md +34 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/README.ko.md +34 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/README.md +171 -1
- {codebeacon-0.6.9 → codebeacon-0.7.1}/README.pt-BR.md +34 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/README.zh-CN.md +34 -0
- codebeacon-0.7.1/action/README.md +110 -0
- codebeacon-0.7.1/action/action.yml +86 -0
- codebeacon-0.7.1/action/examples/pr-context.yml +37 -0
- codebeacon-0.7.1/action/pr_context.py +416 -0
- codebeacon-0.7.1/codebeacon/__init__.py +1 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/affected.py +31 -3
- codebeacon-0.7.1/codebeacon/cache.py +654 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/cli.py +358 -20
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/common/filters.py +206 -4
- codebeacon-0.7.1/codebeacon/common/io.py +102 -0
- codebeacon-0.7.1/codebeacon/common/safety.py +347 -0
- codebeacon-0.7.1/codebeacon/common/symbols.py +235 -0
- codebeacon-0.7.1/codebeacon/common/textio.py +79 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/common/types.py +15 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/config.py +69 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/contextmap/generator.py +316 -37
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/diagnostics.py +110 -4
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/discover/detector.py +52 -11
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/discover/ignore.py +170 -16
- codebeacon-0.7.1/codebeacon/discover/scanner.py +742 -0
- codebeacon-0.7.1/codebeacon/export/assets.py +118 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/export/callflow_html.py +85 -29
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/export/hooks.py +112 -18
- codebeacon-0.7.1/codebeacon/export/mcp.py +1088 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/export/obsidian.py +266 -79
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/export/tree_html.py +83 -18
- codebeacon-0.7.1/codebeacon/export/vendor/LICENSE-d3.txt +13 -0
- codebeacon-0.7.1/codebeacon/export/vendor/LICENSE-mermaid.txt +21 -0
- codebeacon-0.7.1/codebeacon/export/vendor/README.md +30 -0
- codebeacon-0.7.1/codebeacon/export/vendor/d3.v7.min.js +2 -0
- codebeacon-0.7.1/codebeacon/export/vendor/mermaid.min.js +2024 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/base.py +77 -6
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/components.py +89 -24
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/dependencies.py +64 -20
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/dotnet.py +54 -18
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/actix.scm +72 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/aspnet.scm +64 -5
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/django.scm +14 -1
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/express.scm +58 -1
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/fastapi.scm +44 -25
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/flask.scm +20 -2
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/laravel.scm +19 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/rails.scm +29 -8
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/react.scm +77 -0
- codebeacon-0.7.1/codebeacon/extract/query_check.py +426 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/routes.py +362 -78
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/services.py +217 -24
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/graph/analyze.py +32 -3
- codebeacon-0.7.1/codebeacon/graph/build.py +1106 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/graph/cluster.py +69 -15
- codebeacon-0.7.1/codebeacon/graph/jsmodules.py +448 -0
- codebeacon-0.7.1/codebeacon/graph/write.py +920 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/knowledge/__init__.py +18 -2
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/knowledge/generator.py +170 -9
- codebeacon-0.7.1/codebeacon/knowledge/link.py +745 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/pipeline.py +295 -48
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/semantic_pipeline.py +570 -91
- codebeacon-0.7.1/codebeacon/watch.py +372 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/wave.py +28 -6
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/wiki/generator.py +117 -59
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/wiki/index.py +26 -12
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/wiki/templates.py +57 -16
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon.yaml.example +1 -0
- codebeacon-0.7.1/npm/README.md +98 -0
- codebeacon-0.7.1/npm/bin/run.js +120 -0
- codebeacon-0.7.1/npm/package.json +35 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/pyproject.toml +22 -1
- codebeacon-0.7.1/tests/fixtures/warp_app/src/main.rs +76 -0
- codebeacon-0.7.1/tests/fixtures_070_extract_js/aliased.py +4 -0
- codebeacon-0.7.1/tests/fixtures_070_extract_js/aliased.rs +5 -0
- codebeacon-0.7.1/tests/fixtures_070_extract_js/dyn.ts +29 -0
- codebeacon-0.7.1/tests/fixtures_070_extract_js/store.js +14 -0
- codebeacon-0.7.1/tests/fixtures_070_extract_js/store.ts +46 -0
- codebeacon-0.7.1/tests/fixtures_070_extract_js/types_only.ts +3 -0
- codebeacon-0.7.1/tests/test_action_pr_context.py +287 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_069_graph.py +8 -3
- codebeacon-0.7.1/tests/test_audit_070_cache_watch_cluster.py +994 -0
- codebeacon-0.7.1/tests/test_audit_070_cli.py +713 -0
- codebeacon-0.7.1/tests/test_audit_070_discover.py +941 -0
- codebeacon-0.7.1/tests/test_audit_070_export.py +667 -0
- codebeacon-0.7.1/tests/test_audit_070_extract_js.py +263 -0
- codebeacon-0.7.1/tests/test_audit_070_graph_symbols.py +885 -0
- codebeacon-0.7.1/tests/test_audit_070_mcp.py +366 -0
- codebeacon-0.7.1/tests/test_audit_070_pipeline.py +1443 -0
- codebeacon-0.7.1/tests/test_audit_070_routes_frameworks.py +944 -0
- codebeacon-0.7.1/tests/test_audit_070_semantic_knowledge.py +989 -0
- codebeacon-0.7.1/tests/test_contextmap_rules_split.py +336 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_discover.py +8 -5
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_filters.py +7 -3
- codebeacon-0.7.1/tests/test_fixture_exclusion.py +87 -0
- codebeacon-0.7.1/tests/test_knowledge_graph_link.py +303 -0
- codebeacon-0.7.1/tests/test_npm_wrapper.py +191 -0
- codebeacon-0.7.1/tests/test_query_node_types.py +234 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_safety_and_writes.py +48 -15
- codebeacon-0.7.1/tests/test_warp_routes.py +144 -0
- codebeacon-0.7.1/tests/test_watch_mode.py +364 -0
- codebeacon-0.6.9/codebeacon/__init__.py +0 -1
- codebeacon-0.6.9/codebeacon/cache.py +0 -320
- codebeacon-0.6.9/codebeacon/common/safety.py +0 -181
- codebeacon-0.6.9/codebeacon/common/symbols.py +0 -127
- codebeacon-0.6.9/codebeacon/discover/scanner.py +0 -364
- codebeacon-0.6.9/codebeacon/export/mcp.py +0 -640
- codebeacon-0.6.9/codebeacon/graph/build.py +0 -633
- codebeacon-0.6.9/codebeacon/graph/write.py +0 -363
- {codebeacon-0.6.9 → codebeacon-0.7.1}/.cursorrules +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/.github/CODEOWNERS +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/.github/dependabot.yml +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/.github/workflows/ci.yml +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/.github/workflows/release.yml +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/.gitignore +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/AGENTS.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/CLAUDE.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/LICENSE +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/__main__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/common/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/contextmap/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/discover/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/export/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/export/merge.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/entities.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/README.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/angular.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/gin.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/ktor.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/nestjs.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/spring_boot.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/svelte.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/tauri.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/vapor.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/queries/vue.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/extract/semantic.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/graph/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/graph/enrich.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/plugins/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/plugins/githooks.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/plugins/skills.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/skill/SKILL.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/codebeacon/wiki/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/docs/TRANSLATION_STATUS.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/public-plan.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/skill/install.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/conftest.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/actix/main.rs +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/angular/app.component.ts +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/aspnet/UserController.cs +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/django/views.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/express/userRouter.js +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/fastapi/main.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/flask/app.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/gin/main.go +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/api-python/pyproject.toml +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/api-python/src/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/api-python/src/main.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/api-python/src/services.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/web/package.json +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/web/src/UserPage.tsx +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/ktor/UserRoutes.kt +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/laravel/UserController.php +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/nestjs/user.controller.ts +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/rails/users_controller.rb +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/react/UserPage.tsx +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/spring_boot/UserController.java +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/sveltekit/+page.svelte +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/vapor/routes.swift +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/fixtures/vue/UserList.vue +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/integration/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/integration/test_full_pipeline.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_affected.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_affected_wiki.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_069_cli.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_069_cluster.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_069_contextmap.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_069_detector.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_069_discover.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_069_export.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_069_extract.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_069_io.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_069_semantic.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_069_wiki.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_audit_bugfixes.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_cli_dispatch.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_cli_upgrade.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_contextmap_paths.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_deep_dive_grouping.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_dependencies.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_diagnostics.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_dotnet.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_entities.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_graph.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_graphify_parity_0_6_3.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_graphify_parity_0_6_6.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_graphify_parity_0_6_7.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_graphify_parity_0_6_8.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_graphify_parity_fixes.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_independent_audit_fixes.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_knowledge.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_known_bugs.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_mcp_and_semantic.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_optional_grammars.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_pipeline_module.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_plugins.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_resolve.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_routes.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_scanner_sensitive.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_semantic.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_semantic_hardening.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_semantic_stats.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_services.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.1}/tests/test_wiki.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: codebeacon
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.1
|
|
4
4
|
Summary: Source code AST analysis tool for AI context generation — unified multi-framework knowledge graph
|
|
5
5
|
Project-URL: Homepage, https://github.com/codebeacon/codebeacon
|
|
6
6
|
Project-URL: Repository, https://github.com/codebeacon/codebeacon
|
|
@@ -49,6 +49,7 @@ Requires-Dist: tree-sitter-ruby<0.24,>=0.23; extra == 'dev'
|
|
|
49
49
|
Requires-Dist: tree-sitter-rust<0.25,>=0.23; extra == 'dev'
|
|
50
50
|
Requires-Dist: tree-sitter-svelte<1.1,>=0.23; extra == 'dev'
|
|
51
51
|
Requires-Dist: tree-sitter-swift<0.8,>=0.0.1; extra == 'dev'
|
|
52
|
+
Requires-Dist: watchdog<8,>=4; extra == 'dev'
|
|
52
53
|
Provides-Extra: dotnet
|
|
53
54
|
Requires-Dist: tree-sitter-c-sharp<0.24,>=0.23; extra == 'dotnet'
|
|
54
55
|
Provides-Extra: full
|
|
@@ -62,6 +63,7 @@ Requires-Dist: tree-sitter-ruby<0.24,>=0.23; extra == 'full'
|
|
|
62
63
|
Requires-Dist: tree-sitter-rust<0.25,>=0.23; extra == 'full'
|
|
63
64
|
Requires-Dist: tree-sitter-svelte<1.1,>=0.23; extra == 'full'
|
|
64
65
|
Requires-Dist: tree-sitter-swift<0.8,>=0.0.1; extra == 'full'
|
|
66
|
+
Requires-Dist: watchdog<8,>=4; extra == 'full'
|
|
65
67
|
Provides-Extra: go
|
|
66
68
|
Requires-Dist: tree-sitter-go<0.26,>=0.23; extra == 'go'
|
|
67
69
|
Provides-Extra: html
|
|
@@ -86,6 +88,8 @@ Provides-Extra: svelte
|
|
|
86
88
|
Requires-Dist: tree-sitter-svelte<1.1,>=0.23; extra == 'svelte'
|
|
87
89
|
Provides-Extra: swift
|
|
88
90
|
Requires-Dist: tree-sitter-swift<0.8,>=0.0.1; extra == 'swift'
|
|
91
|
+
Provides-Extra: watch
|
|
92
|
+
Requires-Dist: watchdog<8,>=4; extra == 'watch'
|
|
89
93
|
Provides-Extra: web
|
|
90
94
|
Requires-Dist: tree-sitter-html<0.24,>=0.23; extra == 'web'
|
|
91
95
|
Requires-Dist: tree-sitter-svelte<1.1,>=0.23; extra == 'web'
|
|
@@ -118,6 +122,40 @@ Description-Content-Type: text/markdown
|
|
|
118
122
|
|
|
119
123
|
---
|
|
120
124
|
|
|
125
|
+
## What's new in 0.7.1
|
|
126
|
+
|
|
127
|
+
The largest audit release yet: a dual upstream-parity sweep (graphify v0.9.13–v0.9.53 / issues #1777–#3235, plus codesight #50–#55) verified against codebeacon with mandatory reproduction — **~70 confirmed defects fixed** by ten parallel fixers, every fix mutation-tested, then adversarially reviewed by the lead with real-CLI integration runs. Suite: 885 → 1,481 tests.
|
|
128
|
+
|
|
129
|
+
- **The JS/TS graph roughly doubled** — exported lowercase arrows, `const`s, and object-literal members (`export const useAuthStore = …`, `authUtils.clear`) finally become nodes: on a real 865-file Next.js app, component nodes went **960 → 2,237** and files contributing nothing fell 406 → 108. Imports now resolve by **path** first (relative specifiers, `tsconfig`/`jsconfig` aliases with `extends` chains and `${configDir}`, package suffixes) before falling back to labels — so `from codebeacon.graph.build import …` can no longer bind to an unrelated `build` symbol, and the "High-Impact Files" list in CLAUDE.md reflects reality. Plain-JS `class X extends Y` heritage and dynamic `await import()` edges are captured too.
|
|
130
|
+
- **Route prefixes compose like the real frameworks** — verified against running FastAPI/Express/Flask servers: `include_router(prefix=)` composes with the router's own prefix, attribute-form includes (`app.include_router(pkg.router, …)`, `@pkg.router.get`) no longer vanish, same-file cascaded mounts multiply out, a router mounted twice yields both routes, and Flask's `register_blueprint(url_prefix=)` correctly *overrides*. Known limit: a mount chain crossing **files** still isn't composed.
|
|
131
|
+
- **Interface→impl DI resolution actually works now** — a serialization boundary in the extraction pipeline had been silently discarding `implements`/`extends` since 0.6.x, so the whole feature was dead end-to-end while the wiki looked right. Fixed, cache-invalidated, and boundary-tested through the real pipeline. DI binding is also evidence-gated now: no more cross-language or cross-project fabrications (a Spring service can no longer "inject" a React component), ambiguous multi-implementation cases bind only via the `*Impl` naming convention at an explicit `AMBIGUOUS` confidence, and a duplicate edge records its second relation under a new `also` attribute instead of overwriting.
|
|
132
|
+
- **Node identity is deterministic and extension-aware** — `Button.tsx` and `Button.jsx` are two nodes (previously one silently absorbed the other — 6.3% of declarations on codebeacon's own repo); node IDs no longer depend on thread completion order or the checkout directory, so wiki/obsidian filenames stop flapping between runs. Colliding labels get the shortest distinguishing path suffix. (IDs of previously-collapsed nodes will churn once on upgrade.)
|
|
133
|
+
- **The ignore layer matches git much more closely** — nested `.gitignore` files apply to their own subtree (a monorepo's `app/.gitignore` no longer gets ignored, which used to pull tens of thousands of build files into the scan), `.git/info/exclude` is honored, linked worktrees are detected structurally instead of doubling the corpus, and BOM'd / UTF-16 / NFD-encoded ignore files decode instead of silently dropping rules. Ambiguous directory names (`env/`, `build/`, `public/`, `coverage/`, …) are pruned only with corroborating evidence — a UVM `env/` testbench or a Python package named `coverage/` stays in the graph. Matching is ~19× faster, and a new `ignored.json` diagnostic records *why* every subtree was skipped.
|
|
134
|
+
- **The shrink guard now guards the paths that matter** — it used to be disarmed by the mere presence of `--update`, i.e. on exactly the unattended paths (watch, git hooks, CI); a permission error could silently halve your committed graph. It now attributes every removed node to its source file (deleted / newly-ignored / **unexplained** — only the last refuses, with a real `--force` flag), stays armed everywhere, treats an unreadable subtree as "unknown, don't waive", and warns when edges collapse even though nodes held steady.
|
|
135
|
+
- **`scan → knowledge → scan` no longer wedges** — 0.7.0's documented flow either exited 1 ("refusing to shrink") or silently discarded your notes overlay. The guard is tier-aware now and the knowledge overlay is **auto-reapplied after every scan**; deleting a note prunes exactly that note. Authored `[[wikilinks]]` finally create edges (they were parsed and then dropped — 100% loss), notes carry `node_kind`/frontmatter, and generated files (CLAUDE.md, KNOWLEDGE.md) are no longer re-ingested as notes.
|
|
136
|
+
- **A committed index stays clean** — an unchanged rescan now rewrites **zero** committed files (was: every one of them, ~31k-file churn upstream): `built_at_ts` derives from the commit, exports write only on content change, and the machine-local AST cache git-ignores itself. HTML exports (`beacon.html`, `callflow.html`) ship their JS **offline by default** (vendored d3 + mermaid under `_assets/`) — matching the air-gapped posture; set `output.html_assets: cdn` to keep the old behavior. Absolute build-machine paths no longer leak into any artifact.
|
|
137
|
+
- **MCP answers you can trust programmatically** — tool failures return `isError: true` with the actionable message (instead of success-shaped error prose, or a protocol error the client swallows); name resolution prefers an exact match before substrings, so `blast_radius("User")` no longer answers about `UserServiceImpl`; every tool honors a `token_budget` (default 2,000 tokens) and announces truncation against the true total.
|
|
138
|
+
- **Robustness & security sweep** — `.csproj` XML is parsed with a DOCTYPE/ENTITY screen; model-facing text (MCP output, CLAUDE.md) neutralizes chat-template control tokens by form (`<|…|>`, `[INST]`); `hook install` works in git worktrees and never leaves a repo half-configured; `install`/`upgrade` back up a hand-edited SKILL.md instead of clobbering it, and an unterminated marker can no longer delete user content below it; a cp949/latin-1 CLAUDE.md doesn't crash the scan; `codebeacon … | head` exits cleanly; watch mode no longer re-triggers itself on Linux inotify events; Leiden clustering is seeded, so communities stop drifting 12% per rescan.
|
|
139
|
+
|
|
140
|
+
Upgrade notes: node IDs for previously-collapsed declarations churn once; semantic `task_id`s are invalidated once (tasks now hash the whole file, fixing "edits past char 4,000 never re-analyzed"); the AST cache is invalidated once (schema stamp); new edge attribute `also`, new confidence value `AMBIGUOUS`, new `verification` marker on semantic-minted externals. If your repo already committed `.codebeacon/cache/`, run `git rm --cached -r .codebeacon/cache` once — the new self-ignoring `.gitignore` cannot untrack files that are already tracked.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## What's new in 0.7.0
|
|
145
|
+
|
|
146
|
+
A capability release rather than a bug sweep: codebeacon grows a live file-watcher, links your design notes into the code graph, ships two new front-ends (an npm launcher for the MCP server and a GitHub Action), and tightens what it indexes by default. Every feature stays local-first — the core scan still needs no network, no cloud, and no model.
|
|
147
|
+
|
|
148
|
+
- **`codebeacon watch` keeps the index live** — a debounced file-watcher (`codebeacon watch [path] [--debounce 2.0] [--once] [--exclude PATTERN]`) re-syncs the graph whenever watched source files change. A burst of edits — a 500-file `git checkout`, a branch switch — coalesces into a single resync, and the watcher reuses the scanner's exact ignore rules so writing the index never wakes it into a loop over its own `.codebeacon/` output. Needs the new optional extra: `pip install 'codebeacon[watch]'` (watchdog).
|
|
149
|
+
- **Design notes link into the code graph** — `codebeacon knowledge` now writes its notes (ADRs, meeting notes, retros, specs) *into* `beacon.json` when an index already exists: an explicit file-path reference becomes a trusted `references` edge, and a distinctive symbol mention (`PaymentService`, never a bare `User`) becomes an `AMBIGUOUS` `mentions` edge — so an agent reading the graph learns *why* a service is shaped the way it is. Because `codebeacon scan` rebuilds the code graph from source alone and drops this overlay, **re-run `codebeacon knowledge` after a scan** to restore the links.
|
|
150
|
+
- **`beacon_knowledge` MCP tool** — a new tool searches notes by keyword and/or lists the notes linked to a given code node, exposing the decision trail behind the code directly over MCP.
|
|
151
|
+
- **npm launcher for the MCP server** — `@codebeacon/mcp` lets MCP clients start the server the npx-first way they expect (`"command": "npx", "args": ["-y", "@codebeacon/mcp"]`). The zero-dependency Node shim resolves a working codebeacon via PATH → `uvx` → `pipx run` → `python3 -m codebeacon` and forwards stdio untouched. See [`npm/README.md`](npm/README.md). (Ships with 0.7.0; not yet published to npm.)
|
|
152
|
+
- **GitHub Action for PR context** — a composite action comments on every pull request with the affected slice of your committed knowledge graph: the wiki articles the change touches, the upstream blast radius, and any high-impact hub files it edits — an architecture-drift check for AI-era review. Requires a committed `.codebeacon/` index, `fetch-depth: 0`, and `permissions: pull-requests: write`. See [`action/README.md`](action/README.md) and [`action/examples/pr-context.yml`](action/examples/pr-context.yml).
|
|
153
|
+
- **Workspace CLAUDE.md stays under ~200 lines** — in a multi-project workspace the root `CLAUDE.md` now keeps only the shared overview and moves per-project detail into scoped `.claude/rules/codebeacon-<project>.md` files whose `paths:` frontmatter loads them only when that project's files are touched (following Anthropic's own guidance for context files). Single-project output is unchanged; set `output.context_map.rules_split: false` for the old monolithic file. Duplicate project rows are also collapsed.
|
|
154
|
+
- **Test fixtures are ignored by default** — `tests/fixtures/`, `test/fixtures/`, and `__fixtures__/` at any depth are now default-ignored, so a project's synthetic test inputs stop injecting fake routes and services into the graph (codebeacon's own self-scan had reported a fixture `main.py` as five "routes"). It is the lowest-precedence rule, so a `.codebeaconignore` line `!tests/fixtures/` re-includes them, and pointing a scan *at* a fixture directory still collects it.
|
|
155
|
+
- **Warp route extraction is real now** — Warp's filter-combinator routes are actually extracted: `warp::path!(...)` and `warp::path("x")` segments, method combinators (`warp::get()` / `post()` / …), and `.map` / `.and_then` handlers are correlated by their enclosing binding into whole routes. Honest limits (spelled out in the query header): filters joined by `.or(...)` inside one binding collapse into a single concatenated route, and `warp::path::param()` filter-call segments and closure handlers are left unresolved.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
121
159
|
## What's new in 0.6.9
|
|
122
160
|
|
|
123
161
|
The largest audit release to date: a dual upstream-parity sweep (the first-ever full audit of codesight's tracker, plus graphify v0.9.4–v0.9.12 / issues through #1776) combined with an independent multi-agent bug hunt over codebeacon itself. Every candidate was reproduced before fixing, every fix was mutation-tested, and an adversarial second review then attacked the fixes themselves — catching 18 further holes before release. **48 real bugs fixed.**
|
|
@@ -282,7 +320,8 @@ Existing tools solve this partially. Route analyzers map your controllers but mi
|
|
|
282
320
|
- **Deep-dive mode** — `--deep-dive` generates per-project `.codebeacon/` + `CLAUDE.md` for every sub-project; running `codebeacon scan . --update` from any sub-project folder automatically syncs all projects in the workspace
|
|
283
321
|
- **Workspace auto-rediscovery** — on every `scan` / `sync`, codebeacon re-scans the workspace and appends any new project folders to `codebeacon.yaml` before extraction, so freshly added sub-projects are never silently skipped; pass `--no-rediscover` to opt out for hand-curated configs
|
|
284
322
|
- **Graphify-style semantic enrichment** — after AST extraction, the skill dispatches one parallel subagent per chunk to emit `{nodes, edges, hyperedges}` with 8 relation types (`calls`/`implements`/`references`/`cites`/`conceptually_related_to`/`shares_data_with`/`semantically_similar_to`/`rationale_for`) and EXTRACTED/INFERRED/AMBIGUOUS confidence; on Claude Code the subagent runs one tier below the host model (Opus→Sonnet, Sonnet→Haiku) so spend stays proportional to corpus size. AST owns code nodes; LLM only contributes `concept`/`document`/`paper` nodes. Existing 0.3.x archives replay through the new schema unchanged.
|
|
285
|
-
- **Knowledge mode (`codebeacon knowledge`)** — scan markdown notes (ADRs, meeting notes, retros, specs, research) and produce a single `KNOWLEDGE.md` next to `.codebeacon/`. Auto-classifies by filename and heading patterns, parses Obsidian YAML frontmatter and `[[backlinks]]`, surfaces a top-level "Key Decisions" + "Open Questions" rollup so an agent learns *why* the codebase looks the way it does. Pure heuristics — no LLM call.
|
|
323
|
+
- **Knowledge mode (`codebeacon knowledge`)** — scan markdown notes (ADRs, meeting notes, retros, specs, research) and produce a single `KNOWLEDGE.md` next to `.codebeacon/`. Auto-classifies by filename and heading patterns, parses Obsidian YAML frontmatter and `[[backlinks]]`, surfaces a top-level "Key Decisions" + "Open Questions" rollup so an agent learns *why* the codebase looks the way it does. Pure heuristics — no LLM call. When a `beacon.json` already exists, the notes are also **linked into the graph**: explicit file-path references become trusted `references` edges and distinctive symbol mentions become `AMBIGUOUS` `mentions` edges. This overlay is dropped by the next `codebeacon scan` (which rebuilds the code graph from source alone), so re-run `codebeacon knowledge` after a scan to restore it.
|
|
324
|
+
- **Watch mode (`codebeacon watch`)** — a debounced file-watcher re-syncs the index whenever watched source files change, coalescing a burst of edits (a 500-file `git checkout`) into a single resync and reusing the scanner's exact ignore rules so it never loops on its own `.codebeacon/` output. Optional extra: `pip install 'codebeacon[watch]'`.
|
|
286
325
|
- **Bare-path shortcut** — `codebeacon ./src` is now equivalent to `codebeacon scan ./src`; when the first argument isn't a registered subcommand, `scan` is auto-injected, so muscle memory from `graphify <path>` / `codesight <path>` works here too.
|
|
287
326
|
- **Hardened semantic pipeline** — `semantic-apply` guards against malformed agent JSONL (null/list/code-fence lines, missing fields), coerces broken `confidence_score` values (None/NaN/string/out-of-range) to a safe default, snapshots `beacon.json` → `beacon.json.bak` before merging so the AST baseline is always recoverable, and regenerates `beacon.html` + `callflow.html` so visual exports reflect the newly-inferred edges.
|
|
288
327
|
- **Sensitive file/dir guard** — `secrets/`, `credentials/`, `.ssh/`, `.aws/`, `.gnupg/` directories are always skipped; filenames matching credential patterns (`api_token`, `oauth_token`, `private_key`, `client_secret`; underscore *and* hyphen variants) are excluded from the source-file collector before they reach extractors.
|
|
@@ -323,6 +362,18 @@ codebeacon sync # subsequent runs via config
|
|
|
323
362
|
| Swift | Vapor |
|
|
324
363
|
| ArkTS | `.ets` (HarmonyOS) collected — extractors framework-agnostic |
|
|
325
364
|
|
|
365
|
+
> **How the "27 frameworks" count works.** Coverage is grounded in tree-sitter
|
|
366
|
+
> queries, and frameworks in the same grammar family share query files — Rocket
|
|
367
|
+
> reuses Actix-Web's attribute-macro pattern, the JS/TS web frameworks share the
|
|
368
|
+
> class/decorator queries, and so on. That sharing is what makes broad coverage
|
|
369
|
+
> tractable, but it also means depth varies per framework: some are exercised by
|
|
370
|
+
> extensive fixtures, others by a single query pattern. Where a framework has
|
|
371
|
+
> known limits, they're documented at the source — e.g. Warp's `.or(...)` and
|
|
372
|
+
> `warp::path::param()` caveats live in the query header
|
|
373
|
+
> ([`codebeacon/extract/queries/actix.scm`](codebeacon/extract/queries/actix.scm)).
|
|
374
|
+
> If a specific framework matters to you, scan a representative repo and check
|
|
375
|
+
> the routes/services it actually extracts before relying on the number.
|
|
376
|
+
|
|
326
377
|
---
|
|
327
378
|
|
|
328
379
|
## Architecture
|
|
@@ -513,6 +564,71 @@ codebeacon scan .
|
|
|
513
564
|
| `beacon_blast_radius` | Upstream callers + downstream affected nodes |
|
|
514
565
|
| `beacon_routes` | List all HTTP routes, filterable by project |
|
|
515
566
|
| `beacon_services` | List all services/classes, filterable by project |
|
|
567
|
+
| `beacon_knowledge` | Search knowledge notes (ADRs, meetings, retros, specs) or list the notes linked to a code node — the *why* behind the code |
|
|
568
|
+
| `beacon_pr_context` | Given changed files (or a `base` ref), return the wiki articles in their blast radius — read the docs that matter before a PR review |
|
|
569
|
+
|
|
570
|
+
### npm launcher (`@codebeacon/mcp`)
|
|
571
|
+
|
|
572
|
+
MCP clients that prefer to launch servers with `npx` can use the thin Node
|
|
573
|
+
wrapper instead of pointing at the `codebeacon` binary directly:
|
|
574
|
+
|
|
575
|
+
```json
|
|
576
|
+
{
|
|
577
|
+
"mcpServers": {
|
|
578
|
+
"codebeacon": {
|
|
579
|
+
"command": "npx",
|
|
580
|
+
"args": ["-y", "@codebeacon/mcp", "--dir", "/path/to/your/repo/.codebeacon"]
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
The wrapper bundles no Python — it resolves an installed codebeacon on the host
|
|
587
|
+
(PATH → `uvx` → `pipx run` → `python3 -m codebeacon`) and forwards stdio to
|
|
588
|
+
`codebeacon serve` untouched. See [`npm/README.md`](npm/README.md) for the full
|
|
589
|
+
per-client config snippets. (Shipping with 0.7.0; not yet published to npm.)
|
|
590
|
+
|
|
591
|
+
---
|
|
592
|
+
|
|
593
|
+
## GitHub Action — PR context
|
|
594
|
+
|
|
595
|
+
Comment on every pull request with the affected slice of your committed
|
|
596
|
+
knowledge graph — the wiki articles the change touches, the upstream blast
|
|
597
|
+
radius, and any high-impact hub files it edits. It reframes review around
|
|
598
|
+
**architecture drift**: instead of reading a diff in isolation, the comment
|
|
599
|
+
points at the parts of the system that actually move.
|
|
600
|
+
|
|
601
|
+
```yaml
|
|
602
|
+
# .github/workflows/pr-context.yml
|
|
603
|
+
name: codebeacon PR context
|
|
604
|
+
on:
|
|
605
|
+
pull_request:
|
|
606
|
+
types: [opened, synchronize, reopened]
|
|
607
|
+
permissions:
|
|
608
|
+
contents: read
|
|
609
|
+
pull-requests: write # required to post/update the comment
|
|
610
|
+
jobs:
|
|
611
|
+
pr-context:
|
|
612
|
+
runs-on: ubuntu-latest
|
|
613
|
+
steps:
|
|
614
|
+
- uses: actions/checkout@v4
|
|
615
|
+
with:
|
|
616
|
+
fetch-depth: 0 # required — full history so the base is diffable
|
|
617
|
+
- uses: actions/setup-python@v5
|
|
618
|
+
with:
|
|
619
|
+
python-version: "3.12"
|
|
620
|
+
- uses: codebeacon/codebeacon/action@v1
|
|
621
|
+
with:
|
|
622
|
+
base: ${{ github.base_ref }}
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
The Action does **not** scan on the runner — it reads the `.codebeacon/` index
|
|
626
|
+
you commit to the repo (codebeacon's model is that the graph is a
|
|
627
|
+
git-committable artifact). If the index is missing it posts one-time setup
|
|
628
|
+
guidance instead of failing the build, and it updates a single marked comment in
|
|
629
|
+
place rather than stacking duplicates. See [`action/README.md`](action/README.md)
|
|
630
|
+
and [`action/examples/pr-context.yml`](action/examples/pr-context.yml) for inputs
|
|
631
|
+
and edge-case behaviour.
|
|
516
632
|
|
|
517
633
|
---
|
|
518
634
|
|
|
@@ -521,6 +637,7 @@ codebeacon scan .
|
|
|
521
637
|
```bash
|
|
522
638
|
pip install codebeacon # all language grammars included
|
|
523
639
|
pip install codebeacon[cluster] # + Leiden community detection (graspologic)
|
|
640
|
+
pip install codebeacon[watch] # + live file-watcher for `codebeacon watch` (watchdog)
|
|
524
641
|
pip install --upgrade codebeacon # upgrade to latest version with all dependencies
|
|
525
642
|
```
|
|
526
643
|
|
|
@@ -552,6 +669,12 @@ codebeacon sync --config <file> # use a specific config file
|
|
|
552
669
|
codebeacon sync --no-rediscover # don't auto-append newly added projects (hand-curated yaml mode)
|
|
553
670
|
codebeacon sync --exclude PATTERN # same flag, same semantics
|
|
554
671
|
|
|
672
|
+
# Watch mode — keep the index live as you edit (needs the `watch` extra)
|
|
673
|
+
codebeacon watch [path] # re-sync on file changes (default path: cwd)
|
|
674
|
+
codebeacon watch . --debounce 2.0 # quiet-window before a resync fires; coalesces bursts
|
|
675
|
+
codebeacon watch . --once # process one debounce cycle then exit
|
|
676
|
+
codebeacon watch . --exclude 'docs/**' # extra gitignore-style pattern (repeatable)
|
|
677
|
+
|
|
555
678
|
# PR / CI: what does this diff actually break?
|
|
556
679
|
codebeacon affected --base main # walk upstream callers of every changed file
|
|
557
680
|
codebeacon affected --base origin/main --head HEAD --depth 4 --limit 200
|
|
@@ -712,6 +835,11 @@ output:
|
|
|
712
835
|
obsidian: true
|
|
713
836
|
context_map:
|
|
714
837
|
targets: [CLAUDE.md, .cursorrules, AGENTS.md]
|
|
838
|
+
rules_split: true # multi-project workspaces: keep CLAUDE.md under
|
|
839
|
+
# ~200 lines and move per-project detail into
|
|
840
|
+
# scoped .claude/rules/codebeacon-<project>.md
|
|
841
|
+
# files. Set false for the old monolithic CLAUDE.md.
|
|
842
|
+
# No effect on single-project scans.
|
|
715
843
|
|
|
716
844
|
wave:
|
|
717
845
|
auto: true
|
|
@@ -751,6 +879,8 @@ fixtures/
|
|
|
751
879
|
|
|
752
880
|
`!pattern` re-includes a previously-ignored path; later rules override earlier ones. The walker prunes directories whose name matches the rule set, but defers pruning when any negation rule could un-ignore a nested file.
|
|
753
881
|
|
|
882
|
+
**Default fixture exclusion.** `tests/fixtures/`, `test/fixtures/`, and `__fixtures__/` are ignored by default at any depth — test-fixture trees are synthetic inputs for a project's *own* test suite, not product surface, and indexing them injects fake routes and services. This is the lowest-precedence rule, so a `.codebeaconignore` line `!tests/fixtures/` re-includes them, and pointing a scan directly *at* a fixture directory still collects it.
|
|
883
|
+
|
|
754
884
|
---
|
|
755
885
|
|
|
756
886
|
## How It Compares
|
|
@@ -793,6 +923,50 @@ All AST processing is local. Your source code never leaves your machine when you
|
|
|
793
923
|
|
|
794
924
|
---
|
|
795
925
|
|
|
926
|
+
## Air-Gapped & Compliance-Friendly
|
|
927
|
+
|
|
928
|
+
codebeacon's core pipeline — tree-sitter AST parsing → knowledge graph → wiki
|
|
929
|
+
and context map — runs **entirely on your machine**. It requires:
|
|
930
|
+
|
|
931
|
+
- **No network.** The scan makes no outbound calls; nothing about your source
|
|
932
|
+
code leaves the host.
|
|
933
|
+
- **No cloud service.** There is no backend, no account, no telemetry.
|
|
934
|
+
- **No LLM — not even a local one.** The graph, wiki, `beacon.json`, and
|
|
935
|
+
`CLAUDE.md` are all produced by deterministic AST analysis. (The optional
|
|
936
|
+
AI-semantic layer is a *separate*, opt-in step owned by the `/codebeacon`
|
|
937
|
+
agent — it never runs unless you invoke it; see
|
|
938
|
+
[Privacy & Security](#privacy--security) — and the CLI ships no API client,
|
|
939
|
+
key handling, or model name.)
|
|
940
|
+
|
|
941
|
+
That architecture makes codebeacon suitable for **air-gapped and tightly
|
|
942
|
+
regulated environments** — healthcare, defense, legal, finance — where source
|
|
943
|
+
code cannot touch third-party services. To be precise about what that does and
|
|
944
|
+
does not mean: codebeacon makes **no compliance certification claims** (no
|
|
945
|
+
HIPAA, FedRAMP, CMMC, SOC 2, or similar). What it offers is an architecture that
|
|
946
|
+
keeps code on-premises, so it can *fit* within environments governed by those
|
|
947
|
+
policies. Verifying that codebeacon meets the specific controls of your
|
|
948
|
+
environment remains your responsibility.
|
|
949
|
+
|
|
950
|
+
**Offline install.** Because it is a normal Python package with vendored
|
|
951
|
+
grammars, codebeacon installs without internet access on the target host:
|
|
952
|
+
download the wheel and its dependencies on a connected machine, transfer them
|
|
953
|
+
across the air gap, and install from the local files.
|
|
954
|
+
|
|
955
|
+
```bash
|
|
956
|
+
# On a connected machine (include the grammar extras you need — [full] grabs all):
|
|
957
|
+
pip download 'codebeacon[full]' -d ./codebeacon-offline
|
|
958
|
+
|
|
959
|
+
# Transfer ./codebeacon-offline across the air gap, then on the target host:
|
|
960
|
+
pip install --no-index --find-links ./codebeacon-offline 'codebeacon[full]'
|
|
961
|
+
```
|
|
962
|
+
|
|
963
|
+
The base install bundles Python + JavaScript/TypeScript grammars; other
|
|
964
|
+
languages are ordinary wheels pulled in by extras (`[jvm]`, `[backend]`,
|
|
965
|
+
`[full]`, …), so include the extras you need in the download and nothing is
|
|
966
|
+
fetched at runtime.
|
|
967
|
+
|
|
968
|
+
---
|
|
969
|
+
|
|
796
970
|
## Contributing
|
|
797
971
|
|
|
798
972
|
```bash
|
|
@@ -27,6 +27,40 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Neu in 0.7.1
|
|
31
|
+
|
|
32
|
+
Das bisher größte Audit-Release: ein doppelter Upstream-Parity-Sweep (graphify v0.9.13–v0.9.53 / Issues #1777–#3235, dazu codesight #50–#55), gegen codebeacon verifiziert mit verpflichtender Reproduktion — **~70 bestätigte Defekte behoben** von zehn parallelen Fixern, jeder Fix mutationsgetestet, anschließend vom Lead adversarisch reviewt mit echten CLI-Integrationsläufen. Suite: 885 → 1.481 Tests.
|
|
33
|
+
|
|
34
|
+
- **Der JS/TS-Graph hat sich ungefähr verdoppelt** — exportierte kleingeschriebene Arrow-Functions, `const`s und Objektliteral-Member (`export const useAuthStore = …`, `authUtils.clear`) werden endlich zu Nodes: in einer echten Next.js-App mit 865 Dateien stiegen die Komponenten-Nodes von **960 → 2.237**, und die Dateien, die nichts beitrugen, fielen von 406 → 108. Imports werden jetzt zuerst über den **Pfad** aufgelöst (relative Specifier, `tsconfig`/`jsconfig`-Aliase inklusive `extends`-Ketten und `${configDir}`, Package-Suffixe), bevor auf Labels zurückgefallen wird — so kann sich `from codebeacon.graph.build import …` nicht mehr an ein unbeteiligtes `build`-Symbol binden, und die „High-Impact Files"-Liste in CLAUDE.md spiegelt die Realität wider. Auch die Vererbung von reinem JS `class X extends Y` und dynamische `await import()`-Kanten werden erfasst.
|
|
35
|
+
- **Route-Prefixe komponieren wie in den echten Frameworks** — verifiziert gegen laufende FastAPI-/Express-/Flask-Server: `include_router(prefix=)` komponiert mit dem eigenen Prefix des Routers, Includes in Attributform (`app.include_router(pkg.router, …)`, `@pkg.router.get`) verschwinden nicht mehr, kaskadierte Mounts in derselben Datei werden ausmultipliziert, ein zweimal gemounteter Router liefert beide Routen, und Flasks `register_blueprint(url_prefix=)` *überschreibt* korrekt. Bekannte Grenze: eine Mount-Kette über **Dateien** hinweg wird weiterhin nicht komponiert.
|
|
36
|
+
- **Interface→Impl-DI-Auflösung funktioniert jetzt wirklich** — eine Serialisierungsgrenze in der Extraktions-Pipeline verwarf seit 0.6.x stillschweigend `implements`/`extends`, sodass das gesamte Feature end-to-end tot war, während das Wiki richtig aussah. Behoben, Cache invalidiert und über die echte Pipeline grenzgetestet. Das DI-Binding ist jetzt außerdem evidenzbasiert abgesichert: keine sprach- oder projektübergreifenden Erfindungen mehr (ein Spring-service kann keine React-Komponente mehr „injizieren"), mehrdeutige Fälle mit mehreren Implementierungen binden nur über die `*Impl`-Namenskonvention mit einer expliziten `AMBIGUOUS`-Konfidenz, und eine doppelte Kante hält ihre zweite Relation in einem neuen `also`-Attribut fest, statt sie zu überschreiben.
|
|
37
|
+
- **Node-Identität ist deterministisch und erweiterungsbewusst** — `Button.tsx` und `Button.jsx` sind zwei Nodes (zuvor absorbierte einer den anderen stillschweigend — 6,3 % der Deklarationen in codebeacons eigenem Repo); Node-IDs hängen nicht mehr von der Thread-Abschlussreihenfolge oder vom Checkout-Verzeichnis ab, sodass Wiki-/Obsidian-Dateinamen zwischen Läufen nicht mehr flattern. Kollidierende Labels erhalten das kürzeste unterscheidende Pfad-Suffix. (Die IDs zuvor kollabierter Nodes ändern sich beim Upgrade einmalig.)
|
|
38
|
+
- **Die Ignore-Schicht deckt sich viel enger mit git** — verschachtelte `.gitignore`-Dateien gelten für ihren eigenen Teilbaum (die `app/.gitignore` eines Monorepos wird nicht mehr selbst ignoriert, was früher Zehntausende Build-Dateien in den Scan zog), `.git/info/exclude` wird beachtet, verlinkte Worktrees werden strukturell erkannt statt den Korpus zu verdoppeln, und Ignore-Dateien mit BOM / in UTF-16 / NFD-kodiert werden dekodiert, statt Regeln stillschweigend fallen zu lassen. Mehrdeutige Verzeichnisnamen (`env/`, `build/`, `public/`, `coverage/`, …) werden nur mit bestätigender Evidenz gepruned — eine UVM-`env/`-Testbench oder ein Python-Package namens `coverage/` bleibt im Graphen. Das Matching ist ~19× schneller, und eine neue `ignored.json`-Diagnose hält fest, *warum* jeder Teilbaum übersprungen wurde.
|
|
39
|
+
- **Der Shrink-Guard schützt jetzt die Pfade, auf die es ankommt** — er wurde früher schon durch die bloße Anwesenheit von `--update` entschärft, also genau auf den unbeaufsichtigten Pfaden (Watch, Git-Hooks, CI); ein Berechtigungsfehler konnte deinen committeten Graphen stillschweigend halbieren. Er ordnet jetzt jeden entfernten Node seiner Quelldatei zu (gelöscht / neu ignoriert / **unerklärt** — nur Letzteres verweigert, mit einem echten `--force`-Flag), bleibt überall scharf geschaltet, behandelt einen unlesbaren Teilbaum als „unbekannt, nicht durchwinken" und warnt, wenn Kanten kollabieren, obwohl die Nodes stabil blieben.
|
|
40
|
+
- **`scan → knowledge → scan` klemmt nicht mehr** — der in 0.7.0 dokumentierte Ablauf beendete sich entweder mit 1 („refusing to shrink") oder verwarf stillschweigend dein Notizen-Overlay. Der Guard ist jetzt Tier-bewusst, und das Knowledge-Overlay wird **nach jedem Scan automatisch neu angewendet**; das Löschen einer Notiz pruned genau diese Notiz. Selbst geschriebene `[[wikilinks]]` erzeugen endlich Kanten (sie wurden geparst und dann verworfen — 100 % Verlust), Notizen tragen `node_kind`/Frontmatter, und generierte Dateien (CLAUDE.md, KNOWLEDGE.md) werden nicht mehr als Notizen re-ingestiert.
|
|
41
|
+
- **Ein committeter Index bleibt sauber** — ein unveränderter Rescan schreibt jetzt **null** committete Dateien neu (vorher: jede einzelne, ~31k Dateien Churn upstream): `built_at_ts` leitet sich aus dem Commit ab, Exporte schreiben nur bei Inhaltsänderung, und der maschinenlokale AST-Cache git-ignoriert sich selbst. HTML-Exporte (`beacon.html`, `callflow.html`) liefern ihr JS **standardmäßig offline** aus (vendored d3 + mermaid unter `_assets/`) — passend zur Air-Gap-Haltung; setze `output.html_assets: cdn`, um das alte Verhalten zu behalten. Absolute Pfade der Build-Maschine lecken in kein Artefakt mehr.
|
|
42
|
+
- **MCP-Antworten, denen du programmatisch trauen kannst** — Tool-Fehler geben `isError: true` mit der handlungsleitenden Meldung zurück (statt erfolgsförmiger Fehlerprosa oder eines Protokollfehlers, den der Client verschluckt); die Namensauflösung bevorzugt eine exakte Übereinstimmung vor Teilstrings, sodass `blast_radius("User")` nicht mehr über `UserServiceImpl` Auskunft gibt; jedes Tool respektiert ein `token_budget` (Standard 2.000 Tokens) und kündigt Kürzungen gegen die tatsächliche Gesamtmenge an.
|
|
43
|
+
- **Robustheits- & Sicherheits-Sweep** — `.csproj`-XML wird mit einem DOCTYPE/ENTITY-Filter geparst; modellgerichteter Text (MCP-Ausgabe, CLAUDE.md) neutralisiert Chat-Template-Steuertokens anhand ihrer Form (`<|…|>`, `[INST]`); `hook install` funktioniert in Git-Worktrees und lässt ein Repo nie halb konfiguriert zurück; `install`/`upgrade` sichern eine handbearbeitete SKILL.md, statt sie zu überschreiben, und ein nicht terminierter Marker kann Nutzerinhalte darunter nicht mehr löschen; eine CLAUDE.md in cp949/latin-1 bringt den Scan nicht zum Absturz; `codebeacon … | head` beendet sich sauber; der Watch-Modus triggert sich unter Linux nicht mehr selbst über inotify-Events; das Leiden-Clustering ist geseedet, sodass Communities nicht mehr 12 % pro Rescan driften.
|
|
44
|
+
|
|
45
|
+
Upgrade-Hinweise: Node-IDs zuvor kollabierter Deklarationen ändern sich einmalig; semantische `task_id`s werden einmalig invalidiert (Tasks hashen jetzt die ganze Datei, was „Edits jenseits von Zeichen 4.000 werden nie neu analysiert" behebt); der AST-Cache wird einmalig invalidiert (Schema-Stempel); neues Kanten-Attribut `also`, neuer Konfidenzwert `AMBIGUOUS`, neuer `verification`-Marker auf semantisch geprägten Externals. Falls dein Repo `.codebeacon/cache/` bereits committet hat, führe einmalig `git rm --cached -r .codebeacon/cache` aus — die neue selbst-ignorierende `.gitignore` kann bereits getrackte Dateien nicht mehr aus dem Index entfernen.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Neu in 0.7.0
|
|
50
|
+
|
|
51
|
+
Eine Fähigkeits-Release statt eines Bug-Sweeps: codebeacon bekommt einen Live-File-Watcher, verknüpft deine Design-Notizen mit dem Code-Graphen, liefert zwei neue Front-Ends (einen npm-Launcher für den MCP-Server und eine GitHub Action) und schärft, was es standardmäßig indexiert. Jede Funktion bleibt local-first — der Kern-Scan braucht weiterhin kein Netzwerk, keine Cloud und kein Modell.
|
|
52
|
+
|
|
53
|
+
- **`codebeacon watch` hält den Index live** — ein entprellter File-Watcher (`codebeacon watch [path] [--debounce 2.0] [--once] [--exclude PATTERN]`) resynchronisiert den Graphen, sobald überwachte Quelldateien sich ändern. Ein Schwall von Edits — ein `git checkout` über 500 Dateien, ein Branch-Wechsel — verschmilzt zu einer einzigen Resynchronisierung, und der Watcher verwendet exakt dieselben Ignore-Regeln wie der Scanner wieder, sodass das Schreiben des Index ihn nie in eine Schleife über seine eigene `.codebeacon/`-Ausgabe weckt. Benötigt das neue optionale Extra: `pip install 'codebeacon[watch]'` (watchdog).
|
|
54
|
+
- **Design-Notizen verknüpfen sich mit dem Code-Graphen** — `codebeacon knowledge` schreibt seine Notizen (ADRs, Meeting-Notizen, Retros, Specs) jetzt *in* `beacon.json`, wenn bereits ein Index existiert: eine explizite Dateipfad-Referenz wird zu einer vertrauenswürdigen `references`-Kante, und eine markante Symbol-Erwähnung (`PaymentService`, niemals ein bloßes `User`) wird zu einer `AMBIGUOUS`-`mentions`-Kante — sodass ein Agent, der den Graphen liest, erfährt, *warum* ein service so geformt ist, wie er ist. Da `codebeacon scan` den Code-Graphen allein aus dem Quellcode neu aufbaut und dieses Overlay verwirft, **führe `codebeacon knowledge` nach einem Scan erneut aus**, um die Verknüpfungen wiederherzustellen.
|
|
55
|
+
- **MCP-Tool `beacon_knowledge`** — ein neues Tool durchsucht Notizen nach Schlüsselwort und/oder listet die mit einem gegebenen Code-Node verknüpften Notizen auf und legt so die Entscheidungsspur hinter dem Code direkt über MCP offen.
|
|
56
|
+
- **npm-Launcher für den MCP-Server** — `@codebeacon/mcp` lässt MCP-Clients den Server auf die npx-first-Weise starten, die sie erwarten (`"command": "npx", "args": ["-y", "@codebeacon/mcp"]`). Der abhängigkeitsfreie Node-Shim löst ein funktionierendes codebeacon über PATH → `uvx` → `pipx run` → `python3 -m codebeacon` auf und leitet stdio unangetastet weiter. Siehe [`npm/README.md`](npm/README.md). (Wird mit 0.7.0 ausgeliefert; noch nicht auf npm veröffentlicht.)
|
|
57
|
+
- **GitHub Action für PR-Kontext** — eine Composite-Action kommentiert jeden Pull Request mit dem betroffenen Ausschnitt deines committeten Wissensgraphen: die Wiki-Artikel, die die Änderung berührt, den stromaufwärts gelegenen Blast-Radius und alle High-Impact-Hub-Dateien, die sie bearbeitet — eine Architektur-Drift-Prüfung für Reviews im KI-Zeitalter. Erfordert einen committeten `.codebeacon/`-Index, `fetch-depth: 0` und `permissions: pull-requests: write`. Siehe [`action/README.md`](action/README.md) und [`action/examples/pr-context.yml`](action/examples/pr-context.yml).
|
|
58
|
+
- **Die Workspace-CLAUDE.md bleibt unter ~200 Zeilen** — in einem Multi-Projekt-Workspace behält die Root-`CLAUDE.md` jetzt nur die gemeinsame Übersicht und verschiebt die projektspezifischen Details in gescopte `.claude/rules/codebeacon-<project>.md`-Dateien, deren `paths:`-Frontmatter sie nur lädt, wenn die Dateien dieses Projekts berührt werden (den eigenen Empfehlungen von Anthropic für Kontextdateien folgend). Die Einzelprojekt-Ausgabe ist unverändert; setze `output.context_map.rules_split: false` für die alte monolithische Datei. Doppelte Projektzeilen werden ebenfalls zusammengefasst.
|
|
59
|
+
- **Test-Fixtures werden standardmäßig ignoriert** — `tests/fixtures/`, `test/fixtures/` und `__fixtures__/` in beliebiger Tiefe werden jetzt standardmäßig ignoriert, sodass die synthetischen Test-Eingaben eines Projekts aufhören, falsche Routen und services in den Graphen einzuschleusen (codebeacons eigener Self-Scan hatte eine Fixture-`main.py` als fünf „Routen" gemeldet). Es ist die Regel mit der niedrigsten Priorität, sodass eine Zeile `!tests/fixtures/` in `.codebeaconignore` sie wieder aufnimmt, und einen Scan *auf* ein Fixture-Verzeichnis zu richten, sammelt es weiterhin ein.
|
|
60
|
+
- **Warps Routen-Extraktion ist jetzt echt** — Warps Filter-Kombinator-Routen werden tatsächlich extrahiert: `warp::path!(...)`- und `warp::path("x")`-Segmente, Methoden-Kombinatoren (`warp::get()` / `post()` / …) und `.map`- / `.and_then`-Handler werden über ihr umschließendes Binding zu ganzen Routen korreliert. Ehrliche Grenzen (im Query-Header ausbuchstabiert): Filter, die innerhalb eines Bindings mit `.or(...)` verbunden sind, kollabieren zu einer einzigen verketteten Route, und `warp::path::param()`-Filteraufruf-Segmente sowie Closure-Handler bleiben unaufgelöst.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
30
64
|
## Neu in 0.6.9
|
|
31
65
|
|
|
32
66
|
Die bislang größte Audit-Release: ein doppelter Upstream-Parity-Sweep (das allererste vollständige Audit von codesights Tracker, plus graphify v0.9.4–v0.9.12 / Issues bis #1776), kombiniert mit einer unabhängigen Multi-Agent-Bug-Hunt über codebeacon selbst. Jeder Kandidat wurde vor der Behebung reproduziert, jede Behebung mutation-getestet, und eine adversariale Zweitprüfung griff anschließend die Fixes selbst an — und fing so vor der Auslieferung 18 weitere Lücken ab. **48 echte Bugs behoben.**
|
|
@@ -27,6 +27,40 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Novedades en 0.7.1
|
|
31
|
+
|
|
32
|
+
La mayor release de auditoría hasta la fecha: un barrido dual de paridad con upstream (graphify v0.9.13–v0.9.53 / issues #1777–#3235, más codesight #50–#55) verificado contra codebeacon con reproducción obligatoria — **~70 defectos confirmados corregidos** por diez fixers en paralelo, cada corrección sometida a mutation testing y después revisada de forma adversarial por el lead con ejecuciones de integración sobre la CLI real. Suite: 885 → 1.481 tests.
|
|
33
|
+
|
|
34
|
+
- **El grafo JS/TS prácticamente se ha duplicado** — las funciones flecha exportadas en minúscula, los `const` y los miembros de objetos literales (`export const useAuthStore = …`, `authUtils.clear`) por fin se convierten en nodos: en una app Next.js real de 865 archivos, los nodos de componente pasaron de **960 → 2.237** y los archivos que no aportaban nada bajaron de 406 a 108. Los imports ahora se resuelven primero por **ruta** (especificadores relativos, alias de `tsconfig`/`jsconfig` con cadenas `extends` y `${configDir}`, sufijos de paquete) antes de recurrir a las etiquetas — así `from codebeacon.graph.build import …` ya no puede enlazarse a un símbolo `build` sin relación, y la lista "High-Impact Files" de CLAUDE.md refleja la realidad. También se capturan la herencia `class X extends Y` de JS puro y las aristas de `await import()` dinámico.
|
|
35
|
+
- **Los prefijos de ruta se componen como en los frameworks reales** — verificado contra servidores FastAPI/Express/Flask en ejecución: `include_router(prefix=)` se compone con el prefijo propio del router, los includes en forma de atributo (`app.include_router(pkg.router, …)`, `@pkg.router.get`) ya no se esfuman, los montajes en cascada dentro del mismo archivo se despliegan, un router montado dos veces produce las dos rutas, y el `register_blueprint(url_prefix=)` de Flask *sobrescribe* correctamente. Límite conocido: una cadena de montajes que cruza **archivos** sigue sin componerse.
|
|
36
|
+
- **La resolución de DI interfaz→implementación ahora funciona de verdad** — un límite de serialización en el pipeline de extracción venía descartando en silencio `implements`/`extends` desde 0.6.x, así que la funcionalidad entera estaba muerta de extremo a extremo mientras la wiki se veía bien. Corregido, con la caché invalidada y con tests de frontera que atraviesan el pipeline real. El binding de DI también está ahora sujeto a evidencia: se acabaron las fabricaciones entre lenguajes o entre proyectos (un service de Spring ya no puede "inyectar" un componente de React), los casos ambiguos con varias implementaciones solo se enlazan mediante la convención de nombres `*Impl` con una confianza `AMBIGUOUS` explícita, y una arista duplicada registra su segunda relación en un nuevo atributo `also` en lugar de sobrescribir.
|
|
37
|
+
- **La identidad de los nodos es determinista y tiene en cuenta la extensión** — `Button.tsx` y `Button.jsx` son dos nodos (antes uno absorbía al otro en silencio — el 6,3 % de las declaraciones en el propio repo de codebeacon); los IDs de nodo ya no dependen del orden de finalización de los hilos ni del directorio de checkout, así que los nombres de archivo de wiki/obsidian dejan de bailar entre ejecuciones. Las etiquetas que colisionan reciben el sufijo de ruta distintivo más corto. (Los IDs de los nodos previamente colapsados cambiarán una vez al actualizar.)
|
|
38
|
+
- **La capa de ignore se ajusta mucho más a git** — los `.gitignore` anidados se aplican a su propio subárbol (el `app/.gitignore` de un monorepo ya no queda ignorado, algo que antes arrastraba decenas de miles de archivos de build al scan), se respeta `.git/info/exclude`, los worktrees enlazados se detectan estructuralmente en vez de duplicar el corpus, y los archivos de ignore con BOM / UTF-16 / codificación NFD se decodifican en lugar de perder reglas en silencio. Los nombres de directorio ambiguos (`env/`, `build/`, `public/`, `coverage/`, …) solo se podan con evidencia que lo corrobore — un testbench UVM `env/` o un paquete de Python llamado `coverage/` se queda en el grafo. El matching es ~19× más rápido, y un nuevo diagnóstico `ignored.json` registra *por qué* se omitió cada subárbol.
|
|
39
|
+
- **La guarda de shrink ahora protege los caminos que importan** — antes se desarmaba con la mera presencia de `--update`, es decir, justo en los caminos desatendidos (watch, hooks de git, CI); un error de permisos podía reducir a la mitad tu grafo commiteado sin decir nada. Ahora atribuye cada nodo eliminado a su archivo fuente (borrado / recién ignorado / **sin explicación** — solo el último rechaza, con un flag `--force` de verdad), permanece armada en todas partes, trata un subárbol ilegible como "desconocido, no eximir", y avisa cuando las aristas se desploman aunque los nodos se hayan mantenido.
|
|
40
|
+
- **`scan → knowledge → scan` ya no se atasca** — el flujo documentado de 0.7.0 o salía con código 1 ("refusing to shrink") o descartaba en silencio tu capa de notas. La guarda ahora es consciente del tier y la capa de knowledge se **reaplica automáticamente después de cada scan**; borrar una nota poda exactamente esa nota. Los `[[wikilinks]]` que escribes por fin crean aristas (se parseaban y luego se tiraban — 100 % de pérdida), las notas llevan `node_kind`/frontmatter, y los archivos generados (CLAUDE.md, KNOWLEDGE.md) ya no se reingieren como notas.
|
|
41
|
+
- **Un índice commiteado se mantiene limpio** — un reescaneo sin cambios ahora reescribe **cero** archivos commiteados (antes: todos ellos, un churn de ~31k archivos aguas arriba): `built_at_ts` se deriva del commit, los exports solo escriben cuando cambia el contenido, y la caché AST local de la máquina se auto-ignora en git. Los exports HTML (`beacon.html`, `callflow.html`) incluyen su JS **offline por defecto** (d3 + mermaid vendorizados bajo `_assets/`) — en línea con la postura air-gapped; pon `output.html_assets: cdn` para conservar el comportamiento anterior. Las rutas absolutas de la máquina de build ya no se filtran a ningún artefacto.
|
|
42
|
+
- **Respuestas MCP en las que puedes confiar programáticamente** — los fallos de herramienta devuelven `isError: true` con el mensaje accionable (en lugar de prosa de error con forma de éxito, o un error de protocolo que el cliente se traga); la resolución de nombres prefiere la coincidencia exacta antes que las subcadenas, así que `blast_radius("User")` ya no responde sobre `UserServiceImpl`; cada herramienta respeta un `token_budget` (2.000 tokens por defecto) y anuncia el truncamiento respecto al total real.
|
|
43
|
+
- **Barrido de robustez y seguridad** — el XML de `.csproj` se parsea con un filtro DOCTYPE/ENTITY; el texto que ve el modelo (salida MCP, CLAUDE.md) neutraliza los tokens de control de plantillas de chat por su forma (`<|…|>`, `[INST]`); `hook install` funciona en worktrees de git y nunca deja un repo a medio configurar; `install`/`upgrade` hacen copia de seguridad de un SKILL.md editado a mano en vez de aplastarlo, y un marcador sin cerrar ya no puede borrar el contenido de usuario que hay debajo; un CLAUDE.md en cp949/latin-1 no tumba el scan; `codebeacon … | head` termina limpiamente; el modo watch ya no se vuelve a disparar a sí mismo con los eventos inotify de Linux; el clustering de Leiden usa una semilla fija, así que las comunidades dejan de derivar un 12 % por reescaneo.
|
|
44
|
+
|
|
45
|
+
Notas de actualización: los IDs de nodo de las declaraciones previamente colapsadas cambian una vez; los `task_id` semánticos se invalidan una vez (las tareas ahora hashean el archivo entero, corrigiendo "las ediciones más allá del carácter 4.000 nunca se reanalizaban"); la caché AST se invalida una vez (sello de esquema); nuevo atributo de arista `also`, nuevo valor de confianza `AMBIGUOUS`, nuevo marcador `verification` en los externos acuñados por semantic. Si tu repositorio ya tenía `.codebeacon/cache/` en un commit, ejecuta una vez `git rm --cached -r .codebeacon/cache` — el nuevo `.gitignore` auto-ignorante no puede dejar de rastrear archivos ya rastreados.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Novedades en 0.7.0
|
|
50
|
+
|
|
51
|
+
Una release de capacidades más que un barrido de bugs: codebeacon estrena un file-watcher en vivo, enlaza tus notas de diseño en el grafo de código, incorpora dos nuevos front-ends (un lanzador npm para el servidor MCP y una GitHub Action) y ajusta lo que indexa por defecto. Cada funcionalidad sigue siendo local-first — el scan central sigue sin necesitar red, ni nube, ni modelo.
|
|
52
|
+
|
|
53
|
+
- **`codebeacon watch` mantiene el índice en vivo** — un file-watcher con debounce (`codebeacon watch [path] [--debounce 2.0] [--once] [--exclude PATTERN]`) resincroniza el grafo cada vez que cambian los archivos fuente vigilados. Una ráfaga de ediciones — un `git checkout` de 500 archivos, un cambio de rama — se fusiona en una única resincronización, y el watcher reutiliza exactamente las mismas reglas de ignore del scanner, de modo que escribir el índice nunca lo despierta en un bucle sobre su propia salida `.codebeacon/`. Necesita el nuevo extra opcional: `pip install 'codebeacon[watch]'` (watchdog).
|
|
54
|
+
- **Las notas de diseño se enlazan en el grafo de código** — `codebeacon knowledge` ahora escribe sus notas (ADRs, notas de reunión, retros, specs) *dentro* de `beacon.json` cuando ya existe un índice: una referencia explícita a una ruta de archivo se convierte en una arista `references` de confianza, y una mención de símbolo distintiva (`PaymentService`, nunca un `User` pelado) se convierte en una arista `mentions` `AMBIGUOUS` — de modo que un agente que lee el grafo aprende *por qué* un service tiene la forma que tiene. Como `codebeacon scan` reconstruye el grafo de código solo a partir del fuente y descarta esta capa, **vuelve a ejecutar `codebeacon knowledge` después de un scan** para restaurar los enlaces.
|
|
55
|
+
- **Herramienta MCP `beacon_knowledge`** — una nueva herramienta busca notas por palabra clave y/o lista las notas enlazadas a un nodo de código dado, exponiendo el rastro de decisiones detrás del código directamente por MCP.
|
|
56
|
+
- **Lanzador npm para el servidor MCP** — `@codebeacon/mcp` permite que los clientes MCP arranquen el servidor de la forma npx-first que esperan (`"command": "npx", "args": ["-y", "@codebeacon/mcp"]`). El shim de Node sin dependencias resuelve un codebeacon funcional vía PATH → `uvx` → `pipx run` → `python3 -m codebeacon` y reenvía stdio sin tocarlo. Ver [`npm/README.md`](npm/README.md). (Se distribuye con 0.7.0; aún no publicado en npm.)
|
|
57
|
+
- **GitHub Action para contexto de PR** — una action compuesta comenta en cada pull request con la porción afectada de tu grafo de conocimiento commiteado: los artículos de wiki que toca el cambio, el radio de impacto aguas arriba, y cualquier archivo hub de alto impacto que edite — una comprobación de deriva de arquitectura para la revisión en la era de la IA. Requiere un índice `.codebeacon/` commiteado, `fetch-depth: 0` y `permissions: pull-requests: write`. Ver [`action/README.md`](action/README.md) y [`action/examples/pr-context.yml`](action/examples/pr-context.yml).
|
|
58
|
+
- **El CLAUDE.md de workspace se mantiene por debajo de ~200 líneas** — en un workspace multi-proyecto, el `CLAUDE.md` raíz ahora conserva solo la visión general compartida y mueve el detalle por proyecto a archivos `.claude/rules/codebeacon-<project>.md` con alcance acotado, cuyo frontmatter `paths:` los carga solo cuando se tocan los archivos de ese proyecto (siguiendo la propia guía de Anthropic para archivos de contexto). La salida de un solo proyecto no cambia; pon `output.context_map.rules_split: false` para el antiguo archivo monolítico. Las filas de proyecto duplicadas también se colapsan.
|
|
59
|
+
- **Los fixtures de test se ignoran por defecto** — `tests/fixtures/`, `test/fixtures/` y `__fixtures__/` a cualquier profundidad ahora se ignoran por defecto, de modo que las entradas de test sintéticas de un proyecto dejan de inyectar rutas y services falsos en el grafo (el propio self-scan de codebeacon había reportado un `main.py` de fixtures como cinco "rutas"). Es la regla de menor precedencia, así que una línea `!tests/fixtures/` en `.codebeaconignore` las vuelve a incluir, y apuntar un scan *a* un directorio de fixtures sigue recogiéndolo.
|
|
60
|
+
- **La extracción de rutas de Warp ahora es real** — las rutas de combinadores de filtros de Warp se extraen de verdad: los segmentos `warp::path!(...)` y `warp::path("x")`, los combinadores de método (`warp::get()` / `post()` / …) y los handlers `.map` / `.and_then` se correlacionan por su binding contenedor en rutas completas. Límites honestos (detallados en la cabecera de la query): los filtros unidos por `.or(...)` dentro de un mismo binding colapsan en una única ruta concatenada, y los segmentos de llamada a filtro `warp::path::param()` y los handlers de closure quedan sin resolver.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
30
64
|
## Novedades en 0.6.9
|
|
31
65
|
|
|
32
66
|
La release de auditoría más grande hasta la fecha: un doble barrido de paridad con el upstream (la primera auditoría completa del tracker de codesight, más graphify v0.9.4–v0.9.12 / issues hasta el #1776) combinado con una caza de bugs multiagente independiente sobre el propio codebeacon. Cada candidato se reprodujo antes de corregirlo, cada corrección se probó con mutation testing, y una segunda revisión adversarial atacó luego las propias correcciones — atrapando 18 agujeros más antes de la publicación. **48 bugs reales corregidos.**
|
|
@@ -27,6 +27,40 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Nouveautés en 0.7.1
|
|
31
|
+
|
|
32
|
+
La plus grosse release d'audit à ce jour : un double balayage de parité amont (graphify v0.9.13–v0.9.53 / issues #1777–#3235, plus codesight #50–#55) vérifié face à codebeacon avec reproduction obligatoire — **~70 défauts confirmés corrigés** par dix correcteurs en parallèle, chaque correctif testé par mutation, puis relu de manière adverse par le lead avec des exécutions d'intégration en CLI réelle. Suite : 885 → 1 481 tests.
|
|
33
|
+
|
|
34
|
+
- **Le graphe JS/TS a pratiquement doublé** — les fonctions fléchées en minuscule exportées, les `const` et les membres de littéraux d'objet (`export const useAuthStore = …`, `authUtils.clear`) deviennent enfin des nœuds : sur une vraie application Next.js de 865 fichiers, les nœuds de composants sont passés de **960 → 2 237** et les fichiers ne contribuant rien sont tombés de 406 à 108. Les imports sont désormais résolus d'abord par **chemin** (spécificateurs relatifs, alias `tsconfig`/`jsconfig` avec chaînes `extends` et `${configDir}`, suffixes de package) avant de retomber sur les labels — ainsi `from codebeacon.graph.build import …` ne peut plus se lier à un symbole `build` sans rapport, et la liste « High-Impact Files » dans CLAUDE.md reflète la réalité. L'héritage `class X extends Y` en JS pur et les arêtes d'`await import()` dynamiques sont également capturés.
|
|
35
|
+
- **Les préfixes de routes se composent comme dans les vrais frameworks** — vérifié face à des serveurs FastAPI/Express/Flask en cours d'exécution : `include_router(prefix=)` se compose avec le préfixe propre du routeur, les includes sous forme d'attribut (`app.include_router(pkg.router, …)`, `@pkg.router.get`) ne disparaissent plus, les montages en cascade dans un même fichier se démultiplient, un routeur monté deux fois produit les deux routes, et le `register_blueprint(url_prefix=)` de Flask *écrase* correctement. Limite connue : une chaîne de montage qui traverse des **fichiers** n'est toujours pas composée.
|
|
36
|
+
- **La résolution DI interface→implémentation fonctionne vraiment maintenant** — une frontière de sérialisation dans le pipeline d'extraction abandonnait silencieusement `implements`/`extends` depuis la 0.6.x, si bien que la fonctionnalité entière était morte de bout en bout alors que le wiki semblait correct. Corrigé, cache invalidé, et testé à la frontière à travers le vrai pipeline. La liaison DI est désormais conditionnée par des preuves : plus de fabrications inter-langages ou inter-projets (un service Spring ne peut plus « injecter » un composant React), les cas ambigus à implémentations multiples ne se lient que via la convention de nommage `*Impl` avec une confiance `AMBIGUOUS` explicite, et une arête en double enregistre sa seconde relation sous un nouvel attribut `also` au lieu de l'écraser.
|
|
37
|
+
- **L'identité des nœuds est déterministe et tient compte de l'extension** — `Button.tsx` et `Button.jsx` sont deux nœuds (auparavant l'un absorbait silencieusement l'autre — 6,3 % des déclarations sur le dépôt de codebeacon lui-même) ; les identifiants de nœuds ne dépendent plus de l'ordre d'achèvement des threads ni du répertoire de checkout, si bien que les noms de fichiers wiki/obsidian cessent de fluctuer d'une exécution à l'autre. Les labels qui entrent en collision reçoivent le plus court suffixe de chemin qui les distingue. (Les identifiants des nœuds auparavant fusionnés changeront une fois lors de la mise à niveau.)
|
|
38
|
+
- **La couche d'ignore colle beaucoup plus près de git** — les fichiers `.gitignore` imbriqués s'appliquent à leur propre sous-arbre (l'`app/.gitignore` d'un monorepo n'est plus ignoré, ce qui tirait auparavant des dizaines de milliers de fichiers de build dans le scan), `.git/info/exclude` est respecté, les worktrees liés sont détectés structurellement au lieu de doubler le corpus, et les fichiers d'ignore encodés avec BOM / en UTF-16 / en NFD sont décodés au lieu de perdre silencieusement leurs règles. Les noms de répertoires ambigus (`env/`, `build/`, `public/`, `coverage/`, …) ne sont élagués qu'avec des preuves corroborantes — un banc de test UVM `env/` ou un package Python nommé `coverage/` reste dans le graphe. La correspondance est ~19× plus rapide, et un nouveau diagnostic `ignored.json` consigne *pourquoi* chaque sous-arbre a été sauté.
|
|
39
|
+
- **Le garde-fou anti-rétrécissement protège enfin les chemins qui comptent** — il était auparavant désarmé par la simple présence de `--update`, c'est-à-dire précisément sur les chemins sans surveillance (watch, hooks git, CI) ; une erreur de permission pouvait réduire de moitié votre graphe commité, en silence. Il attribue désormais chaque nœud supprimé à son fichier source (supprimé / nouvellement ignoré / **inexpliqué** — seul le dernier cas refuse, avec un vrai drapeau `--force`), reste armé partout, traite un sous-arbre illisible comme « inconnu, pas de dispense », et avertit quand les arêtes s'effondrent alors même que les nœuds sont restés stables.
|
|
40
|
+
- **`scan → knowledge → scan` ne se bloque plus** — le flux documenté de la 0.7.0 se terminait soit par un code de sortie 1 (« refusing to shrink »), soit en abandonnant silencieusement votre surcouche de notes. Le garde-fou tient désormais compte des niveaux et la surcouche knowledge est **réappliquée automatiquement après chaque scan** ; supprimer une note élague exactement cette note. Les `[[wikilinks]]` que vous écrivez créent enfin des arêtes (ils étaient analysés puis jetés — 100 % de perte), les notes portent `node_kind`/frontmatter, et les fichiers générés (CLAUDE.md, KNOWLEDGE.md) ne sont plus réingérés comme des notes.
|
|
41
|
+
- **Un index commité reste propre** — un rescan sans changement réécrit désormais **zéro** fichier commité (avant : tous, un brassage de ~31k fichiers en amont) : `built_at_ts` dérive du commit, les exports ne s'écrivent qu'en cas de changement de contenu, et le cache AST local à la machine s'auto-git-ignore. Les exports HTML (`beacon.html`, `callflow.html`) embarquent leur JS **hors ligne par défaut** (d3 + mermaid vendorisés sous `_assets/`) — conformément à la posture air-gapped ; mettez `output.html_assets: cdn` pour conserver l'ancien comportement. Les chemins absolus de la machine de build ne fuitent plus dans aucun artefact.
|
|
42
|
+
- **Des réponses MCP auxquelles un programme peut se fier** — les échecs d'outil renvoient `isError: true` avec le message actionnable (au lieu d'une prose d'erreur en forme de succès, ou d'une erreur de protocole que le client avale) ; la résolution de noms privilégie une correspondance exacte avant les sous-chaînes, si bien que `blast_radius("User")` ne répond plus au sujet de `UserServiceImpl` ; chaque outil respecte un `token_budget` (2 000 tokens par défaut) et annonce la troncature par rapport au total réel.
|
|
43
|
+
- **Balayage de robustesse et de sécurité** — le XML `.csproj` est analysé avec un filtre DOCTYPE/ENTITY ; le texte destiné aux modèles (sortie MCP, CLAUDE.md) neutralise les tokens de contrôle de gabarit de chat par leur forme (`<|…|>`, `[INST]`) ; `hook install` fonctionne dans les worktrees git et ne laisse jamais un dépôt à moitié configuré ; `install`/`upgrade` sauvegardent un SKILL.md modifié à la main au lieu de l'écraser, et un marqueur non terminé ne peut plus supprimer le contenu utilisateur situé en dessous ; un CLAUDE.md en cp949/latin-1 ne fait plus planter le scan ; `codebeacon … | head` se termine proprement ; le mode watch ne se redéclenche plus lui-même sur les événements inotify de Linux ; le clustering de Leiden est initialisé avec une graine, si bien que les communautés cessent de dériver de 12 % à chaque rescan.
|
|
44
|
+
|
|
45
|
+
Notes de mise à niveau : les identifiants de nœuds des déclarations auparavant fusionnées changent une fois ; les `task_id` sémantiques sont invalidés une fois (les tâches hachent désormais le fichier entier, ce qui corrige « les modifications au-delà du caractère 4 000 ne sont jamais réanalysées ») ; le cache AST est invalidé une fois (empreinte de schéma) ; nouvel attribut d'arête `also`, nouvelle valeur de confiance `AMBIGUOUS`, nouveau marqueur `verification` sur les externes forgés par le sémantique. Si votre dépôt a déjà commité `.codebeacon/cache/`, exécutez une fois `git rm --cached -r .codebeacon/cache` — le nouveau `.gitignore` auto-ignorant ne peut pas retirer du suivi les fichiers qui le sont déjà.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Nouveautés en 0.7.0
|
|
50
|
+
|
|
51
|
+
Une release de capacités plutôt qu'un balayage de bugs : codebeacon se dote d'un file-watcher en direct, relie vos notes de conception au graphe de code, embarque deux nouveaux front-ends (un lanceur npm pour le serveur MCP et une GitHub Action) et resserre ce qu'il indexe par défaut. Chaque fonctionnalité reste local-first — le scan central n'a toujours besoin ni de réseau, ni de cloud, ni de modèle.
|
|
52
|
+
|
|
53
|
+
- **`codebeacon watch` garde l'index en direct** — un file-watcher avec debounce (`codebeacon watch [path] [--debounce 2.0] [--once] [--exclude PATTERN]`) resynchronise le graphe chaque fois que les fichiers source surveillés changent. Une rafale d'éditions — un `git checkout` de 500 fichiers, un changement de branche — se fond en une unique resynchronisation, et le watcher réutilise exactement les mêmes règles d'ignore que le scanner, si bien qu'écrire l'index ne le réveille jamais dans une boucle sur sa propre sortie `.codebeacon/`. Nécessite le nouvel extra optionnel : `pip install 'codebeacon[watch]'` (watchdog).
|
|
54
|
+
- **Les notes de conception se relient au graphe de code** — `codebeacon knowledge` écrit désormais ses notes (ADR, comptes rendus de réunion, rétros, specs) *dans* `beacon.json` lorsqu'un index existe déjà : une référence explicite à un chemin de fichier devient une arête `references` de confiance, et une mention de symbole distinctive (`PaymentService`, jamais un simple `User`) devient une arête `mentions` `AMBIGUOUS` — de sorte qu'un agent qui lit le graphe apprend *pourquoi* un service a la forme qu'il a. Comme `codebeacon scan` reconstruit le graphe de code à partir du seul source et abandonne cette surcouche, **relancez `codebeacon knowledge` après un scan** pour restaurer les liens.
|
|
55
|
+
- **Outil MCP `beacon_knowledge`** — un nouvel outil recherche les notes par mot-clé et/ou liste les notes reliées à un nœud de code donné, exposant la trace des décisions derrière le code directement via MCP.
|
|
56
|
+
- **Lanceur npm pour le serveur MCP** — `@codebeacon/mcp` permet aux clients MCP de démarrer le serveur de la manière npx-first qu'ils attendent (`"command": "npx", "args": ["-y", "@codebeacon/mcp"]`). Le shim Node sans dépendances résout un codebeacon fonctionnel via PATH → `uvx` → `pipx run` → `python3 -m codebeacon` et relaie stdio sans y toucher. Voir [`npm/README.md`](npm/README.md). (Livré avec 0.7.0 ; pas encore publié sur npm.)
|
|
57
|
+
- **GitHub Action pour le contexte de PR** — une action composite commente chaque pull request avec la tranche affectée de votre graphe de connaissances commité : les articles de wiki que touche le changement, le rayon d'impact en amont, et tout fichier hub à fort impact qu'il modifie — un contrôle de dérive d'architecture pour la revue à l'ère de l'IA. Nécessite un index `.codebeacon/` commité, `fetch-depth: 0` et `permissions: pull-requests: write`. Voir [`action/README.md`](action/README.md) et [`action/examples/pr-context.yml`](action/examples/pr-context.yml).
|
|
58
|
+
- **Le CLAUDE.md de workspace reste sous ~200 lignes** — dans un workspace multi-projets, le `CLAUDE.md` racine ne conserve désormais que la vue d'ensemble partagée et déplace le détail par projet dans des fichiers `.claude/rules/codebeacon-<project>.md` à portée restreinte, dont le frontmatter `paths:` ne les charge que lorsque les fichiers de ce projet sont touchés (suivant les propres recommandations d'Anthropic pour les fichiers de contexte). La sortie mono-projet est inchangée ; mettez `output.context_map.rules_split: false` pour retrouver l'ancien fichier monolithique. Les lignes de projet en double sont également fusionnées.
|
|
59
|
+
- **Les fixtures de test sont ignorées par défaut** — `tests/fixtures/`, `test/fixtures/` et `__fixtures__/` à n'importe quelle profondeur sont désormais ignorées par défaut, si bien que les entrées de test synthétiques d'un projet cessent d'injecter de fausses routes et de faux services dans le graphe (le propre self-scan de codebeacon avait signalé un `main.py` de fixtures comme cinq « routes »). C'est la règle de plus faible priorité, donc une ligne `!tests/fixtures/` dans `.codebeaconignore` les réinclut, et pointer un scan *sur* un répertoire de fixtures le collecte toujours.
|
|
60
|
+
- **L'extraction des routes de Warp est réelle maintenant** — les routes à combinateurs de filtres de Warp sont réellement extraites : les segments `warp::path!(...)` et `warp::path("x")`, les combinateurs de méthode (`warp::get()` / `post()` / …) et les handlers `.map` / `.and_then` sont corrélés par leur binding englobant en routes entières. Limites honnêtes (détaillées dans l'en-tête de la requête) : les filtres joints par `.or(...)` au sein d'un même binding se fondent en une unique route concaténée, et les segments d'appel de filtre `warp::path::param()` ainsi que les handlers de closure restent non résolus.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
30
64
|
## Nouveautés en 0.6.9
|
|
31
65
|
|
|
32
66
|
La plus grande release d'audit à ce jour : un double balayage de parité amont (le tout premier audit complet du tracker de codesight, plus graphify v0.9.4–v0.9.12 / issues jusqu'au #1776) combiné à une chasse aux bugs multi-agent indépendante sur codebeacon lui-même. Chaque candidat a été reproduit avant correction, chaque correction a été testée par mutation, et une seconde revue adversariale a ensuite attaqué les correctifs eux-mêmes — attrapant 18 failles supplémentaires avant la publication. **48 bugs réels corrigés.**
|
|
@@ -27,6 +27,40 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## 0.7.1 の新機能
|
|
31
|
+
|
|
32
|
+
これまでで最大の監査リリースです:二重のアップストリーム・パリティ・スイープ(graphify v0.9.13–v0.9.53 / issue #1777–#3235、加えて codesight #50–#55)を、再現必須の原則で codebeacon に突き合わせて検証しました — 10個の並列フィクサーが**確定した欠陥およそ70件を修正**し、すべての修正を mutation テストにかけ、その後リードが実 CLI での統合実行を伴う敵対的レビューを行いました。テストスイート:885 → 1,481件。
|
|
33
|
+
|
|
34
|
+
- **JS/TS グラフがほぼ倍増しました** — export された小文字のアロー関数、`const`、そしてオブジェクトリテラルのメンバー(`export const useAuthStore = …`、`authUtils.clear`)がついにノードになります:実際の865ファイルの Next.js アプリで、コンポーネントノードは **960 → 2,237** に増え、何も寄与していなかったファイルは 406 → 108 に減りました。import は今やラベルへのフォールバックの前に、まず**パス**で解決されます(相対指定子、`extends` チェーンと `${configDir}` に対応した `tsconfig`/`jsconfig` エイリアス、パッケージサフィックス) — そのため `from codebeacon.graph.build import …` が無関係な `build` シンボルに結び付くことはなくなり、CLAUDE.md の「High-Impact Files」リストが現実を反映します。素の JS の `class X extends Y` の継承と、動的な `await import()` のエッジも捕捉されます。
|
|
35
|
+
- **ルートのプレフィックスが実際のフレームワークどおりに合成されます** — 稼働中の FastAPI/Express/Flask サーバーを基準に検証しました:`include_router(prefix=)` はルーター自身のプレフィックスと合成され、属性形式の include(`app.include_router(pkg.router, …)`、`@pkg.router.get`)がもう消えることはなく、同一ファイル内でカスケードしたマウントは掛け合わされて展開され、2回マウントされたルーターは両方のルートを産出し、Flask の `register_blueprint(url_prefix=)` は正しく *上書き* します。既知の限界:**ファイル**をまたぐマウントチェーンは依然として合成されません。
|
|
36
|
+
- **インターフェース→実装の DI 解決が実際に動くようになりました** — 抽出パイプラインのシリアライズ境界が 0.6.x 以来 `implements`/`extends` を静かに捨てていたため、wiki は正しく見えるのに機能全体がエンドツーエンドで死んでいました。修正し、キャッシュを無効化し、実際のパイプラインを通す境界テストで固めました。DI のバインディングには証拠のゲートも設けました:言語をまたぐ、あるいはプロジェクトをまたぐ捏造はもうありません(Spring の service が React コンポーネントを「注入」することはできません)。実装が複数ある曖昧なケースは `*Impl` の命名規約による場合のみ、明示的な `AMBIGUOUS` 信頼度でバインドされ、重複したエッジは上書きする代わりに、新しい `also` 属性の下に2つ目の関係を記録します。
|
|
37
|
+
- **ノードの同一性が決定的で、拡張子を認識します** — `Button.tsx` と `Button.jsx` は2つのノードです(以前は一方がもう一方を静かに吸収していました — codebeacon 自身のリポでは宣言の6.3%)。ノード ID はもうスレッドの完了順やチェックアウトディレクトリに依存しないため、wiki/obsidian のファイル名が実行のたびに入れ替わることがなくなります。衝突するラベルには、区別できる最短のパスサフィックスが付きます。(以前に潰れていたノードの ID は、アップグレード時に一度だけ入れ替わります。)
|
|
38
|
+
- **ignore 層が git にずっと近く一致します** — ネストした `.gitignore` は自身のサブツリーに適用され(モノレポの `app/.gitignore` が無視されて数万のビルドファイルがスキャンに引き込まれることがなくなりました)、`.git/info/exclude` が尊重され、リンクされた worktree はコーパスを二重にする代わりに構造的に検出され、BOM 付き / UTF-16 / NFD エンコードの ignore ファイルは静かにルールを落とすのではなくデコードされます。曖昧なディレクトリ名(`env/`、`build/`、`public/`、`coverage/`、…)は裏付けとなる証拠があるときにのみ刈り込まれます — UVM の `env/` テストベンチや `coverage/` という名前の Python パッケージはグラフに残ります。マッチングは約19倍高速になり、新しい `ignored.json` 診断が、すべてのサブツリーがスキップされた *理由* を記録します。
|
|
39
|
+
- **shrink ガードが、本当に重要な経路を守るようになりました** — 以前は `--update` があるというだけで解除されていましたが、それはまさに無人の経路(watch、git hook、CI)でした。権限エラー1つで、コミットされたグラフが静かに半減しかねなかったのです。今では削除されたすべてのノードをそのソースファイルに帰属させ(削除された / 新たに ignore された / **説明がつかない** — 拒否するのは最後のものだけで、本物の `--force` フラグが用意されています)、あらゆる経路で武装したままとなり、読み取れないサブツリーを「不明、免除しない」として扱い、ノードは変わらないのにエッジが潰れたときには警告します。
|
|
40
|
+
- **`scan → knowledge → scan` がもう詰まりません** — 0.7.0 で文書化されていたフローは、終了コード1(「refusing to shrink」)で終わるか、ノートのオーバーレイを静かに捨てるかのどちらかでした。ガードはティアを認識するようになり、knowledge のオーバーレイは**すべてのスキャンの後に自動で再適用**されます。ノートを削除すると、まさにそのノートだけが刈り取られます。書いた `[[wikilinks]]` がついにエッジを生成し(パースされたうえで捨てられていました — 損失100%)、ノートは `node_kind`/フロントマターを持ち、生成されたファイル(CLAUDE.md、KNOWLEDGE.md)がノートとして再取り込みされることはなくなりました。
|
|
41
|
+
- **コミットされたインデックスがきれいなままです** — 変更のない再スキャンが書き換えるコミット対象ファイルは、今や**ゼロ**です(以前はそのすべて。アップストリームでは約31,000ファイルの変動)。`built_at_ts` はコミットから導出され、エクスポートは内容が変わったときにのみ書き込まれ、マシンローカルの AST キャッシュは自分自身を git-ignore します。HTML エクスポート(`beacon.html`、`callflow.html`)は JS を**デフォルトでオフライン**同梱します(d3 + mermaid を `_assets/` 配下にベンダリング) — エアギャップの姿勢に沿ったものです。従来の挙動を保ちたい場合は `output.html_assets: cdn` を設定してください。ビルドマシンの絶対パスが、どの成果物にも漏れることはなくなりました。
|
|
42
|
+
- **プログラムから信頼できる MCP の応答** — ツールの失敗は、実行可能なメッセージとともに `isError: true` を返します(成功の形をしたエラー散文や、クライアントが飲み込んでしまうプロトコルエラーの代わりに)。名前解決は部分文字列より完全一致を優先するため、`blast_radius("User")` が `UserServiceImpl` について答えることはなくなりました。すべてのツールが `token_budget`(デフォルト2,000トークン)を尊重し、真の総量に対する切り詰めを告知します。
|
|
43
|
+
- **堅牢性とセキュリティのスイープ** — `.csproj` の XML は DOCTYPE/ENTITY のスクリーンを通してパースされます。モデルに提示されるテキスト(MCP 出力、CLAUDE.md)は、チャットテンプレートの制御トークンを形態(`<|…|>`、`[INST]`)に基づいて無力化します。`hook install` は git worktree で動作し、リポジトリを設定が半端なまま放置することがありません。`install`/`upgrade` は手で編集した SKILL.md を上書きせずにバックアップし、終端されていないマーカーがその下のユーザーコンテンツを削除できなくなりました。cp949/latin-1 の CLAUDE.md がスキャンをクラッシュさせません。`codebeacon … | head` はきれいに終了します。watch モードが Linux の inotify イベントで自分自身を再トリガーすることはなくなりました。Leiden クラスタリングにはシードが与えられ、再スキャンのたびにコミュニティが12%ずつ漂流することがなくなりました。
|
|
44
|
+
|
|
45
|
+
アップグレードノート:以前に潰れていた宣言のノード ID が一度だけ入れ替わります。semantic の `task_id` が一度だけ無効化されます(タスクはファイル全体をハッシュするようになり、「4,000文字以降の編集が二度と再分析されない」問題が解消しました)。AST キャッシュが一度だけ無効化されます(スキーマスタンプ)。新しいエッジ属性 `also`、新しい信頼度の値 `AMBIGUOUS`、semantic が発行した external ノードに付く新しい `verification` マーカー。リポジトリが既に `.codebeacon/cache/` をコミットしている場合は、`git rm --cached -r .codebeacon/cache` を一度実行してください — 新しい自己無視の `.gitignore` は、既に追跡中のファイルを追跡解除できません。
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 0.7.0 の新機能
|
|
50
|
+
|
|
51
|
+
バグ修正のスイープというより機能リリースです:codebeacon にライブのファイルウォッチャーが加わり、設計ノートをコードグラフに繋ぎ、2つの新しいフロントエンド(MCP サーバー用の npm ランチャーと GitHub Action)を提供し、デフォルトでインデックスする対象を絞り込みました。すべての機能はローカルファーストのままです — コアスキャンは相変わらずネットワークも、クラウドも、モデルも必要としません。
|
|
52
|
+
|
|
53
|
+
- **`codebeacon watch` がインデックスをライブに保ちます** — デバウンスされたファイルウォッチャー(`codebeacon watch [path] [--debounce 2.0] [--once] [--exclude PATTERN]`)が、監視中のソースファイルが変わるたびにグラフを再同期します。編集の集中 — 500ファイルの `git checkout`、ブランチ切り替え — は単一の再同期にまとめられ、ウォッチャーはスキャナーとまったく同じ無視ルールを再利用するため、インデックスを書き込む動作が自身の `.codebeacon/` 出力を巡るループでウォッチャーを起こすことはありません。新しいオプションの extra が必要です:`pip install 'codebeacon[watch]'`(watchdog)。
|
|
54
|
+
- **設計ノートがコードグラフに繋がります** — `codebeacon knowledge` は、インデックスが既に存在する場合、ノート(ADR、会議メモ、レトロ、仕様)を `beacon.json` の *中に* 書き込むようになりました:明示的なファイルパス参照は信頼された `references` エッジになり、特徴的なシンボルの言及(`PaymentService`、単なる `User` は決して対象外)は `AMBIGUOUS` な `mentions` エッジになります — こうしてグラフを読むエージェントは、ある service が *なぜ* その形をしているのかを学びます。`codebeacon scan` はコードグラフをソースだけから再構築してこのオーバーレイを捨てるため、リンクを復元するには **スキャンの後に `codebeacon knowledge` を再実行してください**。
|
|
55
|
+
- **`beacon_knowledge` MCP ツール** — 新しいツールがキーワードでノートを検索し、あるいは指定したコードノードに繋がったノートを一覧して、コードの背後にある意思決定の軌跡を MCP 越しに直接公開します。
|
|
56
|
+
- **MCP サーバー用の npm ランチャー** — `@codebeacon/mcp` により、MCP クライアントは期待どおりの npx ファーストの方法でサーバーを起動できます(`"command": "npx", "args": ["-y", "@codebeacon/mcp"]`)。依存関係ゼロの Node シムが、動作する codebeacon を PATH → `uvx` → `pipx run` → `python3 -m codebeacon` の順に解決し、stdio を手を加えずそのまま転送します。[`npm/README.md`](npm/README.md) を参照。(0.7.0 に同梱、npm へはまだ公開されていません。)
|
|
57
|
+
- **PR コンテキスト用の GitHub Action** — コンポジットアクションが、すべてのプルリクエストに、コミットされた知識グラフのうち影響を受けたスライスをコメントします:変更が触れる wiki 記事、上流のブラスト半径、そして編集された高影響のハブファイル — AI 時代のレビューのためのアーキテクチャドリフト検査です。コミットされた `.codebeacon/` インデックス、`fetch-depth: 0`、`permissions: pull-requests: write` が必要です。[`action/README.md`](action/README.md) と [`action/examples/pr-context.yml`](action/examples/pr-context.yml) を参照。
|
|
58
|
+
- **ワークスペースの CLAUDE.md が約200行以下に収まります** — マルチプロジェクトのワークスペースでは、ルートの `CLAUDE.md` が共有の概要だけを保ち、プロジェクトごとの詳細を、`paths:` フロントマターがそのプロジェクトのファイルに触れたときだけ読み込むスコープ付きの `.claude/rules/codebeacon-<project>.md` ファイルに移すようになりました(コンテキストファイルに関する Anthropic 自身のガイダンスに従っています)。単一プロジェクトの出力は変わりません。従来の一枚岩ファイルが欲しい場合は `output.context_map.rules_split: false` を設定してください。重複するプロジェクト行もまとめられます。
|
|
59
|
+
- **テストフィクスチャがデフォルトで無視されます** — どの深さの `tests/fixtures/`、`test/fixtures/`、`__fixtures__/` もデフォルトで無視されるようになり、プロジェクトの合成テスト入力が偽のルートや service をグラフに注入しなくなります(codebeacon 自身のセルフスキャンは、フィクスチャの `main.py` を5つの「ルート」として報告していました)。これは最も優先度の低いルールなので、`.codebeaconignore` に `!tests/fixtures/` の行を入れれば再び含められ、スキャンをフィクスチャディレクトリ *に* 向ければ依然として収集されます。
|
|
60
|
+
- **Warp のルート抽出が本物になりました** — Warp のフィルタ・コンビネータのルートが実際に抽出されます:`warp::path!(...)` と `warp::path("x")` のセグメント、メソッドコンビネータ(`warp::get()` / `post()` / …)、そして `.map` / `.and_then` ハンドラが、それらを囲むバインディングを基準に相関づけられ、まるごとのルートになります。正直な限界(クエリヘッダーに明記):1つのバインディング内で `.or(...)` で繋がれたフィルタは単一の連結ルートに潰れ、`warp::path::param()` のフィルタ呼び出しセグメントとクロージャハンドラは未解決のまま残ります。
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
30
64
|
## 0.6.9 の新機能
|
|
31
65
|
|
|
32
66
|
これまでで最大規模の監査リリースです。二重のアップストリーム・パリティ・スイープ(codesight のトラッカーに対する史上初の完全監査に加え、graphify v0.9.4–v0.9.12 / issue は #1776 まで)と、codebeacon 自体に対する独立したマルチエージェント・バグハントを組み合わせました。各候補は修正前に再現し、各修正は mutation テストにかけ、さらに敵対的な2次レビューが修正自体を攻撃して、リリース前にさらに18個の穴を捕まえました。**実バグ48件を修正。**
|
|
@@ -27,6 +27,40 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## 0.7.1 새 소식
|
|
31
|
+
|
|
32
|
+
역대 최대 감사 릴리스입니다: 듀얼 업스트림 패리티 스윕(graphify v0.9.13–v0.9.53 / 이슈 #1777–#3235, 그리고 codesight #50–#55)을 재현-필수 원칙으로 codebeacon에 대조 검증해 **확정 결함 약 70개를 수정**했습니다. 병렬 픽서 10개가 작업하고 모든 픽스를 뮤테이션 테스트했으며, 리드가 실제 CLI 통합 실행으로 적대적 리뷰를 수행했습니다. 테스트 스위트: 885 → 1,481개.
|
|
33
|
+
|
|
34
|
+
- **JS/TS 그래프가 사실상 두 배가 됐습니다** — export된 소문자 화살표 함수, `const`, 객체 리터럴 멤버(`export const useAuthStore = …`, `authUtils.clear`)가 드디어 노드가 됩니다: 실제 865-파일 Next.js 앱에서 컴포넌트 노드가 **960 → 2,237**로 늘고 아무것도 기여하지 않던 파일이 406 → 108로 줄었습니다. 임포트는 이제 라벨 폴백 전에 **경로**로 먼저 해석됩니다(상대 지정자, `extends` 체인·`${configDir}`까지 지원하는 `tsconfig`/`jsconfig` 별칭, 패키지 서픽스) — `from codebeacon.graph.build import …`가 무관한 `build` 심볼에 붙는 일이 사라지고, CLAUDE.md의 "High-Impact Files" 목록이 현실을 반영합니다. 순수 JS의 `class X extends Y` 상속과 동적 `await import()` 엣지도 잡습니다.
|
|
35
|
+
- **라우트 prefix가 실제 프레임워크처럼 합성됩니다** — 실행 중인 FastAPI/Express/Flask 서버를 오라클로 검증: `include_router(prefix=)`는 라우터 자체 prefix와 합성되고, 속성형 include(`app.include_router(pkg.router, …)`, `@pkg.router.get`)가 더는 사라지지 않으며, 같은 파일의 캐스케이드 마운트가 전개되고, 두 번 마운트된 라우터는 두 라우트를 내며, Flask의 `register_blueprint(url_prefix=)`는 올바르게 *덮어씁니다*. 알려진 한계: **파일을 넘는** 마운트 체인은 아직 합성되지 않습니다.
|
|
36
|
+
- **인터페이스→구현 DI 해석이 이제 실제로 동작합니다** — 추출 파이프라인의 직렬화 경계가 0.6.x부터 `implements`/`extends`를 조용히 버리고 있어서, 위키는 멀쩡해 보이는데 기능 전체가 엔드투엔드로 죽어 있었습니다. 수정하고, 캐시를 무효화하고, 실제 파이프라인 경계를 통과하는 테스트로 고정했습니다. DI 바인딩엔 증거 게이트도 생겼습니다: 언어·프로젝트를 넘는 조작이 사라지고(Spring 서비스가 React 컴포넌트를 "주입"하는 일 불가), 구현이 여럿인 모호한 경우는 `*Impl` 네이밍 관례로만 명시적 `AMBIGUOUS` 신뢰도로 바인딩하며, 중복 엣지는 덮어쓰는 대신 새 `also` 속성에 두 번째 관계를 기록합니다.
|
|
37
|
+
- **노드 정체성이 결정적이고 확장자를 인식합니다** — `Button.tsx`와 `Button.jsx`는 두 노드입니다(이전엔 하나가 다른 하나를 조용히 흡수 — codebeacon 자체 레포에서 선언의 6.3%). 노드 ID가 스레드 완료 순서나 체크아웃 디렉터리에 더는 의존하지 않아 위키/옵시디언 파일명이 실행마다 뒤바뀌지 않습니다. 충돌하는 라벨은 구분되는 최단 경로 서픽스를 얻습니다. (이전에 붕괴됐던 노드의 ID는 업그레이드 시 한 번 바뀝니다.)
|
|
38
|
+
- **ignore 계층이 git과 훨씬 가깝게 일치합니다** — 중첩 `.gitignore`가 자기 서브트리에 적용되고(모노레포의 `app/.gitignore`가 무시돼 수만 개 빌드 파일이 스캔에 딸려오던 문제 해결), `.git/info/exclude`를 존중하며, 연결된 worktree를 구조적으로 감지해 코퍼스 2배 중복을 막고, BOM/UTF-16/NFD 인코딩 ignore 파일이 규칙을 조용히 잃는 대신 디코딩됩니다. 모호한 디렉터리 이름(`env/`, `build/`, `public/`, `coverage/` …)은 입증 증거가 있을 때만 프룬됩니다 — UVM `env/` 테스트벤치나 `coverage/`라는 이름의 파이썬 패키지는 그래프에 남습니다. 매칭은 약 19배 빨라졌고, 새 `ignored.json` 진단이 모든 스킵된 서브트리의 *이유*를 기록합니다.
|
|
39
|
+
- **shrink 가드가 정작 중요한 경로를 지킵니다** — 예전엔 `--update` 플래그만 있으면 해제됐는데, 그게 바로 무인 경로(watch, git 훅, CI)였습니다: 권한 오류 하나가 커밋된 그래프를 조용히 반토막 낼 수 있었습니다. 이제 제거된 모든 노드를 소스 파일 단위로 귀속시키고(삭제됨 / 새로 ignore됨 / **미설명** — 마지막 것만 거부하며 진짜 `--force` 플래그 제공), 모든 경로에서 무장 상태를 유지하고, 읽을 수 없는 서브트리를 "모름, 면제 불가"로 취급하며, 노드는 그대로인데 엣지가 붕괴하면 경고합니다.
|
|
40
|
+
- **`scan → knowledge → scan`이 더는 막히지 않습니다** — 0.7.0의 공식 플로우가 rc=1("refusing to shrink")로 끝나거나 노트 오버레이를 조용히 버렸습니다. 가드가 티어를 인식하고 knowledge 오버레이가 **모든 스캔 후 자동 재적용**됩니다; 노트를 지우면 정확히 그 노트만 정리됩니다. 작성한 `[[위키링크]]`가 드디어 엣지를 만들고(파싱만 되고 버려져 100% 소실이었음), 노트가 `node_kind`/frontmatter를 갖게 되며, 생성 파일(CLAUDE.md, KNOWLEDGE.md)이 노트로 재수집되지 않습니다.
|
|
41
|
+
- **커밋된 인덱스가 깨끗하게 유지됩니다** — 무변경 재스캔이 커밋 대상 파일을 **0개** 재작성합니다(이전: 전부): `built_at_ts`가 커밋에서 파생되고, export는 내용이 바뀔 때만 쓰며, 머신-로컬 AST 캐시는 스스로 git-ignore합니다. HTML export(`beacon.html`, `callflow.html`)는 JS를 **기본 오프라인**으로 동봉합니다(d3 + mermaid를 `_assets/`에 벤더링) — air-gap 포지셔닝 그대로; 예전 동작은 `output.html_assets: cdn`. 빌드 머신의 절대경로가 어떤 산출물에도 더는 새지 않습니다.
|
|
42
|
+
- **프로그램이 신뢰할 수 있는 MCP 응답** — 도구 실패가 실행 가능한 메시지와 함께 `isError: true`로 반환되고(성공 모양의 에러 산문이나 클라이언트가 삼키는 프로토콜 에러 대신), 이름 해석이 부분 문자열보다 정확 일치를 우선해 `blast_radius("User")`가 `UserServiceImpl`에 대해 답하지 않으며, 모든 도구가 `token_budget`(기본 2,000 토큰)을 지키고 실제 총량 대비 절단을 고지합니다.
|
|
43
|
+
- **견고성·보안 스윕** — `.csproj` XML을 DOCTYPE/ENTITY 차단막과 함께 파싱; 모델-대면 텍스트(MCP 출력, CLAUDE.md)가 챗-템플릿 제어 토큰을 형태 기반으로 무력화(`<|…|>`, `[INST]`); `hook install`이 git worktree에서 동작하고 레포를 반쯤 설정된 채 방치하지 않음; `install`/`upgrade`가 손수 수정한 SKILL.md를 백업하고, 종료 마커 없는 블록이 아래 사용자 콘텐츠를 지울 수 없음; cp949/latin-1 CLAUDE.md가 스캔을 죽이지 않음; `codebeacon … | head`가 깔끔히 종료; watch 모드가 Linux inotify 이벤트에 스스로 재점화되지 않음; Leiden 클러스터링에 시드가 고정돼 재스캔마다 커뮤니티가 12%씩 표류하던 문제 해결.
|
|
44
|
+
|
|
45
|
+
업그레이드 노트: 이전에 붕괴됐던 선언의 노드 ID가 한 번 바뀝니다; semantic `task_id`가 한 번 무효화됩니다(이제 파일 전체를 해시 — "4,000자 이후 수정은 영원히 재분석 안 됨" 수정); AST 캐시가 한 번 무효화됩니다(스키마 스탬프); 새 엣지 속성 `also`, 새 신뢰도 값 `AMBIGUOUS`, semantic이 발행한 external 노드의 새 `verification` 마커. 레포가 이미 `.codebeacon/cache/`를 커밋했다면 `git rm --cached -r .codebeacon/cache`를 한 번 실행하세요 — 새 자가-ignore `.gitignore`는 이미 추적 중인 파일을 untrack하지 못합니다.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 0.7.0 새 소식
|
|
50
|
+
|
|
51
|
+
버그 스윕이라기보다 기능 릴리스입니다: codebeacon에 실시간 파일 워처가 생기고, 설계 노트를 코드 그래프에 연결하며, 두 개의 새 프런트엔드(MCP 서버용 npm 런처와 GitHub Action)를 제공하고, 기본으로 인덱싱하는 대상을 좁혔습니다. 모든 기능은 로컬 우선을 유지합니다 — 코어 스캔은 여전히 네트워크도, 클라우드도, 모델도 필요로 하지 않습니다.
|
|
52
|
+
|
|
53
|
+
- **`codebeacon watch`가 인덱스를 실시간으로 유지합니다** — 디바운스된 파일 워처(`codebeacon watch [path] [--debounce 2.0] [--once] [--exclude PATTERN]`)가 감시 중인 소스 파일이 바뀔 때마다 그래프를 다시 동기화합니다. 편집 폭주 — 500개 파일 `git checkout`, 브랜치 전환 — 는 단일 재동기화로 합쳐지고, 워처가 스캐너의 정확히 동일한 무시 규칙을 재사용하므로 인덱스를 쓰는 동작이 자신의 `.codebeacon/` 출력을 도는 루프로 워처를 깨우는 일이 없습니다. 새 선택적 extra가 필요합니다: `pip install 'codebeacon[watch]'`(watchdog).
|
|
54
|
+
- **설계 노트가 코드 그래프에 연결됩니다** — `codebeacon knowledge`가 인덱스가 이미 존재할 때 이제 노트(ADR, 회의록, 회고, 스펙)를 `beacon.json` *안에* 기록합니다: 명시적 파일 경로 참조는 신뢰된 `references` 엣지가 되고, 특징적인 심볼 언급(`PaymentService`, 맨 `User`은 절대 아님)은 `AMBIGUOUS` `mentions` 엣지가 됩니다 — 그래서 그래프를 읽는 에이전트가 어떤 service가 *왜* 그런 형태인지를 배웁니다. `codebeacon scan`은 코드 그래프를 소스만으로 다시 만들며 이 오버레이를 버리므로, 링크를 복원하려면 **스캔 후 `codebeacon knowledge`를 다시 실행하세요**.
|
|
55
|
+
- **`beacon_knowledge` MCP 도구** — 새 도구가 키워드로 노트를 검색하거나 주어진 코드 노드에 연결된 노트를 나열해, 코드 뒤에 있는 결정의 흔적을 MCP로 직접 노출합니다.
|
|
56
|
+
- **MCP 서버용 npm 런처** — `@codebeacon/mcp`는 MCP 클라이언트가 기대하는 npx 우선 방식으로 서버를 시작하게 해줍니다(`"command": "npx", "args": ["-y", "@codebeacon/mcp"]`). 의존성 없는 Node 심(shim)이 PATH → `uvx` → `pipx run` → `python3 -m codebeacon` 순으로 동작하는 codebeacon을 찾아 stdio를 손대지 않고 그대로 전달합니다. [`npm/README.md`](npm/README.md) 참조. (0.7.0에 포함, 아직 npm에 게시되지 않음.)
|
|
57
|
+
- **PR 컨텍스트용 GitHub Action** — 컴포지트 액션이 모든 풀 리퀘스트에, 커밋된 지식 그래프에서 영향받는 조각을 댓글로 남깁니다: 변경이 건드리는 wiki 문서, 업스트림 폭발 반경, 그리고 편집된 고영향 허브 파일 — AI 시대 리뷰를 위한 아키텍처 드리프트 점검입니다. 커밋된 `.codebeacon/` 인덱스, `fetch-depth: 0`, `permissions: pull-requests: write`가 필요합니다. [`action/README.md`](action/README.md)와 [`action/examples/pr-context.yml`](action/examples/pr-context.yml) 참조.
|
|
58
|
+
- **워크스페이스 CLAUDE.md가 ~200줄 이하로 유지됩니다** — 다중 프로젝트 워크스페이스에서 루트 `CLAUDE.md`가 이제 공유 개요만 담고, 프로젝트별 세부는 `paths:` 프런트매터가 해당 프로젝트 파일을 건드릴 때만 로드하는 스코프된 `.claude/rules/codebeacon-<project>.md` 파일로 옮깁니다(컨텍스트 파일에 대한 Anthropic 자체 가이드를 따름). 단일 프로젝트 출력은 그대로입니다. 예전의 단일 파일을 원하면 `output.context_map.rules_split: false`로 설정하세요. 중복 프로젝트 행도 합쳐집니다.
|
|
59
|
+
- **테스트 픽스처가 기본으로 무시됩니다** — 어느 깊이든 `tests/fixtures/`, `test/fixtures/`, `__fixtures__/`가 이제 기본 무시되어, 프로젝트의 합성 테스트 입력이 가짜 라우트와 service를 그래프에 주입하는 일이 멈춥니다(codebeacon 자체 셀프 스캔이 픽스처 `main.py`를 다섯 개의 "라우트"로 보고했었습니다). 이는 우선순위가 가장 낮은 규칙이므로, `.codebeaconignore`에 `!tests/fixtures/` 줄을 넣으면 다시 포함되고, 스캔을 픽스처 디렉토리*로* 향하게 하면 여전히 수집됩니다.
|
|
60
|
+
- **Warp 라우트 추출이 이제 실제로 됩니다** — Warp의 필터-콤비네이터 라우트가 실제로 추출됩니다: `warp::path!(...)`와 `warp::path("x")` 세그먼트, 메서드 콤비네이터(`warp::get()` / `post()` / …), 그리고 `.map` / `.and_then` 핸들러가 그것들을 감싸는 바인딩을 기준으로 상관되어 온전한 라우트로 만들어집니다. 정직한 한계(쿼리 헤더에 명시됨): 한 바인딩 안에서 `.or(...)`로 이어진 필터는 하나의 연결된 라우트로 합쳐지고, `warp::path::param()` 필터-호출 세그먼트와 클로저 핸들러는 미해결로 남습니다.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
30
64
|
## 0.6.9 새 소식
|
|
31
65
|
|
|
32
66
|
역대 최대 규모의 감사 릴리스입니다: 이중 업스트림 패리티 스윕(codesight 트래커 최초 전체 감사 + graphify v0.9.4–v0.9.12 / 이슈 #1776까지)에 codebeacon 자체에 대한 독립 멀티에이전트 버그 헌트를 결합했습니다. 모든 후보를 수정 전에 재현하고, 모든 수정을 mutation 테스트했으며, 적대적 2차 리뷰가 수정 자체를 공격해 출시 전에 추가 구멍 18개를 잡아냈습니다. **실제 버그 48건 수정.**
|