@proletariat/cli 0.3.96 → 0.3.98

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/dist/commands/gc.d.ts +1 -0
  2. package/dist/commands/gc.js +31 -1
  3. package/dist/commands/gc.js.map +1 -1
  4. package/dist/commands/linear/connect.d.ts +5 -0
  5. package/dist/commands/linear/connect.js +84 -0
  6. package/dist/commands/linear/connect.js.map +1 -1
  7. package/dist/commands/orchestrate/index.js +18 -10
  8. package/dist/commands/orchestrate/index.js.map +1 -1
  9. package/dist/commands/qa/index.js +1 -1
  10. package/dist/commands/session/watch.d.ts +1 -0
  11. package/dist/commands/session/watch.js +46 -2
  12. package/dist/commands/session/watch.js.map +1 -1
  13. package/dist/commands/watch/index.d.ts +28 -0
  14. package/dist/commands/watch/index.js +172 -0
  15. package/dist/commands/watch/index.js.map +1 -0
  16. package/dist/commands/work/complete.d.ts +1 -0
  17. package/dist/commands/work/complete.js +38 -31
  18. package/dist/commands/work/complete.js.map +1 -1
  19. package/dist/commands/{ticket/index.d.ts → work/drop.d.ts} +5 -4
  20. package/dist/commands/work/drop.js +215 -0
  21. package/dist/commands/work/drop.js.map +1 -0
  22. package/dist/commands/work/linear.js +1 -1
  23. package/dist/commands/work/linear.js.map +1 -1
  24. package/dist/commands/work/ready.d.ts +1 -0
  25. package/dist/commands/work/ready.js +46 -30
  26. package/dist/commands/work/ready.js.map +1 -1
  27. package/dist/commands/work/ship.d.ts +1 -0
  28. package/dist/commands/work/ship.js +56 -40
  29. package/dist/commands/work/ship.js.map +1 -1
  30. package/dist/commands/work/start.d.ts +2 -0
  31. package/dist/commands/work/start.js +238 -83
  32. package/dist/commands/work/start.js.map +1 -1
  33. package/dist/commands/work/stop.d.ts +1 -0
  34. package/dist/commands/work/stop.js +40 -0
  35. package/dist/commands/work/stop.js.map +1 -1
  36. package/dist/lib/agents/commands.js +7 -5
  37. package/dist/lib/agents/commands.js.map +1 -1
  38. package/dist/lib/asana/client.d.ts +4 -1
  39. package/dist/lib/asana/client.js +15 -0
  40. package/dist/lib/asana/client.js.map +1 -1
  41. package/dist/lib/asana/index.d.ts +1 -1
  42. package/dist/lib/asana/types.d.ts +4 -0
  43. package/dist/lib/database/credential-store.js +1 -0
  44. package/dist/lib/database/credential-store.js.map +1 -1
  45. package/dist/lib/database/drizzle-schema.d.ts +17 -0
  46. package/dist/lib/database/drizzle-schema.js +1 -0
  47. package/dist/lib/database/drizzle-schema.js.map +1 -1
  48. package/dist/lib/database/migrations/0019_gc_artifact_cleanup.d.ts +9 -0
  49. package/dist/lib/database/migrations/0019_gc_artifact_cleanup.js +23 -0
  50. package/dist/lib/database/migrations/0019_gc_artifact_cleanup.js.map +1 -0
  51. package/dist/lib/database/migrations/0020_transition_map.d.ts +2 -0
  52. package/dist/lib/database/migrations/0020_transition_map.js +27 -0
  53. package/dist/lib/database/migrations/0020_transition_map.js.map +1 -0
  54. package/dist/lib/database/migrations/index.js +4 -0
  55. package/dist/lib/database/migrations/index.js.map +1 -1
  56. package/dist/lib/execution/config.d.ts +10 -0
  57. package/dist/lib/execution/config.js +24 -0
  58. package/dist/lib/execution/config.js.map +1 -1
  59. package/dist/lib/execution/preflight.d.ts +51 -0
  60. package/dist/lib/execution/preflight.js +278 -0
  61. package/dist/lib/execution/preflight.js.map +1 -0
  62. package/dist/lib/execution/runners/prompt-builder.d.ts +6 -0
  63. package/dist/lib/execution/runners/prompt-builder.js +38 -7
  64. package/dist/lib/execution/runners/prompt-builder.js.map +1 -1
  65. package/dist/lib/execution/session-utils.d.ts +23 -0
  66. package/dist/lib/execution/session-utils.js +69 -0
  67. package/dist/lib/execution/session-utils.js.map +1 -1
  68. package/dist/lib/execution/spawner.d.ts +11 -1
  69. package/dist/lib/execution/spawner.js +44 -16
  70. package/dist/lib/execution/spawner.js.map +1 -1
  71. package/dist/lib/execution/storage.d.ts +6 -0
  72. package/dist/lib/execution/storage.js +18 -0
  73. package/dist/lib/execution/storage.js.map +1 -1
  74. package/dist/lib/execution/ticket-refs.d.ts +71 -0
  75. package/dist/lib/execution/ticket-refs.js +125 -0
  76. package/dist/lib/execution/ticket-refs.js.map +1 -0
  77. package/dist/lib/execution/types.d.ts +7 -2
  78. package/dist/lib/execution/types.js +5 -3
  79. package/dist/lib/execution/types.js.map +1 -1
  80. package/dist/lib/external-issues/index.d.ts +1 -0
  81. package/dist/lib/external-issues/index.js +2 -0
  82. package/dist/lib/external-issues/index.js.map +1 -1
  83. package/dist/lib/external-issues/linear.js +1 -1
  84. package/dist/lib/external-issues/linear.js.map +1 -1
  85. package/dist/lib/external-issues/ticket-builder.d.ts +21 -0
  86. package/dist/lib/external-issues/ticket-builder.js +43 -0
  87. package/dist/lib/external-issues/ticket-builder.js.map +1 -0
  88. package/dist/lib/external-issues/work-start.js +1 -1
  89. package/dist/lib/external-issues/work-start.js.map +1 -1
  90. package/dist/lib/gc/index.d.ts +67 -6
  91. package/dist/lib/gc/index.js +293 -15
  92. package/dist/lib/gc/index.js.map +1 -1
  93. package/dist/lib/github/client.d.ts +84 -0
  94. package/dist/lib/github/client.js +123 -0
  95. package/dist/lib/github/client.js.map +1 -0
  96. package/dist/lib/github/config.d.ts +42 -0
  97. package/dist/lib/github/config.js +115 -0
  98. package/dist/lib/github/config.js.map +1 -0
  99. package/dist/lib/github/types.d.ts +71 -0
  100. package/dist/lib/github/types.js +50 -0
  101. package/dist/lib/github/types.js.map +1 -0
  102. package/dist/lib/jira/client.d.ts +113 -0
  103. package/dist/lib/jira/client.js +208 -0
  104. package/dist/lib/jira/client.js.map +1 -0
  105. package/dist/lib/jira/config.d.ts +9 -0
  106. package/dist/lib/jira/config.js +30 -0
  107. package/dist/lib/jira/config.js.map +1 -1
  108. package/dist/lib/jira/index.d.ts +6 -2
  109. package/dist/lib/jira/index.js +4 -2
  110. package/dist/lib/jira/index.js.map +1 -1
  111. package/dist/lib/jira/types.d.ts +118 -0
  112. package/dist/lib/jira/types.js +45 -0
  113. package/dist/lib/jira/types.js.map +1 -0
  114. package/dist/lib/linear/config.d.ts +10 -0
  115. package/dist/lib/linear/config.js +33 -0
  116. package/dist/lib/linear/config.js.map +1 -1
  117. package/dist/lib/mcp/tools/index.d.ts +0 -2
  118. package/dist/lib/mcp/tools/index.js +0 -2
  119. package/dist/lib/mcp/tools/index.js.map +1 -1
  120. package/dist/lib/orchestrate/index.d.ts +2 -0
  121. package/dist/lib/orchestrate/index.js +1 -0
  122. package/dist/lib/orchestrate/index.js.map +1 -1
  123. package/dist/lib/orchestrate/simple-poller.d.ts +57 -0
  124. package/dist/lib/orchestrate/simple-poller.js +324 -0
  125. package/dist/lib/orchestrate/simple-poller.js.map +1 -0
  126. package/dist/lib/pmo/storage/index.js +16 -5
  127. package/dist/lib/pmo/storage/index.js.map +1 -1
  128. package/dist/lib/prompt-json.d.ts +31 -0
  129. package/dist/lib/prompt-json.js.map +1 -1
  130. package/dist/lib/providers/asana-provider.d.ts +27 -0
  131. package/dist/lib/providers/asana-provider.js +426 -0
  132. package/dist/lib/providers/asana-provider.js.map +1 -0
  133. package/dist/lib/providers/auto-mapper.d.ts +45 -0
  134. package/dist/lib/providers/auto-mapper.js +138 -0
  135. package/dist/lib/providers/auto-mapper.js.map +1 -0
  136. package/dist/lib/providers/github-provider.d.ts +34 -0
  137. package/dist/lib/providers/github-provider.js +418 -0
  138. package/dist/lib/providers/github-provider.js.map +1 -0
  139. package/dist/lib/providers/index.d.ts +3 -0
  140. package/dist/lib/providers/index.js +3 -0
  141. package/dist/lib/providers/index.js.map +1 -1
  142. package/dist/lib/providers/jira-provider.d.ts +31 -0
  143. package/dist/lib/providers/jira-provider.js +383 -0
  144. package/dist/lib/providers/jira-provider.js.map +1 -0
  145. package/dist/lib/providers/linear-provider.js +6 -7
  146. package/dist/lib/providers/linear-provider.js.map +1 -1
  147. package/dist/lib/providers/resolver.js +54 -0
  148. package/dist/lib/providers/resolver.js.map +1 -1
  149. package/dist/lib/providers/state-intents.d.ts +20 -0
  150. package/dist/lib/providers/state-intents.js +61 -7
  151. package/dist/lib/providers/state-intents.js.map +1 -1
  152. package/dist/lib/providers/state-resolution.d.ts +15 -11
  153. package/dist/lib/providers/state-resolution.js +54 -48
  154. package/dist/lib/providers/state-resolution.js.map +1 -1
  155. package/dist/lib/providers/transition-map.d.ts +59 -0
  156. package/dist/lib/providers/transition-map.js +113 -0
  157. package/dist/lib/providers/transition-map.js.map +1 -0
  158. package/dist/lib/providers/types.d.ts +1 -1
  159. package/dist/lib/session/index.d.ts +3 -1
  160. package/dist/lib/session/index.js +3 -1
  161. package/dist/lib/session/index.js.map +1 -1
  162. package/dist/lib/session/tmux-watchdog.d.ts +157 -0
  163. package/dist/lib/session/tmux-watchdog.js +424 -0
  164. package/dist/lib/session/tmux-watchdog.js.map +1 -0
  165. package/dist/lib/session/watcher.d.ts +22 -4
  166. package/dist/lib/session/watcher.js +66 -8
  167. package/dist/lib/session/watcher.js.map +1 -1
  168. package/dist/lib/work-lifecycle/post-execution.js +26 -1
  169. package/dist/lib/work-lifecycle/post-execution.js.map +1 -1
  170. package/dist/lib/work-lifecycle/transition.d.ts +73 -0
  171. package/dist/lib/work-lifecycle/transition.js +138 -0
  172. package/dist/lib/work-lifecycle/transition.js.map +1 -0
  173. package/dist/lib/work-source/config.d.ts +1 -1
  174. package/dist/lib/work-source/config.js +11 -1
  175. package/dist/lib/work-source/config.js.map +1 -1
  176. package/oclif.manifest.json +936 -1628
  177. package/package.json +1 -1
  178. package/dist/commands/ticket/create.d.ts +0 -44
  179. package/dist/commands/ticket/create.js +0 -760
  180. package/dist/commands/ticket/create.js.map +0 -1
  181. package/dist/commands/ticket/delete.d.ts +0 -17
  182. package/dist/commands/ticket/delete.js +0 -204
  183. package/dist/commands/ticket/delete.js.map +0 -1
  184. package/dist/commands/ticket/edit.d.ts +0 -28
  185. package/dist/commands/ticket/edit.js +0 -402
  186. package/dist/commands/ticket/edit.js.map +0 -1
  187. package/dist/commands/ticket/index.js +0 -74
  188. package/dist/commands/ticket/index.js.map +0 -1
  189. package/dist/commands/ticket/list.d.ts +0 -33
  190. package/dist/commands/ticket/list.js +0 -519
  191. package/dist/commands/ticket/list.js.map +0 -1
  192. package/dist/commands/ticket/move.d.ts +0 -27
  193. package/dist/commands/ticket/move.js +0 -413
  194. package/dist/commands/ticket/move.js.map +0 -1
  195. package/dist/commands/ticket/show.d.ts +0 -14
  196. package/dist/commands/ticket/show.js +0 -110
  197. package/dist/commands/ticket/show.js.map +0 -1
  198. package/dist/commands/ticket/update.d.ts +0 -28
  199. package/dist/commands/ticket/update.js +0 -458
  200. package/dist/commands/ticket/update.js.map +0 -1
  201. package/dist/lib/mcp/tools/action.d.ts +0 -6
  202. package/dist/lib/mcp/tools/action.js +0 -123
  203. package/dist/lib/mcp/tools/action.js.map +0 -1
  204. package/dist/lib/mcp/tools/ticket.d.ts +0 -6
  205. package/dist/lib/mcp/tools/ticket.js +0 -464
  206. package/dist/lib/mcp/tools/ticket.js.map +0 -1
@@ -0,0 +1,34 @@
1
+ /**
2
+ * GitHub Issues Ticket Provider
3
+ *
4
+ * Writes ticket operations directly to GitHub Issues via REST API,
5
+ * then updates local PMO to keep it in sync.
6
+ *
7
+ * State mapping strategy:
8
+ * - Uses labels to represent workflow states (e.g., "status: In Progress")
9
+ * - Terminal states (completed, dropped) also close/reopen the issue
10
+ * - Auth via GITHUB_TOKEN environment variable or stored credential
11
+ *
12
+ * Follows the same pattern as ClickUpTicketProvider:
13
+ * - Write to GitHub first
14
+ * - Update local PMO as best-effort fallback
15
+ */
16
+ import type Database from 'better-sqlite3';
17
+ import type { TicketFilter, CreateTicketInput, UpdateTicketInput } from '../pmo/types.js';
18
+ import type { TicketProvider, TicketProviderName, ProviderMoveResult, ProviderDeleteResult, ProviderListResult, ProviderCreateResult, ProviderGetResult, ProviderUpdateResult, ProviderAssignResult, ProviderStorage } from './types.js';
19
+ export declare class GitHubIssuesTicketProvider implements TicketProvider {
20
+ private db;
21
+ private storage;
22
+ private projectId;
23
+ readonly name: TicketProviderName;
24
+ constructor(db: Database.Database, storage: ProviderStorage, projectId: string);
25
+ private getTokenOrFail;
26
+ private getConfigOrFail;
27
+ moveTicket(ticketId: string, newState: string): Promise<ProviderMoveResult>;
28
+ deleteTicket(ticketId: string): Promise<ProviderDeleteResult>;
29
+ listTickets(_projectId?: string, filter?: TicketFilter): Promise<ProviderListResult>;
30
+ createTicket(projectId: string, input: CreateTicketInput): Promise<ProviderCreateResult>;
31
+ getTicket(ticketId: string): Promise<ProviderGetResult>;
32
+ updateTicket(ticketId: string, input: UpdateTicketInput): Promise<ProviderUpdateResult>;
33
+ assignTicket(ticketId: string, assignee: string): Promise<ProviderAssignResult>;
34
+ }
@@ -0,0 +1,418 @@
1
+ /**
2
+ * GitHub Issues Ticket Provider
3
+ *
4
+ * Writes ticket operations directly to GitHub Issues via REST API,
5
+ * then updates local PMO to keep it in sync.
6
+ *
7
+ * State mapping strategy:
8
+ * - Uses labels to represent workflow states (e.g., "status: In Progress")
9
+ * - Terminal states (completed, dropped) also close/reopen the issue
10
+ * - Auth via GITHUB_TOKEN environment variable or stored credential
11
+ *
12
+ * Follows the same pattern as ClickUpTicketProvider:
13
+ * - Write to GitHub first
14
+ * - Update local PMO as best-effort fallback
15
+ */
16
+ import { GitHubClient } from '../github/client.js';
17
+ import { getGitHubToken, loadGitHubConfig } from '../github/config.js';
18
+ import { GITHUB_LABEL_TO_PMO_CATEGORY, GITHUB_PRIORITY_LABELS, PMO_PRIORITY_TO_GITHUB_LABEL } from '../github/types.js';
19
+ export class GitHubIssuesTicketProvider {
20
+ db;
21
+ storage;
22
+ projectId;
23
+ name = 'github';
24
+ constructor(db, storage, projectId) {
25
+ this.db = db;
26
+ this.storage = storage;
27
+ this.projectId = projectId;
28
+ }
29
+ getTokenOrFail() {
30
+ const token = getGitHubToken(this.db);
31
+ if (!token)
32
+ throw new Error('GitHub token not configured');
33
+ return token;
34
+ }
35
+ getConfigOrFail() {
36
+ const config = loadGitHubConfig(this.db);
37
+ if (!config)
38
+ throw new Error('GitHub Issues not configured (missing token, owner, or repo)');
39
+ return config;
40
+ }
41
+ async moveTicket(ticketId, newState) {
42
+ let config;
43
+ try {
44
+ config = this.getConfigOrFail();
45
+ }
46
+ catch {
47
+ return { success: false, provider: 'github', error: 'GitHub Issues not configured' };
48
+ }
49
+ // Look up GitHub issue number from ticket metadata
50
+ const ticket = await this.storage.getTicket(ticketId);
51
+ if (!ticket) {
52
+ return { success: false, provider: 'github', error: `Ticket ${ticketId} not found` };
53
+ }
54
+ const issueNumber = ticket.metadata?.['github.issue_number'];
55
+ if (!issueNumber) {
56
+ return { success: false, provider: 'github', error: `No GitHub issue mapping for ticket ${ticketId}` };
57
+ }
58
+ const client = new GitHubClient(config.token);
59
+ const num = parseInt(issueNumber, 10);
60
+ try {
61
+ // Determine if this state implies open or closed
62
+ const lowerState = newState.toLowerCase();
63
+ const isClosedState = ['done', 'closed', 'complete', 'completed', 'shipped', 'merged',
64
+ 'resolved', 'finished', 'canceled', 'cancelled', "won't fix", 'wontfix',
65
+ 'dropped', 'archived', 'removed', 'discarded'].includes(lowerState);
66
+ // Get current issue to find existing status labels
67
+ const issue = await client.getIssue(config.owner, config.repo, num);
68
+ // Remove existing status labels
69
+ const prefix = config.statusLabelPrefix ?? 'status:';
70
+ for (const label of issue.labels) {
71
+ if (label.name.toLowerCase().startsWith(prefix.toLowerCase())) {
72
+ try {
73
+ await client.removeLabel(config.owner, config.repo, num, label.name);
74
+ }
75
+ catch {
76
+ // Non-fatal: label may already be removed
77
+ }
78
+ }
79
+ }
80
+ // Add the new status label
81
+ const statusLabel = `${prefix} ${newState}`;
82
+ try {
83
+ await client.addLabels(config.owner, config.repo, num, [statusLabel]);
84
+ }
85
+ catch {
86
+ // If label doesn't exist, create it then add
87
+ try {
88
+ await client.createLabel(config.owner, config.repo, {
89
+ name: statusLabel,
90
+ color: 'ededed',
91
+ });
92
+ await client.addLabels(config.owner, config.repo, num, [statusLabel]);
93
+ }
94
+ catch {
95
+ // Non-fatal: status label is informational
96
+ }
97
+ }
98
+ // Close or reopen the issue based on state
99
+ await client.updateIssue(config.owner, config.repo, num, {
100
+ state: isClosedState ? 'closed' : 'open',
101
+ });
102
+ }
103
+ catch (error) {
104
+ return {
105
+ success: false,
106
+ provider: 'github',
107
+ error: `Failed to update GitHub issue: ${error instanceof Error ? error.message : String(error)}`,
108
+ };
109
+ }
110
+ // Also update local PMO to keep it in sync
111
+ try {
112
+ await this.storage.moveTicket(this.projectId, ticketId, newState);
113
+ }
114
+ catch {
115
+ // Non-fatal: GitHub is the source of truth
116
+ }
117
+ return { success: true, provider: 'github' };
118
+ }
119
+ async deleteTicket(ticketId) {
120
+ let config;
121
+ try {
122
+ config = this.getConfigOrFail();
123
+ }
124
+ catch {
125
+ return { success: false, provider: 'github', error: 'GitHub Issues not configured' };
126
+ }
127
+ // Look up GitHub issue number from ticket metadata
128
+ const ticket = await this.storage.getTicket(ticketId);
129
+ const issueNumber = ticket?.metadata?.['github.issue_number'];
130
+ if (issueNumber) {
131
+ const client = new GitHubClient(config.token);
132
+ const num = parseInt(issueNumber, 10);
133
+ // GitHub issues can't be deleted via API — close them instead
134
+ try {
135
+ await client.updateIssue(config.owner, config.repo, num, { state: 'closed' });
136
+ }
137
+ catch (error) {
138
+ return {
139
+ success: false,
140
+ provider: 'github',
141
+ error: `Failed to close GitHub issue: ${error instanceof Error ? error.message : String(error)}`,
142
+ };
143
+ }
144
+ }
145
+ // Also delete the local PMO mirror
146
+ try {
147
+ await this.storage.deleteTicket(ticketId);
148
+ }
149
+ catch {
150
+ // Non-fatal if GitHub close succeeded
151
+ }
152
+ return { success: true, provider: 'github' };
153
+ }
154
+ async listTickets(_projectId, filter) {
155
+ let config;
156
+ try {
157
+ config = this.getConfigOrFail();
158
+ }
159
+ catch {
160
+ return { success: false, provider: 'github', tickets: [], error: 'GitHub Issues not configured' };
161
+ }
162
+ try {
163
+ const client = new GitHubClient(config.token);
164
+ const issues = await client.listIssues(config.owner, config.repo, {
165
+ state: 'all',
166
+ labels: filter?.label,
167
+ });
168
+ let tickets = issues.map(issue => githubIssueToTicket(issue, config.owner, config.repo, config.statusLabelPrefix));
169
+ // Apply client-side filters
170
+ if (filter?.priority) {
171
+ tickets = tickets.filter(t => t.priority === filter.priority);
172
+ }
173
+ if (filter?.column) {
174
+ tickets = tickets.filter(t => t.statusName === filter.column);
175
+ }
176
+ if (filter?.category) {
177
+ tickets = tickets.filter(t => t.category === filter.category);
178
+ }
179
+ if (filter?.search) {
180
+ const term = filter.search.toLowerCase();
181
+ tickets = tickets.filter(t => t.title.toLowerCase().includes(term) ||
182
+ (t.description || '').toLowerCase().includes(term));
183
+ }
184
+ return { success: true, provider: 'github', tickets };
185
+ }
186
+ catch (error) {
187
+ return {
188
+ success: false,
189
+ provider: 'github',
190
+ tickets: [],
191
+ error: error instanceof Error ? error.message : String(error),
192
+ };
193
+ }
194
+ }
195
+ async createTicket(projectId, input) {
196
+ let config;
197
+ try {
198
+ config = this.getConfigOrFail();
199
+ }
200
+ catch {
201
+ return { success: false, provider: 'github', error: 'GitHub Issues not configured' };
202
+ }
203
+ try {
204
+ const client = new GitHubClient(config.token);
205
+ // Build labels list
206
+ const labels = [...(input.labels || [])];
207
+ // Add priority label if set
208
+ if (input.priority && PMO_PRIORITY_TO_GITHUB_LABEL[input.priority]) {
209
+ labels.push(PMO_PRIORITY_TO_GITHUB_LABEL[input.priority]);
210
+ }
211
+ // Add status label if set
212
+ if (input.statusName) {
213
+ const prefix = config.statusLabelPrefix ?? 'status:';
214
+ labels.push(`${prefix} ${input.statusName}`);
215
+ }
216
+ // Create the issue on GitHub
217
+ const issue = await client.createIssue(config.owner, config.repo, {
218
+ title: input.title,
219
+ body: input.description,
220
+ labels,
221
+ assignees: input.assignee ? [input.assignee] : undefined,
222
+ });
223
+ // Create local PMO mirror ticket
224
+ const mirrorDescription = [
225
+ input.description || '',
226
+ '',
227
+ '---',
228
+ `_Created in GitHub: [#${issue.number}](${issue.html_url})_`,
229
+ ].join('\n').trim();
230
+ const pmoTicket = await this.storage.createTicket(projectId, {
231
+ ...input,
232
+ title: issue.title,
233
+ description: mirrorDescription,
234
+ metadata: {
235
+ ...input.metadata,
236
+ 'external_source': 'github',
237
+ 'external_id': String(issue.id),
238
+ 'external_key': `${config.owner}/${config.repo}#${issue.number}`,
239
+ 'external_url': issue.html_url,
240
+ 'github.issue_number': String(issue.number),
241
+ 'github.owner': config.owner,
242
+ 'github.repo': config.repo,
243
+ },
244
+ });
245
+ return { success: true, provider: 'github', ticket: pmoTicket };
246
+ }
247
+ catch (error) {
248
+ return {
249
+ success: false,
250
+ provider: 'github',
251
+ error: error instanceof Error ? error.message : String(error),
252
+ };
253
+ }
254
+ }
255
+ async getTicket(ticketId) {
256
+ // For getTicket, use local PMO since we maintain mirrors
257
+ try {
258
+ const ticket = await this.storage.getTicket(ticketId);
259
+ return { success: true, provider: 'github', ticket };
260
+ }
261
+ catch (error) {
262
+ return {
263
+ success: false,
264
+ provider: 'github',
265
+ error: error instanceof Error ? error.message : String(error),
266
+ };
267
+ }
268
+ }
269
+ async updateTicket(ticketId, input) {
270
+ let config;
271
+ try {
272
+ config = this.getConfigOrFail();
273
+ }
274
+ catch {
275
+ return { success: false, provider: 'github', error: 'GitHub Issues not configured' };
276
+ }
277
+ // Look up GitHub issue number from ticket metadata
278
+ const ticket = await this.storage.getTicket(ticketId);
279
+ const issueNumber = ticket?.metadata?.['github.issue_number'];
280
+ if (issueNumber) {
281
+ const client = new GitHubClient(config.token);
282
+ const num = parseInt(issueNumber, 10);
283
+ // Build GitHub update payload from input fields
284
+ const githubInput = {};
285
+ if (input.title !== undefined)
286
+ githubInput.title = input.title;
287
+ if (input.description !== undefined)
288
+ githubInput.body = input.description ?? undefined;
289
+ // Only call GitHub API if there are relevant fields
290
+ if (Object.keys(githubInput).length > 0) {
291
+ try {
292
+ await client.updateIssue(config.owner, config.repo, num, githubInput);
293
+ }
294
+ catch (error) {
295
+ return {
296
+ success: false,
297
+ provider: 'github',
298
+ error: `Failed to update GitHub issue: ${error instanceof Error ? error.message : String(error)}`,
299
+ };
300
+ }
301
+ }
302
+ }
303
+ // Also update local PMO mirror
304
+ try {
305
+ const updated = await this.storage.updateTicket(ticketId, input);
306
+ return { success: true, provider: 'github', ticket: updated };
307
+ }
308
+ catch (error) {
309
+ return {
310
+ success: false,
311
+ provider: 'github',
312
+ error: error instanceof Error ? error.message : String(error),
313
+ };
314
+ }
315
+ }
316
+ async assignTicket(ticketId, assignee) {
317
+ let config;
318
+ try {
319
+ config = this.getConfigOrFail();
320
+ }
321
+ catch {
322
+ return { success: false, provider: 'github', error: 'GitHub Issues not configured' };
323
+ }
324
+ // Look up GitHub issue number from ticket metadata
325
+ const ticket = await this.storage.getTicket(ticketId);
326
+ const issueNumber = ticket?.metadata?.['github.issue_number'];
327
+ if (issueNumber) {
328
+ const client = new GitHubClient(config.token);
329
+ const num = parseInt(issueNumber, 10);
330
+ // GitHub uses login usernames for assignment
331
+ try {
332
+ await client.updateIssue(config.owner, config.repo, num, {
333
+ assignees: [assignee],
334
+ });
335
+ }
336
+ catch {
337
+ // Non-fatal: assignee resolution is best-effort
338
+ // The assignee name may not match a GitHub username
339
+ }
340
+ }
341
+ // Update local PMO mirror
342
+ try {
343
+ await this.storage.updateTicket(ticketId, { assignee });
344
+ return { success: true, provider: 'github' };
345
+ }
346
+ catch (error) {
347
+ return {
348
+ success: false,
349
+ provider: 'github',
350
+ error: error instanceof Error ? error.message : String(error),
351
+ };
352
+ }
353
+ }
354
+ }
355
+ /**
356
+ * Convert a GitHub issue to a normalized PMO Ticket.
357
+ */
358
+ function githubIssueToTicket(issue, owner, repo, statusLabelPrefix) {
359
+ const prefix = statusLabelPrefix ?? 'status:';
360
+ // Determine status from labels
361
+ let statusName = issue.state === 'closed' ? 'Closed' : 'Open';
362
+ let statusCategory = issue.state === 'closed' ? 'completed' : 'unstarted';
363
+ // Check for status label
364
+ for (const label of issue.labels) {
365
+ if (label.name.toLowerCase().startsWith(prefix.toLowerCase())) {
366
+ statusName = label.name.slice(prefix.length).trim();
367
+ // Try to resolve category from label name
368
+ const category = GITHUB_LABEL_TO_PMO_CATEGORY[statusName.toLowerCase()];
369
+ if (category) {
370
+ statusCategory = category;
371
+ }
372
+ break;
373
+ }
374
+ }
375
+ // Determine priority from labels
376
+ let priority;
377
+ for (const label of issue.labels) {
378
+ const mapped = GITHUB_PRIORITY_LABELS[label.name.toLowerCase()];
379
+ if (mapped) {
380
+ priority = mapped;
381
+ break;
382
+ }
383
+ }
384
+ // Collect non-status, non-priority labels
385
+ const ticketLabels = issue.labels
386
+ .filter(l => {
387
+ const lower = l.name.toLowerCase();
388
+ return !lower.startsWith(prefix.toLowerCase()) && !GITHUB_PRIORITY_LABELS[lower];
389
+ })
390
+ .map(l => l.name);
391
+ return {
392
+ id: `${owner}/${repo}#${issue.number}`,
393
+ title: issue.title,
394
+ description: issue.body || undefined,
395
+ priority,
396
+ projectId: `${owner}/${repo}`,
397
+ projectName: `${owner}/${repo}`,
398
+ statusId: issue.state,
399
+ statusName,
400
+ statusCategory,
401
+ owner: issue.assignee?.login || undefined,
402
+ assignee: issue.assignee?.login || undefined,
403
+ subtasks: [],
404
+ labels: ticketLabels,
405
+ metadata: {
406
+ external_source: 'github',
407
+ external_key: `${owner}/${repo}#${issue.number}`,
408
+ external_id: String(issue.id),
409
+ external_url: issue.html_url,
410
+ 'github.issue_number': String(issue.number),
411
+ 'github.owner': owner,
412
+ 'github.repo': repo,
413
+ },
414
+ createdAt: new Date(issue.created_at),
415
+ updatedAt: new Date(issue.updated_at),
416
+ };
417
+ }
418
+ //# sourceMappingURL=github-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-provider.js","sourceRoot":"","sources":["../../../src/lib/providers/github-provider.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,9 @@ export type { TicketProvider, TicketProviderName, ProviderResult, ProviderMoveRe
9
9
  export { PMOTicketProvider } from './pmo-provider.js';
10
10
  export { LinearTicketProvider } from './linear-provider.js';
11
11
  export { TrelloTicketProvider } from './trello-provider.js';
12
+ export { GitHubIssuesTicketProvider } from './github-provider.js';
13
+ export { JiraTicketProvider } from './jira-provider.js';
14
+ export { AsanaTicketProvider } from './asana-provider.js';
12
15
  export { EventEmittingProvider, type StatusResolver } from './event-emitting-provider.js';
13
16
  export { ProviderStatusMappingStore, type StatusMapping } from './status-mapping.js';
14
17
  export { ProviderTriggerStore, TriggerHandler, initTriggerHandler, stopTriggerHandler, TRIGGER_EVENTS, type TriggerEvent, type TriggerConfig, } from './trigger-config.js';
@@ -8,6 +8,9 @@
8
8
  export { PMOTicketProvider } from './pmo-provider.js';
9
9
  export { LinearTicketProvider } from './linear-provider.js';
10
10
  export { TrelloTicketProvider } from './trello-provider.js';
11
+ export { GitHubIssuesTicketProvider } from './github-provider.js';
12
+ export { JiraTicketProvider } from './jira-provider.js';
13
+ export { AsanaTicketProvider } from './asana-provider.js';
11
14
  export { EventEmittingProvider } from './event-emitting-provider.js';
12
15
  export { ProviderStatusMappingStore } from './status-mapping.js';
13
16
  export { ProviderTriggerStore, TriggerHandler, initTriggerHandler, stopTriggerHandler, TRIGGER_EVENTS, } from './trigger-config.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAuB,MAAM,8BAA8B,CAAA;AACzF,OAAO,EAAE,0BAA0B,EAAsB,MAAM,qBAAqB,CAAA;AACpF,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,GAGf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAC7E,OAAO,EACL,IAAI,EACJ,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,GAKpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GAErB,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAuB,MAAM,8BAA8B,CAAA;AACzF,OAAO,EAAE,0BAA0B,EAAsB,MAAM,qBAAqB,CAAA;AACpF,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,GAGf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAC7E,OAAO,EACL,IAAI,EACJ,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,GAKpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GAErB,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Jira Ticket Provider
3
+ *
4
+ * Writes ticket operations directly to Jira via REST API,
5
+ * then updates local PMO to keep it in sync.
6
+ *
7
+ * Follows the same pattern as ClickUpTicketProvider:
8
+ * - Write to Jira first (source of truth)
9
+ * - Update local PMO as best-effort mirror
10
+ * - Use ticket metadata for Jira issue key lookups (no separate mapper table)
11
+ *
12
+ * Supports both Jira Cloud (API v3) and Server (API v2).
13
+ */
14
+ import type Database from 'better-sqlite3';
15
+ import type { TicketFilter, CreateTicketInput, UpdateTicketInput } from '../pmo/types.js';
16
+ import type { TicketProvider, TicketProviderName, ProviderMoveResult, ProviderDeleteResult, ProviderListResult, ProviderCreateResult, ProviderGetResult, ProviderUpdateResult, ProviderAssignResult, ProviderStorage } from './types.js';
17
+ export declare class JiraTicketProvider implements TicketProvider {
18
+ private db;
19
+ private storage;
20
+ private projectId;
21
+ readonly name: TicketProviderName;
22
+ constructor(db: Database.Database, storage: ProviderStorage, projectId: string);
23
+ private getClientOrFail;
24
+ moveTicket(ticketId: string, newState: string): Promise<ProviderMoveResult>;
25
+ deleteTicket(ticketId: string): Promise<ProviderDeleteResult>;
26
+ listTickets(_projectId?: string, filter?: TicketFilter): Promise<ProviderListResult>;
27
+ createTicket(projectId: string, input: CreateTicketInput): Promise<ProviderCreateResult>;
28
+ getTicket(ticketId: string): Promise<ProviderGetResult>;
29
+ updateTicket(ticketId: string, input: UpdateTicketInput): Promise<ProviderUpdateResult>;
30
+ assignTicket(ticketId: string, assignee: string): Promise<ProviderAssignResult>;
31
+ }