开始前(可选):版本检查 如需确认是否为最新版本,请运行: - 若远程版本获取失败:不会阻塞任务 - 若检测到版本落后:会提示但不阻塞 编辑策略选择(最重要) 根据用户意图选择正确的编辑方式, 选错会导致数据丢失 : | 用户想要 | 正确做法 | 错误做法 | |---------|---------|---------| | 修改单个块内容 | (最高效) | apply-patch 整个文档 | | 删除单个块 | (最高效) | apply-patch 整个文档 | | 批量修改已有内容 | (update/delete/reorder/insert) | | | 批量删除/重排块 | (delete/reorder) | | | 添加新内容 | (简单稳妥)或 insert(批量场景) | | | 在指定位置插入新块 | (首选)或 insert | | | 替换章节内容 | | apply-patch 删除+插入 | | 重构文档(如拆表格) | + 逐步重建 | apply-patch 删除旧块+插入新块 | | 跨章节分散修改多个块 | 编写单个 JS 脚本,循环 → (同一进程内版本自动刷新) | 并行 Bash 调用 update-block(会版本冲突) | Intent Decision Tree Write Safety Protocol 写入前通常需要…

...\\n...'` 语法(Bash ANSI-C quoting),普通双引号 `\"...\\n...\"` 中的 `\\n` 是字面文本不是换行\r\n- 连接检查:`node index.js check`\r\n---","attachment_filenames":["_meta.json","docs/Command-Reference.md","docs/Error-Recovery.md","docs/pmf-spec.md","docs/SQL-Reference.md","README.md"],"attachments":[{"filename":"_meta.json","content":"{\n \"owner\": \"fanxing-6\",\n \"slug\": \"siyuan-notes-skill\",\n \"displayName\": \"Siyuan Notes Skill\",\n \"latest\": {\n \"version\": \"0.1.0\",\n \"publishedAt\": 1773416867133,\n \"commit\": \"https://github.com/openclaw/skills/commit/7c0985cd08cdc62ed2767ffad9bc3445be066c13\"\n },\n \"history\": []\n}\n","content_type":"application/json; charset=utf-8","language":"json","size":291,"content_sha256":"dea99ef6d1ba51634852246791c95aa97db945e1f22e993acdbc433f4f5e0fdf"},{"filename":"docs/Command-Reference.md","content":"# Command Reference\n\nAll commands: `node index.js {command} [args]`\n\n**Prerequisite**: cwd must be the skill directory (where `index.js` is located).\n\n---\n\n## Read Commands\n\n### search — Search notes\n\n```bash\nnode index.js search {keyword} [limit] [type]\n```\n\n| Parameter | Required | Default | Description |\n|-----------|----------|---------|-------------|\n| keyword | Yes | | Search term |\n| limit | No | 20 | Result count (1-200) |\n| type | No | all | `p` paragraph `h` heading `l` list `c` code `d` document `t` table |\n\nFlexible parameter order: `search \"AI\" 10 h` or `search \"AI\" h` (omit limit to use default 20)\n\n**Returns**: Formatted text, one result per line with block ID, content, type, time\n\n---\n\n### search-md — Search with Markdown output\n\n```bash\nnode index.js search-md {keyword} [limit] [type]\n```\n\nSame parameters as `search`. **Returns**: Full Markdown page format\n\n---\n\n### open-doc — Open document\n\n```bash\nnode index.js open-doc {docID} [readable|patchable] [--full] [--cursor {blockID}] [--limit-chars {N}] [--limit-blocks {N}]\n```\n\n| Parameter | Required | Default | Description |\n|-----------|----------|---------|-------------|\n| docID | Yes | | Document block ID |\n| view | No | readable | `readable` = clean Markdown; `patchable` = PMF format |\n| --full | No | | Skip truncation/pagination, output full document |\n| --cursor | No | | Patchable pagination start block ID |\n| --limit-chars | No | 15000 | Readable view character truncation threshold (1000-1000000) |\n| --limit-blocks | No | 50 | Patchable view blocks per page (5-10000) |\n\n**Returns**:\n- `readable`: YAML header + Markdown body. Long docs auto-truncate to `--limit-chars` with heading outline\n- `patchable`: PMF format with block IDs. Long docs auto-paginate, header includes `partial=true next_cursor={blockID}`\n\n**Side effect**: Marks document as \"read\" and records version snapshot (satisfies write precondition)\n\n**Environment variables**:\n- `SIYUAN_OPEN_DOC_CHAR_LIMIT`: Override default character truncation threshold\n- `SIYUAN_OPEN_DOC_BLOCK_PAGE_SIZE`: Override default blocks per page\n\n---\n\n### open-section — Read section\n\n```bash\nnode index.js open-section {headingBlockID} [readable|patchable]\n```\n\n| Parameter | Required | Default | Description |\n|-----------|----------|---------|-------------|\n| headingBlockID | Yes | | Must be a heading block (type=h) |\n| view | No | readable | `readable` = Markdown; `patchable` = PMF format |\n\n**Returns**:\n- `readable`: YAML header (with scope: section) + Markdown of all blocks under the heading\n- `patchable`: PMF format (header has `partial=true section={headingBlockID}`)\n\n**Side effect**: Marks document as \"read\"\n\n**Note**: Patchable PMF is marked `partial=true`, cannot be used for apply-patch. Use `replace-section` or `update-block` for editing.\n\n---\n\n### search-in-doc — Search within document\n\n```bash\nnode index.js search-in-doc {docID} {keyword} [limit]\n```\n\n| Parameter | Required | Default | Description |\n|-----------|----------|---------|-------------|\n| docID | Yes | | Document to search |\n| keyword | Yes | | Search keyword |\n| limit | No | 20 | Result count (1-200) |\n\n**Returns**: Formatted text with block ID, content, type, time\n\nIdeal for quickly locating content in long documents without reading the whole thing.\n\n---\n\n### notebooks — List notebooks\n\n```bash\nnode index.js notebooks\n```\n\nNo parameters. **Returns**: Numbered list with notebook name, ID, closed status\n\n---\n\n### docs — List documents\n\n```bash\nnode index.js docs [notebookID] [limit]\n```\n\n| Parameter | Required | Default | Description |\n|-----------|----------|---------|-------------|\n| notebookID | No | all | Filter by notebook |\n| limit | No | 200 | Result count (1-2000) |\n\n**Returns**: Formatted text with document ID (e.g., `[20260206204419-vgvxojw]`)\n\n---\n\n### headings — Document headings\n\n```bash\nnode index.js headings {docID} [level]\n```\n\n| Parameter | Required | Default | Description |\n|-----------|----------|---------|-------------|\n| docID | Yes | | |\n| level | No | all | `h1`/`h2`/`h3`/`h4`/`h5`/`h6` (string format, not number) |\n\n---\n\n### blocks — Document child blocks\n\n```bash\nnode index.js blocks {docID} [type]\n```\n\n| Parameter | Required | Default | Description |\n|-----------|----------|---------|-------------|\n| docID | Yes | | |\n| type | No | all | `p`/`h`/`l`/`t`/`c` etc. |\n\n**Returns**: Formatted text with block ID (e.g., `[20260206204442-j76ycfo]`), usable as anchors for append-block / insert-block.\n\nImage blocks are marked with `[img]` in the summary.\n\n---\n\n### Other read commands\n\n| Command | Signature | Description |\n|---------|-----------|-------------|\n| `doc-children` | `{notebookID} [path]` | List child documents |\n| `doc-tree` | `{notebookID} [path] [depth]` | Document tree (default depth 4) |\n| `doc-tree-id` | `{docID} [depth]` | Document tree by doc ID |\n| `tag` | `{tagName}` | Search by tag |\n| `backlinks` | `{blockID}` | Backlinks |\n| `tasks` | `[status] [days]` | Tasks (`[ ]`/`[x]`/`[-]`, default 7 days) |\n| `daily` | `{start} {end}` | Daily Notes (YYYYMMDD) |\n| `attr` | `{name} [value]` | Query by attribute (`custom-` prefix for custom attrs) |\n| `bookmarks` | `[name]` | Bookmarks |\n| `random` | `{docID}` | Random heading |\n| `recent` | `[days] [type]` | Recent changes (default 7 days) |\n| `unreferenced` | `{notebookID}` | Unreferenced documents |\n| `check` | | Connection check |\n| `version` | | Kernel version |\n| `version-check` | | Skill version check |\n\n---\n\n## Write Commands\n\n**All write commands require**:\n1. `SIYUAN_ENABLE_WRITE=true` (env var or command prefix)\n2. Prior `open-doc` or `open-section` of the target document\n3. Document must not have been modified by another client since reading\n\n**Exceptions**: `create-doc` and `rename-doc` do not require prior `open-doc`\n\n---\n\n### create-doc — Create document\n\n```bash\nSIYUAN_ENABLE_WRITE=true node index.js create-doc {notebookID} {title}\n```\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| notebookID | Yes | Target notebook |\n| title | Yes | Document title |\n| stdin | No | Initial content (Markdown via stdin) |\n\n```bash\n# Empty document\nSIYUAN_ENABLE_WRITE=true node index.js create-doc \"notebookID\" \"My Doc\"\n\n# With initial content\nprintf '## Section 1\\nContent' | SIYUAN_ENABLE_WRITE=true node index.js create-doc \"notebookID\" \"My Doc\"\n```\n\n---\n\n### rename-doc — Rename document\n\n```bash\nSIYUAN_ENABLE_WRITE=true node index.js rename-doc {docID} {newTitle}\n```\n\nAutomatically resolves notebook and path from doc ID.\n\n---\n\n### update-block — Update block content (auto-split support)\n\n```bash\nprintf 'new content' | SIYUAN_ENABLE_WRITE=true node index.js update-block {blockID}\n```\n\nContent via stdin only. If content parses as multiple blocks, automatically performs \"first block update + subsequent inserts\" with post-write verification.\n\n---\n\n### delete-block — Delete single block\n\n```bash\nSIYUAN_ENABLE_WRITE=true node index.js delete-block {blockID}\n```\n\n---\n\n### append-block — Append content\n\n```bash\nprintf 'content' | SIYUAN_ENABLE_WRITE=true node index.js append-block {parentID}\n```\n\n`parentID` can be a document ID (append to end) or heading block ID (append to section).\n\n---\n\n### insert-block — Insert at position\n\n```bash\nprintf 'content' | SIYUAN_ENABLE_WRITE=true node index.js insert-block --before {blockID}\nprintf 'content' | SIYUAN_ENABLE_WRITE=true node index.js insert-block --after {blockID}\nprintf 'content' | SIYUAN_ENABLE_WRITE=true node index.js insert-block --parent {blockID}\n```\n\nThree anchor modes: `--before` (insert before), `--after` (insert after), `--parent` (append as child).\n\n---\n\n### replace-section — Replace section content\n\n```bash\nprintf 'new content' | SIYUAN_ENABLE_WRITE=true node index.js replace-section {headingID}\nSIYUAN_ENABLE_WRITE=true node index.js replace-section {headingID} --clear\n```\n\nDeletes all blocks under the heading, then appends new content. **The heading block itself is preserved** — do not repeat the heading in your new content.\n\n---\n\n### apply-patch — Apply PMF patch\n\n```bash\ncat /tmp/doc.pmf | SIYUAN_ENABLE_WRITE=true node index.js apply-patch {docID}\n```\n\nSupports: update / delete / reorder / insert. PMF must be complete (missing blocks = deletion). Partial PMF is rejected.\n\nSee [[PMF Spec]] for details.\n\n---\n\n### move-docs-by-id — Move documents\n\n```bash\nSIYUAN_ENABLE_WRITE=true node index.js move-docs-by-id {targetID} {sourceIDs}\n```\n\nRequires prior `open-doc` of target AND all source documents.\n\n---\n\n## JS API (node -e / script)\n\nFor operations not covered by CLI, or for batch editing multiple blocks in a single process.\n\n### Function Signatures\n\n**⚠️ JS API 签名与 CLI 参数不同,不要混淆。**\n\n| Function | Signature | Description |\n|----------|-----------|-------------|\n| `openDocument` | `(docId: string, mode: 'readable'\\|'patchable') → Promise` | 读取文档(标记已读,刷新版本号) |\n| `updateBlock` | `(id: string, markdown: string) → Promise` | 更新块内容。**仅 2 个参数**,不要传 dataType |\n| `deleteBlock` | `(id: string) → Promise` | 删除单个块 |\n| `insertBlock` | `(markdown: string, anchors: { previousID?, nextID?, parentID? }) → Promise` | 在锚点位置插入。锚点参数名是 `previousID`/`nextID`/`parentID`,**不是** `after`/`before`/`parent` |\n| `appendMarkdownToBlock` | `(parentID: string, markdown: string) → Promise` | 在父块末尾追加内容 |\n| `executeSiyuanQuery` | `(sql: string) → Promise\u003cArray>` | 执行 SQL 查询 |\n| `getChildBlocks` | `(id: string) → Promise\u003cArray>` | 获取子块列表 |\n| `createDocWithMd` | `(notebookID: string, path: string, markdown: string) → Promise` | 创建文档(path 决定标题) |\n| `formatResults` | `(rows: Array) → string` | 格式化查询结果为文本 |\n\n### Common Gotchas\n\n1. **`updateBlock` 只有 2 个参数** `(id, markdown)`。不要写 `updateBlock(id, 'markdown', content)` — 这会把字符串 `'markdown'` 当作内容写入,**破坏块数据**\n2. **`insertBlock` 的锚点参数名** 是 SiYuan API 原生的 `previousID`/`nextID`/`parentID`,不是 CLI 的 `--after`/`--before`/`--parent`\n3. **写入前必须 `openDocument`** 刷新版本号。在同一进程内连续写入时,每次写入前都要调用\n4. **所有写入函数** 需要环境变量 `SIYUAN_ENABLE_WRITE=true`\n\n### Examples\n\n```bash\n# SQL query\nnode -e \"const s = require('./index.js'); s.executeSiyuanQuery('SELECT * FROM blocks WHERE type=\\\"d\\\" LIMIT 5').then(r => console.log(s.formatResults(r)));\"\n\n# Get child blocks\nnode -e \"const s = require('./index.js'); s.getChildBlocks('docID').then(r => console.log(JSON.stringify(r, null, 2)));\"\n\n# Create sub-document\nSIYUAN_ENABLE_WRITE=true node -e \"const s = require('./index.js'); s.createDocWithMd('notebookID', '/Parent/ChildTitle', '# Content').then(r => console.log(JSON.stringify(r)));\"\n\n# Batch edit (single process, sequential)\nSIYUAN_ENABLE_WRITE=true node -e \"\nconst s = require('./index.js');\n(async () => {\n await s.openDocument('docID', 'readable');\n await s.updateBlock('blockID1', '新内容1');\n await s.openDocument('docID', 'readable');\n await s.updateBlock('blockID2', '新内容2');\n await s.openDocument('docID', 'readable');\n await s.insertBlock('插入内容', { previousID: 'anchorID' });\n console.log('All done');\n})();\n\"\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":11396,"content_sha256":"5b4f853e40f72580dcaffc7180672258c1132dddaa3a5af59ae169d1afaf441a"},{"filename":"docs/Error-Recovery.md","content":"# Error Recovery\n\n| Error | Cause | Recovery |\n|-------|-------|----------|\n| `invalid ID argument` | Block ID doesn't exist or wrong format | Re-export `open-doc ... patchable --full`, verify block IDs before submitting |\n| Document cleared | Submitted incomplete PMF, missing blocks treated as deletion | Use `open-doc ... patchable --full` to re-export full PMF and restore |\n| Write guard error | No prior open-doc / open-section or read mark expired | Run `open-doc \"docID\" readable` (or `open-section`) then retry |\n| Version conflict | Document modified by another client after read | `open-doc \"docID\" readable` to get latest version, then retry |\n| PMF version conflict | Document modified after PMF export | `open-doc \"docID\" patchable --full` to re-export, save with `tee` |\n| partial PMF rejected | Paginated/section PMF is incomplete | Use `update-block` for single-block edit, or `open-section` + `replace-section` for section edit |\n| Read-only mode | Missing `SIYUAN_ENABLE_WRITE=true` | Add `SIYUAN_ENABLE_WRITE=true` prefix |\n| Document title \"Untitled\" | `createDocWithMd` path parameter determines title | Use `create-doc` CLI (auto-sets title) or `rename-doc` to fix |\n| Connection failed | SiYuan not running / wrong port / token | `node index.js check` to verify |\n| Search returns empty | Keyword too short / no matches | Use `search-in-doc` to limit scope, or expand keyword context |\n| Parallel write version conflict | Multiple independent Bash commands writing to the same document | Use a single JS script with sequential writes (see Pattern 8 in SKILL.md), or re-run `open-doc` before each write |\n| `updateBlock` writes literal \"markdown\" | Called JS API with 3 args: `updateBlock(id, 'markdown', content)` | **`updateBlock` takes only 2 args**: `updateBlock(id, markdownContent)`. The string `'markdown'` was treated as content. Fix: delete corrupted block, re-insert correct content |\n| `insertBlock 需要至少一个锚点参数` | Used wrong parameter names like `{ after: id }` | Use SiYuan native names: `{ previousID: id }` (insert after), `{ nextID: id }` (insert before), `{ parentID: id }` (append as child) |\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":2152,"content_sha256":"e4fdb5eaf790b18ce352f94cb6559e60015596c8d744f2f63373c52bb377706c"},{"filename":"docs/pmf-spec.md","content":"# Patchable Markdown Format (PMF v1)\n\nPMF 是保留思源块 ID 的 Markdown 格式,用于精确文档编辑。\n\n## 格式结构\n\n### 文档标记(第一行,必需)\n\n```\n%% @siyuan:doc id=20260119203720-12nweia hpath=\"/数据构建/数据分析\" view=patchable pmf=v1 %%\n```\n\n### 块标记(每个块一个)\n\n```\n%% @siyuan:block id=20260121165142-nzdyfe0 type=t parent=20260119203720-12nweia %%\n| 列1 | 列2 |\n|------|------|\n| 数据 | 数据 |\n```\n\n| 属性 | 必需 | 说明 |\n|------|------|------|\n| `id` | 是 | 块 ID,格式 `YYYYMMDDHHmmss-xxxxxxx` |\n| `type` | 是 | 块类型:`h`标题 `p`段落 `l`列表 `c`代码 `t`表格 `m`公式 `b`引述 `s`超级块 |\n| `subType` | 否 | `h1`-`h6`(标题)、`u`/`t`/`o`(列表) |\n| `parent` | 否 | 父块 ID(省略则父块为文档根) |\n\n---\n\n## 安全操作 vs 危险操作\n\n### 安全:仅修改已有块内容(推荐)\n\n**只改 markdown 内容,不增删块。** 这是最可靠的用法。\n\n```\n%% @siyuan:doc id=20260119203720-12nweia hpath=\"/文档\" view=patchable pmf=v1 %%\n\n%% @siyuan:block id=20260121165142-nzdyfe0 type=p parent=20260119203720-12nweia %%\n这是修改后的段落内容\n\n%% @siyuan:block id=20260121165142-abc1234 type=h subType=h2 parent=20260119203720-12nweia %%\n## 修改后的标题\n```\n\n### 安全:删除块\n\n从 PMF 中移除块标记及其内容即可。\n\n### 安全:重排已有块\n\n改变块标记的顺序即可。\n\n### 插入新块(可用)\n\napply-patch 支持插入新块。建议使用唯一临时 ID(如 `tmp-001`)并确保同一 PMF 内不重复。\n\n注意:\n- PMF 必须完整(缺失块会被视为删除)\n- `partial=true` 的分页/章节 PMF 会被拒绝\n\n---\n\n## 正确的编辑策略\n\n### 策略 1:仅修改内容(apply-patch 安全场景)\n\n适用于:改文字、改表格数据、改标题、重排块顺序\n\n```bash\n# 1. 导出\nnode index.js open-doc \"docID\" patchable --full | tee /tmp/doc.pmf\n\n# 2. 编辑 /tmp/doc.pmf —— 只改 markdown 内容,保留所有块 ID 注释不变\n\n# 3. 执行\ncat /tmp/doc.pmf | SIYUAN_ENABLE_WRITE=true node index.js apply-patch \"docID\"\n```\n\n### 策略 2:需要增加新内容(文末/父块末尾追加,用 append-block)\n\n适用于:添加段落、标题、表格等新块\n\n```bash\n# 1. 先读取文档(满足读围栏)\nnode index.js open-doc \"docID\" readable\n\n# 2. 追加内容到文档末尾(parentID = 文档ID)\nprintf '%s\\n' '## 新标题' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"docID\"\nprintf '%s\\n' '新段落内容' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"docID\"\n\n# 3. 或追加到特定块下\nprintf '%s\\n' '子内容' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"某个块ID\"\n```\n\n### 策略 2.5:需要在指定块前/后插入(用 insert-block)\n\n适用于:在文档开头插入导读、在两个现有块之间插入新段落\n\n```bash\n# 1. 先读取文档(满足读围栏)\nnode index.js open-doc \"docID\" readable\n\n# 2. 在目标块前插入\nprintf '%s\\n' '## 导读' | SIYUAN_ENABLE_WRITE=true node index.js insert-block --before \"目标块ID\"\n\n# 3. 或在目标块后插入\nprintf '%s\\n' '补充说明' | SIYUAN_ENABLE_WRITE=true node index.js insert-block --after \"目标块ID\"\n```\n\n### 策略 3:需要替换某个章节(用 replace-section)\n\n适用于:用全新内容替换某个标题下的所有子块\n\n```bash\n# 1. 先读取文档,找到要替换的标题块 ID\nnode index.js open-doc \"docID\" patchable\n\n# 2. 替换标题下的所有内容\nprintf '%s\\n' '新的段落内容' | SIYUAN_ENABLE_WRITE=true node index.js replace-section \"标题块ID\"\n```\n\n### 策略 4:需要重构整个文档(先清空再逐步追加)\n\n适用于:把 1 个表格拆成多个、整体重排文档结构\n\n```bash\n# 1. 读取并记录原始内容\nnode index.js open-doc \"docID\" readable\n\n# 2. 清空标题下内容(如果有标题)或逐个删除旧块\nSIYUAN_ENABLE_WRITE=true node index.js replace-section \"标题块ID\" --clear\n# 3. 逐步追加新内容\nprintf '%s\\n' '## 概览' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"docID\"\nprintf '%s\\n' '|列1|列2|' '|---|---|' '|数据|数据|' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"docID\"\nprintf '%s\\n' '## 详情' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"docID\"\n```\n\n**注意:** 每次 append-block / insert-block 都是独立的 API 调用,不需要重新 open-doc(每次写入后版本自动刷新,支持连续写入)。写入内容统一必须通过 stdin(printf pipe)传入,避免 shell 展开破坏公式。\n\n---\n\n## 常见错误及处理\n\n| 错误 | 原因 | 处理方式 |\n|------|------|---------|\n| `invalid ID argument` | 块 ID 不存在或格式错误(含手工编辑 PMF 写错) | 重新导出完整 PMF,修正 block ID 后再提交 |\n| `PMF 文档ID不匹配` | PMF 中的 doc id 与目标文档不一致 | 检查文档 ID |\n| `重复 block id` | PMF 中有重复的块 ID | 确保每个块 ID 唯一 |\n| 文档被清空 | 提交了不完整 PMF,缺失块被当作删除 | 仅基于 `open-doc ... patchable --full` 导出的完整 PMF 编辑 |\n| 写入围栏报错 | 没有先 open-doc / open-section | 先执行 `open-doc \"docID\" readable`(或针对章节用 `open-section`) |\n\n---\n\n## 总结:什么时候用什么\n\n| 场景 | 方法 | 安全性 |\n|------|------|--------|\n| 修改已有块内容 | apply-patch(update) | 安全 |\n| 重排已有块 | apply-patch(仅 reorder) | 安全 |\n| 删除块 | apply-patch(delete) | 安全 |\n| 追加新内容 | append-block | 安全 |\n| 替换章节 | replace-section | 安全 |\n| 删除 + 插入新块 | apply-patch(delete + insert)或 replace-section/append-block | 需要完整 PMF,避免 partial |\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":5781,"content_sha256":"9c04840b56b13c3dad532dc5667f7025dcc31a2047734fc7465a1a98fcec96ee"},{"filename":"docs/SQL-Reference.md","content":"# SQL Reference\n\nSiYuan uses SQLite. Default query limit: 64 rows.\n\n## Main Tables\n\n### blocks — All content blocks\n\n| Field | Type | Description |\n|-------|------|-------------|\n| id | TEXT | Block ID `YYYYMMDDHHmmss-xxxxxxx` |\n| parent_id | TEXT | Parent container ID |\n| root_id | TEXT | Document root ID |\n| hash | TEXT | Content hash |\n| box | TEXT | Notebook ID |\n| path | TEXT | Document path |\n| hpath | TEXT | Human-readable path |\n| name | TEXT | Block name |\n| alias | TEXT | Alias |\n| memo | TEXT | Memo |\n| tag | TEXT | Tags (comma-separated) |\n| content | TEXT | Plain text content |\n| fcontent | TEXT | Formatted content |\n| markdown | TEXT | Markdown content |\n| length | INTEGER | Content length |\n| type | TEXT | Block type |\n| subtype | TEXT | Subtype |\n| ial | TEXT | Inline attributes |\n| sort | INTEGER | Sort order |\n| created | TEXT | Creation time `YYYYMMDDHHmmss` |\n| updated | TEXT | Update time `YYYYMMDDHHmmss` |\n\n**Block types** (from SiYuan kernel `treenode/node.go`):\n\n| Code | Node Type | Description |\n|------|-----------|-------------|\n| `d` | NodeDocument | Document |\n| `h` | NodeHeading | Heading |\n| `p` | NodeParagraph | Paragraph |\n| `l` | NodeList | List (container) |\n| `i` | NodeListItem | List item (container) |\n| `c` | NodeCodeBlock | Code block |\n| `m` | NodeMathBlock | Math block |\n| `t` | NodeTable | **Table** (atomic block; internal cells have no block ID) |\n| `b` | NodeBlockquote | Blockquote (container) |\n| `s` | NodeSuperBlock | Super block (container) |\n| `tb` | NodeThematicBreak | **Thematic break** (`---`). ⚠️ NOT \"table body\"! |\n| `html` | NodeHTMLBlock | HTML block |\n| `av` | NodeAttributeView | Attribute view (database) |\n\n**Heading subtypes**: `h1`, `h2`, `h3`, `h4`, `h5`, `h6`\n\n**List subtypes**: `u` unordered, `t` todo, `o` ordered\n\n---\n\n### refs — Block references (links)\n\n| Field | Description |\n|-------|-------------|\n| id | Reference ID |\n| block_id | Source block |\n| root_id | Source document |\n| box | Notebook |\n| path | Document path |\n| def_block_id | Definition block (target) |\n| def_block_root_id | Definition document |\n| def_block_box | Definition notebook |\n| def_block_path | Definition path |\n\n---\n\n### attributes — Custom attributes\n\n| Field | Description |\n|-------|-------------|\n| id | Attribute ID |\n| block_id | Block ID |\n| root_id | Document ID |\n| box | Notebook |\n| path | Document path |\n| name | Attribute name |\n| value | Attribute value |\n| type | `block` |\n| block_type | Block type |\n\n---\n\n## Query Examples\n\n### Find documents by title\n\n```sql\nSELECT id, content, hpath, updated\nFROM blocks\nWHERE type = 'd' AND content LIKE '%Project Summary%'\nORDER BY updated DESC\nLIMIT 10\n```\n\n### Find headings in document\n\n```sql\nSELECT id, content, subtype, updated\nFROM blocks\nWHERE root_id = 'docID' AND type = 'h'\nORDER BY sort ASC\n```\n\n### Find recent blocks\n\n```sql\nSELECT id, type, content, updated\nFROM blocks\nWHERE type != 'd'\nORDER BY updated DESC\nLIMIT 20\n```\n\n### Find blocks created today\n\n```sql\nSELECT * FROM blocks\nWHERE created >= strftime('%Y%m%d%H%M%S', 'now', 'start of day', 'localtime')\nORDER BY created DESC\n```\n\n### Find blocks by date range\n\n```sql\nSELECT * FROM blocks\nWHERE created BETWEEN '20250101000000' AND '20250131235959'\nORDER BY created DESC\n```\n\n### Find backlinks\n\n```sql\nSELECT * FROM refs\nWHERE def_block_id = 'blockID'\n```\n\n### Find references from a block\n\n```sql\nSELECT * FROM refs\nWHERE block_id = 'blockID'\n```\n\n### Find blocks by attribute\n\n```sql\nSELECT b.* FROM blocks b\nJOIN attributes a ON b.id = a.block_id\nWHERE a.name = 'custom-priority' AND a.value = 'high'\n```\n\n### Find untagged documents\n\n```sql\nSELECT id, content, hpath\nFROM blocks\nWHERE type = 'd' AND (tag = '' OR tag IS NULL)\n```\n\n### Content length statistics\n\n```sql\nSELECT type, COUNT(*), AVG(length), SUM(length)\nFROM blocks\nGROUP BY type\nORDER BY COUNT(*) DESC\n```\n\n---\n\n## JS API\n\n```javascript\nconst s = require('./index.js');\n\n// Execute query\ns.executeSiyuanQuery('SELECT * FROM blocks WHERE type=\"d\" LIMIT 5')\n .then(rows => console.log(s.formatResults(rows)));\n```\n\n---\n\n## Time Format\n\nAll timestamps: `YYYYMMDDHHmmss` (14 digits, no separators)\n\nSQLite functions:\n- `strftime('%Y%m%d%H%M%S', 'now', 'localtime')` — current time\n- `strftime('%Y%m%d%H%M%S', 'now', 'start of day', 'localtime')` — start of today\n- `strftime('%Y%m%d%H%M%S', 'now', '-7 days', 'localtime')` — 7 days ago\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":4423,"content_sha256":"49b4429254c02a0d36870f62a1dafc896be8f24d13c837ea41c2d7c9091b510d"},{"filename":"README.md","content":"# siyuan-notes-skill\n\n**如果你是claude/codex/kimi等等大语言模型请阅读SKILL.md,此文件应由人类阅读**\n\n[Claude Code](https://claude.com/claude-code) 的 [思源笔记](https://b3log.org/siyuan/) 技能 —— 通过自然语言搜索、阅读、编辑和组织笔记。\n\n## 功能特性\n\n- **搜索与阅读** — 全文搜索、长文档自动截断阅读、章节级阅读、文档内搜索\n- **创建与编辑** — 创建文档、追加/插入/更新/删除块、替换章节、PMF 批量编辑\n- **结构管理** — 笔记本列表、文档树、标题大纲、反向链接、未引用文档\n- **安全保护** — 先读后写守卫、乐观锁版本检查、默认只读模式\n- **高级功能** — SQL 查询思源 SQLite 数据库、每日笔记、任务、书签、标签\n\n## 环境要求\n\n- **Node.js 18+**(使用内置 `fetch`)\n- **思源内核** 运行中且 API 可访问(本地或远程)\n- **Claude Code** CLI\n\n## 快速开始\n\n### 1. 安装\n\n```bash\n# 作为 Claude Code 技能安装(稳定版)\nclaude mcp add-skill https://github.com/fanxing-6/siyuan-notes-skill/archive/refs/tags/v1.0.5.tar.gz\n\n# 或使用 main 分支最新版\nclaude mcp add-skill https://github.com/fanxing-6/siyuan-notes-skill\n```\n\n### 2. 配置\n\n在技能目录创建 `.env` 文件(或设置环境变量):\n\n```bash\nSIYUAN_SERVER=http://127.0.0.1:6806\nSIYUAN_TOKEN=your-api-token\nSIYUAN_ENABLE_WRITE=false # 设为 true 启用写入操作\n```\n\n### 3. 验证\n\n```bash\nnode index.js check # 连接检查\nnode index.js version # 内核版本\n```\n\n## 使用示例\n\n```bash\n# 搜索笔记\nnode index.js search \"项目总结\" 5\n\n# 阅读文档\nnode index.js open-doc \"20260206204419-vgvxojw\" readable\n\n# 创建新文档\nprintf '## 第一章\\n内容' | SIYUAN_ENABLE_WRITE=true node index.js create-doc \"笔记本ID\" \"我的文档\"\n\n# 编辑块\nprintf '更新内容' | SIYUAN_ENABLE_WRITE=true node index.js update-block \"块ID\"\n\n# SQL 查询\nnode -e \"const s = require('./index.js'); s.executeSiyuanQuery('SELECT * FROM blocks WHERE type=\\\"d\\\" LIMIT 5').then(r => console.log(s.formatResults(r)));\"\n```\n\n## 文档\n\n| 页面 | 说明 |\n|------|------|\n| [命令参考](Command-Reference) | 所有命令的参数、默认值和示例 |\n| [写入安全协议](Write-Safety-Protocol) | 先读后写守卫、版本检查、写入模式 |\n| [PMF 规范](PMF-Spec) | 批量编辑用的 Patchable Markdown Format |\n| [SQL 参考](SQL-Reference) | 思源 SQLite 表结构、块类型、查询示例 |\n| [KaTeX 公式规则](KaTeX-Formula-Rules) | 思源数学公式书写规范 |\n| [错误恢复](Error-Recovery) | 常见错误及解决方法 |\n\n## 项目结构\n\n```\nsiyuan-notes-skill/\n├── index.js # 核心 API 和 CLI 入口\n├── cli.js # CLI 参数解析\n├── format-utils.js # 输出格式化\n├── lib/ # 内部模块\n│ └── pmf-utils.js # PMF 解析和补丁\n├── SKILL.md # 面向 LLM 的技能描述\n└── docs/ # 详细文档\n ├── command-reference.md\n ├── pmf-spec.md\n └── sql-reference.md\n```\n\n## 许可证\n\nMIT\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":3172,"content_sha256":"62ace1759ab959f015a2ad6db0f9404f6322fa23e489dc6837f974af0e59e985"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"text":"开始前(可选):版本检查","type":"text"}]},{"type":"paragraph","content":[{"text":"如需确认是否为最新版本,请运行:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"node index.js version-check","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若远程版本获取失败:不会阻塞任务","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若检测到版本落后:会提示但不阻塞","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"编辑策略选择(最重要)","type":"text"}]},{"type":"paragraph","content":[{"text":"根据用户意图选择正确的编辑方式,","type":"text"},{"text":"选错会导致数据丢失","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"用户想要","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"正确做法","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"错误做法","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"修改单个块内容","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"update-block","type":"text","marks":[{"type":"code_inline"}]},{"text":"(最高效)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"apply-patch 整个文档","type":"text","marks":[{"type":"strikethrough"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"删除单个块","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"delete-block","type":"text","marks":[{"type":"code_inline"}]},{"text":"(最高效)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"apply-patch 整个文档","type":"text","marks":[{"type":"strikethrough"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"批量修改已有内容","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"apply-patch","type":"text","marks":[{"type":"code_inline"}]},{"text":"(update/delete/reorder/insert)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"批量删除/重排块","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"apply-patch","type":"text","marks":[{"type":"code_inline"}]},{"text":"(delete/reorder)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加新内容","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"append-block","type":"text","marks":[{"type":"code_inline"}]},{"text":"(简单稳妥)或 ","type":"text"},{"text":"apply-patch","type":"text","marks":[{"type":"code_inline"}]},{"text":" insert(批量场景)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"在指定位置插入新块","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"insert-block --before/--after","type":"text","marks":[{"type":"code_inline"}]},{"text":"(首选)或 ","type":"text"},{"text":"apply-patch","type":"text","marks":[{"type":"code_inline"}]},{"text":" insert","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"替换章节内容","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"replace-section","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"apply-patch 删除+插入","type":"text","marks":[{"type":"strikethrough"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"重构文档(如拆表格)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"replace-section --clear","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":"append-block","type":"text","marks":[{"type":"code_inline"}]},{"text":" 逐步重建","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"apply-patch 删除旧块+插入新块","type":"text","marks":[{"type":"strikethrough"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"跨章节分散修改多个块","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"编写单个 JS 脚本,循环 ","type":"text"},{"text":"openDocument","type":"text","marks":[{"type":"code_inline"}]},{"text":" → ","type":"text"},{"text":"updateBlock","type":"text","marks":[{"type":"code_inline"}]},{"text":"(同一进程内版本自动刷新)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"并行 Bash 调用 update-block(会版本冲突)","type":"text","marks":[{"type":"strikethrough"}]}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Intent Decision Tree","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"用户想要…\n├─ 查找/搜索内容 ──────→ search / search-md / tag / attr / bookmarks\n├─ 在文档内搜索 ──────→ search-in-doc {docID} {关键词}\n├─ 阅读文档 ──────────→ open-doc {ID} readable(超长文档自动截断,输出大纲导航)\n├─ 阅读章节 ──────────→ open-section {标题块ID} readable(精确读取一个标题的内容)\n├─ 浏览最近动态 ──────→ recent / tasks / daily\n├─ 了解文档结构 ──────→ docs / notebooks / headings / blocks / doc-tree / doc-tree-id / doc-children\n├─ 查看引用关系 ──────→ backlinks / unreferenced\n├─ 修改单个块 ────────→ open-doc readable → update-block {块ID} {内容}(最高效)\n├─ 删除单个块 ────────→ open-doc readable → delete-block {块ID}(最高效)\n├─ 批量修改已有内容 ──→ open-doc patchable → 编辑内容 → apply-patch(支持 update/delete/reorder/insert)\n├─ 创建新文档 ────────→ create-doc(指定笔记本、标题、可选初始内容)\n├─ 重命名文档 ────────→ rename-doc(只需文档 ID 和新标题)\n├─ 添加新内容 ────────→ open-doc readable → append-block(逐个追加)\n├─ 指定位置插入 ──────→ open-doc readable → insert-block --before/--after(按锚点插入)\n├─ 替换章节 ──────────→ open-doc patchable → replace-section\n├─ 重构文档结构 ──────→ open-doc readable → replace-section --clear → append-block 逐步重建\n├─ 组织文档层级 ──────→ subdoc-analyze-move → move-docs-by-id\n├─ 跨章节分散修改 ────→ 编写单个 JS 脚本,循环 openDocument → updateBlock(见模式8)\n├─ SQL 高级查询 ──────→ node -e + executeSiyuanQuery()\n└─ 检查连接 ──────────→ check / version","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Write Safety Protocol","type":"text"}]},{"type":"paragraph","content":[{"text":"写入前通常需要完成这 2 步(","type":"text","marks":[{"type":"strong"}]},{"text":"create-doc","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" / ","type":"text","marks":[{"type":"strong"}]},{"text":"rename-doc","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" 例外):","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 步骤 1:读取文档或章节(标记为\"已读\",同时记录文档版本快照)\nnode index.js open-doc \"docID\" readable\n# 或:node index.js open-section \"headingBlockID\" readable\n\n# 步骤 2:环境变量启用写入\nSIYUAN_ENABLE_WRITE=true node index.js append-block \"docID\" \"内容\"","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"open-doc","type":"text","marks":[{"type":"code_inline"}]},{"text":" 和 ","type":"text"},{"text":"open-section","type":"text","marks":[{"type":"code_inline"}]},{"text":" 计为\"已读\";","type":"text"},{"text":"headings","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"blocks","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"doc-tree","type":"text","marks":[{"type":"code_inline"}]},{"text":" 等不算","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"核心保护:版本检查(乐观锁)","type":"text","marks":[{"type":"strong"}]},{"text":"——写入前对比文档 ","type":"text"},{"text":"updated","type":"text","marks":[{"type":"code_inline"}]},{"text":" 时间戳,若文档在读取后被其他端修改过则拒绝写入","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"连续写入安全:每次写入成功后自动刷新版本号,","type":"text"},{"text":"open-doc → write → write → write","type":"text","marks":[{"type":"code_inline"}]},{"text":" 不会误报冲突","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ 版本刷新仅在同一 node 进程内生效","type":"text","marks":[{"type":"strong"}]},{"text":"。若用多个独立 Bash 命令(如 Claude Code 并行调用),每次写入会改变文档版本,后续的独立命令会版本冲突。","type":"text"},{"text":"解决方案","type":"text","marks":[{"type":"strong"}]},{"text":":对同一文档的多次写入必须串行执行,不能并行","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"读标记持久化存储在磁盘缓存中,跨 CLI 调用有效(同一台机器上的不同终端共享读标记)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"读标记超过 3600 秒自动过期(仅作为缓存清理,版本检查才是真正的安全机制)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"例外:","type":"text"},{"text":"create-doc","type":"text","marks":[{"type":"code_inline"}]},{"text":" 与 ","type":"text"},{"text":"rename-doc","type":"text","marks":[{"type":"code_inline"}]},{"text":" 不要求先 ","type":"text"},{"text":"open-doc","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Core Commands Quick Reference","type":"text"}]},{"type":"paragraph","content":[{"text":"所有命令:","type":"text"},{"text":"node index.js {command} [args]","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"读取","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Command","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Signature","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"search","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{keyword} [limit] [type]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"搜索笔记(type: p/h/l/c/d…)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"search-md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{keyword} [limit] [type]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"搜索并输出 Markdown 结果页","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"open-doc","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{docID} [readable|patchable] [--full] [--cursor {块ID}] [--limit-chars {N}] [--limit-blocks {N}]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"打开文档(默认 readable)。超长文档自动截断/分页,","type":"text"},{"text":"--full","type":"text","marks":[{"type":"code_inline"}]},{"text":" 跳过截断输出全量。","type":"text"},{"text":"副作用:标记已读","type":"text","marks":[{"type":"strong"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"open-section","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{标题块ID} [readable|patchable]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"读取标题下的章节内容。","type":"text"},{"text":"副作用:标记文档已读","type":"text","marks":[{"type":"strong"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"search-in-doc","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{docID} {关键词} [数量]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"在指定文档内搜索匹配的块","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"notebooks","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"列出笔记本","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"docs","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[notebookID] [limit]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"列出文档(含文档 ID,默认 200)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"headings","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{docID} [level]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文档标题(level 格式:","type":"text"},{"text":"h1","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"h2","type":"text","marks":[{"type":"code_inline"}]},{"text":"/…/","type":"text"},{"text":"h6","type":"text","marks":[{"type":"code_inline"}]},{"text":",不是数字)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"blocks","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{docID} [type]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文档子块(含块 ID,可用于写入)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"doc-children","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{notebookID} [path]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"子文档列表","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"doc-tree","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{notebookID} [path] [depth]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"子文档树(默认深度 4)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"doc-tree-id","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{docID} [depth]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"以文档 ID 展示子文档树","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"tag","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{tagName}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"按标签搜索","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"backlinks","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{blockID}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"反向链接","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"tasks","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[status] [days]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"任务(","type":"text"},{"text":"[ ]","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"[x]","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"[-]","type":"text","marks":[{"type":"code_inline"}]},{"text":",默认 7 天)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"daily","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{start} {end}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Daily Note(YYYYMMDD)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"attr","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{name} [value]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"按属性查询(自定义属性加 ","type":"text"},{"text":"custom-","type":"text","marks":[{"type":"code_inline"}]},{"text":" 前缀)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bookmarks","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[name]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"书签","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"random","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{docID}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"随机标题","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"recent","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[days] [type]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"最近修改(默认 7 天)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"unreferenced","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{notebookID}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"未被引用的文档","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"check","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"连接检查","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"version","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"内核版本","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"写入","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Command","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Signature","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"适用场景","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"create-doc","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{notebookID} {标题}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"创建新文档(标题即文档名,初始内容仅支持 stdin)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"rename-doc","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{docID} {新标题}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"重命名文档","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"update-block","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{块ID}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"更新块内容(Markdown 仅支持 stdin;多块输入自动拆块安全写入)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"delete-block","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{块ID}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"删除单个块","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"append-block","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{parentID}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加新内容(parentID 可以是文档 ID 或标题块 ID;Markdown 仅支持 stdin)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"insert-block","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{--before 块ID|--after 块ID|--parent 块ID}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"在指定锚点插入内容(前/后/父块下;Markdown 仅支持 stdin)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"replace-section","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{headingID}","type":"text","marks":[{"type":"code_inline"}]},{"text":" 或 ","type":"text"},{"text":"{headingID} --clear","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"替换/清空章节(保留标题块本身;Markdown 仅支持 stdin)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"apply-patch","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{docID}","type":"text","marks":[{"type":"code_inline"}]},{"text":" (PMF 通过 stdin 传入)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"仅限","type":"text","marks":[{"type":"strong"}]},{"text":"批量修改/删除/重排已有块(拒绝 partial PMF)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"move-docs-by-id","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{targetID} {sourceIDs}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"移动文档(需先 open-doc 目标文档","type":"text"},{"text":"和","type":"text","marks":[{"type":"strong"}]},{"text":"所有来源文档)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"subdoc-analyze-move","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{targetID} {sourceIDs} [depth]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"分析移动计划(只读)","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Common Patterns","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. 搜索并阅读","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"node index.js search \"项目总结\" 5\nnode index.js open-doc \"找到的文档ID\" readable","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. 修改已有块内容(apply-patch 安全用法)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 导出完整 PMF(必须 --full;默认 patchable 在长文档会分页并标记 partial=true)\nnode index.js open-doc \"docID\" patchable --full | tee /tmp/doc.pmf\n\n# 编辑 /tmp/doc.pmf:只改 markdown 内容,保留所有块 ID 注释不变\n# ⚠️ 关键:PMF 必须包含文档的 **所有** 块!缺失的块会被视为删除!\n# 正确做法:导出完整 PMF → 只修改目标块的文本 → 提交完整文件\n# 错误做法:只写目标块 → 其他块全部丢失\n\n# 执行\ncat /tmp/doc.pmf | SIYUAN_ENABLE_WRITE=true node index.js apply-patch \"docID\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. 添加新内容到文档","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"node index.js open-doc \"docID\" readable # 先读\nprintf '## 新标题' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"docID\"\nprintf '段落内容' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"docID\"\nprintf '- [ ] 任务' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"docID\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3.5 在指定位置插入内容","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"node index.js open-doc \"docID\" readable\nprintf '插入在该块之前' | SIYUAN_ENABLE_WRITE=true node index.js insert-block --before \"目标块ID\"\nprintf '插入在该块之后' | SIYUAN_ENABLE_WRITE=true node index.js insert-block --after \"目标块ID\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4. 重构文档(如拆分表格为多个)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 读取原始内容\nnode index.js open-doc \"docID\" readable\n\n# 用 patchable 视图找到要操作的块 ID\nnode index.js open-doc \"docID\" patchable\n\n# 方案A:有标题块 → 清空章节再重建\n# replace-section 保留标题块本身,只删除标题下的子内容\n# 所以新内容不要重复标题(例如标题是 \"## 表格\" 则直接追加表格数据即可)\nSIYUAN_ENABLE_WRITE=true node index.js replace-section \"标题块ID\" --clear\n# 追加到标题块 ID 下 → 新内容会出现在该标题的章节内\nprintf '### 概览' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"标题块ID\"\nprintf '|列1|列2|\\n|---|---|\\n|数据|数据|' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"标题块ID\"\n\n# 方案B:没有标题块 → 用 node -e 删除旧块再追加\nSIYUAN_ENABLE_WRITE=true node -e \"\nconst s = require('./index.js');\ns.deleteBlock('旧块ID').then(function(r) { console.log(JSON.stringify(r)); });\n\"\nprintf '新内容' | SIYUAN_ENABLE_WRITE=true node index.js append-block \"docID\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"5. 创建新文档","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 先查笔记本ID\nnode index.js notebooks\n\n# 创建空文档\nSIYUAN_ENABLE_WRITE=true node index.js create-doc \"笔记本ID\" \"文档标题\"\n\n# 创建带初始内容的文档(Markdown 仅支持 stdin)\nprintf '## 第一章\\n内容' | SIYUAN_ENABLE_WRITE=true node index.js create-doc \"笔记本ID\" \"文档标题\"\n\n# 重命名已有文档\nSIYUAN_ENABLE_WRITE=true node index.js rename-doc \"文档ID\" \"新标题\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"6. 修改/删除单个块","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 修改单个块\nnode index.js open-doc \"文档ID\" readable\nprintf '新内容' | SIYUAN_ENABLE_WRITE=true node index.js update-block \"块ID\"\n\n# 多行内容同样通过 stdin\nprintf '## 新标题\\n\\n段落内容' | SIYUAN_ENABLE_WRITE=true node index.js update-block \"块ID\"\n\n# 删除单个块\nnode index.js open-doc \"文档ID\" readable\nSIYUAN_ENABLE_WRITE=true node index.js delete-block \"块ID\"","type":"text"}]},{"type":"paragraph","content":[{"text":"注意","type":"text","marks":[{"type":"strong"}]},{"text":": 若传入内容可解析为多个块(例如\"段落 + $公式$\"),","type":"text"},{"text":"update-block","type":"text","marks":[{"type":"code_inline"}]},{"text":" 会自动执行\"首块 update + 后续 insert\",并做写后校验,避免刷新后内容丢失。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"7. 超长文档处理","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# open-doc 超长文档自动截断/分页,输出大纲和导航提示\nnode index.js open-doc \"超长文档ID\" readable\n# → 自动截断到 ~15K 字符,附带标题大纲\n\n# 读取特定章节(精确获取标题下内容)\nnode index.js open-section \"标题块ID\" readable\n\n# 在文档内搜索关键词(无需读完全文)\nnode index.js search-in-doc \"文档ID\" \"关键词\"\n\n# patchable 视图分页(默认每页 50 块)\nnode index.js open-doc \"文档ID\" patchable\n# → 分页时 PMF header 含 partial=true next_cursor=xxx\n\n# 翻页\nnode index.js open-doc \"文档ID\" patchable --cursor \"下一块ID\"\n\n# 需要完整 PMF(如整文 apply-patch)→ 用 --full 跳过分页\nnode index.js open-doc \"文档ID\" patchable --full | tee /tmp/doc.pmf\n# ⚠️ 输出可能很大,注意上下文限制","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"8. 跨章节分散修改多个块(单进程批量脚本)","type":"text"}]},{"type":"paragraph","content":[{"text":"当需要修改同一文档中分散在不同章节的多个块时,","type":"text"},{"text":"不能","type":"text","marks":[{"type":"strong"}]},{"text":"用多个并行 Bash 命令(会版本冲突)。正确做法是编写单个 JS 脚本:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"javascript"},"content":[{"text":"// /tmp/batch_edit.js\nconst s = require('/root/.claude/skills/siyuan-notes-skill/index.js');\nasync function main() {\n const docId = '文档ID';\n\n // 辅助函数:刷新版本 + 更新块(同一进程内版本自动刷新)\n async function edit(blockId, markdown) {\n await s.openDocument(docId, 'readable');\n await s.updateBlock(blockId, markdown);\n console.log(`Updated ${blockId}: OK`);\n }\n\n // 辅助函数:刷新版本 + 在锚点后插入\n async function insertAfter(previousID, markdown) {\n await s.openDocument(docId, 'readable');\n await s.insertBlock(markdown, { previousID });\n console.log(`Inserted after ${previousID}: OK`);\n }\n\n // 依次执行所有修改(必须串行,不能 Promise.all)\n await edit('块ID1', '新内容1');\n await edit('块ID2', '新内容2');\n await insertAfter('锚点块ID', '插入的新内容');\n}\nmain().catch(e => { console.error(e.message); process.exit(1); });","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 执行\ncd /root/.claude/skills/siyuan-notes-skill\nSIYUAN_ENABLE_WRITE=true node /tmp/batch_edit.js","type":"text"}]},{"type":"paragraph","content":[{"text":"关键点","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"所有操作在","type":"text"},{"text":"同一个 node 进程","type":"text","marks":[{"type":"strong"}]},{"text":"内串行执行","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"每次写入前 ","type":"text"},{"text":"openDocument","type":"text","marks":[{"type":"code_inline"}]},{"text":" 刷新版本号(进程内版本缓存自动更新)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"JS API 签名:","type":"text"},{"text":"updateBlock(id, markdown)","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"insertBlock(markdown, { previousID?, nextID?, parentID? })","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"deleteBlock(id)","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"appendMarkdownToBlock(parentID, markdown)","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"错误恢复","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"错误","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"原因","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"恢复方法","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"invalid ID argument","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"块 ID 不存在或格式错误","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"重新导出 ","type":"text"},{"text":"open-doc ... patchable --full","type":"text","marks":[{"type":"code_inline"}]},{"text":",校验 block ID 后再提交","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文档被清空","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"提交了不完整 PMF,缺失块被当作删除","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"用 ","type":"text"},{"text":"open-doc ... patchable --full","type":"text","marks":[{"type":"code_inline"}]},{"text":" 重新导出完整 PMF 后恢复","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"写入围栏报错","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"未先 open-doc/open-section 或读标记过期","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"open-doc \"docID\" readable","type":"text","marks":[{"type":"code_inline"}]},{"text":"(或 ","type":"text"},{"text":"open-section","type":"text","marks":[{"type":"code_inline"}]},{"text":")然后重试","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"版本冲突报错","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文档在读取后被其他端修改","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"open-doc \"docID\" readable","type":"text","marks":[{"type":"code_inline"}]},{"text":" 重新读取最新版本然后重试","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"PMF 版本冲突","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"PMF 导出后文档被修改","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"open-doc \"docID\" patchable --full","type":"text","marks":[{"type":"code_inline"}]},{"text":" 重新导出后再编辑,输出用 ","type":"text"},{"text":"tee","type":"text","marks":[{"type":"code_inline"}]},{"text":" 保存","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"partial PMF 被拒绝","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"分页/章节导出的 PMF 不完整","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"改用 ","type":"text"},{"text":"update-block","type":"text","marks":[{"type":"code_inline"}]},{"text":" 编辑单块,或 ","type":"text"},{"text":"open-section","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":"replace-section","type":"text","marks":[{"type":"code_inline"}]},{"text":" 编辑章节","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"只读模式报错","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"未设置 ","type":"text"},{"text":"SIYUAN_ENABLE_WRITE=true","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"在命令前加 ","type":"text"},{"text":"SIYUAN_ENABLE_WRITE=true","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文档标题为\"未命名文档\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"createDocWithMd","type":"text","marks":[{"type":"code_inline"}]},{"text":" 的 path 参数决定标题","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"用 ","type":"text"},{"text":"create-doc","type":"text","marks":[{"type":"code_inline"}]},{"text":" CLI 命令(自动设置标题)或 ","type":"text"},{"text":"rename-doc","type":"text","marks":[{"type":"code_inline"}]},{"text":" 修正","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"连接失败","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"思源未运行/端口/Token 错误","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"node index.js check","type":"text","marks":[{"type":"code_inline"}]},{"text":" 验证","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"search 返回空","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"关键词过短/确实无匹配","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"改用 ","type":"text"},{"text":"search-in-doc","type":"text","marks":[{"type":"code_inline"}]},{"text":" 限定文档范围,或扩大关键词上下文","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"并行写入版本冲突","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"多个独立 Bash 命令并行修改同一文档","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"改用单个 JS 脚本串行执行(见模式8),或每次写入前重新 ","type":"text"},{"text":"open-doc","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output Guidance","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"读取命令返回格式化文本 → 直接展示给用户","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"open-doc readable","type":"text","marks":[{"type":"code_inline"}]},{"text":" 返回干净 Markdown → 适合阅读和总结(超长文档自动截断到 ~15K 字符,附带标题大纲)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"open-doc patchable","type":"text","marks":[{"type":"code_inline"}]},{"text":" 返回 PMF 格式 → 仅用于编辑后 apply-patch(超长文档自动分页,分页 PMF 含 ","type":"text"},{"text":"partial=true","type":"text","marks":[{"type":"code_inline"}]},{"text":",","type":"text"},{"text":"不可用于 apply-patch","type":"text","marks":[{"type":"strong"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"open-section","type":"text","marks":[{"type":"code_inline"}]},{"text":" 返回单章节内容 → 适合精确阅读/编辑特定章节","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"写入命令返回 JSON(通常很冗长) → 只提取关键信息(如新文档 ID、成功/失败)展示给用户,不要原样输出全部 JSON","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"公式渲染:行内公式用 ","type":"text"},{"text":"$...$","type":"text","marks":[{"type":"code_inline"}]},{"text":",独立公式块用 ","type":"text"},{"text":"$...$","type":"text","marks":[{"type":"code_inline"}]},{"text":"(思源会渲染为数学块)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"KaTeX Formula Rules (No Silent Rewrite)","type":"text"}]},{"type":"paragraph","content":[{"text":"核心原则:写入内容必须与模型输出一致。禁止在写入前/写入中对公式做隐式重写。","type":"text","marks":[{"type":"strong"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"必须遵守","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"数学定界符只用两种:行内 ","type":"text"},{"text":"$...$","type":"text","marks":[{"type":"code_inline"}]},{"text":",独立 ","type":"text"},{"text":"$...$","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"数学模式内禁止再次出现 ","type":"text"},{"text":"$","type":"text","marks":[{"type":"code_inline"}]},{"text":"(例如 ","type":"text"},{"text":"$ ... $x$ ... $","type":"text","marks":[{"type":"code_inline"}]},{"text":" 是错误)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"需要乘幂星号时写 ","type":"text"},{"text":"e^*","type":"text","marks":[{"type":"code_inline"}]},{"text":" 或 ","type":"text"},{"text":"e^{\\ast}","type":"text","marks":[{"type":"code_inline"}]},{"text":",不要写 ","type":"text"},{"text":"e^\\*","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"计数项不要写 ","type":"text"},{"text":"#web_search","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"#tokens","type":"text","marks":[{"type":"code_inline"}]},{"text":",改写为 ","type":"text"},{"text":"N_{web\\_search}","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"N_{tokens}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不要把\"给普通文本用的转义\"直接搬进数学模式(如 ","type":"text"},{"text":"\\_","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"\\=","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"\\*","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"常见错误与正确写法","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"错误:","type":"text"},{"text":"$ ... $s_0,a_0^j,o_1^j$ ... $","type":"text","marks":[{"type":"code_inline"}]},{"text":"(数学模式内嵌 ","type":"text"},{"text":"$","type":"text","marks":[{"type":"code_inline"}]},{"text":") 正确:","type":"text"},{"text":"$ ... s_0, a_0^j, o_1^j ... $","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"错误:","type":"text"},{"text":"$-\\lambda \\cdot #web_search$","type":"text","marks":[{"type":"code_inline"}]},{"text":" 正确:","type":"text"},{"text":"$-\\lambda \\cdot N_{web\\_search}$","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"错误:","type":"text"},{"text":"$\\hat e = e^\\*$","type":"text","marks":[{"type":"code_inline"}]},{"text":" 正确:","type":"text"},{"text":"$\\hat e = e^*$","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"写后验证(必须)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"写入后立刻 ","type":"text"},{"text":"open-doc {docID} readable","type":"text","marks":[{"type":"code_inline"}]},{"text":" 回读,确保模型看到的是\"最终落地文本\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"至少搜索以下高风险串:","type":"text"},{"text":"KaTeX parse error","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"Undefined control sequence","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"e^\\\\*","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"#web_search","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"#tokens","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若命中,优先修正文档内容本身,不要在工具层做自动改写","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Supporting Files","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"docs/command-reference.md","type":"text","marks":[{"type":"link","attrs":{"href":"docs/command-reference.md","title":null}}]},{"text":" — 每个命令的详细参数、默认值、返回格式、示例","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"docs/pmf-spec.md","type":"text","marks":[{"type":"link","attrs":{"href":"docs/pmf-spec.md","title":null}}]},{"text":" — PMF 格式规范、安全操作 vs 危险操作、编辑策略详解","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"docs/sql-reference.md","type":"text","marks":[{"type":"link","attrs":{"href":"docs/sql-reference.md","title":null}}]},{"text":" — SQL 表结构、字段说明、查询示例","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"SQL Quick Reference","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SQLite 语法;默认最多返回 64 行","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"时间格式 ","type":"text"},{"text":"YYYYMMDDHHmmss","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"主要表:","type":"text"},{"text":"blocks","type":"text","marks":[{"type":"code_inline"}]},{"text":"(块)、","type":"text"},{"text":"refs","type":"text","marks":[{"type":"code_inline"}]},{"text":"(引用)、","type":"text"},{"text":"attributes","type":"text","marks":[{"type":"code_inline"}]},{"text":"(属性)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"块类型:","type":"text"},{"text":"d","type":"text","marks":[{"type":"code_inline"}]},{"text":"文档 ","type":"text"},{"text":"h","type":"text","marks":[{"type":"code_inline"}]},{"text":"标题 ","type":"text"},{"text":"p","type":"text","marks":[{"type":"code_inline"}]},{"text":"段落 ","type":"text"},{"text":"l","type":"text","marks":[{"type":"code_inline"}]},{"text":"列表 ","type":"text"},{"text":"c","type":"text","marks":[{"type":"code_inline"}]},{"text":"代码 ","type":"text"},{"text":"t","type":"text","marks":[{"type":"code_inline"}]},{"text":"表格 ","type":"text"},{"text":"m","type":"text","marks":[{"type":"code_inline"}]},{"text":"公式 ","type":"text"},{"text":"b","type":"text","marks":[{"type":"code_inline"}]},{"text":"引述 ","type":"text"},{"text":"s","type":"text","marks":[{"type":"code_inline"}]},{"text":"超级块","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ ","type":"text","marks":[{"type":"strong"}]},{"text":"tb","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" 是分割线(thematic break / ","type":"text","marks":[{"type":"strong"}]},{"text":"---","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":"),不是\"表格体\"!","type":"text","marks":[{"type":"strong"}]},{"text":" 表格的块类型是 ","type":"text"},{"text":"t","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"层级:","type":"text"},{"text":"root_id","type":"text","marks":[{"type":"code_inline"}]},{"text":" → 文档,","type":"text"},{"text":"parent_id","type":"text","marks":[{"type":"code_inline"}]},{"text":" → 父容器","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"JS API 查询:","type":"text"},{"text":"s.executeSiyuanQuery('SQL')","type":"text","marks":[{"type":"code_inline"}]},{"text":" 执行查询,","type":"text"},{"text":"s.formatResults(r)","type":"text","marks":[{"type":"code_inline"}]},{"text":" 格式化输出","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Block Type Reference(思源内核源码 ","type":"text"},{"text":"treenode/node.go","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"类型代码","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"节点类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是否容器块","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"d","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeDocument","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文档","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"h","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeHeading","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"标题","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"否","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"p","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeParagraph","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"段落","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"否","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"l","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeList","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"列表","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"i","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeListItem","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"列表项","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"c","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeCodeBlock","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"代码块","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"否","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"m","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeMathBlock","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"公式块","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"否","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"t","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeTable","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"表格","type":"text","marks":[{"type":"strong"}]},{"text":"(整体为一个块,内部 head/body/row/cell 不是独立块)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"否","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"b","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeBlockquote","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"引述","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"s","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeSuperBlock","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"超级块","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"tb","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeThematicBreak","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"分割线","type":"text","marks":[{"type":"strong"}]},{"text":"(","type":"text"},{"text":"---","type":"text","marks":[{"type":"code_inline"}]},{"text":"),⚠️ 不是表格体","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"否","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"html","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeHTMLBlock","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"HTML 块","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"否","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"av","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NodeAttributeView","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"属性视图(数据库)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"否","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"表格结构说明","type":"text","marks":[{"type":"strong"}]},{"text":":思源中表格(","type":"text"},{"text":"t","type":"text","marks":[{"type":"code_inline"}]},{"text":")是原子块,内部的 TableHead/TableBody/TableRow/TableCell 是 AST 节点,","type":"text"},{"text":"没有独立 block ID","type":"text","marks":[{"type":"strong"}]},{"text":"。编辑表格只能整体替换,不能操作单个单元格。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Notes","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"cwd 必须是 skill 目录(","type":"text"},{"text":"index.js","type":"text","marks":[{"type":"code_inline"}]},{"text":" 所在目录)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":".env","type":"text","marks":[{"type":"code_inline"}]},{"text":" 自动从 ","type":"text"},{"text":"index.js","type":"text","marks":[{"type":"code_inline"}]},{"text":" 目录加载","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"路径含空格需加引号","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Markdown 内容含换行时必须用 ","type":"text"},{"text":"

开始前(可选):版本检查 如需确认是否为最新版本,请运行: - 若远程版本获取失败:不会阻塞任务 - 若检测到版本落后:会提示但不阻塞 编辑策略选择(最重要) 根据用户意图选择正确的编辑方式, 选错会导致数据丢失 : | 用户想要 | 正确做法 | 错误做法 | |---------|---------|---------| | 修改单个块内容 | (最高效) | apply-patch 整个文档 | | 删除单个块 | (最高效) | apply-patch 整个文档 | | 批量修改已有内容 | (update/delete/reorder/insert) | | | 批量删除/重排块 | (delete/reorder) | | | 添加新内容 | (简单稳妥)或 insert(批量场景) | | | 在指定位置插入新块 | (首选)或 insert | | | 替换章节内容 | | apply-patch 删除+插入 | | 重构文档(如拆表格) | + 逐步重建 | apply-patch 删除旧块+插入新块 | | 跨章节分散修改多个块 | 编写单个 JS 脚本,循环 → (同一进程内版本自动刷新) | 并行 Bash 调用 update-block(会版本冲突) | Intent Decision Tree Write Safety Protocol 写入前通常需要…

...\\n...'","type":"text","marks":[{"type":"code_inline"}]},{"text":" 语法(Bash ANSI-C quoting),普通双引号 ","type":"text"},{"text":"\"...\\n...\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" 中的 ","type":"text"},{"text":"\\n","type":"text","marks":[{"type":"code_inline"}]},{"text":" 是字面文本不是换行","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"连接检查:","type":"text"},{"text":"node index.js check","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"siyuan-notes-skill","author":"@skillopedia","source":{"stars":2012,"repo_name":"openclaw-master-skills","origin_url":"https://github.com/leoyeai/openclaw-master-skills/blob/HEAD/skills/siyuan-notes-skill/SKILL.md","repo_owner":"leoyeai","body_sha256":"7638523264927db8c914042e42d6d99f9a70b25aed34dd09f77355b362749656","cluster_key":"6c1f8ad4019c6f8ed85c8be0d4036673a814a0a5a71f56bf4382ecda76ff7d7d","clean_bundle":{"format":"clean-skill-bundle-v1","source":"leoyeai/openclaw-master-skills/skills/siyuan-notes-skill/SKILL.md","attachments":[{"id":"9337a00f-d313-5f1c-ab31-eb67894541c9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9337a00f-d313-5f1c-ab31-eb67894541c9/attachment.md","path":"README.md","size":3172,"sha256":"62ace1759ab959f015a2ad6db0f9404f6322fa23e489dc6837f974af0e59e985","contentType":"text/markdown; charset=utf-8"},{"id":"81cc7b0e-1041-5ebb-af6e-6ee47b4be4e8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/81cc7b0e-1041-5ebb-af6e-6ee47b4be4e8/attachment.json","path":"_meta.json","size":291,"sha256":"dea99ef6d1ba51634852246791c95aa97db945e1f22e993acdbc433f4f5e0fdf","contentType":"application/json; charset=utf-8"},{"id":"02cc576c-ae48-51ae-ab50-a56c8ad79679","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/02cc576c-ae48-51ae-ab50-a56c8ad79679/attachment.js","path":"cli.js","size":26485,"sha256":"4ef27bd8c59bf8bfaecea1059e28c0e4fac012c4c19f3f95aed9a69972c8fb67","contentType":"application/javascript; charset=utf-8"},{"id":"fca8f31d-de3f-5d0d-8f36-7266f700d055","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fca8f31d-de3f-5d0d-8f36-7266f700d055/attachment.md","path":"docs/Command-Reference.md","size":11396,"sha256":"5b4f853e40f72580dcaffc7180672258c1132dddaa3a5af59ae169d1afaf441a","contentType":"text/markdown; charset=utf-8"},{"id":"c12b0778-3fa7-52b1-8f9a-c9936f6760d4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c12b0778-3fa7-52b1-8f9a-c9936f6760d4/attachment.md","path":"docs/Error-Recovery.md","size":2152,"sha256":"e4fdb5eaf790b18ce352f94cb6559e60015596c8d744f2f63373c52bb377706c","contentType":"text/markdown; charset=utf-8"},{"id":"86b8ca70-4362-579e-9abf-682740b97250","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/86b8ca70-4362-579e-9abf-682740b97250/attachment.md","path":"docs/SQL-Reference.md","size":4423,"sha256":"49b4429254c02a0d36870f62a1dafc896be8f24d13c837ea41c2d7c9091b510d","contentType":"text/markdown; charset=utf-8"},{"id":"476e0643-5fda-5bcc-9fd4-8e4d4e41f4a4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/476e0643-5fda-5bcc-9fd4-8e4d4e41f4a4/attachment.md","path":"docs/command-reference.md","size":23210,"sha256":"35328f508bc57809563b478d03a98666bb0756d98ccfb5b30d7af67581f02a65","contentType":"text/markdown; charset=utf-8"},{"id":"97506c64-a65b-5df8-b6c0-9056e8b52a15","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/97506c64-a65b-5df8-b6c0-9056e8b52a15/attachment.md","path":"docs/pmf-spec.md","size":5781,"sha256":"9c04840b56b13c3dad532dc5667f7025dcc31a2047734fc7465a1a98fcec96ee","contentType":"text/markdown; charset=utf-8"},{"id":"9a2d2f5f-f634-5282-9735-4a149053f7e1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9a2d2f5f-f634-5282-9735-4a149053f7e1/attachment.md","path":"docs/sql-reference.md","size":4140,"sha256":"14a54c7002dd2f26a7e494d4d73f4cfdb24136f1ca75fc6a4f7e5754affdbfb8","contentType":"text/markdown; charset=utf-8"},{"id":"cc808c69-3abf-54e9-a3c0-848a3d44586b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cc808c69-3abf-54e9-a3c0-848a3d44586b/attachment.js","path":"format-utils.js","size":4979,"sha256":"1b0cf82289dbcfd733021340831b06a044947338179f6346bbbc85586ef17a95","contentType":"application/javascript; charset=utf-8"},{"id":"d41b32ae-1cd1-5449-9775-218ca04c603d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d41b32ae-1cd1-5449-9775-218ca04c603d/attachment.js","path":"index.js","size":104978,"sha256":"df03281fa06a0c709109463b0ea749ca05238d5da54346ede75d7f1913aee108","contentType":"application/javascript; charset=utf-8"},{"id":"a87b94a1-34ab-5893-8de1-3bfc3bfcc272","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a87b94a1-34ab-5893-8de1-3bfc3bfcc272/attachment.js","path":"lib/pmf-utils.js","size":9259,"sha256":"65741b247a186e5be4c2d22636be1eb05da02bb51e2cc899b7b93af22ce07a9a","contentType":"application/javascript; charset=utf-8"},{"id":"2fa4c41d-9196-5f27-8e7c-facd3526acff","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2fa4c41d-9196-5f27-8e7c-facd3526acff/attachment.js","path":"lib/query-services.js","size":9023,"sha256":"ae2ff360ba12e8e65dfde1258eb74e6763cf922b771aaba30f1b9abaae3cffb5","contentType":"application/javascript; charset=utf-8"},{"id":"4b4e79e2-503c-5941-a407-bd5efc162b8c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4b4e79e2-503c-5941-a407-bd5efc162b8c/attachment.json","path":"package.json","size":616,"sha256":"39a2294691544fc6c77bb6bc28de91927f7f16a1cf45c07b4cbf55a569c3bd85","contentType":"application/json; charset=utf-8"}],"bundle_sha256":"3e28acb52c0f6b9a9b49725ec31cc0f572b854ff309981d021ae95ab1e75dedd","attachment_count":14,"text_attachments":14,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/siyuan-notes-skill/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"data-analytics","category_label":"Data"},"exact_dupes_collapsed_into_this":0},"license":"MIT","version":"v1","category":"data-analytics","metadata":{"author":"fanxing-6","version":"1.0.5"},"import_tag":"clean-skills-v1","description":"思源笔记工具——搜索、阅读、编辑、组织用户的笔记。Use when user says: 搜索笔记、查找文档、打开文档、阅读笔记、编辑笔记、创建文档、修改块、思源笔记、SiYuan、整理文档、管理标签、Daily Note、反向链接、最近修改、PMF补丁、SQL查询blocks。不要用于与思源笔记无关的通用编程或问答任务。","allowed-tools":"Bash","compatibility":"Requires Node.js 18+. Needs a running SiYuan kernel with API access. Claude Code only."}},"renderedAt":1782980673780}

开始前(可选):版本检查 如需确认是否为最新版本,请运行: - 若远程版本获取失败:不会阻塞任务 - 若检测到版本落后:会提示但不阻塞 编辑策略选择(最重要) 根据用户意图选择正确的编辑方式, 选错会导致数据丢失 : | 用户想要 | 正确做法 | 错误做法 | |---------|---------|---------| | 修改单个块内容 | (最高效) | apply-patch 整个文档 | | 删除单个块 | (最高效) | apply-patch 整个文档 | | 批量修改已有内容 | (update/delete/reorder/insert) | | | 批量删除/重排块 | (delete/reorder) | | | 添加新内容 | (简单稳妥)或 insert(批量场景) | | | 在指定位置插入新块 | (首选)或 insert | | | 替换章节内容 | | apply-patch 删除+插入 | | 重构文档(如拆表格) | + 逐步重建 | apply-patch 删除旧块+插入新块 | | 跨章节分散修改多个块 | 编写单个 JS 脚本,循环 → (同一进程内版本自动刷新) | 并行 Bash 调用 update-block(会版本冲突) | Intent Decision Tree Write Safety Protocol 写入前通常需要…