codebeacon 0.7.0__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.7.0 → codebeacon-0.7.1}/PKG-INFO +21 -2
- {codebeacon-0.7.0 → codebeacon-0.7.1}/README.de.md +19 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/README.es.md +19 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/README.fr.md +19 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/README.ja.md +19 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/README.ko.md +19 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/README.md +19 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/README.pt-BR.md +19 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/README.zh-CN.md +19 -0
- codebeacon-0.7.1/codebeacon/__init__.py +1 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/affected.py +31 -3
- codebeacon-0.7.1/codebeacon/cache.py +654 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/cli.py +257 -18
- {codebeacon-0.7.0 → 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.7.0 → codebeacon-0.7.1}/codebeacon/config.py +63 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/contextmap/generator.py +59 -6
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/diagnostics.py +110 -4
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/discover/detector.py +52 -11
- {codebeacon-0.7.0 → 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.7.0 → codebeacon-0.7.1}/codebeacon/export/callflow_html.py +85 -29
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/export/hooks.py +112 -18
- codebeacon-0.7.1/codebeacon/export/mcp.py +1088 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/export/obsidian.py +266 -79
- {codebeacon-0.7.0 → 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.7.0 → codebeacon-0.7.1}/codebeacon/extract/base.py +77 -6
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/components.py +89 -24
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/dependencies.py +64 -20
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/dotnet.py +54 -18
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/aspnet.scm +64 -5
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/django.scm +14 -1
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/express.scm +58 -1
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/fastapi.scm +44 -25
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/flask.scm +20 -2
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/laravel.scm +19 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/rails.scm +29 -8
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/react.scm +77 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/routes.py +244 -77
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/services.py +217 -24
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/graph/analyze.py +32 -3
- codebeacon-0.7.1/codebeacon/graph/build.py +1106 -0
- {codebeacon-0.7.0 → 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.7.0 → codebeacon-0.7.1}/codebeacon/knowledge/__init__.py +2 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/knowledge/generator.py +170 -9
- codebeacon-0.7.1/codebeacon/knowledge/link.py +745 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/pipeline.py +287 -48
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/semantic_pipeline.py +570 -91
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/watch.py +21 -1
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/wave.py +28 -6
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/wiki/generator.py +117 -59
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/wiki/index.py +26 -12
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/wiki/templates.py +57 -16
- {codebeacon-0.7.0 → codebeacon-0.7.1}/npm/package.json +1 -1
- {codebeacon-0.7.0 → codebeacon-0.7.1}/pyproject.toml +13 -1
- 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.0 → 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.0 → codebeacon-0.7.1}/tests/test_discover.py +8 -5
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_filters.py +7 -3
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_knowledge_graph_link.py +7 -2
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_safety_and_writes.py +48 -15
- codebeacon-0.7.0/codebeacon/__init__.py +0 -1
- codebeacon-0.7.0/codebeacon/cache.py +0 -320
- codebeacon-0.7.0/codebeacon/common/safety.py +0 -181
- codebeacon-0.7.0/codebeacon/common/symbols.py +0 -127
- codebeacon-0.7.0/codebeacon/discover/scanner.py +0 -382
- codebeacon-0.7.0/codebeacon/export/mcp.py +0 -756
- codebeacon-0.7.0/codebeacon/graph/build.py +0 -633
- codebeacon-0.7.0/codebeacon/graph/write.py +0 -363
- codebeacon-0.7.0/codebeacon/knowledge/link.py +0 -359
- {codebeacon-0.7.0 → codebeacon-0.7.1}/.cursorrules +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/.github/CODEOWNERS +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/.github/dependabot.yml +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/.github/workflows/ci.yml +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/.github/workflows/release.yml +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/.gitignore +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/AGENTS.md +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/CLAUDE.md +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/LICENSE +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/action/README.md +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/action/action.yml +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/action/examples/pr-context.yml +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/action/pr_context.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/__main__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/common/__init__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/common/types.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/contextmap/__init__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/discover/__init__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/export/__init__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/export/merge.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/__init__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/entities.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/README.md +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/actix.scm +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/angular.scm +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/gin.scm +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/ktor.scm +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/nestjs.scm +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/spring_boot.scm +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/svelte.scm +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/tauri.scm +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/vapor.scm +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/queries/vue.scm +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/query_check.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/extract/semantic.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/graph/__init__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/graph/enrich.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/plugins/__init__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/plugins/githooks.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/plugins/skills.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/skill/SKILL.md +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon/wiki/__init__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/codebeacon.yaml.example +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/docs/TRANSLATION_STATUS.md +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/npm/README.md +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/npm/bin/run.js +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/public-plan.md +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/skill/install.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/__init__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/conftest.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/actix/main.rs +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/angular/app.component.ts +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/aspnet/UserController.cs +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/django/views.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/express/userRouter.js +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/fastapi/main.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/flask/app.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/gin/main.go +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/api-python/pyproject.toml +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/api-python/src/__init__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/api-python/src/main.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/api-python/src/services.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/web/package.json +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/integration_workspace/web/src/UserPage.tsx +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/ktor/UserRoutes.kt +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/laravel/UserController.php +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/nestjs/user.controller.ts +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/rails/users_controller.rb +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/react/UserPage.tsx +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/spring_boot/UserController.java +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/sveltekit/+page.svelte +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/vapor/routes.swift +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/vue/UserList.vue +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/fixtures/warp_app/src/main.rs +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/integration/__init__.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/integration/test_full_pipeline.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_action_pr_context.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_affected.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_affected_wiki.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_audit_069_cli.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_audit_069_cluster.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_audit_069_contextmap.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_audit_069_detector.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_audit_069_discover.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_audit_069_export.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_audit_069_extract.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_audit_069_io.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_audit_069_semantic.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_audit_069_wiki.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_audit_bugfixes.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_cli_dispatch.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_cli_upgrade.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_contextmap_paths.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_contextmap_rules_split.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_deep_dive_grouping.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_dependencies.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_diagnostics.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_dotnet.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_entities.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_fixture_exclusion.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_graph.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_graphify_parity_0_6_3.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_graphify_parity_0_6_6.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_graphify_parity_0_6_7.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_graphify_parity_0_6_8.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_graphify_parity_fixes.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_independent_audit_fixes.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_knowledge.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_known_bugs.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_mcp_and_semantic.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_npm_wrapper.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_optional_grammars.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_pipeline_module.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_plugins.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_query_node_types.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_resolve.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_routes.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_scanner_sensitive.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_semantic.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_semantic_hardening.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_semantic_stats.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_services.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_warp_routes.py +0 -0
- {codebeacon-0.7.0 → codebeacon-0.7.1}/tests/test_watch_mode.py +0 -0
- {codebeacon-0.7.0 → 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.7.
|
|
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
|
|
@@ -122,6 +122,25 @@ Description-Content-Type: text/markdown
|
|
|
122
122
|
|
|
123
123
|
---
|
|
124
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
|
+
|
|
125
144
|
## What's new in 0.7.0
|
|
126
145
|
|
|
127
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.
|
|
@@ -27,6 +27,25 @@
|
|
|
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
|
+
|
|
30
49
|
## Neu in 0.7.0
|
|
31
50
|
|
|
32
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.
|
|
@@ -27,6 +27,25 @@
|
|
|
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
|
+
|
|
30
49
|
## Novedades en 0.7.0
|
|
31
50
|
|
|
32
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.
|
|
@@ -27,6 +27,25 @@
|
|
|
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
|
+
|
|
30
49
|
## Nouveautés en 0.7.0
|
|
31
50
|
|
|
32
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.
|
|
@@ -27,6 +27,25 @@
|
|
|
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
|
+
|
|
30
49
|
## 0.7.0 の新機能
|
|
31
50
|
|
|
32
51
|
バグ修正のスイープというより機能リリースです:codebeacon にライブのファイルウォッチャーが加わり、設計ノートをコードグラフに繋ぎ、2つの新しいフロントエンド(MCP サーバー用の npm ランチャーと GitHub Action)を提供し、デフォルトでインデックスする対象を絞り込みました。すべての機能はローカルファーストのままです — コアスキャンは相変わらずネットワークも、クラウドも、モデルも必要としません。
|
|
@@ -27,6 +27,25 @@
|
|
|
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
|
+
|
|
30
49
|
## 0.7.0 새 소식
|
|
31
50
|
|
|
32
51
|
버그 스윕이라기보다 기능 릴리스입니다: codebeacon에 실시간 파일 워처가 생기고, 설계 노트를 코드 그래프에 연결하며, 두 개의 새 프런트엔드(MCP 서버용 npm 런처와 GitHub Action)를 제공하고, 기본으로 인덱싱하는 대상을 좁혔습니다. 모든 기능은 로컬 우선을 유지합니다 — 코어 스캔은 여전히 네트워크도, 클라우드도, 모델도 필요로 하지 않습니다.
|
|
@@ -25,6 +25,25 @@
|
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
28
|
+
## What's new in 0.7.1
|
|
29
|
+
|
|
30
|
+
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.
|
|
31
|
+
|
|
32
|
+
- **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.
|
|
33
|
+
- **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.
|
|
34
|
+
- **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.
|
|
35
|
+
- **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.)
|
|
36
|
+
- **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.
|
|
37
|
+
- **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.
|
|
38
|
+
- **`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.
|
|
39
|
+
- **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.
|
|
40
|
+
- **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.
|
|
41
|
+
- **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.
|
|
42
|
+
|
|
43
|
+
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.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
28
47
|
## What's new in 0.7.0
|
|
29
48
|
|
|
30
49
|
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.
|
|
@@ -27,6 +27,25 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Novidades na 0.7.1
|
|
31
|
+
|
|
32
|
+
A maior release de auditoria até agora: um duplo mutirão de paridade com o upstream (graphify v0.9.13–v0.9.53 / issues #1777–#3235, mais codesight #50–#55) verificado contra o codebeacon com reprodução obrigatória — **~70 defeitos confirmados corrigidos** por dez fixers em paralelo, cada correção passou por mutation testing e depois por uma revisão adversarial do lead com execuções de integração na CLI de verdade. Suíte: 885 → 1.481 testes.
|
|
33
|
+
|
|
34
|
+
- **O grafo JS/TS praticamente dobrou** — arrow functions minúsculas exportadas, `const`s e membros de objeto literal (`export const useAuthStore = …`, `authUtils.clear`) enfim viram nós: em um app Next.js real de 865 arquivos, os nós de componente foram de **960 → 2.237** e os arquivos que não contribuíam com nada caíram de 406 para 108. Os imports agora resolvem primeiro por **caminho** (especificadores relativos, aliases de `tsconfig`/`jsconfig` com cadeias de `extends` e `${configDir}`, sufixos de pacote) antes de recorrer aos labels — então `from codebeacon.graph.build import …` não pode mais se ligar a um símbolo `build` sem relação, e a lista "High-Impact Files" no CLAUDE.md reflete a realidade. A herança `class X extends Y` de JS puro e as arestas de `await import()` dinâmico também são capturadas.
|
|
35
|
+
- **Os prefixos de rota compõem como nos frameworks de verdade** — verificado contra servidores FastAPI/Express/Flask em execução: `include_router(prefix=)` compõe com o prefixo do próprio router, includes em forma de atributo (`app.include_router(pkg.router, …)`, `@pkg.router.get`) não somem mais, montagens em cascata no mesmo arquivo se multiplicam, um router montado duas vezes rende as duas rotas, e o `register_blueprint(url_prefix=)` do Flask corretamente *sobrescreve*. Limite conhecido: uma cadeia de montagem que atravessa **arquivos** ainda não é composta.
|
|
36
|
+
- **A resolução de DI interface→implementação agora funciona de verdade** — uma fronteira de serialização no pipeline de extração vinha descartando `implements`/`extends` em silêncio desde a 0.6.x, então a funcionalidade inteira estava morta de ponta a ponta enquanto o wiki parecia certo. Corrigido, com cache invalidado e testado na fronteira através do pipeline real. A ligação de DI também passou a exigir evidência: acabaram as fabricações entre linguagens ou entre projetos (um service Spring não pode mais "injetar" um componente React), casos ambíguos com múltiplas implementações só se ligam pela convenção de nomes `*Impl` sob uma confiança `AMBIGUOUS` explícita, e uma aresta duplicada registra sua segunda relação em um novo atributo `also` em vez de sobrescrever.
|
|
37
|
+
- **A identidade de nó é determinística e reconhece a extensão** — `Button.tsx` e `Button.jsx` são dois nós (antes um absorvia o outro em silêncio — 6,3% das declarações no próprio repositório do codebeacon); os IDs de nó não dependem mais da ordem de conclusão das threads nem do diretório de checkout, então os nomes de arquivo de wiki/obsidian param de oscilar entre execuções. Labels em colisão recebem o menor sufixo de caminho que os distingue. (Os IDs dos nós que antes eram colapsados mudam uma vez na atualização.)
|
|
38
|
+
- **A camada de ignore corresponde ao git de forma muito mais próxima** — arquivos `.gitignore` aninhados se aplicam à sua própria subárvore (o `app/.gitignore` de um monorepo não é mais ignorado, o que antes puxava dezenas de milhares de arquivos de build para dentro do scan), o `.git/info/exclude` é respeitado, worktrees vinculadas são detectadas estruturalmente em vez de dobrarem o corpus, e arquivos de ignore com BOM / em UTF-16 / codificados em NFD são decodificados em vez de perderem regras em silêncio. Nomes de diretório ambíguos (`env/`, `build/`, `public/`, `coverage/`, …) só são podados com evidência que os corrobore — um testbench UVM em `env/` ou um pacote Python chamado `coverage/` permanece no grafo. A correspondência ficou ~19× mais rápida, e um novo diagnóstico `ignored.json` registra *por que* cada subárvore foi pulada.
|
|
39
|
+
- **O shrink guard agora protege os caminhos que importam** — ele costumava ser desarmado pela mera presença de `--update`, ou seja, exatamente nos caminhos não supervisionados (watch, hooks de git, CI); um erro de permissão podia cortar seu grafo commitado pela metade em silêncio. Agora ele atribui cada nó removido ao seu arquivo-fonte (apagado / recém-ignorado / **inexplicado** — só o último recusa, com uma flag `--force` de verdade), fica armado em toda parte, trata uma subárvore ilegível como "desconhecida, não dispensar", e avisa quando as arestas colapsam mesmo que os nós tenham se mantido.
|
|
40
|
+
- **`scan → knowledge → scan` não trava mais** — o fluxo documentado da 0.7.0 ou saía com código 1 ("refusing to shrink") ou descartava sua sobrecamada de notas em silêncio. O guard agora reconhece os tiers e a sobrecamada de knowledge é **reaplicada automaticamente depois de cada scan**; apagar uma nota poda exatamente aquela nota. Os `[[wikilinks]]` que você escreve enfim criam arestas (eles eram parseados e depois descartados — 100% de perda), as notas carregam `node_kind`/frontmatter, e os arquivos gerados (CLAUDE.md, KNOWLEDGE.md) não são mais reingeridos como notas.
|
|
41
|
+
- **Um índice commitado permanece limpo** — um rescan sem mudanças agora reescreve **zero** arquivos commitados (antes: todos eles, uma rotatividade de ~31 mil arquivos no upstream): o `built_at_ts` deriva do commit, os exports só escrevem quando o conteúdo muda, e o cache de AST local da máquina se auto-ignora no git. Os exports HTML (`beacon.html`, `callflow.html`) entregam seu JS **offline por padrão** (d3 + mermaid vendorizados em `_assets/`) — combinando com a postura air-gapped; defina `output.html_assets: cdn` para manter o comportamento antigo. Caminhos absolutos da máquina de build não vazam mais para nenhum artefato.
|
|
42
|
+
- **Respostas de MCP em que dá para confiar programaticamente** — falhas de ferramenta retornam `isError: true` com a mensagem acionável (em vez de prosa de erro com formato de sucesso, ou um erro de protocolo que o cliente engole); a resolução de nomes prefere a correspondência exata antes das substrings, então `blast_radius("User")` não responde mais sobre `UserServiceImpl`; toda ferramenta respeita um `token_budget` (padrão de 2.000 tokens) e anuncia o truncamento em relação ao total real.
|
|
43
|
+
- **Mutirão de robustez e segurança** — o XML de `.csproj` é parseado com uma barreira contra DOCTYPE/ENTITY; o texto voltado ao modelo (saída do MCP, CLAUDE.md) neutraliza tokens de controle de chat-template pela forma (`<|…|>`, `[INST]`); o `hook install` funciona em worktrees do git e nunca deixa um repositório meio configurado; `install`/`upgrade` fazem backup de um SKILL.md editado à mão em vez de atropelá-lo, e um marcador sem terminação não pode mais apagar o conteúdo do usuário abaixo dele; um CLAUDE.md em cp949/latin-1 não derruba o scan; `codebeacon … | head` sai de forma limpa; o modo watch não se redispara mais com eventos do inotify no Linux; a clusterização de Leiden usa semente fixa, então as comunidades param de derivar 12% a cada rescan.
|
|
44
|
+
|
|
45
|
+
Notas de atualização: os IDs de nó das declarações que antes eram colapsadas mudam uma vez; os `task_id`s semânticos são invalidados uma vez (as tasks agora fazem hash do arquivo inteiro, corrigindo "edições depois do caractere 4.000 nunca eram reanalisadas"); o cache de AST é invalidado uma vez (carimbo de schema); novo atributo de aresta `also`, novo valor de confiança `AMBIGUOUS`, novo marcador `verification` nos nós externos cunhados pelo semantic. Se o seu repositório já commitou `.codebeacon/cache/`, execute uma vez `git rm --cached -r .codebeacon/cache` — o novo `.gitignore` auto-ignorante não consegue parar de rastrear arquivos já rastreados.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
30
49
|
## Novidades na 0.7.0
|
|
31
50
|
|
|
32
51
|
Uma release de capacidades mais do que um mutirão de bugs: o codebeacon ganha um file-watcher ao vivo, liga suas notas de design ao grafo de código, entrega dois novos front-ends (um lançador npm para o servidor MCP e uma GitHub Action) e aperta o que indexa por padrão. Cada funcionalidade continua local-first — o scan central continua sem precisar de rede, de nuvem nem de modelo.
|
|
@@ -27,6 +27,25 @@
|
|
|
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 个已确认的缺陷**,由十个并行的修复者完成,每一处修复都做了变异测试,随后由主导者以真实 CLI 集成运行进行对抗式复审。测试套件:885 → 1,481 个测试。
|
|
33
|
+
|
|
34
|
+
- **JS/TS 图差不多翻了一倍** — 导出的小写箭头函数、`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
|
+
- **路由前缀像真实框架那样组合** — 以运行中的 FastAPI/Express/Flask 服务器为准做了验证:`include_router(prefix=)` 会与路由器自身的前缀组合,属性形式的 include(`app.include_router(pkg.router, …)`、`@pkg.router.get`)不再凭空消失,同一文件内的级联挂载会展开相乘,被挂载两次的路由器会产出两条路由,而 Flask 的 `register_blueprint(url_prefix=)` 会正确地*覆盖*。已知限制:跨**文件**的挂载链仍未被组合。
|
|
36
|
+
- **接口→实现的 DI 解析现在真的能用了** — 提取流水线中的一处序列化边界自 0.6.x 起就在悄悄丢弃 `implements`/`extends`,于是 wiki 看上去一切正常,整个特性却是端到端死掉的。已修复、已让缓存失效,并通过真实流水线做了边界测试。DI 绑定现在还有证据门槛:不再有跨语言或跨项目的臆造(一个 Spring service 不可能再"注入"一个 React 组件),存在多个实现的歧义情况只按 `*Impl` 命名约定、以显式的 `AMBIGUOUS` 置信度绑定,而重复的边会把第二条关系记录到新的 `also` 属性下,而不是覆盖掉。
|
|
37
|
+
- **节点标识是确定性的,并且能区分扩展名** — `Button.tsx` 和 `Button.jsx` 是两个节点(此前其中一个会悄悄吞掉另一个 — 在 codebeacon 自己的仓库上占声明的 6.3%);节点 ID 不再依赖线程完成顺序或检出目录,于是 wiki/obsidian 的文件名不会在两次运行之间来回跳变。冲突的标签会拿到能区分彼此的最短路径后缀。(此前被合并掉的节点,其 ID 会在升级时变动一次。)
|
|
38
|
+
- **ignore 层与 git 的吻合度大幅提高** — 嵌套的 `.gitignore` 会作用于它自己的子树(monorepo 的 `app/.gitignore` 不再被忽略,过去这会把几万个构建文件拽进 scan),`.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 钩子、CI);一个权限错误就可能悄悄把你已提交的图砍掉一半。现在它会把每一个被移除的节点归因到其源文件(已删除 / 新被忽略 / **无法解释** — 只有最后一种会拒绝执行,并提供真正的 `--force` 标志),在所有路径上都保持武装状态,把读不了的子树当作"未知,不予豁免",并在节点数没变而边却塌缩时发出警告。
|
|
40
|
+
- **`scan → knowledge → scan` 不再卡死** — 0.7.0 中记录在案的这条流程,要么以退出码 1 收场("refusing to shrink"),要么悄悄丢掉你的笔记叠加层。守卫现在能识别层级,而且 knowledge 叠加层会在**每次 scan 之后自动重新应用**;删掉一条笔记就精确地只剪掉那一条。手写的 `[[wikilinks]]` 终于会生成边(此前解析完就被丢弃 — 100% 损失),笔记带上了 `node_kind`/frontmatter,生成的文件(CLAUDE.md、KNOWLEDGE.md)也不再被当作笔记重新收录。
|
|
41
|
+
- **已提交的索引保持干净** — 没有变化的重新扫描现在会重写**零**个已提交文件(此前:每一个都重写,上游曾出现约 3.1 万文件的抖动):`built_at_ts` 由提交推导而来,export 只在内容变化时才写入,而机器本地的 AST 缓存会把自己 git-ignore 掉。HTML export(`beacon.html`、`callflow.html`)**默认离线**内置它们的 JS(把 d3 + mermaid 打包进 `_assets/`) — 与气隙隔离的定位保持一致;设置 `output.html_assets: cdn` 可保留旧行为。构建机器的绝对路径不再泄漏到任何产物里。
|
|
42
|
+
- **程序上可以信赖的 MCP 回答** — 工具失败会返回 `isError: true` 并附上可操作的消息(而不是长得像成功的错误散文,或者被客户端吞掉的协议错误);名称解析会优先精确匹配再考虑子串,于是 `blast_radius("User")` 不会再回答关于 `UserServiceImpl` 的内容;每个工具都遵守 `token_budget`(默认 2,000 tokens),并会对照真实总量声明截断情况。
|
|
43
|
+
- **健壮性与安全清扫** — `.csproj` 的 XML 解析带上了 DOCTYPE/ENTITY 拦截;面向模型的文本(MCP 输出、CLAUDE.md)会按形态中和聊天模板的控制 token(`<|…|>`、`[INST]`);`hook install` 在 git worktree 中可用,而且绝不会把仓库丢在配置到一半的状态;`install`/`upgrade` 会备份手工改过的 SKILL.md 而不是直接覆盖,没有结束标记的标记块也不再能删掉它下方的用户内容;cp949/latin-1 编码的 CLAUDE.md 不会让 scan 崩溃;`codebeacon … | head` 能干净地退出;watch 模式不再被 Linux inotify 事件自我触发;Leiden 聚类固定了随机种子,社区不再每次重新扫描就漂移 12%。
|
|
44
|
+
|
|
45
|
+
升级说明:此前被合并掉的声明,其节点 ID 会变动一次;semantic 的 `task_id` 会失效一次(任务现在对整个文件做哈希,修复了"第 4,000 个字符之后的编辑永远不会被重新分析");AST 缓存会失效一次(schema 标记);新增边属性 `also`、新增置信度值 `AMBIGUOUS`、semantic 生成的 external 节点上新增 `verification` 标记。如果你的仓库已经提交过 `.codebeacon/cache/`,请执行一次 `git rm --cached -r .codebeacon/cache` — 新的自我忽略 `.gitignore` 无法取消跟踪已被跟踪的文件。
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
30
49
|
## 0.7.0 新功能
|
|
31
50
|
|
|
32
51
|
这是一次能力发布,而非 bug 清扫:codebeacon 新增了实时文件监视器,把你的设计笔记连入代码图,提供两个新的前端(用于 MCP 服务器的 npm 启动器和一个 GitHub Action),并收紧了默认索引的范围。每个功能都保持本地优先 — 核心 scan 依然不需要网络、不需要云、不需要模型。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.7.1"
|
|
@@ -17,6 +17,7 @@ Mirrors graphify #e44e6e9 ("v8 affected").
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
19
|
import subprocess
|
|
20
|
+
import sys
|
|
20
21
|
import unicodedata
|
|
21
22
|
from dataclasses import dataclass, field
|
|
22
23
|
from pathlib import Path
|
|
@@ -69,6 +70,27 @@ class AffectedResult:
|
|
|
69
70
|
return "\n".join(f"{prefix}/{p}" for p in self.wiki_paths)
|
|
70
71
|
|
|
71
72
|
|
|
73
|
+
def _normalise_path(value: str | Path) -> str:
|
|
74
|
+
"""Canonicalise a path for suffix matching.
|
|
75
|
+
|
|
76
|
+
Windows separators become ``/``; NFC normalisation lets a macOS git-diff
|
|
77
|
+
path (NFD) with accented filenames match the NFC ``source_file`` stored in
|
|
78
|
+
beacon.json (#1338); ``./`` prefixes and interior ``/./`` segments are
|
|
79
|
+
dropped, because ``git diff`` output and shell completion both hand us
|
|
80
|
+
``./src/x.py`` while the graph stores ``src/x.py``. Without that last step a
|
|
81
|
+
``./``-prefixed seed silently matched nothing whenever the graph held
|
|
82
|
+
ABSOLUTE source paths (write.py leaves paths outside every project root
|
|
83
|
+
absolute), since neither string is then a segment-aligned suffix of the
|
|
84
|
+
other.
|
|
85
|
+
"""
|
|
86
|
+
text = unicodedata.normalize("NFC", str(value)).replace("\\", "/")
|
|
87
|
+
while "/./" in text:
|
|
88
|
+
text = text.replace("/./", "/")
|
|
89
|
+
while text.startswith("./"):
|
|
90
|
+
text = text[2:]
|
|
91
|
+
return text
|
|
92
|
+
|
|
93
|
+
|
|
72
94
|
def affected_from_paths(
|
|
73
95
|
beacon_dir: str | Path,
|
|
74
96
|
changed_paths: Iterable[str],
|
|
@@ -98,7 +120,7 @@ def affected_from_paths(
|
|
|
98
120
|
# match by suffix (a relative suffix of the absolute node path). NFC-
|
|
99
121
|
# normalise so a macOS git-diff path (NFD) with accented filenames still
|
|
100
122
|
# matches the NFC source_file stored in beacon.json (#1338).
|
|
101
|
-
seeds = [
|
|
123
|
+
seeds = [_normalise_path(p) for p in changed_paths]
|
|
102
124
|
|
|
103
125
|
def _suffix_match(a: str, b: str) -> bool:
|
|
104
126
|
# True when one path is a *path-segment-aligned* suffix of the other,
|
|
@@ -111,7 +133,7 @@ def affected_from_paths(
|
|
|
111
133
|
|
|
112
134
|
seed_node_ids: list[str] = []
|
|
113
135
|
for node_id, data in G.nodes(data=True):
|
|
114
|
-
src =
|
|
136
|
+
src = _normalise_path(data.get("source_file") or "")
|
|
115
137
|
if not src:
|
|
116
138
|
continue
|
|
117
139
|
if any(_suffix_match(src, seed) for seed in seeds):
|
|
@@ -197,6 +219,12 @@ def git_changed_files(base: str, head: str = "HEAD", *, repo: str | Path | None
|
|
|
197
219
|
stderr=subprocess.STDOUT,
|
|
198
220
|
)
|
|
199
221
|
except (OSError, subprocess.CalledProcessError) as exc:
|
|
200
|
-
|
|
222
|
+
# stderr, not stdout: `codebeacon affected --as wiki` is documented as
|
|
223
|
+
# machine-readable (one wiki path per line), so a warning on stdout is
|
|
224
|
+
# read by the consumer as if it were a wiki article path.
|
|
225
|
+
print(
|
|
226
|
+
f"warning: git diff failed ({exc}); returning empty change set.",
|
|
227
|
+
file=sys.stderr,
|
|
228
|
+
)
|
|
201
229
|
return []
|
|
202
230
|
return [line.strip() for line in out.splitlines() if line.strip()]
|