@gongrzhe/server-jira 0.1.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 (66) hide show
  1. package/README.md +374 -0
  2. package/dist/common/context.d.ts +15 -0
  3. package/dist/common/context.d.ts.map +1 -0
  4. package/dist/common/context.js +33 -0
  5. package/dist/common/context.js.map +1 -0
  6. package/dist/common/errors.d.ts +26 -0
  7. package/dist/common/errors.d.ts.map +1 -0
  8. package/dist/common/errors.js +71 -0
  9. package/dist/common/errors.js.map +1 -0
  10. package/dist/common/token-parser.d.ts +53 -0
  11. package/dist/common/token-parser.d.ts.map +1 -0
  12. package/dist/common/token-parser.js +117 -0
  13. package/dist/common/token-parser.js.map +1 -0
  14. package/dist/common/types.d.ts +151 -0
  15. package/dist/common/types.d.ts.map +1 -0
  16. package/dist/common/types.js +2 -0
  17. package/dist/common/types.js.map +1 -0
  18. package/dist/common/utils.d.ts +9 -0
  19. package/dist/common/utils.d.ts.map +1 -0
  20. package/dist/common/utils.js +116 -0
  21. package/dist/common/utils.js.map +1 -0
  22. package/dist/common/version.d.ts +2 -0
  23. package/dist/common/version.d.ts.map +1 -0
  24. package/dist/common/version.js +3 -0
  25. package/dist/common/version.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +505 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/operations/atlassian.d.ts +27 -0
  31. package/dist/operations/atlassian.d.ts.map +1 -0
  32. package/dist/operations/atlassian.js +27 -0
  33. package/dist/operations/atlassian.js.map +1 -0
  34. package/dist/operations/comments.d.ts +117 -0
  35. package/dist/operations/comments.d.ts.map +1 -0
  36. package/dist/operations/comments.js +153 -0
  37. package/dist/operations/comments.js.map +1 -0
  38. package/dist/operations/issues.d.ts +146 -0
  39. package/dist/operations/issues.d.ts.map +1 -0
  40. package/dist/operations/issues.js +250 -0
  41. package/dist/operations/issues.js.map +1 -0
  42. package/dist/operations/metadata.d.ts +176 -0
  43. package/dist/operations/metadata.d.ts.map +1 -0
  44. package/dist/operations/metadata.js +143 -0
  45. package/dist/operations/metadata.js.map +1 -0
  46. package/dist/operations/projects.d.ts +159 -0
  47. package/dist/operations/projects.d.ts.map +1 -0
  48. package/dist/operations/projects.js +175 -0
  49. package/dist/operations/projects.js.map +1 -0
  50. package/dist/operations/users.d.ts +130 -0
  51. package/dist/operations/users.d.ts.map +1 -0
  52. package/dist/operations/users.js +214 -0
  53. package/dist/operations/users.js.map +1 -0
  54. package/dist/operations/workflow.d.ts +110 -0
  55. package/dist/operations/workflow.d.ts.map +1 -0
  56. package/dist/operations/workflow.js +203 -0
  57. package/dist/operations/workflow.js.map +1 -0
  58. package/dist/operations/worklog.d.ts +175 -0
  59. package/dist/operations/worklog.d.ts.map +1 -0
  60. package/dist/operations/worklog.js +322 -0
  61. package/dist/operations/worklog.js.map +1 -0
  62. package/dist/test-token-discovery.d.ts +6 -0
  63. package/dist/test-token-discovery.d.ts.map +1 -0
  64. package/dist/test-token-discovery.js +26 -0
  65. package/dist/test-token-discovery.js.map +1 -0
  66. package/package.json +54 -0
@@ -0,0 +1,175 @@
1
+ import { z } from 'zod';
2
+ import { JiraWorklog } from '../common/types.js';
3
+ export declare const GetWorklogsSchema: z.ZodObject<{
4
+ issueKey: z.ZodString;
5
+ startAt: z.ZodDefault<z.ZodNumber>;
6
+ maxResults: z.ZodDefault<z.ZodNumber>;
7
+ startedAfter: z.ZodOptional<z.ZodString>;
8
+ startedBefore: z.ZodOptional<z.ZodString>;
9
+ expand: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ issueKey: string;
12
+ startAt: number;
13
+ maxResults: number;
14
+ expand?: string[] | undefined;
15
+ startedAfter?: string | undefined;
16
+ startedBefore?: string | undefined;
17
+ }, {
18
+ issueKey: string;
19
+ expand?: string[] | undefined;
20
+ startAt?: number | undefined;
21
+ maxResults?: number | undefined;
22
+ startedAfter?: string | undefined;
23
+ startedBefore?: string | undefined;
24
+ }>;
25
+ export declare const AddWorklogSchema: z.ZodObject<{
26
+ issueKey: z.ZodString;
27
+ timeSpent: z.ZodString;
28
+ comment: z.ZodOptional<z.ZodString>;
29
+ started: z.ZodOptional<z.ZodString>;
30
+ visibility: z.ZodOptional<z.ZodObject<{
31
+ type: z.ZodEnum<["group", "role"]>;
32
+ value: z.ZodString;
33
+ }, "strip", z.ZodTypeAny, {
34
+ value: string;
35
+ type: "group" | "role";
36
+ }, {
37
+ value: string;
38
+ type: "group" | "role";
39
+ }>>;
40
+ adjustEstimate: z.ZodDefault<z.ZodEnum<["new", "leave", "manual", "auto"]>>;
41
+ newEstimate: z.ZodOptional<z.ZodString>;
42
+ reduceBy: z.ZodOptional<z.ZodString>;
43
+ }, "strip", z.ZodTypeAny, {
44
+ issueKey: string;
45
+ timeSpent: string;
46
+ adjustEstimate: "new" | "leave" | "manual" | "auto";
47
+ comment?: string | undefined;
48
+ visibility?: {
49
+ value: string;
50
+ type: "group" | "role";
51
+ } | undefined;
52
+ started?: string | undefined;
53
+ newEstimate?: string | undefined;
54
+ reduceBy?: string | undefined;
55
+ }, {
56
+ issueKey: string;
57
+ timeSpent: string;
58
+ comment?: string | undefined;
59
+ visibility?: {
60
+ value: string;
61
+ type: "group" | "role";
62
+ } | undefined;
63
+ started?: string | undefined;
64
+ adjustEstimate?: "new" | "leave" | "manual" | "auto" | undefined;
65
+ newEstimate?: string | undefined;
66
+ reduceBy?: string | undefined;
67
+ }>;
68
+ export declare const UpdateWorklogSchema: z.ZodObject<{
69
+ issueKey: z.ZodString;
70
+ worklogId: z.ZodString;
71
+ timeSpent: z.ZodOptional<z.ZodString>;
72
+ comment: z.ZodOptional<z.ZodString>;
73
+ started: z.ZodOptional<z.ZodString>;
74
+ visibility: z.ZodOptional<z.ZodObject<{
75
+ type: z.ZodEnum<["group", "role"]>;
76
+ value: z.ZodString;
77
+ }, "strip", z.ZodTypeAny, {
78
+ value: string;
79
+ type: "group" | "role";
80
+ }, {
81
+ value: string;
82
+ type: "group" | "role";
83
+ }>>;
84
+ adjustEstimate: z.ZodDefault<z.ZodEnum<["new", "leave", "manual", "auto"]>>;
85
+ newEstimate: z.ZodOptional<z.ZodString>;
86
+ increaseBy: z.ZodOptional<z.ZodString>;
87
+ }, "strip", z.ZodTypeAny, {
88
+ issueKey: string;
89
+ adjustEstimate: "new" | "leave" | "manual" | "auto";
90
+ worklogId: string;
91
+ comment?: string | undefined;
92
+ visibility?: {
93
+ value: string;
94
+ type: "group" | "role";
95
+ } | undefined;
96
+ timeSpent?: string | undefined;
97
+ started?: string | undefined;
98
+ newEstimate?: string | undefined;
99
+ increaseBy?: string | undefined;
100
+ }, {
101
+ issueKey: string;
102
+ worklogId: string;
103
+ comment?: string | undefined;
104
+ visibility?: {
105
+ value: string;
106
+ type: "group" | "role";
107
+ } | undefined;
108
+ timeSpent?: string | undefined;
109
+ started?: string | undefined;
110
+ adjustEstimate?: "new" | "leave" | "manual" | "auto" | undefined;
111
+ newEstimate?: string | undefined;
112
+ increaseBy?: string | undefined;
113
+ }>;
114
+ export declare const DeleteWorklogSchema: z.ZodObject<{
115
+ issueKey: z.ZodString;
116
+ worklogId: z.ZodString;
117
+ adjustEstimate: z.ZodDefault<z.ZodEnum<["new", "leave", "manual", "auto"]>>;
118
+ newEstimate: z.ZodOptional<z.ZodString>;
119
+ increaseBy: z.ZodOptional<z.ZodString>;
120
+ }, "strip", z.ZodTypeAny, {
121
+ issueKey: string;
122
+ adjustEstimate: "new" | "leave" | "manual" | "auto";
123
+ worklogId: string;
124
+ newEstimate?: string | undefined;
125
+ increaseBy?: string | undefined;
126
+ }, {
127
+ issueKey: string;
128
+ worklogId: string;
129
+ adjustEstimate?: "new" | "leave" | "manual" | "auto" | undefined;
130
+ newEstimate?: string | undefined;
131
+ increaseBy?: string | undefined;
132
+ }>;
133
+ export declare const GetWorklogSchema: z.ZodObject<{
134
+ issueKey: z.ZodString;
135
+ worklogId: z.ZodString;
136
+ expand: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
137
+ }, "strip", z.ZodTypeAny, {
138
+ issueKey: string;
139
+ worklogId: string;
140
+ expand?: string[] | undefined;
141
+ }, {
142
+ issueKey: string;
143
+ worklogId: string;
144
+ expand?: string[] | undefined;
145
+ }>;
146
+ export declare function getWorklogs(params: z.infer<typeof GetWorklogsSchema>): Promise<{
147
+ startAt: number;
148
+ maxResults: number;
149
+ total: number;
150
+ worklogs: JiraWorklog[];
151
+ }>;
152
+ export declare function addWorklog(params: z.infer<typeof AddWorklogSchema>): Promise<JiraWorklog>;
153
+ export declare function updateWorklog(params: z.infer<typeof UpdateWorklogSchema>): Promise<JiraWorklog>;
154
+ export declare function deleteWorklog(params: z.infer<typeof DeleteWorklogSchema>): Promise<{
155
+ success: boolean;
156
+ message: string;
157
+ }>;
158
+ export declare function getWorklog(params: z.infer<typeof GetWorklogSchema>): Promise<JiraWorklog>;
159
+ export declare function getWorklogsByUser(params: {
160
+ accountId: string;
161
+ startDate: string;
162
+ endDate: string;
163
+ }): Promise<JiraWorklog[]>;
164
+ export declare function getTotalTimeSpent(params: {
165
+ issueKey?: string;
166
+ projectKey?: string;
167
+ accountId?: string;
168
+ startDate?: string;
169
+ endDate?: string;
170
+ }): Promise<{
171
+ totalTimeSpentSeconds: number;
172
+ totalTimeSpentFormatted: string;
173
+ worklogCount: number;
174
+ }>;
175
+ //# sourceMappingURL=worklog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worklog.d.ts","sourceRoot":"","sources":["../../operations/worklog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;EAO5B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY3B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa9B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;EAM9B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAI3B,CAAC;AAGH,wBAAsB,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,GAAG,OAAO,CAAC;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB,CAAC,CAuCD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CA+D/F;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAkErG;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GAAG,OAAO,CAAC;IACxF,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAoCD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAqB/F;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAuCzB;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC;IACV,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CAiGD"}
@@ -0,0 +1,322 @@
1
+ import { z } from 'zod';
2
+ import { jiraRequest, validateIssueKey, formatJiraDate } from '../common/utils.js';
3
+ import { JiraValidationError, JiraResourceNotFoundError } from '../common/errors.js';
4
+ // Schema definitions
5
+ export const GetWorklogsSchema = z.object({
6
+ issueKey: z.string().describe("The issue key to get worklogs from"),
7
+ startAt: z.number().default(0).describe("Starting index for pagination"),
8
+ maxResults: z.number().default(20).describe("Maximum number of worklogs to return"),
9
+ startedAfter: z.string().optional().describe("Filter worklogs started after this date (ISO format)"),
10
+ startedBefore: z.string().optional().describe("Filter worklogs started before this date (ISO format)"),
11
+ expand: z.array(z.string()).optional().describe("Fields to expand"),
12
+ });
13
+ export const AddWorklogSchema = z.object({
14
+ issueKey: z.string().describe("The issue key to add worklog to"),
15
+ timeSpent: z.string().describe("Time spent (e.g., '1h 30m', '2d', '4h')"),
16
+ comment: z.string().optional().describe("Work description/comment"),
17
+ started: z.string().optional().describe("When the work started (ISO format, defaults to now)"),
18
+ visibility: z.object({
19
+ type: z.enum(['group', 'role']).describe("Visibility type"),
20
+ value: z.string().describe("Group name or role name"),
21
+ }).optional().describe("Worklog visibility settings"),
22
+ adjustEstimate: z.enum(['new', 'leave', 'manual', 'auto']).default('auto').describe("How to adjust remaining estimate"),
23
+ newEstimate: z.string().optional().describe("New remaining estimate (required if adjustEstimate is 'new')"),
24
+ reduceBy: z.string().optional().describe("Reduce estimate by this amount (required if adjustEstimate is 'manual')"),
25
+ });
26
+ export const UpdateWorklogSchema = z.object({
27
+ issueKey: z.string().describe("The issue key"),
28
+ worklogId: z.string().describe("The worklog ID to update"),
29
+ timeSpent: z.string().optional().describe("Time spent (e.g., '1h 30m', '2d', '4h')"),
30
+ comment: z.string().optional().describe("Work description/comment"),
31
+ started: z.string().optional().describe("When the work started (ISO format)"),
32
+ visibility: z.object({
33
+ type: z.enum(['group', 'role']).describe("Visibility type"),
34
+ value: z.string().describe("Group name or role name"),
35
+ }).optional().describe("Worklog visibility settings"),
36
+ adjustEstimate: z.enum(['new', 'leave', 'manual', 'auto']).default('auto').describe("How to adjust remaining estimate"),
37
+ newEstimate: z.string().optional().describe("New remaining estimate (required if adjustEstimate is 'new')"),
38
+ increaseBy: z.string().optional().describe("Increase estimate by this amount (required if adjustEstimate is 'manual')"),
39
+ });
40
+ export const DeleteWorklogSchema = z.object({
41
+ issueKey: z.string().describe("The issue key"),
42
+ worklogId: z.string().describe("The worklog ID to delete"),
43
+ adjustEstimate: z.enum(['new', 'leave', 'manual', 'auto']).default('auto').describe("How to adjust remaining estimate"),
44
+ newEstimate: z.string().optional().describe("New remaining estimate (required if adjustEstimate is 'new')"),
45
+ increaseBy: z.string().optional().describe("Increase estimate by this amount (required if adjustEstimate is 'manual')"),
46
+ });
47
+ export const GetWorklogSchema = z.object({
48
+ issueKey: z.string().describe("The issue key"),
49
+ worklogId: z.string().describe("The worklog ID to retrieve"),
50
+ expand: z.array(z.string()).optional().describe("Fields to expand"),
51
+ });
52
+ // Implementation functions
53
+ export async function getWorklogs(params) {
54
+ const { issueKey, startAt, maxResults, startedAfter, startedBefore, expand } = params;
55
+ if (!validateIssueKey(issueKey)) {
56
+ throw new JiraValidationError(`Invalid issue key format: ${issueKey}`);
57
+ }
58
+ const query = new URLSearchParams({
59
+ startAt: startAt.toString(),
60
+ maxResults: Math.min(maxResults, 1048576).toString(), // JIRA's max limit for worklogs
61
+ });
62
+ if (startedAfter) {
63
+ query.set('startedAfter', formatJiraDate(startedAfter));
64
+ }
65
+ if (startedBefore) {
66
+ query.set('startedBefore', formatJiraDate(startedBefore));
67
+ }
68
+ if (expand && expand.length > 0) {
69
+ query.set('expand', expand.join(','));
70
+ }
71
+ try {
72
+ const result = await jiraRequest(`issue/${issueKey}/worklog?${query.toString()}`);
73
+ return result;
74
+ }
75
+ catch (error) {
76
+ if (error.statusCode === 404) {
77
+ throw new JiraResourceNotFoundError('Issue', issueKey);
78
+ }
79
+ throw error;
80
+ }
81
+ }
82
+ export async function addWorklog(params) {
83
+ const { issueKey, timeSpent, comment, started, visibility, adjustEstimate, newEstimate, reduceBy } = params;
84
+ if (!validateIssueKey(issueKey)) {
85
+ throw new JiraValidationError(`Invalid issue key format: ${issueKey}`);
86
+ }
87
+ // Build query parameters for estimate adjustment
88
+ const query = new URLSearchParams({
89
+ adjustEstimate,
90
+ });
91
+ if (adjustEstimate === 'new' && newEstimate) {
92
+ query.set('newEstimate', newEstimate);
93
+ }
94
+ else if (adjustEstimate === 'manual' && reduceBy) {
95
+ query.set('reduceBy', reduceBy);
96
+ }
97
+ // Build worklog data
98
+ const worklogData = {
99
+ timeSpent,
100
+ };
101
+ if (comment) {
102
+ worklogData.comment = comment;
103
+ }
104
+ if (started) {
105
+ worklogData.started = formatJiraDate(started);
106
+ }
107
+ if (visibility) {
108
+ worklogData.visibility = visibility;
109
+ }
110
+ try {
111
+ const worklog = await jiraRequest(`issue/${issueKey}/worklog?${query.toString()}`, {
112
+ method: 'POST',
113
+ body: JSON.stringify(worklogData),
114
+ });
115
+ return worklog;
116
+ }
117
+ catch (error) {
118
+ if (error.statusCode === 404) {
119
+ throw new JiraResourceNotFoundError('Issue', issueKey);
120
+ }
121
+ if (error.statusCode === 400) {
122
+ throw new JiraValidationError('Failed to add worklog: Invalid request data');
123
+ }
124
+ throw error;
125
+ }
126
+ }
127
+ export async function updateWorklog(params) {
128
+ const { issueKey, worklogId, timeSpent, comment, started, visibility, adjustEstimate, newEstimate, increaseBy } = params;
129
+ if (!validateIssueKey(issueKey)) {
130
+ throw new JiraValidationError(`Invalid issue key format: ${issueKey}`);
131
+ }
132
+ // Build query parameters for estimate adjustment
133
+ const query = new URLSearchParams({
134
+ adjustEstimate,
135
+ });
136
+ if (adjustEstimate === 'new' && newEstimate) {
137
+ query.set('newEstimate', newEstimate);
138
+ }
139
+ else if (adjustEstimate === 'manual' && increaseBy) {
140
+ query.set('increaseBy', increaseBy);
141
+ }
142
+ // Build worklog data (only include provided fields)
143
+ const worklogData = {};
144
+ if (timeSpent) {
145
+ worklogData.timeSpent = timeSpent;
146
+ }
147
+ if (comment !== undefined) {
148
+ worklogData.comment = comment;
149
+ }
150
+ if (started) {
151
+ worklogData.started = formatJiraDate(started);
152
+ }
153
+ if (visibility) {
154
+ worklogData.visibility = visibility;
155
+ }
156
+ try {
157
+ const worklog = await jiraRequest(`issue/${issueKey}/worklog/${worklogId}?${query.toString()}`, {
158
+ method: 'PUT',
159
+ body: JSON.stringify(worklogData),
160
+ });
161
+ return worklog;
162
+ }
163
+ catch (error) {
164
+ if (error.statusCode === 404) {
165
+ throw new JiraResourceNotFoundError('Issue or Worklog', `${issueKey}/${worklogId}`);
166
+ }
167
+ if (error.statusCode === 400) {
168
+ throw new JiraValidationError('Failed to update worklog: Invalid request data');
169
+ }
170
+ throw error;
171
+ }
172
+ }
173
+ export async function deleteWorklog(params) {
174
+ const { issueKey, worklogId, adjustEstimate, newEstimate, increaseBy } = params;
175
+ if (!validateIssueKey(issueKey)) {
176
+ throw new JiraValidationError(`Invalid issue key format: ${issueKey}`);
177
+ }
178
+ // Build query parameters for estimate adjustment
179
+ const query = new URLSearchParams({
180
+ adjustEstimate,
181
+ });
182
+ if (adjustEstimate === 'new' && newEstimate) {
183
+ query.set('newEstimate', newEstimate);
184
+ }
185
+ else if (adjustEstimate === 'manual' && increaseBy) {
186
+ query.set('increaseBy', increaseBy);
187
+ }
188
+ try {
189
+ await jiraRequest(`issue/${issueKey}/worklog/${worklogId}?${query.toString()}`, {
190
+ method: 'DELETE',
191
+ });
192
+ return {
193
+ success: true,
194
+ message: `Worklog ${worklogId} deleted successfully from issue ${issueKey}`,
195
+ };
196
+ }
197
+ catch (error) {
198
+ if (error.statusCode === 404) {
199
+ throw new JiraResourceNotFoundError('Issue or Worklog', `${issueKey}/${worklogId}`);
200
+ }
201
+ throw error;
202
+ }
203
+ }
204
+ export async function getWorklog(params) {
205
+ const { issueKey, worklogId, expand } = params;
206
+ if (!validateIssueKey(issueKey)) {
207
+ throw new JiraValidationError(`Invalid issue key format: ${issueKey}`);
208
+ }
209
+ const expandParam = expand && expand.length > 0 ? `?expand=${expand.join(',')}` : '';
210
+ try {
211
+ const worklog = await jiraRequest(`issue/${issueKey}/worklog/${worklogId}${expandParam}`);
212
+ return worklog;
213
+ }
214
+ catch (error) {
215
+ if (error.statusCode === 404) {
216
+ throw new JiraResourceNotFoundError('Issue or Worklog', `${issueKey}/${worklogId}`);
217
+ }
218
+ throw error;
219
+ }
220
+ }
221
+ export async function getWorklogsByUser(params) {
222
+ const { accountId, startDate, endDate } = params;
223
+ // This uses JQL search to find issues with worklogs by the user in the date range
224
+ const jql = `worklogAuthor = "${accountId}" AND worklogDate >= "${startDate}" AND worklogDate <= "${endDate}"`;
225
+ try {
226
+ const searchResult = await jiraRequest(`search?jql=${encodeURIComponent(jql)}&expand=changelog&fields=worklog`);
227
+ // Flatten worklogs from all issues
228
+ const worklogs = [];
229
+ for (const issue of searchResult.issues) {
230
+ if (issue.fields.worklog && issue.fields.worklog.worklogs) {
231
+ // Filter worklogs by the specific user and date range
232
+ const userWorklogs = issue.fields.worklog.worklogs.filter(wl => wl.author.accountId === accountId &&
233
+ wl.started >= startDate &&
234
+ wl.started <= endDate);
235
+ worklogs.push(...userWorklogs);
236
+ }
237
+ }
238
+ return worklogs;
239
+ }
240
+ catch (error) {
241
+ if (error.statusCode === 400) {
242
+ throw new JiraValidationError('Invalid JQL query or date format');
243
+ }
244
+ throw error;
245
+ }
246
+ }
247
+ export async function getTotalTimeSpent(params) {
248
+ const { issueKey, projectKey, accountId, startDate, endDate } = params;
249
+ // Build JQL query based on parameters
250
+ const conditions = [];
251
+ if (issueKey) {
252
+ if (!validateIssueKey(issueKey)) {
253
+ throw new JiraValidationError(`Invalid issue key format: ${issueKey}`);
254
+ }
255
+ conditions.push(`issue = "${issueKey}"`);
256
+ }
257
+ if (projectKey) {
258
+ conditions.push(`project = "${projectKey}"`);
259
+ }
260
+ if (accountId) {
261
+ conditions.push(`worklogAuthor = "${accountId}"`);
262
+ }
263
+ if (startDate) {
264
+ conditions.push(`worklogDate >= "${startDate}"`);
265
+ }
266
+ if (endDate) {
267
+ conditions.push(`worklogDate <= "${endDate}"`);
268
+ }
269
+ if (conditions.length === 0) {
270
+ throw new JiraValidationError('At least one filter parameter must be provided');
271
+ }
272
+ const jql = conditions.join(' AND ');
273
+ try {
274
+ const searchResult = await jiraRequest(`search?jql=${encodeURIComponent(jql)}&expand=changelog&fields=worklog`);
275
+ let totalSeconds = 0;
276
+ let worklogCount = 0;
277
+ for (const issue of searchResult.issues) {
278
+ if (issue.fields.worklog && issue.fields.worklog.worklogs) {
279
+ for (const worklog of issue.fields.worklog.worklogs) {
280
+ // Apply additional filtering if needed
281
+ let include = true;
282
+ if (accountId && worklog.author.accountId !== accountId) {
283
+ include = false;
284
+ }
285
+ if (startDate && worklog.started < startDate) {
286
+ include = false;
287
+ }
288
+ if (endDate && worklog.started > endDate) {
289
+ include = false;
290
+ }
291
+ if (include) {
292
+ totalSeconds += worklog.timeSpentSeconds;
293
+ worklogCount++;
294
+ }
295
+ }
296
+ }
297
+ }
298
+ // Format time as human readable
299
+ const hours = Math.floor(totalSeconds / 3600);
300
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
301
+ const remainingSeconds = totalSeconds % 60;
302
+ let formatted = '';
303
+ if (hours > 0)
304
+ formatted += `${hours}h `;
305
+ if (minutes > 0)
306
+ formatted += `${minutes}m `;
307
+ if (remainingSeconds > 0 || formatted === '')
308
+ formatted += `${remainingSeconds}s`;
309
+ return {
310
+ totalTimeSpentSeconds: totalSeconds,
311
+ totalTimeSpentFormatted: formatted.trim(),
312
+ worklogCount,
313
+ };
314
+ }
315
+ catch (error) {
316
+ if (error.statusCode === 400) {
317
+ throw new JiraValidationError('Invalid JQL query or parameters');
318
+ }
319
+ throw error;
320
+ }
321
+ }
322
+ //# sourceMappingURL=worklog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worklog.js","sourceRoot":"","sources":["../../operations/worklog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEnF,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGrF,qBAAqB;AACrB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IACxE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACnF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;IACpG,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IACtG,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CACpE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAChE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IACzE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IAC9F,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC3D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KACtD,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACrD,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACvH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;IAC3G,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yEAAyE,CAAC;CACpH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAC1D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IACpF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC7E,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC3D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KACtD,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACrD,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACvH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;IAC3G,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2EAA2E,CAAC;CACxH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAC1D,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACvH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;IAC3G,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2EAA2E,CAAC;CACxH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAC5D,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CACpE,CAAC,CAAC;AAEH,2BAA2B;AAC3B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAyC;IAMzE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEtF,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,mBAAmB,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;QAC3B,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,gCAAgC;KACvF,CAAC,CAAC;IAEH,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAK7B,SAAS,QAAQ,YAAY,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEpD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,yBAAyB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAwC;IACvE,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,OAAO,EACP,OAAO,EACP,UAAU,EACV,cAAc,EACd,WAAW,EACX,QAAQ,EACT,GAAG,MAAM,CAAC;IAEX,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,mBAAmB,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,iDAAiD;IACjD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC;QAChC,cAAc;KACf,CAAC,CAAC;IAEH,IAAI,cAAc,KAAK,KAAK,IAAI,WAAW,EAAE,CAAC;QAC5C,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,cAAc,KAAK,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACnD,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,qBAAqB;IACrB,MAAM,WAAW,GAAQ;QACvB,SAAS;KACV,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC;IACtC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B,SAAS,QAAQ,YAAY,KAAK,CAAC,QAAQ,EAAE,EAAE,EAC/C;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;SAClC,CACF,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,yBAAyB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,mBAAmB,CAAC,6CAA6C,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAA2C;IAC7E,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,SAAS,EACT,OAAO,EACP,OAAO,EACP,UAAU,EACV,cAAc,EACd,WAAW,EACX,UAAU,EACX,GAAG,MAAM,CAAC;IAEX,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,mBAAmB,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,iDAAiD;IACjD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC;QAChC,cAAc;KACf,CAAC,CAAC;IAEH,IAAI,cAAc,KAAK,KAAK,IAAI,WAAW,EAAE,CAAC;QAC5C,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,cAAc,KAAK,QAAQ,IAAI,UAAU,EAAE,CAAC;QACrD,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,oDAAoD;IACpD,MAAM,WAAW,GAAQ,EAAE,CAAC;IAE5B,IAAI,SAAS,EAAE,CAAC;QACd,WAAW,CAAC,SAAS,GAAG,SAAS,CAAC;IACpC,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC;IACtC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B,SAAS,QAAQ,YAAY,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,EAC5D;YACE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;SAClC,CACF,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,yBAAyB,CAAC,kBAAkB,EAAE,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,mBAAmB,CAAC,gDAAgD,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAA2C;IAI7E,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAEhF,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,mBAAmB,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,iDAAiD;IACjD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC;QAChC,cAAc;KACf,CAAC,CAAC;IAEH,IAAI,cAAc,KAAK,KAAK,IAAI,WAAW,EAAE,CAAC;QAC5C,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,cAAc,KAAK,QAAQ,IAAI,UAAU,EAAE,CAAC;QACrD,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,CACf,SAAS,QAAQ,YAAY,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,EAC5D;YACE,MAAM,EAAE,QAAQ;SACjB,CACF,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,WAAW,SAAS,oCAAoC,QAAQ,EAAE;SAC5E,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,yBAAyB,CAAC,kBAAkB,EAAE,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAwC;IACvE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE/C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,mBAAmB,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAErF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B,SAAS,QAAQ,YAAY,SAAS,GAAG,WAAW,EAAE,CACvD,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,yBAAyB,CAAC,kBAAkB,EAAE,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAIvC;IACC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAEjD,kFAAkF;IAClF,MAAM,GAAG,GAAG,oBAAoB,SAAS,yBAAyB,SAAS,yBAAyB,OAAO,GAAG,CAAC;IAE/G,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,WAAW,CASnC,cAAc,kBAAkB,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAE5E,mCAAmC;QACnC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC1D,sDAAsD;gBACtD,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAC7D,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS;oBACjC,EAAE,CAAC,OAAO,IAAI,SAAS;oBACvB,EAAE,CAAC,OAAO,IAAI,OAAO,CACtB,CAAC;gBACF,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,mBAAmB,CAAC,kCAAkC,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAMvC;IAKC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAEvE,sCAAsC;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,mBAAmB,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,YAAY,QAAQ,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,IAAI,CAAC,cAAc,UAAU,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,UAAU,CAAC,IAAI,CAAC,oBAAoB,SAAS,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,UAAU,CAAC,IAAI,CAAC,mBAAmB,SAAS,GAAG,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,CAAC,IAAI,CAAC,mBAAmB,OAAO,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,mBAAmB,CAAC,gDAAgD,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,WAAW,CASnC,cAAc,kBAAkB,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAE5E,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC1D,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACpD,uCAAuC;oBACvC,IAAI,OAAO,GAAG,IAAI,CAAC;oBAEnB,IAAI,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;wBACxD,OAAO,GAAG,KAAK,CAAC;oBAClB,CAAC;oBAED,IAAI,SAAS,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,EAAE,CAAC;wBAC7C,OAAO,GAAG,KAAK,CAAC;oBAClB,CAAC;oBAED,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;wBACzC,OAAO,GAAG,KAAK,CAAC;oBAClB,CAAC;oBAED,IAAI,OAAO,EAAE,CAAC;wBACZ,YAAY,IAAI,OAAO,CAAC,gBAAgB,CAAC;wBACzC,YAAY,EAAE,CAAC;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,MAAM,gBAAgB,GAAG,YAAY,GAAG,EAAE,CAAC;QAE3C,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,KAAK,GAAG,CAAC;YAAE,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC;QACzC,IAAI,OAAO,GAAG,CAAC;YAAE,SAAS,IAAI,GAAG,OAAO,IAAI,CAAC;QAC7C,IAAI,gBAAgB,GAAG,CAAC,IAAI,SAAS,KAAK,EAAE;YAAE,SAAS,IAAI,GAAG,gBAAgB,GAAG,CAAC;QAElF,OAAO;YACL,qBAAqB,EAAE,YAAY;YACnC,uBAAuB,EAAE,SAAS,CAAC,IAAI,EAAE;YACzC,YAAY;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,mBAAmB,CAAC,iCAAiC,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Test token discovery independently
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=test-token-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-token-discovery.d.ts","sourceRoot":"","sources":["../test-token-discovery.ts"],"names":[],"mappings":";AAEA;;GAEG"}
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Test token discovery independently
4
+ */
5
+ import { getCachedJiraUrl, getAccessibleSites } from './common/token-parser.js';
6
+ const ACCESS_TOKEN = "eyJraWQiOiJhdXRoLmF0bGFzc2lhbi5jb20tQUNDRVNTLTk0ZTczYTkwLTUxYWQtNGFjMS1hOWFjLWU4NGUwNDVjNDU3ZCIsImFsZyI6IlJTMjU2In0.eyJqdGkiOiI2MmM3MmI1Zi1lZGZlLTQ4ZjAtOWRmZi1lZjEyMTljNTZhMTciLCJzdWIiOiI2MzA0OGVlMDdjZmFjMWJmYTZmOWI5ODUiLCJuYmYiOjE3NjA4NjA1NzAsImlzcyI6Imh0dHBzOi8vYXV0aC5hdGxhc3NpYW4uY29tIiwiaWF0IjoxNzYwODYwNTcwLCJleHAiOjE3NjA4NjQxNzAsImF1ZCI6IlBoYnhuMnJZZlNscHRvYlJ4OW40azF5Z3hnN0d2R0ljIiwiaHR0cHM6Ly9pZC5hdGxhc3NpYW4uY29tL3J0aSI6IjY1ZTRhMWJiLWRmN2YtNDllYS1iMmIxLTlkZDFlYmQwZjMyMyIsImh0dHBzOi8vaWQuYXRsYXNzaWFuLmNvbS91anQiOiI4NWJlZjM2ZS1iOTAxLTQ3YjAtOWMxZS1hMWFlNmIwZTA4M2QiLCJodHRwczovL2F0bGFzc2lhbi5jb20vYXV0aFByb2ZpbGUiOiJvYXV0aC5lY29zeXN0ZW0ub2F1dGhJbnRlZ3JhdGlvbiIsImh0dHBzOi8vaWQuYXRsYXNzaWFuLmNvbS9hdGxfdG9rZW5fdHlwZSI6IkFDQ0VTUyIsImNsaWVudF9pZCI6IlBoYnhuMnJZZlNscHRvYlJ4OW40azF5Z3hnN0d2R0ljIiwiaHR0cHM6Ly9hdGxhc3NpYW4uY29tL2ZpcnN0UGFydHkiOmZhbHNlLCJodHRwczovL2F0bGFzc2lhbi5jb20vdmVyaWZpZWQiOnRydWUsImh0dHBzOi8vaWQuYXRsYXNzaWFuLmNvbS9wcm9jZXNzUmVnaW9uIjoidXMtd2VzdC0yIiwiaHR0cHM6Ly9pZC5hdGxhc3NpYW4uY29tL3Nlc3Npb25faWQiOiJiOWQ1ZTQwNi05ZmM1LTQzOTQtYjIxNC1jMjI3ZTlkZWJjYzkiLCJodHRwczovL2F0bGFzc2lhbi5jb20vZW1haWxEb21haW4iOiJnbWFpbC5jb20iLCJodHRwczovL2F0bGFzc2lhbi5jb20vM2xvIjp0cnVlLCJodHRwczovL2F0bGFzc2lhbi5jb20vc3lzdGVtQWNjb3VudEVtYWlsIjoiODQ3ZDgwNjgtMDY1ZC00OGYwLThjNmEtMWI3NDg0NWRkNGZhQGNvbm5lY3QuYXRsYXNzaWFuLmNvbSIsImh0dHBzOi8vaWQuYXRsYXNzaWFuLmNvbS92ZXJpZmllZCI6dHJ1ZSwiaHR0cHM6Ly9hdGxhc3NpYW4uY29tL3N5c3RlbUFjY291bnRJZCI6IjcxMjAyMDo1MTllMDg0Ny0wNmI2LTQ0ZGQtYmRkOC01MTBiZDJmMjMxMDUiLCJodHRwczovL2F0bGFzc2lhbi5jb20vb2F1dGhDbGllbnRJZCI6IlBoYnhuMnJZZlNscHRvYlJ4OW40azF5Z3hnN0d2R0ljIiwiaHR0cHM6Ly9pZC5hdGxhc3NpYW4uY29tL3JlZnJlc2hfY2hhaW5faWQiOiJQaGJ4bjJyWWZTbHB0b2JSeDluNGsxeWd4ZzdHdkdJYy02MzA0OGVlMDdjZmFjMWJmYTZmOWI5ODUtNGNkMmFkNmItODMxOS00MzRhLTg0ZjItMzljYjg1ODQ4MzExIiwic2NvcGUiOiJvZmZsaW5lX2FjY2VzcyByZWFkOmppcmEtdXNlciByZWFkOmppcmEtd29yayB3cml0ZTpqaXJhLXdvcmsiLCJodHRwczovL2F0bGFzc2lhbi5jb20vc3lzdGVtQWNjb3VudEVtYWlsRG9tYWluIjoiY29ubmVjdC5hdGxhc3NpYW4uY29tIn0.rh6wStVXBpxYf-Hq1CQ1rTJjiM9fTqN3swHcU5OBIz4JygH6eJb7qwMx3dcmKSbC6Ll8CJyCyZMNYVBhN7dLSFmkcSo-Y-5fHFRiBgRUQZD9a6aXN8NZMIMLYMIfA9kIwEGiL4_sBGE0cf3PZG12gky4oRYRvNRtxI9ClTrHV6bR0BFhXMyePJc9d2npkkbHVlo5e36p_gyOODLbEghezw7d7n-j-w2yNjmoCsphWcSsd7uKMH2tQqixsIACNrHqGGSag9VqUdqW9YhkQIZZV0hX-ub4PtlHylqPYX7LdQisLyzCg40YyZb4SOr4_yO4TPPkBDUKqz5b9QzGspTHcw";
7
+ async function test() {
8
+ console.log('๐Ÿงช Testing Token Discovery\n');
9
+ try {
10
+ console.log('Step 1: Get accessible sites...');
11
+ const sites = await getAccessibleSites(ACCESS_TOKEN);
12
+ console.log('โœ… Success! Found sites:', JSON.stringify(sites, null, 2));
13
+ console.log('');
14
+ console.log('Step 2: Get cached Jira URL...');
15
+ const url = await getCachedJiraUrl(ACCESS_TOKEN);
16
+ console.log(`โœ… Success! Jira URL: ${url}`);
17
+ console.log('');
18
+ console.log('โœ… All tests passed!');
19
+ }
20
+ catch (error) {
21
+ console.error('โŒ Error:', error);
22
+ process.exit(1);
23
+ }
24
+ }
25
+ test();
26
+ //# sourceMappingURL=test-token-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-token-discovery.js","sourceRoot":"","sources":["../test-token-discovery.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEhF,MAAM,YAAY,GAAG,gxEAAgxE,CAAC;AAEtyE,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@gongrzhe/server-jira",
3
+ "version": "0.1.0",
4
+ "description": "Stateless multi-tenant MCP server for Atlassian JIRA with OAuth 2.0 and automatic URL discovery",
5
+ "license": "MIT",
6
+ "author": "Gong Rzhe",
7
+ "keywords": [
8
+ "mcp",
9
+ "model-context-protocol",
10
+ "jira",
11
+ "atlassian",
12
+ "oauth",
13
+ "oauth2",
14
+ "api",
15
+ "rest-api",
16
+ "multi-tenant",
17
+ "stateless",
18
+ "issue-tracking",
19
+ "project-management"
20
+ ],
21
+ "type": "module",
22
+ "bin": {
23
+ "mcp-server-jira": "dist/index.js"
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "README.md"
28
+ ],
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "scripts": {
33
+ "build": "tsc && shx chmod +x dist/*.js",
34
+ "prepare": "npm run build",
35
+ "watch": "tsc --watch",
36
+ "dev": "npx tsx index.ts",
37
+ "start": "node dist/index.js"
38
+ },
39
+ "dependencies": {
40
+ "@modelcontextprotocol/sdk": "^1.17.3",
41
+ "@types/node": "^22",
42
+ "express": "^4.18.2",
43
+ "node-fetch": "^3.3.2",
44
+ "zod": "^3.22.4",
45
+ "zod-to-json-schema": "^3.23.5"
46
+ },
47
+ "devDependencies": {
48
+ "@types/express": "^4.17.21",
49
+ "open": "^10.2.0",
50
+ "shx": "^0.3.4",
51
+ "tsx": "^4.7.1",
52
+ "typescript": "^5.8.3"
53
+ }
54
+ }