codebeacon 0.3.3__tar.gz → 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codebeacon-0.3.3 → codebeacon-0.5.0}/PKG-INFO +37 -21
- {codebeacon-0.3.3 → codebeacon-0.5.0}/README.de.md +27 -17
- {codebeacon-0.3.3 → codebeacon-0.5.0}/README.es.md +27 -17
- {codebeacon-0.3.3 → codebeacon-0.5.0}/README.fr.md +27 -17
- {codebeacon-0.3.3 → codebeacon-0.5.0}/README.ja.md +26 -18
- {codebeacon-0.3.3 → codebeacon-0.5.0}/README.ko.md +35 -21
- {codebeacon-0.3.3 → codebeacon-0.5.0}/README.md +36 -20
- {codebeacon-0.3.3 → codebeacon-0.5.0}/README.pt-BR.md +27 -17
- {codebeacon-0.3.3 → codebeacon-0.5.0}/README.zh-CN.md +24 -18
- codebeacon-0.5.0/codebeacon/__init__.py +1 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/cli.py +93 -7
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/discover/scanner.py +53 -0
- codebeacon-0.5.0/codebeacon/knowledge/__init__.py +16 -0
- codebeacon-0.5.0/codebeacon/knowledge/generator.py +513 -0
- codebeacon-0.5.0/codebeacon/semantic_pipeline.py +913 -0
- codebeacon-0.5.0/codebeacon/skill/SKILL.md +313 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/pyproject.toml +1 -1
- codebeacon-0.5.0/tests/test_cli_dispatch.py +43 -0
- codebeacon-0.5.0/tests/test_knowledge.py +163 -0
- codebeacon-0.5.0/tests/test_scanner_sensitive.py +79 -0
- codebeacon-0.5.0/tests/test_semantic.py +191 -0
- codebeacon-0.5.0/tests/test_semantic_hardening.py +117 -0
- codebeacon-0.3.3/codebeacon/__init__.py +0 -1
- codebeacon-0.3.3/codebeacon/semantic_pipeline.py +0 -457
- codebeacon-0.3.3/codebeacon/skill/SKILL.md +0 -190
- {codebeacon-0.3.3 → codebeacon-0.5.0}/.cursorrules +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/.github/CODEOWNERS +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/.github/dependabot.yml +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/.github/workflows/ci.yml +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/.github/workflows/release.yml +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/.gitignore +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/AGENTS.md +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/CLAUDE.md +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/LICENSE +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/__main__.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/cache.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/common/__init__.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/common/filters.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/common/safety.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/common/symbols.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/common/types.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/config.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/contextmap/__init__.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/contextmap/generator.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/discover/__init__.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/discover/detector.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/discover/ignore.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/__init__.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/callflow_html.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/hooks.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/mcp.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/merge.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/obsidian.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/tree_html.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/__init__.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/base.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/components.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/dependencies.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/entities.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/README.md +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/actix.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/angular.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/aspnet.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/django.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/express.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/fastapi.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/flask.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/gin.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/ktor.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/laravel.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/nestjs.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/rails.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/react.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/spring_boot.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/svelte.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/tauri.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/vapor.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/vue.scm +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/routes.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/semantic.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/services.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/__init__.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/analyze.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/build.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/cluster.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/enrich.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/write.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/plugins/__init__.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/plugins/githooks.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/plugins/skills.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/wave.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/wiki/__init__.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/wiki/generator.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/wiki/index.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/wiki/templates.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon.yaml.example +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/docs/TRANSLATION_STATUS.md +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/public-plan.md +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/skill/install.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/__init__.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/conftest.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/actix/main.rs +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/angular/app.component.ts +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/aspnet/UserController.cs +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/django/views.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/express/userRouter.js +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/fastapi/main.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/flask/app.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/gin/main.go +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/ktor/UserRoutes.kt +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/laravel/UserController.php +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/nestjs/user.controller.ts +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/rails/users_controller.rb +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/react/UserPage.tsx +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/spring_boot/UserController.java +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/sveltekit/+page.svelte +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/vapor/routes.swift +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/vue/UserList.vue +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_discover.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_entities.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_filters.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_graph.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_plugins.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_resolve.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_routes.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_safety_and_writes.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_services.py +0 -0
- {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_wiki.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codebeacon
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
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
|
|
@@ -97,6 +97,11 @@ Existing tools solve this partially. Route analyzers map your controllers but mi
|
|
|
97
97
|
- **Zero configuration** — auto-detects frameworks and languages; generates `codebeacon.yaml` for repeat runs
|
|
98
98
|
- **Deep-dive mode** — `--deep-dive` generates per-project `.codebeacon/` + `CLAUDE.md` for every sub-project; running `codebeacon scan . --update` from any sub-project folder automatically syncs all projects in the workspace
|
|
99
99
|
- **Workspace auto-rediscovery** — on every `scan` / `sync`, codebeacon re-scans the workspace and appends any new project folders to `codebeacon.yaml` before extraction, so freshly added sub-projects are never silently skipped; pass `--no-rediscover` to opt out for hand-curated configs
|
|
100
|
+
- **Graphify-style semantic enrichment** — after AST extraction, the skill dispatches one parallel subagent per chunk to emit `{nodes, edges, hyperedges}` with 8 relation types (`calls`/`implements`/`references`/`cites`/`conceptually_related_to`/`shares_data_with`/`semantically_similar_to`/`rationale_for`) and EXTRACTED/INFERRED/AMBIGUOUS confidence; on Claude Code the subagent runs one tier below the host model (Opus→Sonnet, Sonnet→Haiku) so spend stays proportional to corpus size. AST owns code nodes; LLM only contributes `concept`/`document`/`paper` nodes. Existing 0.3.x archives replay through the new schema unchanged.
|
|
101
|
+
- **Knowledge mode (`codebeacon knowledge`)** — scan markdown notes (ADRs, meeting notes, retros, specs, research) and produce a single `KNOWLEDGE.md` next to `.codebeacon/`. Auto-classifies by filename and heading patterns, parses Obsidian YAML frontmatter and `[[backlinks]]`, surfaces a top-level "Key Decisions" + "Open Questions" rollup so an agent learns *why* the codebase looks the way it does. Pure heuristics — no LLM call.
|
|
102
|
+
- **Bare-path shortcut** — `codebeacon ./src` is now equivalent to `codebeacon scan ./src`; when the first argument isn't a registered subcommand, `scan` is auto-injected, so muscle memory from `graphify <path>` / `codesight <path>` works here too.
|
|
103
|
+
- **Hardened semantic pipeline** — `semantic-apply` guards against malformed agent JSONL (null/list/code-fence lines, missing fields), coerces broken `confidence_score` values (None/NaN/string/out-of-range) to a safe default, snapshots `beacon.json` → `beacon.json.bak` before merging so the AST baseline is always recoverable, and regenerates `beacon.html` + `callflow.html` so visual exports reflect the newly-inferred edges.
|
|
104
|
+
- **Sensitive file/dir guard** — `secrets/`, `credentials/`, `.ssh/`, `.aws/`, `.gnupg/` directories are always skipped; filenames matching credential patterns (`api_token`, `oauth_token`, `private_key`, `client_secret`; underscore *and* hyphen variants) are excluded from the source-file collector before they reach extractors.
|
|
100
105
|
|
|
101
106
|
---
|
|
102
107
|
|
|
@@ -185,11 +190,14 @@ project-root/
|
|
|
185
190
|
components/<Name>.md
|
|
186
191
|
obsidian/ ← Obsidian vault (one note per graph node)
|
|
187
192
|
semantic/
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
+
pending/ ← prepare writes chunk_NNN.jsonl here (≤ --chunk-size tasks each)
|
|
194
|
+
chunk_001.jsonl
|
|
195
|
+
chunk_002.jsonl
|
|
196
|
+
results/ ← agent writes a matching chunk_NNN.jsonl per pending file
|
|
197
|
+
chunk_001.jsonl
|
|
198
|
+
original/ ← apply moves done chunks here (durable archive)
|
|
199
|
+
chunk_001.jsonl
|
|
200
|
+
chunk_002.jsonl ← (older runs accumulate; chunk numbers are monotonic)
|
|
193
201
|
```
|
|
194
202
|
|
|
195
203
|
### Deep Dive Mode
|
|
@@ -356,14 +364,21 @@ codebeacon sync --config <file> # use a specific config file
|
|
|
356
364
|
codebeacon sync --no-rediscover # don't auto-append newly added projects (hand-curated yaml mode)
|
|
357
365
|
|
|
358
366
|
# AI-semantic enrichment (the agent does the LLM work, codebeacon does the bookkeeping)
|
|
359
|
-
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N]
|
|
360
|
-
# rehydrate
|
|
361
|
-
#
|
|
362
|
-
#
|
|
367
|
+
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N] [--chunk-size N]
|
|
368
|
+
# rehydrate archive (.codebeacon/semantic/original/*.jsonl) onto
|
|
369
|
+
# the fresh graph, prune entries pointing at missing nodes,
|
|
370
|
+
# then emit every NEW candidate (god folders + hub files +
|
|
371
|
+
# unresolved targets) into .codebeacon/semantic/pending/
|
|
372
|
+
# chunk_NNN.jsonl (--chunk-size tasks per file, default 10).
|
|
373
|
+
# `--max-tasks` is an optional cap (0 = no cap = emit all).
|
|
374
|
+
# task_id includes a content hash, so a file whose semantic
|
|
375
|
+
# content changes between scans is automatically re-emitted.
|
|
363
376
|
codebeacon semantic-apply [--dir .codebeacon]
|
|
364
|
-
#
|
|
365
|
-
#
|
|
366
|
-
#
|
|
377
|
+
# for each .codebeacon/semantic/results/chunk_NNN.jsonl the
|
|
378
|
+
# agent has written, merge edges (INFERRED references) into
|
|
379
|
+
# beacon.json and MOVE the pending chunk into
|
|
380
|
+
# .codebeacon/semantic/original/chunk_NNN.jsonl (durable
|
|
381
|
+
# archive). Regenerates wiki/obsidian/context map.
|
|
367
382
|
|
|
368
383
|
# Query the knowledge graph
|
|
369
384
|
codebeacon query <term> [--dir .codebeacon] [--limit N] # search nodes by label substring
|
|
@@ -398,22 +413,23 @@ The CLI itself never makes an LLM API call. The AI-semantic layer is intentional
|
|
|
398
413
|
When you invoke `/codebeacon` in Claude Code:
|
|
399
414
|
|
|
400
415
|
1. `scan` / `sync` builds `beacon.json` from the AST (no LLM).
|
|
401
|
-
2. `codebeacon semantic-prepare`
|
|
402
|
-
3. The skill
|
|
403
|
-
4. `codebeacon semantic-apply` merges the results as `INFERRED references` edges into `beacon.json
|
|
404
|
-
5. Next scan: `semantic-prepare`
|
|
416
|
+
2. `codebeacon semantic-prepare` rehydrates the archive at `.codebeacon/semantic/original/*.jsonl` onto the fresh graph, **prunes** archive entries whose source node no longer exists, and writes new task chunks to `.codebeacon/semantic/pending/chunk_NNN.jsonl` (≤ `--chunk-size` tasks per file, default 10). Chunk numbers continue from where the durable archive left off, so they never collide.
|
|
417
|
+
3. The skill iterates the pending chunks **one chunk at a time**. For each `pending/chunk_NNN.jsonl`, the agent (using its current model) reads each task's `excerpt` and writes a matching `semantic/results/chunk_NNN.jsonl`.
|
|
418
|
+
4. `codebeacon semantic-apply` merges the results as `INFERRED references` edges into `beacon.json` and **moves** each finished `pending/chunk_NNN.jsonl` into `semantic/original/chunk_NNN.jsonl` (with the applied edges spliced in for auditability). Result files are deleted; wiki + obsidian + context map regenerated.
|
|
419
|
+
5. Next scan: `semantic-prepare` reads every chunk under `original/`, applies their edges to the freshly built graph (so historical inferences don't disappear), and skips any task whose `task_id` is already on file. `task_id` is `SHA1(file_path | node_id | excerpt_hash[:8])` — a file whose semantic content changes earns a new id and gets re-analysed automatically.
|
|
405
420
|
|
|
406
|
-
This gives you incremental, idempotent enrichment: the agent never re-
|
|
421
|
+
This gives you incremental, idempotent enrichment: the agent never re-analyses the same `(file, content)` twice, accumulated AI signal survives every rescan, and chunked files keep the agent's working set small.
|
|
407
422
|
|
|
408
423
|
### Direct CLI usage
|
|
409
424
|
|
|
410
|
-
If you're not running through the skill (e.g. CI), you can drive the same two commands manually and supply your own `
|
|
425
|
+
If you're not running through the skill (e.g. CI), you can drive the same two commands manually and supply your own `results/chunk_NNN.jsonl` files:
|
|
411
426
|
|
|
412
427
|
```bash
|
|
413
428
|
codebeacon scan .
|
|
414
|
-
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50
|
|
429
|
+
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50 --chunk-size 10
|
|
415
430
|
|
|
416
|
-
#
|
|
431
|
+
# .codebeacon/semantic/pending/chunk_001.jsonl ... now exist.
|
|
432
|
+
# For each pending chunk, write a matching results/chunk_NNN.jsonl. Each line:
|
|
417
433
|
# {"task_id":"...", "source_node_id":"...", "edges":[
|
|
418
434
|
# {"target_name":"UserService","relation":"references","confidence_score":0.7}
|
|
419
435
|
# ]}
|
|
@@ -56,6 +56,11 @@ Bestehende Tools lösen dieses Problem nur teilweise. Route-Analyzer erfassen Ih
|
|
|
56
56
|
- **Keine Konfiguration notwendig** — erkennt Frameworks und Sprachen automatisch; generiert `codebeacon.yaml` für Folgeläufe
|
|
57
57
|
- **Deep-Dive-Modus** — `--deep-dive` erzeugt für jedes Sub-Projekt eigene `.codebeacon/` + `CLAUDE.md`; ein Update-Aufruf aus **beliebigem** Sub-Projekt-Ordner synchronisiert automatisch alle Projekte im Workspace
|
|
58
58
|
- **Automatische Workspace-Wiedererkennung** — bei jedem `scan`/`sync` scannt codebeacon den Workspace erneut und hängt vor der Extraktion automatisch neue Projekte an die `codebeacon.yaml` an, sodass frisch hinzugefügte Sub-Projekte nicht unbemerkt übersprungen werden; `--no-rediscover` deaktiviert dies für handgepflegte Konfigurationen
|
|
59
|
+
- **Graphify-artige Semantik-Anreicherung** — nach der AST-Extraktion dispatcht der Skill einen parallelen Subagenten pro Chunk, der vollständige Knowledge-Graph-Fragmente `{nodes, edges, hyperedges}` mit 8 Relationstypen (`calls`/`implements`/`references`/`cites`/`conceptually_related_to`/`shares_data_with`/`semantically_similar_to`/`rationale_for`) und Konfidenz EXTRACTED/INFERRED/AMBIGUOUS erzeugt; auf Claude Code läuft der Subagent eine Stufe unter dem Host-Modell (Opus→Sonnet, Sonnet→Haiku), damit die Kosten proportional zur Korpus-Größe bleiben. Code-Knoten gehören dem AST; das LLM darf nur `concept`/`document`/`paper`-Knoten beisteuern. Bestehende 0.3.x-Archive werden unter dem neuen Schema unverändert wiedergegeben
|
|
60
|
+
- **Wissensmodus (`codebeacon knowledge`)** — scannt Markdown-Notizen (ADRs, Meeting-Protokolle, Retros, Specs, Research) und erzeugt eine einzelne `KNOWLEDGE.md` neben `.codebeacon/`. Automatische Klassifizierung nach Dateinamen- und Überschriftenmustern, Parsing von Obsidian-YAML-Frontmatter und `[[backlinks]]`, sowie ein „Key Decisions" + „Open Questions"-Roll-up ganz oben, damit der Agent versteht, *warum* die Codebasis so aussieht, wie sie aussieht. Reine Heuristik — kein LLM-Aufruf
|
|
61
|
+
- **Pfad-Kurzform** — `codebeacon ./src` ist jetzt äquivalent zu `codebeacon scan ./src`; wenn das erste Argument kein registrierter Sub-Befehl ist, wird `scan` automatisch eingefügt — die `graphify <path>` / `codesight <path>` Muskelerinnerung funktioniert genauso
|
|
62
|
+
- **Gehärtete Semantik-Pipeline** — `semantic-apply` schützt vor fehlerhaftem Agent-JSONL (null/Listen/Code-Fence-Zeilen, fehlende Felder), coerced kaputte `confidence_score`-Werte (None/NaN/String/außerhalb des Bereichs) zu einem sicheren Default, snapshottet `beacon.json` → `beacon.json.bak` vor dem Merge, sodass die AST-Baseline jederzeit wiederherstellbar ist, und regeneriert `beacon.html` + `callflow.html`, damit die visuellen Exporte die neu inferierten Kanten reflektieren
|
|
63
|
+
- **Schutzschienen für sensible Dateien/Verzeichnisse** — `secrets/`, `credentials/`, `.ssh/`, `.aws/`, `.gnupg/` werden immer übersprungen; Dateinamen, die Credential-Mustern entsprechen (`api_token`, `oauth_token`, `private_key`, `client_secret`; Underscore- *und* Bindestrich-Varianten) werden vom Collector vor den Extraktoren ausgeschlossen
|
|
59
64
|
|
|
60
65
|
---
|
|
61
66
|
|
|
@@ -378,16 +383,19 @@ codebeacon hook install [path] # Merge-Driver + Post-Commit-Inkrement
|
|
|
378
383
|
codebeacon merge-driver <base> <cur> <other> # von git nach `hook install` aufgerufen; Union-Merge von beacon.json
|
|
379
384
|
|
|
380
385
|
# AI-semantische Anreicherung (LLM macht der Agent, codebeacon nur die Buchführung)
|
|
381
|
-
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N]
|
|
382
|
-
#
|
|
383
|
-
# beacon.json
|
|
384
|
-
#
|
|
386
|
+
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N] [--chunk-size N]
|
|
387
|
+
# rehydriert .codebeacon/semantic/original/*.jsonl auf das
|
|
388
|
+
# frische beacon.json + entfernt Einträge mit verschwundenen
|
|
389
|
+
# Knoten, schreibt dann neue Aufgaben nach
|
|
390
|
+
# .codebeacon/semantic/pending/chunk_NNN.jsonl
|
|
391
|
+
# (--chunk-size pro Chunk, Std. 10). task_id enthält einen
|
|
392
|
+
# Content-Hash – geänderte Dateien werden neu emittiert.
|
|
385
393
|
codebeacon semantic-apply [--dir .codebeacon]
|
|
386
|
-
#
|
|
387
|
-
# INFERRED references-Kanten in
|
|
388
|
-
#
|
|
389
|
-
#
|
|
390
|
-
#
|
|
394
|
+
# für jede vom Agent geschriebene .codebeacon/semantic/
|
|
395
|
+
# results/chunk_NNN.jsonl: INFERRED references-Kanten in
|
|
396
|
+
# beacon.json mergen + den Pending-Chunk nach
|
|
397
|
+
# .codebeacon/semantic/original/chunk_NNN.jsonl VERSCHIEBEN
|
|
398
|
+
# (dauerhaftes Archiv). Results löschen, alles regenerieren.
|
|
391
399
|
|
|
392
400
|
codebeacon serve [--dir .codebeacon] # MCP-Server starten (stdio)
|
|
393
401
|
codebeacon install # Claude-Code-Skill installieren
|
|
@@ -413,22 +421,24 @@ Das CLI selbst **ruft niemals einen LLM-Anbieter auf**. Die AI-semantik-Schicht
|
|
|
413
421
|
Wenn Sie `/codebeacon` in Claude Code aufrufen:
|
|
414
422
|
|
|
415
423
|
1. `scan` / `sync` baut `beacon.json` aus dem AST (kein LLM-Aufruf).
|
|
416
|
-
2. `codebeacon semantic-prepare`
|
|
417
|
-
3. Der Skill
|
|
418
|
-
4. `codebeacon semantic-apply` mergt die Ergebnisse als `INFERRED references`-Kanten in `beacon.json
|
|
419
|
-
5. Beim nächsten Scan: `semantic-prepare`
|
|
424
|
+
2. `codebeacon semantic-prepare` rehydriert das Archiv unter `.codebeacon/semantic/original/*.jsonl` auf den frischen Graphen und **entfernt** Einträge, deren Quellknoten nicht mehr existiert. Anschließend schreibt es neue Aufgaben nach `.codebeacon/semantic/pending/chunk_NNN.jsonl` (≤ `--chunk-size` pro Datei, Std. 10). Chunk-Nummern setzen genau dort an, wo das dauerhafte Archiv aufhört — keine Kollisionen möglich.
|
|
425
|
+
3. Der Skill verarbeitet Pending-Chunks **einzeln**. Für jedes `pending/chunk_NNN.jsonl` liest der Agent (mit dem Modell der laufenden Sitzung) den `excerpt` jeder Aufgabe und schreibt eine gleichnamige `semantic/results/chunk_NNN.jsonl`.
|
|
426
|
+
4. `codebeacon semantic-apply` mergt die Ergebnisse als `INFERRED references`-Kanten in `beacon.json` und **verschiebt** jede abgeschlossene `pending/chunk_NNN.jsonl` nach **`semantic/original/chunk_NNN.jsonl`** (mit den angewandten Kanten zur Nachvollziehbarkeit). Die Result-Dateien werden gelöscht, Wiki + Obsidian + Kontextkarte regeneriert.
|
|
427
|
+
5. Beim nächsten Scan: `semantic-prepare` liest jeden Chunk unter `original/`, wendet seine Kanten auf den frisch gebauten Graphen an (historische Inferenzen bleiben erhalten) und überspringt jede Aufgabe, deren `task_id` bereits archiviert ist. `task_id` = `SHA1(file_path | node_id | excerpt_hash[:8])` — ändert sich der semantische Inhalt einer Datei, bekommt sie eine neue id und wird neu analysiert.
|
|
420
428
|
|
|
421
|
-
|
|
429
|
+
Inkrementelle, idempotente Anreicherung: der Agent analysiert dieselbe (Datei, Inhalt)-Kombination nie zweimal, das angesammelte AI-Signal überlebt jeden Rescan, und die Chunk-Aufteilung hält den Arbeitsumfang des Agenten klein.
|
|
422
430
|
|
|
423
431
|
### Direkte CLI-Nutzung
|
|
424
432
|
|
|
425
|
-
Wenn Sie nicht über den Skill gehen (z. B. CI), können Sie dieselben zwei Befehle manuell ausführen und
|
|
433
|
+
Wenn Sie nicht über den Skill gehen (z. B. CI), können Sie dieselben zwei Befehle manuell ausführen und Ihre eigenen `results/chunk_NNN.jsonl` liefern:
|
|
426
434
|
|
|
427
435
|
```bash
|
|
428
436
|
codebeacon scan .
|
|
429
|
-
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50
|
|
437
|
+
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50 --chunk-size 10
|
|
430
438
|
|
|
431
|
-
#
|
|
439
|
+
# .codebeacon/semantic/pending/chunk_001.jsonl ... existieren jetzt.
|
|
440
|
+
# Schreiben Sie für jeden Pending-Chunk eine gleichnamige results/chunk_NNN.jsonl.
|
|
441
|
+
# Jede Zeile:
|
|
432
442
|
# {"task_id":"...", "source_node_id":"...", "edges":[
|
|
433
443
|
# {"target_name":"UserService","relation":"references","confidence_score":0.7}
|
|
434
444
|
# ]}
|
|
@@ -56,6 +56,11 @@ Las herramientas existentes resuelven esto de forma parcial. Los analizadores de
|
|
|
56
56
|
- **Cero configuración** — detecta frameworks y lenguajes automáticamente; genera `codebeacon.yaml` para ejecuciones posteriores
|
|
57
57
|
- **Modo Deep Dive** — `--deep-dive` genera `.codebeacon/` + `CLAUDE.md` propios para cada sub-proyecto; ejecutar el comando de actualización desde **cualquier** sub-proyecto sincroniza automáticamente todos los proyectos del workspace
|
|
58
58
|
- **Auto-redescubrimiento del workspace** — en cada `scan`/`sync`, codebeacon re-escanea el workspace y añade automáticamente al `codebeacon.yaml` los nuevos proyectos antes de extraer, de modo que los sub-proyectos recién añadidos nunca se omitan silenciosamente; usa `--no-rediscover` para optar por el modo de configuración curada manualmente
|
|
59
|
+
- **Enriquecimiento semántico estilo Graphify** — tras la extracción AST, el skill despacha un subagente paralelo por chunk para emitir fragmentos completos de grafo `{nodes, edges, hyperedges}` con 8 tipos de relación (`calls`/`implements`/`references`/`cites`/`conceptually_related_to`/`shares_data_with`/`semantically_similar_to`/`rationale_for`) y confianza EXTRACTED/INFERRED/AMBIGUOUS; en Claude Code el subagente se ejecuta un nivel por debajo del modelo host (Opus→Sonnet, Sonnet→Haiku) para mantener el gasto proporcional al tamaño del corpus. El AST posee los nodos de código; el LLM solo puede aportar nodos `concept`/`document`/`paper`. Los archivos 0.3.x existentes se replayean con el nuevo esquema sin cambios
|
|
60
|
+
- **Modo de conocimiento (`codebeacon knowledge`)** — escanea notas markdown (ADRs, actas de reunión, retros, specs, research) y produce un único `KNOWLEDGE.md` junto a `.codebeacon/`. Clasifica automáticamente por patrones de nombre de fichero y de encabezados, parsea frontmatter YAML de Obsidian y `[[backlinks]]`, y muestra arriba un resumen de "Key Decisions" + "Open Questions" para que el agente entienda *por qué* el código tiene la forma que tiene. Heurística pura — sin llamadas a LLM
|
|
61
|
+
- **Atajo de ruta** — `codebeacon ./src` ahora equivale a `codebeacon scan ./src`; cuando el primer argumento no es un subcomando registrado, `scan` se inyecta automáticamente, conservando la memoria muscular de `graphify <path>` / `codesight <path>`
|
|
62
|
+
- **Pipeline semántico endurecido** — `semantic-apply` protege contra JSONL del agente mal formado (líneas null/lista/code-fence, campos faltantes), coerce valores rotos de `confidence_score` (None/NaN/string/fuera de rango) a un default seguro, snapshotea `beacon.json` → `beacon.json.bak` antes del merge para que la baseline AST siempre sea recuperable, y regenera `beacon.html` + `callflow.html` para que los exports visuales reflejen los nuevos edges inferidos
|
|
63
|
+
- **Guardas de ficheros/directorios sensibles** — los directorios `secrets/`, `credentials/`, `.ssh/`, `.aws/`, `.gnupg/` se omiten siempre; los nombres de fichero que coincidan con patrones de credenciales (`api_token`, `oauth_token`, `private_key`, `client_secret`; variantes con guion bajo *y* guion) quedan excluidos del recolector antes de llegar a los extractores
|
|
59
64
|
|
|
60
65
|
---
|
|
61
66
|
|
|
@@ -376,16 +381,19 @@ codebeacon hook install [path] # instala merge driver + hook post-com
|
|
|
376
381
|
codebeacon merge-driver <base> <cur> <other> # invocado por git tras `hook install`; union-merge de beacon.json
|
|
377
382
|
|
|
378
383
|
# Enriquecimiento AI-semántico (el LLM lo ejecuta el agente, codebeacon lleva la contabilidad)
|
|
379
|
-
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N]
|
|
380
|
-
# rehidrata
|
|
381
|
-
#
|
|
382
|
-
#
|
|
384
|
+
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N] [--chunk-size N]
|
|
385
|
+
# rehidrata .codebeacon/semantic/original/*.jsonl sobre el
|
|
386
|
+
# nuevo beacon.json + poda entradas que apuntan a nodos
|
|
387
|
+
# desaparecidos, luego escribe tareas en
|
|
388
|
+
# .codebeacon/semantic/pending/chunk_NNN.jsonl
|
|
389
|
+
# (--chunk-size por chunk, predet. 10). El task_id incluye
|
|
390
|
+
# hash de contenido: si el archivo cambia, se reemite.
|
|
383
391
|
codebeacon semantic-apply [--dir .codebeacon]
|
|
384
|
-
#
|
|
385
|
-
#
|
|
386
|
-
#
|
|
387
|
-
#
|
|
388
|
-
#
|
|
392
|
+
# por cada .codebeacon/semantic/results/chunk_NNN.jsonl que
|
|
393
|
+
# haya escrito el agente, fusiona las aristas INFERRED
|
|
394
|
+
# references en beacon.json y MUEVE el chunk pendiente a
|
|
395
|
+
# .codebeacon/semantic/original/chunk_NNN.jsonl (archivo
|
|
396
|
+
# durable). Borra los resultados y regenera todo.
|
|
389
397
|
|
|
390
398
|
codebeacon serve [--dir .codebeacon] # servidor MCP (stdio)
|
|
391
399
|
codebeacon install # instalar skill de Claude Code
|
|
@@ -411,22 +419,24 @@ El CLI por sí mismo **nunca llama a un LLM**. La capa AI-semántica es propieda
|
|
|
411
419
|
Cuando invocas `/codebeacon` en Claude Code:
|
|
412
420
|
|
|
413
421
|
1. `scan` / `sync` construye `beacon.json` desde el AST (sin LLM).
|
|
414
|
-
2. `codebeacon semantic-prepare`
|
|
415
|
-
3. El skill itera
|
|
416
|
-
4. `codebeacon semantic-apply` mezcla los resultados como aristas `INFERRED references` en `beacon.json
|
|
417
|
-
5. En la
|
|
422
|
+
2. `codebeacon semantic-prepare` rehidrata el archivo en `.codebeacon/semantic/original/*.jsonl` sobre el grafo nuevo y **poda** las entradas que apuntan a nodos ya desaparecidos. Después escribe los nuevos task chunks en `.codebeacon/semantic/pending/chunk_NNN.jsonl` (cada chunk ≤ `--chunk-size`, predet. 10). La numeración de chunks continúa donde dejó el archivo durable, así nunca colisiona.
|
|
423
|
+
3. El skill itera los chunks pendientes **uno por uno**. Para cada `pending/chunk_NNN.jsonl`, el agente (con el modelo de su sesión actual) lee el `excerpt` de cada task y escribe un `semantic/results/chunk_NNN.jsonl` con el mismo nombre.
|
|
424
|
+
4. `codebeacon semantic-apply` mezcla los resultados como aristas `INFERRED references` en `beacon.json` y **mueve** cada `pending/chunk_NNN.jsonl` terminado a **`semantic/original/chunk_NNN.jsonl`** (con las aristas aplicadas para auditoría). Los archivos de resultados se eliminan; wiki + obsidian + mapa de contexto se regeneran.
|
|
425
|
+
5. En la siguiente ejecución: `semantic-prepare` lee cada chunk bajo `original/`, aplica sus aristas al grafo recién construido (las inferencias históricas no se pierden) y omite cualquier task cuyo `task_id` ya esté archivado. `task_id` = `SHA1(file_path | node_id | excerpt_hash[:8])`: si el contenido del archivo cambia, recibe un id nuevo y se reanaliza.
|
|
418
426
|
|
|
419
|
-
|
|
427
|
+
Enriquecimiento incremental e idempotente: el agente nunca reanaliza la misma combinación (archivo, contenido) dos veces, la señal AI acumulada sobrevive a cada re-escaneo y los chunks mantienen pequeño el conjunto de trabajo del agente.
|
|
420
428
|
|
|
421
429
|
### Uso directo del CLI
|
|
422
430
|
|
|
423
|
-
Si no usas el skill (p. ej. en CI), puedes ejecutar las mismas dos órdenes manualmente y
|
|
431
|
+
Si no usas el skill (p. ej. en CI), puedes ejecutar las mismas dos órdenes manualmente y proporcionar tus propios `results/chunk_NNN.jsonl`:
|
|
424
432
|
|
|
425
433
|
```bash
|
|
426
434
|
codebeacon scan .
|
|
427
|
-
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50
|
|
435
|
+
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50 --chunk-size 10
|
|
428
436
|
|
|
429
|
-
#
|
|
437
|
+
# Existen .codebeacon/semantic/pending/chunk_001.jsonl ...
|
|
438
|
+
# Para cada chunk pendiente, escribe un results/chunk_NNN.jsonl con el mismo
|
|
439
|
+
# nombre. Cada línea:
|
|
430
440
|
# {"task_id":"...", "source_node_id":"...", "edges":[
|
|
431
441
|
# {"target_name":"UserService","relation":"references","confidence_score":0.7}
|
|
432
442
|
# ]}
|
|
@@ -56,6 +56,11 @@ Les outils existants ne résolvent ce problème qu'en partie. Les analyseurs de
|
|
|
56
56
|
- **Zéro configuration** — détecte automatiquement les frameworks et langages ; génère `codebeacon.yaml` pour les exécutions suivantes
|
|
57
57
|
- **Mode Deep Dive** — `--deep-dive` génère un `.codebeacon/` + `CLAUDE.md` propre à chaque sous-projet ; une commande de mise à jour depuis **n'importe quel** sous-projet synchronise automatiquement tous les projets du workspace
|
|
58
58
|
- **Redécouverte automatique du workspace** — à chaque `scan`/`sync`, codebeacon réanalyse le workspace et ajoute automatiquement les nouveaux projets au `codebeacon.yaml` avant l'extraction, de sorte que les sous-projets fraîchement ajoutés ne soient jamais oubliés en silence ; utilisez `--no-rediscover` pour conserver une configuration yaml gérée manuellement
|
|
59
|
+
- **Enrichissement sémantique façon Graphify** — après l'extraction AST, le skill dispatche un sous-agent parallèle par chunk pour émettre des fragments complets de knowledge graph `{nodes, edges, hyperedges}` avec 8 types de relations (`calls`/`implements`/`references`/`cites`/`conceptually_related_to`/`shares_data_with`/`semantically_similar_to`/`rationale_for`) et confiance EXTRACTED/INFERRED/AMBIGUOUS ; sur Claude Code, le sous-agent s'exécute un cran sous le modèle hôte (Opus→Sonnet, Sonnet→Haiku) pour garder le coût proportionnel à la taille du corpus. L'AST possède les nœuds de code ; le LLM ne peut contribuer que des nœuds `concept`/`document`/`paper`. Les archives 0.3.x existantes sont rejouées sous le nouveau schéma sans modification
|
|
60
|
+
- **Mode connaissance (`codebeacon knowledge`)** — scanne les notes markdown (ADRs, comptes-rendus, rétros, specs, research) et produit un unique `KNOWLEDGE.md` à côté de `.codebeacon/`. Classification automatique par motifs de nom de fichier et de titres, parsing du frontmatter YAML Obsidian et des `[[backlinks]]`, et un résumé « Key Decisions » + « Open Questions » en tête pour que l'agent comprenne *pourquoi* la base de code a cette forme. Pure heuristique — sans appel LLM
|
|
61
|
+
- **Raccourci chemin** — `codebeacon ./src` équivaut désormais à `codebeacon scan ./src` ; quand le premier argument n'est pas une sous-commande enregistrée, `scan` est injecté automatiquement, ce qui préserve la mémoire musculaire de `graphify <path>` / `codesight <path>`
|
|
62
|
+
- **Pipeline sémantique durci** — `semantic-apply` protège contre les lignes JSONL mal formées de l'agent (null/listes/code-fences/champs manquants), coerce les valeurs cassées de `confidence_score` (None/NaN/string/hors-plage) vers un défaut sûr, snapshote `beacon.json` → `beacon.json.bak` avant le merge pour que la baseline AST reste toujours récupérable, et régénère `beacon.html` + `callflow.html` pour que les exports visuels reflètent les nouvelles arêtes inférées
|
|
63
|
+
- **Garde-fous fichiers/dossiers sensibles** — les répertoires `secrets/`, `credentials/`, `.ssh/`, `.aws/`, `.gnupg/` sont toujours ignorés ; les noms de fichiers correspondant à des motifs de credentials (`api_token`, `oauth_token`, `private_key`, `client_secret` ; variantes avec underscore *et* tiret) sont exclus du collecteur avant d'atteindre les extracteurs
|
|
59
64
|
|
|
60
65
|
---
|
|
61
66
|
|
|
@@ -377,16 +382,19 @@ codebeacon hook install [path] # installer merge driver + hook post-c
|
|
|
377
382
|
codebeacon merge-driver <base> <cur> <other> # invoqué par git après `hook install` ; union-merge de beacon.json
|
|
378
383
|
|
|
379
384
|
# Enrichissement AI-sémantique (le LLM est exécuté par l'agent, codebeacon tient la comptabilité)
|
|
380
|
-
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N]
|
|
381
|
-
#
|
|
382
|
-
#
|
|
383
|
-
#
|
|
385
|
+
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N] [--chunk-size N]
|
|
386
|
+
# réhydrate .codebeacon/semantic/original/*.jsonl sur le
|
|
387
|
+
# nouveau beacon.json + élague les entrées pointant vers
|
|
388
|
+
# des nœuds disparus, puis écrit les nouvelles tâches
|
|
389
|
+
# dans .codebeacon/semantic/pending/chunk_NNN.jsonl
|
|
390
|
+
# (--chunk-size par chunk, défaut 10). task_id inclut un
|
|
391
|
+
# hash de contenu : un fichier modifié est ré-émis.
|
|
384
392
|
codebeacon semantic-apply [--dir .codebeacon]
|
|
385
|
-
#
|
|
386
|
-
# arêtes INFERRED references
|
|
387
|
-
#
|
|
388
|
-
#
|
|
389
|
-
#
|
|
393
|
+
# pour chaque .codebeacon/semantic/results/chunk_NNN.jsonl
|
|
394
|
+
# écrit par l'agent, fusionne les arêtes INFERRED references
|
|
395
|
+
# dans beacon.json et DÉPLACE le chunk pending vers
|
|
396
|
+
# .codebeacon/semantic/original/chunk_NNN.jsonl (archive
|
|
397
|
+
# durable). Supprime les résultats, régénère tout.
|
|
390
398
|
|
|
391
399
|
codebeacon serve [--dir .codebeacon] # serveur MCP (stdio)
|
|
392
400
|
codebeacon install # installer le skill Claude Code
|
|
@@ -412,22 +420,24 @@ Le CLI lui-même **n'appelle jamais un LLM**. La couche AI-sémantique est inten
|
|
|
412
420
|
Quand vous invoquez `/codebeacon` dans Claude Code :
|
|
413
421
|
|
|
414
422
|
1. `scan` / `sync` construit `beacon.json` à partir de l'AST (aucun appel LLM).
|
|
415
|
-
2. `codebeacon semantic-prepare`
|
|
416
|
-
3. Le skill itère
|
|
417
|
-
4. `codebeacon semantic-apply` fusionne les résultats en arêtes `INFERRED references` dans `beacon.json
|
|
418
|
-
5. Au prochain scan : `semantic-prepare`
|
|
423
|
+
2. `codebeacon semantic-prepare` réhydrate l'archive sous `.codebeacon/semantic/original/*.jsonl` sur le graphe frais et **élague** les entrées dont le nœud source a disparu. Il écrit ensuite les nouvelles tâches dans `.codebeacon/semantic/pending/chunk_NNN.jsonl` (≤ `--chunk-size` par fichier, défaut 10). La numérotation des chunks reprend là où l'archive durable s'est arrêtée — pas de collision possible.
|
|
424
|
+
3. Le skill itère les chunks pending **un par un**. Pour chaque `pending/chunk_NNN.jsonl`, l'agent (avec le modèle de sa session courante) lit l'`excerpt` de chaque tâche et écrit un `semantic/results/chunk_NNN.jsonl` du même nom.
|
|
425
|
+
4. `codebeacon semantic-apply` fusionne les résultats en arêtes `INFERRED references` dans `beacon.json` et **déplace** chaque `pending/chunk_NNN.jsonl` terminé vers **`semantic/original/chunk_NNN.jsonl`** (les arêtes appliquées y sont incluses pour auditabilité). Les fichiers de résultats sont supprimés ; wiki + obsidian + carte de contexte sont régénérés.
|
|
426
|
+
5. Au prochain scan : `semantic-prepare` lit chaque chunk sous `original/`, applique ses arêtes au graphe fraîchement construit (les inférences historiques sont conservées) et saute toute tâche dont le `task_id` est déjà archivé. `task_id` = `SHA1(file_path | node_id | excerpt_hash[:8])` — si le contenu sémantique d'un fichier change, il obtient un nouvel id et est ré-analysé.
|
|
419
427
|
|
|
420
|
-
|
|
428
|
+
Enrichissement incrémental et idempotent : l'agent ne ré-analyse jamais deux fois la même combinaison (fichier, contenu), le signal AI accumulé survit à chaque re-scan et les chunks gardent l'ensemble de travail de l'agent petit.
|
|
421
429
|
|
|
422
430
|
### Utilisation directe du CLI
|
|
423
431
|
|
|
424
|
-
Si vous n'utilisez pas le skill (par ex. en CI), vous pouvez piloter les deux mêmes commandes manuellement et fournir
|
|
432
|
+
Si vous n'utilisez pas le skill (par ex. en CI), vous pouvez piloter les deux mêmes commandes manuellement et fournir vos propres `results/chunk_NNN.jsonl` :
|
|
425
433
|
|
|
426
434
|
```bash
|
|
427
435
|
codebeacon scan .
|
|
428
|
-
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50
|
|
436
|
+
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50 --chunk-size 10
|
|
429
437
|
|
|
430
|
-
#
|
|
438
|
+
# .codebeacon/semantic/pending/chunk_001.jsonl ... existent.
|
|
439
|
+
# Pour chaque chunk pending, écrivez un results/chunk_NNN.jsonl du même nom.
|
|
440
|
+
# Chaque ligne :
|
|
431
441
|
# {"task_id":"...", "source_node_id":"...", "edges":[
|
|
432
442
|
# {"target_name":"UserService","relation":"references","confidence_score":0.7}
|
|
433
443
|
# ]}
|
|
@@ -56,6 +56,11 @@ AI コーディングセッションを新しく開くたびに、アシスタ
|
|
|
56
56
|
- **ゼロ設定** — フレームワークと言語を自動検出;繰り返し実行のために `codebeacon.yaml` を自動生成
|
|
57
57
|
- **ディープダイブモード** — `--deep-dive` で各サブプロジェクトに専用の `.codebeacon/` + `CLAUDE.md` を生成;**どのサブプロジェクトからでも**更新コマンドを実行するだけでワークスペース全体が自動同期
|
|
58
58
|
- **ワークスペース自動再検出** — `scan`/`sync` 実行のたびにワークスペースを再スキャンし、`codebeacon.yaml` に未登録の新規プロジェクトを自動追加してから抽出を開始するため、新しく追加されたサブプロジェクトが見落とされることがない;yaml を手動で管理している場合は `--no-rediscover` でオプトアウト可能
|
|
59
|
+
- **Graphify 風のセマンティック強化** — AST 抽出後、スキルがチャンクごとに 1 つのサブエージェントを並列でディスパッチし、`{nodes, edges, hyperedges}` のフル知識グラフ断片を抽出。関係 8 種(`calls`/`implements`/`references`/`cites`/`conceptually_related_to`/`shares_data_with`/`semantically_similar_to`/`rationale_for`)+ 信頼度 3 段階(EXTRACTED/INFERRED/AMBIGUOUS)をサポート。Claude Code ではサブエージェントがホストモデルより 1 段階下(Opus→Sonnet、Sonnet→Haiku)に自動ダウングレードされ、コーパスサイズに比例したコストを維持。コードノードは AST が担当し、LLM は `concept`/`document`/`paper` ノードのみ寄与可能。既存の 0.3.x アーカイブは新スキーマで透過的にリプレイされる
|
|
60
|
+
- **ナレッジモード (`codebeacon knowledge`)** — マークダウンノート(ADR、議事録、ふりかえり、仕様、リサーチ)をスキャンし、`.codebeacon/` の隣に単一の `KNOWLEDGE.md` を生成。ファイル名・見出しパターンで自動分類、Obsidian の YAML frontmatter と `[[backlinks]]` をパースし、最上部に「Key Decisions」+「Open Questions」のロールアップを提示することで、コードベースが*なぜ*このような形になっているのかをエージェントに伝える。ヒューリスティックのみで LLM 呼び出しなし
|
|
61
|
+
- **パス省略形** — `codebeacon ./src` が `codebeacon scan ./src` と等価に。先頭引数が登録済みサブコマンドでない場合は `scan` が自動注入されるため、`graphify <path>` / `codesight <path>` の操作感もそのまま使える
|
|
62
|
+
- **強化された semantic パイプライン** — `semantic-apply` がエージェント JSONL の不正行(null/リスト/code-fence/必須フィールド欠落)をガードし、壊れた `confidence_score`(None/NaN/文字列/範囲外)を安全なデフォルトに coerce、merge 直前に `beacon.json` → `beacon.json.bak` をスナップショットして AST ベースラインを常に復元可能にし、`beacon.html`/`callflow.html` も再生成して新たに推論されたエッジが可視化に反映される
|
|
63
|
+
- **機密ファイル・ディレクトリのガード** — `secrets/`、`credentials/`、`.ssh/`、`.aws/`、`.gnupg/` を常にスキップ。credential パターン(`api_token`、`oauth_token`、`private_key`、`client_secret`; アンダースコア*と*ハイフン両方の変種)に一致するファイル名は、抽出器に到達する前にコレクタ段階で除外
|
|
59
64
|
|
|
60
65
|
---
|
|
61
66
|
|
|
@@ -285,17 +290,19 @@ codebeacon hook install [path] # merge driver + post-commit インク
|
|
|
285
290
|
codebeacon merge-driver <base> <cur> <other> # `hook install` 後 git が呼び出す;beacon.json を union マージ
|
|
286
291
|
|
|
287
292
|
# AI-セマンティック補強 (LLM はエージェント、整合性管理は codebeacon)
|
|
288
|
-
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N]
|
|
289
|
-
#
|
|
290
|
-
#
|
|
291
|
-
#
|
|
292
|
-
# に書き出す
|
|
293
|
+
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N] [--chunk-size N]
|
|
294
|
+
# .codebeacon/semantic/original/*.jsonl アーカイブを fresh
|
|
295
|
+
# beacon.json に再適用 + 失われたノードを指す stale エントリ
|
|
296
|
+
# を prune し、新規候補のみを .codebeacon/semantic/pending/
|
|
297
|
+
# chunk_NNN.jsonl に書き出す (chunk あたり --chunk-size 件、
|
|
298
|
+
# 既定 10)。task_id にコンテンツハッシュが入っているので、
|
|
299
|
+
# ファイル内容が変わると自動で再発行される。
|
|
293
300
|
codebeacon semantic-apply [--dir .codebeacon]
|
|
294
|
-
# .codebeacon/semantic
|
|
295
|
-
#
|
|
296
|
-
# .
|
|
297
|
-
#
|
|
298
|
-
# wiki/obsidian
|
|
301
|
+
# エージェントが書いた .codebeacon/semantic/results/
|
|
302
|
+
# chunk_NNN.jsonl をそれぞれ INFERRED references エッジ
|
|
303
|
+
# として beacon.json にマージし、pending/chunk_NNN.jsonl
|
|
304
|
+
# を original/chunk_NNN.jsonl に移動 (永続アーカイブ)。
|
|
305
|
+
# results は削除、wiki/obsidian/コンテキストマップを再生成。
|
|
299
306
|
|
|
300
307
|
# インテグレーション
|
|
301
308
|
codebeacon serve [--dir .codebeacon] # MCP サーバー起動 (stdio)
|
|
@@ -322,22 +329,23 @@ CLI 自体は LLM API 呼び出しを **行いません**。AI-セマンティ
|
|
|
322
329
|
Claude Code で `/codebeacon` を呼び出すと:
|
|
323
330
|
|
|
324
331
|
1. `scan` / `sync` が AST から `beacon.json` を構築(LLM 呼び出しなし)。
|
|
325
|
-
2. `codebeacon semantic-prepare`
|
|
326
|
-
3.
|
|
327
|
-
4. `codebeacon semantic-apply` が結果を `INFERRED references` エッジとして `beacon.json`
|
|
328
|
-
5. 次回スキャン時:`semantic-prepare`
|
|
332
|
+
2. `codebeacon semantic-prepare` が `.codebeacon/semantic/original/*.jsonl` アーカイブを新グラフに再適用し、グラフから消えたノードを指す stale エントリを **prune**。続いて新規 task を `.codebeacon/semantic/pending/chunk_NNN.jsonl` に書き出す(`--chunk-size` 単位、既定 10)。chunk 番号は永続アーカイブの続きから始まるため衝突しません。
|
|
333
|
+
3. スキルは pending chunk を**1 つずつ**処理。各 `pending/chunk_NNN.jsonl` について、エージェント(現在セッションのモデル)が task の `excerpt` を読み、同名の `semantic/results/chunk_NNN.jsonl` を書きます。
|
|
334
|
+
4. `codebeacon semantic-apply` が結果を `INFERRED references` エッジとして `beacon.json` にマージし、完了済み `pending/chunk_NNN.jsonl` を **`semantic/original/chunk_NNN.jsonl`** に**移動**(適用済みエッジを一緒に記録)。results は削除、wiki + obsidian + コンテキストマップを再生成。
|
|
335
|
+
5. 次回スキャン時:`semantic-prepare` が `original/` の全 chunk のエッジを新グラフに再適用(過去の推論を保全)し、既に処理済みの `task_id` はスキップ。`task_id` = `SHA1(file_path | node_id | excerpt_hash[:8])` — ファイルのセマンティック内容が変われば自動的に新しい id になり再解析されます。
|
|
329
336
|
|
|
330
|
-
→
|
|
337
|
+
→ 増分かつ冪等の補強。同じ (ファイル, 内容) を二度分析せず、蓄積された AI シグナルは毎回の再スキャンを生き延び、chunk 分割でエージェントの作業セットも小さく保てます。
|
|
331
338
|
|
|
332
339
|
### 直接 CLI 使用
|
|
333
340
|
|
|
334
|
-
スキルを介さず(例:CI)に同じ 2 コマンドで手動運用し、`
|
|
341
|
+
スキルを介さず(例:CI)に同じ 2 コマンドで手動運用し、`results/chunk_NNN.jsonl` を自分で書くこともできます:
|
|
335
342
|
|
|
336
343
|
```bash
|
|
337
344
|
codebeacon scan .
|
|
338
|
-
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50
|
|
345
|
+
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50 --chunk-size 10
|
|
339
346
|
|
|
340
|
-
#
|
|
347
|
+
# .codebeacon/semantic/pending/chunk_001.jsonl ... が生成される。
|
|
348
|
+
# 各 pending chunk について同名の results/chunk_NNN.jsonl を書く。各行:
|
|
341
349
|
# {"task_id":"...", "source_node_id":"...", "edges":[
|
|
342
350
|
# {"target_name":"UserService","relation":"references","confidence_score":0.7}
|
|
343
351
|
# ]}
|
|
@@ -56,6 +56,11 @@ AI 코딩 세션을 새로 열 때마다 어시스턴트는 백지 상태에서
|
|
|
56
56
|
- **제로 설정** — 프레임워크와 언어 자동 감지; 반복 실행을 위한 `codebeacon.yaml` 자동 생성
|
|
57
57
|
- **딥다이브 모드** — `--deep-dive`는 각 서브 프로젝트에 개별 `.codebeacon/` + `CLAUDE.md`를 생성; 어느 서브 프로젝트 폴더에서든 `codebeacon scan . --update`를 실행하면 워크스페이스의 모든 프로젝트가 자동으로 업데이트됨
|
|
58
58
|
- **워크스페이스 자동 재발견** — `scan`/`sync` 실행마다 워크스페이스를 다시 훑어 `codebeacon.yaml`에 없는 신규 프로젝트를 자동으로 yaml에 추가한 뒤 추출 시작 — 새로 추가된 서브 프로젝트가 조용히 누락되지 않음; 수동으로 yaml을 큐레이션 중이라면 `--no-rediscover`로 옵트아웃
|
|
59
|
+
- **Graphify 스타일 semantic 보강** — AST 추출 후 스킬이 청크당 subagent 1개를 병렬로 띄워 `{nodes, edges, hyperedges}` 풀 그래프 단편을 추출. 관계 8종(`calls`/`implements`/`references`/`cites`/`conceptually_related_to`/`shares_data_with`/`semantically_similar_to`/`rationale_for`) + 신뢰도 3단계(EXTRACTED/INFERRED/AMBIGUOUS) 지원. Claude Code에서는 subagent가 호스트 모델보다 한 단계 아래(Opus→Sonnet, Sonnet→Haiku)로 자동 강등되어 코퍼스 크기에 비례한 비용 유지. 코드 노드는 AST 전담, LLM은 `concept`/`document`/`paper` 노드만 기여 가능. 기존 0.3.x 아카이브는 새 스키마로 그대로 replay됨
|
|
60
|
+
- **지식 모드 (`codebeacon knowledge`)** — 마크다운 노트(ADR, 회의록, 회고, 스펙, 리서치)를 스캔해서 `.codebeacon/` 옆에 단일 `KNOWLEDGE.md` 생성. 파일명·제목 패턴으로 자동 분류, Obsidian YAML frontmatter와 `[[backlinks]]` 파싱, 최상단에 "Key Decisions" + "Open Questions" 롤업을 제공해 코드베이스가 *왜* 이런 모습인지 에이전트에게 전달. 휴리스틱만 사용 — LLM 호출 없음
|
|
61
|
+
- **경로 단축 입력** — `codebeacon ./src`가 이제 `codebeacon scan ./src`와 동일. 첫 인자가 등록된 서브커맨드가 아니면 `scan`이 자동 주입되어, `graphify <path>` / `codesight <path>` 머슬 메모리도 그대로 동작
|
|
62
|
+
- **강화된 semantic 파이프라인** — `semantic-apply`가 agent JSONL의 비정상 라인(null/리스트/code-fence/필수 필드 누락)을 가드, 잘못된 `confidence_score`(None/NaN/문자열/범위 초과)를 안전 기본값으로 coerce, merge 직전 `beacon.json` → `beacon.json.bak` 스냅샷으로 AST 베이스라인 복구 가능 보장, `beacon.html`/`callflow.html`도 재생성해서 새 inferred 엣지가 시각화에 반영됨
|
|
63
|
+
- **민감 파일·디렉토리 가드** — `secrets/`, `credentials/`, `.ssh/`, `.aws/`, `.gnupg/` 디렉토리는 항상 스킵. credential 패턴(`api_token`, `oauth_token`, `private_key`, `client_secret`; 언더스코어 *및* 하이픈 변형) 파일명은 추출기에 도달하기 전 수집 단계에서 제외
|
|
59
64
|
|
|
60
65
|
---
|
|
61
66
|
|
|
@@ -143,11 +148,14 @@ project-root/
|
|
|
143
148
|
components/<Name>.md
|
|
144
149
|
obsidian/ ← Obsidian 볼트 (그래프 노드당 노트 1개)
|
|
145
150
|
semantic/
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
+
pending/ ← prepare 가 chunk_NNN.jsonl 작성 (chunk 당 --chunk-size 개)
|
|
152
|
+
chunk_001.jsonl
|
|
153
|
+
chunk_002.jsonl
|
|
154
|
+
results/ ← 에이전트가 같은 이름의 chunk_NNN.jsonl 작성
|
|
155
|
+
chunk_001.jsonl
|
|
156
|
+
original/ ← apply 가 완료 chunk 를 이동 (영구 아카이브)
|
|
157
|
+
chunk_001.jsonl
|
|
158
|
+
chunk_002.jsonl ← (과거 실행 분이 누적; chunk 번호는 monotonic)
|
|
151
159
|
```
|
|
152
160
|
|
|
153
161
|
### 딥다이브 모드
|
|
@@ -314,15 +322,20 @@ codebeacon sync --config <file> # 특정 설정 파일 사용
|
|
|
314
322
|
codebeacon sync --no-rediscover # 신규 프로젝트 자동 추가 비활성화 (수동 큐레이션 모드)
|
|
315
323
|
|
|
316
324
|
# AI-시맨틱 보강 (LLM 작업은 에이전트가, 부기는 codebeacon이 담당)
|
|
317
|
-
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N]
|
|
318
|
-
#
|
|
319
|
-
#
|
|
320
|
-
#
|
|
325
|
+
codebeacon semantic-prepare [--dir .codebeacon] [--max-tasks N] [--chunk-size N]
|
|
326
|
+
# .codebeacon/semantic/original/*.jsonl 아카이브를 fresh
|
|
327
|
+
# beacon.json 에 재적용 + 사라진 노드를 가리키는 stale 엔트리
|
|
328
|
+
# prune, 그 후 **모든** NEW 후보 (god 폴더 + hub file +
|
|
329
|
+
# unresolved 타겟) 를 .codebeacon/semantic/pending/
|
|
330
|
+
# chunk_NNN.jsonl 로 작성 (chunk 당 --chunk-size 개, 기본 10).
|
|
331
|
+
# --max-tasks 는 선택적 cap (0 = no cap, 기본 — 모두 emit).
|
|
332
|
+
# task_id 에 콘텐츠 해시가 포함되어 파일 내용이 바뀌면 자동 재발행.
|
|
321
333
|
codebeacon semantic-apply [--dir .codebeacon]
|
|
322
|
-
# .codebeacon/semantic
|
|
323
|
-
# INFERRED references 엣지로
|
|
324
|
-
# .
|
|
325
|
-
#
|
|
334
|
+
# 에이전트가 작성한 .codebeacon/semantic/results/
|
|
335
|
+
# chunk_NNN.jsonl 각각을 INFERRED references 엣지로
|
|
336
|
+
# beacon.json 에 머지 + pending/chunk_NNN.jsonl 을
|
|
337
|
+
# original/chunk_NNN.jsonl 로 이동 (영구 아카이브).
|
|
338
|
+
# results 파일 삭제, wiki/obsidian/컨텍스트 맵 재생성.
|
|
326
339
|
|
|
327
340
|
# 지식 그래프 쿼리
|
|
328
341
|
codebeacon query <term> [--dir .codebeacon] [--limit N] # 라벨 부분 문자열로 노드 검색
|
|
@@ -357,22 +370,23 @@ CLI 자체는 LLM API 호출을 **하지 않습니다**. AI-시맨틱 계층은
|
|
|
357
370
|
Claude Code 에서 `/codebeacon` 호출 시:
|
|
358
371
|
|
|
359
372
|
1. `scan` / `sync` 가 AST 로부터 `beacon.json` 빌드 (LLM 호출 없음).
|
|
360
|
-
2. `codebeacon semantic-prepare` 가
|
|
361
|
-
3. 스킬이
|
|
362
|
-
4. `codebeacon semantic-apply` 가 결과를 `INFERRED references` 엣지로 `beacon.json` 에 머지하고,
|
|
363
|
-
5. 다음 스캔: `semantic-prepare` 가
|
|
373
|
+
2. `codebeacon semantic-prepare` 가 `.codebeacon/semantic/original/*.jsonl` 아카이브를 새 그래프에 재적용하고, 그래프에서 사라진 노드를 가리키는 stale 엔트리를 **prune** 한 뒤, 신규 task 들을 `.codebeacon/semantic/pending/chunk_NNN.jsonl` 로 작성 (`--chunk-size` 당 1 chunk, 기본 10). chunk 번호는 영구 아카이브의 다음 번호부터 시작 — 절대 충돌하지 않음.
|
|
374
|
+
3. 스킬이 pending chunk 들을 **한 번에 하나씩** 처리. 각 `pending/chunk_NNN.jsonl` 에 대해 에이전트(현재 세션의 모델)가 각 task 의 `excerpt` 를 읽고 같은 이름의 `semantic/results/chunk_NNN.jsonl` 을 작성.
|
|
375
|
+
4. `codebeacon semantic-apply` 가 결과를 `INFERRED references` 엣지로 `beacon.json` 에 머지하고, 각 완료된 `pending/chunk_NNN.jsonl` 을 **`semantic/original/chunk_NNN.jsonl`** 로 **이동** (적용된 엣지를 함께 적재, 감사 가능). results 파일은 삭제, wiki + obsidian + 컨텍스트 맵 재생성.
|
|
376
|
+
5. 다음 스캔: `semantic-prepare` 가 `original/` 의 모든 chunk 엣지를 새 그래프에 재적용 (과거 추론 보존) 하고, 이미 처리된 task_id 는 스킵. `task_id` = `SHA1(file_path | node_id | excerpt_hash[:8])` — 파일 시맨틱 내용이 바뀌면 자동으로 새 id 가 되어 재분석.
|
|
364
377
|
|
|
365
|
-
→ 증분 + 멱등 보강. 같은
|
|
378
|
+
→ 증분 + 멱등 보강. 같은 (파일, 내용) 조합을 두 번 분석하지 않고, 누적된 AI 시그널은 매 재스캔을 살아남으며 chunk 분할로 에이전트의 working set 도 작게 유지됩니다.
|
|
366
379
|
|
|
367
380
|
### 직접 CLI 사용
|
|
368
381
|
|
|
369
|
-
스킬 없이 (예: CI) 같은 두
|
|
382
|
+
스킬 없이 (예: CI) 같은 두 명령을 직접 운영할 수 있습니다 — `results/chunk_NNN.jsonl` 파일들을 본인이 채우면 됩니다:
|
|
370
383
|
|
|
371
384
|
```bash
|
|
372
385
|
codebeacon scan .
|
|
373
|
-
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50
|
|
386
|
+
codebeacon semantic-prepare --dir .codebeacon --max-tasks 50 --chunk-size 10
|
|
374
387
|
|
|
375
|
-
#
|
|
388
|
+
# .codebeacon/semantic/pending/chunk_001.jsonl ... 이 생성됨.
|
|
389
|
+
# 각 pending chunk 에 대해 같은 이름의 results/chunk_NNN.jsonl 을 작성. 각 라인:
|
|
376
390
|
# {"task_id":"...", "source_node_id":"...", "edges":[
|
|
377
391
|
# {"target_name":"UserService","relation":"references","confidence_score":0.7}
|
|
378
392
|
# ]}
|