codebeacon 0.6.8__tar.gz → 0.6.9__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.6.8 → codebeacon-0.6.9}/PKG-INFO +18 -1
- {codebeacon-0.6.8 → codebeacon-0.6.9}/README.de.md +17 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/README.es.md +17 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/README.fr.md +17 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/README.ja.md +17 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/README.ko.md +17 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/README.md +17 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/README.pt-BR.md +17 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/README.zh-CN.md +17 -0
- codebeacon-0.6.9/codebeacon/__init__.py +1 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/cache.py +4 -1
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/cli.py +62 -12
- codebeacon-0.6.9/codebeacon/common/filters.py +259 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/common/safety.py +7 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/config.py +74 -14
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/contextmap/generator.py +96 -40
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/discover/detector.py +115 -31
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/discover/ignore.py +52 -26
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/discover/scanner.py +93 -26
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/export/callflow_html.py +5 -2
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/export/hooks.py +4 -1
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/export/mcp.py +22 -3
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/export/merge.py +29 -3
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/export/obsidian.py +54 -11
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/components.py +44 -17
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/express.scm +23 -16
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/laravel.scm +14 -1
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/spring_boot.scm +24 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/routes.py +91 -8
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/graph/analyze.py +8 -4
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/graph/build.py +133 -36
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/graph/cluster.py +6 -1
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/graph/enrich.py +5 -1
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/graph/write.py +28 -1
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/pipeline.py +104 -68
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/semantic_pipeline.py +153 -7
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/wave.py +9 -3
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/wiki/generator.py +140 -39
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/wiki/templates.py +44 -8
- {codebeacon-0.6.8 → codebeacon-0.6.9}/pyproject.toml +1 -1
- codebeacon-0.6.9/tests/test_audit_069_cli.py +485 -0
- codebeacon-0.6.9/tests/test_audit_069_cluster.py +77 -0
- codebeacon-0.6.9/tests/test_audit_069_contextmap.py +458 -0
- codebeacon-0.6.9/tests/test_audit_069_detector.py +329 -0
- codebeacon-0.6.9/tests/test_audit_069_discover.py +337 -0
- codebeacon-0.6.9/tests/test_audit_069_export.py +263 -0
- codebeacon-0.6.9/tests/test_audit_069_extract.py +383 -0
- codebeacon-0.6.9/tests/test_audit_069_graph.py +594 -0
- codebeacon-0.6.9/tests/test_audit_069_io.py +352 -0
- codebeacon-0.6.9/tests/test_audit_069_semantic.py +442 -0
- codebeacon-0.6.9/tests/test_audit_069_wiki.py +370 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_cli_upgrade.py +5 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_graphify_parity_0_6_7.py +21 -2
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_safety_and_writes.py +8 -1
- codebeacon-0.6.8/codebeacon/__init__.py +0 -1
- codebeacon-0.6.8/codebeacon/common/filters.py +0 -170
- {codebeacon-0.6.8 → codebeacon-0.6.9}/.cursorrules +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/.github/CODEOWNERS +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/.github/dependabot.yml +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/.github/workflows/ci.yml +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/.github/workflows/release.yml +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/.gitignore +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/AGENTS.md +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/CLAUDE.md +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/LICENSE +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/__main__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/affected.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/common/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/common/symbols.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/common/types.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/contextmap/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/diagnostics.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/discover/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/export/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/export/tree_html.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/base.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/dependencies.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/dotnet.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/entities.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/README.md +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/actix.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/angular.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/aspnet.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/django.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/fastapi.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/flask.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/gin.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/ktor.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/nestjs.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/rails.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/react.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/svelte.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/tauri.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/vapor.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/queries/vue.scm +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/semantic.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/extract/services.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/graph/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/knowledge/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/knowledge/generator.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/plugins/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/plugins/githooks.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/plugins/skills.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/skill/SKILL.md +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/wiki/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon/wiki/index.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/codebeacon.yaml.example +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/docs/TRANSLATION_STATUS.md +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/public-plan.md +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/skill/install.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/conftest.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/actix/main.rs +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/angular/app.component.ts +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/aspnet/UserController.cs +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/django/views.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/express/userRouter.js +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/fastapi/main.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/flask/app.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/gin/main.go +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/api-python/pyproject.toml +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/api-python/src/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/api-python/src/main.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/api-python/src/services.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/web/package.json +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/web/src/UserPage.tsx +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/ktor/UserRoutes.kt +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/laravel/UserController.php +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/nestjs/user.controller.ts +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/rails/users_controller.rb +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/react/UserPage.tsx +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/spring_boot/UserController.java +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/sveltekit/+page.svelte +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/vapor/routes.swift +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/fixtures/vue/UserList.vue +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/integration/__init__.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/integration/test_full_pipeline.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_affected.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_affected_wiki.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_audit_bugfixes.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_cli_dispatch.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_contextmap_paths.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_deep_dive_grouping.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_dependencies.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_diagnostics.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_discover.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_dotnet.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_entities.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_filters.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_graph.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_graphify_parity_0_6_3.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_graphify_parity_0_6_6.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_graphify_parity_0_6_8.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_graphify_parity_fixes.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_independent_audit_fixes.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_knowledge.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_known_bugs.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_mcp_and_semantic.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_optional_grammars.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_pipeline_module.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_plugins.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_resolve.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_routes.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_scanner_sensitive.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_semantic.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_semantic_hardening.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_semantic_stats.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_services.py +0 -0
- {codebeacon-0.6.8 → codebeacon-0.6.9}/tests/test_wiki.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codebeacon
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.9
|
|
4
4
|
Summary: Source code AST analysis tool for AI context generation — unified multi-framework knowledge graph
|
|
5
5
|
Project-URL: Homepage, https://github.com/codebeacon/codebeacon
|
|
6
6
|
Project-URL: Repository, https://github.com/codebeacon/codebeacon
|
|
@@ -118,6 +118,23 @@ Description-Content-Type: text/markdown
|
|
|
118
118
|
|
|
119
119
|
---
|
|
120
120
|
|
|
121
|
+
## What's new in 0.6.9
|
|
122
|
+
|
|
123
|
+
The largest audit release to date: a dual upstream-parity sweep (the first-ever full audit of codesight's tracker, plus graphify v0.9.4–v0.9.12 / issues through #1776) combined with an independent multi-agent bug hunt over codebeacon itself. Every candidate was reproduced before fixing, every fix was mutation-tested, and an adversarial second review then attacked the fixes themselves — catching 18 further holes before release. **48 real bugs fixed.**
|
|
124
|
+
|
|
125
|
+
- **Your CLAUDE.md is safe now** — on a hand-written CLAUDE.md (e.g. from `/init`), the merge step could mistake the user's own `## Architecture` / `## Common Commands` sections for codebeacon output and delete them. The strip now runs only on files that positively fingerprint as codebeacon-generated, and it is anchored to the generated block — your sections survive. `codebeacon.yaml` is also written atomically now (and through symlinks, preserving file modes), so an interrupted write can't destroy a hand-curated config.
|
|
126
|
+
- **Files no longer vanish from the index silently** — uppercase extensions (`App.PY`, `Page.TSX`) were skipped; source modules named after credentials (`api_key_manager.go`, `access_token_service.py`) were dropped by the secret-file heuristic; one non-UTF-8 byte in a `.gitignore` crashed the whole scan; and a repo checked out under a folder named `build/` or `dist/` had its **entire graph erased** by the artifact filter matching ancestor directories. All fixed; skipped symlinks now get one grouped warning instead of silence.
|
|
127
|
+
- **`.gitignore` handling now matches git exactly** — negation semantics (`dir/` + `!dir/keep.txt`) are differential-tested against `git check-ignore` across every rule shape; a file under an excluded directory can no longer be re-included, exactly like git. The standard `dir/*` + `!dir/keep` rescue idiom works as before.
|
|
128
|
+
- **Same-named projects coexist** — two (or three) sub-projects all named `frontend` used to collapse into one: colliding node IDs silently dropped routes, and their wiki/obsidian folders overwrote each other. Duplicate names are now auto-disambiguated with a parent-directory prefix.
|
|
129
|
+
- **Route extraction got a correctness overhaul** — Express `app.use('/api', router)` mount prefixes are applied and chained `router.route(x).get().post()` yields every verb; Flask `register_blueprint` / FastAPI `include_router` prefixes no longer depend on where they appear in the file; Spring's `@RequestMapping(method = RequestMethod.X)` records the real verb instead of `ANY`; Next.js catch-all segments (`[...slug]`) are no longer garbled and `@slot` parallel routes are stripped from URLs; Laravel's canonical `class X extends Model` finally produces an entity (previously only fully-qualified bases matched — and `ViewModel` no longer sneaks in).
|
|
130
|
+
- **Phantom graph edges eliminated** — a lowercase import like `CONFIG` no longer case-folds onto an unrelated `Config` class (the false god-node pattern), imports never bind across a language boundary (`import time` → `time.ts`), DI bindings prefer the registering project instead of the first same-named class anywhere, and a same-named service + entity in one directory no longer collapse into a single node.
|
|
131
|
+
- **Exports are Windows-proof and crash-proof** — obsidian note names strip the full Windows-illegal character set (Flask `<string:id>` routes used to break the export on Windows) and guard reserved device names; `None` labels no longer crash the wiki, call-flow HTML, or obsidian exporters; git hooks are written with LF line endings so they execute on Windows; and long project names can't blow past filesystem limits mid-export.
|
|
132
|
+
- **One bad input can't kill long-running surfaces** — the MCP server survives malformed JSON-RPC messages instead of dying; a corrupt `beacon.json` or AST cache (including invalid UTF-8 and null/malformed collections) is backed up and reported instead of crashing `affected`, `serve`, or the merge driver.
|
|
133
|
+
- **Byte-reproducible output** — node ordering no longer tracks thread-completion order and shared-entity annotations are sorted, so scanning an unchanged tree twice produces byte-identical `beacon.json`, wiki, and CLAUDE.md. The Leiden clustering backend (silently broken by a graspologic API change — it *never* ran) is back in service.
|
|
134
|
+
- **The config you write is the config that runs** — documented `codebeacon.yaml` settings (`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`) were parsed and then ignored; they now drive the pipeline, `--list-only` is honored inside workspaces, and `codebeacon upgrade` gives the right command for uv-venv installs. Bonus consistency: the Projects table, Notes column, and Architecture section of CLAUDE.md now agree on one "Services" count, matching the wiki.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
121
138
|
## What's new in 0.6.8
|
|
122
139
|
|
|
123
140
|
A graphify-parity audit of upstream v0.8.41–v0.9.3 (reported issues through #1568). Every candidate was reproduced against codebeacon before fixing and re-checked by an adversarial review pass; **7 real bugs** confirmed, headlined by a data-loss trap and a privacy leak.
|
|
@@ -27,6 +27,23 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Neu in 0.6.9
|
|
31
|
+
|
|
32
|
+
Die bislang größte Audit-Release: ein doppelter Upstream-Parity-Sweep (das allererste vollständige Audit von codesights Tracker, plus graphify v0.9.4–v0.9.12 / Issues bis #1776), kombiniert mit einer unabhängigen Multi-Agent-Bug-Hunt über codebeacon selbst. Jeder Kandidat wurde vor der Behebung reproduziert, jede Behebung mutation-getestet, und eine adversariale Zweitprüfung griff anschließend die Fixes selbst an — und fing so vor der Auslieferung 18 weitere Lücken ab. **48 echte Bugs behoben.**
|
|
33
|
+
|
|
34
|
+
- **Deine CLAUDE.md ist jetzt sicher** — bei einer handgeschriebenen CLAUDE.md (z. B. aus `/init`) konnte der Merge-Schritt die eigenen `## Architecture` / `## Common Commands`-Abschnitte des Nutzers für codebeacon-Ausgabe halten und löschen. Das Entfernen läuft jetzt nur noch auf Dateien, die sich eindeutig als codebeacon-generiert ausweisen, und ist am generierten Block verankert — deine Abschnitte bleiben erhalten. `codebeacon.yaml` wird jetzt zudem atomar geschrieben (und durch Symlinks hindurch, unter Erhalt der Dateimodi), sodass ein abgebrochener Schreibvorgang eine handgepflegte Konfiguration nicht zerstören kann.
|
|
35
|
+
- **Dateien verschwinden nicht mehr still aus dem Index** — Großbuchstaben-Erweiterungen (`App.PY`, `Page.TSX`) wurden übersprungen; nach Zugangsdaten benannte Quellmodule (`api_key_manager.go`, `access_token_service.py`) fielen der Secret-File-Heuristik zum Opfer; ein einziges Nicht-UTF-8-Byte in einer `.gitignore` ließ den gesamten Scan abstürzen; und ein Repo, das unter einem Ordner namens `build/` oder `dist/` ausgecheckt war, bekam durch den Artefakt-Filter, der übergeordnete Verzeichnisse matchte, **seinen gesamten Graphen gelöscht**. Alles behoben; übersprungene Symlinks erhalten jetzt eine gruppierte Warnung statt Schweigen.
|
|
36
|
+
- **Die `.gitignore`-Behandlung stimmt jetzt exakt mit git überein** — die Negations-Semantik (`dir/` + `!dir/keep.txt`) wird über jede Regelform hinweg differenziell gegen `git check-ignore` getestet; eine Datei unter einem ausgeschlossenen Verzeichnis kann nicht mehr wieder aufgenommen werden, genau wie bei git. Das Standard-Rettungsidiom `dir/*` + `!dir/keep` funktioniert wie bisher.
|
|
37
|
+
- **Gleichnamige Projekte koexistieren** — zwei (oder drei) Unterprojekte, alle namens `frontend`, kollabierten früher zu einem einzigen: kollidierende Node-IDs ließen Routen still verschwinden, und ihre wiki-/obsidian-Ordner überschrieben sich gegenseitig. Doppelte Namen werden jetzt automatisch mit einem Präfix aus dem übergeordneten Verzeichnis eindeutig gemacht.
|
|
38
|
+
- **Die Routen-Extraktion wurde grundlegend korrigiert** — Express-`app.use('/api', router)`-Mount-Präfixe werden angewendet, und verkettetes `router.route(x).get().post()` liefert jeden Verb; Flask-`register_blueprint`- / FastAPI-`include_router`-Präfixe hängen nicht mehr davon ab, wo sie in der Datei stehen; Springs `@RequestMapping(method = RequestMethod.X)` erfasst den echten Verb statt `ANY`; Next.js-Catch-all-Segmente (`[...slug]`) werden nicht mehr verstümmelt und `@slot`-Parallel-Routen aus URLs entfernt; Laravels kanonisches `class X extends Model` erzeugt endlich eine Entity (zuvor matchten nur voll qualifizierte Basen — und `ViewModel` schleicht sich nicht mehr ein).
|
|
39
|
+
- **Phantom-Graph-Edges beseitigt** — ein kleingeschriebenes Import wie `CONFIG` wird nicht mehr per Case-Folding auf eine unverwandte `Config`-Klasse gefaltet (das falsche god-node-Muster), Imports binden nie über eine Sprachgrenze hinweg (`import time` → `time.ts`), DI-Bindungen bevorzugen das registrierende Projekt statt der ersten gleichnamigen Klasse irgendwo, und ein gleichnamiges Service + Entity in einem Verzeichnis kollabiert nicht mehr zu einem einzigen Node.
|
|
40
|
+
- **Exporte sind Windows-fest und absturzsicher** — obsidian-Notiznamen entfernen den vollständigen unter Windows unzulässigen Zeichensatz (Flask-`<string:id>`-Routen brachen den Export unter Windows) und schützen vor reservierten Gerätenamen; `None`-Labels lassen die wiki-, Call-Flow-HTML- oder obsidian-Exporter nicht mehr abstürzen; git-Hooks werden mit LF-Zeilenenden geschrieben, damit sie unter Windows laufen; und lange Projektnamen können mitten im Export die Dateisystem-Grenzen nicht mehr sprengen.
|
|
41
|
+
- **Eine fehlerhafte Eingabe kann langlaufende Prozesse nicht mehr töten** — der MCP-Server übersteht fehlerhafte JSON-RPC-Nachrichten, statt zu sterben; eine beschädigte `beacon.json` oder ein beschädigter AST-Cache (inklusive ungültigem UTF-8 und null/fehlerhaften Kollektionen) wird gesichert und gemeldet, statt `affected`, `serve` oder den Merge-Treiber abstürzen zu lassen.
|
|
42
|
+
- **Byte-reproduzierbare Ausgabe** — die Node-Reihenfolge folgt nicht mehr der Thread-Fertigstellungsreihenfolge und Shared-Entity-Annotationen werden sortiert, sodass zweimaliges Scannen eines unveränderten Baums byte-identische `beacon.json`, wiki und CLAUDE.md erzeugt. Das Leiden-Clustering-Backend (durch eine graspologic-API-Änderung still kaputt — es lief *nie*) ist wieder im Dienst.
|
|
43
|
+
- **Die Konfiguration, die du schreibst, ist die Konfiguration, die läuft** — dokumentierte `codebeacon.yaml`-Einstellungen (`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`) wurden geparst und dann ignoriert; sie steuern jetzt die Pipeline, `--list-only` wird innerhalb von Workspaces berücksichtigt, und `codebeacon upgrade` gibt für uv-venv-Installationen den richtigen Befehl aus. Bonus-Konsistenz: die Projects-Tabelle, die Notes-Spalte und der Architecture-Abschnitt von CLAUDE.md sind sich jetzt über eine einzige „Services"-Zahl einig, passend zum wiki.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
30
47
|
## Neu in 0.6.8
|
|
31
48
|
|
|
32
49
|
Ein graphify-Parity-Audit von Upstream v0.8.41–v0.9.3 (gemeldete Issues bis #1568). Jeder Kandidat wurde vor der Behebung gegen codebeacon reproduziert und durch eine adversariale Review-Runde erneut geprüft; **7 echte Bugs** bestätigt, angeführt von einer Datenverlust-Falle und einem Privacy-Leak.
|
|
@@ -27,6 +27,23 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Novedades en 0.6.9
|
|
31
|
+
|
|
32
|
+
La release de auditoría más grande hasta la fecha: un doble barrido de paridad con el upstream (la primera auditoría completa del tracker de codesight, más graphify v0.9.4–v0.9.12 / issues hasta el #1776) combinado con una caza de bugs multiagente independiente sobre el propio codebeacon. Cada candidato se reprodujo antes de corregirlo, cada corrección se probó con mutation testing, y una segunda revisión adversarial atacó luego las propias correcciones — atrapando 18 agujeros más antes de la publicación. **48 bugs reales corregidos.**
|
|
33
|
+
|
|
34
|
+
- **Tu CLAUDE.md ahora está a salvo** — en un CLAUDE.md escrito a mano (p. ej. desde `/init`), el paso de fusión podía confundir las secciones `## Architecture` / `## Common Commands` propias del usuario con salida de codebeacon y borrarlas. El borrado ahora solo se ejecuta en archivos que se identifican inequívocamente como generados por codebeacon, y está anclado al bloque generado — tus secciones sobreviven. `codebeacon.yaml` también se escribe ahora de forma atómica (y a través de symlinks, preservando los modos de archivo), así que una escritura interrumpida no puede destruir una configuración curada a mano.
|
|
35
|
+
- **Los archivos ya no desaparecen del índice en silencio** — las extensiones en mayúsculas (`App.PY`, `Page.TSX`) se omitían; los módulos de código con nombre de credencial (`api_key_manager.go`, `access_token_service.py`) los descartaba la heurística de archivos secretos; un solo byte no UTF-8 en un `.gitignore` hacía caer todo el scan; y un repo con checkout bajo una carpeta llamada `build/` o `dist/` veía **borrado su grafo entero** porque el filtro de artefactos matcheaba directorios ancestros. Todo corregido; los symlinks omitidos reciben ahora un único aviso agrupado en vez de silencio.
|
|
36
|
+
- **El manejo de `.gitignore` ahora coincide exactamente con git** — la semántica de negación (`dir/` + `!dir/keep.txt`) se somete a differential testing contra `git check-ignore` en cada forma de regla; un archivo bajo un directorio excluido ya no puede volver a incluirse, igual que en git. El idiomático de rescate estándar `dir/*` + `!dir/keep` funciona como antes.
|
|
37
|
+
- **Los proyectos con el mismo nombre coexisten** — dos (o tres) subproyectos todos llamados `frontend` solían colapsar en uno: los IDs de nodo en colisión descartaban rutas en silencio, y sus carpetas de wiki/obsidian se sobrescribían entre sí. Los nombres duplicados ahora se desambiguan automáticamente con un prefijo del directorio padre.
|
|
38
|
+
- **La extracción de rutas recibió una revisión de corrección** — los prefijos de montaje `app.use('/api', router)` de Express se aplican y el encadenado `router.route(x).get().post()` produce todos los verbos; los prefijos de `register_blueprint` de Flask / `include_router` de FastAPI ya no dependen de dónde aparecen en el archivo; el `@RequestMapping(method = RequestMethod.X)` de Spring registra el verbo real en vez de `ANY`; los segmentos catch-all de Next.js (`[...slug]`) ya no se corrompen y las rutas paralelas `@slot` se eliminan de las URLs; el canónico `class X extends Model` de Laravel por fin produce una entidad (antes solo matcheaban las bases totalmente cualificadas — y `ViewModel` ya no se cuela).
|
|
39
|
+
- **Aristas fantasma del grafo eliminadas** — un import en minúsculas como `CONFIG` ya no se pliega por mayúsculas/minúsculas sobre una clase `Config` no relacionada (el falso patrón god-node), los imports nunca enlazan cruzando una frontera de lenguaje (`import time` → `time.ts`), los bindings de DI prefieren el proyecto que registra en vez de la primera clase homónima en cualquier parte, y un servicio + entidad homónimos en un mismo directorio ya no colapsan en un único nodo.
|
|
40
|
+
- **Las exportaciones son a prueba de Windows y a prueba de cuelgues** — los nombres de nota de obsidian eliminan el conjunto completo de caracteres ilegales en Windows (las rutas `<string:id>` de Flask rompían la exportación en Windows) y protegen contra nombres de dispositivo reservados; las etiquetas `None` ya no hacen caer los exportadores de wiki, del HTML de call-flow ni de obsidian; los git hooks se escriben con finales de línea LF para que se ejecuten en Windows; y los nombres de proyecto largos ya no pueden reventar los límites del sistema de archivos a mitad de la exportación.
|
|
41
|
+
- **Una entrada defectuosa ya no puede matar procesos de larga duración** — el servidor MCP sobrevive a mensajes JSON-RPC malformados en vez de morir; un `beacon.json` o una caché de AST corruptos (incluyendo UTF-8 inválido y colecciones nulas/malformadas) se respaldan y se reportan en vez de hacer caer `affected`, `serve` o el driver de fusión.
|
|
42
|
+
- **Salida reproducible byte a byte** — el orden de los nodos ya no sigue el orden de finalización de los hilos y las anotaciones de entidad compartida se ordenan, así que escanear dos veces un árbol sin cambios produce `beacon.json`, wiki y CLAUDE.md byte-idénticos. El backend de clustering Leiden (silenciosamente roto por un cambio de la API de graspologic — *nunca* llegó a ejecutarse) vuelve a estar en servicio.
|
|
43
|
+
- **La configuración que escribes es la configuración que se ejecuta** — los ajustes documentados de `codebeacon.yaml` (`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`) se parseaban y luego se ignoraban; ahora sí gobiernan el pipeline, `--list-only` se respeta dentro de workspaces, y `codebeacon upgrade` da el comando correcto para instalaciones con uv venv. Consistencia extra: la tabla de Projects, la columna de Notes y la sección de Architecture de CLAUDE.md ahora coinciden en un único recuento de "Services", igual que el wiki.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
30
47
|
## Novedades en 0.6.8
|
|
31
48
|
|
|
32
49
|
Una auditoría de paridad con graphify del upstream v0.8.41–v0.9.3 (issues reportados hasta el #1568). Cada candidato se reprodujo contra codebeacon antes de corregirlo y se volvió a comprobar con una ronda de revisión adversarial; se confirmaron **7 bugs reales**, encabezados por una trampa de pérdida de datos y una fuga de privacidad.
|
|
@@ -27,6 +27,23 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Nouveautés en 0.6.9
|
|
31
|
+
|
|
32
|
+
La plus grande release d'audit à ce jour : un double balayage de parité amont (le tout premier audit complet du tracker de codesight, plus graphify v0.9.4–v0.9.12 / issues jusqu'au #1776) combiné à une chasse aux bugs multi-agent indépendante sur codebeacon lui-même. Chaque candidat a été reproduit avant correction, chaque correction a été testée par mutation, et une seconde revue adversariale a ensuite attaqué les correctifs eux-mêmes — attrapant 18 failles supplémentaires avant la publication. **48 bugs réels corrigés.**
|
|
33
|
+
|
|
34
|
+
- **Votre CLAUDE.md est désormais protégé** — sur un CLAUDE.md écrit à la main (par ex. issu de `/init`), l'étape de fusion pouvait prendre les sections `## Architecture` / `## Common Commands` propres à l'utilisateur pour de la sortie codebeacon et les supprimer. Le nettoyage ne s'exécute désormais que sur les fichiers qui s'identifient sans ambiguïté comme générés par codebeacon, et il est ancré au bloc généré — vos sections survivent. `codebeacon.yaml` est aussi écrit atomiquement désormais (et à travers les symlinks, en préservant les modes de fichier), si bien qu'une écriture interrompue ne peut pas détruire une configuration soignée à la main.
|
|
35
|
+
- **Les fichiers ne disparaissent plus silencieusement de l'index** — les extensions en majuscules (`App.PY`, `Page.TSX`) étaient ignorées ; les modules source nommés d'après des identifiants (`api_key_manager.go`, `access_token_service.py`) étaient écartés par l'heuristique des fichiers secrets ; un seul octet non-UTF-8 dans un `.gitignore` faisait planter tout le scan ; et un dépôt cloné sous un dossier nommé `build/` ou `dist/` voyait **son graphe entier effacé** par le filtre d'artefacts qui matchait les répertoires ancêtres. Tout est corrigé ; les symlinks ignorés reçoivent désormais un unique avertissement groupé au lieu du silence.
|
|
36
|
+
- **La gestion de `.gitignore` correspond désormais exactement à git** — la sémantique de négation (`dir/` + `!dir/keep.txt`) est testée différentiellement contre `git check-ignore` pour chaque forme de règle ; un fichier sous un répertoire exclu ne peut plus être réinclus, exactement comme git. L'idiome de sauvetage standard `dir/*` + `!dir/keep` fonctionne comme avant.
|
|
37
|
+
- **Les projets homonymes coexistent** — deux (ou trois) sous-projets tous nommés `frontend` fusionnaient auparavant en un seul : des IDs de nœud en collision faisaient disparaître des routes en silence, et leurs dossiers wiki/obsidian s'écrasaient mutuellement. Les noms en double sont désormais désambiguïsés automatiquement par un préfixe issu du répertoire parent.
|
|
38
|
+
- **L'extraction des routes a été révisée pour sa justesse** — les préfixes de montage `app.use('/api', router)` d'Express sont appliqués et le chaînage `router.route(x).get().post()` produit chaque verbe ; les préfixes `register_blueprint` de Flask / `include_router` de FastAPI ne dépendent plus de leur position dans le fichier ; le `@RequestMapping(method = RequestMethod.X)` de Spring enregistre le vrai verbe au lieu de `ANY` ; les segments catch-all de Next.js (`[...slug]`) ne sont plus déformés et les routes parallèles `@slot` sont retirées des URLs ; le canonique `class X extends Model` de Laravel produit enfin une entité (auparavant seules les bases pleinement qualifiées matchaient — et `ViewModel` ne se faufile plus).
|
|
39
|
+
- **Arêtes fantômes du graphe éliminées** — un import en minuscules comme `CONFIG` n'est plus replié par casse sur une classe `Config` sans rapport (le faux motif god-node), les imports ne se lient jamais par-delà une frontière de langage (`import time` → `time.ts`), les liaisons DI privilégient le projet qui enregistre plutôt que la première classe homonyme n'importe où, et un service + une entité homonymes dans un même répertoire ne fusionnent plus en un unique nœud.
|
|
40
|
+
- **Les exports sont à l'épreuve de Windows et des plantages** — les noms de note obsidian retirent l'ensemble complet des caractères illégaux sous Windows (les routes `<string:id>` de Flask cassaient l'export sous Windows) et se prémunissent contre les noms de périphérique réservés ; les labels `None` ne font plus planter les exporteurs wiki, HTML call-flow ou obsidian ; les git hooks sont écrits avec des fins de ligne LF pour s'exécuter sous Windows ; et les noms de projet longs ne peuvent plus dépasser les limites du système de fichiers en plein export.
|
|
41
|
+
- **Une seule mauvaise entrée ne peut plus tuer les processus longue durée** — le serveur MCP survit aux messages JSON-RPC malformés au lieu de mourir ; un `beacon.json` ou un cache AST corrompu (y compris UTF-8 invalide et collections nulles/malformées) est sauvegardé et signalé au lieu de faire planter `affected`, `serve` ou le pilote de fusion.
|
|
42
|
+
- **Sortie reproductible à l'octet près** — l'ordre des nœuds ne suit plus l'ordre d'achèvement des threads et les annotations d'entité partagée sont triées, si bien que scanner deux fois un arbre inchangé produit des `beacon.json`, wiki et CLAUDE.md octet-identiques. Le backend de clustering Leiden (silencieusement cassé par un changement d'API de graspologic — il ne s'est *jamais* exécuté) est de nouveau opérationnel.
|
|
43
|
+
- **La configuration que vous écrivez est la configuration qui s'exécute** — les réglages documentés de `codebeacon.yaml` (`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`) étaient parsés puis ignorés ; ils pilotent désormais le pipeline, `--list-only` est respecté à l'intérieur des workspaces, et `codebeacon upgrade` donne la bonne commande pour les installations uv venv. Cohérence en bonus : le tableau Projects, la colonne Notes et la section Architecture de CLAUDE.md s'accordent désormais sur un unique décompte de « Services », en phase avec le wiki.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
30
47
|
## Nouveautés en 0.6.8
|
|
31
48
|
|
|
32
49
|
Un audit de parité graphify de l'upstream v0.8.41–v0.9.3 (issues signalées jusqu'au #1568). Chaque candidat a été reproduit sur codebeacon avant correction, puis revérifié par une passe de revue adversariale ; **7 bugs réels** confirmés, avec en tête un piège à perte de données et une fuite de confidentialité.
|
|
@@ -27,6 +27,23 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## 0.6.9 の新機能
|
|
31
|
+
|
|
32
|
+
これまでで最大規模の監査リリースです。二重のアップストリーム・パリティ・スイープ(codesight のトラッカーに対する史上初の完全監査に加え、graphify v0.9.4–v0.9.12 / issue は #1776 まで)と、codebeacon 自体に対する独立したマルチエージェント・バグハントを組み合わせました。各候補は修正前に再現し、各修正は mutation テストにかけ、さらに敵対的な2次レビューが修正自体を攻撃して、リリース前にさらに18個の穴を捕まえました。**実バグ48件を修正。**
|
|
33
|
+
|
|
34
|
+
- **CLAUDE.md が安全になりました** — 手書きの CLAUDE.md(例:`/init` 由来)では、マージステップがユーザー自身の `## Architecture` / `## Common Commands` セクションを codebeacon の出力と誤認して削除する可能性がありました。ストリップ処理は今や codebeacon 生成物だと確実に判別されたファイルでのみ、生成ブロックにアンカリングして実行されます — あなたのセクションは残ります。`codebeacon.yaml` もアトミックに(シンボリックリンク越しでも、ファイルモードを保持しつつ)書き込まれるようになり、中断された書き込みが手作業で整えた設定を破壊できなくなりました。
|
|
35
|
+
- **ファイルがインデックスから静かに消えなくなりました** — 大文字の拡張子(`App.PY`、`Page.TSX`)がスキップされ、資格情報にちなんだ名前のソースモジュール(`api_key_manager.go`、`access_token_service.py`)がシークレットファイル・ヒューリスティックで除外され、`.gitignore` 内の非 UTF-8 バイト1個がスキャン全体をクラッシュさせ、`build/` や `dist/` という名前のフォルダ配下にチェックアウトしたリポは、アーティファクトフィルタが祖先ディレクトリにマッチして**グラフ全体が消去**されていました。すべて修正済みです。スキップされたシンボリックリンクは、沈黙の代わりにグループ化された警告を1つ出すようになりました。
|
|
36
|
+
- **`.gitignore` の扱いが git と完全に一致するようになりました** — 否定セマンティクス(`dir/` + `!dir/keep.txt`)を、あらゆるルール形態にわたって `git check-ignore` と differential テストしています。git とまったく同じく、除外されたディレクトリ配下のファイルは再び含めることができません。標準の救済イディオム `dir/*` + `!dir/keep` は従来どおり動作します。
|
|
37
|
+
- **同名プロジェクトが共存します** — すべて `frontend` という名前の2つ(または3つ)のサブプロジェクトが以前は1つに潰れていました:ノード ID の衝突でルートが静かに脱落し、それぞれの wiki/obsidian フォルダが互いを上書きしていました。重複する名前は今や親ディレクトリのプレフィックスで自動的に区別されます。
|
|
38
|
+
- **ルート抽出を正確性の観点から全面的に見直しました** — Express の `app.use('/api', router)` マウントプレフィックスが適用され、チェーンした `router.route(x).get().post()` があらゆる verb を産出します。Flask の `register_blueprint` / FastAPI の `include_router` プレフィックスがファイル内の出現位置に依存しなくなりました。Spring の `@RequestMapping(method = RequestMethod.X)` が `ANY` ではなく実際の verb を記録します。Next.js の catch-all セグメント(`[...slug]`)が壊れなくなり、`@slot` 並列ルートが URL から除去されます。Laravel の教科書的な `class X extends Model` がついにエンティティを生成します(以前は完全修飾されたベースのみがマッチ — `ViewModel` はもう紛れ込みません)。
|
|
39
|
+
- **幽霊グラフエッジを排除しました** — `CONFIG` のような小文字の import が無関係な `Config` クラスに大文字小文字の畳み込みで結び付く(偽の god-node パターン)ことがなくなり、import が言語境界を越えてバインドすることは決してなく(`import time` → `time.ts`)、DI バインディングはどこかにある最初の同名クラスではなく登録元のプロジェクトを優先し、1つのディレクトリ内の同名の service + entity が単一ノードに潰れなくなりました。
|
|
40
|
+
- **エクスポートが Windows 堅牢かつクラッシュ堅牢になりました** — obsidian のノート名は Windows で不正な文字セット全体を除去し(Flask の `<string:id>` ルートは Windows でエクスポートを壊していました)、予約デバイス名を防御します。`None` ラベルは wiki・call-flow HTML・obsidian エクスポーターをもうクラッシュさせません。git hook は LF 改行で書き込まれ、Windows でも実行されます。そして長いプロジェクト名がエクスポート途中でファイルシステムの上限を超えることもなくなりました。
|
|
41
|
+
- **不正な入力1つで長時間稼働のプロセスを殺せなくなりました** — MCP サーバーは不正な JSON-RPC メッセージで死なずに生き延びます。破損した `beacon.json` や AST キャッシュ(無効な UTF-8 や null/不正なコレクションを含む)はバックアップして報告され、`affected`・`serve`・マージドライバーをクラッシュさせません。
|
|
42
|
+
- **バイト単位で再現可能な出力** — ノードの順序がスレッドの完了順を追わなくなり、共有エンティティの注釈がソートされるため、変更のないツリーを2回スキャンするとバイト単位で同一の `beacon.json`・wiki・CLAUDE.md が生成されます。graspologic の API 変更で静かに壊れていた(*一度も*実行されなかった)Leiden クラスタリングバックエンドも復帰しました。
|
|
43
|
+
- **書いた設定が実際に走る設定です** — 文書化された `codebeacon.yaml` の設定(`wave.*`、`output.wiki/obsidian`、`context_map.targets`、`semantic.enabled`)はパースされたうえで無視されていましたが、今やパイプラインを実際に駆動します。ワークスペース内で `--list-only` が尊重され、`codebeacon upgrade` は uv venv インストールに正しいコマンドを案内します。おまけの一貫性:CLAUDE.md の Projects 表・Notes 列・Architecture セクションが単一の「Services」件数で一致し、wiki とも揃いました。
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
30
47
|
## 0.6.8 の新機能
|
|
31
48
|
|
|
32
49
|
アップストリーム v0.8.41–v0.9.3(報告された issue は #1568 まで)の graphify パリティ監査です。各候補は修正前に codebeacon 上で実際に再現し、敵対的レビューパスで再確認しました。**実バグ7件**を確認、データ損失トラップとプライバシー漏洩が目玉です。
|
|
@@ -27,6 +27,23 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## 0.6.9 새 소식
|
|
31
|
+
|
|
32
|
+
역대 최대 규모의 감사 릴리스입니다: 이중 업스트림 패리티 스윕(codesight 트래커 최초 전체 감사 + graphify v0.9.4–v0.9.12 / 이슈 #1776까지)에 codebeacon 자체에 대한 독립 멀티에이전트 버그 헌트를 결합했습니다. 모든 후보를 수정 전에 재현하고, 모든 수정을 mutation 테스트했으며, 적대적 2차 리뷰가 수정 자체를 공격해 출시 전에 추가 구멍 18개를 잡아냈습니다. **실제 버그 48건 수정.**
|
|
33
|
+
|
|
34
|
+
- **이제 CLAUDE.md가 안전합니다** — 손으로 작성한 CLAUDE.md(예: `/init` 산출물)에서 병합 단계가 사용자의 `## Architecture` / `## Common Commands` 섹션을 codebeacon 출력으로 오인해 삭제할 수 있었습니다. 이제 스트립은 codebeacon 생성물로 확실히 판별되는 파일에서만, 생성 블록에 앵커링되어 동작합니다 — 사용자 섹션은 살아남습니다. `codebeacon.yaml`도 원자적으로(심링크 관통·파일 모드 보존 포함) 기록되어, 중단된 쓰기가 손수 관리한 설정을 파괴할 수 없습니다.
|
|
35
|
+
- **파일이 인덱스에서 조용히 사라지지 않습니다** — 대문자 확장자(`App.PY`, `Page.TSX`)가 무시됐고, 자격증명 이름을 딴 소스 모듈(`api_key_manager.go`, `access_token_service.py`)이 시크릿 파일 휴리스틱에 걸려 탈락했으며, `.gitignore`의 비 UTF-8 바이트 하나가 스캔 전체를 중단시켰고, `build/`나 `dist/`라는 폴더 아래에 체크아웃한 리포는 아티팩트 필터가 상위 디렉토리까지 매칭해 **그래프 전체가 소거**됐습니다. 모두 수정했고, 건너뛴 심링크는 침묵 대신 그룹화된 경고 한 줄을 남깁니다.
|
|
36
|
+
- **`.gitignore` 처리가 git과 정확히 일치합니다** — 부정 패턴 시맨틱(`dir/` + `!dir/keep.txt`)을 모든 규칙 형태에 대해 `git check-ignore`와 differential 테스트했습니다. git과 똑같이, 제외된 디렉토리 아래의 파일은 다시 포함될 수 없습니다. 표준 구출 관용구 `dir/*` + `!dir/keep`은 종전대로 동작합니다.
|
|
37
|
+
- **동명 프로젝트가 공존합니다** — `frontend`라는 이름의 하위 프로젝트 두세 개가 하나로 합쳐지곤 했습니다: 노드 ID 충돌로 라우트가 조용히 소실되고 wiki/obsidian 폴더가 서로 덮어썼습니다. 중복 이름은 이제 부모 디렉토리 접두사로 자동 구별됩니다.
|
|
38
|
+
- **라우트 추출 정확성 전면 정비** — Express `app.use('/api', router)` 마운트 프리픽스가 적용되고 체인 `router.route(x).get().post()`가 모든 verb를 산출합니다. Flask `register_blueprint` / FastAPI `include_router` 프리픽스가 파일 내 위치에 의존하지 않습니다. Spring `@RequestMapping(method = RequestMethod.X)`가 `ANY` 대신 실제 verb를 기록합니다. Next.js catch-all(`[...slug]`)이 더는 깨지지 않고 `@slot` 병렬 라우트가 URL에서 제거됩니다. Laravel의 교과서적 `class X extends Model`이 드디어 엔티티를 생성합니다(이전엔 완전 수식된 베이스만 매칭 — `ViewModel`은 이제 걸러냅니다).
|
|
39
|
+
- **유령 그래프 엣지 제거** — 소문자 경로 import가 무관한 `Config` 클래스에 `CONFIG`를 케이스폴딩으로 오연결하던 가짜 god-node 패턴이 사라졌고, import가 언어 경계를 넘어 바인딩되지 않으며(`import time` → `time.ts`), DI 바인딩은 아무 프로젝트의 동명 클래스가 아니라 등록한 프로젝트를 우선하고, 한 디렉토리의 동명 service + entity가 단일 노드로 합쳐지지 않습니다.
|
|
40
|
+
- **Export가 Windows-안전 + 크래시-안전** — obsidian 노트 이름이 Windows 불법 문자 전체를 제거하고(Flask `<string:id>` 라우트가 Windows에서 export를 중단시켰습니다) 예약 장치 이름을 방어합니다. `None` 라벨이 wiki·call-flow HTML·obsidian exporter를 더는 크래시시키지 않습니다. git hook이 LF 개행으로 기록되어 Windows에서도 실행되고, 긴 프로젝트 이름이 파일시스템 한계를 넘지 않습니다.
|
|
41
|
+
- **입력 하나가 장수명 프로세스를 죽일 수 없습니다** — MCP 서버가 잘못된 JSON-RPC 메시지에 죽지 않고 살아남습니다. 손상된 `beacon.json`이나 AST 캐시(잘못된 UTF-8, null/기형 컬렉션 포함)는 백업 후 명확히 보고되며 `affected`·`serve`·머지 드라이버를 크래시시키지 않습니다.
|
|
42
|
+
- **바이트 단위 재현 가능한 출력** — 노드 순서가 스레드 완료 순서를 따라가지 않고 공유 엔티티 주석이 정렬되어, 변경 없는 트리를 두 번 스캔하면 `beacon.json`·wiki·CLAUDE.md가 바이트 단위로 동일합니다. graspologic API 변경으로 조용히 죽어 있던(한 번도 실행되지 못한) Leiden 클러스터링 백엔드도 복구했습니다.
|
|
43
|
+
- **작성한 설정이 실제로 적용됩니다** — 문서화된 `codebeacon.yaml` 설정(`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`)이 파싱만 되고 무시됐는데, 이제 파이프라인을 실제로 제어합니다. 워크스페이스 안에서 `--list-only`가 존중되고, `codebeacon upgrade`가 uv venv 설치에 맞는 명령을 안내합니다. 덤으로 CLAUDE.md의 Projects 표·Notes 열·Architecture 섹션이 하나의 "Services" 수치로 일치하며 wiki와도 맞습니다.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
30
47
|
## 0.6.8 새 소식
|
|
31
48
|
|
|
32
49
|
업스트림 v0.8.41–v0.9.3(보고된 이슈 #1568까지)에 대한 graphify-패리티 감사입니다. 모든 후보를 수정 전에 codebeacon에서 실제로 재현하고 적대적 리뷰 패스로 재검증했으며, **7개의 실제 버그**를 확인했습니다 — 데이터 손실 함정과 프라이버시 유출이 핵심입니다.
|
|
@@ -25,6 +25,23 @@
|
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
28
|
+
## What's new in 0.6.9
|
|
29
|
+
|
|
30
|
+
The largest audit release to date: a dual upstream-parity sweep (the first-ever full audit of codesight's tracker, plus graphify v0.9.4–v0.9.12 / issues through #1776) combined with an independent multi-agent bug hunt over codebeacon itself. Every candidate was reproduced before fixing, every fix was mutation-tested, and an adversarial second review then attacked the fixes themselves — catching 18 further holes before release. **48 real bugs fixed.**
|
|
31
|
+
|
|
32
|
+
- **Your CLAUDE.md is safe now** — on a hand-written CLAUDE.md (e.g. from `/init`), the merge step could mistake the user's own `## Architecture` / `## Common Commands` sections for codebeacon output and delete them. The strip now runs only on files that positively fingerprint as codebeacon-generated, and it is anchored to the generated block — your sections survive. `codebeacon.yaml` is also written atomically now (and through symlinks, preserving file modes), so an interrupted write can't destroy a hand-curated config.
|
|
33
|
+
- **Files no longer vanish from the index silently** — uppercase extensions (`App.PY`, `Page.TSX`) were skipped; source modules named after credentials (`api_key_manager.go`, `access_token_service.py`) were dropped by the secret-file heuristic; one non-UTF-8 byte in a `.gitignore` crashed the whole scan; and a repo checked out under a folder named `build/` or `dist/` had its **entire graph erased** by the artifact filter matching ancestor directories. All fixed; skipped symlinks now get one grouped warning instead of silence.
|
|
34
|
+
- **`.gitignore` handling now matches git exactly** — negation semantics (`dir/` + `!dir/keep.txt`) are differential-tested against `git check-ignore` across every rule shape; a file under an excluded directory can no longer be re-included, exactly like git. The standard `dir/*` + `!dir/keep` rescue idiom works as before.
|
|
35
|
+
- **Same-named projects coexist** — two (or three) sub-projects all named `frontend` used to collapse into one: colliding node IDs silently dropped routes, and their wiki/obsidian folders overwrote each other. Duplicate names are now auto-disambiguated with a parent-directory prefix.
|
|
36
|
+
- **Route extraction got a correctness overhaul** — Express `app.use('/api', router)` mount prefixes are applied and chained `router.route(x).get().post()` yields every verb; Flask `register_blueprint` / FastAPI `include_router` prefixes no longer depend on where they appear in the file; Spring's `@RequestMapping(method = RequestMethod.X)` records the real verb instead of `ANY`; Next.js catch-all segments (`[...slug]`) are no longer garbled and `@slot` parallel routes are stripped from URLs; Laravel's canonical `class X extends Model` finally produces an entity (previously only fully-qualified bases matched — and `ViewModel` no longer sneaks in).
|
|
37
|
+
- **Phantom graph edges eliminated** — a lowercase import like `CONFIG` no longer case-folds onto an unrelated `Config` class (the false god-node pattern), imports never bind across a language boundary (`import time` → `time.ts`), DI bindings prefer the registering project instead of the first same-named class anywhere, and a same-named service + entity in one directory no longer collapse into a single node.
|
|
38
|
+
- **Exports are Windows-proof and crash-proof** — obsidian note names strip the full Windows-illegal character set (Flask `<string:id>` routes used to break the export on Windows) and guard reserved device names; `None` labels no longer crash the wiki, call-flow HTML, or obsidian exporters; git hooks are written with LF line endings so they execute on Windows; and long project names can't blow past filesystem limits mid-export.
|
|
39
|
+
- **One bad input can't kill long-running surfaces** — the MCP server survives malformed JSON-RPC messages instead of dying; a corrupt `beacon.json` or AST cache (including invalid UTF-8 and null/malformed collections) is backed up and reported instead of crashing `affected`, `serve`, or the merge driver.
|
|
40
|
+
- **Byte-reproducible output** — node ordering no longer tracks thread-completion order and shared-entity annotations are sorted, so scanning an unchanged tree twice produces byte-identical `beacon.json`, wiki, and CLAUDE.md. The Leiden clustering backend (silently broken by a graspologic API change — it *never* ran) is back in service.
|
|
41
|
+
- **The config you write is the config that runs** — documented `codebeacon.yaml` settings (`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`) were parsed and then ignored; they now drive the pipeline, `--list-only` is honored inside workspaces, and `codebeacon upgrade` gives the right command for uv-venv installs. Bonus consistency: the Projects table, Notes column, and Architecture section of CLAUDE.md now agree on one "Services" count, matching the wiki.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
28
45
|
## What's new in 0.6.8
|
|
29
46
|
|
|
30
47
|
A graphify-parity audit of upstream v0.8.41–v0.9.3 (reported issues through #1568). Every candidate was reproduced against codebeacon before fixing and re-checked by an adversarial review pass; **7 real bugs** confirmed, headlined by a data-loss trap and a privacy leak.
|
|
@@ -27,6 +27,23 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Novidades na 0.6.9
|
|
31
|
+
|
|
32
|
+
A maior release de auditoria até hoje: um duplo mutirão de paridade com o upstream (a primeiríssima auditoria completa do tracker do codesight, mais graphify v0.9.4–v0.9.12 / issues até a #1776) combinado com uma caça a bugs multiagente independente sobre o próprio codebeacon. Cada candidato foi reproduzido antes de ser corrigido, cada correção passou por mutation testing, e uma segunda revisão adversarial então atacou as próprias correções — pegando mais 18 brechas antes da publicação. **48 bugs reais corrigidos.**
|
|
33
|
+
|
|
34
|
+
- **Seu CLAUDE.md agora está seguro** — em um CLAUDE.md escrito à mão (p. ex. vindo do `/init`), o passo de mesclagem podia confundir as seções `## Architecture` / `## Common Commands` do próprio usuário com saída do codebeacon e apagá-las. A remoção agora só roda em arquivos que se identificam inequivocamente como gerados pelo codebeacon, e está ancorada ao bloco gerado — suas seções sobrevivem. O `codebeacon.yaml` também é escrito de forma atômica agora (e através de symlinks, preservando os modos de arquivo), então uma escrita interrompida não pode destruir uma configuração curada à mão.
|
|
35
|
+
- **Arquivos não somem mais do índice em silêncio** — extensões em maiúsculas (`App.PY`, `Page.TSX`) eram puladas; módulos de código com nome de credencial (`api_key_manager.go`, `access_token_service.py`) eram descartados pela heurística de arquivos secretos; um único byte não-UTF-8 em um `.gitignore` derrubava o scan inteiro; e um repositório com checkout sob uma pasta chamada `build/` ou `dist/` tinha **seu grafo inteiro apagado** porque o filtro de artefatos casava com diretórios ancestrais. Tudo corrigido; symlinks pulados agora recebem um único aviso agrupado em vez de silêncio.
|
|
36
|
+
- **O tratamento de `.gitignore` agora corresponde exatamente ao git** — a semântica de negação (`dir/` + `!dir/keep.txt`) passa por differential testing contra o `git check-ignore` em cada forma de regra; um arquivo sob um diretório excluído não pode mais ser reincluído, exatamente como no git. O idiomático de resgate padrão `dir/*` + `!dir/keep` funciona como antes.
|
|
37
|
+
- **Projetos com o mesmo nome coexistem** — dois (ou três) subprojetos todos chamados `frontend` costumavam colapsar em um só: IDs de nó em colisão descartavam rotas em silêncio, e suas pastas de wiki/obsidian se sobrescreviam. Nomes duplicados agora são desambiguados automaticamente com um prefixo do diretório pai.
|
|
38
|
+
- **A extração de rotas recebeu uma revisão de correção** — os prefixos de montagem `app.use('/api', router)` do Express são aplicados e o encadeado `router.route(x).get().post()` produz todos os verbos; os prefixos `register_blueprint` do Flask / `include_router` do FastAPI não dependem mais de onde aparecem no arquivo; o `@RequestMapping(method = RequestMethod.X)` do Spring registra o verbo real em vez de `ANY`; os segmentos catch-all do Next.js (`[...slug]`) não ficam mais corrompidos e as rotas paralelas `@slot` são removidas das URLs; o canônico `class X extends Model` do Laravel enfim produz uma entidade (antes só as bases totalmente qualificadas casavam — e `ViewModel` não se infiltra mais).
|
|
39
|
+
- **Arestas fantasma do grafo eliminadas** — um import em minúsculas como `CONFIG` não é mais dobrado por caixa sobre uma classe `Config` não relacionada (o falso padrão god-node), imports nunca se ligam atravessando uma fronteira de linguagem (`import time` → `time.ts`), os bindings de DI preferem o projeto que registra em vez da primeira classe homônima em qualquer lugar, e um service + entity homônimos em um mesmo diretório não colapsam mais em um único nó.
|
|
40
|
+
- **As exportações são à prova de Windows e à prova de travamento** — os nomes de nota do obsidian removem o conjunto completo de caracteres ilegais no Windows (as rotas `<string:id>` do Flask quebravam a exportação no Windows) e protegem contra nomes de dispositivo reservados; labels `None` não travam mais os exportadores de wiki, do HTML de call-flow ou do obsidian; os git hooks são escritos com quebras de linha LF para que executem no Windows; e nomes de projeto longos não podem mais estourar os limites do sistema de arquivos no meio da exportação.
|
|
41
|
+
- **Uma entrada ruim não pode mais matar processos de longa duração** — o servidor MCP sobrevive a mensagens JSON-RPC malformadas em vez de morrer; um `beacon.json` ou cache de AST corrompido (incluindo UTF-8 inválido e coleções nulas/malformadas) é copiado em backup e reportado em vez de travar `affected`, `serve` ou o driver de mesclagem.
|
|
42
|
+
- **Saída reproduzível byte a byte** — a ordem dos nós não segue mais a ordem de conclusão das threads e as anotações de entidade compartilhada são ordenadas, então escanear duas vezes uma árvore inalterada produz `beacon.json`, wiki e CLAUDE.md byte-idênticos. O backend de clustering Leiden (silenciosamente quebrado por uma mudança na API do graspologic — ele *nunca* rodou) está de volta ao serviço.
|
|
43
|
+
- **A configuração que você escreve é a configuração que roda** — os ajustes documentados do `codebeacon.yaml` (`wave.*`, `output.wiki/obsidian`, `context_map.targets`, `semantic.enabled`) eram parseados e depois ignorados; agora eles conduzem o pipeline, `--list-only` é respeitado dentro de workspaces, e `codebeacon upgrade` dá o comando certo para instalações com uv venv. Consistência de bônus: a tabela de Projects, a coluna de Notes e a seção de Architecture do CLAUDE.md agora concordam em uma única contagem de "Services", batendo com o wiki.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
30
47
|
## Novidades na 0.6.8
|
|
31
48
|
|
|
32
49
|
Uma auditoria de paridade com graphify do upstream v0.8.41–v0.9.3 (issues reportadas até a #1568). Cada candidato foi reproduzido contra o codebeacon antes de ser corrigido e reverificado por uma rodada de revisão adversarial; **7 bugs reais** confirmados, com destaque para uma armadilha de perda de dados e um vazamento de privacidade.
|
|
@@ -27,6 +27,23 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## 0.6.9 新功能
|
|
31
|
+
|
|
32
|
+
迄今为止规模最大的审计版本:一次双重的上游对齐扫查(对 codesight 追踪器的首次完整审计,外加 graphify v0.9.4–v0.9.12 / issue 直到 #1776),并结合了一次针对 codebeacon 自身的独立多智能体查错。每个候选项在修复前都先复现,每个修复都做了 mutation 测试,随后一轮对抗式二次复核又反过来攻击这些修复本身——在发布前又抓出 18 个漏洞。**修复 48 个真实 bug。**
|
|
33
|
+
|
|
34
|
+
- **你的 CLAUDE.md 现在安全了** — 对于手写的 CLAUDE.md(例如来自 `/init`),合并步骤可能把用户自己的 `## Architecture` / `## Common Commands` 小节误认为 codebeacon 的输出并删除。现在剥离只在能确切识别为 codebeacon 生成的文件上运行,并锚定到生成块——你的小节会保留下来。`codebeacon.yaml` 现在也以原子方式写入(并可穿过符号链接、保留文件模式),因此中断的写入无法破坏手工维护的配置。
|
|
35
|
+
- **文件不再从索引中悄悄消失** — 大写扩展名(`App.PY`、`Page.TSX`)被跳过了;以凭据命名的源码模块(`api_key_manager.go`、`access_token_service.py`)被密钥文件启发式规则丢弃了;`.gitignore` 中的一个非 UTF-8 字节会让整个 scan 崩溃;而在名为 `build/` 或 `dist/` 的文件夹下检出的仓库,会因为产物过滤器匹配到祖先目录而**整张图被抹除**。全部修复;被跳过的符号链接现在会给出一条分组的警告,而不是保持沉默。
|
|
36
|
+
- **`.gitignore` 的处理现在与 git 完全一致** — 否定语义(`dir/` + `!dir/keep.txt`)针对每一种规则形态都与 `git check-ignore` 做了差分测试;和 git 完全一样,被排除目录下的文件无法再被重新包含。标准的救援惯用法 `dir/*` + `!dir/keep` 一如既往地有效。
|
|
37
|
+
- **同名项目可以共存** — 两个(或三个)都叫 `frontend` 的子项目过去会塌缩成一个:冲突的节点 ID 会悄悄丢弃路由,它们的 wiki/obsidian 文件夹也会互相覆盖。现在重名会用父目录前缀自动消歧。
|
|
38
|
+
- **路由提取做了一次正确性大修** — Express 的 `app.use('/api', router)` 挂载前缀会被应用,链式的 `router.route(x).get().post()` 会产出每一个动词;Flask 的 `register_blueprint` / FastAPI 的 `include_router` 前缀不再取决于它们在文件中出现的位置;Spring 的 `@RequestMapping(method = RequestMethod.X)` 会记录真实动词而不是 `ANY`;Next.js 的 catch-all 段(`[...slug]`)不再被弄乱,`@slot` 并行路由会从 URL 中剥除;Laravel 教科书式的 `class X extends Model` 终于能生成一个实体了(此前只有完全限定的基类才会匹配——而且 `ViewModel` 不再混进来)。
|
|
39
|
+
- **消除幽灵图边** — 像 `CONFIG` 这样的小写 import 不再通过大小写折叠错连到无关的 `Config` 类(即假 god-node 模式),import 绝不会跨语言边界绑定(`import time` → `time.ts`),DI 绑定会优先选择注册它的项目,而不是任意位置上第一个同名类,同一目录下同名的 service + entity 也不再塌缩成单个节点。
|
|
40
|
+
- **导出对 Windows 稳健、对崩溃稳健** — obsidian 笔记名会剥除 Windows 上全部的非法字符集(Flask 的 `<string:id>` 路由过去会在 Windows 上破坏导出),并防范保留设备名;`None` 标签不再让 wiki、call-flow HTML 或 obsidian 导出器崩溃;git hook 以 LF 换行写入,以便在 Windows 上执行;过长的项目名也不会在导出途中冲破文件系统的限制。
|
|
41
|
+
- **一个坏输入无法再杀死长时间运行的进程** — MCP 服务器面对格式错误的 JSON-RPC 消息会存活而不是死掉;损坏的 `beacon.json` 或 AST 缓存(包括无效 UTF-8 以及 null/畸形的集合)会被备份并报告,而不是让 `affected`、`serve` 或合并驱动崩溃。
|
|
42
|
+
- **逐字节可复现的输出** — 节点顺序不再跟随线程完成顺序,共享实体注解也会排序,因此对未改动的树扫描两次会产出逐字节相同的 `beacon.json`、wiki 和 CLAUDE.md。此前因 graspologic API 变更而悄悄损坏(*从未*运行过)的 Leiden 聚类后端也重新恢复服务。
|
|
43
|
+
- **你写下的配置就是实际运行的配置** — 已文档化的 `codebeacon.yaml` 设置(`wave.*`、`output.wiki/obsidian`、`context_map.targets`、`semantic.enabled`)此前只被解析然后被忽略;现在它们真正驱动流水线,`--list-only` 在工作区内会被尊重,`codebeacon upgrade` 会为 uv venv 安装给出正确的命令。附带的一致性:CLAUDE.md 的 Projects 表、Notes 列和 Architecture 小节现在在单一的"Services"计数上达成一致,并与 wiki 相符。
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
30
47
|
## 0.6.8 新功能
|
|
31
48
|
|
|
32
49
|
对上游 v0.8.41–v0.9.3 的 graphify 对齐审计(涵盖已报告的 issue,直到 #1568)。每个候选项在修复前都在 codebeacon 上实际复现,并通过对抗式复核再次确认;确认了 **7 个真实 bug**,以一个数据丢失陷阱和一个隐私泄露为首。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.6.9"
|
|
@@ -116,10 +116,13 @@ class Cache:
|
|
|
116
116
|
try:
|
|
117
117
|
if self._cache_file.exists():
|
|
118
118
|
raw = json.loads(self._cache_file.read_text(encoding="utf-8"))
|
|
119
|
-
except (json.JSONDecodeError, OSError):
|
|
119
|
+
except (json.JSONDecodeError, UnicodeDecodeError, OSError):
|
|
120
120
|
# Corrupt cache.json — preserve it (don't let the next save silently
|
|
121
121
|
# overwrite and destroy it) and rebuild from scratch. Mirrors the
|
|
122
122
|
# graphify v0.8.39 "manifest data-loss on corrupt JSON" fix.
|
|
123
|
+
# UnicodeDecodeError (a ValueError, not an OSError) fires when a
|
|
124
|
+
# crash/disk-full truncated a write mid multi-byte sequence, leaving
|
|
125
|
+
# invalid UTF-8 that read_text can't decode — self-heal it too.
|
|
123
126
|
self._backup_corrupt()
|
|
124
127
|
raw = None
|
|
125
128
|
|
|
@@ -30,7 +30,11 @@ def _cmd_scan(args: argparse.Namespace) -> int:
|
|
|
30
30
|
config_path = find_config(paths[0])
|
|
31
31
|
if not config_path:
|
|
32
32
|
config_path = find_config(paths[0], walk_up=True)
|
|
33
|
-
|
|
33
|
+
# --list-only is a read-only "what would be scanned" query. Never let
|
|
34
|
+
# the sync auto-switch turn it into a full extraction (which writes
|
|
35
|
+
# outputs and can rewrite codebeacon.yaml via auto-rediscovery); fall
|
|
36
|
+
# through to plain discovery + listing instead.
|
|
37
|
+
if config_path and not args.list_only:
|
|
34
38
|
print(f"Found {config_path} — switching to sync mode")
|
|
35
39
|
args.config = str(config_path)
|
|
36
40
|
return _cmd_sync(args)
|
|
@@ -74,6 +78,11 @@ def _cmd_scan(args: argparse.Namespace) -> int:
|
|
|
74
78
|
output_dir = str(output_base / ".codebeacon")
|
|
75
79
|
print(f" Output: {output_dir}")
|
|
76
80
|
|
|
81
|
+
# --list-only lists detected projects and stops before writing anything —
|
|
82
|
+
# no auto-generated codebeacon.yaml, no extraction, no context-map files.
|
|
83
|
+
if args.list_only:
|
|
84
|
+
return 0
|
|
85
|
+
|
|
77
86
|
deep_dive = getattr(args, "deep_dive", False)
|
|
78
87
|
|
|
79
88
|
# Auto-generate codebeacon.yaml on multi-project first scan
|
|
@@ -83,9 +92,6 @@ def _cmd_scan(args: argparse.Namespace) -> int:
|
|
|
83
92
|
generate_config(projects, output_dir, yaml_path, deep_dive=deep_dive)
|
|
84
93
|
print(f" Generated {yaml_path} — next time run: codebeacon sync")
|
|
85
94
|
|
|
86
|
-
if args.list_only:
|
|
87
|
-
return 0
|
|
88
|
-
|
|
89
95
|
if deep_dive:
|
|
90
96
|
return run_deep_dive_pipeline(projects, output_dir, args)
|
|
91
97
|
return run_pipeline(projects, output_dir, args)
|
|
@@ -125,6 +131,19 @@ def _cmd_sync(args: argparse.Namespace) -> int:
|
|
|
125
131
|
append_projects_to_yaml(config.config_file, new_projects)
|
|
126
132
|
config = load_config(config.config_file)
|
|
127
133
|
|
|
134
|
+
# Wire parsed codebeacon.yaml settings through to the pipeline via `args`,
|
|
135
|
+
# honoring precedence: explicit CLI flags > codebeacon.yaml > built-in
|
|
136
|
+
# defaults. The pipeline reads these with getattr(..., <default>) so the
|
|
137
|
+
# `scan` path (no config) keeps its defaults and run_pipeline's positional
|
|
138
|
+
# signature stays unchanged. --semantic on the CLI OR semantic.enabled in
|
|
139
|
+
# the yaml turns the semantic step on.
|
|
140
|
+
args.semantic = getattr(args, "semantic", False) or config.semantic.enabled
|
|
141
|
+
args.wave_chunk_size = config.wave.chunk_size
|
|
142
|
+
args.wave_max_parallel = config.wave.max_parallel
|
|
143
|
+
args.output_wiki = config.output.wiki
|
|
144
|
+
args.output_obsidian = config.output.obsidian
|
|
145
|
+
args.context_map_targets = config.output.context_map_targets
|
|
146
|
+
|
|
128
147
|
print(f"Using {config.config_file}")
|
|
129
148
|
print(f"Processing {len(config.projects)} project(s)...")
|
|
130
149
|
|
|
@@ -362,6 +381,24 @@ def _detect_install_kind() -> str:
|
|
|
362
381
|
return "pip"
|
|
363
382
|
|
|
364
383
|
|
|
384
|
+
def _is_uv_venv() -> bool:
|
|
385
|
+
"""True when this interpreter runs inside a ``uv venv``-created environment.
|
|
386
|
+
|
|
387
|
+
uv stamps a ``uv = <version>`` line into the venv's ``pyvenv.cfg``. Such a
|
|
388
|
+
venv ships without a pip module by default, yet — unlike a pipx/uv-tool
|
|
389
|
+
managed venv — it is NOT upgraded with ``pipx``/``uv tool``; the right
|
|
390
|
+
command is ``uv pip install --upgrade`` targeting the venv itself.
|
|
391
|
+
"""
|
|
392
|
+
cfg = Path(sys.prefix) / "pyvenv.cfg"
|
|
393
|
+
try:
|
|
394
|
+
for line in cfg.read_text(encoding="utf-8").splitlines():
|
|
395
|
+
if line.split("=", 1)[0].strip().lower() == "uv":
|
|
396
|
+
return True
|
|
397
|
+
except OSError:
|
|
398
|
+
pass
|
|
399
|
+
return False
|
|
400
|
+
|
|
401
|
+
|
|
365
402
|
def _pypi_latest_version(timeout: float = 5.0) -> str | None:
|
|
366
403
|
"""Best-effort lookup of the newest codebeacon release on PyPI."""
|
|
367
404
|
import json
|
|
@@ -431,14 +468,27 @@ def _cmd_upgrade(args: argparse.Namespace) -> int:
|
|
|
431
468
|
else:
|
|
432
469
|
import importlib.util
|
|
433
470
|
if importlib.util.find_spec("pip") is None:
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
471
|
+
if _is_uv_venv():
|
|
472
|
+
# A `uv venv` has no pip module, but `pipx`/`uv tool` don't
|
|
473
|
+
# manage it either — both fail with "not installed". The
|
|
474
|
+
# working command is `uv pip install` into this venv.
|
|
475
|
+
print(
|
|
476
|
+
"This environment was created by `uv venv` and has no "
|
|
477
|
+
"pip module, so codebeacon cannot upgrade itself "
|
|
478
|
+
"in-process.\n"
|
|
479
|
+
"Upgrade it with uv (run inside this environment):\n"
|
|
480
|
+
" uv pip install --upgrade codebeacon",
|
|
481
|
+
file=_sys.stderr,
|
|
482
|
+
)
|
|
483
|
+
else:
|
|
484
|
+
print(
|
|
485
|
+
"This Python environment has no pip module, so codebeacon "
|
|
486
|
+
"cannot upgrade itself here.\n"
|
|
487
|
+
"Upgrade with the tool that installed it, e.g.:\n"
|
|
488
|
+
" pipx upgrade codebeacon\n"
|
|
489
|
+
" uv tool upgrade codebeacon",
|
|
490
|
+
file=_sys.stderr,
|
|
491
|
+
)
|
|
442
492
|
return 1
|
|
443
493
|
cmd = [_sys.executable, "-m", "pip", "install", "--upgrade", "codebeacon"]
|
|
444
494
|
|