codebeacon 0.6.3__tar.gz → 0.6.5__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 (155) hide show
  1. {codebeacon-0.6.3 → codebeacon-0.6.5}/.cursorrules +4 -4
  2. {codebeacon-0.6.3 → codebeacon-0.6.5}/AGENTS.md +4 -4
  3. {codebeacon-0.6.3 → codebeacon-0.6.5}/CLAUDE.md +4 -4
  4. {codebeacon-0.6.3 → codebeacon-0.6.5}/PKG-INFO +49 -2
  5. {codebeacon-0.6.3 → codebeacon-0.6.5}/README.de.md +47 -0
  6. {codebeacon-0.6.3 → codebeacon-0.6.5}/README.es.md +47 -0
  7. {codebeacon-0.6.3 → codebeacon-0.6.5}/README.fr.md +47 -0
  8. {codebeacon-0.6.3 → codebeacon-0.6.5}/README.ja.md +47 -0
  9. {codebeacon-0.6.3 → codebeacon-0.6.5}/README.ko.md +48 -1
  10. {codebeacon-0.6.3 → codebeacon-0.6.5}/README.md +48 -1
  11. {codebeacon-0.6.3 → codebeacon-0.6.5}/README.pt-BR.md +47 -0
  12. {codebeacon-0.6.3 → codebeacon-0.6.5}/README.zh-CN.md +47 -0
  13. codebeacon-0.6.5/codebeacon/__init__.py +1 -0
  14. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/cache.py +37 -24
  15. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/cli.py +121 -19
  16. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/base.py +25 -3
  17. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/pipeline.py +154 -66
  18. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/wave.py +5 -3
  19. {codebeacon-0.6.3 → codebeacon-0.6.5}/pyproject.toml +1 -1
  20. codebeacon-0.6.5/tests/test_cli_upgrade.py +144 -0
  21. codebeacon-0.6.5/tests/test_deep_dive_grouping.py +241 -0
  22. codebeacon-0.6.3/codebeacon/__init__.py +0 -1
  23. {codebeacon-0.6.3 → codebeacon-0.6.5}/.github/CODEOWNERS +0 -0
  24. {codebeacon-0.6.3 → codebeacon-0.6.5}/.github/dependabot.yml +0 -0
  25. {codebeacon-0.6.3 → codebeacon-0.6.5}/.github/workflows/ci.yml +0 -0
  26. {codebeacon-0.6.3 → codebeacon-0.6.5}/.github/workflows/release.yml +0 -0
  27. {codebeacon-0.6.3 → codebeacon-0.6.5}/.gitignore +0 -0
  28. {codebeacon-0.6.3 → codebeacon-0.6.5}/LICENSE +0 -0
  29. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/__main__.py +0 -0
  30. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/affected.py +0 -0
  31. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/common/__init__.py +0 -0
  32. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/common/filters.py +0 -0
  33. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/common/safety.py +0 -0
  34. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/common/symbols.py +0 -0
  35. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/common/types.py +0 -0
  36. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/config.py +0 -0
  37. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/contextmap/__init__.py +0 -0
  38. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/contextmap/generator.py +0 -0
  39. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/diagnostics.py +0 -0
  40. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/discover/__init__.py +0 -0
  41. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/discover/detector.py +0 -0
  42. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/discover/ignore.py +0 -0
  43. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/discover/scanner.py +0 -0
  44. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/export/__init__.py +0 -0
  45. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/export/callflow_html.py +0 -0
  46. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/export/hooks.py +0 -0
  47. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/export/mcp.py +0 -0
  48. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/export/merge.py +0 -0
  49. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/export/obsidian.py +0 -0
  50. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/export/tree_html.py +0 -0
  51. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/__init__.py +0 -0
  52. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/components.py +0 -0
  53. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/dependencies.py +0 -0
  54. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/dotnet.py +0 -0
  55. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/entities.py +0 -0
  56. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/README.md +0 -0
  57. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/actix.scm +0 -0
  58. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/angular.scm +0 -0
  59. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/aspnet.scm +0 -0
  60. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/django.scm +0 -0
  61. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/express.scm +0 -0
  62. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/fastapi.scm +0 -0
  63. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/flask.scm +0 -0
  64. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/gin.scm +0 -0
  65. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/ktor.scm +0 -0
  66. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/laravel.scm +0 -0
  67. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/nestjs.scm +0 -0
  68. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/rails.scm +0 -0
  69. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/react.scm +0 -0
  70. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/spring_boot.scm +0 -0
  71. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/svelte.scm +0 -0
  72. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/tauri.scm +0 -0
  73. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/vapor.scm +0 -0
  74. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/queries/vue.scm +0 -0
  75. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/routes.py +0 -0
  76. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/semantic.py +0 -0
  77. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/extract/services.py +0 -0
  78. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/graph/__init__.py +0 -0
  79. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/graph/analyze.py +0 -0
  80. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/graph/build.py +0 -0
  81. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/graph/cluster.py +0 -0
  82. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/graph/enrich.py +0 -0
  83. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/graph/write.py +0 -0
  84. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/knowledge/__init__.py +0 -0
  85. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/knowledge/generator.py +0 -0
  86. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/plugins/__init__.py +0 -0
  87. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/plugins/githooks.py +0 -0
  88. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/plugins/skills.py +0 -0
  89. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/semantic_pipeline.py +0 -0
  90. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/skill/SKILL.md +0 -0
  91. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/wiki/__init__.py +0 -0
  92. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/wiki/generator.py +0 -0
  93. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/wiki/index.py +0 -0
  94. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon/wiki/templates.py +0 -0
  95. {codebeacon-0.6.3 → codebeacon-0.6.5}/codebeacon.yaml.example +0 -0
  96. {codebeacon-0.6.3 → codebeacon-0.6.5}/docs/TRANSLATION_STATUS.md +0 -0
  97. {codebeacon-0.6.3 → codebeacon-0.6.5}/public-plan.md +0 -0
  98. {codebeacon-0.6.3 → codebeacon-0.6.5}/skill/install.py +0 -0
  99. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/__init__.py +0 -0
  100. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/conftest.py +0 -0
  101. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/actix/main.rs +0 -0
  102. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/angular/app.component.ts +0 -0
  103. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/aspnet/UserController.cs +0 -0
  104. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/django/views.py +0 -0
  105. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/express/userRouter.js +0 -0
  106. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/fastapi/main.py +0 -0
  107. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/flask/app.py +0 -0
  108. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/gin/main.go +0 -0
  109. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/integration_workspace/api-python/pyproject.toml +0 -0
  110. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/integration_workspace/api-python/src/__init__.py +0 -0
  111. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/integration_workspace/api-python/src/main.py +0 -0
  112. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/integration_workspace/api-python/src/services.py +0 -0
  113. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/integration_workspace/web/package.json +0 -0
  114. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/integration_workspace/web/src/UserPage.tsx +0 -0
  115. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/ktor/UserRoutes.kt +0 -0
  116. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/laravel/UserController.php +0 -0
  117. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/nestjs/user.controller.ts +0 -0
  118. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/rails/users_controller.rb +0 -0
  119. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/react/UserPage.tsx +0 -0
  120. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/spring_boot/UserController.java +0 -0
  121. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/sveltekit/+page.svelte +0 -0
  122. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/vapor/routes.swift +0 -0
  123. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/fixtures/vue/UserList.vue +0 -0
  124. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/integration/__init__.py +0 -0
  125. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/integration/test_full_pipeline.py +0 -0
  126. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_affected.py +0 -0
  127. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_affected_wiki.py +0 -0
  128. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_audit_bugfixes.py +0 -0
  129. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_cli_dispatch.py +0 -0
  130. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_contextmap_paths.py +0 -0
  131. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_dependencies.py +0 -0
  132. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_diagnostics.py +0 -0
  133. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_discover.py +0 -0
  134. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_dotnet.py +0 -0
  135. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_entities.py +0 -0
  136. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_filters.py +0 -0
  137. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_graph.py +0 -0
  138. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_graphify_parity_0_6_3.py +0 -0
  139. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_graphify_parity_fixes.py +0 -0
  140. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_independent_audit_fixes.py +0 -0
  141. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_knowledge.py +0 -0
  142. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_known_bugs.py +0 -0
  143. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_mcp_and_semantic.py +0 -0
  144. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_optional_grammars.py +0 -0
  145. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_pipeline_module.py +0 -0
  146. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_plugins.py +0 -0
  147. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_resolve.py +0 -0
  148. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_routes.py +0 -0
  149. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_safety_and_writes.py +0 -0
  150. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_scanner_sensitive.py +0 -0
  151. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_semantic.py +0 -0
  152. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_semantic_hardening.py +0 -0
  153. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_semantic_stats.py +0 -0
  154. {codebeacon-0.6.3 → codebeacon-0.6.5}/tests/test_services.py +0 -0
  155. {codebeacon-0.6.3 → codebeacon-0.6.5}/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 | 409 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 | 409 | 3 | 0 |
41
+ | codebeacon | python | 5 | 413 | 3 | 0 |
42
42
 
43
43
  ---
44
44
 
@@ -56,7 +56,7 @@ Open the paths surfaced by Steps 1–2.
56
56
  ## Architecture
57
57
 
58
58
  **codebeacon**: **python** · python
59
- Routes: 5 | Services: 409 | Entities: 3 | Components: 0
59
+ Routes: 5 | Services: 413 | Entities: 3 | Components: 0
60
60
 
61
61
  ## High-Impact Files
62
62
 
@@ -70,5 +70,5 @@ Changes here affect many other files:
70
70
 
71
71
  ---
72
72
 
73
- _Generated by [codebeacon](https://github.com/codebeacon/codebeacon) · 2026-06-10_
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 | 409 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 | 409 | 3 | 0 |
41
+ | codebeacon | python | 5 | 413 | 3 | 0 |
42
42
 
43
43
  ---
44
44
 
@@ -56,7 +56,7 @@ Open the paths surfaced by Steps 1–2.
56
56
  ## Architecture
57
57
 
58
58
  **codebeacon**: **python** · python
59
- Routes: 5 | Services: 409 | Entities: 3 | Components: 0
59
+ Routes: 5 | Services: 413 | Entities: 3 | Components: 0
60
60
 
61
61
  ## High-Impact Files
62
62
 
@@ -70,5 +70,5 @@ Changes here affect many other files:
70
70
 
71
71
  ---
72
72
 
73
- _Generated by [codebeacon](https://github.com/codebeacon/codebeacon) · 2026-06-10_
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 | 409 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 | 409 | 3 | 0 |
46
+ | codebeacon | python | 5 | 413 | 3 | 0 |
47
47
 
48
48
  ---
49
49
 
@@ -61,7 +61,7 @@ searches that span projects.
61
61
  ## Architecture
62
62
 
63
63
  **codebeacon**: **python** · python
64
- Routes: 5 | Services: 409 | Entities: 3 | Components: 0
64
+ Routes: 5 | Services: 413 | Entities: 3 | Components: 0
65
65
 
66
66
  ## High-Impact Files
67
67
 
@@ -75,5 +75,5 @@ Changes here affect many other files:
75
75
 
76
76
  ---
77
77
 
78
- _Generated by [codebeacon](https://github.com/codebeacon/codebeacon) · 2026-06-10_
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.3
3
+ Version: 0.6.5
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,53 @@ Description-Content-Type: text/markdown
118
118
 
119
119
  ---
120
120
 
121
+ ## What's new in 0.6.5
122
+
123
+ `codebeacon upgrade` now works everywhere — it previously assumed a plain pip install and died silently on machines where that wasn't true.
124
+
125
+ - **Install-manager detection** — the upgrade command detects how codebeacon was installed and runs the matching tool: `pip install --upgrade` for pip installs, `pipx upgrade codebeacon` for pipx, `uv tool upgrade codebeacon` for uv. pipx/uv tool venvs ship *without* a `pip` module, so the old unconditional `python -m pip` call failed before doing anything.
126
+ - **Upgrade verification** — after the upgrade a fresh interpreter re-reads the installed version and reports `0.6.4 -> 0.6.5`. If the version didn't change but PyPI has a newer release, you get a warning that the `codebeacon` on your PATH may belong to a different Python environment — instead of a false "Upgrade complete".
127
+ - **Actionable failures** — a pip-less environment prints the exact commands to run; a PEP 668 `externally-managed-environment` refusal explains the fix (pipx or a virtualenv) instead of dumping a raw pip error. The command also shows the current vs. latest-on-PyPI version up front.
128
+
129
+ ---
130
+
131
+ ## What's new in 0.6.4
132
+
133
+ 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.
134
+
135
+ - **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.
136
+ - **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.
137
+ - **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).
138
+
139
+ ---
140
+
141
+ ## What's new in 0.6.3
142
+
143
+ 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).
144
+
145
+ - **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.
146
+ - **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.
147
+ - **`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.
148
+ - **"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.
149
+ - **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.
150
+ - **Ktor nested route prefixes concatenate** — `route("/api") { route("/v1") { get("/users") } }` extracts `/api/v1/users` instead of dropping every outer prefix.
151
+ - **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.
152
+ - **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`.
153
+ - **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).
154
+ - **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.
155
+ - 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.
156
+
157
+ ---
158
+
159
+ ## What's new in 0.6.2
160
+
161
+ - **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.
162
+ - **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.
163
+ - **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.
164
+ - **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.
165
+
166
+ ---
167
+
121
168
  ## What's new in 0.6.1
122
169
 
123
170
  Patch release — extraction correctness and reproducible output.
@@ -364,7 +411,7 @@ Run **one** command from anywhere:
364
411
  codebeacon upgrade
365
412
  ```
366
413
 
367
- This pip-upgrades the package, then re-runs `codebeacon install` so `~/.claude/skills/codebeacon/SKILL.md` is overwritten with the new release's copy. Restart your Claude Code session for the new SKILL.md to load. If codebeacon is installed in editable mode (`pip install -e .`), the pip step is skipped — pass `--force` to upgrade anyway.
414
+ This upgrades the package using whichever tool installed it (`pip`, `pipx upgrade`, or `uv tool upgrade` — detected automatically), verifies the installed version actually changed, then re-runs `codebeacon install` so `~/.claude/skills/codebeacon/SKILL.md` is overwritten with the new release's copy. Restart your Claude Code session for the new SKILL.md to load. If codebeacon is installed in editable mode (`pip install -e .`), the package step is skipped — pass `--force` to upgrade anyway.
368
415
 
369
416
  ### MCP Server
370
417
 
@@ -27,6 +27,53 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## Neu in 0.6.5
31
+
32
+ `codebeacon upgrade` funktioniert jetzt überall — bisher ging der Befehl von einer normalen pip-Installation aus und scheiterte auf anderen Maschinen stillschweigend.
33
+
34
+ - **Erkennung des Installations-Managers** — der upgrade-Befehl erkennt, wie codebeacon installiert wurde, und führt das passende Tool aus: `pip install --upgrade` bei pip, `pipx upgrade codebeacon` bei pipx, `uv tool upgrade codebeacon` bei uv. pipx/uv-tool-venvs kommen *ohne* `pip`-Modul, daher starb der alte bedingungslose `python -m pip`-Aufruf, bevor er irgendetwas tat.
35
+ - **Upgrade-Verifikation** — nach dem Upgrade liest ein frischer Interpreter die installierte Version neu ein und meldet `0.6.4 -> 0.6.5`. Hat sich die Version nicht geändert, obwohl PyPI ein neueres Release hat, gibt es eine Warnung, dass das `codebeacon` im PATH zu einer anderen Python-Umgebung gehören könnte — statt eines falschen „Upgrade complete".
36
+ - **Handlungsfähige Fehlermeldungen** — eine Umgebung ohne pip zeigt die exakt auszuführenden Befehle; eine PEP-668-Ablehnung (`externally-managed-environment`) erklärt die Lösung (pipx oder ein virtualenv), statt einen rohen pip-Fehler auszugeben. Der Befehl zeigt außerdem vorab die aktuelle Version neben der neuesten auf PyPI.
37
+
38
+ ---
39
+
40
+ ## Neu in 0.6.4
41
+
42
+ 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.
43
+
44
+ - **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.
45
+ - **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.
46
+ - **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).
47
+
48
+ ---
49
+
50
+ ## Neu in 0.6.3
51
+
52
+ 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).
53
+
54
+ - **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.
55
+ - **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.
56
+ - **`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.
57
+ - **„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.
58
+ - **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.
59
+ - **Verschachtelte Ktor-Routenpräfixe werden verkettet** — `route("/api") { route("/v1") { get("/users") } }` extrahiert `/api/v1/users`, statt jedes äußere Präfix zu verwerfen.
60
+ - **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.
61
+ - **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.
62
+ - **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).
63
+ - **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.
64
+ - 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.
65
+
66
+ ---
67
+
68
+ ## Neu in 0.6.2
69
+
70
+ - **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.
71
+ - **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.
72
+ - **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.
73
+ - **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.
74
+
75
+ ---
76
+
30
77
  ## Neu in 0.6.1
31
78
 
32
79
  Patch-Release — Extraktionskorrektheit und reproduzierbare Ausgabe.
@@ -27,6 +27,53 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## Novedades en 0.6.5
31
+
32
+ `codebeacon upgrade` ahora funciona en cualquier entorno — antes asumía una instalación pip normal y fallaba silenciosamente en máquinas donde no lo era.
33
+
34
+ - **Detección del gestor de instalación** — el comando upgrade detecta cómo se instaló codebeacon y ejecuta la herramienta correspondiente: `pip install --upgrade` para instalaciones pip, `pipx upgrade codebeacon` para pipx, `uv tool upgrade codebeacon` para uv. Los venvs de pipx/uv tool vienen *sin* módulo `pip`, así que la antigua llamada incondicional a `python -m pip` moría antes de hacer nada.
35
+ - **Verificación del upgrade** — tras actualizar, un intérprete nuevo relee la versión instalada y reporta `0.6.4 -> 0.6.5`. Si la versión no cambió pero PyPI tiene una release más nueva, recibes una advertencia de que el `codebeacon` en tu PATH puede pertenecer a otro entorno de Python — en lugar de un falso "Upgrade complete".
36
+ - **Fallos accionables** — un entorno sin pip imprime los comandos exactos a ejecutar; un rechazo PEP 668 `externally-managed-environment` explica la solución (pipx o un virtualenv) en vez de volcar un error pip crudo. El comando también muestra de entrada la versión actual frente a la última en PyPI.
37
+
38
+ ---
39
+
40
+ ## Novedades en 0.6.4
41
+
42
+ 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.
43
+
44
+ - **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.
45
+ - **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.
46
+ - **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).
47
+
48
+ ---
49
+
50
+ ## Novedades en 0.6.3
51
+
52
+ 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).
53
+
54
+ - **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.
55
+ - **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.
56
+ - **`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.
57
+ - **"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.
58
+ - **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.
59
+ - **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.
60
+ - **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.
61
+ - **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`.
62
+ - **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).
63
+ - **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.
64
+ - 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.
65
+
66
+ ---
67
+
68
+ ## Novedades en 0.6.2
69
+
70
+ - **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.
71
+ - **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.
72
+ - **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.
73
+ - **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.
74
+
75
+ ---
76
+
30
77
  ## Novedades en 0.6.1
31
78
 
32
79
  Versión de parche — corrección de extracción y salida reproducible.
@@ -27,6 +27,53 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## Nouveautés en 0.6.5
31
+
32
+ `codebeacon upgrade` fonctionne désormais partout — il supposait auparavant une installation pip classique et échouait silencieusement sur les machines où ce n'était pas le cas.
33
+
34
+ - **Détection du gestionnaire d'installation** — la commande upgrade détecte comment codebeacon a été installé et exécute l'outil correspondant : `pip install --upgrade` pour pip, `pipx upgrade codebeacon` pour pipx, `uv tool upgrade codebeacon` pour uv. Les venvs pipx/uv tool sont livrés *sans* module `pip`, donc l'ancien appel inconditionnel à `python -m pip` mourait avant de faire quoi que ce soit.
35
+ - **Vérification de la mise à jour** — après la mise à jour, un interpréteur neuf relit la version installée et rapporte `0.6.4 -> 0.6.5`. Si la version n'a pas changé alors que PyPI propose une release plus récente, un avertissement indique que le `codebeacon` de votre PATH appartient peut-être à un autre environnement Python — au lieu d'un faux « Upgrade complete ».
36
+ - **Échecs actionnables** — un environnement sans pip affiche les commandes exactes à lancer ; un refus PEP 668 `externally-managed-environment` explique la solution (pipx ou un virtualenv) au lieu de déverser une erreur pip brute. La commande affiche aussi d'emblée la version actuelle face à la dernière sur PyPI.
37
+
38
+ ---
39
+
40
+ ## Nouveautés en 0.6.4
41
+
42
+ 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.
43
+
44
+ - **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.
45
+ - **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.
46
+ - **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).
47
+
48
+ ---
49
+
50
+ ## Nouveautés en 0.6.3
51
+
52
+ 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).
53
+
54
+ - **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.
55
+ - **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.
56
+ - **`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.
57
+ - **« 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é.
58
+ - **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.
59
+ - **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.
60
+ - **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.
61
+ - **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`.
62
+ - **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).
63
+ - **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.
64
+ - 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.
65
+
66
+ ---
67
+
68
+ ## Nouveautés en 0.6.2
69
+
70
+ - **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.
71
+ - **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.
72
+ - **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.
73
+ - **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.
74
+
75
+ ---
76
+
30
77
  ## Nouveautés en 0.6.1
31
78
 
32
79
  Version corrective — exactitude de l'extraction et sortie reproductible.
@@ -27,6 +27,53 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## 0.6.5 の新機能
31
+
32
+ `codebeacon upgrade` がどの環境でも動作するようになりました — 従来は通常の pip インストールを前提としており、そうでないマシンでは何もせずに静かに失敗していました。
33
+
34
+ - **インストールマネージャの自動検出** — upgrade コマンドが codebeacon のインストール方法を検出し、対応するツールを実行します: pip なら `pip install --upgrade`、pipx なら `pipx upgrade codebeacon`、uv なら `uv tool upgrade codebeacon`。pipx/uv tool の venv には `pip` モジュールが*存在しない*ため、従来の無条件な `python -m pip` 呼び出しは何もできずに失敗していました。
35
+ - **アップグレード検証** — アップグレード後、新しいインタープリタでインストール済みバージョンを再読込し `0.6.4 -> 0.6.5` のように報告します。バージョンが変わっていないのに PyPI に新しいリリースがある場合は、偽の「Upgrade complete」ではなく、PATH 上の `codebeacon` が別の Python 環境のものかもしれないと警告します。
36
+ - **対処可能な失敗メッセージ** — pip のない環境では実行すべき正確なコマンドを表示し、PEP 668 `externally-managed-environment` の拒否には生の pip エラーの代わりに解決策(pipx または virtualenv)を説明します。実行時には現在のバージョンと PyPI の最新バージョンも併記します。
37
+
38
+ ---
39
+
40
+ ## 0.6.4 の新機能
41
+
42
+ Deep-dive のクリーンアップ — 出力が探す場所に置かれるようになり、47 プロジェクトのワークスペースで検証中に見つかったサイレントなデータ損失バグ 2 件を修正。
43
+
44
+ - **Deep-dive はちょうど二つのレベルにのみ書き込む** — 各*リポジトリルート*(自身の `.git` または `codebeacon.yaml` を持つディレクトリ)と*スキャンルート*です。モノレポのフレームワークフォルダ(`mono/landing`、`mono/server`)がそれぞれ `.codebeacon/` + CLAUDE.md を抱え込むことはなくなり、結合グラフは `mono/.codebeacon/` に置かれ、スキャンルートがワークスペース全体のグラフを持つため、どのプロジェクトも一箇所から見つけられます。モノレポの*内部*で deep-dive を実行すると、サブフォルダごとに一つずつではなく単一のルート出力が生成されます。
45
+ - **キャッシュキーがフレームワークで名前空間化** — リポジトリグループは一つのキャッシュを共有しますが、親プロジェクトがネストしたプロジェクトのファイルを先に走査すると(`desktop/src-tauri` の上を sveltekit として歩く `desktop/`)、空の結果でキャッシュを汚染し、ネストしたプロジェクト(tauri)がそれを再利用して、自身の route とエンティティをすべて黙って失っていました。
46
+ - **文法ロードの競合を修正** — キャッシュされていない tree-sitter 文法に並列の抽出ワーカー二つが同時に到達すると、それぞれが自前の `Language` インスタンスを構築し、負けたスレッドのファイルはアイデンティティチェックに失敗して**何も**抽出されませんでした — 警告も失敗記録もなく、大規模スキャンで数ファイルの route がランダムに丸ごと欠落するだけでした。初回ロードは単一の共有インスタンスにロックされるようになりました(連続 20 回のフルスキャンで安定を確認済み)。
47
+
48
+ ---
49
+
50
+ ## 0.6.3 の新機能
51
+
52
+ バグ修正リリース — graphify-parity 監査(上流 6 月 3–10 日)に codebeacon 自身のコードの独立監査を加えた **16 件の修正**。47 プロジェクトの `--deep-dive` ワークスペーススキャン(5,226 ノード / 8,715 エッジ)でエンドツーエンド検証済み。
53
+
54
+ - **Git フックがどこでも発火** — post-commit 再ビルドフックがインストール時の Python インタープリタをスクリプトに固定し、`nohup` の代わりに `subprocess` でデタッチするため、GUI の git クライアント(Sublime Merge、GitKraken)、CI ランナー、Windows といった、`codebeacon` ランチャーが `PATH` に無く旧フックが黙って何もしなかった環境でも動作します。`codebeacon hook install` を再実行すると修正が反映され、merge driver も同じ方式で固定されます。
55
+ - **コメントアウトされた JS/TS import がエッジを作らない** — バレル re-export と `require()` の正規表現パスが、先に `//` と `/* */` コメントを(文字列リテラルを認識した上で)除去します。コメントアウトされた `export * from './legacy'` がファントムエッジと偽の import 循環を生んでいました。
56
+ - **`from pkg import name` が本来のターゲットに結び付く(Python)** — import 抽出器が import された名前を捕捉するようになり、`from auth.services import UserService` は `UserService` ノードへ、`from src.services import enricher` はサブモジュールへリンクします。従来はモジュールパスの最終セグメントしか試さず、テストファイルがグラフから切り離されていました。エイリアス(`import x as y`)は真のシンボル名に解決されます。
57
+ - **「High-Impact Files」が本当に high-impact に** — ハブランキング(CLAUDE.md、`analyze`)がエッジの `source_file`(常に import する側)経由で import の*ファンアウト*を数えていたため、エントリポイントがノード単位で水増しされたカウント(60 ファイルのリポジトリで「imported by 392 files」)で本物の共有モジュールを押しのけていました。両方のコピーが、import されるファイルごとに重複しない import 元ファイル数を数えるようになりました。
58
+ - **DI `injects` エッジが実ファイルパスを持つ** — 解決済みの dependency-injection エッジが `source_file` にグラフノード ID(`proj::Name`)を刻んでいましたが、ソースノードの実際のファイルを持つようになりました。
59
+ - **Ktor のネストした route プレフィックスが連結される** — `route("/api") { route("/v1") { get("/users") } }` が外側のプレフィックスをすべて落とす代わりに `/api/v1/users` を抽出します。
60
+ - **同一パスのルートが両方マッチ** — 二つのサービスが同じ URL を公開する場合(gateway + upstream)、`calls_api` エンリッチメントが最後の一つだけを黙って残すことはなくなりました。
61
+ - **設定がスパースな YAML を許容** — `output:` / `wave:` / `semantic:` を空のままにしても `AttributeError` でクラッシュしません。`projects:` 配下の裸の `-` は `TypeError` ではなく明確な設定エラーになります。
62
+ - **言語検出が vendored ディレクトリをスキップ** — フォールバックの言語投票が `node_modules` / `.git` / `dist` を除外するため、vendored な JS を含む Python リポジトリが *javascript* と判定されません(discovery が数万の vendored ファイルをクロールすることもなくなりました)。
63
+ - **wiki リンクがファイルと一致** — リンク先がジェネレータの書き出しと完全に同じファイル名変換を使うため、スペース、`#`、括弧、ジェネリクスを含むラベルがデッドリンクを生まなくなりました。
64
+ - さらに: 決定的なエンリッチメントエッジ順序、`None` ラベルのビルドガード、スレッドセーフな抽出キャッシュ、FastAPI `Depends()` のゴースト参照の除去、Obsidian サービスフォルダ名のバイト上限。
65
+
66
+ ---
67
+
68
+ ## 0.6.2 の新機能
69
+
70
+ - **決定的なコミュニティ ID** — 同サイズのコミュニティがパーティショナーの列挙順で番号付けされ、no-op の再スキャンで `beacon.json` の 77–88 % が入れ替わっていました。同一のグルーピングは常に同一の ID を得るようになりました。
71
+ - **ノートファイル名のバイト上限** — 85 文字超の CJK クラス名がファイルシステムの 255 バイト制限を超え、`ENAMETOOLONG` で wiki / Obsidian エクスポート全体をクラッシュさせていました。UTF-8 200 バイトで上限を設け、衝突安全なハッシュサフィックスを付与します。
72
+ - **FastAPI / Laravel / ASP.NET の DI エッジを復旧** — 解決済みの `Depends()` / `bind()` / `AddScoped<>` 参照がファイルパスでキー付けされる一方、ノードはプロジェクトでキー付けされていたため、エッジが黙って捨てられていました。最終ノード ID へ再マップされます。
73
+ - **インターフェース → 実装の DI を復活** — `implements`/`extends` メタデータをどの抽出器も埋めておらず、インターフェース型の注入が一切解決されませんでした。Spring、ASP.NET、NestJS、Angular で配線されるようになりました。
74
+
75
+ ---
76
+
30
77
  ## 0.6.1 の新機能
31
78
 
32
79
  パッチリリース — 抽出の正確性と再現可能な出力。
@@ -27,6 +27,53 @@
27
27
 
28
28
  ---
29
29
 
30
+ ## 0.6.5 새 소식
31
+
32
+ `codebeacon upgrade` 가 이제 어떤 환경에서도 동작합니다 — 이전에는 일반 pip 설치를 가정해서, 그렇지 않은 머신에서는 아무것도 못 하고 조용히 실패했습니다.
33
+
34
+ - **설치 매니저 자동 감지** — upgrade 명령이 codebeacon 의 설치 방식을 감지해 맞는 도구를 실행합니다: pip 설치면 `pip install --upgrade`, pipx 면 `pipx upgrade codebeacon`, uv 면 `uv tool upgrade codebeacon`. pipx/uv tool 의 venv 에는 `pip` 모듈이 *없어서*, 기존의 무조건적인 `python -m pip` 호출은 시작도 못 하고 죽었습니다.
35
+ - **업그레이드 검증** — 업그레이드 후 새 인터프리터로 설치된 버전을 다시 읽어 `0.6.4 -> 0.6.5` 처럼 보고합니다. 버전이 그대로인데 PyPI 에 더 새 릴리스가 있으면, 가짜 "Upgrade complete" 대신 PATH 의 `codebeacon` 이 다른 Python 환경 소속일 수 있다는 경고를 출력합니다.
36
+ - **실패 메시지가 곧 해결책** — pip 없는 환경이면 실행할 정확한 명령을 안내하고, PEP 668 `externally-managed-environment` 거부에는 원시 pip 에러 대신 해결 방법(pipx 또는 virtualenv)을 설명합니다. 시작 시 현재 버전과 PyPI 최신 버전도 나란히 보여줍니다.
37
+
38
+ ---
39
+
40
+ ## 0.6.4 새 소식
41
+
42
+ Deep-dive 정리 — 출력물이 찾아보는 곳에 생성되도록 정돈하고, 47개 프로젝트 워크스페이스에서 이를 검증하던 중 발견한 조용한 데이터 손실 버그 2건 수정.
43
+
44
+ - **Deep-dive가 정확히 두 레벨에만 기록** — 각 *레포 루트*(자체 `.git` 또는 `codebeacon.yaml`이 있는 디렉토리)와 *스캔 루트*. 모노레포의 프레임워크 폴더(`mono/landing`, `mono/server`)마다 `.codebeacon/` + CLAUDE.md가 늘어나지 않으며, 이들의 통합 그래프는 `mono/.codebeacon/`에 위치하고 스캔 루트가 전체 워크스페이스 그래프를 담아 어떤 프로젝트든 한 곳에서 찾을 수 있습니다. 모노레포 *내부*에서 deep-dive를 실행하면 이제 서브폴더마다 하나씩이 아니라 단일 루트 출력이 생성됩니다.
45
+ - **캐시 키가 프레임워크로 네임스페이스됨** — 레포 그룹은 하나의 캐시를 공유하는데, 부모 프로젝트가 중첩 프로젝트의 파일을 먼저 순회하면(`desktop/src-tauri` 위를 sveltekit으로 도는 `desktop/`) 빈 결과로 캐시를 오염시키고, 중첩 프로젝트(tauri)가 이를 재사용해 자신의 route와 엔티티를 전부 조용히 잃었습니다.
46
+ - **Grammar 로드 race 수정** — 캐시되지 않은 tree-sitter grammar에 병렬 추출 워커 둘이 동시에 도달하면 각자 자신의 `Language` 인스턴스를 만들었고, 진 쪽 스레드의 파일은 identity 체크에 실패해 **아무것도** 추출하지 못했습니다 — 경고도, 실패 기록도 없이 큰 스캔에서 파일 몇 개가 무작위로 route를 전부 잃었습니다. 첫 로드는 이제 단일 공유 인스턴스로 잠깁니다(연속 20회 전체 스캔에서 안정성 검증).
47
+
48
+ ---
49
+
50
+ ## 0.6.3 새 소식
51
+
52
+ 버그 수정 릴리스 — graphify-parity 감사(업스트림 6월 3–10일)에 codebeacon 자체 코드에 대한 독립 감사를 더해 **16건 수정**, 47개 프로젝트 `--deep-dive` 워크스페이스 스캔(노드 5,226 / 엣지 8,715)으로 end-to-end 검증.
53
+
54
+ - **Git hook이 어디서나 동작** — post-commit 재빌드 hook이 설치 시점의 Python 인터프리터를 스크립트에 고정하고 `nohup` 대신 `subprocess`로 detach하므로, GUI git 클라이언트(Sublime Merge, GitKraken)·CI 러너·Windows처럼 `codebeacon` 런처가 `PATH`에 없어 기존 hook이 조용히 아무것도 하지 않던 환경에서도 동작합니다. `codebeacon hook install`을 다시 실행하면 수정이 적용되며, merge driver도 같은 방식으로 고정됩니다.
55
+ - **주석 처리된 JS/TS import가 더 이상 엣지를 만들지 않음** — 배럴 re-export와 `require()` 정규식 패스가 먼저 `//`·`/* */` 주석을 (문자열 리터럴을 인식하며) 제거합니다. 주석 처리된 `export * from './legacy'`가 phantom 엣지와 가짜 import 순환을 만들던 문제 해결.
56
+ - **`from pkg import name`이 실제 대상에 바인딩 (Python)** — import 추출기가 import된 이름을 캡처하므로 `from auth.services import UserService`는 `UserService` 노드로, `from src.services import enricher`는 서브모듈로 연결됩니다. 이전엔 모듈 경로의 마지막 세그먼트만 시도해 테스트 파일이 그래프에서 끊겨 있었습니다. 별칭(`import x as y`)은 실제 심볼 이름으로 해석됩니다.
57
+ - **"High-Impact Files"가 진짜 high-impact** — hub 랭킹(CLAUDE.md, `analyze`)이 엣지의 `source_file`(항상 import하는 쪽)로 import *fan-out*을 세는 바람에, 엔트리 포인트가 노드 단위로 부풀려진 수치(60개 파일 레포에서 "imported by 392 files")로 진짜 공유 모듈을 제쳤습니다. 두 사본 모두 import되는 파일별로 고유한 import하는 파일 수를 셉니다.
58
+ - **DI `injects` 엣지가 실제 파일 경로를 가짐** — 해석된 dependency-injection 엣지가 `source_file`에 그래프 노드 ID(`proj::Name`)를 찍던 문제 수정 → 이제 소스 노드의 실제 파일을 담습니다.
59
+ - **Ktor 중첩 route prefix 연결** — `route("/api") { route("/v1") { get("/users") } }`가 바깥 prefix를 전부 버리는 대신 `/api/v1/users`를 추출합니다.
60
+ - **같은 경로의 route가 모두 매칭** — 두 서비스가 같은 URL을 노출할 때(gateway + upstream), `calls_api` enrichment가 마지막 하나만 조용히 남기지 않습니다.
61
+ - **희소한 YAML 설정 허용** — `output:` / `wave:` / `semantic:`을 비워 둬도 `AttributeError`로 크래시하지 않고, `projects:` 아래 떠도는 bare `-`는 `TypeError` 대신 깔끔한 설정 에러를 냅니다.
62
+ - **언어 감지가 vendored 디렉토리 스킵** — 폴백 언어 투표가 `node_modules` / `.git` / `dist`를 제외 → vendored JS가 있는 Python 레포가 *javascript*로 감지되지 않음(그리고 discovery가 수만 개의 vendored 파일을 크롤하지 않음).
63
+ - **wiki 링크가 파일과 일치** — 링크 대상이 생성기가 파일을 쓸 때와 정확히 같은 파일명 변환을 사용 → 공백, `#`, 괄호, 제네릭이 포함된 라벨이 깨진 링크를 만들지 않음.
64
+ - 추가: 결정적 enrichment 엣지 순서, `None` 라벨 빌드 가드, 스레드 안전 추출 캐시, FastAPI `Depends()` ghost ref 제거, Obsidian 서비스 폴더명 byte 상한.
65
+
66
+ ---
67
+
68
+ ## 0.6.2 새 소식
69
+
70
+ - **결정적 community ID** — 같은 크기의 community가 partitioner 열거 순서로 번호를 받아 no-op 재스캔에서 `beacon.json`의 77–88 %가 뒤바뀌던 문제 수정; 동일한 그룹은 이제 항상 동일한 ID를 받습니다.
71
+ - **노트 파일명 byte 상한** — 85자 이상의 CJK 클래스명이 파일시스템 255바이트 한계를 넘어 `ENAMETOOLONG`으로 wiki/Obsidian 내보내기 전체를 크래시시키던 문제; UTF-8 200바이트로 캡하고 충돌 안전 해시 접미사를 붙입니다.
72
+ - **FastAPI / Laravel / ASP.NET DI 엣지 복구** — 해석된 `Depends()` / `bind()` / `AddScoped<>` 참조가 파일 경로로 키잉된 반면 노드는 프로젝트로 키잉되어 엣지가 조용히 버려졌습니다; 이제 최종 노드 ID로 리매핑됩니다.
73
+ - **인터페이스 → 구현 DI 부활** — `implements`/`extends` 메타데이터를 어떤 추출기도 채우지 않아 인터페이스 타입 주입이 전혀 해석되지 않았습니다; Spring, ASP.NET, NestJS, Angular가 이제 이를 연결합니다.
74
+
75
+ ---
76
+
30
77
  ## 0.6.1 새 소식
31
78
 
32
79
  패치 릴리스 — 추출 정확성과 재현 가능한 출력.
@@ -272,7 +319,7 @@ codebeacon install
272
319
  codebeacon upgrade
273
320
  ```
274
321
 
275
- 이 명령은 pip 으로 패키지를 업그레이드한 뒤 `codebeacon install` 을 다시 실행해 `~/.claude/skills/codebeacon/SKILL.md` 을 새 릴리스의 사본으로 덮어씁니다. 새 SKILL.md 가 로드되려면 Claude Code 세션을 재시작하세요. editable 모드 (`pip install -e .`) 로 설치되어 있다면 pip 단계는 스킵됩니다 — 강제로 진행하려면 `--force` 를 붙이세요.
322
+ 이 명령은 설치에 사용된 도구(`pip`, `pipx upgrade`, `uv tool upgrade` — 자동 감지)로 패키지를 업그레이드하고, 설치된 버전이 실제로 바뀌었는지 검증한 뒤 `codebeacon install` 을 다시 실행해 `~/.claude/skills/codebeacon/SKILL.md` 을 새 릴리스의 사본으로 덮어씁니다. 새 SKILL.md 가 로드되려면 Claude Code 세션을 재시작하세요. editable 모드 (`pip install -e .`) 로 설치되어 있다면 패키지 단계는 스킵됩니다 — 강제로 진행하려면 `--force` 를 붙이세요.
276
323
 
277
324
  ### MCP 서버
278
325
 
@@ -25,6 +25,53 @@
25
25
 
26
26
  ---
27
27
 
28
+ ## What's new in 0.6.5
29
+
30
+ `codebeacon upgrade` now works everywhere — it previously assumed a plain pip install and died silently on machines where that wasn't true.
31
+
32
+ - **Install-manager detection** — the upgrade command detects how codebeacon was installed and runs the matching tool: `pip install --upgrade` for pip installs, `pipx upgrade codebeacon` for pipx, `uv tool upgrade codebeacon` for uv. pipx/uv tool venvs ship *without* a `pip` module, so the old unconditional `python -m pip` call failed before doing anything.
33
+ - **Upgrade verification** — after the upgrade a fresh interpreter re-reads the installed version and reports `0.6.4 -> 0.6.5`. If the version didn't change but PyPI has a newer release, you get a warning that the `codebeacon` on your PATH may belong to a different Python environment — instead of a false "Upgrade complete".
34
+ - **Actionable failures** — a pip-less environment prints the exact commands to run; a PEP 668 `externally-managed-environment` refusal explains the fix (pipx or a virtualenv) instead of dumping a raw pip error. The command also shows the current vs. latest-on-PyPI version up front.
35
+
36
+ ---
37
+
38
+ ## What's new in 0.6.4
39
+
40
+ 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.
41
+
42
+ - **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.
43
+ - **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.
44
+ - **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).
45
+
46
+ ---
47
+
48
+ ## What's new in 0.6.3
49
+
50
+ 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).
51
+
52
+ - **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.
53
+ - **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.
54
+ - **`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.
55
+ - **"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.
56
+ - **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.
57
+ - **Ktor nested route prefixes concatenate** — `route("/api") { route("/v1") { get("/users") } }` extracts `/api/v1/users` instead of dropping every outer prefix.
58
+ - **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.
59
+ - **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`.
60
+ - **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).
61
+ - **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.
62
+ - 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.
63
+
64
+ ---
65
+
66
+ ## What's new in 0.6.2
67
+
68
+ - **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.
69
+ - **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.
70
+ - **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.
71
+ - **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.
72
+
73
+ ---
74
+
28
75
  ## What's new in 0.6.1
29
76
 
30
77
  Patch release — extraction correctness and reproducible output.
@@ -271,7 +318,7 @@ Run **one** command from anywhere:
271
318
  codebeacon upgrade
272
319
  ```
273
320
 
274
- This pip-upgrades the package, then re-runs `codebeacon install` so `~/.claude/skills/codebeacon/SKILL.md` is overwritten with the new release's copy. Restart your Claude Code session for the new SKILL.md to load. If codebeacon is installed in editable mode (`pip install -e .`), the pip step is skipped — pass `--force` to upgrade anyway.
321
+ This upgrades the package using whichever tool installed it (`pip`, `pipx upgrade`, or `uv tool upgrade` — detected automatically), verifies the installed version actually changed, then re-runs `codebeacon install` so `~/.claude/skills/codebeacon/SKILL.md` is overwritten with the new release's copy. Restart your Claude Code session for the new SKILL.md to load. If codebeacon is installed in editable mode (`pip install -e .`), the package step is skipped — pass `--force` to upgrade anyway.
275
322
 
276
323
  ### MCP Server
277
324