@grigoreo-dev/otask-mcp 1.2.0 → 1.3.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/README.md +33 -19
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp-http.js +30 -10
- package/dist/mcp-http.js.map +1 -1
- package/dist/schemas/task.d.ts +27 -27
- package/dist/schemas/task.d.ts.map +1 -1
- package/dist/schemas/task.js +9 -3
- package/dist/schemas/task.js.map +1 -1
- package/dist/schemas/workspace.d.ts +21 -21
- package/dist/schemas/workspace.d.ts.map +1 -1
- package/dist/schemas/workspace.js +8 -3
- package/dist/schemas/workspace.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +8 -4
- package/dist/server.js.map +1 -1
- package/dist/services/scope.d.ts +45 -0
- package/dist/services/scope.d.ts.map +1 -0
- package/dist/services/scope.js +147 -0
- package/dist/services/scope.js.map +1 -0
- package/dist/tools/add-comment.d.ts +1 -1
- package/dist/tools/add-comment.d.ts.map +1 -1
- package/dist/tools/add-comment.js +8 -5
- package/dist/tools/add-comment.js.map +1 -1
- package/dist/tools/archive-task.d.ts +1 -1
- package/dist/tools/archive-task.d.ts.map +1 -1
- package/dist/tools/archive-task.js +8 -5
- package/dist/tools/archive-task.js.map +1 -1
- package/dist/tools/create-task.d.ts +1 -1
- package/dist/tools/create-task.d.ts.map +1 -1
- package/dist/tools/create-task.js +7 -7
- package/dist/tools/create-task.js.map +1 -1
- package/dist/tools/get-task.d.ts +1 -1
- package/dist/tools/get-task.d.ts.map +1 -1
- package/dist/tools/get-task.js +6 -4
- package/dist/tools/get-task.js.map +1 -1
- package/dist/tools/list-board.d.ts +1 -1
- package/dist/tools/list-board.d.ts.map +1 -1
- package/dist/tools/list-board.js +13 -9
- package/dist/tools/list-board.js.map +1 -1
- package/dist/tools/list-comments.d.ts +1 -1
- package/dist/tools/list-comments.d.ts.map +1 -1
- package/dist/tools/list-comments.js +8 -5
- package/dist/tools/list-comments.js.map +1 -1
- package/dist/tools/list-members.d.ts +1 -1
- package/dist/tools/list-members.d.ts.map +1 -1
- package/dist/tools/list-members.js +5 -3
- package/dist/tools/list-members.js.map +1 -1
- package/dist/tools/list-project-tasks.d.ts +1 -1
- package/dist/tools/list-project-tasks.d.ts.map +1 -1
- package/dist/tools/list-project-tasks.js +6 -5
- package/dist/tools/list-project-tasks.js.map +1 -1
- package/dist/tools/list-projects.d.ts +1 -1
- package/dist/tools/list-projects.d.ts.map +1 -1
- package/dist/tools/list-projects.js +5 -3
- package/dist/tools/list-projects.js.map +1 -1
- package/dist/tools/list-tags.d.ts +1 -1
- package/dist/tools/list-tags.d.ts.map +1 -1
- package/dist/tools/list-tags.js +5 -3
- package/dist/tools/list-tags.js.map +1 -1
- package/dist/tools/move-task.d.ts +1 -1
- package/dist/tools/move-task.d.ts.map +1 -1
- package/dist/tools/move-task.js +8 -5
- package/dist/tools/move-task.js.map +1 -1
- package/dist/tools/types.d.ts +2 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/update-task.d.ts +1 -1
- package/dist/tools/update-task.d.ts.map +1 -1
- package/dist/tools/update-task.js +10 -7
- package/dist/tools/update-task.js.map +1 -1
- package/package.json +2 -2
- package/dist/http-server.d.ts +0 -3
- package/dist/http-server.d.ts.map +0 -1
- package/dist/http-server.js +0 -92
- package/dist/http-server.js.map +0 -1
- package/dist/proxy/headers.d.ts +0 -3
- package/dist/proxy/headers.d.ts.map +0 -1
- package/dist/proxy/headers.js +0 -37
- package/dist/proxy/headers.js.map +0 -1
- package/dist/proxy/read-body.d.ts +0 -3
- package/dist/proxy/read-body.d.ts.map +0 -1
- package/dist/proxy/read-body.js +0 -18
- package/dist/proxy/read-body.js.map +0 -1
- package/dist/services/http-auth-context.d.ts +0 -7
- package/dist/services/http-auth-context.d.ts.map +0 -1
- package/dist/services/http-auth-context.js +0 -9
- package/dist/services/http-auth-context.js.map +0 -1
package/dist/server.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { createOtaskClient } from "./services/client.js";
|
|
3
|
-
import {
|
|
3
|
+
import { scopeFromEnv, } from "./services/scope.js";
|
|
4
4
|
import { registerAllTools } from "./tools/register.js";
|
|
5
|
-
export function createMcpServer(auth,
|
|
5
|
+
export function createMcpServer(auth, scope = scopeFromEnv({})) {
|
|
6
6
|
const server = new McpServer({
|
|
7
7
|
name: "otask-mcp-server",
|
|
8
|
-
version: "1.
|
|
8
|
+
version: "1.3.0",
|
|
9
|
+
});
|
|
10
|
+
registerAllTools(server, {
|
|
11
|
+
api: createOtaskClient(auth),
|
|
12
|
+
guard: scope.projectGuard,
|
|
13
|
+
scope,
|
|
9
14
|
});
|
|
10
|
-
registerAllTools(server, { api: createOtaskClient(auth), guard });
|
|
11
15
|
return server;
|
|
12
16
|
}
|
|
13
17
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,UAAU,eAAe,CAC7B,IAAuB,EACvB,QAAsB,YAAY,CAAC,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,gBAAgB,CAAC,MAAM,EAAE;QACvB,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC;QAC5B,KAAK,EAAE,KAAK,CAAC,YAAY;QACzB,KAAK;KACN,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type ProjectGuard } from "./project-guard.js";
|
|
2
|
+
export interface WsAllowList {
|
|
3
|
+
slugs: Set<string>;
|
|
4
|
+
isEmpty: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface WsGuard {
|
|
7
|
+
allows(slug: string): boolean;
|
|
8
|
+
assertAllowed(slug: string): void;
|
|
9
|
+
readonly list: WsAllowList;
|
|
10
|
+
}
|
|
11
|
+
export interface ScopeContext {
|
|
12
|
+
defaultWs?: string;
|
|
13
|
+
defaultProject?: string;
|
|
14
|
+
wsGuard: WsGuard;
|
|
15
|
+
projectGuard: ProjectGuard;
|
|
16
|
+
}
|
|
17
|
+
export declare function parseWsAllowList(raw: string | undefined | null): WsAllowList;
|
|
18
|
+
export declare function createWsGuard(list: WsAllowList): WsGuard;
|
|
19
|
+
export declare function resolveWsSlug(ws_slug: string | undefined, scope: ScopeContext): string;
|
|
20
|
+
export declare function resolveProjectSlug(project_slug: string | undefined, scope: ScopeContext, listProjects: () => Promise<Array<{
|
|
21
|
+
id: number;
|
|
22
|
+
slug: string;
|
|
23
|
+
}>>): Promise<string>;
|
|
24
|
+
export declare function resolveProjectId(project_id: number | undefined, scope: ScopeContext, listProjects: () => Promise<Array<{
|
|
25
|
+
id: number;
|
|
26
|
+
slug: string;
|
|
27
|
+
}>>): Promise<number>;
|
|
28
|
+
export declare function assertDefaultsAllowed(scope: ScopeContext): void;
|
|
29
|
+
export declare function scopeFromEnv(env?: NodeJS.ProcessEnv): ScopeContext;
|
|
30
|
+
export declare function resolveHttpScope(opts: {
|
|
31
|
+
authMode: "gateway" | "passthrough";
|
|
32
|
+
env: NodeJS.ProcessEnv;
|
|
33
|
+
headers: {
|
|
34
|
+
[k: string]: string | string[] | undefined;
|
|
35
|
+
};
|
|
36
|
+
}): ScopeContext;
|
|
37
|
+
export declare function scopeGuardModes(scope: ScopeContext): {
|
|
38
|
+
wsGuard: "env" | "header" | "off";
|
|
39
|
+
projectGuard: "env" | "header" | "off";
|
|
40
|
+
defaults: {
|
|
41
|
+
ws: boolean;
|
|
42
|
+
project: boolean;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/services/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC7B,WAAW,CAUb;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAaxD;AAiBD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,YAAY,GAClB,MAAM,CASR;AAED,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,KAAK,EAAE,YAAY,EACnB,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GAC/D,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,KAAK,EAAE,YAAY,EACnB,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GAC/D,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAoB/D;AAED,wBAAgB,YAAY,CAC1B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,YAAY,CASd;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,QAAQ,EAAE,SAAS,GAAG,aAAa,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,OAAO,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAAC;CACzD,GAAG,YAAY,CAyBf;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG;IACpD,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,YAAY,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAC;IACvC,QAAQ,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAC7C,CASA"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { assertProjectIdAllowed, assertProjectSlugAllowed, createProjectGuard, parseProjectAllowList, } from "./project-guard.js";
|
|
2
|
+
export function parseWsAllowList(raw) {
|
|
3
|
+
const slugs = new Set();
|
|
4
|
+
if (!raw?.trim()) {
|
|
5
|
+
return { slugs, isEmpty: true };
|
|
6
|
+
}
|
|
7
|
+
for (const part of raw.split(",")) {
|
|
8
|
+
const token = part.trim();
|
|
9
|
+
if (token)
|
|
10
|
+
slugs.add(token);
|
|
11
|
+
}
|
|
12
|
+
return { slugs, isEmpty: slugs.size === 0 };
|
|
13
|
+
}
|
|
14
|
+
export function createWsGuard(list) {
|
|
15
|
+
return {
|
|
16
|
+
list,
|
|
17
|
+
allows(slug) {
|
|
18
|
+
if (list.isEmpty)
|
|
19
|
+
return true;
|
|
20
|
+
return list.slugs.has(slug);
|
|
21
|
+
},
|
|
22
|
+
assertAllowed(slug) {
|
|
23
|
+
if (!this.allows(slug)) {
|
|
24
|
+
throw new Error(`Workspace not allowed: ${slug}`);
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function headerValue(headers, name) {
|
|
30
|
+
const raw = headers[name];
|
|
31
|
+
if (typeof raw === "string")
|
|
32
|
+
return raw;
|
|
33
|
+
if (Array.isArray(raw) && typeof raw[0] === "string")
|
|
34
|
+
return raw[0];
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
function trimOrUndef(v) {
|
|
38
|
+
const t = v?.trim();
|
|
39
|
+
return t ? t : undefined;
|
|
40
|
+
}
|
|
41
|
+
export function resolveWsSlug(ws_slug, scope) {
|
|
42
|
+
const ws = trimOrUndef(ws_slug) ?? scope.defaultWs;
|
|
43
|
+
if (!ws) {
|
|
44
|
+
throw new Error("ws_slug is required (pass arg or set OTASK_DEFAULT_WS / X-Otask-Default-Ws)");
|
|
45
|
+
}
|
|
46
|
+
scope.wsGuard.assertAllowed(ws);
|
|
47
|
+
return ws;
|
|
48
|
+
}
|
|
49
|
+
export async function resolveProjectSlug(project_slug, scope, listProjects) {
|
|
50
|
+
const explicit = trimOrUndef(project_slug);
|
|
51
|
+
if (explicit) {
|
|
52
|
+
await assertProjectSlugAllowed(scope.projectGuard, listProjects, explicit);
|
|
53
|
+
return explicit;
|
|
54
|
+
}
|
|
55
|
+
const def = scope.defaultProject;
|
|
56
|
+
if (!def) {
|
|
57
|
+
throw new Error("project_slug is required (pass arg or set OTASK_DEFAULT_PROJECT / X-Otask-Default-Project)");
|
|
58
|
+
}
|
|
59
|
+
if (/^\d+$/.test(def)) {
|
|
60
|
+
const id = Number(def);
|
|
61
|
+
const projects = await listProjects();
|
|
62
|
+
const project = projects.find((p) => p.id === id);
|
|
63
|
+
if (!project) {
|
|
64
|
+
throw new Error(`Default project id not found: ${id}`);
|
|
65
|
+
}
|
|
66
|
+
scope.projectGuard.assertAllowed({
|
|
67
|
+
id: project.id,
|
|
68
|
+
slug: project.slug,
|
|
69
|
+
});
|
|
70
|
+
return project.slug;
|
|
71
|
+
}
|
|
72
|
+
await assertProjectSlugAllowed(scope.projectGuard, listProjects, def);
|
|
73
|
+
return def;
|
|
74
|
+
}
|
|
75
|
+
export async function resolveProjectId(project_id, scope, listProjects) {
|
|
76
|
+
if (project_id != null) {
|
|
77
|
+
await assertProjectIdAllowed(scope.projectGuard, listProjects, project_id);
|
|
78
|
+
return project_id;
|
|
79
|
+
}
|
|
80
|
+
const def = scope.defaultProject;
|
|
81
|
+
if (!def) {
|
|
82
|
+
throw new Error("project_id is required (pass arg or set OTASK_DEFAULT_PROJECT / X-Otask-Default-Project)");
|
|
83
|
+
}
|
|
84
|
+
if (/^\d+$/.test(def)) {
|
|
85
|
+
const id = Number(def);
|
|
86
|
+
await assertProjectIdAllowed(scope.projectGuard, listProjects, id);
|
|
87
|
+
return id;
|
|
88
|
+
}
|
|
89
|
+
const projects = await listProjects();
|
|
90
|
+
const project = projects.find((p) => p.slug === def);
|
|
91
|
+
if (!project) {
|
|
92
|
+
throw new Error(`Default project slug not found: ${def}`);
|
|
93
|
+
}
|
|
94
|
+
scope.projectGuard.assertAllowed({ id: project.id, slug: project.slug });
|
|
95
|
+
return project.id;
|
|
96
|
+
}
|
|
97
|
+
export function assertDefaultsAllowed(scope) {
|
|
98
|
+
if (scope.defaultWs && !scope.wsGuard.list.isEmpty) {
|
|
99
|
+
if (!scope.wsGuard.allows(scope.defaultWs)) {
|
|
100
|
+
throw new Error(`OTASK_DEFAULT_WS "${scope.defaultWs}" is not in OTASK_ALLOWED_WS`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (scope.defaultProject && !scope.projectGuard.list.isEmpty) {
|
|
104
|
+
const def = scope.defaultProject;
|
|
105
|
+
const asId = /^\d+$/.test(def) ? Number(def) : null;
|
|
106
|
+
const allowed = scope.projectGuard.allows({ slug: def }) ||
|
|
107
|
+
(asId != null && scope.projectGuard.allows({ id: asId }));
|
|
108
|
+
if (!allowed) {
|
|
109
|
+
throw new Error(`OTASK_DEFAULT_PROJECT "${def}" is not in OTASK_ALLOWED_PROJECTS`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export function scopeFromEnv(env = process.env) {
|
|
114
|
+
return {
|
|
115
|
+
defaultWs: trimOrUndef(env.OTASK_DEFAULT_WS),
|
|
116
|
+
defaultProject: trimOrUndef(env.OTASK_DEFAULT_PROJECT),
|
|
117
|
+
wsGuard: createWsGuard(parseWsAllowList(env.OTASK_ALLOWED_WS)),
|
|
118
|
+
projectGuard: createProjectGuard(parseProjectAllowList(env.OTASK_ALLOWED_PROJECTS)),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
export function resolveHttpScope(opts) {
|
|
122
|
+
if (opts.authMode === "gateway") {
|
|
123
|
+
return scopeFromEnv(opts.env);
|
|
124
|
+
}
|
|
125
|
+
const headerWsAllow = headerValue(opts.headers, "x-otask-allowed-ws");
|
|
126
|
+
const headerProjectAllow = headerValue(opts.headers, "x-otask-allowed-projects");
|
|
127
|
+
const headerDefaultWs = headerValue(opts.headers, "x-otask-default-ws");
|
|
128
|
+
const headerDefaultProject = headerValue(opts.headers, "x-otask-default-project");
|
|
129
|
+
return {
|
|
130
|
+
defaultWs: trimOrUndef(headerDefaultWs) ?? trimOrUndef(opts.env.OTASK_DEFAULT_WS),
|
|
131
|
+
defaultProject: trimOrUndef(headerDefaultProject) ??
|
|
132
|
+
trimOrUndef(opts.env.OTASK_DEFAULT_PROJECT),
|
|
133
|
+
wsGuard: createWsGuard(parseWsAllowList(headerWsAllow)),
|
|
134
|
+
projectGuard: createProjectGuard(parseProjectAllowList(headerProjectAllow)),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
export function scopeGuardModes(scope) {
|
|
138
|
+
return {
|
|
139
|
+
wsGuard: scope.wsGuard.list.isEmpty ? "off" : "env",
|
|
140
|
+
projectGuard: scope.projectGuard.list.isEmpty ? "off" : "env",
|
|
141
|
+
defaults: {
|
|
142
|
+
ws: Boolean(scope.defaultWs),
|
|
143
|
+
project: Boolean(scope.defaultProject),
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/services/scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type AddCommentInput } from "../schemas/task.js";
|
|
2
2
|
import type { ToolDefinition, ToolDeps } from "./types.js";
|
|
3
|
-
export declare function createAddCommentTool({ api, guard, }: ToolDeps): ToolDefinition<AddCommentInput>;
|
|
3
|
+
export declare function createAddCommentTool({ api, guard, scope, }: ToolDeps): ToolDefinition<AddCommentInput>;
|
|
4
4
|
//# sourceMappingURL=add-comment.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-comment.d.ts","sourceRoot":"","sources":["../../src/tools/add-comment.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"add-comment.d.ts","sourceRoot":"","sources":["../../src/tools/add-comment.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,EACL,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,CAkD5C"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { AddCommentInputSchema, } from "../schemas/task.js";
|
|
2
2
|
import { assertProjectIdAllowed } from "../services/project-guard.js";
|
|
3
|
+
import { resolveWsSlug } from "../services/scope.js";
|
|
3
4
|
import { jsonToolResult, toolError } from "./helpers.js";
|
|
4
|
-
export function createAddCommentTool({ api, guard, }) {
|
|
5
|
+
export function createAddCommentTool({ api, guard, scope, }) {
|
|
5
6
|
return {
|
|
6
7
|
name: "otask_add_comment",
|
|
7
8
|
config: {
|
|
@@ -9,7 +10,8 @@ export function createAddCommentTool({ api, guard, }) {
|
|
|
9
10
|
description: `Add a comment on a task (optional parent_id for replies). Fetches the task first to enforce project allow-list.
|
|
10
11
|
|
|
11
12
|
Args:
|
|
12
|
-
- ws_slug
|
|
13
|
+
- ws_slug: optional if OTASK_DEFAULT_WS is set
|
|
14
|
+
- task_slug: task identity
|
|
13
15
|
- comment: comment body
|
|
14
16
|
- parent_id: optional parent comment ID
|
|
15
17
|
|
|
@@ -26,12 +28,13 @@ Docs: https://api.otask.ru/docs`,
|
|
|
26
28
|
},
|
|
27
29
|
handler: async ({ ws_slug, task_slug, comment, parent_id }) => {
|
|
28
30
|
try {
|
|
29
|
-
const
|
|
31
|
+
const ws = resolveWsSlug(ws_slug, scope);
|
|
32
|
+
const current = await api.getTask(ws, task_slug);
|
|
30
33
|
const projectSlug = typeof current.project_slug === "string"
|
|
31
34
|
? current.project_slug
|
|
32
35
|
: undefined;
|
|
33
|
-
await assertProjectIdAllowed(guard, () => api.listProjects(
|
|
34
|
-
const data = await api.addComment(
|
|
36
|
+
await assertProjectIdAllowed(guard, () => api.listProjects(ws), current.project_id, projectSlug);
|
|
37
|
+
const data = await api.addComment(ws, task_slug, comment, parent_id);
|
|
35
38
|
return jsonToolResult(data, data);
|
|
36
39
|
}
|
|
37
40
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-comment.js","sourceRoot":"","sources":["../../src/tools/add-comment.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE;YACN,KAAK,EAAE,yBAAyB;YAChC,WAAW,EAAE
|
|
1
|
+
{"version":3,"file":"add-comment.js","sourceRoot":"","sources":["../../src/tools/add-comment.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,EACL,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE;YACN,KAAK,EAAE,yBAAyB;YAChC,WAAW,EAAE;;;;;;;;;;gCAUa;YAC1B,WAAW,EAAE,qBAAqB;YAClC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YAC5D,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBACjD,MAAM,WAAW,GACf,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;oBACtC,CAAC,CAAC,OAAO,CAAC,YAAY;oBACtB,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,EAC1B,OAAO,CAAC,UAAU,EAClB,WAAW,CACZ,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAC/B,EAAE,EACF,SAAS,EACT,OAAO,EACP,SAAS,CACV,CAAC;gBACF,OAAO,cAAc,CAAC,IAAI,EAAE,IAA+B,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type ArchiveTaskInput } from "../schemas/task.js";
|
|
2
2
|
import type { ToolDefinition, ToolDeps } from "./types.js";
|
|
3
|
-
export declare function createArchiveTaskTool({ api, guard, }: ToolDeps): ToolDefinition<ArchiveTaskInput>;
|
|
3
|
+
export declare function createArchiveTaskTool({ api, guard, scope, }: ToolDeps): ToolDefinition<ArchiveTaskInput>;
|
|
4
4
|
//# sourceMappingURL=archive-task.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive-task.d.ts","sourceRoot":"","sources":["../../src/tools/archive-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"archive-task.d.ts","sourceRoot":"","sources":["../../src/tools/archive-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,EACpC,GAAG,EACH,KAAK,EACL,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,CA4C7C"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ArchiveTaskInputSchema, } from "../schemas/task.js";
|
|
2
2
|
import { assertProjectIdAllowed } from "../services/project-guard.js";
|
|
3
|
+
import { resolveWsSlug } from "../services/scope.js";
|
|
3
4
|
import { compactTask } from "../services/task-mapper.js";
|
|
4
5
|
import { jsonToolResult, toolError } from "./helpers.js";
|
|
5
|
-
export function createArchiveTaskTool({ api, guard, }) {
|
|
6
|
+
export function createArchiveTaskTool({ api, guard, scope, }) {
|
|
6
7
|
return {
|
|
7
8
|
name: "otask_archive_task",
|
|
8
9
|
config: {
|
|
@@ -10,7 +11,8 @@ export function createArchiveTaskTool({ api, guard, }) {
|
|
|
10
11
|
description: `Archive a task (POST .../in-archive). Fetches the task first to enforce project allow-list.
|
|
11
12
|
|
|
12
13
|
Args:
|
|
13
|
-
- ws_slug
|
|
14
|
+
- ws_slug: optional if OTASK_DEFAULT_WS is set
|
|
15
|
+
- task_slug: task identity
|
|
14
16
|
|
|
15
17
|
Returns archived compact task.
|
|
16
18
|
|
|
@@ -25,12 +27,13 @@ Docs: https://api.otask.ru/docs`,
|
|
|
25
27
|
},
|
|
26
28
|
handler: async ({ ws_slug, task_slug }) => {
|
|
27
29
|
try {
|
|
28
|
-
const
|
|
30
|
+
const ws = resolveWsSlug(ws_slug, scope);
|
|
31
|
+
const current = await api.getTask(ws, task_slug);
|
|
29
32
|
const projectSlug = typeof current.project_slug === "string"
|
|
30
33
|
? current.project_slug
|
|
31
34
|
: undefined;
|
|
32
|
-
await assertProjectIdAllowed(guard, () => api.listProjects(
|
|
33
|
-
const task = await api.archiveTask(
|
|
35
|
+
await assertProjectIdAllowed(guard, () => api.listProjects(ws), current.project_id, projectSlug);
|
|
36
|
+
const task = await api.archiveTask(ws, task_slug);
|
|
34
37
|
const summary = compactTask(task);
|
|
35
38
|
return jsonToolResult(summary, { task: summary });
|
|
36
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive-task.js","sourceRoot":"","sources":["../../src/tools/archive-task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,GAEvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,qBAAqB,CAAC,EACpC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE;YACN,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE
|
|
1
|
+
{"version":3,"file":"archive-task.js","sourceRoot":"","sources":["../../src/tools/archive-task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,GAEvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,qBAAqB,CAAC,EACpC,GAAG,EACH,KAAK,EACL,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE;YACN,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE;;;;;;;;gCAQa;YAC1B,WAAW,EAAE,sBAAsB;YACnC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,IAAI;gBACrB,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBACjD,MAAM,WAAW,GACf,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;oBACtC,CAAC,CAAC,OAAO,CAAC,YAAY;oBACtB,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,EAC1B,OAAO,CAAC,UAAU,EAClB,WAAW,CACZ,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAClD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type CreateTaskInput } from "../schemas/task.js";
|
|
2
2
|
import type { ToolDefinition, ToolDeps } from "./types.js";
|
|
3
|
-
export declare function createCreateTaskTool({ api,
|
|
3
|
+
export declare function createCreateTaskTool({ api, scope, }: ToolDeps): ToolDefinition<CreateTaskInput>;
|
|
4
4
|
//# sourceMappingURL=create-task.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-task.d.ts","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-task.d.ts","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,CA0C5C"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { CreateTaskInputSchema, } from "../schemas/task.js";
|
|
2
|
-
import {
|
|
2
|
+
import { resolveProjectId, resolveWsSlug, } from "../services/scope.js";
|
|
3
3
|
import { compactTask } from "../services/task-mapper.js";
|
|
4
4
|
import { jsonToolResult, toolError } from "./helpers.js";
|
|
5
|
-
export function createCreateTaskTool({ api,
|
|
5
|
+
export function createCreateTaskTool({ api, scope, }) {
|
|
6
6
|
return {
|
|
7
7
|
name: "otask_create_task",
|
|
8
8
|
config: {
|
|
@@ -12,8 +12,7 @@ export function createCreateTaskTool({ api, guard, }) {
|
|
|
12
12
|
You must supply board_id and board_column_id (discover via otask_list_board for the project).
|
|
13
13
|
|
|
14
14
|
Args:
|
|
15
|
-
- ws_slug:
|
|
16
|
-
- project_id: Project numeric ID
|
|
15
|
+
- ws_slug, project_id: optional if OTASK_DEFAULT_WS / OTASK_DEFAULT_PROJECT set
|
|
17
16
|
- name, board_id, board_column_id, end_at: required
|
|
18
17
|
- description, comment, priority_id, performers, tags: optional
|
|
19
18
|
|
|
@@ -30,9 +29,10 @@ Docs: https://api.otask.ru/docs`,
|
|
|
30
29
|
},
|
|
31
30
|
handler: async (params) => {
|
|
32
31
|
try {
|
|
33
|
-
const { ws_slug, ...
|
|
34
|
-
|
|
35
|
-
const
|
|
32
|
+
const { ws_slug, project_id: projectIdArg, ...rest } = params;
|
|
33
|
+
const ws = resolveWsSlug(ws_slug, scope);
|
|
34
|
+
const project_id = await resolveProjectId(projectIdArg, scope, () => api.listProjects(ws));
|
|
35
|
+
const task = await api.createTask(ws, { ...rest, project_id });
|
|
36
36
|
const summary = compactTask(task);
|
|
37
37
|
return jsonToolResult(summary, { task: summary });
|
|
38
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-task.js","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"create-task.js","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE;YACN,KAAK,EAAE,oBAAoB;YAC3B,WAAW,EAAE;;;;;;;;;;;gCAWa;YAC1B,WAAW,EAAE,qBAAqB;YAClC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;gBAC9D,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,UAAU,GAAG,MAAM,gBAAgB,CACvC,YAAY,EACZ,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAC3B,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC/D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/tools/get-task.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type GetTaskInput } from "../schemas/task.js";
|
|
2
2
|
import type { ToolDefinition, ToolDeps } from "./types.js";
|
|
3
|
-
export declare function createGetTaskTool({ api, guard, }: ToolDeps): ToolDefinition<GetTaskInput>;
|
|
3
|
+
export declare function createGetTaskTool({ api, guard, scope, }: ToolDeps): ToolDefinition<GetTaskInput>;
|
|
4
4
|
//# sourceMappingURL=get-task.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-task.d.ts","sourceRoot":"","sources":["../../src/tools/get-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-task.d.ts","sourceRoot":"","sources":["../../src/tools/get-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAK3E,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,KAAK,EACL,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,CA4CzC"}
|
package/dist/tools/get-task.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { GetTaskInputSchema } from "../schemas/task.js";
|
|
2
2
|
import { assertProjectIdAllowed } from "../services/project-guard.js";
|
|
3
|
+
import { resolveWsSlug } from "../services/scope.js";
|
|
3
4
|
import { compactTask } from "../services/task-mapper.js";
|
|
4
5
|
import { jsonToolResult, toolError } from "./helpers.js";
|
|
5
|
-
export function createGetTaskTool({ api, guard, }) {
|
|
6
|
+
export function createGetTaskTool({ api, guard, scope, }) {
|
|
6
7
|
return {
|
|
7
8
|
name: "otask_get_task",
|
|
8
9
|
config: {
|
|
@@ -13,7 +14,7 @@ Use before otask_update_task to inspect current field values (board_id, performe
|
|
|
13
14
|
Project must be on the allow-list when configured (checked via task.project_id).
|
|
14
15
|
|
|
15
16
|
Args:
|
|
16
|
-
- ws_slug:
|
|
17
|
+
- ws_slug: optional if OTASK_DEFAULT_WS is set
|
|
17
18
|
- task_slug: Task UUID from URL (.../tasks/{task_slug})
|
|
18
19
|
|
|
19
20
|
Returns JSON with key task fields: id, slug, name, description, end_at, board_id, board_column_id, priority_id, project_id, performers, tags.
|
|
@@ -29,9 +30,10 @@ Docs: https://api.otask.ru/docs#zadaci-GETapi-v1-ws--ws_slug--tasks--task_slug`,
|
|
|
29
30
|
},
|
|
30
31
|
handler: async ({ ws_slug, task_slug }) => {
|
|
31
32
|
try {
|
|
32
|
-
const
|
|
33
|
+
const ws = resolveWsSlug(ws_slug, scope);
|
|
34
|
+
const task = await api.getTask(ws, task_slug);
|
|
33
35
|
const projectSlug = typeof task.project_slug === "string" ? task.project_slug : undefined;
|
|
34
|
-
await assertProjectIdAllowed(guard, () => api.listProjects(
|
|
36
|
+
await assertProjectIdAllowed(guard, () => api.listProjects(ws), task.project_id, projectSlug);
|
|
35
37
|
const summary = compactTask(task);
|
|
36
38
|
return jsonToolResult(summary, { task: summary });
|
|
37
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-task.js","sourceRoot":"","sources":["../../src/tools/get-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,iBAAiB,CAAC,EAChC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE;YACN,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE;;;;;;;;;;;+EAW4D;YACzE,WAAW,EAAE,kBAAkB;YAC/B,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"get-task.js","sourceRoot":"","sources":["../../src/tools/get-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,iBAAiB,CAAC,EAChC,GAAG,EACH,KAAK,EACL,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE;YACN,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE;;;;;;;;;;;+EAW4D;YACzE,WAAW,EAAE,kBAAkB;YAC/B,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAC9C,MAAM,WAAW,GACf,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;gBACxE,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,EAC1B,IAAI,CAAC,UAAU,EACf,WAAW,CACZ,CAAC;gBACF,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type ListBoardInput } from "../schemas/workspace.js";
|
|
2
2
|
import type { ToolDefinition, ToolDeps } from "./types.js";
|
|
3
|
-
export declare function createListBoardTool({ api,
|
|
3
|
+
export declare function createListBoardTool({ api, scope, }: ToolDeps): ToolDefinition<ListBoardInput>;
|
|
4
4
|
//# sourceMappingURL=list-board.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-board.d.ts","sourceRoot":"","sources":["../../src/tools/list-board.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"list-board.d.ts","sourceRoot":"","sources":["../../src/tools/list-board.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAOjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,CAiE3C"}
|
package/dist/tools/list-board.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ListBoardInputSchema, } from "../schemas/workspace.js";
|
|
2
|
-
import {
|
|
2
|
+
import { resolveProjectSlug, resolveWsSlug, } from "../services/scope.js";
|
|
3
3
|
import { compactBoard, compactColumn } from "../services/task-mapper.js";
|
|
4
4
|
import { jsonToolResult, toolError } from "./helpers.js";
|
|
5
|
-
export function createListBoardTool({ api,
|
|
5
|
+
export function createListBoardTool({ api, scope, }) {
|
|
6
6
|
return {
|
|
7
7
|
name: "otask_list_board",
|
|
8
8
|
config: {
|
|
@@ -10,10 +10,12 @@ export function createListBoardTool({ api, guard, }) {
|
|
|
10
10
|
description: `List boards and columns for a project (statuses). Project must be on the allow-list when configured.
|
|
11
11
|
|
|
12
12
|
Use before create/move to discover board_id and board_column_id.
|
|
13
|
+
API requires type=status (defaulted by this tool).
|
|
13
14
|
|
|
14
15
|
Args:
|
|
15
|
-
- ws_slug, project_slug:
|
|
16
|
-
- type
|
|
16
|
+
- ws_slug, project_slug: optional if defaults set
|
|
17
|
+
- type: defaults to "status"
|
|
18
|
+
- board_slug: optional specific board
|
|
17
19
|
|
|
18
20
|
Returns compact boards and columns (id, name, slug?, color?, board_id?).
|
|
19
21
|
|
|
@@ -28,11 +30,13 @@ Docs: https://api.otask.ru/docs`,
|
|
|
28
30
|
},
|
|
29
31
|
handler: async ({ ws_slug, project_slug, type, board_slug }) => {
|
|
30
32
|
try {
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
:
|
|
35
|
-
|
|
33
|
+
const ws = resolveWsSlug(ws_slug, scope);
|
|
34
|
+
const project = await resolveProjectSlug(project_slug, scope, () => api.listProjects(ws));
|
|
35
|
+
const query = {
|
|
36
|
+
type: type ?? "status",
|
|
37
|
+
...(board_slug !== undefined ? { board_slug } : {}),
|
|
38
|
+
};
|
|
39
|
+
const result = await api.listBoard(ws, project, query);
|
|
36
40
|
const boards = result.boards.map((b) => compactBoard(b));
|
|
37
41
|
const columns = result.columns.map((c) => compactColumn(c));
|
|
38
42
|
const payload = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-board.js","sourceRoot":"","sources":["../../src/tools/list-board.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAErB,MAAM,yBAAyB,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"list-board.js","sourceRoot":"","sources":["../../src/tools/list-board.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAErB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,mBAAmB,CAAC,EAClC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE;YACN,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EAAE;;;;;;;;;;;;gCAYa;YAC1B,WAAW,EAAE,oBAAoB;YACjC,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;YAC7D,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CACtC,YAAY,EACZ,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAC3B,CAAC;gBACF,MAAM,KAAK,GAAG;oBACZ,IAAI,EAAE,IAAI,IAAI,QAAQ;oBACtB,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpD,CAAC;gBACF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;gBACvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrC,YAAY,CAAC,CAAgE,CAAC,CAC/E,CAAC;gBACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACvC,aAAa,CACX,CAMC,CACF,CACF,CAAC;gBACF,MAAM,OAAO,GAAG;oBACd,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,cAAc,OAAO,CAAC,MAAM,YAAY;oBACjE,MAAM;oBACN,OAAO;oBACP,IAAI,EAAE,IAAI;iBACX,CAAC;gBACF,OAAO,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type ListCommentsInput } from "../schemas/task.js";
|
|
2
2
|
import type { ToolDefinition, ToolDeps } from "./types.js";
|
|
3
|
-
export declare function createListCommentsTool({ api, guard, }: ToolDeps): ToolDefinition<ListCommentsInput>;
|
|
3
|
+
export declare function createListCommentsTool({ api, guard, scope, }: ToolDeps): ToolDefinition<ListCommentsInput>;
|
|
4
4
|
//# sourceMappingURL=list-comments.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-comments.d.ts","sourceRoot":"","sources":["../../src/tools/list-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"list-comments.d.ts","sourceRoot":"","sources":["../../src/tools/list-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,EACL,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,iBAAiB,CAAC,CA2C9C"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ListCommentsInputSchema, } from "../schemas/task.js";
|
|
2
2
|
import { assertProjectIdAllowed } from "../services/project-guard.js";
|
|
3
|
+
import { resolveWsSlug } from "../services/scope.js";
|
|
3
4
|
import { jsonToolResult, toolError } from "./helpers.js";
|
|
4
|
-
export function createListCommentsTool({ api, guard, }) {
|
|
5
|
+
export function createListCommentsTool({ api, guard, scope, }) {
|
|
5
6
|
return {
|
|
6
7
|
name: "otask_list_comments",
|
|
7
8
|
config: {
|
|
@@ -9,7 +10,8 @@ export function createListCommentsTool({ api, guard, }) {
|
|
|
9
10
|
description: `List comments on a task. Fetches the task first to enforce project allow-list.
|
|
10
11
|
|
|
11
12
|
Args:
|
|
12
|
-
- ws_slug
|
|
13
|
+
- ws_slug: optional if OTASK_DEFAULT_WS is set
|
|
14
|
+
- task_slug: task identity
|
|
13
15
|
|
|
14
16
|
Returns API comments payload.
|
|
15
17
|
|
|
@@ -24,12 +26,13 @@ Docs: https://api.otask.ru/docs`,
|
|
|
24
26
|
},
|
|
25
27
|
handler: async ({ ws_slug, task_slug }) => {
|
|
26
28
|
try {
|
|
27
|
-
const
|
|
29
|
+
const ws = resolveWsSlug(ws_slug, scope);
|
|
30
|
+
const current = await api.getTask(ws, task_slug);
|
|
28
31
|
const projectSlug = typeof current.project_slug === "string"
|
|
29
32
|
? current.project_slug
|
|
30
33
|
: undefined;
|
|
31
|
-
await assertProjectIdAllowed(guard, () => api.listProjects(
|
|
32
|
-
const data = await api.listComments(
|
|
34
|
+
await assertProjectIdAllowed(guard, () => api.listProjects(ws), current.project_id, projectSlug);
|
|
35
|
+
const data = await api.listComments(ws, task_slug);
|
|
33
36
|
return jsonToolResult(data, data);
|
|
34
37
|
}
|
|
35
38
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-comments.js","sourceRoot":"","sources":["../../src/tools/list-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAExB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE;YACN,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE
|
|
1
|
+
{"version":3,"file":"list-comments.js","sourceRoot":"","sources":["../../src/tools/list-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAExB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,EACL,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE;YACN,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE;;;;;;;;gCAQa;YAC1B,WAAW,EAAE,uBAAuB;YACpC,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBACjD,MAAM,WAAW,GACf,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;oBACtC,CAAC,CAAC,OAAO,CAAC,YAAY;oBACtB,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,EAC1B,OAAO,CAAC,UAAU,EAClB,WAAW,CACZ,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBACnD,OAAO,cAAc,CAAC,IAAI,EAAE,IAA+B,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type WsSlugInput } from "../schemas/workspace.js";
|
|
2
2
|
import type { ToolDefinition, ToolDeps } from "./types.js";
|
|
3
|
-
export declare function createListMembersTool({ api, }: ToolDeps): ToolDefinition<WsSlugInput>;
|
|
3
|
+
export declare function createListMembersTool({ api, scope, }: ToolDeps): ToolDefinition<WsSlugInput>;
|
|
4
4
|
//# sourceMappingURL=list-members.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-members.d.ts","sourceRoot":"","sources":["../../src/tools/list-members.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"list-members.d.ts","sourceRoot":"","sources":["../../src/tools/list-members.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,EACpC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CA2CxC"}
|