All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Correct sync options descriptions in
booking-proposalcommand:sync-drive: "Upload CSV to Google Drive" (was incorrectly described)sync-tempo: "Sync to JIRA Tempo worklogs" (was marked as "not yet implemented")
cumulate-daily-worklogstool now filters entries bynotes === "Manual entry"only- Booking proposals now correctly use only manually tracked entries, ignoring auto-tracked session entries
- Obsolete
sync-worklogscommand (functionality replaced bybooking-proposal)
- Replace real email addresses with
j.doe@example.comin documentation examples
- Webhook support for time tracking entries via
WebhookSenderservice WriterServiceinterface for pluggable output writers (extensible architecture)WriteResultinterface:{ writer: string, success: boolean, error?: string }- New environment variables for webhook configuration:
TT_WEBHOOK_URL- Webhook endpoint URL (optional, webhook disabled if not set)TT_WEBHOOK_BEARER_TOKEN- Bearer token for webhook authentication (optional)
- Tool response now includes
writers: WriteResult[]array for detailed status
- BREAKING:
WriterService.write()now returnsPromise<WriteResult>instead ofPromise<void> EventHooknow accepts an array ofWriterServiceimplementationsEventHookcollectsWriteResult[]and shows combined status toast- UUID is generated once in
EventHookand passed to all writers (consistent ID across CSV and webhook) CsvWriterrefactored to implementWriterServiceinterface, returnsWriteResultWebhookSenderreturnsWriteResult(toast handler removed, consolidated inEventHook)CsvEntryDataextended withidanduserEmailfieldstrack-timetool refactored to useWriterServicearchitecture directly
- Both CSV and webhook are triggered on each
session.idleevent - CSV is written first (as backup), then webhook is called
- Consistent error handling across all writers
- Single combined toast shows all writer statuses (e.g., "csv: ✓, webhook: ✗")
- Webhook payload matches CSV entry structure (JSON format)
- Postlink hook (
scripts/postlink.js) that automatically creates~/time_tracking/with subdirectories (bookings/,charts/,reports/) and symlinks.opencode/time_tracking→~/time_trackingwhen the plugin is linked scripts/directory included in npm package for hook distribution
- Removed
*.jsfrom.gitignore(no build step, Bun loads.tsdirectly) plugin.jsonnow declareshooks.postlinkfor the linker
- Drive sync agent and command documentation with full upload workflow and
--rawmode - Sync Features section in README with commands overview, environment variables, and configuration
- Complete
.envexample with all sync-related variables
- Invalid JIRA issue keys in examples across README, skills, and type definitions (
PROJ-DEV-001→PROJ-101etc.)
- Plugin source migrated from
@techdivision/opencode-time-trackingto standalone package - Event hook for session tracking (start, end, duration, token usage)
- Tool execute after hook for ticket extraction from tool calls
- ConfigLoader with
process.envfallback chain (delegated .env loading toopencode-plugin-shell-env) - CsvWriter for Jira/Tempo-compatible worklog CSV export
- SessionManager, TicketExtractor, TicketResolver services
- 5 skills: csv, reports, booking, calendar-sync, tempo-sync
- 6 agents: time-tracking, booking-proposal, calendar-sync, drive-sync, tempo-sync, worklog
- 8 commands: track-time, timesheet, booking-proposal, sync-calendar, sync-drive, sync-tempo, sync-worklogs, init
- 3 tools: track-time, cumulate-daily-worklogs, sync-tempo-worklog
- GitHub Actions publish workflow (tag-based npm publish with provenance)