alluvia 0.1.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 (99) hide show
  1. alluvia-0.1.0/.github/workflows/ci.yml +13 -0
  2. alluvia-0.1.0/.gitignore +6 -0
  3. alluvia-0.1.0/CHANGELOG.md +17 -0
  4. alluvia-0.1.0/LICENSE +21 -0
  5. alluvia-0.1.0/PKG-INFO +181 -0
  6. alluvia-0.1.0/README.md +137 -0
  7. alluvia-0.1.0/alluvia/__init__.py +1 -0
  8. alluvia-0.1.0/alluvia/cli.py +483 -0
  9. alluvia-0.1.0/alluvia/config.py +131 -0
  10. alluvia-0.1.0/alluvia/distill/__init__.py +0 -0
  11. alluvia-0.1.0/alluvia/distill/distiller.py +70 -0
  12. alluvia-0.1.0/alluvia/distill/scrub.py +50 -0
  13. alluvia-0.1.0/alluvia/engine/__init__.py +0 -0
  14. alluvia-0.1.0/alluvia/engine/cluster.py +16 -0
  15. alluvia-0.1.0/alluvia/engine/digest.py +103 -0
  16. alluvia-0.1.0/alluvia/engine/embed.py +41 -0
  17. alluvia-0.1.0/alluvia/engine/engine.py +206 -0
  18. alluvia-0.1.0/alluvia/engine/label.py +17 -0
  19. alluvia-0.1.0/alluvia/engine/link.py +61 -0
  20. alluvia-0.1.0/alluvia/engine/propose.py +216 -0
  21. alluvia-0.1.0/alluvia/engine/track.py +43 -0
  22. alluvia-0.1.0/alluvia/ingest/__init__.py +0 -0
  23. alluvia-0.1.0/alluvia/ingest/base.py +7 -0
  24. alluvia-0.1.0/alluvia/ingest/chatgpt_export.py +92 -0
  25. alluvia-0.1.0/alluvia/ingest/claude_code.py +105 -0
  26. alluvia-0.1.0/alluvia/ingest/vscode_fork.py +296 -0
  27. alluvia-0.1.0/alluvia/llm/__init__.py +0 -0
  28. alluvia-0.1.0/alluvia/llm/client.py +94 -0
  29. alluvia-0.1.0/alluvia/mcp_server.py +294 -0
  30. alluvia-0.1.0/alluvia/models.py +114 -0
  31. alluvia-0.1.0/alluvia/platform.py +29 -0
  32. alluvia-0.1.0/alluvia/static/index.html +271 -0
  33. alluvia-0.1.0/alluvia/store/__init__.py +0 -0
  34. alluvia-0.1.0/alluvia/store/db.py +154 -0
  35. alluvia-0.1.0/alluvia/store/repo.py +371 -0
  36. alluvia-0.1.0/alluvia/store/vector.py +114 -0
  37. alluvia-0.1.0/alluvia/web.py +261 -0
  38. alluvia-0.1.0/assets/logo.svg +16 -0
  39. alluvia-0.1.0/docs/DEBT.md +12 -0
  40. alluvia-0.1.0/docs/validation/2026-07-m2b-gate.md +37 -0
  41. alluvia-0.1.0/docs/validation/2026-07-m2c-gate.md +25 -0
  42. alluvia-0.1.0/pyproject.toml +42 -0
  43. alluvia-0.1.0/scripts/probe_forks.py +98 -0
  44. alluvia-0.1.0/tests/conftest.py +20 -0
  45. alluvia-0.1.0/tests/fixtures/sess-1.jsonl +2 -0
  46. alluvia-0.1.0/tests/test_backtest_gate_finds.py +52 -0
  47. alluvia-0.1.0/tests/test_chatgpt_export.py +61 -0
  48. alluvia-0.1.0/tests/test_cli_connections.py +39 -0
  49. alluvia-0.1.0/tests/test_cli_digest.py +77 -0
  50. alluvia-0.1.0/tests/test_cli_m0.py +16 -0
  51. alluvia-0.1.0/tests/test_cli_m1.py +52 -0
  52. alluvia-0.1.0/tests/test_cli_m2b.py +43 -0
  53. alluvia-0.1.0/tests/test_cli_m2c.py +87 -0
  54. alluvia-0.1.0/tests/test_cli_unfinished.py +33 -0
  55. alluvia-0.1.0/tests/test_config_toml.py +84 -0
  56. alluvia-0.1.0/tests/test_digest_engine.py +120 -0
  57. alluvia-0.1.0/tests/test_digest_store.py +38 -0
  58. alluvia-0.1.0/tests/test_distill_checkpoint.py +47 -0
  59. alluvia-0.1.0/tests/test_distill_scrub.py +14 -0
  60. alluvia-0.1.0/tests/test_distiller.py +43 -0
  61. alluvia-0.1.0/tests/test_engine_cluster.py +18 -0
  62. alluvia-0.1.0/tests/test_engine_embed.py +10 -0
  63. alluvia-0.1.0/tests/test_engine_label.py +16 -0
  64. alluvia-0.1.0/tests/test_engine_link.py +42 -0
  65. alluvia-0.1.0/tests/test_engine_refresh.py +56 -0
  66. alluvia-0.1.0/tests/test_engine_refresh_m2a.py +56 -0
  67. alluvia-0.1.0/tests/test_engine_track.py +60 -0
  68. alluvia-0.1.0/tests/test_ingest_claude_code.py +67 -0
  69. alluvia-0.1.0/tests/test_init.py +28 -0
  70. alluvia-0.1.0/tests/test_label_cache.py +84 -0
  71. alluvia-0.1.0/tests/test_link_m2b.py +35 -0
  72. alluvia-0.1.0/tests/test_live_hardening.py +38 -0
  73. alluvia-0.1.0/tests/test_llm_fake.py +7 -0
  74. alluvia-0.1.0/tests/test_llm_provider.py +30 -0
  75. alluvia-0.1.0/tests/test_mcp_protocol.py +24 -0
  76. alluvia-0.1.0/tests/test_mcp_tools.py +113 -0
  77. alluvia-0.1.0/tests/test_meta_strip.py +32 -0
  78. alluvia-0.1.0/tests/test_models.py +14 -0
  79. alluvia-0.1.0/tests/test_models_m2a.py +18 -0
  80. alluvia-0.1.0/tests/test_mute.py +49 -0
  81. alluvia-0.1.0/tests/test_orphaned_embeddings.py +16 -0
  82. alluvia-0.1.0/tests/test_platform.py +17 -0
  83. alluvia-0.1.0/tests/test_proposals_store.py +40 -0
  84. alluvia-0.1.0/tests/test_propose_engine.py +132 -0
  85. alluvia-0.1.0/tests/test_rated_via.py +18 -0
  86. alluvia-0.1.0/tests/test_role_map.py +24 -0
  87. alluvia-0.1.0/tests/test_scaled_clustering.py +16 -0
  88. alluvia-0.1.0/tests/test_smoke.py +5 -0
  89. alluvia-0.1.0/tests/test_store_m2a.py +43 -0
  90. alluvia-0.1.0/tests/test_store_notes.py +23 -0
  91. alluvia-0.1.0/tests/test_store_schema.py +9 -0
  92. alluvia-0.1.0/tests/test_store_sessions.py +31 -0
  93. alluvia-0.1.0/tests/test_vector_index.py +70 -0
  94. alluvia-0.1.0/tests/test_version_checkpoint.py +39 -0
  95. alluvia-0.1.0/tests/test_vscode_fork.py +164 -0
  96. alluvia-0.1.0/tests/test_web.py +91 -0
  97. alluvia-0.1.0/tests/test_web_search.py +54 -0
  98. alluvia-0.1.0/tests/test_wrapper_strip.py +48 -0
  99. alluvia-0.1.0/uv.lock +1649 -0
@@ -0,0 +1,13 @@
1
+ name: ci
2
+ on: [push, pull_request]
3
+ jobs:
4
+ test:
5
+ strategy:
6
+ matrix:
7
+ os: [ubuntu-latest, macos-latest]
8
+ runs-on: ${{ matrix.os }}
9
+ steps:
10
+ - uses: actions/checkout@v4
11
+ - uses: astral-sh/setup-uv@v5
12
+ - run: uv sync --all-groups
13
+ - run: uv run pytest -q
@@ -0,0 +1,6 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ .pytest_cache/
5
+ .alluvia/
6
+ *.db
@@ -0,0 +1,17 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 — 2026-07-05
4
+
5
+ First installable release. Everything to date: five source adapters
6
+ (Claude Code, Cursor, Windsurf*, Antigravity*, ChatGPT export), raw-first
7
+ SQLite store with a swappable vector index (sqlite-vec/numpy), the
8
+ distill→embed→cluster→label→status→link engine, four lenses
9
+ (themes / connections / unfinished / propose) with a human ratings loop,
10
+ a proactive weekly digest with mute + dismissal-learning, eight MCP tools,
11
+ multi-provider role-mapped LLM support (Groq/OpenAI/Anthropic), config.toml
12
+ + `alluvia init` onboarding, and cross-platform source detection.
13
+ (*Windsurf/Antigravity ship log-and-skip: their stores are schema-less
14
+ protobuf — see docs/DEBT.md.)
15
+
16
+ Every capability was validated against a real 400+-session corpus through
17
+ live gates; see docs/validation/.
alluvia-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dylan Parent
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
alluvia-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,181 @@
1
+ Metadata-Version: 2.4
2
+ Name: alluvia
3
+ Version: 0.1.0
4
+ Summary: Mine your AI conversations — every tool, every month — for the ideas you forgot you had. Local-first.
5
+ Author: Dylan Parent
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Dylan Parent
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+ License-File: LICENSE
28
+ Classifier: Development Status :: 4 - Beta
29
+ Classifier: Environment :: Console
30
+ Classifier: Intended Audience :: Developers
31
+ Classifier: License :: OSI Approved :: MIT License
32
+ Classifier: Programming Language :: Python :: 3.12
33
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
34
+ Requires-Python: >=3.12
35
+ Requires-Dist: anthropic>=0.40
36
+ Requires-Dist: fastembed>=0.4
37
+ Requires-Dist: hdbscan>=0.8.40
38
+ Requires-Dist: mcp>=1.2
39
+ Requires-Dist: numpy>=2.0
40
+ Requires-Dist: openai>=1.40
41
+ Requires-Dist: sqlite-vec>=0.1.6
42
+ Requires-Dist: typer>=0.12
43
+ Description-Content-Type: text/markdown
44
+
45
+ <p align="center"><img src="assets/logo.svg" width="110" alt="Alluvia"></p>
46
+
47
+ <p align="center">
48
+ <a href="https://github.com/dylanp12/alluvia/actions/workflows/ci.yml"><img src="https://github.com/dylanp12/alluvia/actions/workflows/ci.yml/badge.svg" alt="ci"></a>
49
+ <img src="https://img.shields.io/badge/license-MIT-d4a017" alt="MIT">
50
+ <img src="https://img.shields.io/badge/python-3.12+-d4a017" alt="python">
51
+ <img src="https://img.shields.io/badge/local--first-always-d4a017" alt="local-first">
52
+ </p>
53
+
54
+ # Alluvia
55
+
56
+ **Pan your AI history for gold.**
57
+
58
+ Every conversation you've ever had with an AI tool is sediment. Most of it is
59
+ sand — but scattered through it are the nuggets: ideas you never chased,
60
+ solutions you solved once and forgot, threads you meant to finish. alluvia is the
61
+ pan.
62
+
63
+ You think through problems in Claude Code. You debug in Cursor. You explore in
64
+ ChatGPT. Each tool remembers nothing about the others, and neither do you. The
65
+ idea you need today is sitting in a session from last spring, in a different
66
+ app, under a title you'll never search for. alluvia finds it.
67
+
68
+ **Local-first memory for AI-assisted work — across tools, with provenance and
69
+ human judgment.** Not another "AI memory": your raw sessions never leave the
70
+ machine, every surfaced idea cites its source, and *you* rate what's gold.
71
+
72
+ alluvia ingests all of it into one local store, distills it into atomic ideas,
73
+ clusters those into themes, and then does the part nothing else does: **it
74
+ finds the bridges** — the places where your past self already met the problem
75
+ your present self is holding.
76
+
77
+ > **A true story from alluvia's own validation gate:** a security review in one
78
+ > tool flagged a server-side validation gap. `alluvia connections` linked it to
79
+ > debugging sessions in a *different* tool from **14 months earlier** — same
80
+ > root cause, long forgotten. Then `alluvia propose` turned that bridge into a
81
+ > concrete fix plan, cited back to both sources. The human kept it.
82
+ > Every claim in this README traces to a logged validation gate —
83
+ > see [docs/validation](docs/validation/).
84
+
85
+ ## Sixty seconds
86
+
87
+ ```bash
88
+ git clone <this-repo> && cd alluvia
89
+ uv run alluvia init # detects your sources, sets up your LLM provider
90
+ uv run alluvia refresh # distill → embed → cluster → map (local embeddings)
91
+ uv run alluvia themes
92
+ ```
93
+
94
+ *(PyPI package coming; installs the `alluvia` command.)*
95
+
96
+ ## The four lenses
97
+
98
+ ```
99
+ $ alluvia themes # D — your thinking, clustered
100
+ • Docker Issues [84 sessions/2 sources] (2025-03→2026-06)
101
+ • Refresh Token Storage [9 sessions/2 sources]
102
+ Insecure localStorage tokens vulnerable to XSS; approaches discussed...
103
+
104
+ $ alluvia connections # A — bridges across tools and months
105
+ 🔗 "no cross-check between ids enables forgery" [tool-A · 2026-06]
106
+ ↔ "service isn't storing the id on upload" [tool-B · 2025-04]
107
+ why: same missing validation, found twice, 14 months apart.
108
+
109
+ $ alluvia unfinished # B — threads you keep circling, never closing
110
+ 🧵 Test Infra Reorganization open · 4 sessions over 388 days
111
+
112
+ $ alluvia propose # C — new next-steps, grounded in YOUR notes
113
+ [prop:50bda956] Add server-side consistency check (feasibility 4/5)
114
+ ...cites: note:104966a3, note:93de85cc
115
+ $ alluvia rate prop:50bda956 --keep
116
+ ```
117
+
118
+ Plus a **weekly digest** (`alluvia digest run --if-due`) that brings ≤5
119
+ interrupt-worthy items to you — and stays silent when nothing clears the bar.
120
+
121
+ ## See it: the dashboard
122
+
123
+ ```bash
124
+ alluvia serve --open # http://localhost:8177
125
+ ```
126
+
127
+ Five views over your map — corpus overview, theme bubbles by status, the
128
+ **cross-tool bridge graph**, a weekly activity timeline with your
129
+ longest-unfinished threads, and your full judgments history. One
130
+ self-contained page, zero external requests, served only on 127.0.0.1.
131
+
132
+ ## Inside your assistant (MCP)
133
+
134
+ ```bash
135
+ claude mcp add alluvia -- uv run --directory <repo> alluvia mcp
136
+ ```
137
+
138
+ Eight tools let Claude Code / Cursor / any MCP client query your idea-map
139
+ mid-conversation: *"you circled this in April — here's where you landed."*
140
+
141
+ ## What leaves your machine
142
+
143
+ | Data | Where it goes |
144
+ |---|---|
145
+ | Raw conversations | **Nowhere.** Local SQLite, forever yours |
146
+ | Embeddings | **Nowhere.** Computed locally (fastembed/ONNX) |
147
+ | Distill / label / propose calls | Your configured LLM provider, under your API key, secret-scrubbed first |
148
+ | Telemetry | **There is none.** |
149
+
150
+ Provider is your choice — Groq (free tier works; alluvia chains per-model daily
151
+ budgets automatically), OpenAI, or Anthropic — with per-role model overrides
152
+ (`SIFT_LLM_MODEL_PROPOSE=...` for a stronger generator, cheap models for bulk
153
+ extraction).
154
+
155
+ ## How it works
156
+
157
+ ```
158
+ sources ─► ingest ─► RAW (never mutated) ─► distill ─► notes ─► embed
159
+ │
160
+ lenses ◄── themes/links/status ◄── cluster/link/track
161
+ │
162
+ CLI · MCP · weekly digest ratings ─► the eval corpus (yours)
163
+ ```
164
+
165
+ Three data classes with different guarantees: **raw** (source of truth, never
166
+ touched), **derived** (rebuildable from raw — improve the pipeline, re-run,
167
+ nothing lost), **judgments** (your ratings and digests — durable, never
168
+ regenerated).
169
+
170
+ ## Honest limits
171
+
172
+ - Windsurf/Antigravity transcripts live in schema-less protobuf stores; alluvia
173
+ detects and skips them cleanly. ChatGPT ingestion uses the official data
174
+ export (ZIP), not live capture.
175
+ - Generated proposals are guardrailed (must cite your notes, novelty-gated,
176
+ feasibility-labeled) but they're LLM output — you rate, alluvia learns.
177
+ - All accepted trade-offs live in [docs/DEBT.md](docs/DEBT.md), each with the
178
+ condition that triggers fixing it.
179
+
180
+ MIT · built local-first on purpose: the research this project started from
181
+ found that for developers, trust in this category is *owned data or nothing*.
@@ -0,0 +1,137 @@
1
+ <p align="center"><img src="assets/logo.svg" width="110" alt="Alluvia"></p>
2
+
3
+ <p align="center">
4
+ <a href="https://github.com/dylanp12/alluvia/actions/workflows/ci.yml"><img src="https://github.com/dylanp12/alluvia/actions/workflows/ci.yml/badge.svg" alt="ci"></a>
5
+ <img src="https://img.shields.io/badge/license-MIT-d4a017" alt="MIT">
6
+ <img src="https://img.shields.io/badge/python-3.12+-d4a017" alt="python">
7
+ <img src="https://img.shields.io/badge/local--first-always-d4a017" alt="local-first">
8
+ </p>
9
+
10
+ # Alluvia
11
+
12
+ **Pan your AI history for gold.**
13
+
14
+ Every conversation you've ever had with an AI tool is sediment. Most of it is
15
+ sand — but scattered through it are the nuggets: ideas you never chased,
16
+ solutions you solved once and forgot, threads you meant to finish. alluvia is the
17
+ pan.
18
+
19
+ You think through problems in Claude Code. You debug in Cursor. You explore in
20
+ ChatGPT. Each tool remembers nothing about the others, and neither do you. The
21
+ idea you need today is sitting in a session from last spring, in a different
22
+ app, under a title you'll never search for. alluvia finds it.
23
+
24
+ **Local-first memory for AI-assisted work — across tools, with provenance and
25
+ human judgment.** Not another "AI memory": your raw sessions never leave the
26
+ machine, every surfaced idea cites its source, and *you* rate what's gold.
27
+
28
+ alluvia ingests all of it into one local store, distills it into atomic ideas,
29
+ clusters those into themes, and then does the part nothing else does: **it
30
+ finds the bridges** — the places where your past self already met the problem
31
+ your present self is holding.
32
+
33
+ > **A true story from alluvia's own validation gate:** a security review in one
34
+ > tool flagged a server-side validation gap. `alluvia connections` linked it to
35
+ > debugging sessions in a *different* tool from **14 months earlier** — same
36
+ > root cause, long forgotten. Then `alluvia propose` turned that bridge into a
37
+ > concrete fix plan, cited back to both sources. The human kept it.
38
+ > Every claim in this README traces to a logged validation gate —
39
+ > see [docs/validation](docs/validation/).
40
+
41
+ ## Sixty seconds
42
+
43
+ ```bash
44
+ git clone <this-repo> && cd alluvia
45
+ uv run alluvia init # detects your sources, sets up your LLM provider
46
+ uv run alluvia refresh # distill → embed → cluster → map (local embeddings)
47
+ uv run alluvia themes
48
+ ```
49
+
50
+ *(PyPI package coming; installs the `alluvia` command.)*
51
+
52
+ ## The four lenses
53
+
54
+ ```
55
+ $ alluvia themes # D — your thinking, clustered
56
+ • Docker Issues [84 sessions/2 sources] (2025-03→2026-06)
57
+ • Refresh Token Storage [9 sessions/2 sources]
58
+ Insecure localStorage tokens vulnerable to XSS; approaches discussed...
59
+
60
+ $ alluvia connections # A — bridges across tools and months
61
+ 🔗 "no cross-check between ids enables forgery" [tool-A · 2026-06]
62
+ ↔ "service isn't storing the id on upload" [tool-B · 2025-04]
63
+ why: same missing validation, found twice, 14 months apart.
64
+
65
+ $ alluvia unfinished # B — threads you keep circling, never closing
66
+ 🧵 Test Infra Reorganization open · 4 sessions over 388 days
67
+
68
+ $ alluvia propose # C — new next-steps, grounded in YOUR notes
69
+ [prop:50bda956] Add server-side consistency check (feasibility 4/5)
70
+ ...cites: note:104966a3, note:93de85cc
71
+ $ alluvia rate prop:50bda956 --keep
72
+ ```
73
+
74
+ Plus a **weekly digest** (`alluvia digest run --if-due`) that brings ≤5
75
+ interrupt-worthy items to you — and stays silent when nothing clears the bar.
76
+
77
+ ## See it: the dashboard
78
+
79
+ ```bash
80
+ alluvia serve --open # http://localhost:8177
81
+ ```
82
+
83
+ Five views over your map — corpus overview, theme bubbles by status, the
84
+ **cross-tool bridge graph**, a weekly activity timeline with your
85
+ longest-unfinished threads, and your full judgments history. One
86
+ self-contained page, zero external requests, served only on 127.0.0.1.
87
+
88
+ ## Inside your assistant (MCP)
89
+
90
+ ```bash
91
+ claude mcp add alluvia -- uv run --directory <repo> alluvia mcp
92
+ ```
93
+
94
+ Eight tools let Claude Code / Cursor / any MCP client query your idea-map
95
+ mid-conversation: *"you circled this in April — here's where you landed."*
96
+
97
+ ## What leaves your machine
98
+
99
+ | Data | Where it goes |
100
+ |---|---|
101
+ | Raw conversations | **Nowhere.** Local SQLite, forever yours |
102
+ | Embeddings | **Nowhere.** Computed locally (fastembed/ONNX) |
103
+ | Distill / label / propose calls | Your configured LLM provider, under your API key, secret-scrubbed first |
104
+ | Telemetry | **There is none.** |
105
+
106
+ Provider is your choice — Groq (free tier works; alluvia chains per-model daily
107
+ budgets automatically), OpenAI, or Anthropic — with per-role model overrides
108
+ (`SIFT_LLM_MODEL_PROPOSE=...` for a stronger generator, cheap models for bulk
109
+ extraction).
110
+
111
+ ## How it works
112
+
113
+ ```
114
+ sources ─► ingest ─► RAW (never mutated) ─► distill ─► notes ─► embed
115
+ │
116
+ lenses ◄── themes/links/status ◄── cluster/link/track
117
+ │
118
+ CLI · MCP · weekly digest ratings ─► the eval corpus (yours)
119
+ ```
120
+
121
+ Three data classes with different guarantees: **raw** (source of truth, never
122
+ touched), **derived** (rebuildable from raw — improve the pipeline, re-run,
123
+ nothing lost), **judgments** (your ratings and digests — durable, never
124
+ regenerated).
125
+
126
+ ## Honest limits
127
+
128
+ - Windsurf/Antigravity transcripts live in schema-less protobuf stores; alluvia
129
+ detects and skips them cleanly. ChatGPT ingestion uses the official data
130
+ export (ZIP), not live capture.
131
+ - Generated proposals are guardrailed (must cite your notes, novelty-gated,
132
+ feasibility-labeled) but they're LLM output — you rate, alluvia learns.
133
+ - All accepted trade-offs live in [docs/DEBT.md](docs/DEBT.md), each with the
134
+ condition that triggers fixing it.
135
+
136
+ MIT · built local-first on purpose: the research this project started from
137
+ found that for developers, trust in this category is *owned data or nothing*.
@@ -0,0 +1 @@
1
+ __version__ = "0.0.1"