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.
- {codebeacon-0.3.0 → codebeacon-0.3.1}/PKG-INFO +4 -2
- {codebeacon-0.3.0 → codebeacon-0.3.1}/README.de.md +3 -1
- {codebeacon-0.3.0 → codebeacon-0.3.1}/README.es.md +3 -1
- {codebeacon-0.3.0 → codebeacon-0.3.1}/README.fr.md +3 -1
- {codebeacon-0.3.0 → codebeacon-0.3.1}/README.ja.md +3 -1
- {codebeacon-0.3.0 → codebeacon-0.3.1}/README.ko.md +3 -1
- {codebeacon-0.3.0 → codebeacon-0.3.1}/README.md +3 -1
- {codebeacon-0.3.0 → codebeacon-0.3.1}/README.pt-BR.md +3 -1
- {codebeacon-0.3.0 → codebeacon-0.3.1}/README.zh-CN.md +3 -1
- codebeacon-0.3.1/codebeacon/__init__.py +1 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/cli.py +25 -1
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/config.py +57 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/discover/detector.py +12 -4
- {codebeacon-0.3.0 → codebeacon-0.3.1}/pyproject.toml +1 -1
- codebeacon-0.3.0/codebeacon/__init__.py +0 -1
- {codebeacon-0.3.0 → codebeacon-0.3.1}/.cursorrules +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/.github/CODEOWNERS +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/.github/dependabot.yml +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/.github/workflows/ci.yml +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/.github/workflows/release.yml +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/.gitignore +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/AGENTS.md +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/CLAUDE.md +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/LICENSE +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/__main__.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/cache.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/common/__init__.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/common/filters.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/common/safety.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/common/symbols.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/common/types.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/contextmap/__init__.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/contextmap/generator.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/discover/__init__.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/discover/ignore.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/discover/scanner.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/__init__.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/callflow_html.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/hooks.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/mcp.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/merge.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/obsidian.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/export/tree_html.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/__init__.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/base.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/components.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/dependencies.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/entities.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/README.md +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/actix.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/angular.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/aspnet.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/django.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/express.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/fastapi.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/flask.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/gin.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/ktor.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/laravel.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/nestjs.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/rails.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/react.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/spring_boot.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/svelte.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/tauri.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/vapor.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/queries/vue.scm +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/routes.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/semantic.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/extract/services.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/__init__.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/analyze.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/build.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/cluster.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/enrich.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/graph/write.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/plugins/__init__.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/plugins/githooks.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/plugins/skills.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/skill/SKILL.md +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/wave.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/wiki/__init__.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/wiki/generator.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/wiki/index.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon/wiki/templates.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/codebeacon.yaml.example +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/docs/TRANSLATION_STATUS.md +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/public-plan.md +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/skill/SKILL.md +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/skill/install.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/__init__.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/conftest.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/actix/main.rs +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/angular/app.component.ts +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/aspnet/UserController.cs +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/django/views.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/express/userRouter.js +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/fastapi/main.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/flask/app.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/gin/main.go +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/ktor/UserRoutes.kt +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/laravel/UserController.php +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/nestjs/user.controller.ts +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/rails/users_controller.rb +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/react/UserPage.tsx +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/spring_boot/UserController.java +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/sveltekit/+page.svelte +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/vapor/routes.swift +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/fixtures/vue/UserList.vue +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_discover.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_entities.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_filters.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_graph.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_plugins.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_resolve.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_routes.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_safety_and_writes.py +0 -0
- {codebeacon-0.3.0 → codebeacon-0.3.1}/tests/test_services.py +0 -0
- {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.
|
|
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
|
|
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
|
-
|
|
191
|
-
|
|
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
|
-
|
|
194
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|