code-atlas-mcp 0.2.0.dev1__tar.gz → 0.4.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 (168) hide show
  1. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.atlasignore +4 -0
  2. code_atlas_mcp-0.4.0/.claude/commands/dream-mode.md +97 -0
  3. code_atlas_mcp-0.4.0/.claude/rules/knowledge.md +30 -0
  4. code_atlas_mcp-0.4.0/.gitattributes +84 -0
  5. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/workflows/release.yml +19 -7
  6. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.gitignore +3 -0
  7. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/CHANGELOG.md +179 -4
  8. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/CLAUDE.md +11 -5
  9. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/PKG-INFO +36 -33
  10. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/README.md +32 -32
  11. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docker-compose.yml +56 -0
  12. code_atlas_mcp-0.4.0/docs/SCHEMA.md +87 -0
  13. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0004-event-driven-tiered-pipeline.md +34 -36
  14. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0005-deployment-process-model.md +8 -14
  15. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0006-pure-python-tree-sitter.md +4 -4
  16. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0007-qualified-name-strategy.md +3 -1
  17. code_atlas_mcp-0.4.0/docs/adr/0008-cross-file-relationship-resolution.md +174 -0
  18. code_atlas_mcp-0.4.0/docs/adr/0009-event-pipeline-durability-contract.md +169 -0
  19. code_atlas_mcp-0.4.0/docs/adr/0010-integration-test-isolation.md +122 -0
  20. code_atlas_mcp-0.4.0/docs/adr/0011-note-vault-schema.md +105 -0
  21. code_atlas_mcp-0.4.0/docs/adr/README.md +43 -0
  22. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/architecture.md +35 -39
  23. code_atlas_mcp-0.4.0/docs/benchmarks.md +67 -0
  24. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/guides/repo-guidelines.md +1 -1
  25. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/pyproject.toml +6 -4
  26. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/ruff.toml +6 -0
  27. code_atlas_mcp-0.4.0/scripts/profile_index.py +539 -0
  28. code_atlas_mcp-0.4.0/scripts/profile_query.py +546 -0
  29. code_atlas_mcp-0.4.0/src/code_atlas/__init__.py +8 -0
  30. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/cli.py +262 -41
  31. code_atlas_mcp-0.4.0/src/code_atlas/dream.py +358 -0
  32. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/events.py +117 -29
  33. code_atlas_mcp-0.4.0/src/code_atlas/graph/client.py +2915 -0
  34. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/indexing/__init__.py +4 -6
  35. code_atlas_mcp-0.4.0/src/code_atlas/indexing/consumers.py +1169 -0
  36. code_atlas_mcp-0.4.0/src/code_atlas/indexing/daemon.py +349 -0
  37. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/indexing/orchestrator.py +580 -176
  38. code_atlas_mcp-0.4.0/src/code_atlas/indexing/watcher.py +303 -0
  39. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/ast.py +11 -1
  40. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/__init__.py +26 -11
  41. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/cpp.py +151 -31
  42. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/go.py +261 -49
  43. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/jvm.py +161 -18
  44. code_atlas_mcp-0.4.0/src/code_atlas/parsing/languages/markdown.py +768 -0
  45. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/php.py +38 -12
  46. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/python.py +119 -46
  47. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/ruby.py +87 -4
  48. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/rust.py +99 -18
  49. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/typescript.py +97 -26
  50. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/schema.py +42 -2
  51. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/search/__init__.py +2 -0
  52. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/search/embeddings.py +104 -11
  53. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/search/engine.py +172 -38
  54. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/search/guidance.py +46 -7
  55. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/server/analysis.py +162 -62
  56. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/server/health.py +42 -2
  57. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/server/mcp.py +341 -108
  58. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/settings.py +135 -23
  59. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/conftest.py +1 -1
  60. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/conftest.py +107 -24
  61. code_atlas_mcp-0.4.0/tests/integration/graph/test_client.py +3387 -0
  62. code_atlas_mcp-0.4.0/tests/integration/indexing/test_consumers.py +1218 -0
  63. code_atlas_mcp-0.4.0/tests/integration/indexing/test_daemon.py +244 -0
  64. code_atlas_mcp-0.4.0/tests/integration/indexing/test_live_update.py +184 -0
  65. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/indexing/test_monorepo.py +56 -0
  66. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/indexing/test_orchestrator.py +198 -2
  67. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/indexing/test_watcher.py +9 -2
  68. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/server/test_mcp.py +202 -0
  69. code_atlas_mcp-0.4.0/tests/integration/test_dream.py +81 -0
  70. code_atlas_mcp-0.4.0/tests/integration/test_infra_isolation.py +69 -0
  71. code_atlas_mcp-0.4.0/tests/unit/graph/test_client.py +112 -0
  72. code_atlas_mcp-0.4.0/tests/unit/indexing/test_consumers.py +407 -0
  73. code_atlas_mcp-0.4.0/tests/unit/indexing/test_daemon.py +470 -0
  74. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/indexing/test_monorepo.py +14 -8
  75. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/indexing/test_orchestrator.py +287 -0
  76. code_atlas_mcp-0.4.0/tests/unit/indexing/test_watcher.py +527 -0
  77. code_atlas_mcp-0.4.0/tests/unit/parsing/test_ast.py +88 -0
  78. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_cpp.py +291 -2
  79. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_go.py +235 -3
  80. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_jvm.py +291 -6
  81. code_atlas_mcp-0.4.0/tests/unit/parsing/test_languages_init.py +71 -0
  82. code_atlas_mcp-0.4.0/tests/unit/parsing/test_markdown.py +342 -0
  83. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_php.py +120 -0
  84. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_python.py +353 -16
  85. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_ruby.py +117 -0
  86. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_rust.py +280 -3
  87. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_typescript.py +172 -0
  88. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/search/test_embeddings.py +41 -33
  89. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/search/test_engine.py +204 -0
  90. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/search/test_guidance.py +47 -0
  91. code_atlas_mcp-0.4.0/tests/unit/server/__init__.py +0 -0
  92. code_atlas_mcp-0.4.0/tests/unit/server/test_analysis.py +281 -0
  93. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/server/test_health.py +152 -0
  94. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/server/test_mcp.py +368 -1
  95. code_atlas_mcp-0.4.0/tests/unit/test_cli.py +436 -0
  96. code_atlas_mcp-0.4.0/tests/unit/test_dream.py +191 -0
  97. code_atlas_mcp-0.4.0/tests/unit/test_events.py +189 -0
  98. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/test_schema.py +25 -1
  99. code_atlas_mcp-0.4.0/tests/unit/test_settings.py +170 -0
  100. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/uv.lock +47 -1
  101. code_atlas_mcp-0.2.0.dev1/docs/adr/README.md +0 -38
  102. code_atlas_mcp-0.2.0.dev1/docs/benchmarks.md +0 -45
  103. code_atlas_mcp-0.2.0.dev1/src/code_atlas/__init__.py +0 -5
  104. code_atlas_mcp-0.2.0.dev1/src/code_atlas/graph/client.py +0 -1674
  105. code_atlas_mcp-0.2.0.dev1/src/code_atlas/indexing/consumers.py +0 -572
  106. code_atlas_mcp-0.2.0.dev1/src/code_atlas/indexing/daemon.py +0 -156
  107. code_atlas_mcp-0.2.0.dev1/src/code_atlas/indexing/watcher.py +0 -200
  108. code_atlas_mcp-0.2.0.dev1/src/code_atlas/parsing/languages/markdown.py +0 -412
  109. code_atlas_mcp-0.2.0.dev1/tests/integration/graph/test_client.py +0 -1492
  110. code_atlas_mcp-0.2.0.dev1/tests/integration/indexing/test_consumers.py +0 -140
  111. code_atlas_mcp-0.2.0.dev1/tests/unit/indexing/test_watcher.py +0 -227
  112. code_atlas_mcp-0.2.0.dev1/tests/unit/test_cli.py +0 -219
  113. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.dockerignore +0 -0
  114. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.env.dist +0 -0
  115. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/FUNDING.yml +0 -0
  116. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  117. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  118. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  119. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  120. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/dependabot.yml +0 -0
  121. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/labels.yml +0 -0
  122. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/workflows/ci.yml +0 -0
  123. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/workflows/labels.yml +0 -0
  124. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/workflows/security.yml +0 -0
  125. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.pre-commit-config.yaml +0 -0
  126. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.prettierignore +0 -0
  127. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.prettierrc.yaml +0 -0
  128. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/CONTRIBUTING.md +0 -0
  129. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/Dockerfile +0 -0
  130. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/LICENSE +0 -0
  131. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/agent.md +0 -0
  132. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/atlas.toml +0 -0
  133. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0000-template.md +0 -0
  134. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0001-memgraph-as-database.md +0 -0
  135. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0002-build-from-scratch.md +0 -0
  136. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0003-python-rust-hybrid.md +0 -0
  137. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/guides/adding-languages.md +0 -0
  138. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/guides/configuration.md +0 -0
  139. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/guides/usage.md +0 -0
  140. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/landscape.md +0 -0
  141. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/graph/__init__.py +0 -0
  142. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/__init__.py +0 -0
  143. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/detectors.py +0 -0
  144. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/server/__init__.py +0 -0
  145. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/telemetry.py +0 -0
  146. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/__init__.py +0 -0
  147. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/__init__.py +0 -0
  148. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/conftest.py +0 -0
  149. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/test_bench_concurrent.py +0 -0
  150. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/test_bench_indexing.py +0 -0
  151. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/test_bench_memory.py +0 -0
  152. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/test_bench_parser.py +0 -0
  153. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/test_bench_query.py +0 -0
  154. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/__init__.py +0 -0
  155. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/graph/__init__.py +0 -0
  156. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/indexing/__init__.py +0 -0
  157. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/search/__init__.py +0 -0
  158. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/search/test_embeddings.py +0 -0
  159. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/search/test_engine.py +0 -0
  160. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/server/__init__.py +0 -0
  161. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/__init__.py +0 -0
  162. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/conftest.py +0 -0
  163. {code_atlas_mcp-0.2.0.dev1/tests/unit/indexing → code_atlas_mcp-0.4.0/tests/unit/graph}/__init__.py +0 -0
  164. {code_atlas_mcp-0.2.0.dev1/tests/unit/parsing → code_atlas_mcp-0.4.0/tests/unit/indexing}/__init__.py +0 -0
  165. {code_atlas_mcp-0.2.0.dev1/tests/unit/search → code_atlas_mcp-0.4.0/tests/unit/parsing}/__init__.py +0 -0
  166. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_detectors.py +0 -0
  167. {code_atlas_mcp-0.2.0.dev1/tests/unit/server → code_atlas_mcp-0.4.0/tests/unit/search}/__init__.py +0 -0
  168. {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/test_telemetry.py +0 -0
@@ -17,3 +17,7 @@ migrations/
17
17
  testdata/
18
18
  fixtures/
19
19
  *.sql
20
+
21
+ # Generated knowledge-vault landing page (atlas dream) — derived, re-rendered
22
+ # every run; indexing it would just be indexing yesterday's dream report.
23
+ docs/HOME.md
@@ -0,0 +1,97 @@
1
+ ---
2
+ description:
3
+ Dream mode (code-atlas edition) — consolidate drafts across the repo inbox, the harness memory dir, and the global
4
+ vault, using atlas dream's deterministic report.
5
+ ---
6
+
7
+ # Dream Mode — Code Atlas Edition
8
+
9
+ Project-local override of the global `dream-mode` command (per that command's own "extend, don't duplicate" convention).
10
+ Everything in the global command still applies — philosophy, disposition table, KEEP/MERGE/PROMOTE/DROP semantics,
11
+ output format. This file only changes **where the inventory comes from** and adds the knowledge-vault-specific promotion
12
+ venues and archive convention that code-atlas's unified graph makes possible.
13
+
14
+ ## Why this repo needs its own version
15
+
16
+ In code-atlas, repo-inbox drafts (`docs/inbox/`), the harness memory dir, and (if configured) the global vault are **all
17
+ Notes in the same Memgraph graph** — one `atlas dream` (or the `knowledge_health` MCP tool) call produces a single
18
+ deterministic report spanning all three, instead of three separate manual audits. Capture-time routing is best-effort
19
+ (write wherever's cheapest mid-session); this command is the authoritative consolidation pass across all of them, same
20
+ as the global command's philosophy — just with a graph-backed inventory instead of a directory listing.
21
+
22
+ ## 1. Inventory (replaces the global command's step 1)
23
+
24
+ - Run `atlas dream --json` (or call the `knowledge_health` MCP tool) instead of manually listing memory-dir files. It
25
+ returns, across every configured vault (this repo's `docs/`, the harness memory dir, and any
26
+ `[knowledge] extra_vaults`):
27
+ - `inbox_count` / `inbox_paths` — draft notes awaiting disposition
28
+ - `orphan_notes` — notes with no `[[wikilinks]]` in or out (disconnected from the note graph)
29
+ - `dangling_links` — `[[wikilink]]`/`derived_from`/`supersedes` references whose target doesn't exist (typo'd slug, or
30
+ the target was deleted/renamed)
31
+ - `duplicate_ids` — two files in the same vault resolved to the same note uid (only one survives in the graph; the
32
+ report is the only way to see the collision)
33
+ - `similar_pairs` — high-embedding-similarity note pairs (candidates for MERGE)
34
+ - `promotion_candidates` — similar pairs that span _different_ projects (repo-specific finding that recurs elsewhere →
35
+ candidate for the global vault)
36
+ - `memory_index_issues` — MEMORY.md entries with no matching file, or files not indexed
37
+ - Still read `MEMORY.md` directly for the human-facing index (byte size, entry count) — the report's
38
+ `memory_index_issues` only flags _consistency_, not size.
39
+ - List promotion venues exactly as the global command does (skills, rules, CLAUDE.md, inline comments, docs/) **plus**:
40
+ - **`docs/notes/` / `docs/decisions/`** — durable zettels in this repo's own vault (`kind: note` / `kind: decision`
41
+ frontmatter, per `docs/SCHEMA.md`)
42
+ - **The global vault** — cross-project generalizations (`promotion_candidates` above is the mechanical signal for this
43
+ venue)
44
+ - Do not modify anything yet.
45
+
46
+ ## 2. Classify
47
+
48
+ Same disposition table as the global command (KEEP / MERGE / PROMOTE / CLAUDE.md / inline comment / docs / DROP), with
49
+ two additions specific to the graph-unified vault:
50
+
51
+ | Disposition | When | Action at execute step |
52
+ | -------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
53
+ | **PROMOTE → global vault** | A `promotion_candidates` hit, or a finding with no repo-specific anchor that clearly generalizes. | `git mv` the file to the global vault's path; add `promoted_from: <old-uid>` to frontmatter so provenance survives the move. |
54
+ | **DROP → archive stub** | Content worth a provenance pointer but not worth keeping in full (superseded decision, stale draft with historical value). | See §4's archive-stub convention below — this is a refinement of the global command's plain DROP, available because the graph can query `DERIVED_FROM`/`SUPERSEDES` afterward. |
55
+
56
+ Use `duplicate_ids` and `dangling_links` as blocking findings — resolve them before proceeding to promotions, since a
57
+ duplicate-id file will silently overwrite the other on next index regardless of what you decide for either one
58
+ individually.
59
+
60
+ ## 3. Plan and confirm
61
+
62
+ Same as the global command — present the disposition table, wait for approval. Extend the table's venue column with
63
+ `global vault` / `archive stub` where applicable.
64
+
65
+ ## 4. Execute
66
+
67
+ Same ordering as the global command (promotions → merges → deletions → refresh index → backlinks), plus:
68
+
69
+ - **Archive-stub convention** (instead of outright deletion for anything with lasting reference value): reduce the file
70
+ to a 2-3 line summary, set `archived: true` in frontmatter, and `git mv` it to an `archive/` subdirectory of its
71
+ vault. Point the stub at the commit hash where the full content last existed (`git log --oneline -1 -- <path>` before
72
+ the edit). The stub stays indexed (still searchable, still a real Note) — only the full content leaves the live vault.
73
+ Never do this for a note still referenced by live `DERIVED_FROM`/`SUPERSEDES` edges without first redirecting them.
74
+ - **Provenance on MERGE/PROMOTE**: write `derived_from: [<source-uid>, ...]` (and `supersedes: [<uid>]` when the new
75
+ note fully replaces an old one) in the survivor's frontmatter — these become real `DERIVED_FROM`/`SUPERSEDES` graph
76
+ edges on next index, so provenance is queryable (`MATCH (n:Note)-[:DERIVED_FROM]->(m) ...`), not just prose.
77
+ - **After execution, re-run `atlas dream`** (not just the manual checks the global command lists) to confirm
78
+ `duplicate_ids`/`dangling_links` actually cleared and the promoted/ merged notes appear where expected — the report is
79
+ cheap and catches mistakes the manual grep-based verification in the global command's step 5 can miss (e.g. a
80
+ `derived_from` slug typo that silently fails to resolve).
81
+
82
+ ## 5. Verify
83
+
84
+ Everything in the global command's step 5, plus:
85
+
86
+ - `atlas dream --json` again — `duplicate_ids` and `dangling_links` should be empty (or only contain items explicitly
87
+ deferred, noted as such in the punch list).
88
+ - For each `PROMOTE → global vault` row: confirm the note is indexed under the global vault's project name
89
+ (`atlas status` or `hybrid_search(mode="knowledge")`).
90
+
91
+ ## Output format
92
+
93
+ Same punch list as the global command, plus one line:
94
+
95
+ ```
96
+ Vault findings resolved: <duplicate_ids before>→<after>, <dangling_links before>→<after>
97
+ ```
@@ -0,0 +1,30 @@
1
+ # Knowledge Vault Pointer
2
+
3
+ This repo's `docs/` directory is a knowledge vault indexed into the code-atlas graph alongside the code — a `Note` node
4
+ per frontmattered file, linked to code entities and to each other. Full conventions: `docs/SCHEMA.md`.
5
+
6
+ This file is a stable pointer, not a status digest — it doesn't change as notes are added; look the state up when you
7
+ need it instead of reading it here.
8
+
9
+ ## Finding things
10
+
11
+ - `hybrid_search(query, mode="knowledge")` — ranks notes/docs above code, for why/decision/gotcha-shaped questions.
12
+ `mode="blended"` (default) still includes them, ranked slightly below code. `mode="code"` excludes them.
13
+ - `get_context(uid)` on a code entity returns its linked notes/docs via `DOCUMENTS` edges.
14
+ - Cypher: `Note` nodes have `uid = "{project}:note:{slug}"`, `kind` in `draft|note|decision`, `tags`, `docstring` (full
15
+ body). `LINKS_TO` is the wikilink graph; `DERIVED_FROM`/`SUPERSEDES` are dream-mode provenance.
16
+
17
+ ## Writing things
18
+
19
+ - Quick findings mid-session: drop a frontmattered file in `docs/inbox/` (see SCHEMA.md for the frontmatter shape) — or
20
+ the Claude Code memory dir if it's a private/machine-local observation, not something the repo should carry. Both are
21
+ equivalent draft piles; don't agonize over which.
22
+ - A `remember` MCP write tool for this is planned (Phase 2) but not built yet.
23
+ - Durable notes in `docs/notes/`/`docs/decisions/` are produced by dream-mode consolidation only — don't write there
24
+ directly.
25
+
26
+ ## Status
27
+
28
+ Phases 0–1 of the knowledge-convergence architecture are implemented (vault parsing, schema, search integration).
29
+ Capture tooling (`remember`), anchor staleness, and dream-mode consolidation are not built yet — see
30
+ `.tasks/research/2026-07-11-knowledge-convergence-architecture.md` for the full roadmap.
@@ -0,0 +1,84 @@
1
+ # Default
2
+ # ==================
3
+ * text=auto eol=lf
4
+
5
+ # Python Source files
6
+ # =================
7
+ *.pxd text diff=python
8
+ *.py text diff=python
9
+ *.py3 text diff=python
10
+ *.pyw text diff=python
11
+ *.pyx text diff=python
12
+ *.pyz text diff=python
13
+ *.pyi text diff=python
14
+
15
+ # Python Binary files
16
+ # =================
17
+ *.db binary
18
+ *.p binary
19
+ *.pkl binary
20
+ *.pickle binary
21
+ *.pyc binary export-ignore
22
+ *.pyo binary export-ignore
23
+ *.pyd binary
24
+
25
+ # Jupyter notebook
26
+ # =================
27
+ *.ipynb text
28
+
29
+ # ML models
30
+ # =================
31
+ *.h5 filter=lfs diff=lfs merge=lfs -text
32
+ *.onnx filter=lfs diff=lfs merge=lfs -text
33
+ *.model filter=lfs diff=lfs merge=lfs -text
34
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
35
+ *.pb filter=lfs diff=lfs merge=lfs -text
36
+ *.pt filter=lfs diff=lfs merge=lfs -text
37
+ *.pth filter=lfs diff=lfs merge=lfs -text
38
+ pytorch_model.bin filter=lfs diff=lfs merge=lfs -text
39
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
40
+ unigram.json filter=lfs diff=lfs merge=lfs -text
41
+
42
+ # Data files
43
+ # =================
44
+ *.csv filter=lfs diff=lfs merge=lfs -text
45
+ *.tsv filter=lfs diff=lfs merge=lfs -text
46
+ *.parquet filter=lfs diff=lfs merge=lfs
47
+
48
+ # Presentation files
49
+ # =================
50
+ *.pptx filter=lfs diff=lfs merge=lfs -text
51
+ *.word filter=lfs diff=lfs merge=lfs -text
52
+ *.xlsx filter=lfs diff=lfs merge=lfs -text
53
+ *.xls filter=lfs diff=lfs merge=lfs -text
54
+ *.pdf filter=lfs diff=lfs merge=lfs -text
55
+
56
+ # Archives
57
+ # =================
58
+ *.7z filter=lfs diff=lfs merge=lfs -text
59
+ *.br filter=lfs diff=lfs merge=lfs -text
60
+ *.gz filter=lfs diff=lfs merge=lfs -text
61
+ *.tar filter=lfs diff=lfs merge=lfs -text
62
+ *.tgz filter=lfs diff=lfs merge=lfs -text
63
+ *.tar.gz filter=lfs diff=lfs merge=lfs -text
64
+ *.zip filter=lfs diff=lfs merge=lfs -text
65
+ *.rar filter=lfs diff=lfs merge=lfs -text
66
+
67
+ # Image files
68
+ # =================
69
+ *.jpg filter=lfs diff=lfs merge=lfs -text
70
+ *.jpeg filter=lfs diff=lfs merge=lfs -text
71
+ *.png filter=lfs diff=lfs merge=lfs -text
72
+ *.gif filter=lfs diff=lfs merge=lfs -text
73
+ *.webp filter=lfs diff=lfs merge=lfs -text
74
+ *.bmp filter=lfs diff=lfs merge=lfs -text
75
+ *.svg filter=lfs diff=lfs merge=lfs -text
76
+ *.tiff filter=lfs diff=lfs merge=lfs -text
77
+
78
+ # Other
79
+ # =================
80
+ # Windows - keep CRLF
81
+ *.exe filter=lfs diff=lfs merge=lfs -text
82
+ *.bat text eol=crlf
83
+ *.cmd text eol=crlf
84
+ *.ps1 text eol=crlf
@@ -31,19 +31,22 @@ jobs:
31
31
  contents: write
32
32
 
33
33
  steps:
34
+ - uses: actions/create-github-app-token@v1
35
+ id: app-token
36
+ with:
37
+ app-id: ${{ vars.RELEASE_APP_ID }}
38
+ private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
39
+
34
40
  - uses: actions/checkout@v6
35
41
  with:
36
42
  fetch-depth: 0
37
- ref: ${{ github.ref_name }}
38
-
39
- - name: Pin to triggering SHA
40
- run: git reset --hard ${{ github.sha }}
43
+ token: ${{ steps.app-token.outputs.token }}
41
44
 
42
45
  - name: Semantic Release
43
46
  id: release
44
47
  uses: python-semantic-release/python-semantic-release@v10
45
48
  with:
46
- github_token: ${{ secrets.GITHUB_TOKEN }}
49
+ github_token: ${{ steps.app-token.outputs.token }}
47
50
  git_committer_name: "github-actions[bot]"
48
51
  git_committer_email: "github-actions[bot]@users.noreply.github.com"
49
52
  force: ${{ inputs.force || '' }}
@@ -53,7 +56,7 @@ jobs:
53
56
  if: steps.release.outputs.released == 'true'
54
57
  uses: python-semantic-release/publish-action@v10
55
58
  with:
56
- github_token: ${{ secrets.GITHUB_TOKEN }}
59
+ github_token: ${{ steps.app-token.outputs.token }}
57
60
  tag: ${{ steps.release.outputs.tag }}
58
61
 
59
62
  outputs:
@@ -67,7 +70,7 @@ jobs:
67
70
  # ------------------------------------------------------------------- #
68
71
  publish-pypi:
69
72
  needs: release
70
- if: needs.release.outputs.released == 'true'
73
+ if: needs.release.outputs.released == 'true' && needs.release.outputs.is_prerelease != 'true'
71
74
  runs-on: ubuntu-latest
72
75
  environment:
73
76
  name: pypi
@@ -89,6 +92,15 @@ jobs:
89
92
  with:
90
93
  python-version: "3.14-dev"
91
94
 
95
+ - name: Verify version matches tag
96
+ run: |
97
+ TAG="${{ needs.release.outputs.tag }}"
98
+ TOML_VERSION=$(python -c "import tomllib; print('v' + tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
99
+ if [ "$TAG" != "$TOML_VERSION" ]; then
100
+ echo "::error::Tag $TAG does not match pyproject.toml version $TOML_VERSION"
101
+ exit 1
102
+ fi
103
+
92
104
  - run: uv build
93
105
 
94
106
  - uses: pypa/gh-action-pypi-publish@release/v1
@@ -66,6 +66,9 @@ data/tei/
66
66
  # Local config overrides
67
67
  atlas.local.toml
68
68
 
69
+ # Generated knowledge-vault landing page (atlas dream) — derived, not authored
70
+ docs/HOME.md
71
+
69
72
  # Environment files (secrets) — .env.dist is tracked
70
73
  .env
71
74
  .env.*
@@ -2,6 +2,180 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.4.0 (2026-07-14)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **analysis**: Derive cross-package coupling from real package names
10
+ ([`655de39`](https://github.com/SerPeter/code-atlas/commit/655de398f32d30a7f198d3cc6827fd537792fc10))
11
+
12
+ - **graph**: Detect body-only edits and resolve cross-file references
13
+ ([`3e417af`](https://github.com/SerPeter/code-atlas/commit/3e417afa92cd6f8a4a4c5176906dc82f1ef4cfcd))
14
+
15
+ - **graph**: Preserve cross-file edges on delete and stop BM25 crashes
16
+ ([`6f30442`](https://github.com/SerPeter/code-atlas/commit/6f30442463377a06d4058118b57dce3cc1ad9c45))
17
+
18
+ - **indexing**: Load nested gitignores for the watcher, honor monorepo scope
19
+ ([`ab3128b`](https://github.com/SerPeter/code-atlas/commit/ab3128ba06d78f291f947963edcd7b72e95ac830))
20
+
21
+ - **indexing**: Make the event pipeline durable and path-consistent
22
+ ([`a8b0246`](https://github.com/SerPeter/code-atlas/commit/a8b02460043e3aaeab38513bfeb1bd47128f1334))
23
+
24
+ - **indexing**: Scope monorepo indexing and gate empty-scan deletion
25
+ ([`ba1405d`](https://github.com/SerPeter/code-atlas/commit/ba1405d5d7de281341522cc056c7f96e9bddd7a8))
26
+
27
+ - **indexing**: Withhold file hashes until deferred edges resolve
28
+ ([`dcdeecc`](https://github.com/SerPeter/code-atlas/commit/dcdeecc64137589e13765e6c7965cecb273b8f41))
29
+
30
+ - **infra**: Enable AOF persistence for the production Valkey event bus
31
+ ([`3751c20`](https://github.com/SerPeter/code-atlas/commit/3751c20b81ce9ef24d64d044a03c0587ab445337))
32
+
33
+ - **parser**: Attach cross-file Go methods via receiver type name
34
+ ([`b24b0d3`](https://github.com/SerPeter/code-atlas/commit/b24b0d353cb63de930468af5fd6a415b515808f3))
35
+
36
+ - **parser**: Capture multi-name Go var/const specs and exclude generics from USES_TYPE
37
+ ([`81ca9d2`](https://github.com/SerPeter/code-atlas/commit/81ca9d2cf38ea947709e9b84276be1dc3bb1c9d4))
38
+
39
+ - **parser**: Disambiguate duplicate Markdown headings and fix line_end
40
+ ([`a5c89c4`](https://github.com/SerPeter/code-atlas/commit/a5c89c4526f6373fb73b70712201b0a985f5fffb))
41
+
42
+ - **parser**: Disambiguate JVM overload uids with parameter signatures
43
+ ([`e0fe188`](https://github.com/SerPeter/code-atlas/commit/e0fe188875dd492f7b49b1ee81a05a8b364cdf7c))
44
+
45
+ - **parser**: Extract C++ operator overloads and out-of-line nested definitions
46
+ ([`5acea2a`](https://github.com/SerPeter/code-atlas/commit/5acea2a38745535a407558233b8ef01fdd96df8b))
47
+
48
+ - **parser**: Extract C++ templates, prototypes, and out-of-line methods
49
+ ([`805ca54`](https://github.com/SerPeter/code-atlas/commit/805ca5447aed09e659630fed941a46e6354e1ef5))
50
+
51
+ - **parser**: Extract Ruby inline-visibility methods
52
+ ([`b76f0bd`](https://github.com/SerPeter/code-atlas/commit/b76f0bdd87eb40ce8235c5c2f8b4a865f1696f58))
53
+
54
+ - **parser**: Extract TS interface heritage, re-exports, and decorators
55
+ ([`1278201`](https://github.com/SerPeter/code-atlas/commit/1278201731ea058fb5f4a5f5f06e691b1c4a0eb9))
56
+
57
+ - **parser**: Fold JVM namespaces into qualified names, resolve Java imports
58
+ ([`6199504`](https://github.com/SerPeter/code-atlas/commit/619950430c739301517154a69f2882cb539a587b))
59
+
60
+ - **parser**: Parse .tsx files with the TSX grammar
61
+ ([`82a3db3`](https://github.com/SerPeter/code-atlas/commit/82a3db3acc9ddf458af4afbd3a1e080f988c158b))
62
+
63
+ - **parser**: Preserve compact Ruby class-path names for INHERITS matching
64
+ ([`6449af5`](https://github.com/SerPeter/code-atlas/commit/6449af5a97ce6ab089f4b1cba688bb301b96ecd3))
65
+
66
+ - **parser**: Resolve nested-class names and stop plugin-load lockout
67
+ ([`136e78c`](https://github.com/SerPeter/code-atlas/commit/136e78cd31e47d7c3c1be40b6df0292b1e1e7872))
68
+
69
+ - **parser**: Scope Rust associated types to their impl block
70
+ ([`7cdc801`](https://github.com/SerPeter/code-atlas/commit/7cdc8011edae9b06c8f91fd4c17aaaacf5359011))
71
+
72
+ - **parser**: Walk braced PHP namespaces and namespace-qualify entity names
73
+ ([`16efc39`](https://github.com/SerPeter/code-atlas/commit/16efc39b44bed00376d2a37c7a0112d7a3ca1cff))
74
+
75
+ - **parser**: Walk inline Rust modules and cross-file impl parents
76
+ ([`a4c1d5e`](https://github.com/SerPeter/code-atlas/commit/a4c1d5eefcf4f4bfce63f0f350aec09d396b274e))
77
+
78
+ - **search**: Stop suppressing vector search and silently emptying scope filters
79
+ ([`d78f86d`](https://github.com/SerPeter/code-atlas/commit/d78f86d136fd3f2122991d224b23f32448bd0dc0))
80
+
81
+ - **server**: Correct diagram scoping, cycle detection, and node-cap edge handling
82
+ ([`d919f1e`](https://github.com/SerPeter/code-atlas/commit/d919f1e958f8be02220f0fd97c10b6eff6626b8d))
83
+
84
+ - **server**: Fix cypher_query serialization and scope defaults for monorepos
85
+ ([`e5a8c7f`](https://github.com/SerPeter/code-atlas/commit/e5a8c7fc5019545c3c63bb7955dfdc998850d215))
86
+
87
+ - **server**: Validate label params and surface pipeline health honestly
88
+ ([`5c35cbe`](https://github.com/SerPeter/code-atlas/commit/5c35cbea4f54a87d425030b371e3272bc8222601))
89
+
90
+ - **settings**: Resolve atlas.toml against project_root, not cwd
91
+ ([`3c3b21c`](https://github.com/SerPeter/code-atlas/commit/3c3b21cdbf3f1d6e284465e5d157b2f532a34a30))
92
+
93
+ - **settings**: Scope nested config sections to prefixed env vars
94
+ ([`f1aa4d9`](https://github.com/SerPeter/code-atlas/commit/f1aa4d9d0f809cc5913969c501d3572edd2bfda1))
95
+
96
+ ### Chores
97
+
98
+ - Drop unused type-ignore directives
99
+ ([`0f7b85a`](https://github.com/SerPeter/code-atlas/commit/0f7b85ab3cb8a037093f1eae3c1ab89f92000319))
100
+
101
+ - Sync uv.lock to the 0.3.1 version bump
102
+ ([`5b5189b`](https://github.com/SerPeter/code-atlas/commit/5b5189bd4af3055fff224bf616a2d29e9a7e4034))
103
+
104
+ ### Documentation
105
+
106
+ - Add atlas dream to the CLI commands list
107
+ ([`b52d921`](https://github.com/SerPeter/code-atlas/commit/b52d921b107a886790fdffea00ec6e80d79c1342))
108
+
109
+ - **adr**: Record cross-file resolution, pipeline durability, and test isolation decisions
110
+ ([`ada1ce1`](https://github.com/SerPeter/code-atlas/commit/ada1ce113111ef781b4cf7cbebea64de1f6b053f))
111
+
112
+ - **adr**: Record the Note vault schema decision
113
+ ([`d93215c`](https://github.com/SerPeter/code-atlas/commit/d93215cc383e39732648cd4a966978be7095085b))
114
+
115
+ ### Features
116
+
117
+ - **knowledge**: Add anchors + staleness resolution (Phase 3)
118
+ ([`c22ebd6`](https://github.com/SerPeter/code-atlas/commit/c22ebd61677f098b5a3c727d9fb0640f98ade272))
119
+
120
+ - **knowledge**: Add dream-mode deterministic report (Phase 4)
121
+ ([`47c4a6d`](https://github.com/SerPeter/code-atlas/commit/47c4a6d86851f73c9abcd4535f8e42186cd546ff))
122
+
123
+ - **knowledge**: Add Note vault foundations to the code graph (Phase 1)
124
+ ([`1706a0a`](https://github.com/SerPeter/code-atlas/commit/1706a0acfeae3958b82f3f004390a0331f0dea4b))
125
+
126
+ - **knowledge**: Live global vault + polish (Phase 5)
127
+ ([`9b40136`](https://github.com/SerPeter/code-atlas/commit/9b40136091ef147deac443c55b06e2e478facac4))
128
+
129
+ - **knowledge**: Poll and index extra vaults from the daemon (Phase 2)
130
+ ([`ef750bb`](https://github.com/SerPeter/code-atlas/commit/ef750bbb46d658c0232b4a8f32734169d915969e))
131
+
132
+ ### Testing
133
+
134
+ - **integration**: Isolate tests from production databases
135
+ ([`a1bdecd`](https://github.com/SerPeter/code-atlas/commit/a1bdecd4bdfa8225e894442bd62c0facc79e6654))
136
+
137
+
138
+ ## v0.3.1 (2026-03-07)
139
+
140
+ ### Bug Fixes
141
+
142
+ - **ci**: Use GitHub App token to push to protected main branch
143
+ ([`13b46b9`](https://github.com/SerPeter/code-atlas/commit/13b46b972f900e4d1170b9c42af0c40d9c0cf35c))
144
+
145
+
146
+ ## v0.3.0 (2026-03-04)
147
+
148
+ ### Features
149
+
150
+ - **indexing**: Add file hash gate to skip unchanged files
151
+ ([#9](https://github.com/SerPeter/code-atlas/pull/9))
152
+ - **indexing**: Add per-file cooldown for daemon mode
153
+ ([#9](https://github.com/SerPeter/code-atlas/pull/9))
154
+
155
+ ### Performance Improvements
156
+
157
+ - Reduce RTTs across indexing and query pipelines
158
+ ([`cf3a519`](https://github.com/SerPeter/code-atlas/commit/cf3a519))
159
+
160
+ ### Refactoring
161
+
162
+ - **indexing**: Eliminate Tier 1 consumer, simplify to two-tier pipeline
163
+ ([#9](https://github.com/SerPeter/code-atlas/pull/9))
164
+ - **indexing**: Rename Tier 2/3 to AST/Embed stage across code and docs
165
+ ([#9](https://github.com/SerPeter/code-atlas/pull/9))
166
+
167
+ ### Bug Fixes
168
+
169
+ - **ci**: Remove detached HEAD checkout in release workflow
170
+
171
+ ## v0.2.0-dev.2 (2026-02-23)
172
+
173
+ ### Bug Fixes
174
+
175
+ - **indexing**: Label-constrained queries, PEL reclaim, and drain progress
176
+ ([`9ec9150`](https://github.com/SerPeter/code-atlas/commit/9ec915088058b05396a506ca23bfd0a0492d67f6))
177
+
178
+
5
179
  ## v0.2.0-dev.1 (2026-02-23)
6
180
 
7
181
  ### Bug Fixes
@@ -13,14 +187,15 @@
13
187
  - **ci**: Resolve ty check failures with --all-extras in CI
14
188
  ([`3f74816`](https://github.com/SerPeter/code-atlas/commit/3f7481635091d2d676aed75c3fbcaa5db4332242))
15
189
 
16
- - **consumers**: Group batches by project in Tier1/Tier2
190
+ - **consumers**: Group batches by project in AST/Embed consumers
17
191
  ([#2](https://github.com/SerPeter/code-atlas/pull/2),
18
192
  [`5107b24`](https://github.com/SerPeter/code-atlas/commit/5107b24a7dfbcb44cadc7917f632ae6a9743c057))
19
193
 
20
194
  ### Build System
21
195
 
22
196
  - **release**: Add python-semantic-release v10 for automated releases
23
- ([`044e9a3`](https://github.com/SerPeter/code-atlas/commit/044e9a31c5f7673a4be45a6519860d247e1b3cb1))
197
+ ([#5](https://github.com/SerPeter/code-atlas/pull/5),
198
+ [`de9c06d`](https://github.com/SerPeter/code-atlas/commit/de9c06d8c1e1744a92ff7ef160e06f859b5aa768))
24
199
 
25
200
  ### Features
26
201
 
@@ -181,7 +356,7 @@
181
356
  - **docs**: Add markdown parser with tree-sitter-markdown
182
357
  ([`e8d372c`](https://github.com/SerPeter/code-atlas/commit/e8d372c162652d6d73d1f66da5e14a61fcb2136a))
183
358
 
184
- - **embeddings**: Add EmbedClient with litellm routing and Tier 3 pipeline
359
+ - **embeddings**: Add EmbedClient with litellm routing and embed pipeline
185
360
  ([`ad7c972`](https://github.com/SerPeter/code-atlas/commit/ad7c9726f2e48fdb8746b50547089c5c483bcb75))
186
361
 
187
362
  - **embeddings**: Add three-tier embedding cache with Valkey backend
@@ -232,7 +407,7 @@
232
407
  - **naming**: Worktree-aware naming and monorepo sub-project prefixing
233
408
  ([`2acdfb3`](https://github.com/SerPeter/code-atlas/commit/2acdfb33ba4b486f966272a01cf8a37f670661f6))
234
409
 
235
- - **parser**: Add py-tree-sitter parser, implement Tier 2 pipeline, drop Rust
410
+ - **parser**: Add py-tree-sitter parser, implement AST pipeline, drop Rust
236
411
  ([`d56e7d2`](https://github.com/SerPeter/code-atlas/commit/d56e7d2a686ec279a52d85bbc4903f4d85f51a4e))
237
412
 
238
413
  - **parsing**: Add multi-language support (10 languages, 7 modules)
@@ -18,7 +18,7 @@ uv sync --group dev # Include dev dependencies
18
18
  # Run tests
19
19
  uv run pytest # All tests
20
20
  uv run pytest -m "not slow" # Skip slow tests
21
- uv run pytest -m integration # Integration tests only (requires Memgraph)
21
+ uv run pytest -m integration # Integration tests only (requires Docker — testcontainers by default, see Testing)
22
22
  uv run pytest tests/test_foo.py::test_bar # Single test
23
23
 
24
24
  # Lint and format
@@ -32,7 +32,8 @@ uv run pre-commit install # Install hooks
32
32
  uv run pre-commit run --all-files # Run all hooks manually
33
33
 
34
34
  # Infrastructure
35
- docker compose up -d # Start Memgraph + Valkey
35
+ docker compose up -d # Start Memgraph + Valkey (production index: 7687/6379)
36
+ docker compose --profile test up -d # Optional integration-test fast path (memgraph-test :7688, valkey-test :6380, see Testing)
36
37
  docker compose --profile tei up -d # Include local embeddings (TEI)
37
38
  docker compose down # Stop services
38
39
 
@@ -42,6 +43,8 @@ atlas search "query" # Hybrid search
42
43
  atlas status # Check index status
43
44
  atlas mcp # Start MCP server
44
45
  atlas daemon start # Start indexing daemon (watcher + pipeline)
46
+ atlas dream # Knowledge-vault lint report (inbox, orphans, dangling links, duplicates) + docs/HOME.md
47
+ atlas project rm <name> # Delete a project's graph data (e.g. a stale worktree project)
45
48
  ```
46
49
 
47
50
  ## Architecture
@@ -51,7 +54,7 @@ src/code_atlas/
51
54
  ├── __init__.py # __version__ only
52
55
  ├── schema.py # Graph schema (labels, relationships, DDL generators)
53
56
  ├── settings.py # Pydantic configuration (atlas.toml + env vars)
54
- ├── events.py # Event types (FileChanged, ASTDirty, EmbedDirty) + Valkey Streams EventBus
57
+ ├── events.py # Event types (FileChanged, EmbedDirty) + Valkey Streams EventBus
55
58
  ├── telemetry.py # OpenTelemetry integration
56
59
  ├── cli.py # Typer CLI entrypoint (index, search, status, mcp, daemon commands)
57
60
 
@@ -69,7 +72,7 @@ src/code_atlas/
69
72
 
70
73
  ├── indexing/
71
74
  │ ├── orchestrator.py # Full-index, monorepo detection, staleness checking
72
- │ ├── consumers.py # Tier 1/2/3 event consumers (batch-pull pattern)
75
+ │ ├── consumers.py # AST + Embed event consumers (batch-pull pattern)
73
76
  │ ├── watcher.py # Filesystem watcher (watchfiles + hybrid debounce)
74
77
  │ └── daemon.py # Daemon lifecycle manager (watcher + pipeline)
75
78
 
@@ -78,12 +81,14 @@ src/code_atlas/
78
81
  └── health.py # Infrastructure health checks + diagnostics
79
82
  ```
80
83
 
81
- **Event Pipeline:** File Watcher → Valkey Streams → Tier 1 (graph metadata) Tier 2 (AST diff + gate) → Tier 3 (embeddings) → Memgraph
84
+ **Event Pipeline:** File Watcher → Valkey Streams → AST stage (hash gate + parse + diff) → Embed stage (embeddings) → Memgraph
82
85
 
83
86
  **Query Pipeline:** MCP Server → Query Router → [Graph Search | Vector Search | BM25 Search] → RRF Fusion → Results
84
87
 
85
88
  **Deployment:** Daemon (`atlas daemon start`) for indexing + MCP (`atlas mcp`) per agent session, decoupled via Valkey + Memgraph
86
89
 
90
+ **Event model:** Events are atomic — one logical change per event (one file per FileChanged, one entity per EmbedDirty). Never bundle lists of work items into a single event; use `EventBus.publish_many()` for network-efficient batch publishing. The consumer's `max_batch_size` must directly control work volume, not just message count.
91
+
87
92
  **Infrastructure:** Memgraph (graph DB, port 7687), TEI (embeddings, port 8080), Valkey (event bus, port 6379)
88
93
 
89
94
  ## Code Style
@@ -126,6 +131,7 @@ src/code_atlas/
126
131
  - **High gear (default):** Integration tests exercising full workflows and public APIs
127
132
  - **Low gear (selective):** Unit tests only for complex algorithms or edge cases unreachable via integration
128
133
  - Don't test every function. Test system behavior.
134
+ - Integration tests start session-scoped testcontainers on random ports by default (Docker required; skip if unavailable). Fast path: `docker compose --profile test up -d`, then `ATLAS_TEST_MEMGRAPH_PORT=7688 ATLAS_TEST_VALKEY_PORT=6380 uv run pytest -m integration` — the env vars point tests at any isolated stack (e.g. CI service containers). Never connects to the production Memgraph/Valkey on 7687/6379. A conftest guard refuses to wipe any Memgraph containing project data not prefixed `test`/`bench`; `ATLAS_TEST_DB=1` bypasses it for known-disposable instances only.
129
135
 
130
136
  ## Commits
131
137