secondbrain-py 0.2.1__py3-none-any.whl

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 (273) hide show
  1. brain/__init__.py +0 -0
  2. brain/__main__.py +18 -0
  3. brain/_capture_command.py +445 -0
  4. brain/_compose.py +52 -0
  5. brain/activity.py +206 -0
  6. brain/ask.py +631 -0
  7. brain/audio.py +591 -0
  8. brain/backfill/__init__.py +12 -0
  9. brain/backfill/search_extras.py +141 -0
  10. brain/backfill/source_rows.py +101 -0
  11. brain/bin/__init__.py +1 -0
  12. brain/bin/_launcher.py +107 -0
  13. brain/bin/down.py +8 -0
  14. brain/bin/launchd.py +268 -0
  15. brain/bin/monitor.py +570 -0
  16. brain/bin/rebuild.py +8 -0
  17. brain/bin/status.py +8 -0
  18. brain/bin/up.py +8 -0
  19. brain/brief.py +272 -0
  20. brain/capture.py +49 -0
  21. brain/chat.py +293 -0
  22. brain/cli.py +9760 -0
  23. brain/cli_claude.py +81 -0
  24. brain/cli_connect.py +285 -0
  25. brain/cli_demo.py +266 -0
  26. brain/config.py +1949 -0
  27. brain/connect.py +925 -0
  28. brain/db.py +540 -0
  29. brain/demo/__init__.py +452 -0
  30. brain/demo/corpus/manifest.json +403 -0
  31. brain/demo/embedder.py +74 -0
  32. brain/durations.py +84 -0
  33. brain/edit_session.py +156 -0
  34. brain/editor.py +67 -0
  35. brain/elicit/__init__.py +16 -0
  36. brain/elicit/detectors.py +250 -0
  37. brain/elicit/drafter.py +70 -0
  38. brain/elicit/queue.py +220 -0
  39. brain/elicit/schema.py +48 -0
  40. brain/elicit/session.py +445 -0
  41. brain/embedding_targets.py +54 -0
  42. brain/embeddings.py +424 -0
  43. brain/enrichment.py +808 -0
  44. brain/errors.py +357 -0
  45. brain/eval/__init__.py +129 -0
  46. brain/eval/answer_eval.py +281 -0
  47. brain/eval/baseline.py +265 -0
  48. brain/eval/concept_extraction.py +378 -0
  49. brain/eval/corpus.py +152 -0
  50. brain/eval/errors.py +19 -0
  51. brain/eval/graph_baseline.py +226 -0
  52. brain/eval/graph_retrieval.py +202 -0
  53. brain/eval/graph_runner.py +319 -0
  54. brain/eval/metrics.py +101 -0
  55. brain/eval/runner.py +223 -0
  56. brain/format.py +783 -0
  57. brain/gaps.py +390 -0
  58. brain/graph_rag/__init__.py +94 -0
  59. brain/graph_rag/_retrieval_common.py +113 -0
  60. brain/graph_rag/aggregates.py +303 -0
  61. brain/graph_rag/aliases/__init__.py +583 -0
  62. brain/graph_rag/backends/__init__.py +10 -0
  63. brain/graph_rag/backends/_age_helpers.py +473 -0
  64. brain/graph_rag/backends/age.py +782 -0
  65. brain/graph_rag/backends/base.py +272 -0
  66. brain/graph_rag/build.py +344 -0
  67. brain/graph_rag/communities.py +644 -0
  68. brain/graph_rag/communities_summary.py +437 -0
  69. brain/graph_rag/concepts.py +202 -0
  70. brain/graph_rag/cooccur.py +193 -0
  71. brain/graph_rag/cross_type.py +312 -0
  72. brain/graph_rag/extract.py +885 -0
  73. brain/graph_rag/fuse.py +371 -0
  74. brain/graph_rag/global_.py +412 -0
  75. brain/graph_rag/grouping.py +372 -0
  76. brain/graph_rag/person_resolver.py +167 -0
  77. brain/graph_rag/reconcile.py +792 -0
  78. brain/graph_rag/relational.py +353 -0
  79. brain/graph_rag/retrieve.py +526 -0
  80. brain/graph_rag/router.py +288 -0
  81. brain/graph_rag/schema.py +320 -0
  82. brain/graph_rag/sync.py +237 -0
  83. brain/graph_rag/tenancy.py +43 -0
  84. brain/graph_rag/themes.py +501 -0
  85. brain/graph_rag/weighting.py +202 -0
  86. brain/ingest/__init__.py +1926 -0
  87. brain/ingest/chunker.py +249 -0
  88. brain/ingest/docx.py +40 -0
  89. brain/ingest/gmail.py +621 -0
  90. brain/ingest/markdown.py +37 -0
  91. brain/ingest/pdf.py +61 -0
  92. brain/ingest/stdin.py +22 -0
  93. brain/ingest/sub_tokens.py +91 -0
  94. brain/ingest/text.py +16 -0
  95. brain/interactions.py +205 -0
  96. brain/maintenance.py +355 -0
  97. brain/mcp_server.py +3405 -0
  98. brain/migrations/001_init.sql +43 -0
  99. brain/migrations/002_qwen3_embedding.sql +17 -0
  100. brain/migrations/003_vault_model.sql +41 -0
  101. brain/migrations/004_relax_content_hash_uniqueness.sql +18 -0
  102. brain/migrations/005_derived_links.sql +67 -0
  103. brain/migrations/006_dedup_file_by_source_path.sql +25 -0
  104. brain/migrations/007_email_thread_and_draft.sql +15 -0
  105. brain/migrations/008_gmail_thread_unique.sql +11 -0
  106. brain/migrations/009_chunks_weighted_tsv.sql +28 -0
  107. brain/migrations/010_interactions.sql +30 -0
  108. brain/migrations/011_documents_summary.sql +23 -0
  109. brain/migrations/012_graphrag.sql +171 -0
  110. brain/migrations/013_graphrag_communities.sql +125 -0
  111. brain/migrations/014_graphrag_community_summary_hash.sql +33 -0
  112. brain/migrations/015_interactions_graph_targets.sql +89 -0
  113. brain/migrations/016_index_hygiene.sql +61 -0
  114. brain/migrations/017_elicit.sql +30 -0
  115. brain/migrations/018_review_gap_signal_kinds.sql +40 -0
  116. brain/migrations/019_search_queries.sql +35 -0
  117. brain/migrations/020_link_suggestions.sql +40 -0
  118. brain/migrations/021_timeline_doc_date.sql +34 -0
  119. brain/migrations/022_link_suggestions_undirected.sql +84 -0
  120. brain/migrations/023_search_queries_fts_count.sql +28 -0
  121. brain/quartz_overrides/__init__.py +8 -0
  122. brain/quartz_overrides/quartz/bootstrap-cli.mjs +65 -0
  123. brain/quartz_overrides/quartz/build.ts +568 -0
  124. brain/quartz_overrides/quartz/cli/args.js +152 -0
  125. brain/quartz_overrides/quartz/cli/build_partial_handler.js +544 -0
  126. brain/quartz_overrides/quartz/cli/handlers.js +636 -0
  127. brain/quartz_overrides/quartz/components/CommandPalette.tsx +172 -0
  128. brain/quartz_overrides/quartz/components/Explorer.tsx +198 -0
  129. brain/quartz_overrides/quartz/components/Footer.tsx +27 -0
  130. brain/quartz_overrides/quartz/components/Graph.tsx +468 -0
  131. brain/quartz_overrides/quartz/components/PageTitle.tsx +72 -0
  132. brain/quartz_overrides/quartz/components/RelatedDocs.tsx +38 -0
  133. brain/quartz_overrides/quartz/components/Search.tsx +161 -0
  134. brain/quartz_overrides/quartz/components/SummaryLede.tsx +72 -0
  135. brain/quartz_overrides/quartz/components/index.ts +92 -0
  136. brain/quartz_overrides/quartz/components/pages/TagContent.tsx +272 -0
  137. brain/quartz_overrides/quartz/components/scripts/commandPalette.inline.ts +665 -0
  138. brain/quartz_overrides/quartz/components/scripts/explorer.inline.ts +768 -0
  139. brain/quartz_overrides/quartz/components/scripts/graph.inline.ts +2302 -0
  140. brain/quartz_overrides/quartz/components/scripts/relatedDocs.inline.ts +163 -0
  141. brain/quartz_overrides/quartz/components/scripts/search.inline.ts +1011 -0
  142. brain/quartz_overrides/quartz/plugins/emitters/contentIndex.ts +546 -0
  143. brain/quartz_overrides/quartz/plugins/transformers/codeCopy.ts +94 -0
  144. brain/quartz_overrides/quartz/plugins/transformers/derivedFenceMark.ts +302 -0
  145. brain/quartz_overrides/quartz/plugins/transformers/emailThread.ts +148 -0
  146. brain/quartz_overrides/quartz/plugins/transformers/emptyDoorFilter.ts +213 -0
  147. brain/quartz_overrides/quartz/plugins/transformers/index.ts +114 -0
  148. brain/quartz_overrides/quartz/plugins/transformers/linkKindMark.ts +205 -0
  149. brain/quartz_overrides/quartz/plugins/transformers/linkSourceTag.ts +104 -0
  150. brain/quartz_overrides/quartz/plugins/transformers/relativeDate.ts +100 -0
  151. brain/quartz_overrides/quartz/plugins/transformers/reloadSignal.ts +131 -0
  152. brain/quartz_overrides/quartz/processors/parse.ts +371 -0
  153. brain/quartz_overrides/quartz/processors/parser_cache.ts +78 -0
  154. brain/quartz_overrides/quartz/static/brain-logo-dark.png +0 -0
  155. brain/quartz_overrides/quartz/static/brain-logo-light.png +0 -0
  156. brain/quartz_overrides/quartz/static/codeCopy.js +196 -0
  157. brain/quartz_overrides/quartz/static/emailThread.js +334 -0
  158. brain/quartz_overrides/quartz/static/favicon.ico +0 -0
  159. brain/quartz_overrides/quartz/static/icon.png +0 -0
  160. brain/quartz_overrides/quartz/static/linkSourceTag.js +104 -0
  161. brain/quartz_overrides/quartz/static/relativeDate.js +142 -0
  162. brain/quartz_overrides/quartz/static/reload.js +168 -0
  163. brain/quartz_overrides/quartz/styles/brain/_article.scss +252 -0
  164. brain/quartz_overrides/quartz/styles/brain/_atmosphere.scss +113 -0
  165. brain/quartz_overrides/quartz/styles/brain/_callouts.scss +180 -0
  166. brain/quartz_overrides/quartz/styles/brain/_cmdk.scss +7 -0
  167. brain/quartz_overrides/quartz/styles/brain/_code.scss +208 -0
  168. brain/quartz_overrides/quartz/styles/brain/_command_palette.scss +369 -0
  169. brain/quartz_overrides/quartz/styles/brain/_email_thread.scss +228 -0
  170. brain/quartz_overrides/quartz/styles/brain/_explorer.scss +142 -0
  171. brain/quartz_overrides/quartz/styles/brain/_home.scss +182 -0
  172. brain/quartz_overrides/quartz/styles/brain/_links.scss +322 -0
  173. brain/quartz_overrides/quartz/styles/brain/_marginalia.scss +117 -0
  174. brain/quartz_overrides/quartz/styles/brain/_motion.scss +175 -0
  175. brain/quartz_overrides/quartz/styles/brain/_people_hub.scss +100 -0
  176. brain/quartz_overrides/quartz/styles/brain/_related_docs.scss +137 -0
  177. brain/quartz_overrides/quartz/styles/brain/_search.scss +252 -0
  178. brain/quartz_overrides/quartz/styles/brain/_sidebar.scss +468 -0
  179. brain/quartz_overrides/quartz/styles/brain/_summary_lede.scss +56 -0
  180. brain/quartz_overrides/quartz/styles/brain/_surface.scss +43 -0
  181. brain/quartz_overrides/quartz/styles/brain/_tag_content.scss +118 -0
  182. brain/quartz_overrides/quartz/styles/brain/_tokens.scss +197 -0
  183. brain/quartz_overrides/quartz/styles/brain/_typography.scss +92 -0
  184. brain/quartz_overrides/quartz/styles/custom.scss +89 -0
  185. brain/quartz_overrides/quartz/styles/graph.scss +505 -0
  186. brain/quartz_overrides/quartz/util/ctx.ts +92 -0
  187. brain/quartz_overrides/quartz/util/fastpath_manifest.ts +608 -0
  188. brain/quartz_overrides/quartz/util/path.ts +358 -0
  189. brain/quartz_overrides/quartz/util/sourceIcons.ts +55 -0
  190. brain/quartz_overrides/quartz.config.ts +270 -0
  191. brain/quartz_overrides/quartz.layout.ts +314 -0
  192. brain/queries.py +1188 -0
  193. brain/rank_fusion.py +8 -0
  194. brain/resurface.py +210 -0
  195. brain/review/__init__.py +26 -0
  196. brain/review/emit.py +27 -0
  197. brain/review/queries.py +436 -0
  198. brain/review/render.py +196 -0
  199. brain/review/scans.py +355 -0
  200. brain/review/weekly.py +413 -0
  201. brain/search.py +704 -0
  202. brain/set_similarity.py +15 -0
  203. brain/setup.py +1205 -0
  204. brain/tags.py +56 -0
  205. brain/templates/Caddyfile.j2 +9 -0
  206. brain/templates/__init__.py +1 -0
  207. brain/templates/bin/__init__.py +1 -0
  208. brain/templates/bin/_brain-brief-fg.sh +25 -0
  209. brain/templates/bin/_brain-build-fg.sh +53 -0
  210. brain/templates/bin/_brain-watcher-fg.sh +65 -0
  211. brain/templates/bin/brain-down.sh +89 -0
  212. brain/templates/bin/brain-status.sh +83 -0
  213. brain/templates/bin/brain-up.sh +221 -0
  214. brain/templates/docker/age/Dockerfile +79 -0
  215. brain/templates/docker-compose.stock.yml.j2 +26 -0
  216. brain/templates/docker-compose.yml.j2 +34 -0
  217. brain/templates/env.example +190 -0
  218. brain/templates/launchd/__init__.py +1 -0
  219. brain/templates/launchd/com.brain.brief.plist.j2 +45 -0
  220. brain/templates/launchd/com.brain.build.plist.j2 +46 -0
  221. brain/templates/launchd/com.brain.watcher.plist.j2 +46 -0
  222. brain/templates/skill/SKILL.md +63 -0
  223. brain/templates/skill/__init__.py +1 -0
  224. brain/timeline.py +834 -0
  225. brain/todo.py +124 -0
  226. brain/uninstall.py +185 -0
  227. brain/vault/__init__.py +115 -0
  228. brain/vault/_atomic.py +25 -0
  229. brain/vault/daily_index.py +228 -0
  230. brain/vault/derived_links/__init__.py +50 -0
  231. brain/vault/derived_links/directory.py +683 -0
  232. brain/vault/derived_links/fence.py +408 -0
  233. brain/vault/derived_links/gws.py +64 -0
  234. brain/vault/derived_links/participants.py +143 -0
  235. brain/vault/derived_links/pass_runner.py +362 -0
  236. brain/vault/derived_links/rules.py +137 -0
  237. brain/vault/export.py +683 -0
  238. brain/vault/frontmatter.py +165 -0
  239. brain/vault/graph.py +620 -0
  240. brain/vault/graph_format.py +388 -0
  241. brain/vault/link_rewrite.py +235 -0
  242. brain/vault/links.py +260 -0
  243. brain/vault/note_builder.py +211 -0
  244. brain/vault/paths.py +55 -0
  245. brain/vault/quartz_overlay.py +236 -0
  246. brain/vault/rename.py +591 -0
  247. brain/vault/resolver.py +304 -0
  248. brain/vault/slug.py +127 -0
  249. brain/vault/sync.py +1513 -0
  250. brain/vault/sync_summaries.py +264 -0
  251. brain/vault/templates.py +145 -0
  252. brain/vault/watch.py +1052 -0
  253. brain/wiki/__init__.py +6 -0
  254. brain/wiki/_github_slugger.py +76 -0
  255. brain/wiki/_person_name.py +314 -0
  256. brain/wiki/build_homepage.py +541 -0
  257. brain/wiki/build_partial.py +273 -0
  258. brain/wiki/build_people.py +934 -0
  259. brain/wiki/build_related.py +758 -0
  260. brain/wiki/build_swap.py +585 -0
  261. brain/wiki/build_watcher.py +975 -0
  262. brain/wiki/edit_classifier.py +215 -0
  263. brain/wiki/errors.py +10 -0
  264. brain/wiki/fastpath_manifest.py +475 -0
  265. brain/wiki/fastpath_state.py +174 -0
  266. brain/wiki/install.py +296 -0
  267. brain/wiki/slug.py +111 -0
  268. secondbrain_py-0.2.1.dist-info/METADATA +195 -0
  269. secondbrain_py-0.2.1.dist-info/RECORD +273 -0
  270. secondbrain_py-0.2.1.dist-info/WHEEL +5 -0
  271. secondbrain_py-0.2.1.dist-info/entry_points.txt +11 -0
  272. secondbrain_py-0.2.1.dist-info/licenses/LICENSE +21 -0
  273. secondbrain_py-0.2.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,195 @@
1
+ Metadata-Version: 2.4
2
+ Name: secondbrain-py
3
+ Version: 0.2.1
4
+ Summary: Local personal knowledge base with hybrid search, queryable by Claude
5
+ License-Expression: MIT
6
+ Project-URL: Homepage, https://github.com/mshtawythug/second-brain
7
+ Project-URL: Repository, https://github.com/mshtawythug/second-brain
8
+ Project-URL: Issues, https://github.com/mshtawythug/second-brain/issues
9
+ Keywords: second-brain,knowledge-base,rag,pgvector,hybrid-search,mcp,ollama,local-first
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Environment :: Console
13
+ Classifier: Topic :: Text Processing :: Indexing
14
+ Requires-Python: >=3.11
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Requires-Dist: psycopg[binary]>=3.2
18
+ Requires-Dist: pgvector>=0.3
19
+ Requires-Dist: httpx>=0.27
20
+ Requires-Dist: pypdf>=5.0
21
+ Requires-Dist: pdfplumber>=0.11
22
+ Requires-Dist: python-docx>=1.1
23
+ Requires-Dist: markdown-it-py>=3.0
24
+ Requires-Dist: typer>=0.13
25
+ Requires-Dist: rich>=13.9
26
+ Requires-Dist: python-dotenv>=1.0
27
+ Requires-Dist: tiktoken>=0.8
28
+ Requires-Dist: mcp<2.0,>=1.0
29
+ Requires-Dist: voyageai>=0.3
30
+ Requires-Dist: pyyaml>=6.0
31
+ Requires-Dist: watchdog>=4.0
32
+ Requires-Dist: networkx>=3.2
33
+ Provides-Extra: dev
34
+ Requires-Dist: pytest>=8.3; extra == "dev"
35
+ Requires-Dist: pytest-cov>=5.0; extra == "dev"
36
+ Requires-Dist: coverage<7.13; extra == "dev"
37
+ Requires-Dist: pytest-mock>=3.14; extra == "dev"
38
+ Requires-Dist: ruff>=0.7; extra == "dev"
39
+ Requires-Dist: mypy>=1.13; extra == "dev"
40
+ Requires-Dist: reportlab>=4.0; extra == "dev"
41
+ Requires-Dist: types-PyYAML>=6.0; extra == "dev"
42
+ Dynamic: license-file
43
+
44
+ <!-- mcp-name: io.github.mshtawythug/second-brain -->
45
+
46
+ # Second Brain
47
+
48
+ Local, queryable knowledge base and note vault with hybrid search and an entity-graph layer — searchable by any AI coding agent or assistant from any conversation.
49
+
50
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
51
+ [![CI](https://github.com/mshtawythug/second-brain/actions/workflows/eval.yml/badge.svg)](https://github.com/mshtawythug/second-brain/actions/workflows/eval.yml)
52
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/downloads/)
53
+
54
+ Stores career docs, interview prep, Krisp transcripts, Slack threads, Gmail, and authored Markdown notes in Postgres + pgvector. Any agent reaches all of it through the `brain` CLI or the bundled `brain-mcp` MCP server — no re-pasting context into every chat.
55
+
56
+ The everyday loop — capture a note, search it back, read the top hit, check the corpus:
57
+
58
+ ![brain daily workflow](docs/assets/usage.gif)
59
+
60
+ ## Token savings
61
+
62
+ Querying `brain` returns a ranked snippet instead of dumping whole threads and files into an agent's context, so a lookup costs a fraction of the tokens a direct MCP or file read would:
63
+
64
+ | Source | Direct read (MCP / `Read` tool) | Via `brain` (search + optional `show`) | Savings |
65
+ |---|---|---|---|
66
+ | **Gmail thread** | 15–50k (metadata + full threads with quoted replies / headers) | ~2–4k (snippets + one targeted `brain show`) | **~5–15×** |
67
+ | **Krisp transcript** | 25–75k (search + full transcripts across candidates) | ~6–16k (search + one relevant transcript) | **~4–10×** |
68
+ | **Long PDF / DOCX (30+ pages)** | 15–25k (read the whole file) | ~1–9k (one snippet + targeted `show`) | **~5–15×** |
69
+
70
+ Brain stores pre-extracted, quote-stripped bodies and hybrid-ranks *before* fetching, so only the passage that matched enters context. See the [full per-source breakdown](docs/configuration.md#token-economics).
71
+
72
+ ## See it in 60 seconds
73
+
74
+ Install the CLI, then run the offline demo — a throwaway Postgres seeded with a synthetic *Larkspur* compliance corpus. No Ollama, no personal data, no model downloads:
75
+
76
+ ```bash
77
+ pipx install secondbrain-py
78
+ # or, with uv:
79
+ uv tool install secondbrain-py
80
+ # or, pin the git tag (no PyPI needed):
81
+ pipx install git+https://github.com/mshtawythug/second-brain.git@v0.2.1
82
+
83
+ brain demo # spins up a sandbox Postgres, seeds 22 docs, runs a hero query
84
+ ```
85
+
86
+ ![brain demo](docs/assets/demo.gif)
87
+
88
+ _(IDs and scores are per-run; the seeded corpus and its ranking are deterministic — the top hit is always the "Compliance Horror Stories" note.)_
89
+
90
+ Try these next:
91
+
92
+ ```bash
93
+ brain demo query "SOC 2 evidence request" # a targeted follow-up query
94
+ brain demo query "vendor risk" --source gmail # narrow by source
95
+ brain show <id> # read the top hit in full (in your own brain)
96
+ brain demo teardown # remove the sandbox when done
97
+ ```
98
+
99
+ `brain demo` needs only Docker; `brain demo teardown` destroys the sandbox.
100
+
101
+ Already ran the demo? You have `brain` installed — jump straight to `brain setup --profile …` below.
102
+
103
+ ## Quick start
104
+
105
+ Full install — the `brain` CLI plus the runtime (Postgres, and optionally Ollama / graph / wiki):
106
+
107
+ ```bash
108
+ curl -fsSL https://raw.githubusercontent.com/mshtawythug/second-brain/v0.2.1/install.sh | bash
109
+ ```
110
+
111
+ The installer pipx-installs `brain` from the `v0.2.1` tag, then runs `brain setup` to provision `$BRAIN_HOME`, start the Postgres container, and (optionally) install the wiki + Claude Code skill. Choose how much to stand up with `--profile`:
112
+
113
+ | Profile | Search | Extra dependencies beyond the core |
114
+ |---|---|---|
115
+ | `minimal` | FTS-only (`BRAIN_EMBEDDER=none`) | None — core only (no Ollama, no models). |
116
+ | `standard` *(default)* | Hybrid (FTS + vector) | + Ollama + one ~1 GB embedding model (`snowflake-arctic-embed2`). |
117
+ | `full` | Hybrid + GraphRAG + wiki | + Apache AGE image, concept-extraction LLM, Quartz/Caddy wiki, and (opt-in) launchd daemons via `--daemons`. |
118
+
119
+ ```bash
120
+ brain setup --profile minimal # Docker-only, FTS search — fastest to stand up
121
+ brain setup --profile standard # default: local hybrid search
122
+ brain setup --profile full --daemons
123
+ ```
124
+
125
+ **Prerequisites (core):** Git, Python 3.11+, and a running Docker (Desktop or Engine) — the Postgres + pgvector database runs in a container on port 55432.
126
+
127
+ **Optional extras** (only if you want more than FTS-only search):
128
+
129
+ - **[Ollama](https://ollama.com/)** — local, free embeddings + LLM enrichment. To upgrade a `minimal` (FTS-only) brain to hybrid search: install Ollama, then `ollama pull snowflake-arctic-embed2`, set `BRAIN_EMBEDDER=arctic` in `.env`, and run `brain init && brain reembed`.
130
+ - **Node.js 18+ and [Caddy](https://caddyserver.com/)** — only for the rendered [wiki](docs/vault-and-wiki.md).
131
+ - **`gws` CLI** — only for Gmail ingest and Google-backed directory linking.
132
+
133
+ Prefer to drive every step yourself, or hacking on the code? See [Installing from source](docs/configuration.md#installing-from-source-manual).
134
+
135
+ ## Core usage
136
+
137
+ ```bash
138
+ brain ingest ~/Documents/resume.pdf --tag career # ingest a file (TXT / MD / PDF / DOCX)
139
+ brain ingest-dir ~/Documents/career # recursive, idempotent by content hash
140
+ brain search "what did I tell my manager about the migration" # hybrid FTS + vector search
141
+ brain show <id-prefix> # full document body (6+ hex prefix)
142
+ brain list --source gmail --limit 20 # browse by source
143
+ brain tag <id-prefix> +interview +career -old-tag # add (+name) / remove (-name) tags
144
+ ```
145
+
146
+ Add `--json` to `search` / `show` / `list` for machine-readable output, and `--fts-only` to `search` to skip the embedding call. The full command surface — Gmail ingest, enrichment, tacit-knowledge elicitation, GraphRAG, the proactivity/synthesis commands, and vault authoring — lives in the [CLI reference](docs/cli-reference.md).
147
+
148
+ ## Claude integrations
149
+
150
+ `brain` and the bundled `brain-mcp` server are harness-agnostic — any agent that runs a shell command or speaks MCP can query the corpus.
151
+
152
+ Register the MCP server once, then just ask — the agent searches the brain and answers from it, no context pasted in:
153
+
154
+ ![Claude answering a question from the brain over the brain-mcp MCP server](docs/assets/mcp.gif)
155
+
156
+ **Claude Code** — register the MCP server (or symlink the [skills](docs/configuration.md#claude-code-consult-brain-skill)):
157
+
158
+ ```bash
159
+ claude mcp add brain -- brain-mcp
160
+ ```
161
+
162
+ **Claude Desktop** — add to `~/Library/Application Support/Claude/claude_desktop_config.json` (replace `/Users/you` with your home directory):
163
+
164
+ ```json
165
+ {
166
+ "mcpServers": {
167
+ "brain": {
168
+ "command": "/Users/you/workspace/second-brain/.venv/bin/brain-mcp",
169
+ "env": {
170
+ "DATABASE_URL": "postgresql://brain:brain@localhost:55432/second_brain",
171
+ "BRAIN_EMBEDDER": "arctic"
172
+ }
173
+ }
174
+ }
175
+ }
176
+ ```
177
+
178
+ `uvx secondbrain-py` also launches the MCP server. Full walkthrough (symlink, smoke-test, troubleshooting): [docs/guides/claude-desktop-setup.md](docs/guides/claude-desktop-setup.md).
179
+
180
+ ## How it works
181
+
182
+ **Hybrid search.** Every document is chunked, embedded, and indexed for Postgres full-text search. A query runs both legs — lexical `tsvector` ranking and vector cosine similarity — and fuses them with [Reciprocal Rank Fusion](https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf) (k=60), then applies a recency boost and metadata filters. Lexical alone misses paraphrases ("what did I say about X"); vector alone misses exact names (a coworker, a former employer); RRF gets both in one ranked list without tuning weights. Set `BRAIN_EMBEDDER=none` for an FTS-only brain with no embedding dependency at all.
183
+
184
+ **GraphRAG.** Alongside search, brain builds an entity graph of the people and concepts that co-occur across the corpus ([Apache AGE](https://age.apache.org/) inside the same Postgres) and retrieves over that structure — answering "what themes come up in my conversations with X" or "which clusters of people and topics dominate my notes" by traversing relationships instead of matching text. It runs alongside plain search, not instead of it. See [docs/graphrag.md](docs/graphrag.md).
185
+
186
+ ## Documentation
187
+
188
+ - [docs/](docs/README.md) — full documentation index
189
+ - [CLI reference](docs/cli-reference.md) — every command beyond the core five
190
+ - [GraphRAG](docs/graphrag.md) — entity-graph retrieval (themes, patterns, connections)
191
+ - [Vault and Wiki](docs/vault-and-wiki.md) — the two-tier note vault + optional rendered wiki
192
+ - [Configuration](docs/configuration.md) — tech stack, tuning knobs, integrations, embedder backends, uninstall
193
+ - [CONTRIBUTING.md](CONTRIBUTING.md) — dev setup, codebase layout, running the tests
194
+ - [CHANGELOG.md](CHANGELOG.md) — release history
195
+ - [LICENSE](LICENSE) — MIT
@@ -0,0 +1,273 @@
1
+ brain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ brain/__main__.py,sha256=s1QW1YPdSvsbCjTue_fN54PiNFxm-YcYwsDDd_iThP8,623
3
+ brain/_capture_command.py,sha256=1PIS_XWbD9zL2S6kF4Xwwp_6ho2P04iqFfkNOWYD2bs,16742
4
+ brain/_compose.py,sha256=ldreFRBfUsGd2CKhKhP3P73WiN6xAUohw4aMqEok-AM,2175
5
+ brain/activity.py,sha256=dwtCC5SBpkbYjMhyWLQnxBCDrFtbRy-5-qei0NoCUYU,6675
6
+ brain/ask.py,sha256=AvuxHKxOghqxyz7iTVIaIDlaMaTlbZNeO0AchkUqhMY,22420
7
+ brain/audio.py,sha256=qTZE5L4QkWjL6-BnqbHKVlRoruRSjFiNYnhSYXB1l0Y,22780
8
+ brain/brief.py,sha256=S9P5KUmC2XHrCFY8Z5-N8xYBgZvxcafWpA7mWxI4ZTA,9538
9
+ brain/capture.py,sha256=CamiD54VZDqdQ9K2FyLyhQKyXVyRICcMNDQiRFOAINU,1945
10
+ brain/chat.py,sha256=cYIHr91zCD69qquKTNc_nwv5EFcPSxSpj0guZgUPWBk,12175
11
+ brain/cli.py,sha256=0W_7J_YWFTwjk50ie8hQcxHCIvcBqqc1apre_pk3I74,374709
12
+ brain/cli_claude.py,sha256=AsyV_Kj-5BBHwmqKXV_jDO-YRM5c8WKmZQRThpuyd6E,2450
13
+ brain/cli_connect.py,sha256=SxWmuOoZtph8KqRA_HokNlDi0JNg9I8fp5oVUA9YRos,10219
14
+ brain/cli_demo.py,sha256=8tPuTaun-_11aIndqs8YpSN_aSD7FAiV4yVLmXIzT8U,9888
15
+ brain/config.py,sha256=T00h668XRxbOPy5YMB1-CsjXDHst7CSfoQgGrNjGmV8,99505
16
+ brain/connect.py,sha256=cbyYLuwjTi014KlgTDRo5-l0p9kLITnUa9D9DTIIRzo,37812
17
+ brain/db.py,sha256=XN88M1C-j4FahLvdXL0FVwqC1xbVmHeuTawCdZombFI,23573
18
+ brain/durations.py,sha256=zWJj-24jFMhoMazejc5lMwxxad01PFZ_lwsEIUqAc4c,3607
19
+ brain/edit_session.py,sha256=rypEEJ_72LrYOtaVijST7vexiUNtBuoeva_9gcUiiRA,5702
20
+ brain/editor.py,sha256=O4Ux55gSLSY_B7Tj8Qltqz3EDYGNXgFndaXe3Q8gaQw,2244
21
+ brain/embedding_targets.py,sha256=7tN-1uL5fbx1qyR2dU1T1LKJTjc4XzQG2J0K6M_hR54,2383
22
+ brain/embeddings.py,sha256=sb0rlXQIP8wxGx2mYvfZ1qE2j3Ms44lvKvC3ijEJWNw,17344
23
+ brain/enrichment.py,sha256=sntA-68EwcibnwgVOTsGWNKPfHUrCZUvmHLxrO3hwr0,35694
24
+ brain/errors.py,sha256=Zn-uUBbmRWsG3dB88dXlWhcf3La-qY16OZ7bbQ5XzY0,15396
25
+ brain/format.py,sha256=DYL9fLiPygns5o-vijXqw5sRIsXFI7vHtPiPWVs2WLw,30734
26
+ brain/gaps.py,sha256=q0H1xyrfcEfA01_HslsPAg30n6VjXzfSmuL3_9tU5QA,16927
27
+ brain/interactions.py,sha256=XWjRigCd8eyzcph1WJsdMOkbbcTqXxy7IfJZQJXYlM0,8961
28
+ brain/maintenance.py,sha256=S-vw71NPEG4bLank4_mSQqFsAvtGz3AOS83g2Q4FIYE,12069
29
+ brain/mcp_server.py,sha256=sa_klDNWGukniVUihYsKyYOuzUYCpLIt9kiJtULMwEo,135036
30
+ brain/queries.py,sha256=BbyHeLEZDHoOCui3uJ3nl9nRCXkIhgLSTP4K9Cx8DDE,46610
31
+ brain/rank_fusion.py,sha256=QsiARfyxclGuunVUBXytVqB0nuaBtRz2gFWGKAto6ew,297
32
+ brain/resurface.py,sha256=J5EnJUNP0fgXY7HUWqQpQqbp-5io25FAdVfSLKJOsPg,8357
33
+ brain/search.py,sha256=rbe3fTUoXiydEROCw4f92KrOWs71uEOxf-vc1NcUM-c,31557
34
+ brain/set_similarity.py,sha256=3Jy2bHmOd9A-DClbe5u0MniO81M_BfxGhuYYFXTIlOY,431
35
+ brain/setup.py,sha256=24nx6KT7rY8G7M1sgyL_SM3M5TQXVLqLgmVa3y20q58,46374
36
+ brain/tags.py,sha256=WgHLDQDvx9fWpgr011-uLRNLMys6bhS-F5HFKx7ozvg,2316
37
+ brain/timeline.py,sha256=of4EmTnTSYakiXUVUIK96EIQyDQMpTCnDn8gcqD28SA,32275
38
+ brain/todo.py,sha256=cUlE8WH3GtL8jORVYxESYP7_NH0XLOl1az8-1oJmAOo,4308
39
+ brain/uninstall.py,sha256=le-4oq6nCDXgp5NlZwRMBJN15NttlFe32wjZvlv8pxw,6897
40
+ brain/backfill/__init__.py,sha256=8HHVx1G73sXSCnf_uHE7UIQFWmAASNsSZNC2fJRQElo,383
41
+ brain/backfill/search_extras.py,sha256=lmpeIHPsjtTAO7lflRAdRaJpExye0Wwork5Wle_rvAU,5706
42
+ brain/backfill/source_rows.py,sha256=h4uHE5fwyIArgLWdi1hE8mbIR01EAKsijP1vukcbLzM,3601
43
+ brain/bin/__init__.py,sha256=VMfix3gCec6AeLHjJcVSUMipQCitXnOQ5fZRHrS6NQQ,56
44
+ brain/bin/_launcher.py,sha256=3GfK0dmLnCq4baq_4E0eUxNkVmqDaiMaeoYZKcW-AW0,4236
45
+ brain/bin/down.py,sha256=9qzFcbXnMF8oVlkvCe5Je2793WSxLjTLGpzq7L8C3d0,167
46
+ brain/bin/launchd.py,sha256=uPzpNQIYCXDG6OWly2wQYlv_KXvkwYVI0NgvYLBs-OI,9141
47
+ brain/bin/monitor.py,sha256=cE6Oxu2kDTGbjhwOAMN3JiKdLeLYAsVgKDOItdSN24g,20202
48
+ brain/bin/rebuild.py,sha256=FpXaEKHa-rURl38M3uLPwN2acwhne9p6KFdU2jZ9Nlc,198
49
+ brain/bin/status.py,sha256=ZIxFBBKqDRX-7xRhZxZxKI44mjeoPT8dy8X3IcTBQls,165
50
+ brain/bin/up.py,sha256=cyRnJ8pSWDGFkR-HMbA_3LzjrCdLeGD5yynj-hYCcdg,164
51
+ brain/demo/__init__.py,sha256=7qFvuiZfF6TswUFEUhH_Q_7zXuacvGlMphhP_95ZUTQ,17247
52
+ brain/demo/embedder.py,sha256=5giGV12hlCIDBgeh1Ino6ZlLb5b_fALec2A_dVRx0uQ,3075
53
+ brain/demo/corpus/manifest.json,sha256=xhwZ27k8RcLSlYKL67wVKV2nkDjczy87c177S2PVIOo,29225
54
+ brain/elicit/__init__.py,sha256=ArX7R_FOysP3kLdLlsKk25vtGzgBvZmebwIE5AJC1yY,456
55
+ brain/elicit/detectors.py,sha256=aogS-q-tjceHfWAxZq8bTm0YAB05XAyEY0X8wZP8Xz0,8898
56
+ brain/elicit/drafter.py,sha256=b9t7XkOcvvgPGWmbLHclfsY7Hh_wx7N1ioSuYfCJYt4,2533
57
+ brain/elicit/queue.py,sha256=nOMvClKboMBD4D4Of8CqQQWvWHwsMo7iMlhU5LUV5ZQ,9477
58
+ brain/elicit/schema.py,sha256=qpEiQmf-lRtLJkQ05X8L_au-nLH_fRb1jTf_H4d75PU,1441
59
+ brain/elicit/session.py,sha256=XHY6IDCmR4ygwG_BOsMApI8akkNQ-3tZ4seCOdVOLNI,16145
60
+ brain/eval/__init__.py,sha256=nRPpPaplnCHNJxbhKOiv_E7Gem6n5dcQaeT_FD0j5aw,3910
61
+ brain/eval/answer_eval.py,sha256=bW0C6lf8ISIh5uIOpRVZ8Ch7hzh7mncUyUc3vQdgDzs,9716
62
+ brain/eval/baseline.py,sha256=QQFcQ1qhCe_GQmatWv44SpzGlg6lZByQG0J-vrDIaa0,10558
63
+ brain/eval/concept_extraction.py,sha256=ef6k_GBk0j7fvm2rzJnmp1n6Z46ZwW7tTLFz44rtagM,15245
64
+ brain/eval/corpus.py,sha256=4eYYk2pjBOJ7HXATliKY4EPKsxyDMt_mt6fNVvk0Tss,5405
65
+ brain/eval/errors.py,sha256=1yn3nF9jeH4X1hD7ABEXXEDSEwhyVK7kyQVcHqzk0H8,563
66
+ brain/eval/graph_baseline.py,sha256=LQcXG9PZGtP0htxa84afXitnXuL42sYa0xRE-ikIZ3k,9283
67
+ brain/eval/graph_retrieval.py,sha256=_kB3HoZyZ-dHFvQww6owP-39FUqftLftaGEKLp9Aj7s,7322
68
+ brain/eval/graph_runner.py,sha256=z1dTgAXcRPVz4OtDKn_zopZh-tOR53hOcVwMNkSkS4w,12047
69
+ brain/eval/metrics.py,sha256=X_zjKcyaLH3_IIaVtuIv1jBonkY4weOXl0gZyNW9ZkM,3386
70
+ brain/eval/runner.py,sha256=q5-PMIqtS47GGy7t6EYRUswb15-bk7KSzHwG8MhatFY,7554
71
+ brain/graph_rag/__init__.py,sha256=xoKessW6xImJZzenyYCbMjnyd8kdrlVRdXTriYO6lII,2317
72
+ brain/graph_rag/_retrieval_common.py,sha256=J-XEy9Ypb0sET3K-hbFAeBV1FCYIfT3FBzQLaGfmsNk,4366
73
+ brain/graph_rag/aggregates.py,sha256=CmnqAMaBUEZYjAe17VguEDZSMnrSpU1--FNpPGK4muM,14038
74
+ brain/graph_rag/build.py,sha256=1G6evNMP0v1Qejdxj27Rit97o9s5-s8vgMHqIZScURQ,18495
75
+ brain/graph_rag/communities.py,sha256=9n9gfu6zt2hDbXMTzBxpT9vYZRVjq56bxaUvH07pggs,26422
76
+ brain/graph_rag/communities_summary.py,sha256=S05Uu8Xgakj3oWZJp8CADvaykeY-OB7WF3lei1t62K4,20363
77
+ brain/graph_rag/concepts.py,sha256=067DTOL2pz87i7RgXzCuYCnBgoZjn8X_BiBCmM8tays,9214
78
+ brain/graph_rag/cooccur.py,sha256=YBo6fTRYhYQGgYRvFY1Z13IjcANdDDOWKulBiKcF7vI,8243
79
+ brain/graph_rag/cross_type.py,sha256=YQV3XouzkeaS49vYcem_x9yy7d73MMZqaC6tYCmblms,14963
80
+ brain/graph_rag/extract.py,sha256=K_fue0T5SVbOCik1ykPOPtLVNl5aM6Fb1ssPMjYYqM0,41237
81
+ brain/graph_rag/fuse.py,sha256=VtAY4mVq82PAypcuTZb1dC-sx0lO7aaQxf0h1sly7qQ,15969
82
+ brain/graph_rag/global_.py,sha256=a4t8t3baIy1TjZU3CJhEMawugykEsp3gGpd56UpO1Sk,17939
83
+ brain/graph_rag/grouping.py,sha256=AESFf1KL73PEaOOaz45GF_htwlJCBIX1F378uJp1EkA,16049
84
+ brain/graph_rag/person_resolver.py,sha256=2CoLvaOZxX_srflUyBFldCbhJB-uSquFKn1rJMCIWm0,7176
85
+ brain/graph_rag/reconcile.py,sha256=h0C7ZvwB4cbtS44yIpc17_9VdpIfUPBiXbmJaVvz5Ik,37192
86
+ brain/graph_rag/relational.py,sha256=pMB0ED03FIet3uHpnEIbNL2O5NK_NVpjFbr6qSLTzIE,12512
87
+ brain/graph_rag/retrieve.py,sha256=mjA3AM4ZzTBW6Sb8Q217M7VgdSFgaIK67LP8s8Qdpuw,23797
88
+ brain/graph_rag/router.py,sha256=S7sJKVfcIFYGxhaYy7gbmxZwjfVhwPkWgxW1NMr1W5s,11749
89
+ brain/graph_rag/schema.py,sha256=EOWVMgAu_4YNrSZm_-E2hnMgJPOXVnC8U3GtC4wmiHQ,13447
90
+ brain/graph_rag/sync.py,sha256=sUNA6cqBHaUp53NXJ6v1_oKNevoPGkSzt_qhc8BSyEU,10426
91
+ brain/graph_rag/tenancy.py,sha256=xuI8nyOPdn7bVFlQhPB_fhqBX69ZatnomM-eSYjwq9s,2000
92
+ brain/graph_rag/themes.py,sha256=bIB5suatNbU3o94_SiGXrySSJFjyDSfvDtT6HhgvZ00,21531
93
+ brain/graph_rag/weighting.py,sha256=wnkNdOxiJaCGLCI_LlBrq5G3AOuhrFsMxp2VzimVxa0,8811
94
+ brain/graph_rag/aliases/__init__.py,sha256=MX7SMqVtLMpp06vFlBuA56o9nSylEIfZLdyOGpp_sqQ,25099
95
+ brain/graph_rag/backends/__init__.py,sha256=AafOJXv8WzKoWJ2M-GNgngNYUq_cQUsE6cSO9WfwzCw,435
96
+ brain/graph_rag/backends/_age_helpers.py,sha256=jc47_sdaLAhFs1CA0aOJEnkUXylaZk-_h2RDp3VzBZ0,22303
97
+ brain/graph_rag/backends/age.py,sha256=h3B7MKUxTbh_1iMSGY1UFMMk5XhYSMWzLSAH8KvSDqI,37649
98
+ brain/graph_rag/backends/base.py,sha256=0BtOmmb66P6xw5ykvpORUQcD9nqKjRXIRp46fSu7Zk0,12269
99
+ brain/ingest/__init__.py,sha256=T4Gaszhph4Mu36PYCNmL2cqs8FUW4Z9QRvrKHGxNRtM,84173
100
+ brain/ingest/chunker.py,sha256=dhnhxkmC-WuZlOx3mRO89VeOOAYJivUsTfK15cTNdp8,8414
101
+ brain/ingest/docx.py,sha256=s5OdWjpYZ5upOuR-WyzYBYAucos7_-Lgx8keCYQ45Pg,1191
102
+ brain/ingest/gmail.py,sha256=IwVNGP9tV8Axikovm_PKN4n7lKh05m_RAa3a-muzzac,24690
103
+ brain/ingest/markdown.py,sha256=-_9e7r7hr7h3zTainn8g8qzCgWMfN3W_wRMimkHLgfQ,1490
104
+ brain/ingest/pdf.py,sha256=bdercNhVcm8r0qJIOezXQva9QujpxyAfDKEL2dy_HPU,2073
105
+ brain/ingest/stdin.py,sha256=gaJCHvqNiJb_I_BdAzIgyFJU9ma8B15NooXyiNvz9Q4,577
106
+ brain/ingest/sub_tokens.py,sha256=RFn-sI4YHi2_nuoTI2lyrOtKAPqMrCd23eA52J9BzWA,3397
107
+ brain/ingest/text.py,sha256=1DuZs6JNjayqmhUar_1rqdEBy-qm6Io-XqYHv1aF3Rc,466
108
+ brain/migrations/001_init.sql,sha256=Ww6A8kR1AzrXN__dhez_osffRVIHUJVMLKf093GwPLI,1760
109
+ brain/migrations/002_qwen3_embedding.sql,sha256=WMDP_tBM9D52oZeMCPfQMXNAkLLsPJ7UiuIQAutiPhc,772
110
+ brain/migrations/003_vault_model.sql,sha256=w9UiefKAKkpBSfX7S9Dg73aBKRo9gCxZyhX2dtB_6no,1739
111
+ brain/migrations/004_relax_content_hash_uniqueness.sql,sha256=sRoaBtWE2UZlZew2aHBinObDOWBqj8tUpaIIE1OkKxk,777
112
+ brain/migrations/005_derived_links.sql,sha256=U3aDuoQSm3JIAY_cKdkeWemGdJjUlSQ6MzfTMSXcRX4,3539
113
+ brain/migrations/006_dedup_file_by_source_path.sql,sha256=JV0X4fGMMcakFzKZHGWmZMTU8iVxofGr7Ze4W05cXYU,1283
114
+ brain/migrations/007_email_thread_and_draft.sql,sha256=mdizHoA41KjXMD9ZV4vSB2GfgviRZQFaTUdzN8WbKG0,825
115
+ brain/migrations/008_gmail_thread_unique.sql,sha256=NJqpG3TPF91FRMPXV10aMXk1EKPs_8h-FhvgOBuCbbw,556
116
+ brain/migrations/009_chunks_weighted_tsv.sql,sha256=1UdqUCRdVvjdgyMYm_kTkCtISMtk7iX4Save0aTfwSo,1380
117
+ brain/migrations/010_interactions.sql,sha256=hFKwYHKzJnb_WmHgIeHURNx5q20Gp6a-hkA9SGp64tk,1316
118
+ brain/migrations/011_documents_summary.sql,sha256=kIb1Y23jZpoCAvgxhDXDnB3AV5fopkotOjBpQ1u4F9s,928
119
+ brain/migrations/012_graphrag.sql,sha256=9CSeCvyXdbJzGvFK-AR3vgTYuZrHt1fuGcekkG3WDeg,9829
120
+ brain/migrations/013_graphrag_communities.sql,sha256=PHJELUCJXg0413xm6DgclvNuiRvE-sHEKnZ028sDWEA,7337
121
+ brain/migrations/014_graphrag_community_summary_hash.sql,sha256=gR7eeH1Gnu2_RNAqpQd_x36GH5xm-a1RZ0eFXBHoolw,1693
122
+ brain/migrations/015_interactions_graph_targets.sql,sha256=EVAqe__uA0qPtFavieVRzdsoHiBKyrP9YmcubsHeWU0,3966
123
+ brain/migrations/016_index_hygiene.sql,sha256=-tUpYKasB5NJIz-F7h4LioXc1paGmRuTOY4eGunuBN4,2946
124
+ brain/migrations/017_elicit.sql,sha256=HKtOPcraekMHyS0da0PThdmTaKELkoMw8qwYBqYnu8o,1582
125
+ brain/migrations/018_review_gap_signal_kinds.sql,sha256=VboKMYmVgmenDnof-3htqjiVdVC3gGM2btdVlRpbuCI,1541
126
+ brain/migrations/019_search_queries.sql,sha256=AOQZDDPHHsFzmIzhxXExlvIEr1sZUAxq3BG_2rs9zV8,1587
127
+ brain/migrations/020_link_suggestions.sql,sha256=tEJitXd-dLqT8BctHT1qx0VLoqMiwEG1K7MGuYKQ0o4,1925
128
+ brain/migrations/021_timeline_doc_date.sql,sha256=QxWapoeLMhWKaPBlanGg7k0txAspm_xubiveGz45w0s,1756
129
+ brain/migrations/022_link_suggestions_undirected.sql,sha256=01nG0D89BWre7Hii7-4O3tO4tsVsXlWbkZyQBO3tvWU,4470
130
+ brain/migrations/023_search_queries_fts_count.sql,sha256=bqKrwOZhaKByUsCFjGR_r6evTo6gyjRXLCwDv0UlQOA,1393
131
+ brain/quartz_overrides/__init__.py,sha256=etjxUTnRaAgtdrT3Jw3DFp86g1etOaSfX_4ttvd1Pjw,507
132
+ brain/quartz_overrides/quartz.config.ts,sha256=XtTTf3rJvmW256GTaWwWwqdxe7rSeisdDPWPV28usQQ,13499
133
+ brain/quartz_overrides/quartz.layout.ts,sha256=c3Tlzt3-FZYZ_ouGPcfahZe_5Q3sneT4Zh1QLJtg5tI,15221
134
+ brain/quartz_overrides/quartz/bootstrap-cli.mjs,sha256=pNpNs6kcd5lCoJjZOwmHaT1b2nv3mD2MHYcZf6m4N90,2307
135
+ brain/quartz_overrides/quartz/build.ts,sha256=ohbNXlzCSW2AkhjweA2VMwbq6P5vDPPr1DngWAMk3aw,19863
136
+ brain/quartz_overrides/quartz/cli/args.js,sha256=ZY3I2Hc9UkhV7eOG3q8geHyVIvIXo_LB7WgEFfM4Twk,3965
137
+ brain/quartz_overrides/quartz/cli/build_partial_handler.js,sha256=5F6YYz2qPg0chqDCx4mrn8_4g4nY0QpSG_K4-7ubn6Q,24133
138
+ brain/quartz_overrides/quartz/cli/handlers.js,sha256=YMHyjm3VPdlDJOqDnceYAwycmmM2syRk1kWzE4V-d2c,19842
139
+ brain/quartz_overrides/quartz/components/CommandPalette.tsx,sha256=eFlzHKMPuPSn3-JHYDicfJeAsBLLugFRvUkqtddZs-0,7714
140
+ brain/quartz_overrides/quartz/components/Explorer.tsx,sha256=B0Rlz2Wm8_lD_DJsLmOJA7xVZmQa7tgHJIWyV5WUpr8,7137
141
+ brain/quartz_overrides/quartz/components/Footer.tsx,sha256=1FGXg8EZIKStRPwQR_PngBWUfZbt-_Y7lyjuxMBGnyU,634
142
+ brain/quartz_overrides/quartz/components/Graph.tsx,sha256=se3Pw2vJuVKyPcMiJiQrmDB5LwYUNj9K4Xas7kytOAg,22116
143
+ brain/quartz_overrides/quartz/components/PageTitle.tsx,sha256=yBUMD5rwKOrVz0mFRfpBTqmxTl2ryVaelT8NiD7DEfk,1763
144
+ brain/quartz_overrides/quartz/components/RelatedDocs.tsx,sha256=MVm1vIDPTKLlRgQ9UGR-E7CkMGOfKdAvuN55DRsY8ok,1459
145
+ brain/quartz_overrides/quartz/components/Search.tsx,sha256=WiE1HmaKT0B_TjCrVg01SqWM4NBG8IZVdKu_QCtY0ho,7475
146
+ brain/quartz_overrides/quartz/components/SummaryLede.tsx,sha256=FDf59KdF9-GIxXB3FLMmynX8CfkTu3_Q4RkeJiUnKzs,3236
147
+ brain/quartz_overrides/quartz/components/index.ts,sha256=CoBzGznFGvJ5N3XbwNPWWXNV9woDxjeroRzEPB0Iln0,3182
148
+ brain/quartz_overrides/quartz/components/pages/TagContent.tsx,sha256=q6QnsQZTKsi3hsCdzgiTg8zOVb4-ikwMbefBCBOzoDo,11759
149
+ brain/quartz_overrides/quartz/components/scripts/commandPalette.inline.ts,sha256=ovwZiPLkV2DYtoAuThaZ9YdCGhIrZTiCFZqduF0t8d0,27121
150
+ brain/quartz_overrides/quartz/components/scripts/explorer.inline.ts,sha256=5zM3q_dAdG1_uq9lrWJ-mofGruVvhgiaULCddmTpYuY,31151
151
+ brain/quartz_overrides/quartz/components/scripts/graph.inline.ts,sha256=tdkAyIihcV7YyHgHAuxxuB4XZtS26HluRZbe7DmvhY8,93537
152
+ brain/quartz_overrides/quartz/components/scripts/relatedDocs.inline.ts,sha256=s1mBik0mqeFbhJhEDoWoILDShCpI70-dJxvwstNp8GQ,5250
153
+ brain/quartz_overrides/quartz/components/scripts/search.inline.ts,sha256=QuyRiMM1v_IE5RaujiDZw5J0O4fTbXLHeWWlAMWyekA,41061
154
+ brain/quartz_overrides/quartz/plugins/emitters/contentIndex.ts,sha256=YL9RiMKln1Lz4ZWh1qcilGM62o8N8pJaUmuB59N71SE,27040
155
+ brain/quartz_overrides/quartz/plugins/transformers/codeCopy.ts,sha256=tfTIPYus5cVK53PKlCS7rddpkHLZXuK_sonx_asMDt4,4548
156
+ brain/quartz_overrides/quartz/plugins/transformers/derivedFenceMark.ts,sha256=Jpcrn3IC8J-KyiSQIWU_IePzxJSBlwHoVSiLrgovO7k,13121
157
+ brain/quartz_overrides/quartz/plugins/transformers/emailThread.ts,sha256=qc-KAn4LJRnXt_c_zPsw67NKO7Z2nqvMRCdizzPlpL0,7263
158
+ brain/quartz_overrides/quartz/plugins/transformers/emptyDoorFilter.ts,sha256=1GLQ0lArgAXa2IAvGcx5oZMdPW4K8w1n9uiTSR-78vI,8608
159
+ brain/quartz_overrides/quartz/plugins/transformers/index.ts,sha256=4L776fYYHspl0NgAqm4UvJw4_0CtRXE91mNOP0de9Ws,6064
160
+ brain/quartz_overrides/quartz/plugins/transformers/linkKindMark.ts,sha256=QQR8y_PEOaFvYkIG-7xUp2LZp0FcF0Jjv-SJh3wck9A,10024
161
+ brain/quartz_overrides/quartz/plugins/transformers/linkSourceTag.ts,sha256=0WSTBlP5tLbBhXWjHul0MZpInUDUMOTso8lw92HlSAE,5246
162
+ brain/quartz_overrides/quartz/plugins/transformers/relativeDate.ts,sha256=m4HjW2oBPe3vUh_RMUOcrqVVUy9UY8lcFX4GNrc3s7M,5157
163
+ brain/quartz_overrides/quartz/plugins/transformers/reloadSignal.ts,sha256=06EkbWANfhvsRkPXh9NcL_iHIyVuNlHneUA-estyeRI,6503
164
+ brain/quartz_overrides/quartz/processors/parse.ts,sha256=MfIUettYjMbY-fsKNfQDAiKUfepdrEdT5WcuU7Y44lA,15367
165
+ brain/quartz_overrides/quartz/processors/parser_cache.ts,sha256=AE_epBKS897UToPpX-7UDmsBW0QUm7NKLN04rTT658s,3579
166
+ brain/quartz_overrides/quartz/static/brain-logo-dark.png,sha256=aa3c0CI-uFxrLUfEaanwUSNVBSzxY2-Su0ux8KGoHV0,150550
167
+ brain/quartz_overrides/quartz/static/brain-logo-light.png,sha256=454GqAa7AxAb5N2bfpGb9AamFudTpS0SM1MU1zDouLw,145578
168
+ brain/quartz_overrides/quartz/static/codeCopy.js,sha256=P9iBAqt812Ki6wPZZO_AVEoPqlPiQd8KL-cIqqU9fDY,8449
169
+ brain/quartz_overrides/quartz/static/emailThread.js,sha256=Lk50RKXz4Tni9-E2hFBsfFs1bATRi8B3RlXrYklDHqU,14505
170
+ brain/quartz_overrides/quartz/static/favicon.ico,sha256=C6ln4l89ahD5vteVpWE89x0N5h1O3xat-QnoiKntz70,9662
171
+ brain/quartz_overrides/quartz/static/icon.png,sha256=454GqAa7AxAb5N2bfpGb9AamFudTpS0SM1MU1zDouLw,145578
172
+ brain/quartz_overrides/quartz/static/linkSourceTag.js,sha256=XPodNZnsaNqQyHQ5p64ZvgfPD5eWTZJw2E8cOJrscAw,4960
173
+ brain/quartz_overrides/quartz/static/relativeDate.js,sha256=nIG5VbvffjpE6FYjjlQjo6m7qkcgdEVz8clm4CwBYz8,7024
174
+ brain/quartz_overrides/quartz/static/reload.js,sha256=HHQlLpb1oZBAs0cARxbSJ0HfbdiGq9GanCE6Z71Zho0,7144
175
+ brain/quartz_overrides/quartz/styles/custom.scss,sha256=cKOj3EMPqCDQfHk70kDyz9ceA9EUJ_DNmJIywSLjuZc,5312
176
+ brain/quartz_overrides/quartz/styles/graph.scss,sha256=7w9pe_yOOv-HddjP6qRNlzlNgDWfKgqFaq9olOqB_9I,14244
177
+ brain/quartz_overrides/quartz/styles/brain/_article.scss,sha256=c8i64FXMeqpjaXcQAt0m1gKUbQIu5rA3ALXuyZPfx4U,10699
178
+ brain/quartz_overrides/quartz/styles/brain/_atmosphere.scss,sha256=UOBDx0bByoKoKKJwrq_mNUqoPtTISx9RsJSA01IsgjE,5171
179
+ brain/quartz_overrides/quartz/styles/brain/_callouts.scss,sha256=Lc4xmsnAEi1CHDTTCU8kw7xHG0XtPagdfDyjtKXlsBs,7313
180
+ brain/quartz_overrides/quartz/styles/brain/_cmdk.scss,sha256=VSSsPHZUUcAB-1_-tQJVc9Nd_Di7O5S-_IxSdtRES8o,312
181
+ brain/quartz_overrides/quartz/styles/brain/_code.scss,sha256=ixnyyLNPaNjzDdnl9GOKXKXE_6-oGNe_GXIo23DvRBQ,8169
182
+ brain/quartz_overrides/quartz/styles/brain/_command_palette.scss,sha256=xOrpd7KEX7xUXkv4mcBG7kxnQrKThNmdrg6xrPErA_Q,12029
183
+ brain/quartz_overrides/quartz/styles/brain/_email_thread.scss,sha256=I7pIRaGtmoiLD7cXppbqCNLJonsC0exxDWuT0cWKanw,8548
184
+ brain/quartz_overrides/quartz/styles/brain/_explorer.scss,sha256=Ofrr9SKe6UmJ1NVu1zbvtzBukxN-r9mrCNJKsfUVC90,5497
185
+ brain/quartz_overrides/quartz/styles/brain/_home.scss,sha256=_zM034Ehw-B2CP4HMxO3md3cWlVv4LOOu2ujQOPYC2Y,7306
186
+ brain/quartz_overrides/quartz/styles/brain/_links.scss,sha256=2POxYmVgXoXqIk6wJDWhlKCSyb-30BqjpfNxnYaFuR4,14483
187
+ brain/quartz_overrides/quartz/styles/brain/_marginalia.scss,sha256=UJNuCA7j2gMIFjA5z7ny0dlHq4RxOncgQiA0IqVs-A8,6385
188
+ brain/quartz_overrides/quartz/styles/brain/_motion.scss,sha256=LMljI99qmIlorswq2__BGE-tsNsQ1TsISjTGrJWAug4,7911
189
+ brain/quartz_overrides/quartz/styles/brain/_people_hub.scss,sha256=eDgVLk-KUMyH4RYO6CfjNEsuz9bzLGprsLs2_DyTxBw,4240
190
+ brain/quartz_overrides/quartz/styles/brain/_related_docs.scss,sha256=sTw6i5ux4eQHdcWOCZZoqb-XT9iRcS9Ie9GDUNxXR7M,4039
191
+ brain/quartz_overrides/quartz/styles/brain/_search.scss,sha256=PX6d50z4eYGNktldZRxvRQlTb8Di9q5PncLLNBd4goE,8115
192
+ brain/quartz_overrides/quartz/styles/brain/_sidebar.scss,sha256=NCqqD9bYrEGStKkxIsfZ6AEVb0A9m1V-kzX4luHt4WQ,19113
193
+ brain/quartz_overrides/quartz/styles/brain/_summary_lede.scss,sha256=Z0EfAxrJLA8fWHaSoiCTqmV4OVGQkEjtpQaEwj_U-bw,2159
194
+ brain/quartz_overrides/quartz/styles/brain/_surface.scss,sha256=skN5RIpG4CfecyIJXAiJmeByQAIIk8bh0fHcSqjNgkg,1691
195
+ brain/quartz_overrides/quartz/styles/brain/_tag_content.scss,sha256=6T2u5h48T0D5fXwvszOWud3MdCzuAJwPl6y4-DOWb_k,3263
196
+ brain/quartz_overrides/quartz/styles/brain/_tokens.scss,sha256=xgTojhjbnwllW_gKi6bTDXs8iVhe2CFiHcTQgZSywt8,9580
197
+ brain/quartz_overrides/quartz/styles/brain/_typography.scss,sha256=-Yys-vlRDpZwdJoD12GhOXwlwUpKD7RFeMwpM9DqCsg,2601
198
+ brain/quartz_overrides/quartz/util/ctx.ts,sha256=ybOjYXiyfJLG84HOVf2a9F5eZ0YkdtKAX2s1tK9M7ZI,3615
199
+ brain/quartz_overrides/quartz/util/fastpath_manifest.ts,sha256=SEUKkYJYKNIjXXtKzqPfZBvnxWuy3s5clXeRSpcoKkk,23540
200
+ brain/quartz_overrides/quartz/util/path.ts,sha256=dDorlmy2VVrfUbvSiCkX_CPKn7FPzg57lFWF-QgxXd0,11682
201
+ brain/quartz_overrides/quartz/util/sourceIcons.ts,sha256=d-F106peGIWi15HXh9FqP0AHlB5ng4Rr4TLRf2t2X-0,2417
202
+ brain/review/__init__.py,sha256=3KO-TyPypDaaQlhpVOr1DaJ_RnFcLbDrhp-p95aAw_o,913
203
+ brain/review/emit.py,sha256=bEYoc3NybrQkV1X5cAayv_Tlpd7q5Kq43-OVq4HlII4,1058
204
+ brain/review/queries.py,sha256=mPDlquen09J1Johp21m_KLDKq10ehQ4ejKNKL6LFVzg,14720
205
+ brain/review/render.py,sha256=qU59mzAweYBZANIIJi9DjSflJ0VGETr3zM7kGRPpLxk,7551
206
+ brain/review/scans.py,sha256=R5MwKrHkB258oV3BQ-gkb25wJJXBgjruXw7Jt_vzpV0,12926
207
+ brain/review/weekly.py,sha256=Vze9gteZlpCX_b-TQSakKUOAttaZkZ4o_-1o0Ja6qoI,14900
208
+ brain/templates/Caddyfile.j2,sha256=ptJtK74E5m1Ssak4d317i-oBT2NLMPE48YzjJfTChwg,304
209
+ brain/templates/__init__.py,sha256=L43P8yVpTusHbOVSbbOdMMl_z7KhqjeWBe6UmEl9v4w,92
210
+ brain/templates/docker-compose.stock.yml.j2,sha256=mQ6G5_5AY86NPy3nXbM6MpAM8UF8bQ1UgyH2jJV13LA,1058
211
+ brain/templates/docker-compose.yml.j2,sha256=u17DUlJ3R_qlxu8SgXZJJ6X26Oq_uL6NSUcIJ0cEhF0,1575
212
+ brain/templates/env.example,sha256=qw-LGYcQfVqmYtDm0hFOr76dYRuGR22BZksGizZOEAQ,9399
213
+ brain/templates/bin/__init__.py,sha256=L43P8yVpTusHbOVSbbOdMMl_z7KhqjeWBe6UmEl9v4w,92
214
+ brain/templates/bin/_brain-brief-fg.sh,sha256=NIE4_jZYVxE2BH7kWOTgwy3x61k-IlS9Vh20-CCrZX4,973
215
+ brain/templates/bin/_brain-build-fg.sh,sha256=ZB08u4fgi_dyO9n04FgKjoECXyn97ADW4QcBGO6sj64,2578
216
+ brain/templates/bin/_brain-watcher-fg.sh,sha256=eSzEspqy-Q-hisevYFH1dcErSScCHHpdsommZ7DBA4c,3311
217
+ brain/templates/bin/brain-down.sh,sha256=ITNJ5sRlCA196Xil1HBkXaZ5WUJhX-K21n7pLHh8BLU,4036
218
+ brain/templates/bin/brain-status.sh,sha256=rv72N3ssVD0CXigSzp0w7XH665Ml6yNxMNI8C-MYiR8,3464
219
+ brain/templates/bin/brain-up.sh,sha256=U4rjFfhkCdDIxi_4lDksT-2cXVohSnMv4abyR0VF3SA,9704
220
+ brain/templates/docker/age/Dockerfile,sha256=Domy2iyT7Lc9S6HQmRIcNtaUzoNro7gP6XPBEolsnxA,3893
221
+ brain/templates/launchd/__init__.py,sha256=L43P8yVpTusHbOVSbbOdMMl_z7KhqjeWBe6UmEl9v4w,92
222
+ brain/templates/launchd/com.brain.brief.plist.j2,sha256=s2R9ykvjgoZHtUuUmvOvpkjuvcMmmJIW4v1O42G1f_g,1790
223
+ brain/templates/launchd/com.brain.build.plist.j2,sha256=hstIlQYquK0WcyDeqR8R-qQrOjOe9cJfaqIGv7KSDAo,1946
224
+ brain/templates/launchd/com.brain.watcher.plist.j2,sha256=AeR8ZpUHGrK1wgAMHiOd1PCb8GIVEEKbuEl4aNiMS58,1954
225
+ brain/templates/skill/SKILL.md,sha256=ek530TJyyvjMZP92AQpXjzVo6gDPz2xRpTfJ0jdM_q0,3431
226
+ brain/templates/skill/__init__.py,sha256=L43P8yVpTusHbOVSbbOdMMl_z7KhqjeWBe6UmEl9v4w,92
227
+ brain/vault/__init__.py,sha256=0nzfVCTjS8ZfDyrurDOGhQHItXWOASbGYmdghf_qgRE,3982
228
+ brain/vault/_atomic.py,sha256=lcOmzn5OuDS9MDJbYkHkx2WPGZU_Y7FAYqAmexJfcvo,1022
229
+ brain/vault/daily_index.py,sha256=xbjKRqSJHXNohXKCB50emWH4ve1zm2XlX-Taka7cJqM,9608
230
+ brain/vault/export.py,sha256=Y1wVyVdeHLNlMFY9tNr7sYoooko4y0wZrYKkMVNK0V0,27551
231
+ brain/vault/frontmatter.py,sha256=6gKYFeD5bNCCMJ7534ePItisHqZ7pMxAcIE6vC1zHsQ,7492
232
+ brain/vault/graph.py,sha256=n154-VnWI1NCe1w7G9Xke1Hs29DdxEGggfjZcHl3gA4,22458
233
+ brain/vault/graph_format.py,sha256=upl2dne7hGZ7zj0ZoONjdDOhy-PvKFj72vXm5GHurAI,15447
234
+ brain/vault/link_rewrite.py,sha256=4A9xajhidhG5a9njKcqBH5ITt7dh3nPnrKTU0DpOmwY,9175
235
+ brain/vault/links.py,sha256=bC8C1n148hwFhcXAC73ut6ZEUQsvRUbjNsRLVxVBDME,10520
236
+ brain/vault/note_builder.py,sha256=RfKNS1FVNYd660LoW2ApGwYQhcISpGrCx01WjHaWISs,7855
237
+ brain/vault/paths.py,sha256=5jvkAFHqsj-qS-9qS5V7SXssf9WOJdRR9oThpgqptMA,2425
238
+ brain/vault/quartz_overlay.py,sha256=9XKJLoDus-gjvleWxb7ABcHhd1fLHAriZvB1Vum3vn8,9777
239
+ brain/vault/rename.py,sha256=pWoTMjrYWUO9eyACrQeBDp-jH1cVrB7lC9fNx9IzK6g,23573
240
+ brain/vault/resolver.py,sha256=3IiX1Q9KkClp_xRf1yrTPS3O7RMNeeOjddnA5xjKA6s,11149
241
+ brain/vault/slug.py,sha256=qFYRNYbegAwLBugR5fz3Kvs_7OLlW1PMHsJDbGmfJ7w,5164
242
+ brain/vault/sync.py,sha256=og2tkR8785mRv0jiWqlsyFgSk2eatzvNwks5I10ZHmc,59831
243
+ brain/vault/sync_summaries.py,sha256=XG8PUxjXFupHhIF0-Zo8AJ3eLOErM1oikk60oINjuTU,9936
244
+ brain/vault/templates.py,sha256=m627BBvclIgWqmUztQXsTRAkz5CxB0ggYAtXnS3agZc,5088
245
+ brain/vault/watch.py,sha256=mORUgvbQXzvy54bsUCYlM6TZ6rgrV3YUOPL0DjIpukk,46842
246
+ brain/vault/derived_links/__init__.py,sha256=908kdpG_6qH3RWQxHMvrJg3FJ2JDkveKaFkJBUEnt6Y,1327
247
+ brain/vault/derived_links/directory.py,sha256=Gl6YrhRgqLCxA3Vc05elYTm2Ymq2oosDOfwm3sX_xfY,25070
248
+ brain/vault/derived_links/fence.py,sha256=PlzTd7mwWuZzJP4a3Ma8c6BJk1CyASBa03SJujQ_lAc,17137
249
+ brain/vault/derived_links/gws.py,sha256=c2PEAzEqQkShtICslvRdySuKjvspDlZrEEDPG5zD9Tc,2642
250
+ brain/vault/derived_links/participants.py,sha256=kYv_-aKBxWvkNvyBc-sRUl2R4PCC2r980UpcekmQUdc,5178
251
+ brain/vault/derived_links/pass_runner.py,sha256=aZzOJJE__mzUfCGpe8aanBa-m86XkpbQD9IBk2xv1sQ,14308
252
+ brain/vault/derived_links/rules.py,sha256=HoE_nGuA_b28Vqfp4_uGfrLqMgrk4EAcwwkWe8EAD-w,4695
253
+ brain/wiki/__init__.py,sha256=nRibszHd45HJ8hYosBhP0TZqVlvjH7hJlrXXhH-QUIM,331
254
+ brain/wiki/_github_slugger.py,sha256=Y4dN_7HRsQSJWzOENica0WM1__VE5ows_BZvpUxsRuY,2715
255
+ brain/wiki/_person_name.py,sha256=v3fPeg74UusgjkLW145cW27iBDPN6YZe0p1rhC0gm5Q,12156
256
+ brain/wiki/build_homepage.py,sha256=Vrv7WXV60t0tWuFLJyOn6DjCHkZ1cFiVlYWBPkQ62Ds,24508
257
+ brain/wiki/build_partial.py,sha256=VGE1MdYCC7CwgHCYpaqJfTZFoBhhPg3f6qXO9jyAud8,9851
258
+ brain/wiki/build_people.py,sha256=RLbwZpZEQnjmIDps1P_tMFFMfMzUhzS-vwIkae2EYUc,38373
259
+ brain/wiki/build_related.py,sha256=Wt4TQTqvVfxOpfU1r7jstQ4n7n2tOw-VbzN_acuWdDU,28670
260
+ brain/wiki/build_swap.py,sha256=rTGekYoqRvGhwzzXw5Rmtv5k6hJC4O1iB_F0qdtpf5Y,24401
261
+ brain/wiki/build_watcher.py,sha256=UhG0OQZfptwLZi23eTaFSYVXWb_4ME7gDkVt7fJYeow,40728
262
+ brain/wiki/edit_classifier.py,sha256=lGpv7qT53xZ1Hd5091f_hUcRgvD4gZlP_xw735veviI,8102
263
+ brain/wiki/errors.py,sha256=UnkOb8M0TJ6SaHQ2J5jU6vQbMdTjNSg81yOxFi3gG1k,313
264
+ brain/wiki/fastpath_manifest.py,sha256=W7XVyAUkX_vHfZTWB6I5dn5sHq2yFWQAgVWWza0HOwI,17596
265
+ brain/wiki/fastpath_state.py,sha256=7yuIo3Ur8Iq6qcUuPyYvob8JRAHBOgKYE7O0ZBg9ph4,6177
266
+ brain/wiki/install.py,sha256=gXzQ055ZCQ3mVdRJhcos9-H_2NimSKs2Jtg2CGAkmmQ,11390
267
+ brain/wiki/slug.py,sha256=B_24RqfjzbzhmH-A894AmD-osW-p_rSslzWmIej5Kp4,3958
268
+ secondbrain_py-0.2.1.dist-info/licenses/LICENSE,sha256=VoLCxm8CbxpRlu45_qGmVkHGGf9Nz6uL424MjexxOqk,1067
269
+ secondbrain_py-0.2.1.dist-info/METADATA,sha256=9d7wr3vm034xib8jhZap6Z3UJ2m96Fd9j5lK9iD3PIM,10516
270
+ secondbrain_py-0.2.1.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
271
+ secondbrain_py-0.2.1.dist-info/entry_points.txt,sha256=PGEJScmQKYPGrli_JBEkfvV8JQ0XagnPDqgewYHkguc,408
272
+ secondbrain_py-0.2.1.dist-info/top_level.txt,sha256=0pJ5ecu89EDo7ZExlRWAh7IWxf55ZhTYilz2jLXwRSg,6
273
+ secondbrain_py-0.2.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (83.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,11 @@
1
+ [console_scripts]
2
+ brain = brain.cli:app
3
+ brain-down = brain.bin.down:main
4
+ brain-install-launchd = brain.bin.launchd:install_main
5
+ brain-mcp = brain.mcp_server:main
6
+ brain-monitor = brain.bin.monitor:cli_main
7
+ brain-rebuild = brain.bin.rebuild:main
8
+ brain-status = brain.bin.status:main
9
+ brain-uninstall-launchd = brain.bin.launchd:uninstall_main
10
+ brain-up = brain.bin.up:main
11
+ secondbrain-py = brain.mcp_server:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ali Sarkis
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.
@@ -0,0 +1 @@
1
+ brain