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.
- alluvia-0.1.0/.github/workflows/ci.yml +13 -0
- alluvia-0.1.0/.gitignore +6 -0
- alluvia-0.1.0/CHANGELOG.md +17 -0
- alluvia-0.1.0/LICENSE +21 -0
- alluvia-0.1.0/PKG-INFO +181 -0
- alluvia-0.1.0/README.md +137 -0
- alluvia-0.1.0/alluvia/__init__.py +1 -0
- alluvia-0.1.0/alluvia/cli.py +483 -0
- alluvia-0.1.0/alluvia/config.py +131 -0
- alluvia-0.1.0/alluvia/distill/__init__.py +0 -0
- alluvia-0.1.0/alluvia/distill/distiller.py +70 -0
- alluvia-0.1.0/alluvia/distill/scrub.py +50 -0
- alluvia-0.1.0/alluvia/engine/__init__.py +0 -0
- alluvia-0.1.0/alluvia/engine/cluster.py +16 -0
- alluvia-0.1.0/alluvia/engine/digest.py +103 -0
- alluvia-0.1.0/alluvia/engine/embed.py +41 -0
- alluvia-0.1.0/alluvia/engine/engine.py +206 -0
- alluvia-0.1.0/alluvia/engine/label.py +17 -0
- alluvia-0.1.0/alluvia/engine/link.py +61 -0
- alluvia-0.1.0/alluvia/engine/propose.py +216 -0
- alluvia-0.1.0/alluvia/engine/track.py +43 -0
- alluvia-0.1.0/alluvia/ingest/__init__.py +0 -0
- alluvia-0.1.0/alluvia/ingest/base.py +7 -0
- alluvia-0.1.0/alluvia/ingest/chatgpt_export.py +92 -0
- alluvia-0.1.0/alluvia/ingest/claude_code.py +105 -0
- alluvia-0.1.0/alluvia/ingest/vscode_fork.py +296 -0
- alluvia-0.1.0/alluvia/llm/__init__.py +0 -0
- alluvia-0.1.0/alluvia/llm/client.py +94 -0
- alluvia-0.1.0/alluvia/mcp_server.py +294 -0
- alluvia-0.1.0/alluvia/models.py +114 -0
- alluvia-0.1.0/alluvia/platform.py +29 -0
- alluvia-0.1.0/alluvia/static/index.html +271 -0
- alluvia-0.1.0/alluvia/store/__init__.py +0 -0
- alluvia-0.1.0/alluvia/store/db.py +154 -0
- alluvia-0.1.0/alluvia/store/repo.py +371 -0
- alluvia-0.1.0/alluvia/store/vector.py +114 -0
- alluvia-0.1.0/alluvia/web.py +261 -0
- alluvia-0.1.0/assets/logo.svg +16 -0
- alluvia-0.1.0/docs/DEBT.md +12 -0
- alluvia-0.1.0/docs/validation/2026-07-m2b-gate.md +37 -0
- alluvia-0.1.0/docs/validation/2026-07-m2c-gate.md +25 -0
- alluvia-0.1.0/pyproject.toml +42 -0
- alluvia-0.1.0/scripts/probe_forks.py +98 -0
- alluvia-0.1.0/tests/conftest.py +20 -0
- alluvia-0.1.0/tests/fixtures/sess-1.jsonl +2 -0
- alluvia-0.1.0/tests/test_backtest_gate_finds.py +52 -0
- alluvia-0.1.0/tests/test_chatgpt_export.py +61 -0
- alluvia-0.1.0/tests/test_cli_connections.py +39 -0
- alluvia-0.1.0/tests/test_cli_digest.py +77 -0
- alluvia-0.1.0/tests/test_cli_m0.py +16 -0
- alluvia-0.1.0/tests/test_cli_m1.py +52 -0
- alluvia-0.1.0/tests/test_cli_m2b.py +43 -0
- alluvia-0.1.0/tests/test_cli_m2c.py +87 -0
- alluvia-0.1.0/tests/test_cli_unfinished.py +33 -0
- alluvia-0.1.0/tests/test_config_toml.py +84 -0
- alluvia-0.1.0/tests/test_digest_engine.py +120 -0
- alluvia-0.1.0/tests/test_digest_store.py +38 -0
- alluvia-0.1.0/tests/test_distill_checkpoint.py +47 -0
- alluvia-0.1.0/tests/test_distill_scrub.py +14 -0
- alluvia-0.1.0/tests/test_distiller.py +43 -0
- alluvia-0.1.0/tests/test_engine_cluster.py +18 -0
- alluvia-0.1.0/tests/test_engine_embed.py +10 -0
- alluvia-0.1.0/tests/test_engine_label.py +16 -0
- alluvia-0.1.0/tests/test_engine_link.py +42 -0
- alluvia-0.1.0/tests/test_engine_refresh.py +56 -0
- alluvia-0.1.0/tests/test_engine_refresh_m2a.py +56 -0
- alluvia-0.1.0/tests/test_engine_track.py +60 -0
- alluvia-0.1.0/tests/test_ingest_claude_code.py +67 -0
- alluvia-0.1.0/tests/test_init.py +28 -0
- alluvia-0.1.0/tests/test_label_cache.py +84 -0
- alluvia-0.1.0/tests/test_link_m2b.py +35 -0
- alluvia-0.1.0/tests/test_live_hardening.py +38 -0
- alluvia-0.1.0/tests/test_llm_fake.py +7 -0
- alluvia-0.1.0/tests/test_llm_provider.py +30 -0
- alluvia-0.1.0/tests/test_mcp_protocol.py +24 -0
- alluvia-0.1.0/tests/test_mcp_tools.py +113 -0
- alluvia-0.1.0/tests/test_meta_strip.py +32 -0
- alluvia-0.1.0/tests/test_models.py +14 -0
- alluvia-0.1.0/tests/test_models_m2a.py +18 -0
- alluvia-0.1.0/tests/test_mute.py +49 -0
- alluvia-0.1.0/tests/test_orphaned_embeddings.py +16 -0
- alluvia-0.1.0/tests/test_platform.py +17 -0
- alluvia-0.1.0/tests/test_proposals_store.py +40 -0
- alluvia-0.1.0/tests/test_propose_engine.py +132 -0
- alluvia-0.1.0/tests/test_rated_via.py +18 -0
- alluvia-0.1.0/tests/test_role_map.py +24 -0
- alluvia-0.1.0/tests/test_scaled_clustering.py +16 -0
- alluvia-0.1.0/tests/test_smoke.py +5 -0
- alluvia-0.1.0/tests/test_store_m2a.py +43 -0
- alluvia-0.1.0/tests/test_store_notes.py +23 -0
- alluvia-0.1.0/tests/test_store_schema.py +9 -0
- alluvia-0.1.0/tests/test_store_sessions.py +31 -0
- alluvia-0.1.0/tests/test_vector_index.py +70 -0
- alluvia-0.1.0/tests/test_version_checkpoint.py +39 -0
- alluvia-0.1.0/tests/test_vscode_fork.py +164 -0
- alluvia-0.1.0/tests/test_web.py +91 -0
- alluvia-0.1.0/tests/test_web_search.py +54 -0
- alluvia-0.1.0/tests/test_wrapper_strip.py +48 -0
- 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
|
alluvia-0.1.0/.gitignore
ADDED
|
@@ -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*.
|
alluvia-0.1.0/README.md
ADDED
|
@@ -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"
|