Automatic time tracking plugin for OpenCode. Tracks session duration and tool usage, writing entries to a CSV file compatible with Jira worklog sync.
Add to your opencode.json:
{
"plugin": ["@techdivision/opencode-time-tracking"]
}Add the time_tracking section to your .opencode/opencode-project.json:
{
"$schema": "https://raw.githubusercontent.com/techdivision/opencode-plugins/main/schemas/opencode-project.json",
"time_tracking": {
"csv_file": "~/time_tracking/time-tracking.csv",
"global_default": {
"issue_key": "PROJ-MISC",
"account_key": "YOUR_ACCOUNT_KEY"
}
}
}Set your user email via the OPENCODE_USER_EMAIL environment variable.
Add to your .env file (recommended):
OPENCODE_USER_EMAIL=[email protected]Or export in your shell:
export [email protected]If not set, the system username is used as fallback.
| Field | Description |
|---|---|
csv_file |
Path to the CSV output file (supports ~/, absolute, or relative paths) |
global_default.issue_key |
Default JIRA issue key when no ticket found in context |
global_default.account_key |
Default Tempo account key for time entries |
Override default ticket/account for specific agents:
{
"time_tracking": {
"csv_file": "...",
"global_default": {
"issue_key": "PROJ-MISC",
"account_key": "TD_GENERAL"
},
"agent_defaults": {
"@developer": {
"issue_key": "PROJ-DEV",
"account_key": "TD_DEVELOPMENT"
},
"@reviewer": {
"issue_key": "PROJ-REVIEW"
}
}
}
}Skip time tracking for specific agents:
{
"time_tracking": {
"csv_file": "...",
"global_default": { ... },
"ignored_agents": ["@internal", "@notrack"]
}
}Restrict ticket detection to specific JIRA projects:
{
"time_tracking": {
"csv_file": "...",
"global_default": { ... },
"valid_projects": ["PROJ", "SOSO", "FEAT"]
}
}{
"$schema": "https://raw.githubusercontent.com/techdivision/opencode-plugins/main/schemas/opencode-project.json",
"time_tracking": {
"csv_file": "~/time_tracking/time-tracking.csv",
"global_default": {
"issue_key": "PROJ-MISC",
"account_key": "TD_GENERAL"
},
"agent_defaults": {
"@developer": {
"issue_key": "PROJ-DEV",
"account_key": "TD_DEVELOPMENT"
},
"@reviewer": {
"issue_key": "PROJ-REVIEW"
}
},
"ignored_agents": ["@internal"],
"valid_projects": ["PROJ", "SOSO"]
}
}By default, tickets must have at least 2 uppercase letters followed by a number:
- Matches:
PROJ-123,SOSO-1,AB-99 - Does not match:
V-1,X-9(single letter),UTF-8(common false positive)
When valid_projects is configured, only tickets from those projects are recognized:
{
"time_tracking": {
"valid_projects": ["PROJ", "SOSO", "FEAT"]
}
}With whitelist:
- Matches:
PROJ-123,SOSO-1,FEAT-99 - Does not match:
UTF-8,ISO-9001,OTHER-123
Without whitelist (default):
- Matches any pattern with 2+ uppercase letters:
PROJ-123,AB-1 - Does not match single-letter prefixes:
V-1,X-99
- Context ticket (from messages/todos)
- Agent-specific
issue_key(if configured) global_default.issue_key
- Agent-specific
account_key(if configured) global_default.account_key
- Tracks tool executions during each session turn
- Extracts JIRA ticket from user messages or todos
- Writes CSV entry when session becomes idle
- Shows toast notification with tracked time
id,start_date,end_date,user,ticket_name,issue_key,account_key,start_time,end_time,duration_seconds,tokens_used,tokens_remaining,story_points,description,notes
| Event | When triggered |
|---|---|
session.idle |
After each complete AI response (including all tool calls) |