{
  "schemaVersion": "1.0",
  "item": {
    "slug": "holded-skill",
    "name": "Holded Skill",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/jaumecornado/holded-skill",
    "canonicalUrl": "https://clawhub.ai/jaumecornado/holded-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/holded-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=holded-skill",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "_meta.json",
      "agents/openai.yaml",
      "references/holdedcli-reference.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. 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/holded-skill"
    },
    "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/holded-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/holded-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/holded-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/holded-skill/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": "holded-skill",
        "body": "Use holdedcli to read and modify Holded data with a safe, repeatable workflow."
      },
      {
        "title": "Operational Flow",
        "body": "Confirm technical prerequisites.\nDiscover available actions with holded actions list.\nInspect the selected action with holded actions describe <action> --json.\nClassify the action as read or write.\nIf it is a write operation, ask for explicit confirmation before execution.\nRun with --json and summarize IDs, HTTP status, and applied changes."
      },
      {
        "title": "Prerequisites",
        "body": "Verify that the binary exists: holded help\nVerify credentials: holded auth status or HOLDED_API_KEY\nPrefer structured output whenever possible: --json"
      },
      {
        "title": "Safety Rules",
        "body": "ALWAYS check deductibility rules BEFORE creating any document. See \"Accounting Rules for Spain\" section below.\nTreat any POST, PUT, PATCH, or DELETE action as write.\nTreat any GET action (or HEAD when present) as read.\nBefore any operation, always run holded actions describe <action> --json (after holded actions list) to validate accepted parameters.\nFor purchase receipts, always enforce docType=purchase and include \"isReceipt\": true in the JSON body. Since holdedcli validates against Holded's schema (which doesn't include isReceipt), you must use --skip-validation flag.\nAsk for explicit user confirmation every time before any write action.\nDo not execute writes on ambiguous replies (ok, go ahead, continue) without clarification.\nRepeat the exact command before confirmation to avoid unintended changes.\nIf the user does not confirm, stop and offer payload adjustments."
      },
      {
        "title": "Mandatory Confirmation Protocol",
        "body": "Before any write action, show:\n\nHolded action (action_id or operation_id).\nMethod and endpoint.\n--path, --query, and body parameters (--body or --body-file).\nThe exact command to run.\n\nUse this format:\n\nThis operation will modify data in Holded.\nAction: <action_id> (<METHOD> <endpoint>)\nChanges: <short summary>\nCommand: holded actions run ... --json\nDo you confirm that I should run exactly this command? (reply with \"yes\" or \"confirm\")\n\nExecute only after an explicit affirmative response."
      },
      {
        "title": "Read Operations",
        "body": "Locate the action with holded actions list --json (use --filter).\nVerify accepted path/query/body parameters with holded actions describe <action> --json.\nRun holded actions run <action> ... --json.\nReturn a clear summary and relevant IDs for follow-up steps."
      },
      {
        "title": "Write Operations",
        "body": "Locate and validate the action.\nRun holded actions describe <action> --json to verify required/optional parameters.\nPrepare the final payload.\nIf creating a purchase receipt/ticket, verify docType=purchase and \"isReceipt\": true, and use --skip-validation flag.\nRequest mandatory confirmation.\nRun the command after confirmation.\nReport result (status_code, affected ID, API response)."
      },
      {
        "title": "Base Commands",
        "body": "holded auth set --api-key \"$HOLDED_API_KEY\"\nholded auth status\nholded ping --json\nholded actions list --json\nholded actions list --filter contacts --json\nholded actions describe invoice.get-contact --json\nholded actions run invoice.get-contact --path contactId=<id> --json\n\nFor long payloads, prefer --body-file:\n\nholded actions run invoice.update-contact \\\n  --path contactId=<id> \\\n  --body-file payload.json \\\n  --json\n\nPurchase receipt rule (mandatory for purchase tickets):\n\nholded actions describe invoice.create-document --json\nholded actions run invoice.create-document \\\n  --path docType=purchase \\\n  --body '{\"isReceipt\": true, \"date\": 1770764400, \"contactId\": \"<contactId>\", \"items\": [{\"name\": \"Description\", \"units\": 1, \"subtotal\": 29.4, \"tax\": 0}]}' \\\n  --skip-validation \\\n  --json\n\nImportant notes:\n\nUse --skip-validation flag because holdedcli validates against Holded's schema which doesn't include isReceipt.\nUse subtotal in items (not price) - this is the field name Holded's API expects.\nTimestamps must be in seconds (Unix epoch) and in Europe/Madrid timezone.\n\nTimestamp calculation (Python):\n\nfrom datetime import datetime, timezone, timedelta\n# For 11/02/2026 00:00 in Madrid:\ndt = datetime(2026, 2, 11, 0, 0, 0, tzinfo=timezone(timedelta(hours=1)))\nprint(int(dt.timestamp()))  # 1770764400"
      },
      {
        "title": "Accounting Rules for Spain",
        "body": "⚠️ ALWAYS check these rules BEFORE creating any expense document:\n\nExpense TypeIVA DeductibleExpense DeductibleAccountRestaurants/Meals❌ No✅ Yes (with justification)629Displacement❌ No✅ Yes629Fuel⚠️ Mixed✅ Yes625/622Office supplies✅ Yes✅ Yes600/602Insurance⚠️ Mixed✅ Yes625\n\nBefore creating any document, ALWAYS verify:\n\nIs the expense tax deductible?\nIs the IVA deductible? (usually NO for restaurants, displacement)\nIf in doubt, ASK before creating the document.\n\nCommon mistake to avoid: Never set tax: 10 or tax: 21 for restaurant expenses - IVA is NOT deductible for meals unless it's a business event with proper justification."
      },
      {
        "title": "Error Handling",
        "body": "If MISSING_API_KEY appears, configure API key through --api-key, HOLDED_API_KEY, or holded auth set.\nIf ACTION_NOT_FOUND appears, list the catalog and search with --filter.\nIf INVALID_BODY appears, validate JSON before execution.\nIf API_ERROR appears, report status_code and the API snippet."
      },
      {
        "title": "References",
        "body": "Read {baseDir}/references/holdedcli-reference.md for quick commands and criteria.\nUse dynamic action discovery and parameter inspection via:\n\nholded actions list --json\nholded actions describe <action> --json"
      }
    ],
    "body": "holded-skill\n\nUse holdedcli to read and modify Holded data with a safe, repeatable workflow.\n\nOperational Flow\nConfirm technical prerequisites.\nDiscover available actions with holded actions list.\nInspect the selected action with holded actions describe <action> --json.\nClassify the action as read or write.\nIf it is a write operation, ask for explicit confirmation before execution.\nRun with --json and summarize IDs, HTTP status, and applied changes.\nPrerequisites\nVerify that the binary exists: holded help\nVerify credentials: holded auth status or HOLDED_API_KEY\nPrefer structured output whenever possible: --json\nSafety Rules\nALWAYS check deductibility rules BEFORE creating any document. See \"Accounting Rules for Spain\" section below.\nTreat any POST, PUT, PATCH, or DELETE action as write.\nTreat any GET action (or HEAD when present) as read.\nBefore any operation, always run holded actions describe <action> --json (after holded actions list) to validate accepted parameters.\nFor purchase receipts, always enforce docType=purchase and include \"isReceipt\": true in the JSON body. Since holdedcli validates against Holded's schema (which doesn't include isReceipt), you must use --skip-validation flag.\nAsk for explicit user confirmation every time before any write action.\nDo not execute writes on ambiguous replies (ok, go ahead, continue) without clarification.\nRepeat the exact command before confirmation to avoid unintended changes.\nIf the user does not confirm, stop and offer payload adjustments.\nMandatory Confirmation Protocol\n\nBefore any write action, show:\n\nHolded action (action_id or operation_id).\nMethod and endpoint.\n--path, --query, and body parameters (--body or --body-file).\nThe exact command to run.\n\nUse this format:\n\nThis operation will modify data in Holded.\nAction: <action_id> (<METHOD> <endpoint>)\nChanges: <short summary>\nCommand: holded actions run ... --json\nDo you confirm that I should run exactly this command? (reply with \"yes\" or \"confirm\")\n\n\nExecute only after an explicit affirmative response.\n\nExecution Pattern\nRead Operations\nLocate the action with holded actions list --json (use --filter).\nVerify accepted path/query/body parameters with holded actions describe <action> --json.\nRun holded actions run <action> ... --json.\nReturn a clear summary and relevant IDs for follow-up steps.\nWrite Operations\nLocate and validate the action.\nRun holded actions describe <action> --json to verify required/optional parameters.\nPrepare the final payload.\nIf creating a purchase receipt/ticket, verify docType=purchase and \"isReceipt\": true, and use --skip-validation flag.\nRequest mandatory confirmation.\nRun the command after confirmation.\nReport result (status_code, affected ID, API response).\nBase Commands\nholded auth set --api-key \"$HOLDED_API_KEY\"\nholded auth status\nholded ping --json\nholded actions list --json\nholded actions list --filter contacts --json\nholded actions describe invoice.get-contact --json\nholded actions run invoice.get-contact --path contactId=<id> --json\n\n\nFor long payloads, prefer --body-file:\n\nholded actions run invoice.update-contact \\\n  --path contactId=<id> \\\n  --body-file payload.json \\\n  --json\n\n\nPurchase receipt rule (mandatory for purchase tickets):\n\nholded actions describe invoice.create-document --json\nholded actions run invoice.create-document \\\n  --path docType=purchase \\\n  --body '{\"isReceipt\": true, \"date\": 1770764400, \"contactId\": \"<contactId>\", \"items\": [{\"name\": \"Description\", \"units\": 1, \"subtotal\": 29.4, \"tax\": 0}]}' \\\n  --skip-validation \\\n  --json\n\n\nImportant notes:\n\nUse --skip-validation flag because holdedcli validates against Holded's schema which doesn't include isReceipt.\nUse subtotal in items (not price) - this is the field name Holded's API expects.\nTimestamps must be in seconds (Unix epoch) and in Europe/Madrid timezone.\n\nTimestamp calculation (Python):\n\nfrom datetime import datetime, timezone, timedelta\n# For 11/02/2026 00:00 in Madrid:\ndt = datetime(2026, 2, 11, 0, 0, 0, tzinfo=timezone(timedelta(hours=1)))\nprint(int(dt.timestamp()))  # 1770764400\n\nAccounting Rules for Spain\n\n⚠️ ALWAYS check these rules BEFORE creating any expense document:\n\nExpense Type\tIVA Deductible\tExpense Deductible\tAccount\nRestaurants/Meals\t❌ No\t✅ Yes (with justification)\t629\nDisplacement\t❌ No\t✅ Yes\t629\nFuel\t⚠️ Mixed\t✅ Yes\t625/622\nOffice supplies\t✅ Yes\t✅ Yes\t600/602\nInsurance\t⚠️ Mixed\t✅ Yes\t625\n\nBefore creating any document, ALWAYS verify:\n\nIs the expense tax deductible?\nIs the IVA deductible? (usually NO for restaurants, displacement)\nIf in doubt, ASK before creating the document.\n\nCommon mistake to avoid: Never set tax: 10 or tax: 21 for restaurant expenses - IVA is NOT deductible for meals unless it's a business event with proper justification.\n\nError Handling\nIf MISSING_API_KEY appears, configure API key through --api-key, HOLDED_API_KEY, or holded auth set.\nIf ACTION_NOT_FOUND appears, list the catalog and search with --filter.\nIf INVALID_BODY appears, validate JSON before execution.\nIf API_ERROR appears, report status_code and the API snippet.\nReferences\nRead {baseDir}/references/holdedcli-reference.md for quick commands and criteria.\nUse dynamic action discovery and parameter inspection via:\nholded actions list --json\nholded actions describe <action> --json"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/jaumecornado/holded-skill",
    "publisherUrl": "https://clawhub.ai/jaumecornado/holded-skill",
    "owner": "jaumecornado",
    "version": "0.2.3",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/holded-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/holded-skill",
    "agentUrl": "https://openagent3.xyz/skills/holded-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/holded-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/holded-skill/agent.md"
  }
}