@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.
Files changed (37) hide show
  1. package/README.md +11 -1
  2. package/dist/index.cjs +25858 -25303
  3. package/package.json +31 -19
  4. package/dist/index.js +0 -116694
  5. package/dist/src/config/config.d.ts +0 -94
  6. package/dist/src/config/config.d.ts.map +0 -1
  7. package/dist/src/config/config.js +0 -247
  8. package/dist/src/config/config.js.map +0 -1
  9. package/dist/src/domain/schemas.d.ts +0 -256
  10. package/dist/src/domain/schemas.d.ts.map +0 -1
  11. package/dist/src/domain/schemas.js +0 -275
  12. package/dist/src/domain/schemas.js.map +0 -1
  13. package/dist/src/huly/client.d.ts +0 -63
  14. package/dist/src/huly/client.d.ts.map +0 -1
  15. package/dist/src/huly/client.js +0 -149
  16. package/dist/src/huly/client.js.map +0 -1
  17. package/dist/src/huly/errors.d.ts +0 -133
  18. package/dist/src/huly/errors.d.ts.map +0 -1
  19. package/dist/src/huly/errors.js +0 -108
  20. package/dist/src/huly/errors.js.map +0 -1
  21. package/dist/src/huly/operations/issues.d.ts +0 -122
  22. package/dist/src/huly/operations/issues.d.ts.map +0 -1
  23. package/dist/src/huly/operations/issues.js +0 -627
  24. package/dist/src/huly/operations/issues.js.map +0 -1
  25. package/dist/src/index.d.ts +0 -43
  26. package/dist/src/index.d.ts.map +0 -1
  27. package/dist/src/index.js +0 -154
  28. package/dist/src/index.js.map +0 -1
  29. package/dist/src/mcp/error-mapping.d.ts +0 -67
  30. package/dist/src/mcp/error-mapping.d.ts.map +0 -1
  31. package/dist/src/mcp/error-mapping.js +0 -195
  32. package/dist/src/mcp/error-mapping.js.map +0 -1
  33. package/dist/src/mcp/server.d.ts +0 -86
  34. package/dist/src/mcp/server.d.ts.map +0 -1
  35. package/dist/src/mcp/server.js +0 -216
  36. package/dist/src/mcp/server.js.map +0 -1
  37. 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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"}