name: llm-wiki version: 0.6.0 description: | Build, query, and maintain a personal LLM-powered wiki from a local knowledge base. Features three distinct modes: Ingest (add knowledge), Query (ask questions with auto-enhancement), and Lint+Heal (health check + auto-repair). Query mode includes full knowledge compounding loop (Tier 1-3): automatic logging, smart enhancement (A/B/C/D types), and periodic review with query pattern analysis and archiving. Supports multiple knowledge source directories, automatic Quartz initialization, and GitHub Pages sync. allowed-tools:
- Bash
- Read
- Write
- Edit
- Glob
- Grep
- AskUserQuestion
- WebSearch
- WebFetch
- Skill
- Agent
/llm-wiki — LLM Wiki Manager
Build and maintain a personal knowledge wiki following the LLM Wiki pattern by Andrej Karpathy.
Phase 0: Startup Check (ALWAYS RUN FIRST)
Before doing anything else, check if the skill has been configured:
Read the file: ~/.claude/skills/llm-wiki/config.md
-
If the file exists AND
configured: trueis in the frontmatter: Parse the config and proceed to Phase 1 (Intent Routing). Extract:SOURCE_DIRS: list of paths under "## Source Directories"WIKI_DIR: path under "## Wiki Directory"GITHUB_PAGES: URL under "## GitHub Pages" (may be empty)
-
If the file does not exist OR
configured: trueis missing: Run the First-Time Setup Wizard below before proceeding.
First-Time Setup Wizard
Greet the user and explain this is a one-time setup. Run these three steps in order:
Setup Step 1: Dependency Check
Run the following checks silently:
node --version 2>/dev/null
git --version 2>/dev/null
-
If Node.js is not found or version is below v18:
❌ 未检测到 Node.js(v18 或以上)。 请先安装:https://nodejs.org 安装完成后,重新运行 /llm-wiki 继续配置。Stop here. Do not proceed until the user resolves this.
-
If Git is not found:
❌ 未检测到 Git。 请先安装:https://git-scm.com 安装完成后,重新运行 /llm-wiki 继续配置。Stop here.
-
If both are found, tell the user:
✅ 环境检查通过(Node.js vX.X.X,Git vX.X.X)
Setup Step 2: Knowledge Base Directories
Ask the user:
请输入你的知识库目录路径。
支持多个目录,每行输入一个。输入完成后告诉我。
例如:
/Users/yourname/Obsidian/Raw
/Users/yourname/Obsidian/Learning
For each path the user provides:
- Verify it exists:
ls "{path}" 2>/dev/null - If it does not exist, warn:
⚠️ 路径不存在:{path},请确认后重新输入 - Ask user to confirm the final list before saving
Setup Step 3: Wiki Directory
Ask the user:
Wiki 要保存在哪个目录?
如果目录不存在,我会自动帮你初始化一个新的 Quartz 项目。
例如:/Users/yourname/MyWiki
After the user provides the path:
Case A — Directory already exists and contains a Quartz project (check for quartz.config.ts):
✅ 检测到已有的 Quartz Wiki 项目,直接使用。
Case B — Directory does not exist or is empty:
📦 正在初始化 Quartz Wiki 项目,请稍候...
Run the following to initialize:
git clone https://github.com/jackyzha0/quartz.git "{WIKI_DIR}"
cd "{WIKI_DIR}"
npm install
Then apply the standard wiki configuration:
- Set
pageTitleto"LLM Wiki"inquartz.config.ts - Create
content/index.mdwith a basic welcome page - Create
content/log.mdwith initial entry - Create
SCHEMA.md(copy the standard schema — see Schema section below)
Tell the user when done: ✅ Quartz Wiki 初始化完成:{WIKI_DIR}
Setup Step 4: GitHub Pages (Optional)
Ask the user:
(选填)你的 GitHub Pages 地址是什么?
格式如:https://username.github.io/LLMWiki
直接回车跳过。
Save Config
Write the collected values to ~/.claude/skills/llm-wiki/config.md:
---
configured: true
---
# LLM Wiki 配置文件
此文件由 /llm-wiki 首次运行向导自动生成。如需修改,直接编辑对应字段即可。
## Source Directories
# 知识库目录(支持多个路径,每行一个)
- {path1}
- {path2}
## Wiki Directory
{wiki_dir}
## GitHub Pages
{github_pages_url}
Tell the user: ✅ 配置已保存!下次运行 /llm-wiki 将直接使用这些设置。
Then proceed to Phase 1 (Intent Routing).
Phase 1: Intent Routing
Read {WIKI_DIR}/content/index.md to understand the current wiki structure, then determine the user's intent from their input:
- Asking a question about existing knowledge → Go to Query Flow
- Requesting cleanup, health check, or gap finding → Go to Lint Flow
- Providing a topic to research or new sources → Go to Ingest Flow
If the intent is ambiguous, ask the user which of the three operations they want to perform.
Ingest Flow (Knowledge Building)
Step 1: Topic Resolution
Based on the user's input and index.md, determine if this is a new topic or relates to an existing one:
- Clearly a new topic: Tell the user and prepare to create a new topic directory.
- Clearly related to an existing topic: Tell the user "这与已有话题 [Topic Name] 相关,准备补充资料。"
- Ambiguous: Present the closest 1-2 existing topics and ask: 新建新话题,还是补充到现有话题中?
Step 2: Scope Clarification
Ask the user (concisely, max 2 rounds):
- Mode: 批量模式(一次处理完,结束后再看结果)or 精读模式(每个资料处理完暂停确认)?
- Focus: 有没有特别想深入的方向,或偏好的资料类型?
Step 3: Source Discovery
Scan all SOURCE_DIRS for relevant files:
find "{source_dir}" -type f \( -name "*.md" -o -name "*.pdf" -o -name "*.png" -o -name "*.jpg" -o -name "*.jpeg" -o -name "*.webp" \) 2>/dev/null
Run this for each directory in SOURCE_DIRS. Merge results, filter by relevance, present to user grouped by type (MD / PDF / Image), and ask for confirmation.
Threshold rules:
- < 3 files: Proactively suggest web search for supplementary materials
- 3–9 files: Offer web search as an option
- ≥ 10 files: Proceed directly, optionally offer enrichment
Step 4: Wiki Construction
Read {WIKI_DIR}/SCHEMA.md FIRST to strictly follow page format and wikilink rules.
CRITICAL: Bilingual Content Generation (Default Behavior)
All wiki pages MUST be generated in bilingual format (English + Chinese) by default. For each paragraph:
- Write the English content first
- Immediately translate to Chinese using the configured translation engine
- Append the translation as:
<div class="zh-trans">中文翻译</div>
Translation Engine Selection:
Read ~/.claude/skills/llm-wiki/config.md to get translation settings:
primary_engine: First choice (zhipu/deepl/minimax)fallback_engine: Backup if primary fails- If both fail, log error and continue with English-only
Translation Rules:
- Preserve technical terms in English: Agent, Harness, CLI, LLM, SDK, API, RAG, MCP, etc.
- Keep proper nouns, product names, and code identifiers untranslated
- Translate naturally for Chinese technical documentation style
- Do NOT translate: frontmatter, code blocks, URLs, wikilinks
GLM-5 Translation Function (Zhipu AI):
def translate_paragraph(text: str, api_key: str, endpoint: str) -> str:
"""Translate using GLM-5 via Anthropic-compatible API."""
prompt = f"""请将以下英文技术文本翻译成中文。要求:
1. 技术术语保持英文(如 Agent、Harness、CLI、LLM、SDK、API 等)
2. 翻译自然流畅,符合中文技术文档习惯
3. 只输出翻译结果,不要任何解释
{text}"""
payload = {
"model": "GLM-5",
"max_tokens": 2000,
"messages": [{"role": "user", "content": prompt}]
}
req = urllib.request.Request(
endpoint,
data=json.dumps(payload).encode(),
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
)
try:
with urllib.request.urlopen(req, timeout=30) as response:
result = json.loads(response.read())
return result["content"][0]["text"].strip()
except Exception as e:
# Log error and return empty (fallback to English-only)
print(f"Translation failed: {e}")
return ""
Batch mode: Process all sources at once, generate all pages in bilingual format, then show the user a summary.
Deep-read mode: Process one source at a time, generate bilingual content, show the result, wait for feedback, then proceed to the next.
For each source:
- Generate a bilingual source summary page in
{WIKI_DIR}/content/{topic}/sources/ - Create or update bilingual concept pages in
{WIKI_DIR}/content/{topic}/concepts/ - Create or update bilingual entity pages in
{WIKI_DIR}/content/{topic}/entities/ - Create bilingual synthesis pages for cross-cutting insights in
{WIKI_DIR}/content/{topic}/synthesis/ - Write or update bilingual
{WIKI_DIR}/content/{topic}/overview.md - Update
{WIKI_DIR}/content/index.md - Append to
{WIKI_DIR}/content/log.mdusing format:## [YYYY-MM-DD] ingest | {topic} | {source_title}
Wikilink rule (CRITICAL): Always use full paths from the content root:
- ✅
[[topic-name/concepts/concept-name|Display Text]] - ❌
[[concepts/concept-name|Display Text]]
Step 5: Build & Preview
cd "{WIKI_DIR}" && npx quartz build
Then start the local server:
cd "{WIKI_DIR}" && python3 serve.py
Tell the user: Wiki 已构建完成,本地预览地址:http://localhost:8888
If serve.py does not exist in the wiki directory, create it first using the standard clean-URL server template.
Offer to sync to GitHub Pages if GITHUB_PAGES is configured.
Query Flow (Asking Questions)
-
Search: Read
{WIKI_DIR}/content/index.md, identify relevant pages, read them. -
Answer: Synthesize a comprehensive answer with citations.
-
Auto-log: Automatically record this query to
{WIKI_DIR}/query-stats.json:{ "timestamp": "2026-04-06T14:23:45Z", "query": "{user_question}", "pages_consulted": ["{page1}", "{page2}"], "tokens_generated": {estimated_tokens}, "enhancement_type": null, "action_taken": "answered only" }If the file doesn't exist, create it as an empty array
[]first. -
Evaluate enhancement: Check if this query meets quality thresholds:
- ≥3 pages consulted, OR
-
500 tokens generated, OR
- Reveals contradiction/gap between pages
If threshold met, determine enhancement type:
- A: New synthesis page (comprehensive cross-page analysis)
- B: Enhance existing page (found missing content in a concept page)
- C: Add cross-reference (found related pages without wikilinks)
- D: Log knowledge gap (cannot answer sufficiently)
-
Execute enhancement:
C-type (auto):
- Add wikilink to the Connections section of the relevant page
- Update the query-stats.json entry with
"enhancement_type": "C"and"action_taken": "added cross-reference between {page1} and {page2}" - Briefly note at end of answer:
[已自动添加 {page1} ↔ {page2} 的交叉引用]
D-type (auto):
- Append to
{WIKI_DIR}/knowledge-gaps.md(create if doesn't exist):## [YYYY-MM-DD] {topic} - 问题:{user_question} - 原因:Wiki 中缺少相关内容 - 建议:联网搜索补充相关概念 - Update query-stats.json entry with
"enhancement_type": "D"and"action_taken": "logged knowledge gap" - Briefly note:
[已将此问题记录到知识空白清单,供下次 Lint 时补充]
A-type (confirm):
- Ask user:
💡 这个分析综合了 {N} 个页面,生成了 {X} tokens 的深度对比。 建议创建新的 synthesis 页面:{topic}/synthesis/{slug}.md 是否保存?(y/n) - If yes: create page following SCHEMA.md format, update index.md, append to log.md, update query-stats.json with
"enhancement_type": "A"and"action_taken": "created synthesis/{filename}" - If no: update query-stats.json with
"enhancement_type": "A"and"action_taken": "user declined"
B-type (confirm):
- Ask user:
💡 发现 {page} 缺少关于 {topic} 的内容。 建议追加新小节:## {section_title} 是否保存?(y/n) - If yes: append section to page, append to log.md, update query-stats.json with
"enhancement_type": "B"and"action_taken": "enhanced {page} with new section" - If no: update query-stats.json with
"enhancement_type": "B"and"action_taken": "user declined"
Lint + Heal Flow (Wiki Health Check & Auto-Repair)
Phase 1: Scan (fully automatic)
Read ALL markdown files under {WIKI_DIR}/content/. Check five issue types:
1. Broken links (all pages)
Collect every [[wikilink]] in every page. For each, check whether the target file exists under content/. Flag any that don't.
2. Orphan pages (all pages) Find pages that have zero inbound wikilinks from any other page. Sources being orphaned is lower severity than concepts or synthesis.
3. Missing concept pages (all pages)
Scan all page bodies for noun phrases that appear ≥ 2 times across the wiki but have no corresponding page in any concepts/ directory. Limit to top 5 most-mentioned missing concepts.
4. Contradictions (concepts + synthesis pages)
Compare factual claims across concepts/ and synthesis/ pages. Flag direct conflicts (e.g., page A says X is true, page B says X is false).
5. Knowledge gaps (whole wiki) Identify 2–3 specific questions the wiki currently cannot answer based on its coverage. Frame as questions, not vague topics.
Stale content check (run alongside scan):
Find any paragraph or page that contains ⚠️ 待验证 AND was last modified more than 180 days ago. Add to report as "建议复核".
6. Query pattern analysis (Tier 3 of knowledge compounding loop):
Read {WIKI_DIR}/query-stats.json if it exists:
- Count queries by topic/theme
- Identify high-frequency topics (≥3 queries on same topic)
- Find repeated questions that Wiki cannot answer well
- Example: if "cost optimization" was queried 3+ times but no related pages exist, flag it
7. Query archive check:
Check the oldest timestamp in query-stats.json:
- If oldest record is >180 days old, flag for archiving
- Archive target:
query-stats-archive-YYYY-QN.json(by quarter) - Keep only recent 180 days in query-stats.json
Phase 2: Report
Present findings grouped by severity. Use this format:
📋 Wiki 健康报告 — YYYY-MM-DD
扫描了 N 个页面
🔴 断链(N处)
- {page} 第{n}行 → [[{target}]] 不存在
🟡 孤立页(N处)
- {page} — 没有任何页面链接到它
🟡 缺少概念页(N个)
- "{concept}" — 在 N 个页面中被提到,但没有概念页
🟠 矛盾(N处)
- {page A} 与 {page B} 关于"{topic}"的说法冲突
🔵 知识空白(Wiki 目前无法回答)
1. {question}
2. {question}
⏰ 建议复核(⚠️标记超过180天)
- {page} — 标记于 {date}
📊 Query 模式分析(基于 N 次查询记录)
高频主题(≥3次):
- "{topic}" — 被问了 N 次,Wiki 中缺少相关页面
建议补充的问题:
- "{question}"(来自 knowledge-gaps.md)
⏰ Query 记录归档建议
- 最早记录:YYYY-MM-DD(距今 X 天)
- 建议归档 180 天前的记录到:query-stats-archive-YYYY-QN.json
Phase 3: Confirm what to fix
After the report, present three fix categories and ask the user which to execute:
是否需要修复?请告诉我要做哪些,或直接说「全做」/「只做A」:
【A 类 — 自动修复,不需联网】
A1. 删除/注释 N 处断链 wikilink
A2. 为 N 个孤立页在最相关页面补入链
【B 类 — 联网补充】
B1. 为"{concept}"生成新概念页(需联网搜索)
B2. 填补知识空白:"{question}"(需联网搜索)
B3. 补充高频 Query 主题:"{topic}"(需联网搜索)
【C 类 — Query 数据维护】
C1. 归档 180 天前的 query 记录 → query-stats-archive-YYYY-QN.json
Wait for user confirmation before proceeding.
Phase 4: Heal Execution
A-type fixes (no web search)
A1 — Broken links:
- If the target page clearly doesn't exist and can't be inferred: remove the wikilink brackets, keep plain text.
- If a similar page exists (typo or path issue): correct the wikilink path.
A2 — Orphan pages:
- Read the orphan page's content to understand its topic.
- Find the 1–2 most related pages in the wiki.
- Add a brief mention + wikilink to the orphan from those pages (append to a "Related" or "See also" section).
B-type fixes (web search required)
For each B-type item, follow this pipeline strictly:
Step 1 — Search
WebSearch("{concept or question} site:arxiv.org OR site:anthropic.com OR site:github.com OR site:huggingface.co OR site:paperswithcode.com")
If results are thin, retry without domain filter.
Step 2 — Filter by trusted domains Prioritize results from (in order):
- arxiv.org / aclanthology.org — academic papers
- anthropic.com / openai.com / deepmind.com — primary sources
- github.com — official repos
- huggingface.co / paperswithcode.com
Deprioritize: blogs, social media, aggregators.
Step 3 — Fetch full content
Use baoyu-url-to-markdown skill on the top 2–3 URLs to get full page content.
Step 4 — Cross-validate
- If a key fact appears in ≥ 2 independent sources → write it as a direct statement.
- If a key fact appears in only 1 source → write it with
⚠️ 待验证marker.
Step 5 — Write to wiki (BILINGUAL)
CRITICAL: All new content MUST be bilingual.
For missing concept pages (B1):
Create {WIKI_DIR}/content/{topic}/concepts/{concept-slug}.md following SCHEMA.md format.
- Write each paragraph in English first
- Immediately translate using GLM-5 and append
<div class="zh-trans">中文翻译</div> - Append at the bottom:
---
*Sources added by Heal on YYYY-MM-DD:*
- [Title](url) · YYYY-MM
- [Title](url) · YYYY-MM
For knowledge gaps (B2): If the answer fits an existing page, append a new bilingual section to that page. If the answer is broad enough, create a new bilingual synthesis page. Always append source citations in the same format above.
Never overwrite existing content. Only append new sections or create new pages.
C-type fixes (query data maintenance)
C1 — Archive old query records:
- Read
{WIKI_DIR}/query-stats.json - Split records into two groups:
recent: timestamp within last 180 daysold: timestamp older than 180 days
- If
oldis empty: tell user "没有需要归档的记录(最早记录距今不足180天)" - If
oldhas records:- Determine archive filename by quarter of oldest record:
- Q1: Jan-Mar →
query-stats-archive-YYYY-Q1.json - Q2: Apr-Jun →
query-stats-archive-YYYY-Q2.json - Q3: Jul-Sep →
query-stats-archive-YYYY-Q3.json - Q4: Oct-Dec →
query-stats-archive-YYYY-Q4.json
- Q1: Jan-Mar →
- Write
oldrecords to archive file (append if file exists, create if not) - Write
recentrecords back toquery-stats.json - Tell user: "已归档 {N} 条记录到 {archive_filename},query-stats.json 保留最近 {M} 条"
- Determine archive filename by quarter of oldest record:
B3 — Supplement high-frequency query topics:
- Same pipeline as B1/B2 (web search → validate → write to wiki)
- Target: create a new concept or synthesis page for the high-frequency topic
- Use the original queries as context to understand what the user wants to know
Phase 5: Wrap up
After all fixes are applied:
- Run
npx quartz buildto rebuild the wiki. - Append to
log.md:
## [YYYY-MM-DD] lint+heal | 断链:{n}处, 孤立页:{n}个, 新建概念页:{list}, 填补空白:{list}, 归档query:{n}条
- Show the user a summary of everything changed.
Standard serve.py Template
If {WIKI_DIR}/serve.py does not exist during Step 5, create it with this content:
import http.server
import os
import sys
DIRECTORY = os.path.join(os.path.dirname(os.path.abspath(__file__)), "public")
PORT = 8888
class CleanURLHandler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=DIRECTORY, **kwargs)
def do_GET(self):
path = self.path.split("?")[0].split("#")[0]
full = os.path.join(DIRECTORY, path.lstrip("/"))
if not os.path.exists(full):
if os.path.exists(full + ".html"):
self.path = path + ".html"
elif os.path.exists(os.path.join(full, "index.html")):
self.path = path + "/index.html"
else:
if os.path.exists(os.path.join(DIRECTORY, "404.html")):
self.path = "/404.html"
super().do_GET()
def log_message(self, format, *args):
pass
with http.server.HTTPServer(("", PORT), CleanURLHandler) as httpd:
print(f"Serving at http://localhost:{PORT}")
httpd.serve_forever()
Important Rules
- Use Chinese for all user-facing communication.
- All wiki content MUST be bilingual (English + Chinese) by default. Each English paragraph followed by
<div class="zh-trans">中文翻译</div>. - Translation engine priority: read from config.md (primary_engine → fallback_engine).
- NEVER modify files in the user's source/knowledge-base directories — they are read-only.
- All writes go to
{WIKI_DIR}. - Always update
index.mdandlog.mdafter every operation. - Read
SCHEMA.mdbefore generating any wiki pages.
Priorisation de Tâches
Productivite
Priorise vos tâches avec les frameworks Eisenhower, ICE et RICE.
Generateur de Rapport Hebdomadaire
Productivite
Generez des rapports de statut hebdomadaires structures et concis.
Rapport de Daily Standup
Productivite
Génère des rapports de daily standup structurés et concis.