skills/freshbooks/SKILL.md
Log time, check entries, edit/delete entries, and troubleshoot FreshBooks auth using the fb CLI. Use this skill whenever the request is about FreshBooks time tracking workflows: timesheets, billable hours, work logs, correcting logged time, reconciling daily/weekly totals, or auth/business selection needed to perform those tasks, even if the user does not explicitly ask for "FreshBooks CLI". Do not use this skill for unrelated FreshBooks tasks such as invoice design, accounting reports, or general bookkeeping that does not involve time entries.
npx skillsauth add parasquid/freshbooks-cli freshbooksInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Manage FreshBooks time entries using the fb CLI tool.
To install this repo's skill bundle into Codex:
npx skills add https://skills.sh/parasquid/freshbooks-cli/freshbooks
Always run this preflight before any time logging or entry mutation:
command -v fb >/dev/null 2>&1
fb auth status --format json
fb cache status --format json
If fb is missing:
fb is available.If both fb and ./fb are available:
./fb when working inside this repository to preserve project-local behavior.fb.Use fb auth status --format json and branch exactly once per blocker:
If config_exists is false:
client_id and client_secret~/.fb/.env, then run fb auth setup --format json:
FRESHBOOKS_CLIENT_ID=ID FRESHBOOKS_CLIENT_SECRET=SECRET fb auth setup --format json~/.fb/.env, then fb auth setup --format jsonfb auth url --format jsonhttps://localhost/?code=...)If config_exists is true and tokens_exist is false:
fb auth url --format jsonAfter redirect URL is provided:
fb auth callback "REDIRECT_URL" --format json"business_selected": false:
fb business --select ID --format jsonIf requires_reauth is true:
fb auth url --format jsonfb auth status silently refreshes stale access tokens when the refresh token is still usable. Do not ask for browser OAuth because tokens_expired was true in older output; branch on requires_reauth from current JSON output.
If tokens_exist is true but business_id is null:
fb business --format jsonfb business --select ID --format jsonAfter auth completion:
fb auth status --format jsonconfig_exists=true, tokens_exist=true, and business_id is set.client_id + client_secret); instruct the user to set FRESHBOOKS_CLIENT_ID/FRESHBOOKS_CLIENT_SECRET env vars or save to ~/.fb/.env.fb clients --format jsonfb projects --client "Name" --format json for client-backed work, or fb projects --format json when the target may be internalservices array.fb services alone for logging decisions.--client. If project.internal is true or project.client_id is null, treat the entry as clientless.Current auth and cache state:
!fb auth status 2>&1
!fb cache status --format json 2>&1
When executing fb commands:
--format json for parseable output--yes to skip confirmation prompts on mutations--client, --duration, --note, --id) — never rely on interactive prompts--id for edit and delete commandslog, edit, delete), run one verification read (fb entries ... --format json or fb status --format json) and report the result.fb log and fb edit, prefer canonical --duration and --note. The CLI also accepts --hours and --notes aliases. If command shape is unclear, run fb log --help before retrying.Important: Services are project-scoped and MUST always be specified when logging time. fb services may return empty — services are embedded in project data. Use --service "Name" with the service name from the project (visible in fb projects --format json under the services array). Common service names: Development, Research, General, Meetings. Infer the service from context clues in the user's request (e.g. "development work" → "Development", "a meeting" → "Meetings"). If the service cannot be inferred, ask the user before logging.
fb status --format json # Hours summary (today/week/month)
fb entries --format json # Current month entries
fb entries --from YYYY-MM-DD --to YYYY-MM-DD --format json # Date range
fb log --client "Client Name" --project "Project" --service "Service" --duration HOURS --note "Description" --yes --format json
fb log --project "AI Service Design" --service "Meetings" --duration 0.5 --note "Calum 1:1" --yes --format json
fb log --internal --project "AI Service Design" --service "Meetings" --duration 0.5 --note "Calum 1:1" --yes --format json
# --project is required when multiple projects are possible and should be supplied for deterministic automation.
# --date is optional; --duration, --note, and --service are required.
# --hours is accepted as an alias for --duration; --notes is accepted as an alias for --note.
# --client is required only for client-backed project resolution when the project does not determine the client.
# --internal requires --project and conflicts with --client.
# IMPORTANT: Always include --service. Infer the service from context (e.g. "development work" → "Development",
# "meeting" → "Meetings", "research" → "Research"). If unsure, ask the user. Never omit --service.
fb edit --id ENTRY_ID --duration HOURS --yes --format json
fb edit --id ENTRY_ID --note "New note" --yes --format json
fb edit --id ENTRY_ID --service "Meetings" --yes --format json
fb edit --id ENTRY_ID --project "AI Service Design" --service "Meetings" --yes --format json
fb edit --id ENTRY_ID --internal --project "AI Service Design" --service "Meetings" --yes --format json
# Edit preserves all existing fields — only specified flags are changed
# --hours is accepted as an alias for --duration; --notes is accepted as an alias for --note.
fb delete --id ENTRY_ID --yes --format json
fb clients --format json
fb projects --format json # Includes project-scoped services in response; internal projects show "internal": true
fb projects --client "Name" --format json # Filter by client; services array shows available services
fb business --format json
fb cache status --format json # Check cache freshness
fb cache refresh # Force refresh
fb clients --format jsonfb projects --client "Name" --format jsonfb log commands in sequence (same date) with explicit flags:
--client, --project, --service, --date, --duration, --note, --yes, --format jsonfb entries --from YYYY-MM-DD --to YYYY-MM-DD --format jsonNo config found:
Could not find 'code' parameter:
Multiple clients found. Use --client:
Multiple projects found. Use --project:
Project <name> is not internal:
--internal or choose an actual internal project.Service not found:
When reporting results to the user:
fb clients --format json — get available clientsfb projects --client "Name" --format json — get projects and their servicesfb log --client "Name" --project "Project" --service "Service" --duration 2.5 --note "Work description" --yes --format jsonfb status --format json
Parse today.total_hours from the response.
fb entries --from TODAY --to TODAY --format json — get today's entriesidfb edit --id ID --duration 3 --yes --format jsonclient_id and client_secret, then: FRESHBOOKS_CLIENT_ID=ID FRESHBOOKS_CLIENT_SECRET=SECRET fb auth setup --format jsonfb auth url --format json — show URL to userhttps://localhost/?code=...)fb auth callback "REDIRECT_URL" --format jsonbusiness_selected: false: fb business --format json then fb business --select ID --format jsontools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.