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.
Files changed (128) hide show
  1. {codebeacon-0.3.3 → codebeacon-0.5.0}/PKG-INFO +37 -21
  2. {codebeacon-0.3.3 → codebeacon-0.5.0}/README.de.md +27 -17
  3. {codebeacon-0.3.3 → codebeacon-0.5.0}/README.es.md +27 -17
  4. {codebeacon-0.3.3 → codebeacon-0.5.0}/README.fr.md +27 -17
  5. {codebeacon-0.3.3 → codebeacon-0.5.0}/README.ja.md +26 -18
  6. {codebeacon-0.3.3 → codebeacon-0.5.0}/README.ko.md +35 -21
  7. {codebeacon-0.3.3 → codebeacon-0.5.0}/README.md +36 -20
  8. {codebeacon-0.3.3 → codebeacon-0.5.0}/README.pt-BR.md +27 -17
  9. {codebeacon-0.3.3 → codebeacon-0.5.0}/README.zh-CN.md +24 -18
  10. codebeacon-0.5.0/codebeacon/__init__.py +1 -0
  11. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/cli.py +93 -7
  12. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/discover/scanner.py +53 -0
  13. codebeacon-0.5.0/codebeacon/knowledge/__init__.py +16 -0
  14. codebeacon-0.5.0/codebeacon/knowledge/generator.py +513 -0
  15. codebeacon-0.5.0/codebeacon/semantic_pipeline.py +913 -0
  16. codebeacon-0.5.0/codebeacon/skill/SKILL.md +313 -0
  17. {codebeacon-0.3.3 → codebeacon-0.5.0}/pyproject.toml +1 -1
  18. codebeacon-0.5.0/tests/test_cli_dispatch.py +43 -0
  19. codebeacon-0.5.0/tests/test_knowledge.py +163 -0
  20. codebeacon-0.5.0/tests/test_scanner_sensitive.py +79 -0
  21. codebeacon-0.5.0/tests/test_semantic.py +191 -0
  22. codebeacon-0.5.0/tests/test_semantic_hardening.py +117 -0
  23. codebeacon-0.3.3/codebeacon/__init__.py +0 -1
  24. codebeacon-0.3.3/codebeacon/semantic_pipeline.py +0 -457
  25. codebeacon-0.3.3/codebeacon/skill/SKILL.md +0 -190
  26. {codebeacon-0.3.3 → codebeacon-0.5.0}/.cursorrules +0 -0
  27. {codebeacon-0.3.3 → codebeacon-0.5.0}/.github/CODEOWNERS +0 -0
  28. {codebeacon-0.3.3 → codebeacon-0.5.0}/.github/dependabot.yml +0 -0
  29. {codebeacon-0.3.3 → codebeacon-0.5.0}/.github/workflows/ci.yml +0 -0
  30. {codebeacon-0.3.3 → codebeacon-0.5.0}/.github/workflows/release.yml +0 -0
  31. {codebeacon-0.3.3 → codebeacon-0.5.0}/.gitignore +0 -0
  32. {codebeacon-0.3.3 → codebeacon-0.5.0}/AGENTS.md +0 -0
  33. {codebeacon-0.3.3 → codebeacon-0.5.0}/CLAUDE.md +0 -0
  34. {codebeacon-0.3.3 → codebeacon-0.5.0}/LICENSE +0 -0
  35. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/__main__.py +0 -0
  36. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/cache.py +0 -0
  37. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/common/__init__.py +0 -0
  38. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/common/filters.py +0 -0
  39. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/common/safety.py +0 -0
  40. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/common/symbols.py +0 -0
  41. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/common/types.py +0 -0
  42. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/config.py +0 -0
  43. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/contextmap/__init__.py +0 -0
  44. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/contextmap/generator.py +0 -0
  45. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/discover/__init__.py +0 -0
  46. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/discover/detector.py +0 -0
  47. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/discover/ignore.py +0 -0
  48. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/__init__.py +0 -0
  49. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/callflow_html.py +0 -0
  50. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/hooks.py +0 -0
  51. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/mcp.py +0 -0
  52. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/merge.py +0 -0
  53. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/obsidian.py +0 -0
  54. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/export/tree_html.py +0 -0
  55. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/__init__.py +0 -0
  56. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/base.py +0 -0
  57. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/components.py +0 -0
  58. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/dependencies.py +0 -0
  59. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/entities.py +0 -0
  60. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/README.md +0 -0
  61. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/actix.scm +0 -0
  62. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/angular.scm +0 -0
  63. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/aspnet.scm +0 -0
  64. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/django.scm +0 -0
  65. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/express.scm +0 -0
  66. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/fastapi.scm +0 -0
  67. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/flask.scm +0 -0
  68. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/gin.scm +0 -0
  69. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/ktor.scm +0 -0
  70. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/laravel.scm +0 -0
  71. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/nestjs.scm +0 -0
  72. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/rails.scm +0 -0
  73. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/react.scm +0 -0
  74. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/spring_boot.scm +0 -0
  75. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/svelte.scm +0 -0
  76. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/tauri.scm +0 -0
  77. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/vapor.scm +0 -0
  78. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/queries/vue.scm +0 -0
  79. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/routes.py +0 -0
  80. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/semantic.py +0 -0
  81. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/extract/services.py +0 -0
  82. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/__init__.py +0 -0
  83. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/analyze.py +0 -0
  84. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/build.py +0 -0
  85. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/cluster.py +0 -0
  86. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/enrich.py +0 -0
  87. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/graph/write.py +0 -0
  88. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/plugins/__init__.py +0 -0
  89. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/plugins/githooks.py +0 -0
  90. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/plugins/skills.py +0 -0
  91. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/wave.py +0 -0
  92. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/wiki/__init__.py +0 -0
  93. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/wiki/generator.py +0 -0
  94. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/wiki/index.py +0 -0
  95. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon/wiki/templates.py +0 -0
  96. {codebeacon-0.3.3 → codebeacon-0.5.0}/codebeacon.yaml.example +0 -0
  97. {codebeacon-0.3.3 → codebeacon-0.5.0}/docs/TRANSLATION_STATUS.md +0 -0
  98. {codebeacon-0.3.3 → codebeacon-0.5.0}/public-plan.md +0 -0
  99. {codebeacon-0.3.3 → codebeacon-0.5.0}/skill/install.py +0 -0
  100. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/__init__.py +0 -0
  101. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/conftest.py +0 -0
  102. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/actix/main.rs +0 -0
  103. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/angular/app.component.ts +0 -0
  104. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/aspnet/UserController.cs +0 -0
  105. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/django/views.py +0 -0
  106. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/express/userRouter.js +0 -0
  107. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/fastapi/main.py +0 -0
  108. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/flask/app.py +0 -0
  109. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/gin/main.go +0 -0
  110. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/ktor/UserRoutes.kt +0 -0
  111. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/laravel/UserController.php +0 -0
  112. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/nestjs/user.controller.ts +0 -0
  113. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/rails/users_controller.rb +0 -0
  114. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/react/UserPage.tsx +0 -0
  115. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/spring_boot/UserController.java +0 -0
  116. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/sveltekit/+page.svelte +0 -0
  117. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/vapor/routes.swift +0 -0
  118. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/fixtures/vue/UserList.vue +0 -0
  119. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_discover.py +0 -0
  120. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_entities.py +0 -0
  121. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_filters.py +0 -0
  122. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_graph.py +0 -0
  123. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_plugins.py +0 -0
  124. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_resolve.py +0 -0
  125. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_routes.py +0 -0
  126. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_safety_and_writes.py +0 -0
  127. {codebeacon-0.3.3 → codebeacon-0.5.0}/tests/test_services.py +0 -0
  128. {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.3
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
- original.jsonl durable archive of every applied AI-semantic result
189
- (skipped on rescans, never re-emitted as a task)
190
- semantic-tasks.jsonl ← pending AI-semantic batch (present only between
191
- `semantic-prepare` and `semantic-apply`)
192
- semantic-results.jsonl ← agent-written results (same lifecycle as above)
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 semantic archive onto beacon.json, emit fresh tasks
361
- # for NEW candidates only (god-node folders + unresolved targets);
362
- # writes .codebeacon/semantic-tasks.jsonl
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
- # read .codebeacon/semantic-results.jsonl, merge as INFERRED
365
- # references edges, append to .codebeacon/semantic/original.jsonl
366
- # archive, clear pending files, regenerate wiki/obsidian/context map
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` re-applies the prior archive to the fresh graph, then writes `.codebeacon/semantic-tasks.jsonl` containing **only new candidates** files that score high (unresolved-target edges + god-node folders) and have never been processed before.
402
- 3. The skill loops over the tasks file. For each line, the agent (using its current model) reads the `excerpt` field and returns inferred references inline. Results are written to `.codebeacon/semantic-results.jsonl`.
403
- 4. `codebeacon semantic-apply` merges the results as `INFERRED references` edges into `beacon.json`, **appends them to `.codebeacon/semantic/original.jsonl`** (the durable archive), clears the pending tasks/results files, and regenerates wiki + obsidian + context map.
404
- 5. Next scan: `semantic-prepare` rehydrates the archive onto the freshly built graph (so historical inferences don't disappear) and emits a tasks file with **only newly discovered candidates** since the last archive. Already-processed files are skipped via `task_id` (SHA1 of `file_path|node_id`).
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-analyzes the same file twice, and accumulated AI signal survives every rescan.
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 `semantic-results.jsonl`:
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
- # now write .codebeacon/semantic-results.jsonl yourself; each line is:
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
- # spielt vorhandenes Archiv wieder auf das frische
383
- # beacon.json an und gibt Aufgaben nur für NEUE
384
- # Kandidaten aus (god-node-Ordner + unaufgelöste Ziele)
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
- # mergt .codebeacon/semantic-results.jsonl als
387
- # INFERRED references-Kanten in beacon.json,
388
- # hängt an .codebeacon/semantic/original.jsonl an,
389
- # räumt Pending-Dateien auf und regeneriert
390
- # wiki/obsidian/Kontextkarte
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` spielt das frühere Archiv wieder auf den frischen Graphen ein und schreibt dann `.codebeacon/semantic-tasks.jsonl` mit **nur neuen Kandidaten** hochbewertete Dateien (Kanten zu nicht aufgelösten Zielen + god-node-Ordner), die noch nie verarbeitet wurden.
417
- 3. Der Skill iteriert die Tasks-Datei. Für jede Zeile liest der Agent (mit dem Modell der aktuellen Sitzung) das `excerpt`-Feld und liefert inline gefolgerte References. Ergebnisse werden in `.codebeacon/semantic-results.jsonl` geschrieben.
418
- 4. `codebeacon semantic-apply` mergt die Ergebnisse als `INFERRED references`-Kanten in `beacon.json`, **hängt sie an `.codebeacon/semantic/original.jsonl`** (das dauerhafte Archiv) an, räumt die Pending-Dateien auf und regeneriert Wiki + Obsidian + Kontextkarte.
419
- 5. Beim nächsten Scan: `semantic-prepare` rehydriert das Archiv auf den frisch gebauten Graphen (damit historische Inferenzen nicht durch ein erneutes Scannen verschwinden) und gibt eine Tasks-Datei mit **nur den seit dem letzten Archiv neu entdeckten Kandidaten** aus. Bereits verarbeitete Dateien werden per `task_id` (SHA1 von `file_path|node_id`) übersprungen.
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
- Das ergibt inkrementelle, idempotente Anreicherung: der Agent analysiert dieselbe Datei nie zweimal, und das angesammelte AI-Signal überlebt jeden Rescan.
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 Ihr eigenes `semantic-results.jsonl` liefern:
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
- # jetzt selbst .codebeacon/semantic-results.jsonl schreiben; jede Zeile:
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 el archivo histórico sobre el nuevo beacon.json
381
- # y emite tareas solo para candidatos NUEVOS
382
- # (carpetas god-node + objetivos no resueltos)
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
- # fusiona .codebeacon/semantic-results.jsonl como
385
- # aristas INFERRED references en beacon.json,
386
- # añade al archivo .codebeacon/semantic/original.jsonl,
387
- # limpia los archivos pendientes y regenera
388
- # wiki/obsidian/mapa de contexto
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` reaplica el archivo histórico sobre el grafo nuevo y luego escribe `.codebeacon/semantic-tasks.jsonl` con **sólo los candidatos nuevos** archivos con puntuación alta (aristas a objetivos no resueltos + carpetas god-node) que nunca se han procesado.
415
- 3. El skill itera sobre el archivo de tareas. Por cada línea, el agente (usando el modelo de su sesión actual) lee el campo `excerpt` y devuelve referencias inferidas en línea. Los resultados se escriben en `.codebeacon/semantic-results.jsonl`.
416
- 4. `codebeacon semantic-apply` mezcla los resultados como aristas `INFERRED references` en `beacon.json`, **los anexa a `.codebeacon/semantic/original.jsonl`** (el archivo durable), limpia los ficheros pendientes y regenera wiki + obsidian + mapa de contexto.
417
- 5. En la próxima ejecución: `semantic-prepare` rehidrata el archivo sobre el grafo recién construido (para que las inferencias históricas no desaparezcan en una nueva exploración) y emite un fichero de tareas con **sólo candidatos nuevos** desde la última actualización del archivo. Los archivos ya procesados se omiten vía `task_id` (SHA1 de `file_path|node_id`).
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
- Esto da enriquecimiento incremental e idempotente: el agente nunca reanaliza el mismo archivo dos veces, y la señal AI acumulada sobrevive a cada re-escaneo.
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 suministrar tu propio `semantic-results.jsonl`:
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
- # ahora escribe tú mismo .codebeacon/semantic-results.jsonl; cada línea:
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
- # réapplique l'archive existante au beacon.json frais
382
- # puis n'émet de tâches que pour les candidats NEUFS
383
- # (dossiers god-node + cibles non résolues)
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
- # fusionne .codebeacon/semantic-results.jsonl comme
386
- # arêtes INFERRED references dans beacon.json,
387
- # ajoute à l'archive .codebeacon/semantic/original.jsonl,
388
- # nettoie les fichiers en attente et régénère
389
- # wiki/obsidian/carte de contexte
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` réapplique l'archive précédente au graphe frais puis écrit `.codebeacon/semantic-tasks.jsonl` contenant **uniquement les nouveaux candidats** fichiers à score élevé (arêtes vers cibles non résolues + dossiers god-node) qui n'ont jamais été traités.
416
- 3. Le skill itère sur le fichier de tâches. Pour chaque ligne, l'agent (en utilisant le modèle de sa session courante) lit le champ `excerpt` et renvoie inline les références inférées. Les résultats sont écrits dans `.codebeacon/semantic-results.jsonl`.
417
- 4. `codebeacon semantic-apply` fusionne les résultats en arêtes `INFERRED references` dans `beacon.json`, **les ajoute à `.codebeacon/semantic/original.jsonl`** (l'archive durable), nettoie les fichiers en attente et régénère wiki + obsidian + carte de contexte.
418
- 5. Au prochain scan : `semantic-prepare` réhydrate l'archive sur le graphe fraîchement construit (pour que les inférences historiques ne disparaissent pas lors d'un re-scan) et n'émet dans le fichier de tâches que **les candidats nouvellement découverts** depuis la dernière mise à jour de l'archive. Les fichiers déjà traités sont sautés via `task_id` (SHA1 de `file_path|node_id`).
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'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
- Vous obtenez ainsi un enrichissement incrémental et idempotent : l'agent ne réanalyse jamais deux fois le même fichier et le signal AI accumulé survit à chaque re-scan.
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 votre propre `semantic-results.jsonl` :
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
- # écrivez vous-même .codebeacon/semantic-results.jsonl ; chaque ligne :
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
- # 過去のアーカイブを fresh beacon.json に再適用後、
290
- # 未処理の NEW 候補 (god-node フォルダ + unresolved
291
- # ターゲット) のみを .codebeacon/semantic-tasks.jsonl
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-results.jsonl を INFERRED
295
- # references エッジとして beacon.json に統合し、
296
- # .codebeacon/semantic/original.jsonl アーカイブに
297
- # 追記、pending ファイルを掃除し、
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` が過去のアーカイブを新しいグラフに再適用後、**新しい候補のみ**を含む `.codebeacon/semantic-tasks.jsonl` を書き出します スコアが高い(unresolved ターゲットエッジ + god-node フォルダ)かつ一度も処理されたことのないファイル。
326
- 3. スキルが tasks ファイルを順次処理。各行についてエージェント(現在セッションのモデル)が `excerpt` フィールドを読み、推論された references をインラインで返します。結果は `.codebeacon/semantic-results.jsonl` に書き込まれます。
327
- 4. `codebeacon semantic-apply` が結果を `INFERRED references` エッジとして `beacon.json` にマージし、**`.codebeacon/semantic/original.jsonl`**(永続アーカイブ)に追記、pending ファイルを掃除、wiki + obsidian + コンテキストマップを再生成します。
328
- 5. 次回スキャン時:`semantic-prepare` がアーカイブを新グラフに再適用(再スキャンで過去の推論が失われないように)し、最後のアーカイブ以降の**新しく発見された候補のみ**を tasks ファイルに含めます。処理済みファイルは `task_id`(SHA1 of `file_path|node_id`)でスキップ。
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
- 増分かつ冪等の補強。同じファイルを二度分析せず、蓄積された AI シグナルは毎回の再スキャンを生き延びます。
337
+ 増分かつ冪等の補強。同じ (ファイル, 内容) を二度分析せず、蓄積された AI シグナルは毎回の再スキャンを生き延び、chunk 分割でエージェントの作業セットも小さく保てます。
331
338
 
332
339
  ### 直接 CLI 使用
333
340
 
334
- スキルを介さず(例:CI)に同じ 2 コマンドで手動運用し、`semantic-results.jsonl` を自分で書くこともできます:
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
- # 次に .codebeacon/semantic-results.jsonl を自分で書く;各行:
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
- original.jsonl 적용된 모든 AI-시맨틱 결과의 영구 아카이브
147
- (재스캔 시 스킵됨, 다시 task 로 발행되지 않음)
148
- semantic-tasks.jsonl ← pending AI-시맨틱 배치
149
- (`semantic-prepare` `semantic-apply` 사이에만 존재)
150
- semantic-results.jsonl ← 에이전트가 작성한 결과 (동일 라이프사이클)
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
- # 시맨틱 아카이브를 fresh beacon.json에 재적용 후,
319
- # 아카이브에 없는 NEW 후보(god-node 폴더 + unresolved 타겟)
320
- # 골라 .codebeacon/semantic-tasks.jsonl 작성
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-results.jsonl 을 읽어
323
- # INFERRED references 엣지로 beacon.json 에 머지,
324
- # .codebeacon/semantic/original.jsonl 아카이브에 적재,
325
- # pending 파일 정리, wiki/obsidian/컨텍스트 맵 재생성
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` 가 이전 아카이브를 새 그래프에 재적용한 뒤, **신규 후보만** 담긴 `.codebeacon/semantic-tasks.jsonl` 작성 점수가 높은 파일 (unresolved 타겟 엣지 + god-node 폴더) 번도 처리된 없는 것.
361
- 3. 스킬이 tasks 파일을 순회합니다.라인마다 에이전트(현재 세션의 모델)가 `excerpt` 필드를 읽고 추론된 references 를 인라인으로 반환. 결과는 `.codebeacon/semantic-results.jsonl` 기록.
362
- 4. `codebeacon semantic-apply` 가 결과를 `INFERRED references` 엣지로 `beacon.json` 에 머지하고, **`.codebeacon/semantic/original.jsonl`** (영구 아카이브) append, pending 파일 정리, wiki + obsidian + 컨텍스트 맵 재생성.
363
- 5. 다음 스캔: `semantic-prepare` 가 아카이브를 새 그래프에 재적용 (재스캔으로 인해 과거 추론이 사라지지 않도록) 뒤, 마지막 아카이브 이후 **새로 발견된 후보만** tasks 파일에 담음. 이미 처리된 파일은 `task_id` (SHA1(`file_path|node_id`)) 스킵.
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
- → 증분 + 멱등 보강. 같은 파일을 두 번 분석하지 않고, 누적된 AI 시그널은 매 재스캔을 살아남습니다.
378
+ → 증분 + 멱등 보강. 같은 (파일, 내용) 조합을 두 번 분석하지 않고, 누적된 AI 시그널은 매 재스캔을 살아남으며 chunk 분할로 에이전트의 working set 도 작게 유지됩니다.
366
379
 
367
380
  ### 직접 CLI 사용
368
381
 
369
- 스킬 없이 (예: CI) 같은 두 명령으로 직접 운영하고 `semantic-results.jsonl` 본인이 채울 수 있습니다:
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
- # 이제 .codebeacon/semantic-results.jsonl 직접 작성; 각 라인:
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
  # ]}