@firfi/huly-mcp 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -1
- package/dist/index.cjs +25858 -25303
- package/package.json +31 -19
- package/dist/index.js +0 -116694
- package/dist/src/config/config.d.ts +0 -94
- package/dist/src/config/config.d.ts.map +0 -1
- package/dist/src/config/config.js +0 -247
- package/dist/src/config/config.js.map +0 -1
- package/dist/src/domain/schemas.d.ts +0 -256
- package/dist/src/domain/schemas.d.ts.map +0 -1
- package/dist/src/domain/schemas.js +0 -275
- package/dist/src/domain/schemas.js.map +0 -1
- package/dist/src/huly/client.d.ts +0 -63
- package/dist/src/huly/client.d.ts.map +0 -1
- package/dist/src/huly/client.js +0 -149
- package/dist/src/huly/client.js.map +0 -1
- package/dist/src/huly/errors.d.ts +0 -133
- package/dist/src/huly/errors.d.ts.map +0 -1
- package/dist/src/huly/errors.js +0 -108
- package/dist/src/huly/errors.js.map +0 -1
- package/dist/src/huly/operations/issues.d.ts +0 -122
- package/dist/src/huly/operations/issues.d.ts.map +0 -1
- package/dist/src/huly/operations/issues.js +0 -627
- package/dist/src/huly/operations/issues.js.map +0 -1
- package/dist/src/index.d.ts +0 -43
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -154
- package/dist/src/index.js.map +0 -1
- package/dist/src/mcp/error-mapping.d.ts +0 -67
- package/dist/src/mcp/error-mapping.d.ts.map +0 -1
- package/dist/src/mcp/error-mapping.js +0 -195
- package/dist/src/mcp/error-mapping.js.map +0 -1
- package/dist/src/mcp/server.d.ts +0 -86
- package/dist/src/mcp/server.d.ts.map +0 -1
- package/dist/src/mcp/server.js +0 -216
- package/dist/src/mcp/server.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,627 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Issue domain operations for Huly MCP server.
|
|
3
|
-
*
|
|
4
|
-
* Provides typed operations for querying issues from Huly platform.
|
|
5
|
-
* Operations use HulyClient service and return typed domain objects.
|
|
6
|
-
*
|
|
7
|
-
* @module
|
|
8
|
-
*/
|
|
9
|
-
import { SortingOrder, generateId } from "@hcengineering/core";
|
|
10
|
-
import { IssuePriority } from "@hcengineering/tracker";
|
|
11
|
-
import { makeRank } from "@hcengineering/rank";
|
|
12
|
-
import { Effect } from "effect";
|
|
13
|
-
import { HulyClient } from "../client.js";
|
|
14
|
-
import { ProjectNotFoundError, InvalidStatusError, IssueNotFoundError, PersonNotFoundError, } from "../errors.js";
|
|
15
|
-
// Import plugin objects at runtime (CommonJS modules)
|
|
16
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
17
|
-
const tracker = require("@hcengineering/tracker").default;
|
|
18
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
19
|
-
const contact = require("@hcengineering/contact").default;
|
|
20
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
21
|
-
const task = require("@hcengineering/task").default;
|
|
22
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
23
|
-
const tags = require("@hcengineering/tags").default;
|
|
24
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
25
|
-
const core = require("@hcengineering/core").default;
|
|
26
|
-
// --- Priority Mapping ---
|
|
27
|
-
/**
|
|
28
|
-
* Map Huly numeric priority to string.
|
|
29
|
-
*/
|
|
30
|
-
const priorityToString = (priority) => {
|
|
31
|
-
switch (priority) {
|
|
32
|
-
case IssuePriority.Urgent:
|
|
33
|
-
return "urgent";
|
|
34
|
-
case IssuePriority.High:
|
|
35
|
-
return "high";
|
|
36
|
-
case IssuePriority.Medium:
|
|
37
|
-
return "medium";
|
|
38
|
-
case IssuePriority.Low:
|
|
39
|
-
return "low";
|
|
40
|
-
case IssuePriority.NoPriority:
|
|
41
|
-
default:
|
|
42
|
-
return "no-priority";
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* Map string priority to Huly numeric priority.
|
|
47
|
-
*/
|
|
48
|
-
const stringToPriority = (priority) => {
|
|
49
|
-
switch (priority) {
|
|
50
|
-
case "urgent":
|
|
51
|
-
return IssuePriority.Urgent;
|
|
52
|
-
case "high":
|
|
53
|
-
return IssuePriority.High;
|
|
54
|
-
case "medium":
|
|
55
|
-
return IssuePriority.Medium;
|
|
56
|
-
case "low":
|
|
57
|
-
return IssuePriority.Low;
|
|
58
|
-
case "no-priority":
|
|
59
|
-
default:
|
|
60
|
-
return IssuePriority.NoPriority;
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
// --- Status Category Helpers ---
|
|
64
|
-
/**
|
|
65
|
-
* Check if a status is a "done" category status.
|
|
66
|
-
* Done = the issue is completed successfully.
|
|
67
|
-
*/
|
|
68
|
-
const isDoneStatus = (statusRef, statuses) => {
|
|
69
|
-
const status = statuses.find(s => s._id === statusRef);
|
|
70
|
-
if (!status?.category)
|
|
71
|
-
return false;
|
|
72
|
-
// task.statusCategory.Won is the "done" category
|
|
73
|
-
const wonCategory = task.statusCategory.Won;
|
|
74
|
-
return status.category === wonCategory;
|
|
75
|
-
};
|
|
76
|
-
/**
|
|
77
|
-
* Check if a status is a "canceled" category status.
|
|
78
|
-
*/
|
|
79
|
-
const isCanceledStatus = (statusRef, statuses) => {
|
|
80
|
-
const status = statuses.find(s => s._id === statusRef);
|
|
81
|
-
if (!status?.category)
|
|
82
|
-
return false;
|
|
83
|
-
// task.statusCategory.Lost is the "canceled" category
|
|
84
|
-
const lostCategory = task.statusCategory.Lost;
|
|
85
|
-
return status.category === lostCategory;
|
|
86
|
-
};
|
|
87
|
-
// --- Operations ---
|
|
88
|
-
/**
|
|
89
|
-
* List issues with filters.
|
|
90
|
-
*
|
|
91
|
-
* Filters:
|
|
92
|
-
* - project (required): Project identifier
|
|
93
|
-
* - status: "open" | "done" | "canceled" | specific status name
|
|
94
|
-
* - assignee: Email or person name
|
|
95
|
-
* - limit: Max results (default 50, max 200)
|
|
96
|
-
*
|
|
97
|
-
* Results sorted by modifiedOn descending.
|
|
98
|
-
*/
|
|
99
|
-
export const listIssues = (params) => Effect.gen(function* () {
|
|
100
|
-
const client = yield* HulyClient;
|
|
101
|
-
// 1. Find project by identifier
|
|
102
|
-
const projectResult = yield* client.findOne(tracker.class.Project, { identifier: params.project });
|
|
103
|
-
if (projectResult === undefined) {
|
|
104
|
-
return yield* new ProjectNotFoundError({ identifier: params.project });
|
|
105
|
-
}
|
|
106
|
-
const project = projectResult;
|
|
107
|
-
// 2. Get all statuses for status name resolution
|
|
108
|
-
const allStatuses = yield* client.findAll(tracker.class.IssueStatus, {});
|
|
109
|
-
// Cast to work with status categories
|
|
110
|
-
const statusList = allStatuses;
|
|
111
|
-
// 3. Build query based on filters
|
|
112
|
-
const query = {
|
|
113
|
-
space: project._id,
|
|
114
|
-
};
|
|
115
|
-
// 3a. Handle status filter
|
|
116
|
-
if (params.status !== undefined) {
|
|
117
|
-
const statusFilter = params.status.toLowerCase();
|
|
118
|
-
if (statusFilter === "open") {
|
|
119
|
-
// Open = not done and not canceled
|
|
120
|
-
const doneAndCanceledStatuses = statusList
|
|
121
|
-
.filter(s => isDoneStatus(s._id, statusList) ||
|
|
122
|
-
isCanceledStatus(s._id, statusList))
|
|
123
|
-
.map(s => s._id);
|
|
124
|
-
if (doneAndCanceledStatuses.length > 0) {
|
|
125
|
-
query.status = { $nin: doneAndCanceledStatuses };
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
else if (statusFilter === "done") {
|
|
129
|
-
// Done = completed successfully
|
|
130
|
-
const doneStatuses = statusList
|
|
131
|
-
.filter(s => isDoneStatus(s._id, statusList))
|
|
132
|
-
.map(s => s._id);
|
|
133
|
-
if (doneStatuses.length > 0) {
|
|
134
|
-
query.status = { $in: doneStatuses };
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
// No done statuses found, return empty
|
|
138
|
-
return [];
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
else if (statusFilter === "canceled") {
|
|
142
|
-
// Canceled
|
|
143
|
-
const canceledStatuses = statusList
|
|
144
|
-
.filter(s => isCanceledStatus(s._id, statusList))
|
|
145
|
-
.map(s => s._id);
|
|
146
|
-
if (canceledStatuses.length > 0) {
|
|
147
|
-
query.status = { $in: canceledStatuses };
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
return [];
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
// Specific status name - case insensitive match
|
|
155
|
-
const matchingStatus = statusList.find(s => s.name.toLowerCase() === statusFilter);
|
|
156
|
-
if (matchingStatus === undefined) {
|
|
157
|
-
return yield* new InvalidStatusError({
|
|
158
|
-
status: params.status,
|
|
159
|
-
project: params.project,
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
query.status = matchingStatus._id;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
// 3b. Handle assignee filter
|
|
166
|
-
if (params.assignee !== undefined) {
|
|
167
|
-
const assigneePerson = yield* findPersonByEmailOrName(client, params.assignee);
|
|
168
|
-
if (assigneePerson !== undefined) {
|
|
169
|
-
query.assignee = assigneePerson._id;
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
// Assignee not found - return empty results
|
|
173
|
-
return [];
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// 4. Execute query
|
|
177
|
-
const limit = Math.min(params.limit ?? 50, 200);
|
|
178
|
-
const issues = yield* client.findAll(tracker.class.Issue, query, {
|
|
179
|
-
limit,
|
|
180
|
-
sort: {
|
|
181
|
-
modifiedOn: SortingOrder.Descending
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
// 5. Transform to IssueSummary
|
|
185
|
-
const summaries = [];
|
|
186
|
-
for (const issue of issues) {
|
|
187
|
-
// Look up status name
|
|
188
|
-
const statusDoc = statusList.find(s => s._id === issue.status);
|
|
189
|
-
const statusName = statusDoc?.name ?? "Unknown";
|
|
190
|
-
// Look up assignee name if assigned
|
|
191
|
-
let assigneeName;
|
|
192
|
-
if (issue.assignee !== null) {
|
|
193
|
-
const person = yield* client.findOne(contact.class.Person, { _id: issue.assignee });
|
|
194
|
-
if (person) {
|
|
195
|
-
assigneeName = person.name;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
summaries.push({
|
|
199
|
-
identifier: issue.identifier,
|
|
200
|
-
title: issue.title,
|
|
201
|
-
status: statusName,
|
|
202
|
-
priority: priorityToString(issue.priority),
|
|
203
|
-
assignee: assigneeName,
|
|
204
|
-
modifiedOn: issue.modifiedOn,
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
return summaries;
|
|
208
|
-
});
|
|
209
|
-
/**
|
|
210
|
-
* Find a person by email or name.
|
|
211
|
-
*/
|
|
212
|
-
const findPersonByEmailOrName = (client, emailOrName) => Effect.gen(function* () {
|
|
213
|
-
// First try to find by email in channels
|
|
214
|
-
const channels = yield* client.findAll(contact.class.Channel, { value: emailOrName });
|
|
215
|
-
if (channels.length > 0) {
|
|
216
|
-
// Get the person attached to this channel
|
|
217
|
-
const channel = channels[0];
|
|
218
|
-
const person = yield* client.findOne(contact.class.Person, { _id: channel.attachedTo });
|
|
219
|
-
if (person) {
|
|
220
|
-
return person;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
// Fall back to name search
|
|
224
|
-
const persons = yield* client.findAll(contact.class.Person, { name: emailOrName });
|
|
225
|
-
if (persons.length > 0) {
|
|
226
|
-
return persons[0];
|
|
227
|
-
}
|
|
228
|
-
// Try partial name match
|
|
229
|
-
const allPersons = yield* client.findAll(contact.class.Person, {});
|
|
230
|
-
const lowerName = emailOrName.toLowerCase();
|
|
231
|
-
const matchingPerson = allPersons.find(p => p.name.toLowerCase().includes(lowerName));
|
|
232
|
-
return matchingPerson;
|
|
233
|
-
});
|
|
234
|
-
// --- Identifier Parsing ---
|
|
235
|
-
/**
|
|
236
|
-
* Parse an issue identifier.
|
|
237
|
-
* Accepts:
|
|
238
|
-
* - Full identifier: "HULY-123"
|
|
239
|
-
* - Numeric only: "123" or 123
|
|
240
|
-
*
|
|
241
|
-
* Returns the full identifier if project prefix is provided,
|
|
242
|
-
* or constructs it from the project identifier and number.
|
|
243
|
-
*/
|
|
244
|
-
const parseIssueIdentifier = (identifier, projectIdentifier) => {
|
|
245
|
-
const idStr = String(identifier).trim();
|
|
246
|
-
// Check if it's a full identifier like "HULY-123"
|
|
247
|
-
const match = idStr.match(/^([A-Z]+)-(\d+)$/i);
|
|
248
|
-
if (match) {
|
|
249
|
-
return {
|
|
250
|
-
fullIdentifier: `${match[1].toUpperCase()}-${match[2]}`,
|
|
251
|
-
number: parseInt(match[2], 10),
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
// Check if it's just a number
|
|
255
|
-
const numMatch = idStr.match(/^\d+$/);
|
|
256
|
-
if (numMatch) {
|
|
257
|
-
const num = parseInt(idStr, 10);
|
|
258
|
-
return {
|
|
259
|
-
fullIdentifier: `${projectIdentifier.toUpperCase()}-${num}`,
|
|
260
|
-
number: num,
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
// Not a valid format, return as-is for the query to fail gracefully
|
|
264
|
-
return { fullIdentifier: idStr, number: null };
|
|
265
|
-
};
|
|
266
|
-
// --- Get Issue Operation ---
|
|
267
|
-
/**
|
|
268
|
-
* Get a single issue with full details.
|
|
269
|
-
*
|
|
270
|
-
* Looks up issue by identifier (e.g., "HULY-123" or just 123).
|
|
271
|
-
* Returns full issue including:
|
|
272
|
-
* - Description rendered as markdown
|
|
273
|
-
* - Assignee name (not just ID)
|
|
274
|
-
* - Status name
|
|
275
|
-
* - All metadata
|
|
276
|
-
*
|
|
277
|
-
* @param params - Get issue parameters
|
|
278
|
-
* @returns Full issue object
|
|
279
|
-
* @throws ProjectNotFoundError if project doesn't exist
|
|
280
|
-
* @throws IssueNotFoundError if issue doesn't exist in project
|
|
281
|
-
*/
|
|
282
|
-
export const getIssue = (params) => Effect.gen(function* () {
|
|
283
|
-
const client = yield* HulyClient;
|
|
284
|
-
// 1. Find project by identifier
|
|
285
|
-
const projectResult = yield* client.findOne(tracker.class.Project, { identifier: params.project });
|
|
286
|
-
if (projectResult === undefined) {
|
|
287
|
-
return yield* new ProjectNotFoundError({ identifier: params.project });
|
|
288
|
-
}
|
|
289
|
-
const project = projectResult;
|
|
290
|
-
// 2. Parse the identifier
|
|
291
|
-
const { fullIdentifier, number } = parseIssueIdentifier(params.identifier, params.project);
|
|
292
|
-
// 3. Find the issue - try by full identifier first, then by number
|
|
293
|
-
let issue = yield* client.findOne(tracker.class.Issue, {
|
|
294
|
-
space: project._id,
|
|
295
|
-
identifier: fullIdentifier,
|
|
296
|
-
});
|
|
297
|
-
// If not found by identifier and we have a number, try by number
|
|
298
|
-
if (issue === undefined && number !== null) {
|
|
299
|
-
issue = yield* client.findOne(tracker.class.Issue, {
|
|
300
|
-
space: project._id,
|
|
301
|
-
number,
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
if (issue === undefined) {
|
|
305
|
-
return yield* new IssueNotFoundError({
|
|
306
|
-
identifier: params.identifier,
|
|
307
|
-
project: params.project,
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
// 4. Get all statuses for status name resolution
|
|
311
|
-
const allStatuses = yield* client.findAll(tracker.class.IssueStatus, {});
|
|
312
|
-
const statusList = allStatuses;
|
|
313
|
-
// 5. Look up status name
|
|
314
|
-
const statusDoc = statusList.find(s => s._id === issue.status);
|
|
315
|
-
const statusName = statusDoc?.name ?? "Unknown";
|
|
316
|
-
// 6. Look up assignee name if assigned
|
|
317
|
-
let assigneeName;
|
|
318
|
-
let assigneeRef;
|
|
319
|
-
if (issue.assignee !== null) {
|
|
320
|
-
const person = yield* client.findOne(contact.class.Person, { _id: issue.assignee });
|
|
321
|
-
if (person) {
|
|
322
|
-
assigneeName = person.name;
|
|
323
|
-
assigneeRef = {
|
|
324
|
-
id: String(person._id),
|
|
325
|
-
name: person.name,
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
// 7. Fetch markdown description if present
|
|
330
|
-
let description;
|
|
331
|
-
if (issue.description) {
|
|
332
|
-
description = yield* client.fetchMarkup(issue._class, issue._id, "description", issue.description, "markdown");
|
|
333
|
-
}
|
|
334
|
-
// 8. Build and return the full Issue
|
|
335
|
-
const result = {
|
|
336
|
-
identifier: issue.identifier,
|
|
337
|
-
title: issue.title,
|
|
338
|
-
description,
|
|
339
|
-
status: statusName,
|
|
340
|
-
priority: priorityToString(issue.priority),
|
|
341
|
-
assignee: assigneeName,
|
|
342
|
-
assigneeRef,
|
|
343
|
-
project: params.project,
|
|
344
|
-
modifiedOn: issue.modifiedOn,
|
|
345
|
-
createdOn: issue.createdOn,
|
|
346
|
-
dueDate: issue.dueDate ?? undefined,
|
|
347
|
-
estimation: issue.estimation,
|
|
348
|
-
};
|
|
349
|
-
return result;
|
|
350
|
-
});
|
|
351
|
-
/**
|
|
352
|
-
* Create a new issue in a project.
|
|
353
|
-
*
|
|
354
|
-
* Creates issue with:
|
|
355
|
-
* - Title (required)
|
|
356
|
-
* - Description (optional, markdown supported)
|
|
357
|
-
* - Priority (optional, defaults to no-priority)
|
|
358
|
-
* - Status (optional, uses project default)
|
|
359
|
-
* - Assignee (optional, by email or name)
|
|
360
|
-
*
|
|
361
|
-
* @param params - Create issue parameters
|
|
362
|
-
* @returns Created issue identifier (e.g., "HULY-123")
|
|
363
|
-
* @throws ProjectNotFoundError if project doesn't exist
|
|
364
|
-
* @throws InvalidStatusError if specified status is invalid
|
|
365
|
-
* @throws PersonNotFoundError if assignee not found
|
|
366
|
-
*/
|
|
367
|
-
export const createIssue = (params) => Effect.gen(function* () {
|
|
368
|
-
const client = yield* HulyClient;
|
|
369
|
-
// 1. Find project by identifier
|
|
370
|
-
const projectResult = yield* client.findOne(tracker.class.Project, { identifier: params.project });
|
|
371
|
-
if (projectResult === undefined) {
|
|
372
|
-
return yield* new ProjectNotFoundError({ identifier: params.project });
|
|
373
|
-
}
|
|
374
|
-
const project = projectResult;
|
|
375
|
-
// 2. Generate unique issue ID
|
|
376
|
-
const issueId = generateId();
|
|
377
|
-
// 3. Increment project sequence to get issue number
|
|
378
|
-
const incResult = yield* client.updateDoc(tracker.class.Project, "core:space:Space", project._id, { $inc: { sequence: 1 } }, true);
|
|
379
|
-
// Extract sequence from result
|
|
380
|
-
const sequence = incResult.object?.sequence ?? project.sequence + 1;
|
|
381
|
-
// 4. Resolve status
|
|
382
|
-
let statusRef = project.defaultIssueStatus;
|
|
383
|
-
if (params.status !== undefined) {
|
|
384
|
-
// Get all statuses and find matching one
|
|
385
|
-
const allStatuses = yield* client.findAll(tracker.class.IssueStatus, {});
|
|
386
|
-
const statusFilter = params.status.toLowerCase();
|
|
387
|
-
const matchingStatus = allStatuses.find(s => s.name.toLowerCase() === statusFilter);
|
|
388
|
-
if (matchingStatus === undefined) {
|
|
389
|
-
return yield* new InvalidStatusError({
|
|
390
|
-
status: params.status,
|
|
391
|
-
project: params.project,
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
statusRef = matchingStatus._id;
|
|
395
|
-
}
|
|
396
|
-
// 5. Resolve assignee (if provided)
|
|
397
|
-
let assigneeRef = null;
|
|
398
|
-
if (params.assignee !== undefined) {
|
|
399
|
-
const person = yield* findPersonByEmailOrName(client, params.assignee);
|
|
400
|
-
if (person === undefined) {
|
|
401
|
-
return yield* new PersonNotFoundError({ identifier: params.assignee });
|
|
402
|
-
}
|
|
403
|
-
assigneeRef = person._id;
|
|
404
|
-
}
|
|
405
|
-
// 6. Calculate rank (append to end)
|
|
406
|
-
const lastIssue = yield* client.findOne(tracker.class.Issue, { space: project._id }, { sort: { rank: SortingOrder.Descending } });
|
|
407
|
-
const rank = makeRank(lastIssue?.rank, undefined);
|
|
408
|
-
// 7. Upload description if provided
|
|
409
|
-
let descriptionMarkupRef = null;
|
|
410
|
-
if (params.description !== undefined && params.description.trim() !== "") {
|
|
411
|
-
descriptionMarkupRef = yield* client.uploadMarkup(tracker.class.Issue, issueId, "description", params.description, "markdown");
|
|
412
|
-
}
|
|
413
|
-
// 8. Map priority
|
|
414
|
-
const priority = stringToPriority(params.priority);
|
|
415
|
-
// 9. Build identifier
|
|
416
|
-
const identifier = `${project.identifier}-${sequence}`;
|
|
417
|
-
// 10. Create issue using addCollection
|
|
418
|
-
yield* client.addCollection(tracker.class.Issue, project._id, project._id, tracker.class.Project, "issues", {
|
|
419
|
-
title: params.title,
|
|
420
|
-
description: descriptionMarkupRef,
|
|
421
|
-
status: statusRef,
|
|
422
|
-
number: sequence,
|
|
423
|
-
kind: tracker.taskTypes.Issue,
|
|
424
|
-
identifier,
|
|
425
|
-
priority,
|
|
426
|
-
assignee: assigneeRef,
|
|
427
|
-
component: null,
|
|
428
|
-
estimation: 0,
|
|
429
|
-
remainingTime: 0,
|
|
430
|
-
reportedTime: 0,
|
|
431
|
-
reports: 0,
|
|
432
|
-
subIssues: 0,
|
|
433
|
-
parents: [],
|
|
434
|
-
childInfo: [],
|
|
435
|
-
dueDate: null,
|
|
436
|
-
rank,
|
|
437
|
-
}, issueId);
|
|
438
|
-
return { identifier };
|
|
439
|
-
});
|
|
440
|
-
/**
|
|
441
|
-
* Update an existing issue in a project.
|
|
442
|
-
*
|
|
443
|
-
* Updates only provided fields:
|
|
444
|
-
* - title: New title
|
|
445
|
-
* - description: New markdown description (uploaded via uploadMarkup)
|
|
446
|
-
* - status: New status (resolved by name)
|
|
447
|
-
* - priority: New priority
|
|
448
|
-
* - assignee: New assignee email/name, or null to unassign
|
|
449
|
-
*
|
|
450
|
-
* @param params - Update issue parameters
|
|
451
|
-
* @returns Updated issue identifier and success flag
|
|
452
|
-
* @throws ProjectNotFoundError if project doesn't exist
|
|
453
|
-
* @throws IssueNotFoundError if issue doesn't exist
|
|
454
|
-
* @throws InvalidStatusError if specified status is invalid
|
|
455
|
-
* @throws PersonNotFoundError if assignee not found
|
|
456
|
-
*/
|
|
457
|
-
export const updateIssue = (params) => Effect.gen(function* () {
|
|
458
|
-
const client = yield* HulyClient;
|
|
459
|
-
// 1. Find project by identifier
|
|
460
|
-
const projectResult = yield* client.findOne(tracker.class.Project, { identifier: params.project });
|
|
461
|
-
if (projectResult === undefined) {
|
|
462
|
-
return yield* new ProjectNotFoundError({ identifier: params.project });
|
|
463
|
-
}
|
|
464
|
-
const project = projectResult;
|
|
465
|
-
// 2. Parse the identifier and find the issue
|
|
466
|
-
const { fullIdentifier, number } = parseIssueIdentifier(params.identifier, params.project);
|
|
467
|
-
// 3. Find the issue - try by full identifier first, then by number
|
|
468
|
-
let issue = yield* client.findOne(tracker.class.Issue, {
|
|
469
|
-
space: project._id,
|
|
470
|
-
identifier: fullIdentifier,
|
|
471
|
-
});
|
|
472
|
-
// If not found by identifier and we have a number, try by number
|
|
473
|
-
if (issue === undefined && number !== null) {
|
|
474
|
-
issue = yield* client.findOne(tracker.class.Issue, {
|
|
475
|
-
space: project._id,
|
|
476
|
-
number,
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
if (issue === undefined) {
|
|
480
|
-
return yield* new IssueNotFoundError({
|
|
481
|
-
identifier: params.identifier,
|
|
482
|
-
project: params.project,
|
|
483
|
-
});
|
|
484
|
-
}
|
|
485
|
-
// 4. Build update operations based on provided fields
|
|
486
|
-
const updateOps = {};
|
|
487
|
-
// 4a. Handle title update
|
|
488
|
-
if (params.title !== undefined) {
|
|
489
|
-
updateOps.title = params.title;
|
|
490
|
-
}
|
|
491
|
-
// 4b. Handle description update - need to upload markdown first
|
|
492
|
-
if (params.description !== undefined) {
|
|
493
|
-
if (params.description.trim() === "") {
|
|
494
|
-
// Empty description means clear it
|
|
495
|
-
updateOps.description = null;
|
|
496
|
-
}
|
|
497
|
-
else {
|
|
498
|
-
const descriptionMarkupRef = yield* client.uploadMarkup(tracker.class.Issue, issue._id, "description", params.description, "markdown");
|
|
499
|
-
updateOps.description = descriptionMarkupRef;
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
// 4c. Handle status update
|
|
503
|
-
if (params.status !== undefined) {
|
|
504
|
-
const allStatuses = yield* client.findAll(tracker.class.IssueStatus, {});
|
|
505
|
-
const statusFilter = params.status.toLowerCase();
|
|
506
|
-
const matchingStatus = allStatuses.find(s => s.name.toLowerCase() === statusFilter);
|
|
507
|
-
if (matchingStatus === undefined) {
|
|
508
|
-
return yield* new InvalidStatusError({
|
|
509
|
-
status: params.status,
|
|
510
|
-
project: params.project,
|
|
511
|
-
});
|
|
512
|
-
}
|
|
513
|
-
updateOps.status = matchingStatus._id;
|
|
514
|
-
}
|
|
515
|
-
// 4d. Handle priority update
|
|
516
|
-
if (params.priority !== undefined) {
|
|
517
|
-
updateOps.priority = stringToPriority(params.priority);
|
|
518
|
-
}
|
|
519
|
-
// 4e. Handle assignee update (null means unassign)
|
|
520
|
-
if (params.assignee !== undefined) {
|
|
521
|
-
if (params.assignee === null) {
|
|
522
|
-
// Unassign
|
|
523
|
-
updateOps.assignee = null;
|
|
524
|
-
}
|
|
525
|
-
else {
|
|
526
|
-
// Look up person by email or name
|
|
527
|
-
const person = yield* findPersonByEmailOrName(client, params.assignee);
|
|
528
|
-
if (person === undefined) {
|
|
529
|
-
return yield* new PersonNotFoundError({ identifier: params.assignee });
|
|
530
|
-
}
|
|
531
|
-
updateOps.assignee = person._id;
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
// 5. Check if there's anything to update
|
|
535
|
-
if (Object.keys(updateOps).length === 0) {
|
|
536
|
-
return { identifier: issue.identifier, updated: false };
|
|
537
|
-
}
|
|
538
|
-
// 6. Perform the update
|
|
539
|
-
yield* client.updateDoc(tracker.class.Issue, project._id, issue._id, updateOps);
|
|
540
|
-
return { identifier: issue.identifier, updated: true };
|
|
541
|
-
});
|
|
542
|
-
/**
|
|
543
|
-
* Add a label/tag to an issue.
|
|
544
|
-
*
|
|
545
|
-
* Creates the tag in the project if it doesn't exist,
|
|
546
|
-
* then attaches it to the issue via TagReference.
|
|
547
|
-
*
|
|
548
|
-
* Idempotent: adding the same label twice is a no-op.
|
|
549
|
-
*
|
|
550
|
-
* @param params - Add label parameters
|
|
551
|
-
* @returns Issue identifier and whether label was added
|
|
552
|
-
* @throws ProjectNotFoundError if project doesn't exist
|
|
553
|
-
* @throws IssueNotFoundError if issue doesn't exist
|
|
554
|
-
*/
|
|
555
|
-
export const addLabel = (params) => Effect.gen(function* () {
|
|
556
|
-
const client = yield* HulyClient;
|
|
557
|
-
// 1. Find project by identifier
|
|
558
|
-
const projectResult = yield* client.findOne(tracker.class.Project, { identifier: params.project });
|
|
559
|
-
if (projectResult === undefined) {
|
|
560
|
-
return yield* new ProjectNotFoundError({ identifier: params.project });
|
|
561
|
-
}
|
|
562
|
-
const project = projectResult;
|
|
563
|
-
// 2. Parse the identifier and find the issue
|
|
564
|
-
const { fullIdentifier, number } = parseIssueIdentifier(params.identifier, params.project);
|
|
565
|
-
// 3. Find the issue - try by full identifier first, then by number
|
|
566
|
-
let issue = yield* client.findOne(tracker.class.Issue, {
|
|
567
|
-
space: project._id,
|
|
568
|
-
identifier: fullIdentifier,
|
|
569
|
-
});
|
|
570
|
-
// If not found by identifier and we have a number, try by number
|
|
571
|
-
if (issue === undefined && number !== null) {
|
|
572
|
-
issue = yield* client.findOne(tracker.class.Issue, {
|
|
573
|
-
space: project._id,
|
|
574
|
-
number,
|
|
575
|
-
});
|
|
576
|
-
}
|
|
577
|
-
if (issue === undefined) {
|
|
578
|
-
return yield* new IssueNotFoundError({
|
|
579
|
-
identifier: params.identifier,
|
|
580
|
-
project: params.project,
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
// 4. Check if label already exists on this issue
|
|
584
|
-
const existingLabels = yield* client.findAll(tags.class.TagReference, {
|
|
585
|
-
attachedTo: issue._id,
|
|
586
|
-
attachedToClass: tracker.class.Issue,
|
|
587
|
-
});
|
|
588
|
-
// Check if a label with same title already exists
|
|
589
|
-
const labelTitle = params.label.trim();
|
|
590
|
-
const labelExists = existingLabels.some((l) => l.title.toLowerCase() === labelTitle.toLowerCase());
|
|
591
|
-
if (labelExists) {
|
|
592
|
-
// Idempotent - label already attached
|
|
593
|
-
return { identifier: issue.identifier, labelAdded: false };
|
|
594
|
-
}
|
|
595
|
-
// 5. Find or create the TagElement
|
|
596
|
-
const color = params.color ?? 0;
|
|
597
|
-
// Look for existing TagElement with this title targeting Issue class
|
|
598
|
-
let tagElement = yield* client.findOne(tags.class.TagElement, {
|
|
599
|
-
title: labelTitle,
|
|
600
|
-
targetClass: tracker.class.Issue,
|
|
601
|
-
});
|
|
602
|
-
if (tagElement === undefined) {
|
|
603
|
-
// Create new TagElement
|
|
604
|
-
const tagElementId = generateId();
|
|
605
|
-
yield* client.createDoc(tags.class.TagElement, core.space.Workspace, {
|
|
606
|
-
title: labelTitle,
|
|
607
|
-
description: "",
|
|
608
|
-
targetClass: tracker.class.Issue,
|
|
609
|
-
color,
|
|
610
|
-
category: tracker.category.Other,
|
|
611
|
-
}, tagElementId);
|
|
612
|
-
// Fetch the created tag element
|
|
613
|
-
tagElement = yield* client.findOne(tags.class.TagElement, { _id: tagElementId });
|
|
614
|
-
}
|
|
615
|
-
if (tagElement === undefined) {
|
|
616
|
-
// Shouldn't happen, but guard against it
|
|
617
|
-
return { identifier: issue.identifier, labelAdded: false };
|
|
618
|
-
}
|
|
619
|
-
// 6. Attach the TagReference to the issue
|
|
620
|
-
yield* client.addCollection(tags.class.TagReference, project._id, issue._id, tracker.class.Issue, "labels", {
|
|
621
|
-
title: tagElement.title,
|
|
622
|
-
color: tagElement.color,
|
|
623
|
-
tag: tagElement._id,
|
|
624
|
-
});
|
|
625
|
-
return { identifier: issue.identifier, labelAdded: true };
|
|
626
|
-
});
|
|
627
|
-
//# sourceMappingURL=issues.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../../../src/huly/operations/issues.ts"],"names":[],"mappings":"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"}
|