codebeacon 0.1.4__tar.gz → 0.1.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.
- {codebeacon-0.1.4 → codebeacon-0.1.5}/PKG-INFO +3 -3
- {codebeacon-0.1.4 → codebeacon-0.1.5}/README.de.md +1 -1
- {codebeacon-0.1.4 → codebeacon-0.1.5}/README.es.md +2 -2
- {codebeacon-0.1.4 → codebeacon-0.1.5}/README.fr.md +2 -2
- {codebeacon-0.1.4 → codebeacon-0.1.5}/README.ja.md +2 -2
- {codebeacon-0.1.4 → codebeacon-0.1.5}/README.ko.md +2 -2
- {codebeacon-0.1.4 → codebeacon-0.1.5}/README.md +2 -2
- {codebeacon-0.1.4 → codebeacon-0.1.5}/README.pt-BR.md +2 -2
- {codebeacon-0.1.4 → codebeacon-0.1.5}/README.zh-CN.md +2 -2
- codebeacon-0.1.5/codebeacon/__init__.py +1 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/discover/detector.py +7 -4
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/base.py +1 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/components.py +1 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/dependencies.py +7 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/entities.py +76 -0
- codebeacon-0.1.5/codebeacon/extract/queries/tauri.scm +62 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/routes.py +51 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/services.py +33 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/skill/SKILL.md +2 -2
- {codebeacon-0.1.4 → codebeacon-0.1.5}/pyproject.toml +1 -1
- codebeacon-0.1.4/codebeacon/__init__.py +0 -1
- {codebeacon-0.1.4 → codebeacon-0.1.5}/.cursorrules +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/.github/CODEOWNERS +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/.github/dependabot.yml +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/.github/workflows/ci.yml +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/.github/workflows/release.yml +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/.gitignore +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/AGENTS.md +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/CLAUDE.md +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/LICENSE +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/__main__.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/cache.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/cli.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/common/__init__.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/common/filters.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/common/symbols.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/common/types.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/config.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/contextmap/__init__.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/contextmap/generator.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/discover/__init__.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/discover/scanner.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/export/__init__.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/export/mcp.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/export/obsidian.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/__init__.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/README.md +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/actix.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/angular.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/aspnet.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/django.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/express.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/fastapi.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/flask.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/gin.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/ktor.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/laravel.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/nestjs.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/rails.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/react.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/spring_boot.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/svelte.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/vapor.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/queries/vue.scm +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/extract/semantic.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/graph/__init__.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/graph/analyze.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/graph/build.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/graph/cluster.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/graph/enrich.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/wave.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/wiki/__init__.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/wiki/generator.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/wiki/index.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon/wiki/templates.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/codebeacon.yaml.example +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/docs/TRANSLATION_STATUS.md +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/public-plan.md +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/skill/SKILL.md +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/skill/install.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/__init__.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/conftest.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/actix/main.rs +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/angular/app.component.ts +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/aspnet/UserController.cs +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/django/views.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/express/userRouter.js +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/fastapi/main.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/flask/app.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/gin/main.go +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/ktor/UserRoutes.kt +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/laravel/UserController.php +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/nestjs/user.controller.ts +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/rails/users_controller.rb +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/react/UserPage.tsx +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/spring_boot/UserController.java +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/sveltekit/+page.svelte +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/vapor/routes.swift +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/fixtures/vue/UserList.vue +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/test_discover.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/test_entities.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/test_filters.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/test_graph.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/test_resolve.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/test_routes.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/test_services.py +0 -0
- {codebeacon-0.1.4 → codebeacon-0.1.5}/tests/test_wiki.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codebeacon
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.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
|
|
@@ -81,7 +81,7 @@ Existing tools solve this partially. Route analyzers map your controllers but mi
|
|
|
81
81
|
## Key Features
|
|
82
82
|
|
|
83
83
|
- **Unified pipeline** — route/controller analysis + knowledge graph in one tool, no manual stitching
|
|
84
|
-
- **
|
|
84
|
+
- **27 frameworks, 9 languages** — Spring Boot, NestJS, Django, FastAPI, Flask, Rails, Express, Fastify, Koa, React, Next.js, Vue, Nuxt, Angular, SvelteKit, Gin, Echo, Fiber, Laravel, Actix-Web, Axum, Tauri, Rocket, Warp, ASP.NET Core, Vapor, Ktor
|
|
85
85
|
- **Tree-sitter based** — structural AST parsing, not regex; all language grammars included out of the box
|
|
86
86
|
- **Two-pass DI resolution** — Pass 1 extracts local AST nodes; Pass 2 builds a global symbol table and resolves Interface → Implementation mappings that single-pass tools miss
|
|
87
87
|
- **Wave merge architecture** — files processed in parallel chunks, results merged globally; handles large monorepos without memory blowouts
|
|
@@ -122,7 +122,7 @@ codebeacon sync # subsequent runs via config
|
|
|
122
122
|
| Go | Gin, Echo, Fiber |
|
|
123
123
|
| Ruby | Rails |
|
|
124
124
|
| PHP | Laravel |
|
|
125
|
-
| Rust | Actix-Web, Axum |
|
|
125
|
+
| Rust | Actix-Web, Axum, Tauri, Rocket, Warp |
|
|
126
126
|
| C# | ASP.NET Core |
|
|
127
127
|
| Swift | Vapor |
|
|
128
128
|
|
|
@@ -40,7 +40,7 @@ Bestehende Tools lösen dieses Problem nur teilweise. Route-Analyzer erfassen Ih
|
|
|
40
40
|
## Hauptfunktionen
|
|
41
41
|
|
|
42
42
|
- **Einheitliche Pipeline** — Routes-/Controller-Analyse + Knowledge Graph in einem Tool, kein manuelles Zusammenführen
|
|
43
|
-
- **
|
|
43
|
+
- **27 Frameworks, 9 Sprachen** — Spring Boot, NestJS, Django, FastAPI, Flask, Rails, Express, Fastify, Koa, React, Next.js, Vue, Nuxt, Angular, SvelteKit, Gin, Echo, Fiber, Laravel, Actix-Web, Axum, Tauri, Rocket, Warp, ASP.NET Core, Vapor, Ktor
|
|
44
44
|
- **Auf tree-sitter basierend** — strukturelles AST-Parsing, keine Regex; Sprachgrammatiken standardmäßig enthalten
|
|
45
45
|
- **2-Pass DI-Auflösung** — Pass 1 extrahiert lokale AST-Knoten; Pass 2 baut eine globale Symboltabelle auf und löst Interface → Implementation-Mappings auf
|
|
46
46
|
- **Wave-Merge-Architektur** — Dateien werden in parallelen Chunks verarbeitet und global zusammengeführt; auch große Monorepos ohne Speicherprobleme
|
|
@@ -40,7 +40,7 @@ Las herramientas existentes resuelven esto de forma parcial. Los analizadores de
|
|
|
40
40
|
## Características principales
|
|
41
41
|
|
|
42
42
|
- **Pipeline unificado** — análisis de rutas/controladores + grafo de conocimiento en una sola herramienta
|
|
43
|
-
- **
|
|
43
|
+
- **27 frameworks, 9 lenguajes** — Spring Boot, NestJS, Django, FastAPI, Flask, Rails, Express, Fastify, Koa, React, Next.js, Vue, Nuxt, Angular, SvelteKit, Gin, Echo, Fiber, Laravel, Actix-Web, Axum, Tauri, Rocket, Warp, ASP.NET Core, Vapor, Ktor
|
|
44
44
|
- **Basado en tree-sitter** — análisis AST estructural, no expresiones regulares; gramáticas de lenguaje incluidas por defecto
|
|
45
45
|
- **Resolución DI en 2 pasos** — Pass 1 extrae nodos AST locales; Pass 2 construye una tabla de símbolos global y resuelve los mapeos Interface → Implementation
|
|
46
46
|
- **Arquitectura Wave merge** — archivos procesados en chunks paralelos y fusionados globalmente; maneja grandes monorepos sin problemas de memoria
|
|
@@ -81,7 +81,7 @@ codebeacon sync # ejecuciones posteriores vía configuraci
|
|
|
81
81
|
| Go | Gin, Echo, Fiber |
|
|
82
82
|
| Ruby | Rails |
|
|
83
83
|
| PHP | Laravel |
|
|
84
|
-
| Rust | Actix-Web, Axum |
|
|
84
|
+
| Rust | Actix-Web, Axum, Tauri, Rocket, Warp |
|
|
85
85
|
| C# | ASP.NET Core |
|
|
86
86
|
| Swift | Vapor |
|
|
87
87
|
|
|
@@ -40,7 +40,7 @@ Les outils existants ne résolvent ce problème qu'en partie. Les analyseurs de
|
|
|
40
40
|
## Fonctionnalités principales
|
|
41
41
|
|
|
42
42
|
- **Pipeline unifié** — analyse routes/contrôleurs + knowledge graph en un seul outil
|
|
43
|
-
- **
|
|
43
|
+
- **27 frameworks, 9 langages** — Spring Boot, NestJS, Django, FastAPI, Flask, Rails, Express, Fastify, Koa, React, Next.js, Vue, Nuxt, Angular, SvelteKit, Gin, Echo, Fiber, Laravel, Actix-Web, Axum, Tauri, Rocket, Warp, ASP.NET Core, Vapor, Ktor
|
|
44
44
|
- **Basé sur tree-sitter** — analyse AST structurelle, pas de regex ; grammaires de langage incluses par défaut
|
|
45
45
|
- **Résolution DI en 2 passes** — Pass 1 extrait les nœuds AST locaux ; Pass 2 construit une table de symboles globale et résout les mappings Interface → Implementation
|
|
46
46
|
- **Architecture Wave merge** — fichiers traités en chunks parallèles puis fusionnés globalement ; gère les grands monorepos sans problème mémoire
|
|
@@ -81,7 +81,7 @@ codebeacon sync # exécutions suivantes via la configuration
|
|
|
81
81
|
| Go | Gin, Echo, Fiber |
|
|
82
82
|
| Ruby | Rails |
|
|
83
83
|
| PHP | Laravel |
|
|
84
|
-
| Rust | Actix-Web, Axum |
|
|
84
|
+
| Rust | Actix-Web, Axum, Tauri, Rocket, Warp |
|
|
85
85
|
| C# | ASP.NET Core |
|
|
86
86
|
| Swift | Vapor |
|
|
87
87
|
|
|
@@ -40,7 +40,7 @@ AI コーディングセッションを新しく開くたびに、アシスタ
|
|
|
40
40
|
## 主な機能
|
|
41
41
|
|
|
42
42
|
- **統合パイプライン** — ルート/コントローラー解析 + ナレッジグラフを 1 つのツールで、手動接続不要
|
|
43
|
-
- **
|
|
43
|
+
- **27 フレームワーク、9 言語** — Spring Boot、NestJS、Django、FastAPI、Flask、Rails、Express、Fastify、Koa、React、Next.js、Vue、Nuxt、Angular、SvelteKit、Gin、Echo、Fiber、Laravel、Actix-Web、Axum、Tauri、Rocket、Warp、ASP.NET Core、Vapor、Ktor
|
|
44
44
|
- **tree-sitter ベース** — 正規表現ではなく構造的 AST パース;言語グラマーをデフォルトで同梱
|
|
45
45
|
- **2 パス DI 解決** — Pass 1 でローカル AST ノードを抽出、Pass 2 でグローバルシンボルテーブルを構築して Interface → Implementation のマッピングを解決
|
|
46
46
|
- **Wave マージアーキテクチャ** — ファイルを並列チャンクで処理して結果をグローバルにマージ;大規模モノレポでもメモリ問題なし
|
|
@@ -81,7 +81,7 @@ codebeacon sync # 以降の実行は設定ファイルベ
|
|
|
81
81
|
| Go | Gin、Echo、Fiber |
|
|
82
82
|
| Ruby | Rails |
|
|
83
83
|
| PHP | Laravel |
|
|
84
|
-
| Rust | Actix-Web、Axum |
|
|
84
|
+
| Rust | Actix-Web、Axum、Tauri、Rocket、Warp |
|
|
85
85
|
| C# | ASP.NET Core |
|
|
86
86
|
| Swift | Vapor |
|
|
87
87
|
|
|
@@ -40,7 +40,7 @@ AI 코딩 세션을 새로 열 때마다 어시스턴트는 백지 상태에서
|
|
|
40
40
|
## 주요 기능
|
|
41
41
|
|
|
42
42
|
- **통합 파이프라인** — 라우트/컨트롤러 분석 + 지식 그래프를 하나의 도구로, 수동 연결 불필요
|
|
43
|
-
- **
|
|
43
|
+
- **27개 프레임워크, 9개 언어** — Spring Boot, NestJS, Django, FastAPI, Flask, Rails, Express, Fastify, Koa, React, Next.js, Vue, Nuxt, Angular, SvelteKit, Gin, Echo, Fiber, Laravel, Actix-Web, Axum, Tauri, Rocket, Warp, ASP.NET Core, Vapor, Ktor
|
|
44
44
|
- **tree-sitter 기반** — 정규식이 아닌 구조적 AST 파싱; 언어 그래머 기본 포함
|
|
45
45
|
- **2-패스 DI 해결** — Pass 1에서 로컬 AST 노드 추출, Pass 2에서 전역 심볼 테이블로 Interface → Implementation 매핑 해결
|
|
46
46
|
- **Wave 병합 아키텍처** — 파일을 병렬 청크로 처리 후 전역 병합; 대형 모노레포도 메모리 폭발 없이 처리
|
|
@@ -81,7 +81,7 @@ codebeacon sync # 이후 실행은 설정 파일 기반
|
|
|
81
81
|
| Go | Gin, Echo, Fiber |
|
|
82
82
|
| Ruby | Rails |
|
|
83
83
|
| PHP | Laravel |
|
|
84
|
-
| Rust | Actix-Web, Axum |
|
|
84
|
+
| Rust | Actix-Web, Axum, Tauri, Rocket, Warp |
|
|
85
85
|
| C# | ASP.NET Core |
|
|
86
86
|
| Swift | Vapor |
|
|
87
87
|
|
|
@@ -38,7 +38,7 @@ Existing tools solve this partially. Route analyzers map your controllers but mi
|
|
|
38
38
|
## Key Features
|
|
39
39
|
|
|
40
40
|
- **Unified pipeline** — route/controller analysis + knowledge graph in one tool, no manual stitching
|
|
41
|
-
- **
|
|
41
|
+
- **27 frameworks, 9 languages** — Spring Boot, NestJS, Django, FastAPI, Flask, Rails, Express, Fastify, Koa, React, Next.js, Vue, Nuxt, Angular, SvelteKit, Gin, Echo, Fiber, Laravel, Actix-Web, Axum, Tauri, Rocket, Warp, ASP.NET Core, Vapor, Ktor
|
|
42
42
|
- **Tree-sitter based** — structural AST parsing, not regex; all language grammars included out of the box
|
|
43
43
|
- **Two-pass DI resolution** — Pass 1 extracts local AST nodes; Pass 2 builds a global symbol table and resolves Interface → Implementation mappings that single-pass tools miss
|
|
44
44
|
- **Wave merge architecture** — files processed in parallel chunks, results merged globally; handles large monorepos without memory blowouts
|
|
@@ -79,7 +79,7 @@ codebeacon sync # subsequent runs via config
|
|
|
79
79
|
| Go | Gin, Echo, Fiber |
|
|
80
80
|
| Ruby | Rails |
|
|
81
81
|
| PHP | Laravel |
|
|
82
|
-
| Rust | Actix-Web, Axum |
|
|
82
|
+
| Rust | Actix-Web, Axum, Tauri, Rocket, Warp |
|
|
83
83
|
| C# | ASP.NET Core |
|
|
84
84
|
| Swift | Vapor |
|
|
85
85
|
|
|
@@ -40,7 +40,7 @@ As ferramentas existentes resolvem isso apenas parcialmente. Analisadores de rot
|
|
|
40
40
|
## Principais funcionalidades
|
|
41
41
|
|
|
42
42
|
- **Pipeline unificado** — análise de rotas/controladores + knowledge graph em uma só ferramenta, sem junção manual
|
|
43
|
-
- **
|
|
43
|
+
- **27 frameworks, 9 linguagens** — Spring Boot, NestJS, Django, FastAPI, Flask, Rails, Express, Fastify, Koa, React, Next.js, Vue, Nuxt, Angular, SvelteKit, Gin, Echo, Fiber, Laravel, Actix-Web, Axum, Tauri, Rocket, Warp, ASP.NET Core, Vapor, Ktor
|
|
44
44
|
- **Baseado em tree-sitter** — análise AST estrutural, não regex; gramáticas de linguagem incluídas por padrão
|
|
45
45
|
- **Resolução DI em 2 passos** — Pass 1 extrai nós AST locais; Pass 2 constrói uma tabela de símbolos global e resolve mapeamentos Interface → Implementation
|
|
46
46
|
- **Arquitetura Wave merge** — arquivos processados em chunks paralelos e mesclados globalmente; lida com grandes monorepos sem problemas de memória
|
|
@@ -81,7 +81,7 @@ codebeacon sync # execuções seguintes via configuração
|
|
|
81
81
|
| Go | Gin, Echo, Fiber |
|
|
82
82
|
| Ruby | Rails |
|
|
83
83
|
| PHP | Laravel |
|
|
84
|
-
| Rust | Actix-Web, Axum |
|
|
84
|
+
| Rust | Actix-Web, Axum, Tauri, Rocket, Warp |
|
|
85
85
|
| C# | ASP.NET Core |
|
|
86
86
|
| Swift | Vapor |
|
|
87
87
|
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
## 核心功能
|
|
41
41
|
|
|
42
42
|
- **统一流水线** — 路由/控制器分析 + 知识图谱集于一体,无需手动拼接
|
|
43
|
-
- **
|
|
43
|
+
- **27 个框架,9 种语言** — Spring Boot、NestJS、Django、FastAPI、Flask、Rails、Express、Fastify、Koa、React、Next.js、Vue、Nuxt、Angular、SvelteKit、Gin、Echo、Fiber、Laravel、Actix-Web、Axum、Tauri、Rocket、Warp、ASP.NET Core、Vapor、Ktor
|
|
44
44
|
- **基于 tree-sitter** — 结构化抽象语法树解析,而非正则表达式;语言语法默认内置
|
|
45
45
|
- **两阶段依赖注入解析** — Pass 1 提取本地 AST 节点;Pass 2 构建全局符号表,解析单阶段工具遗漏的接口→实现映射
|
|
46
46
|
- **Wave 合并架构** — 文件以并行块处理后全局合并;大型单仓库也不会出现内存问题
|
|
@@ -81,7 +81,7 @@ codebeacon sync # 后续运行通过配置文件驱动
|
|
|
81
81
|
| Go | Gin、Echo、Fiber |
|
|
82
82
|
| Ruby | Rails |
|
|
83
83
|
| PHP | Laravel |
|
|
84
|
-
| Rust | Actix-Web、Axum |
|
|
84
|
+
| Rust | Actix-Web、Axum、Tauri、Rocket、Warp |
|
|
85
85
|
| C# | ASP.NET Core |
|
|
86
86
|
| Swift | Vapor |
|
|
87
87
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.5"
|
|
@@ -66,8 +66,11 @@ _GO_MOD_REFINEMENTS: list[tuple[str, str]] = [
|
|
|
66
66
|
]
|
|
67
67
|
|
|
68
68
|
_CARGO_REFINEMENTS: list[tuple[str, str]] = [
|
|
69
|
-
("
|
|
70
|
-
("
|
|
69
|
+
("tauri", "tauri"),
|
|
70
|
+
("axum", "axum"),
|
|
71
|
+
("actix-web", "actix"),
|
|
72
|
+
("rocket", "rocket"),
|
|
73
|
+
("warp", "warp"),
|
|
71
74
|
]
|
|
72
75
|
|
|
73
76
|
_BUILD_GRADLE_KOTLIN_REFINEMENTS: list[tuple[str, str]] = [
|
|
@@ -108,7 +111,7 @@ def _refine_go_framework(project_dir: Path) -> str:
|
|
|
108
111
|
for pattern, fw in _GO_MOD_REFINEMENTS:
|
|
109
112
|
if pattern in content:
|
|
110
113
|
return fw
|
|
111
|
-
return "
|
|
114
|
+
return "go"
|
|
112
115
|
|
|
113
116
|
|
|
114
117
|
def _refine_rust_framework(project_dir: Path) -> str:
|
|
@@ -116,7 +119,7 @@ def _refine_rust_framework(project_dir: Path) -> str:
|
|
|
116
119
|
for pattern, fw in _CARGO_REFINEMENTS:
|
|
117
120
|
if pattern in content:
|
|
118
121
|
return fw
|
|
119
|
-
return "
|
|
122
|
+
return "rust"
|
|
120
123
|
|
|
121
124
|
|
|
122
125
|
def _refine_gradle_framework(project_dir: Path) -> tuple[str, str]:
|
|
@@ -35,6 +35,9 @@ _FW_TO_QUERY: dict[str, str] = {
|
|
|
35
35
|
"fastapi": "fastapi",
|
|
36
36
|
"django": "django",
|
|
37
37
|
"flask": "flask",
|
|
38
|
+
"tornado": "flask",
|
|
39
|
+
"aiohttp": "flask",
|
|
40
|
+
"python": "fastapi",
|
|
38
41
|
"gin": "gin",
|
|
39
42
|
"echo": "gin",
|
|
40
43
|
"fiber": "gin",
|
|
@@ -45,10 +48,14 @@ _FW_TO_QUERY: dict[str, str] = {
|
|
|
45
48
|
"actix": "actix",
|
|
46
49
|
"axum": "actix",
|
|
47
50
|
"rust": "actix",
|
|
51
|
+
"tauri": "tauri",
|
|
52
|
+
"rocket": "actix",
|
|
53
|
+
"warp": "actix",
|
|
48
54
|
"vapor": "vapor",
|
|
49
55
|
"ktor": "ktor",
|
|
50
56
|
"vue": "vue",
|
|
51
57
|
"nuxt": "vue",
|
|
58
|
+
"node": "express",
|
|
52
59
|
"sveltekit": "svelte",
|
|
53
60
|
"angular": "angular",
|
|
54
61
|
}
|
|
@@ -37,6 +37,9 @@ _FW_TO_QUERY: dict[str, str] = {
|
|
|
37
37
|
"fastapi": "fastapi",
|
|
38
38
|
"django": "django",
|
|
39
39
|
"flask": "flask",
|
|
40
|
+
"tornado": "flask",
|
|
41
|
+
"aiohttp": "flask",
|
|
42
|
+
"python": "fastapi",
|
|
40
43
|
"gin": "gin",
|
|
41
44
|
"echo": "gin",
|
|
42
45
|
"fiber": "gin",
|
|
@@ -47,8 +50,12 @@ _FW_TO_QUERY: dict[str, str] = {
|
|
|
47
50
|
"actix": "actix",
|
|
48
51
|
"axum": "actix",
|
|
49
52
|
"rust": "actix",
|
|
53
|
+
"tauri": "tauri",
|
|
54
|
+
"rocket": "actix",
|
|
55
|
+
"warp": "actix",
|
|
50
56
|
"vapor": "vapor",
|
|
51
57
|
"ktor": "ktor",
|
|
58
|
+
# Frontend-only frameworks intentionally omitted from entities (no ORM).
|
|
52
59
|
}
|
|
53
60
|
|
|
54
61
|
# GORM struct tag parser: `gorm:"column:name;primaryKey"`
|
|
@@ -95,6 +102,7 @@ def extract_entities(file_path: str, framework: str) -> list[EntityInfo]:
|
|
|
95
102
|
"laravel": _interpret_laravel,
|
|
96
103
|
"aspnet": _interpret_aspnet,
|
|
97
104
|
"actix": _interpret_rust,
|
|
105
|
+
"tauri": _interpret_tauri,
|
|
98
106
|
"vapor": _interpret_vapor,
|
|
99
107
|
"ktor": _interpret_ktor,
|
|
100
108
|
"react": _interpret_noop,
|
|
@@ -573,3 +581,71 @@ def _interpret_ktor(
|
|
|
573
581
|
))
|
|
574
582
|
|
|
575
583
|
return entities
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
def _interpret_tauri(
|
|
587
|
+
file_path: str, matches: list, framework: str,
|
|
588
|
+
) -> list[EntityInfo]:
|
|
589
|
+
"""Tauri: structs with #[derive(Serialize/Deserialize)] as IPC payload types.
|
|
590
|
+
|
|
591
|
+
Attributes and struct_items are siblings in tree-sitter-rust. We first
|
|
592
|
+
collect #[derive(...)] attributes containing Serialize or Deserialize,
|
|
593
|
+
record their end-lines, then pair each struct that starts right after.
|
|
594
|
+
"""
|
|
595
|
+
_TAURI_ENTITY_TRAITS = frozenset({"Serialize", "Deserialize"})
|
|
596
|
+
|
|
597
|
+
# Pass 1: collect derive attributes with Serialize/Deserialize
|
|
598
|
+
# end_line → set of detected traits
|
|
599
|
+
derive_ends: dict[int, set[str]] = {}
|
|
600
|
+
for _idx, caps in matches:
|
|
601
|
+
if "entity.derive_attr" in caps and "entity.derive_args" in caps:
|
|
602
|
+
attr_node = caps["entity.derive_attr"][0]
|
|
603
|
+
args_text = node_text(caps["entity.derive_args"][0])
|
|
604
|
+
traits = {t.strip() for t in args_text.strip("()").split(",")}
|
|
605
|
+
if _TAURI_ENTITY_TRAITS.intersection(traits):
|
|
606
|
+
derive_ends[attr_node.end_point[0]] = traits
|
|
607
|
+
|
|
608
|
+
if not derive_ends:
|
|
609
|
+
return []
|
|
610
|
+
|
|
611
|
+
# Pass 2: match structs that start right after a qualifying derive attribute
|
|
612
|
+
entities: dict[int, EntityInfo] = {}
|
|
613
|
+
class_ranges: dict[int, tuple[int, int]] = {}
|
|
614
|
+
for _idx, caps in matches:
|
|
615
|
+
if "entity.struct" in caps and "entity.struct_name" in caps:
|
|
616
|
+
struct_node = caps["entity.struct"][0]
|
|
617
|
+
start_line = struct_node.start_point[0]
|
|
618
|
+
# Check if preceded by a qualifying derive — allow 1-2 lines gap
|
|
619
|
+
# (there may be #[serde(...)] between derive and struct)
|
|
620
|
+
matched = False
|
|
621
|
+
for gap in range(3):
|
|
622
|
+
if (start_line - 1 - gap) in derive_ends:
|
|
623
|
+
matched = True
|
|
624
|
+
break
|
|
625
|
+
if not matched:
|
|
626
|
+
continue
|
|
627
|
+
name = node_text(caps["entity.struct_name"][0])
|
|
628
|
+
key = struct_node.start_byte
|
|
629
|
+
entities[key] = EntityInfo(
|
|
630
|
+
name=name,
|
|
631
|
+
table_name="",
|
|
632
|
+
source_file=file_path,
|
|
633
|
+
line=start_line + 1,
|
|
634
|
+
framework="tauri",
|
|
635
|
+
)
|
|
636
|
+
class_ranges[key] = (struct_node.start_byte, struct_node.end_byte)
|
|
637
|
+
|
|
638
|
+
# Pass 3: collect fields
|
|
639
|
+
for _idx, caps in matches:
|
|
640
|
+
if "entity.field" in caps and "entity.field_name" in caps:
|
|
641
|
+
field_node = caps["entity.field"][0]
|
|
642
|
+
fname = node_text(caps["entity.field_name"][0])
|
|
643
|
+
ftype = node_text(caps["entity.field_type"][0]) if "entity.field_type" in caps else ""
|
|
644
|
+
for key, (start, end) in class_ranges.items():
|
|
645
|
+
if start <= field_node.start_byte <= end:
|
|
646
|
+
entities[key].fields.append({
|
|
647
|
+
"name": fname, "type": ftype, "annotations": [],
|
|
648
|
+
})
|
|
649
|
+
break
|
|
650
|
+
|
|
651
|
+
return list(entities.values())
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
; ── Tauri v2 (Rust) ──────────────────────────────────────────────────────────
|
|
2
|
+
; Grammar: tree-sitter-rust
|
|
3
|
+
;
|
|
4
|
+
; In tree-sitter-rust, outer attributes (#[...]) are SIBLINGS of the
|
|
5
|
+
; declaration they annotate, not children. The interpreter correlates
|
|
6
|
+
; attribute_item + function_item/struct_item by source-file position.
|
|
7
|
+
;
|
|
8
|
+
; Captures:
|
|
9
|
+
; @route.tauri_attr - #[tauri::command] attribute_item
|
|
10
|
+
; @route.func - function_item following a command attribute
|
|
11
|
+
; @route.func_name - command function name
|
|
12
|
+
; @service.struct_name - struct name (managed state)
|
|
13
|
+
; @service.struct - struct_item node
|
|
14
|
+
; @entity.derive_attr - #[derive(...)] attribute_item
|
|
15
|
+
; @entity.derive_args - token_tree inside derive(...)
|
|
16
|
+
; @entity.struct - struct_item node
|
|
17
|
+
; @entity.struct_name - struct name
|
|
18
|
+
; @entity.field_name - struct field name
|
|
19
|
+
; @entity.field_type - struct field type
|
|
20
|
+
; @import.path - use declaration path
|
|
21
|
+
|
|
22
|
+
; ── #[tauri::command] attribute (matched separately; interpreter pairs with next fn) ─
|
|
23
|
+
|
|
24
|
+
(attribute_item
|
|
25
|
+
(attribute
|
|
26
|
+
(scoped_identifier
|
|
27
|
+
path: (identifier) @_ns (#eq? @_ns "tauri")
|
|
28
|
+
name: (identifier) @_cmd (#eq? @_cmd "command")))) @route.tauri_attr
|
|
29
|
+
|
|
30
|
+
; ── All function_item nodes (interpreter picks ones preceded by command attr) ─
|
|
31
|
+
|
|
32
|
+
(function_item
|
|
33
|
+
name: (identifier) @route.func_name) @route.func
|
|
34
|
+
|
|
35
|
+
; ── #[derive(...)] attribute (interpreter checks for Serialize/Deserialize) ──
|
|
36
|
+
|
|
37
|
+
(attribute_item
|
|
38
|
+
(attribute
|
|
39
|
+
(identifier) @_derive (#eq? @_derive "derive")
|
|
40
|
+
arguments: (token_tree) @entity.derive_args)) @entity.derive_attr
|
|
41
|
+
|
|
42
|
+
; ── Struct definitions ───────────────────────────────────────────────────────
|
|
43
|
+
|
|
44
|
+
(struct_item
|
|
45
|
+
name: (type_identifier) @entity.struct_name) @entity.struct
|
|
46
|
+
|
|
47
|
+
; ── Struct fields ────────────────────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
(field_declaration
|
|
50
|
+
name: (field_identifier) @entity.field_name
|
|
51
|
+
type: (_) @entity.field_type) @entity.field
|
|
52
|
+
|
|
53
|
+
; ── Imports ──────────────────────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
(use_declaration
|
|
56
|
+
argument: (scoped_identifier) @import.path) @import.decl
|
|
57
|
+
|
|
58
|
+
(use_declaration
|
|
59
|
+
argument: (scoped_use_list) @import.path) @import.use_list
|
|
60
|
+
|
|
61
|
+
(use_declaration
|
|
62
|
+
argument: (identifier) @import.path) @import.simple
|
|
@@ -39,6 +39,9 @@ _FW_TO_QUERY: dict[str, str] = {
|
|
|
39
39
|
"fastapi": "fastapi",
|
|
40
40
|
"django": "django",
|
|
41
41
|
"flask": "flask",
|
|
42
|
+
"tornado": "flask",
|
|
43
|
+
"aiohttp": "flask",
|
|
44
|
+
"python": "fastapi",
|
|
42
45
|
"gin": "gin",
|
|
43
46
|
"echo": "gin",
|
|
44
47
|
"fiber": "gin",
|
|
@@ -49,10 +52,14 @@ _FW_TO_QUERY: dict[str, str] = {
|
|
|
49
52
|
"actix": "actix",
|
|
50
53
|
"axum": "actix",
|
|
51
54
|
"rust": "actix",
|
|
55
|
+
"tauri": "tauri",
|
|
56
|
+
"rocket": "actix",
|
|
57
|
+
"warp": "actix",
|
|
52
58
|
"vapor": "vapor",
|
|
53
59
|
"ktor": "ktor",
|
|
54
60
|
"vue": "vue",
|
|
55
61
|
"nuxt": "vue",
|
|
62
|
+
"node": "express",
|
|
56
63
|
"sveltekit": "svelte",
|
|
57
64
|
"angular": "angular",
|
|
58
65
|
}
|
|
@@ -153,6 +160,7 @@ def extract_routes(
|
|
|
153
160
|
"laravel": _interpret_laravel,
|
|
154
161
|
"aspnet": _interpret_aspnet,
|
|
155
162
|
"actix": _interpret_actix,
|
|
163
|
+
"tauri": _interpret_tauri,
|
|
156
164
|
"vapor": _interpret_vapor,
|
|
157
165
|
"ktor": _interpret_ktor,
|
|
158
166
|
"react": _interpret_react,
|
|
@@ -908,3 +916,46 @@ def _interpret_angular(file_path: str, matches: list, framework: str) -> list[Ro
|
|
|
908
916
|
framework="angular",
|
|
909
917
|
))
|
|
910
918
|
return routes
|
|
919
|
+
|
|
920
|
+
|
|
921
|
+
def _interpret_tauri(file_path: str, matches: list, framework: str) -> list[RouteInfo]:
|
|
922
|
+
"""Tauri: #[tauri::command] functions as IPC endpoints (routes).
|
|
923
|
+
|
|
924
|
+
The frontend calls these via invoke("command_name", { args }).
|
|
925
|
+
Attributes and function_items are siblings in tree-sitter-rust, so
|
|
926
|
+
we collect the end-lines of all #[tauri::command] attributes, then
|
|
927
|
+
match each function whose start line follows an attribute end line.
|
|
928
|
+
"""
|
|
929
|
+
routes: list[RouteInfo] = []
|
|
930
|
+
|
|
931
|
+
# Collect end-lines of #[tauri::command] attributes
|
|
932
|
+
cmd_attr_ends: set[int] = set()
|
|
933
|
+
for _idx, caps in matches:
|
|
934
|
+
if "route.tauri_attr" in caps:
|
|
935
|
+
attr_node = caps["route.tauri_attr"][0]
|
|
936
|
+
cmd_attr_ends.add(attr_node.end_point[0])
|
|
937
|
+
|
|
938
|
+
if not cmd_attr_ends:
|
|
939
|
+
return []
|
|
940
|
+
|
|
941
|
+
# Match function_items that start right after an attribute
|
|
942
|
+
seen: set[str] = set()
|
|
943
|
+
for _idx, caps in matches:
|
|
944
|
+
if "route.func" in caps and "route.func_name" in caps:
|
|
945
|
+
func_node = caps["route.func"][0]
|
|
946
|
+
func_start_line = func_node.start_point[0]
|
|
947
|
+
# Function must start on the line immediately after the attribute
|
|
948
|
+
if func_start_line in cmd_attr_ends or (func_start_line - 1) in cmd_attr_ends:
|
|
949
|
+
name = node_text(caps["route.func_name"][0])
|
|
950
|
+
if name in seen:
|
|
951
|
+
continue
|
|
952
|
+
seen.add(name)
|
|
953
|
+
routes.append(RouteInfo(
|
|
954
|
+
method="INVOKE",
|
|
955
|
+
path=f"/tauri/{name}",
|
|
956
|
+
handler=name,
|
|
957
|
+
source_file=file_path,
|
|
958
|
+
line=func_node.start_point[0] + 1,
|
|
959
|
+
framework="tauri",
|
|
960
|
+
))
|
|
961
|
+
return routes
|
|
@@ -37,6 +37,9 @@ _FW_TO_QUERY: dict[str, str] = {
|
|
|
37
37
|
"fastapi": "fastapi",
|
|
38
38
|
"django": "django",
|
|
39
39
|
"flask": "flask",
|
|
40
|
+
"tornado": "flask",
|
|
41
|
+
"aiohttp": "flask",
|
|
42
|
+
"python": "fastapi",
|
|
40
43
|
"gin": "gin",
|
|
41
44
|
"echo": "gin",
|
|
42
45
|
"fiber": "gin",
|
|
@@ -47,10 +50,14 @@ _FW_TO_QUERY: dict[str, str] = {
|
|
|
47
50
|
"actix": "actix",
|
|
48
51
|
"axum": "actix",
|
|
49
52
|
"rust": "actix",
|
|
53
|
+
"tauri": "tauri",
|
|
54
|
+
"rocket": "actix",
|
|
55
|
+
"warp": "actix",
|
|
50
56
|
"vapor": "vapor",
|
|
51
57
|
"ktor": "ktor",
|
|
52
58
|
"vue": "vue",
|
|
53
59
|
"nuxt": "vue",
|
|
60
|
+
"node": "express",
|
|
54
61
|
"sveltekit": "svelte",
|
|
55
62
|
"angular": "angular",
|
|
56
63
|
}
|
|
@@ -107,6 +114,7 @@ def extract_services(
|
|
|
107
114
|
"laravel": _interpret_laravel,
|
|
108
115
|
"aspnet": _interpret_aspnet,
|
|
109
116
|
"actix": _interpret_actix,
|
|
117
|
+
"tauri": _interpret_tauri,
|
|
110
118
|
"vapor": _interpret_vapor,
|
|
111
119
|
"ktor": _interpret_ktor,
|
|
112
120
|
"react": _interpret_noop,
|
|
@@ -595,3 +603,28 @@ def _interpret_angular(
|
|
|
595
603
|
break # assign to first service (constructor_di is inside a class)
|
|
596
604
|
|
|
597
605
|
return list(services.values()), unresolved
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
def _interpret_tauri(
|
|
609
|
+
file_path: str, matches: list, framework: str,
|
|
610
|
+
) -> tuple[list[ServiceInfo], list[UnresolvedRef]]:
|
|
611
|
+
"""Tauri: Managed state structs (containing Mutex/RwLock/Arc fields)."""
|
|
612
|
+
services: list[ServiceInfo] = []
|
|
613
|
+
seen: set[str] = set()
|
|
614
|
+
|
|
615
|
+
for _idx, caps in matches:
|
|
616
|
+
if "service.struct" in caps and "service.struct_name" in caps:
|
|
617
|
+
name = node_text(caps["service.struct_name"][0])
|
|
618
|
+
if name in seen:
|
|
619
|
+
continue
|
|
620
|
+
seen.add(name)
|
|
621
|
+
node = caps["service.struct"][0]
|
|
622
|
+
services.append(ServiceInfo(
|
|
623
|
+
name=name,
|
|
624
|
+
class_name=name,
|
|
625
|
+
source_file=file_path,
|
|
626
|
+
line=node.start_point[0] + 1,
|
|
627
|
+
framework="tauri",
|
|
628
|
+
annotations=["managed_state"],
|
|
629
|
+
))
|
|
630
|
+
return services, []
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: codebeacon
|
|
3
|
-
description: Scan a codebase → AST extraction → knowledge graph → wiki + CLAUDE.md context map. Supports
|
|
3
|
+
description: Scan a codebase → AST extraction → knowledge graph → wiki + CLAUDE.md context map. Supports 27 frameworks (Spring Boot, NestJS, Django, FastAPI, Flask, Rails, Express, Fastify, Koa, React, Next.js, Vue, Nuxt, Angular, SvelteKit, Gin, Echo, Fiber, Laravel, Actix-Web, Axum, Tauri, Rocket, Warp, ASP.NET Core, Vapor, Ktor).
|
|
4
4
|
trigger: /codebeacon
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -124,6 +124,6 @@ project-root/
|
|
|
124
124
|
| Go | Gin, Echo, Fiber |
|
|
125
125
|
| Ruby | Rails |
|
|
126
126
|
| PHP | Laravel |
|
|
127
|
-
| Rust | Actix-Web, Axum |
|
|
127
|
+
| Rust | Actix-Web, Axum, Tauri, Rocket, Warp |
|
|
128
128
|
| C# | ASP.NET Core |
|
|
129
129
|
| Swift | Vapor |
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "codebeacon"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.5"
|
|
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.1.4"
|
|
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
|