tesserae 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. tesserae-0.1.0/LICENSE +21 -0
  2. tesserae-0.1.0/PKG-INFO +284 -0
  3. tesserae-0.1.0/README.md +257 -0
  4. tesserae-0.1.0/pyproject.toml +38 -0
  5. tesserae-0.1.0/setup.cfg +4 -0
  6. tesserae-0.1.0/setup.py +5 -0
  7. tesserae-0.1.0/tesserae/__init__.py +0 -0
  8. tesserae-0.1.0/tesserae/__main__.py +14 -0
  9. tesserae-0.1.0/tesserae/agent_harness.py +170 -0
  10. tesserae-0.1.0/tesserae/batch.py +120 -0
  11. tesserae-0.1.0/tesserae/canonicalization.py +254 -0
  12. tesserae-0.1.0/tesserae/cli.py +1694 -0
  13. tesserae-0.1.0/tesserae/code_graph.py +145 -0
  14. tesserae-0.1.0/tesserae/cognee_adapter.py +81 -0
  15. tesserae-0.1.0/tesserae/cognee_codex.py +407 -0
  16. tesserae-0.1.0/tesserae/cognee_direct.py +75 -0
  17. tesserae-0.1.0/tesserae/cognee_query.py +57 -0
  18. tesserae-0.1.0/tesserae/cross_project.py +236 -0
  19. tesserae-0.1.0/tesserae/deploy.py +373 -0
  20. tesserae-0.1.0/tesserae/frontend.py +648 -0
  21. tesserae-0.1.0/tesserae/graph_stores/__init__.py +14 -0
  22. tesserae-0.1.0/tesserae/graph_stores/sqlite.py +290 -0
  23. tesserae-0.1.0/tesserae/graph_stores/url_resolver.py +155 -0
  24. tesserae-0.1.0/tesserae/graphiti_adapter.py +155 -0
  25. tesserae-0.1.0/tesserae/harness_sessions.py +733 -0
  26. tesserae-0.1.0/tesserae/karpathy_layer.py +390 -0
  27. tesserae-0.1.0/tesserae/lint.py +1039 -0
  28. tesserae-0.1.0/tesserae/llm_extractor.py +300 -0
  29. tesserae-0.1.0/tesserae/llm_synthesis.py +622 -0
  30. tesserae-0.1.0/tesserae/markdown_projection.py +613 -0
  31. tesserae-0.1.0/tesserae/mcp_server.py +1548 -0
  32. tesserae-0.1.0/tesserae/obsidian_adapter.py +110 -0
  33. tesserae-0.1.0/tesserae/persistence.py +242 -0
  34. tesserae-0.1.0/tesserae/ports/__init__.py +14 -0
  35. tesserae-0.1.0/tesserae/ports/graph_store.py +47 -0
  36. tesserae-0.1.0/tesserae/ports/source_loader.py +45 -0
  37. tesserae-0.1.0/tesserae/project.py +1321 -0
  38. tesserae-0.1.0/tesserae/project_setup.py +540 -0
  39. tesserae-0.1.0/tesserae/query.py +906 -0
  40. tesserae-0.1.0/tesserae/raganything_adapter.py +193 -0
  41. tesserae-0.1.0/tesserae/raganything_llm.py +281 -0
  42. tesserae-0.1.0/tesserae/raganything_query.py +58 -0
  43. tesserae-0.1.0/tesserae/raganything_refresh.py +490 -0
  44. tesserae-0.1.0/tesserae/report.py +128 -0
  45. tesserae-0.1.0/tesserae/research_graph.py +3207 -0
  46. tesserae-0.1.0/tesserae/review_workflow.py +89 -0
  47. tesserae-0.1.0/tesserae/selective_extractor.py +49 -0
  48. tesserae-0.1.0/tesserae/serve.py +124 -0
  49. tesserae-0.1.0/tesserae/site/__init__.py +837 -0
  50. tesserae-0.1.0/tesserae/site/ask_widget.py +510 -0
  51. tesserae-0.1.0/tesserae/site/auto_link.py +397 -0
  52. tesserae-0.1.0/tesserae/site/code_link_rewriter.py +175 -0
  53. tesserae-0.1.0/tesserae/site/components.py +1102 -0
  54. tesserae-0.1.0/tesserae/site/exports.py +1019 -0
  55. tesserae-0.1.0/tesserae/site/js.py +4175 -0
  56. tesserae-0.1.0/tesserae/site/markdown.py +579 -0
  57. tesserae-0.1.0/tesserae/site/pages.py +3003 -0
  58. tesserae-0.1.0/tesserae/site/raw_view.py +1010 -0
  59. tesserae-0.1.0/tesserae/site/relevance.py +191 -0
  60. tesserae-0.1.0/tesserae/site/search.py +802 -0
  61. tesserae-0.1.0/tesserae/site/sessions.py +635 -0
  62. tesserae-0.1.0/tesserae/site/tokens.py +3389 -0
  63. tesserae-0.1.0/tesserae/source_loaders/__init__.py +13 -0
  64. tesserae-0.1.0/tesserae/source_loaders/filesystem.py +227 -0
  65. tesserae-0.1.0/tesserae/synthesis.py +1155 -0
  66. tesserae-0.1.0/tesserae/temporal.py +181 -0
  67. tesserae-0.1.0/tesserae/term_registry.py +463 -0
  68. tesserae-0.1.0/tesserae/understand_anything_adapter.py +321 -0
  69. tesserae-0.1.0/tesserae/understand_anything_refresh.py +142 -0
  70. tesserae-0.1.0/tesserae/vault_pull.py +726 -0
  71. tesserae-0.1.0/tesserae/vault_snapshot.py +128 -0
  72. tesserae-0.1.0/tesserae/vault_watch.py +175 -0
  73. tesserae-0.1.0/tesserae/watch.py +278 -0
  74. tesserae-0.1.0/tesserae/wiki_projector.py +351 -0
  75. tesserae-0.1.0/tesserae/wiki_store.py +333 -0
  76. tesserae-0.1.0/tesserae.egg-info/PKG-INFO +284 -0
  77. tesserae-0.1.0/tesserae.egg-info/SOURCES.txt +165 -0
  78. tesserae-0.1.0/tesserae.egg-info/dependency_links.txt +1 -0
  79. tesserae-0.1.0/tesserae.egg-info/entry_points.txt +3 -0
  80. tesserae-0.1.0/tesserae.egg-info/requires.txt +14 -0
  81. tesserae-0.1.0/tesserae.egg-info/top_level.txt +1 -0
  82. tesserae-0.1.0/tests/test_agent_harness.py +50 -0
  83. tesserae-0.1.0/tests/test_artifact_split.py +333 -0
  84. tesserae-0.1.0/tests/test_ask_widget.py +241 -0
  85. tesserae-0.1.0/tests/test_auto_link.py +314 -0
  86. tesserae-0.1.0/tests/test_batch.py +79 -0
  87. tesserae-0.1.0/tests/test_canonicalization.py +72 -0
  88. tesserae-0.1.0/tests/test_cli.py +475 -0
  89. tesserae-0.1.0/tests/test_cli_ask_scope.py +218 -0
  90. tesserae-0.1.0/tests/test_cli_raganything.py +169 -0
  91. tesserae-0.1.0/tests/test_cli_top_level_ask.py +240 -0
  92. tesserae-0.1.0/tests/test_code_graph.py +50 -0
  93. tesserae-0.1.0/tests/test_code_link_rewriter.py +201 -0
  94. tesserae-0.1.0/tests/test_cognee_adapter.py +29 -0
  95. tesserae-0.1.0/tests/test_cognee_codex.py +156 -0
  96. tesserae-0.1.0/tests/test_cognee_direct.py +63 -0
  97. tesserae-0.1.0/tests/test_cross_project.py +287 -0
  98. tesserae-0.1.0/tests/test_default_raganything_backend_config.py +14 -0
  99. tesserae-0.1.0/tests/test_deploy.py +253 -0
  100. tesserae-0.1.0/tests/test_docs_i18n.py +63 -0
  101. tesserae-0.1.0/tests/test_extraction_corpus_quality.py +482 -0
  102. tesserae-0.1.0/tests/test_extraction_quality.py +223 -0
  103. tesserae-0.1.0/tests/test_filesystem_source_loader.py +161 -0
  104. tesserae-0.1.0/tests/test_filter_frontmatter_token_nodes.py +151 -0
  105. tesserae-0.1.0/tests/test_frontend.py +334 -0
  106. tesserae-0.1.0/tests/test_graphiti_adapter.py +53 -0
  107. tesserae-0.1.0/tests/test_harness_session_discovery.py +219 -0
  108. tesserae-0.1.0/tests/test_harness_sessions.py +231 -0
  109. tesserae-0.1.0/tests/test_idempotence.py +173 -0
  110. tesserae-0.1.0/tests/test_link_integrity.py +360 -0
  111. tesserae-0.1.0/tests/test_lint.py +415 -0
  112. tesserae-0.1.0/tests/test_llm_extractor.py +89 -0
  113. tesserae-0.1.0/tests/test_llm_synthesis.py +667 -0
  114. tesserae-0.1.0/tests/test_markdown_projection.py +117 -0
  115. tesserae-0.1.0/tests/test_mcp_registry.py +281 -0
  116. tesserae-0.1.0/tests/test_mcp_server.py +574 -0
  117. tesserae-0.1.0/tests/test_mcp_server_ask.py +114 -0
  118. tesserae-0.1.0/tests/test_obsidian_adapter.py +41 -0
  119. tesserae-0.1.0/tests/test_packaging_install.py +66 -0
  120. tesserae-0.1.0/tests/test_paper_extraction_from_frontmatter.py +209 -0
  121. tesserae-0.1.0/tests/test_persistence.py +57 -0
  122. tesserae-0.1.0/tests/test_ports.py +179 -0
  123. tesserae-0.1.0/tests/test_project_cli.py +397 -0
  124. tesserae-0.1.0/tests/test_project_cognee_defaults.py +198 -0
  125. tesserae-0.1.0/tests/test_project_compile_raganything.py +62 -0
  126. tesserae-0.1.0/tests/test_project_setup.py +200 -0
  127. tesserae-0.1.0/tests/test_project_setup_raganything.py +145 -0
  128. tesserae-0.1.0/tests/test_public_predicate.py +257 -0
  129. tesserae-0.1.0/tests/test_public_quality.py +115 -0
  130. tesserae-0.1.0/tests/test_query.py +487 -0
  131. tesserae-0.1.0/tests/test_raganything_adapter.py +115 -0
  132. tesserae-0.1.0/tests/test_raganything_llm.py +147 -0
  133. tesserae-0.1.0/tests/test_raganything_query.py +68 -0
  134. tesserae-0.1.0/tests/test_raganything_refresh.py +355 -0
  135. tesserae-0.1.0/tests/test_raw_pages.py +588 -0
  136. tesserae-0.1.0/tests/test_report.py +53 -0
  137. tesserae-0.1.0/tests/test_research_corpus.py +284 -0
  138. tesserae-0.1.0/tests/test_research_graph.py +91 -0
  139. tesserae-0.1.0/tests/test_research_graph_extractor.py +533 -0
  140. tesserae-0.1.0/tests/test_research_graph_filename_filter.py +347 -0
  141. tesserae-0.1.0/tests/test_review_workflow.py +50 -0
  142. tesserae-0.1.0/tests/test_search_quality.py +251 -0
  143. tesserae-0.1.0/tests/test_selective_extractor.py +45 -0
  144. tesserae-0.1.0/tests/test_serve_ask_endpoint.py +219 -0
  145. tesserae-0.1.0/tests/test_site_components.py +814 -0
  146. tesserae-0.1.0/tests/test_site_exports.py +475 -0
  147. tesserae-0.1.0/tests/test_site_js.py +1259 -0
  148. tesserae-0.1.0/tests/test_site_markdown.py +67 -0
  149. tesserae-0.1.0/tests/test_site_pages.py +1565 -0
  150. tesserae-0.1.0/tests/test_site_pages_raganything_group.py +96 -0
  151. tesserae-0.1.0/tests/test_site_perf.py +340 -0
  152. tesserae-0.1.0/tests/test_site_raw_view.py +181 -0
  153. tesserae-0.1.0/tests/test_site_relevance.py +180 -0
  154. tesserae-0.1.0/tests/test_site_search.py +340 -0
  155. tesserae-0.1.0/tests/test_site_tokens.py +658 -0
  156. tesserae-0.1.0/tests/test_source_document_extractor.py +36 -0
  157. tesserae-0.1.0/tests/test_sqlite_graph_store.py +196 -0
  158. tesserae-0.1.0/tests/test_synthesis.py +332 -0
  159. tesserae-0.1.0/tests/test_temporal.py +79 -0
  160. tesserae-0.1.0/tests/test_understand_anything_adapter.py +121 -0
  161. tesserae-0.1.0/tests/test_understand_anything_refresh.py +46 -0
  162. tesserae-0.1.0/tests/test_vault_pull.py +455 -0
  163. tesserae-0.1.0/tests/test_vault_snapshot.py +98 -0
  164. tesserae-0.1.0/tests/test_vault_watch.py +193 -0
  165. tesserae-0.1.0/tests/test_watch.py +227 -0
  166. tesserae-0.1.0/tests/test_wiki_corpus_fixture.py +20 -0
  167. tesserae-0.1.0/tests/test_wiki_store.py +202 -0
tesserae-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tesserae Contributors
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,284 @@
1
+ Metadata-Version: 2.4
2
+ Name: tesserae
3
+ Version: 0.1.0
4
+ Summary: Typed LLM wiki graph pipeline for research and development projects
5
+ Author: Tesserae Contributors
6
+ License-Expression: MIT
7
+ Keywords: llm,wiki,knowledge-graph,mcp,obsidian
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3 :: Only
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Requires-Python: >=3.9
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Requires-Dist: pydantic>=2
17
+ Provides-Extra: synthesis-llm
18
+ Requires-Dist: anthropic>=0.40; extra == "synthesis-llm"
19
+ Provides-Extra: raganything
20
+ Requires-Dist: raganything>=1.3.0; extra == "raganything"
21
+ Provides-Extra: raganything-all
22
+ Requires-Dist: raganything[all]>=1.3.0; extra == "raganything-all"
23
+ Provides-Extra: raganything-semantic
24
+ Requires-Dist: raganything[all]>=1.3.0; extra == "raganything-semantic"
25
+ Requires-Dist: sentence-transformers>=3.0; extra == "raganything-semantic"
26
+ Dynamic: license-file
27
+
28
+ # Tesserae
29
+
30
+ <p align="center">
31
+ <img src="docs/assets/tesserae-graph-view.png" alt="Tesserae graph view showing concepts, papers, repos, syntheses, and entities clustered around a focused node" width="100%" />
32
+ </p>
33
+
34
+ <p align="center">
35
+ <a href="./README.ko.md">한국어</a> ·
36
+ <a href="./README.zh.md">中文</a> ·
37
+ <a href="./README.ja.md">日本語</a> ·
38
+ <a href="./README.ru.md">Русский</a> ·
39
+ <a href="./README.es.md">Español</a> ·
40
+ <a href="./README.fr.md">Français</a> ·
41
+ <a href="./README.de.md">Deutsch</a>
42
+ </p>
43
+
44
+ > Compile your sources into a typed wiki agents can read.
45
+
46
+ <p align="center">
47
+ <img src="docs/screencasts/showcase.gif" alt="Three-step screencast: tesserae project setup -> compile -> ask, recorded against the 135-doc demo corpus" width="100%" />
48
+ </p>
49
+
50
+ <!-- TODO: replace https://ca1773130n.github.io/Tesserae with the real
51
+ GitHub Pages URL once the maintainer enables Pages for this repo. The
52
+ .github/workflows/build-demo.yml workflow publishes .tesserae/site/ on every
53
+ push to main. -->
54
+
55
+ [Live demo](https://ca1773130n.github.io/Tesserae) · [Docs](docs/) · [MCP setup](docs/integrations/mcp.md) · [Obsidian export](docs/integrations/obsidian.md)
56
+
57
+ Tesserae is a project-memory compiler. Point it at a directory containing markdown, source files, and (optionally) PDFs/Office docs/images, and it extracts a typed knowledge graph, writes a queryable wiki, and emits portable artifacts: a markdown projection, a Cognee-ready bundle, an agent harness, and an MCP server you can wire into Claude Code, Codex, or any MCP client. It is a build step for project context, not a hosted service.
58
+
59
+ ## How it compares
60
+
61
+ A flat comparison against the four closest open-source alternatives. No softening:
62
+
63
+ | Feature | Tesserae | Quartz | Logseq | Cognee | Foam |
64
+ |---|---|---|---|---|---|
65
+ | Static HTML output | yes | yes | partial (export) | no | partial (publish) |
66
+ | Built-in graph view | yes | yes | yes | yes (separate UI) | yes (VSCode) |
67
+ | Typed node schema | yes (41 types) | no | partial (tags) | yes | no |
68
+ | Concept extraction from sources | yes (LLM) | no | no | yes | no |
69
+ | Multimodal ingestion (PDF/image) | yes (via RAG-Anything) | no | partial (embeds) | yes | no |
70
+ | Code-graph ingestion | yes | no | no | partial | no |
71
+ | MCP server | yes | no | no | yes | no |
72
+ | Multi-project registry | yes | no | yes (graphs) | partial | no |
73
+ | Works without API key (OAuth) | yes | n/a | n/a | no | n/a |
74
+ | Multi-language i18n docs | yes | partial | yes | partial | partial |
75
+ | Deterministic byte-identical compile | yes | yes | n/a | no | n/a |
76
+ | Per-page ask widget (proposed B3) | not yet | no | no | no | no |
77
+ | Live edit | no | partial | yes | n/a | yes |
78
+ | Mobile-first reading | no | yes | yes | n/a | n/a |
79
+ | Real-time collaboration | no | no | yes (DB beta) | no | no |
80
+
81
+ Tesserae picks compile-from-source over live editing. If you want to edit notes
82
+ in a UI, use Logseq or Obsidian. If you want a build tool for your knowledge
83
+ graph, this is the project.
84
+
85
+ ## When to use this (and when not to)
86
+
87
+ Use it if:
88
+
89
+ - You want a durable, inspectable knowledge graph over a single project's text-heavy sources (docs, code, research notes).
90
+ - You want a local MCP server that answers questions grounded in your own files.
91
+ - You want to feed a clean bundle into Cognee, or a markdown projection into Obsidian, without writing the glue yourself.
92
+
93
+ Skip it if:
94
+
95
+ - You only need a vector search over a small directory — `ripgrep` plus an embedding library is simpler.
96
+ - You want a hosted wiki with editing UI. The static site here is read-only.
97
+ - You need accurate semantic embeddings out of the box. The default RAG-Anything embedding is deterministic (see [Limitations](#status)).
98
+ - You expect a turnkey "ask anything" agent. This builds the substrate; you still wire it into your agent of choice.
99
+
100
+ ## Status
101
+
102
+ This is an evolving research/agent-tooling project. Known limitations:
103
+
104
+ - Compile time scales roughly linearly with corpus size. First-run compiles over large markdown trees (thousands of files) can take minutes.
105
+ - The default RAG-Anything embedding provider is `deterministic`. It is reproducible and dependency-free, but semantic recall is limited. Switch to `ollama` (e.g. `qwen3-embedding:0.6b`) or an OpenAI-compatible endpoint for better retrieval — see [docs/integrations/rag-anything.md](docs/integrations/rag-anything.md).
106
+ - Vision support for RAG-Anything (image content extraction) is not yet wired end-to-end. Image files are parsed structurally but not described.
107
+ - Cognee runtime cognify is best-effort: missing providers, paid API keys, or network failures are logged and skipped rather than aborting the build.
108
+ - The MCP server exposes a stable set of tools, but the underlying graph schema is still subject to additions.
109
+
110
+ ## Quickstart
111
+
112
+ Requires Python 3.9+. RAG-Anything needs Python 3.10+ if you enable it.
113
+
114
+ ```bash
115
+ pip install tesserae
116
+
117
+ cd /path/to/my-project
118
+ tesserae project setup
119
+ tesserae project compile
120
+ tesserae project ask "Where is Mermaid rendering implemented?"
121
+ tesserae project build-site && tesserae project serve --port 8765
122
+ ```
123
+
124
+ The setup wizard detects common sources (`README.md`, `docs/`, `src/`, `data/`) and writes `.tesserae/config.json`. LLM-calling features default to the `codex` CLI over OAuth, so no API keys are required for the common path. See [docs/quickstart.md](docs/quickstart.md) and [docs/installation.md](docs/installation.md) for the longer version.
125
+
126
+ ### Walkthrough
127
+
128
+ Each step in the Quickstart, recorded against the bundled 135-doc demo corpus
129
+ (`examples/demo-corpus/data/research/`). Rebuild any of these GIFs with
130
+ `vhs docs/screencasts/<name>.tape` — the tape files document what they
131
+ recorded and the workspace they assume.
132
+
133
+ <details>
134
+ <summary><strong>1. Setup</strong> — point at a research directory, get a project wiki scaffold</summary>
135
+ <br/>
136
+ <img src="docs/screencasts/setup.gif" alt="tesserae project setup --source ./research running non-interactively and writing .tesserae/" width="100%" />
137
+ </details>
138
+
139
+ <details>
140
+ <summary><strong>2. Compile + build site</strong> — deterministic, no LLM calls</summary>
141
+ <br/>
142
+ <img src="docs/screencasts/compile.gif" alt="tesserae project compile followed by tesserae project build-site, emitting graph.json and the static site tree" width="100%" />
143
+ </details>
144
+
145
+ <details>
146
+ <summary><strong>3. Ask</strong> — query the compiled wiki from the CLI</summary>
147
+ <br/>
148
+ <img src="docs/screencasts/ask.gif" alt="tesserae project ask --backend wiki returning top-3 hits with score, kind, and outbound relations" width="100%" />
149
+ </details>
150
+
151
+ ## What you get after compile
152
+
153
+ ```text
154
+ .tesserae/
155
+ config.json
156
+ graph.json # typed nodes/edges
157
+ manifest.json # source fingerprints (used by --changed-only)
158
+ sqlite.db # queryable graph store
159
+ temporal_facts.jsonl
160
+ graphiti_episodes.jsonl
161
+ report.md
162
+ markdown_projection/ # human-readable wiki pages
163
+ obsidian_vault/ # ready to drop into Obsidian
164
+ agent_harness/ # per-agent config (Claude/Codex/Gemini/Cursor/...)
165
+ harness_sessions/ # imported Claude/Codex session memory
166
+ cognee_bundle/ # JSONL ready for Cognee ingest
167
+ site/ # static site built by build-site
168
+ external/ # companion-tool outputs (UA, RAG-Anything)
169
+ ```
170
+
171
+ `ls .tesserae/` after `project compile` to verify what landed.
172
+
173
+ ## CLI overview
174
+
175
+ Daily-use commands. Run `tesserae <subcommand> --help` for full flags.
176
+
177
+ | Command | What it does |
178
+ |---|---|
179
+ | `tesserae project setup` | Interactive wizard. Writes `.tesserae/config.json`. Accepts `--with-understand-anything`, `--with-raganything`, `--run-cognee`, etc. |
180
+ | `tesserae project compile` | Reads configured sources, runs companion refreshes, writes all artifacts under `.tesserae/`. Use `--changed-only` for incremental rebuilds. |
181
+ | `tesserae project build-site` | Builds the static frontend at `.tesserae/site/`. |
182
+ | `tesserae project serve --port 8765` | Serves the static site locally and exposes `/api/ask` so every detail page's inline ask widget can route questions to `ask_project`. On any other host (file://, GitHub Pages, S3) the widget gracefully collapses to a one-line static footer. |
183
+ | `tesserae project refresh-understand-anything` | Runs Tesserae's managed Understand Anything refresh wrapper. |
184
+ | `tesserae project refresh-raganything --parser mineru` | Re-parses non-code sources (PDFs, Office, images) via RAG-Anything. |
185
+ | `tesserae project ask "<question>"` | Asks the configured backend (`auto`/`raganything`/`cognee`/`wiki`). |
186
+ | `tesserae project mcp-config` | Prints an MCP server config snippet you can paste into Claude Code, Codex, or Hermes. |
187
+ | `tesserae wiki register <path> --name <alias>` | Registers a project in the shared registry. |
188
+ | `tesserae wiki list` / `tesserae wiki activate <name>` | Lists registered projects; sets the active one. |
189
+ | `tesserae ask "<question>" [--wiki <name>]` | Top-level ask that resolves through the registry. |
190
+
191
+ ## Integrations
192
+
193
+ All integrations are opt-in. None are required to use Tesserae on a plain markdown/code project.
194
+
195
+ - **Understand Anything** — a separate project ([Lum1104/Understand-Anything](https://github.com/Lum1104/Understand-Anything)) that produces a code knowledge graph at `.understand-anything/knowledge-graph.json`. Enable with `--with-understand-anything`. Tesserae stores a managed refresh wrapper so `project compile` keeps the graph current. See [docs/integrations/understand-anything.md](docs/integrations/understand-anything.md).
196
+ - **RAG-Anything** — multimodal ingestion ([HKUDS/RAG-Anything](https://github.com/HKUDS/RAG-Anything)) for PDFs, Office documents, and images via MinerU/Docling/PaddleOCR. Enable with `--with-raganything`. Also acts as a runtime question backend (LightRAG). Requires Python 3.10+. See [docs/integrations/rag-anything.md](docs/integrations/rag-anything.md).
197
+ - **Cognee** — graph+vector memory backend. Enable with `--run-cognee --install-cognee`. The normal compile always writes `.tesserae/cognee_bundle/`; the runtime `cognify` pass is best-effort and only runs when explicitly enabled.
198
+
199
+ ## Multi-project registry
200
+
201
+ A persistent registry at `~/.tesserae/registry.json` lets the top-level `ask` CLI and the MCP server resolve project names to roots without `--project` on every call.
202
+
203
+ ```bash
204
+ tesserae wiki register /path/to/my-project --name myproj
205
+ tesserae wiki activate myproj
206
+ tesserae ask "Where is the parser entry point?"
207
+ ```
208
+
209
+ The same registry is read by the MCP server, so MCP clients can call `list_projects`, `activate_project`, and `ask` against any registered wiki.
210
+
211
+ ### Cross-vault linking (`wiki://` URI scheme)
212
+
213
+ Source markdown in one registered project can reference a node in another registered project via a stable URI:
214
+
215
+ ```
216
+ wiki://<alias>/<kind>/<slug>
217
+ ```
218
+
219
+ Examples:
220
+
221
+ - `wiki://research/concepts/rlhf` — the RLHF concept in the `research` vault.
222
+ - `wiki://other-vault/papers/arxiv-2510-12323` — a paper in `other-vault`.
223
+ - `[See RLHF in research](wiki://research/concepts/rlhf)` — works inside a Markdown link too.
224
+
225
+ At compile time these URIs become *bridge nodes* in the graph view (group `external`, violet) with a "Cross-project bridges" toggle in the toolbar so you can hide them. Unregistered aliases render as tombstones; registered-but-not-yet-built links render as placeholders.
226
+
227
+ ### Querying across vaults (`--scope all-registered`)
228
+
229
+ `tesserae ask` and the MCP `ask` tool accept a `--scope` flag:
230
+
231
+ ```bash
232
+ # Default — just the active/named project.
233
+ tesserae ask "..."
234
+
235
+ # Fan out across every registered project; aggregate envelopes by alias.
236
+ tesserae ask "..." --scope all-registered
237
+
238
+ # Restrict to a hand-picked subset of registered aliases.
239
+ tesserae ask "..." --scope all-registered --scope-aliases research work
240
+ ```
241
+
242
+ The aggregated JSON shape is `{"scope": "all-registered", "question": ..., "by_project": {"<alias>": <envelope>, ...}}`. Per-project failures are captured as `{"error": "..."}` entries; a single failing project never aborts the fan-out.
243
+
244
+ ## MCP
245
+
246
+ `tesserae project mcp-config` prints a server entry you can paste into Claude Code, Codex, or any MCP-aware client. The server exposes tools including `schema`, `graph_summary`, `search_nodes`, `node_context`, `search_facts`, `timeline`, `wiki_page`, `raw_source`, `lint_report`, `ask`, and the registry tools `list_projects` / `register_project` / `activate_project` / `unregister_project`. Tools that need a specific project resolve through the same registry as the CLI.
247
+
248
+ ## Authentication and LLM providers
249
+
250
+ The common path uses no API keys:
251
+
252
+ - **Codex CLI** (default) over OAuth. `--raganything-llm-provider codex` is the default; Cognee `codex_cognify` mode patches Cognee's LLM client to the Codex CLI.
253
+ - **Claude Code CLI** over OAuth. Set `--raganything-llm-provider claude` for RAG-Anything runtime queries. Multi-account setups use `--raganything-claude-config-dir ~/.claude-personal2` (Tesserae exports `CLAUDE_CONFIG_DIR` before each call).
254
+ - **Embeddings** default to a deterministic in-process provider. Switch to Ollama with `--cognee-embedding-provider ollama --cognee-ollama-embedding-model qwen3-embedding:0.6b`, or wire OpenAI-compatible endpoints — both documented in the integration pages.
255
+
256
+ If you set `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` they will be picked up by the corresponding paths, but they are not required.
257
+
258
+ ## Project layout
259
+
260
+ ```text
261
+ tesserae/ # the package (CLI, compiler, MCP server, adapters)
262
+ docs/ # English docs + docs/i18n/ for the six other languages
263
+ ontology/ # node/edge schemas the compiler validates against
264
+ prompts/ # extraction and synthesis prompts
265
+ scripts/ # maintenance scripts
266
+ tests/ # pytest suite
267
+ evals/ # graph quality eval harnesses
268
+ data/ # example research notes used by self-dogfooding
269
+ ```
270
+
271
+ ## Localized docs
272
+
273
+ [한국어](./README.ko.md) ·
274
+ [中文](./README.zh.md) ·
275
+ [日本語](./README.ja.md) ·
276
+ [Русский](./README.ru.md) ·
277
+ [Español](./README.es.md) ·
278
+ [Français](./README.fr.md)
279
+
280
+ Long-form docs are mirrored under `docs/i18n/` and `docs/i18n/integrations/`.
281
+
282
+ ## License
283
+
284
+ MIT. See [LICENSE](LICENSE).
@@ -0,0 +1,257 @@
1
+ # Tesserae
2
+
3
+ <p align="center">
4
+ <img src="docs/assets/tesserae-graph-view.png" alt="Tesserae graph view showing concepts, papers, repos, syntheses, and entities clustered around a focused node" width="100%" />
5
+ </p>
6
+
7
+ <p align="center">
8
+ <a href="./README.ko.md">한국어</a> ·
9
+ <a href="./README.zh.md">中文</a> ·
10
+ <a href="./README.ja.md">日本語</a> ·
11
+ <a href="./README.ru.md">Русский</a> ·
12
+ <a href="./README.es.md">Español</a> ·
13
+ <a href="./README.fr.md">Français</a> ·
14
+ <a href="./README.de.md">Deutsch</a>
15
+ </p>
16
+
17
+ > Compile your sources into a typed wiki agents can read.
18
+
19
+ <p align="center">
20
+ <img src="docs/screencasts/showcase.gif" alt="Three-step screencast: tesserae project setup -> compile -> ask, recorded against the 135-doc demo corpus" width="100%" />
21
+ </p>
22
+
23
+ <!-- TODO: replace https://ca1773130n.github.io/Tesserae with the real
24
+ GitHub Pages URL once the maintainer enables Pages for this repo. The
25
+ .github/workflows/build-demo.yml workflow publishes .tesserae/site/ on every
26
+ push to main. -->
27
+
28
+ [Live demo](https://ca1773130n.github.io/Tesserae) · [Docs](docs/) · [MCP setup](docs/integrations/mcp.md) · [Obsidian export](docs/integrations/obsidian.md)
29
+
30
+ Tesserae is a project-memory compiler. Point it at a directory containing markdown, source files, and (optionally) PDFs/Office docs/images, and it extracts a typed knowledge graph, writes a queryable wiki, and emits portable artifacts: a markdown projection, a Cognee-ready bundle, an agent harness, and an MCP server you can wire into Claude Code, Codex, or any MCP client. It is a build step for project context, not a hosted service.
31
+
32
+ ## How it compares
33
+
34
+ A flat comparison against the four closest open-source alternatives. No softening:
35
+
36
+ | Feature | Tesserae | Quartz | Logseq | Cognee | Foam |
37
+ |---|---|---|---|---|---|
38
+ | Static HTML output | yes | yes | partial (export) | no | partial (publish) |
39
+ | Built-in graph view | yes | yes | yes | yes (separate UI) | yes (VSCode) |
40
+ | Typed node schema | yes (41 types) | no | partial (tags) | yes | no |
41
+ | Concept extraction from sources | yes (LLM) | no | no | yes | no |
42
+ | Multimodal ingestion (PDF/image) | yes (via RAG-Anything) | no | partial (embeds) | yes | no |
43
+ | Code-graph ingestion | yes | no | no | partial | no |
44
+ | MCP server | yes | no | no | yes | no |
45
+ | Multi-project registry | yes | no | yes (graphs) | partial | no |
46
+ | Works without API key (OAuth) | yes | n/a | n/a | no | n/a |
47
+ | Multi-language i18n docs | yes | partial | yes | partial | partial |
48
+ | Deterministic byte-identical compile | yes | yes | n/a | no | n/a |
49
+ | Per-page ask widget (proposed B3) | not yet | no | no | no | no |
50
+ | Live edit | no | partial | yes | n/a | yes |
51
+ | Mobile-first reading | no | yes | yes | n/a | n/a |
52
+ | Real-time collaboration | no | no | yes (DB beta) | no | no |
53
+
54
+ Tesserae picks compile-from-source over live editing. If you want to edit notes
55
+ in a UI, use Logseq or Obsidian. If you want a build tool for your knowledge
56
+ graph, this is the project.
57
+
58
+ ## When to use this (and when not to)
59
+
60
+ Use it if:
61
+
62
+ - You want a durable, inspectable knowledge graph over a single project's text-heavy sources (docs, code, research notes).
63
+ - You want a local MCP server that answers questions grounded in your own files.
64
+ - You want to feed a clean bundle into Cognee, or a markdown projection into Obsidian, without writing the glue yourself.
65
+
66
+ Skip it if:
67
+
68
+ - You only need a vector search over a small directory — `ripgrep` plus an embedding library is simpler.
69
+ - You want a hosted wiki with editing UI. The static site here is read-only.
70
+ - You need accurate semantic embeddings out of the box. The default RAG-Anything embedding is deterministic (see [Limitations](#status)).
71
+ - You expect a turnkey "ask anything" agent. This builds the substrate; you still wire it into your agent of choice.
72
+
73
+ ## Status
74
+
75
+ This is an evolving research/agent-tooling project. Known limitations:
76
+
77
+ - Compile time scales roughly linearly with corpus size. First-run compiles over large markdown trees (thousands of files) can take minutes.
78
+ - The default RAG-Anything embedding provider is `deterministic`. It is reproducible and dependency-free, but semantic recall is limited. Switch to `ollama` (e.g. `qwen3-embedding:0.6b`) or an OpenAI-compatible endpoint for better retrieval — see [docs/integrations/rag-anything.md](docs/integrations/rag-anything.md).
79
+ - Vision support for RAG-Anything (image content extraction) is not yet wired end-to-end. Image files are parsed structurally but not described.
80
+ - Cognee runtime cognify is best-effort: missing providers, paid API keys, or network failures are logged and skipped rather than aborting the build.
81
+ - The MCP server exposes a stable set of tools, but the underlying graph schema is still subject to additions.
82
+
83
+ ## Quickstart
84
+
85
+ Requires Python 3.9+. RAG-Anything needs Python 3.10+ if you enable it.
86
+
87
+ ```bash
88
+ pip install tesserae
89
+
90
+ cd /path/to/my-project
91
+ tesserae project setup
92
+ tesserae project compile
93
+ tesserae project ask "Where is Mermaid rendering implemented?"
94
+ tesserae project build-site && tesserae project serve --port 8765
95
+ ```
96
+
97
+ The setup wizard detects common sources (`README.md`, `docs/`, `src/`, `data/`) and writes `.tesserae/config.json`. LLM-calling features default to the `codex` CLI over OAuth, so no API keys are required for the common path. See [docs/quickstart.md](docs/quickstart.md) and [docs/installation.md](docs/installation.md) for the longer version.
98
+
99
+ ### Walkthrough
100
+
101
+ Each step in the Quickstart, recorded against the bundled 135-doc demo corpus
102
+ (`examples/demo-corpus/data/research/`). Rebuild any of these GIFs with
103
+ `vhs docs/screencasts/<name>.tape` — the tape files document what they
104
+ recorded and the workspace they assume.
105
+
106
+ <details>
107
+ <summary><strong>1. Setup</strong> — point at a research directory, get a project wiki scaffold</summary>
108
+ <br/>
109
+ <img src="docs/screencasts/setup.gif" alt="tesserae project setup --source ./research running non-interactively and writing .tesserae/" width="100%" />
110
+ </details>
111
+
112
+ <details>
113
+ <summary><strong>2. Compile + build site</strong> — deterministic, no LLM calls</summary>
114
+ <br/>
115
+ <img src="docs/screencasts/compile.gif" alt="tesserae project compile followed by tesserae project build-site, emitting graph.json and the static site tree" width="100%" />
116
+ </details>
117
+
118
+ <details>
119
+ <summary><strong>3. Ask</strong> — query the compiled wiki from the CLI</summary>
120
+ <br/>
121
+ <img src="docs/screencasts/ask.gif" alt="tesserae project ask --backend wiki returning top-3 hits with score, kind, and outbound relations" width="100%" />
122
+ </details>
123
+
124
+ ## What you get after compile
125
+
126
+ ```text
127
+ .tesserae/
128
+ config.json
129
+ graph.json # typed nodes/edges
130
+ manifest.json # source fingerprints (used by --changed-only)
131
+ sqlite.db # queryable graph store
132
+ temporal_facts.jsonl
133
+ graphiti_episodes.jsonl
134
+ report.md
135
+ markdown_projection/ # human-readable wiki pages
136
+ obsidian_vault/ # ready to drop into Obsidian
137
+ agent_harness/ # per-agent config (Claude/Codex/Gemini/Cursor/...)
138
+ harness_sessions/ # imported Claude/Codex session memory
139
+ cognee_bundle/ # JSONL ready for Cognee ingest
140
+ site/ # static site built by build-site
141
+ external/ # companion-tool outputs (UA, RAG-Anything)
142
+ ```
143
+
144
+ `ls .tesserae/` after `project compile` to verify what landed.
145
+
146
+ ## CLI overview
147
+
148
+ Daily-use commands. Run `tesserae <subcommand> --help` for full flags.
149
+
150
+ | Command | What it does |
151
+ |---|---|
152
+ | `tesserae project setup` | Interactive wizard. Writes `.tesserae/config.json`. Accepts `--with-understand-anything`, `--with-raganything`, `--run-cognee`, etc. |
153
+ | `tesserae project compile` | Reads configured sources, runs companion refreshes, writes all artifacts under `.tesserae/`. Use `--changed-only` for incremental rebuilds. |
154
+ | `tesserae project build-site` | Builds the static frontend at `.tesserae/site/`. |
155
+ | `tesserae project serve --port 8765` | Serves the static site locally and exposes `/api/ask` so every detail page's inline ask widget can route questions to `ask_project`. On any other host (file://, GitHub Pages, S3) the widget gracefully collapses to a one-line static footer. |
156
+ | `tesserae project refresh-understand-anything` | Runs Tesserae's managed Understand Anything refresh wrapper. |
157
+ | `tesserae project refresh-raganything --parser mineru` | Re-parses non-code sources (PDFs, Office, images) via RAG-Anything. |
158
+ | `tesserae project ask "<question>"` | Asks the configured backend (`auto`/`raganything`/`cognee`/`wiki`). |
159
+ | `tesserae project mcp-config` | Prints an MCP server config snippet you can paste into Claude Code, Codex, or Hermes. |
160
+ | `tesserae wiki register <path> --name <alias>` | Registers a project in the shared registry. |
161
+ | `tesserae wiki list` / `tesserae wiki activate <name>` | Lists registered projects; sets the active one. |
162
+ | `tesserae ask "<question>" [--wiki <name>]` | Top-level ask that resolves through the registry. |
163
+
164
+ ## Integrations
165
+
166
+ All integrations are opt-in. None are required to use Tesserae on a plain markdown/code project.
167
+
168
+ - **Understand Anything** — a separate project ([Lum1104/Understand-Anything](https://github.com/Lum1104/Understand-Anything)) that produces a code knowledge graph at `.understand-anything/knowledge-graph.json`. Enable with `--with-understand-anything`. Tesserae stores a managed refresh wrapper so `project compile` keeps the graph current. See [docs/integrations/understand-anything.md](docs/integrations/understand-anything.md).
169
+ - **RAG-Anything** — multimodal ingestion ([HKUDS/RAG-Anything](https://github.com/HKUDS/RAG-Anything)) for PDFs, Office documents, and images via MinerU/Docling/PaddleOCR. Enable with `--with-raganything`. Also acts as a runtime question backend (LightRAG). Requires Python 3.10+. See [docs/integrations/rag-anything.md](docs/integrations/rag-anything.md).
170
+ - **Cognee** — graph+vector memory backend. Enable with `--run-cognee --install-cognee`. The normal compile always writes `.tesserae/cognee_bundle/`; the runtime `cognify` pass is best-effort and only runs when explicitly enabled.
171
+
172
+ ## Multi-project registry
173
+
174
+ A persistent registry at `~/.tesserae/registry.json` lets the top-level `ask` CLI and the MCP server resolve project names to roots without `--project` on every call.
175
+
176
+ ```bash
177
+ tesserae wiki register /path/to/my-project --name myproj
178
+ tesserae wiki activate myproj
179
+ tesserae ask "Where is the parser entry point?"
180
+ ```
181
+
182
+ The same registry is read by the MCP server, so MCP clients can call `list_projects`, `activate_project`, and `ask` against any registered wiki.
183
+
184
+ ### Cross-vault linking (`wiki://` URI scheme)
185
+
186
+ Source markdown in one registered project can reference a node in another registered project via a stable URI:
187
+
188
+ ```
189
+ wiki://<alias>/<kind>/<slug>
190
+ ```
191
+
192
+ Examples:
193
+
194
+ - `wiki://research/concepts/rlhf` — the RLHF concept in the `research` vault.
195
+ - `wiki://other-vault/papers/arxiv-2510-12323` — a paper in `other-vault`.
196
+ - `[See RLHF in research](wiki://research/concepts/rlhf)` — works inside a Markdown link too.
197
+
198
+ At compile time these URIs become *bridge nodes* in the graph view (group `external`, violet) with a "Cross-project bridges" toggle in the toolbar so you can hide them. Unregistered aliases render as tombstones; registered-but-not-yet-built links render as placeholders.
199
+
200
+ ### Querying across vaults (`--scope all-registered`)
201
+
202
+ `tesserae ask` and the MCP `ask` tool accept a `--scope` flag:
203
+
204
+ ```bash
205
+ # Default — just the active/named project.
206
+ tesserae ask "..."
207
+
208
+ # Fan out across every registered project; aggregate envelopes by alias.
209
+ tesserae ask "..." --scope all-registered
210
+
211
+ # Restrict to a hand-picked subset of registered aliases.
212
+ tesserae ask "..." --scope all-registered --scope-aliases research work
213
+ ```
214
+
215
+ The aggregated JSON shape is `{"scope": "all-registered", "question": ..., "by_project": {"<alias>": <envelope>, ...}}`. Per-project failures are captured as `{"error": "..."}` entries; a single failing project never aborts the fan-out.
216
+
217
+ ## MCP
218
+
219
+ `tesserae project mcp-config` prints a server entry you can paste into Claude Code, Codex, or any MCP-aware client. The server exposes tools including `schema`, `graph_summary`, `search_nodes`, `node_context`, `search_facts`, `timeline`, `wiki_page`, `raw_source`, `lint_report`, `ask`, and the registry tools `list_projects` / `register_project` / `activate_project` / `unregister_project`. Tools that need a specific project resolve through the same registry as the CLI.
220
+
221
+ ## Authentication and LLM providers
222
+
223
+ The common path uses no API keys:
224
+
225
+ - **Codex CLI** (default) over OAuth. `--raganything-llm-provider codex` is the default; Cognee `codex_cognify` mode patches Cognee's LLM client to the Codex CLI.
226
+ - **Claude Code CLI** over OAuth. Set `--raganything-llm-provider claude` for RAG-Anything runtime queries. Multi-account setups use `--raganything-claude-config-dir ~/.claude-personal2` (Tesserae exports `CLAUDE_CONFIG_DIR` before each call).
227
+ - **Embeddings** default to a deterministic in-process provider. Switch to Ollama with `--cognee-embedding-provider ollama --cognee-ollama-embedding-model qwen3-embedding:0.6b`, or wire OpenAI-compatible endpoints — both documented in the integration pages.
228
+
229
+ If you set `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` they will be picked up by the corresponding paths, but they are not required.
230
+
231
+ ## Project layout
232
+
233
+ ```text
234
+ tesserae/ # the package (CLI, compiler, MCP server, adapters)
235
+ docs/ # English docs + docs/i18n/ for the six other languages
236
+ ontology/ # node/edge schemas the compiler validates against
237
+ prompts/ # extraction and synthesis prompts
238
+ scripts/ # maintenance scripts
239
+ tests/ # pytest suite
240
+ evals/ # graph quality eval harnesses
241
+ data/ # example research notes used by self-dogfooding
242
+ ```
243
+
244
+ ## Localized docs
245
+
246
+ [한국어](./README.ko.md) ·
247
+ [中文](./README.zh.md) ·
248
+ [日本語](./README.ja.md) ·
249
+ [Русский](./README.ru.md) ·
250
+ [Español](./README.es.md) ·
251
+ [Français](./README.fr.md)
252
+
253
+ Long-form docs are mirrored under `docs/i18n/` and `docs/i18n/integrations/`.
254
+
255
+ ## License
256
+
257
+ MIT. See [LICENSE](LICENSE).
@@ -0,0 +1,38 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "tesserae"
7
+ version = "0.1.0"
8
+ description = "Typed LLM wiki graph pipeline for research and development projects"
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ license = "MIT"
12
+ authors = [
13
+ { name = "Tesserae Contributors" }
14
+ ]
15
+ keywords = ["llm", "wiki", "knowledge-graph", "mcp", "obsidian"]
16
+ classifiers = [
17
+ "Programming Language :: Python :: 3",
18
+ "Programming Language :: Python :: 3 :: Only",
19
+ "Programming Language :: Python :: 3.10",
20
+ "Programming Language :: Python :: 3.11",
21
+ "Programming Language :: Python :: 3.12",
22
+ ]
23
+ dependencies = [
24
+ "pydantic>=2",
25
+ ]
26
+
27
+ [project.optional-dependencies]
28
+ synthesis-llm = ["anthropic>=0.40"]
29
+ raganything = ["raganything>=1.3.0"]
30
+ raganything-all = ["raganything[all]>=1.3.0"]
31
+ raganything-semantic = ["raganything[all]>=1.3.0", "sentence-transformers>=3.0"]
32
+
33
+ [project.scripts]
34
+ tesserae = "tesserae.cli:main"
35
+ tesserae_mcp = "tesserae.mcp_server:main"
36
+
37
+ [tool.setuptools.packages.find]
38
+ include = ["tesserae*"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,5 @@
1
+ from setuptools import setup
2
+
3
+
4
+ if __name__ == "__main__":
5
+ setup()
File without changes
@@ -0,0 +1,14 @@
1
+ """Module entry point so ``python -m tesserae ...`` works.
2
+
3
+ The package ships a ``tesserae`` console script via ``pyproject.toml``,
4
+ but environments without that script on PATH (CI containers, embedded
5
+ interpreters, ``uv run`` invocations) need the ``-m`` form. This file
6
+ keeps both surfaces in sync — both call ``tesserae.cli:main``.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from .cli import main
12
+
13
+ if __name__ == "__main__":
14
+ raise SystemExit(main())