jira-pilot 2.1.3 → 2.2.0
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.
- package/README.md +31 -0
- package/dist/src/commands/bulk.js +10 -9
- package/dist/src/commands/bulk.js.map +1 -1
- package/dist/src/commands/dashboard.js +8 -7
- package/dist/src/commands/dashboard.js.map +1 -1
- package/dist/src/commands/issue.js +34 -38
- package/dist/src/commands/issue.js.map +1 -1
- package/dist/src/server/mcp-server.js +209 -27
- package/dist/src/server/mcp-server.js.map +1 -1
- package/dist/src/services/api-service.d.ts +1 -1
- package/dist/src/services/api-service.js +9 -6
- package/dist/src/services/api-service.js.map +1 -1
- package/dist/src/utils/api-paths.d.ts +31 -0
- package/dist/src/utils/api-paths.js +32 -0
- package/dist/src/utils/api-paths.js.map +1 -0
- package/package.json +1 -1
- package/src/commands/bulk.ts +10 -9
- package/src/commands/dashboard.ts +9 -7
- package/src/commands/issue.ts +35 -38
- package/src/server/mcp-server.ts +234 -27
- package/src/services/api-service.ts +11 -6
- package/src/utils/api-paths.ts +32 -0
package/README.md
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/jira-pilot)
|
|
5
5
|
[](https://opensource.org/licenses/ISC)
|
|
6
6
|
[](https://snyk.io/test/github/Aarul5/jira-pilot)
|
|
7
|
+
[](https://lobehub.com/mcp/aarul5-jira-pilot)
|
|
7
8
|
|
|
8
9
|
**The AI-Powered Jira CLI and MCP Server for Humans and Agents.**
|
|
9
10
|
|
|
@@ -492,6 +493,36 @@ Add to your `.vscode/mcp.json` or equivalent:
|
|
|
492
493
|
}
|
|
493
494
|
```
|
|
494
495
|
|
|
496
|
+
### 📝 Prompts
|
|
497
|
+
|
|
498
|
+
Pre-defined templates to help LLMs interact with Jira effectively.
|
|
499
|
+
|
|
500
|
+
| Prompt | Arguments | Description |
|
|
501
|
+
|--------|-----------|-------------|
|
|
502
|
+
| **jira-assist** | None | System prompt that teaches the LLM how to use Jira Pilot tools best. |
|
|
503
|
+
| **jira-summarize-issue** | `issueKey` | Fetches an issue and instructs the LLM to provide a concise summary. |
|
|
504
|
+
|
|
505
|
+
### 📦 Resources
|
|
506
|
+
|
|
507
|
+
Direct access to Jira data as context.
|
|
508
|
+
|
|
509
|
+
| URI | Description |
|
|
510
|
+
|-----|-------------|
|
|
511
|
+
| **jira://myself** | Details of the currently authenticated user (excluding sensitive PII). |
|
|
512
|
+
| **jira://projects** | List of all accessible Jira projects. |
|
|
513
|
+
|
|
514
|
+
### 🔍 Verification
|
|
515
|
+
|
|
516
|
+
You can verify the MCP server implementation using the official inspector:
|
|
517
|
+
|
|
518
|
+
```bash
|
|
519
|
+
# If running fro source
|
|
520
|
+
npx @modelcontextprotocol/inspector node dist/bin/jira.js mcp
|
|
521
|
+
|
|
522
|
+
# If installed globally (or via npx)
|
|
523
|
+
npx @modelcontextprotocol/inspector npx -y jira-pilot mcp
|
|
524
|
+
```
|
|
525
|
+
|
|
495
526
|
---
|
|
496
527
|
|
|
497
528
|
## 📦 CLI Command Reference
|
|
@@ -4,6 +4,7 @@ import ora from '../utils/spinner.js';
|
|
|
4
4
|
import enquirer from 'enquirer';
|
|
5
5
|
import { api } from '../services/api-service.js';
|
|
6
6
|
import { handleCommandError } from '../utils/error-handler.js';
|
|
7
|
+
import { API } from '../utils/api-paths.js';
|
|
7
8
|
export function registerBulkCommand(program) {
|
|
8
9
|
const bulkCmd = new Command('bulk')
|
|
9
10
|
.description('Bulk operations on Jira issues')
|
|
@@ -27,7 +28,7 @@ Examples:
|
|
|
27
28
|
.action(async (options) => {
|
|
28
29
|
const spinner = ora('Finding matching issues...').start();
|
|
29
30
|
try {
|
|
30
|
-
const data = await api.post(
|
|
31
|
+
const data = await api.post(API.SEARCH.JQL, {
|
|
31
32
|
jql: options.jql,
|
|
32
33
|
maxResults: parseInt(options.limit),
|
|
33
34
|
fields: ['summary', 'status']
|
|
@@ -44,7 +45,7 @@ Examples:
|
|
|
44
45
|
let targetStatus = options.status;
|
|
45
46
|
if (!targetStatus) {
|
|
46
47
|
// Get transitions from the first issue to show available statuses
|
|
47
|
-
const transData = await api.get(
|
|
48
|
+
const transData = await api.get(API.ISSUE.TRANSITIONS(data.issues[0].key));
|
|
48
49
|
const { Select } = enquirer;
|
|
49
50
|
const statusSelect = new Select({
|
|
50
51
|
name: 'status',
|
|
@@ -69,10 +70,10 @@ Examples:
|
|
|
69
70
|
let failed = 0;
|
|
70
71
|
for (const issue of data.issues) {
|
|
71
72
|
try {
|
|
72
|
-
const transData = await api.get(
|
|
73
|
+
const transData = await api.get(API.ISSUE.TRANSITIONS(issue.key));
|
|
73
74
|
const transition = transData.transitions.find((t) => t.name.toLowerCase() === targetStatus.toLowerCase());
|
|
74
75
|
if (transition) {
|
|
75
|
-
await api.post(
|
|
76
|
+
await api.post(API.ISSUE.TRANSITIONS(issue.key), {
|
|
76
77
|
transition: { id: transition.id }
|
|
77
78
|
});
|
|
78
79
|
success++;
|
|
@@ -102,7 +103,7 @@ Examples:
|
|
|
102
103
|
.action(async (options) => {
|
|
103
104
|
const spinner = ora('Finding issues...').start();
|
|
104
105
|
try {
|
|
105
|
-
const data = await api.post(
|
|
106
|
+
const data = await api.post(API.SEARCH.JQL, {
|
|
106
107
|
jql: options.jql,
|
|
107
108
|
maxResults: 50,
|
|
108
109
|
fields: ['summary', 'assignee']
|
|
@@ -125,7 +126,7 @@ Examples:
|
|
|
125
126
|
assigneeId = userId;
|
|
126
127
|
}
|
|
127
128
|
if (assigneeId === 'me') {
|
|
128
|
-
const me = await api.get(
|
|
129
|
+
const me = await api.get(API.USER.MYSELF);
|
|
129
130
|
assigneeId = me.accountId;
|
|
130
131
|
}
|
|
131
132
|
if (!options.yes) {
|
|
@@ -139,7 +140,7 @@ Examples:
|
|
|
139
140
|
}
|
|
140
141
|
const processSpinner = ora('Assigning...').start();
|
|
141
142
|
for (const issue of data.issues) {
|
|
142
|
-
await api.put(
|
|
143
|
+
await api.put(API.ISSUE.ASSIGNEE(issue.key), { accountId: assigneeId });
|
|
143
144
|
}
|
|
144
145
|
processSpinner.succeed('Bulk assign complete.');
|
|
145
146
|
}
|
|
@@ -162,7 +163,7 @@ Examples:
|
|
|
162
163
|
}
|
|
163
164
|
const spinner = ora('Finding issues...').start();
|
|
164
165
|
try {
|
|
165
|
-
const data = await api.post(
|
|
166
|
+
const data = await api.post(API.SEARCH.JQL, {
|
|
166
167
|
jql: options.jql,
|
|
167
168
|
maxResults: 50,
|
|
168
169
|
fields: ['summary', 'labels']
|
|
@@ -190,7 +191,7 @@ Examples:
|
|
|
190
191
|
let newLabels = new Set(currentLabels);
|
|
191
192
|
addList.forEach((l) => newLabels.add(l));
|
|
192
193
|
removeList.forEach((l) => newLabels.delete(l));
|
|
193
|
-
await api.put(
|
|
194
|
+
await api.put(API.ISSUE.GET(issue.key), {
|
|
194
195
|
fields: { labels: Array.from(newLabels) }
|
|
195
196
|
});
|
|
196
197
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulk.js","sourceRoot":"","sources":["../../../src/commands/bulk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,qBAAqB,CAAC;AACtC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"bulk.js","sourceRoot":"","sources":["../../../src/commands/bulk.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import ora from '../utils/spinner.js';
|
|
|
4
4
|
import enquirer from 'enquirer';
|
|
5
5
|
import { api } from '../services/api-service.js';
|
|
6
6
|
import { handleCommandError } from '../utils/error-handler.js';
|
|
7
|
+
import { API } from '../utils/api-paths.js';
|
|
7
8
|
// Utility for status icons
|
|
8
9
|
const getStatusIcon = (status) => {
|
|
9
10
|
const s = status.toLowerCase();
|
|
@@ -69,10 +70,10 @@ export function registerDashboardCommand(program) {
|
|
|
69
70
|
console.clear();
|
|
70
71
|
const spinner = ora('Loading dashboard...').start();
|
|
71
72
|
try {
|
|
72
|
-
const myself = await api.get(
|
|
73
|
+
const myself = await api.get(API.USER.MYSELF);
|
|
73
74
|
// Fetch in parallel: my open issues + recently updated
|
|
74
75
|
const [myIssues, recentIssues] = await Promise.all([
|
|
75
|
-
api.post(
|
|
76
|
+
api.post(API.SEARCH.JQL, {
|
|
76
77
|
jql: 'assignee = currentUser() AND statusCategory != Done ORDER BY priority ASC, updated DESC', // Fixed Sort
|
|
77
78
|
maxResults: 15,
|
|
78
79
|
fields: ['summary', 'status', 'priority', 'updated', 'issuetype']
|
|
@@ -164,7 +165,7 @@ export function registerDashboardCommand(program) {
|
|
|
164
165
|
if (issueAction === 'back')
|
|
165
166
|
continue;
|
|
166
167
|
if (issueAction === 'view') {
|
|
167
|
-
const issue = await api.get(
|
|
168
|
+
const issue = await api.get(API.ISSUE.GET(selectedKey));
|
|
168
169
|
console.log(chalk.bold(`\n${issue.key}: ${issue.fields.summary}`));
|
|
169
170
|
console.log(chalk.grey('────────────────────────────────────────'));
|
|
170
171
|
console.log(`${getStatusIcon(issue.fields.status.name)} ${issue.fields.status.name} | ${getPriorityColor(issue.fields.priority?.name || '', issue.fields.priority?.name || '')}`);
|
|
@@ -179,25 +180,25 @@ export function registerDashboardCommand(program) {
|
|
|
179
180
|
});
|
|
180
181
|
if (inputComment) {
|
|
181
182
|
const { textToADF } = await import('../utils/text-to-adf.js');
|
|
182
|
-
await api.post(
|
|
183
|
+
await api.post(API.ISSUE.COMMENT(selectedKey), { body: textToADF(inputComment) });
|
|
183
184
|
console.log(chalk.green('Comment added.'));
|
|
184
185
|
await pause();
|
|
185
186
|
}
|
|
186
187
|
}
|
|
187
188
|
if (issueAction === 'transition') {
|
|
188
|
-
const transData = await api.get(
|
|
189
|
+
const transData = await api.get(API.ISSUE.TRANSITIONS(selectedKey));
|
|
189
190
|
const { transId } = await enquirer.prompt({
|
|
190
191
|
type: 'select',
|
|
191
192
|
name: 'transId',
|
|
192
193
|
message: 'Select Status:',
|
|
193
194
|
choices: transData.transitions.map((t) => ({ name: t.id, message: t.to.name }))
|
|
194
195
|
});
|
|
195
|
-
await api.post(
|
|
196
|
+
await api.post(API.ISSUE.TRANSITIONS(selectedKey), { transition: { id: transId } });
|
|
196
197
|
console.log(chalk.green('Transitioned.'));
|
|
197
198
|
await pause();
|
|
198
199
|
}
|
|
199
200
|
if (issueAction === 'assign') {
|
|
200
|
-
await api.put(
|
|
201
|
+
await api.put(API.ISSUE.ASSIGNEE(selectedKey), { accountId: myself.accountId });
|
|
201
202
|
console.log(chalk.green('Assigned to you.'));
|
|
202
203
|
await pause();
|
|
203
204
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/commands/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,GAAG,MAAM,qBAAqB,CAAC;AACtC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import { registerWorklogCommand } from './issue-worklog.js';
|
|
|
13
13
|
import { registerPrCommand } from './issue-pr.js';
|
|
14
14
|
import { registerAttachCommand } from './issue-attach.js';
|
|
15
15
|
import { ConfigService } from '../services/config-service.js';
|
|
16
|
+
import { API } from '../utils/api-paths.js';
|
|
16
17
|
export function registerIssueCommand(program) {
|
|
17
18
|
const issueCmd = new Command('issue')
|
|
18
19
|
.description('Manage Jira issues')
|
|
@@ -68,21 +69,16 @@ Examples:
|
|
|
68
69
|
if (options.jql)
|
|
69
70
|
jqlParts.push(options.jql);
|
|
70
71
|
// Order by updated desc by default if no JQL
|
|
71
|
-
if (!options.jql && jqlParts.length === 0) {
|
|
72
|
-
jqlParts.push('order by updated DESC');
|
|
73
|
-
}
|
|
74
|
-
else if (jqlParts.length > 0 && !options.jql) {
|
|
75
|
-
// Add order if not custom jql
|
|
76
|
-
// jqlParts.push('order by updated DESC');
|
|
77
|
-
}
|
|
78
72
|
const jql = jqlParts.join(' AND ');
|
|
79
|
-
|
|
73
|
+
// Default to last 30 days if no filter provided to satisfy "unbounded" check
|
|
74
|
+
const defaultJql = 'updated >= -30d ORDER BY updated DESC';
|
|
75
|
+
const finalJql = jql || defaultJql;
|
|
80
76
|
const body = {
|
|
81
|
-
jql:
|
|
77
|
+
jql: finalJql,
|
|
82
78
|
maxResults: parseInt(options.limit),
|
|
83
|
-
fields: ['summary', 'status', 'assignee', 'created', 'updated', 'description']
|
|
79
|
+
fields: ['summary', 'status', 'assignee', 'created', 'updated', 'description', 'priority', 'issuetype', 'project', 'reporter']
|
|
84
80
|
};
|
|
85
|
-
const data = await api.post(
|
|
81
|
+
const data = await api.post(API.SEARCH.JQL, body);
|
|
86
82
|
spinner.stop();
|
|
87
83
|
if (!data.issues || data.issues.length === 0) {
|
|
88
84
|
console.log(chalk.yellow('No issues found.'));
|
|
@@ -167,7 +163,7 @@ Examples:
|
|
|
167
163
|
}
|
|
168
164
|
const spinner = ora(`Fetching issue ${issueKey}...`).start();
|
|
169
165
|
try {
|
|
170
|
-
const issue = await api.get(
|
|
166
|
+
const issue = await api.get(API.ISSUE.GET(issueKey));
|
|
171
167
|
spinner.stop();
|
|
172
168
|
if (options.output === 'json') {
|
|
173
169
|
console.log(JSON.stringify({
|
|
@@ -242,7 +238,7 @@ Examples:
|
|
|
242
238
|
let projectKey = options.project;
|
|
243
239
|
if (!projectKey) {
|
|
244
240
|
const spinner = ora('Fetching projects...').start();
|
|
245
|
-
const projectData = await api.get(
|
|
241
|
+
const projectData = await api.get(API.PROJECT.SEARCH);
|
|
246
242
|
spinner.stop();
|
|
247
243
|
if (!projectData.values || projectData.values.length === 0) {
|
|
248
244
|
console.error(chalk.red('No projects found. Check your permissions.'));
|
|
@@ -267,13 +263,13 @@ Examples:
|
|
|
267
263
|
let issueTypes = [];
|
|
268
264
|
try {
|
|
269
265
|
// Jira Cloud v3 - createmeta endpoint
|
|
270
|
-
const metaData = await api.get(
|
|
266
|
+
const metaData = await api.get(API.ISSUE.CREATEMETA(projectKey));
|
|
271
267
|
issueTypes = metaData.issueTypes || metaData.values || [];
|
|
272
268
|
}
|
|
273
269
|
catch (metaErr) {
|
|
274
270
|
// Fallback: use project-level issue types
|
|
275
271
|
try {
|
|
276
|
-
const projectInfo = await api.get(
|
|
272
|
+
const projectInfo = await api.get(API.PROJECT.GET(projectKey));
|
|
277
273
|
issueTypes = projectInfo.issueTypes || [];
|
|
278
274
|
}
|
|
279
275
|
catch {
|
|
@@ -328,7 +324,7 @@ Examples:
|
|
|
328
324
|
if (!priorityName && !options.noInput) {
|
|
329
325
|
const spinner = ora('Fetching priorities...').start();
|
|
330
326
|
try {
|
|
331
|
-
const priorities = await api.get(
|
|
327
|
+
const priorities = await api.get(API.PRIORITY.ALL);
|
|
332
328
|
spinner.stop();
|
|
333
329
|
if (Array.isArray(priorities) && priorities.length > 0) {
|
|
334
330
|
const priorityChoices = priorities.map((p) => ({
|
|
@@ -355,7 +351,7 @@ Examples:
|
|
|
355
351
|
if (componentIds.length === 0 && !options.noInput) {
|
|
356
352
|
const compSpinner = ora('Fetching components...').start();
|
|
357
353
|
try {
|
|
358
|
-
const components = await api.get(
|
|
354
|
+
const components = await api.get(API.PROJECT.COMPONENTS(projectKey));
|
|
359
355
|
compSpinner.stop();
|
|
360
356
|
if (Array.isArray(components) && components.length > 0) {
|
|
361
357
|
const { selectedComponents } = await enquirer.prompt({
|
|
@@ -391,7 +387,7 @@ Examples:
|
|
|
391
387
|
if (fixVersionIds.length === 0 && !options.noInput) {
|
|
392
388
|
const verSpinner = ora('Fetching versions...').start();
|
|
393
389
|
try {
|
|
394
|
-
const versions = await api.get(
|
|
390
|
+
const versions = await api.get(API.PROJECT.VERSIONS(projectKey));
|
|
395
391
|
verSpinner.stop();
|
|
396
392
|
// Filter unreleased versions usually
|
|
397
393
|
const unreleased = versions.filter((v) => !v.released);
|
|
@@ -441,7 +437,7 @@ Examples:
|
|
|
441
437
|
if (assigneeChoice === 'me') {
|
|
442
438
|
const spinner = ora('Fetching your account...').start();
|
|
443
439
|
try {
|
|
444
|
-
const myself = await api.get(
|
|
440
|
+
const myself = await api.get(API.USER.MYSELF);
|
|
445
441
|
assigneeId = myself.accountId;
|
|
446
442
|
spinner.stop();
|
|
447
443
|
}
|
|
@@ -459,7 +455,7 @@ Examples:
|
|
|
459
455
|
if (searchQuery.trim()) {
|
|
460
456
|
const spinner = ora('Searching users...').start();
|
|
461
457
|
try {
|
|
462
|
-
const users = await api.get(
|
|
458
|
+
const users = await api.get(`${API.USER.SEARCH}?query=${encodeURIComponent(searchQuery)}`);
|
|
463
459
|
spinner.stop();
|
|
464
460
|
if (Array.isArray(users) && users.length > 0) {
|
|
465
461
|
const userChoices = users.map((u) => ({
|
|
@@ -493,7 +489,7 @@ Examples:
|
|
|
493
489
|
// --assignee me flag: resolve to account ID
|
|
494
490
|
const spinner = ora('Fetching your account...').start();
|
|
495
491
|
try {
|
|
496
|
-
const myself = await api.get(
|
|
492
|
+
const myself = await api.get(API.USER.MYSELF);
|
|
497
493
|
assigneeId = myself.accountId;
|
|
498
494
|
spinner.stop();
|
|
499
495
|
}
|
|
@@ -566,7 +562,7 @@ Examples:
|
|
|
566
562
|
}
|
|
567
563
|
// ── Create Issue ────────────────────────────────────
|
|
568
564
|
const spinner = ora('Creating issue...').start();
|
|
569
|
-
const result = await api.post(
|
|
565
|
+
const result = await api.post(API.ISSUE.BASE, issueBody);
|
|
570
566
|
spinner.succeed(chalk.green(`Issue created: ${chalk.bold(result.key)}`));
|
|
571
567
|
console.log(chalk.grey(`View it: jira issue view ${result.key}`));
|
|
572
568
|
}
|
|
@@ -595,10 +591,10 @@ Examples:
|
|
|
595
591
|
const spinner = ora(`Fetching transitions for ${issueKey}...`).start();
|
|
596
592
|
try {
|
|
597
593
|
// Fetch current issue to show context
|
|
598
|
-
const issue = await api.get(
|
|
594
|
+
const issue = await api.get(`${API.ISSUE.GET(issueKey)}?fields=summary,status`);
|
|
599
595
|
const currentStatus = issue.fields.status.name;
|
|
600
596
|
// Fetch available transitions
|
|
601
|
-
const transData = await api.get(
|
|
597
|
+
const transData = await api.get(API.ISSUE.TRANSITIONS(issueKey));
|
|
602
598
|
spinner.stop();
|
|
603
599
|
if (!transData.transitions || transData.transitions.length === 0) {
|
|
604
600
|
console.log(chalk.yellow(`No transitions available for ${issueKey} (current status: ${currentStatus}).`));
|
|
@@ -636,7 +632,7 @@ Examples:
|
|
|
636
632
|
}
|
|
637
633
|
// Execute transition
|
|
638
634
|
const execSpinner = ora(`Transitioning to "${targetTransition.to.name}"...`).start();
|
|
639
|
-
await api.post(
|
|
635
|
+
await api.post(API.ISSUE.TRANSITIONS(issueKey), {
|
|
640
636
|
transition: { id: targetTransition.id }
|
|
641
637
|
});
|
|
642
638
|
execSpinner.succeed(chalk.green(`${issueKey} transitioned: ${currentStatus} → ${chalk.bold(targetTransition.to.name)}`));
|
|
@@ -669,7 +665,7 @@ Examples:
|
|
|
669
665
|
if (!assigneeId) {
|
|
670
666
|
// Interactive selection
|
|
671
667
|
const spinner = ora(`Fetching issue ${issueKey}...`).start();
|
|
672
|
-
const issue = await api.get(
|
|
668
|
+
const issue = await api.get(`${API.ISSUE.GET(issueKey)}?fields=summary,assignee`);
|
|
673
669
|
spinner.stop();
|
|
674
670
|
const currentAssignee = issue.fields.assignee?.displayName || 'Unassigned';
|
|
675
671
|
console.log(chalk.bold(`\n${issue.key}: ${issue.fields.summary}`));
|
|
@@ -688,7 +684,7 @@ Examples:
|
|
|
688
684
|
}
|
|
689
685
|
if (assigneeId === 'me') {
|
|
690
686
|
const spinner = ora('Fetching your account...').start();
|
|
691
|
-
const myself = await api.get(
|
|
687
|
+
const myself = await api.get(API.USER.MYSELF);
|
|
692
688
|
assigneeId = myself.accountId;
|
|
693
689
|
spinner.stop();
|
|
694
690
|
}
|
|
@@ -699,7 +695,7 @@ Examples:
|
|
|
699
695
|
message: 'Search user by name or email:'
|
|
700
696
|
});
|
|
701
697
|
const spinner = ora('Searching users...').start();
|
|
702
|
-
const users = await api.get(
|
|
698
|
+
const users = await api.get(`${API.USER.SEARCH}?query=${encodeURIComponent(searchQuery)}`);
|
|
703
699
|
spinner.stop();
|
|
704
700
|
if (!Array.isArray(users) || users.length === 0) {
|
|
705
701
|
console.log(chalk.yellow('No users found.'));
|
|
@@ -720,7 +716,7 @@ Examples:
|
|
|
720
716
|
const body = assigneeId === 'none'
|
|
721
717
|
? { accountId: null }
|
|
722
718
|
: { accountId: assigneeId };
|
|
723
|
-
await api.put(
|
|
719
|
+
await api.put(API.ISSUE.ASSIGNEE(issueKey), body);
|
|
724
720
|
spinner.succeed(chalk.green(`${issueKey} ${assigneeId === 'none' ? 'unassigned' : 'assigned'} successfully.`));
|
|
725
721
|
}
|
|
726
722
|
catch (e) {
|
|
@@ -763,7 +759,7 @@ Examples:
|
|
|
763
759
|
commentText = inputComment;
|
|
764
760
|
}
|
|
765
761
|
const spinner = ora('Adding comment...').start();
|
|
766
|
-
await api.post(
|
|
762
|
+
await api.post(API.ISSUE.COMMENT(issueKey), {
|
|
767
763
|
body: textToADF(commentText)
|
|
768
764
|
});
|
|
769
765
|
spinner.succeed(chalk.green(`Comment added to ${issueKey}.`));
|
|
@@ -795,7 +791,7 @@ Examples:
|
|
|
795
791
|
}
|
|
796
792
|
const spinner = ora(`Fetching issue ${issueKey}...`).start();
|
|
797
793
|
try {
|
|
798
|
-
const issue = await api.get(
|
|
794
|
+
const issue = await api.get(`${API.ISSUE.GET(issueKey)}?fields=summary,description,priority`);
|
|
799
795
|
spinner.stop();
|
|
800
796
|
const updateBody = { fields: {} };
|
|
801
797
|
const hasFlags = options.summary || options.description || options.priority || (options.custom && options.custom.length > 0);
|
|
@@ -851,7 +847,7 @@ Examples:
|
|
|
851
847
|
updateBody.fields.description = textToADF(desc);
|
|
852
848
|
}
|
|
853
849
|
if (field === 'priority') {
|
|
854
|
-
const priorities = await api.get(
|
|
850
|
+
const priorities = await api.get(API.PRIORITY.ALL);
|
|
855
851
|
const prioSelect = new Select({
|
|
856
852
|
name: 'priority',
|
|
857
853
|
message: 'Select priority',
|
|
@@ -860,7 +856,7 @@ Examples:
|
|
|
860
856
|
updateBody.fields.priority = { name: await prioSelect.run() };
|
|
861
857
|
}
|
|
862
858
|
if (field === 'components') {
|
|
863
|
-
const components = await api.get(
|
|
859
|
+
const components = await api.get(API.PROJECT.COMPONENTS(issue.fields.project.key));
|
|
864
860
|
if (components.length > 0) {
|
|
865
861
|
const compSelect = new Select({
|
|
866
862
|
// Wait, fieldSelect was initialized from enquirer as any.
|
|
@@ -896,7 +892,7 @@ Examples:
|
|
|
896
892
|
updateBody.fields.labels = labelStr.split(',').map((l) => l.trim()).filter((l) => l.length > 0);
|
|
897
893
|
}
|
|
898
894
|
if (field === 'fixVersions') {
|
|
899
|
-
const versions = await api.get(
|
|
895
|
+
const versions = await api.get(API.PROJECT.VERSIONS(issue.fields.project.key));
|
|
900
896
|
const unreleased = versions.filter((v) => !v.released);
|
|
901
897
|
if (unreleased.length > 0) {
|
|
902
898
|
const { selectedVersions } = await enquirer.prompt({
|
|
@@ -924,7 +920,7 @@ Examples:
|
|
|
924
920
|
return;
|
|
925
921
|
}
|
|
926
922
|
const updateSpinner = ora('Updating issue...').start();
|
|
927
|
-
await api.put(
|
|
923
|
+
await api.put(API.ISSUE.GET(issueKey), updateBody);
|
|
928
924
|
updateSpinner.succeed(`${chalk.cyan(issueKey)} updated successfully`);
|
|
929
925
|
}
|
|
930
926
|
catch (e) {
|
|
@@ -952,7 +948,7 @@ Examples:
|
|
|
952
948
|
if (options.project)
|
|
953
949
|
jqlParts.push(`project = "${options.project}"`);
|
|
954
950
|
const jql = jqlParts.join(' AND ') + ' ORDER BY updated DESC';
|
|
955
|
-
const data = await api.post(
|
|
951
|
+
const data = await api.post(API.SEARCH.JQL, {
|
|
956
952
|
jql,
|
|
957
953
|
maxResults: parseInt(options.limit),
|
|
958
954
|
fields: ['summary', 'status', 'assignee', 'updated']
|
|
@@ -1132,7 +1128,7 @@ Examples:
|
|
|
1132
1128
|
catch (err) {
|
|
1133
1129
|
// Fallback to project fetch
|
|
1134
1130
|
try {
|
|
1135
|
-
const proj = await api.get(
|
|
1131
|
+
const proj = await api.get(API.PROJECT.GET(projectKey));
|
|
1136
1132
|
subtaskTypes = (proj.issueTypes || []).filter((t) => t.subtask);
|
|
1137
1133
|
}
|
|
1138
1134
|
catch (e) {
|
|
@@ -1188,7 +1184,7 @@ Examples:
|
|
|
1188
1184
|
issueBody.fields.assignee = { accountId: assigneeId };
|
|
1189
1185
|
}
|
|
1190
1186
|
const createSpinner = ora('Creating subtask...').start();
|
|
1191
|
-
const result = await api.post(
|
|
1187
|
+
const result = await api.post(API.ISSUE.BASE, issueBody);
|
|
1192
1188
|
createSpinner.succeed(chalk.green(`Subtask created: ${chalk.bold(result.key)}`));
|
|
1193
1189
|
}
|
|
1194
1190
|
catch (e) {
|