codebeacon 0.3.0__tar.gz → 0.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. {codebeacon-0.3.0 → codebeacon-0.3.1}/PKG-INFO +4 -2
  2. {codebeacon-0.3.0 → codebeacon-0.3.1}/README.de.md +3 -1
  3. {codebeacon-0.3.0 → codebeacon-0.3.1}/README.es.md +3 -1
  4. {codebeacon-0.3.0 → codebeacon-0.3.1}/README.fr.md +3 -1
  5. {codebeacon-0.3.0 → codebeacon-0.3.1}/README.ja.md +3 -1
  6. {codebeacon-0.3.0 → codebeacon-0.3.1}/README.ko.md +3 -1
  7. {codebeacon-0.3.0 → codebeacon-0.3.1}/README.md +3 -1
  8. {codebeacon-0.3.0 → codebeacon-0.3.1}/README.pt-BR.md +3 -1
  9. {codebeacon-0.3.0 → codebeacon-0.3.1}/README.zh-CN.md +3 -1
  10. codebeacon-0.3.1/codebeacon/__init__.py +1 -0
  11. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/cli.py +25 -1
  12. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/config.py +57 -0
  13. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/discover/detector.py +12 -4
  14. {codebeacon-0.3.0 → codebeacon-0.3.1}/pyproject.toml +1 -1
  15. codebeacon-0.3.0/codebeacon/__init__.py +0 -1
  16. {codebeacon-0.3.0 → codebeacon-0.3.1}/.cursorrules +0 -0
  17. {codebeacon-0.3.0 → codebeacon-0.3.1}/.github/CODEOWNERS +0 -0
  18. {codebeacon-0.3.0 → codebeacon-0.3.1}/.github/dependabot.yml +0 -0
  19. {codebeacon-0.3.0 → codebeacon-0.3.1}/.github/workflows/ci.yml +0 -0
  20. {codebeacon-0.3.0 → codebeacon-0.3.1}/.github/workflows/release.yml +0 -0
  21. {codebeacon-0.3.0 → codebeacon-0.3.1}/.gitignore +0 -0
  22. {codebeacon-0.3.0 → codebeacon-0.3.1}/AGENTS.md +0 -0
  23. {codebeacon-0.3.0 → codebeacon-0.3.1}/CLAUDE.md +0 -0
  24. {codebeacon-0.3.0 → codebeacon-0.3.1}/LICENSE +0 -0
  25. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/__main__.py +0 -0
  26. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/cache.py +0 -0
  27. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/common/__init__.py +0 -0
  28. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/common/filters.py +0 -0
  29. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/common/safety.py +0 -0
  30. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/common/symbols.py +0 -0
  31. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/common/types.py +0 -0
  32. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/contextmap/__init__.py +0 -0
  33. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/contextmap/generator.py +0 -0
  34. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/discover/__init__.py +0 -0
  35. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/discover/ignore.py +0 -0
  36. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/discover/scanner.py +0 -0
  37. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/__init__.py +0 -0
  38. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/callflow_html.py +0 -0
  39. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/hooks.py +0 -0
  40. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/mcp.py +0 -0
  41. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/merge.py +0 -0
  42. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/obsidian.py +0 -0
  43. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/tree_html.py +0 -0
  44. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/__init__.py +0 -0
  45. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/base.py +0 -0
  46. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/components.py +0 -0
  47. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/dependencies.py +0 -0
  48. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/entities.py +0 -0
  49. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/README.md +0 -0
  50. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/actix.scm +0 -0
  51. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/angular.scm +0 -0
  52. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/aspnet.scm +0 -0
  53. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/django.scm +0 -0
  54. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/express.scm +0 -0
  55. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/fastapi.scm +0 -0
  56. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/flask.scm +0 -0
  57. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/gin.scm +0 -0
  58. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/ktor.scm +0 -0
  59. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/laravel.scm +0 -0
  60. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/nestjs.scm +0 -0
  61. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/rails.scm +0 -0
  62. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/react.scm +0 -0
  63. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/spring_boot.scm +0 -0
  64. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/svelte.scm +0 -0
  65. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/tauri.scm +0 -0
  66. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/vapor.scm +0 -0
  67. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/vue.scm +0 -0
  68. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/routes.py +0 -0
  69. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/semantic.py +0 -0
  70. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/services.py +0 -0
  71. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/__init__.py +0 -0
  72. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/analyze.py +0 -0
  73. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/build.py +0 -0
  74. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/cluster.py +0 -0
  75. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/enrich.py +0 -0
  76. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/write.py +0 -0
  77. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/plugins/__init__.py +0 -0
  78. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/plugins/githooks.py +0 -0
  79. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/plugins/skills.py +0 -0
  80. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/skill/SKILL.md +0 -0
  81. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/wave.py +0 -0
  82. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/wiki/__init__.py +0 -0
  83. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/wiki/generator.py +0 -0
  84. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/wiki/index.py +0 -0
  85. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/wiki/templates.py +0 -0
  86. {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon.yaml.example +0 -0
  87. {codebeacon-0.3.0 → codebeacon-0.3.1}/docs/TRANSLATION_STATUS.md +0 -0
  88. {codebeacon-0.3.0 → codebeacon-0.3.1}/public-plan.md +0 -0
  89. {codebeacon-0.3.0 → codebeacon-0.3.1}/skill/SKILL.md +0 -0
  90. {codebeacon-0.3.0 → codebeacon-0.3.1}/skill/install.py +0 -0
  91. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/__init__.py +0 -0
  92. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/conftest.py +0 -0
  93. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/actix/main.rs +0 -0
  94. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/angular/app.component.ts +0 -0
  95. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/aspnet/UserController.cs +0 -0
  96. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/django/views.py +0 -0
  97. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/express/userRouter.js +0 -0
  98. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/fastapi/main.py +0 -0
  99. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/flask/app.py +0 -0
  100. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/gin/main.go +0 -0
  101. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/ktor/UserRoutes.kt +0 -0
  102. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/laravel/UserController.php +0 -0
  103. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/nestjs/user.controller.ts +0 -0
  104. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/rails/users_controller.rb +0 -0
  105. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/react/UserPage.tsx +0 -0
  106. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/spring_boot/UserController.java +0 -0
  107. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/sveltekit/+page.svelte +0 -0
  108. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/vapor/routes.swift +0 -0
  109. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/vue/UserList.vue +0 -0
  110. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_discover.py +0 -0
  111. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_entities.py +0 -0
  112. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_filters.py +0 -0
  113. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_graph.py +0 -0
  114. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_plugins.py +0 -0
  115. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_resolve.py +0 -0
  116. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_routes.py +0 -0
  117. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_safety_and_writes.py +0 -0
  118. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_services.py +0 -0
  119. {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_wiki.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codebeacon
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Source code AST analysis tool for AI context generation — unified multi-framework knowledge graph
5
5
  Project-URL: Homepage, https://github.com/codebeacon/codebeacon
6
6
  Project-URL: Repository, https://github.com/codebeacon/codebeacon
@@ -96,6 +96,7 @@ Existing tools solve this partially. Route analyzers map your controllers but mi
96
96
  - **gitignore-style `.codebeaconignore`** — last-match-wins with `!` negation, dir patterns (`build/`), anchored patterns (`/secrets.txt`), trailing-whitespace rules
97
97
  - **Zero configuration** — auto-detects frameworks and languages; generates `codebeacon.yaml` for repeat runs
98
98
  - **Deep-dive mode** — `--deep-dive` generates per-project `.codebeacon/` + `CLAUDE.md` for every sub-project; running `codebeacon scan . --update` from any sub-project folder automatically syncs all projects in the workspace
99
+ - **Workspace auto-rediscovery** — on every `scan` / `sync`, codebeacon re-scans the workspace and appends any new project folders to `codebeacon.yaml` before extraction, so freshly added sub-projects are never silently skipped; pass `--no-rediscover` to opt out for hand-curated configs
99
100
 
100
101
  ---
101
102
 
@@ -324,8 +325,9 @@ codebeacon scan /workspace --deep-dive # per-project + combined workspace out
324
325
 
325
326
  # Config-driven mode
326
327
  codebeacon init [path] # auto-generate codebeacon.yaml
327
- codebeacon sync # run from codebeacon.yaml
328
+ codebeacon sync # run from codebeacon.yaml (auto-appends new workspace projects)
328
329
  codebeacon sync --config <file> # use a specific config file
330
+ codebeacon sync --no-rediscover # don't auto-append newly added projects (hand-curated yaml mode)
329
331
 
330
332
  # Query the knowledge graph
331
333
  codebeacon query <term> [--dir .codebeacon] [--limit N] # search nodes by label substring
@@ -55,6 +55,7 @@ Bestehende Tools lösen dieses Problem nur teilweise. Route-Analyzer erfassen Ih
55
55
  - **`.codebeaconignore` im gitignore-Stil** — last-match-wins mit `!`-Negation, Verzeichnis-Patterns (`build/`), verankerte Patterns (`/secrets.txt`), Trailing-Whitespace-Regeln
56
56
  - **Keine Konfiguration notwendig** — erkennt Frameworks und Sprachen automatisch; generiert `codebeacon.yaml` für Folgeläufe
57
57
  - **Deep-Dive-Modus** — `--deep-dive` erzeugt für jedes Sub-Projekt eigene `.codebeacon/` + `CLAUDE.md`; ein Update-Aufruf aus **beliebigem** Sub-Projekt-Ordner synchronisiert automatisch alle Projekte im Workspace
58
+ - **Automatische Workspace-Wiedererkennung** — bei jedem `scan`/`sync` scannt codebeacon den Workspace erneut und hängt vor der Extraktion automatisch neue Projekte an die `codebeacon.yaml` an, sodass frisch hinzugefügte Sub-Projekte nicht unbemerkt übersprungen werden; `--no-rediscover` deaktiviert dies für handgepflegte Konfigurationen
58
59
 
59
60
  ---
60
61
 
@@ -363,7 +364,8 @@ codebeacon scan . --list-only # nur Frameworks erkennen
363
364
  codebeacon scan /workspace --deep-dive # Pro-Projekt- + kombinierte Workspace-Ausgabe
364
365
 
365
366
  codebeacon init [pfad] # codebeacon.yaml generieren
366
- codebeacon sync # von codebeacon.yaml ausführen
367
+ codebeacon sync # von codebeacon.yaml ausführen (hängt neue Workspace-Projekte automatisch an)
368
+ codebeacon sync --no-rediscover # neue Projekte nicht automatisch anhängen (handgepflegter yaml-Modus)
367
369
 
368
370
  codebeacon query <Begriff> [--dir .codebeacon] [--limit N] # Knoten per Label-Substring suchen
369
371
  codebeacon path <Quelle> <Ziel> [--dir .codebeacon] # kürzester Abhängigkeitspfad
@@ -55,6 +55,7 @@ Las herramientas existentes resuelven esto de forma parcial. Los analizadores de
55
55
  - **`.codebeaconignore` estilo gitignore** — last-match-wins con negación `!`, patrones de directorio (`build/`), patrones anclados (`/secrets.txt`), reglas de espacio final
56
56
  - **Cero configuración** — detecta frameworks y lenguajes automáticamente; genera `codebeacon.yaml` para ejecuciones posteriores
57
57
  - **Modo Deep Dive** — `--deep-dive` genera `.codebeacon/` + `CLAUDE.md` propios para cada sub-proyecto; ejecutar el comando de actualización desde **cualquier** sub-proyecto sincroniza automáticamente todos los proyectos del workspace
58
+ - **Auto-redescubrimiento del workspace** — en cada `scan`/`sync`, codebeacon re-escanea el workspace y añade automáticamente al `codebeacon.yaml` los nuevos proyectos antes de extraer, de modo que los sub-proyectos recién añadidos nunca se omitan silenciosamente; usa `--no-rediscover` para optar por el modo de configuración curada manualmente
58
59
 
59
60
  ---
60
61
 
@@ -362,7 +363,8 @@ codebeacon scan . --list-only # solo detectar frameworks
362
363
  codebeacon scan /workspace --deep-dive # salida por proyecto + workspace combinado
363
364
 
364
365
  codebeacon init [ruta] # generar codebeacon.yaml
365
- codebeacon sync # ejecutar desde codebeacon.yaml
366
+ codebeacon sync # ejecutar desde codebeacon.yaml (añade nuevos proyectos del workspace automáticamente)
367
+ codebeacon sync --no-rediscover # no añadir automáticamente nuevos proyectos (modo yaml curado a mano)
366
368
 
367
369
  codebeacon query <término> [--dir .codebeacon] [--limit N] # buscar nodos por substring de etiqueta
368
370
  codebeacon path <origen> <destino> [--dir .codebeacon] # ruta más corta de dependencias
@@ -55,6 +55,7 @@ Les outils existants ne résolvent ce problème qu'en partie. Les analyseurs de
55
55
  - **`.codebeaconignore` style gitignore** — last-match-wins avec négation `!`, patterns de répertoire (`build/`), patterns ancrés (`/secrets.txt`), règles sur espaces de fin
56
56
  - **Zéro configuration** — détecte automatiquement les frameworks et langages ; génère `codebeacon.yaml` pour les exécutions suivantes
57
57
  - **Mode Deep Dive** — `--deep-dive` génère un `.codebeacon/` + `CLAUDE.md` propre à chaque sous-projet ; une commande de mise à jour depuis **n'importe quel** sous-projet synchronise automatiquement tous les projets du workspace
58
+ - **Redécouverte automatique du workspace** — à chaque `scan`/`sync`, codebeacon réanalyse le workspace et ajoute automatiquement les nouveaux projets au `codebeacon.yaml` avant l'extraction, de sorte que les sous-projets fraîchement ajoutés ne soient jamais oubliés en silence ; utilisez `--no-rediscover` pour conserver une configuration yaml gérée manuellement
58
59
 
59
60
  ---
60
61
 
@@ -362,7 +363,8 @@ codebeacon scan . --list-only # détecter les frameworks uniquement
362
363
  codebeacon scan /workspace --deep-dive # sortie par projet + workspace combiné
363
364
 
364
365
  codebeacon init [chemin] # générer codebeacon.yaml
365
- codebeacon sync # exécuter depuis codebeacon.yaml
366
+ codebeacon sync # exécuter depuis codebeacon.yaml (ajoute automatiquement les nouveaux projets du workspace)
367
+ codebeacon sync --no-rediscover # ne pas ajouter automatiquement les nouveaux projets (mode yaml géré manuellement)
366
368
 
367
369
  codebeacon query <terme> [--dir .codebeacon] [--limit N] # rechercher des nœuds par sous-chaîne de label
368
370
  codebeacon path <source> <cible> [--dir .codebeacon] # chemin de dépendances le plus court
@@ -55,6 +55,7 @@ AI コーディングセッションを新しく開くたびに、アシスタ
55
55
  - **gitignore 互換 `.codebeaconignore`** — last-match-wins、`!` 否定、ディレクトリパターン(`build/`)、アンカーパターン(`/secrets.txt`)、末尾空白処理
56
56
  - **ゼロ設定** — フレームワークと言語を自動検出;繰り返し実行のために `codebeacon.yaml` を自動生成
57
57
  - **ディープダイブモード** — `--deep-dive` で各サブプロジェクトに専用の `.codebeacon/` + `CLAUDE.md` を生成;**どのサブプロジェクトからでも**更新コマンドを実行するだけでワークスペース全体が自動同期
58
+ - **ワークスペース自動再検出** — `scan`/`sync` 実行のたびにワークスペースを再スキャンし、`codebeacon.yaml` に未登録の新規プロジェクトを自動追加してから抽出を開始するため、新しく追加されたサブプロジェクトが見落とされることがない;yaml を手動で管理している場合は `--no-rediscover` でオプトアウト可能
58
59
 
59
60
  ---
60
61
 
@@ -271,8 +272,9 @@ codebeacon scan /workspace --deep-dive # プロジェクト別 + 統合ワー
271
272
 
272
273
  # 設定ベースモード
273
274
  codebeacon init [path] # codebeacon.yaml を自動生成
274
- codebeacon sync # codebeacon.yaml ベースで実行
275
+ codebeacon sync # codebeacon.yaml ベースで実行 (新規ワークスペースプロジェクトを自動追加)
275
276
  codebeacon sync --config <file> # 特定の設定ファイルを使用
277
+ codebeacon sync --no-rediscover # 新規プロジェクトの自動追加を無効化 (手動キュレーションモード)
276
278
 
277
279
  # ナレッジグラフのクエリ
278
280
  codebeacon query <term> [--dir .codebeacon] [--limit N] # ラベル部分文字列でノード検索
@@ -55,6 +55,7 @@ AI 코딩 세션을 새로 열 때마다 어시스턴트는 백지 상태에서
55
55
  - **gitignore 호환 `.codebeaconignore`** — last-match-wins, `!` 부정, 디렉토리 패턴(`build/`), 앵커 패턴(`/secrets.txt`), 트레일링 공백 처리
56
56
  - **제로 설정** — 프레임워크와 언어 자동 감지; 반복 실행을 위한 `codebeacon.yaml` 자동 생성
57
57
  - **딥다이브 모드** — `--deep-dive`는 각 서브 프로젝트에 개별 `.codebeacon/` + `CLAUDE.md`를 생성; 어느 서브 프로젝트 폴더에서든 `codebeacon scan . --update`를 실행하면 워크스페이스의 모든 프로젝트가 자동으로 업데이트됨
58
+ - **워크스페이스 자동 재발견** — `scan`/`sync` 실행마다 워크스페이스를 다시 훑어 `codebeacon.yaml`에 없는 신규 프로젝트를 자동으로 yaml에 추가한 뒤 추출 시작 — 새로 추가된 서브 프로젝트가 조용히 누락되지 않음; 수동으로 yaml을 큐레이션 중이라면 `--no-rediscover`로 옵트아웃
58
59
 
59
60
  ---
60
61
 
@@ -282,8 +283,9 @@ codebeacon scan /workspace --deep-dive # 프로젝트별 + 통합 워크스
282
283
 
283
284
  # 설정 기반 모드
284
285
  codebeacon init [path] # codebeacon.yaml 자동 생성
285
- codebeacon sync # codebeacon.yaml 기반 실행
286
+ codebeacon sync # codebeacon.yaml 기반 실행 (신규 워크스페이스 프로젝트 자동 추가)
286
287
  codebeacon sync --config <file> # 특정 설정 파일 사용
288
+ codebeacon sync --no-rediscover # 신규 프로젝트 자동 추가 비활성화 (수동 큐레이션 모드)
287
289
 
288
290
  # 지식 그래프 쿼리
289
291
  codebeacon query <term> [--dir .codebeacon] [--limit N] # 라벨 부분 문자열로 노드 검색
@@ -53,6 +53,7 @@ Existing tools solve this partially. Route analyzers map your controllers but mi
53
53
  - **gitignore-style `.codebeaconignore`** — last-match-wins with `!` negation, dir patterns (`build/`), anchored patterns (`/secrets.txt`), trailing-whitespace rules
54
54
  - **Zero configuration** — auto-detects frameworks and languages; generates `codebeacon.yaml` for repeat runs
55
55
  - **Deep-dive mode** — `--deep-dive` generates per-project `.codebeacon/` + `CLAUDE.md` for every sub-project; running `codebeacon scan . --update` from any sub-project folder automatically syncs all projects in the workspace
56
+ - **Workspace auto-rediscovery** — on every `scan` / `sync`, codebeacon re-scans the workspace and appends any new project folders to `codebeacon.yaml` before extraction, so freshly added sub-projects are never silently skipped; pass `--no-rediscover` to opt out for hand-curated configs
56
57
 
57
58
  ---
58
59
 
@@ -281,8 +282,9 @@ codebeacon scan /workspace --deep-dive # per-project + combined workspace out
281
282
 
282
283
  # Config-driven mode
283
284
  codebeacon init [path] # auto-generate codebeacon.yaml
284
- codebeacon sync # run from codebeacon.yaml
285
+ codebeacon sync # run from codebeacon.yaml (auto-appends new workspace projects)
285
286
  codebeacon sync --config <file> # use a specific config file
287
+ codebeacon sync --no-rediscover # don't auto-append newly added projects (hand-curated yaml mode)
286
288
 
287
289
  # Query the knowledge graph
288
290
  codebeacon query <term> [--dir .codebeacon] [--limit N] # search nodes by label substring
@@ -55,6 +55,7 @@ As ferramentas existentes resolvem isso apenas parcialmente. Analisadores de rot
55
55
  - **`.codebeaconignore` estilo gitignore** — last-match-wins com negação `!`, padrões de diretório (`build/`), padrões ancorados (`/secrets.txt`), regras de espaço final
56
56
  - **Zero configuração** — detecta frameworks e linguagens automaticamente; gera `codebeacon.yaml` para execuções futuras
57
57
  - **Modo Deep Dive** — `--deep-dive` gera `.codebeacon/` + `CLAUDE.md` próprios para cada sub-projeto; executar o comando de atualização de **qualquer** sub-projeto sincroniza automaticamente todos os projetos do workspace
58
+ - **Auto-redescoberta do workspace** — a cada `scan`/`sync`, o codebeacon re-escaneia o workspace e adiciona automaticamente os novos projetos ao `codebeacon.yaml` antes da extração, evitando que sub-projetos recém-criados sejam silenciosamente ignorados; use `--no-rediscover` para manter uma configuração yaml curada manualmente
58
59
 
59
60
  ---
60
61
 
@@ -362,7 +363,8 @@ codebeacon scan . --list-only # apenas detectar frameworks
362
363
  codebeacon scan /workspace --deep-dive # saída por projeto + workspace combinado
363
364
 
364
365
  codebeacon init [caminho] # gerar codebeacon.yaml
365
- codebeacon sync # executar a partir do codebeacon.yaml
366
+ codebeacon sync # executar a partir do codebeacon.yaml (adiciona novos projetos do workspace automaticamente)
367
+ codebeacon sync --no-rediscover # não adicionar novos projetos automaticamente (modo yaml curado à mão)
366
368
 
367
369
  codebeacon query <termo> [--dir .codebeacon] [--limit N] # buscar nós por substring do label
368
370
  codebeacon path <origem> <destino> [--dir .codebeacon] # caminho de dependências mais curto
@@ -55,6 +55,7 @@
55
55
  - **gitignore 风格 `.codebeaconignore`** — last-match-wins、`!` 否定、目录模式(`build/`)、锚定模式(`/secrets.txt`)、行尾空白处理
56
56
  - **零配置** — 自动检测框架和语言;自动生成 `codebeacon.yaml` 供后续运行
57
57
  - **深度扫描模式** — `--deep-dive` 为每个子项目生成专属 `.codebeacon/` + `CLAUDE.md`;从**任意**子项目目录执行更新命令,即可自动同步整个工作区的所有项目
58
+ - **工作区自动重新发现** — 每次执行 `scan`/`sync` 时,codebeacon 会重新扫描工作区,并将 `codebeacon.yaml` 中尚未登记的新项目自动追加后再进行抽取,新增子项目不会被静默跳过;若手动维护 yaml,可通过 `--no-rediscover` 退出此行为
58
59
 
59
60
  ---
60
61
 
@@ -270,8 +271,9 @@ codebeacon scan /workspace --deep-dive # 各项目独立输出 + 工作区合
270
271
 
271
272
  # 配置驱动模式
272
273
  codebeacon init [path] # 自动生成 codebeacon.yaml
273
- codebeacon sync # 基于 codebeacon.yaml 运行
274
+ codebeacon sync # 基于 codebeacon.yaml 运行(自动追加工作区中的新项目)
274
275
  codebeacon sync --config <file> # 使用指定配置文件
276
+ codebeacon sync --no-rediscover # 不自动追加新项目(手动维护 yaml 模式)
275
277
 
276
278
  # 查询知识图谱
277
279
  codebeacon query <term> [--dir .codebeacon] [--limit N] # 通过标签子串搜索节点
@@ -0,0 +1 @@
1
+ __version__ = "0.3.1"
@@ -561,7 +561,9 @@ def _write_project_artifact_outputs(G, communities, project, proj_output_dir: st
561
561
 
562
562
 
563
563
  def _cmd_sync(args: argparse.Namespace) -> int:
564
- from codebeacon.config import load_config, find_config
564
+ from codebeacon.config import (
565
+ load_config, find_config, discover_new_projects, append_projects_to_yaml,
566
+ )
565
567
  from codebeacon.discover.detector import detect_framework
566
568
  from codebeacon.common.types import ProjectInfo
567
569
 
@@ -580,6 +582,18 @@ def _cmd_sync(args: argparse.Namespace) -> int:
580
582
  print(f"Error loading config: {e}", file=sys.stderr)
581
583
  return 1
582
584
 
585
+ # Auto-discover projects added to the workspace since the yaml was last written.
586
+ # Skip when `--no-rediscover` is set so users with hand-curated yaml configs
587
+ # can opt out.
588
+ if not getattr(args, "no_rediscover", False):
589
+ new_projects = discover_new_projects(config)
590
+ if new_projects:
591
+ print(f"Found {len(new_projects)} new project(s); adding to {config.config_file}:")
592
+ for p in new_projects:
593
+ print(f" + {p.name:<20} {p.framework:<15} {p.path}")
594
+ append_projects_to_yaml(config.config_file, new_projects)
595
+ config = load_config(config.config_file)
596
+
583
597
  print(f"Using {config.config_file}")
584
598
  print(f"Processing {len(config.projects)} project(s)...")
585
599
 
@@ -768,6 +782,11 @@ def build_parser() -> argparse.ArgumentParser:
768
782
  action="store_true",
769
783
  help="Generate per-project .codebeacon/ + CLAUDE.md for each sub-project, plus a combined workspace output",
770
784
  )
785
+ scan_p.add_argument(
786
+ "--no-rediscover",
787
+ action="store_true",
788
+ help="When auto-switching to sync mode, do NOT scan the workspace for newly added projects",
789
+ )
771
790
  scan_p.set_defaults(func=_cmd_scan)
772
791
 
773
792
  # sync
@@ -780,6 +799,11 @@ def build_parser() -> argparse.ArgumentParser:
780
799
  action="store_true",
781
800
  help="Override config: force deep-dive mode",
782
801
  )
802
+ sync_p.add_argument(
803
+ "--no-rediscover",
804
+ action="store_true",
805
+ help="Skip scanning the workspace for newly added projects",
806
+ )
783
807
  sync_p.set_defaults(func=_cmd_sync)
784
808
 
785
809
  # init
@@ -158,3 +158,60 @@ def generate_config(
158
158
  data["deep_dive"] = True
159
159
  with open(config_path, "w") as f:
160
160
  yaml.dump(data, f, default_flow_style=False, allow_unicode=True, sort_keys=False)
161
+
162
+
163
+ def discover_new_projects(config: CodebeaconConfig) -> list:
164
+ """Re-scan the workspace around the loaded config for newly added projects.
165
+
166
+ Compares the freshly discovered project list (rooted at the yaml's parent
167
+ directory) against the projects already tracked in ``config.projects``,
168
+ using resolved absolute paths for de-duplication. Returns ``ProjectInfo``
169
+ entries that are NOT yet in the yaml so callers can append them.
170
+ """
171
+ from codebeacon.discover.detector import discover_projects
172
+
173
+ workspace_root = Path(config.config_file).parent
174
+ try:
175
+ found = discover_projects([str(workspace_root)])
176
+ except (FileNotFoundError, ValueError):
177
+ return []
178
+
179
+ known_paths = {Path(p.path).resolve() for p in config.projects}
180
+ new_projects: list = []
181
+ for p in found:
182
+ resolved = Path(p.path).resolve()
183
+ if resolved in known_paths:
184
+ continue
185
+ # Skip projects nested inside a project already tracked in the yaml —
186
+ # the parent entry already covers them, so adding a child would
187
+ # double-count files and clutter the config (e.g. `dring-mobile/android`
188
+ # inside a `dring-mobile` rails app).
189
+ if any(known == resolved or known in resolved.parents for known in known_paths):
190
+ continue
191
+ new_projects.append(p)
192
+ return new_projects
193
+
194
+
195
+ def append_projects_to_yaml(config_path: str | Path, new_projects: list) -> None:
196
+ """Append discovered projects to an existing codebeacon.yaml in place.
197
+
198
+ Preserves all unrelated keys (output, wave, semantic, deep_dive, etc.) and
199
+ existing project entries. Re-serializes via pyyaml so any comments in the
200
+ original file are lost — acceptable trade-off because the file is normally
201
+ machine-generated by :func:`generate_config`.
202
+ """
203
+ config_path = Path(config_path)
204
+ with open(config_path) as f:
205
+ raw = yaml.safe_load(f) or {}
206
+
207
+ projects_list = raw.get("projects") or []
208
+ for p in new_projects:
209
+ projects_list.append({
210
+ "name": p.name,
211
+ "path": p.path,
212
+ "type": p.framework,
213
+ })
214
+ raw["projects"] = projects_list
215
+
216
+ with open(config_path, "w") as f:
217
+ yaml.dump(raw, f, default_flow_style=False, allow_unicode=True, sort_keys=False)
@@ -187,11 +187,19 @@ def _has_project_signature(directory: Path) -> bool:
187
187
  "svelte.config.js", "svelte.config.ts",
188
188
  ]
189
189
  for sig in signature_files:
190
- if (directory / sig).exists():
191
- return True
190
+ try:
191
+ if (directory / sig).exists():
192
+ return True
193
+ except OSError:
194
+ # Permission-restricted siblings (e.g. macOS semaphore dirs in /tmp)
195
+ # would otherwise crash the whole discover pass.
196
+ continue
192
197
  # Check for *.csproj
193
- if list(directory.glob("*.csproj")):
194
- return True
198
+ try:
199
+ if list(directory.glob("*.csproj")):
200
+ return True
201
+ except OSError:
202
+ pass
195
203
  return False
196
204
 
197
205
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codebeacon"
7
- version = "0.3.0"
7
+ version = "0.3.1"
8
8
  description = "Source code AST analysis tool for AI context generation — unified multi-framework knowledge graph"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -1 +0,0 @@
1
- __version__ = "0.3.0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes