Skip to content

Commit 473c7e3

Browse files
committed
Merge branch 'develop'
2 parents 9eb9f37 + b13787d commit 473c7e3

6 files changed

Lines changed: 101 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,19 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [0.7.0] - 2025-02-04
6+
7+
### Added
8+
9+
- Add `valid_projects` configuration for JIRA project whitelist
10+
- Restrict ticket detection to specific projects when configured
11+
12+
### Changed
13+
14+
- Default ticket pattern now requires at least 2 uppercase letters
15+
- Matches: `PROJ-123`, `SOSO-1`, `AB-99`
16+
- Does not match: `V-1`, `X-9` (single letter), `UTF-8` (false positive)
17+
518
## [0.6.1] - 2025-02-02
619

720
### Fixed

README.md

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,20 @@ Skip time tracking for specific agents:
100100
}
101101
```
102102

103+
#### Project Whitelist
104+
105+
Restrict ticket detection to specific JIRA projects:
106+
107+
```json
108+
{
109+
"time_tracking": {
110+
"csv_file": "...",
111+
"global_default": { ... },
112+
"valid_projects": ["PROJ", "SOSO", "FEAT"]
113+
}
114+
}
115+
```
116+
103117
### Full Example
104118

105119
```json
@@ -120,11 +134,40 @@ Skip time tracking for specific agents:
120134
"issue_key": "PROJ-REVIEW"
121135
}
122136
},
123-
"ignored_agents": ["@internal"]
137+
"ignored_agents": ["@internal"],
138+
"valid_projects": ["PROJ", "SOSO"]
124139
}
125140
}
126141
```
127142

143+
## Ticket Detection
144+
145+
### Pattern
146+
147+
By default, tickets must have at least 2 uppercase letters followed by a number:
148+
- Matches: `PROJ-123`, `SOSO-1`, `AB-99`
149+
- Does not match: `V-1`, `X-9` (single letter), `UTF-8` (common false positive)
150+
151+
### Project Whitelist
152+
153+
When `valid_projects` is configured, only tickets from those projects are recognized:
154+
155+
```json
156+
{
157+
"time_tracking": {
158+
"valid_projects": ["PROJ", "SOSO", "FEAT"]
159+
}
160+
}
161+
```
162+
163+
With whitelist:
164+
- Matches: `PROJ-123`, `SOSO-1`, `FEAT-99`
165+
- Does not match: `UTF-8`, `ISO-9001`, `OTHER-123`
166+
167+
Without whitelist (default):
168+
- Matches any pattern with 2+ uppercase letters: `PROJ-123`, `AB-1`
169+
- Does not match single-letter prefixes: `V-1`, `X-99`
170+
128171
## Fallback Hierarchy
129172

130173
### Ticket Resolution

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@techdivision/opencode-time-tracking",
3-
"version": "0.6.1",
3+
"version": "0.7.0",
44
"description": "Automatic time tracking plugin for OpenCode - tracks session duration and tool usage to CSV",
55
"main": "src/Plugin.ts",
66
"types": "src/Plugin.ts",

src/Plugin.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export const plugin: Plugin = async ({
6161

6262
const sessionManager = new SessionManager()
6363
const csvWriter = new CsvWriter(config, directory)
64-
const ticketExtractor = new TicketExtractor(client)
64+
const ticketExtractor = new TicketExtractor(client, config.valid_projects)
6565
const ticketResolver = new TicketResolver(config, ticketExtractor)
6666

6767
const hooks: Hooks = {

src/services/TicketExtractor.ts

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ import type { OpencodeClient } from "../types/OpencodeClient"
77
import type { Todo } from "../types/Todo"
88

99
/**
10-
* Regular expression pattern for Jira ticket references.
11-
* Matches patterns like "PROJ-123", "ABC-1", "FEATURE-9999".
10+
* Default regular expression pattern for Jira ticket references.
11+
* Requires at least 2 uppercase letters followed by a dash and digits.
12+
* Matches patterns like "PROJ-123", "AB-1", "FEATURE-9999".
13+
* Does not match single-letter prefixes like "V-1" or "X-99".
1214
*/
13-
const TICKET_PATTERN = /([A-Z]+-\d+)/
15+
const DEFAULT_TICKET_PATTERN = /\b([A-Z]{2,}-\d+)\b/
1416

1517
/**
1618
* Extracts Jira ticket references from user messages and todos.
@@ -22,18 +24,43 @@ const TICKET_PATTERN = /([A-Z]+-\d+)/
2224
*
2325
* Returns the first match found, allowing tickets to be updated
2426
* when mentioned in later messages.
27+
*
28+
* If `validProjects` is provided, only tickets from those projects
29+
* are recognized. Otherwise, any ticket matching the default pattern
30+
* (2+ uppercase letters) is accepted.
2531
*/
2632
export class TicketExtractor {
2733
/** OpenCode SDK client */
2834
private client: OpencodeClient
2935

36+
/** Compiled regex pattern for ticket matching */
37+
private ticketPattern: RegExp
38+
3039
/**
3140
* Creates a new ticket extractor instance.
3241
*
3342
* @param client - The OpenCode SDK client
43+
* @param validProjects - Optional whitelist of valid JIRA project keys
44+
*
45+
* @example
46+
* ```typescript
47+
* // Accept any ticket with 2+ letter prefix
48+
* const extractor = new TicketExtractor(client)
49+
*
50+
* // Only accept PROJ and SOSO tickets
51+
* const extractor = new TicketExtractor(client, ["PROJ", "SOSO"])
52+
* ```
3453
*/
35-
constructor(client: OpencodeClient) {
54+
constructor(client: OpencodeClient, validProjects?: string[]) {
3655
this.client = client
56+
57+
if (validProjects && validProjects.length > 0) {
58+
// Build pattern that only matches specified projects
59+
const projectsRegex = validProjects.join("|")
60+
this.ticketPattern = new RegExp(`\\b((?:${projectsRegex})-\\d+)\\b`)
61+
} else {
62+
this.ticketPattern = DEFAULT_TICKET_PATTERN
63+
}
3764
}
3865

3966
/**
@@ -149,7 +176,7 @@ export class TicketExtractor {
149176
* @returns The first ticket match, or `null` if not found
150177
*/
151178
private extractFromText(text: string): string | null {
152-
const match = text.match(TICKET_PATTERN)
179+
const match = text.match(this.ticketPattern)
153180

154181
return match?.[1] ?? null
155182
}

src/types/TimeTrackingConfig.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ export interface TimeTrackingJsonConfig {
5151
* Agent names should include the "@" prefix (e.g., "@internal").
5252
*/
5353
ignored_agents?: string[]
54+
55+
/**
56+
* Whitelist of valid JIRA project keys.
57+
*
58+
* @remarks
59+
* If set, only tickets from these projects are recognized.
60+
* If not set, any ticket matching the default pattern is accepted.
61+
* Project keys should be uppercase with at least 2 letters (e.g., "PROJ", "SOSO").
62+
*/
63+
valid_projects?: string[]
5464
}
5565

5666
/**

0 commit comments

Comments
 (0)