atomtanstudio-craft-do

TotalClaw 作者 totalclaw

Craft.do 完整 REST API 集成技能:支持任务自动化、文档与文件夹管理、Obsidian 迁移,以及通过 blocks API 操作 Markdown 内容。

安装 / 下载方式

TotalClaw CLI推荐
totalclaw install totalclaw:totalclaw~atomtanstudio-craft-do
cURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/totalclaw%3Atotalclaw~atomtanstudio-craft-do/file -o atomtanstudio-craft-do.md
## 概述(中文)

Craft.do 完整 REST API 集成技能:支持任务自动化、文档与文件夹管理、Obsidian 迁移,以及通过 blocks API 操作 Markdown 内容。

## 技能正文

# Craft.do 集成技能

Craft.do — 精美笔记与文档应用 — 的完整 REST API 集成。

## 概述

本技能为 Craft.do 提供完整的程序化访问能力:
- **任务自动化:** 在收件箱/每日笔记/日志中创建、更新与管理任务
- **文档工作流:** 以编程方式创建、读取与组织文档
- **文件夹管理:** 通过 API 构建嵌套文件夹层级
- **Obsidian 迁移:** 一次性完整 vault 迁移并保留内容
- **内容操作:** 通过 blocks API 添加/编辑 Markdown 内容

Craft.do 特性:
- 原生 Markdown 支持
- 任务管理(收件箱、每日笔记、日志)
- 集合(数据库表)
- 层级文件夹与文档
- 完整 REST API 访问

## 设置

1. 从 Craft.do 设置中获取 API key
2. 安全存储凭据:

```bash
export CRAFT_API_KEY="pdk_xxx"
export CRAFT_ENDPOINT="https://connect.craft.do/links/YOUR_LINK/api/v1"
```

## API 能力

### ✅ 可用功能

#### 列出文件夹
```bash
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
  "$CRAFT_ENDPOINT/folders"
```

返回所有位置:unsorted、daily_notes、trash、templates 及自定义文件夹。

#### 列出文档
```bash
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
  "$CRAFT_ENDPOINT/documents?folderId=FOLDER_ID"
```

#### 创建文件夹(可选 parent 以实现嵌套)
```bash
# Root-level folder
curl -X POST \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "folders": [{
      "name": "Projects"
    }]
  }' \
  "$CRAFT_ENDPOINT/folders"

# Nested folder (requires parent folder ID)
curl -X POST \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "folders": [{
      "name": "Q1 2024",
      "parentFolderId": "PARENT_FOLDER_ID"
    }]
  }' \
  "$CRAFT_ENDPOINT/folders"
```

#### 创建文档
```bash
curl -X POST \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "documents": [{
      "title": "Document Title"
    }],
    "destination": {
      "folderId": "FOLDER_ID"
    }
  }' \
  "$CRAFT_ENDPOINT/documents"
```

**说明:** 文档创建时初始不含内容。使用 `/blocks` 端点添加内容。

#### 向文档添加内容
```bash
curl -X POST \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "blocks": [{
      "type": "text",
      "markdown": "# Document content\n\nFull markdown support!"
    }],
    "position": {
      "pageId": "DOCUMENT_ID",
      "position": "end"
    }
  }' \
  "$CRAFT_ENDPOINT/blocks"
```

#### 读取文档内容
```bash
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
  "$CRAFT_ENDPOINT/blocks?id=DOCUMENT_ID"
```

返回包含所有 blocks 的完整 Markdown 内容。

#### 创建任务
```bash
curl -X POST \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tasks": [{
      "markdown": "Task description",
      "location": {"type": "inbox"},
      "status": "active"
    }]
  }' \
  "$CRAFT_ENDPOINT/tasks"
```

#### 更新任务(标记完成)
```bash
curl -X PUT \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tasksToUpdate": [{
      "id": "TASK_ID",
      "markdown": "- [x] Completed task"
    }]
  }' \
  "$CRAFT_ENDPOINT/tasks"
```

#### 列出任务
```bash
# Active tasks
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
  "$CRAFT_ENDPOINT/tasks?scope=active"

# All completed (logbook)
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
  "$CRAFT_ENDPOINT/tasks?scope=logbook"

# Upcoming
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
  "$CRAFT_ENDPOINT/tasks?scope=upcoming"

# Inbox only
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
  "$CRAFT_ENDPOINT/tasks?scope=inbox"
```

#### 移动文档
```bash
curl -X PUT \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "documentIds": ["DOC_ID"],
    "destination": {"location": "unsorted"}
  }' \
  "$CRAFT_ENDPOINT/documents/move"
```

说明:只能移动到 `unsorted`、`templates` 或自定义文件夹 ID。无法直接移动到 `trash`。

### ❌ 限制

- **无 Collections API** — 集合(数据库)无法通过 API 访问
- **无法删除任务** — 只能创建/更新任务,不能删除
- **无法删除文档** — 不能直接删除文档(只能移动)
- **无搜索端点** — 搜索需要特定查询格式(需进一步测试)
- **过滤能力有限** — 集合的过滤/分组仅在 UI 中,API 不支持

## 常见用例

### 从外部系统同步任务
```bash
# Create task in Craft from Mission Control
TASK_TITLE="Deploy new feature"
curl -X POST \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"tasks\": [{
      \"markdown\": \"$TASK_TITLE\",
      \"location\": {\"type\": \"inbox\"},
      \"status\": \"active\"
    }]
  }" \
  "$CRAFT_ENDPOINT/tasks"
```

### 创建每日笔记
```bash
TODAY=$(date +%Y-%m-%d)
curl -X POST \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"documents\": [{
      \"title\": \"Daily Note - $TODAY\",
      \"content\": [{\"textContent\": \"# $TODAY\\n\\n## Tasks\\n\\n## Notes\\n\"}],
      \"location\": \"daily_notes\"
    }]
  }" \
  "$CRAFT_ENDPOINT/documents"
```

### 归档已完成工作
```bash
# Get all completed tasks
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
  "$CRAFT_ENDPOINT/tasks?scope=logbook" | jq '.items[] | {id, markdown, completedAt}'
```

## 集成模式

### Mission Control → Craft 同步

**问题:** Mission Control 有自动化但 UI 较丑。Craft UI 精美但缺少自动化。

**解决方案:** 以 Mission Control 为单一数据源,将已完成工作同步到 Craft 供查看。

```bash
#!/bin/bash
# sync-to-craft.sh - Sync completed tasks to Craft

# Read completed tasks from Mission Control
COMPLETED_TASKS=$(cat mission-control/tasks.json | jq -r '.[] | select(.status=="done") | .title')

# Push each to Craft
echo "$COMPLETED_TASKS" | while read -r task; do
  curl -X POST \
    -H "Authorization: Bearer $CRAFT_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{
      \"tasks\": [{
        \"markdown\": \"- [x] $task\",
        \"location\": {\"type\": \"inbox\"}
      }]
    }" \
    "$CRAFT_ENDPOINT/tasks"
done
```

## Markdown 支持

Craft 完全支持 Markdown:
- 标题:`# H1`、`## H2` 等
- 列表:`- item`、`1. item`
- 任务:`- [ ] todo`、`- [x] done`
- 链接:`[text](url)`
- 代码:`` `inline` `` 或 ` ```block``` `
- 强调:`*italic*`、`**bold**`

所有内容以 Markdown 形式存储与返回,非常适合程序化操作。

## 最佳实践

1. **安全存储 API key** — 切勿提交到代码库
2. **先在 unsorted 文件夹测试** — 便于查找与清理
3. **使用 Markdown 格式** — 两个系统均原生支持
4. **仅单向同步** — Craft → 只读,Mission Control → 写入
5. **批量操作** — API 支持数组以提高效率
6. **优雅处理错误** — API 返回详细的验证错误

## 错误处理

常见错误:
- `VALIDATION_ERROR` — 检查必填字段(markdown、location)
- `403` — API key 无效或已过期
- `404` — 文档/任务 ID 未找到

验证错误示例:
```json
{
  "error": "Validation failed",
  "code": "VALIDATION_ERROR",
  "details": [{
    "path": ["tasks", 0, "markdown"],
    "message": "Invalid input: expected string"
  }]
}
```

## 未来可能

当 Craft 扩展 API 时:
- [ ] 通过 API 进行 Collections CRUD
- [ ] 任务删除
- [ ] 文档删除
- [ ] 高级搜索
- [ ] 用于实时同步的 Webhooks
- [ ] 大数据集的批量操作

## 资源

- [Craft API Docs](https://craft.do/api)(从 Craft 设置获取你的个人 API 端点)
- [Craft Blog - Collections](https://www.craft.do/blog/introducing-collections)
- [Craft YouTube](https://www.youtube.com/channel/UC8OIJ9uNRQZiG78K2BSn67A)

## 测试清单

- [x] 列出文件夹
- [x] 列出文档
- [x] 创建文档
- [x] 向文档添加内容(通过 /blocks 端点)
- [x] 读取文档内容
- [x] 创建任务
- [x] 更新任务(标记完成)
- [x] 列出任务(所有 scope)
- [x] 在位置间移动文档
- [x] 完整 Obsidian → Craft 迁移(含内容)
- [ ] 搜索(需完善格式)
- [x] Collections — API 不可访问
- [x] 删除任务 — 不支持
- [x] 删除文档 — 不支持(只能移动)

## 示例:完整工作流

```bash
# 1. Create a project folder
PROJECT_ID=$(curl -X POST \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Q1 2024 Projects"}' \
  "$CRAFT_ENDPOINT/folders" | jq -r '.id')

# 2. Create a project document
DOC_ID=$(curl -X POST \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"documents\": [{
      \"title\": \"Project Alpha\",
      \"content\": [{\"textContent\": \"## Overview\\n\\nProject details here.\"}],
      \"location\": \"$PROJECT_ID\"
    }]
  }" \
  "$CRAFT_ENDPOINT/documents" | jq -r '.items[0].id')

# 3. Create tasks for the project
curl -X POST \
  -H "Authorization: Bearer $CRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tasks": [
      {"markdown": "Design wireframes", "location": {"type": "inbox"}},
      {"markdown": "Build prototype", "location": {"type": "inbox"}},
      {"markdown": "User testing", "location": {"type": "inbox"}}
    ]
  }' \
  "$CRAFT_ENDPOINT/tasks"

# 4. Mark first task complete
TASK_ID=$(curl -H "Authorization: Bearer $CRAFT_API_KEY"