convos 0.8.1__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 (35) hide show
  1. convos-0.8.1/LICENSE +21 -0
  2. convos-0.8.1/PKG-INFO +447 -0
  3. convos-0.8.1/README.md +417 -0
  4. convos-0.8.1/pyproject.toml +59 -0
  5. convos-0.8.1/setup.cfg +4 -0
  6. convos-0.8.1/skills/convos/SKILL.md +235 -0
  7. convos-0.8.1/src/ai_convos/__init__.py +3 -0
  8. convos-0.8.1/src/ai_convos/__main__.py +4 -0
  9. convos-0.8.1/src/ai_convos/cli.py +1310 -0
  10. convos-0.8.1/src/convos.egg-info/PKG-INFO +447 -0
  11. convos-0.8.1/src/convos.egg-info/SOURCES.txt +33 -0
  12. convos-0.8.1/src/convos.egg-info/dependency_links.txt +1 -0
  13. convos-0.8.1/src/convos.egg-info/entry_points.txt +2 -0
  14. convos-0.8.1/src/convos.egg-info/requires.txt +19 -0
  15. convos-0.8.1/src/convos.egg-info/top_level.txt +1 -0
  16. convos-0.8.1/tests/test_budget.py +54 -0
  17. convos-0.8.1/tests/test_changegraph.py +138 -0
  18. convos-0.8.1/tests/test_eval.py +69 -0
  19. convos-0.8.1/tests/test_explore.py +62 -0
  20. convos-0.8.1/tests/test_hooks.py +291 -0
  21. convos-0.8.1/tests/test_hybrid.py +260 -0
  22. convos-0.8.1/tests/test_integrations.py +545 -0
  23. convos-0.8.1/tests/test_memory.py +682 -0
  24. convos-0.8.1/tests/test_parsers.py +658 -0
  25. convos-0.8.1/tests/test_provenance.py +124 -0
  26. convos-0.8.1/tests/test_redact.py +95 -0
  27. convos-0.8.1/tests/test_remote_acceptance.py +85 -0
  28. convos-0.8.1/tests/test_remote_client.py +503 -0
  29. convos-0.8.1/tests/test_remote_control.py +57 -0
  30. convos-0.8.1/tests/test_remote_examples.py +10 -0
  31. convos-0.8.1/tests/test_remote_operations.py +39 -0
  32. convos-0.8.1/tests/test_remote_projection.py +182 -0
  33. convos-0.8.1/tests/test_remote_protocol.py +117 -0
  34. convos-0.8.1/tests/test_remote_server.py +144 -0
  35. convos-0.8.1/tests/test_resume.py +82 -0
convos-0.8.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Robert
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.
convos-0.8.1/PKG-INFO ADDED
@@ -0,0 +1,447 @@
1
+ Metadata-Version: 2.4
2
+ Name: convos
3
+ Version: 0.8.1
4
+ Summary: Queryable memory for coding agents, backed by exact conversation evidence
5
+ License-Expression: MIT
6
+ Project-URL: Documentation, https://github.com/RobertBiehl/convos#readme
7
+ Project-URL: Issues, https://github.com/RobertBiehl/convos/issues
8
+ Project-URL: Repository, https://github.com/RobertBiehl/convos
9
+ Requires-Python: >=3.12
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE
12
+ Requires-Dist: duckdb>=1.0.0
13
+ Requires-Dist: typer>=0.12.0
14
+ Requires-Dist: cryptography>=42.0.0
15
+ Requires-Dist: llama-cpp-python>=0.3.0
16
+ Requires-Dist: huggingface-hub>=0.20.0
17
+ Provides-Extra: redact
18
+ Requires-Dist: convos-redact<0.9,>=0.8; extra == "redact"
19
+ Provides-Extra: dev
20
+ Requires-Dist: pytest>=8.0.0; extra == "dev"
21
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
22
+ Requires-Dist: convos-changegraph; extra == "dev"
23
+ Requires-Dist: convos-explore; extra == "dev"
24
+ Requires-Dist: convos-memory; extra == "dev"
25
+ Requires-Dist: convos-redact; extra == "dev"
26
+ Requires-Dist: convos-resume; extra == "dev"
27
+ Requires-Dist: convos-remote; extra == "dev"
28
+ Requires-Dist: convos-remote-server; extra == "dev"
29
+ Dynamic: license-file
30
+
31
+ # Convos
32
+
33
+ [![Tests](https://github.com/RobertBiehl/convos/actions/workflows/tests.yml/badge.svg)](https://github.com/RobertBiehl/convos/actions/workflows/tests.yml)
34
+ [![PyPI](https://img.shields.io/pypi/v/convos?style=flat)](https://pypi.org/project/convos/)
35
+ [![License](https://img.shields.io/badge/license-MIT-blue?style=flat)](LICENSE)
36
+
37
+ **Queryable memory for coding agents, backed by exact conversation evidence.**
38
+
39
+ Convos captures Claude Code and Codex work automatically, recalls relevant
40
+ decisions across ChatGPT, Claude, Claude Code, and Codex, then gives agents the
41
+ exact turns they need to continue.
42
+
43
+ ## Give this to your agent
44
+
45
+ ```text
46
+ Install Convos from PyPI with `uv tool install convos` (use pipx only if uv is unavailable), run `convos init`, then run `convos doctor` and repair any reported skill or hook issue. Run `convos embed` so semantic retrieval is ready, use `convos query "why did we make this decision?"` to find a relevant past conversation, and verify the strongest result with `convos read CONVERSATION_ID --around MESSAGE_ID`. Do not configure web sync, credentials, or a remote service unless I ask.
47
+ ```
48
+
49
+ The daily agent workflow is **Capture -> Recall -> Continue**: lifecycle hooks
50
+ capture completed local turns, hybrid retrieval finds the right prior work, and
51
+ bounded reads provide exact evidence instead of generated recollections.
52
+
53
+ ## Why this exists
54
+
55
+ - Resume work across coding agents without reconstructing old sessions
56
+ - Retrieve prior decisions, commands, evidence, and edits without dumping whole transcripts
57
+ - Keep ChatGPT, Claude, Claude Code, and Codex history locally searchable
58
+ - Keep the same encrypted memory available across computers without path allowlists
59
+ - Share project-associated prompts and changes automatically with encrypted team workspaces
60
+ - Use a CLI skill and lifecycle hooks; the self-hosted relay is optional
61
+
62
+ ## Features
63
+
64
+ - Fast full-text search with direct source, day, role, project, conversation, and thinking filters
65
+ - Hybrid semantic search (BM25 + embeddings + Reciprocal Rank Fusion) via `convos query`
66
+ - Fetch from ChatGPT and Claude using browser cookies
67
+ - Import exports from ChatGPT, Claude, Claude Code, and Codex
68
+ - Capture completed Claude Code + Codex turns just in time with lifecycle hooks
69
+ - Deterministic project resume packets and exact session replay
70
+ - Optional code-change provenance: blame, timeline, time travel, and graph browsing
71
+ - Optional end-to-end encrypted personal multi-device and team synchronization
72
+ - Local secret scanning with mandatory pre-encryption team redaction
73
+ - Export to JSON or CSV
74
+
75
+ ## Install
76
+
77
+ Install from PyPI with uv, initialize local capture, and prepare semantic recall:
78
+
79
+ ```bash
80
+ uv tool install convos
81
+ convos init
82
+ convos embed
83
+ convos doctor
84
+ ```
85
+
86
+ `pipx install convos` is also supported.
87
+
88
+ Upgrade later with:
89
+
90
+ ```bash
91
+ uv tool upgrade convos
92
+ convos install-skills
93
+ ```
94
+
95
+ The first install may compile `llama-cpp-python` locally and take about a
96
+ minute on macOS; later reinstalls reuse the built package.
97
+
98
+ `convos init` creates the archive, installs the bundled Codex + Claude Code
99
+ skill and capture hooks, imports existing local Codex and Claude Code sessions,
100
+ and performs safe local setup for installed products. That first local scan is
101
+ incremental on later runs and never probes ChatGPT or Claude web. With the
102
+ Memory product installed, the same command turns on automatic memory delivery
103
+ for the current project. It never downloads the retrieval model, configures a
104
+ remote service, or deletes data. Codex asks you to review new or changed hooks once
105
+ through `/hooks`. Refresh only the skill with:
106
+
107
+ ```bash
108
+ convos install-skills
109
+ ```
110
+
111
+ ## Encrypted Remote
112
+
113
+ Install the Remote client beside Convos to carry the same encrypted archive
114
+ between personal devices or into team workspaces:
115
+
116
+ ```bash
117
+ uv tool install convos --with convos-remote
118
+ ```
119
+
120
+ The relay is a separate, independently deployable package and never receives
121
+ conversation plaintext, repository names, file paths, embeddings, attachments,
122
+ or workspace keys:
123
+
124
+ ```bash
125
+ uv tool install convos-remote-server
126
+ ```
127
+
128
+ See [self-hosting, recovery, team policy, and installation](docs/remote.md) and
129
+ the runnable synthetic [personal and team scenarios](examples/remote/README.md).
130
+
131
+ ## Additional workspace products
132
+
133
+ Redact is published on PyPI because it is part of Remote's team boundary. The
134
+ other applications below remain source-only while their public product surface
135
+ is still being shaped.
136
+
137
+ Optionally add code-change provenance without expanding the core CLI package:
138
+
139
+ ```bash
140
+ uv tool install convos --with "convos-changegraph @ git+https://github.com/RobertBiehl/convos.git#subdirectory=apps/changegraph"
141
+ ```
142
+
143
+ This adds `convos blame`, `timeline`, `at`, `graph`, and `browse`.
144
+
145
+ Navigate semantically from any exact conversation or turn without sending
146
+ archive text to a generation service:
147
+
148
+ ```bash
149
+ uv tool install convos --with "convos-explore @ git+https://github.com/RobertBiehl/convos.git#subdirectory=apps/explore"
150
+ convos related CONVERSATION_OR_MESSAGE_ID
151
+ convos trail CONVERSATION_OR_MESSAGE_ID
152
+ ```
153
+
154
+ `related` returns one strongest matching turn per neighboring conversation,
155
+ collapses exact duplicate turns, excludes known injected agent scaffolding, and
156
+ prints exact `read --around` pivots. `trail` follows those evidence turns
157
+ through a bounded, cycle-free multi-hop semantic graph with text, JSON, JSONL,
158
+ and DOT output. See [semantic conversation exploration](docs/explore.md).
159
+
160
+ Audit an archive for high-confidence credentials without printing their values:
161
+
162
+ ```bash
163
+ uv tool install "convos[redact]"
164
+ convos redact scan
165
+ ```
166
+
167
+ The encrypted remote client installs this scanner as a required dependency and
168
+ scrubs every team record before signing or encryption. Personal synchronization
169
+ remains lossless. Team attachment bodies are omitted because arbitrary binary
170
+ content cannot be proven safe by the dependency-free scanner. Use
171
+ `convos redact status` to inspect value-free automatic-redaction records. See
172
+ [local secret protection](docs/redact.md).
173
+
174
+ Resume a project from live repository state and exact archived evidence without
175
+ asking a model to invent a summary:
176
+
177
+ ```bash
178
+ uv tool install convos --with "convos-resume @ git+https://github.com/RobertBiehl/convos.git#subdirectory=apps/resume"
179
+ cd /path/to/project
180
+ convos resume
181
+ ```
182
+
183
+ The packet includes current Git branch, HEAD and bounded dirty status, recent
184
+ cwd-scoped sessions, exact last-turn IDs, touched files, tool statuses, and
185
+ secret-scrubbed turn excerpts under a global evidence budget. It labels archived
186
+ text as untrusted and prints exact `read --around` commands for verification.
187
+ `-f json` exposes the same deterministic structure to agents. See [project
188
+ resume packets](docs/resume.md).
189
+
190
+ ```bash
191
+ convos replay CONVERSATION_ID
192
+ convos replay CONVERSATION_ID --around MESSAGE_ID -n 40 --activity 120
193
+ ```
194
+
195
+ Replay returns a bounded exact message window with its ordered tool calls and
196
+ file edits. It is evidence of captured activity, not an inferred summary.
197
+
198
+ Track and reconcile Codex and Claude Code memories through a canonical local
199
+ overlay without rewriting either provider's generated state:
200
+
201
+ ```bash
202
+ uv tool install convos --with "convos-memory @ git+https://github.com/RobertBiehl/convos.git#subdirectory=apps/memory"
203
+ convos init
204
+ ```
205
+
206
+ `init` is safe to rerun after adding the Memory extra. Existing installations
207
+ can use `convos memory enable` as the narrower repair/upgrade command. New
208
+ projects initialize automatically on first context delivery; use `convos memory
209
+ enable --all` only to warm every already-discovered scope up front. Memory adds
210
+ one-command project synchronization with deterministic safe
211
+ bootstrapping and exact matching, agent-assisted semantic resolution,
212
+ agent-ready automatic Claude and Codex session injection, direct revisioned
213
+ user-owned `remember`/`forget`, automatic safe
214
+ reconciliation during delivery, history, and reversible drift-safe Claude
215
+ projection. A remembered revision can cite exact local archive turns with
216
+ repeatable `--from MESSAGE_ID`; audits verify their hashes and print direct
217
+ `read --around` pivots without duplicating or remotely syncing conversation
218
+ text. `convos memory sync --all` safely settles
219
+ mechanical updates across every project without exposing memory content. The normal
220
+ `convos doctor` also checks its ledger and delivery setup. If a memory decision
221
+ is needed, `convos memory review` shows plain before/new/current text without
222
+ engine IDs; then just tell Codex or Claude `sync my memories`. The skill handles
223
+ the plan and transaction. Codex requires one-time review of new or
224
+ changed hook entries through `/hooks`. See [the memory synchronization
225
+ workflow](docs/memory.md).
226
+
227
+ Run bare `convos memory` for plain current-project health: available memories,
228
+ automatic delivery, and the exact next action when attention is needed. Engine
229
+ counts, hook trust, and source provenance stay in `convos doctor` and JSON.
230
+ Help shows only normal human commands; the synchronization protocol remains
231
+ available to installed agents without cluttering the first-run API.
232
+ `convos memory backup` creates a private, consistent snapshot of the complete
233
+ ledger. `convos memory restore SNAPSHOT` previews recovery; `--yes` restores it
234
+ only after automatically preserving the current ledger as a rescue snapshot.
235
+ The snapshot's private Git evidence lets matching clones and worktrees reuse the
236
+ same memory scope at different checkout paths while distinct fork origins stay
237
+ isolated.
238
+
239
+ `convos memory audit` verifies every current and historical evidence hash in
240
+ the surrounding project without printing memory or transcript content. Use
241
+ `--message MESSAGE_ID` for reverse provenance or `--all --json` for a
242
+ content-free cross-project health check.
243
+ Ordinary revision, history, and preview-first deletion accept a memory's
244
+ displayed first-line title or unique literal text, so stable `mem_...` IDs are
245
+ available for automation without being required for routine use.
246
+
247
+ For an unreleased Git snapshot, install both products from the same revision:
248
+
249
+ ```bash
250
+ uv tool install --reinstall "git+https://github.com/RobertBiehl/convos.git" \
251
+ --with "convos-memory @ git+https://github.com/RobertBiehl/convos.git#subdirectory=apps/memory"
252
+ ```
253
+
254
+ The encrypted remote uses one client package and one independently installable
255
+ server package, so the local archive stays server-free by default.
256
+ When the memory and remote clients are both present, personal background sync
257
+ automatically carries canonical memory revisions in the same end-to-end
258
+ encrypted event stream; concurrent semantic changes remain reviewable instead
259
+ of becoming last-write-wins. User-owned forget operations also remove safe
260
+ remote-only copies and the author's prior relay ciphertext while preserving
261
+ local or provider divergence. Neither product depends on the other.
262
+ See [`examples/insights`](examples/insights/README.md) for local decision,
263
+ comparison, archive-statistics, and prompt-to-change query recipes.
264
+
265
+ ## Quickstart
266
+
267
+ ```bash
268
+ convos init
269
+ convos sync # optional ChatGPT, Claude web, and export backfill
270
+ convos doctor
271
+ convos search "prompt" -s claude -n 10
272
+ convos query "conceptual search"
273
+ ```
274
+
275
+ If Safari cookies are protected by macOS privacy, `sync` will fall back to Chrome.
276
+
277
+ ## Common commands
278
+
279
+ Search:
280
+
281
+ ```bash
282
+ convos search "vector database" -s chatgpt -d 30 # BM25 only
283
+ convos search "decision" --cwd /path/to/repo # exact project scope
284
+ convos query "why did we choose this?" --conversation f2b9c5a9
285
+ convos search "reasoning" --thinking
286
+ convos read f2b9c5a9 -n 20 -f jsonl # bounded recent context from one result
287
+ convos embed # backfill embeddings, no web sync
288
+ convos query "how do I store vectors in duckdb" # hybrid: BM25 + embeddings + RRF
289
+ ```
290
+
291
+ Both discovery commands return the strongest matching message from each
292
+ conversation, so `-n` controls the number of distinct conversation candidates.
293
+ Both accept `--cwd`/`-w` to include one recorded directory and its descendants,
294
+ plus `--conversation` for an exact conversation-ID prefix. These direct options
295
+ replace the deferred custom query language.
296
+
297
+ Semantic search is included by default. Run `convos embed` after install to
298
+ backfill embeddings with a progress bar. Hooks and `convos sync` queue new or
299
+ changed messages; `convos query` embeds that queue just in time. The
300
+ `embeddinggemma-300m-qat-q8_0` model produces 768d embeddings locally via
301
+ llama.cpp.
302
+
303
+ Read a known conversation using an ID prefix from search/query:
304
+
305
+ ```bash
306
+ convos read f2b9c5a9 -n 20 -c 2000 -f jsonl
307
+ convos read f2b9c5a9 --around 01ab -n 20 -f jsonl
308
+ ```
309
+
310
+ Replay one conversation with its captured tool and edit evidence:
311
+
312
+ ```bash
313
+ uv tool install convos --with "convos-resume @ git+https://github.com/RobertBiehl/convos.git#subdirectory=apps/resume"
314
+ convos replay CONVERSATION_ID
315
+ convos replay CONVERSATION_ID --around MESSAGE_ID -f json
316
+ ```
317
+
318
+ Replay is part of the Resume product and keeps the same deterministic,
319
+ explicitly bounded evidence contract. See [project handoff and
320
+ replay](docs/resume.md).
321
+
322
+ List and analyze with read-only DuckDB SQL (schema in `docs/database.md`):
323
+
324
+ ```bash
325
+ convos sql "SELECT id, title, created_at FROM conversations ORDER BY created_at DESC LIMIT 20" -f json
326
+ ```
327
+
328
+ Sync:
329
+
330
+ ```bash
331
+ convos sync # local plus available web/export sources
332
+ convos sync --local-only # local agents and configured exports; no web
333
+ convos sync -w -i 600
334
+ ```
335
+
336
+ Local Claude Code and Codex sessions can be ingested after each completed turn:
337
+
338
+ ```bash
339
+ convos install-hooks # repair or refresh hooks installed by init
340
+ convos install-hooks --status
341
+ convos install-hooks --remove # remove only convos hook handlers
342
+ ```
343
+
344
+ Start a new agent session after installing hooks. In Codex, review the user
345
+ hook through `/hooks`; after the first completed turn, `convos doctor` should
346
+ show a recent `ingest: ... last=...` timestamp.
347
+
348
+ Hooks enqueue only the local transcript path and file metadata, then return
349
+ immediately. A coalescing background drain parses and upserts the transcript;
350
+ `search` and `query` rebuild FTS once for all pending changes before reading.
351
+ `query` also embeds only
352
+ the changed hook messages, while `search` and `sql` avoid loading the embedding
353
+ model. `sync` remains the reconciliation path for missed local events, web
354
+ providers, pre-hook sessions, and imports rather than a routine local update.
355
+
356
+ Check the complete local pipeline with `convos doctor`. It reports the running
357
+ version, archive/schema/FTS health, embedding backlog, queued ingestion, hook
358
+ installation, exact freshness of both installed agent skill copies, and
359
+ web-cookie availability without modifying the archive. Missing or stale skill
360
+ content reports `convos install-skills` as the repair. Hook health similarly
361
+ requires the current executable and archive root exactly once in every required
362
+ agent event; stale, duplicated, or misplaced handlers report `convos
363
+ install-hooks`.
364
+
365
+ Auto-import export paths with:
366
+
367
+ ```bash
368
+ CONVOS_IMPORT_PATHS="~/Downloads/chatgpt-export.zip,~/.claude/projects" convos sync
369
+ ```
370
+
371
+ Export:
372
+
373
+ ```bash
374
+ convos export out.json -f json
375
+ convos export out.csv -f csv -s claude
376
+ ```
377
+
378
+ ## Example output
379
+
380
+ ```bash
381
+ convos sync
382
+ ```
383
+ ```text
384
+ Syncing Claude Code (2 convs, 118 msgs, 12 tools, 0 attachs, 4 edits)
385
+ Syncing Codex (8 convs, 214 msgs, 19 tools, 0 attachs, 0 edits)
386
+ Syncing ChatGPT (142 convs, 1734 msgs, 97 tools, 12 attachs, 0 edits)
387
+ Syncing Claude (96 convs, 842 msgs, 0 tools, 5 attachs, 0 edits)
388
+ Updated Codex (0 new, 1 updated convs; 0 convs, 9 msgs, 0 tools, 0 attachs, 0 edits processed)
389
+ Updated 0 new, 1 updated convs; 9 msgs, 0 tools, 0 attachs, 0 edits
390
+ Total: 248 convs, 2908 msgs, 128 tools, 17 attachs, 4 edits
391
+ ```
392
+
393
+ ```bash
394
+ convos search "vector database" -s chatgpt -d 30
395
+ ```
396
+ ```text
397
+ f2b9c5a9 ChatGPT "Indexing embeddings with DuckDB" 2026-01-14T09:22:11Z
398
+ 8a1d0c3e ChatGPT "Choosing ANN libraries" 2026-01-10T18:03:42Z
399
+ ```
400
+
401
+ ```bash
402
+ convos read f2b9c5a9 -f jsonl
403
+ ```
404
+ ```text
405
+ {"id":"01ab...","role":"user","content":"How do I store vectors in DuckDB?","thinking":null,"created_at":"2026-01-14 09:22:11"}
406
+ {"id":"02cd...","role":"assistant","content":"Use a table with a FLOAT[] column and an HNSW index...","thinking":null,"created_at":"2026-01-14 09:22:42"}
407
+ ```
408
+
409
+ ## Data model
410
+
411
+ Data lives in `<root>/data/convos.db` (DuckDB). Default root is `~/.convos` (override with `CONVOS_PROJECT_ROOT`).
412
+
413
+ - `conversations`
414
+ - `messages`
415
+ - `tool_calls`
416
+ - `attachments`
417
+ - `artifacts`
418
+ - `file_edits`
419
+
420
+ ## Privacy and security
421
+
422
+ This is local-first. Your data never leaves your machine unless you export it
423
+ or explicitly configure the optional encrypted remote. The remote receives
424
+ ciphertext and synchronization metadata, never workspace keys or plaintext.
425
+
426
+ On macOS, Safari cookie access requires Full Disk Access for your terminal.
427
+ If you prefer not to grant it, use Chrome cookies with `-b chrome`.
428
+
429
+ ## FAQ
430
+
431
+ Q: Why is fetch failing on Safari?
432
+ A: macOS blocks access to Safari cookies without Full Disk Access. Use `-b chrome` or grant access.
433
+
434
+ Q: Where is the database stored?
435
+ A: `~/.convos/data/convos.db` by default (override with `CONVOS_PROJECT_ROOT`).
436
+
437
+ Q: Can I reset the DB?
438
+ A: Delete `~/.convos/data/convos.db` (or `<root>/data/convos.db`) and re-run `convos init`.
439
+
440
+ ## Contributing
441
+
442
+ PRs welcome. Keep changes small and focused. See `AGENTS.md` for architecture and coding style.
443
+
444
+ ## Agent usage
445
+
446
+ Agents should use the CLI only. See `skills/convos/SKILL.md`.
447
+ For setup and usage with Codex/Claude, see `docs/skills-setup.md`.