huly-mcp-selfhost 3.3.0 โ†’ 3.5.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 (217) hide show
  1. package/.env.example +11 -0
  2. package/CHANGELOG.md +22 -0
  3. package/README.md +126 -17
  4. package/dist/guides/costs.md +2 -1
  5. package/dist/guides/workflow.md +3 -1
  6. package/dist/index.js +105034 -46
  7. package/dist/setup.js +4 -0
  8. package/package.json +12 -11
  9. package/dist/connection.d.ts +0 -78
  10. package/dist/connection.js +0 -271
  11. package/dist/connection.js.map +0 -1
  12. package/dist/env.d.ts +0 -1
  13. package/dist/env.js +0 -17
  14. package/dist/env.js.map +0 -1
  15. package/dist/guard.d.ts +0 -39
  16. package/dist/guard.js +0 -165
  17. package/dist/guard.js.map +0 -1
  18. package/dist/index.d.ts +0 -2
  19. package/dist/index.js.map +0 -1
  20. package/dist/junit-cli.d.ts +0 -8
  21. package/dist/junit-cli.js +0 -106
  22. package/dist/junit-cli.js.map +0 -1
  23. package/dist/registry.d.ts +0 -18
  24. package/dist/registry.js +0 -318
  25. package/dist/registry.js.map +0 -1
  26. package/dist/resources.d.ts +0 -19
  27. package/dist/resources.js +0 -255
  28. package/dist/resources.js.map +0 -1
  29. package/dist/schemas.d.ts +0 -1559
  30. package/dist/schemas.js +0 -1086
  31. package/dist/schemas.js.map +0 -1
  32. package/dist/server.d.ts +0 -29
  33. package/dist/server.js +0 -215
  34. package/dist/server.js.map +0 -1
  35. package/dist/tools/activity.d.ts +0 -10
  36. package/dist/tools/activity.js +0 -62
  37. package/dist/tools/activity.js.map +0 -1
  38. package/dist/tools/agent.d.ts +0 -156
  39. package/dist/tools/agent.js +0 -523
  40. package/dist/tools/agent.js.map +0 -1
  41. package/dist/tools/attachments.d.ts +0 -31
  42. package/dist/tools/attachments.js +0 -61
  43. package/dist/tools/attachments.js.map +0 -1
  44. package/dist/tools/calendar.d.ts +0 -49
  45. package/dist/tools/calendar.js +0 -116
  46. package/dist/tools/calendar.js.map +0 -1
  47. package/dist/tools/cards.d.ts +0 -87
  48. package/dist/tools/cards.js +0 -246
  49. package/dist/tools/cards.js.map +0 -1
  50. package/dist/tools/channels.d.ts +0 -118
  51. package/dist/tools/channels.js +0 -211
  52. package/dist/tools/channels.js.map +0 -1
  53. package/dist/tools/comments.d.ts +0 -42
  54. package/dist/tools/comments.js +0 -77
  55. package/dist/tools/comments.js.map +0 -1
  56. package/dist/tools/components.d.ts +0 -45
  57. package/dist/tools/components.js +0 -107
  58. package/dist/tools/components.js.map +0 -1
  59. package/dist/tools/contacts.d.ts +0 -69
  60. package/dist/tools/contacts.js +0 -130
  61. package/dist/tools/contacts.js.map +0 -1
  62. package/dist/tools/crm.d.ts +0 -61
  63. package/dist/tools/crm.js +0 -117
  64. package/dist/tools/crm.js.map +0 -1
  65. package/dist/tools/documents.d.ts +0 -100
  66. package/dist/tools/documents.js +0 -294
  67. package/dist/tools/documents.js.map +0 -1
  68. package/dist/tools/drive.d.ts +0 -107
  69. package/dist/tools/drive.js +0 -277
  70. package/dist/tools/drive.js.map +0 -1
  71. package/dist/tools/fields.d.ts +0 -33
  72. package/dist/tools/fields.js +0 -124
  73. package/dist/tools/fields.js.map +0 -1
  74. package/dist/tools/generic.d.ts +0 -72
  75. package/dist/tools/generic.js +0 -242
  76. package/dist/tools/generic.js.map +0 -1
  77. package/dist/tools/github.d.ts +0 -21
  78. package/dist/tools/github.js +0 -80
  79. package/dist/tools/github.js.map +0 -1
  80. package/dist/tools/hr.d.ts +0 -97
  81. package/dist/tools/hr.js +0 -150
  82. package/dist/tools/hr.js.map +0 -1
  83. package/dist/tools/inbox.d.ts +0 -23
  84. package/dist/tools/inbox.js +0 -76
  85. package/dist/tools/inbox.js.map +0 -1
  86. package/dist/tools/inventory.d.ts +0 -61
  87. package/dist/tools/inventory.js +0 -103
  88. package/dist/tools/inventory.js.map +0 -1
  89. package/dist/tools/issues.d.ts +0 -112
  90. package/dist/tools/issues.js +0 -474
  91. package/dist/tools/issues.js.map +0 -1
  92. package/dist/tools/labels.d.ts +0 -87
  93. package/dist/tools/labels.js +0 -232
  94. package/dist/tools/labels.js.map +0 -1
  95. package/dist/tools/log-time.d.ts +0 -25
  96. package/dist/tools/log-time.js +0 -95
  97. package/dist/tools/log-time.js.map +0 -1
  98. package/dist/tools/meetings.d.ts +0 -30
  99. package/dist/tools/meetings.js +0 -78
  100. package/dist/tools/meetings.js.map +0 -1
  101. package/dist/tools/members.d.ts +0 -8
  102. package/dist/tools/members.js +0 -33
  103. package/dist/tools/members.js.map +0 -1
  104. package/dist/tools/message-templates.d.ts +0 -54
  105. package/dist/tools/message-templates.js +0 -88
  106. package/dist/tools/message-templates.js.map +0 -1
  107. package/dist/tools/milestones.d.ts +0 -56
  108. package/dist/tools/milestones.js +0 -172
  109. package/dist/tools/milestones.js.map +0 -1
  110. package/dist/tools/organizations.d.ts +0 -37
  111. package/dist/tools/organizations.js +0 -88
  112. package/dist/tools/organizations.js.map +0 -1
  113. package/dist/tools/overview.d.ts +0 -55
  114. package/dist/tools/overview.js +0 -395
  115. package/dist/tools/overview.js.map +0 -1
  116. package/dist/tools/planner.d.ts +0 -60
  117. package/dist/tools/planner.js +0 -145
  118. package/dist/tools/planner.js.map +0 -1
  119. package/dist/tools/process.d.ts +0 -50
  120. package/dist/tools/process.js +0 -137
  121. package/dist/tools/process.js.map +0 -1
  122. package/dist/tools/products.d.ts +0 -17
  123. package/dist/tools/products.js +0 -45
  124. package/dist/tools/products.js.map +0 -1
  125. package/dist/tools/projects.d.ts +0 -41
  126. package/dist/tools/projects.js +0 -93
  127. package/dist/tools/projects.js.map +0 -1
  128. package/dist/tools/qms.d.ts +0 -57
  129. package/dist/tools/qms.js +0 -171
  130. package/dist/tools/qms.js.map +0 -1
  131. package/dist/tools/recruiting.d.ts +0 -112
  132. package/dist/tools/recruiting.js +0 -203
  133. package/dist/tools/recruiting.js.map +0 -1
  134. package/dist/tools/relations.d.ts +0 -72
  135. package/dist/tools/relations.js +0 -192
  136. package/dist/tools/relations.js.map +0 -1
  137. package/dist/tools/search.d.ts +0 -23
  138. package/dist/tools/search.js +0 -60
  139. package/dist/tools/search.js.map +0 -1
  140. package/dist/tools/sharing.d.ts +0 -62
  141. package/dist/tools/sharing.js +0 -149
  142. package/dist/tools/sharing.js.map +0 -1
  143. package/dist/tools/statuses.d.ts +0 -19
  144. package/dist/tools/statuses.js +0 -93
  145. package/dist/tools/statuses.js.map +0 -1
  146. package/dist/tools/surveys.d.ts +0 -22
  147. package/dist/tools/surveys.js +0 -53
  148. package/dist/tools/surveys.js.map +0 -1
  149. package/dist/tools/templates.d.ts +0 -95
  150. package/dist/tools/templates.js +0 -260
  151. package/dist/tools/templates.js.map +0 -1
  152. package/dist/tools/test-automation.d.ts +0 -81
  153. package/dist/tools/test-automation.js +0 -225
  154. package/dist/tools/test-automation.js.map +0 -1
  155. package/dist/tools/testing.d.ts +0 -234
  156. package/dist/tools/testing.js +0 -401
  157. package/dist/tools/testing.js.map +0 -1
  158. package/dist/tools/workspace-admin.d.ts +0 -55
  159. package/dist/tools/workspace-admin.js +0 -117
  160. package/dist/tools/workspace-admin.js.map +0 -1
  161. package/dist/tools/workspaces.d.ts +0 -6
  162. package/dist/tools/workspaces.js +0 -19
  163. package/dist/tools/workspaces.js.map +0 -1
  164. package/dist/utils/attributes.d.ts +0 -37
  165. package/dist/utils/attributes.js +0 -188
  166. package/dist/utils/attributes.js.map +0 -1
  167. package/dist/utils/classes.d.ts +0 -51
  168. package/dist/utils/classes.js +0 -73
  169. package/dist/utils/classes.js.map +0 -1
  170. package/dist/utils/content.d.ts +0 -11
  171. package/dist/utils/content.js +0 -86
  172. package/dist/utils/content.js.map +0 -1
  173. package/dist/utils/errors.d.ts +0 -11
  174. package/dist/utils/errors.js +0 -24
  175. package/dist/utils/errors.js.map +0 -1
  176. package/dist/utils/files.d.ts +0 -5
  177. package/dist/utils/files.js +0 -50
  178. package/dist/utils/files.js.map +0 -1
  179. package/dist/utils/format.d.ts +0 -8
  180. package/dist/utils/format.js +0 -57
  181. package/dist/utils/format.js.map +0 -1
  182. package/dist/utils/junit.d.ts +0 -13
  183. package/dist/utils/junit.js +0 -81
  184. package/dist/utils/junit.js.map +0 -1
  185. package/dist/utils/markdown.d.ts +0 -14
  186. package/dist/utils/markdown.js +0 -149
  187. package/dist/utils/markdown.js.map +0 -1
  188. package/dist/utils/meeting.d.ts +0 -13
  189. package/dist/utils/meeting.js +0 -118
  190. package/dist/utils/meeting.js.map +0 -1
  191. package/dist/utils/people.d.ts +0 -25
  192. package/dist/utils/people.js +0 -80
  193. package/dist/utils/people.js.map +0 -1
  194. package/dist/utils/redact.d.ts +0 -3
  195. package/dist/utils/redact.js +0 -26
  196. package/dist/utils/redact.js.map +0 -1
  197. package/dist/utils/resolve.d.ts +0 -17
  198. package/dist/utils/resolve.js +0 -54
  199. package/dist/utils/resolve.js.map +0 -1
  200. package/dist/utils/spec.d.ts +0 -10
  201. package/dist/utils/spec.js +0 -90
  202. package/dist/utils/spec.js.map +0 -1
  203. package/dist/utils/storage.d.ts +0 -7
  204. package/dist/utils/storage.js +0 -86
  205. package/dist/utils/storage.js.map +0 -1
  206. package/dist/utils/tasks.d.ts +0 -22
  207. package/dist/utils/tasks.js +0 -81
  208. package/dist/utils/tasks.js.map +0 -1
  209. package/dist/watch.d.ts +0 -62
  210. package/dist/watch.js +0 -405
  211. package/dist/watch.js.map +0 -1
  212. package/scripts/cleanup-issues.js +0 -141
  213. package/scripts/copy-guides.js +0 -18
  214. package/scripts/demo.js +0 -201
  215. package/scripts/import-csv.js +0 -250
  216. package/scripts/sample-tasks.csv +0 -11
  217. package/scripts/setup.js +0 -163
@@ -1,401 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.deleteTestPlan = exports.deleteTestRun = exports.updateTestRun = exports.deleteTestSuite = exports.updateTestSuite = exports.setTestResult = exports.getTestRun = exports.listTestRuns = exports.createTestRun = exports.createTestPlan = exports.listTestPlans = exports.deleteTestCase = exports.updateTestCase = exports.createTestCase = exports.getTestCase = exports.createTestSuite = exports.listTestCases = exports.createTestProject = exports.listTestProjects = exports.name = exports.idx = exports.RESULT_STATUSES = exports.CASE_STATUSES = exports.CASE_PRIORITIES = exports.CASE_TYPES = exports.TM = void 0;
4
- exports.findProject = findProject;
5
- exports.findSuite = findSuite;
6
- exports.findDoc = findDoc;
7
- // Test management: projects โ†’ suites (nested) โ†’ cases; plans pick cases; runs hold one result per case.
8
- // Mirrors Huly's test-management UI (CreateTestSuite, CreateTestCase, NewTestPlanPanel, NewTestRunPanel).
9
- const core_1 = require("@hcengineering/core");
10
- const connection_1 = require("../connection");
11
- const errors_1 = require("../utils/errors");
12
- const content_1 = require("../utils/content");
13
- const format_1 = require("../utils/format");
14
- const people_1 = require("../utils/people");
15
- exports.TM = {
16
- Project: 'testManagement:class:TestProject',
17
- Suite: 'testManagement:class:TestSuite',
18
- Case: 'testManagement:class:TestCase',
19
- Plan: 'testManagement:class:TestPlan',
20
- PlanItem: 'testManagement:class:TestPlanItem',
21
- Run: 'testManagement:class:TestRun',
22
- Result: 'testManagement:class:TestResult',
23
- NoParent: 'testManagement:ids:NoParent',
24
- SpaceType: 'testManagement:spaceType:DefaultProject',
25
- TypeMixin: 'testManagement:mixin:DefaultProjectTypeData'
26
- };
27
- exports.CASE_TYPES = ['Functional', 'Performance', 'Regression', 'Security', 'Smoke', 'Usability'];
28
- exports.CASE_PRIORITIES = ['Low', 'Medium', 'High', 'Urgent'];
29
- exports.CASE_STATUSES = ['Draft', 'ReadyForReview', 'FixReviewComments', 'Approved', 'Rejected'];
30
- exports.RESULT_STATUSES = ['Untested', 'Blocked', 'Passed', 'Failed'];
31
- const idx = (list, v) => list.indexOf(v);
32
- exports.idx = idx;
33
- const name = (list, i) => (i != null ? list[i] : undefined) ?? 'โ€”';
34
- exports.name = name;
35
- async function findProject(client, ref) {
36
- const all = await client.findAll(exports.TM.Project, {});
37
- const hits = all.filter((p) => p._id === ref || String(p.name).toLowerCase() === ref.toLowerCase());
38
- if (hits.length === 1)
39
- return hits[0];
40
- if (hits.length > 1)
41
- throw new Error(`Test project '${ref}' is ambiguous: ${hits.map((p) => p._id).join(', ')}.`);
42
- throw new Error(`Test project '${ref}' not found. Available: ${all.map((p) => p.name).join(', ') || 'none'}.`);
43
- }
44
- async function findSuite(client, project, ref) {
45
- const suites = await client.findAll(exports.TM.Suite, { space: project._id });
46
- const hits = suites.filter((s) => s._id === ref || String(s.name).toLowerCase() === ref.toLowerCase());
47
- if (hits.length === 1)
48
- return hits[0];
49
- if (hits.length > 1)
50
- throw new Error(`Suite '${ref}' is ambiguous โ€” use its id: ${hits.map((s) => s._id).join(', ')}.`);
51
- throw new Error(`Suite '${ref}' not found in ${String(project.name)}.`);
52
- }
53
- async function findDoc(client, _class, id, what) {
54
- const doc = await client.findOne(_class, { _id: id });
55
- if (doc == null)
56
- throw new Error(`${what} '${id}' not found.`);
57
- return doc;
58
- }
59
- exports.listTestProjects = (0, errors_1.wrapToolHandler)(async (args) => {
60
- const client = await (0, connection_1.getConnection)(args.workspace);
61
- const projects = await client.findAll(exports.TM.Project, { archived: false });
62
- if (projects.length === 0)
63
- return 'No test projects.';
64
- const lines = [];
65
- for (const p of projects) {
66
- const cases = await client.findAll(exports.TM.Case, { space: p._id }, { limit: 1, total: true });
67
- const runs = await client.findAll(exports.TM.Run, { space: p._id }, { limit: 1, total: true });
68
- lines.push(`- **${String(p.name)}** โ€” ${String(cases.total ?? cases.length)} case(s), ${String(runs.total ?? runs.length)} run(s) โ€” \`${String(p._id)}\``);
69
- }
70
- return `## Test projects (${projects.length})\n\n${lines.join('\n')}`;
71
- });
72
- exports.createTestProject = (0, errors_1.wrapToolHandler)(async (args) => {
73
- const client = await (0, connection_1.getConnection)(args.workspace);
74
- const existing = await client.findAll(exports.TM.Project, {});
75
- const same = existing.find((p) => String(p.name).toLowerCase() === args.name.toLowerCase());
76
- if (same != null)
77
- return `โ„น๏ธ Test project **${String(same.name)}** already exists โ€” \`${String(same._id)}\`.`;
78
- const me = await (0, people_1.currentAccountUuid)(client);
79
- const id = await client.createDoc(exports.TM.Project, 'core:space:Space', {
80
- name: args.name, description: args.description ?? '', private: args.isPrivate, members: [me], owners: [me], archived: false, type: exports.TM.SpaceType
81
- });
82
- await client.createMixin(id, exports.TM.Project, 'core:space:Space', exports.TM.TypeMixin, {});
83
- return `โœ… Test project **${args.name}** created โ€” \`${String(id)}\`.`;
84
- });
85
- exports.listTestCases = (0, errors_1.wrapToolHandler)(async (args) => {
86
- const client = await (0, connection_1.getConnection)(args.workspace);
87
- const project = await findProject(client, args.project);
88
- const suites = await client.findAll(exports.TM.Suite, { space: project._id }, { sort: { name: core_1.SortingOrder.Ascending } });
89
- const query = { space: project._id };
90
- if (args.status != null)
91
- query.status = (0, exports.idx)(exports.CASE_STATUSES, args.status);
92
- const cases = await client.findAll(exports.TM.Case, query, { sort: { name: core_1.SortingOrder.Ascending } });
93
- const people = await (0, people_1.peopleNames)(client);
94
- const root = args.suite != null ? (await findSuite(client, project, args.suite))._id : exports.TM.NoParent;
95
- const lines = [];
96
- const walk = (parent, depth) => {
97
- for (const s of suites.filter((x) => x.parent === parent)) {
98
- lines.push(`${' '.repeat(depth)}- ๐Ÿ“‚ **${String(s.name)}** โ€” \`${String(s._id)}\``);
99
- for (const c of cases.filter((x) => x.attachedTo === s._id)) {
100
- const who = c.assignee != null ? ` ยท @${people.get(c.assignee) ?? '?'}` : '';
101
- lines.push(`${' '.repeat(depth + 1)}- ${String(c.name)} [${(0, exports.name)(exports.CASE_TYPES, c.type)}, ${(0, exports.name)(exports.CASE_PRIORITIES, c.priority)}, ${(0, exports.name)(exports.CASE_STATUSES, c.status)}]${who} โ€” \`${String(c._id)}\``);
102
- }
103
- if (depth < 20)
104
- walk(s._id, depth + 1);
105
- }
106
- };
107
- if (args.suite != null) {
108
- const s = suites.find((x) => x._id === root);
109
- lines.push(`- ๐Ÿ“‚ **${String(s.name)}** โ€” \`${String(s._id)}\``);
110
- for (const c of cases.filter((x) => x.attachedTo === root))
111
- lines.push(` - ${String(c.name)} [${(0, exports.name)(exports.CASE_TYPES, c.type)}, ${(0, exports.name)(exports.CASE_PRIORITIES, c.priority)}, ${(0, exports.name)(exports.CASE_STATUSES, c.status)}] โ€” \`${String(c._id)}\``);
112
- walk(root, 1);
113
- }
114
- else
115
- walk(root, 0);
116
- if (lines.length === 0)
117
- return `No suites in ${String(project.name)} yet โ€” create one with create_test_suite.`;
118
- return `## ${String(project.name)}: ${cases.length} case(s)\n\n${lines.join('\n')}`;
119
- });
120
- exports.createTestSuite = (0, errors_1.wrapToolHandler)(async (args) => {
121
- const client = await (0, connection_1.getConnection)(args.workspace);
122
- const project = await findProject(client, args.project);
123
- const parent = args.parent != null ? await findSuite(client, project, args.parent) : undefined;
124
- const id = await client.createDoc(exports.TM.Suite, project._id, { name: args.name, description: args.description ?? '', parent: parent?._id ?? exports.TM.NoParent });
125
- return `โœ… Suite **${args.name}** created${parent != null ? ` in "${String(parent.name)}"` : ''} โ€” \`${String(id)}\`.`;
126
- });
127
- exports.getTestCase = (0, errors_1.wrapToolHandler)(async (args) => {
128
- const client = await (0, connection_1.getConnection)(args.workspace);
129
- const c = await findDoc(client, exports.TM.Case, args.caseId, 'Test case');
130
- const suite = await client.findOne(exports.TM.Suite, { _id: c.attachedTo });
131
- const people = await (0, people_1.peopleNames)(client);
132
- const results = await client.findAll(exports.TM.Result, { testCase: c._id }, { sort: { modifiedOn: core_1.SortingOrder.Descending }, limit: 5 });
133
- const lines = [
134
- `## ${String(c.name)}`,
135
- '',
136
- `**Suite:** ${String(suite?.name ?? 'โ€”')} ยท **Type:** ${(0, exports.name)(exports.CASE_TYPES, c.type)} ยท **Priority:** ${(0, exports.name)(exports.CASE_PRIORITIES, c.priority)} ยท **Status:** ${(0, exports.name)(exports.CASE_STATUSES, c.status)}`,
137
- `**Assignee:** ${c.assignee != null ? people.get(c.assignee) ?? '?' : 'โ€”'} ยท **Id:** \`${String(c._id)}\``,
138
- '',
139
- '### Steps / description',
140
- (await (0, content_1.readMarkup)(args.workspace, c.description)) || '_(empty)_'
141
- ];
142
- if (results.length > 0) {
143
- lines.push('', '### Latest results');
144
- for (const r of results) {
145
- const run = await client.findOne(exports.TM.Run, { _id: r.attachedTo });
146
- lines.push(`- ${(0, exports.name)(exports.RESULT_STATUSES, r.status)} in run "${String(run?.name ?? '?')}" (${(0, format_1.formatDate)(r.modifiedOn)})`);
147
- }
148
- }
149
- return lines.join('\n');
150
- });
151
- exports.createTestCase = (0, errors_1.wrapToolHandler)(async (args) => {
152
- const client = await (0, connection_1.getConnection)(args.workspace);
153
- const project = await findProject(client, args.project);
154
- const suite = await findSuite(client, project, args.suite);
155
- const assignee = args.assignee != null ? (await (0, people_1.findPerson)(client, args.assignee))._id : null;
156
- const id = await client.addCollection(exports.TM.Case, project._id, suite._id, exports.TM.Suite, 'testCases', {
157
- name: args.name,
158
- description: args.description != null && args.description !== '' ? await (0, content_1.writeMarkup)(args.workspace, 'testcase', args.description) : null,
159
- type: (0, exports.idx)(exports.CASE_TYPES, args.type ?? 'Functional'),
160
- priority: (0, exports.idx)(exports.CASE_PRIORITIES, args.priority ?? 'Medium'),
161
- status: (0, exports.idx)(exports.CASE_STATUSES, args.status ?? 'Draft'),
162
- assignee,
163
- attachments: 0
164
- });
165
- return `โœ… Test case **${args.name}** created in "${String(suite.name)}" โ€” \`${String(id)}\`.`;
166
- });
167
- exports.updateTestCase = (0, errors_1.wrapToolHandler)(async (args) => {
168
- const client = await (0, connection_1.getConnection)(args.workspace);
169
- const c = await findDoc(client, exports.TM.Case, args.caseId, 'Test case');
170
- const update = {};
171
- if (args.name != null)
172
- update.name = args.name;
173
- if (args.description != null)
174
- update.description = await (0, content_1.writeMarkup)(args.workspace, 'testcase', args.description);
175
- if (args.type != null)
176
- update.type = (0, exports.idx)(exports.CASE_TYPES, args.type);
177
- if (args.priority != null)
178
- update.priority = (0, exports.idx)(exports.CASE_PRIORITIES, args.priority);
179
- if (args.status != null)
180
- update.status = (0, exports.idx)(exports.CASE_STATUSES, args.status);
181
- if (args.assignee !== undefined)
182
- update.assignee = args.assignee != null ? (await (0, people_1.findPerson)(client, args.assignee))._id : null;
183
- if (Object.keys(update).length === 0)
184
- throw new Error('Nothing to change.');
185
- await client.updateCollection(exports.TM.Case, c.space, c._id, c.attachedTo, exports.TM.Suite, 'testCases', update);
186
- return `โœ… Test case **${String(args.name ?? c.name)}** updated: ${Object.keys(update).join(', ')}.`;
187
- });
188
- exports.deleteTestCase = (0, errors_1.wrapToolHandler)(async (args) => {
189
- const client = await (0, connection_1.getConnection)(args.workspace);
190
- const c = await findDoc(client, exports.TM.Case, args.caseId, 'Test case');
191
- await client.removeCollection(exports.TM.Case, c.space, c._id, c.attachedTo, exports.TM.Suite, 'testCases');
192
- return `โœ… Test case **${String(c.name)}** deleted.`;
193
- });
194
- /** Cases selected by ids and/or suites (including nested suites). */
195
- async function selectCases(client, project, caseIds, suites) {
196
- const out = new Map();
197
- for (const id of caseIds ?? []) {
198
- const c = await findDoc(client, exports.TM.Case, id, 'Test case');
199
- if (c.space !== project._id)
200
- throw new Error(`Test case '${id}' belongs to another project.`);
201
- out.set(c._id, c);
202
- }
203
- if ((suites ?? []).length > 0) {
204
- const all = await client.findAll(exports.TM.Suite, { space: project._id });
205
- let level = await Promise.all((suites ?? []).map(async (s) => (await findSuite(client, project, s))._id));
206
- const ids = new Set(level);
207
- while (level.length > 0) {
208
- level = all.filter((s) => level.includes(s.parent) && !ids.has(s._id)).map((s) => s._id);
209
- for (const l of level)
210
- ids.add(l);
211
- }
212
- const cases = await client.findAll(exports.TM.Case, { space: project._id, attachedTo: { $in: [...ids] } });
213
- for (const c of cases)
214
- out.set(c._id, c);
215
- }
216
- return [...out.values()];
217
- }
218
- exports.listTestPlans = (0, errors_1.wrapToolHandler)(async (args) => {
219
- const client = await (0, connection_1.getConnection)(args.workspace);
220
- const project = await findProject(client, args.project);
221
- const plans = await client.findAll(exports.TM.Plan, { space: project._id });
222
- if (plans.length === 0)
223
- return `No test plans in ${String(project.name)}.`;
224
- const lines = [];
225
- for (const p of plans) {
226
- const items = await client.findAll(exports.TM.PlanItem, { attachedTo: p._id });
227
- lines.push(`- **${String(p.name)}** โ€” ${items.length} case(s) โ€” \`${String(p._id)}\``);
228
- }
229
- return `## Test plans in ${String(project.name)} (${plans.length})\n\n${lines.join('\n')}`;
230
- });
231
- exports.createTestPlan = (0, errors_1.wrapToolHandler)(async (args) => {
232
- const client = await (0, connection_1.getConnection)(args.workspace);
233
- const project = await findProject(client, args.project);
234
- const cases = await selectCases(client, project, args.caseIds, args.suites);
235
- if (cases.length === 0)
236
- throw new Error('No test cases selected (caseIds or suites).');
237
- const ops = client.apply?.() ?? client;
238
- const id = await ops.createDoc(exports.TM.Plan, project._id, { name: args.name, description: null });
239
- for (const c of cases) {
240
- await ops.addCollection(exports.TM.PlanItem, project._id, id, exports.TM.Plan, 'items', { testCase: c._id, testSuite: c.attachedTo, assignee: c.assignee ?? null });
241
- }
242
- if (ops !== client)
243
- await ops.commit();
244
- return `โœ… Test plan **${args.name}** with ${cases.length} case(s) โ€” \`${String(id)}\`.`;
245
- });
246
- exports.createTestRun = (0, errors_1.wrapToolHandler)(async (args) => {
247
- const client = await (0, connection_1.getConnection)(args.workspace);
248
- const project = await findProject(client, args.project);
249
- let cases = await selectCases(client, project, args.caseIds, args.suites);
250
- if (args.plan != null) {
251
- const plans = await client.findAll(exports.TM.Plan, { space: project._id });
252
- const plan = plans.find((p) => p._id === args.plan || String(p.name).toLowerCase() === args.plan.toLowerCase());
253
- if (plan == null)
254
- throw new Error(`Test plan '${args.plan}' not found.`);
255
- const items = await client.findAll(exports.TM.PlanItem, { attachedTo: plan._id });
256
- const fromPlan = await Promise.all(items.map(async (i) => await client.findOne(exports.TM.Case, { _id: i.testCase })));
257
- cases = [...new Map([...cases, ...fromPlan.filter((c) => c != null)].map((c) => [c._id, c])).values()];
258
- }
259
- if (cases.length === 0)
260
- throw new Error('No test cases selected (plan, suites or caseIds).');
261
- const dueDate = args.dueDate != null ? new Date(args.dueDate).getTime() : undefined;
262
- if (dueDate != null && Number.isNaN(dueDate))
263
- throw new Error(`Invalid dueDate '${args.dueDate}'.`);
264
- const ops = client.apply?.() ?? client;
265
- const id = await ops.createDoc(exports.TM.Run, project._id, { name: args.name, description: null, ...(dueDate != null ? { dueDate } : {}) });
266
- for (const c of cases) {
267
- await ops.addCollection(exports.TM.Result, project._id, id, exports.TM.Run, 'results', { name: c.name, testCase: c._id, testSuite: c.attachedTo, description: null, status: (0, exports.idx)(exports.RESULT_STATUSES, 'Untested'), assignee: c.assignee ?? null });
268
- }
269
- if (ops !== client)
270
- await ops.commit();
271
- return `โœ… Test run **${args.name}** started with ${cases.length} case(s) โ€” \`${String(id)}\`. Record results with set_test_result.`;
272
- });
273
- exports.listTestRuns = (0, errors_1.wrapToolHandler)(async (args) => {
274
- const client = await (0, connection_1.getConnection)(args.workspace);
275
- const project = await findProject(client, args.project);
276
- const runs = await client.findAll(exports.TM.Run, { space: project._id }, { sort: { modifiedOn: core_1.SortingOrder.Descending }, limit: args.limit });
277
- if (runs.length === 0)
278
- return `No test runs in ${String(project.name)}.`;
279
- const lines = [];
280
- for (const r of runs) {
281
- const results = await client.findAll(exports.TM.Result, { attachedTo: r._id });
282
- const counts = exports.RESULT_STATUSES.map((s, i) => [s, results.filter((x) => (x.status ?? 0) === i).length]).filter(([, n]) => n > 0);
283
- lines.push(`- **${String(r.name)}** โ€” ${counts.map(([s, n]) => `${n} ${s}`).join(', ') || 'empty'}${r.dueDate != null ? ` ยท due ${(0, format_1.formatDate)(r.dueDate)}` : ''} โ€” \`${String(r._id)}\``);
284
- }
285
- return `## Test runs in ${String(project.name)} (${runs.length})\n\n${lines.join('\n')}`;
286
- });
287
- exports.getTestRun = (0, errors_1.wrapToolHandler)(async (args) => {
288
- const client = await (0, connection_1.getConnection)(args.workspace);
289
- const run = await findDoc(client, exports.TM.Run, args.runId, 'Test run');
290
- const results = await client.findAll(exports.TM.Result, { attachedTo: run._id });
291
- const people = await (0, people_1.peopleNames)(client);
292
- const lines = results.sort((a, b) => String(a.name).localeCompare(String(b.name))).map((r) => `- ${(0, exports.name)(exports.RESULT_STATUSES, r.status ?? 0)} โ€” **${String(r.name)}**${r.assignee != null ? ` ยท @${people.get(r.assignee) ?? '?'}` : ''} โ€” \`${String(r._id)}\``);
293
- const done = results.filter((r) => (r.status ?? 0) !== 0).length;
294
- return `## Run: ${String(run.name)} (${done}/${results.length} tested)\n\n${lines.join('\n')}`;
295
- });
296
- exports.setTestResult = (0, errors_1.wrapToolHandler)(async (args) => {
297
- const client = await (0, connection_1.getConnection)(args.workspace);
298
- let result = await client.findOne(exports.TM.Result, { _id: args.result });
299
- if (result == null && args.runId != null) {
300
- const all = await client.findAll(exports.TM.Result, { attachedTo: args.runId });
301
- const hits = all.filter((r) => r.testCase === args.result || String(r.name).toLowerCase() === args.result.toLowerCase());
302
- if (hits.length > 1)
303
- throw new Error(`'${args.result}' matches several results in this run โ€” use the result id.`);
304
- result = hits[0];
305
- }
306
- if (result == null)
307
- throw new Error(`Test result '${args.result}' not found (pass a result id, or runId plus case id/name).`);
308
- const update = { status: (0, exports.idx)(exports.RESULT_STATUSES, args.status) };
309
- if (args.comment != null)
310
- update.description = await (0, content_1.writeMarkup)(args.workspace, 'testresult', args.comment);
311
- if (args.assignee !== undefined)
312
- update.assignee = args.assignee != null ? (await (0, people_1.findPerson)(client, args.assignee))._id : null;
313
- await client.updateCollection(exports.TM.Result, result.space, result._id, result.attachedTo, exports.TM.Run, 'results', update);
314
- return `โœ… **${String(result.name)}**: ${args.status}${args.comment != null ? ' (with comment)' : ''}.`;
315
- });
316
- exports.updateTestSuite = (0, errors_1.wrapToolHandler)(async (args) => {
317
- const client = await (0, connection_1.getConnection)(args.workspace);
318
- const project = await findProject(client, args.project);
319
- const suite = await findSuite(client, project, args.suite);
320
- const update = {};
321
- if (args.name != null)
322
- update.name = args.name;
323
- if (args.description != null)
324
- update.description = args.description;
325
- if (args.parent !== undefined) {
326
- if (args.parent == null)
327
- update.parent = exports.TM.NoParent;
328
- else {
329
- const parent = await findSuite(client, project, args.parent);
330
- const all = await client.findAll(exports.TM.Suite, { space: project._id });
331
- for (let p = parent; p != null; p = all.find((s) => s._id === p.parent)) {
332
- if (p._id === suite._id)
333
- throw new Error('A suite cannot move into itself or one of its sub-suites.');
334
- }
335
- update.parent = parent._id;
336
- }
337
- }
338
- if (Object.keys(update).length === 0)
339
- throw new Error('Nothing to change.');
340
- await client.updateDoc(exports.TM.Suite, suite.space, suite._id, update);
341
- return `โœ… Suite **${String(args.name ?? suite.name)}** updated: ${Object.keys(update).join(', ')}.`;
342
- });
343
- exports.deleteTestSuite = (0, errors_1.wrapToolHandler)(async (args) => {
344
- const client = await (0, connection_1.getConnection)(args.workspace);
345
- const project = await findProject(client, args.project);
346
- const suite = await findSuite(client, project, args.suite);
347
- const all = await client.findAll(exports.TM.Suite, { space: project._id });
348
- const ids = [suite._id];
349
- for (let i = 0; i < ids.length; i++)
350
- ids.push(...all.filter((s) => s.parent === ids[i]).map((s) => s._id));
351
- const cases = await client.findAll(exports.TM.Case, { space: project._id, attachedTo: { $in: ids } });
352
- if ((ids.length > 1 || cases.length > 0) && args.recursive !== true)
353
- throw new Error(`Suite '${String(suite.name)}' holds ${ids.length - 1} sub-suite(s) and ${cases.length} case(s) โ€” pass recursive: true to delete them too.`);
354
- for (const c of cases)
355
- await client.removeCollection(exports.TM.Case, c.space, c._id, c.attachedTo, exports.TM.Suite, 'testCases');
356
- for (const id of ids.reverse())
357
- await client.removeDoc(exports.TM.Suite, project._id, id);
358
- return `๐Ÿ—‘๏ธ Suite **${String(suite.name)}** deleted${ids.length > 1 || cases.length > 0 ? ` with ${ids.length - 1} sub-suite(s) and ${cases.length} case(s)` : ''}.`;
359
- });
360
- exports.updateTestRun = (0, errors_1.wrapToolHandler)(async (args) => {
361
- const client = await (0, connection_1.getConnection)(args.workspace);
362
- const run = await findDoc(client, exports.TM.Run, args.runId, 'Test run');
363
- const update = {};
364
- if (args.name != null)
365
- update.name = args.name;
366
- if (args.dueDate !== undefined) {
367
- const t = args.dueDate != null ? new Date(args.dueDate).getTime() : null;
368
- if (t != null && Number.isNaN(t))
369
- throw new Error(`Invalid dueDate '${String(args.dueDate)}'.`);
370
- update.dueDate = t;
371
- }
372
- if (args.description != null)
373
- update.description = await (0, content_1.writeMarkup)(args.workspace, 'testrun', args.description);
374
- if (Object.keys(update).length === 0)
375
- throw new Error('Nothing to change.');
376
- await client.updateDoc(exports.TM.Run, run.space, run._id, update);
377
- return `โœ… Run **${String(args.name ?? run.name)}** updated: ${Object.keys(update).join(', ')}.`;
378
- });
379
- exports.deleteTestRun = (0, errors_1.wrapToolHandler)(async (args) => {
380
- const client = await (0, connection_1.getConnection)(args.workspace);
381
- const run = await findDoc(client, exports.TM.Run, args.runId, 'Test run');
382
- const results = await client.findAll(exports.TM.Result, { attachedTo: run._id });
383
- for (const r of results)
384
- await client.removeCollection(exports.TM.Result, r.space, r._id, run._id, exports.TM.Run, 'results');
385
- await client.removeDoc(exports.TM.Run, run.space, run._id);
386
- return `๐Ÿ—‘๏ธ Run **${String(run.name)}** deleted with ${results.length} result(s).`;
387
- });
388
- exports.deleteTestPlan = (0, errors_1.wrapToolHandler)(async (args) => {
389
- const client = await (0, connection_1.getConnection)(args.workspace);
390
- const project = await findProject(client, args.project);
391
- const plans = await client.findAll(exports.TM.Plan, { space: project._id });
392
- const plan = plans.find((p) => p._id === args.plan || String(p.name).toLowerCase() === args.plan.toLowerCase());
393
- if (plan == null)
394
- throw new Error(`Test plan '${args.plan}' not found.`);
395
- const items = await client.findAll(exports.TM.PlanItem, { attachedTo: plan._id });
396
- for (const i of items)
397
- await client.removeCollection(exports.TM.PlanItem, i.space, i._id, plan._id, exports.TM.Plan, 'items');
398
- await client.removeDoc(exports.TM.Plan, plan.space, plan._id);
399
- return `๐Ÿ—‘๏ธ Test plan **${String(plan.name)}** deleted (${items.length} item(s); runs made from it stay).`;
400
- });
401
- //# sourceMappingURL=testing.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/tools/testing.ts"],"names":[],"mappings":"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"}
@@ -1,55 +0,0 @@
1
- export declare const ROLES: {
2
- readonly guest: 'GUEST';
3
- readonly user: 'USER';
4
- readonly maintainer: 'MAINTAINER';
5
- readonly owner: 'OWNER';
6
- };
7
- export declare const createInviteLink: (args: {
8
- workspace: string;
9
- email?: string | undefined;
10
- role?: "guest" | "maintainer" | "owner" | "user" | undefined;
11
- expiresHours?: number | undefined;
12
- limit?: number | undefined;
13
- emailMask?: string | undefined;
14
- }) => Promise<{
15
- content: Array<{
16
- type: 'text';
17
- text: string;
18
- }>;
19
- }>;
20
- export declare const sendInvite: (args: {
21
- workspace: string;
22
- email: string;
23
- role?: "guest" | "maintainer" | "owner" | "user" | undefined;
24
- }) => Promise<{
25
- content: Array<{
26
- type: 'text';
27
- text: string;
28
- }>;
29
- }>;
30
- export declare const setMemberRole: (args: {
31
- workspace: string;
32
- member: string;
33
- role: "guest" | "maintainer" | "owner" | "user";
34
- }) => Promise<{
35
- content: Array<{
36
- type: 'text';
37
- text: string;
38
- }>;
39
- }>;
40
- export declare const getWorkspaceSettings: (args: {
41
- workspace?: string | undefined;
42
- }) => Promise<{
43
- content: Array<{
44
- type: 'text';
45
- text: string;
46
- }>;
47
- }>;
48
- export declare const listProjectTypes: (args: {
49
- workspace?: string | undefined;
50
- }) => Promise<{
51
- content: Array<{
52
- type: 'text';
53
- text: string;
54
- }>;
55
- }>;
@@ -1,117 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.listProjectTypes = exports.getWorkspaceSettings = exports.setMemberRole = exports.sendInvite = exports.createInviteLink = exports.ROLES = void 0;
4
- // Workspace administration: invitations, member roles, settings, project/task types.
5
- // Invites and roles go through the account service (workspace-scoped account client).
6
- const connection_1 = require("../connection");
7
- const errors_1 = require("../utils/errors");
8
- const people_1 = require("../utils/people");
9
- const sharing_1 = require("./sharing");
10
- exports.ROLES = { guest: 'GUEST', user: 'USER', maintainer: 'MAINTAINER', owner: 'OWNER' };
11
- const ROLE_NAME = { READONLYGUEST: 'read-only guest', DocGuest: 'document guest', GUEST: 'guest', USER: 'user', MAINTAINER: 'maintainer', OWNER: 'owner', ADMIN: 'admin' };
12
- function frontUrl() {
13
- const f = process.env.HULY_FRONT_URL;
14
- if (f == null || f === '')
15
- throw new Error('HULY_FRONT_URL is not set โ€” needed to build the invite link.');
16
- return f.replace(/\/$/, '');
17
- }
18
- exports.createInviteLink = (0, errors_1.wrapToolHandler)(async (args) => {
19
- const account = await (0, connection_1.getAccountClient)(args.workspace);
20
- const role = exports.ROLES[args.role ?? 'user'];
21
- const hours = args.expiresHours ?? 48;
22
- if (args.email != null) {
23
- const link = await account.createInviteLink(args.email.trim(), role, false, '', '', undefined, hours);
24
- return `๐Ÿ”— Personal invite for ${args.email} as ${args.role ?? 'user'} (one use, ${hours} h):\n${(0, sharing_1.reachableUrl)(link)}\nNothing was sent โ€” share the link yourself, or use send_invite.`;
25
- }
26
- const limit = args.limit ?? 1;
27
- const id = await account.createInvite(hours * 3_600_000, args.emailMask ?? '', limit, role);
28
- const mask = args.emailMask != null && args.emailMask !== '' ? `, only for ${args.emailMask}` : '';
29
- return `๐Ÿ”— Invite link as ${args.role ?? 'user'} (${limit} use(s), ${hours} h${mask}):\n${frontUrl()}/login/join?inviteId=${id}`;
30
- });
31
- exports.sendInvite = (0, errors_1.wrapToolHandler)(async (args) => {
32
- const account = await (0, connection_1.getAccountClient)(args.workspace);
33
- const role = exports.ROLES[args.role ?? 'user'];
34
- await account.sendInvite(args.email.trim(), role);
35
- return `๐Ÿ“ง Invitation e-mail sent to ${args.email} (role ${args.role ?? 'user'}).`;
36
- });
37
- /** Workspace members with names: account uuid โ†’ person name. */
38
- async function membersWithNames(workspace) {
39
- const account = await (0, connection_1.getAccountClient)(workspace);
40
- const members = await account.getWorkspaceMembers();
41
- const client = await (0, connection_1.getConnection)(workspace);
42
- const persons = await client.findAll('contact:class:Person', {});
43
- const names = new Map(persons.filter((p) => p.personUuid != null).map((p) => [String(p.personUuid), (0, people_1.formatPersonName)(p.name)]));
44
- return members.map((m) => ({ uuid: String(m.person), role: String(m.role), name: names.get(String(m.person)) ?? '' }));
45
- }
46
- exports.setMemberRole = (0, errors_1.wrapToolHandler)(async (args) => {
47
- const members = await membersWithNames(args.workspace);
48
- const q = args.member.trim().toLowerCase();
49
- const exact = members.filter((m) => m.uuid === args.member.trim() || m.name.toLowerCase() === q);
50
- const hits = exact.length > 0 ? exact : members.filter((m) => m.name.toLowerCase().includes(q));
51
- if (hits.length === 0)
52
- throw new Error(`Member '${args.member}' not found. Members: ${members.map((m) => m.name || m.uuid).join(', ')}.`);
53
- if (hits.length > 1)
54
- throw new Error(`Member '${args.member}' is ambiguous: ${hits.map((m) => m.name || m.uuid).join(', ')}.`);
55
- const target = hits[0];
56
- const role = exports.ROLES[args.role];
57
- if (target.role === role)
58
- return `${target.name || target.uuid} already has role ${args.role}.`;
59
- const account = await (0, connection_1.getAccountClient)(args.workspace);
60
- await account.updateWorkspaceRole(target.uuid, role);
61
- return `โœ… ${target.name || target.uuid}: ${ROLE_NAME[target.role] ?? target.role} โ†’ ${args.role}.`;
62
- });
63
- exports.getWorkspaceSettings = (0, errors_1.wrapToolHandler)(async (args) => {
64
- const conn = await (0, connection_1.getWorkspace)(args.workspace);
65
- const client = conn.client;
66
- const [members, invite, integrations, setting] = await Promise.all([
67
- membersWithNames(args.workspace),
68
- client.findOne('setting:class:InviteSettings', {}),
69
- client.findAll('setting:class:Integration', {}),
70
- client.findOne('setting:class:WorkspaceSetting', {})
71
- ]);
72
- const me = await (0, people_1.currentAccountUuid)(client).catch(() => undefined);
73
- const byRole = new Map();
74
- for (const m of members)
75
- byRole.set(m.role, (byRole.get(m.role) ?? 0) + 1);
76
- const myRole = members.find((m) => m.uuid === me)?.role;
77
- const lines = [
78
- `## Workspace ${conn.workspace.name}`,
79
- `- Slug: \`${conn.workspace.url}\` ยท id \`${conn.workspace.uuid}\``,
80
- `- Your role: ${myRole != null ? ROLE_NAME[myRole] ?? myRole : 'unknown'}`,
81
- `- Members: ${members.length} (${[...byRole].map(([r, n]) => `${n} ${ROLE_NAME[r] ?? r}`).join(', ')})`,
82
- `- Custom logo: ${setting?.icon != null ? 'yes' : 'no'}`,
83
- `- Invite defaults: ${invite != null ? `expire after ${invite.expirationTime} h, limit ${invite.limit}${invite.emailMask != null && invite.emailMask !== '' ? `, e-mail mask ${invite.emailMask}` : ''}${invite.enabled === false ? ', invites disabled' : ''}` : 'Huly defaults'}`
84
- ];
85
- if (integrations.length > 0) {
86
- lines.push(`- Integrations: ${integrations.map((i) => `${String(i.type).split(':').pop() ?? i.type}${i.disabled === true ? ' (disabled)' : ''}${i.value != null && i.value !== '' ? ` โ€” ${String(i.value)}` : ''}`).join('; ')}`);
87
- }
88
- else
89
- lines.push('- Integrations: none');
90
- return lines.join('\n');
91
- });
92
- const label = (v) => { const s = String(v ?? ''); return s.includes(':') ? s.split(':').pop() ?? s : s; };
93
- exports.listProjectTypes = (0, errors_1.wrapToolHandler)(async (args) => {
94
- const client = await (0, connection_1.getConnection)(args.workspace);
95
- const [types, taskTypes, statuses, projects] = await Promise.all([
96
- client.findAll('task:class:ProjectType', {}),
97
- client.findAll('task:class:TaskType', {}),
98
- client.findAll('core:class:Status', {}),
99
- client.findAll('task:class:Project', {})
100
- ]);
101
- const statusById = new Map(statuses.map((s) => [s._id, s]));
102
- const out = [`## Project types (${types.length})`];
103
- for (const t of types) {
104
- const used = projects.filter((p) => p.type === t._id).map((p) => p.identifier ?? p.name);
105
- out.push('', `### ${t.name} โ€” ${label(t.descriptor).replace(/Type$/, '')}${t.classic === true ? ' (classic)' : ''} \`${t._id}\``);
106
- out.push(`Used by: ${used.length > 0 ? used.join(', ') : 'โ€”'}`);
107
- for (const tt of taskTypes.filter((x) => x.parent === t._id)) {
108
- const flow = (tt.statuses ?? []).map((id) => {
109
- const s = statusById.get(id);
110
- return s != null ? `${s.name} (${label(s.category)})` : id;
111
- });
112
- out.push(`- **${tt.name}** (${label(tt.ofClass)}): ${flow.join(' โ†’ ') || 'no statuses'}`);
113
- }
114
- }
115
- return out.join('\n');
116
- });
117
- //# sourceMappingURL=workspace-admin.js.map