@proletariat/cli 0.3.97 → 0.3.99

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 (101) hide show
  1. package/dist/commands/orchestrate/index.js +30 -10
  2. package/dist/commands/orchestrate/index.js.map +1 -1
  3. package/dist/commands/ticket/create.js +35 -41
  4. package/dist/commands/ticket/create.js.map +1 -1
  5. package/dist/commands/watch/index.d.ts +28 -0
  6. package/dist/commands/watch/index.js +172 -0
  7. package/dist/commands/watch/index.js.map +1 -0
  8. package/dist/commands/work/complete.js +11 -6
  9. package/dist/commands/work/complete.js.map +1 -1
  10. package/dist/commands/work/linear.js +1 -1
  11. package/dist/commands/work/linear.js.map +1 -1
  12. package/dist/commands/work/ready.js +20 -5
  13. package/dist/commands/work/ready.js.map +1 -1
  14. package/dist/commands/work/ship.js +24 -9
  15. package/dist/commands/work/ship.js.map +1 -1
  16. package/dist/commands/work/start.js +95 -58
  17. package/dist/commands/work/start.js.map +1 -1
  18. package/dist/lib/asana/client.d.ts +4 -1
  19. package/dist/lib/asana/client.js +15 -0
  20. package/dist/lib/asana/client.js.map +1 -1
  21. package/dist/lib/asana/index.d.ts +1 -1
  22. package/dist/lib/asana/types.d.ts +4 -0
  23. package/dist/lib/database/credential-store.js +1 -0
  24. package/dist/lib/database/credential-store.js.map +1 -1
  25. package/dist/lib/execution/storage.d.ts +6 -0
  26. package/dist/lib/execution/storage.js +18 -0
  27. package/dist/lib/execution/storage.js.map +1 -1
  28. package/dist/lib/external-issues/index.d.ts +1 -0
  29. package/dist/lib/external-issues/index.js +2 -0
  30. package/dist/lib/external-issues/index.js.map +1 -1
  31. package/dist/lib/external-issues/linear.js +1 -1
  32. package/dist/lib/external-issues/linear.js.map +1 -1
  33. package/dist/lib/external-issues/ticket-builder.d.ts +21 -0
  34. package/dist/lib/external-issues/ticket-builder.js +43 -0
  35. package/dist/lib/external-issues/ticket-builder.js.map +1 -0
  36. package/dist/lib/external-issues/work-start.js +1 -1
  37. package/dist/lib/external-issues/work-start.js.map +1 -1
  38. package/dist/lib/gc/index.d.ts +8 -0
  39. package/dist/lib/gc/index.js +35 -2
  40. package/dist/lib/gc/index.js.map +1 -1
  41. package/dist/lib/github/client.d.ts +84 -0
  42. package/dist/lib/github/client.js +123 -0
  43. package/dist/lib/github/client.js.map +1 -0
  44. package/dist/lib/github/config.d.ts +42 -0
  45. package/dist/lib/github/config.js +115 -0
  46. package/dist/lib/github/config.js.map +1 -0
  47. package/dist/lib/github/types.d.ts +71 -0
  48. package/dist/lib/github/types.js +50 -0
  49. package/dist/lib/github/types.js.map +1 -0
  50. package/dist/lib/jira/client.d.ts +113 -0
  51. package/dist/lib/jira/client.js +208 -0
  52. package/dist/lib/jira/client.js.map +1 -0
  53. package/dist/lib/jira/config.d.ts +9 -0
  54. package/dist/lib/jira/config.js +30 -0
  55. package/dist/lib/jira/config.js.map +1 -1
  56. package/dist/lib/jira/index.d.ts +6 -2
  57. package/dist/lib/jira/index.js +4 -2
  58. package/dist/lib/jira/index.js.map +1 -1
  59. package/dist/lib/jira/types.d.ts +118 -0
  60. package/dist/lib/jira/types.js +45 -0
  61. package/dist/lib/jira/types.js.map +1 -0
  62. package/dist/lib/linear/config.d.ts +10 -0
  63. package/dist/lib/linear/config.js +33 -0
  64. package/dist/lib/linear/config.js.map +1 -1
  65. package/dist/lib/orchestrate/index.d.ts +2 -0
  66. package/dist/lib/orchestrate/index.js +1 -0
  67. package/dist/lib/orchestrate/index.js.map +1 -1
  68. package/dist/lib/orchestrate/simple-poller.d.ts +57 -0
  69. package/dist/lib/orchestrate/simple-poller.js +324 -0
  70. package/dist/lib/orchestrate/simple-poller.js.map +1 -0
  71. package/dist/lib/pmo/storage/index.js +16 -5
  72. package/dist/lib/pmo/storage/index.js.map +1 -1
  73. package/dist/lib/providers/asana-provider.d.ts +27 -0
  74. package/dist/lib/providers/asana-provider.js +426 -0
  75. package/dist/lib/providers/asana-provider.js.map +1 -0
  76. package/dist/lib/providers/auto-mapper.d.ts +1 -1
  77. package/dist/lib/providers/auto-mapper.js +23 -0
  78. package/dist/lib/providers/auto-mapper.js.map +1 -1
  79. package/dist/lib/providers/github-provider.d.ts +34 -0
  80. package/dist/lib/providers/github-provider.js +418 -0
  81. package/dist/lib/providers/github-provider.js.map +1 -0
  82. package/dist/lib/providers/index.d.ts +3 -0
  83. package/dist/lib/providers/index.js +3 -0
  84. package/dist/lib/providers/index.js.map +1 -1
  85. package/dist/lib/providers/jira-provider.d.ts +31 -0
  86. package/dist/lib/providers/jira-provider.js +383 -0
  87. package/dist/lib/providers/jira-provider.js.map +1 -0
  88. package/dist/lib/providers/linear-provider.js +6 -7
  89. package/dist/lib/providers/linear-provider.js.map +1 -1
  90. package/dist/lib/providers/resolver.js +54 -0
  91. package/dist/lib/providers/resolver.js.map +1 -1
  92. package/dist/lib/providers/types.d.ts +1 -1
  93. package/dist/lib/work-lifecycle/post-execution.js +26 -1
  94. package/dist/lib/work-lifecycle/post-execution.js.map +1 -1
  95. package/dist/lib/work-lifecycle/transition.js +24 -10
  96. package/dist/lib/work-lifecycle/transition.js.map +1 -1
  97. package/dist/lib/work-source/config.d.ts +1 -1
  98. package/dist/lib/work-source/config.js +11 -1
  99. package/dist/lib/work-source/config.js.map +1 -1
  100. package/oclif.manifest.json +225 -155
  101. package/package.json +1 -1
@@ -0,0 +1,123 @@
1
+ /**
2
+ * GitHub Issues API Client
3
+ *
4
+ * REST wrapper for GitHub Issues API access.
5
+ * Uses the GitHub REST API v3 (application/vnd.github+json).
6
+ * Auth via GITHUB_TOKEN or stored token.
7
+ */
8
+ const GITHUB_API_URL = 'https://api.github.com';
9
+ export class GitHubClient {
10
+ token;
11
+ constructor(token) {
12
+ this.token = token;
13
+ }
14
+ async request(method, path, body) {
15
+ const url = `${GITHUB_API_URL}${path}`;
16
+ const options = {
17
+ method,
18
+ headers: {
19
+ 'Accept': 'application/vnd.github+json',
20
+ 'Authorization': `Bearer ${this.token}`,
21
+ 'X-GitHub-Api-Version': '2022-11-28',
22
+ 'Content-Type': 'application/json',
23
+ },
24
+ };
25
+ if (body !== undefined) {
26
+ options.body = JSON.stringify(body);
27
+ }
28
+ const response = await fetch(url, options);
29
+ if (!response.ok) {
30
+ const text = await response.text().catch(() => '');
31
+ throw new Error(`GitHub API ${method} ${path} failed with status ${response.status}: ${text}`);
32
+ }
33
+ // DELETE returns 204 No Content
34
+ if (response.status === 204) {
35
+ return undefined;
36
+ }
37
+ return (await response.json());
38
+ }
39
+ /**
40
+ * Verify the token is valid and return the authenticated user info.
41
+ */
42
+ async verify() {
43
+ const data = await this.request('GET', '/user');
44
+ return { login: data.login, name: data.name };
45
+ }
46
+ /**
47
+ * Get a repository by owner and name.
48
+ */
49
+ async getRepo(owner, repo) {
50
+ return this.request('GET', `/repos/${owner}/${repo}`);
51
+ }
52
+ /**
53
+ * Get a single issue by number.
54
+ */
55
+ async getIssue(owner, repo, issueNumber) {
56
+ return this.request('GET', `/repos/${owner}/${repo}/issues/${issueNumber}`);
57
+ }
58
+ /**
59
+ * List issues for a repository.
60
+ */
61
+ async listIssues(owner, repo, options) {
62
+ const params = new URLSearchParams();
63
+ if (options?.state)
64
+ params.set('state', options.state);
65
+ if (options?.labels)
66
+ params.set('labels', options.labels);
67
+ if (options?.assignee)
68
+ params.set('assignee', options.assignee);
69
+ if (options?.milestone)
70
+ params.set('milestone', options.milestone);
71
+ params.set('per_page', String(options?.per_page ?? 100));
72
+ if (options?.page)
73
+ params.set('page', String(options.page));
74
+ const qs = params.toString();
75
+ const path = `/repos/${owner}/${repo}/issues${qs ? `?${qs}` : ''}`;
76
+ const results = await this.request('GET', path);
77
+ // Filter out pull requests (GitHub API returns PRs in issues endpoint)
78
+ return results.filter(issue => !('pull_request' in issue));
79
+ }
80
+ /**
81
+ * Create a new issue.
82
+ */
83
+ async createIssue(owner, repo, input) {
84
+ return this.request('POST', `/repos/${owner}/${repo}/issues`, input);
85
+ }
86
+ /**
87
+ * Update an existing issue.
88
+ */
89
+ async updateIssue(owner, repo, issueNumber, input) {
90
+ return this.request('PATCH', `/repos/${owner}/${repo}/issues/${issueNumber}`, input);
91
+ }
92
+ /**
93
+ * Add labels to an issue.
94
+ */
95
+ async addLabels(owner, repo, issueNumber, labels) {
96
+ return this.request('POST', `/repos/${owner}/${repo}/issues/${issueNumber}/labels`, { labels });
97
+ }
98
+ /**
99
+ * Remove a label from an issue.
100
+ */
101
+ async removeLabel(owner, repo, issueNumber, label) {
102
+ await this.request('DELETE', `/repos/${owner}/${repo}/issues/${issueNumber}/labels/${encodeURIComponent(label)}`);
103
+ }
104
+ /**
105
+ * List all labels for a repository.
106
+ */
107
+ async listRepoLabels(owner, repo) {
108
+ return this.request('GET', `/repos/${owner}/${repo}/labels?per_page=100`);
109
+ }
110
+ /**
111
+ * Create a label in a repository.
112
+ */
113
+ async createLabel(owner, repo, input) {
114
+ return this.request('POST', `/repos/${owner}/${repo}/labels`, input);
115
+ }
116
+ /**
117
+ * Add a comment to an issue.
118
+ */
119
+ async addComment(owner, repo, issueNumber, body) {
120
+ await this.request('POST', `/repos/${owner}/${repo}/issues/${issueNumber}/comments`, { body });
121
+ }
122
+ }
123
+ //# sourceMappingURL=client.js.map
@@ -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
+ }