{
  "schemaVersion": "1.0",
  "item": {
    "slug": "farmos-workforce",
    "name": "Farmos Workforce",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/brianppetty/farmos-workforce",
    "canonicalUrl": "https://clawhub.ai/brianppetty/farmos-workforce",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/farmos-workforce",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=farmos-workforce",
    "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",
      "slug": "farmos-workforce",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T01:57:28.726Z",
      "expiresAt": "2026-05-07T01:57:28.726Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=farmos-workforce",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=farmos-workforce",
        "contentDisposition": "attachment; filename=\"farmos-workforce-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "farmos-workforce"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/farmos-workforce"
    },
    "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-workforce",
    "agentPageUrl": "https://openagent3.xyz/skills/farmos-workforce/agent",
    "manifestUrl": "https://openagent3.xyz/skills/farmos-workforce/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/farmos-workforce/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 Workforce",
        "body": "Employee profiles, time clock, skills tracking, employee requests, and team calendar."
      },
      {
        "title": "When to Use This",
        "body": "What this skill handles: Time clock (clock in/out), schedules, availability, time-off requests, certifications, employee profiles, overtime tracking, and payroll exports.\n\nTrigger phrases: \"I need [day] off\", \"who's working\", \"schedule\", \"clock in/out\", \"who's clocked in?\", \"overtime this week?\", \"any pending time-off requests?\", \"employee list\", \"CDL certifications\"\n\nWhat this does NOT handle: Task assignments or work orders (use farmos-tasks), equipment scheduling or maintenance (use farmos-equipment), pay rates or financial compensation questions (restricted to admin only via farmos-finance).\n\nMinimum viable input: Any mention of schedule, availability, time off, or who is working. \"I need Friday off\" is enough."
      },
      {
        "title": "Data Completeness",
        "body": "Always state the count of employees, time entries, or requests returned: \"Found 8 active employees\" or \"12 time entries this pay period.\"\nTime entry queries are date-bounded — always include start_date and end_date parameters to get the full picture for the requested period.\nIf an endpoint fails, report it — don't silently present empty results as \"no employees\" or \"no time entries.\"\nFor payroll exports, verify the date range covers the full pay period before exporting."
      },
      {
        "title": "Authentication",
        "body": "This skill accesses protected FarmOS endpoints that require a JWT token.\n\nTo get a token:\n\nTOKEN=$(~/clawd/scripts/farmos-auth.sh manager)\n\nRole mapping: Check ~/.clawdbot/farmos-users.json for the sender's role.\n\nadmin/manager: Can see all employee data, hours, payroll info.\nemployee: Can only see own profile and time entries. Do NOT use a manager token for employee queries — use the employee token so the API scopes correctly."
      },
      {
        "title": "API Base",
        "body": "http://100.102.77.110:8006"
      },
      {
        "title": "Employee List (for assignments)",
        "body": "GET /api/integration/employees\n\nReturns: All employees with id, name, role. Use for task assignment dropdowns."
      },
      {
        "title": "Active Employees",
        "body": "GET /api/integration/employees/active\n\nReturns: Currently active employees only."
      },
      {
        "title": "Employee Profiles",
        "body": "GET /api/employees — List all employees (manager+)\nGET /api/employees/{id} — Employee detail (manager+ or own profile)\nGET /api/employees/me — Current user's profile"
      },
      {
        "title": "Time Clock",
        "body": "POST /api/time/clock-in — Clock in (with optional GPS)\nPOST /api/time/clock-out — Clock out\nGET /api/time/status — Current clock status for user\nGET /api/time/entries?start_date=2026-02-01&end_date=2026-02-13 — Time entries"
      },
      {
        "title": "Timesheet Approval (Manager)",
        "body": "POST /api/time/entries/{id}/approve — Approve timesheet entry\nGET /api/time/export?start_date=2026-02-01&end_date=2026-02-13&format=csv — Payroll export"
      },
      {
        "title": "Employee Requests",
        "body": "POST /api/requests — Submit time off/leave request\nGET /api/requests/my — My requests\nGET /api/requests/pending — Pending approvals (manager)\nPOST /api/requests/{id}/approve — Approve\nPOST /api/requests/{id}/reject — Reject with reason body: {\"reason\": \"...\"}"
      },
      {
        "title": "Calendar",
        "body": "GET /api/calendar/events?start=2026-02-01&end=2026-02-28 — Team calendar"
      },
      {
        "title": "Skills & Certifications",
        "body": "GET /api/skills — Skill definitions\nGET /api/employees/{id}/skills — Employee's skills and certifications"
      },
      {
        "title": "Usage Notes",
        "body": "Time entries include GPS coordinates if the employee clocked in from the field.\nOvertime calculation: hours over 40/week.\nPayroll export generates CSV compatible with common payroll systems.\nSkills have expiry dates — flag any certifications expiring within 30 days.\nNEVER share employee pay rates, hours, or personal info with other employees. Only managers and admins can see team-wide data."
      },
      {
        "title": "Conversational Schedule Capture",
        "body": "Crew members communicate schedule needs casually. Recognize these patterns and capture them without making it feel like paperwork."
      },
      {
        "title": "Capture Patterns",
        "body": "What They SayWhat It IsAction\"I need Thursday afternoon off\"Time-off requestLog time-off, notify manager\"I can come in early tomorrow\"Availability noteLog availability change\"I'll be late Monday, doctor appointment\"Schedule noteLog late arrival, note reason\"Can I swap shifts with Jake on Friday?\"Shift swap requestRoute to Brian/manager for approval\"I'm not going to be able to make it Saturday\"Absence notificationLog absence, notify manager\"I've got a thing next Wednesday\"Vague time-offLog it — don't ask what \"thing\" is"
      },
      {
        "title": "Bot Behavior",
        "body": "Extract from message:\n\nWho (from Slack user identity or name mention)\nWhen (day, date, time range)\nHow long (half day, full day, a few hours)\nReason (ONLY if volunteered — NEVER ask \"what kind of appointment?\")\n\nResponse pattern:\n\nConfirm what you understood: \"Got it — flagging Thursday afternoon off for you.\"\nTell them it's visible: \"Brian will see it in the schedule.\"\nIf unclear timing, ask ONE clarifying question: \"Need the whole afternoon or just leaving early?\"\nNEVER interrogate about reasons. \"Appointment\" is sufficient. Period.\n\nRouting:\n\nLog to workforce module API (POST /api/requests for time-off, use appropriate endpoint for availability)\nNotify in #farm-workforce channel for visibility\nFor swap requests: notify both parties and Brian"
      },
      {
        "title": "Availability Updates",
        "body": "When crew mentions availability changes mid-conversation (not a formal request), still capture it:\n\n\"I might be able to work this Saturday if you need me\" → log as tentative availability\n\"My kid has a game Friday evening so I need to leave by 3\" → log early departure\n\"I can stay late tonight if we need to finish\" → log extended availability"
      }
    ],
    "body": "FarmOS Workforce\n\nEmployee profiles, time clock, skills tracking, employee requests, and team calendar.\n\nWhen to Use This\n\nWhat this skill handles: Time clock (clock in/out), schedules, availability, time-off requests, certifications, employee profiles, overtime tracking, and payroll exports.\n\nTrigger phrases: \"I need [day] off\", \"who's working\", \"schedule\", \"clock in/out\", \"who's clocked in?\", \"overtime this week?\", \"any pending time-off requests?\", \"employee list\", \"CDL certifications\"\n\nWhat this does NOT handle: Task assignments or work orders (use farmos-tasks), equipment scheduling or maintenance (use farmos-equipment), pay rates or financial compensation questions (restricted to admin only via farmos-finance).\n\nMinimum viable input: Any mention of schedule, availability, time off, or who is working. \"I need Friday off\" is enough.\n\nData Completeness\nAlways state the count of employees, time entries, or requests returned: \"Found 8 active employees\" or \"12 time entries this pay period.\"\nTime entry queries are date-bounded — always include start_date and end_date parameters to get the full picture for the requested period.\nIf an endpoint fails, report it — don't silently present empty results as \"no employees\" or \"no time entries.\"\nFor payroll exports, verify the date range covers the full pay period before exporting.\nAuthentication\n\nThis skill accesses protected FarmOS endpoints that require a JWT token.\n\nTo get a token:\n\nTOKEN=$(~/clawd/scripts/farmos-auth.sh manager)\n\n\nRole mapping: Check ~/.clawdbot/farmos-users.json for the sender's role.\n\nadmin/manager: Can see all employee data, hours, payroll info.\nemployee: Can only see own profile and time entries. Do NOT use a manager token for employee queries — use the employee token so the API scopes correctly.\nAPI Base\n\nhttp://100.102.77.110:8006\n\nIntegration Endpoints (No Auth)\nEmployee List (for assignments)\n\nGET /api/integration/employees\n\nReturns: All employees with id, name, role. Use for task assignment dropdowns.\n\nActive Employees\n\nGET /api/integration/employees/active\n\nReturns: Currently active employees only.\n\nAuthenticated Endpoints (JWT Required)\nEmployee Profiles\n\nGET /api/employees — List all employees (manager+) GET /api/employees/{id} — Employee detail (manager+ or own profile) GET /api/employees/me — Current user's profile\n\nTime Clock\n\nPOST /api/time/clock-in — Clock in (with optional GPS) POST /api/time/clock-out — Clock out GET /api/time/status — Current clock status for user GET /api/time/entries?start_date=2026-02-01&end_date=2026-02-13 — Time entries\n\nTimesheet Approval (Manager)\n\nPOST /api/time/entries/{id}/approve — Approve timesheet entry GET /api/time/export?start_date=2026-02-01&end_date=2026-02-13&format=csv — Payroll export\n\nEmployee Requests\n\nPOST /api/requests — Submit time off/leave request GET /api/requests/my — My requests GET /api/requests/pending — Pending approvals (manager) POST /api/requests/{id}/approve — Approve POST /api/requests/{id}/reject — Reject with reason body: {\"reason\": \"...\"}\n\nCalendar\n\nGET /api/calendar/events?start=2026-02-01&end=2026-02-28 — Team calendar\n\nSkills & Certifications\n\nGET /api/skills — Skill definitions GET /api/employees/{id}/skills — Employee's skills and certifications\n\nUsage Notes\nTime entries include GPS coordinates if the employee clocked in from the field.\nOvertime calculation: hours over 40/week.\nPayroll export generates CSV compatible with common payroll systems.\nSkills have expiry dates — flag any certifications expiring within 30 days.\nNEVER share employee pay rates, hours, or personal info with other employees. Only managers and admins can see team-wide data.\nConversational Schedule Capture\n\nCrew members communicate schedule needs casually. Recognize these patterns and capture them without making it feel like paperwork.\n\nCapture Patterns\nWhat They Say\tWhat It Is\tAction\n\"I need Thursday afternoon off\"\tTime-off request\tLog time-off, notify manager\n\"I can come in early tomorrow\"\tAvailability note\tLog availability change\n\"I'll be late Monday, doctor appointment\"\tSchedule note\tLog late arrival, note reason\n\"Can I swap shifts with Jake on Friday?\"\tShift swap request\tRoute to Brian/manager for approval\n\"I'm not going to be able to make it Saturday\"\tAbsence notification\tLog absence, notify manager\n\"I've got a thing next Wednesday\"\tVague time-off\tLog it — don't ask what \"thing\" is\nBot Behavior\n\nExtract from message:\n\nWho (from Slack user identity or name mention)\nWhen (day, date, time range)\nHow long (half day, full day, a few hours)\nReason (ONLY if volunteered — NEVER ask \"what kind of appointment?\")\n\nResponse pattern:\n\nConfirm what you understood: \"Got it — flagging Thursday afternoon off for you.\"\nTell them it's visible: \"Brian will see it in the schedule.\"\nIf unclear timing, ask ONE clarifying question: \"Need the whole afternoon or just leaving early?\"\nNEVER interrogate about reasons. \"Appointment\" is sufficient. Period.\n\nRouting:\n\nLog to workforce module API (POST /api/requests for time-off, use appropriate endpoint for availability)\nNotify in #farm-workforce channel for visibility\nFor swap requests: notify both parties and Brian\nAvailability Updates\n\nWhen crew mentions availability changes mid-conversation (not a formal request), still capture it:\n\n\"I might be able to work this Saturday if you need me\" → log as tentative availability\n\"My kid has a game Friday evening so I need to leave by 3\" → log early departure\n\"I can stay late tonight if we need to finish\" → log extended availability"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/brianppetty/farmos-workforce",
    "publisherUrl": "https://clawhub.ai/brianppetty/farmos-workforce",
    "owner": "brianppetty",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/farmos-workforce",
    "downloadUrl": "https://openagent3.xyz/downloads/farmos-workforce",
    "agentUrl": "https://openagent3.xyz/skills/farmos-workforce/agent",
    "manifestUrl": "https://openagent3.xyz/skills/farmos-workforce/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/farmos-workforce/agent.md"
  }
}