codebeacon 0.6.9__tar.gz → 0.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codebeacon-0.6.9 → codebeacon-0.7.0}/PKG-INFO +157 -2
- {codebeacon-0.6.9 → codebeacon-0.7.0}/README.de.md +15 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/README.es.md +15 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/README.fr.md +15 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/README.ja.md +15 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/README.ko.md +15 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/README.md +152 -1
- {codebeacon-0.6.9 → codebeacon-0.7.0}/README.pt-BR.md +15 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/README.zh-CN.md +15 -0
- codebeacon-0.7.0/action/README.md +110 -0
- codebeacon-0.7.0/action/action.yml +86 -0
- codebeacon-0.7.0/action/examples/pr-context.yml +37 -0
- codebeacon-0.7.0/action/pr_context.py +416 -0
- codebeacon-0.7.0/codebeacon/__init__.py +1 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/cli.py +103 -4
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/common/types.py +15 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/config.py +6 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/contextmap/generator.py +260 -34
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/discover/scanner.py +19 -1
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/export/mcp.py +116 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/actix.scm +72 -0
- codebeacon-0.7.0/codebeacon/extract/query_check.py +426 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/routes.py +118 -1
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/knowledge/__init__.py +16 -2
- codebeacon-0.7.0/codebeacon/knowledge/link.py +359 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/pipeline.py +8 -0
- codebeacon-0.7.0/codebeacon/watch.py +352 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon.yaml.example +1 -0
- codebeacon-0.7.0/npm/README.md +98 -0
- codebeacon-0.7.0/npm/bin/run.js +120 -0
- codebeacon-0.7.0/npm/package.json +35 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/pyproject.toml +10 -1
- codebeacon-0.7.0/tests/fixtures/warp_app/src/main.rs +76 -0
- codebeacon-0.7.0/tests/test_action_pr_context.py +287 -0
- codebeacon-0.7.0/tests/test_contextmap_rules_split.py +336 -0
- codebeacon-0.7.0/tests/test_fixture_exclusion.py +87 -0
- codebeacon-0.7.0/tests/test_knowledge_graph_link.py +298 -0
- codebeacon-0.7.0/tests/test_npm_wrapper.py +191 -0
- codebeacon-0.7.0/tests/test_query_node_types.py +234 -0
- codebeacon-0.7.0/tests/test_warp_routes.py +144 -0
- codebeacon-0.7.0/tests/test_watch_mode.py +364 -0
- codebeacon-0.6.9/codebeacon/__init__.py +0 -1
- {codebeacon-0.6.9 → codebeacon-0.7.0}/.cursorrules +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/.github/CODEOWNERS +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/.github/dependabot.yml +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/.github/workflows/ci.yml +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/.github/workflows/release.yml +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/.gitignore +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/AGENTS.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/CLAUDE.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/LICENSE +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/__main__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/affected.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/cache.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/common/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/common/filters.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/common/safety.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/common/symbols.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/contextmap/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/diagnostics.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/discover/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/discover/detector.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/discover/ignore.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/export/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/export/callflow_html.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/export/hooks.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/export/merge.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/export/obsidian.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/export/tree_html.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/base.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/components.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/dependencies.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/dotnet.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/entities.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/README.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/angular.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/aspnet.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/django.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/express.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/fastapi.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/flask.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/gin.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/ktor.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/laravel.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/nestjs.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/rails.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/react.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/spring_boot.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/svelte.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/tauri.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/vapor.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/queries/vue.scm +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/semantic.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/extract/services.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/graph/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/graph/analyze.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/graph/build.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/graph/cluster.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/graph/enrich.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/graph/write.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/knowledge/generator.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/plugins/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/plugins/githooks.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/plugins/skills.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/semantic_pipeline.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/skill/SKILL.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/wave.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/wiki/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/wiki/generator.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/wiki/index.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/codebeacon/wiki/templates.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/docs/TRANSLATION_STATUS.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/public-plan.md +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/skill/install.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/conftest.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/actix/main.rs +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/angular/app.component.ts +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/aspnet/UserController.cs +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/django/views.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/express/userRouter.js +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/fastapi/main.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/flask/app.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/gin/main.go +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/api-python/pyproject.toml +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/api-python/src/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/api-python/src/main.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/api-python/src/services.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/web/package.json +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/web/src/UserPage.tsx +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/ktor/UserRoutes.kt +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/laravel/UserController.php +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/nestjs/user.controller.ts +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/rails/users_controller.rb +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/react/UserPage.tsx +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/spring_boot/UserController.java +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/sveltekit/+page.svelte +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/vapor/routes.swift +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/fixtures/vue/UserList.vue +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/integration/__init__.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/integration/test_full_pipeline.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_affected.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_affected_wiki.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_069_cli.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_069_cluster.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_069_contextmap.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_069_detector.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_069_discover.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_069_export.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_069_extract.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_069_graph.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_069_io.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_069_semantic.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_069_wiki.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_audit_bugfixes.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_cli_dispatch.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_cli_upgrade.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_contextmap_paths.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_deep_dive_grouping.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_dependencies.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_diagnostics.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_discover.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_dotnet.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_entities.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_filters.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_graph.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_graphify_parity_0_6_3.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_graphify_parity_0_6_6.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_graphify_parity_0_6_7.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_graphify_parity_0_6_8.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_graphify_parity_fixes.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_independent_audit_fixes.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_knowledge.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_known_bugs.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_mcp_and_semantic.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_optional_grammars.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_pipeline_module.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_plugins.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_resolve.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_routes.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_safety_and_writes.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_scanner_sensitive.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_semantic.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_semantic_hardening.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_semantic_stats.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_services.py +0 -0
- {codebeacon-0.6.9 → codebeacon-0.7.0}/tests/test_wiki.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codebeacon
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
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,21 @@ Description-Content-Type: text/markdown
|
|
|
118
122
|
|
|
119
123
|
---
|
|
120
124
|
|
|
125
|
+
## What's new in 0.7.0
|
|
126
|
+
|
|
127
|
+
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.
|
|
128
|
+
|
|
129
|
+
- **`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).
|
|
130
|
+
- **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.
|
|
131
|
+
- **`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.
|
|
132
|
+
- **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.)
|
|
133
|
+
- **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).
|
|
134
|
+
- **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.
|
|
135
|
+
- **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.
|
|
136
|
+
- **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.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
121
140
|
## What's new in 0.6.9
|
|
122
141
|
|
|
123
142
|
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 +301,8 @@ Existing tools solve this partially. Route analyzers map your controllers but mi
|
|
|
282
301
|
- **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
302
|
- **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
303
|
- **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.
|
|
304
|
+
- **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.
|
|
305
|
+
- **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
306
|
- **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
307
|
- **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
308
|
- **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 +343,18 @@ codebeacon sync # subsequent runs via config
|
|
|
323
343
|
| Swift | Vapor |
|
|
324
344
|
| ArkTS | `.ets` (HarmonyOS) collected — extractors framework-agnostic |
|
|
325
345
|
|
|
346
|
+
> **How the "27 frameworks" count works.** Coverage is grounded in tree-sitter
|
|
347
|
+
> queries, and frameworks in the same grammar family share query files — Rocket
|
|
348
|
+
> reuses Actix-Web's attribute-macro pattern, the JS/TS web frameworks share the
|
|
349
|
+
> class/decorator queries, and so on. That sharing is what makes broad coverage
|
|
350
|
+
> tractable, but it also means depth varies per framework: some are exercised by
|
|
351
|
+
> extensive fixtures, others by a single query pattern. Where a framework has
|
|
352
|
+
> known limits, they're documented at the source — e.g. Warp's `.or(...)` and
|
|
353
|
+
> `warp::path::param()` caveats live in the query header
|
|
354
|
+
> ([`codebeacon/extract/queries/actix.scm`](codebeacon/extract/queries/actix.scm)).
|
|
355
|
+
> If a specific framework matters to you, scan a representative repo and check
|
|
356
|
+
> the routes/services it actually extracts before relying on the number.
|
|
357
|
+
|
|
326
358
|
---
|
|
327
359
|
|
|
328
360
|
## Architecture
|
|
@@ -513,6 +545,71 @@ codebeacon scan .
|
|
|
513
545
|
| `beacon_blast_radius` | Upstream callers + downstream affected nodes |
|
|
514
546
|
| `beacon_routes` | List all HTTP routes, filterable by project |
|
|
515
547
|
| `beacon_services` | List all services/classes, filterable by project |
|
|
548
|
+
| `beacon_knowledge` | Search knowledge notes (ADRs, meetings, retros, specs) or list the notes linked to a code node — the *why* behind the code |
|
|
549
|
+
| `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 |
|
|
550
|
+
|
|
551
|
+
### npm launcher (`@codebeacon/mcp`)
|
|
552
|
+
|
|
553
|
+
MCP clients that prefer to launch servers with `npx` can use the thin Node
|
|
554
|
+
wrapper instead of pointing at the `codebeacon` binary directly:
|
|
555
|
+
|
|
556
|
+
```json
|
|
557
|
+
{
|
|
558
|
+
"mcpServers": {
|
|
559
|
+
"codebeacon": {
|
|
560
|
+
"command": "npx",
|
|
561
|
+
"args": ["-y", "@codebeacon/mcp", "--dir", "/path/to/your/repo/.codebeacon"]
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
The wrapper bundles no Python — it resolves an installed codebeacon on the host
|
|
568
|
+
(PATH → `uvx` → `pipx run` → `python3 -m codebeacon`) and forwards stdio to
|
|
569
|
+
`codebeacon serve` untouched. See [`npm/README.md`](npm/README.md) for the full
|
|
570
|
+
per-client config snippets. (Shipping with 0.7.0; not yet published to npm.)
|
|
571
|
+
|
|
572
|
+
---
|
|
573
|
+
|
|
574
|
+
## GitHub Action — PR context
|
|
575
|
+
|
|
576
|
+
Comment on every pull request with the affected slice of your committed
|
|
577
|
+
knowledge graph — the wiki articles the change touches, the upstream blast
|
|
578
|
+
radius, and any high-impact hub files it edits. It reframes review around
|
|
579
|
+
**architecture drift**: instead of reading a diff in isolation, the comment
|
|
580
|
+
points at the parts of the system that actually move.
|
|
581
|
+
|
|
582
|
+
```yaml
|
|
583
|
+
# .github/workflows/pr-context.yml
|
|
584
|
+
name: codebeacon PR context
|
|
585
|
+
on:
|
|
586
|
+
pull_request:
|
|
587
|
+
types: [opened, synchronize, reopened]
|
|
588
|
+
permissions:
|
|
589
|
+
contents: read
|
|
590
|
+
pull-requests: write # required to post/update the comment
|
|
591
|
+
jobs:
|
|
592
|
+
pr-context:
|
|
593
|
+
runs-on: ubuntu-latest
|
|
594
|
+
steps:
|
|
595
|
+
- uses: actions/checkout@v4
|
|
596
|
+
with:
|
|
597
|
+
fetch-depth: 0 # required — full history so the base is diffable
|
|
598
|
+
- uses: actions/setup-python@v5
|
|
599
|
+
with:
|
|
600
|
+
python-version: "3.12"
|
|
601
|
+
- uses: codebeacon/codebeacon/action@v1
|
|
602
|
+
with:
|
|
603
|
+
base: ${{ github.base_ref }}
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
The Action does **not** scan on the runner — it reads the `.codebeacon/` index
|
|
607
|
+
you commit to the repo (codebeacon's model is that the graph is a
|
|
608
|
+
git-committable artifact). If the index is missing it posts one-time setup
|
|
609
|
+
guidance instead of failing the build, and it updates a single marked comment in
|
|
610
|
+
place rather than stacking duplicates. See [`action/README.md`](action/README.md)
|
|
611
|
+
and [`action/examples/pr-context.yml`](action/examples/pr-context.yml) for inputs
|
|
612
|
+
and edge-case behaviour.
|
|
516
613
|
|
|
517
614
|
---
|
|
518
615
|
|
|
@@ -521,6 +618,7 @@ codebeacon scan .
|
|
|
521
618
|
```bash
|
|
522
619
|
pip install codebeacon # all language grammars included
|
|
523
620
|
pip install codebeacon[cluster] # + Leiden community detection (graspologic)
|
|
621
|
+
pip install codebeacon[watch] # + live file-watcher for `codebeacon watch` (watchdog)
|
|
524
622
|
pip install --upgrade codebeacon # upgrade to latest version with all dependencies
|
|
525
623
|
```
|
|
526
624
|
|
|
@@ -552,6 +650,12 @@ codebeacon sync --config <file> # use a specific config file
|
|
|
552
650
|
codebeacon sync --no-rediscover # don't auto-append newly added projects (hand-curated yaml mode)
|
|
553
651
|
codebeacon sync --exclude PATTERN # same flag, same semantics
|
|
554
652
|
|
|
653
|
+
# Watch mode — keep the index live as you edit (needs the `watch` extra)
|
|
654
|
+
codebeacon watch [path] # re-sync on file changes (default path: cwd)
|
|
655
|
+
codebeacon watch . --debounce 2.0 # quiet-window before a resync fires; coalesces bursts
|
|
656
|
+
codebeacon watch . --once # process one debounce cycle then exit
|
|
657
|
+
codebeacon watch . --exclude 'docs/**' # extra gitignore-style pattern (repeatable)
|
|
658
|
+
|
|
555
659
|
# PR / CI: what does this diff actually break?
|
|
556
660
|
codebeacon affected --base main # walk upstream callers of every changed file
|
|
557
661
|
codebeacon affected --base origin/main --head HEAD --depth 4 --limit 200
|
|
@@ -712,6 +816,11 @@ output:
|
|
|
712
816
|
obsidian: true
|
|
713
817
|
context_map:
|
|
714
818
|
targets: [CLAUDE.md, .cursorrules, AGENTS.md]
|
|
819
|
+
rules_split: true # multi-project workspaces: keep CLAUDE.md under
|
|
820
|
+
# ~200 lines and move per-project detail into
|
|
821
|
+
# scoped .claude/rules/codebeacon-<project>.md
|
|
822
|
+
# files. Set false for the old monolithic CLAUDE.md.
|
|
823
|
+
# No effect on single-project scans.
|
|
715
824
|
|
|
716
825
|
wave:
|
|
717
826
|
auto: true
|
|
@@ -751,6 +860,8 @@ fixtures/
|
|
|
751
860
|
|
|
752
861
|
`!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
862
|
|
|
863
|
+
**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.
|
|
864
|
+
|
|
754
865
|
---
|
|
755
866
|
|
|
756
867
|
## How It Compares
|
|
@@ -793,6 +904,50 @@ All AST processing is local. Your source code never leaves your machine when you
|
|
|
793
904
|
|
|
794
905
|
---
|
|
795
906
|
|
|
907
|
+
## Air-Gapped & Compliance-Friendly
|
|
908
|
+
|
|
909
|
+
codebeacon's core pipeline — tree-sitter AST parsing → knowledge graph → wiki
|
|
910
|
+
and context map — runs **entirely on your machine**. It requires:
|
|
911
|
+
|
|
912
|
+
- **No network.** The scan makes no outbound calls; nothing about your source
|
|
913
|
+
code leaves the host.
|
|
914
|
+
- **No cloud service.** There is no backend, no account, no telemetry.
|
|
915
|
+
- **No LLM — not even a local one.** The graph, wiki, `beacon.json`, and
|
|
916
|
+
`CLAUDE.md` are all produced by deterministic AST analysis. (The optional
|
|
917
|
+
AI-semantic layer is a *separate*, opt-in step owned by the `/codebeacon`
|
|
918
|
+
agent — it never runs unless you invoke it; see
|
|
919
|
+
[Privacy & Security](#privacy--security) — and the CLI ships no API client,
|
|
920
|
+
key handling, or model name.)
|
|
921
|
+
|
|
922
|
+
That architecture makes codebeacon suitable for **air-gapped and tightly
|
|
923
|
+
regulated environments** — healthcare, defense, legal, finance — where source
|
|
924
|
+
code cannot touch third-party services. To be precise about what that does and
|
|
925
|
+
does not mean: codebeacon makes **no compliance certification claims** (no
|
|
926
|
+
HIPAA, FedRAMP, CMMC, SOC 2, or similar). What it offers is an architecture that
|
|
927
|
+
keeps code on-premises, so it can *fit* within environments governed by those
|
|
928
|
+
policies. Verifying that codebeacon meets the specific controls of your
|
|
929
|
+
environment remains your responsibility.
|
|
930
|
+
|
|
931
|
+
**Offline install.** Because it is a normal Python package with vendored
|
|
932
|
+
grammars, codebeacon installs without internet access on the target host:
|
|
933
|
+
download the wheel and its dependencies on a connected machine, transfer them
|
|
934
|
+
across the air gap, and install from the local files.
|
|
935
|
+
|
|
936
|
+
```bash
|
|
937
|
+
# On a connected machine (include the grammar extras you need — [full] grabs all):
|
|
938
|
+
pip download 'codebeacon[full]' -d ./codebeacon-offline
|
|
939
|
+
|
|
940
|
+
# Transfer ./codebeacon-offline across the air gap, then on the target host:
|
|
941
|
+
pip install --no-index --find-links ./codebeacon-offline 'codebeacon[full]'
|
|
942
|
+
```
|
|
943
|
+
|
|
944
|
+
The base install bundles Python + JavaScript/TypeScript grammars; other
|
|
945
|
+
languages are ordinary wheels pulled in by extras (`[jvm]`, `[backend]`,
|
|
946
|
+
`[full]`, …), so include the extras you need in the download and nothing is
|
|
947
|
+
fetched at runtime.
|
|
948
|
+
|
|
949
|
+
---
|
|
950
|
+
|
|
796
951
|
## Contributing
|
|
797
952
|
|
|
798
953
|
```bash
|
|
@@ -27,6 +27,21 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Neu in 0.7.0
|
|
31
|
+
|
|
32
|
+
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.
|
|
33
|
+
|
|
34
|
+
- **`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).
|
|
35
|
+
- **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.
|
|
36
|
+
- **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.
|
|
37
|
+
- **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.)
|
|
38
|
+
- **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).
|
|
39
|
+
- **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.
|
|
40
|
+
- **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.
|
|
41
|
+
- **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.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
30
45
|
## Neu in 0.6.9
|
|
31
46
|
|
|
32
47
|
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,21 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Novedades en 0.7.0
|
|
31
|
+
|
|
32
|
+
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.
|
|
33
|
+
|
|
34
|
+
- **`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).
|
|
35
|
+
- **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.
|
|
36
|
+
- **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.
|
|
37
|
+
- **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.)
|
|
38
|
+
- **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).
|
|
39
|
+
- **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.
|
|
40
|
+
- **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.
|
|
41
|
+
- **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.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
30
45
|
## Novedades en 0.6.9
|
|
31
46
|
|
|
32
47
|
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,21 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Nouveautés en 0.7.0
|
|
31
|
+
|
|
32
|
+
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.
|
|
33
|
+
|
|
34
|
+
- **`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).
|
|
35
|
+
- **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.
|
|
36
|
+
- **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.
|
|
37
|
+
- **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.)
|
|
38
|
+
- **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).
|
|
39
|
+
- **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.
|
|
40
|
+
- **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.
|
|
41
|
+
- **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.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
30
45
|
## Nouveautés en 0.6.9
|
|
31
46
|
|
|
32
47
|
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,21 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## 0.7.0 の新機能
|
|
31
|
+
|
|
32
|
+
バグ修正のスイープというより機能リリースです:codebeacon にライブのファイルウォッチャーが加わり、設計ノートをコードグラフに繋ぎ、2つの新しいフロントエンド(MCP サーバー用の npm ランチャーと GitHub Action)を提供し、デフォルトでインデックスする対象を絞り込みました。すべての機能はローカルファーストのままです — コアスキャンは相変わらずネットワークも、クラウドも、モデルも必要としません。
|
|
33
|
+
|
|
34
|
+
- **`codebeacon watch` がインデックスをライブに保ちます** — デバウンスされたファイルウォッチャー(`codebeacon watch [path] [--debounce 2.0] [--once] [--exclude PATTERN]`)が、監視中のソースファイルが変わるたびにグラフを再同期します。編集の集中 — 500ファイルの `git checkout`、ブランチ切り替え — は単一の再同期にまとめられ、ウォッチャーはスキャナーとまったく同じ無視ルールを再利用するため、インデックスを書き込む動作が自身の `.codebeacon/` 出力を巡るループでウォッチャーを起こすことはありません。新しいオプションの extra が必要です:`pip install 'codebeacon[watch]'`(watchdog)。
|
|
35
|
+
- **設計ノートがコードグラフに繋がります** — `codebeacon knowledge` は、インデックスが既に存在する場合、ノート(ADR、会議メモ、レトロ、仕様)を `beacon.json` の *中に* 書き込むようになりました:明示的なファイルパス参照は信頼された `references` エッジになり、特徴的なシンボルの言及(`PaymentService`、単なる `User` は決して対象外)は `AMBIGUOUS` な `mentions` エッジになります — こうしてグラフを読むエージェントは、ある service が *なぜ* その形をしているのかを学びます。`codebeacon scan` はコードグラフをソースだけから再構築してこのオーバーレイを捨てるため、リンクを復元するには **スキャンの後に `codebeacon knowledge` を再実行してください**。
|
|
36
|
+
- **`beacon_knowledge` MCP ツール** — 新しいツールがキーワードでノートを検索し、あるいは指定したコードノードに繋がったノートを一覧して、コードの背後にある意思決定の軌跡を MCP 越しに直接公開します。
|
|
37
|
+
- **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 へはまだ公開されていません。)
|
|
38
|
+
- **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) を参照。
|
|
39
|
+
- **ワークスペースの CLAUDE.md が約200行以下に収まります** — マルチプロジェクトのワークスペースでは、ルートの `CLAUDE.md` が共有の概要だけを保ち、プロジェクトごとの詳細を、`paths:` フロントマターがそのプロジェクトのファイルに触れたときだけ読み込むスコープ付きの `.claude/rules/codebeacon-<project>.md` ファイルに移すようになりました(コンテキストファイルに関する Anthropic 自身のガイダンスに従っています)。単一プロジェクトの出力は変わりません。従来の一枚岩ファイルが欲しい場合は `output.context_map.rules_split: false` を設定してください。重複するプロジェクト行もまとめられます。
|
|
40
|
+
- **テストフィクスチャがデフォルトで無視されます** — どの深さの `tests/fixtures/`、`test/fixtures/`、`__fixtures__/` もデフォルトで無視されるようになり、プロジェクトの合成テスト入力が偽のルートや service をグラフに注入しなくなります(codebeacon 自身のセルフスキャンは、フィクスチャの `main.py` を5つの「ルート」として報告していました)。これは最も優先度の低いルールなので、`.codebeaconignore` に `!tests/fixtures/` の行を入れれば再び含められ、スキャンをフィクスチャディレクトリ *に* 向ければ依然として収集されます。
|
|
41
|
+
- **Warp のルート抽出が本物になりました** — Warp のフィルタ・コンビネータのルートが実際に抽出されます:`warp::path!(...)` と `warp::path("x")` のセグメント、メソッドコンビネータ(`warp::get()` / `post()` / …)、そして `.map` / `.and_then` ハンドラが、それらを囲むバインディングを基準に相関づけられ、まるごとのルートになります。正直な限界(クエリヘッダーに明記):1つのバインディング内で `.or(...)` で繋がれたフィルタは単一の連結ルートに潰れ、`warp::path::param()` のフィルタ呼び出しセグメントとクロージャハンドラは未解決のまま残ります。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
30
45
|
## 0.6.9 の新機能
|
|
31
46
|
|
|
32
47
|
これまでで最大規模の監査リリースです。二重のアップストリーム・パリティ・スイープ(codesight のトラッカーに対する史上初の完全監査に加え、graphify v0.9.4–v0.9.12 / issue は #1776 まで)と、codebeacon 自体に対する独立したマルチエージェント・バグハントを組み合わせました。各候補は修正前に再現し、各修正は mutation テストにかけ、さらに敵対的な2次レビューが修正自体を攻撃して、リリース前にさらに18個の穴を捕まえました。**実バグ48件を修正。**
|
|
@@ -27,6 +27,21 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## 0.7.0 새 소식
|
|
31
|
+
|
|
32
|
+
버그 스윕이라기보다 기능 릴리스입니다: codebeacon에 실시간 파일 워처가 생기고, 설계 노트를 코드 그래프에 연결하며, 두 개의 새 프런트엔드(MCP 서버용 npm 런처와 GitHub Action)를 제공하고, 기본으로 인덱싱하는 대상을 좁혔습니다. 모든 기능은 로컬 우선을 유지합니다 — 코어 스캔은 여전히 네트워크도, 클라우드도, 모델도 필요로 하지 않습니다.
|
|
33
|
+
|
|
34
|
+
- **`codebeacon watch`가 인덱스를 실시간으로 유지합니다** — 디바운스된 파일 워처(`codebeacon watch [path] [--debounce 2.0] [--once] [--exclude PATTERN]`)가 감시 중인 소스 파일이 바뀔 때마다 그래프를 다시 동기화합니다. 편집 폭주 — 500개 파일 `git checkout`, 브랜치 전환 — 는 단일 재동기화로 합쳐지고, 워처가 스캐너의 정확히 동일한 무시 규칙을 재사용하므로 인덱스를 쓰는 동작이 자신의 `.codebeacon/` 출력을 도는 루프로 워처를 깨우는 일이 없습니다. 새 선택적 extra가 필요합니다: `pip install 'codebeacon[watch]'`(watchdog).
|
|
35
|
+
- **설계 노트가 코드 그래프에 연결됩니다** — `codebeacon knowledge`가 인덱스가 이미 존재할 때 이제 노트(ADR, 회의록, 회고, 스펙)를 `beacon.json` *안에* 기록합니다: 명시적 파일 경로 참조는 신뢰된 `references` 엣지가 되고, 특징적인 심볼 언급(`PaymentService`, 맨 `User`은 절대 아님)은 `AMBIGUOUS` `mentions` 엣지가 됩니다 — 그래서 그래프를 읽는 에이전트가 어떤 service가 *왜* 그런 형태인지를 배웁니다. `codebeacon scan`은 코드 그래프를 소스만으로 다시 만들며 이 오버레이를 버리므로, 링크를 복원하려면 **스캔 후 `codebeacon knowledge`를 다시 실행하세요**.
|
|
36
|
+
- **`beacon_knowledge` MCP 도구** — 새 도구가 키워드로 노트를 검색하거나 주어진 코드 노드에 연결된 노트를 나열해, 코드 뒤에 있는 결정의 흔적을 MCP로 직접 노출합니다.
|
|
37
|
+
- **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에 게시되지 않음.)
|
|
38
|
+
- **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) 참조.
|
|
39
|
+
- **워크스페이스 CLAUDE.md가 ~200줄 이하로 유지됩니다** — 다중 프로젝트 워크스페이스에서 루트 `CLAUDE.md`가 이제 공유 개요만 담고, 프로젝트별 세부는 `paths:` 프런트매터가 해당 프로젝트 파일을 건드릴 때만 로드하는 스코프된 `.claude/rules/codebeacon-<project>.md` 파일로 옮깁니다(컨텍스트 파일에 대한 Anthropic 자체 가이드를 따름). 단일 프로젝트 출력은 그대로입니다. 예전의 단일 파일을 원하면 `output.context_map.rules_split: false`로 설정하세요. 중복 프로젝트 행도 합쳐집니다.
|
|
40
|
+
- **테스트 픽스처가 기본으로 무시됩니다** — 어느 깊이든 `tests/fixtures/`, `test/fixtures/`, `__fixtures__/`가 이제 기본 무시되어, 프로젝트의 합성 테스트 입력이 가짜 라우트와 service를 그래프에 주입하는 일이 멈춥니다(codebeacon 자체 셀프 스캔이 픽스처 `main.py`를 다섯 개의 "라우트"로 보고했었습니다). 이는 우선순위가 가장 낮은 규칙이므로, `.codebeaconignore`에 `!tests/fixtures/` 줄을 넣으면 다시 포함되고, 스캔을 픽스처 디렉토리*로* 향하게 하면 여전히 수집됩니다.
|
|
41
|
+
- **Warp 라우트 추출이 이제 실제로 됩니다** — Warp의 필터-콤비네이터 라우트가 실제로 추출됩니다: `warp::path!(...)`와 `warp::path("x")` 세그먼트, 메서드 콤비네이터(`warp::get()` / `post()` / …), 그리고 `.map` / `.and_then` 핸들러가 그것들을 감싸는 바인딩을 기준으로 상관되어 온전한 라우트로 만들어집니다. 정직한 한계(쿼리 헤더에 명시됨): 한 바인딩 안에서 `.or(...)`로 이어진 필터는 하나의 연결된 라우트로 합쳐지고, `warp::path::param()` 필터-호출 세그먼트와 클로저 핸들러는 미해결로 남습니다.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
30
45
|
## 0.6.9 새 소식
|
|
31
46
|
|
|
32
47
|
역대 최대 규모의 감사 릴리스입니다: 이중 업스트림 패리티 스윕(codesight 트래커 최초 전체 감사 + graphify v0.9.4–v0.9.12 / 이슈 #1776까지)에 codebeacon 자체에 대한 독립 멀티에이전트 버그 헌트를 결합했습니다. 모든 후보를 수정 전에 재현하고, 모든 수정을 mutation 테스트했으며, 적대적 2차 리뷰가 수정 자체를 공격해 출시 전에 추가 구멍 18개를 잡아냈습니다. **실제 버그 48건 수정.**
|
|
@@ -25,6 +25,21 @@
|
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
28
|
+
## What's new in 0.7.0
|
|
29
|
+
|
|
30
|
+
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.
|
|
31
|
+
|
|
32
|
+
- **`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).
|
|
33
|
+
- **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.
|
|
34
|
+
- **`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.
|
|
35
|
+
- **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.)
|
|
36
|
+
- **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).
|
|
37
|
+
- **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.
|
|
38
|
+
- **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.
|
|
39
|
+
- **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.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
28
43
|
## What's new in 0.6.9
|
|
29
44
|
|
|
30
45
|
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.**
|
|
@@ -189,7 +204,8 @@ Existing tools solve this partially. Route analyzers map your controllers but mi
|
|
|
189
204
|
- **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
|
|
190
205
|
- **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
|
|
191
206
|
- **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.
|
|
192
|
-
- **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.
|
|
207
|
+
- **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.
|
|
208
|
+
- **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]'`.
|
|
193
209
|
- **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.
|
|
194
210
|
- **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.
|
|
195
211
|
- **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.
|
|
@@ -230,6 +246,18 @@ codebeacon sync # subsequent runs via config
|
|
|
230
246
|
| Swift | Vapor |
|
|
231
247
|
| ArkTS | `.ets` (HarmonyOS) collected — extractors framework-agnostic |
|
|
232
248
|
|
|
249
|
+
> **How the "27 frameworks" count works.** Coverage is grounded in tree-sitter
|
|
250
|
+
> queries, and frameworks in the same grammar family share query files — Rocket
|
|
251
|
+
> reuses Actix-Web's attribute-macro pattern, the JS/TS web frameworks share the
|
|
252
|
+
> class/decorator queries, and so on. That sharing is what makes broad coverage
|
|
253
|
+
> tractable, but it also means depth varies per framework: some are exercised by
|
|
254
|
+
> extensive fixtures, others by a single query pattern. Where a framework has
|
|
255
|
+
> known limits, they're documented at the source — e.g. Warp's `.or(...)` and
|
|
256
|
+
> `warp::path::param()` caveats live in the query header
|
|
257
|
+
> ([`codebeacon/extract/queries/actix.scm`](codebeacon/extract/queries/actix.scm)).
|
|
258
|
+
> If a specific framework matters to you, scan a representative repo and check
|
|
259
|
+
> the routes/services it actually extracts before relying on the number.
|
|
260
|
+
|
|
233
261
|
---
|
|
234
262
|
|
|
235
263
|
## Architecture
|
|
@@ -420,6 +448,71 @@ codebeacon scan .
|
|
|
420
448
|
| `beacon_blast_radius` | Upstream callers + downstream affected nodes |
|
|
421
449
|
| `beacon_routes` | List all HTTP routes, filterable by project |
|
|
422
450
|
| `beacon_services` | List all services/classes, filterable by project |
|
|
451
|
+
| `beacon_knowledge` | Search knowledge notes (ADRs, meetings, retros, specs) or list the notes linked to a code node — the *why* behind the code |
|
|
452
|
+
| `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 |
|
|
453
|
+
|
|
454
|
+
### npm launcher (`@codebeacon/mcp`)
|
|
455
|
+
|
|
456
|
+
MCP clients that prefer to launch servers with `npx` can use the thin Node
|
|
457
|
+
wrapper instead of pointing at the `codebeacon` binary directly:
|
|
458
|
+
|
|
459
|
+
```json
|
|
460
|
+
{
|
|
461
|
+
"mcpServers": {
|
|
462
|
+
"codebeacon": {
|
|
463
|
+
"command": "npx",
|
|
464
|
+
"args": ["-y", "@codebeacon/mcp", "--dir", "/path/to/your/repo/.codebeacon"]
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
The wrapper bundles no Python — it resolves an installed codebeacon on the host
|
|
471
|
+
(PATH → `uvx` → `pipx run` → `python3 -m codebeacon`) and forwards stdio to
|
|
472
|
+
`codebeacon serve` untouched. See [`npm/README.md`](npm/README.md) for the full
|
|
473
|
+
per-client config snippets. (Shipping with 0.7.0; not yet published to npm.)
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## GitHub Action — PR context
|
|
478
|
+
|
|
479
|
+
Comment on every pull request with the affected slice of your committed
|
|
480
|
+
knowledge graph — the wiki articles the change touches, the upstream blast
|
|
481
|
+
radius, and any high-impact hub files it edits. It reframes review around
|
|
482
|
+
**architecture drift**: instead of reading a diff in isolation, the comment
|
|
483
|
+
points at the parts of the system that actually move.
|
|
484
|
+
|
|
485
|
+
```yaml
|
|
486
|
+
# .github/workflows/pr-context.yml
|
|
487
|
+
name: codebeacon PR context
|
|
488
|
+
on:
|
|
489
|
+
pull_request:
|
|
490
|
+
types: [opened, synchronize, reopened]
|
|
491
|
+
permissions:
|
|
492
|
+
contents: read
|
|
493
|
+
pull-requests: write # required to post/update the comment
|
|
494
|
+
jobs:
|
|
495
|
+
pr-context:
|
|
496
|
+
runs-on: ubuntu-latest
|
|
497
|
+
steps:
|
|
498
|
+
- uses: actions/checkout@v4
|
|
499
|
+
with:
|
|
500
|
+
fetch-depth: 0 # required — full history so the base is diffable
|
|
501
|
+
- uses: actions/setup-python@v5
|
|
502
|
+
with:
|
|
503
|
+
python-version: "3.12"
|
|
504
|
+
- uses: codebeacon/codebeacon/action@v1
|
|
505
|
+
with:
|
|
506
|
+
base: ${{ github.base_ref }}
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
The Action does **not** scan on the runner — it reads the `.codebeacon/` index
|
|
510
|
+
you commit to the repo (codebeacon's model is that the graph is a
|
|
511
|
+
git-committable artifact). If the index is missing it posts one-time setup
|
|
512
|
+
guidance instead of failing the build, and it updates a single marked comment in
|
|
513
|
+
place rather than stacking duplicates. See [`action/README.md`](action/README.md)
|
|
514
|
+
and [`action/examples/pr-context.yml`](action/examples/pr-context.yml) for inputs
|
|
515
|
+
and edge-case behaviour.
|
|
423
516
|
|
|
424
517
|
---
|
|
425
518
|
|
|
@@ -428,6 +521,7 @@ codebeacon scan .
|
|
|
428
521
|
```bash
|
|
429
522
|
pip install codebeacon # all language grammars included
|
|
430
523
|
pip install codebeacon[cluster] # + Leiden community detection (graspologic)
|
|
524
|
+
pip install codebeacon[watch] # + live file-watcher for `codebeacon watch` (watchdog)
|
|
431
525
|
pip install --upgrade codebeacon # upgrade to latest version with all dependencies
|
|
432
526
|
```
|
|
433
527
|
|
|
@@ -459,6 +553,12 @@ codebeacon sync --config <file> # use a specific config file
|
|
|
459
553
|
codebeacon sync --no-rediscover # don't auto-append newly added projects (hand-curated yaml mode)
|
|
460
554
|
codebeacon sync --exclude PATTERN # same flag, same semantics
|
|
461
555
|
|
|
556
|
+
# Watch mode — keep the index live as you edit (needs the `watch` extra)
|
|
557
|
+
codebeacon watch [path] # re-sync on file changes (default path: cwd)
|
|
558
|
+
codebeacon watch . --debounce 2.0 # quiet-window before a resync fires; coalesces bursts
|
|
559
|
+
codebeacon watch . --once # process one debounce cycle then exit
|
|
560
|
+
codebeacon watch . --exclude 'docs/**' # extra gitignore-style pattern (repeatable)
|
|
561
|
+
|
|
462
562
|
# PR / CI: what does this diff actually break?
|
|
463
563
|
codebeacon affected --base main # walk upstream callers of every changed file
|
|
464
564
|
codebeacon affected --base origin/main --head HEAD --depth 4 --limit 200
|
|
@@ -619,6 +719,11 @@ output:
|
|
|
619
719
|
obsidian: true
|
|
620
720
|
context_map:
|
|
621
721
|
targets: [CLAUDE.md, .cursorrules, AGENTS.md]
|
|
722
|
+
rules_split: true # multi-project workspaces: keep CLAUDE.md under
|
|
723
|
+
# ~200 lines and move per-project detail into
|
|
724
|
+
# scoped .claude/rules/codebeacon-<project>.md
|
|
725
|
+
# files. Set false for the old monolithic CLAUDE.md.
|
|
726
|
+
# No effect on single-project scans.
|
|
622
727
|
|
|
623
728
|
wave:
|
|
624
729
|
auto: true
|
|
@@ -658,6 +763,8 @@ fixtures/
|
|
|
658
763
|
|
|
659
764
|
`!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.
|
|
660
765
|
|
|
766
|
+
**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.
|
|
767
|
+
|
|
661
768
|
---
|
|
662
769
|
|
|
663
770
|
## How It Compares
|
|
@@ -700,6 +807,50 @@ All AST processing is local. Your source code never leaves your machine when you
|
|
|
700
807
|
|
|
701
808
|
---
|
|
702
809
|
|
|
810
|
+
## Air-Gapped & Compliance-Friendly
|
|
811
|
+
|
|
812
|
+
codebeacon's core pipeline — tree-sitter AST parsing → knowledge graph → wiki
|
|
813
|
+
and context map — runs **entirely on your machine**. It requires:
|
|
814
|
+
|
|
815
|
+
- **No network.** The scan makes no outbound calls; nothing about your source
|
|
816
|
+
code leaves the host.
|
|
817
|
+
- **No cloud service.** There is no backend, no account, no telemetry.
|
|
818
|
+
- **No LLM — not even a local one.** The graph, wiki, `beacon.json`, and
|
|
819
|
+
`CLAUDE.md` are all produced by deterministic AST analysis. (The optional
|
|
820
|
+
AI-semantic layer is a *separate*, opt-in step owned by the `/codebeacon`
|
|
821
|
+
agent — it never runs unless you invoke it; see
|
|
822
|
+
[Privacy & Security](#privacy--security) — and the CLI ships no API client,
|
|
823
|
+
key handling, or model name.)
|
|
824
|
+
|
|
825
|
+
That architecture makes codebeacon suitable for **air-gapped and tightly
|
|
826
|
+
regulated environments** — healthcare, defense, legal, finance — where source
|
|
827
|
+
code cannot touch third-party services. To be precise about what that does and
|
|
828
|
+
does not mean: codebeacon makes **no compliance certification claims** (no
|
|
829
|
+
HIPAA, FedRAMP, CMMC, SOC 2, or similar). What it offers is an architecture that
|
|
830
|
+
keeps code on-premises, so it can *fit* within environments governed by those
|
|
831
|
+
policies. Verifying that codebeacon meets the specific controls of your
|
|
832
|
+
environment remains your responsibility.
|
|
833
|
+
|
|
834
|
+
**Offline install.** Because it is a normal Python package with vendored
|
|
835
|
+
grammars, codebeacon installs without internet access on the target host:
|
|
836
|
+
download the wheel and its dependencies on a connected machine, transfer them
|
|
837
|
+
across the air gap, and install from the local files.
|
|
838
|
+
|
|
839
|
+
```bash
|
|
840
|
+
# On a connected machine (include the grammar extras you need — [full] grabs all):
|
|
841
|
+
pip download 'codebeacon[full]' -d ./codebeacon-offline
|
|
842
|
+
|
|
843
|
+
# Transfer ./codebeacon-offline across the air gap, then on the target host:
|
|
844
|
+
pip install --no-index --find-links ./codebeacon-offline 'codebeacon[full]'
|
|
845
|
+
```
|
|
846
|
+
|
|
847
|
+
The base install bundles Python + JavaScript/TypeScript grammars; other
|
|
848
|
+
languages are ordinary wheels pulled in by extras (`[jvm]`, `[backend]`,
|
|
849
|
+
`[full]`, …), so include the extras you need in the download and nothing is
|
|
850
|
+
fetched at runtime.
|
|
851
|
+
|
|
852
|
+
---
|
|
853
|
+
|
|
703
854
|
## Contributing
|
|
704
855
|
|
|
705
856
|
```bash
|