codebeacon 0.6.8__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.
Files changed (189) hide show
  1. {codebeacon-0.6.8 → codebeacon-0.7.0}/PKG-INFO +174 -2
  2. {codebeacon-0.6.8 → codebeacon-0.7.0}/README.de.md +32 -0
  3. {codebeacon-0.6.8 → codebeacon-0.7.0}/README.es.md +32 -0
  4. {codebeacon-0.6.8 → codebeacon-0.7.0}/README.fr.md +32 -0
  5. {codebeacon-0.6.8 → codebeacon-0.7.0}/README.ja.md +32 -0
  6. {codebeacon-0.6.8 → codebeacon-0.7.0}/README.ko.md +32 -0
  7. {codebeacon-0.6.8 → codebeacon-0.7.0}/README.md +169 -1
  8. {codebeacon-0.6.8 → codebeacon-0.7.0}/README.pt-BR.md +32 -0
  9. {codebeacon-0.6.8 → codebeacon-0.7.0}/README.zh-CN.md +32 -0
  10. codebeacon-0.7.0/action/README.md +110 -0
  11. codebeacon-0.7.0/action/action.yml +86 -0
  12. codebeacon-0.7.0/action/examples/pr-context.yml +37 -0
  13. codebeacon-0.7.0/action/pr_context.py +416 -0
  14. codebeacon-0.7.0/codebeacon/__init__.py +1 -0
  15. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/cache.py +4 -1
  16. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/cli.py +165 -16
  17. codebeacon-0.7.0/codebeacon/common/filters.py +259 -0
  18. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/common/safety.py +7 -0
  19. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/common/types.py +15 -0
  20. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/config.py +80 -14
  21. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/contextmap/generator.py +356 -74
  22. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/discover/detector.py +115 -31
  23. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/discover/ignore.py +52 -26
  24. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/discover/scanner.py +112 -27
  25. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/export/callflow_html.py +5 -2
  26. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/export/hooks.py +4 -1
  27. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/export/mcp.py +138 -3
  28. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/export/merge.py +29 -3
  29. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/export/obsidian.py +54 -11
  30. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/components.py +44 -17
  31. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/actix.scm +72 -0
  32. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/express.scm +23 -16
  33. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/laravel.scm +14 -1
  34. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/spring_boot.scm +24 -0
  35. codebeacon-0.7.0/codebeacon/extract/query_check.py +426 -0
  36. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/routes.py +209 -9
  37. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/graph/analyze.py +8 -4
  38. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/graph/build.py +133 -36
  39. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/graph/cluster.py +6 -1
  40. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/graph/enrich.py +5 -1
  41. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/graph/write.py +28 -1
  42. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/knowledge/__init__.py +16 -2
  43. codebeacon-0.7.0/codebeacon/knowledge/link.py +359 -0
  44. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/pipeline.py +112 -68
  45. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/semantic_pipeline.py +153 -7
  46. codebeacon-0.7.0/codebeacon/watch.py +352 -0
  47. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/wave.py +9 -3
  48. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/wiki/generator.py +140 -39
  49. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/wiki/templates.py +44 -8
  50. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon.yaml.example +1 -0
  51. codebeacon-0.7.0/npm/README.md +98 -0
  52. codebeacon-0.7.0/npm/bin/run.js +120 -0
  53. codebeacon-0.7.0/npm/package.json +35 -0
  54. {codebeacon-0.6.8 → codebeacon-0.7.0}/pyproject.toml +10 -1
  55. codebeacon-0.7.0/tests/fixtures/warp_app/src/main.rs +76 -0
  56. codebeacon-0.7.0/tests/test_action_pr_context.py +287 -0
  57. codebeacon-0.7.0/tests/test_audit_069_cli.py +485 -0
  58. codebeacon-0.7.0/tests/test_audit_069_cluster.py +77 -0
  59. codebeacon-0.7.0/tests/test_audit_069_contextmap.py +458 -0
  60. codebeacon-0.7.0/tests/test_audit_069_detector.py +329 -0
  61. codebeacon-0.7.0/tests/test_audit_069_discover.py +337 -0
  62. codebeacon-0.7.0/tests/test_audit_069_export.py +263 -0
  63. codebeacon-0.7.0/tests/test_audit_069_extract.py +383 -0
  64. codebeacon-0.7.0/tests/test_audit_069_graph.py +594 -0
  65. codebeacon-0.7.0/tests/test_audit_069_io.py +352 -0
  66. codebeacon-0.7.0/tests/test_audit_069_semantic.py +442 -0
  67. codebeacon-0.7.0/tests/test_audit_069_wiki.py +370 -0
  68. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_cli_upgrade.py +5 -0
  69. codebeacon-0.7.0/tests/test_contextmap_rules_split.py +336 -0
  70. codebeacon-0.7.0/tests/test_fixture_exclusion.py +87 -0
  71. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_graphify_parity_0_6_7.py +21 -2
  72. codebeacon-0.7.0/tests/test_knowledge_graph_link.py +298 -0
  73. codebeacon-0.7.0/tests/test_npm_wrapper.py +191 -0
  74. codebeacon-0.7.0/tests/test_query_node_types.py +234 -0
  75. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_safety_and_writes.py +8 -1
  76. codebeacon-0.7.0/tests/test_warp_routes.py +144 -0
  77. codebeacon-0.7.0/tests/test_watch_mode.py +364 -0
  78. codebeacon-0.6.8/codebeacon/__init__.py +0 -1
  79. codebeacon-0.6.8/codebeacon/common/filters.py +0 -170
  80. {codebeacon-0.6.8 → codebeacon-0.7.0}/.cursorrules +0 -0
  81. {codebeacon-0.6.8 → codebeacon-0.7.0}/.github/CODEOWNERS +0 -0
  82. {codebeacon-0.6.8 → codebeacon-0.7.0}/.github/dependabot.yml +0 -0
  83. {codebeacon-0.6.8 → codebeacon-0.7.0}/.github/workflows/ci.yml +0 -0
  84. {codebeacon-0.6.8 → codebeacon-0.7.0}/.github/workflows/release.yml +0 -0
  85. {codebeacon-0.6.8 → codebeacon-0.7.0}/.gitignore +0 -0
  86. {codebeacon-0.6.8 → codebeacon-0.7.0}/AGENTS.md +0 -0
  87. {codebeacon-0.6.8 → codebeacon-0.7.0}/CLAUDE.md +0 -0
  88. {codebeacon-0.6.8 → codebeacon-0.7.0}/LICENSE +0 -0
  89. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/__main__.py +0 -0
  90. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/affected.py +0 -0
  91. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/common/__init__.py +0 -0
  92. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/common/symbols.py +0 -0
  93. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/contextmap/__init__.py +0 -0
  94. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/diagnostics.py +0 -0
  95. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/discover/__init__.py +0 -0
  96. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/export/__init__.py +0 -0
  97. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/export/tree_html.py +0 -0
  98. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/__init__.py +0 -0
  99. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/base.py +0 -0
  100. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/dependencies.py +0 -0
  101. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/dotnet.py +0 -0
  102. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/entities.py +0 -0
  103. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/README.md +0 -0
  104. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/angular.scm +0 -0
  105. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/aspnet.scm +0 -0
  106. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/django.scm +0 -0
  107. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/fastapi.scm +0 -0
  108. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/flask.scm +0 -0
  109. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/gin.scm +0 -0
  110. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/ktor.scm +0 -0
  111. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/nestjs.scm +0 -0
  112. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/rails.scm +0 -0
  113. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/react.scm +0 -0
  114. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/svelte.scm +0 -0
  115. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/tauri.scm +0 -0
  116. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/vapor.scm +0 -0
  117. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/queries/vue.scm +0 -0
  118. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/semantic.py +0 -0
  119. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/extract/services.py +0 -0
  120. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/graph/__init__.py +0 -0
  121. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/knowledge/generator.py +0 -0
  122. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/plugins/__init__.py +0 -0
  123. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/plugins/githooks.py +0 -0
  124. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/plugins/skills.py +0 -0
  125. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/skill/SKILL.md +0 -0
  126. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/wiki/__init__.py +0 -0
  127. {codebeacon-0.6.8 → codebeacon-0.7.0}/codebeacon/wiki/index.py +0 -0
  128. {codebeacon-0.6.8 → codebeacon-0.7.0}/docs/TRANSLATION_STATUS.md +0 -0
  129. {codebeacon-0.6.8 → codebeacon-0.7.0}/public-plan.md +0 -0
  130. {codebeacon-0.6.8 → codebeacon-0.7.0}/skill/install.py +0 -0
  131. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/__init__.py +0 -0
  132. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/conftest.py +0 -0
  133. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/actix/main.rs +0 -0
  134. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/angular/app.component.ts +0 -0
  135. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/aspnet/UserController.cs +0 -0
  136. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/django/views.py +0 -0
  137. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/express/userRouter.js +0 -0
  138. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/fastapi/main.py +0 -0
  139. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/flask/app.py +0 -0
  140. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/gin/main.go +0 -0
  141. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/api-python/pyproject.toml +0 -0
  142. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/api-python/src/__init__.py +0 -0
  143. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/api-python/src/main.py +0 -0
  144. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/api-python/src/services.py +0 -0
  145. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/web/package.json +0 -0
  146. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/integration_workspace/web/src/UserPage.tsx +0 -0
  147. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/ktor/UserRoutes.kt +0 -0
  148. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/laravel/UserController.php +0 -0
  149. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/nestjs/user.controller.ts +0 -0
  150. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/rails/users_controller.rb +0 -0
  151. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/react/UserPage.tsx +0 -0
  152. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/spring_boot/UserController.java +0 -0
  153. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/sveltekit/+page.svelte +0 -0
  154. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/vapor/routes.swift +0 -0
  155. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/fixtures/vue/UserList.vue +0 -0
  156. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/integration/__init__.py +0 -0
  157. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/integration/test_full_pipeline.py +0 -0
  158. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_affected.py +0 -0
  159. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_affected_wiki.py +0 -0
  160. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_audit_bugfixes.py +0 -0
  161. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_cli_dispatch.py +0 -0
  162. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_contextmap_paths.py +0 -0
  163. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_deep_dive_grouping.py +0 -0
  164. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_dependencies.py +0 -0
  165. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_diagnostics.py +0 -0
  166. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_discover.py +0 -0
  167. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_dotnet.py +0 -0
  168. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_entities.py +0 -0
  169. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_filters.py +0 -0
  170. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_graph.py +0 -0
  171. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_graphify_parity_0_6_3.py +0 -0
  172. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_graphify_parity_0_6_6.py +0 -0
  173. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_graphify_parity_0_6_8.py +0 -0
  174. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_graphify_parity_fixes.py +0 -0
  175. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_independent_audit_fixes.py +0 -0
  176. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_knowledge.py +0 -0
  177. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_known_bugs.py +0 -0
  178. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_mcp_and_semantic.py +0 -0
  179. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_optional_grammars.py +0 -0
  180. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_pipeline_module.py +0 -0
  181. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_plugins.py +0 -0
  182. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_resolve.py +0 -0
  183. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_routes.py +0 -0
  184. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_scanner_sensitive.py +0 -0
  185. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_semantic.py +0 -0
  186. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_semantic_hardening.py +0 -0
  187. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_semantic_stats.py +0 -0
  188. {codebeacon-0.6.8 → codebeacon-0.7.0}/tests/test_services.py +0 -0
  189. {codebeacon-0.6.8 → 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.6.8
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,38 @@ 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
+
140
+ ## What's new in 0.6.9
141
+
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.**
143
+
144
+ - **Your CLAUDE.md is safe now** — on a hand-written CLAUDE.md (e.g. from `/init`), the merge step could mistake the user's own `## Architecture` / `## Common Commands` sections for codebeacon output and delete them. The strip now runs only on files that positively fingerprint as codebeacon-generated, and it is anchored to the generated block — your sections survive. `codebeacon.yaml` is also written atomically now (and through symlinks, preserving file modes), so an interrupted write can't destroy a hand-curated config.
145
+ - **Files no longer vanish from the index silently** — uppercase extensions (`App.PY`, `Page.TSX`) were skipped; source modules named after credentials (`api_key_manager.go`, `access_token_service.py`) were dropped by the secret-file heuristic; one non-UTF-8 byte in a `.gitignore` crashed the whole scan; and a repo checked out under a folder named `build/` or `dist/` had its **entire graph erased** by the artifact filter matching ancestor directories. All fixed; skipped symlinks now get one grouped warning instead of silence.
146
+ - **`.gitignore` handling now matches git exactly** — negation semantics (`dir/` + `!dir/keep.txt`) are differential-tested against `git check-ignore` across every rule shape; a file under an excluded directory can no longer be re-included, exactly like git. The standard `dir/*` + `!dir/keep` rescue idiom works as before.
147
+ - **Same-named projects coexist** — two (or three) sub-projects all named `frontend` used to collapse into one: colliding node IDs silently dropped routes, and their wiki/obsidian folders overwrote each other. Duplicate names are now auto-disambiguated with a parent-directory prefix.
148
+ - **Route extraction got a correctness overhaul** — Express `app.use('/api', router)` mount prefixes are applied and chained `router.route(x).get().post()` yields every verb; Flask `register_blueprint` / FastAPI `include_router` prefixes no longer depend on where they appear in the file; Spring's `@RequestMapping(method = RequestMethod.X)` records the real verb instead of `ANY`; Next.js catch-all segments (`[...slug]`) are no longer garbled and `@slot` parallel routes are stripped from URLs; Laravel's canonical `class X extends Model` finally produces an entity (previously only fully-qualified bases matched — and `ViewModel` no longer sneaks in).
149
+ - **Phantom graph edges eliminated** — a lowercase import like `CONFIG` no longer case-folds onto an unrelated `Config` class (the false god-node pattern), imports never bind across a language boundary (`import time` → `time.ts`), DI bindings prefer the registering project instead of the first same-named class anywhere, and a same-named service + entity in one directory no longer collapse into a single node.
150
+ - **Exports are Windows-proof and crash-proof** — obsidian note names strip the full Windows-illegal character set (Flask `<string:id>` routes used to break the export on Windows) and guard reserved device names; `None` labels no longer crash the wiki, call-flow HTML, or obsidian exporters; git hooks are written with LF line endings so they execute on Windows; and long project names can't blow past filesystem limits mid-export.
151
+ - **One bad input can't kill long-running surfaces** — the MCP server survives malformed JSON-RPC messages instead of dying; a corrupt `beacon.json` or AST cache (including invalid UTF-8 and null/malformed collections) is backed up and reported instead of crashing `affected`, `serve`, or the merge driver.
152
+ - **Byte-reproducible output** — node ordering no longer tracks thread-completion order and shared-entity annotations are sorted, so scanning an unchanged tree twice produces byte-identical `beacon.json`, wiki, and CLAUDE.md. The Leiden clustering backend (silently broken by a graspologic API change — it *never* ran) is back in service.
153
+ - **The config you write is the config that runs** — documented `codebeacon.yaml` settings (`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`) were parsed and then ignored; they now drive the pipeline, `--list-only` is honored inside workspaces, and `codebeacon upgrade` gives the right command for uv-venv installs. Bonus consistency: the Projects table, Notes column, and Architecture section of CLAUDE.md now agree on one "Services" count, matching the wiki.
154
+
155
+ ---
156
+
121
157
  ## What's new in 0.6.8
122
158
 
123
159
  A graphify-parity audit of upstream v0.8.41–v0.9.3 (reported issues through #1568). Every candidate was reproduced against codebeacon before fixing and re-checked by an adversarial review pass; **7 real bugs** confirmed, headlined by a data-loss trap and a privacy leak.
@@ -265,7 +301,8 @@ Existing tools solve this partially. Route analyzers map your controllers but mi
265
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
266
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
267
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.
268
- - **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]'`.
269
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.
270
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.
271
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.
@@ -306,6 +343,18 @@ codebeacon sync # subsequent runs via config
306
343
  | Swift | Vapor |
307
344
  | ArkTS | `.ets` (HarmonyOS) collected — extractors framework-agnostic |
308
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
+
309
358
  ---
310
359
 
311
360
  ## Architecture
@@ -496,6 +545,71 @@ codebeacon scan .
496
545
  | `beacon_blast_radius` | Upstream callers + downstream affected nodes |
497
546
  | `beacon_routes` | List all HTTP routes, filterable by project |
498
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.
499
613
 
500
614
  ---
501
615
 
@@ -504,6 +618,7 @@ codebeacon scan .
504
618
  ```bash
505
619
  pip install codebeacon # all language grammars included
506
620
  pip install codebeacon[cluster] # + Leiden community detection (graspologic)
621
+ pip install codebeacon[watch] # + live file-watcher for `codebeacon watch` (watchdog)
507
622
  pip install --upgrade codebeacon # upgrade to latest version with all dependencies
508
623
  ```
509
624
 
@@ -535,6 +650,12 @@ codebeacon sync --config <file> # use a specific config file
535
650
  codebeacon sync --no-rediscover # don't auto-append newly added projects (hand-curated yaml mode)
536
651
  codebeacon sync --exclude PATTERN # same flag, same semantics
537
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
+
538
659
  # PR / CI: what does this diff actually break?
539
660
  codebeacon affected --base main # walk upstream callers of every changed file
540
661
  codebeacon affected --base origin/main --head HEAD --depth 4 --limit 200
@@ -695,6 +816,11 @@ output:
695
816
  obsidian: true
696
817
  context_map:
697
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.
698
824
 
699
825
  wave:
700
826
  auto: true
@@ -734,6 +860,8 @@ fixtures/
734
860
 
735
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.
736
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
+
737
865
  ---
738
866
 
739
867
  ## How It Compares
@@ -776,6 +904,50 @@ All AST processing is local. Your source code never leaves your machine when you
776
904
 
777
905
  ---
778
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
+
779
951
  ## Contributing
780
952
 
781
953
  ```bash
@@ -27,6 +27,38 @@
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
+
45
+ ## Neu in 0.6.9
46
+
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.**
48
+
49
+ - **Deine CLAUDE.md ist jetzt sicher** — bei einer handgeschriebenen CLAUDE.md (z. B. aus `/init`) konnte der Merge-Schritt die eigenen `## Architecture` / `## Common Commands`-Abschnitte des Nutzers für codebeacon-Ausgabe halten und löschen. Das Entfernen läuft jetzt nur noch auf Dateien, die sich eindeutig als codebeacon-generiert ausweisen, und ist am generierten Block verankert — deine Abschnitte bleiben erhalten. `codebeacon.yaml` wird jetzt zudem atomar geschrieben (und durch Symlinks hindurch, unter Erhalt der Dateimodi), sodass ein abgebrochener Schreibvorgang eine handgepflegte Konfiguration nicht zerstören kann.
50
+ - **Dateien verschwinden nicht mehr still aus dem Index** — Großbuchstaben-Erweiterungen (`App.PY`, `Page.TSX`) wurden übersprungen; nach Zugangsdaten benannte Quellmodule (`api_key_manager.go`, `access_token_service.py`) fielen der Secret-File-Heuristik zum Opfer; ein einziges Nicht-UTF-8-Byte in einer `.gitignore` ließ den gesamten Scan abstürzen; und ein Repo, das unter einem Ordner namens `build/` oder `dist/` ausgecheckt war, bekam durch den Artefakt-Filter, der übergeordnete Verzeichnisse matchte, **seinen gesamten Graphen gelöscht**. Alles behoben; übersprungene Symlinks erhalten jetzt eine gruppierte Warnung statt Schweigen.
51
+ - **Die `.gitignore`-Behandlung stimmt jetzt exakt mit git überein** — die Negations-Semantik (`dir/` + `!dir/keep.txt`) wird über jede Regelform hinweg differenziell gegen `git check-ignore` getestet; eine Datei unter einem ausgeschlossenen Verzeichnis kann nicht mehr wieder aufgenommen werden, genau wie bei git. Das Standard-Rettungsidiom `dir/*` + `!dir/keep` funktioniert wie bisher.
52
+ - **Gleichnamige Projekte koexistieren** — zwei (oder drei) Unterprojekte, alle namens `frontend`, kollabierten früher zu einem einzigen: kollidierende Node-IDs ließen Routen still verschwinden, und ihre wiki-/obsidian-Ordner überschrieben sich gegenseitig. Doppelte Namen werden jetzt automatisch mit einem Präfix aus dem übergeordneten Verzeichnis eindeutig gemacht.
53
+ - **Die Routen-Extraktion wurde grundlegend korrigiert** — Express-`app.use('/api', router)`-Mount-Präfixe werden angewendet, und verkettetes `router.route(x).get().post()` liefert jeden Verb; Flask-`register_blueprint`- / FastAPI-`include_router`-Präfixe hängen nicht mehr davon ab, wo sie in der Datei stehen; Springs `@RequestMapping(method = RequestMethod.X)` erfasst den echten Verb statt `ANY`; Next.js-Catch-all-Segmente (`[...slug]`) werden nicht mehr verstümmelt und `@slot`-Parallel-Routen aus URLs entfernt; Laravels kanonisches `class X extends Model` erzeugt endlich eine Entity (zuvor matchten nur voll qualifizierte Basen — und `ViewModel` schleicht sich nicht mehr ein).
54
+ - **Phantom-Graph-Edges beseitigt** — ein kleingeschriebenes Import wie `CONFIG` wird nicht mehr per Case-Folding auf eine unverwandte `Config`-Klasse gefaltet (das falsche god-node-Muster), Imports binden nie über eine Sprachgrenze hinweg (`import time` → `time.ts`), DI-Bindungen bevorzugen das registrierende Projekt statt der ersten gleichnamigen Klasse irgendwo, und ein gleichnamiges Service + Entity in einem Verzeichnis kollabiert nicht mehr zu einem einzigen Node.
55
+ - **Exporte sind Windows-fest und absturzsicher** — obsidian-Notiznamen entfernen den vollständigen unter Windows unzulässigen Zeichensatz (Flask-`<string:id>`-Routen brachen den Export unter Windows) und schützen vor reservierten Gerätenamen; `None`-Labels lassen die wiki-, Call-Flow-HTML- oder obsidian-Exporter nicht mehr abstürzen; git-Hooks werden mit LF-Zeilenenden geschrieben, damit sie unter Windows laufen; und lange Projektnamen können mitten im Export die Dateisystem-Grenzen nicht mehr sprengen.
56
+ - **Eine fehlerhafte Eingabe kann langlaufende Prozesse nicht mehr töten** — der MCP-Server übersteht fehlerhafte JSON-RPC-Nachrichten, statt zu sterben; eine beschädigte `beacon.json` oder ein beschädigter AST-Cache (inklusive ungültigem UTF-8 und null/fehlerhaften Kollektionen) wird gesichert und gemeldet, statt `affected`, `serve` oder den Merge-Treiber abstürzen zu lassen.
57
+ - **Byte-reproduzierbare Ausgabe** — die Node-Reihenfolge folgt nicht mehr der Thread-Fertigstellungsreihenfolge und Shared-Entity-Annotationen werden sortiert, sodass zweimaliges Scannen eines unveränderten Baums byte-identische `beacon.json`, wiki und CLAUDE.md erzeugt. Das Leiden-Clustering-Backend (durch eine graspologic-API-Änderung still kaputt — es lief *nie*) ist wieder im Dienst.
58
+ - **Die Konfiguration, die du schreibst, ist die Konfiguration, die läuft** — dokumentierte `codebeacon.yaml`-Einstellungen (`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`) wurden geparst und dann ignoriert; sie steuern jetzt die Pipeline, `--list-only` wird innerhalb von Workspaces berücksichtigt, und `codebeacon upgrade` gibt für uv-venv-Installationen den richtigen Befehl aus. Bonus-Konsistenz: die Projects-Tabelle, die Notes-Spalte und der Architecture-Abschnitt von CLAUDE.md sind sich jetzt über eine einzige „Services"-Zahl einig, passend zum wiki.
59
+
60
+ ---
61
+
30
62
  ## Neu in 0.6.8
31
63
 
32
64
  Ein graphify-Parity-Audit von Upstream v0.8.41–v0.9.3 (gemeldete Issues bis #1568). Jeder Kandidat wurde vor der Behebung gegen codebeacon reproduziert und durch eine adversariale Review-Runde erneut geprüft; **7 echte Bugs** bestätigt, angeführt von einer Datenverlust-Falle und einem Privacy-Leak.
@@ -27,6 +27,38 @@
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
+
45
+ ## Novedades en 0.6.9
46
+
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.**
48
+
49
+ - **Tu CLAUDE.md ahora está a salvo** — en un CLAUDE.md escrito a mano (p. ej. desde `/init`), el paso de fusión podía confundir las secciones `## Architecture` / `## Common Commands` propias del usuario con salida de codebeacon y borrarlas. El borrado ahora solo se ejecuta en archivos que se identifican inequívocamente como generados por codebeacon, y está anclado al bloque generado — tus secciones sobreviven. `codebeacon.yaml` también se escribe ahora de forma atómica (y a través de symlinks, preservando los modos de archivo), así que una escritura interrumpida no puede destruir una configuración curada a mano.
50
+ - **Los archivos ya no desaparecen del índice en silencio** — las extensiones en mayúsculas (`App.PY`, `Page.TSX`) se omitían; los módulos de código con nombre de credencial (`api_key_manager.go`, `access_token_service.py`) los descartaba la heurística de archivos secretos; un solo byte no UTF-8 en un `.gitignore` hacía caer todo el scan; y un repo con checkout bajo una carpeta llamada `build/` o `dist/` veía **borrado su grafo entero** porque el filtro de artefactos matcheaba directorios ancestros. Todo corregido; los symlinks omitidos reciben ahora un único aviso agrupado en vez de silencio.
51
+ - **El manejo de `.gitignore` ahora coincide exactamente con git** — la semántica de negación (`dir/` + `!dir/keep.txt`) se somete a differential testing contra `git check-ignore` en cada forma de regla; un archivo bajo un directorio excluido ya no puede volver a incluirse, igual que en git. El idiomático de rescate estándar `dir/*` + `!dir/keep` funciona como antes.
52
+ - **Los proyectos con el mismo nombre coexisten** — dos (o tres) subproyectos todos llamados `frontend` solían colapsar en uno: los IDs de nodo en colisión descartaban rutas en silencio, y sus carpetas de wiki/obsidian se sobrescribían entre sí. Los nombres duplicados ahora se desambiguan automáticamente con un prefijo del directorio padre.
53
+ - **La extracción de rutas recibió una revisión de corrección** — los prefijos de montaje `app.use('/api', router)` de Express se aplican y el encadenado `router.route(x).get().post()` produce todos los verbos; los prefijos de `register_blueprint` de Flask / `include_router` de FastAPI ya no dependen de dónde aparecen en el archivo; el `@RequestMapping(method = RequestMethod.X)` de Spring registra el verbo real en vez de `ANY`; los segmentos catch-all de Next.js (`[...slug]`) ya no se corrompen y las rutas paralelas `@slot` se eliminan de las URLs; el canónico `class X extends Model` de Laravel por fin produce una entidad (antes solo matcheaban las bases totalmente cualificadas — y `ViewModel` ya no se cuela).
54
+ - **Aristas fantasma del grafo eliminadas** — un import en minúsculas como `CONFIG` ya no se pliega por mayúsculas/minúsculas sobre una clase `Config` no relacionada (el falso patrón god-node), los imports nunca enlazan cruzando una frontera de lenguaje (`import time` → `time.ts`), los bindings de DI prefieren el proyecto que registra en vez de la primera clase homónima en cualquier parte, y un servicio + entidad homónimos en un mismo directorio ya no colapsan en un único nodo.
55
+ - **Las exportaciones son a prueba de Windows y a prueba de cuelgues** — los nombres de nota de obsidian eliminan el conjunto completo de caracteres ilegales en Windows (las rutas `<string:id>` de Flask rompían la exportación en Windows) y protegen contra nombres de dispositivo reservados; las etiquetas `None` ya no hacen caer los exportadores de wiki, del HTML de call-flow ni de obsidian; los git hooks se escriben con finales de línea LF para que se ejecuten en Windows; y los nombres de proyecto largos ya no pueden reventar los límites del sistema de archivos a mitad de la exportación.
56
+ - **Una entrada defectuosa ya no puede matar procesos de larga duración** — el servidor MCP sobrevive a mensajes JSON-RPC malformados en vez de morir; un `beacon.json` o una caché de AST corruptos (incluyendo UTF-8 inválido y colecciones nulas/malformadas) se respaldan y se reportan en vez de hacer caer `affected`, `serve` o el driver de fusión.
57
+ - **Salida reproducible byte a byte** — el orden de los nodos ya no sigue el orden de finalización de los hilos y las anotaciones de entidad compartida se ordenan, así que escanear dos veces un árbol sin cambios produce `beacon.json`, wiki y CLAUDE.md byte-idénticos. El backend de clustering Leiden (silenciosamente roto por un cambio de la API de graspologic — *nunca* llegó a ejecutarse) vuelve a estar en servicio.
58
+ - **La configuración que escribes es la configuración que se ejecuta** — los ajustes documentados de `codebeacon.yaml` (`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`) se parseaban y luego se ignoraban; ahora sí gobiernan el pipeline, `--list-only` se respeta dentro de workspaces, y `codebeacon upgrade` da el comando correcto para instalaciones con uv venv. Consistencia extra: la tabla de Projects, la columna de Notes y la sección de Architecture de CLAUDE.md ahora coinciden en un único recuento de "Services", igual que el wiki.
59
+
60
+ ---
61
+
30
62
  ## Novedades en 0.6.8
31
63
 
32
64
  Una auditoría de paridad con graphify del upstream v0.8.41–v0.9.3 (issues reportados hasta el #1568). Cada candidato se reprodujo contra codebeacon antes de corregirlo y se volvió a comprobar con una ronda de revisión adversarial; se confirmaron **7 bugs reales**, encabezados por una trampa de pérdida de datos y una fuga de privacidad.
@@ -27,6 +27,38 @@
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
+
45
+ ## Nouveautés en 0.6.9
46
+
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.**
48
+
49
+ - **Votre CLAUDE.md est désormais protégé** — sur un CLAUDE.md écrit à la main (par ex. issu de `/init`), l'étape de fusion pouvait prendre les sections `## Architecture` / `## Common Commands` propres à l'utilisateur pour de la sortie codebeacon et les supprimer. Le nettoyage ne s'exécute désormais que sur les fichiers qui s'identifient sans ambiguïté comme générés par codebeacon, et il est ancré au bloc généré — vos sections survivent. `codebeacon.yaml` est aussi écrit atomiquement désormais (et à travers les symlinks, en préservant les modes de fichier), si bien qu'une écriture interrompue ne peut pas détruire une configuration soignée à la main.
50
+ - **Les fichiers ne disparaissent plus silencieusement de l'index** — les extensions en majuscules (`App.PY`, `Page.TSX`) étaient ignorées ; les modules source nommés d'après des identifiants (`api_key_manager.go`, `access_token_service.py`) étaient écartés par l'heuristique des fichiers secrets ; un seul octet non-UTF-8 dans un `.gitignore` faisait planter tout le scan ; et un dépôt cloné sous un dossier nommé `build/` ou `dist/` voyait **son graphe entier effacé** par le filtre d'artefacts qui matchait les répertoires ancêtres. Tout est corrigé ; les symlinks ignorés reçoivent désormais un unique avertissement groupé au lieu du silence.
51
+ - **La gestion de `.gitignore` correspond désormais exactement à git** — la sémantique de négation (`dir/` + `!dir/keep.txt`) est testée différentiellement contre `git check-ignore` pour chaque forme de règle ; un fichier sous un répertoire exclu ne peut plus être réinclus, exactement comme git. L'idiome de sauvetage standard `dir/*` + `!dir/keep` fonctionne comme avant.
52
+ - **Les projets homonymes coexistent** — deux (ou trois) sous-projets tous nommés `frontend` fusionnaient auparavant en un seul : des IDs de nœud en collision faisaient disparaître des routes en silence, et leurs dossiers wiki/obsidian s'écrasaient mutuellement. Les noms en double sont désormais désambiguïsés automatiquement par un préfixe issu du répertoire parent.
53
+ - **L'extraction des routes a été révisée pour sa justesse** — les préfixes de montage `app.use('/api', router)` d'Express sont appliqués et le chaînage `router.route(x).get().post()` produit chaque verbe ; les préfixes `register_blueprint` de Flask / `include_router` de FastAPI ne dépendent plus de leur position dans le fichier ; le `@RequestMapping(method = RequestMethod.X)` de Spring enregistre le vrai verbe au lieu de `ANY` ; les segments catch-all de Next.js (`[...slug]`) ne sont plus déformés et les routes parallèles `@slot` sont retirées des URLs ; le canonique `class X extends Model` de Laravel produit enfin une entité (auparavant seules les bases pleinement qualifiées matchaient — et `ViewModel` ne se faufile plus).
54
+ - **Arêtes fantômes du graphe éliminées** — un import en minuscules comme `CONFIG` n'est plus replié par casse sur une classe `Config` sans rapport (le faux motif god-node), les imports ne se lient jamais par-delà une frontière de langage (`import time` → `time.ts`), les liaisons DI privilégient le projet qui enregistre plutôt que la première classe homonyme n'importe où, et un service + une entité homonymes dans un même répertoire ne fusionnent plus en un unique nœud.
55
+ - **Les exports sont à l'épreuve de Windows et des plantages** — les noms de note obsidian retirent l'ensemble complet des caractères illégaux sous Windows (les routes `<string:id>` de Flask cassaient l'export sous Windows) et se prémunissent contre les noms de périphérique réservés ; les labels `None` ne font plus planter les exporteurs wiki, HTML call-flow ou obsidian ; les git hooks sont écrits avec des fins de ligne LF pour s'exécuter sous Windows ; et les noms de projet longs ne peuvent plus dépasser les limites du système de fichiers en plein export.
56
+ - **Une seule mauvaise entrée ne peut plus tuer les processus longue durée** — le serveur MCP survit aux messages JSON-RPC malformés au lieu de mourir ; un `beacon.json` ou un cache AST corrompu (y compris UTF-8 invalide et collections nulles/malformées) est sauvegardé et signalé au lieu de faire planter `affected`, `serve` ou le pilote de fusion.
57
+ - **Sortie reproductible à l'octet près** — l'ordre des nœuds ne suit plus l'ordre d'achèvement des threads et les annotations d'entité partagée sont triées, si bien que scanner deux fois un arbre inchangé produit des `beacon.json`, wiki et CLAUDE.md octet-identiques. Le backend de clustering Leiden (silencieusement cassé par un changement d'API de graspologic — il ne s'est *jamais* exécuté) est de nouveau opérationnel.
58
+ - **La configuration que vous écrivez est la configuration qui s'exécute** — les réglages documentés de `codebeacon.yaml` (`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`) étaient parsés puis ignorés ; ils pilotent désormais le pipeline, `--list-only` est respecté à l'intérieur des workspaces, et `codebeacon upgrade` donne la bonne commande pour les installations uv venv. Cohérence en bonus : le tableau Projects, la colonne Notes et la section Architecture de CLAUDE.md s'accordent désormais sur un unique décompte de « Services », en phase avec le wiki.
59
+
60
+ ---
61
+
30
62
  ## Nouveautés en 0.6.8
31
63
 
32
64
  Un audit de parité graphify de l'upstream v0.8.41–v0.9.3 (issues signalées jusqu'au #1568). Chaque candidat a été reproduit sur codebeacon avant correction, puis revérifié par une passe de revue adversariale ; **7 bugs réels** confirmés, avec en tête un piège à perte de données et une fuite de confidentialité.
@@ -27,6 +27,38 @@
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
+
45
+ ## 0.6.9 の新機能
46
+
47
+ これまでで最大規模の監査リリースです。二重のアップストリーム・パリティ・スイープ(codesight のトラッカーに対する史上初の完全監査に加え、graphify v0.9.4–v0.9.12 / issue は #1776 まで)と、codebeacon 自体に対する独立したマルチエージェント・バグハントを組み合わせました。各候補は修正前に再現し、各修正は mutation テストにかけ、さらに敵対的な2次レビューが修正自体を攻撃して、リリース前にさらに18個の穴を捕まえました。**実バグ48件を修正。**
48
+
49
+ - **CLAUDE.md が安全になりました** — 手書きの CLAUDE.md(例:`/init` 由来)では、マージステップがユーザー自身の `## Architecture` / `## Common Commands` セクションを codebeacon の出力と誤認して削除する可能性がありました。ストリップ処理は今や codebeacon 生成物だと確実に判別されたファイルでのみ、生成ブロックにアンカリングして実行されます — あなたのセクションは残ります。`codebeacon.yaml` もアトミックに(シンボリックリンク越しでも、ファイルモードを保持しつつ)書き込まれるようになり、中断された書き込みが手作業で整えた設定を破壊できなくなりました。
50
+ - **ファイルがインデックスから静かに消えなくなりました** — 大文字の拡張子(`App.PY`、`Page.TSX`)がスキップされ、資格情報にちなんだ名前のソースモジュール(`api_key_manager.go`、`access_token_service.py`)がシークレットファイル・ヒューリスティックで除外され、`.gitignore` 内の非 UTF-8 バイト1個がスキャン全体をクラッシュさせ、`build/` や `dist/` という名前のフォルダ配下にチェックアウトしたリポは、アーティファクトフィルタが祖先ディレクトリにマッチして**グラフ全体が消去**されていました。すべて修正済みです。スキップされたシンボリックリンクは、沈黙の代わりにグループ化された警告を1つ出すようになりました。
51
+ - **`.gitignore` の扱いが git と完全に一致するようになりました** — 否定セマンティクス(`dir/` + `!dir/keep.txt`)を、あらゆるルール形態にわたって `git check-ignore` と differential テストしています。git とまったく同じく、除外されたディレクトリ配下のファイルは再び含めることができません。標準の救済イディオム `dir/*` + `!dir/keep` は従来どおり動作します。
52
+ - **同名プロジェクトが共存します** — すべて `frontend` という名前の2つ(または3つ)のサブプロジェクトが以前は1つに潰れていました:ノード ID の衝突でルートが静かに脱落し、それぞれの wiki/obsidian フォルダが互いを上書きしていました。重複する名前は今や親ディレクトリのプレフィックスで自動的に区別されます。
53
+ - **ルート抽出を正確性の観点から全面的に見直しました** — Express の `app.use('/api', router)` マウントプレフィックスが適用され、チェーンした `router.route(x).get().post()` があらゆる verb を産出します。Flask の `register_blueprint` / FastAPI の `include_router` プレフィックスがファイル内の出現位置に依存しなくなりました。Spring の `@RequestMapping(method = RequestMethod.X)` が `ANY` ではなく実際の verb を記録します。Next.js の catch-all セグメント(`[...slug]`)が壊れなくなり、`@slot` 並列ルートが URL から除去されます。Laravel の教科書的な `class X extends Model` がついにエンティティを生成します(以前は完全修飾されたベースのみがマッチ — `ViewModel` はもう紛れ込みません)。
54
+ - **幽霊グラフエッジを排除しました** — `CONFIG` のような小文字の import が無関係な `Config` クラスに大文字小文字の畳み込みで結び付く(偽の god-node パターン)ことがなくなり、import が言語境界を越えてバインドすることは決してなく(`import time` → `time.ts`)、DI バインディングはどこかにある最初の同名クラスではなく登録元のプロジェクトを優先し、1つのディレクトリ内の同名の service + entity が単一ノードに潰れなくなりました。
55
+ - **エクスポートが Windows 堅牢かつクラッシュ堅牢になりました** — obsidian のノート名は Windows で不正な文字セット全体を除去し(Flask の `<string:id>` ルートは Windows でエクスポートを壊していました)、予約デバイス名を防御します。`None` ラベルは wiki・call-flow HTML・obsidian エクスポーターをもうクラッシュさせません。git hook は LF 改行で書き込まれ、Windows でも実行されます。そして長いプロジェクト名がエクスポート途中でファイルシステムの上限を超えることもなくなりました。
56
+ - **不正な入力1つで長時間稼働のプロセスを殺せなくなりました** — MCP サーバーは不正な JSON-RPC メッセージで死なずに生き延びます。破損した `beacon.json` や AST キャッシュ(無効な UTF-8 や null/不正なコレクションを含む)はバックアップして報告され、`affected`・`serve`・マージドライバーをクラッシュさせません。
57
+ - **バイト単位で再現可能な出力** — ノードの順序がスレッドの完了順を追わなくなり、共有エンティティの注釈がソートされるため、変更のないツリーを2回スキャンするとバイト単位で同一の `beacon.json`・wiki・CLAUDE.md が生成されます。graspologic の API 変更で静かに壊れていた(*一度も*実行されなかった)Leiden クラスタリングバックエンドも復帰しました。
58
+ - **書いた設定が実際に走る設定です** — 文書化された `codebeacon.yaml` の設定(`wave.*`、`output.wiki/obsidian`、`context_map.targets`、`semantic.enabled`)はパースされたうえで無視されていましたが、今やパイプラインを実際に駆動します。ワークスペース内で `--list-only` が尊重され、`codebeacon upgrade` は uv venv インストールに正しいコマンドを案内します。おまけの一貫性:CLAUDE.md の Projects 表・Notes 列・Architecture セクションが単一の「Services」件数で一致し、wiki とも揃いました。
59
+
60
+ ---
61
+
30
62
  ## 0.6.8 の新機能
31
63
 
32
64
  アップストリーム v0.8.41–v0.9.3(報告された issue は #1568 まで)の graphify パリティ監査です。各候補は修正前に codebeacon 上で実際に再現し、敵対的レビューパスで再確認しました。**実バグ7件**を確認、データ損失トラップとプライバシー漏洩が目玉です。
@@ -27,6 +27,38 @@
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
+
45
+ ## 0.6.9 새 소식
46
+
47
+ 역대 최대 규모의 감사 릴리스입니다: 이중 업스트림 패리티 스윕(codesight 트래커 최초 전체 감사 + graphify v0.9.4–v0.9.12 / 이슈 #1776까지)에 codebeacon 자체에 대한 독립 멀티에이전트 버그 헌트를 결합했습니다. 모든 후보를 수정 전에 재현하고, 모든 수정을 mutation 테스트했으며, 적대적 2차 리뷰가 수정 자체를 공격해 출시 전에 추가 구멍 18개를 잡아냈습니다. **실제 버그 48건 수정.**
48
+
49
+ - **이제 CLAUDE.md가 안전합니다** — 손으로 작성한 CLAUDE.md(예: `/init` 산출물)에서 병합 단계가 사용자의 `## Architecture` / `## Common Commands` 섹션을 codebeacon 출력으로 오인해 삭제할 수 있었습니다. 이제 스트립은 codebeacon 생성물로 확실히 판별되는 파일에서만, 생성 블록에 앵커링되어 동작합니다 — 사용자 섹션은 살아남습니다. `codebeacon.yaml`도 원자적으로(심링크 관통·파일 모드 보존 포함) 기록되어, 중단된 쓰기가 손수 관리한 설정을 파괴할 수 없습니다.
50
+ - **파일이 인덱스에서 조용히 사라지지 않습니다** — 대문자 확장자(`App.PY`, `Page.TSX`)가 무시됐고, 자격증명 이름을 딴 소스 모듈(`api_key_manager.go`, `access_token_service.py`)이 시크릿 파일 휴리스틱에 걸려 탈락했으며, `.gitignore`의 비 UTF-8 바이트 하나가 스캔 전체를 중단시켰고, `build/`나 `dist/`라는 폴더 아래에 체크아웃한 리포는 아티팩트 필터가 상위 디렉토리까지 매칭해 **그래프 전체가 소거**됐습니다. 모두 수정했고, 건너뛴 심링크는 침묵 대신 그룹화된 경고 한 줄을 남깁니다.
51
+ - **`.gitignore` 처리가 git과 정확히 일치합니다** — 부정 패턴 시맨틱(`dir/` + `!dir/keep.txt`)을 모든 규칙 형태에 대해 `git check-ignore`와 differential 테스트했습니다. git과 똑같이, 제외된 디렉토리 아래의 파일은 다시 포함될 수 없습니다. 표준 구출 관용구 `dir/*` + `!dir/keep`은 종전대로 동작합니다.
52
+ - **동명 프로젝트가 공존합니다** — `frontend`라는 이름의 하위 프로젝트 두세 개가 하나로 합쳐지곤 했습니다: 노드 ID 충돌로 라우트가 조용히 소실되고 wiki/obsidian 폴더가 서로 덮어썼습니다. 중복 이름은 이제 부모 디렉토리 접두사로 자동 구별됩니다.
53
+ - **라우트 추출 정확성 전면 정비** — Express `app.use('/api', router)` 마운트 프리픽스가 적용되고 체인 `router.route(x).get().post()`가 모든 verb를 산출합니다. Flask `register_blueprint` / FastAPI `include_router` 프리픽스가 파일 내 위치에 의존하지 않습니다. Spring `@RequestMapping(method = RequestMethod.X)`가 `ANY` 대신 실제 verb를 기록합니다. Next.js catch-all(`[...slug]`)이 더는 깨지지 않고 `@slot` 병렬 라우트가 URL에서 제거됩니다. Laravel의 교과서적 `class X extends Model`이 드디어 엔티티를 생성합니다(이전엔 완전 수식된 베이스만 매칭 — `ViewModel`은 이제 걸러냅니다).
54
+ - **유령 그래프 엣지 제거** — 소문자 경로 import가 무관한 `Config` 클래스에 `CONFIG`를 케이스폴딩으로 오연결하던 가짜 god-node 패턴이 사라졌고, import가 언어 경계를 넘어 바인딩되지 않으며(`import time` → `time.ts`), DI 바인딩은 아무 프로젝트의 동명 클래스가 아니라 등록한 프로젝트를 우선하고, 한 디렉토리의 동명 service + entity가 단일 노드로 합쳐지지 않습니다.
55
+ - **Export가 Windows-안전 + 크래시-안전** — obsidian 노트 이름이 Windows 불법 문자 전체를 제거하고(Flask `<string:id>` 라우트가 Windows에서 export를 중단시켰습니다) 예약 장치 이름을 방어합니다. `None` 라벨이 wiki·call-flow HTML·obsidian exporter를 더는 크래시시키지 않습니다. git hook이 LF 개행으로 기록되어 Windows에서도 실행되고, 긴 프로젝트 이름이 파일시스템 한계를 넘지 않습니다.
56
+ - **입력 하나가 장수명 프로세스를 죽일 수 없습니다** — MCP 서버가 잘못된 JSON-RPC 메시지에 죽지 않고 살아남습니다. 손상된 `beacon.json`이나 AST 캐시(잘못된 UTF-8, null/기형 컬렉션 포함)는 백업 후 명확히 보고되며 `affected`·`serve`·머지 드라이버를 크래시시키지 않습니다.
57
+ - **바이트 단위 재현 가능한 출력** — 노드 순서가 스레드 완료 순서를 따라가지 않고 공유 엔티티 주석이 정렬되어, 변경 없는 트리를 두 번 스캔하면 `beacon.json`·wiki·CLAUDE.md가 바이트 단위로 동일합니다. graspologic API 변경으로 조용히 죽어 있던(한 번도 실행되지 못한) Leiden 클러스터링 백엔드도 복구했습니다.
58
+ - **작성한 설정이 실제로 적용됩니다** — 문서화된 `codebeacon.yaml` 설정(`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`)이 파싱만 되고 무시됐는데, 이제 파이프라인을 실제로 제어합니다. 워크스페이스 안에서 `--list-only`가 존중되고, `codebeacon upgrade`가 uv venv 설치에 맞는 명령을 안내합니다. 덤으로 CLAUDE.md의 Projects 표·Notes 열·Architecture 섹션이 하나의 "Services" 수치로 일치하며 wiki와도 맞습니다.
59
+
60
+ ---
61
+
30
62
  ## 0.6.8 새 소식
31
63
 
32
64
  업스트림 v0.8.41–v0.9.3(보고된 이슈 #1568까지)에 대한 graphify-패리티 감사입니다. 모든 후보를 수정 전에 codebeacon에서 실제로 재현하고 적대적 리뷰 패스로 재검증했으며, **7개의 실제 버그**를 확인했습니다 — 데이터 손실 함정과 프라이버시 유출이 핵심입니다.