huly-mcp-selfhost 2.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +39 -2
- package/README.md +462 -16
- package/dist/connection.d.ts +8 -0
- package/dist/connection.js +13 -1
- package/dist/connection.js.map +1 -1
- package/dist/env.d.ts +1 -0
- package/dist/env.js +17 -0
- package/dist/env.js.map +1 -0
- package/dist/guard.d.ts +28 -0
- package/dist/guard.js +152 -0
- package/dist/guard.js.map +1 -0
- package/dist/guides/costs.md +48 -0
- package/dist/guides/features.md +49 -0
- package/dist/guides/onboarding.md +56 -0
- package/dist/guides/workflow.md +57 -0
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/junit-cli.d.ts +8 -0
- package/dist/junit-cli.js +106 -0
- package/dist/junit-cli.js.map +1 -0
- package/dist/registry.d.ts +18 -0
- package/dist/registry.js +318 -0
- package/dist/registry.js.map +1 -0
- package/dist/resources.d.ts +12 -0
- package/dist/resources.js +212 -0
- package/dist/resources.js.map +1 -0
- package/dist/schemas.d.ts +1269 -17
- package/dist/schemas.js +890 -97
- package/dist/schemas.js.map +1 -1
- package/dist/server.d.ts +27 -1
- package/dist/server.js +197 -128
- package/dist/server.js.map +1 -1
- package/dist/tools/activity.d.ts +10 -0
- package/dist/tools/activity.js +62 -0
- package/dist/tools/activity.js.map +1 -0
- package/dist/tools/agent.d.ts +156 -0
- package/dist/tools/agent.js +523 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/attachments.d.ts +4 -4
- package/dist/tools/calendar.d.ts +49 -0
- package/dist/tools/calendar.js +116 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/cards.d.ts +87 -0
- package/dist/tools/cards.js +246 -0
- package/dist/tools/cards.js.map +1 -0
- package/dist/tools/channels.d.ts +76 -7
- package/dist/tools/channels.js +86 -5
- package/dist/tools/channels.js.map +1 -1
- package/dist/tools/comments.d.ts +16 -4
- package/dist/tools/comments.js +26 -9
- package/dist/tools/comments.js.map +1 -1
- package/dist/tools/components.d.ts +5 -5
- package/dist/tools/components.js +4 -22
- package/dist/tools/components.js.map +1 -1
- package/dist/tools/contacts.d.ts +69 -0
- package/dist/tools/contacts.js +130 -0
- package/dist/tools/contacts.js.map +1 -0
- package/dist/tools/crm.d.ts +61 -0
- package/dist/tools/crm.js +117 -0
- package/dist/tools/crm.js.map +1 -0
- package/dist/tools/documents.d.ts +35 -12
- package/dist/tools/documents.js +107 -22
- package/dist/tools/documents.js.map +1 -1
- package/dist/tools/drive.d.ts +107 -0
- package/dist/tools/drive.js +277 -0
- package/dist/tools/drive.js.map +1 -0
- package/dist/tools/fields.d.ts +33 -0
- package/dist/tools/fields.js +124 -0
- package/dist/tools/fields.js.map +1 -0
- package/dist/tools/generic.d.ts +72 -0
- package/dist/tools/generic.js +242 -0
- package/dist/tools/generic.js.map +1 -0
- package/dist/tools/github.d.ts +21 -0
- package/dist/tools/github.js +80 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/hr.d.ts +97 -0
- package/dist/tools/hr.js +150 -0
- package/dist/tools/hr.js.map +1 -0
- package/dist/tools/inbox.d.ts +23 -0
- package/dist/tools/inbox.js +76 -0
- package/dist/tools/inbox.js.map +1 -0
- package/dist/tools/inventory.d.ts +61 -0
- package/dist/tools/inventory.js +103 -0
- package/dist/tools/inventory.js.map +1 -0
- package/dist/tools/issues.d.ts +63 -12
- package/dist/tools/issues.js +259 -48
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/labels.d.ts +52 -4
- package/dist/tools/labels.js +86 -4
- package/dist/tools/labels.js.map +1 -1
- package/dist/tools/log-time.d.ts +15 -1
- package/dist/tools/log-time.js +70 -6
- package/dist/tools/log-time.js.map +1 -1
- package/dist/tools/meetings.d.ts +30 -0
- package/dist/tools/meetings.js +78 -0
- package/dist/tools/meetings.js.map +1 -0
- package/dist/tools/members.d.ts +1 -1
- package/dist/tools/members.js +17 -1
- package/dist/tools/members.js.map +1 -1
- package/dist/tools/message-templates.d.ts +54 -0
- package/dist/tools/message-templates.js +88 -0
- package/dist/tools/message-templates.js.map +1 -0
- package/dist/tools/milestones.d.ts +9 -9
- package/dist/tools/organizations.d.ts +5 -5
- package/dist/tools/organizations.js +2 -1
- package/dist/tools/organizations.js.map +1 -1
- package/dist/tools/overview.d.ts +55 -0
- package/dist/tools/overview.js +395 -0
- package/dist/tools/overview.js.map +1 -0
- package/dist/tools/planner.d.ts +60 -0
- package/dist/tools/planner.js +145 -0
- package/dist/tools/planner.js.map +1 -0
- package/dist/tools/process.d.ts +50 -0
- package/dist/tools/process.js +137 -0
- package/dist/tools/process.js.map +1 -0
- package/dist/tools/products.d.ts +17 -0
- package/dist/tools/products.js +45 -0
- package/dist/tools/products.js.map +1 -0
- package/dist/tools/projects.d.ts +17 -4
- package/dist/tools/projects.js +31 -2
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/qms.d.ts +57 -0
- package/dist/tools/qms.js +171 -0
- package/dist/tools/qms.js.map +1 -0
- package/dist/tools/recruiting.d.ts +112 -0
- package/dist/tools/recruiting.js +203 -0
- package/dist/tools/recruiting.js.map +1 -0
- package/dist/tools/relations.d.ts +45 -3
- package/dist/tools/relations.js +128 -39
- package/dist/tools/relations.js.map +1 -1
- package/dist/tools/search.d.ts +14 -1
- package/dist/tools/search.js +29 -1
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/sharing.d.ts +62 -0
- package/dist/tools/sharing.js +149 -0
- package/dist/tools/sharing.js.map +1 -0
- package/dist/tools/statuses.d.ts +3 -3
- package/dist/tools/surveys.d.ts +22 -0
- package/dist/tools/surveys.js +53 -0
- package/dist/tools/surveys.js.map +1 -0
- package/dist/tools/templates.d.ts +95 -0
- package/dist/tools/templates.js +260 -0
- package/dist/tools/templates.js.map +1 -0
- package/dist/tools/test-automation.d.ts +81 -0
- package/dist/tools/test-automation.js +225 -0
- package/dist/tools/test-automation.js.map +1 -0
- package/dist/tools/testing.d.ts +234 -0
- package/dist/tools/testing.js +401 -0
- package/dist/tools/testing.js.map +1 -0
- package/dist/tools/workspace-admin.d.ts +55 -0
- package/dist/tools/workspace-admin.js +117 -0
- package/dist/tools/workspace-admin.js.map +1 -0
- package/dist/tools/workspaces.d.ts +1 -1
- package/dist/utils/attributes.d.ts +37 -0
- package/dist/utils/attributes.js +188 -0
- package/dist/utils/attributes.js.map +1 -0
- package/dist/utils/classes.d.ts +51 -0
- package/dist/utils/classes.js +73 -0
- package/dist/utils/classes.js.map +1 -0
- package/dist/utils/content.d.ts +11 -0
- package/dist/utils/content.js +86 -0
- package/dist/utils/content.js.map +1 -0
- package/dist/utils/errors.js +1 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/files.d.ts +5 -0
- package/dist/utils/files.js +50 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/format.d.ts +2 -0
- package/dist/utils/format.js +7 -13
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/junit.d.ts +13 -0
- package/dist/utils/junit.js +81 -0
- package/dist/utils/junit.js.map +1 -0
- package/dist/utils/markdown.js +9 -4
- package/dist/utils/markdown.js.map +1 -1
- package/dist/utils/meeting.d.ts +13 -0
- package/dist/utils/meeting.js +118 -0
- package/dist/utils/meeting.js.map +1 -0
- package/dist/utils/people.d.ts +25 -0
- package/dist/utils/people.js +80 -0
- package/dist/utils/people.js.map +1 -0
- package/dist/utils/redact.d.ts +3 -0
- package/dist/utils/redact.js +26 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/resolve.d.ts +17 -0
- package/dist/utils/resolve.js +54 -0
- package/dist/utils/resolve.js.map +1 -0
- package/dist/utils/spec.d.ts +10 -0
- package/dist/utils/spec.js +90 -0
- package/dist/utils/spec.js.map +1 -0
- package/dist/utils/storage.js +7 -3
- package/dist/utils/storage.js.map +1 -1
- package/dist/utils/tasks.d.ts +22 -0
- package/dist/utils/tasks.js +81 -0
- package/dist/utils/tasks.js.map +1 -0
- package/dist/watch.d.ts +62 -0
- package/dist/watch.js +405 -0
- package/dist/watch.js.map +1 -0
- package/package.json +4 -3
- package/scripts/setup.js +3 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.createIssueFromTemplate = exports.deleteIssueTemplate = exports.updateIssueTemplate = exports.createIssueTemplate = exports.getIssueTemplate = exports.listIssueTemplates = void 0;
|
|
40
|
+
// Issue templates (tracker:class:IssueTemplate): reusable issues with sub-issues.
|
|
41
|
+
// Like Huly's CreateIssueTemplate dialog; "issue from template" copies the template into
|
|
42
|
+
// a new issue plus one sub-issue per child, as Huly's CreateIssue + SubIssues do.
|
|
43
|
+
const tracker_1 = __importStar(require("@hcengineering/tracker"));
|
|
44
|
+
const tags_1 = __importDefault(require("@hcengineering/tags"));
|
|
45
|
+
const core_1 = require("@hcengineering/core");
|
|
46
|
+
const connection_1 = require("../connection");
|
|
47
|
+
const errors_1 = require("../utils/errors");
|
|
48
|
+
const format_1 = require("../utils/format");
|
|
49
|
+
const people_1 = require("../utils/people");
|
|
50
|
+
const issues_1 = require("./issues");
|
|
51
|
+
const labels_1 = require("./labels");
|
|
52
|
+
const agent_1 = require("./agent");
|
|
53
|
+
const PRIORITY = { NoPriority: tracker_1.IssuePriority.NoPriority, Urgent: tracker_1.IssuePriority.Urgent, High: tracker_1.IssuePriority.High, Medium: tracker_1.IssuePriority.Medium, Low: tracker_1.IssuePriority.Low };
|
|
54
|
+
const PRIORITY_NAME = Object.fromEntries(Object.entries(PRIORITY).map(([k, v]) => [v, k]));
|
|
55
|
+
async function findProject(client, identifier) {
|
|
56
|
+
const project = await client.findOne(tracker_1.default.class.Project, { identifier });
|
|
57
|
+
if (project == null)
|
|
58
|
+
throw new Error(`Project '${identifier}' not found.`);
|
|
59
|
+
return project;
|
|
60
|
+
}
|
|
61
|
+
async function byLabel(client, _class, project, label, what) {
|
|
62
|
+
if (label == null)
|
|
63
|
+
return null;
|
|
64
|
+
const all = await client.findAll(_class, { space: project._id });
|
|
65
|
+
const hit = all.find((x) => String(x.label).toLowerCase() === label.toLowerCase());
|
|
66
|
+
if (hit == null)
|
|
67
|
+
throw new Error(`${what} '${label}' not found in ${String(project.identifier)}. Available: ${all.map((x) => x.label).join(', ') || 'none'}.`);
|
|
68
|
+
return hit._id;
|
|
69
|
+
}
|
|
70
|
+
async function labelIds(client, names) {
|
|
71
|
+
const out = [];
|
|
72
|
+
for (const name of names ?? []) {
|
|
73
|
+
const tag = await client.findOne(tags_1.default.class.TagElement, { targetClass: tracker_1.default.class.Issue, title: name });
|
|
74
|
+
if (tag == null)
|
|
75
|
+
throw new Error(`Label '${name}' not found (create it first with create_label).`);
|
|
76
|
+
out.push(tag._id);
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
async function findTemplate(client, ref, projectIdentifier) {
|
|
81
|
+
const byId = await client.findOne(tracker_1.default.class.IssueTemplate, { _id: ref });
|
|
82
|
+
if (byId != null)
|
|
83
|
+
return byId;
|
|
84
|
+
const query = {};
|
|
85
|
+
if (projectIdentifier != null)
|
|
86
|
+
query.space = (await findProject(client, projectIdentifier))._id;
|
|
87
|
+
const all = await client.findAll(tracker_1.default.class.IssueTemplate, query);
|
|
88
|
+
const hits = all.filter((t) => String(t.title).toLowerCase() === ref.toLowerCase());
|
|
89
|
+
if (hits.length === 1)
|
|
90
|
+
return hits[0];
|
|
91
|
+
if (hits.length > 1)
|
|
92
|
+
throw new Error(`Template '${ref}' exists in several projects — pass projectIdentifier.`);
|
|
93
|
+
throw new Error(`Template '${ref}' not found.`);
|
|
94
|
+
}
|
|
95
|
+
async function templateData(client, project, t) {
|
|
96
|
+
return {
|
|
97
|
+
title: t.title.trim(),
|
|
98
|
+
description: (0, format_1.textToMarkup)(t.description ?? ''),
|
|
99
|
+
priority: PRIORITY[t.priority ?? 'NoPriority'],
|
|
100
|
+
assignee: t.assignee != null ? (await (0, people_1.findPerson)(client, t.assignee))._id : null,
|
|
101
|
+
component: await byLabel(client, tracker_1.default.class.Component, project, t.componentLabel, 'Component'),
|
|
102
|
+
milestone: await byLabel(client, tracker_1.default.class.Milestone, project, t.milestoneLabel, 'Milestone'),
|
|
103
|
+
estimation: t.estimation ?? 0,
|
|
104
|
+
labels: await labelIds(client, t.labels)
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Names for display/creation: assignee, component, milestone and labels of a template (or child). */
|
|
108
|
+
async function names(client, t, people) {
|
|
109
|
+
const component = t.component != null ? (await client.findOne(tracker_1.default.class.Component, { _id: t.component }))?.label : undefined;
|
|
110
|
+
const milestone = t.milestone != null ? (await client.findOne(tracker_1.default.class.Milestone, { _id: t.milestone }))?.label : undefined;
|
|
111
|
+
const labels = (t.labels ?? []).length > 0 ? await client.findAll(tags_1.default.class.TagElement, { _id: { $in: t.labels } }) : [];
|
|
112
|
+
return { assignee: t.assignee != null ? people.get(t.assignee) : undefined, component, milestone, labels: labels.map((l) => l.title) };
|
|
113
|
+
}
|
|
114
|
+
function describe(t, n) {
|
|
115
|
+
const bits = [(0, format_1.priorityLabel)(t.priority)];
|
|
116
|
+
if (n.assignee != null)
|
|
117
|
+
bits.push(`@${n.assignee}`);
|
|
118
|
+
if (n.component != null)
|
|
119
|
+
bits.push(`component ${n.component}`);
|
|
120
|
+
if (n.milestone != null)
|
|
121
|
+
bits.push(`milestone ${n.milestone}`);
|
|
122
|
+
if ((t.estimation ?? 0) > 0)
|
|
123
|
+
bits.push(`${String(t.estimation)}d`);
|
|
124
|
+
if (n.labels.length > 0)
|
|
125
|
+
bits.push(`labels ${n.labels.join(', ')}`);
|
|
126
|
+
return bits.join(' · ');
|
|
127
|
+
}
|
|
128
|
+
exports.listIssueTemplates = (0, errors_1.wrapToolHandler)(async (args) => {
|
|
129
|
+
const client = await (0, connection_1.getConnection)(args.workspace);
|
|
130
|
+
const query = {};
|
|
131
|
+
if (args.projectIdentifier != null)
|
|
132
|
+
query.space = (await findProject(client, args.projectIdentifier))._id;
|
|
133
|
+
const templates = await client.findAll(tracker_1.default.class.IssueTemplate, query);
|
|
134
|
+
if (templates.length === 0)
|
|
135
|
+
return 'No issue templates.';
|
|
136
|
+
const projects = await client.findAll(tracker_1.default.class.Project, {});
|
|
137
|
+
const key = new Map(projects.map((p) => [p._id, p.identifier]));
|
|
138
|
+
return `## Issue templates (${templates.length})\n\n${templates.map((t) => `- **${String(t.title)}** [${String(key.get(t.space) ?? '?')}]${(t.children ?? []).length > 0 ? ` · ${String(t.children.length)} sub-issue(s)` : ''} — \`${String(t._id)}\``).join('\n')}`;
|
|
139
|
+
});
|
|
140
|
+
exports.getIssueTemplate = (0, errors_1.wrapToolHandler)(async (args) => {
|
|
141
|
+
const client = await (0, connection_1.getConnection)(args.workspace);
|
|
142
|
+
const t = await findTemplate(client, args.template, args.projectIdentifier);
|
|
143
|
+
const people = await (0, people_1.peopleNames)(client);
|
|
144
|
+
const lines = [`## Template: ${String(t.title)}`, '', describe(t, await names(client, t, people)), `**Id:** \`${String(t._id)}\``];
|
|
145
|
+
const desc = (0, format_1.markupToText)(t.description);
|
|
146
|
+
if (desc !== '')
|
|
147
|
+
lines.push('', '### Description', desc);
|
|
148
|
+
if ((t.children ?? []).length > 0) {
|
|
149
|
+
lines.push('', `### Sub-issues (${String(t.children.length)})`);
|
|
150
|
+
for (const c of t.children)
|
|
151
|
+
lines.push(`- **${String(c.title)}** — ${describe(c, await names(client, c, people))}`);
|
|
152
|
+
}
|
|
153
|
+
return lines.join('\n');
|
|
154
|
+
});
|
|
155
|
+
exports.createIssueTemplate = (0, errors_1.wrapToolHandler)(async (args) => {
|
|
156
|
+
const client = await (0, connection_1.getConnection)(args.workspace);
|
|
157
|
+
const project = await findProject(client, args.projectIdentifier);
|
|
158
|
+
const existing = await client.findOne(tracker_1.default.class.IssueTemplate, { space: project._id, title: args.title.trim() });
|
|
159
|
+
if (existing != null)
|
|
160
|
+
return `ℹ️ Template **${args.title}** already exists in ${args.projectIdentifier} — \`${String(existing._id)}\`.`;
|
|
161
|
+
const data = await templateData(client, project, args);
|
|
162
|
+
const children = [];
|
|
163
|
+
for (const c of args.children ?? [])
|
|
164
|
+
children.push({ id: (0, core_1.generateId)(), ...(await templateData(client, project, c)) });
|
|
165
|
+
const id = await client.createDoc(tracker_1.default.class.IssueTemplate, project._id, { ...data, children, comments: 0, attachments: 0, relations: [] });
|
|
166
|
+
return `✅ Template **${args.title}** created in ${args.projectIdentifier}${children.length > 0 ? ` with ${children.length} sub-issue(s)` : ''} — \`${String(id)}\`.`;
|
|
167
|
+
});
|
|
168
|
+
exports.updateIssueTemplate = (0, errors_1.wrapToolHandler)(async (args) => {
|
|
169
|
+
const client = await (0, connection_1.getConnection)(args.workspace);
|
|
170
|
+
const t = await findTemplate(client, args.template, args.projectIdentifier);
|
|
171
|
+
const project = await client.findOne(tracker_1.default.class.Project, { _id: t.space });
|
|
172
|
+
const update = {};
|
|
173
|
+
if (args.title != null)
|
|
174
|
+
update.title = args.title.trim();
|
|
175
|
+
if (args.description != null)
|
|
176
|
+
update.description = (0, format_1.textToMarkup)(args.description);
|
|
177
|
+
if (args.priority != null)
|
|
178
|
+
update.priority = PRIORITY[args.priority];
|
|
179
|
+
if (args.assignee !== undefined)
|
|
180
|
+
update.assignee = args.assignee != null ? (await (0, people_1.findPerson)(client, args.assignee))._id : null;
|
|
181
|
+
if (args.componentLabel !== undefined)
|
|
182
|
+
update.component = await byLabel(client, tracker_1.default.class.Component, project, args.componentLabel, 'Component');
|
|
183
|
+
if (args.milestoneLabel !== undefined)
|
|
184
|
+
update.milestone = await byLabel(client, tracker_1.default.class.Milestone, project, args.milestoneLabel, 'Milestone');
|
|
185
|
+
if (args.estimation != null)
|
|
186
|
+
update.estimation = args.estimation;
|
|
187
|
+
if (args.labels != null)
|
|
188
|
+
update.labels = await labelIds(client, args.labels);
|
|
189
|
+
if (args.children != null) {
|
|
190
|
+
const children = [];
|
|
191
|
+
for (const c of args.children)
|
|
192
|
+
children.push({ id: (0, core_1.generateId)(), ...(await templateData(client, project, c)) });
|
|
193
|
+
update.children = children;
|
|
194
|
+
}
|
|
195
|
+
if (Object.keys(update).length === 0)
|
|
196
|
+
throw new Error('Nothing to change.');
|
|
197
|
+
await client.updateDoc(tracker_1.default.class.IssueTemplate, t.space, t._id, update);
|
|
198
|
+
return `✅ Template **${String(update.title ?? t.title)}** updated: ${Object.keys(update).join(', ')}.`;
|
|
199
|
+
});
|
|
200
|
+
exports.deleteIssueTemplate = (0, errors_1.wrapToolHandler)(async (args) => {
|
|
201
|
+
const client = await (0, connection_1.getConnection)(args.workspace);
|
|
202
|
+
const t = await findTemplate(client, args.template, args.projectIdentifier);
|
|
203
|
+
await client.removeDoc(tracker_1.default.class.IssueTemplate, t.space, t._id);
|
|
204
|
+
return `✅ Template **${String(t.title)}** deleted.`;
|
|
205
|
+
});
|
|
206
|
+
const text = (r) => r.content[0].text;
|
|
207
|
+
exports.createIssueFromTemplate = (0, errors_1.wrapToolHandler)(async (args) => {
|
|
208
|
+
const client = await (0, connection_1.getConnection)(args.workspace);
|
|
209
|
+
const t = await findTemplate(client, args.template, args.projectIdentifier);
|
|
210
|
+
const project = await client.findOne(tracker_1.default.class.Project, { _id: t.space });
|
|
211
|
+
const people = await (0, people_1.peopleNames)(client);
|
|
212
|
+
const top = await names(client, t, people);
|
|
213
|
+
const title = args.title ?? String(t.title);
|
|
214
|
+
const description = (0, format_1.markupToText)(t.description);
|
|
215
|
+
const ws = args.workspace;
|
|
216
|
+
let id;
|
|
217
|
+
let childIds = [];
|
|
218
|
+
if ((t.children ?? []).length > 0) {
|
|
219
|
+
const kids = [];
|
|
220
|
+
for (const c of t.children) {
|
|
221
|
+
const n = await names(client, c, people);
|
|
222
|
+
kids.push({ title: String(c.title), description: (0, format_1.markupToText)(c.description) || undefined, priority: PRIORITY_NAME[c.priority], assignee: n.assignee, componentLabel: n.component, milestoneLabel: n.milestone, labels: n.labels });
|
|
223
|
+
}
|
|
224
|
+
const out = text(await (0, agent_1.createIssueTree)({ workspace: ws, projectIdentifier: project.identifier, epic: { title, description: description || undefined, priority: PRIORITY_NAME[t.priority], labels: top.labels }, children: kids, skipDuplicates: false, dryRun: false }));
|
|
225
|
+
const m = /under \*\*([A-Z][A-Z0-9]*-\d+)\*\*/.exec(out);
|
|
226
|
+
if (m == null)
|
|
227
|
+
throw new Error(`Unexpected result while creating the issue tree: ${out}`);
|
|
228
|
+
id = m[1];
|
|
229
|
+
childIds = [...out.matchAll(/^- ([A-Z][A-Z0-9]*-\d+):/gm)].map((x) => x[1]);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
const out = text(await (0, issues_1.createIssue)({ workspace: ws, projectIdentifier: project.identifier, title, description: description || undefined, priority: PRIORITY_NAME[t.priority] ?? 'NoPriority' }));
|
|
233
|
+
const m = /\*\*([A-Z][A-Z0-9]*-\d+)\*\*/.exec(out);
|
|
234
|
+
if (m == null)
|
|
235
|
+
throw new Error(`Unexpected result while creating the issue: ${out}`);
|
|
236
|
+
id = m[1];
|
|
237
|
+
for (const l of top.labels)
|
|
238
|
+
await (0, labels_1.addLabel)({ workspace: ws, identifier: id, labelName: l });
|
|
239
|
+
}
|
|
240
|
+
const fields = {};
|
|
241
|
+
if (top.assignee != null)
|
|
242
|
+
fields.assignee = top.assignee;
|
|
243
|
+
if (top.component != null)
|
|
244
|
+
fields.componentLabel = top.component;
|
|
245
|
+
if (top.milestone != null)
|
|
246
|
+
fields.milestoneLabel = top.milestone;
|
|
247
|
+
if (Object.keys(fields).length > 0)
|
|
248
|
+
await (0, issues_1.updateIssue)({ workspace: ws, identifier: id, ...fields });
|
|
249
|
+
// Estimation (man-days in templates, hours on issues in Huly 0.7 — both store the same number).
|
|
250
|
+
const estimates = [[id, t.estimation ?? 0], ...childIds.map((cid, i) => [cid, t.children[i]?.estimation ?? 0])];
|
|
251
|
+
for (const [iid, est] of estimates) {
|
|
252
|
+
if (est <= 0)
|
|
253
|
+
continue;
|
|
254
|
+
const issue = await client.findOne(tracker_1.default.class.Issue, { identifier: iid });
|
|
255
|
+
if (issue != null)
|
|
256
|
+
await client.updateDoc(tracker_1.default.class.Issue, issue.space, issue._id, { estimation: est });
|
|
257
|
+
}
|
|
258
|
+
return `✅ Created **${id}** "${title}" from template "${String(t.title)}"${(t.children ?? []).length > 0 ? ` with ${String(t.children.length)} sub-issue(s)` : ''}.`;
|
|
259
|
+
});
|
|
260
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/tools/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export interface ImportOptions {
|
|
2
|
+
workspace?: string;
|
|
3
|
+
project: string;
|
|
4
|
+
xml: string;
|
|
5
|
+
runName?: string;
|
|
6
|
+
parentSuite?: string;
|
|
7
|
+
createMissing?: boolean;
|
|
8
|
+
dryRun?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ImportSummary {
|
|
11
|
+
text: string;
|
|
12
|
+
passed: number;
|
|
13
|
+
failed: number;
|
|
14
|
+
skipped: number;
|
|
15
|
+
created: number;
|
|
16
|
+
unmatched: number;
|
|
17
|
+
runId?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Imports JUnit XML as a new test run; one Huly suite per JUnit suite (under parentSuite, if given). */
|
|
20
|
+
export declare function importJUnit(o: ImportOptions): Promise<ImportSummary>;
|
|
21
|
+
export declare const importTestResults: (args: {
|
|
22
|
+
workspace: string;
|
|
23
|
+
project: string;
|
|
24
|
+
xml?: string | undefined;
|
|
25
|
+
file?: string | undefined;
|
|
26
|
+
runName?: string | undefined;
|
|
27
|
+
parentSuite?: string | undefined;
|
|
28
|
+
createMissing?: boolean | undefined;
|
|
29
|
+
dryRun?: boolean | undefined;
|
|
30
|
+
}) => Promise<{
|
|
31
|
+
content: Array<{
|
|
32
|
+
type: 'text';
|
|
33
|
+
text: string;
|
|
34
|
+
}>;
|
|
35
|
+
}>;
|
|
36
|
+
export declare const getTestReport: (args: {
|
|
37
|
+
workspace?: string | undefined;
|
|
38
|
+
project: string;
|
|
39
|
+
runs?: number | undefined;
|
|
40
|
+
limit?: number | undefined;
|
|
41
|
+
}) => Promise<{
|
|
42
|
+
content: Array<{
|
|
43
|
+
type: 'text';
|
|
44
|
+
text: string;
|
|
45
|
+
}>;
|
|
46
|
+
}>;
|
|
47
|
+
export declare const createIssueFromTestResult: (args: {
|
|
48
|
+
workspace: string;
|
|
49
|
+
result: string;
|
|
50
|
+
projectIdentifier: string;
|
|
51
|
+
title?: string | undefined;
|
|
52
|
+
priority?: "High" | "Low" | "Medium" | "NoPriority" | "Urgent" | undefined;
|
|
53
|
+
notes?: string | undefined;
|
|
54
|
+
componentLabel?: string | undefined;
|
|
55
|
+
milestoneLabel?: string | undefined;
|
|
56
|
+
assignee?: string | undefined;
|
|
57
|
+
}) => Promise<{
|
|
58
|
+
content: Array<{
|
|
59
|
+
type: 'text';
|
|
60
|
+
text: string;
|
|
61
|
+
}>;
|
|
62
|
+
}>;
|
|
63
|
+
export declare const createTestCases: (args: {
|
|
64
|
+
workspace: string;
|
|
65
|
+
project: string;
|
|
66
|
+
suite: string;
|
|
67
|
+
createSuite?: boolean | undefined;
|
|
68
|
+
parentSuite?: string | undefined;
|
|
69
|
+
cases: {
|
|
70
|
+
name: string;
|
|
71
|
+
description?: string | undefined;
|
|
72
|
+
type?: "Functional" | "Performance" | "Regression" | "Security" | "Smoke" | "Usability" | undefined;
|
|
73
|
+
priority?: "High" | "Low" | "Medium" | "Urgent" | undefined;
|
|
74
|
+
assignee?: string | undefined;
|
|
75
|
+
}[];
|
|
76
|
+
}) => Promise<{
|
|
77
|
+
content: Array<{
|
|
78
|
+
type: 'text';
|
|
79
|
+
text: string;
|
|
80
|
+
}>;
|
|
81
|
+
}>;
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTestCases = exports.createIssueFromTestResult = exports.getTestReport = exports.importTestResults = void 0;
|
|
4
|
+
exports.importJUnit = importJUnit;
|
|
5
|
+
// Test management beyond clicking: CI results in (JUnit XML), bugs out of failed results, a report
|
|
6
|
+
// over recent runs (failing now, flaky, never run) and bulk case creation.
|
|
7
|
+
const promises_1 = require("node:fs/promises");
|
|
8
|
+
const core_1 = require("@hcengineering/core");
|
|
9
|
+
const connection_1 = require("../connection");
|
|
10
|
+
const errors_1 = require("../utils/errors");
|
|
11
|
+
const content_1 = require("../utils/content");
|
|
12
|
+
const people_1 = require("../utils/people");
|
|
13
|
+
const junit_1 = require("../utils/junit");
|
|
14
|
+
const testing_1 = require("./testing");
|
|
15
|
+
const issues_1 = require("./issues");
|
|
16
|
+
const MAX_DETAILS = 4000;
|
|
17
|
+
const UNTESTED = 0;
|
|
18
|
+
const BLOCKED = 1;
|
|
19
|
+
const PASSED = 2;
|
|
20
|
+
const FAILED = 3;
|
|
21
|
+
const resultComment = (c) => {
|
|
22
|
+
if (c.status === 'passed')
|
|
23
|
+
return undefined;
|
|
24
|
+
const parts = [c.status === 'skipped' ? `Skipped${c.message != null ? `: ${c.message}` : ''}` : `**${c.message ?? 'Failed'}**`];
|
|
25
|
+
if (c.details != null)
|
|
26
|
+
parts.push('```\n' + (c.details.length > MAX_DETAILS ? c.details.slice(0, MAX_DETAILS) + '\n… (truncated)' : c.details) + '\n```');
|
|
27
|
+
if (c.time != null)
|
|
28
|
+
parts.push(`Duration: ${c.time.toFixed(2)} s`);
|
|
29
|
+
return parts.join('\n\n');
|
|
30
|
+
};
|
|
31
|
+
/** Imports JUnit XML as a new test run; one Huly suite per JUnit suite (under parentSuite, if given). */
|
|
32
|
+
async function importJUnit(o) {
|
|
33
|
+
const cases = (0, junit_1.parseJUnit)(o.xml);
|
|
34
|
+
if (cases.length === 0)
|
|
35
|
+
throw new Error('The report contains no test cases.');
|
|
36
|
+
const client = await (0, connection_1.getConnection)(o.workspace);
|
|
37
|
+
const project = await (0, testing_1.findProject)(client, o.project);
|
|
38
|
+
const parent = o.parentSuite != null ? await (0, testing_1.findSuite)(client, project, o.parentSuite) : undefined;
|
|
39
|
+
const parentId = parent?._id ?? testing_1.TM.NoParent;
|
|
40
|
+
const create = o.createMissing !== false;
|
|
41
|
+
const suites = await client.findAll(testing_1.TM.Suite, { space: project._id, parent: parentId });
|
|
42
|
+
const existing = await client.findAll(testing_1.TM.Case, { space: project._id });
|
|
43
|
+
const suiteIds = new Map();
|
|
44
|
+
for (const sName of new Set(cases.map((c) => c.suite)))
|
|
45
|
+
suiteIds.set(sName, suites.find((s) => String(s.name).toLowerCase() === sName.toLowerCase())?._id);
|
|
46
|
+
const plan = cases.map((c) => {
|
|
47
|
+
const sid = suiteIds.get(c.suite);
|
|
48
|
+
const hit = sid != null ? existing.find((x) => x.attachedTo === sid && String(x.name).toLowerCase() === c.name.toLowerCase()) : undefined;
|
|
49
|
+
return { c, caseId: hit?._id, isNew: hit == null };
|
|
50
|
+
});
|
|
51
|
+
const missing = plan.filter((p) => p.isNew);
|
|
52
|
+
const newSuites = [...suiteIds].filter(([, id]) => id == null).map(([s]) => s);
|
|
53
|
+
const count = (s) => cases.filter((c) => c.status === s).length;
|
|
54
|
+
const summary = { text: '', passed: count('passed'), failed: count('failed'), skipped: count('skipped'), created: create ? missing.length : 0, unmatched: create ? 0 : missing.length };
|
|
55
|
+
const runName = o.runName ?? `CI ${new Date().toISOString().slice(0, 16).replace('T', ' ')}`;
|
|
56
|
+
const head = `${summary.passed} passed, ${summary.failed} failed, ${summary.skipped} skipped`;
|
|
57
|
+
if (o.dryRun === true) {
|
|
58
|
+
summary.text = [`Dry run: would create run **${runName}** in ${String(project.name)} — ${head}.`,
|
|
59
|
+
create ? `Would create ${newSuites.length} suite(s) and ${missing.length} case(s).` : `${missing.length} case(s) have no match and would be left out (createMissing: false).`,
|
|
60
|
+
'Nothing was changed.'].join('\n');
|
|
61
|
+
return summary;
|
|
62
|
+
}
|
|
63
|
+
if (!create && missing.length === cases.length)
|
|
64
|
+
throw new Error(`None of the ${cases.length} test(s) match a case in ${String(project.name)} — import with createMissing: true.`);
|
|
65
|
+
for (const s of newSuites) {
|
|
66
|
+
if (!create)
|
|
67
|
+
continue;
|
|
68
|
+
suiteIds.set(s, await client.createDoc(testing_1.TM.Suite, project._id, { name: s, description: '', parent: parentId }));
|
|
69
|
+
}
|
|
70
|
+
if (create) {
|
|
71
|
+
for (const p of missing) {
|
|
72
|
+
const sid = suiteIds.get(p.c.suite);
|
|
73
|
+
p.caseId = await client.addCollection(testing_1.TM.Case, project._id, sid, testing_1.TM.Suite, 'testCases', {
|
|
74
|
+
name: p.c.name, description: null, type: (0, testing_1.idx)(testing_1.CASE_TYPES, 'Regression'), priority: (0, testing_1.idx)(testing_1.CASE_PRIORITIES, 'Medium'), status: 3 /* Approved */, assignee: null, attachments: 0
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const runId = await client.createDoc(testing_1.TM.Run, project._id, { name: runName, description: null });
|
|
79
|
+
for (const p of plan) {
|
|
80
|
+
if (p.caseId == null)
|
|
81
|
+
continue;
|
|
82
|
+
const comment = resultComment(p.c);
|
|
83
|
+
await client.addCollection(testing_1.TM.Result, project._id, runId, testing_1.TM.Run, 'results', {
|
|
84
|
+
name: p.c.name,
|
|
85
|
+
testCase: p.caseId,
|
|
86
|
+
testSuite: suiteIds.get(p.c.suite),
|
|
87
|
+
description: comment != null ? await (0, content_1.writeMarkup)(o.workspace, `testresult-${(0, core_1.generateId)()}`, comment) : null,
|
|
88
|
+
status: p.c.status === 'passed' ? PASSED : p.c.status === 'failed' ? FAILED : UNTESTED,
|
|
89
|
+
assignee: null
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
summary.runId = runId;
|
|
93
|
+
const failed = cases.filter((c) => c.status === 'failed').slice(0, 15).map((c) => `- ❌ ${c.suite} › ${c.name}${c.message != null ? ` — ${c.message.slice(0, 160)}` : ''}`);
|
|
94
|
+
summary.text = [
|
|
95
|
+
`✅ Run **${runName}** imported into ${String(project.name)} — ${head} — \`${runId}\``,
|
|
96
|
+
create && missing.length > 0 ? `Created ${newSuites.length} suite(s) and ${missing.length} new case(s).` : '',
|
|
97
|
+
!create && missing.length > 0 ? `⚠️ ${missing.length} test(s) without a matching case were left out.` : '',
|
|
98
|
+
failed.length > 0 ? `\n### Failed\n${failed.join('\n')}${summary.failed > 15 ? `\n… ${summary.failed - 15} more` : ''}` : ''
|
|
99
|
+
].filter((x) => x !== '').join('\n');
|
|
100
|
+
return summary;
|
|
101
|
+
}
|
|
102
|
+
exports.importTestResults = (0, errors_1.wrapToolHandler)(async (args) => {
|
|
103
|
+
if ((args.xml == null) === (args.file == null))
|
|
104
|
+
throw new Error('Pass either xml (the report) or file (a path on the machine running this server).');
|
|
105
|
+
const xml = args.xml ?? await (0, promises_1.readFile)(args.file, 'utf8');
|
|
106
|
+
return (await importJUnit({ workspace: args.workspace, project: args.project, xml, runName: args.runName, parentSuite: args.parentSuite, createMissing: args.createMissing, dryRun: args.dryRun })).text;
|
|
107
|
+
});
|
|
108
|
+
const SYMBOL = ['·', '⛔', '✅', '❌'];
|
|
109
|
+
exports.getTestReport = (0, errors_1.wrapToolHandler)(async (args) => {
|
|
110
|
+
const client = await (0, connection_1.getConnection)(args.workspace);
|
|
111
|
+
const project = await (0, testing_1.findProject)(client, args.project);
|
|
112
|
+
const runs = (await client.findAll(testing_1.TM.Run, { space: project._id }, { sort: { createdOn: core_1.SortingOrder.Descending }, limit: args.runs ?? 10 })).sort((a, b) => Number(a.createdOn ?? 0) - Number(b.createdOn ?? 0));
|
|
113
|
+
const cases = await client.findAll(testing_1.TM.Case, { space: project._id });
|
|
114
|
+
const suites = await client.findAll(testing_1.TM.Suite, { space: project._id });
|
|
115
|
+
if (cases.length === 0)
|
|
116
|
+
return `No test cases in ${String(project.name)}.`;
|
|
117
|
+
const results = runs.length > 0 ? await client.findAll(testing_1.TM.Result, { attachedTo: { $in: runs.map((r) => r._id) } }) : [];
|
|
118
|
+
const history = new Map();
|
|
119
|
+
for (const r of runs) {
|
|
120
|
+
for (const res of results.filter((x) => x.attachedTo === r._id)) {
|
|
121
|
+
const h = history.get(res.testCase) ?? [];
|
|
122
|
+
h.push(res.status ?? UNTESTED);
|
|
123
|
+
history.set(res.testCase, h);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const suiteName = (id) => String(suites.find((s) => s._id === id)?.name ?? '?');
|
|
127
|
+
const label = (c) => `${suiteName(c.attachedTo)} › ${String(c.name)}`;
|
|
128
|
+
const tested = (h) => (h ?? []).filter((s) => s === PASSED || s === FAILED);
|
|
129
|
+
const switches = (h) => h.slice(1).filter((s, i) => s !== h[i]).length;
|
|
130
|
+
const latest = (c) => tested(history.get(c._id)).at(-1);
|
|
131
|
+
const failing = cases.filter((c) => latest(c) === FAILED);
|
|
132
|
+
const flaky = cases.filter((c) => switches(tested(history.get(c._id))) >= 2);
|
|
133
|
+
const never = cases.filter((c) => tested(history.get(c._id)).length === 0);
|
|
134
|
+
const blocked = cases.filter((c) => (history.get(c._id) ?? []).at(-1) === BLOCKED);
|
|
135
|
+
const withLatest = cases.filter((c) => latest(c) != null);
|
|
136
|
+
const rate = withLatest.length > 0 ? Math.round(100 * withLatest.filter((c) => latest(c) === PASSED).length / withLatest.length) : undefined;
|
|
137
|
+
const line = (c) => `- ${label(c)} ${(history.get(c._id) ?? []).map((s) => SYMBOL[s] ?? '?').join('')} — \`${String(c._id)}\``;
|
|
138
|
+
const max = args.limit ?? 25;
|
|
139
|
+
const section = (title, list) => list.length === 0 ? [] : ['', `### ${title} (${list.length})`, ...list.slice(0, max).map(line), ...(list.length > max ? [`… ${list.length - max} more`] : [])];
|
|
140
|
+
const bySuite = suites.map((s) => {
|
|
141
|
+
const mine = cases.filter((c) => c.attachedTo === s._id);
|
|
142
|
+
if (mine.length === 0)
|
|
143
|
+
return undefined;
|
|
144
|
+
const p = mine.filter((c) => latest(c) === PASSED).length;
|
|
145
|
+
const f = mine.filter((c) => latest(c) === FAILED).length;
|
|
146
|
+
return `| ${String(s.name)} | ${mine.length} | ${p} | ${f} | ${mine.length - p - f} |`;
|
|
147
|
+
}).filter((x) => x != null);
|
|
148
|
+
return [
|
|
149
|
+
`## Test report: ${String(project.name)}`,
|
|
150
|
+
`${cases.length} case(s) · last ${runs.length} run(s)${runs.length > 0 ? ` (${String(runs[0].name)} → ${String(runs.at(-1).name)})` : ''} · pass rate of latest results: ${rate != null ? `${rate}%` : '—'}`,
|
|
151
|
+
'History oldest → newest: ✅ passed ❌ failed ⛔ blocked · untested',
|
|
152
|
+
...section('Failing now', failing),
|
|
153
|
+
...section('Flaky (flipped between pass and fail at least twice)', flaky),
|
|
154
|
+
...section('Blocked in the latest run', blocked),
|
|
155
|
+
...section('Never run in these runs', never),
|
|
156
|
+
...(bySuite.length > 0 ? ['', '### By suite (latest result)', '| Suite | Cases | Passed | Failed | Not run |', '|---|---|---|---|---|', ...bySuite] : [])
|
|
157
|
+
].join('\n');
|
|
158
|
+
});
|
|
159
|
+
exports.createIssueFromTestResult = (0, errors_1.wrapToolHandler)(async (args) => {
|
|
160
|
+
const client = await (0, connection_1.getConnection)(args.workspace);
|
|
161
|
+
const result = await (0, testing_1.findDoc)(client, testing_1.TM.Result, args.result, 'Test result');
|
|
162
|
+
const testCase = await client.findOne(testing_1.TM.Case, { _id: result.testCase });
|
|
163
|
+
const run = await client.findOne(testing_1.TM.Run, { _id: result.attachedTo });
|
|
164
|
+
const steps = testCase != null ? await (0, content_1.readMarkup)(args.workspace, testCase.description) : '';
|
|
165
|
+
const outcome = await (0, content_1.readMarkup)(args.workspace, result.description);
|
|
166
|
+
const description = [
|
|
167
|
+
`Test **${String(result.name)}** ${(0, testing_1.name)(testing_1.RESULT_STATUSES, result.status ?? UNTESTED).toLowerCase()} in run "${String(run?.name ?? '?')}".`,
|
|
168
|
+
steps.trim() !== '' ? `## Steps\n\n${steps}` : '',
|
|
169
|
+
outcome.trim() !== '' ? `## Result\n\n${outcome}` : '',
|
|
170
|
+
args.notes != null ? `## Notes\n\n${args.notes}` : ''
|
|
171
|
+
].filter((x) => x !== '').join('\n\n');
|
|
172
|
+
const created = (await (0, issues_1.createIssue)({ workspace: args.workspace, projectIdentifier: args.projectIdentifier, title: args.title ?? `Test failed: ${String(result.name)}`, description, priority: args.priority ?? 'High' })).content[0].text;
|
|
173
|
+
const identifier = /\*\*([A-Z0-9]+-\d+)\*\*/.exec(created)?.[1];
|
|
174
|
+
if (identifier == null)
|
|
175
|
+
throw new Error(`Issue created, but its identifier could not be read: ${created}`);
|
|
176
|
+
const extra = [];
|
|
177
|
+
if (args.componentLabel != null || args.milestoneLabel != null || args.assignee != null) {
|
|
178
|
+
await (0, issues_1.updateIssue)({ workspace: args.workspace, identifier, componentLabel: args.componentLabel, milestoneLabel: args.milestoneLabel, assignee: args.assignee });
|
|
179
|
+
extra.push(...[args.componentLabel != null ? `component ${args.componentLabel}` : '', args.milestoneLabel != null ? `milestone ${args.milestoneLabel}` : '', args.assignee != null ? `assignee ${args.assignee}` : ''].filter((x) => x !== ''));
|
|
180
|
+
}
|
|
181
|
+
const issue = await client.findOne('tracker:class:Issue', { identifier });
|
|
182
|
+
if (issue != null && testCase != null) {
|
|
183
|
+
await client.updateDoc('tracker:class:Issue', issue.space, issue._id, { relations: [...(issue.relations ?? []), { _id: testCase._id, _class: testing_1.TM.Case }] });
|
|
184
|
+
}
|
|
185
|
+
await client.addCollection('chunter:class:ChatMessage', result.space, result._id, testing_1.TM.Result, 'comments', { message: `Bug filed: ${identifier}` });
|
|
186
|
+
return `✅ **${identifier}** filed from test result "${String(result.name)}"${extra.length > 0 ? ` (${extra.join(', ')})` : ''}; related to the test case, and the result has a comment pointing to it.`;
|
|
187
|
+
});
|
|
188
|
+
exports.createTestCases = (0, errors_1.wrapToolHandler)(async (args) => {
|
|
189
|
+
const client = await (0, connection_1.getConnection)(args.workspace);
|
|
190
|
+
const project = await (0, testing_1.findProject)(client, args.project);
|
|
191
|
+
let suite;
|
|
192
|
+
try {
|
|
193
|
+
suite = await (0, testing_1.findSuite)(client, project, args.suite);
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
if (args.createSuite !== true)
|
|
197
|
+
throw e;
|
|
198
|
+
const parent = args.parentSuite != null ? await (0, testing_1.findSuite)(client, project, args.parentSuite) : undefined;
|
|
199
|
+
suite = { _id: await client.createDoc(testing_1.TM.Suite, project._id, { name: args.suite, description: '', parent: parent?._id ?? testing_1.TM.NoParent }), name: args.suite };
|
|
200
|
+
}
|
|
201
|
+
const existing = await client.findAll(testing_1.TM.Case, { space: project._id, attachedTo: suite._id });
|
|
202
|
+
const seen = new Set(existing.map((c) => String(c.name).toLowerCase()));
|
|
203
|
+
const made = [];
|
|
204
|
+
const skipped = [];
|
|
205
|
+
for (const c of args.cases) {
|
|
206
|
+
if (seen.has(c.name.toLowerCase())) {
|
|
207
|
+
skipped.push(c.name);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
seen.add(c.name.toLowerCase());
|
|
211
|
+
const assignee = c.assignee != null ? (await (0, people_1.findPerson)(client, c.assignee))._id : null;
|
|
212
|
+
await client.addCollection(testing_1.TM.Case, project._id, suite._id, testing_1.TM.Suite, 'testCases', {
|
|
213
|
+
name: c.name,
|
|
214
|
+
description: c.description != null && c.description !== '' ? await (0, content_1.writeMarkup)(args.workspace, `testcase-${(0, core_1.generateId)()}`, c.description) : null,
|
|
215
|
+
type: (0, testing_1.idx)(testing_1.CASE_TYPES, c.type ?? 'Functional'),
|
|
216
|
+
priority: (0, testing_1.idx)(testing_1.CASE_PRIORITIES, c.priority ?? 'Medium'),
|
|
217
|
+
status: 0,
|
|
218
|
+
assignee,
|
|
219
|
+
attachments: 0
|
|
220
|
+
});
|
|
221
|
+
made.push(c.name);
|
|
222
|
+
}
|
|
223
|
+
return `✅ ${made.length} case(s) created in "${String(suite.name)}"${skipped.length > 0 ? `; skipped ${skipped.length} that already exist: ${skipped.slice(0, 10).join(', ')}` : ''}.`;
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=test-automation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-automation.js","sourceRoot":"","sources":["../../src/tools/test-automation.ts"],"names":[],"mappings":"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"}
|