CLI: Command Reference

The production CLI command groups are:

keito auth <command>
keito clients <command>
keito projects <command>
keito time <command>
keito skill <command>

Every command supports --help. Every command can output JSON with --json.

Global Flags

Flag Description
--json Force JSON output
--workspace <id> Override the Company ID for one invocation
--quiet Suppress non-essential output
--verbose Enable debug logging
--help Show help
--version Show version

When stdout is piped, JSON output is enabled automatically.

Auth Commands

Command Description
keito auth login Prompt for API key and Company ID, validate them, and save config
keito auth logout Remove saved config credentials
keito auth status Show whether credentials are configured and valid
keito auth whoami Show the current user and company from the API

keito auth login

keito auth login

Prompts for a kto_... API key and Company ID. The key is saved in the config file, not in a system keychain.

keito auth status

keito auth status --json

Configured credentials:

{
  "authenticated": true,
  "api_key_source": "config file",
  "account_id": "company_id_here",
  "workspace_id": "company_id_here",
  "api_key_valid": true
}

No credentials:

{"authenticated": false}

keito auth logout

keito auth logout --json
{
  "status": "logged_out",
  "config_credentials_removed": true
}

Projects and Tasks

Command Description
keito projects list List active projects
keito projects show <project> Show project details by name, code, or ID
keito projects tasks List workspace-global tasks

Clients

Command Description
keito clients list List active clients
keito clients create <name> Create a client if the authenticated user has permission

keito projects list

keito projects list
keito projects list --limit 20 --json
Flag Description
--limit <number> Max results to return

keito projects show <project>

keito projects show "Acme Website"
keito projects show ACME --json
keito projects show project_id_here --json

The <project> argument accepts a project ID, name, or code. Resolution is case-insensitive.

keito projects tasks

keito projects tasks
keito projects tasks --limit 20 --json

Tasks are workspace-global, not project-specific.

Time Commands

Command Description
keito time start Start a running timer
keito time stop Stop or discard the running timer
keito time log Log a completed time entry
keito time list List time entries
keito time running Show the currently running timer
keito time session-record Create or update a completed agent session entry

keito time start

keito time start --project "Acme Website" --task "Development" \
  --notes "Working on auth" \
  --json
Flag Description Required
--project <value> Project name, code, or ID Yes
--task <value> Task name or ID Yes
--notes <text> Initial notes No
`–billable <true false>` Override billable status

Only one timer may be active. If a timer is already running, the command exits with code 3.

keito time session-record

keito time session-record \
  --project "Acme Website" \
  --task "Development" \
  --session-id "codex-123" \
  --duration-seconds 5400 \
  --source agent \
  --metadata '{"integration":"keito_skill","agent_type":"codex"}' \
  --json
Flag Description Required
--project <value> Project name, code, or ID Yes
--task <value> Task name or ID Yes
--session-id <value> Stable session ID for idempotent updates Yes
--duration-seconds <number> Duration in whole seconds Yes
--started-at <RFC3339> Session start timestamp No
--ended-at <RFC3339> Session end timestamp No
`–source <web cli api
--metadata <json> Metadata object stored on the time entry No
--agent-id <value> Stores metadata.agent_id No
--agent-type <value> Stores metadata.agent_type No
--skill <value> Stores metadata.skill No

If a matching session entry already exists for the same date and source, the CLI updates it instead of creating a duplicate.

keito time running

keito time running
keito time running --json

Returns {"running": false} when no timer is active, or an array of running timer objects when a timer exists.

keito time stop

keito time stop --notes "Finished auth work" --json
keito time stop --discard --json
Flag Description
--notes <text> Replace notes on the entry
--discard Delete the running timer instead of saving it

keito time log

keito time log --project "Acme Website" --task "Development" \
  --duration 1:30 \
  --date 2026-05-06 \
  --notes "Implemented OAuth flow" \
  --json
Flag Description Required
--project <value> Project name, code, or ID Yes
--task <value> Task name or ID Yes
--duration <value> Decimal hours or HH:MM Yes
--date <YYYY-MM-DD> Work date; defaults to today No
--notes <text> Description of work No
`–billable <true false>` Override billable status

keito time list

keito time list --from 2026-05-01 --to 2026-05-31 --json
keito time list --project "Acme Website" --limit 10 --page 2 --json
Flag Description
--from <YYYY-MM-DD> Start date
--to <YYYY-MM-DD> End date
--project <value> Filter by project name, code, or ID
--task <value> Filter by task name or ID
--limit <number> Entries per page; default 50
--page <number> Page number; default 1

Skill Commands

Command Description
keito skill install Install the Keito Agent Skill and configure Codex and Claude Code hooks
keito skill status Show CLI, auth, skill, and hook status
keito skill doctor Show readiness checks and next actions
keito skill install
keito skill install --agent codex
keito --json skill status
keito skill doctor

Environment Variables

Variable Description
KEITO_API_KEY API key; highest-priority credential source
KEITO_ACCOUNT_ID Company ID sent as Keito-Account-Id
KEITO_WORKSPACE_ID Legacy alias for KEITO_ACCOUNT_ID

Config File

OS Path
macOS ~/Library/Application Support/keito/config.toml
Linux ~/.config/keito/config.toml
Windows %APPDATA%\keito\config.toml
api_key = "kto_xxxxx"
account_id = "company_id_here"
workspace_id = "company_id_here" # legacy alias
api_url = "https://app.keito.ai"

Exit Codes

Code Meaning
0 Success
1 Authentication error
2 Invalid input
3 Conflict, such as a timer already running
4 Not found
5 Rate limited
6 Server error
7 Network error
8 Configuration error

keito auth status is a health-check command. When credentials are missing, JSON output is {"authenticated": false}.

JSON Error Shape

In JSON mode, errors are written to stderr:

{
  "error": true,
  "code": 4,
  "message": "Not found: Project 'demo' not found.",
  "suggestion": "keito projects list --json"
}

Agents should branch on the exit code and use suggestion as the recovery hint.