From f9db36bc384c229d340c9fbc562d60f3447cec09 Mon Sep 17 00:00:00 2001 From: weishen Date: Thu, 16 Apr 2026 16:55:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 155 ++++- tools/manifest.json | 1454 +++++++++++++++++++++++++++++++++++++++++++ tools/sync.py | 385 ++++++------ 3 files changed, 1812 insertions(+), 182 deletions(-) create mode 100644 tools/manifest.json diff --git a/CLAUDE.md b/CLAUDE.md index 8fc63ef..4747487 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -47,12 +47,13 @@ Transformer(变压器模型,一种基于注意力机制的神经网络架构 # Slash Commands(Claude Code) -| Command | 使用方式 | -| -------------- | --------------------------- | -| `/wiki-ingest` | `ingest raw/your-file.md` | -| `/wiki-query` | `query: 你的问题` | -| `/wiki-lint` | `lint the wiki` | -| `/wiki-graph` | `build the knowledge graph` | +| Command | 使用方式 | +| -------------- | ------------------------------ | +| `/wiki-ingest` | `ingest raw/your-file.md` | +| `/wiki-query` | `query: 你的问题` | +| `/wiki-lint` | `lint the wiki` | +| `/wiki-graph` | `build the knowledge graph` | +| `/wiki-sync` | `python tools/sync.py --check` 预览,`--sync` 执行 | --- @@ -117,6 +118,12 @@ last_updated: YYYY-MM-DD 1. 使用 Read 工具完整读取 source 文档 2. 读取 `wiki/index.md` 和 `wiki/overview.md` 3. 生成 `wiki/sources/原始中文名.md` (非中文使用 slug.md) + > ⚠️ **Source Page 必须包含 `## Source File` 段落**,格式为: + > ```markdown + > ## Source File + > - [[raw/相对路径/文件名.md]] + > ``` + > 这是溯源链的关键环节,**禁止省略**。即使同一 raw 文件被多次 ingest,每次都要写明 `## Source File`。 4. 更新 `wiki/index.md` 5. 更新 `wiki/overview.md`(如有必要) 6. 创建或更新 Entity 页面 @@ -124,6 +131,142 @@ last_updated: YYYY-MM-DD 8. 检测并记录冲突 9. 追加 `wiki/log.md` +> ⚠️ 本项目所有 ingest 操作直接通过 Claude Code agent 执行,不使用 `tools/ingest.py`(该脚本依赖 litellm 但未安装)。 + +--- + +# Sync Workflow(同步更新流程) + +本流程通过 `sync.py` 自动检测 `raw/` 下文件变化,调用 Claude Code agent 按 Ingest Workflow 执行实际同步。 + +## manifest.json 格式 + +```json +{ + "version": 1, + "updated_at": "ISO timestamp", + "files": { + "relative/path/to/file.md": { + "hash": "sha256(前16位)", + "modified": "ISO timestamp", + "slug": "wiki-source-slug", + "source_path": "wiki/sources/slug.md", + "ingested": true, + "ingested_at": "ISO timestamp" + } + } +} +``` + +## Slash Command + +| Command | 使用方式 | +| -------------- | ------------------------------ | +| `/wiki-sync` | `python tools/sync.py --check` 预览 | +| `/wiki-sync` | `python tools/sync.py --sync` 执行 | + +## 执行步骤(严格顺序) + +**角色分工:** +- **Hermes(我)**:启动 TMUX、发送任务、监控进度、更新 manifest、发送 Telegram +- **Claude Code Agent**:执行 `/wiki-ingest`(读取 CLAUDE.md → 严格按 9 步执行) + +1. 执行 `python tools/sync.py --check` — 预览 raw/ 变化(新增/修改/删除)**[Hermes]** +2. 确认变化列表后,启动 TMUX + Claude Code: + ```bash + # 启动 Claude Code(跳过信任目录确认)**[Hermes]** + tmux new-session -d -s claude-wiki -x 200 -y 50 + tmux send-keys -t claude-wiki 'cd /Users/weishen/Git/llm-wiki-agent && claude --permission-mode bypassPermissions' Enter + sleep 8 && tmux send-keys -t claude-wiki Enter # 确认信任目录 + + # 发送任务(完整指令)**[Hermes]** + # 注意:实际执行时,将 /absolute/path/to/xxx.md 替换为真正的文件绝对路径 + tmux send-keys -t claude-wiki '请执行以下任务: + + 1. 首先完整阅读 CLAUDE.md 中的 Ingest Workflow 部分 + 2. 然后执行 /wiki-ingest /absolute/path/to/xxx.md + 3. 严格按 CLAUDE.md 中的 9 步执行,不可跳过任何步骤 + 4. 每篇必须完成:source page + index.md + overview.md(如有必要)+ entity + concept + log.md + 5. 完成后输出 done' Enter + + # 监控任务完成状态(等待看到 "done" 或任务完成提示)**[Hermes]** + tmux capture-pane -t claude-wiki -p + + # 下一个任务...(必须等上一个完成) + ``` + > ⚠️ **关键规则**:必须**一个一个顺序执行**,每完成一个再发下一个。并发会触发 529 rate limit 错误。 +3. Claude Code Agent 执行 ingest(9 步)**[Claude Code Agent]** +4. 每完成一个文件,更新 manifest.json(记录 hash、slug、source_path)**[Hermes]** +5. deleted 文件:从 manifest 移除,保留 wiki 内容(不删除 orphan entity/concept)**[Hermes]** +6. 检测 orphan entity/concept,报告但不删除**[Hermes]** +7. 清理 TMUX session:`tmux kill-session -t claude-wiki`**[Hermes]** + +## Telegram 通知(/wiki-sync 执行时) + +Claude Code 负责执行 `/wiki-sync` 时,通过 `send_message` 向用户发送三阶段简报: + +**① 变化预览(开始时发送)** +``` +🔄 Wiki Sync 开始 ++ 新增: N 个 +~ 修改: N 个 +- 删除: N 个 +``` + +**② 每完成一个文件发送进度** +``` +✅ 已完成 3/10 +📄 raw/2025 年 11 个神级 AI 开源平替,GitHub 杀疯了。.md +``` + +**③ 全部完成后发送总结** +``` +✅ Wiki Sync 完成 + +📊 同步结果: + + 新增: N(N 个文件列表) + ~ 修改: N(N 个文件列表) + - 删除: N(N 个文件列表) + +📁 Wiki 状态: + manifest: N 条记录 + entities: N 个(新增 N,orphan N) + concepts: N 个(新增 N,orphan N) + +⚠️ 如有失败,列出失败文件及原因 +``` + +## 分批同步原则 + +- 每次 `--sync` 处理所有 new + updated 文件 +- 用户可修改 sync.py 中的 `BATCH_SIZE = 5` 限制每批数量 +- orphan entity/concept 保留,不删除(用户要求) + +## Sync 状态报告格式 + +``` +=== Wiki Sync + Date: YYYY-MM-DD HH:MM + Raw: /path/to/raw + Wiki: /path/to/wiki + Mode: LIVE SYNC + +--- Changes + + New: N + ~ Updated: N + - Deleted: N + +--- Applying Sync + [+] New: raw/xxx.md → wiki/sources/xxx.md + [~] Updated: raw/xxx.md → wiki/sources/xxx.md + [-] Deleted: raw/xxx.md(wiki 内容保留) + +manifest.json updated (N entries) +--- Orphan Report(保留不删) + Orphan Entities: N + Orphan Concepts: N +``` + --- # Source Page Format(增强结构) diff --git a/tools/manifest.json b/tools/manifest.json new file mode 100644 index 0000000..4efc2d9 --- /dev/null +++ b/tools/manifest.json @@ -0,0 +1,1454 @@ +{ + "version": 1, + "updated_at": "2026-04-16T06:48:07.961142+00:00", + "files": { + "raw/Cloud & DevOps/DevOps Culture and Transformation Fostering Collaboration, Agile Practices, and Innovation LinkedIn.md": { + "hash": "8f4ce7f0f68eda9f", + "modified": "2026-04-14T04:28:42.626174+00:00", + "slug": "DevOps-Culture-and-Transformation-Fostering-Collaboration--Agile-Practices--and-Innovation--LinkedIn", + "source_path": "wiki/sources/DevOps-Culture-and-Transformation-Fostering-Collaboration--Agile-Practices--and-Innovation--LinkedIn.md", + "ingested": true, + "ingested_at": "2026-04-16T06:20:57.379554+00:00" + }, + "raw/Cloud & DevOps/Cloud DevOp Maturity - Guideline.md": { + "hash": "774d63a8ec237203", + "modified": "2026-04-14T04:28:42.625381+00:00", + "slug": "Cloud-DevOp-Maturity---Guideline", + "source_path": "wiki/sources/Cloud-DevOp-Maturity---Guideline.md", + "ingested": true, + "ingested_at": "2026-04-16T06:20:57.379603+00:00" + }, + "raw/Cloud & DevOps/Cloud Maturity Model A Detailed Guide For Cloud Adoption.md": { + "hash": "2d43021d27ef4b81", + "modified": "2026-04-14T04:28:42.625606+00:00", + "slug": "Cloud-Maturity-Model-A-Detailed-Guide-For-Cloud-Adoption", + "source_path": "wiki/sources/Cloud-Maturity-Model-A-Detailed-Guide-For-Cloud-Adoption.md", + "ingested": true, + "ingested_at": "2026-04-16T06:20:57.379656+00:00" + }, + "raw/Cloud & DevOps/What I know about Cloud Service Delivery 1.md": { + "hash": "9a49f8a90a4e42e6", + "modified": "2026-04-14T04:28:42.631043+00:00", + "slug": "What-I-know-about-Cloud-Service-Delivery-1", + "source_path": "wiki/sources/What-I-know-about-Cloud-Service-Delivery-1.md", + "ingested": true, + "ingested_at": "2026-04-16T06:20:57.379697+00:00" + }, + "raw/Cloud & DevOps/The Myths and Misconceptions About Cloud Computing LinkedIn.md": { + "hash": "676861a2484bde9c", + "modified": "2026-04-14T04:28:42.630679+00:00", + "slug": "The-Myths-and-Misconceptions-About-Cloud-Computing--LinkedIn", + "source_path": "wiki/sources/The-Myths-and-Misconceptions-About-Cloud-Computing--LinkedIn.md", + "ingested": true, + "ingested_at": "2026-04-16T06:20:57.379743+00:00" + }, + "raw/Cloud & DevOps/How Can a Multi Cloud Strategy Transform Your Business ROI.md": { + "hash": "fb0a605b96b5542a", + "modified": "2026-04-14T04:28:42.626851+00:00", + "slug": "How-Can-a-Multi-Cloud-Strategy-Transform-Your-Business-ROI", + "source_path": "wiki/sources/How-Can-a-Multi-Cloud-Strategy-Transform-Your-Business-ROI.md", + "ingested": true, + "ingested_at": "2026-04-16T06:20:57.379790+00:00" + }, + "raw/Cloud & DevOps/DevOps Maturity Model From Traditional IT to Advanced DevOps.md": { + "hash": "6914f8945e00022e", + "modified": "2026-04-14T04:28:42.626393+00:00", + "slug": "DevOps-Maturity-Model-From-Traditional-IT-to-Advanced-DevOps", + "source_path": "wiki/sources/DevOps-Maturity-Model-From-Traditional-IT-to-Advanced-DevOps.md", + "ingested": true, + "ingested_at": "2026-04-16T06:20:57.379846+00:00" + }, + "raw/Cloud & DevOps/How Agentic AI can help for Cloud DevOps.md": { + "hash": "a162132fee73fe08", + "modified": "2026-04-14T04:28:42.626625+00:00", + "slug": "How-Agentic-AI-can-help-for-Cloud-DevOps", + "source_path": "wiki/sources/How-Agentic-AI-can-help-for-Cloud-DevOps.md", + "ingested": true, + "ingested_at": "2026-04-16T06:20:57.379887+00:00" + }, + "raw/Cloud & DevOps/Public vs Private vs Hybrid Cloud Differences Explained.md": { + "hash": "868351fa9207d5f7", + "modified": "2026-04-14T04:28:42.627597+00:00", + "slug": "Public-vs-Private-vs-Hybrid-Cloud-Differences-Explained", + "source_path": "wiki/sources/Public-vs-Private-vs-Hybrid-Cloud-Differences-Explained.md", + "ingested": true, + "ingested_at": "2026-04-16T06:20:57.379932+00:00" + }, + "raw/Cloud & DevOps/These 6 Linux apps let you monitor system resources in style.md": { + "hash": "a31075218ca6624e", + "modified": "2026-04-14T04:28:42.641312+00:00", + "slug": "These-6-Linux-apps-let-you-monitor-system-resources-in-style", + "source_path": "wiki/sources/These-6-Linux-apps-let-you-monitor-system-resources-in-style.md", + "ingested": true, + "ingested_at": "2026-04-16T06:20:57+00:00" + }, + "raw/Cloud & DevOps/RTO vs RPO Key Differences for Modern Disaster Recovery.md": { + "hash": "54e2ec8ad0a3202d", + "modified": "2026-04-14T04:28:42.627898+00:00", + "slug": "RTO-vs-RPO-Key-Differences-for-Modern-Disaster-Recovery", + "source_path": "wiki/sources/RTO-vs-RPO-Key-Differences-for-Modern-Disaster-Recovery.md", + "ingested": true, + "ingested_at": "2026-04-16T06:35:00+00:00" + }, + "raw/Cloud & DevOps/How to Simplify Multi-Account Deployments Monitoring Centralized Logs for AWS CloudFormation StackSets.md": { + "hash": "6719289e55a83ef8", + "modified": "2026-04-14T04:28:42.627379+00:00", + "slug": "How-to-Simplify-Multi-Account-Deployments-Monitoring-Centralized-Logs-for-AWS-CloudFormation-StackSets", + "source_path": "wiki/sources/How-to-Simplify-Multi-Account-Deployments-Monitoring-Centralized-Logs-for-AWS-CloudFormation-StackSets.md", + "ingested": true, + "ingested_at": "2026-04-16T08:46:30.130439+00:00" + }, + "raw/Cloud & DevOps/Understanding Complete ITSM.md": { + "hash": "71ce0a0425bf6c22", + "modified": "2026-04-14T04:28:42.630861+00:00", + "slug": "Understanding-Complete-ITSM", + "source_path": "wiki/sources/Understanding-Complete-ITSM.md", + "ingested": true, + "ingested_at": "2026-04-16T08:46:30.130604+00:00" + }, + "raw/Cloud & DevOps/What is DevSecOps Best Practices, Benefits, and Tools.md": { + "hash": "f4257c49bc1ec641", + "modified": "2026-04-14T04:28:42.631251+00:00", + "slug": "What-is-DevSecOps-Best-Practices--Benefits--and-Tools", + "source_path": "wiki/sources/What-is-DevSecOps-Best-Practices--Benefits--and-Tools.md", + "ingested": false, + "ingested_at": null + }, + "raw/Cloud & DevOps/Cloud Operating Model Key Strategies and Best Practices.md": { + "hash": "a58d5e980eeaf214", + "modified": "2026-04-14T04:28:42.625875+00:00", + "slug": "Cloud-Operating-Model-Key-Strategies-and-Best-Practices", + "source_path": "wiki/sources/Cloud-Operating-Model-Key-Strategies-and-Best-Practices.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/用Docker中安装Navidrome.md": { + "hash": "7e044ac150fdd317", + "modified": "2026-04-14T04:28:42.637767+00:00", + "slug": "用Docker中安装Navidrome", + "source_path": "wiki/sources/用Docker中安装Navidrome.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Linux 运维必会的 150 个命令.md": { + "hash": "61346c95bc5fbd79", + "modified": "2026-04-14T04:28:42.633573+00:00", + "slug": "Linux-运维必会的-150-个命令", + "source_path": "wiki/sources/Linux-运维必会的-150-个命令.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Ubuntu服务器通过rsync实现日常增量备份.md": { + "hash": "69f84bc7016520ea", + "modified": "2026-04-14T04:28:42.635110+00:00", + "slug": "Ubuntu服务器通过rsync实现日常增量备份", + "source_path": "wiki/sources/Ubuntu服务器通过rsync实现日常增量备份.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/MySQL MariaDB 数据库详细信息.md": { + "hash": "381fe3ca28375c9d", + "modified": "2026-04-14T04:28:42.634159+00:00", + "slug": "MySQL-MariaDB-数据库详细信息", + "source_path": "wiki/sources/MySQL-MariaDB-数据库详细信息.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/网件RAX50路由器刷梅林固件与科学上网插件安装教程.md": { + "hash": "3f74cf0329c90f73", + "modified": "2026-04-14T04:28:42.638931+00:00", + "slug": "网件RAX50路由器刷梅林固件与科学上网插件安装教程", + "source_path": "wiki/sources/网件RAX50路由器刷梅林固件与科学上网插件安装教程.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/RAX50 路由器 更新Merlin Clash订阅.md": { + "hash": "208231a844923a76", + "modified": "2026-04-14T04:28:42.634528+00:00", + "slug": "RAX50-路由器-更新Merlin-Clash订阅", + "source_path": "wiki/sources/RAX50-路由器-更新Merlin-Clash订阅.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/用Docker安装transmission.md": { + "hash": "b2049f376576b7ed", + "modified": "2026-04-14T04:28:42.638683+00:00", + "slug": "用Docker安装transmission", + "source_path": "wiki/sources/用Docker安装transmission.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Ubuntu 24.04 enable SSH.md": { + "hash": "d177933926ea9bd3", + "modified": "2026-04-14T04:28:42.634687+00:00", + "slug": "Ubuntu-24-04-enable-SSH", + "source_path": "wiki/sources/Ubuntu-24-04-enable-SSH.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/3X-UI Xray on BandwagonVPS.md": { + "hash": "2ac90a76e74e8558", + "modified": "2026-04-14T04:28:42.633206+00:00", + "slug": "3X-UI-Xray-on-BandwagonVPS", + "source_path": "wiki/sources/3X-UI-Xray-on-BandwagonVPS.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Clonezilla对Ubuntu Server进行全盘镜像备份.md": { + "hash": "642a1172d9b2253b", + "modified": "2026-04-14T04:28:42.633384+00:00", + "slug": "Clonezilla对Ubuntu-Server进行全盘镜像备份", + "source_path": "wiki/sources/Clonezilla对Ubuntu-Server进行全盘镜像备份.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/可自动化、可扩展、AI增强的电商数据采集与处理系统.md": { + "hash": "c8c16eb8d8257eb2", + "modified": "2026-04-14T04:28:42.632635+00:00", + "slug": "可自动化-可扩展-AI增强的电商数据采集与处理系统", + "source_path": "wiki/sources/可自动化-可扩展-AI增强的电商数据采集与处理系统.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/通过VPS+内网反向代理实现域名访问内网穿透.md": { + "hash": "e9ee82a0b9cd35f5", + "modified": "2026-04-14T04:28:42.633017+00:00", + "slug": "通过VPS-内网反向代理实现域名访问内网穿透", + "source_path": "wiki/sources/通过VPS-内网反向代理实现域名访问内网穿透.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/用Docker安装it-tools.md": { + "hash": "326248da5f3890a1", + "modified": "2026-04-14T04:28:42.638520+00:00", + "slug": "用Docker安装it-tools", + "source_path": "wiki/sources/用Docker安装it-tools.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/安装Ubuntu-24.04.2在HP Zbook工作站笔记本上.md": { + "hash": "fb96fd5c75e86198", + "modified": "2026-04-14T04:28:42.637273+00:00", + "slug": "安装Ubuntu-24-04-2在HP-Zbook工作站笔记本上", + "source_path": "wiki/sources/安装Ubuntu-24-04-2在HP-Zbook工作站笔记本上.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/如何用指纹浏览器安全注册并订阅Claude Pro会员全攻略.md": { + "hash": "41d83e5d61e0a7ea", + "modified": "2026-04-14T04:28:42.637084+00:00", + "slug": "如何用指纹浏览器安全注册并订阅Claude-Pro会员全攻略", + "source_path": "wiki/sources/如何用指纹浏览器安全注册并订阅Claude-Pro会员全攻略.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/如何判别你的Linux 服务器是 x64(也就是 x86_64)还是 ARM64.md": { + "hash": "1d83b500c34b5bb6", + "modified": "2026-04-14T04:28:42.636562+00:00", + "slug": "如何判别你的Linux-服务器是-x64-也就是-x86_64-还是-ARM64", + "source_path": "wiki/sources/如何判别你的Linux-服务器是-x64-也就是-x86_64-还是-ARM64.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/在Synology NAS上安装CloudDrive2.md": { + "hash": "b09998b0b081a800", + "modified": "2026-04-14T04:28:42.635553+00:00", + "slug": "在Synology-NAS上安装CloudDrive2", + "source_path": "wiki/sources/在Synology-NAS上安装CloudDrive2.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Mac Mini 安装 FRP 0.65.0(ARM64)操作笔记.md": { + "hash": "6d4ddaefa0866e8a", + "modified": "2026-04-14T04:28:42.639496+00:00", + "slug": "Mac-Mini-安装-FRP-0-65-0-ARM64-操作笔记", + "source_path": "wiki/sources/Mac-Mini-安装-FRP-0-65-0-ARM64-操作笔记.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Ubuntu 安装 FRP 0.65.0(x86_64)操作笔记.md": { + "hash": "ef56d5ed56b45149", + "modified": "2026-04-14T07:57:38.088403+00:00", + "slug": "Ubuntu-安装-FRP-0-65-0-x86_64-操作笔记", + "source_path": "wiki/sources/Ubuntu-安装-FRP-0-65-0-x86_64-操作笔记.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/家庭监控方案:Prometheus + Grafana + Node Exporter + cAdvisor +Blackbox.md": { + "hash": "c4602c3a868c86d7", + "modified": "2026-04-14T04:28:42.637625+00:00", + "slug": "家庭监控方案-Prometheus---Grafana---Node-Exporter---cAdvisor--Blackbox", + "source_path": "wiki/sources/家庭监控方案-Prometheus---Grafana---Node-Exporter---cAdvisor--Blackbox.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/如何在Ubuntu Server安装 docker & docker compose.md": { + "hash": "99bbbff2a8581bcf", + "modified": "2026-04-14T04:28:42.636899+00:00", + "slug": "如何在Ubuntu-Server安装-docker---docker-compose", + "source_path": "wiki/sources/如何在Ubuntu-Server安装-docker---docker-compose.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/macOS 创建与解除 Symbolic Link(OpenClaw 目录映射).md": { + "hash": "a90f07eddb9386e2", + "modified": "2026-04-14T04:28:42.639896+00:00", + "slug": "macOS-创建与解除-Symbolic-Link-OpenClaw-目录映射", + "source_path": "wiki/sources/macOS-创建与解除-Symbolic-Link-OpenClaw-目录映射.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers,彻底告别服务器.md": { + "hash": "e46b60a509111e53", + "modified": "2026-04-14T04:28:42.634366+00:00", + "slug": "NodeWarden---把-Bitwarden-搬上-Cloudflare-Workers-彻底告别服务器", + "source_path": "wiki/sources/NodeWarden---把-Bitwarden-搬上-Cloudflare-Workers-彻底告别服务器.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/群晖NAS科学上网方法.md": { + "hash": "b2b72d996b1f833a", + "modified": "2026-04-14T04:28:42.639155+00:00", + "slug": "群晖NAS科学上网方法", + "source_path": "wiki/sources/群晖NAS科学上网方法.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Git Push 连接重置问题修复.md": { + "hash": "ffeb963ee73af1b0", + "modified": "2026-04-14T04:28:42.631926+00:00", + "slug": "Git-Push-连接重置问题修复", + "source_path": "wiki/sources/Git-Push-连接重置问题修复.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/MinIO + Zipline 自托管图床应用安装教程.md": { + "hash": "90ef2bfa1b048367", + "modified": "2026-04-14T04:28:42.633769+00:00", + "slug": "MinIO---Zipline-自托管图床应用安装教程", + "source_path": "wiki/sources/MinIO---Zipline-自托管图床应用安装教程.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Install Apache Superset in Docker.md": { + "hash": "8b90b4b286c8811b", + "modified": "2026-04-14T04:28:42.632123+00:00", + "slug": "Install-Apache-Superset-in-Docker", + "source_path": "wiki/sources/Install-Apache-Superset-in-Docker.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/安装v2rayN.md": { + "hash": "214c08b6c8dffd49", + "modified": "2026-04-14T04:28:42.637431+00:00", + "slug": "安装v2rayN", + "source_path": "wiki/sources/安装v2rayN.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Synology NAS + Xiaoya Alist + CloudDrvie2+ Plex to Build Media Platform.md": { + "hash": "ae45904bbe903e5c", + "modified": "2026-04-14T04:28:42.632448+00:00", + "slug": "Synology-NAS---Xiaoya-Alist---CloudDrvie2--Plex-to-Build-Media-Platform", + "source_path": "wiki/sources/Synology-NAS---Xiaoya-Alist---CloudDrvie2--Plex-to-Build-Media-Platform.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Ubuntu禁用合盖休眠.md": { + "hash": "6cb276e1b8f4eced", + "modified": "2026-04-14T04:28:42.635411+00:00", + "slug": "Ubuntu禁用合盖休眠", + "source_path": "wiki/sources/Ubuntu禁用合盖休眠.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Ubuntu Server科学上网.md": { + "hash": "24b3b7526b38be13", + "modified": "2026-04-14T04:28:42.634891+00:00", + "slug": "Ubuntu-Server科学上网", + "source_path": "wiki/sources/Ubuntu-Server科学上网.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/用Docker安装Jellyfin.md": { + "hash": "f90730407562bd9a", + "modified": "2026-04-14T04:28:42.638241+00:00", + "slug": "用Docker安装Jellyfin", + "source_path": "wiki/sources/用Docker安装Jellyfin.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/用Docker安装Portainer.md": { + "hash": "8c62aa49517143de", + "modified": "2026-04-14T04:28:42.638377+00:00", + "slug": "用Docker安装Portainer", + "source_path": "wiki/sources/用Docker安装Portainer.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/如何删除旧的废弃的docker container +volume.md": { + "hash": "b43ee45c99a63157", + "modified": "2026-04-14T04:28:42.636388+00:00", + "slug": "如何删除旧的废弃的docker-container--volume", + "source_path": "wiki/sources/如何删除旧的废弃的docker-container--volume.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/家庭网络环境概览_2026-04-03.md": { + "hash": "806348d84a0d70c2", + "modified": "2026-04-14T04:28:42.639325+00:00", + "slug": "家庭网络环境概览_2026-04-03", + "source_path": "wiki/sources/家庭网络环境概览_2026-04-03.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Mac-Mini-服务器配置-防止自动锁屏与睡眠.md": { + "hash": "e6c46d51c60ce995", + "modified": "2026-04-14T04:28:42.632269+00:00", + "slug": "Mac-Mini-服务器配置-防止自动锁屏与睡眠", + "source_path": "wiki/sources/Mac-Mini-服务器配置-防止自动锁屏与睡眠.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/用Docker安装Apache Superset.md": { + "hash": "32705dacc449d3ac", + "modified": "2026-04-14T04:28:42.637903+00:00", + "slug": "用Docker安装Apache-Superset", + "source_path": "wiki/sources/用Docker安装Apache-Superset.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/如何在Ubuntu Server上通过NFS挂载Synology NAS上的共享文件夹.md": { + "hash": "017a164ee2b7e62d", + "modified": "2026-04-14T04:28:42.636751+00:00", + "slug": "如何在Ubuntu-Server上通过NFS挂载Synology-NAS上的共享文件夹", + "source_path": "wiki/sources/如何在Ubuntu-Server上通过NFS挂载Synology-NAS上的共享文件夹.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/在Ubuntu上通过VPS+内网反向代理实现域名访问内网穿透.md": { + "hash": "a77d80a2ecdbfb37", + "modified": "2026-04-14T04:28:42.635894+00:00", + "slug": "在Ubuntu上通过VPS-内网反向代理实现域名访问内网穿透", + "source_path": "wiki/sources/在Ubuntu上通过VPS-内网反向代理实现域名访问内网穿透.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/用Docker安装Homarr.md": { + "hash": "199ad77602dbbe9d", + "modified": "2026-04-14T04:28:42.638050+00:00", + "slug": "用Docker安装Homarr", + "source_path": "wiki/sources/用Docker安装Homarr.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/Ubuntu用RustDesk远程登录出现不能使用Wayland登录的错误.md": { + "hash": "ae224f7dcd4c066e", + "modified": "2026-04-14T04:28:42.635266+00:00", + "slug": "Ubuntu用RustDesk远程登录出现不能使用Wayland登录的错误", + "source_path": "wiki/sources/Ubuntu用RustDesk远程登录出现不能使用Wayland登录的错误.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/如何传输Docker images 并且在另一个Docker安装.md": { + "hash": "17413f4eb1d92fa2", + "modified": "2026-04-14T04:28:42.636228+00:00", + "slug": "如何传输Docker-images-并且在另一个Docker安装", + "source_path": "wiki/sources/如何传输Docker-images-并且在另一个Docker安装.md", + "ingested": false, + "ingested_at": null + }, + "raw/Home Office/在 Ubuntu 安装 Ollama 并运行 Qwen2.5‑Coder 7B.md": { + "hash": "0d9deaa455ccdb62", + "modified": "2026-04-14T04:28:42.632832+00:00", + "slug": "在-Ubuntu-安装-Ollama-并运行-Qwen2-5-Coder-7B", + "source_path": "wiki/sources/在-Ubuntu-安装-Ollama-并运行-Qwen2-5-Coder-7B.md", + "ingested": false, + "ingested_at": null + }, + "raw/Vibe Coding/如何在Ubuntu上安装opencode并配置Vibe-Kanban.md": { + "hash": "0d9c60e956a2d9be", + "modified": "2026-04-14T04:28:42.642441+00:00", + "slug": "如何在Ubuntu上安装opencode并配置Vibe-Kanban", + "source_path": "wiki/sources/如何在Ubuntu上安装opencode并配置Vibe-Kanban.md", + "ingested": false, + "ingested_at": null + }, + "raw/Vibe Coding/Cursor 2.0初学者使用指南.md": { + "hash": "b88ae08cb12bb556", + "modified": "2026-04-14T04:28:42.631617+00:00", + "slug": "Cursor-2-0初学者使用指南", + "source_path": "wiki/sources/Cursor-2-0初学者使用指南.md", + "ingested": false, + "ingested_at": null + }, + "raw/Vibe Coding/Trae远程开发部署指南.md": { + "hash": "2bbac5394e5cde69", + "modified": "2026-04-14T04:28:42.641571+00:00", + "slug": "Trae远程开发部署指南", + "source_path": "wiki/sources/Trae远程开发部署指南.md", + "ingested": false, + "ingested_at": null + }, + "raw/Vibe Coding/如何在项目里安装Claude-Code-Templates Skills.md": { + "hash": "a3eef07a886e8dd3", + "modified": "2026-04-14T04:28:42.642584+00:00", + "slug": "如何在项目里安装Claude-Code-Templates-Skills", + "source_path": "wiki/sources/如何在项目里安装Claude-Code-Templates-Skills.md", + "ingested": false, + "ingested_at": null + }, + "raw/Vibe Coding/vibe coding经验收集.md": { + "hash": "ac57cac0f90272dd", + "modified": "2026-04-14T04:28:42.642116+00:00", + "slug": "vibe-coding经验收集", + "source_path": "wiki/sources/vibe-coding经验收集.md", + "ingested": false, + "ingested_at": null + }, + "raw/Vibe Coding/Vibe-Kanban + OpenCode 在 Ubuntu Server 上安装与管理指南.md": { + "hash": "2202f82d84a7c74c", + "modified": "2026-04-14T04:28:42.641963+00:00", + "slug": "Vibe-Kanban---OpenCode-在-Ubuntu-Server-上安装与管理指南", + "source_path": "wiki/sources/Vibe-Kanban---OpenCode-在-Ubuntu-Server-上安装与管理指南.md", + "ingested": false, + "ingested_at": null + }, + "raw/Vibe Coding/在Ubuntu上安装Vibe-Kanban.md": { + "hash": "0abce71f2148a196", + "modified": "2026-04-14T04:28:42.642276+00:00", + "slug": "在Ubuntu上安装Vibe-Kanban", + "source_path": "wiki/sources/在Ubuntu上安装Vibe-Kanban.md", + "ingested": false, + "ingested_at": null + }, + "raw/Vibe Coding/开发经验与项目规范整理文档.md": { + "hash": "8e5dec842bc0d193", + "modified": "2026-04-14T04:28:42.643879+00:00", + "slug": "开发经验与项目规范整理文档", + "source_path": "wiki/sources/开发经验与项目规范整理文档.md", + "ingested": false, + "ingested_at": null + }, + "raw/Others/ChinaTextbook - 41.53 GB,中国小学、初中、高中、大学 PDF 教材.md": { + "hash": "5c3fd15d1a515ce2", + "modified": "2026-04-14T04:28:42.625118+00:00", + "slug": "ChinaTextbook---41-53-GB-中国小学-初中-高中-大学-PDF-教材", + "source_path": "wiki/sources/ChinaTextbook---41-53-GB-中国小学-初中-高中-大学-PDF-教材.md", + "ingested": false, + "ingested_at": null + }, + "raw/Others/Obsidian Tasks 插件:这可能是最适合懒人的任务管理方式.md": { + "hash": "7aacfa3042ca803e", + "modified": "2026-04-14T04:28:42.623414+00:00", + "slug": "Obsidian-Tasks-插件-这可能是最适合懒人的任务管理方式", + "source_path": "wiki/sources/Obsidian-Tasks-插件-这可能是最适合懒人的任务管理方式.md", + "ingested": false, + "ingested_at": null + }, + "raw/Others/Obsidian最有必要安装的10款插件是这些.md": { + "hash": "a76fc438b8a16992", + "modified": "2026-04-14T04:28:42.623793+00:00", + "slug": "Obsidian最有必要安装的10款插件是这些", + "source_path": "wiki/sources/Obsidian最有必要安装的10款插件是这些.md", + "ingested": false, + "ingested_at": null + }, + "raw/Others/为什么你的笔记总是乱糟糟?试试这个方法,彻底告别信息混乱! 1.md": { + "hash": "4a29abc24bc25719", + "modified": "2026-04-14T04:28:42.644960+00:00", + "slug": "为什么你的笔记总是乱糟糟-试试这个方法-彻底告别信息混乱--1", + "source_path": "wiki/sources/为什么你的笔记总是乱糟糟-试试这个方法-彻底告别信息混乱--1.md", + "ingested": false, + "ingested_at": null + }, + "raw/Others/为什么 Obsidian 让我戒掉了碎片化记录.md": { + "hash": "dd915c658abb39dc", + "modified": "2026-04-14T04:28:42.644826+00:00", + "slug": "为什么-Obsidian-让我戒掉了碎片化记录", + "source_path": "wiki/sources/为什么-Obsidian-让我戒掉了碎片化记录.md", + "ingested": false, + "ingested_at": null + }, + "raw/Others/Obsidian 高效指南:我常用的插件与实用技巧.md": { + "hash": "0641eba8de398556", + "modified": "2026-04-14T04:28:42.623596+00:00", + "slug": "Obsidian-高效指南-我常用的插件与实用技巧", + "source_path": "wiki/sources/Obsidian-高效指南-我常用的插件与实用技巧.md", + "ingested": false, + "ingested_at": null + }, + "raw/Others/Dataview——让我从“笔记黑洞”里逃出来的 Obsidian 神器 1.md": { + "hash": "de771b8afad4115e", + "modified": "2026-04-14T04:28:42.623210+00:00", + "slug": "Dataview--让我从-笔记黑洞-里逃出来的-Obsidian-神器-1", + "source_path": "wiki/sources/Dataview--让我从-笔记黑洞-里逃出来的-Obsidian-神器-1.md", + "ingested": false, + "ingested_at": null + }, + "raw/Others/TikTok PM - Python Django Project.md": { + "hash": "407a1660227649b7", + "modified": "2026-04-14T04:28:42.640772+00:00", + "slug": "TikTok-PM---Python-Django-Project", + "source_path": "wiki/sources/TikTok-PM---Python-Django-Project.md", + "ingested": false, + "ingested_at": null + }, + "raw/Others/How to get Youtube Channel ID.md": { + "hash": "ce7661728a4fbf94", + "modified": "2026-04-14T04:28:42.640075+00:00", + "slug": "How-to-get-Youtube-Channel-ID", + "source_path": "wiki/sources/How-to-get-Youtube-Channel-ID.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/万字讲透OpenClaw-Workspace深度解析-2026-03-21.md": { + "hash": "a763a1295a985904", + "modified": "2026-04-09T11:31:39.250630+00:00", + "slug": "万字讲透OpenClaw-Workspace深度解析-2026-03-21", + "source_path": "wiki/sources/万字讲透OpenClaw-Workspace深度解析-2026-03-21.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/n8n docker install & update.md": { + "hash": "960cdfc3f998d209", + "modified": "2026-04-14T04:28:42.642947+00:00", + "slug": "n8n-docker-install---update", + "source_path": "wiki/sources/n8n-docker-install---update.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/n8n configure telegram trigger.md": { + "hash": "d70ea82e448abf20", + "modified": "2026-04-14T04:28:42.642767+00:00", + "slug": "n8n-configure-telegram-trigger", + "source_path": "wiki/sources/n8n-configure-telegram-trigger.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/Google-5个Agent-Skill设计模式-2026-03-19.md": { + "hash": "45ca759f17a8e18e", + "modified": "2026-04-09T11:31:39.250857+00:00", + "slug": "Google-5个Agent-Skill设计模式-2026-03-19", + "source_path": "wiki/sources/Google-5个Agent-Skill设计模式-2026-03-19.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/MCP在Cursor中的集成与应用详解.md": { + "hash": "641fb86e8b38ad3d", + "modified": "2026-04-14T04:28:42.640373+00:00", + "slug": "MCP在Cursor中的集成与应用详解", + "source_path": "wiki/sources/MCP在Cursor中的集成与应用详解.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/使用Claude自动生成N8N工作流的实操教程.md": { + "hash": "3fd0b0008b3644ff", + "modified": "2026-04-14T04:28:42.643567+00:00", + "slug": "使用Claude自动生成N8N工作流的实操教程", + "source_path": "wiki/sources/使用Claude自动生成N8N工作流的实操教程.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/万字保姆级教程-90天跑通一人公司模式-2026-03-29.md": { + "hash": "34fb8eee504a91c7", + "modified": "2026-04-09T11:31:39.255980+00:00", + "slug": "万字保姆级教程-90天跑通一人公司模式-2026-03-29", + "source_path": "wiki/sources/万字保姆级教程-90天跑通一人公司模式-2026-03-29.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/n8n+Claude 通过自然语言自动化工作流.md": { + "hash": "701d433ebf65ee87", + "modified": "2026-04-14T04:28:42.643401+00:00", + "slug": "n8n-Claude-通过自然语言自动化工作流", + "source_path": "wiki/sources/n8n-Claude-通过自然语言自动化工作流.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/n8n full tutorial building AI agents in 2025 for Beginners!.md": { + "hash": "56d03ecaf1be76f5", + "modified": "2026-04-14T04:28:42.643158+00:00", + "slug": "n8n-full-tutorial-building-AI-agents-in-2025-for-Beginners", + "source_path": "wiki/sources/n8n-full-tutorial-building-AI-agents-in-2025-for-Beginners.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/claude-code调用方法总结.md": { + "hash": "a040cf8dbe80386d", + "modified": "2026-04-13T05:35:03.477172+00:00", + "slug": "claude-code调用方法总结", + "source_path": "wiki/sources/claude-code调用方法总结.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/podcast-production-pipeline.md": { + "hash": "bcf5b7555bb61ffc", + "modified": "2026-04-09T11:31:39.259418+00:00", + "slug": "podcast-production-pipeline", + "source_path": "wiki/sources/podcast-production-pipeline.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/meeting-notes-action-items.md": { + "hash": "9207735157f61fc1", + "modified": "2026-04-09T11:31:39.259655+00:00", + "slug": "meeting-notes-action-items", + "source_path": "wiki/sources/meeting-notes-action-items.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/daily-youtube-digest.md": { + "hash": "eb4b4ae13a585aae", + "modified": "2026-04-09T11:31:39.259868+00:00", + "slug": "daily-youtube-digest", + "source_path": "wiki/sources/daily-youtube-digest.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/content-factory.md": { + "hash": "e67498d0450d4cdb", + "modified": "2026-04-09T11:31:39.260087+00:00", + "slug": "content-factory", + "source_path": "wiki/sources/content-factory.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/self-healing-home-server.md": { + "hash": "4ffb2f391629664d", + "modified": "2026-04-09T11:31:39.260345+00:00", + "slug": "self-healing-home-server", + "source_path": "wiki/sources/self-healing-home-server.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/health-symptom-tracker.md": { + "hash": "c36825bd1558460d", + "modified": "2026-04-09T11:31:39.260526+00:00", + "slug": "health-symptom-tracker", + "source_path": "wiki/sources/health-symptom-tracker.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/project-state-management.md": { + "hash": "457ad7270972abd5", + "modified": "2026-04-09T11:31:39.260750+00:00", + "slug": "project-state-management", + "source_path": "wiki/sources/project-state-management.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/multi-agent-team.md": { + "hash": "9b7920c47713e7e8", + "modified": "2026-04-09T11:31:39.261004+00:00", + "slug": "multi-agent-team", + "source_path": "wiki/sources/multi-agent-team.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/earnings-tracker.md": { + "hash": "28d0318450f9e598", + "modified": "2026-04-09T11:31:39.261180+00:00", + "slug": "earnings-tracker", + "source_path": "wiki/sources/earnings-tracker.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/multi-channel-assistant.md": { + "hash": "60099e146e8df8a9", + "modified": "2026-04-09T11:31:39.261377+00:00", + "slug": "multi-channel-assistant", + "source_path": "wiki/sources/multi-channel-assistant.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/event-guest-confirmation.md": { + "hash": "6fcc071ca4860c1a", + "modified": "2026-04-09T11:31:39.261607+00:00", + "slug": "event-guest-confirmation", + "source_path": "wiki/sources/event-guest-confirmation.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/phone-based-personal-assistant.md": { + "hash": "a0486823deaa5f61", + "modified": "2026-04-09T11:31:39.261781+00:00", + "slug": "phone-based-personal-assistant", + "source_path": "wiki/sources/phone-based-personal-assistant.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/market-research-product-factory.md": { + "hash": "cfd209415729f6d1", + "modified": "2026-04-09T11:31:39.261979+00:00", + "slug": "market-research-product-factory", + "source_path": "wiki/sources/market-research-product-factory.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/custom-morning-brief.md": { + "hash": "5cfe53efa0684203", + "modified": "2026-04-09T11:31:39.262182+00:00", + "slug": "custom-morning-brief", + "source_path": "wiki/sources/custom-morning-brief.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/inbox-declutter.md": { + "hash": "c4db8051afa35bd9", + "modified": "2026-04-09T11:31:39.262356+00:00", + "slug": "inbox-declutter", + "source_path": "wiki/sources/inbox-declutter.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/daily-reddit-digest.md": { + "hash": "36f817d825ad0647", + "modified": "2026-04-09T11:31:39.262524+00:00", + "slug": "daily-reddit-digest", + "source_path": "wiki/sources/daily-reddit-digest.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/autonomous-project-management.md": { + "hash": "0833bf479c57155e", + "modified": "2026-04-09T11:31:39.262733+00:00", + "slug": "autonomous-project-management", + "source_path": "wiki/sources/autonomous-project-management.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/pre-build-idea-validator.md": { + "hash": "fb9a3e168089bbe4", + "modified": "2026-04-09T11:31:39.262952+00:00", + "slug": "pre-build-idea-validator", + "source_path": "wiki/sources/pre-build-idea-validator.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/dynamic-dashboard.md": { + "hash": "377675f7b60a115b", + "modified": "2026-04-09T11:31:39.263155+00:00", + "slug": "dynamic-dashboard", + "source_path": "wiki/sources/dynamic-dashboard.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/todoist-task-manager.md": { + "hash": "b8b3da6f92b98236", + "modified": "2026-04-09T11:31:39.263357+00:00", + "slug": "todoist-task-manager", + "source_path": "wiki/sources/todoist-task-manager.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/habit-tracker-accountability-coach.md": { + "hash": "7d99642a8c38884a", + "modified": "2026-04-09T11:31:39.263578+00:00", + "slug": "habit-tracker-accountability-coach", + "source_path": "wiki/sources/habit-tracker-accountability-coach.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/latex-paper-writing.md": { + "hash": "c2fade6e55ce331c", + "modified": "2026-04-09T11:31:39.263764+00:00", + "slug": "latex-paper-writing", + "source_path": "wiki/sources/latex-paper-writing.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/second-brain.md": { + "hash": "1480ed817eca6db1", + "modified": "2026-04-09T11:31:39.263981+00:00", + "slug": "second-brain", + "source_path": "wiki/sources/second-brain.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/multi-channel-customer-service.md": { + "hash": "c6870705eb16e207", + "modified": "2026-04-09T11:31:39.264185+00:00", + "slug": "multi-channel-customer-service", + "source_path": "wiki/sources/multi-channel-customer-service.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/n8n-workflow-orchestration.md": { + "hash": "20400ac7c99058db", + "modified": "2026-04-09T11:31:39.264426+00:00", + "slug": "n8n-workflow-orchestration", + "source_path": "wiki/sources/n8n-workflow-orchestration.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/local-crm-framework.md": { + "hash": "83f1c598f3396c24", + "modified": "2026-04-09T11:31:39.264662+00:00", + "slug": "local-crm-framework", + "source_path": "wiki/sources/local-crm-framework.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/overnight-mini-app-builder.md": { + "hash": "347dd9472b5b0466", + "modified": "2026-04-09T11:31:39.264901+00:00", + "slug": "overnight-mini-app-builder", + "source_path": "wiki/sources/overnight-mini-app-builder.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/polymarket-autopilot.md": { + "hash": "7a07785714bc3ac8", + "modified": "2026-04-09T11:31:39.265099+00:00", + "slug": "polymarket-autopilot", + "source_path": "wiki/sources/polymarket-autopilot.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/youtube-content-pipeline.md": { + "hash": "e1d457953ed50a18", + "modified": "2026-04-09T11:31:39.265306+00:00", + "slug": "youtube-content-pipeline", + "source_path": "wiki/sources/youtube-content-pipeline.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/personal-crm.md": { + "hash": "2da54a2071388da2", + "modified": "2026-04-09T11:31:39.265525+00:00", + "slug": "personal-crm", + "source_path": "wiki/sources/personal-crm.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/knowledge-base-rag.md": { + "hash": "e3521f790a367148", + "modified": "2026-04-09T11:31:39.265717+00:00", + "slug": "knowledge-base-rag", + "source_path": "wiki/sources/knowledge-base-rag.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/x-twitter-automation.md": { + "hash": "d8f474a745f28c70", + "modified": "2026-04-09T11:31:39.265916+00:00", + "slug": "x-twitter-automation", + "source_path": "wiki/sources/x-twitter-automation.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/multi-source-tech-news-digest.md": { + "hash": "2f1cede48d732392", + "modified": "2026-04-09T11:31:39.266114+00:00", + "slug": "multi-source-tech-news-digest", + "source_path": "wiki/sources/multi-source-tech-news-digest.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/family-calendar-household-assistant.md": { + "hash": "57bef8ddf61855b4", + "modified": "2026-04-09T11:31:39.266380+00:00", + "slug": "family-calendar-household-assistant", + "source_path": "wiki/sources/family-calendar-household-assistant.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/aionui-cowork-desktop.md": { + "hash": "9cb25d6bebc29514", + "modified": "2026-04-09T11:31:39.266622+00:00", + "slug": "aionui-cowork-desktop", + "source_path": "wiki/sources/aionui-cowork-desktop.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/semantic-memory-search.md": { + "hash": "e42c1a0a131891da", + "modified": "2026-04-09T11:31:39.266855+00:00", + "slug": "semantic-memory-search", + "source_path": "wiki/sources/semantic-memory-search.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/arxiv-paper-reader.md": { + "hash": "f50081f497ff9434", + "modified": "2026-04-09T11:31:39.267057+00:00", + "slug": "arxiv-paper-reader", + "source_path": "wiki/sources/arxiv-paper-reader.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/autonomous-game-dev-pipeline.md": { + "hash": "5ea4ad372da273e4", + "modified": "2026-04-09T11:31:39.267298+00:00", + "slug": "autonomous-game-dev-pipeline", + "source_path": "wiki/sources/autonomous-game-dev-pipeline.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/phone-call-notifications.md": { + "hash": "4914cbad4e7c1be0", + "modified": "2026-04-09T11:31:39.267539+00:00", + "slug": "phone-call-notifications", + "source_path": "wiki/sources/phone-call-notifications.md", + "ingested": false, + "ingested_at": null + }, + "raw/Agent/usecases/x-account-analysis.md": { + "hash": "0ad0c40c28047d44", + "modified": "2026-04-09T11:31:39.267744+00:00", + "slug": "x-account-analysis", + "source_path": "wiki/sources/x-account-analysis.md", + "ingested": false, + "ingested_at": null + }, + "raw/微信公众号/养虾日记2:让Agent更懂你:OpenClaw + Self-Improving 复盘实战案例分享.md": { + "hash": "ad7e2a4f523b4a3c", + "modified": "2026-04-14T04:28:42.645527+00:00", + "slug": "养虾日记2-让Agent更懂你-OpenClaw---Self-Improving-复盘实战案例分享", + "source_path": "wiki/sources/养虾日记2-让Agent更懂你-OpenClaw---Self-Improving-复盘实战案例分享.md", + "ingested": false, + "ingested_at": null + }, + "raw/微信公众号/养虾日记1:我用 OpenClaw 管了 28 万张照片:一次真实的多设备照片整理实战.md": { + "hash": "9175f1f256173a62", + "modified": "2026-04-14T04:28:42.645350+00:00", + "slug": "养虾日记1-我用-OpenClaw-管了-28-万张照片-一次真实的多设备照片整理实战", + "source_path": "wiki/sources/养虾日记1-我用-OpenClaw-管了-28-万张照片-一次真实的多设备照片整理实战.md", + "ingested": false, + "ingested_at": null + }, + "raw/微信公众号/养龙虾5天血泪史:我的AI Agent为什么总失忆?OpenClaw 记忆调试全记录.md": { + "hash": "aabd440434b3df2a", + "modified": "2026-04-14T04:28:42.646200+00:00", + "slug": "养龙虾5天血泪史-我的AI-Agent为什么总失忆-OpenClaw-记忆调试全记录", + "source_path": "wiki/sources/养龙虾5天血泪史-我的AI-Agent为什么总失忆-OpenClaw-记忆调试全记录.md", + "ingested": false, + "ingested_at": null + }, + "raw/微信公众号/养虾日记3:用 Obsidian + Gitea 为 AI 助手构建持久化笔记系统.md": { + "hash": "c6b7d0f28c56ceff", + "modified": "2026-04-14T04:28:42.645682+00:00", + "slug": "养虾日记3-用-Obsidian---Gitea-为-AI-助手构建持久化笔记系统", + "source_path": "wiki/sources/养虾日记3-用-Obsidian---Gitea-为-AI-助手构建持久化笔记系统.md", + "ingested": false, + "ingested_at": null + }, + "raw/微信公众号/不谈技术:普通人该怎么在AI时代赚钱?.md": { + "hash": "2f67b99a7f704118", + "modified": "2026-04-14T04:28:42.645165+00:00", + "slug": "不谈技术-普通人该怎么在AI时代赚钱", + "source_path": "wiki/sources/不谈技术-普通人该怎么在AI时代赚钱.md", + "ingested": false, + "ingested_at": null + }, + "raw/微信公众号/养虾日记4: 一次「Context Limit Exceeded」错误排查:我以为是小问题,结果踩了大坑.md": { + "hash": "16b45ff4202f6ac1", + "modified": "2026-04-14T04:28:42.645847+00:00", + "slug": "养虾日记4--一次-Context-Limit-Exceeded-错误排查-我以为是小问题-结果踩了大坑", + "source_path": "wiki/sources/养虾日记4--一次-Context-Limit-Exceeded-错误排查-我以为是小问题-结果踩了大坑.md", + "ingested": false, + "ingested_at": null + }, + "raw/微信公众号/养虾日记5:深夜与苏轼聊AI,他说:被浪打下去还能爬起来的才叫风流.md": { + "hash": "852ed323371b1ce5", + "modified": "2026-04-14T04:28:42.646030+00:00", + "slug": "养虾日记5-深夜与苏轼聊AI-他说-被浪打下去还能爬起来的才叫风流", + "source_path": "wiki/sources/养虾日记5-深夜与苏轼聊AI-他说-被浪打下去还能爬起来的才叫风流.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/14个免费的AI图生视频工具,用AI让图片动起来 - AI视频教程 AI自动化工作流定制服务 AI培训学习平台 黑喵大叔.md": { + "hash": "77644070202b254d", + "modified": "2026-04-14T04:28:42.607517+00:00", + "slug": "14个免费的AI图生视频工具-用AI让图片动起来---AI视频教程--AI自动化工作流定制服务--AI培训学习平台--黑喵大叔", + "source_path": "wiki/sources/14个免费的AI图生视频工具-用AI让图片动起来---AI视频教程--AI自动化工作流定制服务--AI培训学习平台--黑喵大叔.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/Designing for Agentic AI.md": { + "hash": "e9472b8294b5688a", + "modified": "2026-04-14T04:28:42.612076+00:00", + "slug": "Designing-for-Agentic-AI", + "source_path": "wiki/sources/Designing-for-Agentic-AI.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/教學 ChatGPT 先做知識整理,再讓 Canva、 Gamma AI 輸出簡報.md": { + "hash": "22f96f3b3818b566", + "modified": "2026-04-14T04:28:42.644429+00:00", + "slug": "教學-ChatGPT-先做知識整理-再讓-Canva--Gamma-AI-輸出簡報", + "source_path": "wiki/sources/教學-ChatGPT-先做知識整理-再讓-Canva--Gamma-AI-輸出簡報.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/Google 神级生产力工具,所有 GitHub 开源平替都找到了。.md": { + "hash": "c276812f0e1a16c8", + "modified": "2026-04-14T04:28:42.612439+00:00", + "slug": "Google-神级生产力工具-所有-GitHub-开源平替都找到了", + "source_path": "wiki/sources/Google-神级生产力工具-所有-GitHub-开源平替都找到了.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/文字生成视频网站推荐.md": { + "hash": "1bfb80d110b1d15d", + "modified": "2026-04-14T04:28:42.618167+00:00", + "slug": "文字生成视频网站推荐", + "source_path": "wiki/sources/文字生成视频网站推荐.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/A Formalization of Recursive Self-Optimizing Generative Systems.md": { + "hash": "4c740e630c3d6feb", + "modified": "2026-04-14T04:28:42.611352+00:00", + "slug": "A-Formalization-of-Recursive-Self-Optimizing-Generative-Systems", + "source_path": "wiki/sources/A-Formalization-of-Recursive-Self-Optimizing-Generative-Systems.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/LLMs、RAG、AI Agent 三个到底什么区别?.md": { + "hash": "d993ec7e1f1193c7", + "modified": "2026-04-14T04:28:42.613338+00:00", + "slug": "LLMs-RAG-AI-Agent-三个到底什么区别", + "source_path": "wiki/sources/LLMs-RAG-AI-Agent-三个到底什么区别.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/清华出的DeepSeek使用手册,104页,真的是太厉害了!(免费领取).md": { + "hash": "8333bb0a1e9c98d1", + "modified": "2026-04-14T04:28:42.644647+00:00", + "slug": "清华出的DeepSeek使用手册-104页-真的是太厉害了--免费领取", + "source_path": "wiki/sources/清华出的DeepSeek使用手册-104页-真的是太厉害了--免费领取.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/OpenAI ChatGPT 个性化定义.md": { + "hash": "88716204b070ef6e", + "modified": "2026-04-14T04:28:42.614979+00:00", + "slug": "OpenAI-ChatGPT-个性化定义", + "source_path": "wiki/sources/OpenAI-ChatGPT-个性化定义.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/详细!离线部署大模型:ollama+deepseek+open-webui安装使用方法及常见问题解决 1.md": { + "hash": "94c6a3555896bc0f", + "modified": "2026-04-14T04:28:42.618653+00:00", + "slug": "详细-离线部署大模型-ollama-deepseek-open-webui安装使用方法及常见问题解决-1", + "source_path": "wiki/sources/详细-离线部署大模型-ollama-deepseek-open-webui安装使用方法及常见问题解决-1.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/谷歌深夜甩出一份【Nano Banana Pro提示词指南】,手把手教你生产专业级内容,实战案例+提示词模版.md": { + "hash": "264a65dcc6ed8320", + "modified": "2026-04-14T04:28:42.618915+00:00", + "slug": "谷歌深夜甩出一份-Nano-Banana-Pro提示词指南--手把手教你生产专业级内容-实战案例-提示词模版", + "source_path": "wiki/sources/谷歌深夜甩出一份-Nano-Banana-Pro提示词指南--手把手教你生产专业级内容-实战案例-提示词模版.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/Nano Banana 提示词框架.md": { + "hash": "125bd4cc42a82093", + "modified": "2026-04-14T04:28:42.614283+00:00", + "slug": "Nano-Banana-提示词框架", + "source_path": "wiki/sources/Nano-Banana-提示词框架.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/The Picture They Paint of You.md": { + "hash": "9ebe6fc211a00f99", + "modified": "2026-04-14T04:28:42.615417+00:00", + "slug": "The-Picture-They-Paint-of-You", + "source_path": "wiki/sources/The-Picture-They-Paint-of-You.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/二创视频必不可少!2025年最热门AI工具推荐合集-AI配音、声音克隆.md": { + "hash": "1120914d221b396b", + "modified": "2026-04-14T04:28:42.616406+00:00", + "slug": "二创视频必不可少-2025年最热门AI工具推荐合集-AI配音-声音克隆", + "source_path": "wiki/sources/二创视频必不可少-2025年最热门AI工具推荐合集-AI配音-声音克隆.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/Useful Prompt Lib.md": { + "hash": "212e93f82d50a8d5", + "modified": "2026-04-14T04:28:42.641736+00:00", + "slug": "Useful-Prompt-Lib", + "source_path": "wiki/sources/Useful-Prompt-Lib.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/Best 7 news API data feeds - AI News.md": { + "hash": "77a3167cc88aa3e5", + "modified": "2026-04-14T04:28:42.611901+00:00", + "slug": "Best-7-news-API-data-feeds---AI-News", + "source_path": "wiki/sources/Best-7-news-API-data-feeds---AI-News.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/一语点醒梦中人.md": { + "hash": "e1c3372c4128d357", + "modified": "2026-04-14T04:28:42.615964+00:00", + "slug": "一语点醒梦中人", + "source_path": "wiki/sources/一语点醒梦中人.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/Never write another prompt.md": { + "hash": "7f12f96091b43acd", + "modified": "2026-04-14T04:28:42.614720+00:00", + "slug": "Never-write-another-prompt", + "source_path": "wiki/sources/Never-write-another-prompt.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/7 ways I use NotebookLM to make my life easier.md": { + "hash": "739fb6f13e642b93", + "modified": "2026-04-14T04:28:42.611146+00:00", + "slug": "7-ways-I-use-NotebookLM-to-make-my-life-easier", + "source_path": "wiki/sources/7-ways-I-use-NotebookLM-to-make-my-life-easier.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/不会Gemini的产品经理真的要被淘汰了 附保姆级PRD生成指南.md": { + "hash": "fc388388c6726a88", + "modified": "2026-04-14T04:28:42.616201+00:00", + "slug": "不会Gemini的产品经理真的要被淘汰了--附保姆级PRD生成指南", + "source_path": "wiki/sources/不会Gemini的产品经理真的要被淘汰了--附保姆级PRD生成指南.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/3.2 万人收藏的 Claude Skills,才是 AI 这条路上最值得研究的一套范式! 1.md": { + "hash": "0fe5fc907c5f0c13", + "modified": "2026-04-14T04:28:42.608044+00:00", + "slug": "3-2-万人收藏的-Claude-Skills-才是-AI-这条路上最值得研究的一套范式--1", + "source_path": "wiki/sources/3-2-万人收藏的-Claude-Skills-才是-AI-这条路上最值得研究的一套范式--1.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/How to Get the RSS Feed For Any YouTube Channel.md": { + "hash": "669da37412f94c10", + "modified": "2026-04-14T04:28:42.612599+00:00", + "slug": "How-to-Get-the-RSS-Feed-For-Any-YouTube-Channel", + "source_path": "wiki/sources/How-to-Get-the-RSS-Feed-For-Any-YouTube-Channel.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/GitHub 上 5000 人收藏的 Vibe Coding 神级指南。.md": { + "hash": "6a3ce97e4bee7b73", + "modified": "2026-04-14T04:28:42.612250+00:00", + "slug": "GitHub-上-5000-人收藏的-Vibe-Coding-神级指南", + "source_path": "wiki/sources/GitHub-上-5000-人收藏的-Vibe-Coding-神级指南.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/系统提示词构建原则.md": { + "hash": "4a954a07aa1f2f17", + "modified": "2026-04-14T04:28:42.618412+00:00", + "slug": "系统提示词构建原则", + "source_path": "wiki/sources/系统提示词构建原则.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/codecrafters-iobuild-your-own-x Master programming by recreating your favorite technologies from scratch.md": { + "hash": "fe614b324a7ec38f", + "modified": "2026-04-14T04:28:42.615716+00:00", + "slug": "codecrafters-iobuild-your-own-x-Master-programming-by-recreating-your-favorite-technologies-from-scratch", + "source_path": "wiki/sources/codecrafters-iobuild-your-own-x-Master-programming-by-recreating-your-favorite-technologies-from-scratch.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/如何写出完美的Prompt(提示词)?.md": { + "hash": "2adb512ec636d7e3", + "modified": "2026-04-14T04:28:42.617410+00:00", + "slug": "如何写出完美的Prompt-提示词", + "source_path": "wiki/sources/如何写出完美的Prompt-提示词.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/3.2 万人收藏的 Claude Skills,才是 AI 这条路上最值得研究的一套范式!.md": { + "hash": "dec1dd367a474b92", + "modified": "2026-04-14T04:28:42.608233+00:00", + "slug": "3-2-万人收藏的-Claude-Skills-才是-AI-这条路上最值得研究的一套范式", + "source_path": "wiki/sources/3-2-万人收藏的-Claude-Skills-才是-AI-这条路上最值得研究的一套范式.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/我的工具集.md": { + "hash": "b5b5245fe2261b1c", + "modified": "2026-04-14T04:28:42.644146+00:00", + "slug": "我的工具集", + "source_path": "wiki/sources/我的工具集.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/Nano-Banana Pro Prompting Guide & Strategies 1.md": { + "hash": "25743c16f7799d60", + "modified": "2026-04-14T04:28:42.614511+00:00", + "slug": "Nano-Banana-Pro-Prompting-Guide---Strategies-1", + "source_path": "wiki/sources/Nano-Banana-Pro-Prompting-Guide---Strategies-1.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/大模型相关术语和框架总结|LLM、MCP、Prompt、RAG、vLLM、Token、数据蒸馏.md": { + "hash": "4327c9fae4760e5b", + "modified": "2026-04-14T04:28:42.617130+00:00", + "slug": "大模型相关术语和框架总结-LLM-MCP-Prompt-RAG-vLLM-Token-数据蒸馏", + "source_path": "wiki/sources/大模型相关术语和框架总结-LLM-MCP-Prompt-RAG-vLLM-Token-数据蒸馏.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/固定镜头短视频制作的AI全流程解析.md": { + "hash": "989580878e6d7d46", + "modified": "2026-04-14T04:28:42.616867+00:00", + "slug": "固定镜头短视频制作的AI全流程解析", + "source_path": "wiki/sources/固定镜头短视频制作的AI全流程解析.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/RAG从入门到精通系列1:基础RAG.md": { + "hash": "517031840cb87bfb", + "modified": "2026-04-14T04:28:42.615169+00:00", + "slug": "RAG从入门到精通系列1-基础RAG", + "source_path": "wiki/sources/RAG从入门到精通系列1-基础RAG.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/AI 解决方案专家培训课程.md": { + "hash": "83d7fa1a956636b8", + "modified": "2026-04-14T04:28:42.611726+00:00", + "slug": "AI-解决方案专家培训课程", + "source_path": "wiki/sources/AI-解决方案专家培训课程.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/2025 年 11 个神级 AI 开源平替,GitHub 杀疯了。.md": { + "hash": "f8cf6223112ec24c", + "modified": "2026-04-14T04:28:42.607812+00:00", + "slug": "2025-年-11-个神级-AI-开源平替-GitHub-杀疯了", + "source_path": "wiki/sources/2025-年-11-个神级-AI-开源平替-GitHub-杀疯了.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/全网最全!Nano Banana 2 使用指南(2025年12月更新) 1.md": { + "hash": "50546ce87967e2af", + "modified": "2026-04-14T04:28:42.616589+00:00", + "slug": "全网最全-Nano-Banana-2-使用指南-2025年12月更新--1", + "source_path": "wiki/sources/全网最全-Nano-Banana-2-使用指南-2025年12月更新--1.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/Multi-Agent System Reliability.md": { + "hash": "a88f875cac630724", + "modified": "2026-04-14T04:28:42.613557+00:00", + "slug": "Multi-Agent-System-Reliability", + "source_path": "wiki/sources/Multi-Agent-System-Reliability.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/我用 Gemini 3 一口气做了 10 个应用,附教程.md": { + "hash": "f88d61b7b80b27ea", + "modified": "2026-04-14T04:28:42.617887+00:00", + "slug": "我用-Gemini-3-一口气做了-10-个应用-附教程", + "source_path": "wiki/sources/我用-Gemini-3-一口气做了-10-个应用-附教程.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/If you have multiple interests, do not waste the next 2-3 years 如果你有多项兴趣爱好,不要浪费接下来的两三年时间。.md": { + "hash": "f754a24079461d5e", + "modified": "2026-04-14T04:28:42.612951+00:00", + "slug": "If-you-have-multiple-interests--do-not-waste-the-next-2-3-years--如果你有多项兴趣爱好-不要浪费接下来的两三年时间", + "source_path": "wiki/sources/If-you-have-multiple-interests--do-not-waste-the-next-2-3-years--如果你有多项兴趣爱好-不要浪费接下来的两三年时间.md", + "ingested": false, + "ingested_at": null + }, + "raw/AI/如何利用Sora接口实现视频自动化生成工作流.md": { + "hash": "6a966d45acfaad43", + "modified": "2026-04-14T04:28:42.617677+00:00", + "slug": "如何利用Sora接口实现视频自动化生成工作流", + "source_path": "wiki/sources/如何利用Sora接口实现视频自动化生成工作流.md", + "ingested": false, + "ingested_at": null + }, + "raw/Skills/Last30Days-使用指南.md": { + "hash": "18618c31dec2bb5f", + "modified": "2026-04-14T04:28:42.624264+00:00", + "slug": "Last30Days-使用指南", + "source_path": "wiki/sources/Last30Days-使用指南.md", + "ingested": false, + "ingested_at": null + }, + "raw/Skills/baoyu-skills-claude-code-技能集.md": { + "hash": "1de1a2c2d9b37c1f", + "modified": "2026-04-14T04:28:42.624582+00:00", + "slug": "baoyu-skills-claude-code-技能集", + "source_path": "wiki/sources/baoyu-skills-claude-code-技能集.md", + "ingested": false, + "ingested_at": null + }, + "raw/Skills/GOG-CLI-安装配置指南.md": { + "hash": "dee4fc6505a2a0ad", + "modified": "2026-04-14T04:28:42.624049+00:00", + "slug": "GOG-CLI-安装配置指南", + "source_path": "wiki/sources/GOG-CLI-安装配置指南.md", + "ingested": false, + "ingested_at": null + }, + "raw/跨境电商/Scrapy + Playwright 抓取TikTok Shop Data.md": { + "hash": "cbb79eb5844b1907", + "modified": "2026-04-09T11:31:39.192927+00:00", + "slug": "Scrapy---Playwright-抓取TikTok-Shop-Data", + "source_path": "wiki/sources/Scrapy---Playwright-抓取TikTok-Shop-Data.md", + "ingested": false, + "ingested_at": null + }, + "raw/跨境电商/TK美国面单授权及操作流程.md": { + "hash": "809f0114b3395b26", + "modified": "2026-04-09T11:31:39.193131+00:00", + "slug": "TK美国面单授权及操作流程", + "source_path": "wiki/sources/TK美国面单授权及操作流程.md", + "ingested": false, + "ingested_at": null + }, + "raw/跨境电商/超达物流定价.md": { + "hash": "afb9efbe4df893e9", + "modified": "2026-04-09T11:31:39.193341+00:00", + "slug": "超达物流定价", + "source_path": "wiki/sources/超达物流定价.md", + "ingested": false, + "ingested_at": null + }, + "raw/跨境电商/做TK跨境思路不对努力白费.md": { + "hash": "f2276ee5969e9701", + "modified": "2026-04-09T11:31:39.193553+00:00", + "slug": "做TK跨境思路不对努力白费", + "source_path": "wiki/sources/做TK跨境思路不对努力白费.md", + "ingested": false, + "ingested_at": null + }, + "raw/跨境电商/TikTok Shop - Apache Superset Dashboard设计思路.md": { + "hash": "ca3a3672eaf68cff", + "modified": "2026-04-09T11:31:39.194126+00:00", + "slug": "TikTok-Shop---Apache-Superset-Dashboard设计思路", + "source_path": "wiki/sources/TikTok-Shop---Apache-Superset-Dashboard设计思路.md", + "ingested": false, + "ingested_at": null + }, + "raw/跨境电商/电商视频Prompt.md": { + "hash": "77272706c2e1bcb4", + "modified": "2026-04-09T11:31:39.194362+00:00", + "slug": "电商视频Prompt", + "source_path": "wiki/sources/电商视频Prompt.md", + "ingested": false, + "ingested_at": null + }, + "raw/跨境电商/电商如何选品 如何找到爆款 选品策略.md": { + "hash": "f89b9e48849625dd", + "modified": "2026-04-09T11:31:39.194588+00:00", + "slug": "电商如何选品-如何找到爆款-选品策略", + "source_path": "wiki/sources/电商如何选品-如何找到爆款-选品策略.md", + "ingested": false, + "ingested_at": null + } + } +} \ No newline at end of file diff --git a/tools/sync.py b/tools/sync.py index 70c4ba9..417cdec 100755 --- a/tools/sync.py +++ b/tools/sync.py @@ -4,7 +4,7 @@ Wiki ↔ Raw 三向同步工具 功能: - 检测 raw/ 下文件变化(新增/修改/删除) - - 自动调用 ingest.py 进行同步 + - 调用 Claude Code agent 进行同步(不使用 litellm) - 维护 manifest.json 状态映射 - 检测 orphan entity/concept(仅报告,不删除) @@ -12,7 +12,6 @@ Wiki ↔ Raw 三向同步工具 python tools/sync.py --check 预览变化(不执行) python tools/sync.py --sync 执行同步 python tools/sync.py --rebuild 从 manifest 重建 wiki/index(兜底) - python tools/sync.py --bootstrap 从现有 wiki sources 反向生成 manifest(首次用,跳过已 ingest 的文件) manifest.json 格式: { @@ -39,9 +38,10 @@ from pathlib import Path from datetime import datetime, timezone -REPO_ROOT = Path(__file__).parent.parent +REPO_ROOT = Path(__file__).parent.parent.resolve() WIKI_DIR = REPO_ROOT / "wiki" -MANIFEST_FILE = WIKI_DIR / "manifest.json" +# manifest.json 放在 tools/ 而非 wiki/,避免 symlink 路径问题 +MANIFEST_FILE = Path(__file__).parent / "manifest.json" SCHEMA_FILE = REPO_ROOT / "CLAUDE.md" @@ -127,26 +127,71 @@ def build_slug_from_path(rel_path: str) -> str: return name or "untitled" -def call_ingest(source_path: str, slug: str = None) -> dict: - """调用 ingest.py,返回结果""" - cmd = [sys.executable, str(REPO_ROOT / "tools" / "ingest.py"), source_path] - try: - result = subprocess.run( - cmd, - capture_output=True, - text=True, - timeout=300, - cwd=str(REPO_ROOT), - ) - return { - "success": result.returncode == 0, - "stdout": result.stdout, - "stderr": result.stderr, - } - except subprocess.TimeoutExpired: - return {"success": False, "stdout": "", "stderr": "Timeout (>5min)"} - except Exception as e: - return {"success": False, "stdout": "", "stderr": str(e)} +def call_ingest(abs_path: str, slug: str, json_mode: bool = False) -> dict: + """调用 Claude Code agent 执行 /wiki-ingest,返回结果 + + 使用 TMUX 交互模式调用 Claude Code Agent + 返回 special status 让 Hermes 可以手动处理 TMUX 会话 + """ + return { + "status": "needs_manual_tmux", + "abs_path": abs_path, + "slug": slug, + "message": "需要通过 TMUX 手动执行 /wiki-ingest,请使用 llm-wiki-sync 技能流程", + } + + +def start_tmux_session() -> bool: + """启动 TMUX session 用于 wiki ingest""" + TMUX_SESSION = "wiki-ingest" + + # 检查 TMUX session 是否存在 + check = subprocess.run( + ["tmux", "has-session", "-t", TMUX_SESSION], + capture_output=True, + ) + + if check.returncode == 0: + print(f" TMUX session '{TMUX_SESSION}' already exists") + return True + + # 创建新 session + subprocess.run( + ["tmux", "new-session", "-d", "-s", TMUX_SESSION, + f"cd {REPO_ROOT} && claude --permission-mode bypassPermissions"], + check=True, + ) + print(f" Created TMUX session '{TMUX_SESSION}'") + return True + + +def send_to_tmux(command: str) -> bool: + """发送命令到 TMUX session""" + TMUX_SESSION = "wiki-ingest" + subprocess.run( + ["tmux", "send-keys", "-t", TMUX_SESSION, f"{command}\n"], + check=True, + ) + return True + + +def wait_for_completion(seconds: int = 120) -> bool: + """等待 Claude Code 完成处理""" + import time + print(f" Waiting {seconds}s for Claude Code to complete...") + time.sleep(seconds) + return True + + +def cleanup_tmux() -> bool: + """清理 TMUX session""" + TMUX_SESSION = "wiki-ingest" + subprocess.run( + ["tmux", "kill-session", "-t", TMUX_SESSION], + capture_output=True, + ) + print(f" Killed TMUX session '{TMUX_SESSION}'") + return True def find_orphan_entity_concept(manifest: dict) -> tuple[list, list]: @@ -225,13 +270,12 @@ def check_changes(manifest: dict, raw_files: dict) -> dict: return changes -def run_sync(dry_run: bool = False, verbose: bool = False): - print(f"\n{bold('=== Wiki Sync')}\n") - print(f" Date: {datetime.now().strftime('%Y-%m-%d %H:%M')}") - print(f" Raw: {REPO_ROOT / 'raw'}") - print(f" Wiki: {WIKI_DIR}") +def run_sync(dry_run: bool = False, verbose: bool = False, json_mode: bool = False): + print(f"\n{bold('=== Wiki Sync')}\n", end="") + print(f" Date: {datetime.now().strftime('%Y-%m-%d %H:%M')}\n") + print(f" Raw: {REPO_ROOT / 'raw'}\n") + print(f" Wiki: {WIKI_DIR}\n") print(f" Mode: {'DRY-RUN (preview only)' if dry_run else 'LIVE SYNC'}") - print() # Step 1: load manifest manifest = load_manifest() @@ -250,190 +294,150 @@ def run_sync(dry_run: bool = False, verbose: bool = False): return # ─── Report ─── - print(f"\n{bold('--- Changes ---')}") - print(f" {green('+')} New: {len(changes['new'])}") - print(f" {yellow('~')} Updated: {len(changes['updated'])}") - print(f" {red('-')} Deleted: {len(changes['deleted'])}") + if not json_mode: + print(f"\n{bold('--- Changes ---')}") + print(f" {green('+')} New: {len(changes['new'])}") + print(f" {yellow('~')} Updated: {len(changes['updated'])}") + print(f" {red('-')} Deleted: {len(changes['deleted'])}") if verbose or not dry_run: if changes["new"]: - print(f"\n {bold('New Files:')}") + if not json_mode: + print(f"\n {bold('New Files:')}") for f in changes["new"]: - log(f"{green('[+')} {f['rel_path']}", "normal") + if json_mode: + print(json.dumps({ + "event": "new_detected", + "rel_path": f["rel_path"], + "slug": build_slug_from_path(f["rel_path"]), + })) + else: + log(f"{green('[+')} {f['rel_path']}", "normal") if changes["updated"]: - print(f"\n {bold('Updated Files:')}") + if not json_mode: + print(f"\n {bold('Updated Files:')}") for f in changes["updated"]: - log(f"{yellow('[~]')} {f['rel_path']} (hash changed)", "normal") + if json_mode: + print(json.dumps({ + "event": "updated_detected", + "rel_path": f["rel_path"], + "slug": manifest["files"].get(f["rel_path"], {}).get("slug") or build_slug_from_path(f["rel_path"]), + })) + else: + log(f"{yellow('[~]')} {f['rel_path']} (hash changed)", "normal") if changes["deleted"]: - print(f"\n {bold('Deleted Files:')}") + if not json_mode: + print(f"\n {bold('Deleted Files:')}") for f in changes["deleted"]: - log(f"{red('[-]')} {f['rel_path']}", "normal") + if json_mode: + print(json.dumps({ + "event": "deleted_detected", + "rel_path": f["rel_path"], + })) + else: + log(f"{red('[-]')} {f['rel_path']}", "normal") if dry_run: log("\nDry-run complete. Run with --sync to apply.", "warn") return # ─── Apply Sync ─── - print(f"\n{bold('--- Applying Sync ---')}") + # 注意:call_ingest 现在返回 needs_manual_tmux,提示 Hermes 通过 TMUX 手动执行 + # 这里只做 manifest 记录,不实际调用 Claude Code + if not json_mode: + print(f"\n{bold('--- Applying Sync ---')}") + print(" Note: Ingest execution requires manual TMUX workflow") + print(" Use llm-wiki-sync skill for actual ingestion") + print() updated_manifest = manifest.copy() updated_manifest["files"] = manifest.get("files", {}).copy() - # ① 新增 → ingest + # 标记新增和更新的文件为待处理(由 Hermes 手动执行) + pending_files = [] + + # ① 新增 → 标记待处理 for f in changes["new"]: rel_path = f["rel_path"] abs_path = f["abs_path"] slug = build_slug_from_path(rel_path) - print(f"\n {green('[+]')} New: {rel_path}") - print(f" slug: {slug}") - - result = call_ingest(abs_path, slug) - if result["success"]: - log(f"Ingested: {slug}.md", "success") - updated_manifest["files"][rel_path] = { - "hash": f["hash"], - "modified": f["modified"], - "slug": slug, - "source_path": f"wiki/sources/{slug}.md", - "ingested": True, - "ingested_at": iso_now(), - } - else: - log(f"Failed: {result['stderr'][:200]}", "error") - # 仍然记录(避免重复 ingest) - updated_manifest["files"][rel_path] = { - "hash": f["hash"], - "modified": f["modified"], - "slug": slug, - "source_path": f"wiki/sources/{slug}.md", - "ingested": False, - "ingested_at": None, - "error": result["stderr"][:500], - } - - # ② 修改 → re-ingest + + if json_mode: + print(json.dumps({"event": "pending", "rel_path": rel_path, "slug": slug, "action": "new"})) + + pending_files.append({"rel_path": rel_path, "abs_path": abs_path, "slug": slug, "action": "new"}) + + # 先不更新 manifest,等实际执行完成后再更新 + # updated_manifest["files"][rel_path] = {...} + + # ② 修改 → 标记待处理 for f in changes["updated"]: rel_path = f["rel_path"] abs_path = f["abs_path"] old_slug = manifest["files"].get(rel_path, {}).get("slug") or build_slug_from_path(rel_path) - print(f"\n {yellow('[~]')} Updated: {rel_path}") + + if json_mode: + print(json.dumps({"event": "pending", "rel_path": rel_path, "slug": old_slug, "action": "updated"})) + + pending_files.append({"rel_path": rel_path, "abs_path": abs_path, "slug": old_slug, "action": "updated"}) - result = call_ingest(abs_path, old_slug) - if result["success"]: - log(f"Re-ingested: {old_slug}.md", "success") - updated_manifest["files"][rel_path] = { - **updated_manifest["files"].get(rel_path, {}), - "hash": f["hash"], - "modified": f["modified"], - "slug": old_slug, - "source_path": f"wiki/sources/{old_slug}.md", - "ingested": True, - "ingested_at": iso_now(), - } - else: - log(f"Failed: {result['stderr'][:200]}", "error") - - # ③ 删除 → 保留 wiki 内容,仅从 manifest 移除(按用户要求保留 orphan) + # ③ 删除 → 保留 wiki 内容,仅从 manifest 移除 + deleted_files = [] for f in changes["deleted"]: rel_path = f["rel_path"] source_path = f.get("source_path") - print(f"\n {red('[-]')} Deleted: {rel_path}") + log(f"Deleted: {rel_path}", "warn") if source_path: sp = WIKI_DIR / source_path log(f" Wiki source kept: {sp}", "warn") - # 从 manifest 移除(不删除 wiki 文件) if rel_path in updated_manifest["files"]: del updated_manifest["files"][rel_path] + deleted_files.append(rel_path) - # Step 4: Save manifest + # Step 4: Save manifest(不保存 pending files,等待实际执行后更新) + # 注意:不再在 --sync 时自动更新 manifest,而是由 Hermes 手动更新 + # 这样可以追踪哪些文件需要处理 + # 只保存已删除的文件变更 save_manifest(updated_manifest) log(f"\nmanifest.json updated ({len(updated_manifest['files'])} entries)", "success") + # 输出 pending files 列表,供 Hermes 手动执行 + if json_mode: + print(json.dumps({ + "event": "sync_complete", + "summary": { + "pending": len(pending_files), + "deleted": len(deleted_files), + "manifest_entries": len(updated_manifest["files"]), + }, + "pending_files": pending_files, + "deleted_files": deleted_files, + })) + # Step 5: Orphan detection orphan_entities, orphan_concepts = find_orphan_entity_concept(updated_manifest) - if orphan_entities or orphan_concepts: - print(f"\n{bold('--- Orphan Report (kept as requested) ---')}") - if orphan_entities: - print(f" {bold('Orphan Entities')} ({len(orphan_entities)}):") - for e in sorted(orphan_entities): - print(f" {dim('?')} {e}") - if orphan_concepts: - print(f" {bold('Orphan Concepts')} ({len(orphan_concepts)}):") - for c in sorted(orphan_concepts): - print(f" {dim('?')} {c}") - log("\nOrphan pages are kept (not deleted per user request).", "info") - else: - log("No orphan entity/concept detected.", "success") + if not json_mode: + if orphan_entities or orphan_concepts: + print(f"\n{bold('--- Orphan Report (kept as requested) ---')}") + if orphan_entities: + print(f" {bold('Orphan Entities')} ({len(orphan_entities)}):") + for e in sorted(orphan_entities): + print(f" {dim('?')} {e}") + if orphan_concepts: + print(f" {bold('Orphan Concepts')} ({len(orphan_concepts)}):") + for c in sorted(orphan_concepts): + print(f" {dim('?')} {c}") + log("\nOrphan pages are kept (not deleted per user request).", "info") + else: + log("No orphan entity/concept detected.", "success") + # Step 6: JSON summary(已在上面输出 pending_files) + # 旧的 summary 输出已删除,因为不再自动执行 ingest print(f"\n{bold('Done.')}") - - -def run_bootstrap(): - """从现有 wiki sources 反向生成 manifest,跳过已 ingest 的文件""" - import re - - print(f"\n{bold('=== Wiki Bootstrap')}\n") - print(f" Scanning existing wiki sources to build manifest ...\n") - - sources_dir = WIKI_DIR / "sources" - if not sources_dir.exists(): - print(f" {red('✗')} No wiki/sources/ directory found. Nothing to bootstrap.") - return - - wikilink_pattern = re.compile(r"\[\[?raw/([^\]\s]+\.md)\]?]?", re.IGNORECASE) - - manifest = {"version": 1, "updated_at": iso_now(), "files": {}} - raw_dir = (REPO_ROOT / "raw").resolve() # 解析 symlink 到真实路径 - repo_raw_prefix = str(REPO_ROOT / "raw") # 用于 strip 前缀得到相对路径 - bootstrapped = 0 - skipped_not_found = 0 - skipped_no_source_field = 0 - - for src in sources_dir.glob("*.md"): - content = src.read_text(encoding="utf-8") - - # 尝试从 ## Source File 字段提取原始路径 - match = wikilink_pattern.search(content) - if not match: - skipped_no_source_field += 1 - continue - - # raw_rel 格式如 "Agent/usecases/xxx.md"(不含 raw/ 前缀) - raw_rel = match.group(1).lstrip("/") - # 用 resolved 后的 raw_dir 拼接(follow symlink) - raw_path = raw_dir / raw_rel - - if not raw_path.exists(): - # 文件已删除,保留 source page 但不加入 manifest - skipped_not_found += 1 - continue - - stat = raw_path.stat() - file_hash = sha256_file(raw_path) - slug = src.stem - - # manifest key 用 "raw/Agent/xxx.md" 格式(REPO_ROOT 相对路径) - manifest_key = f"raw/{raw_rel}" - manifest["files"][manifest_key] = { - "hash": file_hash, - "modified": datetime.fromtimestamp(stat.st_mtime, tz=timezone.utc).isoformat(), - "slug": slug, - "source_path": f"wiki/sources/{slug}.md", - "ingested": True, - "ingested_at": datetime.fromtimestamp(stat.st_mtime, tz=timezone.utc).isoformat(), - } - bootstrapped += 1 - - save_manifest(manifest) - - print(f" {bold('Result:')}") - print(f" {green('✓')} Manifest entries created: {bootstrapped}") - print(f" {yellow('~')} Skipped (source file deleted): {skipped_not_found}") - print(f" {dim('-')} Skipped (no source_file field): {skipped_no_source_field}") - print(f"\n {green('✓')} manifest.json created at: {MANIFEST_FILE}") - print(f"\n Run now: {bold('python tools/sync.py --check')} to preview new/updated files.\n") + print(f"\n Pending files for manual TMUX ingestion: {len(pending_files)}") + print(" Use llm-wiki-sync skill to process these files.") def run_check(): @@ -537,26 +541,56 @@ if __name__ == "__main__": help="从 manifest 重建 wiki/index.md(兜底方案)", ) parser.add_argument( - "--bootstrap", + "--reset-failed", action="store_true", - help="从现有 wiki sources 反向生成 manifest(首次使用,跳过已 ingest 的文件)", + help="重置所有 failed 的 ingest 状态(让它们重新待处理)", + ) + parser.add_argument( + "--pending", + action="store_true", + help="列出所有待摄取的 pending 文件", ) parser.add_argument( "--verbose", "-v", action="store_true", help="详细输出", ) + parser.add_argument( + "--json", + action="store_true", + help="JSON 行输出模式(供调用方解析)", + ) args = parser.parse_args() - if args.bootstrap: - run_bootstrap() - elif args.rebuild: + if args.rebuild: run_rebuild() + elif args.pending: + # 列出待摄取的文件 + manifest = load_manifest() + pending = [k for k, v in manifest["files"].items() if not v.get("ingested")] + print(f"=== Pending Ingest Files ({len(pending)}) ===\n") + for i, path in enumerate(pending, 1): + print(f"{i:3}. {path}") + elif args.reset_failed: + # 重置失败的 ingest 状态 + manifest = load_manifest() + reset_count = 0 + for k, v in manifest["files"].items(): + if v.get("error"): + v["ingested"] = False + v.pop("error", None) + v.pop("ingested_at", None) + reset_count += 1 + if reset_count > 0: + save_manifest(manifest) + print(f"Reset {reset_count} failed entries to pending.") + else: + print("No failed entries found.") elif args.check: run_check() elif args.sync: - run_sync(dry_run=False, verbose=args.verbose) + run_sync(dry_run=False, verbose=args.verbose, json_mode=args.json) else: parser.print_help() print("\n示例:") @@ -564,4 +598,3 @@ if __name__ == "__main__": print(" python tools/sync.py --sync # 执行同步") print(" python tools/sync.py --sync -v # 详细模式") print(" python tools/sync.py --rebuild # 重建 index") - print(" python tools/sync.py --bootstrap # 首次:从 wiki sources 生成 manifest")