@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 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/github/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * GitHub Issues Configuration Storage
3
+ *
4
+ * Stores GitHub connection credentials and preferences in workspace_settings.
5
+ * Token is stored in the credential store (not mounted into agent containers).
6
+ */
7
+ import type Database from 'better-sqlite3';
8
+ import type { GitHubConfig } from './types.js';
9
+ /**
10
+ * Check if GitHub Issues is configured (token + owner + repo are stored).
11
+ */
12
+ export declare function isGitHubConfigured(db: Database.Database): boolean;
13
+ /**
14
+ * Load GitHub configuration from the database.
15
+ * Returns null if not configured.
16
+ */
17
+ export declare function loadGitHubConfig(db: Database.Database): GitHubConfig | null;
18
+ /**
19
+ * Save GitHub token to the credential store.
20
+ */
21
+ export declare function saveGitHubToken(db: Database.Database, token: string): void;
22
+ /**
23
+ * Save the GitHub repo configuration.
24
+ */
25
+ export declare function saveGitHubRepo(db: Database.Database, owner: string, repo: string): void;
26
+ /**
27
+ * Save the status label prefix.
28
+ */
29
+ export declare function saveGitHubStatusLabelPrefix(db: Database.Database, prefix: string): void;
30
+ /**
31
+ * Clear all GitHub configuration from the database.
32
+ */
33
+ export declare function clearGitHubConfig(db: Database.Database): void;
34
+ /**
35
+ * Get the GitHub token using the provider-sources resolution chain.
36
+ *
37
+ * Resolution order:
38
+ * 1. If a GitHub provider source is configured, resolve its apiKeyRef
39
+ * 2. GITHUB_TOKEN environment variable
40
+ * 3. Credential store key 'github.token'
41
+ */
42
+ export declare function getGitHubToken(db: Database.Database): string | null;
@@ -0,0 +1,115 @@
1
+ /**
2
+ * GitHub Issues Configuration Storage
3
+ *
4
+ * Stores GitHub connection credentials and preferences in workspace_settings.
5
+ * Token is stored in the credential store (not mounted into agent containers).
6
+ */
7
+ import { loadProviderSources, resolveApiKey } from '../work-source/provider-sources.js';
8
+ import { SettingsStore } from '../database/settings-store.js';
9
+ import { getCredential, setCredential, deleteCredential, hasCredential } from '../database/credential-store.js';
10
+ const GITHUB_CONFIG_KEYS = {
11
+ token: 'github.token',
12
+ owner: 'github.owner',
13
+ repo: 'github.repo',
14
+ statusLabelPrefix: 'github.status_label_prefix',
15
+ };
16
+ // =============================================================================
17
+ // Public API
18
+ // =============================================================================
19
+ /**
20
+ * Check if GitHub Issues is configured (token + owner + repo are stored).
21
+ */
22
+ export function isGitHubConfigured(db) {
23
+ if (!hasCredential(db, GITHUB_CONFIG_KEYS.token)) {
24
+ // Also check GITHUB_TOKEN env var
25
+ if (!process.env.GITHUB_TOKEN)
26
+ return false;
27
+ }
28
+ const settings = new SettingsStore(db);
29
+ return !!settings.get(GITHUB_CONFIG_KEYS.owner) && !!settings.get(GITHUB_CONFIG_KEYS.repo);
30
+ }
31
+ /**
32
+ * Load GitHub configuration from the database.
33
+ * Returns null if not configured.
34
+ */
35
+ export function loadGitHubConfig(db) {
36
+ const token = getGitHubToken(db);
37
+ if (!token)
38
+ return null;
39
+ const settings = new SettingsStore(db);
40
+ const owner = settings.get(GITHUB_CONFIG_KEYS.owner);
41
+ const repo = settings.get(GITHUB_CONFIG_KEYS.repo);
42
+ if (!owner || !repo)
43
+ return null;
44
+ return {
45
+ token,
46
+ owner,
47
+ repo,
48
+ statusLabelPrefix: settings.get(GITHUB_CONFIG_KEYS.statusLabelPrefix) ?? undefined,
49
+ };
50
+ }
51
+ /**
52
+ * Save GitHub token to the credential store.
53
+ */
54
+ export function saveGitHubToken(db, token) {
55
+ setCredential(db, GITHUB_CONFIG_KEYS.token, token);
56
+ }
57
+ /**
58
+ * Save the GitHub repo configuration.
59
+ */
60
+ export function saveGitHubRepo(db, owner, repo) {
61
+ const settings = new SettingsStore(db);
62
+ settings.set(GITHUB_CONFIG_KEYS.owner, owner);
63
+ settings.set(GITHUB_CONFIG_KEYS.repo, repo);
64
+ }
65
+ /**
66
+ * Save the status label prefix.
67
+ */
68
+ export function saveGitHubStatusLabelPrefix(db, prefix) {
69
+ new SettingsStore(db).set(GITHUB_CONFIG_KEYS.statusLabelPrefix, prefix);
70
+ }
71
+ /**
72
+ * Clear all GitHub configuration from the database.
73
+ */
74
+ export function clearGitHubConfig(db) {
75
+ const settings = new SettingsStore(db);
76
+ for (const key of Object.values(GITHUB_CONFIG_KEYS)) {
77
+ if (key === GITHUB_CONFIG_KEYS.token) {
78
+ deleteCredential(db, key);
79
+ }
80
+ else {
81
+ settings.delete(key);
82
+ }
83
+ }
84
+ }
85
+ /**
86
+ * Get the GitHub token using the provider-sources resolution chain.
87
+ *
88
+ * Resolution order:
89
+ * 1. If a GitHub provider source is configured, resolve its apiKeyRef
90
+ * 2. GITHUB_TOKEN environment variable
91
+ * 3. Credential store key 'github.token'
92
+ */
93
+ export function getGitHubToken(db) {
94
+ // 1. Try provider sources (supports custom apiKeyRef per source)
95
+ try {
96
+ const sources = loadProviderSources(db);
97
+ for (const source of sources) {
98
+ if (source.provider === 'github') {
99
+ const key = resolveApiKey(db, source);
100
+ if (key)
101
+ return key;
102
+ }
103
+ }
104
+ }
105
+ catch {
106
+ // Provider sources table may not exist in older databases
107
+ }
108
+ // 2. GITHUB_TOKEN environment variable
109
+ const envToken = process.env.GITHUB_TOKEN;
110
+ if (envToken)
111
+ return envToken;
112
+ // 3. Stored credential
113
+ return getCredential(db, GITHUB_CONFIG_KEYS.token);
114
+ }
115
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/github/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * GitHub Issues Integration Types
3
+ *
4
+ * Type definitions for the GitHub Issues + Projects v2 integration.
5
+ * Uses labels for state mapping and open/closed for terminal states.
6
+ */
7
+ /**
8
+ * Represents a GitHub issue as returned by the REST API.
9
+ */
10
+ export interface GitHubIssue {
11
+ id: number;
12
+ number: number;
13
+ title: string;
14
+ body: string | null;
15
+ state: 'open' | 'closed';
16
+ labels: GitHubLabel[];
17
+ assignee: GitHubUser | null;
18
+ assignees: GitHubUser[];
19
+ milestone: GitHubMilestone | null;
20
+ html_url: string;
21
+ created_at: string;
22
+ updated_at: string;
23
+ closed_at: string | null;
24
+ }
25
+ export interface GitHubLabel {
26
+ id: number;
27
+ name: string;
28
+ color: string;
29
+ description: string | null;
30
+ }
31
+ export interface GitHubUser {
32
+ id: number;
33
+ login: string;
34
+ avatar_url: string;
35
+ html_url: string;
36
+ }
37
+ export interface GitHubMilestone {
38
+ id: number;
39
+ number: number;
40
+ title: string;
41
+ state: 'open' | 'closed';
42
+ }
43
+ export interface GitHubRepo {
44
+ id: number;
45
+ name: string;
46
+ full_name: string;
47
+ owner: GitHubUser;
48
+ html_url: string;
49
+ }
50
+ /**
51
+ * GitHub Issues connection configuration stored in workspace_settings.
52
+ */
53
+ export interface GitHubConfig {
54
+ token: string;
55
+ owner: string;
56
+ repo: string;
57
+ /** Optional: label prefix for state labels (e.g., "status:") */
58
+ statusLabelPrefix?: string;
59
+ }
60
+ /**
61
+ * Map GitHub issue labels to PMO state categories.
62
+ * These are the default label names that map to PMO categories.
63
+ * Users can customize via the statusLabelPrefix config.
64
+ */
65
+ export declare const GITHUB_LABEL_TO_PMO_CATEGORY: Record<string, string>;
66
+ /**
67
+ * Priority mapping between GitHub labels and PMO (P0-P3).
68
+ * GitHub doesn't have native priority — we use label conventions.
69
+ */
70
+ export declare const GITHUB_PRIORITY_LABELS: Record<string, string>;
71
+ export declare const PMO_PRIORITY_TO_GITHUB_LABEL: Record<string, string>;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * GitHub Issues Integration Types
3
+ *
4
+ * Type definitions for the GitHub Issues + Projects v2 integration.
5
+ * Uses labels for state mapping and open/closed for terminal states.
6
+ */
7
+ // =============================================================================
8
+ // Mapping Types
9
+ // =============================================================================
10
+ /**
11
+ * Map GitHub issue labels to PMO state categories.
12
+ * These are the default label names that map to PMO categories.
13
+ * Users can customize via the statusLabelPrefix config.
14
+ */
15
+ export const GITHUB_LABEL_TO_PMO_CATEGORY = {
16
+ 'in progress': 'started',
17
+ 'in review': 'started',
18
+ 'review': 'started',
19
+ 'todo': 'unstarted',
20
+ 'to do': 'unstarted',
21
+ 'backlog': 'backlog',
22
+ 'blocked': 'started',
23
+ 'done': 'completed',
24
+ 'closed': 'completed',
25
+ 'wontfix': 'canceled',
26
+ "won't fix": 'canceled',
27
+ 'duplicate': 'canceled',
28
+ 'invalid': 'canceled',
29
+ };
30
+ /**
31
+ * Priority mapping between GitHub labels and PMO (P0-P3).
32
+ * GitHub doesn't have native priority — we use label conventions.
33
+ */
34
+ export const GITHUB_PRIORITY_LABELS = {
35
+ 'priority: critical': 'P0',
36
+ 'priority: high': 'P1',
37
+ 'priority: medium': 'P2',
38
+ 'priority: low': 'P3',
39
+ 'P0': 'P0',
40
+ 'P1': 'P1',
41
+ 'P2': 'P2',
42
+ 'P3': 'P3',
43
+ };
44
+ export const PMO_PRIORITY_TO_GITHUB_LABEL = {
45
+ P0: 'priority: critical',
46
+ P1: 'priority: high',
47
+ P2: 'priority: medium',
48
+ P3: 'priority: low',
49
+ };
50
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/github/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqEH,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAA2B;IAClE,aAAa,EAAE,SAAS;IACxB,WAAW,EAAE,SAAS;IACtB,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,WAAW;IACpB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,WAAW;IACrB,SAAS,EAAE,UAAU;IACrB,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE,UAAU;IACvB,SAAS,EAAE,UAAU;CACtB,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAA2B;IAC5D,oBAAoB,EAAE,IAAI;IAC1B,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,eAAe,EAAE,IAAI;IACrB,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;CACX,CAAA;AAED,MAAM,CAAC,MAAM,4BAA4B,GAA2B;IAClE,EAAE,EAAE,oBAAoB;IACxB,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,kBAAkB;IACtB,EAAE,EAAE,eAAe;CACpB,CAAA"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Jira API Client
3
+ *
4
+ * REST wrapper for Jira Cloud (API v3) and Server (API v2).
5
+ * Uses Basic auth with email + API token (Cloud) or username + password (Server).
6
+ */
7
+ import type { JiraIssue, JiraTransition, JiraStatus, JiraProject, JiraUser } from './types.js';
8
+ export interface JiraClientOptions {
9
+ baseUrl: string;
10
+ email?: string;
11
+ apiToken: string;
12
+ /** API version: 3 for Cloud (default), 2 for Server */
13
+ apiVersion?: 2 | 3;
14
+ }
15
+ export declare class JiraClient {
16
+ private baseUrl;
17
+ private authHeader;
18
+ private apiBase;
19
+ constructor(options: JiraClientOptions);
20
+ private request;
21
+ /**
22
+ * Verify the credentials and return the authenticated user info.
23
+ */
24
+ verify(): Promise<{
25
+ displayName: string;
26
+ email?: string;
27
+ accountId?: string;
28
+ }>;
29
+ /**
30
+ * Get an issue by key or ID.
31
+ */
32
+ getIssue(issueKeyOrId: string): Promise<JiraIssue>;
33
+ /**
34
+ * Create a new issue.
35
+ */
36
+ createIssue(input: {
37
+ projectKey: string;
38
+ summary: string;
39
+ description?: string;
40
+ issueType?: string;
41
+ priority?: string;
42
+ labels?: string[];
43
+ assigneeId?: string;
44
+ }): Promise<JiraIssue>;
45
+ /**
46
+ * Update an issue's fields.
47
+ */
48
+ updateIssue(issueKeyOrId: string, input: {
49
+ summary?: string;
50
+ description?: string;
51
+ priority?: string;
52
+ labels?: string[];
53
+ }): Promise<void>;
54
+ /**
55
+ * Get available transitions for an issue.
56
+ */
57
+ getTransitions(issueKeyOrId: string): Promise<JiraTransition[]>;
58
+ /**
59
+ * Transition an issue to a new status.
60
+ * Jira requires using the transition ID, not the status name directly.
61
+ */
62
+ transitionIssue(issueKeyOrId: string, transitionId: string): Promise<void>;
63
+ /**
64
+ * Delete an issue (moves to trash in Jira Cloud).
65
+ */
66
+ deleteIssue(issueKeyOrId: string): Promise<void>;
67
+ /**
68
+ * Add a comment to an issue.
69
+ */
70
+ addComment(issueKeyOrId: string, commentBody: string): Promise<void>;
71
+ /**
72
+ * Search issues using JQL.
73
+ */
74
+ searchIssues(jql: string, options?: {
75
+ maxResults?: number;
76
+ startAt?: number;
77
+ fields?: string[];
78
+ }): Promise<{
79
+ issues: JiraIssue[];
80
+ total: number;
81
+ }>;
82
+ /**
83
+ * List all statuses available in the Jira instance.
84
+ */
85
+ listStatuses(): Promise<JiraStatus[]>;
86
+ /**
87
+ * List statuses for a specific project.
88
+ */
89
+ listProjectStatuses(projectKeyOrId: string): Promise<Array<{
90
+ id: string;
91
+ name: string;
92
+ statuses: JiraStatus[];
93
+ }>>;
94
+ /**
95
+ * List projects accessible to the authenticated user.
96
+ */
97
+ listProjects(options?: {
98
+ maxResults?: number;
99
+ }): Promise<JiraProject[]>;
100
+ /**
101
+ * Find a user by email or display name.
102
+ * Uses user search (Cloud) or user picker (Server).
103
+ */
104
+ findUser(query: string): Promise<JiraUser[]>;
105
+ /**
106
+ * Assign an issue to a user.
107
+ */
108
+ assignIssue(issueKeyOrId: string, accountId: string): Promise<void>;
109
+ /**
110
+ * Get the browse URL for an issue.
111
+ */
112
+ getBrowseUrl(issueKey: string): string;
113
+ }
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Jira API Client
3
+ *
4
+ * REST wrapper for Jira Cloud (API v3) and Server (API v2).
5
+ * Uses Basic auth with email + API token (Cloud) or username + password (Server).
6
+ */
7
+ export class JiraClient {
8
+ baseUrl;
9
+ authHeader;
10
+ apiBase;
11
+ constructor(options) {
12
+ // Normalize base URL — strip trailing slash
13
+ this.baseUrl = options.baseUrl.replace(/\/+$/, '');
14
+ const version = options.apiVersion ?? 3;
15
+ this.apiBase = `${this.baseUrl}/rest/api/${version}`;
16
+ // Basic auth: email:token (Cloud) or just token as bearer
17
+ if (options.email) {
18
+ const credentials = Buffer.from(`${options.email}:${options.apiToken}`).toString('base64');
19
+ this.authHeader = `Basic ${credentials}`;
20
+ }
21
+ else {
22
+ // Server may use Bearer token or personal access token
23
+ this.authHeader = `Bearer ${options.apiToken}`;
24
+ }
25
+ }
26
+ async request(method, path, body) {
27
+ const url = path.startsWith('http') ? path : `${this.apiBase}${path}`;
28
+ const options = {
29
+ method,
30
+ headers: {
31
+ 'Content-Type': 'application/json',
32
+ Accept: 'application/json',
33
+ Authorization: this.authHeader,
34
+ },
35
+ };
36
+ if (body !== undefined) {
37
+ options.body = JSON.stringify(body);
38
+ }
39
+ const response = await fetch(url, options);
40
+ if (!response.ok) {
41
+ const text = await response.text().catch(() => '');
42
+ throw new Error(`Jira API ${method} ${path} failed with status ${response.status}: ${text}`);
43
+ }
44
+ // Some endpoints return 204 No Content
45
+ if (response.status === 204) {
46
+ return undefined;
47
+ }
48
+ return (await response.json());
49
+ }
50
+ /**
51
+ * Verify the credentials and return the authenticated user info.
52
+ */
53
+ async verify() {
54
+ const user = await this.request('GET', '/myself');
55
+ return {
56
+ displayName: user.displayName,
57
+ email: user.emailAddress,
58
+ accountId: user.accountId,
59
+ };
60
+ }
61
+ /**
62
+ * Get an issue by key or ID.
63
+ */
64
+ async getIssue(issueKeyOrId) {
65
+ return this.request('GET', `/issue/${issueKeyOrId}?fields=summary,description,status,priority,issuetype,assignee,reporter,labels,project,created,updated,comment`);
66
+ }
67
+ /**
68
+ * Create a new issue.
69
+ */
70
+ async createIssue(input) {
71
+ const fields = {
72
+ project: { key: input.projectKey },
73
+ summary: input.summary,
74
+ issuetype: { name: input.issueType || 'Task' },
75
+ };
76
+ if (input.description) {
77
+ fields.description = input.description;
78
+ }
79
+ if (input.priority) {
80
+ fields.priority = { name: input.priority };
81
+ }
82
+ if (input.labels && input.labels.length > 0) {
83
+ fields.labels = input.labels;
84
+ }
85
+ if (input.assigneeId) {
86
+ fields.assignee = { accountId: input.assigneeId };
87
+ }
88
+ const created = await this.request('POST', '/issue', { fields });
89
+ // Fetch the full issue to return consistent data
90
+ return this.getIssue(created.key);
91
+ }
92
+ /**
93
+ * Update an issue's fields.
94
+ */
95
+ async updateIssue(issueKeyOrId, input) {
96
+ const fields = {};
97
+ if (input.summary !== undefined)
98
+ fields.summary = input.summary;
99
+ if (input.description !== undefined)
100
+ fields.description = input.description;
101
+ if (input.priority !== undefined)
102
+ fields.priority = { name: input.priority };
103
+ if (input.labels !== undefined)
104
+ fields.labels = input.labels;
105
+ if (Object.keys(fields).length > 0) {
106
+ await this.request('PUT', `/issue/${issueKeyOrId}`, { fields });
107
+ }
108
+ }
109
+ /**
110
+ * Get available transitions for an issue.
111
+ */
112
+ async getTransitions(issueKeyOrId) {
113
+ const data = await this.request('GET', `/issue/${issueKeyOrId}/transitions`);
114
+ return data.transitions;
115
+ }
116
+ /**
117
+ * Transition an issue to a new status.
118
+ * Jira requires using the transition ID, not the status name directly.
119
+ */
120
+ async transitionIssue(issueKeyOrId, transitionId) {
121
+ await this.request('POST', `/issue/${issueKeyOrId}/transitions`, { transition: { id: transitionId } });
122
+ }
123
+ /**
124
+ * Delete an issue (moves to trash in Jira Cloud).
125
+ */
126
+ async deleteIssue(issueKeyOrId) {
127
+ await this.request('DELETE', `/issue/${issueKeyOrId}`);
128
+ }
129
+ /**
130
+ * Add a comment to an issue.
131
+ */
132
+ async addComment(issueKeyOrId, commentBody) {
133
+ await this.request('POST', `/issue/${issueKeyOrId}/comment`, { body: commentBody });
134
+ }
135
+ /**
136
+ * Search issues using JQL.
137
+ */
138
+ async searchIssues(jql, options) {
139
+ const body = {
140
+ jql,
141
+ maxResults: options?.maxResults ?? 50,
142
+ startAt: options?.startAt ?? 0,
143
+ fields: options?.fields ?? [
144
+ 'summary', 'description', 'status', 'priority',
145
+ 'issuetype', 'assignee', 'reporter', 'labels',
146
+ 'project', 'created', 'updated',
147
+ ],
148
+ };
149
+ return this.request('POST', '/search', body);
150
+ }
151
+ /**
152
+ * List all statuses available in the Jira instance.
153
+ */
154
+ async listStatuses() {
155
+ return this.request('GET', '/status');
156
+ }
157
+ /**
158
+ * List statuses for a specific project.
159
+ */
160
+ async listProjectStatuses(projectKeyOrId) {
161
+ return this.request('GET', `/project/${projectKeyOrId}/statuses`);
162
+ }
163
+ /**
164
+ * List projects accessible to the authenticated user.
165
+ */
166
+ async listProjects(options) {
167
+ const params = new URLSearchParams();
168
+ if (options?.maxResults) {
169
+ params.set('maxResults', String(options.maxResults));
170
+ }
171
+ const qs = params.toString();
172
+ const path = `/project${qs ? `?${qs}` : ''}`;
173
+ return this.request('GET', path);
174
+ }
175
+ /**
176
+ * Find a user by email or display name.
177
+ * Uses user search (Cloud) or user picker (Server).
178
+ */
179
+ async findUser(query) {
180
+ const params = new URLSearchParams({ query, maxResults: '10' });
181
+ try {
182
+ // Cloud endpoint
183
+ return await this.request('GET', `/user/search?${params}`);
184
+ }
185
+ catch {
186
+ // Server fallback
187
+ try {
188
+ return await this.request('GET', `/user/picker?${params}`);
189
+ }
190
+ catch {
191
+ return [];
192
+ }
193
+ }
194
+ }
195
+ /**
196
+ * Assign an issue to a user.
197
+ */
198
+ async assignIssue(issueKeyOrId, accountId) {
199
+ await this.request('PUT', `/issue/${issueKeyOrId}/assignee`, { accountId });
200
+ }
201
+ /**
202
+ * Get the browse URL for an issue.
203
+ */
204
+ getBrowseUrl(issueKey) {
205
+ return `${this.baseUrl}/browse/${issueKey}`;
206
+ }
207
+ }
208
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/jira/client.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,15 @@ export declare function loadJiraConfig(db: Database.Database): JiraConfig | null
22
22
  * Save Jira configuration to the database.
23
23
  */
24
24
  export declare function saveJiraConfig(db: Database.Database, config: JiraConfig): void;
25
+ /**
26
+ * Get the Jira API token using the provider-sources resolution chain.
27
+ *
28
+ * Resolution order:
29
+ * 1. If a Jira provider source is configured, resolve its apiKeyRef
30
+ * 2. Legacy fallback: PRLT_JIRA_API_TOKEN or JIRA_API_TOKEN environment variables
31
+ * 3. Legacy fallback: credential store key 'jira.api_token'
32
+ */
33
+ export declare function getJiraApiToken(db: Database.Database): string | null;
25
34
  /**
26
35
  * Clear all Jira configuration from the database.
27
36
  */