{
  "schemaVersion": "1.0",
  "item": {
    "slug": "farmos-land-portfolio",
    "name": "Farmos Land Portfolio",
    "source": "tencent",
    "type": "skill",
    "category": "数据分析",
    "sourceUrl": "https://clawhub.ai/brianppetty/farmos-land-portfolio",
    "canonicalUrl": "https://clawhub.ai/brianppetty/farmos-land-portfolio",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/farmos-land-portfolio",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=farmos-land-portfolio",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "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-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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/farmos-land-portfolio"
    },
    "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/farmos-land-portfolio",
    "agentPageUrl": "https://openagent3.xyz/skills/farmos-land-portfolio/agent",
    "manifestUrl": "https://openagent3.xyz/skills/farmos-land-portfolio/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/farmos-land-portfolio/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": "FarmOS Land Portfolio",
        "body": "Track owned and leased land, lease terms, landlord relationships, payments, and annual land costs."
      },
      {
        "title": "CRITICAL: Data Completeness Rules",
        "body": "NEVER use partial or truncated data. These rules are non-negotiable:\n\nNEVER use /api/integration/dashboard — it truncates results to 5 items. Partial payment data is worse than no data because it creates a false sense of completeness.\nALWAYS use the /all endpoints listed below for complete data.\nIf an endpoint returns an error or empty results, REPORT THE FAILURE to the user. Do not silently fall back to a different endpoint or present partial data.\nALWAYS state the total count of records returned so the user knows the data is complete. Example: \"Found 11 payments due in March totaling $175,058.\"\nIf you cannot get complete data, say so explicitly. \"I was unable to retrieve complete payment data\" is infinitely better than showing 5 of 11 payments."
      },
      {
        "title": "When This Skill Triggers",
        "body": "\"When do our leases expire?\"\n\"What's the rent on the Smith ground?\"\n\"Total land costs this year?\"\n\"Show overdue payments\"\n\"Landlord contact info\"\n\"Cost per acre by parcel\"\n\"List all leased parcels\"\n\"What payments are due in March?\"\n\"Cash requirements for next month\"\n\"Mark payment [X] as paid\"\n\"Mark all March payments paid\"\n\"Renew the Smith lease\"\n\"Preview lease renewals\""
      },
      {
        "title": "Access Control",
        "body": "Lease terms, rent amounts, and landlord info are sensitive business data. Restrict to admin or manager roles only.\n\nRole mapping: Check the sender's role in ~/.openclaw/farmos-users.json. If the user is not admin or manager, tell them they don't have access to land portfolio data."
      },
      {
        "title": "API Base",
        "body": "http://100.102.77.110:8009"
      },
      {
        "title": "Integration Endpoints (No Auth Required) — READ OPERATIONS ONLY",
        "body": "IMPORTANT: Use auth endpoints for WRITE operations (mark-paid, renewals). Use integration /all endpoints for READ operations (listing payments, leases, landlords)."
      },
      {
        "title": "Payments (FULL — use this, not dashboard)",
        "body": "GET /api/integration/payments/all\n\nReturns ALL payments with full details — parcel names, landlord names, overdue status\nQuery parameters:\n\nstatus — pending, paid, overdue, scheduled\npayment_type — rent, mortgage, property_tax, insurance, improvement, other\nparcel_id — filter by specific parcel\ndue_date_from — YYYY-MM-DD range start\ndue_date_to — YYYY-MM-DD range end\ncrop_year — filter by crop year\n\n\nExamples:\n\nAll overdue: /api/integration/payments/all?status=overdue\nMarch 2026 payments: /api/integration/payments/all?due_date_from=2026-03-01&due_date_to=2026-03-31\nAll rent payments: /api/integration/payments/all?payment_type=rent"
      },
      {
        "title": "Upcoming Payments (next N days)",
        "body": "GET /api/integration/payments/upcoming?days=30\n\nReturns ALL upcoming payments within N days (no truncation)\nUse days=60 or days=90 for longer lookahead"
      },
      {
        "title": "Leases (FULL)",
        "body": "GET /api/integration/leases/all\n\nReturns ALL leases with landlord contact info, rent terms, expiration status\nQuery parameters:\n\nstatus — active, expired\nlandlord_id — filter by landlord"
      },
      {
        "title": "Expiring Leases",
        "body": "GET /api/integration/leases/expiring?days=90\n\nReturns ALL leases expiring within N days"
      },
      {
        "title": "Landlords (FULL)",
        "body": "GET /api/integration/landlords/all\n\nReturns ALL landlords with contact info, active lease count, total acres, total rent"
      },
      {
        "title": "Parcels",
        "body": "GET /api/integration/parcels\n\nReturns ALL parcels with ownership type, acres, county\nQuery parameter: ownership_type — owned, leased"
      },
      {
        "title": "Summary Stats",
        "body": "GET /api/integration/summary\n\nTotal acres, owned/leased breakdown, parcel/lease/landlord counts, annual cost"
      },
      {
        "title": "Annual Land Costs (by month and entity)",
        "body": "GET /api/integration/finance/costs?year=2026\n\nMonthly cost breakdown by category (rent, mortgage, tax, insurance)\nEntity breakdown\nQuery parameters: year, entity_id"
      },
      {
        "title": "Cost Per Field (for P&L)",
        "body": "GET /api/integration/finance/cost-per-field?year=2026\n\nLand costs allocated to production fields\nQuery parameters: year, entity_id"
      },
      {
        "title": "Overdue Items",
        "body": "GET /api/integration/tasks/overdue\n\nAll overdue payments and reminders — high priority items"
      },
      {
        "title": "Actionable Items",
        "body": "GET /api/integration/tasks/actionable?days_ahead=30\n\nUpcoming payments, expiring leases, pending reminders"
      },
      {
        "title": "Authenticated Endpoints — WRITE OPERATIONS",
        "body": "These require JWT auth. See Authentication section below."
      },
      {
        "title": "Authentication",
        "body": "This skill accesses protected FarmOS endpoints that require a JWT token.\n\nTo get a token: Run the auth helper with the appropriate role:\n\nTOKEN=$(~/clawd/scripts/farmos-auth.sh admin)\n\nTo use the token: Include it as a Bearer token:\n\ncurl -H \"Authorization: Bearer $TOKEN\" http://100.102.77.110:8009/api/endpoint\n\nToken expiry: Tokens last 15 minutes. If you get a 401 response, request a new token."
      },
      {
        "title": "Mark Single Payment Paid",
        "body": "POST /api/payments/{id}/mark-paid\nAuthorization: Bearer {token}\nContent-Type: application/json\n\nBody:\n\n{\n  \"paid_date\": \"2026-02-15\",\n  \"notes\": \"Check #1234\"\n}"
      },
      {
        "title": "Mark Multiple Payments Paid (Bulk)",
        "body": "POST /api/payments/bulk/mark-paid\nAuthorization: Bearer {token}\nContent-Type: application/json\n\nBody:\n\n{\n  \"payment_ids\": [12, 34, 56],\n  \"paid_date\": \"2026-02-15\",\n  \"notes\": \"Batch check run\"\n}"
      },
      {
        "title": "Mark Payments Paid by Date Range",
        "body": "POST /api/payments/bulk/mark-paid-by-date\nAuthorization: Bearer {token}\nContent-Type: application/json\n\nBody:\n\n{\n  \"due_date_from\": \"2026-03-01\",\n  \"due_date_to\": \"2026-03-31\",\n  \"paid_date\": \"2026-02-15\",\n  \"payment_type\": \"rent\",\n  \"notes\": \"March rent payments\"\n}\n\nUse this when the user says \"mark all March payments as paid\" or similar bulk date-based operations."
      },
      {
        "title": "Preview Lease Renewal",
        "body": "POST /api/leases/renewal-preview\nAuthorization: Bearer {token}\nContent-Type: application/json\n\nBody:\n\n{\n  \"lease_ids\": [5, 12],\n  \"new_start_date\": \"2027-03-01\",\n  \"rent_increase_percent\": 3.0\n}\n\nReturns: Preview of what the renewed leases would look like, including new payment schedules. Use this BEFORE executing bulk renewals so the user can confirm."
      },
      {
        "title": "Execute Bulk Lease Renewal",
        "body": "POST /api/leases/bulk-renew\nAuthorization: Bearer {token}\nContent-Type: application/json\n\nBody:\n\n{\n  \"lease_ids\": [5, 12],\n  \"new_start_date\": \"2027-03-01\",\n  \"new_end_date\": \"2028-02-28\",\n  \"new_rent_amount\": 52000.00,\n  \"rent_increase_percent\": 3.0,\n  \"notes\": \"Annual renewal with 3% increase\"\n}\n\nIMPORTANT: Always preview first, confirm with user, then execute."
      },
      {
        "title": "Year-End Rollover Preview",
        "body": "POST /api/payments/year-end-rollover/preview\nAuthorization: Bearer {token}\nContent-Type: application/json\n\nBody:\n\n{\n  \"from_year\": 2026,\n  \"to_year\": 2027\n}\n\nReturns: Preview of payment schedules that would be created for the new crop year."
      },
      {
        "title": "Year-End Rollover Execute",
        "body": "POST /api/payments/year-end-rollover/execute\nAuthorization: Bearer {token}\nContent-Type: application/json\n\nBody:\n\n{\n  \"from_year\": 2026,\n  \"to_year\": 2027,\n  \"apply_rent_increase\": true,\n  \"rent_increase_percent\": 2.5\n}\n\nIMPORTANT: This creates next year's payment schedules based on current year leases. Always preview first."
      },
      {
        "title": "FORBIDDEN Endpoints — Do NOT Use",
        "body": "EndpointWhyGET /api/integration/dashboardTruncates to 5 items. NEVER use this."
      },
      {
        "title": "Key Concepts",
        "body": "Parcel: A land unit — either owned or leased.\nLease types: Cash rent, crop share, flex rent.\nLease expiration: Critical to track — approaching expirations need proactive attention.\nLand payments: Rent, mortgage, property tax, insurance — each with due dates."
      },
      {
        "title": "Usage Notes",
        "body": "Lease expiration tracking is the highest-value query — always flag leases expiring within 6 months.\nPayment status (due/overdue) is critical — flag overdue payments immediately.\nCost per acre analysis helps compare owned vs leased economics.\nLandlord contact info is private — never share outside admin/manager channels.\nWhen asked about \"cash requirements\" or \"what do we owe\", always use /api/integration/payments/all with date filtering to get the COMPLETE picture.\nFor financial planning questions, combine /api/integration/payments/all with /api/integration/finance/costs for the full view.\nWrite operations: Always use authenticated endpoints for marking payments paid or renewing leases. Preview first when doing bulk operations.\nBulk payment marking: When user says \"mark all March payments paid\", use the bulk-by-date endpoint rather than individual calls."
      }
    ],
    "body": "FarmOS Land Portfolio\n\nTrack owned and leased land, lease terms, landlord relationships, payments, and annual land costs.\n\nCRITICAL: Data Completeness Rules\n\nNEVER use partial or truncated data. These rules are non-negotiable:\n\nNEVER use /api/integration/dashboard — it truncates results to 5 items. Partial payment data is worse than no data because it creates a false sense of completeness.\nALWAYS use the /all endpoints listed below for complete data.\nIf an endpoint returns an error or empty results, REPORT THE FAILURE to the user. Do not silently fall back to a different endpoint or present partial data.\nALWAYS state the total count of records returned so the user knows the data is complete. Example: \"Found 11 payments due in March totaling $175,058.\"\nIf you cannot get complete data, say so explicitly. \"I was unable to retrieve complete payment data\" is infinitely better than showing 5 of 11 payments.\nWhen This Skill Triggers\n\"When do our leases expire?\"\n\"What's the rent on the Smith ground?\"\n\"Total land costs this year?\"\n\"Show overdue payments\"\n\"Landlord contact info\"\n\"Cost per acre by parcel\"\n\"List all leased parcels\"\n\"What payments are due in March?\"\n\"Cash requirements for next month\"\n\"Mark payment [X] as paid\"\n\"Mark all March payments paid\"\n\"Renew the Smith lease\"\n\"Preview lease renewals\"\nAccess Control\n\nLease terms, rent amounts, and landlord info are sensitive business data. Restrict to admin or manager roles only.\n\nRole mapping: Check the sender's role in ~/.openclaw/farmos-users.json. If the user is not admin or manager, tell them they don't have access to land portfolio data.\n\nAPI Base\n\nhttp://100.102.77.110:8009\n\nIntegration Endpoints (No Auth Required) — READ OPERATIONS ONLY\n\nIMPORTANT: Use auth endpoints for WRITE operations (mark-paid, renewals). Use integration /all endpoints for READ operations (listing payments, leases, landlords).\n\nPayments (FULL — use this, not dashboard)\n\nGET /api/integration/payments/all\n\nReturns ALL payments with full details — parcel names, landlord names, overdue status\nQuery parameters:\nstatus — pending, paid, overdue, scheduled\npayment_type — rent, mortgage, property_tax, insurance, improvement, other\nparcel_id — filter by specific parcel\ndue_date_from — YYYY-MM-DD range start\ndue_date_to — YYYY-MM-DD range end\ncrop_year — filter by crop year\nExamples:\nAll overdue: /api/integration/payments/all?status=overdue\nMarch 2026 payments: /api/integration/payments/all?due_date_from=2026-03-01&due_date_to=2026-03-31\nAll rent payments: /api/integration/payments/all?payment_type=rent\nUpcoming Payments (next N days)\n\nGET /api/integration/payments/upcoming?days=30\n\nReturns ALL upcoming payments within N days (no truncation)\nUse days=60 or days=90 for longer lookahead\nLeases (FULL)\n\nGET /api/integration/leases/all\n\nReturns ALL leases with landlord contact info, rent terms, expiration status\nQuery parameters:\nstatus — active, expired\nlandlord_id — filter by landlord\nExpiring Leases\n\nGET /api/integration/leases/expiring?days=90\n\nReturns ALL leases expiring within N days\nLandlords (FULL)\n\nGET /api/integration/landlords/all\n\nReturns ALL landlords with contact info, active lease count, total acres, total rent\nParcels\n\nGET /api/integration/parcels\n\nReturns ALL parcels with ownership type, acres, county\nQuery parameter: ownership_type — owned, leased\nSummary Stats\n\nGET /api/integration/summary\n\nTotal acres, owned/leased breakdown, parcel/lease/landlord counts, annual cost\nAnnual Land Costs (by month and entity)\n\nGET /api/integration/finance/costs?year=2026\n\nMonthly cost breakdown by category (rent, mortgage, tax, insurance)\nEntity breakdown\nQuery parameters: year, entity_id\nCost Per Field (for P&L)\n\nGET /api/integration/finance/cost-per-field?year=2026\n\nLand costs allocated to production fields\nQuery parameters: year, entity_id\nOverdue Items\n\nGET /api/integration/tasks/overdue\n\nAll overdue payments and reminders — high priority items\nActionable Items\n\nGET /api/integration/tasks/actionable?days_ahead=30\n\nUpcoming payments, expiring leases, pending reminders\nAuthenticated Endpoints — WRITE OPERATIONS\n\nThese require JWT auth. See Authentication section below.\n\nAuthentication\n\nThis skill accesses protected FarmOS endpoints that require a JWT token.\n\nTo get a token: Run the auth helper with the appropriate role:\n\nTOKEN=$(~/clawd/scripts/farmos-auth.sh admin)\n\n\nTo use the token: Include it as a Bearer token:\n\ncurl -H \"Authorization: Bearer $TOKEN\" http://100.102.77.110:8009/api/endpoint\n\n\nToken expiry: Tokens last 15 minutes. If you get a 401 response, request a new token.\n\nMark Single Payment Paid\n\nPOST /api/payments/{id}/mark-paid Authorization: Bearer {token} Content-Type: application/json\n\nBody:\n\n{\n  \"paid_date\": \"2026-02-15\",\n  \"notes\": \"Check #1234\"\n}\n\nMark Multiple Payments Paid (Bulk)\n\nPOST /api/payments/bulk/mark-paid Authorization: Bearer {token} Content-Type: application/json\n\nBody:\n\n{\n  \"payment_ids\": [12, 34, 56],\n  \"paid_date\": \"2026-02-15\",\n  \"notes\": \"Batch check run\"\n}\n\nMark Payments Paid by Date Range\n\nPOST /api/payments/bulk/mark-paid-by-date Authorization: Bearer {token} Content-Type: application/json\n\nBody:\n\n{\n  \"due_date_from\": \"2026-03-01\",\n  \"due_date_to\": \"2026-03-31\",\n  \"paid_date\": \"2026-02-15\",\n  \"payment_type\": \"rent\",\n  \"notes\": \"March rent payments\"\n}\n\n\nUse this when the user says \"mark all March payments as paid\" or similar bulk date-based operations.\n\nPreview Lease Renewal\n\nPOST /api/leases/renewal-preview Authorization: Bearer {token} Content-Type: application/json\n\nBody:\n\n{\n  \"lease_ids\": [5, 12],\n  \"new_start_date\": \"2027-03-01\",\n  \"rent_increase_percent\": 3.0\n}\n\n\nReturns: Preview of what the renewed leases would look like, including new payment schedules. Use this BEFORE executing bulk renewals so the user can confirm.\n\nExecute Bulk Lease Renewal\n\nPOST /api/leases/bulk-renew Authorization: Bearer {token} Content-Type: application/json\n\nBody:\n\n{\n  \"lease_ids\": [5, 12],\n  \"new_start_date\": \"2027-03-01\",\n  \"new_end_date\": \"2028-02-28\",\n  \"new_rent_amount\": 52000.00,\n  \"rent_increase_percent\": 3.0,\n  \"notes\": \"Annual renewal with 3% increase\"\n}\n\n\nIMPORTANT: Always preview first, confirm with user, then execute.\n\nYear-End Rollover Preview\n\nPOST /api/payments/year-end-rollover/preview Authorization: Bearer {token} Content-Type: application/json\n\nBody:\n\n{\n  \"from_year\": 2026,\n  \"to_year\": 2027\n}\n\n\nReturns: Preview of payment schedules that would be created for the new crop year.\n\nYear-End Rollover Execute\n\nPOST /api/payments/year-end-rollover/execute Authorization: Bearer {token} Content-Type: application/json\n\nBody:\n\n{\n  \"from_year\": 2026,\n  \"to_year\": 2027,\n  \"apply_rent_increase\": true,\n  \"rent_increase_percent\": 2.5\n}\n\n\nIMPORTANT: This creates next year's payment schedules based on current year leases. Always preview first.\n\nFORBIDDEN Endpoints — Do NOT Use\nEndpoint\tWhy\nGET /api/integration/dashboard\tTruncates to 5 items. NEVER use this.\nKey Concepts\nParcel: A land unit — either owned or leased.\nLease types: Cash rent, crop share, flex rent.\nLease expiration: Critical to track — approaching expirations need proactive attention.\nLand payments: Rent, mortgage, property tax, insurance — each with due dates.\nUsage Notes\nLease expiration tracking is the highest-value query — always flag leases expiring within 6 months.\nPayment status (due/overdue) is critical — flag overdue payments immediately.\nCost per acre analysis helps compare owned vs leased economics.\nLandlord contact info is private — never share outside admin/manager channels.\nWhen asked about \"cash requirements\" or \"what do we owe\", always use /api/integration/payments/all with date filtering to get the COMPLETE picture.\nFor financial planning questions, combine /api/integration/payments/all with /api/integration/finance/costs for the full view.\nWrite operations: Always use authenticated endpoints for marking payments paid or renewing leases. Preview first when doing bulk operations.\nBulk payment marking: When user says \"mark all March payments paid\", use the bulk-by-date endpoint rather than individual calls."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/brianppetty/farmos-land-portfolio",
    "publisherUrl": "https://clawhub.ai/brianppetty/farmos-land-portfolio",
    "owner": "brianppetty",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/farmos-land-portfolio",
    "downloadUrl": "https://openagent3.xyz/downloads/farmos-land-portfolio",
    "agentUrl": "https://openagent3.xyz/skills/farmos-land-portfolio/agent",
    "manifestUrl": "https://openagent3.xyz/skills/farmos-land-portfolio/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/farmos-land-portfolio/agent.md"
  }
}