jira-pilot 2.1.1 → 2.1.2

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 (87) hide show
  1. package/dist/bin/jira.d.ts +2 -0
  2. package/dist/bin/jira.js.map +1 -0
  3. package/dist/src/commands/ai-actions/plan.d.ts +1 -0
  4. package/dist/src/commands/ai-actions/plan.js +108 -0
  5. package/dist/src/commands/ai-actions/plan.js.map +1 -0
  6. package/dist/src/commands/ai-actions/review.d.ts +1 -0
  7. package/dist/src/commands/ai-actions/review.js +92 -0
  8. package/dist/src/commands/ai-actions/review.js.map +1 -0
  9. package/dist/src/commands/ai-actions/standup.d.ts +1 -0
  10. package/dist/src/commands/ai-actions/standup.js +33 -0
  11. package/dist/src/commands/ai-actions/standup.js.map +1 -0
  12. package/dist/src/commands/ai.d.ts +2 -0
  13. package/dist/src/commands/ai.js +196 -0
  14. package/dist/src/commands/ai.js.map +1 -0
  15. package/dist/src/commands/board.d.ts +2 -0
  16. package/dist/src/commands/board.js +66 -0
  17. package/dist/src/commands/board.js.map +1 -0
  18. package/dist/src/commands/bulk.d.ts +2 -0
  19. package/dist/src/commands/bulk.js +205 -0
  20. package/dist/src/commands/bulk.js.map +1 -0
  21. package/dist/src/commands/config.d.ts +2 -0
  22. package/dist/src/commands/config.js +248 -0
  23. package/dist/src/commands/config.js.map +1 -0
  24. package/dist/src/commands/dashboard.d.ts +2 -0
  25. package/dist/src/commands/dashboard.js +209 -0
  26. package/dist/src/commands/dashboard.js.map +1 -0
  27. package/dist/src/commands/filter.d.ts +2 -0
  28. package/dist/src/commands/filter.js +71 -0
  29. package/dist/src/commands/filter.js.map +1 -0
  30. package/dist/src/commands/git.d.ts +2 -0
  31. package/dist/src/commands/git.js +56 -0
  32. package/dist/src/commands/git.js.map +1 -0
  33. package/dist/src/commands/issue-attach.d.ts +2 -0
  34. package/dist/src/commands/issue-attach.js +41 -0
  35. package/dist/src/commands/issue-attach.js.map +1 -0
  36. package/dist/src/commands/issue-pr.d.ts +2 -0
  37. package/dist/src/commands/issue-pr.js +76 -0
  38. package/dist/src/commands/issue-pr.js.map +1 -0
  39. package/dist/src/commands/issue-worklog.d.ts +2 -0
  40. package/dist/src/commands/issue-worklog.js +83 -0
  41. package/dist/src/commands/issue-worklog.js.map +1 -0
  42. package/dist/src/commands/issue.d.ts +2 -0
  43. package/dist/src/commands/issue.js +1148 -0
  44. package/dist/src/commands/issue.js.map +1 -0
  45. package/dist/src/commands/mcp.d.ts +2 -0
  46. package/dist/src/commands/mcp.js +26 -0
  47. package/dist/src/commands/mcp.js.map +1 -0
  48. package/dist/src/commands/project.d.ts +2 -0
  49. package/dist/src/commands/project.js +53 -0
  50. package/dist/src/commands/project.js.map +1 -0
  51. package/dist/src/commands/sprint.d.ts +2 -0
  52. package/dist/src/commands/sprint.js +240 -0
  53. package/dist/src/commands/sprint.js.map +1 -0
  54. package/dist/src/server/mcp-server.d.ts +1 -0
  55. package/dist/src/server/mcp-server.js +505 -0
  56. package/dist/src/server/mcp-server.js.map +1 -0
  57. package/dist/src/services/ai-service.d.ts +12 -0
  58. package/dist/src/services/ai-service.js +151 -0
  59. package/dist/src/services/ai-service.js.map +1 -0
  60. package/dist/src/services/api-service.d.ts +18 -0
  61. package/dist/src/services/api-service.js +115 -0
  62. package/dist/src/services/api-service.js.map +1 -0
  63. package/dist/src/services/config-service.d.ts +6 -0
  64. package/dist/src/services/config-service.js +17 -0
  65. package/dist/src/services/config-service.js.map +1 -0
  66. package/dist/src/types.d.ts +90 -0
  67. package/dist/src/types.js +2 -0
  68. package/dist/src/types.js.map +1 -0
  69. package/dist/src/utils/adf-parser.d.ts +1 -0
  70. package/dist/src/utils/adf-parser.js +49 -0
  71. package/dist/src/utils/adf-parser.js.map +1 -0
  72. package/dist/src/utils/config-store.d.ts +15 -0
  73. package/dist/src/utils/config-store.js +98 -0
  74. package/dist/src/utils/config-store.js.map +1 -0
  75. package/dist/src/utils/config.d.ts +10 -0
  76. package/dist/src/utils/config.js +67 -0
  77. package/dist/src/utils/config.js.map +1 -0
  78. package/dist/src/utils/error-handler.d.ts +10 -0
  79. package/dist/src/utils/error-handler.js +44 -0
  80. package/dist/src/utils/error-handler.js.map +1 -0
  81. package/dist/src/utils/text-to-adf.d.ts +18 -0
  82. package/dist/src/utils/text-to-adf.js +33 -0
  83. package/dist/src/utils/text-to-adf.js.map +1 -0
  84. package/dist/src/utils/validators.d.ts +38 -0
  85. package/dist/src/utils/validators.js +77 -0
  86. package/dist/src/utils/validators.js.map +1 -0
  87. package/package.json +3 -2
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.js","sourceRoot":"","sources":["../../bin/jira.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function planAction(epicKey: string, options: any): Promise<void>;
@@ -0,0 +1,108 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import enquirer from 'enquirer';
4
+ import { api } from '../../services/api-service.js';
5
+ import { aiService } from '../../services/ai-service.js';
6
+ import { validateIssueKey } from '../../utils/validators.js';
7
+ import { parseADF } from '../../utils/adf-parser.js';
8
+ import { handleCommandError } from '../../utils/error-handler.js';
9
+ export async function planAction(epicKey, options) {
10
+ const check = validateIssueKey(epicKey);
11
+ if (!check.valid) {
12
+ console.error(chalk.red(check.message));
13
+ return;
14
+ }
15
+ const spinner = ora(`Fetching Epic ${epicKey}...`).start();
16
+ try {
17
+ const issue = await api.get(`/issue/${epicKey}`);
18
+ const summary = issue.fields.summary;
19
+ const description = issue.fields.description ? parseADF(issue.fields.description) : 'No description';
20
+ const projectKey = issue.fields.project.key;
21
+ spinner.text = 'AI is breaking down the Epic...';
22
+ const plan = await aiService.breakdownEpic(summary, description);
23
+ spinner.stop();
24
+ if (!plan || plan.length === 0) {
25
+ console.log(chalk.yellow('AI could not generate a plan.'));
26
+ return;
27
+ }
28
+ console.log(chalk.cyan(`\nProposed Breakdown for ${epicKey} (${summary}):\n`));
29
+ // Let user select items to create
30
+ const choices = plan.map((item, index) => ({
31
+ name: `${item.type}: ${item.summary}`,
32
+ value: index, // store index to retrieve item
33
+ checked: true
34
+ }));
35
+ const { selectedIndices } = await enquirer.prompt({
36
+ type: 'multiselect',
37
+ name: 'selectedIndices',
38
+ message: 'Select issues to create:',
39
+ choices: choices.map((c, i) => ({ ...c, value: i })), // ensure value is index
40
+ result(names) {
41
+ // map names back to indices
42
+ return names.map((name) => this.map(name)); // 'this.map' returns value (index)
43
+ }
44
+ });
45
+ // Loop through selected and create
46
+ // Convert map result (object/array) to array of indices
47
+ const indicesToCreate = Object.values(selectedIndices);
48
+ if (indicesToCreate.length === 0) {
49
+ console.log(chalk.yellow('No items selected.'));
50
+ return;
51
+ }
52
+ console.log(chalk.dim('\nCreating issues...'));
53
+ const results = [];
54
+ for (const idx of indicesToCreate) {
55
+ const item = plan[idx];
56
+ const itemSpinner = ora(`Creating ${item.type}: ${item.summary}`).start();
57
+ try {
58
+ const payload = {
59
+ fields: {
60
+ project: { key: projectKey },
61
+ summary: item.summary,
62
+ // description: item.description, // Simple string, Jira converts to ADF or accepts text depending on config.
63
+ // Note: v3 API often needs ADF. If description is simple text, it might fail.
64
+ // We should construct a basic paragraph ADF document.
65
+ description: {
66
+ version: 1,
67
+ type: 'doc',
68
+ content: [{
69
+ type: 'paragraph',
70
+ content: [{ type: 'text', text: item.description || '' }]
71
+ }]
72
+ },
73
+ issuetype: { name: item.type },
74
+ parent: { key: epicKey } // Try to link to Epic
75
+ }
76
+ };
77
+ const res = await api.post('/issue', payload);
78
+ itemSpinner.succeed(`${res.key} created.`);
79
+ results.push(res.key);
80
+ }
81
+ catch (e) {
82
+ itemSpinner.fail(`Failed to create ${item.summary}.`);
83
+ // Fallback: try without description if ADF error
84
+ try {
85
+ const payloadNoDesc = {
86
+ fields: {
87
+ project: { key: projectKey },
88
+ summary: item.summary,
89
+ issuetype: { name: item.type },
90
+ parent: { key: epicKey }
91
+ }
92
+ };
93
+ const res = await api.post('/issue', payloadNoDesc);
94
+ itemSpinner.succeed(`${res.key} created (without description).`);
95
+ results.push(res.key);
96
+ }
97
+ catch (e2) {
98
+ // ignore
99
+ }
100
+ }
101
+ }
102
+ console.log(chalk.green(`\nDone! Created ${results.length} issues linked to ${epicKey}.`));
103
+ }
104
+ catch (e) {
105
+ handleCommandError(spinner, e, `Failed to plan ${epicKey}`);
106
+ }
107
+ }
108
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../src/commands/ai-actions/plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,OAAY;IAC1D,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,OAAO,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAE3D,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACrC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACrG,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QAE5C,OAAO,CAAC,IAAI,GAAG,iCAAiC,CAAC;QAEjD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEjE,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC;YAC3D,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,OAAO,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;QAE/E,kCAAkC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;YACpD,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE;YACrC,KAAK,EAAE,KAAK,EAAE,+BAA+B;YAC7C,OAAO,EAAE,IAAI;SAChB,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YAC9C,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,0BAA0B;YACnC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,wBAAwB;YAC3F,MAAM,CAAC,KAAU;gBACb,4BAA4B;gBAC5B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAE,IAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,mCAAmC;YACjG,CAAC;SACJ,CAAQ,CAAC;QAEV,mCAAmC;QACnC,wDAAwD;QACxD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAa,CAAC;QAEnE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAChD,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YAE1E,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG;oBACZ,MAAM,EAAE;wBACJ,OAAO,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE;wBAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,8GAA8G;wBAC9G,8EAA8E;wBAC9E,sDAAsD;wBACtD,WAAW,EAAE;4BACT,OAAO,EAAE,CAAC;4BACV,IAAI,EAAE,KAAK;4BACX,OAAO,EAAE,CAAC;oCACN,IAAI,EAAE,WAAW;oCACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;iCAC5D,CAAC;yBACL;wBACD,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;wBAC9B,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,sBAAsB;qBAClD;iBACJ,CAAC;gBAEF,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC9C,WAAW,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,WAAW,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACtD,iDAAiD;gBACjD,IAAI,CAAC;oBACD,MAAM,aAAa,GAAG;wBAClB,MAAM,EAAE;4BACJ,OAAO,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE;4BAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;4BACrB,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;4BAC9B,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;yBAC3B;qBACJ,CAAC;oBACF,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;oBACpD,WAAW,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,iCAAiC,CAAC,CAAC;oBACjE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1B,CAAC;gBAAC,OAAO,EAAE,EAAE,CAAC;oBACV,SAAS;gBACb,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,MAAM,qBAAqB,OAAO,GAAG,CAAC,CAAC,CAAC;IAE/F,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,kBAAkB,CAAC,OAAO,EAAE,CAAC,EAAE,kBAAkB,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function reviewAction(issueKey: string, options: any): Promise<void>;
@@ -0,0 +1,92 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import axios from 'axios';
4
+ import { execSync } from 'child_process';
5
+ import { api } from '../../services/api-service.js';
6
+ import { aiService } from '../../services/ai-service.js';
7
+ import { validateIssueKey } from '../../utils/validators.js';
8
+ import { getCredentials } from '../../utils/config.js';
9
+ import { parseADF } from '../../utils/adf-parser.js';
10
+ import { handleCommandError } from '../../utils/error-handler.js';
11
+ export async function reviewAction(issueKey, options) {
12
+ const check = validateIssueKey(issueKey);
13
+ if (!check.valid) {
14
+ console.error(chalk.red(check.message));
15
+ return;
16
+ }
17
+ const { githubToken } = getCredentials();
18
+ if (!githubToken) {
19
+ console.error(chalk.red('GitHub Token not found. Run "jira config setup" or manually add githubToken to config.'));
20
+ return;
21
+ }
22
+ const spinner = ora(`Fetching issue ${issueKey} and searching for PRs...`).start();
23
+ try {
24
+ // 1. Fetch Issue Context
25
+ const issue = await api.get(`/issue/${issueKey}?fields=summary,description,acceptanceCriteria`); // basic fields
26
+ const summary = issue.fields.summary;
27
+ const description = issue.fields.description ? parseADF(issue.fields.description) : 'No description';
28
+ const context = `Title: ${summary}\nDescription: ${description}`;
29
+ // 2. Determine GitHub Repo from local git
30
+ let repoOwner, repoName;
31
+ try {
32
+ const remoteUrl = execSync('git remote get-url origin', { encoding: 'utf8' }).trim();
33
+ // Parse: https://github.com/owner/repo.git or git@github.com:owner/repo.git
34
+ const match = remoteUrl.match(/github\.com[:/]([^/]+)\/([^.]+)/);
35
+ if (match) {
36
+ repoOwner = match[1];
37
+ repoName = match[2];
38
+ }
39
+ }
40
+ catch (e) {
41
+ // Ignore, maybe not in a repo
42
+ }
43
+ if (!repoOwner || !repoName) {
44
+ spinner.fail('Could not detect GitHub repository from "git remote get-url origin".');
45
+ console.log(chalk.yellow('Ensure you are in the git repository folder.'));
46
+ return;
47
+ }
48
+ spinner.text = `Searching PRs in ${repoOwner}/${repoName} for ${issueKey}...`;
49
+ // 3. Search GitHub PRs
50
+ // We search for PRs that mention the issue key in title or branch name
51
+ const searchRes = await axios.get(`https://api.github.com/search/issues`, {
52
+ params: {
53
+ q: `repo:${repoOwner}/${repoName} is:pr ${issueKey}`
54
+ },
55
+ headers: {
56
+ 'Authorization': `token ${githubToken}`,
57
+ 'Accept': 'application/vnd.github.v3+json'
58
+ }
59
+ });
60
+ const prs = searchRes.data.items;
61
+ if (prs.length === 0) {
62
+ spinner.fail(`No open PRs found for ${issueKey} in ${repoOwner}/${repoName}.`);
63
+ return;
64
+ }
65
+ // Use the most recent PR
66
+ const pr = prs[0];
67
+ spinner.text = `Analyzing PR #${pr.number}: ${pr.title}...`;
68
+ // 4. Fetch Diff
69
+ const diffRes = await axios.get(pr.pull_request.url, {
70
+ headers: {
71
+ 'Authorization': `token ${githubToken}`,
72
+ 'Accept': 'application/vnd.github.v3.diff'
73
+ }
74
+ });
75
+ const diff = diffRes.data;
76
+ if (!diff) {
77
+ spinner.fail('Empty diff or failed to fetch diff.');
78
+ return;
79
+ }
80
+ // 5. AI Review
81
+ spinner.text = 'AI is reviewing the code changes...';
82
+ const review = await aiService.reviewCode(diff, context);
83
+ spinner.stop();
84
+ console.log(chalk.green(`\n🤖 AI Code Review for PR #${pr.number} (${issueKey}):\n`));
85
+ console.log(review);
86
+ console.log(chalk.dim(`\nPR Link: ${pr.html_url}`));
87
+ }
88
+ catch (e) {
89
+ handleCommandError(spinner, e, `Failed to review ${issueKey}`);
90
+ }
91
+ }
92
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../../src/commands/ai-actions/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function standupAction(options: any): Promise<void>;
@@ -0,0 +1,33 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { api } from '../../services/api-service.js';
4
+ import { aiService } from '../../services/ai-service.js';
5
+ import { handleCommandError } from '../../utils/error-handler.js';
6
+ export async function standupAction(options) {
7
+ const spinner = ora('Analyzing your recent activity...').start();
8
+ try {
9
+ // 1. Fetch User Info
10
+ const myself = await api.get('/myself');
11
+ const accountId = myself.accountId;
12
+ const displayName = myself.displayName;
13
+ // 2. Fetch Issues Updated/Commented by User in last 24h
14
+ // JQL: updated >= -24h AND (assignee = currentUser() OR watcher = currentUser() OR comment ~ currentUser())
15
+ // Simplification: JQL: assignee = currentUser() AND updated >= -1d
16
+ const yesterdayJql = `assignee = currentUser() AND updated >= -1d ORDER BY updated DESC`;
17
+ const yesterdayIssuesRes = await api.get(`/search?jql=${encodeURIComponent(yesterdayJql)}&fields=summary,status,comment,worklog`);
18
+ const yesterdayIssues = yesterdayIssuesRes.issues.map((i) => `- ${i.key} ${i.fields.summary} (${i.fields.status.name})`).join('\n');
19
+ // 3. Fetch Issues Assigned for Today (In Progress or To Do)
20
+ const todayJql = `assignee = currentUser() AND statusCategory IN ("To Do", "In Progress") ORDER BY priority DESC`;
21
+ const todayIssuesRes = await api.get(`/search?jql=${encodeURIComponent(todayJql)}&fields=summary,status,priority`);
22
+ const todayIssues = todayIssuesRes.issues.map((i) => `- ${i.key} ${i.fields.summary} [${i.fields.priority.name}]`).join('\n');
23
+ spinner.text = 'Generating standup report...';
24
+ const report = await aiService.generateStandup(yesterdayIssues, todayIssues);
25
+ spinner.stop();
26
+ console.log(chalk.green(`\n📢 Standup Report for ${displayName}:\n`));
27
+ console.log(report);
28
+ }
29
+ catch (e) {
30
+ handleCommandError(spinner, e, 'Failed to generate standup');
31
+ }
32
+ }
33
+ //# sourceMappingURL=standup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standup.js","sourceRoot":"","sources":["../../../../src/commands/ai-actions/standup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAY;IAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,mCAAmC,CAAC,CAAC,KAAK,EAAE,CAAC;IAEjE,IAAI,CAAC;QACD,qBAAqB;QACrB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAEvC,wDAAwD;QACxD,4GAA4G;QAC5G,mEAAmE;QACnE,MAAM,YAAY,GAAG,mEAAmE,CAAC;QAEzF,MAAM,kBAAkB,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,eAAe,kBAAkB,CAAC,YAAY,CAAC,wCAAwC,CAAC,CAAC;QAClI,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzI,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,gGAAgG,CAAC;QAClH,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,eAAe,kBAAkB,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;QACnH,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnI,OAAO,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAE9C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAE7E,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,WAAW,KAAK,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAExB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,kBAAkB,CAAC,OAAO,EAAE,CAAC,EAAE,4BAA4B,CAAC,CAAC;IACjE,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAiCommand(program: Command): void;
@@ -0,0 +1,196 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import enquirer from 'enquirer';
5
+ import { api } from '../services/api-service.js';
6
+ import { aiService } from '../services/ai-service.js';
7
+ import { parseADF } from '../utils/adf-parser.js';
8
+ import { validateIssueKey } from '../utils/validators.js';
9
+ import { handleCommandError } from '../utils/error-handler.js';
10
+ import { reviewAction } from './ai-actions/review.js';
11
+ import { planAction } from './ai-actions/plan.js';
12
+ import { standupAction } from './ai-actions/standup.js';
13
+ export function registerAiCommand(program) {
14
+ const aiCmd = new Command('ai')
15
+ .description('AI Helper commands')
16
+ .addHelpText('after', `
17
+ Common Actions:
18
+ $ jira ai summarize <KEY> # Summarize an issue
19
+ $ jira ai draft # Draft an issue description from bullet points
20
+ $ jira ai suggest <KEY> # Suggest next actions for an issue
21
+ `);
22
+ // ── SUMMARIZE ─────────────────────────────────────────────────────
23
+ aiCmd
24
+ .command('summarize')
25
+ .description('Summarize an issue using AI')
26
+ .argument('<issueKey>', 'Jira Issue Key')
27
+ .action(async (issueKey) => {
28
+ const check = validateIssueKey(issueKey);
29
+ if (!check.valid) {
30
+ console.error(chalk.red(check.message));
31
+ return;
32
+ }
33
+ const spinner = ora(`Fetching issue ${issueKey}...`).start();
34
+ try {
35
+ const issue = await api.get(`/issue/${issueKey}?fields=summary,description,comment`);
36
+ spinner.text = 'Generating summary...';
37
+ const summary = issue.fields.summary;
38
+ const description = issue.fields.description
39
+ ? parseADF(issue.fields.description)
40
+ : 'No description';
41
+ const comments = (issue.fields.comment?.comments || [])
42
+ .map((c) => `${c.author.displayName}: ${typeof c.body === 'object' ? parseADF(c.body) : c.body}`)
43
+ .join('\n');
44
+ const prompt = `
45
+ You are a helpful Jira assistant. Please summarize the following Jira issue.
46
+
47
+ Title: ${summary}
48
+ Description: ${description}
49
+
50
+ Comments:
51
+ ${comments || 'No comments'}
52
+
53
+ Provide a concise summary of the current status, key discussion points, and next steps if clear.
54
+ `;
55
+ const aiResponse = await aiService.generate(prompt);
56
+ spinner.stop();
57
+ console.log(chalk.green(`\n🤖 AI Summary for ${issueKey}:\n`));
58
+ console.log(aiResponse);
59
+ }
60
+ catch (e) {
61
+ handleCommandError(spinner, e, `Failed to summarize ${issueKey}`);
62
+ }
63
+ });
64
+ // ── DRAFT ─────────────────────────────────────────────────────────
65
+ aiCmd
66
+ .command('draft')
67
+ .description('Draft a structured issue description from bullet points')
68
+ .option('-i, --input <text>', 'Bullet points or rough notes (alternative to interactive prompt)')
69
+ .option('-t, --type <type>', 'Issue type context (bug, story, task)', 'task')
70
+ .addHelpText('after', `
71
+ Examples:
72
+ $ jira ai draft # Interactive
73
+ $ jira ai draft -i "login fails, returns 500, only on mobile"
74
+ $ jira ai draft -i "add dark mode toggle" -t story
75
+ `)
76
+ .action(async (options) => {
77
+ try {
78
+ let bulletPoints = options.input;
79
+ if (!bulletPoints) {
80
+ const { inputNotes } = await enquirer.prompt({
81
+ type: 'input',
82
+ name: 'inputNotes',
83
+ message: 'Enter your bullet points or rough notes:',
84
+ validate: (val) => val.trim().length > 0 || 'Input cannot be empty'
85
+ });
86
+ bulletPoints = inputNotes;
87
+ }
88
+ const issueType = options.type || 'task';
89
+ const spinner = ora('Drafting description...').start();
90
+ const prompt = `
91
+ You are a Jira expert. Given the following rough notes/bullet points, generate a well-structured Jira issue description.
92
+
93
+ Issue Type: ${issueType}
94
+ Notes: ${bulletPoints}
95
+
96
+ Format the output as follows:
97
+ ## Summary
98
+ A clear one-line summary for the issue title.
99
+
100
+ ## Description
101
+ A well-structured description with:
102
+ - Context / Background
103
+ - Expected Behavior (if applicable)
104
+ - Steps to Reproduce (if it's a bug)
105
+ - Acceptance Criteria (if it's a story)
106
+
107
+ Keep it professional and concise. Output in plain text (not markdown headers, use plain labels).
108
+ `;
109
+ const aiResponse = await aiService.generate(prompt);
110
+ spinner.stop();
111
+ console.log(chalk.green('\n✍️ AI-Generated Draft:\n'));
112
+ console.log(aiResponse);
113
+ console.log(chalk.grey('\nTip: Copy this into "jira issue create" or use it as a starting point.'));
114
+ }
115
+ catch (e) {
116
+ handleCommandError(null, e, 'Failed to generate draft');
117
+ }
118
+ });
119
+ // ── SUGGEST ───────────────────────────────────────────────────────
120
+ aiCmd
121
+ .command('suggest')
122
+ .description('Suggest next actions for an issue based on its context')
123
+ .argument('<issueKey>', 'Jira Issue Key')
124
+ .action(async (issueKey) => {
125
+ const check = validateIssueKey(issueKey);
126
+ if (!check.valid) {
127
+ console.error(chalk.red(check.message));
128
+ return;
129
+ }
130
+ const spinner = ora(`Analyzing issue ${issueKey}...`).start();
131
+ try {
132
+ const issue = await api.get(`/issue/${issueKey}?fields=summary,description,status,assignee,priority,comment,issuetype`);
133
+ const summary = issue.fields.summary;
134
+ const description = issue.fields.description
135
+ ? parseADF(issue.fields.description)
136
+ : 'No description';
137
+ const status = issue.fields.status?.name || 'Unknown';
138
+ const issueType = issue.fields.issuetype?.name || 'Unknown';
139
+ const priority = issue.fields.priority?.name || 'None';
140
+ const assignee = issue.fields.assignee?.displayName || 'Unassigned';
141
+ const comments = (issue.fields.comment?.comments || [])
142
+ .slice(-5) // Last 5 comments for context
143
+ .map((c) => `${c.author.displayName}: ${typeof c.body === 'object' ? parseADF(c.body) : c.body}`)
144
+ .join('\n');
145
+ spinner.text = 'Generating suggestions...';
146
+ const prompt = `
147
+ You are a senior software engineer and Jira workflow expert. Analyze the following Jira issue and suggest practical next actions.
148
+
149
+ Issue Key: ${issueKey}
150
+ Type: ${issueType}
151
+ Status: ${status}
152
+ Priority: ${priority}
153
+ Assignee: ${assignee}
154
+ Title: ${summary}
155
+ Description: ${description}
156
+
157
+ Recent Comments:
158
+ ${comments || 'No comments'}
159
+
160
+ Based on the current status and context, suggest:
161
+ 1. **Immediate Next Action** — What should be done right now?
162
+ 2. **Potential Blockers** — Are there any risks or dependencies to watch?
163
+ 3. **Suggested Status Transition** — Should this issue be moved to a different status?
164
+ 4. **Recommendations** — Any other advice for this issue?
165
+
166
+ Keep suggestions actionable and concise.
167
+ `;
168
+ const aiResponse = await aiService.generate(prompt);
169
+ spinner.stop();
170
+ console.log(chalk.green(`\n💡 AI Suggestions for ${issueKey}:\n`));
171
+ console.log(aiResponse);
172
+ }
173
+ catch (e) {
174
+ handleCommandError(spinner, e, `Failed to suggest for ${issueKey}`);
175
+ }
176
+ });
177
+ // ── REVIEW ────────────────────────────────────────────────────────
178
+ aiCmd
179
+ .command('review')
180
+ .description('Analyze linked code/PRs for an issue')
181
+ .argument('<issueKey>', 'Jira Issue Key')
182
+ .action(reviewAction);
183
+ // ── PLAN ──────────────────────────────────────────────────────────
184
+ aiCmd
185
+ .command('plan')
186
+ .description('Break down an Epic into child stories/tasks')
187
+ .argument('<epicKey>', 'Epic Issue Key')
188
+ .action(planAction);
189
+ // ── STANDUP ───────────────────────────────────────────────────────
190
+ aiCmd
191
+ .command('standup')
192
+ .description('Generate a daily standup report from activity')
193
+ .action(standupAction);
194
+ program.addCommand(aiCmd);
195
+ }
196
+ //# sourceMappingURL=ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../../src/commands/ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerBoardCommand(program: Command): void;
@@ -0,0 +1,66 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import Table from 'cli-table3';
4
+ import { api } from '../services/api-service.js';
5
+ import ora from 'ora';
6
+ import { handleCommandError } from '../utils/error-handler.js';
7
+ export function registerBoardCommand(program) {
8
+ const boardCmd = new Command('board')
9
+ .description('Manage Jira boards')
10
+ .addHelpText('after', `
11
+ Common Actions:
12
+ $ jira board list # List all boards
13
+ $ jira board list -p PROJ # List boards for a project
14
+ `);
15
+ boardCmd
16
+ .command('list')
17
+ .description('List Jira boards')
18
+ .option('-p, --project <key>', 'Filter by project key')
19
+ .option('-t, --type <type>', 'Filter by board type (scrum, kanban, simple)')
20
+ .option('-l, --limit <n>', 'Max results', '50')
21
+ .option('-o, --output <format>', 'Output format (json)')
22
+ .action(async (options) => {
23
+ const spinner = ora('Fetching boards...').start();
24
+ try {
25
+ const params = new URLSearchParams();
26
+ params.set('maxResults', options.limit);
27
+ if (options.project) {
28
+ params.set('projectKeyOrId', options.project);
29
+ }
30
+ if (options.type) {
31
+ params.set('type', options.type);
32
+ }
33
+ const data = await api.agileGet(`/board?${params.toString()}`);
34
+ spinner.stop();
35
+ if (!data.values || data.values.length === 0) {
36
+ console.log(chalk.yellow('No boards found.'));
37
+ return;
38
+ }
39
+ if (options.output === 'json') {
40
+ console.log(JSON.stringify(data.values.map((b) => ({
41
+ id: b.id, name: b.name,
42
+ type: b.type, project: b.location?.projectKey || null
43
+ })), null, 2));
44
+ return;
45
+ }
46
+ const table = new Table({
47
+ head: [chalk.bold('ID'), chalk.bold('Name'), chalk.bold('Type'), chalk.bold('Project')]
48
+ });
49
+ data.values.forEach((b) => {
50
+ table.push([
51
+ b.id,
52
+ b.name,
53
+ b.type,
54
+ b.location?.projectKey || '-'
55
+ ]);
56
+ });
57
+ console.log(table.toString());
58
+ console.log(chalk.grey(`Showing ${data.values.length} board(s)`));
59
+ }
60
+ catch (e) {
61
+ handleCommandError(spinner, e, 'Failed to list boards');
62
+ }
63
+ });
64
+ program.addCommand(boardCmd);
65
+ }
66
+ //# sourceMappingURL=board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/commands/board.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerBulkCommand(program: Command): void;