Automatic time tracking plugin for OpenCode - tracks session duration and tool usage to CSV
npm install @techdivision/opencode-time-trackingAutomatic 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:
``json`
{
"plugin": ["@techdivision/opencode-time-tracking"]
}
Add the time_tracking section to your .opencode/opencode-project.json:
`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):
`env`
OPENCODE_USER_EMAIL=your@email.com
Or export in your shell:
`bash`
export OPENCODE_USER_EMAIL=your@email.com
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 |
#### Agent-specific Defaults
Override default ticket/account for specific agents:
`json`
{
"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"
}
}
}
}
#### Ignored Agents
Skip time tracking for specific agents:
`json`
{
"time_tracking": {
"csv_file": "...",
"global_default": { ... },
"ignored_agents": ["@internal", "@notrack"]
}
}
#### Project Whitelist
Restrict ticket detection to specific JIRA projects:
`json`
{
"time_tracking": {
"csv_file": "...",
"global_default": { ... },
"valid_projects": ["PROJ", "SOSO", "FEAT"]
}
}
`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": "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-99V-1
- Does not match: , X-9 (single letter), UTF-8 (common false positive)
When valid_projects is configured, only tickets from those projects are recognized:
`json`
{
"time_tracking": {
"valid_projects": ["PROJ", "SOSO", "FEAT"]
}
}
With whitelist:
- Matches: PROJ-123, SOSO-1, FEAT-99UTF-8
- Does not match: , ISO-9001, OTHER-123
Without whitelist (default):
- Matches any pattern with 2+ uppercase letters: PROJ-123, AB-1V-1
- Does not match single-letter prefixes: , X-99
1. Context ticket (from messages/todos)
2. Agent-specific issue_key (if configured)global_default.issue_key
3.
1. Agent-specific account_key (if configured)global_default.account_key
2.
- 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) |