@opentabs-dev/opentabs-plugin-asana 0.0.74
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 +159 -0
- package/dist/adapter.iife.js +15297 -0
- package/dist/adapter.iife.js.map +7 -0
- package/dist/asana-api.d.ts +8 -0
- package/dist/asana-api.d.ts.map +1 -0
- package/dist/asana-api.js +86 -0
- package/dist/asana-api.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/add-followers.d.ts +33 -0
- package/dist/tools/add-followers.d.ts.map +1 -0
- package/dist/tools/add-followers.js +28 -0
- package/dist/tools/add-followers.js.map +1 -0
- package/dist/tools/add-task-to-section.d.ts +8 -0
- package/dist/tools/add-task-to-section.d.ts.map +1 -0
- package/dist/tools/add-task-to-section.js +26 -0
- package/dist/tools/add-task-to-section.js.map +1 -0
- package/dist/tools/create-project.d.ts +30 -0
- package/dist/tools/create-project.d.ts.map +1 -0
- package/dist/tools/create-project.js +50 -0
- package/dist/tools/create-project.js.map +1 -0
- package/dist/tools/create-section.d.ts +13 -0
- package/dist/tools/create-section.d.ts.map +1 -0
- package/dist/tools/create-section.js +28 -0
- package/dist/tools/create-section.js.map +1 -0
- package/dist/tools/create-story.d.ts +16 -0
- package/dist/tools/create-story.d.ts.map +1 -0
- package/dist/tools/create-story.js +28 -0
- package/dist/tools/create-story.js.map +1 -0
- package/dist/tools/create-task.d.ts +40 -0
- package/dist/tools/create-task.d.ts.map +1 -0
- package/dist/tools/create-task.js +53 -0
- package/dist/tools/create-task.js.map +1 -0
- package/dist/tools/delete-task.d.ts +7 -0
- package/dist/tools/delete-task.d.ts.map +1 -0
- package/dist/tools/delete-task.js +24 -0
- package/dist/tools/delete-task.js.map +1 -0
- package/dist/tools/get-current-user.d.ts +13 -0
- package/dist/tools/get-current-user.d.ts.map +1 -0
- package/dist/tools/get-current-user.js +30 -0
- package/dist/tools/get-current-user.js.map +1 -0
- package/dist/tools/get-project.d.ts +23 -0
- package/dist/tools/get-project.d.ts.map +1 -0
- package/dist/tools/get-project.js +25 -0
- package/dist/tools/get-project.js.map +1 -0
- package/dist/tools/get-stories-for-task.d.ts +18 -0
- package/dist/tools/get-stories-for-task.d.ts.map +1 -0
- package/dist/tools/get-stories-for-task.js +41 -0
- package/dist/tools/get-stories-for-task.js.map +1 -0
- package/dist/tools/get-subtasks.d.ts +35 -0
- package/dist/tools/get-subtasks.d.ts.map +1 -0
- package/dist/tools/get-subtasks.js +41 -0
- package/dist/tools/get-subtasks.js.map +1 -0
- package/dist/tools/get-task.d.ts +33 -0
- package/dist/tools/get-task.d.ts.map +1 -0
- package/dist/tools/get-task.js +29 -0
- package/dist/tools/get-task.js.map +1 -0
- package/dist/tools/get-tasks-for-project.d.ts +35 -0
- package/dist/tools/get-tasks-for-project.d.ts.map +1 -0
- package/dist/tools/get-tasks-for-project.js +41 -0
- package/dist/tools/get-tasks-for-project.js.map +1 -0
- package/dist/tools/get-tasks-for-section.d.ts +35 -0
- package/dist/tools/get-tasks-for-section.d.ts.map +1 -0
- package/dist/tools/get-tasks-for-section.js +41 -0
- package/dist/tools/get-tasks-for-section.js.map +1 -0
- package/dist/tools/get-user.d.ts +11 -0
- package/dist/tools/get-user.d.ts.map +1 -0
- package/dist/tools/get-user.js +25 -0
- package/dist/tools/get-user.js.map +1 -0
- package/dist/tools/list-projects.d.ts +27 -0
- package/dist/tools/list-projects.d.ts.map +1 -0
- package/dist/tools/list-projects.js +38 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-sections.d.ts +12 -0
- package/dist/tools/list-sections.d.ts.map +1 -0
- package/dist/tools/list-sections.js +27 -0
- package/dist/tools/list-sections.js.map +1 -0
- package/dist/tools/list-tags.d.ts +14 -0
- package/dist/tools/list-tags.d.ts.map +1 -0
- package/dist/tools/list-tags.js +41 -0
- package/dist/tools/list-tags.js.map +1 -0
- package/dist/tools/list-teams.d.ts +14 -0
- package/dist/tools/list-teams.d.ts.map +1 -0
- package/dist/tools/list-teams.js +41 -0
- package/dist/tools/list-teams.js.map +1 -0
- package/dist/tools/list-users-for-workspace.d.ts +14 -0
- package/dist/tools/list-users-for-workspace.d.ts.map +1 -0
- package/dist/tools/list-users-for-workspace.js +41 -0
- package/dist/tools/list-users-for-workspace.js.map +1 -0
- package/dist/tools/list-workspaces.d.ts +8 -0
- package/dist/tools/list-workspaces.d.ts.map +1 -0
- package/dist/tools/list-workspaces.js +23 -0
- package/dist/tools/list-workspaces.js.map +1 -0
- package/dist/tools/schemas.d.ts +189 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +222 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/search-tasks.d.ts +39 -0
- package/dist/tools/search-tasks.d.ts.map +1 -0
- package/dist/tools/search-tasks.js +52 -0
- package/dist/tools/search-tasks.js.map +1 -0
- package/dist/tools/update-project.d.ts +30 -0
- package/dist/tools/update-project.d.ts.map +1 -0
- package/dist/tools/update-project.js +49 -0
- package/dist/tools/update-project.js.map +1 -0
- package/dist/tools/update-task.d.ts +39 -0
- package/dist/tools/update-task.d.ts.map +1 -0
- package/dist/tools/update-task.js +49 -0
- package/dist/tools/update-task.js.map +1 -0
- package/dist/tools.json +2865 -0
- package/package.json +55 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const isAuthenticated: () => boolean;
|
|
2
|
+
export declare const waitForAuth: () => Promise<boolean>;
|
|
3
|
+
export declare const api: <T>(endpoint: string, options?: {
|
|
4
|
+
method?: string;
|
|
5
|
+
body?: Record<string, unknown>;
|
|
6
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
7
|
+
}) => Promise<T>;
|
|
8
|
+
//# sourceMappingURL=asana-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asana-api.d.ts","sourceRoot":"","sources":["../src/asana-api.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,eAAe,QAAO,OAA+B,CAAC;AAEnE,eAAO,MAAM,WAAW,QAAO,OAAO,CAAC,OAAO,CAI3C,CAAC;AAIJ,eAAO,MAAM,GAAG,GAAU,CAAC,EACzB,UAAU,MAAM,EAChB,UAAS;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;CAC1D,KACL,OAAO,CAAC,CAAC,CAmEX,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ToolError, getPageGlobal, parseRetryAfterMs, waitUntil } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
const API_BASE = 'https://app.asana.com/api/1.0';
|
|
3
|
+
// --- Auth detection ---
|
|
4
|
+
// Asana uses HttpOnly cookies (auth_token) that aren't accessible via JS.
|
|
5
|
+
// Auth is detected via window.env._user_id, a numeric global that Asana
|
|
6
|
+
// injects on every page for logged-in users. The actual API auth uses
|
|
7
|
+
// session cookies sent automatically via credentials: 'include'.
|
|
8
|
+
const getUserId = () => {
|
|
9
|
+
const envUserId = getPageGlobal('env._user_id');
|
|
10
|
+
if (typeof envUserId === 'number')
|
|
11
|
+
return envUserId;
|
|
12
|
+
const globalUserId = getPageGlobal('page_load_globals.user_id');
|
|
13
|
+
if (typeof globalUserId === 'number')
|
|
14
|
+
return globalUserId;
|
|
15
|
+
return null;
|
|
16
|
+
};
|
|
17
|
+
export const isAuthenticated = () => getUserId() !== null;
|
|
18
|
+
export const waitForAuth = () => waitUntil(() => isAuthenticated(), { interval: 500, timeout: 5000 }).then(() => true, () => false);
|
|
19
|
+
// --- API caller ---
|
|
20
|
+
export const api = async (endpoint, options = {}) => {
|
|
21
|
+
if (!isAuthenticated())
|
|
22
|
+
throw ToolError.auth('Not authenticated — please log in to Asana.');
|
|
23
|
+
const method = options.method ?? 'GET';
|
|
24
|
+
let url = `${API_BASE}${endpoint}`;
|
|
25
|
+
if (options.query) {
|
|
26
|
+
const params = new URLSearchParams();
|
|
27
|
+
for (const [key, value] of Object.entries(options.query)) {
|
|
28
|
+
if (value !== undefined)
|
|
29
|
+
params.append(key, String(value));
|
|
30
|
+
}
|
|
31
|
+
const qs = params.toString();
|
|
32
|
+
if (qs)
|
|
33
|
+
url += `?${qs}`;
|
|
34
|
+
}
|
|
35
|
+
const headers = {
|
|
36
|
+
Accept: 'application/json',
|
|
37
|
+
};
|
|
38
|
+
// POST/PUT/DELETE requests require this header for write auth
|
|
39
|
+
if (method !== 'GET') {
|
|
40
|
+
headers['X-Allow-Asana-Client'] = '1';
|
|
41
|
+
}
|
|
42
|
+
let fetchBody;
|
|
43
|
+
if (options.body) {
|
|
44
|
+
headers['Content-Type'] = 'application/json';
|
|
45
|
+
fetchBody = JSON.stringify(options.body);
|
|
46
|
+
}
|
|
47
|
+
let response;
|
|
48
|
+
try {
|
|
49
|
+
response = await fetch(url, {
|
|
50
|
+
method,
|
|
51
|
+
headers,
|
|
52
|
+
body: fetchBody,
|
|
53
|
+
credentials: 'include',
|
|
54
|
+
signal: AbortSignal.timeout(30_000),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (err instanceof DOMException && err.name === 'TimeoutError')
|
|
59
|
+
throw ToolError.timeout(`API request timed out: ${endpoint}`);
|
|
60
|
+
if (err instanceof DOMException && err.name === 'AbortError')
|
|
61
|
+
throw new ToolError('Request was aborted', 'aborted');
|
|
62
|
+
throw new ToolError(`Network error: ${err instanceof Error ? err.message : String(err)}`, 'network_error', {
|
|
63
|
+
category: 'internal',
|
|
64
|
+
retryable: true,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const errorBody = (await response.text().catch(() => '')).substring(0, 512);
|
|
69
|
+
if (response.status === 429) {
|
|
70
|
+
const retryAfter = response.headers.get('Retry-After');
|
|
71
|
+
const retryMs = retryAfter !== null ? parseRetryAfterMs(retryAfter) : undefined;
|
|
72
|
+
throw ToolError.rateLimited(`Rate limited: ${endpoint} — ${errorBody}`, retryMs);
|
|
73
|
+
}
|
|
74
|
+
if (response.status === 401 || response.status === 403)
|
|
75
|
+
throw ToolError.auth(`Auth error (${response.status}): ${errorBody}`);
|
|
76
|
+
if (response.status === 404)
|
|
77
|
+
throw ToolError.notFound(`Not found: ${endpoint} — ${errorBody}`);
|
|
78
|
+
if (response.status === 400 || response.status === 422)
|
|
79
|
+
throw ToolError.validation(`Validation error: ${endpoint} — ${errorBody}`);
|
|
80
|
+
throw ToolError.internal(`API error (${response.status}): ${endpoint} — ${errorBody}`);
|
|
81
|
+
}
|
|
82
|
+
if (response.status === 204)
|
|
83
|
+
return {};
|
|
84
|
+
return (await response.json());
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=asana-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asana-api.js","sourceRoot":"","sources":["../src/asana-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAElG,MAAM,QAAQ,GAAG,+BAA+B,CAAC;AAEjD,yBAAyB;AACzB,0EAA0E;AAC1E,wEAAwE;AACxE,sEAAsE;AACtE,iEAAiE;AAEjE,MAAM,SAAS,GAAG,GAAkB,EAAE;IACpC,MAAM,SAAS,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IAChD,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,YAAY,GAAG,aAAa,CAAC,2BAA2B,CAAC,CAAC;IAChE,IAAI,OAAO,YAAY,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAY,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC;AAEnE,MAAM,CAAC,MAAM,WAAW,GAAG,GAAqB,EAAE,CAChD,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,GAAG,EAAE,CAAC,IAAI,EACV,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;AAEJ,qBAAqB;AAErB,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EACtB,QAAgB,EAChB,UAII,EAAE,EACM,EAAE;IACd,IAAI,CAAC,eAAe,EAAE;QAAE,MAAM,SAAS,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAE5F,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IAEvC,IAAI,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC;IACnC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC7B,IAAI,EAAE;YAAE,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,MAAM,EAAE,kBAAkB;KAC3B,CAAC;IAEF,8DAA8D;IAC9D,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,sBAAsB,CAAC,GAAG,GAAG,CAAC;IACxC,CAAC;IAED,IAAI,SAA6B,CAAC;IAClC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC7C,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,MAAM;YACN,OAAO;YACP,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,SAAS;YACtB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc;YAC5D,MAAM,SAAS,CAAC,OAAO,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QAChE,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY;YAAE,MAAM,IAAI,SAAS,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;QACpH,MAAM,IAAI,SAAS,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE;YACzG,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAE5E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAChF,MAAM,SAAS,CAAC,WAAW,CAAC,iBAAiB,QAAQ,MAAM,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YACpD,MAAM,SAAS,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACxE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,SAAS,CAAC,QAAQ,CAAC,cAAc,QAAQ,MAAM,SAAS,EAAE,CAAC,CAAC;QAC/F,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YACpD,MAAM,SAAS,CAAC,UAAU,CAAC,qBAAqB,QAAQ,MAAM,SAAS,EAAE,CAAC,CAAC;QAC7E,MAAM,SAAS,CAAC,QAAQ,CAAC,cAAc,QAAQ,CAAC,MAAM,MAAM,QAAQ,MAAM,SAAS,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,EAAO,CAAC;IAC5C,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;AACtC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import type { ToolDefinition } from '@opentabs-dev/plugin-sdk';
|
|
3
|
+
declare class AsanaPlugin extends OpenTabsPlugin {
|
|
4
|
+
readonly name = "asana";
|
|
5
|
+
readonly description = "OpenTabs plugin for Asana";
|
|
6
|
+
readonly displayName = "Asana";
|
|
7
|
+
readonly urlPatterns: string[];
|
|
8
|
+
readonly homepage = "https://asana.com";
|
|
9
|
+
readonly tools: ToolDefinition[];
|
|
10
|
+
isReady(): Promise<boolean>;
|
|
11
|
+
}
|
|
12
|
+
declare const _default: AsanaPlugin;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAuC/D,cAAM,WAAY,SAAQ,cAAc;IACtC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,+BAA+B;IACnD,SAAkB,WAAW,WAAW;IACxC,QAAQ,CAAC,WAAW,WAA2B;IAC/C,SAAkB,QAAQ,uBAAuB;IACjD,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAoC9B;IAEI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAIlC;;AAED,wBAAiC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { isAuthenticated, waitForAuth } from './asana-api.js';
|
|
3
|
+
// Tasks
|
|
4
|
+
import { getTask } from './tools/get-task.js';
|
|
5
|
+
import { createTask } from './tools/create-task.js';
|
|
6
|
+
import { updateTask } from './tools/update-task.js';
|
|
7
|
+
import { deleteTask } from './tools/delete-task.js';
|
|
8
|
+
import { searchTasks } from './tools/search-tasks.js';
|
|
9
|
+
import { getTasksForProject } from './tools/get-tasks-for-project.js';
|
|
10
|
+
import { getTasksForSection } from './tools/get-tasks-for-section.js';
|
|
11
|
+
import { getSubtasks } from './tools/get-subtasks.js';
|
|
12
|
+
import { addFollowers } from './tools/add-followers.js';
|
|
13
|
+
// Projects
|
|
14
|
+
import { listProjects } from './tools/list-projects.js';
|
|
15
|
+
import { getProject } from './tools/get-project.js';
|
|
16
|
+
import { createProject } from './tools/create-project.js';
|
|
17
|
+
import { updateProject } from './tools/update-project.js';
|
|
18
|
+
// Sections
|
|
19
|
+
import { listSections } from './tools/list-sections.js';
|
|
20
|
+
import { createSection } from './tools/create-section.js';
|
|
21
|
+
import { addTaskToSection } from './tools/add-task-to-section.js';
|
|
22
|
+
// Stories (comments)
|
|
23
|
+
import { getStoriesForTask } from './tools/get-stories-for-task.js';
|
|
24
|
+
import { createStory } from './tools/create-story.js';
|
|
25
|
+
// Users
|
|
26
|
+
import { getCurrentUser } from './tools/get-current-user.js';
|
|
27
|
+
import { getUser } from './tools/get-user.js';
|
|
28
|
+
import { listUsersForWorkspace } from './tools/list-users-for-workspace.js';
|
|
29
|
+
// Workspaces, Tags, Teams
|
|
30
|
+
import { listWorkspaces } from './tools/list-workspaces.js';
|
|
31
|
+
import { listTags } from './tools/list-tags.js';
|
|
32
|
+
import { listTeams } from './tools/list-teams.js';
|
|
33
|
+
class AsanaPlugin extends OpenTabsPlugin {
|
|
34
|
+
name = 'asana';
|
|
35
|
+
description = 'OpenTabs plugin for Asana';
|
|
36
|
+
displayName = 'Asana';
|
|
37
|
+
urlPatterns = ['*://app.asana.com/*'];
|
|
38
|
+
homepage = 'https://asana.com';
|
|
39
|
+
tools = [
|
|
40
|
+
// Tasks
|
|
41
|
+
getTask,
|
|
42
|
+
createTask,
|
|
43
|
+
updateTask,
|
|
44
|
+
deleteTask,
|
|
45
|
+
searchTasks,
|
|
46
|
+
getTasksForProject,
|
|
47
|
+
getTasksForSection,
|
|
48
|
+
getSubtasks,
|
|
49
|
+
addFollowers,
|
|
50
|
+
// Projects
|
|
51
|
+
listProjects,
|
|
52
|
+
getProject,
|
|
53
|
+
createProject,
|
|
54
|
+
updateProject,
|
|
55
|
+
// Sections
|
|
56
|
+
listSections,
|
|
57
|
+
createSection,
|
|
58
|
+
addTaskToSection,
|
|
59
|
+
// Stories (comments)
|
|
60
|
+
getStoriesForTask,
|
|
61
|
+
createStory,
|
|
62
|
+
// Users
|
|
63
|
+
getCurrentUser,
|
|
64
|
+
getUser,
|
|
65
|
+
listUsersForWorkspace,
|
|
66
|
+
// Workspaces, Tags, Teams
|
|
67
|
+
listWorkspaces,
|
|
68
|
+
listTags,
|
|
69
|
+
listTeams,
|
|
70
|
+
];
|
|
71
|
+
async isReady() {
|
|
72
|
+
if (isAuthenticated())
|
|
73
|
+
return true;
|
|
74
|
+
return waitForAuth();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export default new AsanaPlugin();
|
|
78
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9D,QAAQ;AACR,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,qBAAqB;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,QAAQ;AACR,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,0BAA0B;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAY,SAAQ,cAAc;IAC7B,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,2BAA2B,CAAC;IACjC,WAAW,GAAG,OAAO,CAAC;IAC/B,WAAW,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC7B,QAAQ,GAAG,mBAAmB,CAAC;IACxC,KAAK,GAAqB;QACjC,QAAQ;QACR,OAAO;QACP,UAAU;QACV,UAAU;QACV,UAAU;QACV,WAAW;QACX,kBAAkB;QAClB,kBAAkB;QAClB,WAAW;QACX,YAAY;QAEZ,WAAW;QACX,YAAY;QACZ,UAAU;QACV,aAAa;QACb,aAAa;QAEb,WAAW;QACX,YAAY;QACZ,aAAa;QACb,gBAAgB;QAEhB,qBAAqB;QACrB,iBAAiB;QACjB,WAAW;QAEX,QAAQ;QACR,cAAc;QACd,OAAO;QACP,qBAAqB;QAErB,0BAA0B;QAC1B,cAAc;QACd,QAAQ;QACR,SAAS;KACV,CAAC;IAEF,KAAK,CAAC,OAAO;QACX,IAAI,eAAe,EAAE;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;CACF;AAED,eAAe,IAAI,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const addFollowers: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
task_gid: z.ZodString;
|
|
4
|
+
followers: z.ZodArray<z.ZodString>;
|
|
5
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
6
|
+
task: z.ZodObject<{
|
|
7
|
+
gid: z.ZodString;
|
|
8
|
+
name: z.ZodString;
|
|
9
|
+
completed: z.ZodBoolean;
|
|
10
|
+
assignee_gid: z.ZodString;
|
|
11
|
+
assignee_name: z.ZodString;
|
|
12
|
+
due_on: z.ZodString;
|
|
13
|
+
due_at: z.ZodString;
|
|
14
|
+
start_on: z.ZodString;
|
|
15
|
+
notes: z.ZodString;
|
|
16
|
+
html_notes: z.ZodString;
|
|
17
|
+
projects: z.ZodArray<z.ZodObject<{
|
|
18
|
+
gid: z.ZodString;
|
|
19
|
+
name: z.ZodString;
|
|
20
|
+
}, z.core.$strip>>;
|
|
21
|
+
tags: z.ZodArray<z.ZodObject<{
|
|
22
|
+
gid: z.ZodString;
|
|
23
|
+
name: z.ZodString;
|
|
24
|
+
}, z.core.$strip>>;
|
|
25
|
+
parent_gid: z.ZodString;
|
|
26
|
+
num_subtasks: z.ZodNumber;
|
|
27
|
+
created_at: z.ZodString;
|
|
28
|
+
modified_at: z.ZodString;
|
|
29
|
+
permalink_url: z.ZodString;
|
|
30
|
+
resource_subtype: z.ZodString;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
}, z.core.$strip>>;
|
|
33
|
+
//# sourceMappingURL=add-followers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-followers.d.ts","sourceRoot":"","sources":["../../src/tools/add-followers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAsBvB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { api } from '../asana-api.js';
|
|
4
|
+
import { TASK_OPT_FIELDS, mapTask, taskSchema } from './schemas.js';
|
|
5
|
+
export const addFollowers = defineTool({
|
|
6
|
+
name: 'add_followers',
|
|
7
|
+
displayName: 'Add Followers',
|
|
8
|
+
description: 'Add followers to a task. Followers receive notifications about task activity.',
|
|
9
|
+
summary: 'Add followers to a task',
|
|
10
|
+
icon: 'user-plus',
|
|
11
|
+
group: 'Tasks',
|
|
12
|
+
input: z.object({
|
|
13
|
+
task_gid: z.string().min(1).describe('Task GID to add followers to'),
|
|
14
|
+
followers: z.array(z.string().min(1)).min(1).describe('Array of user GIDs to add as followers'),
|
|
15
|
+
}),
|
|
16
|
+
output: z.object({
|
|
17
|
+
task: taskSchema.describe('The updated task'),
|
|
18
|
+
}),
|
|
19
|
+
handle: async (params) => {
|
|
20
|
+
const data = await api(`/tasks/${params.task_gid}/addFollowers`, {
|
|
21
|
+
method: 'POST',
|
|
22
|
+
body: { data: { followers: params.followers } },
|
|
23
|
+
query: { opt_fields: TASK_OPT_FIELDS },
|
|
24
|
+
});
|
|
25
|
+
return { task: mapTask(data.data) };
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=add-followers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-followers.js","sourceRoot":"","sources":["../../src/tools/add-followers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAoC,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEtG,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;IACrC,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,+EAA+E;IAC5F,OAAO,EAAE,yBAAyB;IAClC,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACpE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KAChG,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC9C,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAyB,UAAU,MAAM,CAAC,QAAQ,eAAe,EAAE;YACvF,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE;YAC/C,KAAK,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE;SACvC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const addTaskToSection: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
section_gid: z.ZodString;
|
|
4
|
+
task_gid: z.ZodString;
|
|
5
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
6
|
+
success: z.ZodBoolean;
|
|
7
|
+
}, z.core.$strip>>;
|
|
8
|
+
//# sourceMappingURL=add-task-to-section.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-task-to-section.d.ts","sourceRoot":"","sources":["../../src/tools/add-task-to-section.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,gBAAgB;;;;;kBAsB3B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { api } from '../asana-api.js';
|
|
4
|
+
export const addTaskToSection = defineTool({
|
|
5
|
+
name: 'add_task_to_section',
|
|
6
|
+
displayName: 'Add Task to Section',
|
|
7
|
+
description: 'Add a task to a specific section. The task will appear at the top of the section. A task can only be in one section of a given project at a time.',
|
|
8
|
+
summary: 'Move a task into a section',
|
|
9
|
+
icon: 'arrow-right',
|
|
10
|
+
group: 'Sections',
|
|
11
|
+
input: z.object({
|
|
12
|
+
section_gid: z.string().min(1).describe('Section GID to add the task to'),
|
|
13
|
+
task_gid: z.string().min(1).describe('Task GID to add to the section'),
|
|
14
|
+
}),
|
|
15
|
+
output: z.object({
|
|
16
|
+
success: z.boolean().describe('Whether the task was successfully added to the section'),
|
|
17
|
+
}),
|
|
18
|
+
handle: async (params) => {
|
|
19
|
+
await api(`/sections/${params.section_gid}/addTask`, {
|
|
20
|
+
method: 'POST',
|
|
21
|
+
body: { data: { task: params.task_gid } },
|
|
22
|
+
});
|
|
23
|
+
return { success: true };
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=add-task-to-section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-task-to-section.js","sourceRoot":"","sources":["../../src/tools/add-task-to-section.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;IACzC,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,qBAAqB;IAClC,WAAW,EACT,mJAAmJ;IACrJ,OAAO,EAAE,4BAA4B;IACrC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACzE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KACvE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;KACxF,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,GAAG,CAA0B,aAAa,MAAM,CAAC,WAAW,UAAU,EAAE;YAC5E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE;SAC1C,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const createProject: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
workspace_gid: z.ZodString;
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
notes: z.ZodOptional<z.ZodString>;
|
|
6
|
+
color: z.ZodOptional<z.ZodString>;
|
|
7
|
+
team: z.ZodOptional<z.ZodString>;
|
|
8
|
+
due_on: z.ZodOptional<z.ZodString>;
|
|
9
|
+
start_on: z.ZodOptional<z.ZodString>;
|
|
10
|
+
public: z.ZodOptional<z.ZodBoolean>;
|
|
11
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
12
|
+
project: z.ZodObject<{
|
|
13
|
+
gid: z.ZodString;
|
|
14
|
+
name: z.ZodString;
|
|
15
|
+
archived: z.ZodBoolean;
|
|
16
|
+
color: z.ZodString;
|
|
17
|
+
notes: z.ZodString;
|
|
18
|
+
owner_gid: z.ZodString;
|
|
19
|
+
owner_name: z.ZodString;
|
|
20
|
+
team_gid: z.ZodString;
|
|
21
|
+
team_name: z.ZodString;
|
|
22
|
+
created_at: z.ZodString;
|
|
23
|
+
modified_at: z.ZodString;
|
|
24
|
+
due_on: z.ZodString;
|
|
25
|
+
start_on: z.ZodString;
|
|
26
|
+
permalink_url: z.ZodString;
|
|
27
|
+
public: z.ZodBoolean;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
}, z.core.$strip>>;
|
|
30
|
+
//# sourceMappingURL=create-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/tools/create-project.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAwCxB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { api } from '../asana-api.js';
|
|
4
|
+
import { PROJECT_OPT_FIELDS, mapProject, projectSchema } from './schemas.js';
|
|
5
|
+
export const createProject = defineTool({
|
|
6
|
+
name: 'create_project',
|
|
7
|
+
displayName: 'Create Project',
|
|
8
|
+
description: 'Create a new project in a workspace. Requires a workspace GID and project name. Optionally set notes, color, team, dates, and visibility.',
|
|
9
|
+
summary: 'Create a new project in a workspace',
|
|
10
|
+
icon: 'folder-plus',
|
|
11
|
+
group: 'Projects',
|
|
12
|
+
input: z.object({
|
|
13
|
+
workspace_gid: z.string().min(1).describe('Workspace GID to create the project in'),
|
|
14
|
+
name: z.string().min(1).describe('Project name'),
|
|
15
|
+
notes: z.string().optional().describe('Plain-text project description'),
|
|
16
|
+
color: z.string().optional().describe('Project color name (e.g. "light-green", "dark-blue")'),
|
|
17
|
+
team: z.string().optional().describe('Team GID to associate with the project'),
|
|
18
|
+
due_on: z.string().optional().describe('Project due date in YYYY-MM-DD format'),
|
|
19
|
+
start_on: z.string().optional().describe('Project start date in YYYY-MM-DD format'),
|
|
20
|
+
public: z.boolean().optional().describe('Whether the project is public to the workspace'),
|
|
21
|
+
}),
|
|
22
|
+
output: z.object({
|
|
23
|
+
project: projectSchema.describe('The created project'),
|
|
24
|
+
}),
|
|
25
|
+
handle: async (params) => {
|
|
26
|
+
const fields = {
|
|
27
|
+
workspace: params.workspace_gid,
|
|
28
|
+
name: params.name,
|
|
29
|
+
};
|
|
30
|
+
if (params.notes !== undefined)
|
|
31
|
+
fields.notes = params.notes;
|
|
32
|
+
if (params.color !== undefined)
|
|
33
|
+
fields.color = params.color;
|
|
34
|
+
if (params.team !== undefined)
|
|
35
|
+
fields.team = params.team;
|
|
36
|
+
if (params.due_on !== undefined)
|
|
37
|
+
fields.due_on = params.due_on;
|
|
38
|
+
if (params.start_on !== undefined)
|
|
39
|
+
fields.start_on = params.start_on;
|
|
40
|
+
if (params.public !== undefined)
|
|
41
|
+
fields.public = params.public;
|
|
42
|
+
const data = await api('/projects', {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
body: { data: fields },
|
|
45
|
+
query: { opt_fields: PROJECT_OPT_FIELDS },
|
|
46
|
+
});
|
|
47
|
+
return { project: mapProject(data.data) };
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=create-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/tools/create-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const createSection: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
project_gid: z.ZodString;
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
6
|
+
section: z.ZodObject<{
|
|
7
|
+
gid: z.ZodString;
|
|
8
|
+
name: z.ZodString;
|
|
9
|
+
created_at: z.ZodString;
|
|
10
|
+
project_gid: z.ZodString;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
}, z.core.$strip>>;
|
|
13
|
+
//# sourceMappingURL=create-section.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-section.d.ts","sourceRoot":"","sources":["../../src/tools/create-section.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa;;;;;;;;;;kBAsBxB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { api } from '../asana-api.js';
|
|
4
|
+
import { SECTION_OPT_FIELDS, mapSection, sectionSchema } from './schemas.js';
|
|
5
|
+
export const createSection = defineTool({
|
|
6
|
+
name: 'create_section',
|
|
7
|
+
displayName: 'Create Section',
|
|
8
|
+
description: 'Create a new section in a project. Sections organize tasks into groups.',
|
|
9
|
+
summary: 'Create a new section in a project',
|
|
10
|
+
icon: 'plus',
|
|
11
|
+
group: 'Sections',
|
|
12
|
+
input: z.object({
|
|
13
|
+
project_gid: z.string().min(1).describe('Project GID to create the section in'),
|
|
14
|
+
name: z.string().min(1).describe('Section name'),
|
|
15
|
+
}),
|
|
16
|
+
output: z.object({
|
|
17
|
+
section: sectionSchema.describe('The created section'),
|
|
18
|
+
}),
|
|
19
|
+
handle: async (params) => {
|
|
20
|
+
const data = await api(`/projects/${params.project_gid}/sections`, {
|
|
21
|
+
method: 'POST',
|
|
22
|
+
body: { data: { name: params.name } },
|
|
23
|
+
query: { opt_fields: SECTION_OPT_FIELDS },
|
|
24
|
+
});
|
|
25
|
+
return { section: mapSection(data.data) };
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=create-section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-section.js","sourceRoot":"","sources":["../../src/tools/create-section.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAuC,kBAAkB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElH,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,yEAAyE;IACtF,OAAO,EAAE,mCAAmC;IAC5C,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAC/E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;KACjD,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KACvD,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,GAAG,CAA4B,aAAa,MAAM,CAAC,WAAW,WAAW,EAAE;YAC5F,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;YACrC,KAAK,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE;SAC1C,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5C,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const createStory: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
task_gid: z.ZodString;
|
|
4
|
+
text: z.ZodString;
|
|
5
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
6
|
+
story: z.ZodObject<{
|
|
7
|
+
gid: z.ZodString;
|
|
8
|
+
text: z.ZodString;
|
|
9
|
+
created_by_gid: z.ZodString;
|
|
10
|
+
created_by_name: z.ZodString;
|
|
11
|
+
created_at: z.ZodString;
|
|
12
|
+
resource_subtype: z.ZodString;
|
|
13
|
+
type: z.ZodString;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
}, z.core.$strip>>;
|
|
16
|
+
//# sourceMappingURL=create-story.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-story.d.ts","sourceRoot":"","sources":["../../src/tools/create-story.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;kBAsBtB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { api } from '../asana-api.js';
|
|
4
|
+
import { STORY_OPT_FIELDS, mapStory, storySchema } from './schemas.js';
|
|
5
|
+
export const createStory = defineTool({
|
|
6
|
+
name: 'create_story',
|
|
7
|
+
displayName: 'Create Story',
|
|
8
|
+
description: 'Add a comment to a task.',
|
|
9
|
+
summary: 'Add a comment to a task',
|
|
10
|
+
icon: 'message-square-plus',
|
|
11
|
+
group: 'Stories',
|
|
12
|
+
input: z.object({
|
|
13
|
+
task_gid: z.string().min(1).describe('Task GID to add the comment to'),
|
|
14
|
+
text: z.string().min(1).describe('Comment text to post on the task'),
|
|
15
|
+
}),
|
|
16
|
+
output: z.object({
|
|
17
|
+
story: storySchema.describe('The created story'),
|
|
18
|
+
}),
|
|
19
|
+
handle: async (params) => {
|
|
20
|
+
const data = await api(`/tasks/${params.task_gid}/stories`, {
|
|
21
|
+
method: 'POST',
|
|
22
|
+
body: { data: { text: params.text } },
|
|
23
|
+
query: { opt_fields: STORY_OPT_FIELDS },
|
|
24
|
+
});
|
|
25
|
+
return { story: mapStory(data.data) };
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=create-story.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-story.js","sourceRoot":"","sources":["../../src/tools/create-story.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAqC,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1G,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,0BAA0B;IACvC,OAAO,EAAE,yBAAyB;IAClC,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACtE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KACrE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KACjD,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,GAAG,CAA0B,UAAU,MAAM,CAAC,QAAQ,UAAU,EAAE;YACnF,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;YACrC,KAAK,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE;SACxC,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACxC,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const createTask: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
name: z.ZodString;
|
|
4
|
+
workspace: z.ZodString;
|
|
5
|
+
projects: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
6
|
+
assignee: z.ZodOptional<z.ZodString>;
|
|
7
|
+
due_on: z.ZodOptional<z.ZodString>;
|
|
8
|
+
due_at: z.ZodOptional<z.ZodString>;
|
|
9
|
+
start_on: z.ZodOptional<z.ZodString>;
|
|
10
|
+
notes: z.ZodOptional<z.ZodString>;
|
|
11
|
+
parent: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
13
|
+
task: z.ZodObject<{
|
|
14
|
+
gid: z.ZodString;
|
|
15
|
+
name: z.ZodString;
|
|
16
|
+
completed: z.ZodBoolean;
|
|
17
|
+
assignee_gid: z.ZodString;
|
|
18
|
+
assignee_name: z.ZodString;
|
|
19
|
+
due_on: z.ZodString;
|
|
20
|
+
due_at: z.ZodString;
|
|
21
|
+
start_on: z.ZodString;
|
|
22
|
+
notes: z.ZodString;
|
|
23
|
+
html_notes: z.ZodString;
|
|
24
|
+
projects: z.ZodArray<z.ZodObject<{
|
|
25
|
+
gid: z.ZodString;
|
|
26
|
+
name: z.ZodString;
|
|
27
|
+
}, z.core.$strip>>;
|
|
28
|
+
tags: z.ZodArray<z.ZodObject<{
|
|
29
|
+
gid: z.ZodString;
|
|
30
|
+
name: z.ZodString;
|
|
31
|
+
}, z.core.$strip>>;
|
|
32
|
+
parent_gid: z.ZodString;
|
|
33
|
+
num_subtasks: z.ZodNumber;
|
|
34
|
+
created_at: z.ZodString;
|
|
35
|
+
modified_at: z.ZodString;
|
|
36
|
+
permalink_url: z.ZodString;
|
|
37
|
+
resource_subtype: z.ZodString;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
}, z.core.$strip>>;
|
|
40
|
+
//# sourceMappingURL=create-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-task.d.ts","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyCrB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { api } from '../asana-api.js';
|
|
4
|
+
import { TASK_OPT_FIELDS, mapTask, taskSchema } from './schemas.js';
|
|
5
|
+
export const createTask = defineTool({
|
|
6
|
+
name: 'create_task',
|
|
7
|
+
displayName: 'Create Task',
|
|
8
|
+
description: 'Create a new task in a workspace. Optionally assign to a project, user, or parent task.',
|
|
9
|
+
summary: 'Create a new task',
|
|
10
|
+
icon: 'plus',
|
|
11
|
+
group: 'Tasks',
|
|
12
|
+
input: z.object({
|
|
13
|
+
name: z.string().min(1).describe('Task name'),
|
|
14
|
+
workspace: z.string().min(1).describe('Workspace GID to create the task in'),
|
|
15
|
+
projects: z.array(z.string()).optional().describe('Project GIDs to add the task to'),
|
|
16
|
+
assignee: z.string().optional().describe('Assignee user GID'),
|
|
17
|
+
due_on: z.string().optional().describe('Due date in YYYY-MM-DD format'),
|
|
18
|
+
due_at: z.string().optional().describe('Due datetime in ISO 8601 format'),
|
|
19
|
+
start_on: z.string().optional().describe('Start date in YYYY-MM-DD format'),
|
|
20
|
+
notes: z.string().optional().describe('Plain-text task description'),
|
|
21
|
+
parent: z.string().optional().describe('Parent task GID to create as a subtask'),
|
|
22
|
+
}),
|
|
23
|
+
output: z.object({
|
|
24
|
+
task: taskSchema.describe('The created task'),
|
|
25
|
+
}),
|
|
26
|
+
handle: async (params) => {
|
|
27
|
+
const fields = {
|
|
28
|
+
name: params.name,
|
|
29
|
+
workspace: params.workspace,
|
|
30
|
+
};
|
|
31
|
+
if (params.projects !== undefined)
|
|
32
|
+
fields.projects = params.projects;
|
|
33
|
+
if (params.assignee !== undefined)
|
|
34
|
+
fields.assignee = params.assignee;
|
|
35
|
+
if (params.due_on !== undefined)
|
|
36
|
+
fields.due_on = params.due_on;
|
|
37
|
+
if (params.due_at !== undefined)
|
|
38
|
+
fields.due_at = params.due_at;
|
|
39
|
+
if (params.start_on !== undefined)
|
|
40
|
+
fields.start_on = params.start_on;
|
|
41
|
+
if (params.notes !== undefined)
|
|
42
|
+
fields.notes = params.notes;
|
|
43
|
+
if (params.parent !== undefined)
|
|
44
|
+
fields.parent = params.parent;
|
|
45
|
+
const data = await api('/tasks', {
|
|
46
|
+
method: 'POST',
|
|
47
|
+
body: { data: fields },
|
|
48
|
+
query: { opt_fields: TASK_OPT_FIELDS },
|
|
49
|
+
});
|
|
50
|
+
return { task: mapTask(data.data) };
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=create-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-task.js","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"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"}
|