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.
- package/.env.example +11 -0
- package/CHANGELOG.md +22 -0
- package/README.md +126 -17
- package/dist/guides/costs.md +2 -1
- package/dist/guides/workflow.md +3 -1
- package/dist/index.js +105034 -46
- package/dist/setup.js +4 -0
- package/package.json +12 -11
- package/dist/connection.d.ts +0 -78
- package/dist/connection.js +0 -271
- package/dist/connection.js.map +0 -1
- package/dist/env.d.ts +0 -1
- package/dist/env.js +0 -17
- package/dist/env.js.map +0 -1
- package/dist/guard.d.ts +0 -39
- package/dist/guard.js +0 -165
- package/dist/guard.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js.map +0 -1
- package/dist/junit-cli.d.ts +0 -8
- package/dist/junit-cli.js +0 -106
- package/dist/junit-cli.js.map +0 -1
- package/dist/registry.d.ts +0 -18
- package/dist/registry.js +0 -318
- package/dist/registry.js.map +0 -1
- package/dist/resources.d.ts +0 -19
- package/dist/resources.js +0 -255
- package/dist/resources.js.map +0 -1
- package/dist/schemas.d.ts +0 -1559
- package/dist/schemas.js +0 -1086
- package/dist/schemas.js.map +0 -1
- package/dist/server.d.ts +0 -29
- package/dist/server.js +0 -215
- package/dist/server.js.map +0 -1
- package/dist/tools/activity.d.ts +0 -10
- package/dist/tools/activity.js +0 -62
- package/dist/tools/activity.js.map +0 -1
- package/dist/tools/agent.d.ts +0 -156
- package/dist/tools/agent.js +0 -523
- package/dist/tools/agent.js.map +0 -1
- package/dist/tools/attachments.d.ts +0 -31
- package/dist/tools/attachments.js +0 -61
- package/dist/tools/attachments.js.map +0 -1
- package/dist/tools/calendar.d.ts +0 -49
- package/dist/tools/calendar.js +0 -116
- package/dist/tools/calendar.js.map +0 -1
- package/dist/tools/cards.d.ts +0 -87
- package/dist/tools/cards.js +0 -246
- package/dist/tools/cards.js.map +0 -1
- package/dist/tools/channels.d.ts +0 -118
- package/dist/tools/channels.js +0 -211
- package/dist/tools/channels.js.map +0 -1
- package/dist/tools/comments.d.ts +0 -42
- package/dist/tools/comments.js +0 -77
- package/dist/tools/comments.js.map +0 -1
- package/dist/tools/components.d.ts +0 -45
- package/dist/tools/components.js +0 -107
- package/dist/tools/components.js.map +0 -1
- package/dist/tools/contacts.d.ts +0 -69
- package/dist/tools/contacts.js +0 -130
- package/dist/tools/contacts.js.map +0 -1
- package/dist/tools/crm.d.ts +0 -61
- package/dist/tools/crm.js +0 -117
- package/dist/tools/crm.js.map +0 -1
- package/dist/tools/documents.d.ts +0 -100
- package/dist/tools/documents.js +0 -294
- package/dist/tools/documents.js.map +0 -1
- package/dist/tools/drive.d.ts +0 -107
- package/dist/tools/drive.js +0 -277
- package/dist/tools/drive.js.map +0 -1
- package/dist/tools/fields.d.ts +0 -33
- package/dist/tools/fields.js +0 -124
- package/dist/tools/fields.js.map +0 -1
- package/dist/tools/generic.d.ts +0 -72
- package/dist/tools/generic.js +0 -242
- package/dist/tools/generic.js.map +0 -1
- package/dist/tools/github.d.ts +0 -21
- package/dist/tools/github.js +0 -80
- package/dist/tools/github.js.map +0 -1
- package/dist/tools/hr.d.ts +0 -97
- package/dist/tools/hr.js +0 -150
- package/dist/tools/hr.js.map +0 -1
- package/dist/tools/inbox.d.ts +0 -23
- package/dist/tools/inbox.js +0 -76
- package/dist/tools/inbox.js.map +0 -1
- package/dist/tools/inventory.d.ts +0 -61
- package/dist/tools/inventory.js +0 -103
- package/dist/tools/inventory.js.map +0 -1
- package/dist/tools/issues.d.ts +0 -112
- package/dist/tools/issues.js +0 -474
- package/dist/tools/issues.js.map +0 -1
- package/dist/tools/labels.d.ts +0 -87
- package/dist/tools/labels.js +0 -232
- package/dist/tools/labels.js.map +0 -1
- package/dist/tools/log-time.d.ts +0 -25
- package/dist/tools/log-time.js +0 -95
- package/dist/tools/log-time.js.map +0 -1
- package/dist/tools/meetings.d.ts +0 -30
- package/dist/tools/meetings.js +0 -78
- package/dist/tools/meetings.js.map +0 -1
- package/dist/tools/members.d.ts +0 -8
- package/dist/tools/members.js +0 -33
- package/dist/tools/members.js.map +0 -1
- package/dist/tools/message-templates.d.ts +0 -54
- package/dist/tools/message-templates.js +0 -88
- package/dist/tools/message-templates.js.map +0 -1
- package/dist/tools/milestones.d.ts +0 -56
- package/dist/tools/milestones.js +0 -172
- package/dist/tools/milestones.js.map +0 -1
- package/dist/tools/organizations.d.ts +0 -37
- package/dist/tools/organizations.js +0 -88
- package/dist/tools/organizations.js.map +0 -1
- package/dist/tools/overview.d.ts +0 -55
- package/dist/tools/overview.js +0 -395
- package/dist/tools/overview.js.map +0 -1
- package/dist/tools/planner.d.ts +0 -60
- package/dist/tools/planner.js +0 -145
- package/dist/tools/planner.js.map +0 -1
- package/dist/tools/process.d.ts +0 -50
- package/dist/tools/process.js +0 -137
- package/dist/tools/process.js.map +0 -1
- package/dist/tools/products.d.ts +0 -17
- package/dist/tools/products.js +0 -45
- package/dist/tools/products.js.map +0 -1
- package/dist/tools/projects.d.ts +0 -41
- package/dist/tools/projects.js +0 -93
- package/dist/tools/projects.js.map +0 -1
- package/dist/tools/qms.d.ts +0 -57
- package/dist/tools/qms.js +0 -171
- package/dist/tools/qms.js.map +0 -1
- package/dist/tools/recruiting.d.ts +0 -112
- package/dist/tools/recruiting.js +0 -203
- package/dist/tools/recruiting.js.map +0 -1
- package/dist/tools/relations.d.ts +0 -72
- package/dist/tools/relations.js +0 -192
- package/dist/tools/relations.js.map +0 -1
- package/dist/tools/search.d.ts +0 -23
- package/dist/tools/search.js +0 -60
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/sharing.d.ts +0 -62
- package/dist/tools/sharing.js +0 -149
- package/dist/tools/sharing.js.map +0 -1
- package/dist/tools/statuses.d.ts +0 -19
- package/dist/tools/statuses.js +0 -93
- package/dist/tools/statuses.js.map +0 -1
- package/dist/tools/surveys.d.ts +0 -22
- package/dist/tools/surveys.js +0 -53
- package/dist/tools/surveys.js.map +0 -1
- package/dist/tools/templates.d.ts +0 -95
- package/dist/tools/templates.js +0 -260
- package/dist/tools/templates.js.map +0 -1
- package/dist/tools/test-automation.d.ts +0 -81
- package/dist/tools/test-automation.js +0 -225
- package/dist/tools/test-automation.js.map +0 -1
- package/dist/tools/testing.d.ts +0 -234
- package/dist/tools/testing.js +0 -401
- package/dist/tools/testing.js.map +0 -1
- package/dist/tools/workspace-admin.d.ts +0 -55
- package/dist/tools/workspace-admin.js +0 -117
- package/dist/tools/workspace-admin.js.map +0 -1
- package/dist/tools/workspaces.d.ts +0 -6
- package/dist/tools/workspaces.js +0 -19
- package/dist/tools/workspaces.js.map +0 -1
- package/dist/utils/attributes.d.ts +0 -37
- package/dist/utils/attributes.js +0 -188
- package/dist/utils/attributes.js.map +0 -1
- package/dist/utils/classes.d.ts +0 -51
- package/dist/utils/classes.js +0 -73
- package/dist/utils/classes.js.map +0 -1
- package/dist/utils/content.d.ts +0 -11
- package/dist/utils/content.js +0 -86
- package/dist/utils/content.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -11
- package/dist/utils/errors.js +0 -24
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/files.d.ts +0 -5
- package/dist/utils/files.js +0 -50
- package/dist/utils/files.js.map +0 -1
- package/dist/utils/format.d.ts +0 -8
- package/dist/utils/format.js +0 -57
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/junit.d.ts +0 -13
- package/dist/utils/junit.js +0 -81
- package/dist/utils/junit.js.map +0 -1
- package/dist/utils/markdown.d.ts +0 -14
- package/dist/utils/markdown.js +0 -149
- package/dist/utils/markdown.js.map +0 -1
- package/dist/utils/meeting.d.ts +0 -13
- package/dist/utils/meeting.js +0 -118
- package/dist/utils/meeting.js.map +0 -1
- package/dist/utils/people.d.ts +0 -25
- package/dist/utils/people.js +0 -80
- package/dist/utils/people.js.map +0 -1
- package/dist/utils/redact.d.ts +0 -3
- package/dist/utils/redact.js +0 -26
- package/dist/utils/redact.js.map +0 -1
- package/dist/utils/resolve.d.ts +0 -17
- package/dist/utils/resolve.js +0 -54
- package/dist/utils/resolve.js.map +0 -1
- package/dist/utils/spec.d.ts +0 -10
- package/dist/utils/spec.js +0 -90
- package/dist/utils/spec.js.map +0 -1
- package/dist/utils/storage.d.ts +0 -7
- package/dist/utils/storage.js +0 -86
- package/dist/utils/storage.js.map +0 -1
- package/dist/utils/tasks.d.ts +0 -22
- package/dist/utils/tasks.js +0 -81
- package/dist/utils/tasks.js.map +0 -1
- package/dist/watch.d.ts +0 -62
- package/dist/watch.js +0 -405
- package/dist/watch.js.map +0 -1
- package/scripts/cleanup-issues.js +0 -141
- package/scripts/copy-guides.js +0 -18
- package/scripts/demo.js +0 -201
- package/scripts/import-csv.js +0 -250
- package/scripts/sample-tasks.csv +0 -11
- package/scripts/setup.js +0 -163
package/dist/tools/testing.js
DELETED
|
@@ -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
|