codebeacon 0.6.7__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.7 → codebeacon-0.6.9}/PKG-INFO +32 -1
- {codebeacon-0.6.7 → codebeacon-0.6.9}/README.de.md +31 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/README.es.md +31 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/README.fr.md +31 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/README.ja.md +31 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/README.ko.md +31 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/README.md +31 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/README.pt-BR.md +31 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/README.zh-CN.md +31 -0
- codebeacon-0.6.9/codebeacon/__init__.py +1 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/cache.py +4 -1
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/cli.py +67 -17
- codebeacon-0.6.9/codebeacon/common/filters.py +259 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/common/safety.py +39 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/config.py +74 -14
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/contextmap/generator.py +96 -40
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/discover/detector.py +115 -31
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/discover/ignore.py +52 -26
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/discover/scanner.py +115 -36
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/export/callflow_html.py +5 -2
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/export/hooks.py +4 -1
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/export/mcp.py +27 -5
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/export/merge.py +29 -3
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/export/obsidian.py +125 -15
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/components.py +48 -18
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/express.scm +23 -16
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/laravel.scm +14 -1
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/react.scm +57 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/spring_boot.scm +24 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/routes.py +91 -8
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/graph/analyze.py +8 -4
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/graph/build.py +133 -36
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/graph/cluster.py +6 -1
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/graph/enrich.py +5 -1
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/graph/write.py +140 -29
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/pipeline.py +124 -57
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/semantic_pipeline.py +153 -7
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/wave.py +9 -3
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/wiki/generator.py +228 -38
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/wiki/templates.py +49 -9
- {codebeacon-0.6.7 → 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.7 → codebeacon-0.6.9}/tests/test_cli_upgrade.py +5 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_discover.py +8 -4
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_graphify_parity_0_6_7.py +21 -2
- codebeacon-0.6.9/tests/test_graphify_parity_0_6_8.py +491 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_safety_and_writes.py +8 -1
- codebeacon-0.6.7/codebeacon/__init__.py +0 -1
- codebeacon-0.6.7/codebeacon/common/filters.py +0 -170
- {codebeacon-0.6.7 → codebeacon-0.6.9}/.cursorrules +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/.github/CODEOWNERS +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/.github/dependabot.yml +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/.github/workflows/ci.yml +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/.github/workflows/release.yml +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/.gitignore +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/AGENTS.md +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/CLAUDE.md +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/LICENSE +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/__main__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/affected.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/common/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/common/symbols.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/common/types.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/contextmap/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/diagnostics.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/discover/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/export/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/export/tree_html.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/base.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/dependencies.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/dotnet.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/entities.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/README.md +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/actix.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/angular.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/aspnet.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/django.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/fastapi.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/flask.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/gin.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/ktor.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/nestjs.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/rails.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/svelte.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/tauri.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/vapor.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/queries/vue.scm +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/semantic.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/extract/services.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/graph/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/knowledge/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/knowledge/generator.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/plugins/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/plugins/githooks.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/plugins/skills.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/skill/SKILL.md +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/wiki/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon/wiki/index.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/codebeacon.yaml.example +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/docs/TRANSLATION_STATUS.md +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/public-plan.md +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/skill/install.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/conftest.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/actix/main.rs +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/angular/app.component.ts +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/aspnet/UserController.cs +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/django/views.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/express/userRouter.js +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/fastapi/main.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/flask/app.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/gin/main.go +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/api-python/pyproject.toml +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/api-python/src/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/api-python/src/main.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/api-python/src/services.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/web/package.json +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/integration_workspace/web/src/UserPage.tsx +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/ktor/UserRoutes.kt +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/laravel/UserController.php +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/nestjs/user.controller.ts +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/rails/users_controller.rb +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/react/UserPage.tsx +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/spring_boot/UserController.java +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/sveltekit/+page.svelte +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/vapor/routes.swift +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/fixtures/vue/UserList.vue +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/integration/__init__.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/integration/test_full_pipeline.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_affected.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_affected_wiki.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_audit_bugfixes.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_cli_dispatch.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_contextmap_paths.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_deep_dive_grouping.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_dependencies.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_diagnostics.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_dotnet.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_entities.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_filters.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_graph.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_graphify_parity_0_6_3.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_graphify_parity_0_6_6.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_graphify_parity_fixes.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_independent_audit_fixes.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_knowledge.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_known_bugs.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_mcp_and_semantic.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_optional_grammars.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_pipeline_module.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_plugins.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_resolve.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_routes.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_scanner_sensitive.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_semantic.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_semantic_hardening.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_semantic_stats.py +0 -0
- {codebeacon-0.6.7 → codebeacon-0.6.9}/tests/test_services.py +0 -0
- {codebeacon-0.6.7 → 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,37 @@ 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
|
+
|
|
138
|
+
## What's new in 0.6.8
|
|
139
|
+
|
|
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.
|
|
141
|
+
|
|
142
|
+
- **`--obsidian-dir` can no longer delete your notes** — pointed at an existing Obsidian vault, the export swept *every* `.md` under it before regenerating, so it could wipe a real vault. codebeacon now refuses any directory it doesn't own (only a genuinely empty dir, or one carrying its `.codebeacon-vault.json` marker, is adopted) and skips the export with a clear message instead of deleting.
|
|
143
|
+
- **`.gitignore` is no longer silently disabled by `.codebeaconignore`** — adding a `.codebeaconignore` used to *replace* the repo's `.gitignore`, so a file excluded only by `.gitignore` (a neutrally-named `prod-dump.sql`, `customer-data.*`) would get indexed into the committed `.codebeacon/` artifacts. The two are now merged (`.codebeaconignore` wins on conflict); adding it can only ever exclude *more*.
|
|
144
|
+
- **No machine-absolute paths in committed artifacts** — edge/link `source_file` values (the bulk of `beacon.json`) and the `Source:` lines in wiki/obsidian notes kept absolute `/Users/you/...` paths, so the committed index wasn't portable and leaked local paths. All are now project-relative (edges included, and cross-project `shares_db_entity` files too).
|
|
145
|
+
- **Same-named symbols in different directories no longer overwrite each other's notes** — wiki/obsidian filenames were derived from the label with no case-folding, so on macOS/Windows `UserService` and `userService` collided and one note was silently lost. Filenames are now collision-salted and case-folded; punctuation-only labels (`@`) fall back to `unnamed` instead of a broken `@.md`.
|
|
146
|
+
- **A corrupt `beacon.json` no longer crashes** — `codebeacon affected`, the MCP server, and `--wiki-only` runs now back up a corrupt/truncated graph and report a clear "re-run scan" message instead of a raw traceback.
|
|
147
|
+
- **More React components are captured** — `react.scm` missed function-expression components (`const X = function() {…}`), bare-imported HOCs (`const X = forwardRef(…)` without the `React.` prefix), and non-exported `function X()` components. All three are now extracted.
|
|
148
|
+
- **Wiki links never dangle** — a link to a page that was never written is downgraded to plain text, and a link to an article in a sibling bucket (a service → its entity) is repaired to the correct relative path instead of pointing at a missing file.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
121
152
|
## What's new in 0.6.7
|
|
122
153
|
|
|
123
154
|
Follow-ups to the 0.6.6 graphify-parity audit: grammar drift now fails loudly instead of silently, and ignore-file negations no longer slow scans down.
|
|
@@ -27,6 +27,37 @@
|
|
|
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
|
+
|
|
47
|
+
## Neu in 0.6.8
|
|
48
|
+
|
|
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.
|
|
50
|
+
|
|
51
|
+
- **`--obsidian-dir` kann keine Notizen mehr löschen** — bei einem bestehenden Obsidian-Vault fegte der Export vor der Neugenerierung *jede* `.md` darunter weg und konnte so ein echtes Vault leeren. codebeacon verweigert jetzt jedes Verzeichnis, das es nicht besitzt (nur ein wirklich leeres Verzeichnis oder eines mit seinem `.codebeacon-vault.json`-Marker wird übernommen) und überspringt den Export mit einer klaren Meldung statt zu löschen.
|
|
52
|
+
- **`.gitignore` wird nicht mehr still durch `.codebeaconignore` deaktiviert** — das Hinzufügen einer `.codebeaconignore` *ersetzte* bisher die `.gitignore` des Repos, sodass eine nur durch `.gitignore` ausgeschlossene Datei (ein neutral benanntes `prod-dump.sql`, `customer-data.*`) in die committeten `.codebeacon/`-Artefakte indexiert werden konnte. Beide werden jetzt zusammengeführt (`.codebeaconignore` gewinnt bei Konflikten); das Hinzufügen kann nur *mehr* ausschließen.
|
|
53
|
+
- **Keine maschinenabsoluten Pfade mehr in committeten Artefakten** — `source_file`-Werte an Edges/Links (der Großteil von `beacon.json`) und die `Source:`-Zeilen in Wiki-/Obsidian-Notizen behielten absolute `/Users/du/...`-Pfade, sodass der committete Index nicht portabel war und lokale Pfade preisgab. Alle sind jetzt projekt-relativ (inklusive Edges und projektübergreifender `shares_db_entity`-Dateien).
|
|
54
|
+
- **Gleichnamige Symbole in unterschiedlichen Verzeichnissen überschreiben sich nicht mehr** — Wiki-/Obsidian-Dateinamen wurden ohne Groß-/Kleinschreibungs-Faltung aus dem Label abgeleitet, sodass unter macOS/Windows `UserService` und `userService` kollidierten und eine Notiz still verloren ging. Dateinamen sind jetzt kollisions-gesalzen und case-gefaltet; Labels aus reiner Interpunktion (`@`) fallen auf `unnamed` zurück statt auf ein kaputtes `@.md`.
|
|
55
|
+
- **Ein beschädigtes `beacon.json` stürzt nicht mehr ab** — `codebeacon affected`, der MCP-Server und `--wiki-only`-Läufe sichern jetzt einen beschädigten/abgeschnittenen Graphen und melden eine klare „Scan erneut ausführen"-Meldung statt eines rohen Tracebacks.
|
|
56
|
+
- **Mehr React-Komponenten werden erfasst** — `react.scm` übersah Function-Expression-Komponenten (`const X = function() {…}`), bare-importierte HOCs (`const X = forwardRef(…)` ohne `React.`-Präfix) und nicht exportierte `function X()`-Komponenten. Alle drei werden jetzt extrahiert.
|
|
57
|
+
- **Wiki-Links laufen nie ins Leere** — ein Link auf eine nie geschriebene Seite wird zu reinem Text herabgestuft, und ein Link auf einen Artikel in einem Nachbar-Bucket (ein Service → seine Entity) wird auf den korrekten relativen Pfad repariert, statt auf eine fehlende Datei zu zeigen.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
30
61
|
## Neu in 0.6.7
|
|
31
62
|
|
|
32
63
|
Folgearbeiten zum graphify-Parity-Audit aus 0.6.6: Grammar-Drift schlägt jetzt laut fehl statt stillschweigend, und Negationen in der Ignore-Datei verlangsamen Scans nicht mehr.
|
|
@@ -27,6 +27,37 @@
|
|
|
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
|
+
|
|
47
|
+
## Novedades en 0.6.8
|
|
48
|
+
|
|
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.
|
|
50
|
+
|
|
51
|
+
- **`--obsidian-dir` ya no puede borrar tus notas** — apuntando a un vault de Obsidian existente, la exportación barría *todos* los `.md` debajo antes de regenerar, pudiendo vaciar un vault real. codebeacon ahora rechaza cualquier directorio que no posea (solo se adopta un directorio genuinamente vacío, o uno que lleve su marcador `.codebeacon-vault.json`) y omite la exportación con un mensaje claro en vez de borrar.
|
|
52
|
+
- **`.gitignore` ya no queda deshabilitado en silencio por `.codebeaconignore`** — añadir un `.codebeaconignore` solía *reemplazar* el `.gitignore` del repo, así que un archivo excluido solo por `.gitignore` (un `prod-dump.sql`, `customer-data.*` de nombre neutro) podía terminar indexado en los artefactos `.codebeacon/` que se commitean. Ahora ambos se fusionan (`.codebeaconignore` gana en conflicto); añadirlo solo puede excluir *más*.
|
|
53
|
+
- **Sin rutas absolutas de máquina en los artefactos commiteados** — los valores `source_file` de edges/links (el grueso de `beacon.json`) y las líneas `Source:` en las notas de wiki/obsidian conservaban rutas absolutas `/Users/tu/...`, así que el índice commiteado no era portable y filtraba rutas locales. Ahora todas son relativas al proyecto (edges incluidos, y también los archivos `shares_db_entity` entre proyectos).
|
|
54
|
+
- **Símbolos con el mismo nombre en directorios distintos ya no se sobrescriben las notas** — los nombres de archivo de wiki/obsidian se derivaban de la etiqueta sin normalizar mayúsculas/minúsculas, así que en macOS/Windows `UserService` y `userService` colisionaban y una nota se perdía en silencio. Ahora los nombres de archivo llevan sal anti-colisión y normalización de mayúsculas; las etiquetas solo de puntuación (`@`) recurren a `unnamed` en vez de un `@.md` roto.
|
|
55
|
+
- **Un `beacon.json` corrupto ya no provoca un cuelgue** — `codebeacon affected`, el servidor MCP y las ejecuciones `--wiki-only` ahora respaldan un grafo corrupto/truncado y muestran un mensaje claro de "vuelve a ejecutar scan" en vez de un traceback en crudo.
|
|
56
|
+
- **Se capturan más componentes de React** — `react.scm` pasaba por alto los componentes de expresión de función (`const X = function() {…}`), los HOC importados sin calificar (`const X = forwardRef(…)` sin el prefijo `React.`) y los componentes `function X()` no exportados. Los tres se extraen ahora.
|
|
57
|
+
- **Los enlaces del wiki nunca quedan rotos** — un enlace a una página que nunca se escribió se degrada a texto plano, y un enlace a un artículo en un bucket hermano (un servicio → su entidad) se repara a la ruta relativa correcta en vez de apuntar a un archivo inexistente.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
30
61
|
## Novedades en 0.6.7
|
|
31
62
|
|
|
32
63
|
Seguimiento de la auditoría de paridad con graphify de 0.6.6: la deriva de gramática ahora falla de forma ruidosa en lugar de silenciosa, y las negaciones en el archivo de ignore ya no ralentizan los escaneos.
|
|
@@ -27,6 +27,37 @@
|
|
|
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
|
+
|
|
47
|
+
## Nouveautés en 0.6.8
|
|
48
|
+
|
|
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é.
|
|
50
|
+
|
|
51
|
+
- **`--obsidian-dir` ne peut plus supprimer vos notes** — pointé vers un vault Obsidian existant, l'export balayait *tous* les `.md` en dessous avant de régénérer, pouvant ainsi vider un vrai vault. codebeacon refuse désormais tout répertoire qu'il ne possède pas (seul un répertoire réellement vide, ou portant son marqueur `.codebeacon-vault.json`, est adopté) et saute l'export avec un message clair au lieu de supprimer.
|
|
52
|
+
- **`.gitignore` n'est plus désactivé silencieusement par `.codebeaconignore`** — ajouter un `.codebeaconignore` *remplaçait* auparavant le `.gitignore` du dépôt, si bien qu'un fichier exclu uniquement par `.gitignore` (un `prod-dump.sql`, `customer-data.*` au nom neutre) pouvait être indexé dans les artefacts `.codebeacon/` commités. Les deux sont désormais fusionnés (`.codebeaconignore` l'emporte en cas de conflit) ; l'ajouter ne peut que exclure *davantage*.
|
|
53
|
+
- **Plus aucun chemin absolu machine dans les artefacts commités** — les valeurs `source_file` des edges/links (l'essentiel de `beacon.json`) et les lignes `Source:` des notes wiki/obsidian conservaient des chemins absolus `/Users/vous/...`, rendant l'index commité non portable et divulguant des chemins locaux. Tout est désormais relatif au projet (edges compris, ainsi que les fichiers `shares_db_entity` inter-projets).
|
|
54
|
+
- **Des symboles homonymes dans des répertoires différents n'écrasent plus les notes l'un de l'autre** — les noms de fichiers wiki/obsidian étaient dérivés du label sans normalisation de casse, si bien que sur macOS/Windows `UserService` et `userService` entraient en collision et une note disparaissait silencieusement. Les noms de fichiers sont désormais salés anti-collision et normalisés en casse ; les labels tout en ponctuation (`@`) retombent sur `unnamed` au lieu d'un `@.md` cassé.
|
|
55
|
+
- **Un `beacon.json` corrompu ne plante plus** — `codebeacon affected`, le serveur MCP et les exécutions `--wiki-only` sauvegardent désormais un graphe corrompu/tronqué et affichent un message clair « relancez scan » au lieu d'une trace brute.
|
|
56
|
+
- **Davantage de composants React sont capturés** — `react.scm` manquait les composants en expression de fonction (`const X = function() {…}`), les HOC importés nus (`const X = forwardRef(…)` sans préfixe `React.`) et les composants `function X()` non exportés. Les trois sont désormais extraits.
|
|
57
|
+
- **Les liens du wiki ne pointent plus jamais dans le vide** — un lien vers une page jamais écrite est rétrogradé en texte brut, et un lien vers un article dans un bucket voisin (un service → son entité) est réparé vers le bon chemin relatif au lieu de pointer vers un fichier manquant.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
30
61
|
## Nouveautés en 0.6.7
|
|
31
62
|
|
|
32
63
|
Suite de l'audit de parité graphify de 0.6.6 : la dérive de grammaire échoue désormais bruyamment au lieu de silencieusement, et les négations du fichier d'ignore ne ralentissent plus les scans.
|
|
@@ -27,6 +27,37 @@
|
|
|
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
|
+
|
|
47
|
+
## 0.6.8 の新機能
|
|
48
|
+
|
|
49
|
+
アップストリーム v0.8.41–v0.9.3(報告された issue は #1568 まで)の graphify パリティ監査です。各候補は修正前に codebeacon 上で実際に再現し、敵対的レビューパスで再確認しました。**実バグ7件**を確認、データ損失トラップとプライバシー漏洩が目玉です。
|
|
50
|
+
|
|
51
|
+
- **`--obsidian-dir` がノートを削除しなくなりました** — 既存の Obsidian vault を指定すると、再生成前にその配下の*すべて*の `.md` を一掃していたため、実際の vault を空にしてしまう可能性がありました。codebeacon は所有していないディレクトリを拒否するようになり(完全に空のディレクトリ、または `.codebeacon-vault.json` マーカーを持つディレクトリのみ採用)、削除する代わりに明確なメッセージとともにエクスポートをスキップします。
|
|
52
|
+
- **`.codebeaconignore` によって `.gitignore` が静かに無効化されなくなりました** — `.codebeaconignore` を追加すると以前はリポジトリの `.gitignore` を*置き換えて*いたため、`.gitignore` だけで除外されているファイル(中立的な名前の `prod-dump.sql`、`customer-data.*`)がコミットされる `.codebeacon/` 成果物にインデックスされる可能性がありました。両者は今やマージされます(競合時は `.codebeaconignore` が優先);追加しても除外が*増える*だけになりました。
|
|
53
|
+
- **コミットされる成果物にマシン絶対パスが含まれなくなりました** — エッジ/リンクの `source_file` 値(`beacon.json` の大半)と wiki/obsidian ノートの `Source:` 行が絶対パス `/Users/you/...` を保持していたため、コミットされたインデックスに可搬性がなく、ローカルパスが漏洩していました。すべてプロジェクト相対になりました(エッジ、およびプロジェクト横断の `shares_db_entity` ファイルも含む)。
|
|
54
|
+
- **異なるディレクトリの同名シンボルがノートを上書きしなくなりました** — wiki/obsidian のファイル名は大文字小文字を畳み込まずにラベルから生成されていたため、macOS/Windows で `UserService` と `userService` が衝突し、片方のノートが静かに失われていました。ファイル名は衝突耐性のソルトと大文字小文字の畳み込みを行うようになり、記号のみのラベル(`@`)は壊れた `@.md` の代わりに `unnamed` にフォールバックします。
|
|
55
|
+
- **破損した `beacon.json` でクラッシュしなくなりました** — `codebeacon affected`、MCP サーバー、`--wiki-only` 実行は、破損/切り詰められたグラフをバックアップし、生のトレースバックの代わりに明確な「scan を再実行してください」メッセージを報告するようになりました。
|
|
56
|
+
- **より多くの React コンポーネントを捕捉するようになりました** — `react.scm` は関数式コンポーネント(`const X = function() {…}`)、`React.` プレフィックスなしの bare import HOC(`const X = forwardRef(…)`)、および非エクスポートの `function X()` コンポーネントを見落としていました。この3つすべてが抽出されるようになりました。
|
|
57
|
+
- **wiki のリンクがリンク切れにならなくなりました** — 一度も書き込まれなかったページへのリンクはプレーンテキストに格下げされ、隣接バケット内の記事(サービス→そのエンティティ)へのリンクは、存在しないファイルを指す代わりに正しい相対パスに修復されます。
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
30
61
|
## 0.6.7 の新機能
|
|
31
62
|
|
|
32
63
|
0.6.6 の graphify パリティ監査のフォローアップ: grammar ドリフトが静かに埋もれず明示的に失敗するようになり、ignore ファイルの否定ルールがスキャンを遅くしなくなりました。
|
|
@@ -27,6 +27,37 @@
|
|
|
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
|
+
|
|
47
|
+
## 0.6.8 새 소식
|
|
48
|
+
|
|
49
|
+
업스트림 v0.8.41–v0.9.3(보고된 이슈 #1568까지)에 대한 graphify-패리티 감사입니다. 모든 후보를 수정 전에 codebeacon에서 실제로 재현하고 적대적 리뷰 패스로 재검증했으며, **7개의 실제 버그**를 확인했습니다 — 데이터 손실 함정과 프라이버시 유출이 핵심입니다.
|
|
50
|
+
|
|
51
|
+
- **`--obsidian-dir`가 더 이상 사용자 노트를 삭제하지 않음** — 기존 Obsidian 볼트를 가리키면 재생성 전에 그 아래 *모든* `.md`를 지워서 실제 볼트를 통째로 날릴 수 있었습니다. 이제 codebeacon이 소유하지 않은 디렉터리는 거부하고(완전히 비어 있거나 `.codebeacon-vault.json` 마커를 가진 디렉터리만 채택), 삭제 대신 명확한 메시지와 함께 내보내기를 건너뜁니다.
|
|
52
|
+
- **`.codebeaconignore`가 `.gitignore`를 조용히 무력화하지 않음** — `.codebeaconignore`를 추가하면 저장소의 `.gitignore`를 *대체*해서, `.gitignore`로만 제외된 파일(중립적 이름의 `prod-dump.sql`, `customer-data.*`)이 커밋되는 `.codebeacon/` 산출물에 인덱싱될 수 있었습니다. 이제 둘을 병합하며(충돌 시 `.codebeaconignore` 우선), 추가해도 *더 많이* 제외할 수만 있습니다.
|
|
53
|
+
- **커밋되는 산출물에 머신 절대 경로 없음** — 엣지/링크의 `source_file`(`beacon.json`의 대부분)과 wiki/obsidian 노트의 `Source:` 줄이 절대 경로 `/Users/you/...`를 유지해서 인덱스가 이식성이 없고 로컬 경로가 유출됐습니다. 이제 모두 프로젝트 상대 경로입니다(엣지 포함, 교차 프로젝트 `shares_db_entity` 파일도).
|
|
54
|
+
- **다른 디렉터리의 동일 이름 심볼이 서로의 노트를 덮어쓰지 않음** — wiki/obsidian 파일명이 대소문자 구분 없이 라벨에서 생성돼, macOS/Windows에서 `UserService`와 `userService`가 충돌해 한쪽 노트가 조용히 사라졌습니다. 이제 파일명이 충돌-솔팅 + 대소문자 폴딩되며, 구두점만 있는 라벨(`@`)은 깨진 `@.md` 대신 `unnamed`로 대체됩니다.
|
|
55
|
+
- **손상된 `beacon.json`이 더 이상 크래시를 내지 않음** — `codebeacon affected`, MCP 서버, `--wiki-only` 실행이 이제 손상/절단된 그래프를 백업하고 원시 트레이스백 대신 명확한 "scan 재실행" 메시지를 보여줍니다.
|
|
56
|
+
- **더 많은 React 컴포넌트 캡처** — `react.scm`이 함수식 컴포넌트(`const X = function() {…}`), bare-import HOC(`React.` 접두 없는 `const X = forwardRef(…)`), 비-export `function X()` 컴포넌트를 놓쳤습니다. 이제 셋 다 추출됩니다.
|
|
57
|
+
- **wiki 링크가 깨지지 않음** — 작성되지 않은 페이지로의 링크는 일반 텍스트로 강등되고, 형제 버킷의 문서로 가는 링크(서비스 → 엔티티)는 없는 파일을 가리키는 대신 올바른 상대 경로로 복구됩니다.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
30
61
|
## 0.6.7 새 소식
|
|
31
62
|
|
|
32
63
|
0.6.6 graphify-패리티 감사의 후속 작업: grammar 드리프트가 이제 조용히 묻히지 않고 명시적으로 실패하며, ignore 파일의 부정 규칙이 더 이상 스캔을 느리게 하지 않습니다.
|
|
@@ -25,6 +25,37 @@
|
|
|
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
|
+
|
|
45
|
+
## What's new in 0.6.8
|
|
46
|
+
|
|
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.
|
|
48
|
+
|
|
49
|
+
- **`--obsidian-dir` can no longer delete your notes** — pointed at an existing Obsidian vault, the export swept *every* `.md` under it before regenerating, so it could wipe a real vault. codebeacon now refuses any directory it doesn't own (only a genuinely empty dir, or one carrying its `.codebeacon-vault.json` marker, is adopted) and skips the export with a clear message instead of deleting.
|
|
50
|
+
- **`.gitignore` is no longer silently disabled by `.codebeaconignore`** — adding a `.codebeaconignore` used to *replace* the repo's `.gitignore`, so a file excluded only by `.gitignore` (a neutrally-named `prod-dump.sql`, `customer-data.*`) would get indexed into the committed `.codebeacon/` artifacts. The two are now merged (`.codebeaconignore` wins on conflict); adding it can only ever exclude *more*.
|
|
51
|
+
- **No machine-absolute paths in committed artifacts** — edge/link `source_file` values (the bulk of `beacon.json`) and the `Source:` lines in wiki/obsidian notes kept absolute `/Users/you/...` paths, so the committed index wasn't portable and leaked local paths. All are now project-relative (edges included, and cross-project `shares_db_entity` files too).
|
|
52
|
+
- **Same-named symbols in different directories no longer overwrite each other's notes** — wiki/obsidian filenames were derived from the label with no case-folding, so on macOS/Windows `UserService` and `userService` collided and one note was silently lost. Filenames are now collision-salted and case-folded; punctuation-only labels (`@`) fall back to `unnamed` instead of a broken `@.md`.
|
|
53
|
+
- **A corrupt `beacon.json` no longer crashes** — `codebeacon affected`, the MCP server, and `--wiki-only` runs now back up a corrupt/truncated graph and report a clear "re-run scan" message instead of a raw traceback.
|
|
54
|
+
- **More React components are captured** — `react.scm` missed function-expression components (`const X = function() {…}`), bare-imported HOCs (`const X = forwardRef(…)` without the `React.` prefix), and non-exported `function X()` components. All three are now extracted.
|
|
55
|
+
- **Wiki links never dangle** — a link to a page that was never written is downgraded to plain text, and a link to an article in a sibling bucket (a service → its entity) is repaired to the correct relative path instead of pointing at a missing file.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
28
59
|
## What's new in 0.6.7
|
|
29
60
|
|
|
30
61
|
Follow-ups to the 0.6.6 graphify-parity audit: grammar drift now fails loudly instead of silently, and ignore-file negations no longer slow scans down.
|
|
@@ -27,6 +27,37 @@
|
|
|
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
|
+
|
|
47
|
+
## Novidades na 0.6.8
|
|
48
|
+
|
|
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.
|
|
50
|
+
|
|
51
|
+
- **`--obsidian-dir` não consegue mais apagar suas notas** — apontado para um vault do Obsidian existente, a exportação varria *todo* `.md` abaixo dele antes de regenerar, podendo esvaziar um vault real. O codebeacon agora recusa qualquer diretório que não possua (só um diretório genuinamente vazio, ou um com o marcador `.codebeacon-vault.json`, é adotado) e pula a exportação com uma mensagem clara em vez de apagar.
|
|
52
|
+
- **`.gitignore` não é mais desativado silenciosamente pelo `.codebeaconignore`** — adicionar um `.codebeaconignore` costumava *substituir* o `.gitignore` do repositório, então um arquivo excluído só pelo `.gitignore` (um `prod-dump.sql`, `customer-data.*` de nome neutro) podia acabar indexado nos artefatos `.codebeacon/` commitados. Agora os dois são mesclados (`.codebeaconignore` vence em conflito); adicioná-lo só pode excluir *mais*.
|
|
53
|
+
- **Nenhum caminho absoluto de máquina nos artefatos commitados** — os valores `source_file` de edges/links (a maior parte do `beacon.json`) e as linhas `Source:` nas notas de wiki/obsidian mantinham caminhos absolutos `/Users/voce/...`, então o índice commitado não era portátil e vazava caminhos locais. Agora todos são relativos ao projeto (edges incluídos, e também os arquivos `shares_db_entity` entre projetos).
|
|
54
|
+
- **Símbolos com o mesmo nome em diretórios diferentes não sobrescrevem mais as notas um do outro** — os nomes de arquivo de wiki/obsidian eram derivados do label sem normalização de maiúsculas/minúsculas, então no macOS/Windows `UserService` e `userService` colidiam e uma nota era silenciosamente perdida. Os nomes de arquivo agora recebem sal anticolisão e normalização de caixa; labels só com pontuação (`@`) caem para `unnamed` em vez de um `@.md` quebrado.
|
|
55
|
+
- **Um `beacon.json` corrompido não trava mais** — `codebeacon affected`, o servidor MCP e execuções `--wiki-only` agora fazem backup de um grafo corrompido/truncado e mostram uma mensagem clara de "execute o scan novamente" em vez de um traceback bruto.
|
|
56
|
+
- **Mais componentes React são capturados** — `react.scm` deixava passar componentes de expressão de função (`const X = function() {…}`), HOCs importados sem qualificação (`const X = forwardRef(…)` sem o prefixo `React.`) e componentes `function X()` não exportados. Os três agora são extraídos.
|
|
57
|
+
- **Links do wiki nunca ficam quebrados** — um link para uma página que nunca foi escrita é rebaixado a texto simples, e um link para um artigo em um bucket irmão (um serviço → sua entidade) é reparado para o caminho relativo correto em vez de apontar para um arquivo inexistente.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
30
61
|
## Novidades na 0.6.7
|
|
31
62
|
|
|
32
63
|
Acompanhamento da auditoria de paridade com graphify da 0.6.6: a deriva de gramática agora falha de forma ruidosa em vez de silenciosa, e as negações no arquivo de ignore não deixam mais os scans lentos.
|
|
@@ -27,6 +27,37 @@
|
|
|
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
|
+
|
|
47
|
+
## 0.6.8 新功能
|
|
48
|
+
|
|
49
|
+
对上游 v0.8.41–v0.9.3 的 graphify 对齐审计(涵盖已报告的 issue,直到 #1568)。每个候选项在修复前都在 codebeacon 上实际复现,并通过对抗式复核再次确认;确认了 **7 个真实 bug**,以一个数据丢失陷阱和一个隐私泄露为首。
|
|
50
|
+
|
|
51
|
+
- **`--obsidian-dir` 不会再删除你的笔记** — 指向一个已有的 Obsidian vault 时,导出会在重新生成前清空其下*所有* `.md` 文件,可能把一个真实的 vault 清空。codebeacon 现在会拒绝任何它不拥有的目录(只有真正为空的目录,或带有 `.codebeacon-vault.json` 标记的目录才会被采用),并以清晰的提示跳过导出,而不是删除。
|
|
52
|
+
- **`.codebeaconignore` 不会再悄悄禁用 `.gitignore`** — 添加 `.codebeaconignore` 以前会*替换*仓库的 `.gitignore`,导致仅被 `.gitignore` 排除的文件(名称中立的 `prod-dump.sql`、`customer-data.*`)可能被索引进提交的 `.codebeacon/` 产物中。现在两者会合并(冲突时 `.codebeaconignore` 优先);添加它只会排除*更多*内容。
|
|
53
|
+
- **提交的产物中不再有本机绝对路径** — 边/链接的 `source_file` 值(`beacon.json` 的绝大部分)以及 wiki/obsidian 笔记中的 `Source:` 行此前保留绝对路径 `/Users/you/...`,导致提交的索引不可移植且泄露本地路径。现在全部改为项目相对路径(包括边,以及跨项目的 `shares_db_entity` 文件)。
|
|
54
|
+
- **不同目录下的同名符号不再互相覆盖笔记** — wiki/obsidian 的文件名此前直接由标签生成、不做大小写折叠,导致在 macOS/Windows 上 `UserService` 与 `userService` 冲突,一个笔记被静默丢失。文件名现在会做防冲突加盐和大小写折叠;仅由标点组成的标签(`@`)会回退为 `unnamed`,而不是生成损坏的 `@.md`。
|
|
55
|
+
- **损坏的 `beacon.json` 不再导致崩溃** — `codebeacon affected`、MCP 服务器以及 `--wiki-only` 运行现在会备份损坏/截断的图,并给出清晰的"请重新运行 scan"提示,而不是抛出原始堆栈跟踪。
|
|
56
|
+
- **捕获更多 React 组件** — `react.scm` 此前遗漏了函数表达式组件(`const X = function() {…}`)、未加 `React.` 前缀直接导入的 HOC(`const X = forwardRef(…)`),以及未导出的 `function X()` 组件。现在这三种都能被提取。
|
|
57
|
+
- **wiki 链接不再指向空页面** — 指向从未写入的页面的链接会降级为纯文本,指向相邻分类目录中文章的链接(例如 service → 其 entity)会被修复为正确的相对路径,而不是指向一个不存在的文件。
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
30
61
|
## 0.6.7 新功能
|
|
31
62
|
|
|
32
63
|
对 0.6.6 graphify 对齐审计的后续:grammar 漂移现在会明确报错而非静默掩盖,ignore 文件中的否定规则也不再拖慢扫描。
|
|
@@ -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
|
|