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.
- llm_wiki_plus-2.2.0.dist-info/METADATA +176 -0
- llm_wiki_plus-2.2.0.dist-info/RECORD +169 -0
- llm_wiki_plus-2.2.0.dist-info/WHEEL +5 -0
- llm_wiki_plus-2.2.0.dist-info/entry_points.txt +3 -0
- llm_wiki_plus-2.2.0.dist-info/licenses/LICENSE +21 -0
- llm_wiki_plus-2.2.0.dist-info/top_level.txt +1 -0
- llmwiki/__init__.py +71 -0
- llmwiki/__main__.py +7 -0
- llmwiki/_frontmatter.py +178 -0
- llmwiki/_system_pages.py +72 -0
- llmwiki/adapter_config.py +123 -0
- llmwiki/adapters/__init__.py +141 -0
- llmwiki/adapters/base.py +334 -0
- llmwiki/adapters/claude_code.py +92 -0
- llmwiki/adapters/codex_cli.py +237 -0
- llmwiki/adapters/contrib/__init__.py +1 -0
- llmwiki/adapters/contrib/chatgpt.py +262 -0
- llmwiki/adapters/contrib/copilot_chat.py +130 -0
- llmwiki/adapters/contrib/copilot_cli.py +124 -0
- llmwiki/adapters/contrib/cursor_cli.py +300 -0
- llmwiki/adapters/contrib/cursor_ide.py +459 -0
- llmwiki/adapters/contrib/cursor_slug.py +11 -0
- llmwiki/adapters/contrib/gemini_cli.py +82 -0
- llmwiki/adapters/contrib/obsidian.py +129 -0
- llmwiki/adapters/contrib/openclaw.py +183 -0
- llmwiki/adapters/contrib/opencode.py +175 -0
- llmwiki/adapters/settings.py +133 -0
- llmwiki/adapters/status.py +103 -0
- llmwiki/add_doc.py +1050 -0
- llmwiki/agent_kit/__init__.py +35 -0
- llmwiki/agent_kit/commands/wiki-all.md +47 -0
- llmwiki/agent_kit/commands/wiki-build.md +15 -0
- llmwiki/agent_kit/commands/wiki-candidates.md +71 -0
- llmwiki/agent_kit/commands/wiki-graph.md +52 -0
- llmwiki/agent_kit/commands/wiki-ingest.md +59 -0
- llmwiki/agent_kit/commands/wiki-init.md +12 -0
- llmwiki/agent_kit/commands/wiki-lint.md +29 -0
- llmwiki/agent_kit/commands/wiki-query.md +30 -0
- llmwiki/agent_kit/commands/wiki-reflect.md +53 -0
- llmwiki/agent_kit/commands/wiki-sync.md +30 -0
- llmwiki/agent_kit/commands/wiki-synth.md +46 -0
- llmwiki/agent_kit/commands/wiki-update.md +41 -0
- llmwiki/agent_kit/skills/llmwiki-ingest/SKILL.md +81 -0
- llmwiki/agent_kit/skills/llmwiki-query/SKILL.md +64 -0
- llmwiki/agent_kit/skills/llmwiki-sync/SKILL.md +102 -0
- llmwiki/agent_kit/skills/wiki-all/SKILL.md +59 -0
- llmwiki/agent_label.py +104 -0
- llmwiki/automation_install.py +597 -0
- llmwiki/automation_plan.py +209 -0
- llmwiki/automation_status.py +48 -0
- llmwiki/backlinks.py +223 -0
- llmwiki/build.py +3475 -0
- llmwiki/cache.py +333 -0
- llmwiki/candidates.py +1080 -0
- llmwiki/candidates_harvest.py +542 -0
- llmwiki/candidates_site.py +838 -0
- llmwiki/categories.py +156 -0
- llmwiki/changelog_timeline.py +427 -0
- llmwiki/claude_path.py +55 -0
- llmwiki/cli.py +3353 -0
- llmwiki/completion.py +190 -0
- llmwiki/confidence.py +177 -0
- llmwiki/config_schedule.py +147 -0
- llmwiki/configure_sources.py +400 -0
- llmwiki/context_md.py +182 -0
- llmwiki/convert.py +2147 -0
- llmwiki/cron_spec.py +502 -0
- llmwiki/docs_pages.py +817 -0
- llmwiki/exporters.py +516 -0
- llmwiki/format_numbers.py +26 -0
- llmwiki/freshness.py +158 -0
- llmwiki/graph.py +788 -0
- llmwiki/graphify_bridge.py +537 -0
- llmwiki/htmlmd.py +202 -0
- llmwiki/ingest_queue.py +105 -0
- llmwiki/install_agent_kit.py +330 -0
- llmwiki/install_hint.py +139 -0
- llmwiki/lifecycle.py +166 -0
- llmwiki/link_checker.py +148 -0
- llmwiki/lint/__init__.py +308 -0
- llmwiki/lint/report.py +132 -0
- llmwiki/lint/rules/__init__.py +69 -0
- llmwiki/lint/rules/_helpers.py +119 -0
- llmwiki/lint/rules/claim_verification.py +40 -0
- llmwiki/lint/rules/content_freshness.py +41 -0
- llmwiki/lint/rules/contradiction_detection.py +157 -0
- llmwiki/lint/rules/duplicate_detection.py +164 -0
- llmwiki/lint/rules/frontmatter_completeness.py +47 -0
- llmwiki/lint/rules/frontmatter_count_consistency.py +61 -0
- llmwiki/lint/rules/frontmatter_validity.py +63 -0
- llmwiki/lint/rules/index_sync.py +68 -0
- llmwiki/lint/rules/link_integrity.py +82 -0
- llmwiki/lint/rules/orphan_detection.py +68 -0
- llmwiki/lint/rules/provenance_integrity.py +109 -0
- llmwiki/lint/rules/stale_candidates.py +59 -0
- llmwiki/lint/rules/stale_reference_detection.py +42 -0
- llmwiki/lint/rules/stub_source_pages.py +55 -0
- llmwiki/lint/rules/summary_accuracy.py +28 -0
- llmwiki/lint/rules/tags_topics_convention.py +58 -0
- llmwiki/lint/rules/tools_consistency.py +65 -0
- llmwiki/log_reader.py +128 -0
- llmwiki/manifest.py +132 -0
- llmwiki/mcp/__init__.py +29 -0
- llmwiki/mcp/__main__.py +5 -0
- llmwiki/mcp/server.py +1465 -0
- llmwiki/migrate_broken_provenance.py +463 -0
- llmwiki/migrate_page_kinds.py +343 -0
- llmwiki/migrate_topic_kinds.py +472 -0
- llmwiki/model_pricing.csv +13 -0
- llmwiki/models_page.py +279 -0
- llmwiki/obsidian_output.py +205 -0
- llmwiki/pipeline.py +411 -0
- llmwiki/pipeline_lock.py +108 -0
- llmwiki/project_topics.py +201 -0
- llmwiki/py.typed +0 -0
- llmwiki/quarantine.py +274 -0
- llmwiki/queue.py +29 -0
- llmwiki/queue_ops.py +193 -0
- llmwiki/raw_docs_site.py +505 -0
- llmwiki/references.py +244 -0
- llmwiki/reindex.py +499 -0
- llmwiki/remove_doc.py +304 -0
- llmwiki/render/__init__.py +20 -0
- llmwiki/render/collapse_section.py +76 -0
- llmwiki/render/css.py +1221 -0
- llmwiki/render/data.py +43 -0
- llmwiki/render/docs_css.py +473 -0
- llmwiki/render/graph_viewer.py +677 -0
- llmwiki/render/js.py +1902 -0
- llmwiki/schema.py +264 -0
- llmwiki/search_facets.py +138 -0
- llmwiki/search_tree.py +185 -0
- llmwiki/session_ready.py +235 -0
- llmwiki/skill_installer.py +111 -0
- llmwiki/slugs.py +198 -0
- llmwiki/source_checkout.py +56 -0
- llmwiki/source_topics.py +142 -0
- llmwiki/state_store.py +459 -0
- llmwiki/sync/__init__.py +13 -0
- llmwiki/sync/lookback.py +101 -0
- llmwiki/sync/status.py +137 -0
- llmwiki/synth/__init__.py +14 -0
- llmwiki/synth/base.py +190 -0
- llmwiki/synth/claude_cli.py +328 -0
- llmwiki/synth/estimate.py +609 -0
- llmwiki/synth/ollama.py +404 -0
- llmwiki/synth/pipeline.py +1813 -0
- llmwiki/synth/reporting.py +119 -0
- llmwiki/tag_utils.py +68 -0
- llmwiki/tags.py +360 -0
- llmwiki/topics.py +425 -0
- llmwiki/topics_consolidate.py +208 -0
- llmwiki/topics_page.py +571 -0
- llmwiki/trace.py +605 -0
- llmwiki/usage.py +1077 -0
- llmwiki/vault.py +345 -0
- llmwiki/vault_settings.py +130 -0
- llmwiki/vendor/NOTICE +38 -0
- llmwiki/vendor/github-dark.min.css +10 -0
- llmwiki/vendor/github.min.css +10 -0
- llmwiki/vendor/highlight.min.js +1213 -0
- llmwiki/vendor/vis-network.min.js +34 -0
- llmwiki/viz_heatmap.py +363 -0
- llmwiki/viz_tokens.py +423 -0
- llmwiki/viz_tools.py +241 -0
- llmwiki/viz_wiki_value.py +311 -0
- llmwiki/watch.py +292 -0
- llmwiki/wiki_adoption.py +131 -0
- 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)
|
|
60
|
+
[](https://www.python.org/)
|
|
61
|
+
[](CHANGELOG.md)
|
|
62
|
+
[](https://github.com/AlexanderMakarov/llm-wiki/actions/workflows/ci.yml)
|
|
63
|
+
[](https://github.com/AlexanderMakarov/llm-wiki/actions/workflows/link-check.yml)
|
|
64
|
+
[](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,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
llmwiki/_frontmatter.py
ADDED
|
@@ -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
|