feat(sync): add install-skills.sh + install metadata to all 62 plugins
- Add install_name, install_type, dir_category fields to all 62 plugin.json files to resolve name-mapping and skill-vs-command routing issues - Add install-skills.sh: idempotent cross-machine skill sync script - Routes skill→~/.claude/skills/<name>/, command→~/.claude/commands/<name>.md - rsync full skills/ directory (preserves multi-file skills like dev-test, req-deploy) - State file ~/.claude/.installed-skills.json tracks installed versions - Conflict detection: warns before overwriting locally modified files - --dry-run, --category, --force, --cleanup, --list flags - Add 9 new plugins migrated from local ~/.claude (agent-swarm, ai-chat, defect-analysis, executing-plans, finishing-branch, frontend-design, req-audit, req-lookback, req-retro) - Add update-plugin-meta.py helper used to bulk-update plugin.json - Fix siyuan SKILL.md: remove hardcoded server credentials, use env vars Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -5,128 +5,35 @@ description: 思源笔记 API 集成。通过自然语言创建、编辑、搜
|
||||
|
||||
# 思源笔记 API 集成 Skill
|
||||
|
||||
## 服务配置
|
||||
## 环境变量配置(必须)
|
||||
|
||||
### 阿里云生产环境 (推荐)
|
||||
本 skill 通过环境变量读取思源笔记连接信息,不同用户/组织配置不同的值。
|
||||
|
||||
| 配置项 | 值 |
|
||||
|--------|-----|
|
||||
| 服务地址 | `https://siyuan.pipexerp.com` (HTTPS) |
|
||||
| HTTP访问 | `http://47.93.23.182` (重定向到HTTPS) |
|
||||
| SSH 别名 | `siyuan` |
|
||||
| 访问码 | `SiYuan@2026` |
|
||||
| 版本 | **3.1.11** (2026-02-16 升级) |
|
||||
| 部署位置 | 阿里云 Ubuntu 24.04 (Docker) |
|
||||
| 容器名称 | `siyuan` |
|
||||
| 镜像 | `b3log/siyuan:v3.1.11` |
|
||||
| 数据目录 | `/opt/siyuan/workspace` |
|
||||
| 反向代理 | Caddy (HTTPS + SSL证书) |
|
||||
| SSL证书 | Let's Encrypt (自动续期) |
|
||||
**在 `~/.claude/settings.json` 中配置:**
|
||||
|
||||
### Tailscale 内网环境 (备用)
|
||||
```json
|
||||
{
|
||||
"env": {
|
||||
"SIYUAN_URL": "${SIYUAN_URL}",
|
||||
"SIYUAN_TOKEN": "your-api-token-here"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
| 配置项 | 值 |
|
||||
|--------|-----|
|
||||
| 服务地址 | `http://47.93.23.182` (Tailscale) |
|
||||
| 局域网地址 | `http://192.168.1.50:6806` |
|
||||
| API Token | `nfnycjb1g8vbexb2` |
|
||||
| 版本 | 3.1.5 |
|
||||
| 部署位置 | 飞牛OS (Docker) |
|
||||
或在项目级 `.claude/settings.json` 中配置(优先级更高)。
|
||||
|
||||
**检查配置是否就绪:** 执行任何思源操作前,先确认环境变量已设置:
|
||||
|
||||
```bash
|
||||
echo "URL: ${SIYUAN_URL:-未配置}"
|
||||
echo "TOKEN: ${SIYUAN_TOKEN:+已配置}"
|
||||
```
|
||||
|
||||
如果未配置,提示用户在 `~/.claude/settings.json` 的 `env` 中添加 `SIYUAN_URL` 和 `SIYUAN_TOKEN`。
|
||||
|
||||
---
|
||||
|
||||
## 服务器管理 (阿里云)
|
||||
|
||||
### SSH 连接
|
||||
|
||||
```bash
|
||||
# 快捷连接
|
||||
ssh siyuan
|
||||
|
||||
# 完整连接命令
|
||||
ssh -i /Users/donglinlai/Downloads/siyuan.pem root@47.93.23.182
|
||||
```
|
||||
|
||||
### Docker 管理
|
||||
|
||||
```bash
|
||||
# 查看容器状态
|
||||
ssh siyuan "docker ps | grep siyuan"
|
||||
|
||||
# 查看日志
|
||||
ssh siyuan "docker logs -f siyuan --tail 100"
|
||||
|
||||
# 重启服务
|
||||
ssh siyuan "docker restart siyuan"
|
||||
|
||||
# 停止服务
|
||||
ssh siyuan "docker stop siyuan"
|
||||
|
||||
# 启动服务
|
||||
ssh siyuan "docker start siyuan"
|
||||
|
||||
# 升级到特定版本(推荐)
|
||||
ssh siyuan "docker stop siyuan && docker rm siyuan"
|
||||
ssh siyuan "docker pull b3log/siyuan:v3.1.11"
|
||||
ssh siyuan "docker run -d --name siyuan --restart=always \
|
||||
-p 127.0.0.1:6806:6806 \
|
||||
-v /opt/siyuan/workspace:/siyuan/workspace \
|
||||
-e LANG=en_US.UTF-8 \
|
||||
b3log/siyuan:v3.1.11 \
|
||||
--workspace=/siyuan/workspace \
|
||||
--accessAuthCode=SiYuan@2026"
|
||||
```
|
||||
|
||||
### 数据备份与恢复
|
||||
|
||||
```bash
|
||||
# 查看数据目录大小
|
||||
ssh siyuan "du -sh /opt/siyuan/workspace"
|
||||
|
||||
# 备份数据到服务器
|
||||
ssh siyuan "tar -czf /root/siyuan-backup-\$(date +%Y%m%d).tar.gz /opt/siyuan/workspace"
|
||||
|
||||
# 下载备份到本地
|
||||
scp siyuan:/root/siyuan-backup-*.tar.gz ~/Downloads/
|
||||
|
||||
# 恢复数据(先停止容器)
|
||||
ssh siyuan "docker stop siyuan && \
|
||||
tar -xzf /root/siyuan-backup-YYYYMMDD.tar.gz -C / && \
|
||||
docker start siyuan"
|
||||
```
|
||||
|
||||
### 访问测试
|
||||
|
||||
```bash
|
||||
# 测试 HTTPS 访问
|
||||
curl -I https://siyuan.pipexerp.com
|
||||
|
||||
# 测试认证 API
|
||||
curl -s -X POST https://siyuan.pipexerp.com/api/system/version | jq .
|
||||
|
||||
# 浏览器访问
|
||||
open https://siyuan.pipexerp.com
|
||||
```
|
||||
|
||||
### Caddy 反向代理管理
|
||||
|
||||
```bash
|
||||
# 查看 Caddy 状态
|
||||
ssh siyuan "systemctl status caddy"
|
||||
|
||||
# 重启 Caddy
|
||||
ssh siyuan "systemctl restart caddy"
|
||||
|
||||
# 查看 Caddy 配置
|
||||
ssh siyuan "cat /etc/caddy/Caddyfile"
|
||||
|
||||
# 查看 SSL 证书
|
||||
ssh siyuan "journalctl -u caddy | grep certificate"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔐 保存门禁:敏感信息脱敏
|
||||
## 🔐 保存<E4BF9D><E5AD98><EFBFBD>禁:敏感<E6958F><E6849F>息脱敏
|
||||
|
||||
**保存任何内容到思源笔记前,必须先完成脱敏处理。**
|
||||
|
||||
@@ -201,8 +108,8 @@ api.upsert_doc(notebook_id, "/文档路径", content)
|
||||
所有 API 请求使用 POST 方法,需携带 Token:
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/xxx \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/xxx \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"param": "value"}'
|
||||
```
|
||||
@@ -239,8 +146,8 @@ curl -X POST https://siyuan.pipexerp.com/api/xxx \
|
||||
#### 列出所有笔记本
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/notebook/lsNotebooks \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/notebook/lsNotebooks \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{}'
|
||||
```
|
||||
@@ -248,8 +155,8 @@ curl -X POST https://siyuan.pipexerp.com/api/notebook/lsNotebooks \
|
||||
#### 创建笔记本
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/notebook/createNotebook \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/notebook/createNotebook \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"name": "笔记本名称"}'
|
||||
```
|
||||
@@ -257,8 +164,8 @@ curl -X POST https://siyuan.pipexerp.com/api/notebook/createNotebook \
|
||||
#### 删除笔记本
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/notebook/removeNotebook \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/notebook/removeNotebook \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"notebook": "笔记本ID"}'
|
||||
```
|
||||
@@ -276,22 +183,22 @@ curl -X POST https://siyuan.pipexerp.com/api/notebook/removeNotebook \
|
||||
```bash
|
||||
# 1. 先查询是否存在(按路径精确匹配)
|
||||
DOC_PATH="/网络管理/家庭Tailscale网络"
|
||||
EXISTING=$(curl -s -X POST https://siyuan.pipexerp.com/api/query/sql \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
EXISTING=$(curl -s -X POST ${SIYUAN_URL}/api/query/sql \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"stmt\": \"SELECT id FROM blocks WHERE type='d' AND hpath='${DOC_PATH}' LIMIT 1\"}" \
|
||||
| jq -r '.data[0].id // empty')
|
||||
|
||||
if [ -n "$EXISTING" ]; then
|
||||
# 2a. 存在则更新
|
||||
curl -s -X POST https://siyuan.pipexerp.com/api/block/updateBlock \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -s -X POST ${SIYUAN_URL}/api/block/updateBlock \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"id\": \"${EXISTING}\", \"dataType\": \"markdown\", \"data\": \"# 更新的内容\"}"
|
||||
else
|
||||
# 2b. 不存在则创建
|
||||
curl -s -X POST https://siyuan.pipexerp.com/api/filetree/createDocWithMd \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -s -X POST ${SIYUAN_URL}/api/filetree/createDocWithMd \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"notebook": "笔记本ID", "path": "/网络管理/家庭Tailscale网络", "markdown": "# 新内容"}'
|
||||
fi
|
||||
@@ -300,8 +207,8 @@ fi
|
||||
#### 创建文档 (仅新建时使用)
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/filetree/createDocWithMd \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/filetree/createDocWithMd \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"notebook": "笔记本ID",
|
||||
@@ -313,8 +220,8 @@ curl -X POST https://siyuan.pipexerp.com/api/filetree/createDocWithMd \
|
||||
#### 获取文档内容
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/filetree/getDoc \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/filetree/getDoc \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"id": "文档ID"}'
|
||||
```
|
||||
@@ -322,8 +229,8 @@ curl -X POST https://siyuan.pipexerp.com/api/filetree/getDoc \
|
||||
#### 删除文档
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/filetree/removeDoc \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/filetree/removeDoc \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"notebook": "笔记本ID", "path": "/文档路径"}'
|
||||
```
|
||||
@@ -331,8 +238,8 @@ curl -X POST https://siyuan.pipexerp.com/api/filetree/removeDoc \
|
||||
#### 重命名文档
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/filetree/renameDoc \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/filetree/renameDoc \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"notebook": "笔记本ID", "path": "/旧路径", "title": "新标题"}'
|
||||
```
|
||||
@@ -344,8 +251,8 @@ curl -X POST https://siyuan.pipexerp.com/api/filetree/renameDoc \
|
||||
#### 插入块
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/block/insertBlock \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/block/insertBlock \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"dataType": "markdown",
|
||||
@@ -357,8 +264,8 @@ curl -X POST https://siyuan.pipexerp.com/api/block/insertBlock \
|
||||
#### 更新块
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/block/updateBlock \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/block/updateBlock \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"dataType": "markdown",
|
||||
@@ -370,8 +277,8 @@ curl -X POST https://siyuan.pipexerp.com/api/block/updateBlock \
|
||||
#### 删除块
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/block/deleteBlock \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/block/deleteBlock \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"id": "块ID"}'
|
||||
```
|
||||
@@ -383,8 +290,8 @@ curl -X POST https://siyuan.pipexerp.com/api/block/deleteBlock \
|
||||
#### 全文搜索
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/search/fullTextSearchBlock \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/search/fullTextSearchBlock \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"query": "搜索关键词",
|
||||
@@ -395,8 +302,8 @@ curl -X POST https://siyuan.pipexerp.com/api/search/fullTextSearchBlock \
|
||||
#### SQL 查询
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/query/sql \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/query/sql \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"stmt": "SELECT * FROM blocks WHERE content LIKE '\''%关键词%'\'' LIMIT 10"
|
||||
@@ -410,8 +317,8 @@ curl -X POST https://siyuan.pipexerp.com/api/query/sql \
|
||||
#### 导出 Markdown
|
||||
|
||||
```bash
|
||||
curl -X POST https://siyuan.pipexerp.com/api/export/exportMdContent \
|
||||
-H "Authorization: Token nfnycjb1g8vbexb2" \
|
||||
curl -X POST ${SIYUAN_URL}/api/export/exportMdContent \
|
||||
-H "Authorization: Token ${SIYUAN_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"id": "文档ID"}'
|
||||
```
|
||||
@@ -421,13 +328,16 @@ curl -X POST https://siyuan.pipexerp.com/api/export/exportMdContent \
|
||||
## Python 封装
|
||||
|
||||
```python
|
||||
import os
|
||||
import requests
|
||||
from typing import Optional, Dict, Any
|
||||
|
||||
class SiYuanAPI:
|
||||
"""思源笔记 API 封装"""
|
||||
|
||||
def __init__(self, base_url: str = "https://siyuan.pipexerp.com", token: str = "nfnycjb1g8vbexb2"):
|
||||
def __init__(self, base_url: str = None, token: str = None):
|
||||
base_url = base_url or os.environ.get("SIYUAN_URL", "")
|
||||
token = token or os.environ.get("SIYUAN_TOKEN", "")
|
||||
self.base_url = base_url
|
||||
self.headers = {
|
||||
"Authorization": f"Token {token}",
|
||||
|
||||
Reference in New Issue
Block a user