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
package/dist/connection.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ export interface ConnectionManagerOptions {
|
|
|
27
27
|
token?: string;
|
|
28
28
|
/** Legacy HULY_WORKSPACE: restricts this server to that single workspace. */
|
|
29
29
|
restrictTo?: string;
|
|
30
|
+
/** HULY_TRANSACTOR_URL: use this transactor instead of the one the account service names (e.g. an internal address). */
|
|
31
|
+
transactorUrl?: string;
|
|
30
32
|
createAccountClient?: (accountsUrl: string, token?: string) => AccountClient;
|
|
31
33
|
openConnection?: (endpoint: string, token: string, socialId: PersonId) => Promise<OpenConnection>;
|
|
32
34
|
}
|
|
@@ -55,6 +57,12 @@ export declare class WorkspaceConnectionManager {
|
|
|
55
57
|
private discover;
|
|
56
58
|
private connect;
|
|
57
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* The account service answers with the public transactor address (e.g. wss://huly.example.com/_transactor).
|
|
62
|
+
* Next to Huly — same Docker network — that detour goes out through the uplink and a tunnel and back in.
|
|
63
|
+
* HULY_TRANSACTOR_URL replaces it, e.g. ws://huly/_transactor or ws://transactor:3333.
|
|
64
|
+
*/
|
|
65
|
+
export declare function transactorEndpoint(endpoint: string, override: string | undefined): string;
|
|
58
66
|
export declare function getConnectionManager(): WorkspaceConnectionManager;
|
|
59
67
|
/** Replace the process-wide manager (tests). */
|
|
60
68
|
export declare function setConnectionManager(next: WorkspaceConnectionManager | null): void;
|
package/dist/connection.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WorkspaceConnectionManager = void 0;
|
|
4
|
+
exports.transactorEndpoint = transactorEndpoint;
|
|
4
5
|
exports.getConnectionManager = getConnectionManager;
|
|
5
6
|
exports.setConnectionManager = setConnectionManager;
|
|
6
7
|
exports.listWorkspaces = listWorkspaces;
|
|
@@ -206,6 +207,7 @@ class WorkspaceConnectionManager {
|
|
|
206
207
|
wsToken = wsInfo.token;
|
|
207
208
|
workspaceUuid = String(wsInfo.workspace ?? ws.uuid);
|
|
208
209
|
}
|
|
210
|
+
endpoint = transactorEndpoint(endpoint, this.opts.transactorUrl);
|
|
209
211
|
const { client, close } = await this.openConnection(endpoint, wsToken, session.socialId);
|
|
210
212
|
return {
|
|
211
213
|
workspace: ws,
|
|
@@ -218,6 +220,15 @@ class WorkspaceConnectionManager {
|
|
|
218
220
|
}
|
|
219
221
|
}
|
|
220
222
|
exports.WorkspaceConnectionManager = WorkspaceConnectionManager;
|
|
223
|
+
/**
|
|
224
|
+
* The account service answers with the public transactor address (e.g. wss://huly.example.com/_transactor).
|
|
225
|
+
* Next to Huly — same Docker network — that detour goes out through the uplink and a tunnel and back in.
|
|
226
|
+
* HULY_TRANSACTOR_URL replaces it, e.g. ws://huly/_transactor or ws://transactor:3333.
|
|
227
|
+
*/
|
|
228
|
+
function transactorEndpoint(endpoint, override) {
|
|
229
|
+
const o = override?.trim();
|
|
230
|
+
return o != null && o !== '' ? o.replace(/\/+$/, '') : endpoint;
|
|
231
|
+
}
|
|
221
232
|
// ── Process-wide manager (configured from env) ──────────────────────────────
|
|
222
233
|
let manager = null;
|
|
223
234
|
function getConnectionManager() {
|
|
@@ -227,7 +238,8 @@ function getConnectionManager() {
|
|
|
227
238
|
email: process.env.HULY_EMAIL,
|
|
228
239
|
password: process.env.HULY_PASSWORD,
|
|
229
240
|
token: process.env.HULY_TOKEN,
|
|
230
|
-
restrictTo: process.env.HULY_WORKSPACE
|
|
241
|
+
restrictTo: process.env.HULY_WORKSPACE,
|
|
242
|
+
transactorUrl: process.env.HULY_TRANSACTOR_URL
|
|
231
243
|
});
|
|
232
244
|
}
|
|
233
245
|
return manager;
|
package/dist/connection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|
package/dist/env.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function normalizeEnv(env?: NodeJS.ProcessEnv): void;
|
package/dist/env.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeEnv = normalizeEnv;
|
|
4
|
+
// Clients such as Claude Code plugins pass every configured variable, also the ones the user
|
|
5
|
+
// left empty (or as an unresolved "${…}" placeholder). Treat those as not set, so defaults apply.
|
|
6
|
+
function normalizeEnv(env = process.env) {
|
|
7
|
+
for (const [key, value] of Object.entries(env)) {
|
|
8
|
+
if (!key.startsWith('HULY_') || value == null)
|
|
9
|
+
continue;
|
|
10
|
+
const v = value.trim();
|
|
11
|
+
if (v === '' || /^\$\{[^}]*\}$/.test(v))
|
|
12
|
+
delete env[key];
|
|
13
|
+
else if (v !== value)
|
|
14
|
+
env[key] = v;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":";;;AAAA,6FAA6F;AAC7F,kGAAkG;AAClG,sBAA8B,GAAG,GAAsB,OAAO,CAAC,GAAG;IAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI;YAAE,SAAQ;QACvD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;QACtB,IAAI,CAAC,KAAK,EAAE,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAA;aACnD,IAAI,CAAC,KAAK,KAAK;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;AACH,CAAC"}
|
package/dist/guard.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ToolDef } from './registry';
|
|
2
|
+
/** A tool changes data when its workspace argument is mandatory (reads may omit it). */
|
|
3
|
+
export declare function isMutation(tool: ToolDef): boolean;
|
|
4
|
+
/** Project keys an argument object refers to: project fields plus every "PROJ-12"-style value. */
|
|
5
|
+
export declare function projectsIn(args: unknown, key?: string): Set<string>;
|
|
6
|
+
export declare function parseWriteProjects(value: string | undefined): Set<string> | undefined;
|
|
7
|
+
export declare function assertWriteAllowed(tool: ToolDef, args: unknown, allowed: Set<string> | undefined): void;
|
|
8
|
+
export declare function audit(path: string | undefined, tool: ToolDef, args: unknown, outcome: {
|
|
9
|
+
ok: boolean;
|
|
10
|
+
text: string;
|
|
11
|
+
}): void;
|
|
12
|
+
/** Deletes and bulk/structural changes that are hard to undo. */
|
|
13
|
+
export declare function isRisky(name: string): boolean;
|
|
14
|
+
export type ConfirmMode = 'auto' | 'off' | 'strict';
|
|
15
|
+
export declare function parseConfirmMode(value: string | undefined): ConfirmMode;
|
|
16
|
+
/** What the confirm callback can do with the connected client. */
|
|
17
|
+
export interface Asker {
|
|
18
|
+
/** True when the client can show a form (MCP elicitation). */
|
|
19
|
+
canAsk: () => boolean;
|
|
20
|
+
/** Shows the question; resolves true only on an explicit yes. */
|
|
21
|
+
ask: (message: string) => Promise<boolean>;
|
|
22
|
+
}
|
|
23
|
+
/** One readable line per argument, without the workspace and with long values cut. */
|
|
24
|
+
export declare function describeCall(tool: ToolDef, args: Record<string, unknown>): string;
|
|
25
|
+
/** MCP elicitation on top of an McpServer. */
|
|
26
|
+
export declare function elicitationAsker(server: any): Asker;
|
|
27
|
+
/** Wraps a handler with the write scope check, the confirmation for risky tools and the audit log. */
|
|
28
|
+
export declare function guard(tool: ToolDef, env?: NodeJS.ProcessEnv, asker?: Asker): ToolDef['handler'];
|
package/dist/guard.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isMutation = isMutation;
|
|
4
|
+
exports.projectsIn = projectsIn;
|
|
5
|
+
exports.parseWriteProjects = parseWriteProjects;
|
|
6
|
+
exports.assertWriteAllowed = assertWriteAllowed;
|
|
7
|
+
exports.audit = audit;
|
|
8
|
+
exports.isRisky = isRisky;
|
|
9
|
+
exports.parseConfirmMode = parseConfirmMode;
|
|
10
|
+
exports.describeCall = describeCall;
|
|
11
|
+
exports.elicitationAsker = elicitationAsker;
|
|
12
|
+
exports.guard = guard;
|
|
13
|
+
// Cross-cutting checks around every tool call:
|
|
14
|
+
// - HULY_WRITE_PROJECTS: changes are only allowed in the listed projects
|
|
15
|
+
// - HULY_AUDIT_LOG: every change is appended as one JSON line to this file
|
|
16
|
+
// - HULY_CONFIRM: destructive tools ask the user first (MCP elicitation) when the client can ask
|
|
17
|
+
const node_fs_1 = require("node:fs");
|
|
18
|
+
const TASK_ID = /^([A-Z][A-Z0-9]*)-\d+$/;
|
|
19
|
+
const PROJECT_KEYS = new Set(['projectIdentifier', 'targetProjectIdentifier', 'projectIdentifiers']);
|
|
20
|
+
/** A tool changes data when its workspace argument is mandatory (reads may omit it). */
|
|
21
|
+
function isMutation(tool) {
|
|
22
|
+
const ws = tool.schema.shape.workspace;
|
|
23
|
+
return ws != null && !ws.isOptional();
|
|
24
|
+
}
|
|
25
|
+
/** Project keys an argument object refers to: project fields plus every "PROJ-12"-style value. */
|
|
26
|
+
function projectsIn(args, key = '') {
|
|
27
|
+
const out = new Set();
|
|
28
|
+
const visit = (value, k) => {
|
|
29
|
+
if (typeof value === 'string') {
|
|
30
|
+
if (PROJECT_KEYS.has(k))
|
|
31
|
+
out.add(value.toUpperCase());
|
|
32
|
+
const m = TASK_ID.exec(value);
|
|
33
|
+
if (m != null)
|
|
34
|
+
out.add(m[1]);
|
|
35
|
+
}
|
|
36
|
+
else if (Array.isArray(value)) {
|
|
37
|
+
for (const v of value)
|
|
38
|
+
visit(v, k);
|
|
39
|
+
}
|
|
40
|
+
else if (value != null && typeof value === 'object') {
|
|
41
|
+
for (const [ck, cv] of Object.entries(value))
|
|
42
|
+
visit(cv, ck);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
visit(args, key);
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
function parseWriteProjects(value) {
|
|
49
|
+
const list = (value ?? '').split(',').map((p) => p.trim().toUpperCase()).filter((p) => p !== '');
|
|
50
|
+
return list.length > 0 ? new Set(list) : undefined;
|
|
51
|
+
}
|
|
52
|
+
function assertWriteAllowed(tool, args, allowed) {
|
|
53
|
+
if (allowed == null || !isMutation(tool))
|
|
54
|
+
return;
|
|
55
|
+
const denied = [...projectsIn(args)].filter((p) => !allowed.has(p));
|
|
56
|
+
if (denied.length > 0) {
|
|
57
|
+
throw new Error(`Huly MCP: ${tool.name} touches project(s) ${denied.join(', ')}, but HULY_WRITE_PROJECTS only allows ${[...allowed].join(', ')}.`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function shorten(value, depth = 0) {
|
|
61
|
+
if (typeof value === 'string')
|
|
62
|
+
return value.length > 200 ? `${value.slice(0, 200)}… (${value.length} chars)` : value;
|
|
63
|
+
if (Array.isArray(value))
|
|
64
|
+
return depth > 3 ? `[${value.length} items]` : value.map((v) => shorten(v, depth + 1));
|
|
65
|
+
if (value != null && typeof value === 'object') {
|
|
66
|
+
return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, /base64/i.test(k) ? `[${String(v).length} chars]` : shorten(v, depth + 1)]));
|
|
67
|
+
}
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
function audit(path, tool, args, outcome) {
|
|
71
|
+
if (path == null || path === '' || !isMutation(tool))
|
|
72
|
+
return;
|
|
73
|
+
const entry = { ts: new Date().toISOString(), tool: tool.name, args: shorten(args), ok: outcome.ok, result: outcome.text.split('\n')[0].slice(0, 300) };
|
|
74
|
+
try {
|
|
75
|
+
(0, node_fs_1.appendFileSync)(path, JSON.stringify(entry) + '\n');
|
|
76
|
+
}
|
|
77
|
+
catch { /* auditing must never break a tool call */ }
|
|
78
|
+
}
|
|
79
|
+
// ── Confirmation for destructive tools ───────────────────────────────────────
|
|
80
|
+
const RISKY = new Set(['bulk_update_issues', 'move_issue', 'generic_update', 'generic_delete', 'revoke_public_link', 'restore_file_version', 'send_invite', 'set_member_role', 'cancel_execution']);
|
|
81
|
+
/** Deletes and bulk/structural changes that are hard to undo. */
|
|
82
|
+
function isRisky(name) {
|
|
83
|
+
return name.startsWith('delete_') || RISKY.has(name);
|
|
84
|
+
}
|
|
85
|
+
function parseConfirmMode(value) {
|
|
86
|
+
const v = (value ?? 'auto').trim().toLowerCase();
|
|
87
|
+
if (v === 'auto' || v === 'off' || v === 'strict')
|
|
88
|
+
return v;
|
|
89
|
+
throw new Error(`HULY_CONFIRM must be auto, off or strict (got '${value ?? ''}').`);
|
|
90
|
+
}
|
|
91
|
+
/** One readable line per argument, without the workspace and with long values cut. */
|
|
92
|
+
function describeCall(tool, args) {
|
|
93
|
+
const parts = Object.entries(args ?? {})
|
|
94
|
+
.filter(([k, v]) => k !== 'workspace' && v != null && k !== 'confirm')
|
|
95
|
+
.map(([k, v]) => `${k}: ${JSON.stringify(shorten(v)).slice(0, 160)}`);
|
|
96
|
+
const ws = typeof args?.workspace === 'string' ? ` in workspace ${args.workspace}` : '';
|
|
97
|
+
return `Huly: ${tool.name.replace(/_/g, ' ')}${ws}?\n${parts.join('\n')}`;
|
|
98
|
+
}
|
|
99
|
+
/** MCP elicitation on top of an McpServer. */
|
|
100
|
+
function elicitationAsker(server) {
|
|
101
|
+
return {
|
|
102
|
+
canAsk: () => server.server.getClientCapabilities()?.elicitation?.form != null,
|
|
103
|
+
ask: async (message) => {
|
|
104
|
+
const res = await server.server.elicitInput({
|
|
105
|
+
mode: 'form',
|
|
106
|
+
message,
|
|
107
|
+
requestedSchema: { type: 'object', properties: { confirm: { type: 'boolean', title: 'Yes, do it', default: false } }, required: ['confirm'] }
|
|
108
|
+
});
|
|
109
|
+
return res.action === 'accept' && res.content?.confirm === true;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/** Wraps a handler with the write scope check, the confirmation for risky tools and the audit log. */
|
|
114
|
+
function guard(tool, env = process.env, asker) {
|
|
115
|
+
const allowed = parseWriteProjects(env.HULY_WRITE_PROJECTS);
|
|
116
|
+
const auditPath = env.HULY_AUDIT_LOG;
|
|
117
|
+
const confirm = parseConfirmMode(env.HULY_CONFIRM);
|
|
118
|
+
return async (args) => {
|
|
119
|
+
assertWriteAllowed(tool, args, allowed);
|
|
120
|
+
if (confirm !== 'off' && isRisky(tool.name) && args?.dryRun !== true) {
|
|
121
|
+
const canAsk = asker?.canAsk() === true;
|
|
122
|
+
if (!canAsk && confirm === 'strict') {
|
|
123
|
+
audit(auditPath, tool, args, { ok: false, text: 'refused: HULY_CONFIRM=strict and the client cannot ask' });
|
|
124
|
+
throw new Error(`Huly MCP: ${tool.name} needs a human confirmation (HULY_CONFIRM=strict), but this client cannot ask. Leave it to a person.`);
|
|
125
|
+
}
|
|
126
|
+
if (canAsk) {
|
|
127
|
+
let yes = false;
|
|
128
|
+
try {
|
|
129
|
+
yes = await asker.ask(describeCall(tool, args));
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
audit(auditPath, tool, args, { ok: false, text: `confirmation failed: ${e.message}` });
|
|
133
|
+
throw new Error(`Huly MCP: could not ask for confirmation of ${tool.name} (${e.message}). Nothing was changed.`);
|
|
134
|
+
}
|
|
135
|
+
if (!yes) {
|
|
136
|
+
audit(auditPath, tool, args, { ok: false, text: 'declined by the user' });
|
|
137
|
+
return { content: [{ type: 'text', text: `Cancelled: the user declined ${tool.name}. Nothing was changed — do not retry unless they ask.` }] };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
const result = await tool.handler(args);
|
|
143
|
+
audit(auditPath, tool, args, { ok: true, text: result.content[0]?.text ?? '' });
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
audit(auditPath, tool, args, { ok: false, text: e.message });
|
|
148
|
+
throw e;
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Huly calls by cost
|
|
2
|
+
|
|
3
|
+
Every Huly call costs a round trip and its output stays in context. Aim for **one call per question** and **one call per change**. Sizes below are measured on a real project (≈50 issues); 1k chars ≈ 300 tokens.
|
|
4
|
+
|
|
5
|
+
## Reading: question → call
|
|
6
|
+
|
|
7
|
+
| Question | Call | Size | Instead of |
|
|
8
|
+
|---|---|--:|---|
|
|
9
|
+
| What's on today for me? | `my_day` | ~1.2k | calendar + to-dos + my issues + inbox |
|
|
10
|
+
| Standup | `standup` | small | `changes_since` + `list_issues` per project |
|
|
11
|
+
| How is project X doing? | `project_report` | ~2.7k | `list_issues status=all` (~4k for 50) + milestones + PRs |
|
|
12
|
+
| Everything about PROJ-12 before working on it | `get_issue_context` | ~1.3k | `get_issue` + `list_sub_issues` + `list_comments` + relations (4+ calls) |
|
|
13
|
+
| Status/assignee of PROJ-12 | `get_issue` | ~0.4k | `get_issue_context` |
|
|
14
|
+
| What changed? | `changes_since` with `projectIdentifiers` and a short `since` | — | whole workspace for 7d: ~8k |
|
|
15
|
+
| What needs my attention? | `triage_inbox` with a small `limit` | ~4k at 10 | `list_notifications` + `get_issue` per item |
|
|
16
|
+
| What's in release v1.2? | `release_notes` | ~2k | `list_issues milestoneLabel=…` + reading every issue |
|
|
17
|
+
| Find issues about X | `search_issues` | ~2k | `list_issues status=all` and scanning |
|
|
18
|
+
| Find anything (docs, chat, issues) | `search` | ~2.5k | several list calls |
|
|
19
|
+
|
|
20
|
+
**Narrow lists with filters, not by reading them:** `list_issues` takes `status` (`open` default, `all`, or a name), `assignee` (`null` = unassigned), `milestoneLabel`, `componentLabel`, `labelName`, `parentIdentifier` (`null` = top level) and `limit`.
|
|
21
|
+
|
|
22
|
+
**Avoid** `query_documents` / generic tools when a specific tool exists: one issue there is ~1.8k raw fields vs ~0.4k from `get_issue`. Use them only for classes without a tool.
|
|
23
|
+
|
|
24
|
+
## Writing: one call per change
|
|
25
|
+
|
|
26
|
+
- **New issue with everything:** `create_issue` takes `statusName`, `priority`, `assignee`, `componentLabel`, `milestoneLabel`, `dueDate` — no follow-up `update_issue`.
|
|
27
|
+
- **Many issues:** `create_issue_tree` (epic + children + blockers), dry run first.
|
|
28
|
+
- **From a document:** `issues_from_document` (spec → epic + sub-issues) or `issues_from_meeting` (action items with `@assignee` and dates). Do not read the document and retype the tasks.
|
|
29
|
+
- **Same change on many issues:** `bulk_update_issues` instead of N × `update_issue`.
|
|
30
|
+
- **Picking up / handing back work:** `start_work` (status + assign + context) and `finish_work` (comment + PR link + status) instead of 3–4 separate calls.
|
|
31
|
+
|
|
32
|
+
## Don't spend calls on checks the tools already do
|
|
33
|
+
|
|
34
|
+
- Names (status, component, milestone, person) are validated **before anything is written**; a wrong name returns an error that says what is wrong. Try with the name first — don't list statuses or components "just to be sure".
|
|
35
|
+
- Unknown or misspelled parameters are rejected with the list of valid ones and nothing is done; common aliases (`status`, `project`, `issueId`, `component`, `milestone`) are mapped automatically.
|
|
36
|
+
- Write tools return what changed (`changed: status, assignee`). Don't re-read the issue to confirm.
|
|
37
|
+
- Dry runs (`create_issue_tree`, `issues_from_*`, generic writes) show the full plan — show it to the user, then run once with `dryRun: false`.
|
|
38
|
+
|
|
39
|
+
## Round trips
|
|
40
|
+
|
|
41
|
+
- Independent reads (e.g. `get_issue_context` for two issues) go in **one turn in parallel**.
|
|
42
|
+
- Pass `workspace` explicitly when there are several; a pinned server (`HULY_WORKSPACE`) needs none.
|
|
43
|
+
- Issue ids (`PROJ-12`) and names work everywhere — don't look up internal `_id`s first.
|
|
44
|
+
|
|
45
|
+
## Setup that saves tokens before the first call
|
|
46
|
+
|
|
47
|
+
- `HULY_WORKSPACE` pins one workspace: the `workspace` argument disappears from every tool (~10% smaller tool list).
|
|
48
|
+
- `HULY_TOOLSETS` with only what you use (default set ≈ 36k chars; `all` ≈ 82k). With `HULY_DYNAMIC_TOOLSETS=1` more toolsets load on demand via `enable_toolsets`.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# All of Huly for a software project
|
|
2
|
+
|
|
3
|
+
How to put a project **completely** into Huly — not just issues. For each feature: what it is for in a repo, the tools, and when to propose it. Propose, then write; check what exists first (`list_*`); never create projects yourself.
|
|
4
|
+
|
|
5
|
+
## Toolsets: load what the project uses
|
|
6
|
+
|
|
7
|
+
Many features below are **not in the default toolset**. A tool that is missing is in a disabled toolset:
|
|
8
|
+
|
|
9
|
+
- **On-demand server** (`HULY_DYNAMIC_TOOLSETS=1`): call `enable_toolsets` with the names, e.g. `["testing", "templates"]`.
|
|
10
|
+
- **Otherwise**: tell the user which toolsets to add to `HULY_TOOLSETS` (Claude Code plugin: `/plugin` → huly → configure → Toolsets), e.g. `agent,tracker,documents,chat,inbox,planner,testing,templates,tracker-admin`. Takes effect after reconnecting the server (`/mcp`).
|
|
11
|
+
|
|
12
|
+
Default: `agent, tracker, documents, chat, contacts, inbox, activity, planner, generic`. Extra: `tracker-admin` (label categories, statuses, project settings), `templates`, `testing`, `github`, `drive`, `calendar`, `collaboration` (doc comments, sharing), `fields` (custom fields), `cards`, `products`.
|
|
13
|
+
|
|
14
|
+
## Map: what goes where
|
|
15
|
+
|
|
16
|
+
| In the repo / team | In Huly | Tools (toolset) | Propose when |
|
|
17
|
+
|---|---|---|---|
|
|
18
|
+
| Modules, packages, targets | **Components** — description names the paths | `create_component`, `update_component` (tracker) | onboarding; a new top-level folder appears |
|
|
19
|
+
| Releases, tags, deadlines | **Milestones** with target date and status | `create_milestone`, `update_milestone`, `release_notes` (tracker, agent) | onboarding; a tag is pushed → set it Completed, create the next |
|
|
20
|
+
| Phases, features, big refactors | **Epics** = issue + sub-issues, order via blocked-by | `create_issue_tree`, `set_parent`, `add_blocked_by` (agent, tracker) | a plan has more than ~3 steps |
|
|
21
|
+
| Kind of work (bug, feature, tech debt, docs) | **Labels**, grouped in label **categories** | `create_label`, `add_label`, `create_label_category`, `set_label_category` (tracker, tracker-admin) | onboarding, when the team distinguishes work types; filter with `list_issues labelName` |
|
|
22
|
+
| Workflow | **Status set**, per project type | `list_issue_statuses` (tracker), `create_issue_status` (tracker-admin) | onboarding |
|
|
23
|
+
| Recurring work: release checklist, bug report, onboarding a dev | **Issue templates** with sub-issues | `create_issue_template`, `create_issue_from_template` (templates) | the same checklist is typed a second time |
|
|
24
|
+
| Tests (unit, e2e, manual QA) | **Test management**: test project → suites (mirror test folders) → cases → plans → runs | `create_test_project`, `create_test_suite`, `create_test_cases`, `create_test_plan`, `create_test_run`, `set_test_result` (testing) | the repo has tests or a QA checklist |
|
|
25
|
+
| CI test results | **Test runs from JUnit XML**; flaky/failing report; bugs from failures | `import_test_results`, CLI `npx huly-mcp-selfhost junit <xml> --project <name>` in CI, `get_test_report`, `create_issue_from_test_result` (testing) | CI writes JUnit XML (Jest/Vitest reporter, `pytest --junitxml`, Gradle, Maven, go-junit-report) |
|
|
26
|
+
| README depth: architecture, ADRs, runbooks, specs | **Documents** in a project teamspace, nested; linked to issues | `create_teamspace`, `create_document` (`parentId` for nesting), `update_document`, `link_document` (documents) | onboarding: one teamspace per project with "Architecture", "Decisions", "Runbooks"; a spec → `issues_from_document` |
|
|
27
|
+
| Design reviews, comments on docs | **Document comments**, collaborators, public links | `add_document_comment`, `add_collaborator`, `create_public_link` (collaboration) | a document needs review or must be shared outside |
|
|
28
|
+
| Meeting notes | Document → issues with assignee and date | `issues_from_meeting` (agent) | notes have action items |
|
|
29
|
+
| Team chat about the project | **Channel** per project; threads per topic | `create_channel`, `send_message`, `reply_to_message` (chat) | onboarding, if the team chats in Huly |
|
|
30
|
+
| Pull requests | **GitHub integration** (sync is set up by the user in Huly) | `list_pull_requests`, `get_pull_request` (github) | project is GitHub-synced; review status in reports |
|
|
31
|
+
| Effort | **Time reports** per issue | `log_time`, `list_time_reports` (tracker) | the team tracks time (ask once) |
|
|
32
|
+
| Personal planning | **To-dos and time blocks** in the planner | `create_todo` (with `issue`), `schedule_todo` (planner) | the user plans their day in Huly |
|
|
33
|
+
| Release dates, demos, freezes | **Calendar events** | `create_event` (calendar) | a milestone has a fixed event |
|
|
34
|
+
| Binaries, designs, exports, recordings | **Drive** folders and versioned files | `create_drive`, `create_folder`, `upload_file` (drive) | assets live outside git |
|
|
35
|
+
| Extra issue data (customer, risk, platform) | **Custom fields** on issues or a project type | `create_custom_field`, `set_custom_fields` (fields) | the team keeps such data in titles or labels today |
|
|
36
|
+
| Records that are not tasks (ADR register, customers, devices) | **Cards** with card types | `list_card_types`, `create_card` (cards) | a list of things, not of work |
|
|
37
|
+
| Shipped products and versions | **Products** (read) | `list_products`, `get_product` (products) | only to read existing product data |
|
|
38
|
+
| Anything without a tool | Any Huly class | `list_classes`, `describe_class`, `query_documents` (generic); writes: `generic_*` with dry run (generic-write) | last resort — specific tools are cheaper |
|
|
39
|
+
|
|
40
|
+
## Order for a full setup
|
|
41
|
+
|
|
42
|
+
1. Status set → components → labels (+ categories) → milestones.
|
|
43
|
+
2. Teamspace + documents (architecture first) → link them to epics.
|
|
44
|
+
3. Existing work: epics/issues, assign components and milestones.
|
|
45
|
+
4. Templates for checklists that repeat (release, bug report).
|
|
46
|
+
5. Test project mirroring the test folders; CI JUnit import (give the user the CI step, don't edit CI without OK).
|
|
47
|
+
6. Channel, drive, custom fields, cards — only if the team works that way.
|
|
48
|
+
|
|
49
|
+
Report at the end: what exists now, what was skipped, which toolsets the user should keep enabled.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Bringing a project into Huly
|
|
2
|
+
|
|
3
|
+
How to set up or import a repository's project in Huly. `/huly:setup` asks the user which of these steps to do; never do more than was chosen.
|
|
4
|
+
|
|
5
|
+
## Ground rules
|
|
6
|
+
|
|
7
|
+
- **Projects are created by the user**, in Huly (the GitHub link needs OAuth there). You suggest the key: short, from the repo or app name (`SERV` for a server, `PLAY` for a player app).
|
|
8
|
+
- **Propose, then write.** Show what you will create (names, descriptions, dates) and write after the user agrees.
|
|
9
|
+
- **Check before creating:** `list_components`, `list_milestones`, `search_issues` — reuse what exists.
|
|
10
|
+
- Synced projects (GitHub ↔ Huly) show every change on both sides. An issue created in Huly also appears on GitHub; don't create it twice.
|
|
11
|
+
|
|
12
|
+
## Status set
|
|
13
|
+
|
|
14
|
+
Align to: Backlog, Todo, In Progress, Done, Canceled, Review in progress, Merged (`list_issue_statuses`, then `create_issue_status` for what is missing). Don't delete or rename existing statuses without asking.
|
|
15
|
+
|
|
16
|
+
## Components = areas of the code
|
|
17
|
+
|
|
18
|
+
- One per module/package/target, plus usually one for build & release (CI, signing, store/distribution) and `Product` for decisions without a code location.
|
|
19
|
+
- The description names the paths: `Sources/Player/, Tests/PlayerTests/`.
|
|
20
|
+
- Find them from the repo layout (`ls`, package manifests, workspace files), not from guesses.
|
|
21
|
+
|
|
22
|
+
## Milestones = releases or real delivery targets
|
|
23
|
+
|
|
24
|
+
- E.g. `v1.0 MVP`, `v0.1 TestFlight internal`, version ranges — **not** phases like `M0`/`M1`.
|
|
25
|
+
- Existing tags/releases (`git tag`) show the naming. Give each a target date; if no real date is known, propose one and **tell the user it is a proposal**.
|
|
26
|
+
- Phases and larger work packages are **epics** (issue + sub-issues via `create_issue_tree` or `set_parent`), not milestones.
|
|
27
|
+
|
|
28
|
+
## Existing issues
|
|
29
|
+
|
|
30
|
+
- After components and milestones exist, assign open issues to them (`bulk_update_issues` per component/milestone, after showing the mapping).
|
|
31
|
+
- Open GitHub issues of a freshly linked repo: **don't touch or import them**. Report how many there are and ask how to handle them.
|
|
32
|
+
|
|
33
|
+
## TODO/FIXME scan
|
|
34
|
+
|
|
35
|
+
- `grep -rn -E "TODO|FIXME"` over the source (skip vendored/generated code).
|
|
36
|
+
- Present a **proposal list** (file:line, text, suggested title, component). Create issues only for the items the user picks — in GitHub or Huly according to the repo's "where new issues go" rule. Duplicate check first.
|
|
37
|
+
|
|
38
|
+
## Architecture/status document
|
|
39
|
+
|
|
40
|
+
One Huly document as the entry point (`create_document` + `update_document` with Markdown), in the project's teamspace (ask which one, or suggest creating one named after the project):
|
|
41
|
+
|
|
42
|
+
- What it is (2–3 sentences)
|
|
43
|
+
- Stack and structure (modules ↔ components)
|
|
44
|
+
- How to build, test, release
|
|
45
|
+
- Known issues / open construction sites
|
|
46
|
+
- Links: repo, CI, deployments
|
|
47
|
+
|
|
48
|
+
Keep it factual and short; it is read by people and agents alike.
|
|
49
|
+
|
|
50
|
+
## Beyond the basics
|
|
51
|
+
|
|
52
|
+
Labels, issue templates, test management (incl. CI JUnit import), document structure, channel, drive, custom fields, cards: see [features.md](features.md) — what each is for, the tools, and which toolsets must be enabled.
|
|
53
|
+
|
|
54
|
+
## Report
|
|
55
|
+
|
|
56
|
+
End with: what was created (ids/names), what was skipped and why, which proposals (dates, keys) the user should confirm, and what they still have to do in Huly (e.g. create the project, link GitHub).
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Working with Huly
|
|
2
|
+
|
|
3
|
+
Keep Huly current as you work, in the same turn as the action. Every call costs a round trip and its output stays in context: **one call per question, one call per change.**
|
|
4
|
+
|
|
5
|
+
## 0. This repo's rules come first
|
|
6
|
+
|
|
7
|
+
- `CLAUDE.md`, `CLAUDE.local.md` or `AGENTS.md` may have a `## Huly` section (workspace, project, where new issues go, initiative, how token-saving). **It overrides everything below.** "Not used in this repository" = no Huly calls unless asked.
|
|
8
|
+
- No section and the user works with Huly here: offer `/huly:setup` once.
|
|
9
|
+
- Setting up or importing a project: [onboarding.md](onboarding.md). Using all of Huly (labels, templates, test management, documents, drive, custom fields, …) and which toolsets that needs: [features.md](features.md).
|
|
10
|
+
|
|
11
|
+
## 1. Know where you are — one call each
|
|
12
|
+
|
|
13
|
+
| Question | Call |
|
|
14
|
+
|---|---|
|
|
15
|
+
| Which project is this repo? | `find_project_for_repo` with `git remote get-url origin` (never guess a workspace) |
|
|
16
|
+
| My work today / since yesterday | `my_day` / `standup` |
|
|
17
|
+
| What needs my attention? | `triage_inbox` (small `limit`) |
|
|
18
|
+
| How is the project doing? | `project_report` |
|
|
19
|
+
| Everything about PROJ-12 | `get_issue_context` (just status/assignee: `get_issue`) |
|
|
20
|
+
| Find something | `search_issues`, `search` — not `list_issues status=all` |
|
|
21
|
+
|
|
22
|
+
Narrow lists with filters (`status`, `assignee`, `milestoneLabel`, `componentLabel`, `parentIdentifier`, `limit`). More questions with measured sizes: [costs.md](costs.md).
|
|
23
|
+
|
|
24
|
+
## 2. Pick up and hand back
|
|
25
|
+
|
|
26
|
+
- Branch names like `proj-12-short-title` carry the issue id; the session hook reports it.
|
|
27
|
+
- `start_work` = In Progress + assign + full context. Blocked by open issues → say so first. Parallel agents: `claimAs` / `claim_issue`; never `force` without the user.
|
|
28
|
+
- `finish_work` = comment + PR link + status. Summary must say what is **not** verified. The auto-created PR issue goes under the feature issue it implements.
|
|
29
|
+
|
|
30
|
+
| Moment | Status |
|
|
31
|
+
|---|---|
|
|
32
|
+
| Work starts | In Progress (`start_work`) |
|
|
33
|
+
| PR open | Review in progress (`finish_work`) |
|
|
34
|
+
| PR merged | Done / Merged — usually via GitHub sync |
|
|
35
|
+
|
|
36
|
+
## 3. Create — after a duplicate check, in one call
|
|
37
|
+
|
|
38
|
+
- `search_issues` first; comment on an existing issue instead of creating a near-duplicate.
|
|
39
|
+
- `create_issue` takes `componentLabel`, `milestoneLabel`, `assignee`, `statusName`, `priority`, `dueDate` — no follow-up `update_issue`. Every issue gets a component, and a milestone if it belongs to a release. Nothing fits → say so; don't create components/milestones silently.
|
|
40
|
+
- Plans → `create_issue_tree` (epic + sub-issues + `blockedBy`), dry run first, then once with `dryRun: false`.
|
|
41
|
+
- Spec or meeting notes in a Huly document → `issues_from_document` / `issues_from_meeting`; don't retype the tasks.
|
|
42
|
+
- Same change on many issues → `bulk_update_issues`.
|
|
43
|
+
- Bugs/TODOs you notice while working: follow the repo's initiative rule; without one, create the issue (after the duplicate check) and mention it in your reply.
|
|
44
|
+
- Milestones are releases, not phases; phases are epics. Never create Huly projects — the user does that.
|
|
45
|
+
|
|
46
|
+
## 4. Don't spend calls on checks the tools do
|
|
47
|
+
|
|
48
|
+
- Names (status, component, milestone, person) are validated before anything is written; a wrong name returns a clear error. Don't list "just to be sure".
|
|
49
|
+
- Unknown parameters are rejected with the valid list, nothing is done. Write tools report what changed — don't re-read to confirm.
|
|
50
|
+
- Independent reads go in one turn, in parallel. Issue ids and names work everywhere; no `_id` lookups.
|
|
51
|
+
|
|
52
|
+
## 5. Be careful with
|
|
53
|
+
|
|
54
|
+
- Bulk changes, `move_issue`, deletes: show what will change first.
|
|
55
|
+
- GitHub-synced projects: every change appears on GitHub too; don't cross-post.
|
|
56
|
+
- `HULY_WRITE_PROJECTS` refusals: tell the user, don't work around them.
|
|
57
|
+
- A tool you need is missing: it is in a disabled toolset — `enable_toolsets` if available, otherwise tell the user which toolset to enable ([features.md](features.md)).
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
5
5
|
const server_1 = require("./server");
|
|
6
6
|
const connection_1 = require("./connection");
|
|
7
|
+
const env_1 = require("./env");
|
|
8
|
+
const watch_1 = require("./watch");
|
|
9
|
+
const junit_cli_1 = require("./junit-cli");
|
|
10
|
+
const redact_1 = require("./utils/redact");
|
|
7
11
|
async function main() {
|
|
12
|
+
if (process.argv[2] === 'watch') {
|
|
13
|
+
await (0, watch_1.runWatch)(process.argv.slice(3));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (process.argv[2] === 'junit') {
|
|
17
|
+
await (0, junit_cli_1.runJUnit)(process.argv.slice(3));
|
|
18
|
+
process.exit();
|
|
19
|
+
}
|
|
20
|
+
(0, env_1.normalizeEnv)();
|
|
21
|
+
// stdout is the JSON-RPC channel. Huly's client logs to it ("Client: onConnect 1"),
|
|
22
|
+
// which breaks strict MCP clients and makes mcp-proxy log parse errors. Send it to stderr,
|
|
23
|
+
// with session tokens masked (Huly logs its websocket URL including the token).
|
|
24
|
+
(0, redact_1.routeConsoleToStderr)();
|
|
8
25
|
const server = (0, server_1.createServer)();
|
|
9
26
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
10
27
|
process.on('SIGINT', async () => {
|
|
@@ -19,7 +36,7 @@ async function main() {
|
|
|
19
36
|
// Process stays alive — connection maintained until shutdown
|
|
20
37
|
}
|
|
21
38
|
main().catch((err) => {
|
|
22
|
-
console.error('Fatal error starting huly-mcp:', err);
|
|
39
|
+
console.error('Fatal error starting huly-mcp:', err instanceof Error ? err.message : err);
|
|
23
40
|
process.exit(1);
|
|
24
41
|
});
|
|
25
42
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,wEAAgF;AAChF,qCAAuC;AACvC,6CAA8C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,wEAAgF;AAChF,qCAAuC;AACvC,6CAA8C;AAC9C,+BAAoC;AACpC,mCAAkC;AAClC,2CAAsC;AACtC,2CAAqD;AAErD,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,IAAA,gBAAQ,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,IAAA,oBAAQ,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QACrC,OAAO,CAAC,IAAI,EAAE,CAAA;IAChB,CAAC;IACD,IAAA,kBAAY,GAAE,CAAA;IACd,oFAAoF;IACpF,2FAA2F;IAC3F,gFAAgF;IAChF,IAAA,6BAAoB,GAAE,CAAA;IACtB,MAAM,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAA;IAC7B,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAA;IAE5C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,IAAA,4BAAe,GAAE,CAAA;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,IAAA,4BAAe,GAAE,CAAA;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,6DAA6D;AAC/D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ImportOptions } from './tools/test-automation';
|
|
2
|
+
export declare const JUNIT_HELP = "Usage: huly-mcp junit <report.xml> --project <test project> [options]\n\nImports a JUnit XML report (Jest, Vitest, pytest, Go, Gradle, Maven, xcpretty \u2026) as a Huly test\nrun. Suites and cases that do not exist yet are created. Credentials come from the usual HULY_*\nenvironment variables.\n\nOptions:\n --project <name> Test project (required)\n --workspace <slug> Workspace (needed when the account has several)\n --run <name> Run name (default: \"CI <date time>\")\n --parent-suite <name> Put the report's suites under this suite\n --no-create Only record results for cases that already exist\n --fail-on-failures Exit with code 1 when the report has failed tests\n --dry-run Show what would happen, change nothing\n";
|
|
3
|
+
export interface JUnitCliOptions extends Omit<ImportOptions, 'xml'> {
|
|
4
|
+
file: string;
|
|
5
|
+
failOnFailures: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseJUnitArgs(argv: string[]): JUnitCliOptions;
|
|
8
|
+
export declare function runJUnit(argv: string[]): Promise<void>;
|