jira-pilot 2.1.2 → 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.
Files changed (114) hide show
  1. package/README.md +54 -0
  2. package/bin/jira.ts +2 -0
  3. package/dist/bin/jira.js +2 -0
  4. package/dist/bin/jira.js.map +1 -1
  5. package/dist/src/commands/ai-actions/plan.js +1 -1
  6. package/dist/src/commands/ai-actions/plan.js.map +1 -1
  7. package/dist/src/commands/ai-actions/review.js +5 -4
  8. package/dist/src/commands/ai-actions/review.js.map +1 -1
  9. package/dist/src/commands/ai-actions/standup.js +1 -1
  10. package/dist/src/commands/ai-actions/standup.js.map +1 -1
  11. package/dist/src/commands/ai.js +1 -1
  12. package/dist/src/commands/ai.js.map +1 -1
  13. package/dist/src/commands/board.js +10 -5
  14. package/dist/src/commands/board.js.map +1 -1
  15. package/dist/src/commands/bulk.js +11 -10
  16. package/dist/src/commands/bulk.js.map +1 -1
  17. package/dist/src/commands/config.js +1 -1
  18. package/dist/src/commands/config.js.map +1 -1
  19. package/dist/src/commands/dashboard.js +19 -12
  20. package/dist/src/commands/dashboard.js.map +1 -1
  21. package/dist/src/commands/filter.js +7 -4
  22. package/dist/src/commands/filter.js.map +1 -1
  23. package/dist/src/commands/git.js +1 -1
  24. package/dist/src/commands/git.js.map +1 -1
  25. package/dist/src/commands/issue-attach.js +1 -1
  26. package/dist/src/commands/issue-attach.js.map +1 -1
  27. package/dist/src/commands/issue-pr.js +1 -1
  28. package/dist/src/commands/issue-pr.js.map +1 -1
  29. package/dist/src/commands/issue-worklog.js +10 -5
  30. package/dist/src/commands/issue-worklog.js.map +1 -1
  31. package/dist/src/commands/issue.js +173 -122
  32. package/dist/src/commands/issue.js.map +1 -1
  33. package/dist/src/commands/project.js +10 -5
  34. package/dist/src/commands/project.js.map +1 -1
  35. package/dist/src/commands/sprint.js +19 -8
  36. package/dist/src/commands/sprint.js.map +1 -1
  37. package/dist/src/commands/tui.d.ts +2 -0
  38. package/dist/src/commands/tui.js +10 -0
  39. package/dist/src/commands/tui.js.map +1 -0
  40. package/dist/src/server/mcp-server.js +209 -27
  41. package/dist/src/server/mcp-server.js.map +1 -1
  42. package/dist/src/services/ai-service.js +7 -4
  43. package/dist/src/services/ai-service.js.map +1 -1
  44. package/dist/src/services/api-service.d.ts +2 -0
  45. package/dist/src/services/api-service.js +32 -20
  46. package/dist/src/services/api-service.js.map +1 -1
  47. package/dist/src/tui/App.d.ts +1 -0
  48. package/dist/src/tui/App.js +26 -0
  49. package/dist/src/tui/App.js.map +1 -0
  50. package/dist/src/tui/index.d.ts +1 -0
  51. package/dist/src/tui/index.js +8 -0
  52. package/dist/src/tui/index.js.map +1 -0
  53. package/dist/src/tui/screens/BoardList.d.ts +1 -0
  54. package/dist/src/tui/screens/BoardList.js +71 -0
  55. package/dist/src/tui/screens/BoardList.js.map +1 -0
  56. package/dist/src/tui/screens/Dashboard.d.ts +1 -0
  57. package/dist/src/tui/screens/Dashboard.js +41 -0
  58. package/dist/src/tui/screens/Dashboard.js.map +1 -0
  59. package/dist/src/tui/screens/IssueDetail.d.ts +6 -0
  60. package/dist/src/tui/screens/IssueDetail.js +40 -0
  61. package/dist/src/tui/screens/IssueDetail.js.map +1 -0
  62. package/dist/src/tui/screens/IssueList.d.ts +1 -0
  63. package/dist/src/tui/screens/IssueList.js +72 -0
  64. package/dist/src/tui/screens/IssueList.js.map +1 -0
  65. package/dist/src/tui/screens/KanbanBoard.d.ts +6 -0
  66. package/dist/src/tui/screens/KanbanBoard.js +86 -0
  67. package/dist/src/tui/screens/KanbanBoard.js.map +1 -0
  68. package/dist/src/tui/utils/adf-render.d.ts +1 -0
  69. package/dist/src/tui/utils/adf-render.js +29 -0
  70. package/dist/src/tui/utils/adf-render.js.map +1 -0
  71. package/dist/src/utils/api-paths.d.ts +31 -0
  72. package/dist/src/utils/api-paths.js +32 -0
  73. package/dist/src/utils/api-paths.js.map +1 -0
  74. package/dist/src/utils/error-handler.d.ts +2 -2
  75. package/dist/src/utils/error-handler.js.map +1 -1
  76. package/dist/src/utils/http.d.ts +27 -0
  77. package/dist/src/utils/http.js +95 -0
  78. package/dist/src/utils/http.js.map +1 -0
  79. package/dist/src/utils/spinner.d.ts +21 -0
  80. package/dist/src/utils/spinner.js +79 -0
  81. package/dist/src/utils/spinner.js.map +1 -0
  82. package/package.json +10 -5
  83. package/src/commands/ai-actions/plan.ts +1 -1
  84. package/src/commands/ai-actions/review.ts +5 -4
  85. package/src/commands/ai-actions/standup.ts +1 -1
  86. package/src/commands/ai.ts +1 -1
  87. package/src/commands/board.ts +10 -5
  88. package/src/commands/bulk.ts +11 -10
  89. package/src/commands/config.ts +1 -1
  90. package/src/commands/dashboard.ts +20 -12
  91. package/src/commands/filter.ts +8 -5
  92. package/src/commands/git.ts +1 -1
  93. package/src/commands/issue-attach.ts +1 -1
  94. package/src/commands/issue-pr.ts +1 -1
  95. package/src/commands/issue-worklog.ts +10 -5
  96. package/src/commands/issue.ts +181 -124
  97. package/src/commands/project.ts +10 -5
  98. package/src/commands/sprint.ts +19 -8
  99. package/src/commands/tui.ts +11 -0
  100. package/src/server/mcp-server.ts +234 -27
  101. package/src/services/ai-service.ts +7 -4
  102. package/src/services/api-service.ts +34 -21
  103. package/src/tui/App.tsx +61 -0
  104. package/src/tui/index.tsx +8 -0
  105. package/src/tui/screens/BoardList.tsx +102 -0
  106. package/src/tui/screens/Dashboard.tsx +75 -0
  107. package/src/tui/screens/IssueDetail.tsx +93 -0
  108. package/src/tui/screens/IssueList.tsx +116 -0
  109. package/src/tui/screens/KanbanBoard.tsx +133 -0
  110. package/src/tui/utils/adf-render.ts +30 -0
  111. package/src/utils/api-paths.ts +32 -0
  112. package/src/utils/error-handler.ts +2 -2
  113. package/src/utils/http.ts +128 -0
  114. package/src/utils/spinner.ts +87 -0
@@ -1,6 +1,7 @@
1
- import axios from 'axios';
1
+ import { HttpClient } from '../utils/http.js';
2
2
  import chalk from 'chalk';
3
3
  import { getCredentials } from '../utils/config.js';
4
+ import { API } from '../utils/api-paths.js';
4
5
  export class ApiService {
5
6
  client;
6
7
  agileClient;
@@ -19,25 +20,27 @@ export class ApiService {
19
20
  this._domain = match ? match[0].replace(/\/$/, '') : jiraUrl;
20
21
  const authHeader = `Basic ${Buffer.from(`${email}:${apiToken}`).toString('base64')}`;
21
22
  // Standard REST API v3 client
22
- this.client = axios.create({
23
+ this.client = new HttpClient({
23
24
  baseURL: `${this._domain}/rest/api/3`,
24
25
  headers: {
25
26
  'Authorization': authHeader,
26
- 'Accept': 'application/json',
27
- 'Content-Type': 'application/json'
27
+ 'Accept': 'application/json'
28
28
  }
29
29
  });
30
30
  // Agile REST API v1 client (for boards, sprints, etc.)
31
- this.agileClient = axios.create({
31
+ this.agileClient = new HttpClient({
32
32
  baseURL: `${this._domain}/rest/agile/1.0`,
33
33
  headers: {
34
34
  'Authorization': authHeader,
35
- 'Accept': 'application/json',
36
- 'Content-Type': 'application/json'
35
+ 'Accept': 'application/json'
37
36
  }
38
37
  });
39
- // Shared response interceptor
40
- const errorInterceptor = (error) => {
38
+ }
39
+ async handleRequest(request) {
40
+ try {
41
+ return await request;
42
+ }
43
+ catch (error) {
41
44
  if (error.response) {
42
45
  if (error.response.status === 401) {
43
46
  console.error(chalk.red('Authentication failed. Please check your credentials using "jira config".'));
@@ -46,10 +49,8 @@ export class ApiService {
46
49
  console.error(chalk.red('Access denied. You may not have permission for this resource.'));
47
50
  }
48
51
  }
49
- return Promise.reject(error);
50
- };
51
- this.client.interceptors.response.use((r) => r, errorInterceptor);
52
- this.agileClient.interceptors.response.use((r) => r, errorInterceptor);
52
+ throw error;
53
+ }
53
54
  }
54
55
  /** @returns {string} The Jira domain URL */
55
56
  get domain() {
@@ -66,24 +67,35 @@ export class ApiService {
66
67
  // ── Standard REST API v3 Methods ────────────────────────────────
67
68
  async get(url, config = {}) {
68
69
  this.ensureClient();
69
- const response = await this.client.get(url, config);
70
+ const response = await this.handleRequest(this.client.get(url, config));
70
71
  return response.data;
71
72
  }
72
73
  async post(url, data, config = {}) {
73
74
  this.ensureClient();
74
- const response = await this.client.post(url, data, config);
75
+ const response = await this.handleRequest(this.client.post(url, data, config));
75
76
  return response.data;
76
77
  }
77
78
  async put(url, data, config = {}) {
78
79
  this.ensureClient();
79
- const response = await this.client.put(url, data, config);
80
+ const response = await this.handleRequest(this.client.put(url, data, config));
80
81
  return response.data;
81
82
  }
82
83
  async delete(url, config = {}) {
83
84
  this.ensureClient();
84
- const response = await this.client.delete(url, config);
85
+ const response = await this.handleRequest(this.client.delete(url, config));
85
86
  return response.data;
86
87
  }
88
+ async search(jql, startAt = 0, maxResults = 50, nextPageToken) {
89
+ const payload = {
90
+ jql,
91
+ maxResults,
92
+ fields: ['summary', 'status', 'assignee', 'priority', 'issuetype', 'created', 'updated', 'project']
93
+ };
94
+ if (nextPageToken) {
95
+ payload.nextPageToken = nextPageToken;
96
+ }
97
+ return this.post(API.SEARCH.JQL, payload);
98
+ }
87
99
  async upload(url, formData) {
88
100
  this.ensureClient();
89
101
  // Jira requires this header for attachments
@@ -96,18 +108,18 @@ export class ApiService {
96
108
  Object.assign(headers, formData.getHeaders());
97
109
  }
98
110
  const config = { headers };
99
- const response = await this.client.post(url, formData, config);
111
+ const response = await this.handleRequest(this.client.post(url, formData, config));
100
112
  return response.data;
101
113
  }
102
114
  // ── Agile REST API v1 Methods ───────────────────────────────────
103
115
  async agileGet(url, config = {}) {
104
116
  this.ensureClient();
105
- const response = await this.agileClient.get(url, config);
117
+ const response = await this.handleRequest(this.agileClient.get(url, config));
106
118
  return response.data;
107
119
  }
108
120
  async agilePost(url, data, config = {}) {
109
121
  this.ensureClient();
110
- const response = await this.agileClient.post(url, data, config);
122
+ const response = await this.handleRequest(this.agileClient.post(url, data, config));
111
123
  return response.data;
112
124
  }
113
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api-service.js","sourceRoot":"","sources":["../../../src/services/api-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-service.js","sourceRoot":"","sources":["../../../src/services/api-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export default function App(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import Dashboard from './screens/Dashboard.js';
5
+ import IssueList from './screens/IssueList.js';
6
+ import BoardList from './screens/BoardList.js';
7
+ export default function App() {
8
+ const [view, setView] = useState('dashboard');
9
+ const [activeTab, setActiveTab] = useState(0);
10
+ const tabs = ['dashboard', 'issues', 'boards'];
11
+ useInput((input, key) => {
12
+ if (key.leftArrow) {
13
+ setActiveTab(prev => Math.max(0, prev - 1));
14
+ setView(tabs[Math.max(0, activeTab - 1)]);
15
+ }
16
+ if (key.rightArrow) {
17
+ setActiveTab(prev => Math.min(tabs.length - 1, prev + 1));
18
+ setView(tabs[Math.min(tabs.length - 1, activeTab + 1)]);
19
+ }
20
+ if (input === 'q') {
21
+ process.exit(0);
22
+ }
23
+ });
24
+ return (_jsxs(Box, { flexDirection: "column", height: "100%", children: [_jsxs(Box, { borderStyle: "classic", borderColor: "blue", paddingX: 1, children: [_jsx(Text, { bold: true, color: "blue", children: "Jira Pilot" }), _jsx(Box, { marginLeft: 2, flexDirection: "column", justifyContent: "center", children: _jsxs(Text, { children: ["Use ", _jsx(Text, { color: "green", children: "\u2190/\u2192" }), " to navigate tabs. Press ", _jsx(Text, { color: "red", children: "q" }), " to quit."] }) })] }), _jsx(Box, { paddingX: 1, marginBottom: 1, children: tabs.map((tab, index) => (_jsx(Box, { marginRight: 2, children: _jsx(Text, { color: activeTab === index ? 'green' : 'white', bold: activeTab === index, underline: activeTab === index, children: tab.charAt(0).toUpperCase() + tab.slice(1) }) }, tab))) }), _jsxs(Box, { flexGrow: 1, borderStyle: "round", padding: 1, borderColor: "gray", children: [view === 'dashboard' && _jsx(Dashboard, {}), view === 'issues' && _jsx(IssueList, {}), view === 'boards' && _jsx(BoardList, {})] })] }));
25
+ }
26
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/tui/App.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function startTui(): void;
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { render } from 'ink';
3
+ import App from './App.js';
4
+ export function startTui() {
5
+ console.clear();
6
+ render(_jsx(App, {}));
7
+ }
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tui/index.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,MAAM,UAAU,QAAQ;IACpB,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,MAAM,CAAC,KAAC,GAAG,KAAG,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1 @@
1
+ export default function BoardList(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import SpinnerOriginal from 'ink-spinner';
5
+ const Spinner = SpinnerOriginal;
6
+ import { api } from '../../services/api-service.js';
7
+ import KanbanBoard from './KanbanBoard.js';
8
+ export default function BoardList() {
9
+ const [loading, setLoading] = useState(true);
10
+ const [boards, setBoards] = useState([]);
11
+ const [selectedIndex, setSelectedIndex] = useState(0);
12
+ const [selectedBoardId, setSelectedBoardId] = useState(null);
13
+ const [error, setError] = useState(null);
14
+ useEffect(() => {
15
+ const fetchBoards = async () => {
16
+ try {
17
+ const results = await api.agileGet('/board');
18
+ setBoards(results.values);
19
+ setLoading(false);
20
+ }
21
+ catch (err) {
22
+ setError(err.message);
23
+ setLoading(false);
24
+ }
25
+ };
26
+ fetchBoards();
27
+ }, []);
28
+ useInput((input, key) => {
29
+ if (selectedBoardId)
30
+ return;
31
+ if (key.upArrow) {
32
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
33
+ }
34
+ if (key.downArrow) {
35
+ setSelectedIndex((prev) => Math.min(boards.length - 1, prev + 1));
36
+ }
37
+ if (key.return) {
38
+ if (boards[selectedIndex]) {
39
+ setSelectedBoardId(boards[selectedIndex].id);
40
+ }
41
+ }
42
+ });
43
+ if (selectedBoardId) {
44
+ return _jsx(KanbanBoard, { boardId: selectedBoardId, onBack: () => setSelectedBoardId(null) });
45
+ }
46
+ if (loading) {
47
+ return (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { children: " Loading Boards..." })] }));
48
+ }
49
+ if (error) {
50
+ return _jsxs(Text, { color: "red", children: ["Error: ", error] });
51
+ }
52
+ if (boards.length === 0) {
53
+ return _jsx(Text, { children: "No boards found." });
54
+ }
55
+ const windowSize = 15;
56
+ const halfWindow = Math.floor(windowSize / 2);
57
+ // Ensure the selected item is always visible
58
+ let start = 0;
59
+ if (selectedIndex > halfWindow) {
60
+ start = Math.min(selectedIndex - halfWindow, boards.length - windowSize);
61
+ }
62
+ start = Math.max(0, start);
63
+ const end = Math.min(boards.length, start + windowSize);
64
+ const visibleBoards = boards.slice(start, end);
65
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { bold: true, underline: true, children: ["Select a Board (", selectedIndex + 1, "/", boards.length, ")"] }) }), visibleBoards.map((board, index) => {
66
+ const globalIndex = start + index;
67
+ const isSelected = globalIndex === selectedIndex;
68
+ return (_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? 'green' : 'white', bold: isSelected, children: isSelected ? '> ' : ' ' }), _jsxs(Text, { color: isSelected ? 'green' : 'white', children: [board.name, " (", board.type, ")"] })] }, board.id));
69
+ })] }));
70
+ }
71
+ //# sourceMappingURL=BoardList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoardList.js","sourceRoot":"","sources":["../../../../src/tui/screens/BoardList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export default function Dashboard(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import SpinnerOriginal from 'ink-spinner';
5
+ const Spinner = SpinnerOriginal;
6
+ import { api } from '../../services/api-service.js';
7
+ export default function Dashboard() {
8
+ const [loading, setLoading] = useState(true);
9
+ const [user, setUser] = useState(null);
10
+ const [issueCount, setIssueCount] = useState(0);
11
+ const [error, setError] = useState(null);
12
+ useEffect(() => {
13
+ const fetchData = async () => {
14
+ try {
15
+ // Fetch issue count (maxResults must be >= 1)
16
+ const searchResults = await api.search(`assignee = currentUser() AND resolution = Unresolved`, 0, 1);
17
+ const myself = await api.get('/myself');
18
+ setUser(myself);
19
+ setIssueCount(searchResults.total);
20
+ setLoading(false);
21
+ }
22
+ catch (err) {
23
+ // detailed error inspection
24
+ const msg = err.response
25
+ ? `API Error ${err.response.status}: ${JSON.stringify(err.response.data)}`
26
+ : err.message || JSON.stringify(err);
27
+ setError(msg);
28
+ setLoading(false);
29
+ }
30
+ };
31
+ fetchData();
32
+ }, []);
33
+ if (loading) {
34
+ return (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { children: " Loading Dashboard..." })] }));
35
+ }
36
+ if (error) {
37
+ return (_jsxs(Box, { flexDirection: "column", borderColor: "red", borderStyle: "round", padding: 1, children: [_jsx(Text, { color: "red", bold: true, children: "Error Loading Dashboard:" }), _jsx(Text, { color: "red", children: error }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Tip: Check your internet connection and run `jira config` to verify credentials." }) })] }));
38
+ }
39
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: ["Welcome back, ", user?.displayName, "!"] }), _jsx(Box, { marginTop: 1, borderStyle: "single", padding: 1, borderColor: "yellow", children: _jsxs(Text, { children: ["You have ", _jsx(Text, { bold: true, color: "red", children: issueCount }), " unresolved issues assigned to you."] }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Press \u2190/\u2192 to navigate. Try the 'Issues' tab to see details." }) })] }));
40
+ }
41
+ //# sourceMappingURL=Dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard.js","sourceRoot":"","sources":["../../../../src/tui/screens/Dashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface IssueDetailProps {
2
+ issueKey: string;
3
+ onBack: () => void;
4
+ }
5
+ export default function IssueDetail({ issueKey, onBack }: IssueDetailProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import SpinnerOriginal from 'ink-spinner';
5
+ const Spinner = SpinnerOriginal;
6
+ import { api } from '../../services/api-service.js';
7
+ import { renderADF } from '../utils/adf-render.js';
8
+ export default function IssueDetail({ issueKey, onBack }) {
9
+ const [loading, setLoading] = useState(true);
10
+ const [issue, setIssue] = useState(null);
11
+ const [error, setError] = useState(null);
12
+ useEffect(() => {
13
+ const fetchIssue = async () => {
14
+ try {
15
+ const results = await api.get(`/issue/${issueKey}`);
16
+ setIssue(results);
17
+ setLoading(false);
18
+ }
19
+ catch (err) {
20
+ setError(err.message);
21
+ setLoading(false);
22
+ }
23
+ };
24
+ fetchIssue();
25
+ }, [issueKey]);
26
+ useInput((input, key) => {
27
+ if (key.escape || input === 'b') {
28
+ onBack();
29
+ }
30
+ });
31
+ if (loading) {
32
+ return (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { children: [" Loading Issue ", issueKey, "..."] })] }));
33
+ }
34
+ if (error) {
35
+ return _jsxs(Text, { color: "red", children: ["Error: ", error] });
36
+ }
37
+ const { summary, description, status, priority, assignee, reporter, comment } = issue.fields;
38
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, borderStyle: "single", children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { bold: true, color: "cyan", children: [issue.key, ": ", summary] }) }), _jsxs(Box, { flexDirection: "row", marginBottom: 1, children: [_jsxs(Box, { width: "50%", children: [_jsxs(Text, { children: [_jsx(Text, { bold: true, children: "Status:" }), " ", status.name] }), _jsxs(Text, { children: [_jsx(Text, { bold: true, children: "Priority:" }), " ", priority.name] })] }), _jsxs(Box, { width: "50%", children: [_jsxs(Text, { children: [_jsx(Text, { bold: true, children: "Assignee:" }), " ", assignee ? assignee.displayName : 'Unassigned'] }), _jsxs(Text, { children: [_jsx(Text, { bold: true, children: "Reporter:" }), " ", reporter ? reporter.displayName : 'Unknown'] })] })] }), _jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, underline: true, children: "Description:" }), _jsx(Text, { children: renderADF(description) || 'No description provided.' })] }), comment && comment.comments && comment.comments.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { bold: true, underline: true, children: ["Comments (", comment.total, "):"] }), comment.comments.slice(-3).map((c) => (_jsxs(Box, { borderStyle: "round", borderColor: "gray", padding: 1, marginTop: 1, children: [_jsxs(Text, { bold: true, color: "blue", children: [c.author.displayName, ":"] }), _jsx(Text, { children: renderADF(c.body) })] }, c.id)))] })), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "gray", children: ["Press ", _jsx(Text, { bold: true, children: "Esc" }), " or ", _jsx(Text, { bold: true, children: "b" }), " to go back."] }) })] }));
39
+ }
40
+ //# sourceMappingURL=IssueDetail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IssueDetail.js","sourceRoot":"","sources":["../../../../src/tui/screens/IssueDetail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export default function IssueList(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,72 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import SpinnerOriginal from 'ink-spinner';
5
+ const Spinner = SpinnerOriginal;
6
+ import { api } from '../../services/api-service.js';
7
+ import IssueDetail from './IssueDetail.js';
8
+ export default function IssueList() {
9
+ const [loading, setLoading] = useState(true);
10
+ const [issues, setIssues] = useState([]);
11
+ const [selectedIndex, setSelectedIndex] = useState(0);
12
+ const [selectedIssueKey, setSelectedIssueKey] = useState(null);
13
+ const [error, setError] = useState(null);
14
+ useEffect(() => {
15
+ const fetchIssues = async () => {
16
+ try {
17
+ // Default search: Assigned to me or reported by me, unresolved
18
+ const results = await api.search('assignee = currentUser() OR reporter = currentUser() AND resolution = Unresolved order by updated DESC', 0, 20);
19
+ setIssues(results.issues);
20
+ setLoading(false);
21
+ }
22
+ catch (err) {
23
+ setError(err.message);
24
+ setLoading(false);
25
+ }
26
+ };
27
+ fetchIssues();
28
+ }, []);
29
+ useInput((input, key) => {
30
+ if (selectedIssueKey)
31
+ return; // Let Detail view handle input if active
32
+ if (key.upArrow) {
33
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
34
+ }
35
+ if (key.downArrow) {
36
+ setSelectedIndex((prev) => Math.min(issues.length - 1, prev + 1));
37
+ }
38
+ if (key.return) {
39
+ if (issues[selectedIndex]) {
40
+ setSelectedIssueKey(issues[selectedIndex].key);
41
+ }
42
+ }
43
+ });
44
+ if (selectedIssueKey) {
45
+ return _jsx(IssueDetail, { issueKey: selectedIssueKey, onBack: () => setSelectedIssueKey(null) });
46
+ }
47
+ if (loading) {
48
+ return (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { children: " Loading Issues..." })] }));
49
+ }
50
+ // ... rest of the file ...
51
+ if (error) {
52
+ return _jsxs(Text, { color: "red", children: ["Error: ", error] });
53
+ }
54
+ if (issues.length === 0) {
55
+ return _jsx(Text, { children: "No issues found." });
56
+ }
57
+ // Pagination/Windowing logic could go here, for now just slice a window around selected
58
+ const windowSize = 10;
59
+ const start = Math.max(0, selectedIndex - Math.floor(windowSize / 2));
60
+ const end = Math.min(issues.length, start + windowSize);
61
+ const visibleIssues = issues.slice(start, end);
62
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { bold: true, underline: true, children: ["Issue Navigator (", issues.length, ")"] }) }), visibleIssues.map((issue, index) => {
63
+ const globalIndex = start + index;
64
+ const isSelected = globalIndex === selectedIndex;
65
+ const key = issue.key;
66
+ const summary = issue.fields.summary;
67
+ const status = issue.fields.status.name;
68
+ const priority = issue.fields.priority.name;
69
+ return (_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? 'green' : 'white', bold: isSelected, children: isSelected ? '> ' : ' ' }), _jsx(Box, { width: 12, children: _jsx(Text, { color: "cyan", children: key }) }), _jsx(Box, { width: 12, children: _jsx(Text, { color: "yellow", children: status }) }), _jsx(Box, { width: 10, children: _jsx(Text, { color: "magenta", children: priority }) }), _jsx(Box, { flexGrow: 1, children: _jsx(Text, { wrap: "truncate-end", children: summary }) })] }, issue.id));
70
+ }), _jsx(Box, { marginTop: 1, borderStyle: "single", borderColor: "gray", children: _jsxs(Text, { color: "gray", children: ["Selected: ", issues[selectedIndex]?.key, " - ", issues[selectedIndex]?.fields?.summary] }) })] }));
71
+ }
72
+ //# sourceMappingURL=IssueList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IssueList.js","sourceRoot":"","sources":["../../../../src/tui/screens/IssueList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface KanbanBoardProps {
2
+ boardId: string;
3
+ onBack: () => void;
4
+ }
5
+ export default function KanbanBoard({ boardId, onBack }: KanbanBoardProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,86 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import SpinnerOriginal from 'ink-spinner';
5
+ const Spinner = SpinnerOriginal;
6
+ import { api } from '../../services/api-service.js';
7
+ export default function KanbanBoard({ boardId, onBack }) {
8
+ const [loading, setLoading] = useState(true);
9
+ const [columns, setColumns] = useState([]);
10
+ const [issues, setIssues] = useState({});
11
+ const [activeColumnIndex, setActiveColumnIndex] = useState(0);
12
+ const [error, setError] = useState(null);
13
+ useEffect(() => {
14
+ const fetchData = async () => {
15
+ try {
16
+ // parallel fetch
17
+ const [config, boardIssues] = await Promise.all([
18
+ api.agileGet(`/board/${boardId}/configuration`),
19
+ api.agileGet(`/board/${boardId}/issue`)
20
+ ]);
21
+ const cols = config.columnConfig.columns;
22
+ setColumns(cols);
23
+ // Group issues by status/column
24
+ // This is simplified mapping logic. Jira statuses map to columns.
25
+ const issuesByStatus = {};
26
+ cols.forEach((col) => {
27
+ issuesByStatus[col.name] = [];
28
+ });
29
+ boardIssues.issues.forEach((issue) => {
30
+ const statusName = issue.fields.status.name;
31
+ // Find which column this status belongs to involves checking config.columnConfig.columns[i].statuses
32
+ // For now, let's just try to match column name or push to 'Other'
33
+ let placed = false;
34
+ for (const col of cols) {
35
+ // Check if status in column statuses
36
+ // config.columnConfig.columns structure: { name: 'To Do', statuses: [ { id: '10000', self: '...' } ] }
37
+ if (col.statuses && col.statuses.some((s) => s.id === issue.fields.status.id)) {
38
+ if (!issuesByStatus[col.name])
39
+ issuesByStatus[col.name] = [];
40
+ issuesByStatus[col.name].push(issue);
41
+ placed = true;
42
+ break;
43
+ }
44
+ }
45
+ if (!placed) {
46
+ // fallback: try direct name match
47
+ if (issuesByStatus[statusName]) {
48
+ issuesByStatus[statusName].push(issue);
49
+ }
50
+ }
51
+ });
52
+ setIssues(issuesByStatus);
53
+ setLoading(false);
54
+ }
55
+ catch (err) {
56
+ setError(err.message);
57
+ setLoading(false);
58
+ }
59
+ };
60
+ fetchData();
61
+ }, [boardId]);
62
+ useInput((input, key) => {
63
+ if (key.escape || input === 'b') {
64
+ onBack();
65
+ }
66
+ if (key.leftArrow) {
67
+ setActiveColumnIndex((prev) => Math.max(0, prev - 1));
68
+ }
69
+ if (key.rightArrow) {
70
+ setActiveColumnIndex((prev) => Math.min(columns.length - 1, prev + 1));
71
+ }
72
+ });
73
+ if (loading) {
74
+ return (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { children: " Loading Board..." })] }));
75
+ }
76
+ if (error) {
77
+ return _jsxs(Text, { color: "red", children: ["Error: ", error] });
78
+ }
79
+ return (_jsxs(Box, { flexDirection: "column", height: "100%", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: "Board View (Use \u2190/\u2192 to switch columns, Esc to back)" }) }), _jsx(Box, { flexDirection: "row", flexGrow: 1, children: columns.map((col, index) => {
80
+ const isActive = index === activeColumnIndex;
81
+ const colIssues = issues[col.name] || [];
82
+ return (_jsxs(Box, { flexDirection: "column", width: 30, borderStyle: isActive ? 'double' : 'single', borderColor: isActive ? 'green' : 'gray', marginRight: 1, paddingX: 1, children: [_jsx(Box, { marginBottom: 1, borderStyle: "single", borderBottom: false, borderLeft: false, borderRight: false, borderTop: false, children: _jsxs(Text, { bold: true, underline: true, color: isActive ? 'green' : 'white', children: [col.name, " (", colIssues.length, ")"] }) }), colIssues.slice(0, 10).map((issue) => ( // Limit simplified list
83
+ _jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: "cyan", children: issue.key }), _jsx(Text, { wrap: "truncate", children: issue.fields.summary })] }, issue.id)))] }, col.name));
84
+ }) })] }));
85
+ }
86
+ //# sourceMappingURL=KanbanBoard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanBoard.js","sourceRoot":"","sources":["../../../../src/tui/screens/KanbanBoard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function renderADF(node: any): string;
@@ -0,0 +1,29 @@
1
+ export function renderADF(node) {
2
+ if (!node)
3
+ return '';
4
+ if (typeof node === 'string')
5
+ return node;
6
+ // Handle text nodes
7
+ if (node.type === 'text') {
8
+ return node.text || '';
9
+ }
10
+ // Handle content arrays
11
+ if (node.content && Array.isArray(node.content)) {
12
+ return node.content.map(renderADF).join('');
13
+ }
14
+ // Handle specific block types (optional formatting)
15
+ switch (node.type) {
16
+ case 'paragraph':
17
+ return renderADF({ content: node.content }) + '\n';
18
+ case 'bulletList':
19
+ case 'orderedList':
20
+ return renderADF({ content: node.content });
21
+ case 'listItem':
22
+ return '• ' + renderADF({ content: node.content });
23
+ case 'hardBreak':
24
+ return '\n';
25
+ default:
26
+ return '';
27
+ }
28
+ }
29
+ //# sourceMappingURL=adf-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adf-render.js","sourceRoot":"","sources":["../../../../src/tui/utils/adf-render.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,SAAS,CAAC,IAAS;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE1C,oBAAoB;IACpB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,wBAAwB;IACxB,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,oDAAoD;IACpD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,WAAW;YACZ,OAAO,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;QACvD,KAAK,YAAY,CAAC;QAClB,KAAK,aAAa;YACd,OAAO,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,KAAK,UAAU;YACX,OAAO,IAAI,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,KAAK,WAAW;YACZ,OAAO,IAAI,CAAC;QAChB;YACI,OAAO,EAAE,CAAC;IAClB,CAAC;AACL,CAAC"}