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.
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.atlasignore +4 -0
- code_atlas_mcp-0.4.0/.claude/commands/dream-mode.md +97 -0
- code_atlas_mcp-0.4.0/.claude/rules/knowledge.md +30 -0
- code_atlas_mcp-0.4.0/.gitattributes +84 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/workflows/release.yml +19 -7
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.gitignore +3 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/CHANGELOG.md +179 -4
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/CLAUDE.md +11 -5
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/PKG-INFO +36 -33
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/README.md +32 -32
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docker-compose.yml +56 -0
- code_atlas_mcp-0.4.0/docs/SCHEMA.md +87 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0004-event-driven-tiered-pipeline.md +34 -36
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0005-deployment-process-model.md +8 -14
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0006-pure-python-tree-sitter.md +4 -4
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0007-qualified-name-strategy.md +3 -1
- code_atlas_mcp-0.4.0/docs/adr/0008-cross-file-relationship-resolution.md +174 -0
- code_atlas_mcp-0.4.0/docs/adr/0009-event-pipeline-durability-contract.md +169 -0
- code_atlas_mcp-0.4.0/docs/adr/0010-integration-test-isolation.md +122 -0
- code_atlas_mcp-0.4.0/docs/adr/0011-note-vault-schema.md +105 -0
- code_atlas_mcp-0.4.0/docs/adr/README.md +43 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/architecture.md +35 -39
- code_atlas_mcp-0.4.0/docs/benchmarks.md +67 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/guides/repo-guidelines.md +1 -1
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/pyproject.toml +6 -4
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/ruff.toml +6 -0
- code_atlas_mcp-0.4.0/scripts/profile_index.py +539 -0
- code_atlas_mcp-0.4.0/scripts/profile_query.py +546 -0
- code_atlas_mcp-0.4.0/src/code_atlas/__init__.py +8 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/cli.py +262 -41
- code_atlas_mcp-0.4.0/src/code_atlas/dream.py +358 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/events.py +117 -29
- code_atlas_mcp-0.4.0/src/code_atlas/graph/client.py +2915 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/indexing/__init__.py +4 -6
- code_atlas_mcp-0.4.0/src/code_atlas/indexing/consumers.py +1169 -0
- code_atlas_mcp-0.4.0/src/code_atlas/indexing/daemon.py +349 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/indexing/orchestrator.py +580 -176
- code_atlas_mcp-0.4.0/src/code_atlas/indexing/watcher.py +303 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/ast.py +11 -1
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/__init__.py +26 -11
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/cpp.py +151 -31
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/go.py +261 -49
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/jvm.py +161 -18
- code_atlas_mcp-0.4.0/src/code_atlas/parsing/languages/markdown.py +768 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/php.py +38 -12
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/python.py +119 -46
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/ruby.py +87 -4
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/rust.py +99 -18
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/languages/typescript.py +97 -26
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/schema.py +42 -2
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/search/__init__.py +2 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/search/embeddings.py +104 -11
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/search/engine.py +172 -38
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/search/guidance.py +46 -7
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/server/analysis.py +162 -62
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/server/health.py +42 -2
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/server/mcp.py +341 -108
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/settings.py +135 -23
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/conftest.py +1 -1
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/conftest.py +107 -24
- code_atlas_mcp-0.4.0/tests/integration/graph/test_client.py +3387 -0
- code_atlas_mcp-0.4.0/tests/integration/indexing/test_consumers.py +1218 -0
- code_atlas_mcp-0.4.0/tests/integration/indexing/test_daemon.py +244 -0
- code_atlas_mcp-0.4.0/tests/integration/indexing/test_live_update.py +184 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/indexing/test_monorepo.py +56 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/indexing/test_orchestrator.py +198 -2
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/indexing/test_watcher.py +9 -2
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/server/test_mcp.py +202 -0
- code_atlas_mcp-0.4.0/tests/integration/test_dream.py +81 -0
- code_atlas_mcp-0.4.0/tests/integration/test_infra_isolation.py +69 -0
- code_atlas_mcp-0.4.0/tests/unit/graph/test_client.py +112 -0
- code_atlas_mcp-0.4.0/tests/unit/indexing/test_consumers.py +407 -0
- code_atlas_mcp-0.4.0/tests/unit/indexing/test_daemon.py +470 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/indexing/test_monorepo.py +14 -8
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/indexing/test_orchestrator.py +287 -0
- code_atlas_mcp-0.4.0/tests/unit/indexing/test_watcher.py +527 -0
- code_atlas_mcp-0.4.0/tests/unit/parsing/test_ast.py +88 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_cpp.py +291 -2
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_go.py +235 -3
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_jvm.py +291 -6
- code_atlas_mcp-0.4.0/tests/unit/parsing/test_languages_init.py +71 -0
- code_atlas_mcp-0.4.0/tests/unit/parsing/test_markdown.py +342 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_php.py +120 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_python.py +353 -16
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_ruby.py +117 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_rust.py +280 -3
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_typescript.py +172 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/search/test_embeddings.py +41 -33
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/search/test_engine.py +204 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/search/test_guidance.py +47 -0
- code_atlas_mcp-0.4.0/tests/unit/server/__init__.py +0 -0
- code_atlas_mcp-0.4.0/tests/unit/server/test_analysis.py +281 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/server/test_health.py +152 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/server/test_mcp.py +368 -1
- code_atlas_mcp-0.4.0/tests/unit/test_cli.py +436 -0
- code_atlas_mcp-0.4.0/tests/unit/test_dream.py +191 -0
- code_atlas_mcp-0.4.0/tests/unit/test_events.py +189 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/test_schema.py +25 -1
- code_atlas_mcp-0.4.0/tests/unit/test_settings.py +170 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/uv.lock +47 -1
- code_atlas_mcp-0.2.0.dev1/docs/adr/README.md +0 -38
- code_atlas_mcp-0.2.0.dev1/docs/benchmarks.md +0 -45
- code_atlas_mcp-0.2.0.dev1/src/code_atlas/__init__.py +0 -5
- code_atlas_mcp-0.2.0.dev1/src/code_atlas/graph/client.py +0 -1674
- code_atlas_mcp-0.2.0.dev1/src/code_atlas/indexing/consumers.py +0 -572
- code_atlas_mcp-0.2.0.dev1/src/code_atlas/indexing/daemon.py +0 -156
- code_atlas_mcp-0.2.0.dev1/src/code_atlas/indexing/watcher.py +0 -200
- code_atlas_mcp-0.2.0.dev1/src/code_atlas/parsing/languages/markdown.py +0 -412
- code_atlas_mcp-0.2.0.dev1/tests/integration/graph/test_client.py +0 -1492
- code_atlas_mcp-0.2.0.dev1/tests/integration/indexing/test_consumers.py +0 -140
- code_atlas_mcp-0.2.0.dev1/tests/unit/indexing/test_watcher.py +0 -227
- code_atlas_mcp-0.2.0.dev1/tests/unit/test_cli.py +0 -219
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.dockerignore +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.env.dist +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/FUNDING.yml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/dependabot.yml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/labels.yml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/workflows/ci.yml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/workflows/labels.yml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.github/workflows/security.yml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.pre-commit-config.yaml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.prettierignore +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/.prettierrc.yaml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/CONTRIBUTING.md +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/Dockerfile +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/LICENSE +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/agent.md +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/atlas.toml +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0000-template.md +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0001-memgraph-as-database.md +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0002-build-from-scratch.md +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/adr/0003-python-rust-hybrid.md +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/guides/adding-languages.md +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/guides/configuration.md +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/guides/usage.md +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/docs/landscape.md +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/graph/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/parsing/detectors.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/server/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/src/code_atlas/telemetry.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/conftest.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/test_bench_concurrent.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/test_bench_indexing.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/test_bench_memory.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/test_bench_parser.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/bench/test_bench_query.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/graph/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/indexing/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/search/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/search/test_embeddings.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/search/test_engine.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/integration/server/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/conftest.py +0 -0
- {code_atlas_mcp-0.2.0.dev1/tests/unit/indexing → code_atlas_mcp-0.4.0/tests/unit/graph}/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1/tests/unit/parsing → code_atlas_mcp-0.4.0/tests/unit/indexing}/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1/tests/unit/search → code_atlas_mcp-0.4.0/tests/unit/parsing}/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/parsing/test_detectors.py +0 -0
- {code_atlas_mcp-0.2.0.dev1/tests/unit/server → code_atlas_mcp-0.4.0/tests/unit/search}/__init__.py +0 -0
- {code_atlas_mcp-0.2.0.dev1 → code_atlas_mcp-0.4.0}/tests/unit/test_telemetry.py +0 -0
|
@@ -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
|
-
|
|
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: ${{
|
|
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: ${{
|
|
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
|
|
@@ -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
|
|
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
|
-
([
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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 #
|
|
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 →
|
|
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
|
|