{
  "schemaVersion": "1.0",
  "item": {
    "slug": "openkm-rest",
    "name": "OpenKM Document Management",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/pes0/openkm-rest",
    "canonicalUrl": "https://clawhub.ai/pes0/openkm-rest",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/openkm-rest",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=openkm-rest",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "openkm_cli.py",
      "README.txt",
      "SKILL.md"
    ],
    "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. 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. 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/openkm-rest"
    },
    "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/openkm-rest",
    "agentPageUrl": "https://openagent3.xyz/skills/openkm-rest/agent",
    "manifestUrl": "https://openagent3.xyz/skills/openkm-rest/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/openkm-rest/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. 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. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "OpenKM REST Skill",
        "body": "This skill provides a local CLI that accesses OpenKM exclusively via REST\n(no SOAP, no CMIS).\n\nThe agent uses shell calls to openkm_cli.py."
      },
      {
        "title": "Environment Variables (Required)",
        "body": "OPENKM_BASE_URL=https://openkm.example.com   # WITHOUT /OpenKM\nOPENKM_USERNAME=okm_admin\nOPENKM_PASSWORD=secret"
      },
      {
        "title": "List folder contents",
        "body": "python3 openkm_cli.py list --folder-path /okm:root"
      },
      {
        "title": "Create folder structure",
        "body": "Creates parent folders if they don't exist:\n\npython3 openkm_cli.py ensure-structure --parts Folder1 Subfolder"
      },
      {
        "title": "Upload document",
        "body": "python3 openkm_cli.py upload --okm-path /okm:root/Folder/file.pdf --local-path /path/file.pdf"
      },
      {
        "title": "Download document",
        "body": "python3 openkm_cli.py download --doc-id <uuid> --local-path /path/file.pdf"
      },
      {
        "title": "Move document",
        "body": "Move a document to another folder (using folder UUID as target):\n\npython3 openkm_cli.py move --doc-id <doc-uuid> --target-path <folder-uuid>"
      },
      {
        "title": "Rename document",
        "body": "python3 openkm_cli.py rename --doc-id <uuid> --new-name new_filename.pdf"
      },
      {
        "title": "Delete document",
        "body": "python3 openkm_cli.py delete --doc-id <uuid>"
      },
      {
        "title": "Get document properties",
        "body": "Shows title, description, keywords, categories, and other metadata:\n\npython3 openkm_cli.py properties --doc-id <uuid>"
      },
      {
        "title": "Set title and description",
        "body": "python3 openkm_cli.py set-properties --doc-id <uuid> --title \"My Title\" --description \"My description\""
      },
      {
        "title": "Add keyword",
        "body": "python3 openkm_cli.py add-keyword --doc-id <uuid> --keyword \"Invoice\""
      },
      {
        "title": "Remove keyword",
        "body": "python3 openkm_cli.py remove-keyword --doc-id <uuid> --keyword \"Invoice\""
      },
      {
        "title": "Add category",
        "body": "Category ID can be a UUID or path (e.g., /okm:categories/Finance):\n\npython3 openkm_cli.py add-category --doc-id <uuid> --category-id <category-uuid-or-path>"
      },
      {
        "title": "Remove category",
        "body": "python3 openkm_cli.py remove-category --doc-id <uuid> --category-id <category-uuid-or-path>"
      },
      {
        "title": "Get version history",
        "body": "python3 openkm_cli.py versions --doc-id <uuid>"
      },
      {
        "title": "Download specific version",
        "body": "python3 openkm_cli.py download-version --doc-id <uuid> --version 1.0 --local-path /path/file_v1.pdf"
      },
      {
        "title": "Restore version",
        "body": "Restores document to a previous version:\n\npython3 openkm_cli.py restore-version --doc-id <uuid> --version 1.0"
      },
      {
        "title": "Search by content (full-text)",
        "body": "python3 openkm_cli.py search-content --content \"invoice hosting\""
      },
      {
        "title": "Search by filename",
        "body": "python3 openkm_cli.py search-name --name \"hetzner\""
      },
      {
        "title": "Search by keywords",
        "body": "python3 openkm_cli.py search-keywords --keywords \"Invoice,Hosting\""
      },
      {
        "title": "General search with filters",
        "body": "python3 openkm_cli.py search --content \"server\" --author \"john.doe\" --path \"/okm:root\""
      },
      {
        "title": "Workflows",
        "body": "Note: Workflow features require workflows to be configured in OpenKM.\nIf workflows are not enabled, these commands will return 404."
      },
      {
        "title": "List available workflows",
        "body": "python3 openkm_cli.py workflows\npython3 openkm_cli.py workflows --name \"approval\""
      },
      {
        "title": "Start a workflow",
        "body": "python3 openkm_cli.py start-workflow --workflow-uuid <workflow-uuid> --doc-id <doc-uuid>"
      },
      {
        "title": "List tasks",
        "body": "# Tasks for a document\npython3 openkm_cli.py tasks --doc-id <uuid>\n\n# Tasks for an actor\npython3 openkm_cli.py tasks --actor-id john.doe"
      },
      {
        "title": "Complete a task",
        "body": "python3 openkm_cli.py complete-task --task-id <task-id> --transition \"approve\""
      },
      {
        "title": "Add comment to task",
        "body": "python3 openkm_cli.py comment-task --task-id <task-id> --message \"Review complete\""
      },
      {
        "title": "Assign task to actor",
        "body": "python3 openkm_cli.py assign-task --task-id <task-id> --actor-id john.doe"
      },
      {
        "title": "Notes",
        "body": "The API expects Content-Type: application/xml for POST requests with path as body\nPaths must be URL-encoded when passed as query parameters\nThe fldId, docId, dstId, nodeId, catId parameters accept either UUIDs or paths (e.g., /okm:root/Folder)\nFor move operations, the target-path should be the UUID of the destination folder\nFor rename operations, provide only the new filename (not full path)\nKeywords are free-form text tags; categories are predefined in OpenKM\nVersion names are typically numbers like 1.0, 1.1, 2.0, etc.\nSearch results include a relevance score\nWorkflow features require proper workflow configuration in OpenKM"
      },
      {
        "title": "API Reference",
        "body": "The skill uses the OpenKM 6.3 REST API endpoints:\n\nFolders:\n\nGET /folder/getChildren - List folder contents\nPOST /folder/createSimple - Create folder\n\nDocuments:\n\nPOST /document/createSimple - Upload document\nGET /document/getContent - Download document\nGET /document/getProperties - Get document metadata\nPUT /document/setProperties - Update title/description\nPUT /document/move - Move document\nPUT /document/rename - Rename document\nDELETE /document/delete - Delete document\n\nVersioning:\n\nGET /document/getVersionHistory - Get version history\nPUT /document/restoreVersion - Restore to version\nGET /document/getContentByVersion - Download specific version\n\nProperties/Metadata:\n\nPOST /property/addKeyword - Add keyword\nDELETE /property/removeKeyword - Remove keyword\nPOST /property/addCategory - Add category\nDELETE /property/removeCategory - Remove category\n\nSearch:\n\nGET /search/find - General search with filters\nGET /search/findByContent - Full-text search\nGET /search/findByName - Filename search\nGET /search/findByKeywords - Keyword search\n\nWorkflows:\n\nGET /workflow/getAllProcessDefinitions - List workflows\nGET /workflow/getAllProcessDefinitionsByName - Find workflow by name\nPOST /workflow/runProcessDefinition - Start workflow\nGET /workflow/findTaskInstances - Get tasks by document\nGET /workflow/findTaskInstancesByActor - Get tasks by actor\nPOST /workflow/setTaskInstanceValues - Complete task\nPOST /workflow/addTaskInstanceComment - Add comment\nPOST /workflow/setTaskInstanceActor - Assign task"
      }
    ],
    "body": "OpenKM REST Skill\n\nThis skill provides a local CLI that accesses OpenKM exclusively via REST (no SOAP, no CMIS).\n\nThe agent uses shell calls to openkm_cli.py.\n\nEnvironment Variables (Required)\nOPENKM_BASE_URL=https://openkm.example.com   # WITHOUT /OpenKM\nOPENKM_USERNAME=okm_admin\nOPENKM_PASSWORD=secret\n\nFolder Operations\nList folder contents\npython3 openkm_cli.py list --folder-path /okm:root\n\nCreate folder structure\n\nCreates parent folders if they don't exist:\n\npython3 openkm_cli.py ensure-structure --parts Folder1 Subfolder\n\nDocument Operations\nUpload document\npython3 openkm_cli.py upload --okm-path /okm:root/Folder/file.pdf --local-path /path/file.pdf\n\nDownload document\npython3 openkm_cli.py download --doc-id <uuid> --local-path /path/file.pdf\n\nMove document\n\nMove a document to another folder (using folder UUID as target):\n\npython3 openkm_cli.py move --doc-id <doc-uuid> --target-path <folder-uuid>\n\nRename document\npython3 openkm_cli.py rename --doc-id <uuid> --new-name new_filename.pdf\n\nDelete document\npython3 openkm_cli.py delete --doc-id <uuid>\n\nMetadata & Organization\nGet document properties\n\nShows title, description, keywords, categories, and other metadata:\n\npython3 openkm_cli.py properties --doc-id <uuid>\n\nSet title and description\npython3 openkm_cli.py set-properties --doc-id <uuid> --title \"My Title\" --description \"My description\"\n\nAdd keyword\npython3 openkm_cli.py add-keyword --doc-id <uuid> --keyword \"Invoice\"\n\nRemove keyword\npython3 openkm_cli.py remove-keyword --doc-id <uuid> --keyword \"Invoice\"\n\nAdd category\n\nCategory ID can be a UUID or path (e.g., /okm:categories/Finance):\n\npython3 openkm_cli.py add-category --doc-id <uuid> --category-id <category-uuid-or-path>\n\nRemove category\npython3 openkm_cli.py remove-category --doc-id <uuid> --category-id <category-uuid-or-path>\n\nVersioning\nGet version history\npython3 openkm_cli.py versions --doc-id <uuid>\n\nDownload specific version\npython3 openkm_cli.py download-version --doc-id <uuid> --version 1.0 --local-path /path/file_v1.pdf\n\nRestore version\n\nRestores document to a previous version:\n\npython3 openkm_cli.py restore-version --doc-id <uuid> --version 1.0\n\nSearch\nSearch by content (full-text)\npython3 openkm_cli.py search-content --content \"invoice hosting\"\n\nSearch by filename\npython3 openkm_cli.py search-name --name \"hetzner\"\n\nSearch by keywords\npython3 openkm_cli.py search-keywords --keywords \"Invoice,Hosting\"\n\nGeneral search with filters\npython3 openkm_cli.py search --content \"server\" --author \"john.doe\" --path \"/okm:root\"\n\nWorkflows\n\nNote: Workflow features require workflows to be configured in OpenKM. If workflows are not enabled, these commands will return 404.\n\nList available workflows\npython3 openkm_cli.py workflows\npython3 openkm_cli.py workflows --name \"approval\"\n\nStart a workflow\npython3 openkm_cli.py start-workflow --workflow-uuid <workflow-uuid> --doc-id <doc-uuid>\n\nList tasks\n# Tasks for a document\npython3 openkm_cli.py tasks --doc-id <uuid>\n\n# Tasks for an actor\npython3 openkm_cli.py tasks --actor-id john.doe\n\nComplete a task\npython3 openkm_cli.py complete-task --task-id <task-id> --transition \"approve\"\n\nAdd comment to task\npython3 openkm_cli.py comment-task --task-id <task-id> --message \"Review complete\"\n\nAssign task to actor\npython3 openkm_cli.py assign-task --task-id <task-id> --actor-id john.doe\n\nNotes\nThe API expects Content-Type: application/xml for POST requests with path as body\nPaths must be URL-encoded when passed as query parameters\nThe fldId, docId, dstId, nodeId, catId parameters accept either UUIDs or paths (e.g., /okm:root/Folder)\nFor move operations, the target-path should be the UUID of the destination folder\nFor rename operations, provide only the new filename (not full path)\nKeywords are free-form text tags; categories are predefined in OpenKM\nVersion names are typically numbers like 1.0, 1.1, 2.0, etc.\nSearch results include a relevance score\nWorkflow features require proper workflow configuration in OpenKM\nAPI Reference\n\nThe skill uses the OpenKM 6.3 REST API endpoints:\n\nFolders:\n\nGET /folder/getChildren - List folder contents\nPOST /folder/createSimple - Create folder\n\nDocuments:\n\nPOST /document/createSimple - Upload document\nGET /document/getContent - Download document\nGET /document/getProperties - Get document metadata\nPUT /document/setProperties - Update title/description\nPUT /document/move - Move document\nPUT /document/rename - Rename document\nDELETE /document/delete - Delete document\n\nVersioning:\n\nGET /document/getVersionHistory - Get version history\nPUT /document/restoreVersion - Restore to version\nGET /document/getContentByVersion - Download specific version\n\nProperties/Metadata:\n\nPOST /property/addKeyword - Add keyword\nDELETE /property/removeKeyword - Remove keyword\nPOST /property/addCategory - Add category\nDELETE /property/removeCategory - Remove category\n\nSearch:\n\nGET /search/find - General search with filters\nGET /search/findByContent - Full-text search\nGET /search/findByName - Filename search\nGET /search/findByKeywords - Keyword search\n\nWorkflows:\n\nGET /workflow/getAllProcessDefinitions - List workflows\nGET /workflow/getAllProcessDefinitionsByName - Find workflow by name\nPOST /workflow/runProcessDefinition - Start workflow\nGET /workflow/findTaskInstances - Get tasks by document\nGET /workflow/findTaskInstancesByActor - Get tasks by actor\nPOST /workflow/setTaskInstanceValues - Complete task\nPOST /workflow/addTaskInstanceComment - Add comment\nPOST /workflow/setTaskInstanceActor - Assign task"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/pes0/openkm-rest",
    "publisherUrl": "https://clawhub.ai/pes0/openkm-rest",
    "owner": "pes0",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/openkm-rest",
    "downloadUrl": "https://openagent3.xyz/downloads/openkm-rest",
    "agentUrl": "https://openagent3.xyz/skills/openkm-rest/agent",
    "manifestUrl": "https://openagent3.xyz/skills/openkm-rest/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/openkm-rest/agent.md"
  }
}