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:
2026-04-20 23:55:26 +09:30
parent 84d4e35a42
commit de25f096e7
66 changed files with 3307 additions and 194 deletions

View File

@@ -4,5 +4,8 @@
"version": "1.0.0",
"author": {
"name": "qiudl"
}
},
"install_name": "data-excel",
"install_type": "skill",
"dir_category": "integration"
}

View File

@@ -10,5 +10,8 @@
"name": "doubao-voice",
"path": "./skills/SKILL.md"
}
]
],
"install_name": "doubao-voice",
"install_type": "skill",
"dir_category": "integration"
}

View File

@@ -4,5 +4,8 @@
"version": "1.0.0",
"author": {
"name": "qiudl"
}
},
"install_name": "feishu-bitable",
"install_type": "skill",
"dir_category": "integration"
}

View File

@@ -4,5 +4,8 @@
"version": "1.0.0",
"author": {
"name": "qiudl"
}
},
"install_name": "feishu-docx",
"install_type": "skill",
"dir_category": "integration"
}

View File

@@ -4,5 +4,8 @@
"version": "1.1.0",
"author": {
"name": "qiudl"
}
},
"install_name": "feishu",
"install_type": "skill",
"dir_category": "integration"
}

View File

@@ -4,5 +4,8 @@
"version": "1.0.0",
"author": {
"name": "qiudl"
}
},
"install_name": "siyuan",
"install_type": "skill",
"dir_category": "integration"
}

View File

@@ -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}",

View File

@@ -4,5 +4,8 @@
"version": "1.0.0",
"author": {
"name": "qiudl"
}
},
"install_name": "siyuan-to-feishu",
"install_type": "skill",
"dir_category": "integration"
}

View File

@@ -4,5 +4,8 @@
"version": "1.0.0",
"author": {
"name": "qiudl"
}
},
"install_name": "wecom",
"install_type": "skill",
"dir_category": "integration"
}