← TimeTackleCONTENT HISTORY

Update to TimeTackle

Snapshot Oct 24, 2026 · 13:50 UTC · version 1.0.1

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save TimeTackle and check future changes in Following.

Up to 10 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Build a client hours report from TimeTackle - total hours per client, and per person for each client, for a billing period, as a ready-to-share table. Use when the user asks for client hours, a billing summary, or hours spent per client or account.",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 408
    }
  ],
  "name": "client-hours-report",
  "skill_md_contents": "---\nname: client-hours-report\ndescription: Build a client hours report from TimeTackle - total hours per client, and per person for each client, for a billing period, as a ready-to-share table. Use when the user asks for client hours, a billing summary, or hours spent per client or account.\n---\n\n# Client hours report\n\nProduce a clean, shareable table of hours per client for a period. Explicit instructions from the user (period,\nclients, people, rounding, format) take priority over these steps.\n\n## Input\n\n- The billing period. If none is given, ask for it, offering last month as the default. Use exact `YYYY-MM-DD` dates.\n- Optionally specific clients, specific people, or a per-person breakdown.\n\n## Steps\n\n1. Call `get_account` and read `syncRange`. If the period reaches outside it, say that data only exists from\n   `syncRange.start` to `syncRange.end`.\n2. Find the client property: call `get_properties` with `search: \"Client\"`.\n   - If there is no match, try \"Account\" and \"Customer\", then ask the user which property holds clients; do not guess.\n   - Note its `key` and `state`. If the user asked about specific clients, check that those names appear among the\n     property's options (`children`); if a property has more options than returned, page with `parentId` and\n     `optionsOffset`.\n3. Call `get_meeting_analytics` with:\n   - `measures: [\"hours\"]`\n   - `groupBy: \"primary_tag\"` or `\"secondary_tag\"` (from the property's `state`), and `tagKey` set to its key\n   - `splitBy: \"user\"` when the user wants hours per person per client\n   - `dateFrom`, `dateTo`, and `timezone` (the user's, otherwise the `timezone` of their own calendar from\n     `get_imported_calendars`; say which one you used)\n4. Page with `offset` while `summary.nextOffset` is not null, and combine the rows.\n5. Keep only the clients (and people) the user asked for, if they named any.\n\n## Output\n\n- A table with one row per client, sorted by hours: client, hours (one decimal unless the user asks for another\n  rounding), share of the total. With a per-person breakdown, list each client's people under it with their hours,\n  or use a client × person table if it stays readable.\n- A total row, the exact period, and the timezone.\n- A note that time not tagged with a client is not included.\n- If the result has a `syncRangeWarning`, include it.\n\n## Do not\n\n- Do not calculate amounts, rates or invoices unless the user gives the rates; then show the calculation.\n- Do not invent clients or hours. If a requested client has no hours, show it with 0 and say so.\n- People are limited to those the user can access in TimeTackle.\n"
}

SHA-256 of public snapshot: 41b07667757fab6205a19117c41beb06885e9db0f9c7297ca9e05e47255d7fde