codebeacon 0.6.2__tar.gz → 0.6.4__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 (154) hide show
  1. {codebeacon-0.6.2 → codebeacon-0.6.4}/.cursorrules +9 -9
  2. {codebeacon-0.6.2 → codebeacon-0.6.4}/AGENTS.md +9 -9
  3. {codebeacon-0.6.2 → codebeacon-0.6.4}/CLAUDE.md +9 -9
  4. {codebeacon-0.6.2 → codebeacon-0.6.4}/PKG-INFO +38 -1
  5. {codebeacon-0.6.2 → codebeacon-0.6.4}/README.de.md +37 -0
  6. {codebeacon-0.6.2 → codebeacon-0.6.4}/README.es.md +37 -0
  7. {codebeacon-0.6.2 → codebeacon-0.6.4}/README.fr.md +37 -0
  8. {codebeacon-0.6.2 → codebeacon-0.6.4}/README.ja.md +37 -0
  9. {codebeacon-0.6.2 → codebeacon-0.6.4}/README.ko.md +37 -0
  10. {codebeacon-0.6.2 → codebeacon-0.6.4}/README.md +37 -0
  11. {codebeacon-0.6.2 → codebeacon-0.6.4}/README.pt-BR.md +37 -0
  12. {codebeacon-0.6.2 → codebeacon-0.6.4}/README.zh-CN.md +37 -0
  13. codebeacon-0.6.4/codebeacon/__init__.py +1 -0
  14. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/cache.py +70 -49
  15. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/common/safety.py +14 -0
  16. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/common/symbols.py +7 -1
  17. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/config.py +10 -4
  18. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/contextmap/generator.py +20 -8
  19. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/discover/detector.py +13 -4
  20. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/export/hooks.py +60 -10
  21. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/export/obsidian.py +5 -1
  22. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/base.py +25 -3
  23. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/dependencies.py +75 -0
  24. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/django.scm +12 -0
  25. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/fastapi.scm +12 -0
  26. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/flask.scm +12 -0
  27. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/routes.py +13 -6
  28. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/services.py +6 -1
  29. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/graph/analyze.py +13 -5
  30. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/graph/build.py +5 -0
  31. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/graph/enrich.py +40 -29
  32. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/pipeline.py +154 -66
  33. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/wave.py +5 -3
  34. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/wiki/generator.py +4 -3
  35. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/wiki/templates.py +22 -25
  36. {codebeacon-0.6.2 → codebeacon-0.6.4}/pyproject.toml +1 -1
  37. codebeacon-0.6.4/tests/test_deep_dive_grouping.py +241 -0
  38. codebeacon-0.6.4/tests/test_graphify_parity_0_6_3.py +235 -0
  39. codebeacon-0.6.4/tests/test_independent_audit_fixes.py +291 -0
  40. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_known_bugs.py +2 -2
  41. codebeacon-0.6.2/codebeacon/__init__.py +0 -1
  42. {codebeacon-0.6.2 → codebeacon-0.6.4}/.github/CODEOWNERS +0 -0
  43. {codebeacon-0.6.2 → codebeacon-0.6.4}/.github/dependabot.yml +0 -0
  44. {codebeacon-0.6.2 → codebeacon-0.6.4}/.github/workflows/ci.yml +0 -0
  45. {codebeacon-0.6.2 → codebeacon-0.6.4}/.github/workflows/release.yml +0 -0
  46. {codebeacon-0.6.2 → codebeacon-0.6.4}/.gitignore +0 -0
  47. {codebeacon-0.6.2 → codebeacon-0.6.4}/LICENSE +0 -0
  48. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/__main__.py +0 -0
  49. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/affected.py +0 -0
  50. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/cli.py +0 -0
  51. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/common/__init__.py +0 -0
  52. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/common/filters.py +0 -0
  53. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/common/types.py +0 -0
  54. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/contextmap/__init__.py +0 -0
  55. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/diagnostics.py +0 -0
  56. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/discover/__init__.py +0 -0
  57. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/discover/ignore.py +0 -0
  58. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/discover/scanner.py +0 -0
  59. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/export/__init__.py +0 -0
  60. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/export/callflow_html.py +0 -0
  61. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/export/mcp.py +0 -0
  62. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/export/merge.py +0 -0
  63. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/export/tree_html.py +0 -0
  64. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/__init__.py +0 -0
  65. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/components.py +0 -0
  66. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/dotnet.py +0 -0
  67. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/entities.py +0 -0
  68. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/README.md +0 -0
  69. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/actix.scm +0 -0
  70. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/angular.scm +0 -0
  71. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/aspnet.scm +0 -0
  72. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/express.scm +0 -0
  73. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/gin.scm +0 -0
  74. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/ktor.scm +0 -0
  75. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/laravel.scm +0 -0
  76. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/nestjs.scm +0 -0
  77. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/rails.scm +0 -0
  78. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/react.scm +0 -0
  79. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/spring_boot.scm +0 -0
  80. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/svelte.scm +0 -0
  81. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/tauri.scm +0 -0
  82. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/vapor.scm +0 -0
  83. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/queries/vue.scm +0 -0
  84. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/extract/semantic.py +0 -0
  85. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/graph/__init__.py +0 -0
  86. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/graph/cluster.py +0 -0
  87. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/graph/write.py +0 -0
  88. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/knowledge/__init__.py +0 -0
  89. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/knowledge/generator.py +0 -0
  90. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/plugins/__init__.py +0 -0
  91. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/plugins/githooks.py +0 -0
  92. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/plugins/skills.py +0 -0
  93. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/semantic_pipeline.py +0 -0
  94. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/skill/SKILL.md +0 -0
  95. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/wiki/__init__.py +0 -0
  96. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon/wiki/index.py +0 -0
  97. {codebeacon-0.6.2 → codebeacon-0.6.4}/codebeacon.yaml.example +0 -0
  98. {codebeacon-0.6.2 → codebeacon-0.6.4}/docs/TRANSLATION_STATUS.md +0 -0
  99. {codebeacon-0.6.2 → codebeacon-0.6.4}/public-plan.md +0 -0
  100. {codebeacon-0.6.2 → codebeacon-0.6.4}/skill/install.py +0 -0
  101. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/__init__.py +0 -0
  102. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/conftest.py +0 -0
  103. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/actix/main.rs +0 -0
  104. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/angular/app.component.ts +0 -0
  105. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/aspnet/UserController.cs +0 -0
  106. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/django/views.py +0 -0
  107. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/express/userRouter.js +0 -0
  108. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/fastapi/main.py +0 -0
  109. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/flask/app.py +0 -0
  110. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/gin/main.go +0 -0
  111. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/integration_workspace/api-python/pyproject.toml +0 -0
  112. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/integration_workspace/api-python/src/__init__.py +0 -0
  113. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/integration_workspace/api-python/src/main.py +0 -0
  114. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/integration_workspace/api-python/src/services.py +0 -0
  115. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/integration_workspace/web/package.json +0 -0
  116. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/integration_workspace/web/src/UserPage.tsx +0 -0
  117. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/ktor/UserRoutes.kt +0 -0
  118. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/laravel/UserController.php +0 -0
  119. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/nestjs/user.controller.ts +0 -0
  120. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/rails/users_controller.rb +0 -0
  121. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/react/UserPage.tsx +0 -0
  122. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/spring_boot/UserController.java +0 -0
  123. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/sveltekit/+page.svelte +0 -0
  124. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/vapor/routes.swift +0 -0
  125. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/fixtures/vue/UserList.vue +0 -0
  126. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/integration/__init__.py +0 -0
  127. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/integration/test_full_pipeline.py +0 -0
  128. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_affected.py +0 -0
  129. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_affected_wiki.py +0 -0
  130. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_audit_bugfixes.py +0 -0
  131. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_cli_dispatch.py +0 -0
  132. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_contextmap_paths.py +0 -0
  133. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_dependencies.py +0 -0
  134. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_diagnostics.py +0 -0
  135. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_discover.py +0 -0
  136. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_dotnet.py +0 -0
  137. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_entities.py +0 -0
  138. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_filters.py +0 -0
  139. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_graph.py +0 -0
  140. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_graphify_parity_fixes.py +0 -0
  141. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_knowledge.py +0 -0
  142. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_mcp_and_semantic.py +0 -0
  143. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_optional_grammars.py +0 -0
  144. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_pipeline_module.py +0 -0
  145. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_plugins.py +0 -0
  146. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_resolve.py +0 -0
  147. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_routes.py +0 -0
  148. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_safety_and_writes.py +0 -0
  149. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_scanner_sensitive.py +0 -0
  150. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_semantic.py +0 -0
  151. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_semantic_hardening.py +0 -0
  152. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_semantic_stats.py +0 -0
  153. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_services.py +0 -0
  154. {codebeacon-0.6.2 → codebeacon-0.6.4}/tests/test_wiki.py +0 -0
@@ -27,7 +27,7 @@ Look up by class name — replace `{project}` with the relevant folder:
27
27
 
28
28
  | Project | Notes | Example |
29
29
  | --- | --- | --- |
30
- | codebeacon | 398 services, 3 entities | `affected_from_paths.py.md` |
30
+ | codebeacon | 413 services, 3 entities | `affected_from_paths.py.md` |
31
31
 
32
32
  ### Step 3 — source file
33
33
  Open the paths surfaced by Steps 1–2.
@@ -38,7 +38,7 @@ Open the paths surfaced by Steps 1–2.
38
38
 
39
39
  | Project | Framework | Routes | Services | Entities | Components |
40
40
  | --- | --- | --- | --- | --- | --- |
41
- | codebeacon | python | 5 | 398 | 3 | 0 |
41
+ | codebeacon | python | 5 | 413 | 3 | 0 |
42
42
 
43
43
  ---
44
44
 
@@ -56,19 +56,19 @@ Open the paths surfaced by Steps 1–2.
56
56
  ## Architecture
57
57
 
58
58
  **codebeacon**: **python** · python
59
- Routes: 5 | Services: 398 | Entities: 3 | Components: 0
59
+ Routes: 5 | Services: 413 | Entities: 3 | Components: 0
60
60
 
61
61
  ## High-Impact Files
62
62
 
63
63
  Changes here affect many other files:
64
64
 
65
- - `codebeacon/semantic_pipeline.py` (imported by 56 files)
66
- - `codebeacon/pipeline.py` (imported by 12 files)
67
- - `tests/test_graph.py` (imported by 6 files)
68
- - `tests/integration/test_full_pipeline.py` (imported by 3 files)
69
- - `tests/test_known_bugs.py` (imported by 2 files)
65
+ - `codebeacon/common/safety.py` (imported by 9 files)
66
+ - `codebeacon/discover/detector.py` (imported by 6 files)
67
+ - `codebeacon/wiki/generator.py` (imported by 6 files)
68
+ - `codebeacon/affected.py` (imported by 5 files)
69
+ - `codebeacon/common/symbols.py` (imported by 5 files)
70
70
 
71
71
  ---
72
72
 
73
- _Generated by [codebeacon](https://github.com/codebeacon/codebeacon) · 2026-05-31_
73
+ _Generated by [codebeacon](https://github.com/codebeacon/codebeacon) · 2026-06-11_
74
74
  <!-- codebeacon:end -->
@@ -27,7 +27,7 @@ Look up by class name — replace `{project}` with the relevant folder:
27
27
 
28
28
  | Project | Notes | Example |
29
29
  | --- | --- | --- |
30
- | codebeacon | 398 services, 3 entities | `affected_from_paths.py.md` |
30
+ | codebeacon | 413 services, 3 entities | `affected_from_paths.py.md` |
31
31
 
32
32
  ### Step 3 — source file
33
33
  Open the paths surfaced by Steps 1–2.
@@ -38,7 +38,7 @@ Open the paths surfaced by Steps 1–2.
38
38
 
39
39
  | Project | Framework | Routes | Services | Entities | Components |
40
40
  | --- | --- | --- | --- | --- | --- |
41
- | codebeacon | python | 5 | 398 | 3 | 0 |
41
+ | codebeacon | python | 5 | 413 | 3 | 0 |
42
42
 
43
43
  ---
44
44
 
@@ -56,19 +56,19 @@ Open the paths surfaced by Steps 1–2.
56
56
  ## Architecture
57
57
 
58
58
  **codebeacon**: **python** · python
59
- Routes: 5 | Services: 398 | Entities: 3 | Components: 0
59
+ Routes: 5 | Services: 413 | Entities: 3 | Components: 0
60
60
 
61
61
  ## High-Impact Files
62
62
 
63
63
  Changes here affect many other files:
64
64
 
65
- - `codebeacon/semantic_pipeline.py` (imported by 56 files)
66
- - `codebeacon/pipeline.py` (imported by 12 files)
67
- - `tests/test_graph.py` (imported by 6 files)
68
- - `tests/integration/test_full_pipeline.py` (imported by 3 files)
69
- - `tests/test_known_bugs.py` (imported by 2 files)
65
+ - `codebeacon/common/safety.py` (imported by 9 files)
66
+ - `codebeacon/discover/detector.py` (imported by 6 files)
67
+ - `codebeacon/wiki/generator.py` (imported by 6 files)
68
+ - `codebeacon/affected.py` (imported by 5 files)
69
+ - `codebeacon/common/symbols.py` (imported by 5 files)
70
70
 
71
71
  ---
72
72
 
73
- _Generated by [codebeacon](https://github.com/codebeacon/codebeacon) · 2026-05-31_
73
+ _Generated by [codebeacon](https://github.com/codebeacon/codebeacon) · 2026-06-11_
74
74
  <!-- codebeacon:end -->
@@ -27,7 +27,7 @@ Look up by class name — replace `{project}` with the relevant folder:
27
27
 
28
28
  | Project | Notes | Example |
29
29
  | --- | --- | --- |
30
- | codebeacon | 398 services, 3 entities | `affected_from_paths.py.md` |
30
+ | codebeacon | 413 services, 3 entities | `affected_from_paths.py.md` |
31
31
 
32
32
  ### Step 3 — source file
33
33
  Open the paths surfaced by Steps 1–2.
@@ -43,7 +43,7 @@ searches that span projects.
43
43
 
44
44
  | Project | Framework | Routes | Services | Entities | Components |
45
45
  | --- | --- | --- | --- | --- | --- |
46
- | codebeacon | python | 5 | 398 | 3 | 0 |
46
+ | codebeacon | python | 5 | 413 | 3 | 0 |
47
47
 
48
48
  ---
49
49
 
@@ -61,19 +61,19 @@ searches that span projects.
61
61
  ## Architecture
62
62
 
63
63
  **codebeacon**: **python** · python
64
- Routes: 5 | Services: 398 | Entities: 3 | Components: 0
64
+ Routes: 5 | Services: 413 | Entities: 3 | Components: 0
65
65
 
66
66
  ## High-Impact Files
67
67
 
68
68
  Changes here affect many other files:
69
69
 
70
- - `codebeacon/semantic_pipeline.py` (imported by 56 files)
71
- - `codebeacon/pipeline.py` (imported by 12 files)
72
- - `tests/test_graph.py` (imported by 6 files)
73
- - `tests/integration/test_full_pipeline.py` (imported by 3 files)
74
- - `tests/test_known_bugs.py` (imported by 2 files)
70
+ - `codebeacon/common/safety.py` (imported by 9 files)
71
+ - `codebeacon/discover/detector.py` (imported by 6 files)
72
+ - `codebeacon/wiki/generator.py` (imported by 6 files)
73
+ - `codebeacon/affected.py` (imported by 5 files)
74
+ - `codebeacon/common/symbols.py` (imported by 5 files)
75
75
 
76
76
  ---
77
77
 
78
- _Generated by [codebeacon](https://github.com/codebeacon/codebeacon) · 2026-05-31_
78
+ _Generated by [codebeacon](https://github.com/codebeacon/codebeacon) · 2026-06-11_
79
79
  <!-- codebeacon:end -->
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codebeacon
3
- Version: 0.6.2
3
+ Version: 0.6.4
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
@@ -118,6 +118,43 @@ Description-Content-Type: text/markdown
118
118
 
119
119
  ---
120
120
 
121
+ ## What's new in 0.6.4
122
+
123
+ Deep-dive cleanup — outputs land where you look for them, and two silent-data-loss bugs found while verifying it on a 47-project workspace.
124
+
125
+ - **Deep-dive writes to exactly two levels** — each *repo root* (a directory with its own `.git` or `codebeacon.yaml`) and the *scan root*. A monorepo's framework folders (`mono/landing`, `mono/server`) no longer each grow a `.codebeacon/` + CLAUDE.md; their combined graph lives at `mono/.codebeacon/`, and the scan root carries the full workspace graph so any project can be found from one place. Running deep-dive *inside* a monorepo now produces a single root output instead of one per subfolder.
126
+ - **Cache keys are framework-namespaced** — a repo group shares one cache, and a parent project walking over a nested project's files first (`desktop/` as sveltekit over `desktop/src-tauri`) used to poison the cache with empty results that the nested project (tauri) then reused, silently dropping all of its routes and entities.
127
+ - **Grammar-load race fixed** — two parallel extraction workers hitting an uncached tree-sitter grammar each built their own `Language` instance; the losing thread's files then failed an identity check and extracted to **nothing** — no warning, no failure record, just a couple of files randomly missing all their routes on big scans. First load is now locked to a single shared instance (verified stable across 20 consecutive full scans).
128
+
129
+ ---
130
+
131
+ ## What's new in 0.6.3
132
+
133
+ Bug-fix release — a graphify-parity audit (upstream Jun 3–10) plus an independent audit of codebeacon's own code: **16 fixes**, verified end-to-end with a 47-project `--deep-dive` workspace scan (5,226 nodes / 8,715 edges).
134
+
135
+ - **Git hooks now fire everywhere** — the post-commit rebuild hook pins the installing Python interpreter into the script and detaches via `subprocess` instead of `nohup`, so it works in GUI git clients (Sublime Merge, GitKraken), CI runners, and on Windows — environments where the `codebeacon` launcher isn't on `PATH` and the old hook silently did nothing. Re-run `codebeacon hook install` to pick up the fix; the merge driver is pinned the same way.
136
+ - **Commented-out JS/TS imports no longer create edges** — the barrel re-export and `require()` regex passes now strip `//` and `/* */` comments (string-literal aware) first. A commented `export * from './legacy'` used to produce a phantom edge and false import cycles.
137
+ - **`from pkg import name` binds the real target (Python)** — the import extractor now captures the imported names, so `from auth.services import UserService` links to the `UserService` node and `from src.services import enricher` links to the submodule. Previously only the module path's last segment was tried, leaving test files disconnected. Aliases (`import x as y`) resolve to the true symbol name.
138
+ - **"High-Impact Files" is actually high-impact** — the hub ranking (CLAUDE.md, `analyze`) counted import *fan-out* via the edge's `source_file` (always the importer), so entry points outranked real shared modules with per-node-inflated counts ("imported by 392 files" in a 60-file repo). Both copies now count distinct importing files per imported file.
139
+ - **DI `injects` edges carry real file paths** — resolved dependency-injection edges stamped the graph node ID (`proj::Name`) into `source_file`; they now carry the source node's actual file.
140
+ - **Ktor nested route prefixes concatenate** — `route("/api") { route("/v1") { get("/users") } }` extracts `/api/v1/users` instead of dropping every outer prefix.
141
+ - **Same-path routes both matched** — when two services expose the same URL (gateway + upstream), `calls_api` enrichment no longer silently keeps only the last one.
142
+ - **Config tolerates sparse YAML** — `output:` / `wave:` / `semantic:` left empty no longer crash with `AttributeError`; a stray bare `-` under `projects:` raises a clean config error instead of a `TypeError`.
143
+ - **Language detection skips vendored dirs** — the fallback language vote prunes `node_modules` / `.git` / `dist`, so a Python repo with vendored JS is no longer detected as *javascript* (and discovery no longer crawls tens of thousands of vendored files).
144
+ - **Wiki links match their files** — link targets now use the exact same filename transform the generator writes with, so labels containing spaces, `#`, parentheses, or generics no longer produce dead links.
145
+ - Plus: deterministic enrichment edge order, a `None`-label build guard, a thread-safe extraction cache, FastAPI `Depends()` ghost refs removed, and Obsidian service-folder names byte-capped.
146
+
147
+ ---
148
+
149
+ ## What's new in 0.6.2
150
+
151
+ - **Deterministic community IDs** — equal-sized communities were numbered by partitioner enumeration order, churning 77–88 % of `beacon.json` on a no-op rescan; identical groupings now always get identical IDs.
152
+ - **Note filenames byte-capped** — an 85+-character CJK class name overflowed the 255-byte filesystem limit and crashed the whole wiki/Obsidian export with `ENAMETOOLONG`; capped at 200 UTF-8 bytes with a collision-safe hash suffix.
153
+ - **DI edges restored for FastAPI / Laravel / ASP.NET** — resolved `Depends()` / `bind()` / `AddScoped<>` references were keyed by file path while nodes are keyed by project, so the edges were silently dropped; they're remapped onto final node IDs now.
154
+ - **Interface → implementation DI revived** — `implements`/`extends` metadata was never populated by any extractor, so interface-typed injection never resolved; Spring, ASP.NET, NestJS, and Angular now wire it through.
155
+
156
+ ---
157
+
121
158
  ## What's new in 0.6.1
122
159
 
123
160
  Patch release — extraction correctness and reproducible output.
@@ -27,6 +27,43 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## Neu in 0.6.4
31
+
32
+ Deep-dive-Aufräumarbeit — Ausgaben landen dort, wo man nach ihnen sucht, plus zwei Bugs mit stillem Datenverlust, gefunden bei der Verifikation an einem Workspace mit 47 Projekten.
33
+
34
+ - **Deep-dive schreibt auf genau zwei Ebenen** — jede *Repo-Wurzel* (ein Verzeichnis mit eigenem `.git` oder `codebeacon.yaml`) und die *Scan-Wurzel*. Die Framework-Ordner eines Monorepos (`mono/landing`, `mono/server`) bekommen nicht mehr jeweils ein eigenes `.codebeacon/` + CLAUDE.md; ihr kombinierter Graph liegt unter `mono/.codebeacon/`, und die Scan-Wurzel trägt den vollständigen Workspace-Graphen, sodass jedes Projekt von einer Stelle aus auffindbar ist. Deep-dive *innerhalb* eines Monorepos auszuführen erzeugt jetzt eine einzige Wurzel-Ausgabe statt einer pro Unterordner.
35
+ - **Cache-Schlüssel sind nach Framework namespaced** — eine Repo-Gruppe teilt sich einen Cache, und ein Elternprojekt, das die Dateien eines verschachtelten Projekts zuerst durchlief (`desktop/` als sveltekit über `desktop/src-tauri`), vergiftete den Cache zuvor mit leeren Ergebnissen, die das verschachtelte Projekt (tauri) dann wiederverwendete — und so stillschweigend alle seine Routen und Entitäten verlor.
36
+ - **Grammatik-Lade-Race behoben** — zwei parallele Extraktions-Worker, die auf eine ungecachte tree-sitter-Grammatik trafen, bauten jeweils eine eigene `Language`-Instanz; die Dateien des unterlegenen Threads fielen anschließend durch einen Identitätscheck und extrahierten zu **nichts** — keine Warnung, kein Fehlereintrag, nur ein paar Dateien, denen bei großen Scans zufällig alle Routen fehlten. Der erste Ladevorgang ist jetzt auf eine einzige geteilte Instanz gelockt (über 20 aufeinanderfolgende Vollscans als stabil verifiziert).
37
+
38
+ ---
39
+
40
+ ## Neu in 0.6.3
41
+
42
+ Bugfix-Release — ein graphify-Paritätsaudit (Upstream 3.–10. Juni) plus ein unabhängiges Audit von codebeacons eigenem Code: **16 Fixes**, Ende-zu-Ende verifiziert mit einem `--deep-dive`-Workspace-Scan über 47 Projekte (5.226 Knoten / 8.715 Kanten).
43
+
44
+ - **Git-Hooks feuern jetzt überall** — der Post-Commit-Rebuild-Hook pinnt den installierenden Python-Interpreter ins Skript und löst sich per `subprocess` statt `nohup` vom Prozess, sodass er in GUI-Git-Clients (Sublime Merge, GitKraken), CI-Runnern und unter Windows funktioniert — Umgebungen, in denen der `codebeacon`-Launcher nicht auf dem `PATH` liegt und der alte Hook stillschweigend nichts tat. `codebeacon hook install` erneut ausführen, um den Fix zu übernehmen; der Merge-Driver wird auf dieselbe Weise gepinnt.
45
+ - **Auskommentierte JS/TS-Imports erzeugen keine Kanten mehr** — die Regex-Durchläufe für Barrel-Reexports und `require()` entfernen jetzt zuerst `//`- und `/* */`-Kommentare (string-literal-bewusst). Ein auskommentiertes `export * from './legacy'` erzeugte zuvor eine Phantomkante und falsche Importzyklen.
46
+ - **`from pkg import name` bindet das echte Ziel (Python)** — der Import-Extraktor erfasst nun die importierten Namen, sodass `from auth.services import UserService` auf den `UserService`-Knoten verlinkt und `from src.services import enricher` auf das Submodul. Zuvor wurde nur das letzte Segment des Modulpfads probiert, wodurch Testdateien unverbunden blieben. Aliase (`import x as y`) lösen zum wahren Symbolnamen auf.
47
+ - **„High-Impact Files" sind tatsächlich high-impact** — das Hub-Ranking (CLAUDE.md, `analyze`) zählte Import-*Fan-out* über das `source_file` der Kante (immer der Importeur), sodass Einstiegspunkte echte geteilte Module mit pro Knoten aufgeblähten Zahlen überholten („imported by 392 files" in einem 60-Dateien-Repo). Beide Kopien zählen jetzt distinkte importierende Dateien pro importierter Datei.
48
+ - **DI-`injects`-Kanten tragen echte Dateipfade** — aufgelöste Dependency-Injection-Kanten stempelten die Graphknoten-ID (`proj::Name`) in `source_file`; sie tragen jetzt die tatsächliche Datei des Quellknotens.
49
+ - **Verschachtelte Ktor-Routenpräfixe werden verkettet** — `route("/api") { route("/v1") { get("/users") } }` extrahiert `/api/v1/users`, statt jedes äußere Präfix zu verwerfen.
50
+ - **Routen mit gleichem Pfad matchen beide** — wenn zwei Services dieselbe URL exponieren (Gateway + Upstream), behält die `calls_api`-Anreicherung nicht mehr stillschweigend nur die letzte.
51
+ - **Konfiguration toleriert spärliches YAML** — leer gelassene `output:` / `wave:` / `semantic:` stürzen nicht mehr mit `AttributeError` ab; ein verirrter nackter `-` unter `projects:` löst einen sauberen Konfigurationsfehler statt eines `TypeError` aus.
52
+ - **Spracherkennung überspringt Vendor-Verzeichnisse** — die Fallback-Sprachabstimmung klammert `node_modules` / `.git` / `dist` aus, sodass ein Python-Repo mit vendored JS nicht mehr als *javascript* erkannt wird (und die Discovery nicht mehr Zehntausende Vendor-Dateien durchkriecht).
53
+ - **Wiki-Links passen zu ihren Dateien** — Link-Ziele verwenden jetzt exakt dieselbe Dateinamen-Transformation, mit der der Generator schreibt, sodass Labels mit Leerzeichen, `#`, Klammern oder Generics keine toten Links mehr erzeugen.
54
+ - Außerdem: deterministische Reihenfolge der Anreicherungskanten, ein Build-Guard gegen `None`-Labels, ein thread-sicherer Extraktions-Cache, FastAPI-`Depends()`-Geisterreferenzen entfernt und Obsidian-Service-Ordnernamen byte-begrenzt.
55
+
56
+ ---
57
+
58
+ ## Neu in 0.6.2
59
+
60
+ - **Deterministische Community-IDs** — gleich große Communities wurden nach der Enumerationsreihenfolge des Partitionierers nummeriert, was bei einem No-op-Rescan 77–88 % von `beacon.json` umwälzte; identische Gruppierungen erhalten jetzt immer identische IDs.
61
+ - **Notiz-Dateinamen byte-begrenzt** — ein über 85 Zeichen langer CJK-Klassenname sprengte das 255-Byte-Dateisystemlimit und ließ den gesamten Wiki-/Obsidian-Export mit `ENAMETOOLONG` abstürzen; jetzt bei 200 UTF-8-Bytes gekappt, mit kollisionssicherem Hash-Suffix.
62
+ - **DI-Kanten für FastAPI / Laravel / ASP.NET wiederhergestellt** — aufgelöste `Depends()`- / `bind()`- / `AddScoped<>`-Referenzen waren nach Dateipfad indiziert, während Knoten nach Projekt indiziert sind, sodass die Kanten stillschweigend verworfen wurden; sie werden jetzt auf die finalen Knoten-IDs umgemappt.
63
+ - **Interface-→-Implementierung-DI wiederbelebt** — `implements`/`extends`-Metadaten wurden von keinem Extraktor befüllt, sodass interface-typisierte Injektion nie aufgelöst wurde; Spring, ASP.NET, NestJS und Angular verdrahten sie jetzt durchgängig.
64
+
65
+ ---
66
+
30
67
  ## Neu in 0.6.1
31
68
 
32
69
  Patch-Release — Extraktionskorrektheit und reproduzierbare Ausgabe.
@@ -27,6 +27,43 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## Novedades en 0.6.4
31
+
32
+ Limpieza del deep-dive — las salidas aterrizan donde las buscas, más dos bugs de pérdida silenciosa de datos encontrados al verificarlo en un workspace de 47 proyectos.
33
+
34
+ - **El deep-dive escribe exactamente en dos niveles** — cada *raíz de repo* (un directorio con su propio `.git` o `codebeacon.yaml`) y la *raíz del escaneo*. Las carpetas de framework de un monorepo (`mono/landing`, `mono/server`) ya no generan cada una su propio `.codebeacon/` + CLAUDE.md; su grafo combinado vive en `mono/.codebeacon/`, y la raíz del escaneo lleva el grafo completo del workspace, así cualquier proyecto puede encontrarse desde un solo lugar. Ejecutar deep-dive *dentro* de un monorepo ahora produce una única salida raíz en lugar de una por subcarpeta.
35
+ - **Las claves de caché tienen namespace por framework** — un grupo de repos comparte una caché, y un proyecto padre que recorría primero los archivos de un proyecto anidado (`desktop/` como sveltekit sobre `desktop/src-tauri`) envenenaba la caché con resultados vacíos que el proyecto anidado (tauri) luego reutilizaba, perdiendo en silencio todas sus rutas y entidades.
36
+ - **Corregida la condición de carrera al cargar gramáticas** — dos workers de extracción en paralelo que tocaban una gramática de tree-sitter sin cachear construían cada uno su propia instancia de `Language`; los archivos del hilo perdedor fallaban entonces una comprobación de identidad y extraían **nada** — sin advertencia, sin registro de fallo, solo un par de archivos a los que aleatoriamente les faltaban todas sus rutas en escaneos grandes. La primera carga ahora está bloqueada a una única instancia compartida (verificada estable a lo largo de 20 escaneos completos consecutivos).
37
+
38
+ ---
39
+
40
+ ## Novedades en 0.6.3
41
+
42
+ Versión de corrección de errores — una auditoría de paridad con graphify (upstream 3–10 de junio) más una auditoría independiente del propio código de codebeacon: **16 correcciones**, verificadas de extremo a extremo con un escaneo de workspace `--deep-dive` de 47 proyectos (5.226 nodos / 8.715 aristas).
43
+
44
+ - **Los hooks de git ahora se disparan en todas partes** — el hook de reconstrucción post-commit fija el intérprete de Python que hizo la instalación dentro del script y se desacopla vía `subprocess` en lugar de `nohup`, así funciona en clientes git con GUI (Sublime Merge, GitKraken), runners de CI y en Windows — entornos donde el lanzador `codebeacon` no está en el `PATH` y el hook antiguo no hacía nada en silencio. Vuelve a ejecutar `codebeacon hook install` para recoger la corrección; el merge driver se fija de la misma manera.
45
+ - **Los imports JS/TS comentados ya no crean aristas** — las pasadas de regex de re-exports barrel y `require()` ahora eliminan primero los comentarios `//` y `/* */` (con conciencia de literales de cadena). Un `export * from './legacy'` comentado producía una arista fantasma y falsos ciclos de import.
46
+ - **`from pkg import name` enlaza al objetivo real (Python)** — el extractor de imports ahora captura los nombres importados, así `from auth.services import UserService` enlaza al nodo `UserService` y `from src.services import enricher` enlaza al submódulo. Antes solo se probaba el último segmento de la ruta del módulo, dejando los archivos de test desconectados. Los alias (`import x as y`) se resuelven al nombre real del símbolo.
47
+ - **"High-Impact Files" es realmente de alto impacto** — el ranking de hubs (CLAUDE.md, `analyze`) contaba el *fan-out* de imports vía el `source_file` de la arista (siempre el importador), así los puntos de entrada superaban a los módulos compartidos reales con recuentos inflados por nodo ("imported by 392 files" en un repo de 60 archivos). Ambas copias ahora cuentan archivos importadores distintos por archivo importado.
48
+ - **Las aristas `injects` de DI llevan rutas de archivo reales** — las aristas de inyección de dependencias resueltas estampaban el ID del nodo del grafo (`proj::Name`) en `source_file`; ahora llevan el archivo real del nodo de origen.
49
+ - **Los prefijos de rutas anidadas de Ktor se concatenan** — `route("/api") { route("/v1") { get("/users") } }` extrae `/api/v1/users` en lugar de descartar todos los prefijos exteriores.
50
+ - **Las rutas con la misma URL coinciden ambas** — cuando dos servicios exponen la misma URL (gateway + upstream), el enriquecimiento `calls_api` ya no conserva en silencio solo la última.
51
+ - **La configuración tolera YAML escaso** — dejar vacíos `output:` / `wave:` / `semantic:` ya no provoca un `AttributeError`; un `-` suelto bajo `projects:` lanza un error de configuración limpio en lugar de un `TypeError`.
52
+ - **La detección de lenguaje omite directorios vendorizados** — el voto de lenguaje de respaldo poda `node_modules` / `.git` / `dist`, así un repo Python con JS vendorizado ya no se detecta como *javascript* (y el descubrimiento ya no rastrea decenas de miles de archivos vendorizados).
53
+ - **Los enlaces del wiki coinciden con sus archivos** — los destinos de los enlaces ahora usan exactamente la misma transformación de nombre de archivo con la que escribe el generador, así las etiquetas con espacios, `#`, paréntesis o genéricos ya no producen enlaces muertos.
54
+ - Además: orden determinista de las aristas de enriquecimiento, una guarda de build contra etiquetas `None`, una caché de extracción segura entre hilos, referencias fantasma de `Depends()` de FastAPI eliminadas, y nombres de carpetas de servicios de Obsidian limitados en bytes.
55
+
56
+ ---
57
+
58
+ ## Novedades en 0.6.2
59
+
60
+ - **IDs de comunidad deterministas** — las comunidades del mismo tamaño se numeraban según el orden de enumeración del particionador, removiendo el 77–88 % de `beacon.json` en un re-escaneo sin cambios; agrupaciones idénticas ahora reciben siempre IDs idénticos.
61
+ - **Nombres de archivo de notas limitados en bytes** — un nombre de clase CJK de más de 85 caracteres desbordaba el límite de 255 bytes del sistema de archivos y hacía fallar toda la exportación wiki/Obsidian con `ENAMETOOLONG`; ahora se limita a 200 bytes UTF-8 con un sufijo hash a prueba de colisiones.
62
+ - **Aristas de DI restauradas para FastAPI / Laravel / ASP.NET** — las referencias resueltas de `Depends()` / `bind()` / `AddScoped<>` se indexaban por ruta de archivo mientras los nodos se indexan por proyecto, así las aristas se descartaban en silencio; ahora se remapean a los IDs finales de los nodos.
63
+ - **DI interfaz → implementación revivida** — los metadatos `implements`/`extends` nunca eran poblados por ningún extractor, así la inyección tipada por interfaz nunca se resolvía; Spring, ASP.NET, NestJS y Angular ahora la conectan de extremo a extremo.
64
+
65
+ ---
66
+
30
67
  ## Novedades en 0.6.1
31
68
 
32
69
  Versión de parche — corrección de extracción y salida reproducible.
@@ -27,6 +27,43 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## Nouveautés en 0.6.4
31
+
32
+ Nettoyage du deep-dive — les sorties atterrissent là où vous les cherchez, plus deux bugs de perte silencieuse de données trouvés en le vérifiant sur un workspace de 47 projets.
33
+
34
+ - **Le deep-dive écrit exactement à deux niveaux** — chaque *racine de dépôt* (un répertoire avec son propre `.git` ou `codebeacon.yaml`) et la *racine du scan*. Les dossiers framework d'un monorepo (`mono/landing`, `mono/server`) ne reçoivent plus chacun leur propre `.codebeacon/` + CLAUDE.md ; leur graphe combiné vit dans `mono/.codebeacon/`, et la racine du scan porte le graphe complet du workspace, donc n'importe quel projet se trouve depuis un seul endroit. Lancer le deep-dive *à l'intérieur* d'un monorepo produit désormais une seule sortie racine au lieu d'une par sous-dossier.
35
+ - **Les clés de cache sont namespacées par framework** — un groupe de dépôts partage un seul cache, et un projet parent parcourant en premier les fichiers d'un projet imbriqué (`desktop/` comme sveltekit au-dessus de `desktop/src-tauri`) empoisonnait auparavant le cache avec des résultats vides que le projet imbriqué (tauri) réutilisait ensuite, perdant silencieusement toutes ses routes et entités.
36
+ - **Course au chargement des grammaires corrigée** — deux workers d'extraction parallèles touchant une grammaire tree-sitter non mise en cache construisaient chacun leur propre instance `Language` ; les fichiers du thread perdant échouaient alors à une vérification d'identité et n'extrayaient **rien** — aucun avertissement, aucun enregistrement d'échec, juste quelques fichiers auxquels il manquait aléatoirement toutes leurs routes sur les gros scans. Le premier chargement est désormais verrouillé sur une seule instance partagée (vérifié stable sur 20 scans complets consécutifs).
37
+
38
+ ---
39
+
40
+ ## Nouveautés en 0.6.3
41
+
42
+ Version de correction de bugs — un audit de parité avec graphify (upstream 3–10 juin) plus un audit indépendant du propre code de codebeacon : **16 correctifs**, vérifiés de bout en bout avec un scan de workspace `--deep-dive` sur 47 projets (5 226 nœuds / 8 715 arêtes).
43
+
44
+ - **Les hooks git se déclenchent désormais partout** — le hook de reconstruction post-commit épingle dans le script l'interpréteur Python ayant servi à l'installation et se détache via `subprocess` plutôt que `nohup`, donc il fonctionne dans les clients git graphiques (Sublime Merge, GitKraken), les runners CI et sous Windows — des environnements où le lanceur `codebeacon` n'est pas sur le `PATH` et où l'ancien hook ne faisait silencieusement rien. Relancez `codebeacon hook install` pour récupérer le correctif ; le merge driver est épinglé de la même manière.
45
+ - **Les imports JS/TS commentés ne créent plus d'arêtes** — les passes regex des re-exports barrel et de `require()` retirent désormais d'abord les commentaires `//` et `/* */` (en tenant compte des littéraux de chaîne). Un `export * from './legacy'` commenté produisait auparavant une arête fantôme et de faux cycles d'import.
46
+ - **`from pkg import name` lie la vraie cible (Python)** — l'extracteur d'imports capture désormais les noms importés, donc `from auth.services import UserService` pointe vers le nœud `UserService` et `from src.services import enricher` vers le sous-module. Auparavant, seul le dernier segment du chemin de module était essayé, laissant les fichiers de test déconnectés. Les alias (`import x as y`) se résolvent vers le vrai nom de symbole.
47
+ - **« High-Impact Files » est vraiment à fort impact** — le classement des hubs (CLAUDE.md, `analyze`) comptait le *fan-out* d'imports via le `source_file` de l'arête (toujours l'importateur), donc les points d'entrée devançaient les vrais modules partagés avec des décomptes gonflés par nœud (« imported by 392 files » dans un dépôt de 60 fichiers). Les deux copies comptent désormais les fichiers importateurs distincts par fichier importé.
48
+ - **Les arêtes `injects` de DI portent de vrais chemins de fichiers** — les arêtes d'injection de dépendances résolues estampillaient l'ID du nœud de graphe (`proj::Name`) dans `source_file` ; elles portent désormais le vrai fichier du nœud source.
49
+ - **Les préfixes de routes Ktor imbriquées se concatènent** — `route("/api") { route("/v1") { get("/users") } }` extrait `/api/v1/users` au lieu d'abandonner chaque préfixe extérieur.
50
+ - **Les routes au même chemin correspondent toutes les deux** — quand deux services exposent la même URL (gateway + upstream), l'enrichissement `calls_api` ne conserve plus silencieusement uniquement la dernière.
51
+ - **La configuration tolère le YAML clairsemé** — `output:` / `wave:` / `semantic:` laissés vides ne plantent plus avec `AttributeError` ; un `-` nu égaré sous `projects:` lève une erreur de configuration propre au lieu d'un `TypeError`.
52
+ - **La détection de langage saute les répertoires vendorés** — le vote de langage de repli élague `node_modules` / `.git` / `dist`, donc un dépôt Python avec du JS vendoré n'est plus détecté comme *javascript* (et la découverte ne parcourt plus des dizaines de milliers de fichiers vendorés).
53
+ - **Les liens du wiki correspondent à leurs fichiers** — les cibles de liens utilisent désormais exactement la même transformation de nom de fichier que celle avec laquelle le générateur écrit, donc les libellés contenant des espaces, `#`, des parenthèses ou des génériques ne produisent plus de liens morts.
54
+ - Et aussi : ordre déterministe des arêtes d'enrichissement, un garde de build contre les libellés `None`, un cache d'extraction thread-safe, les références fantômes `Depends()` de FastAPI supprimées, et les noms de dossiers de services Obsidian plafonnés en octets.
55
+
56
+ ---
57
+
58
+ ## Nouveautés en 0.6.2
59
+
60
+ - **IDs de communauté déterministes** — les communautés de taille égale étaient numérotées selon l'ordre d'énumération du partitionneur, brassant 77–88 % de `beacon.json` lors d'un re-scan sans changement ; des regroupements identiques reçoivent désormais toujours des IDs identiques.
61
+ - **Noms de fichiers de notes plafonnés en octets** — un nom de classe CJK de plus de 85 caractères dépassait la limite de 255 octets du système de fichiers et faisait planter tout l'export wiki/Obsidian avec `ENAMETOOLONG` ; plafonné à 200 octets UTF-8 avec un suffixe de hachage anti-collision.
62
+ - **Arêtes de DI restaurées pour FastAPI / Laravel / ASP.NET** — les références résolues `Depends()` / `bind()` / `AddScoped<>` étaient indexées par chemin de fichier alors que les nœuds sont indexés par projet, donc les arêtes étaient silencieusement abandonnées ; elles sont désormais remappées sur les IDs finaux des nœuds.
63
+ - **DI interface → implémentation ressuscitée** — les métadonnées `implements`/`extends` n'étaient renseignées par aucun extracteur, donc l'injection typée par interface ne se résolvait jamais ; Spring, ASP.NET, NestJS et Angular les câblent désormais de bout en bout.
64
+
65
+ ---
66
+
30
67
  ## Nouveautés en 0.6.1
31
68
 
32
69
  Version corrective — exactitude de l'extraction et sortie reproductible.
@@ -27,6 +27,43 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## 0.6.4 の新機能
31
+
32
+ Deep-dive のクリーンアップ — 出力が探す場所に置かれるようになり、47 プロジェクトのワークスペースで検証中に見つかったサイレントなデータ損失バグ 2 件を修正。
33
+
34
+ - **Deep-dive はちょうど二つのレベルにのみ書き込む** — 各*リポジトリルート*(自身の `.git` または `codebeacon.yaml` を持つディレクトリ)と*スキャンルート*です。モノレポのフレームワークフォルダ(`mono/landing`、`mono/server`)がそれぞれ `.codebeacon/` + CLAUDE.md を抱え込むことはなくなり、結合グラフは `mono/.codebeacon/` に置かれ、スキャンルートがワークスペース全体のグラフを持つため、どのプロジェクトも一箇所から見つけられます。モノレポの*内部*で deep-dive を実行すると、サブフォルダごとに一つずつではなく単一のルート出力が生成されます。
35
+ - **キャッシュキーがフレームワークで名前空間化** — リポジトリグループは一つのキャッシュを共有しますが、親プロジェクトがネストしたプロジェクトのファイルを先に走査すると(`desktop/src-tauri` の上を sveltekit として歩く `desktop/`)、空の結果でキャッシュを汚染し、ネストしたプロジェクト(tauri)がそれを再利用して、自身の route とエンティティをすべて黙って失っていました。
36
+ - **文法ロードの競合を修正** — キャッシュされていない tree-sitter 文法に並列の抽出ワーカー二つが同時に到達すると、それぞれが自前の `Language` インスタンスを構築し、負けたスレッドのファイルはアイデンティティチェックに失敗して**何も**抽出されませんでした — 警告も失敗記録もなく、大規模スキャンで数ファイルの route がランダムに丸ごと欠落するだけでした。初回ロードは単一の共有インスタンスにロックされるようになりました(連続 20 回のフルスキャンで安定を確認済み)。
37
+
38
+ ---
39
+
40
+ ## 0.6.3 の新機能
41
+
42
+ バグ修正リリース — graphify-parity 監査(上流 6 月 3–10 日)に codebeacon 自身のコードの独立監査を加えた **16 件の修正**。47 プロジェクトの `--deep-dive` ワークスペーススキャン(5,226 ノード / 8,715 エッジ)でエンドツーエンド検証済み。
43
+
44
+ - **Git フックがどこでも発火** — post-commit 再ビルドフックがインストール時の Python インタープリタをスクリプトに固定し、`nohup` の代わりに `subprocess` でデタッチするため、GUI の git クライアント(Sublime Merge、GitKraken)、CI ランナー、Windows といった、`codebeacon` ランチャーが `PATH` に無く旧フックが黙って何もしなかった環境でも動作します。`codebeacon hook install` を再実行すると修正が反映され、merge driver も同じ方式で固定されます。
45
+ - **コメントアウトされた JS/TS import がエッジを作らない** — バレル re-export と `require()` の正規表現パスが、先に `//` と `/* */` コメントを(文字列リテラルを認識した上で)除去します。コメントアウトされた `export * from './legacy'` がファントムエッジと偽の import 循環を生んでいました。
46
+ - **`from pkg import name` が本来のターゲットに結び付く(Python)** — import 抽出器が import された名前を捕捉するようになり、`from auth.services import UserService` は `UserService` ノードへ、`from src.services import enricher` はサブモジュールへリンクします。従来はモジュールパスの最終セグメントしか試さず、テストファイルがグラフから切り離されていました。エイリアス(`import x as y`)は真のシンボル名に解決されます。
47
+ - **「High-Impact Files」が本当に high-impact に** — ハブランキング(CLAUDE.md、`analyze`)がエッジの `source_file`(常に import する側)経由で import の*ファンアウト*を数えていたため、エントリポイントがノード単位で水増しされたカウント(60 ファイルのリポジトリで「imported by 392 files」)で本物の共有モジュールを押しのけていました。両方のコピーが、import されるファイルごとに重複しない import 元ファイル数を数えるようになりました。
48
+ - **DI `injects` エッジが実ファイルパスを持つ** — 解決済みの dependency-injection エッジが `source_file` にグラフノード ID(`proj::Name`)を刻んでいましたが、ソースノードの実際のファイルを持つようになりました。
49
+ - **Ktor のネストした route プレフィックスが連結される** — `route("/api") { route("/v1") { get("/users") } }` が外側のプレフィックスをすべて落とす代わりに `/api/v1/users` を抽出します。
50
+ - **同一パスのルートが両方マッチ** — 二つのサービスが同じ URL を公開する場合(gateway + upstream)、`calls_api` エンリッチメントが最後の一つだけを黙って残すことはなくなりました。
51
+ - **設定がスパースな YAML を許容** — `output:` / `wave:` / `semantic:` を空のままにしても `AttributeError` でクラッシュしません。`projects:` 配下の裸の `-` は `TypeError` ではなく明確な設定エラーになります。
52
+ - **言語検出が vendored ディレクトリをスキップ** — フォールバックの言語投票が `node_modules` / `.git` / `dist` を除外するため、vendored な JS を含む Python リポジトリが *javascript* と判定されません(discovery が数万の vendored ファイルをクロールすることもなくなりました)。
53
+ - **wiki リンクがファイルと一致** — リンク先がジェネレータの書き出しと完全に同じファイル名変換を使うため、スペース、`#`、括弧、ジェネリクスを含むラベルがデッドリンクを生まなくなりました。
54
+ - さらに: 決定的なエンリッチメントエッジ順序、`None` ラベルのビルドガード、スレッドセーフな抽出キャッシュ、FastAPI `Depends()` のゴースト参照の除去、Obsidian サービスフォルダ名のバイト上限。
55
+
56
+ ---
57
+
58
+ ## 0.6.2 の新機能
59
+
60
+ - **決定的なコミュニティ ID** — 同サイズのコミュニティがパーティショナーの列挙順で番号付けされ、no-op の再スキャンで `beacon.json` の 77–88 % が入れ替わっていました。同一のグルーピングは常に同一の ID を得るようになりました。
61
+ - **ノートファイル名のバイト上限** — 85 文字超の CJK クラス名がファイルシステムの 255 バイト制限を超え、`ENAMETOOLONG` で wiki / Obsidian エクスポート全体をクラッシュさせていました。UTF-8 200 バイトで上限を設け、衝突安全なハッシュサフィックスを付与します。
62
+ - **FastAPI / Laravel / ASP.NET の DI エッジを復旧** — 解決済みの `Depends()` / `bind()` / `AddScoped<>` 参照がファイルパスでキー付けされる一方、ノードはプロジェクトでキー付けされていたため、エッジが黙って捨てられていました。最終ノード ID へ再マップされます。
63
+ - **インターフェース → 実装の DI を復活** — `implements`/`extends` メタデータをどの抽出器も埋めておらず、インターフェース型の注入が一切解決されませんでした。Spring、ASP.NET、NestJS、Angular で配線されるようになりました。
64
+
65
+ ---
66
+
30
67
  ## 0.6.1 の新機能
31
68
 
32
69
  パッチリリース — 抽出の正確性と再現可能な出力。
@@ -27,6 +27,43 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## 0.6.4 새 소식
31
+
32
+ Deep-dive 정리 — 출력물이 찾아보는 곳에 생성되도록 정돈하고, 47개 프로젝트 워크스페이스에서 이를 검증하던 중 발견한 조용한 데이터 손실 버그 2건 수정.
33
+
34
+ - **Deep-dive가 정확히 두 레벨에만 기록** — 각 *레포 루트*(자체 `.git` 또는 `codebeacon.yaml`이 있는 디렉토리)와 *스캔 루트*. 모노레포의 프레임워크 폴더(`mono/landing`, `mono/server`)마다 `.codebeacon/` + CLAUDE.md가 늘어나지 않으며, 이들의 통합 그래프는 `mono/.codebeacon/`에 위치하고 스캔 루트가 전체 워크스페이스 그래프를 담아 어떤 프로젝트든 한 곳에서 찾을 수 있습니다. 모노레포 *내부*에서 deep-dive를 실행하면 이제 서브폴더마다 하나씩이 아니라 단일 루트 출력이 생성됩니다.
35
+ - **캐시 키가 프레임워크로 네임스페이스됨** — 레포 그룹은 하나의 캐시를 공유하는데, 부모 프로젝트가 중첩 프로젝트의 파일을 먼저 순회하면(`desktop/src-tauri` 위를 sveltekit으로 도는 `desktop/`) 빈 결과로 캐시를 오염시키고, 중첩 프로젝트(tauri)가 이를 재사용해 자신의 route와 엔티티를 전부 조용히 잃었습니다.
36
+ - **Grammar 로드 race 수정** — 캐시되지 않은 tree-sitter grammar에 병렬 추출 워커 둘이 동시에 도달하면 각자 자신의 `Language` 인스턴스를 만들었고, 진 쪽 스레드의 파일은 identity 체크에 실패해 **아무것도** 추출하지 못했습니다 — 경고도, 실패 기록도 없이 큰 스캔에서 파일 몇 개가 무작위로 route를 전부 잃었습니다. 첫 로드는 이제 단일 공유 인스턴스로 잠깁니다(연속 20회 전체 스캔에서 안정성 검증).
37
+
38
+ ---
39
+
40
+ ## 0.6.3 새 소식
41
+
42
+ 버그 수정 릴리스 — graphify-parity 감사(업스트림 6월 3–10일)에 codebeacon 자체 코드에 대한 독립 감사를 더해 **16건 수정**, 47개 프로젝트 `--deep-dive` 워크스페이스 스캔(노드 5,226 / 엣지 8,715)으로 end-to-end 검증.
43
+
44
+ - **Git hook이 어디서나 동작** — post-commit 재빌드 hook이 설치 시점의 Python 인터프리터를 스크립트에 고정하고 `nohup` 대신 `subprocess`로 detach하므로, GUI git 클라이언트(Sublime Merge, GitKraken)·CI 러너·Windows처럼 `codebeacon` 런처가 `PATH`에 없어 기존 hook이 조용히 아무것도 하지 않던 환경에서도 동작합니다. `codebeacon hook install`을 다시 실행하면 수정이 적용되며, merge driver도 같은 방식으로 고정됩니다.
45
+ - **주석 처리된 JS/TS import가 더 이상 엣지를 만들지 않음** — 배럴 re-export와 `require()` 정규식 패스가 먼저 `//`·`/* */` 주석을 (문자열 리터럴을 인식하며) 제거합니다. 주석 처리된 `export * from './legacy'`가 phantom 엣지와 가짜 import 순환을 만들던 문제 해결.
46
+ - **`from pkg import name`이 실제 대상에 바인딩 (Python)** — import 추출기가 import된 이름을 캡처하므로 `from auth.services import UserService`는 `UserService` 노드로, `from src.services import enricher`는 서브모듈로 연결됩니다. 이전엔 모듈 경로의 마지막 세그먼트만 시도해 테스트 파일이 그래프에서 끊겨 있었습니다. 별칭(`import x as y`)은 실제 심볼 이름으로 해석됩니다.
47
+ - **"High-Impact Files"가 진짜 high-impact** — hub 랭킹(CLAUDE.md, `analyze`)이 엣지의 `source_file`(항상 import하는 쪽)로 import *fan-out*을 세는 바람에, 엔트리 포인트가 노드 단위로 부풀려진 수치(60개 파일 레포에서 "imported by 392 files")로 진짜 공유 모듈을 제쳤습니다. 두 사본 모두 import되는 파일별로 고유한 import하는 파일 수를 셉니다.
48
+ - **DI `injects` 엣지가 실제 파일 경로를 가짐** — 해석된 dependency-injection 엣지가 `source_file`에 그래프 노드 ID(`proj::Name`)를 찍던 문제 수정 → 이제 소스 노드의 실제 파일을 담습니다.
49
+ - **Ktor 중첩 route prefix 연결** — `route("/api") { route("/v1") { get("/users") } }`가 바깥 prefix를 전부 버리는 대신 `/api/v1/users`를 추출합니다.
50
+ - **같은 경로의 route가 모두 매칭** — 두 서비스가 같은 URL을 노출할 때(gateway + upstream), `calls_api` enrichment가 마지막 하나만 조용히 남기지 않습니다.
51
+ - **희소한 YAML 설정 허용** — `output:` / `wave:` / `semantic:`을 비워 둬도 `AttributeError`로 크래시하지 않고, `projects:` 아래 떠도는 bare `-`는 `TypeError` 대신 깔끔한 설정 에러를 냅니다.
52
+ - **언어 감지가 vendored 디렉토리 스킵** — 폴백 언어 투표가 `node_modules` / `.git` / `dist`를 제외 → vendored JS가 있는 Python 레포가 *javascript*로 감지되지 않음(그리고 discovery가 수만 개의 vendored 파일을 크롤하지 않음).
53
+ - **wiki 링크가 파일과 일치** — 링크 대상이 생성기가 파일을 쓸 때와 정확히 같은 파일명 변환을 사용 → 공백, `#`, 괄호, 제네릭이 포함된 라벨이 깨진 링크를 만들지 않음.
54
+ - 추가: 결정적 enrichment 엣지 순서, `None` 라벨 빌드 가드, 스레드 안전 추출 캐시, FastAPI `Depends()` ghost ref 제거, Obsidian 서비스 폴더명 byte 상한.
55
+
56
+ ---
57
+
58
+ ## 0.6.2 새 소식
59
+
60
+ - **결정적 community ID** — 같은 크기의 community가 partitioner 열거 순서로 번호를 받아 no-op 재스캔에서 `beacon.json`의 77–88 %가 뒤바뀌던 문제 수정; 동일한 그룹은 이제 항상 동일한 ID를 받습니다.
61
+ - **노트 파일명 byte 상한** — 85자 이상의 CJK 클래스명이 파일시스템 255바이트 한계를 넘어 `ENAMETOOLONG`으로 wiki/Obsidian 내보내기 전체를 크래시시키던 문제; UTF-8 200바이트로 캡하고 충돌 안전 해시 접미사를 붙입니다.
62
+ - **FastAPI / Laravel / ASP.NET DI 엣지 복구** — 해석된 `Depends()` / `bind()` / `AddScoped<>` 참조가 파일 경로로 키잉된 반면 노드는 프로젝트로 키잉되어 엣지가 조용히 버려졌습니다; 이제 최종 노드 ID로 리매핑됩니다.
63
+ - **인터페이스 → 구현 DI 부활** — `implements`/`extends` 메타데이터를 어떤 추출기도 채우지 않아 인터페이스 타입 주입이 전혀 해석되지 않았습니다; Spring, ASP.NET, NestJS, Angular가 이제 이를 연결합니다.
64
+
65
+ ---
66
+
30
67
  ## 0.6.1 새 소식
31
68
 
32
69
  패치 릴리스 — 추출 정확성과 재현 가능한 출력.
@@ -25,6 +25,43 @@
25
25
 
26
26
  ---
27
27
 
28
+ ## What's new in 0.6.4
29
+
30
+ Deep-dive cleanup — outputs land where you look for them, and two silent-data-loss bugs found while verifying it on a 47-project workspace.
31
+
32
+ - **Deep-dive writes to exactly two levels** — each *repo root* (a directory with its own `.git` or `codebeacon.yaml`) and the *scan root*. A monorepo's framework folders (`mono/landing`, `mono/server`) no longer each grow a `.codebeacon/` + CLAUDE.md; their combined graph lives at `mono/.codebeacon/`, and the scan root carries the full workspace graph so any project can be found from one place. Running deep-dive *inside* a monorepo now produces a single root output instead of one per subfolder.
33
+ - **Cache keys are framework-namespaced** — a repo group shares one cache, and a parent project walking over a nested project's files first (`desktop/` as sveltekit over `desktop/src-tauri`) used to poison the cache with empty results that the nested project (tauri) then reused, silently dropping all of its routes and entities.
34
+ - **Grammar-load race fixed** — two parallel extraction workers hitting an uncached tree-sitter grammar each built their own `Language` instance; the losing thread's files then failed an identity check and extracted to **nothing** — no warning, no failure record, just a couple of files randomly missing all their routes on big scans. First load is now locked to a single shared instance (verified stable across 20 consecutive full scans).
35
+
36
+ ---
37
+
38
+ ## What's new in 0.6.3
39
+
40
+ Bug-fix release — a graphify-parity audit (upstream Jun 3–10) plus an independent audit of codebeacon's own code: **16 fixes**, verified end-to-end with a 47-project `--deep-dive` workspace scan (5,226 nodes / 8,715 edges).
41
+
42
+ - **Git hooks now fire everywhere** — the post-commit rebuild hook pins the installing Python interpreter into the script and detaches via `subprocess` instead of `nohup`, so it works in GUI git clients (Sublime Merge, GitKraken), CI runners, and on Windows — environments where the `codebeacon` launcher isn't on `PATH` and the old hook silently did nothing. Re-run `codebeacon hook install` to pick up the fix; the merge driver is pinned the same way.
43
+ - **Commented-out JS/TS imports no longer create edges** — the barrel re-export and `require()` regex passes now strip `//` and `/* */` comments (string-literal aware) first. A commented `export * from './legacy'` used to produce a phantom edge and false import cycles.
44
+ - **`from pkg import name` binds the real target (Python)** — the import extractor now captures the imported names, so `from auth.services import UserService` links to the `UserService` node and `from src.services import enricher` links to the submodule. Previously only the module path's last segment was tried, leaving test files disconnected. Aliases (`import x as y`) resolve to the true symbol name.
45
+ - **"High-Impact Files" is actually high-impact** — the hub ranking (CLAUDE.md, `analyze`) counted import *fan-out* via the edge's `source_file` (always the importer), so entry points outranked real shared modules with per-node-inflated counts ("imported by 392 files" in a 60-file repo). Both copies now count distinct importing files per imported file.
46
+ - **DI `injects` edges carry real file paths** — resolved dependency-injection edges stamped the graph node ID (`proj::Name`) into `source_file`; they now carry the source node's actual file.
47
+ - **Ktor nested route prefixes concatenate** — `route("/api") { route("/v1") { get("/users") } }` extracts `/api/v1/users` instead of dropping every outer prefix.
48
+ - **Same-path routes both matched** — when two services expose the same URL (gateway + upstream), `calls_api` enrichment no longer silently keeps only the last one.
49
+ - **Config tolerates sparse YAML** — `output:` / `wave:` / `semantic:` left empty no longer crash with `AttributeError`; a stray bare `-` under `projects:` raises a clean config error instead of a `TypeError`.
50
+ - **Language detection skips vendored dirs** — the fallback language vote prunes `node_modules` / `.git` / `dist`, so a Python repo with vendored JS is no longer detected as *javascript* (and discovery no longer crawls tens of thousands of vendored files).
51
+ - **Wiki links match their files** — link targets now use the exact same filename transform the generator writes with, so labels containing spaces, `#`, parentheses, or generics no longer produce dead links.
52
+ - Plus: deterministic enrichment edge order, a `None`-label build guard, a thread-safe extraction cache, FastAPI `Depends()` ghost refs removed, and Obsidian service-folder names byte-capped.
53
+
54
+ ---
55
+
56
+ ## What's new in 0.6.2
57
+
58
+ - **Deterministic community IDs** — equal-sized communities were numbered by partitioner enumeration order, churning 77–88 % of `beacon.json` on a no-op rescan; identical groupings now always get identical IDs.
59
+ - **Note filenames byte-capped** — an 85+-character CJK class name overflowed the 255-byte filesystem limit and crashed the whole wiki/Obsidian export with `ENAMETOOLONG`; capped at 200 UTF-8 bytes with a collision-safe hash suffix.
60
+ - **DI edges restored for FastAPI / Laravel / ASP.NET** — resolved `Depends()` / `bind()` / `AddScoped<>` references were keyed by file path while nodes are keyed by project, so the edges were silently dropped; they're remapped onto final node IDs now.
61
+ - **Interface → implementation DI revived** — `implements`/`extends` metadata was never populated by any extractor, so interface-typed injection never resolved; Spring, ASP.NET, NestJS, and Angular now wire it through.
62
+
63
+ ---
64
+
28
65
  ## What's new in 0.6.1
29
66
 
30
67
  Patch release — extraction correctness and reproducible output.
@@ -27,6 +27,43 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## Novidades na 0.6.4
31
+
32
+ Limpeza do deep-dive — as saídas caem onde você procura por elas, mais dois bugs de perda silenciosa de dados encontrados ao verificá-lo num workspace de 47 projetos.
33
+
34
+ - **O deep-dive escreve em exatamente dois níveis** — cada *raiz de repo* (um diretório com seu próprio `.git` ou `codebeacon.yaml`) e a *raiz do escaneamento*. As pastas de framework de um monorepo (`mono/landing`, `mono/server`) não ganham mais cada uma seu próprio `.codebeacon/` + CLAUDE.md; o grafo combinado delas vive em `mono/.codebeacon/`, e a raiz do escaneamento carrega o grafo completo do workspace, então qualquer projeto pode ser encontrado a partir de um só lugar. Rodar o deep-dive *dentro* de um monorepo agora produz uma única saída raiz em vez de uma por subpasta.
35
+ - **Chaves de cache têm namespace por framework** — um grupo de repos compartilha um cache, e um projeto pai que percorria primeiro os arquivos de um projeto aninhado (`desktop/` como sveltekit sobre `desktop/src-tauri`) envenenava o cache com resultados vazios que o projeto aninhado (tauri) depois reutilizava, descartando silenciosamente todas as suas rotas e entidades.
36
+ - **Corrida no carregamento de gramáticas corrigida** — dois workers de extração em paralelo encontrando uma gramática tree-sitter sem cache construíam cada um sua própria instância de `Language`; os arquivos da thread perdedora então falhavam numa checagem de identidade e extraíam **nada** — sem aviso, sem registro de falha, só alguns arquivos aleatoriamente sem todas as suas rotas em escaneamentos grandes. O primeiro carregamento agora está travado numa única instância compartilhada (verificado estável ao longo de 20 escaneamentos completos consecutivos).
37
+
38
+ ---
39
+
40
+ ## Novidades na 0.6.3
41
+
42
+ Versão de correção de bugs — uma auditoria de paridade com o graphify (upstream 3–10 de junho) mais uma auditoria independente do próprio código do codebeacon: **16 correções**, verificadas de ponta a ponta com um escaneamento de workspace `--deep-dive` de 47 projetos (5.226 nós / 8.715 arestas).
43
+
44
+ - **Hooks de git agora disparam em todo lugar** — o hook de reconstrução pós-commit fixa o interpretador Python usado na instalação dentro do script e se desacopla via `subprocess` em vez de `nohup`, então funciona em clientes git com GUI (Sublime Merge, GitKraken), runners de CI e no Windows — ambientes onde o lançador `codebeacon` não está no `PATH` e o hook antigo silenciosamente não fazia nada. Rode `codebeacon hook install` de novo para pegar a correção; o merge driver é fixado da mesma forma.
45
+ - **Imports JS/TS comentados não criam mais arestas** — as passadas de regex de re-exports barrel e `require()` agora removem primeiro os comentários `//` e `/* */` (cientes de literais de string). Um `export * from './legacy'` comentado produzia uma aresta fantasma e falsos ciclos de import.
46
+ - **`from pkg import name` vincula o alvo real (Python)** — o extrator de imports agora captura os nomes importados, então `from auth.services import UserService` liga ao nó `UserService` e `from src.services import enricher` liga ao submódulo. Antes só o último segmento do caminho do módulo era tentado, deixando arquivos de teste desconectados. Aliases (`import x as y`) resolvem para o nome real do símbolo.
47
+ - **"High-Impact Files" é de alto impacto de verdade** — o ranking de hubs (CLAUDE.md, `analyze`) contava o *fan-out* de imports via o `source_file` da aresta (sempre o importador), então pontos de entrada superavam módulos compartilhados reais com contagens infladas por nó ("imported by 392 files" num repo de 60 arquivos). Ambas as cópias agora contam arquivos importadores distintos por arquivo importado.
48
+ - **Arestas `injects` de DI carregam caminhos de arquivo reais** — arestas de injeção de dependência resolvidas carimbavam o ID do nó do grafo (`proj::Name`) em `source_file`; agora carregam o arquivo real do nó de origem.
49
+ - **Prefixos de rotas aninhadas do Ktor são concatenados** — `route("/api") { route("/v1") { get("/users") } }` extrai `/api/v1/users` em vez de descartar todos os prefixos externos.
50
+ - **Rotas com o mesmo caminho casam ambas** — quando dois serviços expõem a mesma URL (gateway + upstream), o enriquecimento `calls_api` não mantém mais silenciosamente só a última.
51
+ - **A configuração tolera YAML esparso** — `output:` / `wave:` / `semantic:` deixados vazios não quebram mais com `AttributeError`; um `-` solto sob `projects:` levanta um erro de configuração limpo em vez de um `TypeError`.
52
+ - **A detecção de linguagem pula diretórios vendorizados** — o voto de linguagem de fallback poda `node_modules` / `.git` / `dist`, então um repo Python com JS vendorizado não é mais detectado como *javascript* (e a descoberta não rastreia mais dezenas de milhares de arquivos vendorizados).
53
+ - **Links do wiki casam com seus arquivos** — os alvos dos links agora usam exatamente a mesma transformação de nome de arquivo com que o gerador escreve, então rótulos com espaços, `#`, parênteses ou genéricos não produzem mais links mortos.
54
+ - Além disso: ordem determinista das arestas de enriquecimento, uma trava de build contra rótulos `None`, um cache de extração thread-safe, referências fantasmas de `Depends()` do FastAPI removidas, e nomes de pastas de serviços do Obsidian limitados em bytes.
55
+
56
+ ---
57
+
58
+ ## Novidades na 0.6.2
59
+
60
+ - **IDs de comunidade deterministas** — comunidades de tamanho igual eram numeradas pela ordem de enumeração do particionador, remexendo 77–88% de `beacon.json` num re-escaneamento sem mudanças; agrupamentos idênticos agora sempre recebem IDs idênticos.
61
+ - **Nomes de arquivo de notas limitados em bytes** — um nome de classe CJK com mais de 85 caracteres estourava o limite de 255 bytes do sistema de arquivos e derrubava toda a exportação wiki/Obsidian com `ENAMETOOLONG`; agora limitado a 200 bytes UTF-8 com um sufixo de hash à prova de colisão.
62
+ - **Arestas de DI restauradas para FastAPI / Laravel / ASP.NET** — referências resolvidas de `Depends()` / `bind()` / `AddScoped<>` eram indexadas por caminho de arquivo enquanto os nós são indexados por projeto, então as arestas eram descartadas silenciosamente; agora são remapeadas para os IDs finais dos nós.
63
+ - **DI interface → implementação revivida** — os metadados `implements`/`extends` nunca eram preenchidos por nenhum extrator, então a injeção tipada por interface nunca se resolvia; Spring, ASP.NET, NestJS e Angular agora a conectam de ponta a ponta.
64
+
65
+ ---
66
+
30
67
  ## Novidades na 0.6.1
31
68
 
32
69
  Versão de correção — exatidão de extração e saída reproduzível.
@@ -27,6 +27,43 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## 0.6.4 新功能
31
+
32
+ Deep-dive 清理 — 输出落在你查找它们的位置,外加在 47 个项目的工作区上验证时发现的两个静默数据丢失缺陷。
33
+
34
+ - **Deep-dive 恰好只写入两个层级** — 各*仓库根*(拥有自己的 `.git` 或 `codebeacon.yaml` 的目录)与*扫描根*。monorepo 的框架文件夹(`mono/landing`、`mono/server`)不再各自堆积 `.codebeacon/` + CLAUDE.md;它们的合并图位于 `mono/.codebeacon/`,扫描根则承载完整的工作区图,任何项目都能从一处找到。在 monorepo *内部*运行 deep-dive 现在产生单一的根输出,而不是每个子文件夹一份。
35
+ - **缓存键以框架作命名空间** — 一个仓库组共享同一份缓存,而父项目先遍历嵌套项目的文件时(作为 sveltekit 的 `desktop/` 走过 `desktop/src-tauri`),曾用空结果毒化缓存,嵌套项目(tauri)随后复用这些空结果,静默丢失其全部路由和实体。
36
+ - **修复语法加载竞态** — 两个并行提取 worker 同时命中未缓存的 tree-sitter 语法时,各自构建了自己的 `Language` 实例;落败线程的文件随后通不过同一性检查,提取结果为**空**——没有警告,没有失败记录,只是大规模扫描中少数文件随机丢失全部路由。首次加载现在锁定为单一共享实例(已验证连续 20 次完整扫描保持稳定)。
37
+
38
+ ---
39
+
40
+ ## 0.6.3 新功能
41
+
42
+ 缺陷修复版本 — 一次 graphify-parity 审计(上游 6 月 3–10 日)加上对 codebeacon 自身代码的独立审计:**16 项修复**,并以 47 个项目的 `--deep-dive` 工作区扫描(5,226 节点 / 8,715 边)做了端到端验证。
43
+
44
+ - **Git 钩子在任何环境都能触发** — post-commit 重建钩子将安装时的 Python 解释器固定进脚本,并用 `subprocess` 而非 `nohup` 脱离父进程,因此在 GUI git 客户端(Sublime Merge、GitKraken)、CI runner 和 Windows 上均可工作——这些环境里 `codebeacon` 启动器不在 `PATH` 中,旧钩子会悄悄什么都不做。重新运行 `codebeacon hook install` 即可获得修复;merge driver 也以同样方式固定。
45
+ - **注释掉的 JS/TS 导入不再产生边** — barrel re-export 与 `require()` 的正则扫描现在会先(在识别字符串字面量的前提下)剥离 `//` 与 `/* */` 注释。被注释的 `export * from './legacy'` 此前会产生幻影边和虚假的 import 循环。
46
+ - **`from pkg import name` 绑定到真实目标(Python)** — 导入提取器现在捕获被导入的名称,因此 `from auth.services import UserService` 链接到 `UserService` 节点,`from src.services import enricher` 链接到子模块。此前只尝试模块路径的最后一段,导致测试文件与图断连。别名(`import x as y`)解析为真实符号名。
47
+ - **"High-Impact Files" 真正高影响** — hub 排名(CLAUDE.md、`analyze`)此前经由边的 `source_file`(始终是导入方)统计 import 的*扇出*,使入口文件以按节点膨胀的计数(60 个文件的仓库里出现 "imported by 392 files")压过真正的共享模块。两处副本现在都按被导入文件统计去重后的导入方文件数。
48
+ - **DI `injects` 边携带真实文件路径** — 已解析的依赖注入边曾把图节点 ID(`proj::Name`)写进 `source_file`;现在携带源节点的实际文件。
49
+ - **Ktor 嵌套 route 前缀正确拼接** — `route("/api") { route("/v1") { get("/users") } }` 提取出 `/api/v1/users`,而不是丢掉所有外层前缀。
50
+ - **同路径路由都能匹配** — 当两个服务暴露相同 URL(gateway + upstream)时,`calls_api` 富化不再悄悄只保留最后一个。
51
+ - **配置容忍稀疏 YAML** — `output:` / `wave:` / `semantic:` 留空不再以 `AttributeError` 崩溃;`projects:` 下游离的裸 `-` 抛出清晰的配置错误而非 `TypeError`。
52
+ - **语言检测跳过 vendored 目录** — 回退语言投票会剪除 `node_modules` / `.git` / `dist`,因此含 vendored JS 的 Python 仓库不再被判定为 *javascript*(discovery 也不再爬取数万个 vendored 文件)。
53
+ - **wiki 链接与文件一致** — 链接目标现在使用与生成器写文件时完全相同的文件名变换,含空格、`#`、括号或泛型的标签不再产生死链。
54
+ - 另有:确定性的富化边顺序、`None` 标签构建守护、线程安全的提取缓存、移除 FastAPI `Depends()` 幻影引用,以及 Obsidian 服务文件夹名的字节上限。
55
+
56
+ ---
57
+
58
+ ## 0.6.2 新功能
59
+
60
+ - **确定性的 community ID** — 等大小的 community 曾按分区器枚举顺序编号,一次 no-op 重扫会翻搅 `beacon.json` 的 77–88 %;相同的分组现在总是得到相同的 ID。
61
+ - **笔记文件名字节上限** — 一个 85+ 字符的 CJK 类名超出文件系统 255 字节限制,以 `ENAMETOOLONG` 让整个 wiki/Obsidian 导出崩溃;现已限制为 200 个 UTF-8 字节并附加防碰撞哈希后缀。
62
+ - **恢复 FastAPI / Laravel / ASP.NET 的 DI 边** — 已解析的 `Depends()` / `bind()` / `AddScoped<>` 引用按文件路径作键,而节点按项目作键,导致这些边被静默丢弃;现在重映射到最终节点 ID。
63
+ - **复活接口 → 实现的 DI** — `implements`/`extends` 元数据从未被任何提取器填充,接口类型注入从未解析;Spring、ASP.NET、NestJS、Angular 现已接通。
64
+
65
+ ---
66
+
30
67
  ## 0.6.1 新功能
31
68
 
32
69
  补丁版本 — 提取正确性与可复现输出。
@@ -0,0 +1 @@
1
+ __version__ = "0.6.4"