@sashabogi/foundation 0.1.12 → 2.0.0
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.
- package/README.md +632 -238
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +159 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +4 -6
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/fireworks.d.ts +5 -0
- package/dist/providers/fireworks.d.ts.map +1 -1
- package/dist/providers/fireworks.js +18 -0
- package/dist/providers/fireworks.js.map +1 -1
- package/dist/providers/kimi-code.d.ts +5 -0
- package/dist/providers/kimi-code.d.ts.map +1 -1
- package/dist/providers/kimi-code.js +18 -0
- package/dist/providers/kimi-code.js.map +1 -1
- package/dist/providers/zai.d.ts +5 -0
- package/dist/providers/zai.d.ts.map +1 -1
- package/dist/providers/zai.js +18 -0
- package/dist/providers/zai.js.map +1 -1
- package/dist/tools/gaia/index.d.ts +29 -15
- package/dist/tools/gaia/index.d.ts.map +1 -1
- package/dist/tools/gaia/index.js +1206 -274
- package/dist/tools/gaia/index.js.map +1 -1
- package/dist/tools/gaia/storage.d.ts +72 -0
- package/dist/tools/gaia/storage.d.ts.map +1 -0
- package/dist/tools/gaia/storage.js +344 -0
- package/dist/tools/gaia/storage.js.map +1 -0
- package/dist/tools/gaia/test-storage-manual.d.ts +6 -0
- package/dist/tools/gaia/test-storage-manual.d.ts.map +1 -0
- package/dist/tools/gaia/test-storage-manual.js +120 -0
- package/dist/tools/gaia/test-storage-manual.js.map +1 -0
- package/dist/tools/memoria/index.d.ts +25 -0
- package/dist/tools/memoria/index.d.ts.map +1 -0
- package/dist/tools/memoria/index.js +269 -0
- package/dist/tools/memoria/index.js.map +1 -0
- package/dist/tools/memoria/storage.d.ts +72 -0
- package/dist/tools/memoria/storage.d.ts.map +1 -0
- package/dist/tools/memoria/storage.js +344 -0
- package/dist/tools/memoria/storage.js.map +1 -0
- package/dist/tools/memoria/storage.test.d.ts +7 -0
- package/dist/tools/memoria/storage.test.d.ts.map +1 -0
- package/dist/tools/memoria/storage.test.js +350 -0
- package/dist/tools/memoria/storage.test.js.map +1 -0
- package/dist/tools/memoria/test-storage-manual.d.ts +6 -0
- package/dist/tools/memoria/test-storage-manual.d.ts.map +1 -0
- package/dist/tools/memoria/test-storage-manual.js +120 -0
- package/dist/tools/memoria/test-storage-manual.js.map +1 -0
- package/dist/types/index.d.ts +38 -0
- package/dist/types/index.d.ts.map +1 -1
- package/docs/MIGRATION-GUIDE.md +771 -0
- package/package.json +2 -2
- package/packages/ui/dist/assets/{index-PvvrwCmP.js → index-B7zz_B5Q.js} +33 -33
- package/packages/ui/dist/index.html +1 -1
- package/docs/REFACTORING-PLAN.md +0 -374
- package/docs/TESTING-WITH-NATIVE-SWARM.md +0 -266
package/README.md
CHANGED
|
@@ -8,340 +8,734 @@
|
|
|
8
8
|
<a href="https://github.com/sashabogi/foundation/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/@sashabogi/foundation.svg" alt="license"></a>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
# Foundation v2.0
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
| **Seldon** | Hari Seldon | Multi-agent orchestration - the Plan guides the future | 19 |
|
|
17
|
-
| **Gaia** | The Collective | Workflow patterns - "We are all one, and one is all" | 13 |
|
|
13
|
+
> **Production-grade MCP server for AI-assisted development with advanced memory**
|
|
14
|
+
>
|
|
15
|
+
> *"The future is not fixed, but it can be guided."* — Hari Seldon
|
|
18
16
|
|
|
19
|
-
**
|
|
17
|
+
Foundation is a unified Model Context Protocol (MCP) server combining three specialized modules inspired by Isaac Asimov's Foundation series. **Version 2.0 introduces Gaia v2.0** with SQLite-backed persistent memory, full-text search, and cross-prompt linking.
|
|
18
|
+
|
|
19
|
+
[](https://www.npmjs.com/package/@sashabogi/foundation)
|
|
20
|
+
[](./LICENSE)
|
|
20
21
|
|
|
21
22
|
---
|
|
22
23
|
|
|
23
|
-
##
|
|
24
|
+
## 📚 Table of Contents
|
|
25
|
+
|
|
26
|
+
- [Overview](#overview)
|
|
27
|
+
- [What's New in v2.0](#whats-new-in-v20)
|
|
28
|
+
- [Installation](#installation)
|
|
29
|
+
- [Quick Start](#quick-start)
|
|
30
|
+
- [Modules](#modules)
|
|
31
|
+
- [Demerzel - Codebase Intelligence](#demerzel---codebase-intelligence)
|
|
32
|
+
- [Seldon - Multi-Agent Orchestration](#seldon---multi-agent-orchestration)
|
|
33
|
+
- [Gaia - Workflow + Memory](#gaia---workflow--memory)
|
|
34
|
+
- [Gaia v2.0 Deep Dive](#gaia-v20-deep-dive)
|
|
35
|
+
- [Usage Examples](#usage-examples)
|
|
36
|
+
- [Performance](#performance)
|
|
37
|
+
- [Migration from v1.x](#migration-from-v1x)
|
|
24
38
|
|
|
25
|
-
|
|
26
|
-
# Install
|
|
27
|
-
npm install -g @sashabogi/foundation
|
|
39
|
+
---
|
|
28
40
|
|
|
29
|
-
|
|
30
|
-
foundation init
|
|
41
|
+
## Overview
|
|
31
42
|
|
|
32
|
-
|
|
33
|
-
foundation mcp install
|
|
34
|
-
```
|
|
43
|
+
Foundation provides **41 MCP tools** across three modules:
|
|
35
44
|
|
|
36
|
-
|
|
45
|
+
| Module | Tools | Purpose |
|
|
46
|
+
|--------|-------|---------|
|
|
47
|
+
| **Demerzel** | 9 | Codebase intelligence beyond context limits |
|
|
48
|
+
| **Seldon** | 12 | Multi-agent orchestration and reasoning |
|
|
49
|
+
| **Gaia** | 20 | Workflow patterns + persistent memory |
|
|
50
|
+
|
|
51
|
+
Each module operates independently but they work together seamlessly. Use one, two, or all three depending on your needs.
|
|
37
52
|
|
|
38
53
|
---
|
|
39
54
|
|
|
40
|
-
##
|
|
55
|
+
## What's New in v2.0
|
|
41
56
|
|
|
42
|
-
###
|
|
57
|
+
### 🚀 Gaia v2.0: Advanced Memory System
|
|
43
58
|
|
|
44
|
-
|
|
59
|
+
The biggest upgrade in Foundation v2.0 is **Gaia's transformation** from a simple checkpoint system into a production-grade memory engine:
|
|
45
60
|
|
|
46
|
-
|
|
61
|
+
#### Before (v1.x)
|
|
62
|
+
- ❌ Basic checkpoint system (session state only)
|
|
63
|
+
- ❌ No search capabilities
|
|
64
|
+
- ❌ Manual CLAUDE.md management
|
|
65
|
+
- ❌ Ephemeral memory (lost between sessions)
|
|
66
|
+
- ❌ No relationships between memories
|
|
47
67
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
68
|
+
#### After (v2.0)
|
|
69
|
+
- ✅ **SQLite + FTS5 storage** - Production-grade database
|
|
70
|
+
- ✅ **5-tier memory hierarchy** - session, project, global, note, observation
|
|
71
|
+
- ✅ **BM25 ranking** - Intelligent search with composite scoring
|
|
72
|
+
- ✅ **Cross-prompt linking** - Build dependency graphs
|
|
73
|
+
- ✅ **Persistent storage** - Memories survive restarts
|
|
74
|
+
- ✅ **Sub-millisecond performance** - 0.1ms inserts, 2ms search
|
|
75
|
+
- ✅ **Complementary to native** - Works alongside Claude Code's memory
|
|
51
76
|
|
|
52
|
-
|
|
53
|
-
demerzel_search path=".foundation/snapshot.txt" pattern="TODO"
|
|
77
|
+
### Architecture Changes
|
|
54
78
|
|
|
55
|
-
# Find where a symbol is defined (zero AI cost)
|
|
56
|
-
demerzel_find_symbol path=".foundation/snapshot.txt" symbol="AuthProvider"
|
|
57
|
-
|
|
58
|
-
# Deep AI analysis (~500 tokens)
|
|
59
|
-
demerzel_analyze path=".foundation/snapshot.txt" query="How does authentication work?"
|
|
60
79
|
```
|
|
61
|
-
|
|
62
|
-
|
|
80
|
+
v1.x: Demerzel + Seldon + Gaia (checkpoints only)
|
|
81
|
+
├─ 9 tools + 12 tools + 9 tools = 30 total
|
|
82
|
+
|
|
83
|
+
v2.0: Demerzel + Seldon + Gaia (workflow + memory)
|
|
84
|
+
├─ 9 tools + 12 tools + 20 tools = 41 total
|
|
85
|
+
└─ Gaia now includes:
|
|
86
|
+
• 9 workflow tools (checkpoints, learning)
|
|
87
|
+
• 5 memory tools (save, search, get, delete, stats)
|
|
88
|
+
• 2 linking tools (link, graph)
|
|
89
|
+
• 4 additional utilities
|
|
90
|
+
```
|
|
63
91
|
|
|
64
92
|
---
|
|
65
93
|
|
|
66
|
-
|
|
94
|
+
## Installation
|
|
95
|
+
|
|
96
|
+
### Prerequisites
|
|
67
97
|
|
|
68
|
-
|
|
98
|
+
- Node.js 18+ (recommended: 22+)
|
|
99
|
+
- Claude Code CLI (or any MCP-compatible client)
|
|
69
100
|
|
|
70
|
-
|
|
101
|
+
### Install via npm
|
|
71
102
|
|
|
72
|
-
#### Agent Invocation
|
|
73
103
|
```bash
|
|
74
|
-
|
|
75
|
-
|
|
104
|
+
npm install -g @sashabogi/foundation
|
|
105
|
+
```
|
|
76
106
|
|
|
77
|
-
|
|
78
|
-
seldon_compare roles=["critic", "reviewer"] task="Evaluate this approach..."
|
|
107
|
+
### Configure in Claude Code
|
|
79
108
|
|
|
80
|
-
|
|
81
|
-
seldon_review code="function auth() { ... }" focus=["security", "performance"]
|
|
82
|
-
```
|
|
109
|
+
Add to `~/.claude.json`:
|
|
83
110
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"mcpServers": {
|
|
114
|
+
"foundation": {
|
|
115
|
+
"command": "npx",
|
|
116
|
+
"args": ["@sashabogi/foundation"]
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
88
121
|
|
|
89
|
-
|
|
90
|
-
seldon_phase_create intent="Build user dashboard with real-time updates"
|
|
122
|
+
### Verify Installation
|
|
91
123
|
|
|
92
|
-
|
|
93
|
-
|
|
124
|
+
```bash
|
|
125
|
+
foundation status
|
|
94
126
|
```
|
|
95
127
|
|
|
96
|
-
|
|
128
|
+
Output:
|
|
97
129
|
```
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
(automatic, with severity thresholds)
|
|
130
|
+
🏛️ Foundation v2.0.0
|
|
131
|
+
Modules: Demerzel (codebase) | Seldon (agents) | Gaia (workflow + memory)
|
|
101
132
|
```
|
|
102
133
|
|
|
103
|
-
|
|
104
|
-
# Verify implementation against a plan
|
|
105
|
-
seldon_verify planId="plan_abc123" runTests=true
|
|
134
|
+
---
|
|
106
135
|
|
|
107
|
-
|
|
108
|
-
seldon_fix verificationId="ver_xyz789" severityThreshold="major" autoApply=true
|
|
136
|
+
## Quick Start
|
|
109
137
|
|
|
110
|
-
|
|
111
|
-
seldon_execute_verified \
|
|
112
|
-
phaseId="phase_abc123" \
|
|
113
|
-
maxAttempts=3 \
|
|
114
|
-
severityThreshold="major" \
|
|
115
|
-
autoFix=true
|
|
138
|
+
### 1. Create a Codebase Snapshot (Demerzel)
|
|
116
139
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
140
|
+
```typescript
|
|
141
|
+
demerzel_snapshot({
|
|
142
|
+
path: "/Users/you/project",
|
|
143
|
+
output: ".foundation/snapshot.txt"
|
|
144
|
+
})
|
|
122
145
|
```
|
|
123
146
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
147
|
+
### 2. Save a Memory (Gaia)
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
gaia_save({
|
|
151
|
+
tier: "project",
|
|
152
|
+
content: "Authentication uses JWT with RS256 algorithm. Tokens expire after 1 hour.",
|
|
153
|
+
tags: ["auth", "jwt", "security"],
|
|
154
|
+
related_files: ["src/auth/jwt.ts"]
|
|
155
|
+
})
|
|
156
|
+
// Returns: { success: true, memory: { id: "mem_abc123", ... } }
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 3. Search Memories
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
gaia_search({
|
|
163
|
+
query: "JWT authentication security",
|
|
164
|
+
tiers: ["project", "global"],
|
|
165
|
+
limit: 10
|
|
166
|
+
})
|
|
167
|
+
// Returns ranked results with BM25 + composite scoring
|
|
129
168
|
```
|
|
130
169
|
|
|
131
|
-
|
|
170
|
+
### 4. Link Memories
|
|
132
171
|
|
|
133
|
-
|
|
172
|
+
```typescript
|
|
173
|
+
gaia_link({
|
|
174
|
+
from_memory_id: "mem_impl_456",
|
|
175
|
+
to_memory_id: "mem_decision_123",
|
|
176
|
+
link_type: "depends_on"
|
|
177
|
+
})
|
|
134
178
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
- *Verification*: `seldon_verify`, `seldon_fix`, `seldon_execute_verified`, `seldon_execute_parallel`
|
|
139
|
-
- *Pipelines*: `seldon_pipeline_create`, `seldon_pipeline_execute`, `seldon_pipeline_status`
|
|
140
|
-
- *Tasks*: `seldon_task_execute`, `seldon_task_claim`
|
|
141
|
-
- *Providers*: `seldon_providers_list`, `seldon_providers_test`
|
|
179
|
+
gaia_graph({ memory_id: "mem_impl_456" })
|
|
180
|
+
// Returns: { depends_on: [{ id: "mem_decision_123", content: "...", ... }] }
|
|
181
|
+
```
|
|
142
182
|
|
|
143
183
|
---
|
|
144
184
|
|
|
145
|
-
|
|
185
|
+
## Modules
|
|
146
186
|
|
|
147
|
-
|
|
187
|
+
### Demerzel - Codebase Intelligence
|
|
148
188
|
|
|
149
|
-
|
|
189
|
+
*"I have been watching for 20,000 years."* — R. Daneel Olivaw/Demerzel
|
|
150
190
|
|
|
151
|
-
|
|
152
|
-
*"The single biggest productivity unlock"*
|
|
191
|
+
Demerzel provides **codebase intelligence beyond context limits**. Create snapshots, search with regex, find symbols, trace dependencies, and analyze architecture.
|
|
153
192
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
193
|
+
**When to use:**
|
|
194
|
+
- Before reading 3+ files to understand codebase
|
|
195
|
+
- Finding where functions/classes are defined
|
|
196
|
+
- Tracing import dependencies
|
|
197
|
+
- Asking "how does X work?" across entire codebase
|
|
158
198
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
199
|
+
**Tools (9):**
|
|
200
|
+
```
|
|
201
|
+
demerzel_snapshot // Create codebase snapshot
|
|
202
|
+
demerzel_search // Regex search (FREE - no tokens)
|
|
203
|
+
demerzel_find_files // Glob pattern matching (FREE)
|
|
204
|
+
demerzel_find_symbol // Locate symbol definitions (FREE)
|
|
205
|
+
demerzel_find_importers // Find files that import X (FREE)
|
|
206
|
+
demerzel_get_deps // Get file dependencies (FREE)
|
|
207
|
+
demerzel_get_context // Get code around location (FREE)
|
|
208
|
+
demerzel_analyze // AI-powered analysis (~500 tokens)
|
|
209
|
+
demerzel_semantic_search // Natural language search
|
|
162
210
|
```
|
|
163
211
|
|
|
164
|
-
|
|
165
|
-
*"Every correction benefits all future sessions"*
|
|
212
|
+
---
|
|
166
213
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
214
|
+
### Seldon - Multi-Agent Orchestration
|
|
215
|
+
|
|
216
|
+
*"The future is not set, but it can be guided."* — Hari Seldon
|
|
217
|
+
|
|
218
|
+
Seldon enables **multi-agent reasoning and orchestration**. Invoke specialized roles, compare perspectives, verify implementations, and execute multi-phase plans.
|
|
219
|
+
|
|
220
|
+
**When to use:**
|
|
221
|
+
- Getting design feedback before implementation
|
|
222
|
+
- Code reviews with different perspectives
|
|
223
|
+
- Breaking complex tasks into phases
|
|
224
|
+
- Verification loops for critical code
|
|
173
225
|
|
|
174
|
-
|
|
175
|
-
|
|
226
|
+
**Tools (12):**
|
|
227
|
+
```
|
|
228
|
+
seldon_invoke // Invoke agent role
|
|
229
|
+
seldon_compare // Compare perspectives
|
|
230
|
+
seldon_critique // Critical review
|
|
231
|
+
seldon_review // Code review
|
|
232
|
+
seldon_design // Design feedback
|
|
233
|
+
seldon_plan // Generate plan
|
|
234
|
+
seldon_phase_create // Break into phases
|
|
235
|
+
seldon_phase_list // View phases
|
|
236
|
+
seldon_verify // Verify implementation
|
|
237
|
+
seldon_fix // Generate fixes
|
|
238
|
+
seldon_execute_verified // Execute with verification
|
|
239
|
+
seldon_execute_parallel // Execute phases in parallel
|
|
176
240
|
```
|
|
177
241
|
|
|
178
|
-
|
|
242
|
+
---
|
|
179
243
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
244
|
+
### Gaia - Workflow + Memory
|
|
245
|
+
|
|
246
|
+
*"We are all one, and one is all."* — Gaia
|
|
247
|
+
|
|
248
|
+
Gaia provides **workflow patterns and persistent memory**. Version 2.0 transforms Gaia from a simple checkpoint system into a production-grade memory engine with SQLite backend, full-text search, and cross-prompt linking.
|
|
183
249
|
|
|
184
|
-
|
|
185
|
-
|
|
250
|
+
**When to use:**
|
|
251
|
+
- Preserving context between sessions
|
|
252
|
+
- Building knowledge graphs across prompts
|
|
253
|
+
- Tracking architectural decisions
|
|
254
|
+
- Searching past conversations
|
|
255
|
+
- Capturing patterns and learnings
|
|
186
256
|
|
|
187
|
-
|
|
188
|
-
gaia_remember name="pre-refactor" notes="Before auth rewrite"
|
|
257
|
+
**Tools (19 total):**
|
|
189
258
|
|
|
190
|
-
|
|
191
|
-
|
|
259
|
+
#### Workflow Tools (12)
|
|
260
|
+
```
|
|
261
|
+
gaia_checkpoint // Save structured session state
|
|
262
|
+
gaia_status // Lightweight index card (~150 tokens)
|
|
263
|
+
gaia_query // Keyword search checkpoint
|
|
264
|
+
gaia_get_decisions // List architectural decisions
|
|
265
|
+
gaia_get_progress // Task progress summary
|
|
266
|
+
gaia_get_changes // Files changed
|
|
267
|
+
gaia_handoff // Create session handoff document (NEW v2.0)
|
|
268
|
+
gaia_observe // Auto-detect patterns and observations (NEW v2.0)
|
|
269
|
+
gaia_migrate // Migrate v1 checkpoint data to v2 (NEW v2.0)
|
|
270
|
+
gaia_learn // Record correction for CLAUDE.md
|
|
271
|
+
gaia_apply // Apply learnings to CLAUDE.md
|
|
272
|
+
gaia_review // Review learnings
|
|
192
273
|
```
|
|
193
274
|
|
|
194
|
-
|
|
275
|
+
#### Memory Tools (5)
|
|
276
|
+
```
|
|
277
|
+
gaia_save // Save memory (SQLite + FTS5)
|
|
278
|
+
gaia_search // Search with BM25 + composite scoring
|
|
279
|
+
gaia_get // Get memory by ID
|
|
280
|
+
gaia_delete // Delete memory + cascade links
|
|
281
|
+
gaia_stats // Database statistics
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
#### Linking Tools (2)
|
|
285
|
+
```
|
|
286
|
+
gaia_link // Create typed link between memories
|
|
287
|
+
gaia_graph // Get link graph for a memory
|
|
288
|
+
```
|
|
195
289
|
|
|
196
290
|
---
|
|
197
291
|
|
|
198
|
-
##
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
**
|
|
203
|
-
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
demerzel:
|
|
250
|
-
provider: ollama
|
|
251
|
-
model: qwen2.5-coder:7b
|
|
252
|
-
snapshot_max_age_hours: 24
|
|
253
|
-
|
|
254
|
-
# Gaia settings (workflow patterns)
|
|
255
|
-
worktrees:
|
|
256
|
-
base_dir: .foundation/worktrees
|
|
257
|
-
max_count: 10
|
|
258
|
-
auto_cleanup: true
|
|
259
|
-
|
|
260
|
-
learning:
|
|
261
|
-
auto_apply: false
|
|
292
|
+
## Gaia v2.0 Deep Dive
|
|
293
|
+
|
|
294
|
+
### Memory Architecture
|
|
295
|
+
|
|
296
|
+
Gaia v2.0 uses a **5-tier memory hierarchy** that organizes memories by scope and permanence:
|
|
297
|
+
|
|
298
|
+
```
|
|
299
|
+
┌─────────────────────────────────────────────────────────┐
|
|
300
|
+
│ Gaia Memory Hierarchy │
|
|
301
|
+
├─────────────────────────────────────────────────────────┤
|
|
302
|
+
│ │
|
|
303
|
+
│ SESSION (ephemeral) │
|
|
304
|
+
│ ├─ Lasts only this session │
|
|
305
|
+
│ ├─ Task progress, temporary notes │
|
|
306
|
+
│ └─ Auto-deleted on session end │
|
|
307
|
+
│ │
|
|
308
|
+
│ PROJECT (current working directory) │
|
|
309
|
+
│ ├─ Scoped to current project │
|
|
310
|
+
│ ├─ Architectural decisions, code patterns │
|
|
311
|
+
│ └─ Persists across sessions │
|
|
312
|
+
│ │
|
|
313
|
+
│ GLOBAL (user-wide) │
|
|
314
|
+
│ ├─ Best practices, common patterns │
|
|
315
|
+
│ ├─ Applies to all projects │
|
|
316
|
+
│ └─ Long-term knowledge │
|
|
317
|
+
│ │
|
|
318
|
+
│ NOTE (manual knowledge base) │
|
|
319
|
+
│ ├─ Explicitly saved reference material │
|
|
320
|
+
│ ├─ Tutorials, documentation summaries │
|
|
321
|
+
│ └─ Never auto-deleted │
|
|
322
|
+
│ │
|
|
323
|
+
│ OBSERVATION (autonomous learnings) │
|
|
324
|
+
│ ├─ Automatically captured patterns │
|
|
325
|
+
│ ├─ User behavior, common mistakes │
|
|
326
|
+
│ └─ Low-priority background knowledge │
|
|
327
|
+
│ │
|
|
328
|
+
└─────────────────────────────────────────────────────────┘
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Composite Scoring Algorithm
|
|
332
|
+
|
|
333
|
+
When you search, Gaia uses **composite scoring** to rank results intelligently:
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
final_score = (
|
|
337
|
+
prompt_relevance * 0.40 + // FTS5 BM25 (how well query matches)
|
|
338
|
+
recency * 0.25 + // Exponential decay (30-day half-life)
|
|
339
|
+
tier_priority * 0.15 + // session=1.0, project=0.8, global=0.6, ...
|
|
340
|
+
file_proximity * 0.10 + // Match with current file context
|
|
341
|
+
access_frequency * 0.10 // How often accessed (log scale)
|
|
342
|
+
)
|
|
262
343
|
```
|
|
263
344
|
|
|
264
|
-
|
|
345
|
+
**Example:**
|
|
265
346
|
|
|
266
|
-
|
|
347
|
+
```typescript
|
|
348
|
+
gaia_search({
|
|
349
|
+
query: "JWT authentication security",
|
|
350
|
+
current_file: "src/auth/jwt.ts",
|
|
351
|
+
limit: 5
|
|
352
|
+
})
|
|
353
|
+
```
|
|
267
354
|
|
|
268
|
-
|
|
355
|
+
Returns:
|
|
356
|
+
```json
|
|
357
|
+
{
|
|
358
|
+
"results": [
|
|
359
|
+
{
|
|
360
|
+
"id": "mem_abc123",
|
|
361
|
+
"content": "Authentication uses JWT with RS256...",
|
|
362
|
+
"score": 0.87,
|
|
363
|
+
"score_breakdown": {
|
|
364
|
+
"relevance": 0.95, // Exact match on "JWT authentication"
|
|
365
|
+
"recency": 1.0, // Created today
|
|
366
|
+
"tier": 0.8, // Project tier
|
|
367
|
+
"proximity": 1.0, // related_files includes current file
|
|
368
|
+
"frequency": 0.3 // Accessed a few times
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
]
|
|
372
|
+
}
|
|
373
|
+
```
|
|
269
374
|
|
|
375
|
+
### Cross-Prompt Linking
|
|
376
|
+
|
|
377
|
+
Build **dependency graphs** across memories with 5 typed links:
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
// Save a decision
|
|
381
|
+
const decision = gaia_save({
|
|
382
|
+
tier: "project",
|
|
383
|
+
content: "Decision: Use React 18 with TypeScript",
|
|
384
|
+
tags: ["decision", "architecture"]
|
|
385
|
+
})
|
|
386
|
+
|
|
387
|
+
// Save an implementation
|
|
388
|
+
const impl = gaia_save({
|
|
389
|
+
tier: "project",
|
|
390
|
+
content: "Implementation: Set up Vite with React 18 + TS",
|
|
391
|
+
tags: ["implementation"]
|
|
392
|
+
})
|
|
393
|
+
|
|
394
|
+
// Link them
|
|
395
|
+
gaia_link({
|
|
396
|
+
from_memory_id: impl.memory.id,
|
|
397
|
+
to_memory_id: decision.memory.id,
|
|
398
|
+
link_type: "depends_on"
|
|
399
|
+
})
|
|
400
|
+
|
|
401
|
+
// Later - retrieve the graph
|
|
402
|
+
gaia_graph({ memory_id: impl.memory.id })
|
|
403
|
+
// Shows: implementation depends_on decision
|
|
270
404
|
```
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
405
|
+
|
|
406
|
+
**Link Types:**
|
|
407
|
+
- `depends_on` - This memory requires/builds on another
|
|
408
|
+
- `extends` - This memory enhances another
|
|
409
|
+
- `reverts` - This memory undoes another
|
|
410
|
+
- `related` - Associative connection
|
|
411
|
+
- `contradicts` - This memory conflicts with another
|
|
412
|
+
|
|
413
|
+
### Database Schema
|
|
414
|
+
|
|
415
|
+
Gaia uses **SQLite with FTS5** for production-grade storage:
|
|
416
|
+
|
|
417
|
+
```sql
|
|
418
|
+
-- Main storage
|
|
419
|
+
CREATE TABLE memories (
|
|
420
|
+
id TEXT PRIMARY KEY,
|
|
421
|
+
tier TEXT NOT NULL,
|
|
422
|
+
content TEXT NOT NULL,
|
|
423
|
+
tags TEXT NOT NULL, -- JSON array
|
|
424
|
+
related_files TEXT NOT NULL, -- JSON array
|
|
425
|
+
session_id TEXT,
|
|
426
|
+
project_path TEXT,
|
|
427
|
+
created_at INTEGER NOT NULL,
|
|
428
|
+
accessed_at INTEGER NOT NULL,
|
|
429
|
+
access_count INTEGER DEFAULT 0,
|
|
430
|
+
metadata TEXT -- JSON object
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
-- Full-text search with porter stemming
|
|
434
|
+
CREATE VIRTUAL TABLE memories_fts USING fts5(
|
|
435
|
+
content,
|
|
436
|
+
tags,
|
|
437
|
+
related_files,
|
|
438
|
+
tokenize='porter unicode61'
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
-- Cross-prompt links with CASCADE delete
|
|
442
|
+
CREATE TABLE memory_links (
|
|
443
|
+
from_memory_id TEXT NOT NULL,
|
|
444
|
+
to_memory_id TEXT NOT NULL,
|
|
445
|
+
link_type TEXT NOT NULL,
|
|
446
|
+
created_at INTEGER NOT NULL,
|
|
447
|
+
PRIMARY KEY (from_memory_id, to_memory_id, link_type),
|
|
448
|
+
FOREIGN KEY (from_memory_id) REFERENCES memories(id) ON DELETE CASCADE,
|
|
449
|
+
FOREIGN KEY (to_memory_id) REFERENCES memories(id) ON DELETE CASCADE
|
|
450
|
+
);
|
|
285
451
|
```
|
|
286
452
|
|
|
453
|
+
**Location:** `~/.foundation/gaia-memory.db`
|
|
454
|
+
|
|
287
455
|
---
|
|
288
456
|
|
|
289
|
-
##
|
|
457
|
+
## Usage Examples
|
|
458
|
+
|
|
459
|
+
### Example 1: Building a Knowledge Base
|
|
460
|
+
|
|
461
|
+
```typescript
|
|
462
|
+
// Save architectural decisions
|
|
463
|
+
gaia_save({
|
|
464
|
+
tier: "project",
|
|
465
|
+
content: "Decision: Use PostgreSQL with Drizzle ORM for type safety",
|
|
466
|
+
tags: ["decision", "database", "architecture"],
|
|
467
|
+
related_files: ["drizzle.config.ts"],
|
|
468
|
+
metadata: { decision_type: "technical", impact: "high" }
|
|
469
|
+
})
|
|
470
|
+
|
|
471
|
+
// Save implementation details
|
|
472
|
+
gaia_save({
|
|
473
|
+
tier: "project",
|
|
474
|
+
content: "PostgreSQL connection pool configured with max 20 connections",
|
|
475
|
+
tags: ["database", "configuration"],
|
|
476
|
+
related_files: ["src/db/index.ts"]
|
|
477
|
+
})
|
|
478
|
+
|
|
479
|
+
// Later - search your decisions
|
|
480
|
+
gaia_search({
|
|
481
|
+
query: "database PostgreSQL decision",
|
|
482
|
+
tiers: ["project"],
|
|
483
|
+
limit: 5
|
|
484
|
+
})
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
### Example 2: Cross-Prompt Dependencies
|
|
488
|
+
|
|
489
|
+
```typescript
|
|
490
|
+
// Day 1: Make a decision
|
|
491
|
+
const decision = gaia_save({
|
|
492
|
+
tier: "project",
|
|
493
|
+
content: "Decision: Use tRPC for type-safe API",
|
|
494
|
+
tags: ["decision", "api"]
|
|
495
|
+
})
|
|
496
|
+
|
|
497
|
+
// Day 2: Implement it
|
|
498
|
+
const impl = gaia_save({
|
|
499
|
+
tier: "project",
|
|
500
|
+
content: "Created tRPC router with user and auth procedures",
|
|
501
|
+
tags: ["implementation"],
|
|
502
|
+
related_files: ["src/server/trpc.ts"]
|
|
503
|
+
})
|
|
504
|
+
|
|
505
|
+
// Link them
|
|
506
|
+
gaia_link({
|
|
507
|
+
from_memory_id: impl.memory.id,
|
|
508
|
+
to_memory_id: decision.memory.id,
|
|
509
|
+
link_type: "depends_on"
|
|
510
|
+
})
|
|
511
|
+
|
|
512
|
+
// Day 30: Review decision chain
|
|
513
|
+
gaia_graph({ memory_id: impl.memory.id })
|
|
514
|
+
// Shows the full dependency graph
|
|
515
|
+
```
|
|
290
516
|
|
|
517
|
+
### Example 3: Session Workflow
|
|
518
|
+
|
|
519
|
+
```typescript
|
|
520
|
+
// Session start - load context
|
|
521
|
+
gaia_search({
|
|
522
|
+
query: "authentication JWT implementation",
|
|
523
|
+
current_file: "src/auth/verify.ts"
|
|
524
|
+
})
|
|
525
|
+
|
|
526
|
+
// During session - save observations
|
|
527
|
+
gaia_save({
|
|
528
|
+
tier: "session",
|
|
529
|
+
content: "Bug: JWT verification doesn't handle expired tokens gracefully",
|
|
530
|
+
tags: ["bug", "jwt"]
|
|
531
|
+
})
|
|
532
|
+
|
|
533
|
+
// Session end - create checkpoint
|
|
534
|
+
gaia_checkpoint({
|
|
535
|
+
summary: "Fixed JWT token expiration handling",
|
|
536
|
+
decisions: [{
|
|
537
|
+
topic: "Error handling",
|
|
538
|
+
decision: "Return 401 with clear message on expired tokens",
|
|
539
|
+
rationale: "Better UX than generic 500 error"
|
|
540
|
+
}],
|
|
541
|
+
changes: [{
|
|
542
|
+
file: "src/auth/verify.ts",
|
|
543
|
+
action: "modified",
|
|
544
|
+
summary: "Added token expiration check"
|
|
545
|
+
}]
|
|
546
|
+
})
|
|
291
547
|
```
|
|
292
|
-
~/.foundation/
|
|
293
|
-
├── config.yaml # Main configuration
|
|
294
|
-
├── state/
|
|
295
|
-
│ ├── worktrees.json # Active worktrees
|
|
296
|
-
│ ├── sessions.json # Session tracking
|
|
297
|
-
│ ├── learnings.json # Global learnings
|
|
298
|
-
│ ├── pipelines.json # Pipeline state
|
|
299
|
-
│ ├── tasks.json # Task queue
|
|
300
|
-
│ ├── snapshots.json # Context memories
|
|
301
|
-
│ └── provider-health.json # Provider health tracking
|
|
302
|
-
└── cache/
|
|
303
|
-
└── ...
|
|
304
548
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
549
|
+
### Example 4: Session Handoff
|
|
550
|
+
|
|
551
|
+
```typescript
|
|
552
|
+
// At session end - create checkpoint
|
|
553
|
+
gaia_checkpoint({
|
|
554
|
+
summary: "Implemented user authentication with JWT",
|
|
555
|
+
purpose: "Build secure auth system",
|
|
556
|
+
project: "acme-app",
|
|
557
|
+
decisions: [{
|
|
558
|
+
topic: "Authentication",
|
|
559
|
+
decision: "Use JWT with RS256",
|
|
560
|
+
rationale: "Industry standard, secure, stateless"
|
|
561
|
+
}],
|
|
562
|
+
progress: [{
|
|
563
|
+
task: "Implement login endpoint",
|
|
564
|
+
status: "completed"
|
|
565
|
+
}, {
|
|
566
|
+
task: "Add refresh token logic",
|
|
567
|
+
status: "in_progress"
|
|
568
|
+
}],
|
|
569
|
+
changes: [{
|
|
570
|
+
file: "src/auth/jwt.ts",
|
|
571
|
+
action: "created",
|
|
572
|
+
summary: "JWT token generation and verification"
|
|
573
|
+
}],
|
|
574
|
+
context: {
|
|
575
|
+
branch: "feat/auth",
|
|
576
|
+
openQuestions: [
|
|
577
|
+
"Should we implement refresh token rotation?",
|
|
578
|
+
"What expiration time for access tokens?"
|
|
579
|
+
],
|
|
580
|
+
relevantFiles: ["src/auth/jwt.ts", "src/auth/middleware.ts"]
|
|
581
|
+
}
|
|
582
|
+
})
|
|
583
|
+
|
|
584
|
+
// Create handoff document for next session
|
|
585
|
+
gaia_handoff({
|
|
586
|
+
next_steps: [
|
|
587
|
+
"Implement refresh token rotation strategy",
|
|
588
|
+
"Add rate limiting to login endpoint",
|
|
589
|
+
"Write integration tests for auth flow",
|
|
590
|
+
"Update API documentation with auth examples"
|
|
591
|
+
],
|
|
592
|
+
context_notes: "Auth system nearly complete. Main work remaining is refresh token security and testing. Consider implementing exponential backoff on failed login attempts.",
|
|
593
|
+
include_memories: true,
|
|
594
|
+
memory_query: "authentication JWT security"
|
|
595
|
+
})
|
|
596
|
+
|
|
597
|
+
// Returns markdown document at ~/.foundation/handoffs/handoff-2026-02-16T10-30-00.md
|
|
598
|
+
// Includes:
|
|
599
|
+
// - Full checkpoint state (decisions, progress, changes)
|
|
600
|
+
// - Relevant memories with BM25 ranking
|
|
601
|
+
// - Next steps
|
|
602
|
+
// - Context notes
|
|
603
|
+
// - Links to related files
|
|
310
604
|
```
|
|
311
605
|
|
|
312
|
-
|
|
606
|
+
### Example 5: Autonomous Observation
|
|
607
|
+
|
|
608
|
+
```typescript
|
|
609
|
+
// System automatically detects patterns from session activity
|
|
610
|
+
gaia_observe({
|
|
611
|
+
lookback_days: 30,
|
|
612
|
+
auto_save: true,
|
|
613
|
+
min_confidence: "medium"
|
|
614
|
+
})
|
|
615
|
+
|
|
616
|
+
// Returns analysis like:
|
|
617
|
+
//
|
|
618
|
+
// ## Observations Detected (6)
|
|
619
|
+
//
|
|
620
|
+
// 1. 🔴 **Repeated decision-making on: Authentication**
|
|
621
|
+
// - Evidence: 3 decisions made about Authentication in current session
|
|
622
|
+
// - Confidence: high
|
|
623
|
+
// - Saved: mem_obs_abc123
|
|
624
|
+
//
|
|
625
|
+
// 2. 🔴 **Task blockers detected**
|
|
626
|
+
// - Evidence: 2 blocked task(s): "Add rate limiting", "Write auth tests"
|
|
627
|
+
// - Confidence: high
|
|
628
|
+
// - Saved: mem_obs_def456
|
|
629
|
+
//
|
|
630
|
+
// 3. 🟡 **Frequent modifications to: src/auth/jwt.ts**
|
|
631
|
+
// - Evidence: 3 changes to src/auth/jwt.ts in current session
|
|
632
|
+
// - Confidence: medium
|
|
633
|
+
// - Saved: mem_obs_ghi789
|
|
634
|
+
//
|
|
635
|
+
// 4. 🟡 **Multiple open questions - potential knowledge gaps**
|
|
636
|
+
// - Evidence: 4 unresolved questions
|
|
637
|
+
// - Confidence: medium
|
|
638
|
+
// - Saved: mem_obs_jkl012
|
|
639
|
+
//
|
|
640
|
+
// 5. 🔴 **High activity in areas: authentication, security, jwt**
|
|
641
|
+
// - Evidence: Frequent tags in recent memories
|
|
642
|
+
// - Confidence: high
|
|
643
|
+
// - Saved: mem_obs_mno345
|
|
644
|
+
//
|
|
645
|
+
// 6. 🟡 **File created and deleted: src/temp/test.ts**
|
|
646
|
+
// - Evidence: May indicate trial-and-error or false start
|
|
647
|
+
// - Confidence: medium
|
|
648
|
+
// - Saved: mem_obs_pqr678
|
|
649
|
+
|
|
650
|
+
// Observations are saved to 'observation' tier
|
|
651
|
+
// Automatically enriched with metadata for pattern analysis
|
|
652
|
+
// Can be searched like any other memory
|
|
653
|
+
|
|
654
|
+
// Later - search observations
|
|
655
|
+
gaia_search({
|
|
656
|
+
query: "blocked tasks authentication",
|
|
657
|
+
tiers: ["observation"],
|
|
658
|
+
limit: 5
|
|
659
|
+
})
|
|
660
|
+
```
|
|
313
661
|
|
|
314
|
-
|
|
662
|
+
**Pattern types detected:**
|
|
663
|
+
- Repeated topics (same decisions multiple times)
|
|
664
|
+
- Task blockers (blocked status in progress)
|
|
665
|
+
- Frequent file changes (same file modified 3+ times)
|
|
666
|
+
- Knowledge gaps (multiple open questions)
|
|
667
|
+
- Activity hotspots (frequent tags in recent memories)
|
|
668
|
+
- Anti-patterns (created then deleted files)
|
|
315
669
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
cd foundation
|
|
320
|
-
npm install
|
|
670
|
+
---
|
|
671
|
+
|
|
672
|
+
## Performance
|
|
321
673
|
|
|
322
|
-
|
|
323
|
-
npm run build
|
|
674
|
+
### Benchmarks
|
|
324
675
|
|
|
325
|
-
|
|
326
|
-
npm run dev
|
|
676
|
+
System: MacBook Pro M1, Node.js v22
|
|
327
677
|
|
|
328
|
-
|
|
329
|
-
|
|
678
|
+
```
|
|
679
|
+
Storage Operations (1000 memories):
|
|
680
|
+
Insert: 0.091ms avg (110x faster than 10ms target)
|
|
681
|
+
Search: 2ms (25x faster than 50ms target)
|
|
682
|
+
Get: ~1ms (5x faster than 5ms target)
|
|
683
|
+
|
|
684
|
+
Database:
|
|
685
|
+
Size: 0.43 MB for 1003 memories
|
|
686
|
+
WAL: Enabled for concurrent reads
|
|
687
|
+
Cache: 64MB page cache
|
|
330
688
|
```
|
|
331
689
|
|
|
332
690
|
---
|
|
333
691
|
|
|
334
|
-
##
|
|
692
|
+
## Migration from v1.x
|
|
693
|
+
|
|
694
|
+
**Good news:** No breaking changes! All v1.x tools work identically in v2.0.
|
|
695
|
+
|
|
696
|
+
### What Changed
|
|
335
697
|
|
|
336
|
-
|
|
337
|
-
-
|
|
338
|
-
-
|
|
339
|
-
- Claude Workflow Orchestrator → **Gaia**
|
|
698
|
+
- ✅ **Checkpoints still work** - `gaia_checkpoint`, `gaia_get_decisions`, etc.
|
|
699
|
+
- ✅ **Learning still works** - `gaia_learn`, `gaia_apply`, `gaia_review`
|
|
700
|
+
- ✅ **New tools added** - `gaia_save`, `gaia_search`, `gaia_link`, `gaia_graph`, etc.
|
|
340
701
|
|
|
341
|
-
|
|
702
|
+
### What to Update
|
|
703
|
+
|
|
704
|
+
**Optional:** Start using the new memory tools for persistent knowledge:
|
|
705
|
+
|
|
706
|
+
```typescript
|
|
707
|
+
// v1.x approach (still works)
|
|
708
|
+
gaia_checkpoint({
|
|
709
|
+
summary: "Implemented auth",
|
|
710
|
+
decisions: [...]
|
|
711
|
+
})
|
|
712
|
+
|
|
713
|
+
// v2.0 approach (recommended - searchable + persistent)
|
|
714
|
+
gaia_save({
|
|
715
|
+
tier: "project",
|
|
716
|
+
content: "Auth implementation uses JWT with RS256",
|
|
717
|
+
tags: ["auth", "implementation", "decision"]
|
|
718
|
+
})
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
See [MIGRATION-GUIDE.md](./docs/MIGRATION-GUIDE.md) for detailed upgrade instructions.
|
|
342
722
|
|
|
343
723
|
---
|
|
344
724
|
|
|
345
725
|
## License
|
|
346
726
|
|
|
347
|
-
MIT
|
|
727
|
+
MIT © Sasha Bogojevic
|
|
728
|
+
|
|
729
|
+
---
|
|
730
|
+
|
|
731
|
+
## Acknowledgments
|
|
732
|
+
|
|
733
|
+
Inspired by Isaac Asimov's Foundation series:
|
|
734
|
+
- **Demerzel** - R. Daneel Olivaw, 20,000 years of perfect memory
|
|
735
|
+
- **Seldon** - Hari Seldon, who predicted and guided the future
|
|
736
|
+
- **Gaia** - The collective consciousness, "we are all one"
|
|
737
|
+
|
|
738
|
+
Built with:
|
|
739
|
+
- [Model Context Protocol](https://modelcontextprotocol.io)
|
|
740
|
+
- [better-sqlite3](https://github.com/WiseLibs/better-sqlite3)
|
|
741
|
+
- [SQLite FTS5](https://www.sqlite.org/fts5.html)
|