llm-wiki-plus 2.2.0__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 (169) hide show
  1. llm_wiki_plus-2.2.0.dist-info/METADATA +176 -0
  2. llm_wiki_plus-2.2.0.dist-info/RECORD +169 -0
  3. llm_wiki_plus-2.2.0.dist-info/WHEEL +5 -0
  4. llm_wiki_plus-2.2.0.dist-info/entry_points.txt +3 -0
  5. llm_wiki_plus-2.2.0.dist-info/licenses/LICENSE +21 -0
  6. llm_wiki_plus-2.2.0.dist-info/top_level.txt +1 -0
  7. llmwiki/__init__.py +71 -0
  8. llmwiki/__main__.py +7 -0
  9. llmwiki/_frontmatter.py +178 -0
  10. llmwiki/_system_pages.py +72 -0
  11. llmwiki/adapter_config.py +123 -0
  12. llmwiki/adapters/__init__.py +141 -0
  13. llmwiki/adapters/base.py +334 -0
  14. llmwiki/adapters/claude_code.py +92 -0
  15. llmwiki/adapters/codex_cli.py +237 -0
  16. llmwiki/adapters/contrib/__init__.py +1 -0
  17. llmwiki/adapters/contrib/chatgpt.py +262 -0
  18. llmwiki/adapters/contrib/copilot_chat.py +130 -0
  19. llmwiki/adapters/contrib/copilot_cli.py +124 -0
  20. llmwiki/adapters/contrib/cursor_cli.py +300 -0
  21. llmwiki/adapters/contrib/cursor_ide.py +459 -0
  22. llmwiki/adapters/contrib/cursor_slug.py +11 -0
  23. llmwiki/adapters/contrib/gemini_cli.py +82 -0
  24. llmwiki/adapters/contrib/obsidian.py +129 -0
  25. llmwiki/adapters/contrib/openclaw.py +183 -0
  26. llmwiki/adapters/contrib/opencode.py +175 -0
  27. llmwiki/adapters/settings.py +133 -0
  28. llmwiki/adapters/status.py +103 -0
  29. llmwiki/add_doc.py +1050 -0
  30. llmwiki/agent_kit/__init__.py +35 -0
  31. llmwiki/agent_kit/commands/wiki-all.md +47 -0
  32. llmwiki/agent_kit/commands/wiki-build.md +15 -0
  33. llmwiki/agent_kit/commands/wiki-candidates.md +71 -0
  34. llmwiki/agent_kit/commands/wiki-graph.md +52 -0
  35. llmwiki/agent_kit/commands/wiki-ingest.md +59 -0
  36. llmwiki/agent_kit/commands/wiki-init.md +12 -0
  37. llmwiki/agent_kit/commands/wiki-lint.md +29 -0
  38. llmwiki/agent_kit/commands/wiki-query.md +30 -0
  39. llmwiki/agent_kit/commands/wiki-reflect.md +53 -0
  40. llmwiki/agent_kit/commands/wiki-sync.md +30 -0
  41. llmwiki/agent_kit/commands/wiki-synth.md +46 -0
  42. llmwiki/agent_kit/commands/wiki-update.md +41 -0
  43. llmwiki/agent_kit/skills/llmwiki-ingest/SKILL.md +81 -0
  44. llmwiki/agent_kit/skills/llmwiki-query/SKILL.md +64 -0
  45. llmwiki/agent_kit/skills/llmwiki-sync/SKILL.md +102 -0
  46. llmwiki/agent_kit/skills/wiki-all/SKILL.md +59 -0
  47. llmwiki/agent_label.py +104 -0
  48. llmwiki/automation_install.py +597 -0
  49. llmwiki/automation_plan.py +209 -0
  50. llmwiki/automation_status.py +48 -0
  51. llmwiki/backlinks.py +223 -0
  52. llmwiki/build.py +3475 -0
  53. llmwiki/cache.py +333 -0
  54. llmwiki/candidates.py +1080 -0
  55. llmwiki/candidates_harvest.py +542 -0
  56. llmwiki/candidates_site.py +838 -0
  57. llmwiki/categories.py +156 -0
  58. llmwiki/changelog_timeline.py +427 -0
  59. llmwiki/claude_path.py +55 -0
  60. llmwiki/cli.py +3353 -0
  61. llmwiki/completion.py +190 -0
  62. llmwiki/confidence.py +177 -0
  63. llmwiki/config_schedule.py +147 -0
  64. llmwiki/configure_sources.py +400 -0
  65. llmwiki/context_md.py +182 -0
  66. llmwiki/convert.py +2147 -0
  67. llmwiki/cron_spec.py +502 -0
  68. llmwiki/docs_pages.py +817 -0
  69. llmwiki/exporters.py +516 -0
  70. llmwiki/format_numbers.py +26 -0
  71. llmwiki/freshness.py +158 -0
  72. llmwiki/graph.py +788 -0
  73. llmwiki/graphify_bridge.py +537 -0
  74. llmwiki/htmlmd.py +202 -0
  75. llmwiki/ingest_queue.py +105 -0
  76. llmwiki/install_agent_kit.py +330 -0
  77. llmwiki/install_hint.py +139 -0
  78. llmwiki/lifecycle.py +166 -0
  79. llmwiki/link_checker.py +148 -0
  80. llmwiki/lint/__init__.py +308 -0
  81. llmwiki/lint/report.py +132 -0
  82. llmwiki/lint/rules/__init__.py +69 -0
  83. llmwiki/lint/rules/_helpers.py +119 -0
  84. llmwiki/lint/rules/claim_verification.py +40 -0
  85. llmwiki/lint/rules/content_freshness.py +41 -0
  86. llmwiki/lint/rules/contradiction_detection.py +157 -0
  87. llmwiki/lint/rules/duplicate_detection.py +164 -0
  88. llmwiki/lint/rules/frontmatter_completeness.py +47 -0
  89. llmwiki/lint/rules/frontmatter_count_consistency.py +61 -0
  90. llmwiki/lint/rules/frontmatter_validity.py +63 -0
  91. llmwiki/lint/rules/index_sync.py +68 -0
  92. llmwiki/lint/rules/link_integrity.py +82 -0
  93. llmwiki/lint/rules/orphan_detection.py +68 -0
  94. llmwiki/lint/rules/provenance_integrity.py +109 -0
  95. llmwiki/lint/rules/stale_candidates.py +59 -0
  96. llmwiki/lint/rules/stale_reference_detection.py +42 -0
  97. llmwiki/lint/rules/stub_source_pages.py +55 -0
  98. llmwiki/lint/rules/summary_accuracy.py +28 -0
  99. llmwiki/lint/rules/tags_topics_convention.py +58 -0
  100. llmwiki/lint/rules/tools_consistency.py +65 -0
  101. llmwiki/log_reader.py +128 -0
  102. llmwiki/manifest.py +132 -0
  103. llmwiki/mcp/__init__.py +29 -0
  104. llmwiki/mcp/__main__.py +5 -0
  105. llmwiki/mcp/server.py +1465 -0
  106. llmwiki/migrate_broken_provenance.py +463 -0
  107. llmwiki/migrate_page_kinds.py +343 -0
  108. llmwiki/migrate_topic_kinds.py +472 -0
  109. llmwiki/model_pricing.csv +13 -0
  110. llmwiki/models_page.py +279 -0
  111. llmwiki/obsidian_output.py +205 -0
  112. llmwiki/pipeline.py +411 -0
  113. llmwiki/pipeline_lock.py +108 -0
  114. llmwiki/project_topics.py +201 -0
  115. llmwiki/py.typed +0 -0
  116. llmwiki/quarantine.py +274 -0
  117. llmwiki/queue.py +29 -0
  118. llmwiki/queue_ops.py +193 -0
  119. llmwiki/raw_docs_site.py +505 -0
  120. llmwiki/references.py +244 -0
  121. llmwiki/reindex.py +499 -0
  122. llmwiki/remove_doc.py +304 -0
  123. llmwiki/render/__init__.py +20 -0
  124. llmwiki/render/collapse_section.py +76 -0
  125. llmwiki/render/css.py +1221 -0
  126. llmwiki/render/data.py +43 -0
  127. llmwiki/render/docs_css.py +473 -0
  128. llmwiki/render/graph_viewer.py +677 -0
  129. llmwiki/render/js.py +1902 -0
  130. llmwiki/schema.py +264 -0
  131. llmwiki/search_facets.py +138 -0
  132. llmwiki/search_tree.py +185 -0
  133. llmwiki/session_ready.py +235 -0
  134. llmwiki/skill_installer.py +111 -0
  135. llmwiki/slugs.py +198 -0
  136. llmwiki/source_checkout.py +56 -0
  137. llmwiki/source_topics.py +142 -0
  138. llmwiki/state_store.py +459 -0
  139. llmwiki/sync/__init__.py +13 -0
  140. llmwiki/sync/lookback.py +101 -0
  141. llmwiki/sync/status.py +137 -0
  142. llmwiki/synth/__init__.py +14 -0
  143. llmwiki/synth/base.py +190 -0
  144. llmwiki/synth/claude_cli.py +328 -0
  145. llmwiki/synth/estimate.py +609 -0
  146. llmwiki/synth/ollama.py +404 -0
  147. llmwiki/synth/pipeline.py +1813 -0
  148. llmwiki/synth/reporting.py +119 -0
  149. llmwiki/tag_utils.py +68 -0
  150. llmwiki/tags.py +360 -0
  151. llmwiki/topics.py +425 -0
  152. llmwiki/topics_consolidate.py +208 -0
  153. llmwiki/topics_page.py +571 -0
  154. llmwiki/trace.py +605 -0
  155. llmwiki/usage.py +1077 -0
  156. llmwiki/vault.py +345 -0
  157. llmwiki/vault_settings.py +130 -0
  158. llmwiki/vendor/NOTICE +38 -0
  159. llmwiki/vendor/github-dark.min.css +10 -0
  160. llmwiki/vendor/github.min.css +10 -0
  161. llmwiki/vendor/highlight.min.js +1213 -0
  162. llmwiki/vendor/vis-network.min.js +34 -0
  163. llmwiki/viz_heatmap.py +363 -0
  164. llmwiki/viz_tokens.py +423 -0
  165. llmwiki/viz_tools.py +241 -0
  166. llmwiki/viz_wiki_value.py +311 -0
  167. llmwiki/watch.py +292 -0
  168. llmwiki/wiki_adoption.py +131 -0
  169. llmwiki/wikilinks.py +153 -0
@@ -0,0 +1,176 @@
1
+ Metadata-Version: 2.4
2
+ Name: llm-wiki-plus
3
+ Version: 2.2.0
4
+ Summary: Karpathy-style LLM wiki from your Claude Code, Codex CLI, Cursor, and Obsidian sessions
5
+ Author-email: Alexander Makarov <4ellendger@gmail.com>, Pratiyush <pratiyush1@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/AlexanderMakarov/llm-wiki
8
+ Project-URL: Documentation, https://github.com/AlexanderMakarov/llm-wiki/tree/main/docs
9
+ Project-URL: Repository, https://github.com/AlexanderMakarov/llm-wiki
10
+ Project-URL: Issues, https://github.com/AlexanderMakarov/llm-wiki/issues
11
+ Project-URL: Changelog, https://github.com/AlexanderMakarov/llm-wiki/blob/main/CHANGELOG.md
12
+ Project-URL: Releases, https://github.com/AlexanderMakarov/llm-wiki/releases
13
+ Keywords: llm-wiki,karpathy,knowledge-base,claude-code,codex-cli,cursor,obsidian,session-history,static-site,mcp
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Environment :: Console
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: License :: OSI Approved :: MIT License
18
+ Classifier: Operating System :: MacOS
19
+ Classifier: Operating System :: POSIX :: Linux
20
+ Classifier: Operating System :: Microsoft :: Windows
21
+ Classifier: Programming Language :: Python :: 3
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Topic :: Documentation
24
+ Classifier: Topic :: Software Development :: Documentation
25
+ Classifier: Topic :: Text Processing :: Markup :: Markdown
26
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
27
+ Classifier: Framework :: Pytest
28
+ Classifier: Typing :: Typed
29
+ Classifier: Natural Language :: English
30
+ Requires-Python: >=3.12
31
+ Description-Content-Type: text/markdown
32
+ License-File: LICENSE
33
+ Requires-Dist: markdown>=3.9
34
+ Provides-Extra: highlight
35
+ Provides-Extra: graph
36
+ Requires-Dist: graphifyy>=0.4.20; extra == "graph"
37
+ Provides-Extra: add
38
+ Requires-Dist: trafilatura>=2.0.0; extra == "add"
39
+ Requires-Dist: markitdown[docx,pdf,pptx,xlsx]>=0.1.2; extra == "add"
40
+ Provides-Extra: dev
41
+ Requires-Dist: pytest>=8.4.2; extra == "dev"
42
+ Requires-Dist: ruff>=0.15.11; extra == "dev"
43
+ Provides-Extra: e2e
44
+ Requires-Dist: pytest>=8.4.2; extra == "e2e"
45
+ Requires-Dist: pytest-playwright>=0.7.1; extra == "e2e"
46
+ Requires-Dist: pytest-bdd>=8.1.0; extra == "e2e"
47
+ Requires-Dist: pytest-html>=4.2.0; extra == "e2e"
48
+ Requires-Dist: Pillow>=10.0; extra == "e2e"
49
+ Provides-Extra: all
50
+ Requires-Dist: graphifyy>=0.4.20; extra == "all"
51
+ Dynamic: license-file
52
+
53
+ # llmwiki
54
+
55
+ Your coding-agent sessions, compiled into a local wiki you can search, graph, and open as plain files.
56
+
57
+ [Live demo](https://alexandermakarov.github.io/llm-wiki/) · [Karpathy's LLM Wiki pattern](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f)
58
+
59
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
60
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/)
61
+ [![Version](https://img.shields.io/badge/version-v2.2.0-10B981.svg)](CHANGELOG.md)
62
+ [![CI](https://github.com/AlexanderMakarov/llm-wiki/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/AlexanderMakarov/llm-wiki/actions/workflows/ci.yml)
63
+ [![Link check](https://github.com/AlexanderMakarov/llm-wiki/actions/workflows/link-check.yml/badge.svg?branch=main)](https://github.com/AlexanderMakarov/llm-wiki/actions/workflows/link-check.yml)
64
+ [![Wiki checks](https://github.com/AlexanderMakarov/llm-wiki/actions/workflows/wiki-checks.yml/badge.svg?branch=main)](https://github.com/AlexanderMakarov/llm-wiki/actions/workflows/wiki-checks.yml)
65
+
66
+ llmwiki turns transcripts from Claude Code, Codex, Cursor, OpenClaw and others into redacted markdown, then builds a static site: session browser, topic graph, candidate review, MCP tools. Your data stays in a vault outside git. Nothing has to be running to read the site — open `site/index.html`.
67
+
68
+ ## What you get
69
+
70
+ - **A searchable static site** — sessions, projects, topics, graph, analytics. Dark mode, Cmd+K search, syntax highlighting. Open the files; there is no server.
71
+ - **A knowledge layer** — `synth` writes source summaries and harvests entity/concept *candidates*. You review those on `/candidates.html` and apply decisions with `llmwiki candidates apply`. That review is a real gate, not an optional extra.
72
+ - **Exports agents can read** — `llms.txt`, `llms-full.txt`, JSON-LD, sitemap, RSS, plus an MCP server.
73
+ - **Your data never lands in git.** Transcripts, wiki pages and the built site live in a vault directory you choose. This repository is code plus a public [demo](demo/).
74
+
75
+ Page kinds and where each field comes from: [docs/reference/page-kinds.md](docs/reference/page-kinds.md). Every screen: [docs/reference/ui.md](docs/reference/ui.md).
76
+
77
+ ## Install
78
+
79
+ Requires **Python ≥ 3.12** (CI verifies **3.12** only; newer interpreters are installable but not matrix-tested). Runtime dependency is `markdown` only.
80
+
81
+ ```bash
82
+ pip install llm-wiki-plus
83
+ # or: brew install AlexanderMakarov/tap/llmwiki
84
+ llmwiki init --vault ~/llmwiki-vault
85
+ ```
86
+
87
+ Point a gitignored `config.json` at the vault so later commands need no `--vault`:
88
+
89
+ ```json
90
+ {
91
+ "vault": { "default_path": "/home/USER/llmwiki-vault" }
92
+ }
93
+ ```
94
+
95
+ From a clone, `./setup.sh` installs the package and reports which agents it can see. The clone itself is not a vault — bare `llmwiki init` / `sync` / `build` against this repository are refused; name `--vault` or `demo`.
96
+
97
+ **Agent commands** (slash commands and skills) ship inside the package. After install:
98
+
99
+ ```bash
100
+ llmwiki install-agent-kit --dest ~/.claude
101
+ ```
102
+
103
+ That is what a Homebrew or pip user runs so `/wiki-sync` and friends work from *their* project, not from this repository. See [docs/reference/cli.md](docs/reference/cli.md).
104
+
105
+ The install also drops a small `.llmwiki-agent-kit.json` manifest in `--dest`, recording which files it wrote and their checksums. It is safe — and useful — to commit alongside `.claude/commands/`: it is what lets a later upgrade recognise its own files and remove ones it has retired, while leaving anything you wrote or edited alone.
106
+
107
+ ## The loop
108
+
109
+ ```text
110
+ sync / add → synth → review candidates → build → open site/index.html
111
+ ```
112
+
113
+ ```bash
114
+ llmwiki sync # new transcripts → vault/raw/sessions/
115
+ llmwiki add notes.md # optional: drop a document into raw/docs/
116
+ llmwiki synth # source pages + harvest candidates
117
+ # open vault/site/candidates.html, set decisions, paste the printed command
118
+ llmwiki build # vault/wiki/ → vault/site/
119
+ ```
120
+
121
+ `synth` does not rebuild the site. `build` does. `candidates apply` rebuilds after a successful batch so `/candidates.html` matches the wiki (`--no-rebuild` skips that). Candidate review is the human gate: a row starts with no decision, Apply assembles `llmwiki candidates apply --vault … --actions '…'`, and only that command writes the wiki.
122
+
123
+ One-shot: `llmwiki all --graph-engine builtin` runs the whole loop — sync → synth → build → graph → lint. Opt out of a stage with `--no-sync`, `--no-synth`, `--skip-graph`, or `--skip-lint`.
124
+
125
+ ## Agents
126
+
127
+ One row per agent. **Supplies sessions** = `llmwiki sync` can read its transcript store. **Reads the wiki** = slash commands / MCP after `install-agent-kit` (any MCP client can also call `python3 -m llmwiki.mcp`). **Core** adapters run on a default `sync` when their store exists; **contrib** adapters need `--adapter <name>` or `adapters.<name>.enabled` in config.
128
+
129
+ | Agent | Supplies sessions | Reads the wiki | Core or contrib |
130
+ |---|---|---|---|
131
+ | Claude Code | `~/.claude/projects/*/*.jsonl` | slash commands, MCP | core (`claude_code`) |
132
+ | Codex CLI | `~/.codex/sessions/` | `AGENTS.md` workflow, MCP | core (`codex_cli`) |
133
+ | ChatGPT | contrib store | MCP | contrib (`chatgpt`) |
134
+ | Copilot Chat | VS Code workspaceStorage | MCP | contrib (`copilot_chat`) |
135
+ | Copilot CLI | `~/.copilot/session-state/` | MCP | contrib (`copilot_cli`) |
136
+ | Cursor IDE | workspaceStorage | MCP | contrib (`cursor`) |
137
+ | Cursor CLI | `~/.cursor/chats/` | MCP | contrib (`cursor_cli`) |
138
+ | Gemini CLI | `~/.gemini/` | MCP | contrib (`gemini_cli`) |
139
+ | Obsidian | markdown vault intake | wikilinks in the vault | contrib (`obsidian`) |
140
+ | OpenCode | shared OpenClaw schema | MCP | contrib (`opencode`) |
141
+ | OpenClaw | `~/.openclaw/agents/*/sessions/` | MCP | contrib (`openclaw`) |
142
+
143
+ ```bash
144
+ llmwiki adapters --wide
145
+ llmwiki sync --adapter openclaw
146
+ ```
147
+
148
+ ## Configuration
149
+
150
+ Shipped defaults: [`examples/sessions_config.json`](examples/sessions_config.json). Personal overrides: gitignored `config.json` at the clone root, merged on top. Full keys: [docs/configuration.md](docs/configuration.md).
151
+
152
+ Skip projects or dates with a `.llmwikiignore` next to the vault (one path or glob per line).
153
+
154
+ ## Documentation
155
+
156
+ | Topic | Link |
157
+ |---|---|
158
+ | Hub | [docs/index.md](docs/index.md) |
159
+ | Install + first vault | [docs/getting-started.md](docs/getting-started.md) |
160
+ | Page kinds | [docs/reference/page-kinds.md](docs/reference/page-kinds.md) |
161
+ | CLI | [docs/reference/cli.md](docs/reference/cli.md) |
162
+ | Site UI | [docs/reference/ui.md](docs/reference/ui.md) |
163
+ | Architecture | [docs/architecture.md](docs/architecture.md) |
164
+ | Upgrading | [docs/UPGRADING.md](docs/UPGRADING.md) |
165
+ | GitHub Pages | [docs/deploy/github-pages.md](docs/deploy/github-pages.md) |
166
+
167
+ This repository's `CLAUDE.md` and `AGENTS.md` are for people changing llmwiki itself. Vault workflows for users live in the installed agent kit.
168
+
169
+ ## Acknowledgements
170
+
171
+ - [Andrej Karpathy](https://twitter.com/karpathy) — [LLM Wiki idea](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f)
172
+ - [Pratiyush](https://github.com/Pratiyush/llm-wiki) — upstream this work extends
173
+
174
+ ## License
175
+
176
+ [MIT](LICENSE) © Alexander Makarov; based on upstream [Pratiyush/llm-wiki](https://github.com/Pratiyush/llm-wiki)
@@ -0,0 +1,169 @@
1
+ llm_wiki_plus-2.2.0.dist-info/licenses/LICENSE,sha256=t1Tu0mlN93X-rNAFrgN1PHCXGhWIRzg27VlpFDxj-gI,1066
2
+ llmwiki/__init__.py,sha256=ka6YxrECQ7S44Tws4SiNvyP7C8XlSizf0YW_XbgVWxs,2792
3
+ llmwiki/__main__.py,sha256=7Yg-c7vpPTno1WRjPWM8_pvyL0LAO30fBKAFmwXNono,142
4
+ llmwiki/_frontmatter.py,sha256=gyFeF0Mi0aOFm8LSxqEx00tXUlqHPrBk2-UeW_g23gE,6557
5
+ llmwiki/_system_pages.py,sha256=mB3MwS0v1YWTzwrFTOMqZ2ebuWUAqJK1pa2jyNmGCUM,2840
6
+ llmwiki/adapter_config.py,sha256=ICvYHrkwUcIuk6B-FS1oUPQcVFFqHvMNNJ1SoHe_Tvc,4135
7
+ llmwiki/add_doc.py,sha256=9Whyz7zaqMmccmwNn4fkhgSRiaBBIkHHww3xUrHrCqw,43080
8
+ llmwiki/agent_label.py,sha256=9nQ7xSykJ_E4oIhjjAJD-kwvlGn8sRaqkSk9kE-XFeA,3962
9
+ llmwiki/automation_install.py,sha256=XutQsIjQAttdtCluqQYr84lhDJll2bqgGrc_4Rod_A4,21450
10
+ llmwiki/automation_plan.py,sha256=16FbNDE3LlL1IH9WGlk5Ir58OTI0NSSPMM90Jck0si8,7801
11
+ llmwiki/automation_status.py,sha256=JCbmdOZMtwSS8fhimh72s73XUzpwwmz4pDdukcvZu_A,1531
12
+ llmwiki/backlinks.py,sha256=NuKGrFqTR5Zx1xla9iP1_EbstN_vmMYpvsEKj5qt3YA,7620
13
+ llmwiki/build.py,sha256=j5xdXV3CQR_EewTrY-pZfN59eJdK5hM3w-UbwT1ncM4,146408
14
+ llmwiki/cache.py,sha256=VrPubgm1vD83um4fK8h_bQcLfbHFATd24u0bWT9UjI8,12958
15
+ llmwiki/candidates.py,sha256=JsgNYDdIOO5pUihSDcbF1tNnO_Zfkyt6D6mnIaoIqmY,39550
16
+ llmwiki/candidates_harvest.py,sha256=gT0JYBmeulrIPd5UFGgIi1E0gewMf7BpL_9FhtyXA8o,20314
17
+ llmwiki/candidates_site.py,sha256=kB68w0aCatMByN47zZQY9zH4g1yDTH-g_TBfjePvRxg,32642
18
+ llmwiki/categories.py,sha256=jq8O814Pvxx9KKe6jjtqtfWwgGRaVqPWDZdFs3TRM40,4633
19
+ llmwiki/changelog_timeline.py,sha256=QJ0HIGP2WtkzKDYAZMfyrsEQ5taE0OX99MHW2ZOzadA,16179
20
+ llmwiki/claude_path.py,sha256=mX5vARHohKC8f82y0QHhTok8Do_ACuuQiw0hie4QqRw,1949
21
+ llmwiki/cli.py,sha256=49ZcISPFXbr9z0G9GhLp-i28n7yYWqO2Gqeif46b6p8,147521
22
+ llmwiki/completion.py,sha256=N-Ld0DNZvzGjkoP-HzOQeZC9UMNEJ0qgNd95mhwzhug,5968
23
+ llmwiki/confidence.py,sha256=OdVWaQqMnK5MDSVDl40JSSEv4X4LzkRXtYBTW5ajQfg,5351
24
+ llmwiki/config_schedule.py,sha256=0xUTe8TnPjut-RzkbiJap1SqimYwIJvXlQk89qidfIU,5278
25
+ llmwiki/configure_sources.py,sha256=3TwhCI3cstBhLlv7UGWG6WB6hrYrwZ76CSAwjPrE6zc,13380
26
+ llmwiki/context_md.py,sha256=IaxWauSD8o7pf4JVJ2b5UrIp6_k74bbkJU2qHPVgINE,6581
27
+ llmwiki/convert.py,sha256=YNuTg_3tnwUucsw1MEstTeo0iwoFwAIpOixQzSp1bug,92833
28
+ llmwiki/cron_spec.py,sha256=DfJ_B6-mbPUZ2JEiwrN-XrIa6MEakORZBPTNxzgVYBE,21196
29
+ llmwiki/docs_pages.py,sha256=ZtslLq0ScVTbFziOd7meHaZT1PHLMTUcsWlWHffJF5Q,30550
30
+ llmwiki/exporters.py,sha256=nHFkznpbd87Pq18ib4nLacqohxUYpgrS6bduNrcTS_o,20662
31
+ llmwiki/format_numbers.py,sha256=QxWIWWV84eEFMjBz6vxooZwEWWneZG5dz89f_99jfro,806
32
+ llmwiki/freshness.py,sha256=vFiKNVzAEb7M6vbdeqWbhcv1wpgMQqkPKas7SJjn0eg,5152
33
+ llmwiki/graph.py,sha256=oWGMujpoDcePWMW99ngHZsmIr9m85a0QEEncV6Tqo50,33103
34
+ llmwiki/graphify_bridge.py,sha256=NjTb3G1ekl8gpHLyvF30ycm_uEnKkznUPWjQTCGYnew,20701
35
+ llmwiki/htmlmd.py,sha256=pLsIWOgmjLd5PohiG-qj-xqdPsAagHGtoVajAwdixXg,7566
36
+ llmwiki/ingest_queue.py,sha256=jjMm_Yxpgrzun3uk2Yif6ReybJDBUnht4rsjbk9A9Qw,3231
37
+ llmwiki/install_agent_kit.py,sha256=CLskx0m7xVSsjpLu7fRTMKd7ZWmRogtD31DdP6eMllA,12158
38
+ llmwiki/install_hint.py,sha256=y8cRm1wI5tlOX2g7-vmucarBWIAyotZIkKFdB4DRw_w,5743
39
+ llmwiki/lifecycle.py,sha256=e3pPJcbNoAfPiygbEVIt5ZfH_of5VpaGCBHT08ybO58,5141
40
+ llmwiki/link_checker.py,sha256=rEQ3tnutNOMQHSdxDQjTVJShC3qTzl4Bl5M31sGGU7Y,5540
41
+ llmwiki/log_reader.py,sha256=2Gwwk7bBcBI8s-sFJM7Dvgg2dVfWv2VRXnVLlQ5YSMw,4056
42
+ llmwiki/manifest.py,sha256=goh7iG16dgLqjf3Obei6QKR9EM8I-3YrHrUWPSBg3QE,4282
43
+ llmwiki/migrate_broken_provenance.py,sha256=BoLVZUWAQng7pK1exLO0d-nyXx4egULE3ytlB7AnFGA,17266
44
+ llmwiki/migrate_page_kinds.py,sha256=mCopM95z_JoQNNmMATBl8uHjZocjg8cFgfd2C7st4D4,12863
45
+ llmwiki/migrate_topic_kinds.py,sha256=6BwH0lz0SdbvaEJx4ulACqRX7vdEHhnOvpMu8yzl-3Q,16849
46
+ llmwiki/model_pricing.csv,sha256=rcYLOHW_7ZGrwycDqUGCmiejwtYdLx1gmFYD7rzivsE,1168
47
+ llmwiki/models_page.py,sha256=WY-7Sa3KT-MuAV_t0_Guc8bPe5mamIHmDM1Dm82Wlwc,11143
48
+ llmwiki/obsidian_output.py,sha256=1bkZtLB1YJtqdZdxK6KonPkJdI1NPrJBMpFieV-oa8Q,7223
49
+ llmwiki/pipeline.py,sha256=lhHgyra6n1BFRFB7qBzZ4EFdaY4C1zCEHz93SsTtgyk,17944
50
+ llmwiki/pipeline_lock.py,sha256=27QNADPcUKQK93Csnpfi8HAe2mVW9ClQ2Uuz1bvl4mg,3991
51
+ llmwiki/project_topics.py,sha256=nrgskusOac8FYl21LbXmb0Hjuv5lCyXyUj08Z8iyW9I,7145
52
+ llmwiki/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
+ llmwiki/quarantine.py,sha256=xSSTD1D5mkn2c8nDrrYvIM-GufQUB5O1DUFlOtI4NA4,8955
54
+ llmwiki/queue.py,sha256=IDwdGwPvTcbgivXeQniyrm-8IsuACvVkyLoBeGrrT8w,789
55
+ llmwiki/queue_ops.py,sha256=UtDwNOOAwa25FAwWMyTaX-iT7F7Qw5RqmK1qbNPROVQ,7291
56
+ llmwiki/raw_docs_site.py,sha256=5qa1oebXdcbrCTgxVx14xoSWkN1zh4XXWkyTSOtI0r8,17621
57
+ llmwiki/references.py,sha256=G1IR4-TOi5ngAOhZ7TC48OxqLrR-_O0-mz-76MMraeU,8790
58
+ llmwiki/reindex.py,sha256=MCBDzmJMvDV8OyVboOe4u6B0c7z-0-1MvCuYK2lPZss,19110
59
+ llmwiki/remove_doc.py,sha256=c85851ZSmUxwUF9auYAWZBEmrZB2zFE1hft-vIZR_Wg,11547
60
+ llmwiki/schema.py,sha256=fvyENgx1KegqqFfh2R6plSFXYwICqw7IEdE4taIKTHA,9363
61
+ llmwiki/search_facets.py,sha256=0eoxNCDurar6-YriEYM1LI-_C4PGguOeSFF2wtjZ4yk,4248
62
+ llmwiki/search_tree.py,sha256=uZh3a-q1PfTJ6XE410iAeVmNuTMZ5-UuDMY1tqhl6mU,7323
63
+ llmwiki/session_ready.py,sha256=SbcTm3ycFGFrPTtu2-304_LCYOrT_VJn-06ajNKeMQ4,9346
64
+ llmwiki/skill_installer.py,sha256=tbg5c4QjLeisD6MPo_3OBUQDin2BrGLXHoukby8yWsY,3237
65
+ llmwiki/slugs.py,sha256=4BbdvBmPa2eRL9Y6B_agffbYR7cbjnyeiMAHFpDPMYQ,8474
66
+ llmwiki/source_checkout.py,sha256=_VBgbPmHHjS3RfolfbCEB8w53Y2nRD2J29MB2DiDGiA,2355
67
+ llmwiki/source_topics.py,sha256=V-fi7t4uGUiZXfwiLDtHknwq56winrzd5ltn5_RS1mU,4900
68
+ llmwiki/state_store.py,sha256=XZp1157L858WvCtdzyc1pMXqwo6pw6g9vaUps1MxxWs,16652
69
+ llmwiki/tag_utils.py,sha256=LGBjgsXHS2p5axUFAt85n-rMShQ9N84YEAgWz3x50wU,2541
70
+ llmwiki/tags.py,sha256=9pMyr4MbMzG1gGYWkS3zNuoSPhySKB52sEcfsEA60wo,12822
71
+ llmwiki/topics.py,sha256=vNAIz8EZGbDHgp2FJGnbxP4-6WaZx4flYG0t4PRk9v8,16660
72
+ llmwiki/topics_consolidate.py,sha256=KNxtMbe40fvByI7Q5lrBfh4JvdsaScYvveW4m21Bkho,7874
73
+ llmwiki/topics_page.py,sha256=p1HdysXIeiUgWSISbHvPTbG2kl1A5AJIHPhEAxcgiiY,22766
74
+ llmwiki/trace.py,sha256=gotgVunNW1VfjySEw63kBNG4gm9j4okM1-qS6hAHlHI,19733
75
+ llmwiki/usage.py,sha256=6E4GrHD_55nzfEoogICUo4uWPJUkFcCjiK0g-wcBi34,42983
76
+ llmwiki/vault.py,sha256=yHGmFzvHdkz6BZ0wWq0nSW0TBMG3zE6klV7F5PhAP40,13202
77
+ llmwiki/vault_settings.py,sha256=8PN_1IABTCX96es4QSv0pl-T-cZLu9qCRs3kD79N8bk,5055
78
+ llmwiki/viz_heatmap.py,sha256=W3zeeLV1195XOdExZ_48VHaqTVOiBxJ3i9k-_1JMRVM,13658
79
+ llmwiki/viz_tokens.py,sha256=IR0XS1EB_AUnarAPsYv7zTS6QD4VcqTl5uAschgeC28,16818
80
+ llmwiki/viz_tools.py,sha256=JOzc5hp2WiAz9DObBB8tDvyl6nIgMw62rg5IuymA7jQ,9235
81
+ llmwiki/viz_wiki_value.py,sha256=QsErg4nTw8DDhCsfVEVHmhwfbLi1UKqA8bQlojRhY6c,13410
82
+ llmwiki/watch.py,sha256=SejclQXk3YV_JfrxnWXPMuVkqYv98d2c4WoRjKdqwFQ,10407
83
+ llmwiki/wiki_adoption.py,sha256=ViaHGmKZMAyAmz9xnf9HL4X5tI5rK7oHJIschF1U7To,4533
84
+ llmwiki/wikilinks.py,sha256=T_v4OqG0d6AncoeYrquXpbIyGjQ8l3nYl8QDg6Lo5eU,4974
85
+ llmwiki/adapters/__init__.py,sha256=hWOqHQ2FjWzdKpnhm4EaDkJ0r-TxtEkW-3oWXPZlbxA,5093
86
+ llmwiki/adapters/base.py,sha256=taFomsQcwYhNc3Ewq34GJaaNX63DIfQ1KBjw6lOqFkc,14247
87
+ llmwiki/adapters/claude_code.py,sha256=A-KzSRyFvQn5K1CPPOK6PGnwqYYUvkK3SVKeCHtmYGI,3772
88
+ llmwiki/adapters/codex_cli.py,sha256=7MvsyAQrgh9Aaxtn-1zivhJiinhp0jj5OTLKwHNU16U,9299
89
+ llmwiki/adapters/settings.py,sha256=ls0WgKaf8WdHy1FL8V3O7nReWPZQOzP1O_m9qU3kMhw,4365
90
+ llmwiki/adapters/status.py,sha256=9r0MBwUF34nV5maNGYi6QFNvRUhUdwnHGpJRbxzw0fw,3790
91
+ llmwiki/adapters/contrib/__init__.py,sha256=IKZbcj1u3bQXQrcUq3tSY8mj_bwpmAIgANTE0H-NMrM,72
92
+ llmwiki/adapters/contrib/chatgpt.py,sha256=RFTs1Yqt4NsZw1rCxBQ3r0b4yG7jsJ2VLPi24yFO6kA,8099
93
+ llmwiki/adapters/contrib/copilot_chat.py,sha256=Ao5Xr2EVGPMxKdB86Un-qXwbW8ovF0rnoiH-lmCcqeY,5041
94
+ llmwiki/adapters/contrib/copilot_cli.py,sha256=Sqh9p6YDrs6RGuYy9r_XWB6y5gd1Pa0Z2W_EOfdNttk,4507
95
+ llmwiki/adapters/contrib/cursor_cli.py,sha256=OJtK4ngdxkmB9LM-LHbV3S5gdmFXBlNGLb3YrTLyowk,12204
96
+ llmwiki/adapters/contrib/cursor_ide.py,sha256=6WX4W5T_PNKt-Hhyj0pBcwte4jbHiE_5xMZfNcfjWtY,17863
97
+ llmwiki/adapters/contrib/cursor_slug.py,sha256=2doHOyATu2aFwxEE-CbXCpqubhIPXFzGDf1VjwkHVs0,419
98
+ llmwiki/adapters/contrib/gemini_cli.py,sha256=dDHewS_B0S_othz5ptPeJp1ZqCgL8qg4HQ7kYyDSbF0,2870
99
+ llmwiki/adapters/contrib/obsidian.py,sha256=RRZJHEL5vCo86jZ1ign1p4RTDNH_GSjVizyPb5s7HRw,4668
100
+ llmwiki/adapters/contrib/openclaw.py,sha256=ovyVh9epxFWTu_Ax2vd1Kr4OEEESqMHEQwJKcGajeDs,7329
101
+ llmwiki/adapters/contrib/opencode.py,sha256=39aniUCSgLArvQ_WFQaIsrsejfa2W2Xk8NwcsqABKuY,7025
102
+ llmwiki/agent_kit/__init__.py,sha256=ezGyxY2e3YLjEe4WejEWv1wPtJJkTzDSGxt3L0kfcLQ,1616
103
+ llmwiki/agent_kit/commands/wiki-all.md,sha256=Ark4vSneP34nJT-u_alia7zKvg_zSonvi8VW-PJKtHA,2615
104
+ llmwiki/agent_kit/commands/wiki-build.md,sha256=BoB1MXBZq2zZ9Saia2S_gKUO5Pexm8CAoKjOuhSURWc,491
105
+ llmwiki/agent_kit/commands/wiki-candidates.md,sha256=cjufsIXU6jZ45UEeRD4EMJfXeOGKhoTawsRJVChFF8Y,4692
106
+ llmwiki/agent_kit/commands/wiki-graph.md,sha256=Zo3EEgX_rnUUo131Q5v7i04LoAg6u4VNU7glMs1sheU,2087
107
+ llmwiki/agent_kit/commands/wiki-ingest.md,sha256=KXGi-I3bLWXvmY5Nz4S-HBWQBw6sipQVspgyMyXYWYE,3747
108
+ llmwiki/agent_kit/commands/wiki-init.md,sha256=CTV3BhmocffQvjQ-UA5eHiE8UUuRJDH0Cd0-8m4LK_0,379
109
+ llmwiki/agent_kit/commands/wiki-lint.md,sha256=zcv5r-cZZDJZnPxxbc3gALs_u4EtwsT6BA_sW6It2Sg,1189
110
+ llmwiki/agent_kit/commands/wiki-query.md,sha256=sDUOHMuVI6v-heUPg8ter17dG-Ggu2B0HBrhtBUAhPQ,949
111
+ llmwiki/agent_kit/commands/wiki-reflect.md,sha256=uA7KHXshdSJn4zNkyreZPHn8V5pr9nLZknoEtNFOkiU,2978
112
+ llmwiki/agent_kit/commands/wiki-sync.md,sha256=MB5lFrWcGFRSWzx2gHI4EcYz43hP4ohqrKcKJtMqnNY,1185
113
+ llmwiki/agent_kit/commands/wiki-synth.md,sha256=IcTivJ80KYDXbe7IZqt1e92uYfnMrfzdsrhfqsDXKyc,2303
114
+ llmwiki/agent_kit/commands/wiki-update.md,sha256=Z0cfqKTbePkA1QZRu3vqtp8lUK1cFklFLbg7fhYnec8,2194
115
+ llmwiki/agent_kit/skills/llmwiki-ingest/SKILL.md,sha256=IxLMjF93NEip9_qCJ8ufUlRbxQUgB5z1O37SZl9-ENg,6088
116
+ llmwiki/agent_kit/skills/llmwiki-query/SKILL.md,sha256=m6osuE1zNNxZbRw0iS5EV5DbcVX1E7ChhSJ3nkN09kk,2724
117
+ llmwiki/agent_kit/skills/llmwiki-sync/SKILL.md,sha256=eJkYVpw9cFsaXEN3jmv6T385pRZ27DQ1yfoHnjwZuLc,4192
118
+ llmwiki/agent_kit/skills/wiki-all/SKILL.md,sha256=iVxIcI2DsVDlN-1xbryxhvD41tpzHJS90nlUontAfbE,3197
119
+ llmwiki/lint/__init__.py,sha256=QcpbS6CqJ0Ztx2aqzf8PCzTqhFx9HTdC60kvPYGtpk4,11952
120
+ llmwiki/lint/report.py,sha256=LdqMZyahunhXksANz476LYjEfq_cs1VjXBzmr_tCZyk,5158
121
+ llmwiki/lint/rules/__init__.py,sha256=2jBsuyExXcUhaCSCElw8mWsWzj-pkLE8KpKFWJrKpwU,3706
122
+ llmwiki/lint/rules/_helpers.py,sha256=RR1e5bPK6lwda6H292XfgFp8BqFH1y2pKWnTdkVpDnY,4272
123
+ llmwiki/lint/rules/claim_verification.py,sha256=wgxW_TEpmo0Lv7fc6HFJnx5WXU8qjkkDR8NFSpz2dMc,1458
124
+ llmwiki/lint/rules/content_freshness.py,sha256=Foh4dW2RSSdRYg08sR3rUmgPuJvKv8wMzBuu0ok25lk,1273
125
+ llmwiki/lint/rules/contradiction_detection.py,sha256=KW8hR4TDeh0BrBEJa6CsFCV-96lM5dO8VkjBKfi6X-M,5470
126
+ llmwiki/lint/rules/duplicate_detection.py,sha256=YJu62J785aMVPpgc-i1NZnRhYPbw5_NF8cM4sZT0kYE,7369
127
+ llmwiki/lint/rules/frontmatter_completeness.py,sha256=U_uxJ5uFZZoBswQo-LQYyxzwovuOr0yrbwKP7Q0EJsM,1810
128
+ llmwiki/lint/rules/frontmatter_count_consistency.py,sha256=KIFVd0MAvIL1obYEubfy9pRc4gcQuV1KCd6TWtWUSZM,2300
129
+ llmwiki/lint/rules/frontmatter_validity.py,sha256=qoYMRYFM1lRIx9rQ6JXjJXGGsbq3yIZ-5ErCuaOmuf8,2303
130
+ llmwiki/lint/rules/index_sync.py,sha256=sClg23RB5oD2f-pY0nx0BcDHOGDZwajCN8jiuK660z0,2581
131
+ llmwiki/lint/rules/link_integrity.py,sha256=z_L2E8oIwI_iL3epxJ-lxtxDSi9je0F4goRCOT8aMNM,2792
132
+ llmwiki/lint/rules/orphan_detection.py,sha256=m0Ij5FEq45ro3yEMmmJxoiIRS4VDOs6pXJdjKqm7dxw,2755
133
+ llmwiki/lint/rules/provenance_integrity.py,sha256=94gHh3PY-51eBFERBGnc9Y-_KkGn2_S9kGxSoJocmYQ,3563
134
+ llmwiki/lint/rules/stale_candidates.py,sha256=7Ar6CJ4NwzJ35OSbicMlxvKROsd41qtCKHhGNzLl0hU,2029
135
+ llmwiki/lint/rules/stale_reference_detection.py,sha256=9tGF6vnxcZa_bcAOrdWHskrwR_ik6oLJx-ptFqlSk6w,1587
136
+ llmwiki/lint/rules/stub_source_pages.py,sha256=OtCUe-KvogcP9IrGgU29_-gjtV9FoCYPOXZ3yMlhn4E,2187
137
+ llmwiki/lint/rules/summary_accuracy.py,sha256=hQdSf6Ihw8bS3BtKYgE1qtwrQ2vLjNlX2CNKZPVCOu4,923
138
+ llmwiki/lint/rules/tags_topics_convention.py,sha256=PsGGl2Qptd05wrC0v796nxNNU88u4Zd1KxUNJN1pkYI,2223
139
+ llmwiki/lint/rules/tools_consistency.py,sha256=xbIazbMBoabsUEKAGhUiy0RhaAtok34YLREsZMud13E,2435
140
+ llmwiki/mcp/__init__.py,sha256=Pd0LkjNNXGKcD2lDvdqaux5ulHoNXRaooe0BoBbMewk,966
141
+ llmwiki/mcp/__main__.py,sha256=VMIikJx_mX_Mh1ipr4xWETLDa7IEnyDEen1VOGktG6w,123
142
+ llmwiki/mcp/server.py,sha256=nQfKrb4aGqeVpMLr9AO3ZY8nApJjYySMk-lHBN0mfOU,56887
143
+ llmwiki/render/__init__.py,sha256=xcc-85H84FxqWZWGFtEnv88v0BGoK8qIgU34n8dXVXk,676
144
+ llmwiki/render/collapse_section.py,sha256=XrInH5QXXqcIkK13xku0-WDda3tbF3KgPUF5LtHEwSc,2385
145
+ llmwiki/render/css.py,sha256=KTVW58NU8xowRCtKlWnhVPxyv1B29pafT4NwZm9ywCA,72916
146
+ llmwiki/render/data.py,sha256=McoFg1919wIKwQqlHSNAVLW5ahCsFaivkYJyduwf4nM,1945
147
+ llmwiki/render/docs_css.py,sha256=ZtxL0TKBWl0QKhtHlWlDddIq1NHOIQXvcRDZTPTlNIE,11587
148
+ llmwiki/render/graph_viewer.py,sha256=u0EqG5VHb7L9qbO6KbeXrLUQTbpLze59zJ_lPZgBXtY,30040
149
+ llmwiki/render/js.py,sha256=4dMTvShgnH74MapJ9GJTkq-v53xEKRztKM8Kx4v7ups,84857
150
+ llmwiki/sync/__init__.py,sha256=--jDo0QbQ3Rw3lnqZMAEL9FCIpbRC8QAglXxlFfaC7Q,527
151
+ llmwiki/sync/lookback.py,sha256=hshZmt8vPjZR2bolbPQKnZHaBXDHI3guY_IhRF5pz_s,3244
152
+ llmwiki/sync/status.py,sha256=NSK2_uSy0zGVrKq6rWnguC_tpUAfQeIJ0LH1cG13EfA,5338
153
+ llmwiki/synth/__init__.py,sha256=uhAoquwBPrqf8GeID3TqqftJ4VMFKjoN_Kf0f2pZTMg,635
154
+ llmwiki/synth/base.py,sha256=G7eeswY1pHHG4apymg5S-bGOUN4xR0GoQqbW86qgK1U,7306
155
+ llmwiki/synth/claude_cli.py,sha256=mIPpJc1RW23A-wjyzBD-d73fVe0KVzW_jUcN_Njd7Mc,12848
156
+ llmwiki/synth/estimate.py,sha256=5phwllCZLenKjXVWGwPBoS8c1Z9NWFTyOSqpkZEsMEY,26300
157
+ llmwiki/synth/ollama.py,sha256=VxGMRYEMw0iv9yJi-hjNaiznaz7C4PQMApqgZvLnfnk,15779
158
+ llmwiki/synth/pipeline.py,sha256=mXhc7qZDXXguEC7ILWPORPQMfHWArMApwIuBadtMMbo,74780
159
+ llmwiki/synth/reporting.py,sha256=BRY1n6zwORUSWddiTNnUg9bjVzhKWV-3urcgH7GUSWI,4243
160
+ llmwiki/vendor/NOTICE,sha256=8fgQ8mj6Kv7tf-bXOD0g4iZX0jJFWMMcTaFw4EBrPFM,1735
161
+ llmwiki/vendor/github-dark.min.css,sha256=nyCNAiECsdDHrr_s2OQsp5l9XeY2ZJ0rMepjCT2AkBk,1315
162
+ llmwiki/vendor/github.min.css,sha256=Oppd74ucMR5a5Dq96FxjEzGF7tTw2fZ_6ksAqDCM8GY,1309
163
+ llmwiki/vendor/highlight.min.js,sha256=g3pvpbDHNrUrveKythkPMF2j_J7UFoHbUyFQcFe1yEY,121727
164
+ llmwiki/vendor/vis-network.min.js,sha256=9T-DPdub-X7-hWuwY31P6I8545mZx-lKS4r8jeihouU,688911
165
+ llm_wiki_plus-2.2.0.dist-info/METADATA,sha256=QUZCHCQcxkjU9jd7yb3wnHExAj-yMsTZR0T9bpfEnjY,9794
166
+ llm_wiki_plus-2.2.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
167
+ llm_wiki_plus-2.2.0.dist-info/entry_points.txt,sha256=OG9mJxZ4jmpE7-9rP_8z9CGgYEsOgC-_-uLbKv_dv9I,81
168
+ llm_wiki_plus-2.2.0.dist-info/top_level.txt,sha256=1TYv5RtuN1LNK6YoG0ImVuQCA4iCwCG69-s-Pd3pfGs,8
169
+ llm_wiki_plus-2.2.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ llm-wiki-add = llmwiki.cli:main_add
3
+ llmwiki = llmwiki.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Pratiyush
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
+ llmwiki
llmwiki/__init__.py ADDED
@@ -0,0 +1,71 @@
1
+ """llmwiki — LLM-powered knowledge base from Claude Code, Codex CLI, Cursor,
2
+ Gemini CLI, and Obsidian sessions.
3
+
4
+ Follows Andrej Karpathy's LLM Wiki pattern:
5
+ https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f
6
+
7
+ Public API:
8
+ - llmwiki.cli.main() — the command-line entry point
9
+ - llmwiki.convert.convert_all() — .jsonl → markdown
10
+ - llmwiki.build.build_site() — markdown → HTML
11
+ - llmwiki.graph.build_and_report() — knowledge graph
12
+ - llmwiki.exporters.export_all() — AI-consumable exports
13
+ - llmwiki.adapters.REGISTRY — adapter registry
14
+ - llmwiki.mcp.server.main() — MCP server (stdio)
15
+ """
16
+
17
+ __version__ = "2.2.0"
18
+ __author__ = "Alexander Makarov"
19
+ __license__ = "MIT"
20
+
21
+ from pathlib import Path
22
+
23
+ # Repo root (llmwiki/ clone), resolved from this file's location.
24
+ # Runtime vault/workspace routing is config-driven (see config_schedule +
25
+ # state_store); REPO_ROOT remains the codebase root for bundled assets.
26
+ REPO_ROOT = Path(__file__).resolve().parent.parent
27
+ PACKAGE_ROOT = Path(__file__).resolve().parent
28
+
29
+ # #arch-m4 (#617): the docstring above promised a "public API" but
30
+ # nothing was actually exported. Wire the listed symbols up as real
31
+ # re-exports so `from llmwiki import build_site` etc. actually works.
32
+ # Lazy via __getattr__ so importing llmwiki itself stays cheap (most
33
+ # CLI invocations don't touch the public API surface, just REPO_ROOT).
34
+ __all__ = [
35
+ "REPO_ROOT",
36
+ "PACKAGE_ROOT",
37
+ "__version__",
38
+ "main",
39
+ "convert_all",
40
+ "build_site",
41
+ "build_and_report",
42
+ "export_all",
43
+ "REGISTRY",
44
+ ]
45
+
46
+
47
+ def __getattr__(name: str):
48
+ """PEP 562 module-level lazy attribute access.
49
+
50
+ Lets `from llmwiki import build_site` resolve without paying for
51
+ the full transitive import graph at `import llmwiki` time.
52
+ """
53
+ if name == "main":
54
+ from llmwiki.cli import main # noqa: PLC0415 — lazy package __getattr__
55
+ return main
56
+ if name == "convert_all":
57
+ from llmwiki.convert import convert_all # noqa: PLC0415 — lazy package __getattr__
58
+ return convert_all
59
+ if name == "build_site":
60
+ from llmwiki.build import build_site # noqa: PLC0415 — lazy package __getattr__
61
+ return build_site
62
+ if name == "build_and_report":
63
+ from llmwiki.graph import build_and_report # noqa: PLC0415 — lazy package __getattr__
64
+ return build_and_report
65
+ if name == "export_all":
66
+ from llmwiki.exporters import export_all # noqa: PLC0415 — lazy package __getattr__
67
+ return export_all
68
+ if name == "REGISTRY":
69
+ from llmwiki.adapters import REGISTRY # noqa: PLC0415 — lazy package __getattr__
70
+ return REGISTRY
71
+ raise AttributeError(f"module 'llmwiki' has no attribute {name!r}")
llmwiki/__main__.py ADDED
@@ -0,0 +1,7 @@
1
+ """Allow `python3 -m llmwiki` to invoke the CLI."""
2
+ import sys
3
+
4
+ from llmwiki.cli import main
5
+
6
+ if __name__ == "__main__":
7
+ sys.exit(main())
@@ -0,0 +1,178 @@
1
+ """Canonical frontmatter parser (#273).
2
+
3
+ Historically 8 copies of this function lived scattered across the
4
+ codebase with slightly different return shapes — dict vs
5
+ ``(dict, body)`` tuple vs ``(str | None, body)``. Consolidating in
6
+ one hit is risky (every caller makes specific assumptions about the
7
+ return shape), so this module ships the canonical implementation plus
8
+ thin wrappers that match the three existing signatures. New call
9
+ sites should use :func:`parse_frontmatter` or
10
+ :func:`parse_frontmatter_dict`; legacy sites can migrate over time.
11
+
12
+ Stdlib-only. No YAML dependency — we parse the minimal subset of
13
+ YAML we use in practice (scalars, inline lists, inline dicts, block
14
+ lists with `- ` bullets).
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import re
20
+ from pathlib import Path
21
+ from typing import Any
22
+
23
+ # Accept LF, CRLF, or CR after each fence so Windows-authored (CRLF) and
24
+ # old-Mac (CR) files parse identically to LF input. The optional newline
25
+ # slots match the historical regex (`\n?(.*?)\n?---\n?`) so empty
26
+ # frontmatter (`---\n---\nbody`) still parses. BOM is handled separately
27
+ # in `_strip_bom()` before the regex runs. See #409, #423.
28
+ _FRONTMATTER_RE = re.compile(
29
+ r"^---[ \t]*(?:\r\n|\r|\n)?(.*?)(?:\r\n|\r|\n)?---[ \t]*(?:\r\n|\r|\n)?(.*)$",
30
+ re.DOTALL,
31
+ )
32
+
33
+
34
+ def _strip_bom(text: str) -> str:
35
+ """Strip leading UTF-8 BOM if present (#423)."""
36
+ if text and text[0] == "\ufeff":
37
+ return text[1:]
38
+ return text
39
+
40
+
41
+ def parse_frontmatter(text: str) -> tuple[dict[str, Any], str]:
42
+ """Return ``(meta, body)`` — the canonical shape.
43
+
44
+ Empty or malformed input returns ``({}, text)`` so callers can
45
+ treat every file uniformly. Handles UTF-8 BOM and CR/LF/CRLF
46
+ line endings transparently.
47
+ """
48
+ text = _strip_bom(text)
49
+ m = _FRONTMATTER_RE.match(text)
50
+ if not m:
51
+ return {}, text
52
+ meta_text = m.group(1)
53
+ body = m.group(2)
54
+ meta: dict[str, Any] = {}
55
+ for line in meta_text.splitlines():
56
+ mm = re.match(r"^([a-zA-Z_][\w-]*):\s*(.*)$", line)
57
+ if not mm:
58
+ continue
59
+ key, raw = mm.group(1), mm.group(2).strip()
60
+ meta[key] = _parse_scalar(raw)
61
+ return meta, body
62
+
63
+
64
+ def is_subagent(meta: dict[str, Any], path: Path) -> bool:
65
+ """Return True iff a session is a sub-agent run (#406 / #492 / #30).
66
+
67
+ Prefers the adapter-written ``is_subagent`` frontmatter field (canonical
68
+ contract since #406), accepting it as a real bool or one of the
69
+ case-insensitive strings ``"true"``/``"false"`` since frontmatter parsers
70
+ historically coerced inconsistently. Falls back to the legacy
71
+ ``"subagent" in path.name`` substring check ONLY when the field is missing
72
+ — needed to keep pre-#406 raw files (no field) classified correctly until
73
+ they're re-synced. The renderer renames sub-agent slugs to
74
+ ``<slug>-subagent-<id>``, so the substring match is correct on canonically
75
+ renamed files even when meta is absent.
76
+
77
+ Single source of truth for both ``build`` (HTML session counts) and the
78
+ synth pipeline (``include_subagents`` backlog policy).
79
+ """
80
+ raw = meta.get("is_subagent")
81
+ if isinstance(raw, bool):
82
+ return raw
83
+ if isinstance(raw, str):
84
+ s = raw.strip().lower()
85
+ if s in ("true", "yes", "1"):
86
+ return True
87
+ if s in ("false", "no", "0"):
88
+ return False
89
+ return "subagent" in path.name
90
+
91
+
92
+ def is_headless(meta: dict[str, Any]) -> bool:
93
+ """True when this session was an automated ``claude -p`` / SDK run.
94
+
95
+ Reads the ``is_headless`` flag the converter records, tolerating the same
96
+ string/bool spellings as :func:`is_subagent`, and falls back to the raw
97
+ ``entrypoint`` / ``promptSource`` markers when only those were written.
98
+
99
+ Absent every marker this returns False rather than guessing from message
100
+ counts. Files converted before the flag existed therefore read as "not
101
+ headless" — a deliberate choice, since silently reclassifying an old
102
+ session as machine noise is worse than leaving it in the backlog where
103
+ it is visible. Re-sync (or prune) to classify legacy files.
104
+
105
+ Single source of truth for the synth pipeline's headless backlog policy.
106
+ """
107
+ raw = meta.get("is_headless")
108
+ if isinstance(raw, bool):
109
+ return raw
110
+ if isinstance(raw, str):
111
+ s = raw.strip().lower()
112
+ if s in ("true", "yes", "1"):
113
+ return True
114
+ if s in ("false", "no", "0"):
115
+ return False
116
+ entrypoint = meta.get("entrypoint")
117
+ if isinstance(entrypoint, str) and entrypoint.strip().lower().startswith("sdk-"):
118
+ return True
119
+ prompt_source = meta.get("promptSource")
120
+ return isinstance(prompt_source, str) and prompt_source.strip().lower() == "sdk"
121
+
122
+
123
+ def parse_frontmatter_dict(text: str) -> dict[str, Any]:
124
+ """Return just the metadata dict — convenience for callers that
125
+ don't need the body."""
126
+ return parse_frontmatter(text)[0]
127
+
128
+
129
+ def parse_frontmatter_or_none(text: str) -> tuple[str | None, str]:
130
+ """Return ``(raw_frontmatter_text | None, body)`` — legacy shape
131
+ used by ``llmwiki/tags.py`` which does its own line-level parsing
132
+ inside the frontmatter block."""
133
+ text = _strip_bom(text)
134
+ m = _FRONTMATTER_RE.match(text)
135
+ if not m:
136
+ return None, text
137
+ return m.group(1), m.group(2)
138
+
139
+
140
+ def _parse_scalar(raw: str, *, coerce_bool: bool = True) -> Any:
141
+ """Parse a single YAML scalar value (best-effort, no external deps).
142
+
143
+ Handles: inline lists ``[a, b, c]``, quoted strings, bools, ints.
144
+ Everything else comes back as the stripped string.
145
+
146
+ #py-l1 (#599): pass ``coerce_bool=False`` when recursing into list
147
+ items so a tag list like ``[no, yes, maybe]`` doesn't become
148
+ ``[False, True, "maybe"]``. Top-level scalars still coerce.
149
+ """
150
+ s = raw.strip()
151
+ if not s:
152
+ return ""
153
+ # Quoted string
154
+ if (s.startswith('"') and s.endswith('"')) or (s.startswith("'") and s.endswith("'")):
155
+ return s[1:-1]
156
+ # Inline list: [a, b, c]
157
+ if s.startswith("[") and s.endswith("]"):
158
+ body = s[1:-1].strip()
159
+ if not body:
160
+ return []
161
+ return [_parse_scalar(x, coerce_bool=False) for x in body.split(",")]
162
+ # Bool
163
+ low = s.lower()
164
+ if coerce_bool and low in {"true", "yes"}:
165
+ return True
166
+ if coerce_bool and low in {"false", "no"}:
167
+ return False
168
+ # Int
169
+ try:
170
+ return int(s)
171
+ except ValueError:
172
+ pass
173
+ # Float
174
+ try:
175
+ return float(s)
176
+ except ValueError:
177
+ pass
178
+ return s