{
  "schemaVersion": "1.0",
  "item": {
    "slug": "craft-do",
    "name": "Craft API Skill and Obsidian Migration Tool",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/atomtanstudio/craft-do",
    "canonicalUrl": "https://clawhub.ai/atomtanstudio/craft-do",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/craft-do",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=craft-do",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "migrate-obsidian.sh",
      "craft-api.sh",
      "README.md",
      "SKILL.md",
      "migrate-obsidian-nested.sh",
      "cleanup-craft.sh"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/craft-do"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/craft-do",
    "agentPageUrl": "https://openagent3.xyz/skills/craft-do/agent",
    "manifestUrl": "https://openagent3.xyz/skills/craft-do/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/craft-do/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Craft.do Integration Skill",
        "body": "Complete REST API integration for Craft.do - the beautiful note-taking and document app."
      },
      {
        "title": "Overview",
        "body": "This skill provides full programmatic access to Craft.do for:\n\nTask automation: Create, update, manage tasks across inbox/daily notes/logbook\nDocument workflows: Programmatically create, read, organize documents\nFolder management: Build nested folder hierarchies via API\nObsidian migration: One-time full vault migration with content preservation\nContent manipulation: Add/edit markdown content via blocks API\n\nCraft.do features:\n\nNative markdown support\nTask management (inbox, daily notes, logbook)\nCollections (database tables)\nHierarchical folders and documents\nFull REST API access"
      },
      {
        "title": "Setup",
        "body": "Get your API key from Craft.do settings\nStore credentials securely:\n\nexport CRAFT_API_KEY=\"pdk_xxx\"\nexport CRAFT_ENDPOINT=\"https://connect.craft.do/links/YOUR_LINK/api/v1\""
      },
      {
        "title": "✅ What Works",
        "body": "List Folders\n\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/folders\"\n\nReturns all locations: unsorted, daily_notes, trash, templates, and custom folders.\n\nList Documents\n\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/documents?folderId=FOLDER_ID\"\n\nCreate Folder (with optional parent for nesting)\n\n# Root-level folder\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"folders\": [{\n      \"name\": \"Projects\"\n    }]\n  }' \\\n  \"$CRAFT_ENDPOINT/folders\"\n\n# Nested folder (requires parent folder ID)\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"folders\": [{\n      \"name\": \"Q1 2024\",\n      \"parentFolderId\": \"PARENT_FOLDER_ID\"\n    }]\n  }' \\\n  \"$CRAFT_ENDPOINT/folders\"\n\nCreate Document\n\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"documents\": [{\n      \"title\": \"Document Title\"\n    }],\n    \"destination\": {\n      \"folderId\": \"FOLDER_ID\"\n    }\n  }' \\\n  \"$CRAFT_ENDPOINT/documents\"\n\nNote: Documents are created without content initially. Use the /blocks endpoint to add content.\n\nAdd Content to Document\n\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"blocks\": [{\n      \"type\": \"text\",\n      \"markdown\": \"# Document content\\n\\nFull markdown support!\"\n    }],\n    \"position\": {\n      \"pageId\": \"DOCUMENT_ID\",\n      \"position\": \"end\"\n    }\n  }' \\\n  \"$CRAFT_ENDPOINT/blocks\"\n\nRead Document Content\n\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/blocks?id=DOCUMENT_ID\"\n\nReturns full markdown content with all blocks.\n\nCreate Task\n\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"tasks\": [{\n      \"markdown\": \"Task description\",\n      \"location\": {\"type\": \"inbox\"},\n      \"status\": \"active\"\n    }]\n  }' \\\n  \"$CRAFT_ENDPOINT/tasks\"\n\nUpdate Task (Mark Complete)\n\ncurl -X PUT \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"tasksToUpdate\": [{\n      \"id\": \"TASK_ID\",\n      \"markdown\": \"- [x] Completed task\"\n    }]\n  }' \\\n  \"$CRAFT_ENDPOINT/tasks\"\n\nList Tasks\n\n# Active tasks\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=active\"\n\n# All completed (logbook)\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=logbook\"\n\n# Upcoming\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=upcoming\"\n\n# Inbox only\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=inbox\"\n\nMove Documents\n\ncurl -X PUT \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"documentIds\": [\"DOC_ID\"],\n    \"destination\": {\"location\": \"unsorted\"}\n  }' \\\n  \"$CRAFT_ENDPOINT/documents/move\"\n\nNote: Can only move to unsorted, templates, or custom folder IDs. Cannot move directly to trash."
      },
      {
        "title": "❌ Limitations",
        "body": "No Collections API - Collections (databases) not accessible via API\nNo task deletion - Can only create/update tasks, not delete\nNo document deletion - Cannot delete documents directly (only move)\nNo search endpoint - Search requires specific query format (needs more testing)\nLimited filtering - Collections filtering/grouping only in UI, not via API"
      },
      {
        "title": "Sync Tasks from External System",
        "body": "# Create task in Craft from Mission Control\nTASK_TITLE=\"Deploy new feature\"\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"tasks\\\": [{\n      \\\"markdown\\\": \\\"$TASK_TITLE\\\",\n      \\\"location\\\": {\\\"type\\\": \\\"inbox\\\"},\n      \\\"status\\\": \\\"active\\\"\n    }]\n  }\" \\\n  \"$CRAFT_ENDPOINT/tasks\""
      },
      {
        "title": "Create Daily Note",
        "body": "TODAY=$(date +%Y-%m-%d)\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"documents\\\": [{\n      \\\"title\\\": \\\"Daily Note - $TODAY\\\",\n      \\\"content\\\": [{\\\"textContent\\\": \\\"# $TODAY\\\\n\\\\n## Tasks\\\\n\\\\n## Notes\\\\n\\\"}],\n      \\\"location\\\": \\\"daily_notes\\\"\n    }]\n  }\" \\\n  \"$CRAFT_ENDPOINT/documents\""
      },
      {
        "title": "Archive Completed Work",
        "body": "# Get all completed tasks\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=logbook\" | jq '.items[] | {id, markdown, completedAt}'"
      },
      {
        "title": "Mission Control → Craft Sync",
        "body": "Problem: Mission Control has automation but ugly UI. Craft has beautiful UI but no automation.\n\nSolution: Use Mission Control as the source of truth, sync completed work to Craft for viewing.\n\n#!/bin/bash\n# sync-to-craft.sh - Sync completed tasks to Craft\n\n# Read completed tasks from Mission Control\nCOMPLETED_TASKS=$(cat mission-control/tasks.json | jq -r '.[] | select(.status==\"done\") | .title')\n\n# Push each to Craft\necho \"$COMPLETED_TASKS\" | while read -r task; do\n  curl -X POST \\\n    -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n    -H \"Content-Type: application/json\" \\\n    -d \"{\n      \\\"tasks\\\": [{\n        \\\"markdown\\\": \\\"- [x] $task\\\",\n        \\\"location\\\": {\\\"type\\\": \\\"inbox\\\"}\n      }]\n    }\" \\\n    \"$CRAFT_ENDPOINT/tasks\"\ndone"
      },
      {
        "title": "Markdown Support",
        "body": "Craft fully supports markdown:\n\nHeaders: # H1, ## H2, etc.\nLists: - item, 1. item\nTasks: - [ ] todo, - [x] done\nLinks: [text](url)\nCode: `inline` or ```block```\nEmphasis: *italic*, **bold**\n\nAll content is stored and returned as markdown, making it perfect for programmatic manipulation."
      },
      {
        "title": "Best Practices",
        "body": "Store API key securely - Never commit to code\nTest in unsorted folder first - Easy to find/clean up\nUse markdown format - Native to both systems\nOne-way sync only - Craft → read-only, Mission Control → write\nBatch operations - API supports arrays for efficiency\nHandle errors gracefully - API returns detailed validation errors"
      },
      {
        "title": "Error Handling",
        "body": "Common errors:\n\nVALIDATION_ERROR - Check required fields (markdown, location)\n403 - Invalid/expired API key\n404 - Document/task ID not found\n\nExample validation error:\n\n{\n  \"error\": \"Validation failed\",\n  \"code\": \"VALIDATION_ERROR\",\n  \"details\": [{\n    \"path\": [\"tasks\", 0, \"markdown\"],\n    \"message\": \"Invalid input: expected string\"\n  }]\n}"
      },
      {
        "title": "Future Possibilities",
        "body": "When Craft adds to their API:\n\nCollections CRUD via API\n Task deletion\n Document deletion\n Advanced search\n Webhooks for real-time sync\n Batch operations for large datasets"
      },
      {
        "title": "Resources",
        "body": "Craft API Docs (get your personal API endpoint from Craft settings)\nCraft Blog - Collections\nCraft YouTube"
      },
      {
        "title": "Testing Checklist",
        "body": "List folders\n List documents\n Create document\n Add content to document (via /blocks endpoint)\n Read document content\n Create task\n Update task (mark complete)\n List tasks (all scopes)\n Move documents between locations\n Full Obsidian → Craft migration with content\n Search (needs format refinement)\n Collections - NOT accessible via API\n Delete tasks - NOT supported\n Delete documents - NOT supported (only move)"
      },
      {
        "title": "Example: Complete Workflow",
        "body": "# 1. Create a project folder\nPROJECT_ID=$(curl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\": \"Q1 2024 Projects\"}' \\\n  \"$CRAFT_ENDPOINT/folders\" | jq -r '.id')\n\n# 2. Create a project document\nDOC_ID=$(curl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"documents\\\": [{\n      \\\"title\\\": \\\"Project Alpha\\\",\n      \\\"content\\\": [{\\\"textContent\\\": \\\"## Overview\\\\n\\\\nProject details here.\\\"}],\n      \\\"location\\\": \\\"$PROJECT_ID\\\"\n    }]\n  }\" \\\n  \"$CRAFT_ENDPOINT/documents\" | jq -r '.items[0].id')\n\n# 3. Create tasks for the project\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"tasks\": [\n      {\"markdown\": \"Design wireframes\", \"location\": {\"type\": \"inbox\"}},\n      {\"markdown\": \"Build prototype\", \"location\": {\"type\": \"inbox\"}},\n      {\"markdown\": \"User testing\", \"location\": {\"type\": \"inbox\"}}\n    ]\n  }' \\\n  \"$CRAFT_ENDPOINT/tasks\"\n\n# 4. Mark first task complete\nTASK_ID=$(curl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=active\" | jq -r '.items[0].id')\n\ncurl -X PUT \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"tasksToUpdate\\\": [{\n      \\\"id\\\": \\\"$TASK_ID\\\",\n      \\\"markdown\\\": \\\"- [x] Design wireframes\\\"\n    }]\n  }\" \\\n  \"$CRAFT_ENDPOINT/tasks\"\n\nStatus: Tested and working (2026-01-31)\nTested with: Craft API v1\nAuthor: Eliza"
      }
    ],
    "body": "Craft.do Integration Skill\n\nComplete REST API integration for Craft.do - the beautiful note-taking and document app.\n\nOverview\n\nThis skill provides full programmatic access to Craft.do for:\n\nTask automation: Create, update, manage tasks across inbox/daily notes/logbook\nDocument workflows: Programmatically create, read, organize documents\nFolder management: Build nested folder hierarchies via API\nObsidian migration: One-time full vault migration with content preservation\nContent manipulation: Add/edit markdown content via blocks API\n\nCraft.do features:\n\nNative markdown support\nTask management (inbox, daily notes, logbook)\nCollections (database tables)\nHierarchical folders and documents\nFull REST API access\nSetup\nGet your API key from Craft.do settings\nStore credentials securely:\nexport CRAFT_API_KEY=\"pdk_xxx\"\nexport CRAFT_ENDPOINT=\"https://connect.craft.do/links/YOUR_LINK/api/v1\"\n\nAPI Capabilities\n✅ What Works\nList Folders\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/folders\"\n\n\nReturns all locations: unsorted, daily_notes, trash, templates, and custom folders.\n\nList Documents\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/documents?folderId=FOLDER_ID\"\n\nCreate Folder (with optional parent for nesting)\n# Root-level folder\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"folders\": [{\n      \"name\": \"Projects\"\n    }]\n  }' \\\n  \"$CRAFT_ENDPOINT/folders\"\n\n# Nested folder (requires parent folder ID)\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"folders\": [{\n      \"name\": \"Q1 2024\",\n      \"parentFolderId\": \"PARENT_FOLDER_ID\"\n    }]\n  }' \\\n  \"$CRAFT_ENDPOINT/folders\"\n\nCreate Document\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"documents\": [{\n      \"title\": \"Document Title\"\n    }],\n    \"destination\": {\n      \"folderId\": \"FOLDER_ID\"\n    }\n  }' \\\n  \"$CRAFT_ENDPOINT/documents\"\n\n\nNote: Documents are created without content initially. Use the /blocks endpoint to add content.\n\nAdd Content to Document\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"blocks\": [{\n      \"type\": \"text\",\n      \"markdown\": \"# Document content\\n\\nFull markdown support!\"\n    }],\n    \"position\": {\n      \"pageId\": \"DOCUMENT_ID\",\n      \"position\": \"end\"\n    }\n  }' \\\n  \"$CRAFT_ENDPOINT/blocks\"\n\nRead Document Content\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/blocks?id=DOCUMENT_ID\"\n\n\nReturns full markdown content with all blocks.\n\nCreate Task\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"tasks\": [{\n      \"markdown\": \"Task description\",\n      \"location\": {\"type\": \"inbox\"},\n      \"status\": \"active\"\n    }]\n  }' \\\n  \"$CRAFT_ENDPOINT/tasks\"\n\nUpdate Task (Mark Complete)\ncurl -X PUT \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"tasksToUpdate\": [{\n      \"id\": \"TASK_ID\",\n      \"markdown\": \"- [x] Completed task\"\n    }]\n  }' \\\n  \"$CRAFT_ENDPOINT/tasks\"\n\nList Tasks\n# Active tasks\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=active\"\n\n# All completed (logbook)\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=logbook\"\n\n# Upcoming\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=upcoming\"\n\n# Inbox only\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=inbox\"\n\nMove Documents\ncurl -X PUT \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"documentIds\": [\"DOC_ID\"],\n    \"destination\": {\"location\": \"unsorted\"}\n  }' \\\n  \"$CRAFT_ENDPOINT/documents/move\"\n\n\nNote: Can only move to unsorted, templates, or custom folder IDs. Cannot move directly to trash.\n\n❌ Limitations\nNo Collections API - Collections (databases) not accessible via API\nNo task deletion - Can only create/update tasks, not delete\nNo document deletion - Cannot delete documents directly (only move)\nNo search endpoint - Search requires specific query format (needs more testing)\nLimited filtering - Collections filtering/grouping only in UI, not via API\nCommon Use Cases\nSync Tasks from External System\n# Create task in Craft from Mission Control\nTASK_TITLE=\"Deploy new feature\"\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"tasks\\\": [{\n      \\\"markdown\\\": \\\"$TASK_TITLE\\\",\n      \\\"location\\\": {\\\"type\\\": \\\"inbox\\\"},\n      \\\"status\\\": \\\"active\\\"\n    }]\n  }\" \\\n  \"$CRAFT_ENDPOINT/tasks\"\n\nCreate Daily Note\nTODAY=$(date +%Y-%m-%d)\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"documents\\\": [{\n      \\\"title\\\": \\\"Daily Note - $TODAY\\\",\n      \\\"content\\\": [{\\\"textContent\\\": \\\"# $TODAY\\\\n\\\\n## Tasks\\\\n\\\\n## Notes\\\\n\\\"}],\n      \\\"location\\\": \\\"daily_notes\\\"\n    }]\n  }\" \\\n  \"$CRAFT_ENDPOINT/documents\"\n\nArchive Completed Work\n# Get all completed tasks\ncurl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=logbook\" | jq '.items[] | {id, markdown, completedAt}'\n\nIntegration Patterns\nMission Control → Craft Sync\n\nProblem: Mission Control has automation but ugly UI. Craft has beautiful UI but no automation.\n\nSolution: Use Mission Control as the source of truth, sync completed work to Craft for viewing.\n\n#!/bin/bash\n# sync-to-craft.sh - Sync completed tasks to Craft\n\n# Read completed tasks from Mission Control\nCOMPLETED_TASKS=$(cat mission-control/tasks.json | jq -r '.[] | select(.status==\"done\") | .title')\n\n# Push each to Craft\necho \"$COMPLETED_TASKS\" | while read -r task; do\n  curl -X POST \\\n    -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n    -H \"Content-Type: application/json\" \\\n    -d \"{\n      \\\"tasks\\\": [{\n        \\\"markdown\\\": \\\"- [x] $task\\\",\n        \\\"location\\\": {\\\"type\\\": \\\"inbox\\\"}\n      }]\n    }\" \\\n    \"$CRAFT_ENDPOINT/tasks\"\ndone\n\nMarkdown Support\n\nCraft fully supports markdown:\n\nHeaders: # H1, ## H2, etc.\nLists: - item, 1. item\nTasks: - [ ] todo, - [x] done\nLinks: [text](url)\nCode: `inline` or ```block```\nEmphasis: *italic*, **bold**\n\nAll content is stored and returned as markdown, making it perfect for programmatic manipulation.\n\nBest Practices\nStore API key securely - Never commit to code\nTest in unsorted folder first - Easy to find/clean up\nUse markdown format - Native to both systems\nOne-way sync only - Craft → read-only, Mission Control → write\nBatch operations - API supports arrays for efficiency\nHandle errors gracefully - API returns detailed validation errors\nError Handling\n\nCommon errors:\n\nVALIDATION_ERROR - Check required fields (markdown, location)\n403 - Invalid/expired API key\n404 - Document/task ID not found\n\nExample validation error:\n\n{\n  \"error\": \"Validation failed\",\n  \"code\": \"VALIDATION_ERROR\",\n  \"details\": [{\n    \"path\": [\"tasks\", 0, \"markdown\"],\n    \"message\": \"Invalid input: expected string\"\n  }]\n}\n\nFuture Possibilities\n\nWhen Craft adds to their API:\n\n Collections CRUD via API\n Task deletion\n Document deletion\n Advanced search\n Webhooks for real-time sync\n Batch operations for large datasets\nResources\nCraft API Docs (get your personal API endpoint from Craft settings)\nCraft Blog - Collections\nCraft YouTube\nTesting Checklist\n List folders\n List documents\n Create document\n Add content to document (via /blocks endpoint)\n Read document content\n Create task\n Update task (mark complete)\n List tasks (all scopes)\n Move documents between locations\n Full Obsidian → Craft migration with content\n Search (needs format refinement)\n Collections - NOT accessible via API\n Delete tasks - NOT supported\n Delete documents - NOT supported (only move)\nExample: Complete Workflow\n# 1. Create a project folder\nPROJECT_ID=$(curl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\": \"Q1 2024 Projects\"}' \\\n  \"$CRAFT_ENDPOINT/folders\" | jq -r '.id')\n\n# 2. Create a project document\nDOC_ID=$(curl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"documents\\\": [{\n      \\\"title\\\": \\\"Project Alpha\\\",\n      \\\"content\\\": [{\\\"textContent\\\": \\\"## Overview\\\\n\\\\nProject details here.\\\"}],\n      \\\"location\\\": \\\"$PROJECT_ID\\\"\n    }]\n  }\" \\\n  \"$CRAFT_ENDPOINT/documents\" | jq -r '.items[0].id')\n\n# 3. Create tasks for the project\ncurl -X POST \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"tasks\": [\n      {\"markdown\": \"Design wireframes\", \"location\": {\"type\": \"inbox\"}},\n      {\"markdown\": \"Build prototype\", \"location\": {\"type\": \"inbox\"}},\n      {\"markdown\": \"User testing\", \"location\": {\"type\": \"inbox\"}}\n    ]\n  }' \\\n  \"$CRAFT_ENDPOINT/tasks\"\n\n# 4. Mark first task complete\nTASK_ID=$(curl -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  \"$CRAFT_ENDPOINT/tasks?scope=active\" | jq -r '.items[0].id')\n\ncurl -X PUT \\\n  -H \"Authorization: Bearer $CRAFT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"tasksToUpdate\\\": [{\n      \\\"id\\\": \\\"$TASK_ID\\\",\n      \\\"markdown\\\": \\\"- [x] Design wireframes\\\"\n    }]\n  }\" \\\n  \"$CRAFT_ENDPOINT/tasks\"\n\n\nStatus: Tested and working (2026-01-31) Tested with: Craft API v1 Author: Eliza"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/atomtanstudio/craft-do",
    "publisherUrl": "https://clawhub.ai/atomtanstudio/craft-do",
    "owner": "atomtanstudio",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/craft-do",
    "downloadUrl": "https://openagent3.xyz/downloads/craft-do",
    "agentUrl": "https://openagent3.xyz/skills/craft-do/agent",
    "manifestUrl": "https://openagent3.xyz/skills/craft-do/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/craft-do/agent.md"
  }
}