@opentabs-dev/opentabs-plugin-gitlab 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/dist/adapter.iife.js +15367 -0
- package/dist/adapter.iife.js.map +7 -0
- package/dist/gitlab-api.d.ts +13 -0
- package/dist/gitlab-api.d.ts.map +1 -0
- package/dist/gitlab-api.js +114 -0
- package/dist/gitlab-api.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/create-issue.d.ts +27 -0
- package/dist/tools/create-issue.d.ts.map +1 -0
- package/dist/tools/create-issue.js +43 -0
- package/dist/tools/create-issue.js.map +1 -0
- package/dist/tools/create-merge-request.d.ts +32 -0
- package/dist/tools/create-merge-request.d.ts.map +1 -0
- package/dist/tools/create-merge-request.js +52 -0
- package/dist/tools/create-merge-request.js.map +1 -0
- package/dist/tools/create-note.d.ts +20 -0
- package/dist/tools/create-note.d.ts.map +1 -0
- package/dist/tools/create-note.js +26 -0
- package/dist/tools/create-note.js.map +1 -0
- package/dist/tools/get-file-content.d.ts +10 -0
- package/dist/tools/get-file-content.d.ts.map +1 -0
- package/dist/tools/get-file-content.js +33 -0
- package/dist/tools/get-file-content.js.map +1 -0
- package/dist/tools/get-issue.d.ts +22 -0
- package/dist/tools/get-issue.d.ts.map +1 -0
- package/dist/tools/get-issue.js +24 -0
- package/dist/tools/get-issue.js.map +1 -0
- package/dist/tools/get-job-log.d.ts +8 -0
- package/dist/tools/get-job-log.d.ts.map +1 -0
- package/dist/tools/get-job-log.js +23 -0
- package/dist/tools/get-job-log.js.map +1 -0
- package/dist/tools/get-merge-request-diff.d.ts +15 -0
- package/dist/tools/get-merge-request-diff.d.ts.map +1 -0
- package/dist/tools/get-merge-request-diff.js +41 -0
- package/dist/tools/get-merge-request-diff.js.map +1 -0
- package/dist/tools/get-merge-request.d.ts +24 -0
- package/dist/tools/get-merge-request.d.ts.map +1 -0
- package/dist/tools/get-merge-request.js +24 -0
- package/dist/tools/get-merge-request.js.map +1 -0
- package/dist/tools/get-project.d.ts +21 -0
- package/dist/tools/get-project.d.ts.map +1 -0
- package/dist/tools/get-project.js +23 -0
- package/dist/tools/get-project.js.map +1 -0
- package/dist/tools/get-user-profile.d.ts +17 -0
- package/dist/tools/get-user-profile.d.ts.map +1 -0
- package/dist/tools/get-user-profile.js +29 -0
- package/dist/tools/get-user-profile.js.map +1 -0
- package/dist/tools/list-branches.d.ts +16 -0
- package/dist/tools/list-branches.d.ts.map +1 -0
- package/dist/tools/list-branches.js +32 -0
- package/dist/tools/list-branches.js.map +1 -0
- package/dist/tools/list-commits.d.ts +22 -0
- package/dist/tools/list-commits.d.ts.map +1 -0
- package/dist/tools/list-commits.js +41 -0
- package/dist/tools/list-commits.js.map +1 -0
- package/dist/tools/list-issues.d.ts +40 -0
- package/dist/tools/list-issues.d.ts.map +1 -0
- package/dist/tools/list-issues.js +49 -0
- package/dist/tools/list-issues.js.map +1 -0
- package/dist/tools/list-merge-requests.d.ts +46 -0
- package/dist/tools/list-merge-requests.d.ts.map +1 -0
- package/dist/tools/list-merge-requests.js +56 -0
- package/dist/tools/list-merge-requests.js.map +1 -0
- package/dist/tools/list-notes.d.ts +29 -0
- package/dist/tools/list-notes.d.ts.map +1 -0
- package/dist/tools/list-notes.js +35 -0
- package/dist/tools/list-notes.js.map +1 -0
- package/dist/tools/list-pipeline-jobs.d.ts +20 -0
- package/dist/tools/list-pipeline-jobs.d.ts.map +1 -0
- package/dist/tools/list-pipeline-jobs.js +30 -0
- package/dist/tools/list-pipeline-jobs.js.map +1 -0
- package/dist/tools/list-pipelines.d.ts +42 -0
- package/dist/tools/list-pipelines.d.ts.map +1 -0
- package/dist/tools/list-pipelines.js +47 -0
- package/dist/tools/list-pipelines.js.map +1 -0
- package/dist/tools/list-projects.d.ts +42 -0
- package/dist/tools/list-projects.d.ts.map +1 -0
- package/dist/tools/list-projects.js +47 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/merge-merge-request.d.ts +28 -0
- package/dist/tools/merge-merge-request.d.ts.map +1 -0
- package/dist/tools/merge-merge-request.js +37 -0
- package/dist/tools/merge-merge-request.js.map +1 -0
- package/dist/tools/schemas.d.ts +326 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +213 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/search-projects.d.ts +35 -0
- package/dist/tools/search-projects.d.ts.map +1 -0
- package/dist/tools/search-projects.js +37 -0
- package/dist/tools/search-projects.js.map +1 -0
- package/dist/tools/update-issue.d.ts +32 -0
- package/dist/tools/update-issue.d.ts.map +1 -0
- package/dist/tools/update-issue.js +46 -0
- package/dist/tools/update-issue.js.map +1 -0
- package/dist/tools/update-merge-request.d.ts +35 -0
- package/dist/tools/update-merge-request.d.ts.map +1 -0
- package/dist/tools/update-merge-request.js +49 -0
- package/dist/tools/update-merge-request.js.map +1 -0
- package/dist/tools.json +2661 -0
- package/package.json +55 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const isAuthenticated: () => boolean;
|
|
2
|
+
export declare const waitForAuth: () => Promise<boolean>;
|
|
3
|
+
export declare const getUsername: () => string;
|
|
4
|
+
export declare const api: <T>(endpoint: string, options?: {
|
|
5
|
+
method?: string;
|
|
6
|
+
body?: Record<string, unknown>;
|
|
7
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
8
|
+
}) => Promise<T>;
|
|
9
|
+
export declare const apiRaw: (endpoint: string, options?: {
|
|
10
|
+
method?: string;
|
|
11
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
12
|
+
}) => Promise<string>;
|
|
13
|
+
//# sourceMappingURL=gitlab-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab-api.d.ts","sourceRoot":"","sources":["../src/gitlab-api.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,eAAe,QAAO,OAA6B,CAAC;AAEjE,eAAO,MAAM,WAAW,QAAO,OAAO,CAAC,OAAO,CAI3C,CAAC;AAEJ,eAAO,MAAM,WAAW,QAAO,MAI9B,CAAC;AAqEF,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,CAsBX,CAAC;AAGF,eAAO,MAAM,MAAM,GACjB,UAAU,MAAM,EAChB,UAAS;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;CAC1D,KACL,OAAO,CAAC,MAAM,CAMhB,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { ToolError, getMetaContent, getPageGlobal, parseRetryAfterMs, waitUntil } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
const API_BASE = 'https://gitlab.com/api/v4';
|
|
3
|
+
// --- Auth detection ---
|
|
4
|
+
// GitLab injects a <meta name="csrf-token"> tag for CSRF protection on
|
|
5
|
+
// mutating requests, and user info is embedded in the gon global object
|
|
6
|
+
// (window.gon). Auth is detected via the gon object which contains the
|
|
7
|
+
// current user's username when logged in.
|
|
8
|
+
const getAuth = () => {
|
|
9
|
+
const username = getPageGlobal('gon.current_username');
|
|
10
|
+
if (typeof username !== 'string' || !username)
|
|
11
|
+
return null;
|
|
12
|
+
return { username };
|
|
13
|
+
};
|
|
14
|
+
export const isAuthenticated = () => getAuth() !== null;
|
|
15
|
+
export const waitForAuth = () => waitUntil(() => isAuthenticated(), { interval: 500, timeout: 5000 }).then(() => true, () => false);
|
|
16
|
+
export const getUsername = () => {
|
|
17
|
+
const auth = getAuth();
|
|
18
|
+
if (!auth)
|
|
19
|
+
throw ToolError.auth('Not authenticated — please log in to GitLab.');
|
|
20
|
+
return auth.username;
|
|
21
|
+
};
|
|
22
|
+
const getCsrfToken = () => getMetaContent('csrf-token');
|
|
23
|
+
// --- Shared fetch helpers ---
|
|
24
|
+
const buildUrl = (endpoint, query) => {
|
|
25
|
+
let url = `${API_BASE}${endpoint}`;
|
|
26
|
+
if (query) {
|
|
27
|
+
const params = new URLSearchParams();
|
|
28
|
+
for (const [key, value] of Object.entries(query)) {
|
|
29
|
+
if (value !== undefined)
|
|
30
|
+
params.append(key, String(value));
|
|
31
|
+
}
|
|
32
|
+
const qs = params.toString();
|
|
33
|
+
if (qs)
|
|
34
|
+
url += `?${qs}`;
|
|
35
|
+
}
|
|
36
|
+
return url;
|
|
37
|
+
};
|
|
38
|
+
const handleFetchError = (err, endpoint) => {
|
|
39
|
+
if (err instanceof DOMException && err.name === 'TimeoutError')
|
|
40
|
+
throw ToolError.timeout(`API request timed out: ${endpoint}`);
|
|
41
|
+
if (err instanceof DOMException && err.name === 'AbortError')
|
|
42
|
+
throw new ToolError('Request was aborted', 'aborted');
|
|
43
|
+
throw new ToolError(`Network error: ${err instanceof Error ? err.message : String(err)}`, 'network_error', {
|
|
44
|
+
category: 'internal',
|
|
45
|
+
retryable: true,
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
const handleHttpError = async (response, endpoint) => {
|
|
49
|
+
const errorBody = (await response.text().catch(() => '')).substring(0, 512);
|
|
50
|
+
if (response.status === 429) {
|
|
51
|
+
const retryAfter = response.headers.get('Retry-After');
|
|
52
|
+
const retryMs = retryAfter !== null ? parseRetryAfterMs(retryAfter) : undefined;
|
|
53
|
+
throw ToolError.rateLimited(`Rate limited: ${endpoint} — ${errorBody}`, retryMs);
|
|
54
|
+
}
|
|
55
|
+
if (response.status === 401 || response.status === 403)
|
|
56
|
+
throw ToolError.auth(`Auth error (${response.status}): ${errorBody}`);
|
|
57
|
+
if (response.status === 404)
|
|
58
|
+
throw ToolError.notFound(`Not found: ${endpoint} — ${errorBody}`);
|
|
59
|
+
if (response.status === 422)
|
|
60
|
+
throw ToolError.validation(`Validation error: ${endpoint} — ${errorBody}`);
|
|
61
|
+
throw ToolError.internal(`API error (${response.status}): ${endpoint} — ${errorBody}`);
|
|
62
|
+
};
|
|
63
|
+
const requireAuth = () => {
|
|
64
|
+
if (!getAuth())
|
|
65
|
+
throw ToolError.auth('Not authenticated — please log in to GitLab.');
|
|
66
|
+
};
|
|
67
|
+
// --- Shared fetch wrapper ---
|
|
68
|
+
const doFetch = async (url, endpoint, init) => {
|
|
69
|
+
let response;
|
|
70
|
+
try {
|
|
71
|
+
response = await fetch(url, {
|
|
72
|
+
...init,
|
|
73
|
+
credentials: 'include',
|
|
74
|
+
signal: AbortSignal.timeout(30_000),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
// handleFetchError always throws; re-throw to satisfy control flow analysis.
|
|
79
|
+
throw handleFetchError(err, endpoint);
|
|
80
|
+
}
|
|
81
|
+
if (!response.ok)
|
|
82
|
+
await handleHttpError(response, endpoint);
|
|
83
|
+
return response;
|
|
84
|
+
};
|
|
85
|
+
// --- API callers ---
|
|
86
|
+
export const api = async (endpoint, options = {}) => {
|
|
87
|
+
requireAuth();
|
|
88
|
+
const url = buildUrl(endpoint, options.query);
|
|
89
|
+
const headers = { Accept: 'application/json' };
|
|
90
|
+
let fetchBody;
|
|
91
|
+
if (options.body) {
|
|
92
|
+
headers['Content-Type'] = 'application/json';
|
|
93
|
+
fetchBody = JSON.stringify(options.body);
|
|
94
|
+
}
|
|
95
|
+
// GitLab requires a CSRF token for mutating requests when using session cookies.
|
|
96
|
+
const method = options.method ?? 'GET';
|
|
97
|
+
if (method !== 'GET') {
|
|
98
|
+
const csrf = getCsrfToken();
|
|
99
|
+
if (csrf)
|
|
100
|
+
headers['X-CSRF-Token'] = csrf;
|
|
101
|
+
}
|
|
102
|
+
const response = await doFetch(url, endpoint, { method, headers, body: fetchBody });
|
|
103
|
+
if (response.status === 204)
|
|
104
|
+
return {};
|
|
105
|
+
return (await response.json());
|
|
106
|
+
};
|
|
107
|
+
// Variant that returns raw text (for job logs, etc.)
|
|
108
|
+
export const apiRaw = async (endpoint, options = {}) => {
|
|
109
|
+
requireAuth();
|
|
110
|
+
const url = buildUrl(endpoint, options.query);
|
|
111
|
+
const response = await doFetch(url, endpoint, { method: options.method ?? 'GET' });
|
|
112
|
+
return response.text();
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=gitlab-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab-api.js","sourceRoot":"","sources":["../src/gitlab-api.ts"],"names":[],"mappings":"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"}
|
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 GitLabPlugin extends OpenTabsPlugin {
|
|
4
|
+
readonly name = "gitlab";
|
|
5
|
+
readonly description = "OpenTabs plugin for GitLab";
|
|
6
|
+
readonly displayName = "GitLab";
|
|
7
|
+
readonly urlPatterns: string[];
|
|
8
|
+
readonly homepage = "https://gitlab.com";
|
|
9
|
+
readonly tools: ToolDefinition[];
|
|
10
|
+
isReady(): Promise<boolean>;
|
|
11
|
+
}
|
|
12
|
+
declare const _default: GitLabPlugin;
|
|
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;AAyB/D,cAAM,YAAa,SAAQ,cAAc;IACvC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,gCAAgC;IACpD,SAAkB,WAAW,YAAY;IACzC,QAAQ,CAAC,WAAW,WAAwB;IAC5C,SAAkB,QAAQ,wBAAwB;IAClD,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CA+B9B;IAEI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAIlC;;AAED,wBAAkC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { isAuthenticated, waitForAuth } from './gitlab-api.js';
|
|
3
|
+
import { createIssue } from './tools/create-issue.js';
|
|
4
|
+
import { createMergeRequest } from './tools/create-merge-request.js';
|
|
5
|
+
import { createNote } from './tools/create-note.js';
|
|
6
|
+
import { getFileContent } from './tools/get-file-content.js';
|
|
7
|
+
import { getIssue } from './tools/get-issue.js';
|
|
8
|
+
import { getJobLog } from './tools/get-job-log.js';
|
|
9
|
+
import { getMergeRequest } from './tools/get-merge-request.js';
|
|
10
|
+
import { getMergeRequestDiff } from './tools/get-merge-request-diff.js';
|
|
11
|
+
import { getProject } from './tools/get-project.js';
|
|
12
|
+
import { getUserProfile } from './tools/get-user-profile.js';
|
|
13
|
+
import { listBranches } from './tools/list-branches.js';
|
|
14
|
+
import { listCommits } from './tools/list-commits.js';
|
|
15
|
+
import { listIssues } from './tools/list-issues.js';
|
|
16
|
+
import { listMergeRequests } from './tools/list-merge-requests.js';
|
|
17
|
+
import { listNotes } from './tools/list-notes.js';
|
|
18
|
+
import { listPipelineJobs } from './tools/list-pipeline-jobs.js';
|
|
19
|
+
import { listPipelines } from './tools/list-pipelines.js';
|
|
20
|
+
import { listProjects } from './tools/list-projects.js';
|
|
21
|
+
import { mergeMergeRequest } from './tools/merge-merge-request.js';
|
|
22
|
+
import { searchProjects } from './tools/search-projects.js';
|
|
23
|
+
import { updateIssue } from './tools/update-issue.js';
|
|
24
|
+
import { updateMergeRequest } from './tools/update-merge-request.js';
|
|
25
|
+
class GitLabPlugin extends OpenTabsPlugin {
|
|
26
|
+
name = 'gitlab';
|
|
27
|
+
description = 'OpenTabs plugin for GitLab';
|
|
28
|
+
displayName = 'GitLab';
|
|
29
|
+
urlPatterns = ['*://gitlab.com/*'];
|
|
30
|
+
homepage = 'https://gitlab.com';
|
|
31
|
+
tools = [
|
|
32
|
+
// Projects
|
|
33
|
+
listProjects,
|
|
34
|
+
getProject,
|
|
35
|
+
searchProjects,
|
|
36
|
+
// Issues
|
|
37
|
+
listIssues,
|
|
38
|
+
getIssue,
|
|
39
|
+
createIssue,
|
|
40
|
+
updateIssue,
|
|
41
|
+
// Merge Requests
|
|
42
|
+
listMergeRequests,
|
|
43
|
+
getMergeRequest,
|
|
44
|
+
createMergeRequest,
|
|
45
|
+
updateMergeRequest,
|
|
46
|
+
mergeMergeRequest,
|
|
47
|
+
getMergeRequestDiff,
|
|
48
|
+
// Notes (Comments)
|
|
49
|
+
listNotes,
|
|
50
|
+
createNote,
|
|
51
|
+
// Branches
|
|
52
|
+
listBranches,
|
|
53
|
+
// Content
|
|
54
|
+
getFileContent,
|
|
55
|
+
listCommits,
|
|
56
|
+
// CI/CD
|
|
57
|
+
listPipelines,
|
|
58
|
+
listPipelineJobs,
|
|
59
|
+
getJobLog,
|
|
60
|
+
// Users
|
|
61
|
+
getUserProfile,
|
|
62
|
+
];
|
|
63
|
+
async isReady() {
|
|
64
|
+
if (isAuthenticated())
|
|
65
|
+
return true;
|
|
66
|
+
return waitForAuth();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export default new GitLabPlugin();
|
|
70
|
+
//# 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,iBAAiB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,MAAM,YAAa,SAAQ,cAAc;IAC9B,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,4BAA4B,CAAC;IAClC,WAAW,GAAG,QAAQ,CAAC;IAChC,WAAW,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC1B,QAAQ,GAAG,oBAAoB,CAAC;IACzC,KAAK,GAAqB;QACjC,WAAW;QACX,YAAY;QACZ,UAAU;QACV,cAAc;QACd,SAAS;QACT,UAAU;QACV,QAAQ;QACR,WAAW;QACX,WAAW;QACX,iBAAiB;QACjB,iBAAiB;QACjB,eAAe;QACf,kBAAkB;QAClB,kBAAkB;QAClB,iBAAiB;QACjB,mBAAmB;QACnB,mBAAmB;QACnB,SAAS;QACT,UAAU;QACV,WAAW;QACX,YAAY;QACZ,UAAU;QACV,cAAc;QACd,WAAW;QACX,QAAQ;QACR,aAAa;QACb,gBAAgB;QAChB,SAAS;QACT,QAAQ;QACR,cAAc;KACf,CAAC;IAEF,KAAK,CAAC,OAAO;QACX,IAAI,eAAe,EAAE;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;CACF;AAED,eAAe,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const createIssue: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
project: z.ZodString;
|
|
4
|
+
title: z.ZodString;
|
|
5
|
+
description: z.ZodOptional<z.ZodString>;
|
|
6
|
+
labels: z.ZodOptional<z.ZodString>;
|
|
7
|
+
assignee_ids: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
|
|
8
|
+
milestone_id: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
confidential: z.ZodOptional<z.ZodBoolean>;
|
|
10
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
11
|
+
issue: z.ZodObject<{
|
|
12
|
+
iid: z.ZodNumber;
|
|
13
|
+
title: z.ZodString;
|
|
14
|
+
state: z.ZodString;
|
|
15
|
+
description: z.ZodString;
|
|
16
|
+
web_url: z.ZodString;
|
|
17
|
+
author_username: z.ZodString;
|
|
18
|
+
labels: z.ZodArray<z.ZodString>;
|
|
19
|
+
assignees: z.ZodArray<z.ZodString>;
|
|
20
|
+
milestone_title: z.ZodString;
|
|
21
|
+
confidential: z.ZodBoolean;
|
|
22
|
+
created_at: z.ZodString;
|
|
23
|
+
updated_at: z.ZodString;
|
|
24
|
+
closed_at: z.ZodString;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
}, z.core.$strip>>;
|
|
27
|
+
//# sourceMappingURL=create-issue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-issue.d.ts","sourceRoot":"","sources":["../../src/tools/create-issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;kBAiCtB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { api } from '../gitlab-api.js';
|
|
4
|
+
import { issueSchema, mapIssue } from './schemas.js';
|
|
5
|
+
export const createIssue = defineTool({
|
|
6
|
+
name: 'create_issue',
|
|
7
|
+
displayName: 'Create Issue',
|
|
8
|
+
description: 'Create a new issue in a project.',
|
|
9
|
+
summary: 'Create a new issue',
|
|
10
|
+
icon: 'plus-circle',
|
|
11
|
+
group: 'Issues',
|
|
12
|
+
input: z.object({
|
|
13
|
+
project: z.string().min(1).describe('Project path (e.g., "group/project") or numeric project ID'),
|
|
14
|
+
title: z.string().min(1).describe('Issue title'),
|
|
15
|
+
description: z.string().optional().describe('Issue description in Markdown'),
|
|
16
|
+
labels: z.string().optional().describe('Comma-separated list of label names'),
|
|
17
|
+
assignee_ids: z.array(z.number()).optional().describe('User IDs to assign'),
|
|
18
|
+
milestone_id: z.number().optional().describe('Milestone ID'),
|
|
19
|
+
confidential: z.boolean().optional().describe('Whether the issue is confidential'),
|
|
20
|
+
}),
|
|
21
|
+
output: z.object({
|
|
22
|
+
issue: issueSchema.describe('The created issue'),
|
|
23
|
+
}),
|
|
24
|
+
handle: async (params) => {
|
|
25
|
+
const body = { title: params.title };
|
|
26
|
+
if (params.description !== undefined)
|
|
27
|
+
body.description = params.description;
|
|
28
|
+
if (params.labels !== undefined)
|
|
29
|
+
body.labels = params.labels;
|
|
30
|
+
if (params.assignee_ids !== undefined)
|
|
31
|
+
body.assignee_ids = params.assignee_ids;
|
|
32
|
+
if (params.milestone_id !== undefined)
|
|
33
|
+
body.milestone_id = params.milestone_id;
|
|
34
|
+
if (params.confidential !== undefined)
|
|
35
|
+
body.confidential = params.confidential;
|
|
36
|
+
const data = await api(`/projects/${encodeURIComponent(params.project)}/issues`, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
body,
|
|
39
|
+
});
|
|
40
|
+
return { issue: mapIssue(data) };
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=create-issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-issue.js","sourceRoot":"","sources":["../../src/tools/create-issue.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,kBAAkB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,kCAAkC;IAC/C,OAAO,EAAE,oBAAoB;IAC7B,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QACjG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;QAChD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC5E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QAC7E,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC3E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC5D,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KACnF,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,GAA4B,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAC5E,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7D,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC/E,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC/E,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAE/E,MAAM,IAAI,GAAG,MAAM,GAAG,CAA0B,aAAa,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE;YACxG,MAAM,EAAE,MAAM;YACd,IAAI;SACL,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnC,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const createMergeRequest: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
project: z.ZodString;
|
|
4
|
+
title: z.ZodString;
|
|
5
|
+
source_branch: z.ZodString;
|
|
6
|
+
target_branch: z.ZodString;
|
|
7
|
+
description: z.ZodOptional<z.ZodString>;
|
|
8
|
+
labels: z.ZodOptional<z.ZodString>;
|
|
9
|
+
assignee_id: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
milestone_id: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
remove_source_branch: z.ZodOptional<z.ZodBoolean>;
|
|
12
|
+
squash: z.ZodOptional<z.ZodBoolean>;
|
|
13
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
14
|
+
merge_request: z.ZodObject<{
|
|
15
|
+
iid: z.ZodNumber;
|
|
16
|
+
title: z.ZodString;
|
|
17
|
+
state: z.ZodString;
|
|
18
|
+
description: z.ZodString;
|
|
19
|
+
web_url: z.ZodString;
|
|
20
|
+
author_username: z.ZodString;
|
|
21
|
+
source_branch: z.ZodString;
|
|
22
|
+
target_branch: z.ZodString;
|
|
23
|
+
labels: z.ZodArray<z.ZodString>;
|
|
24
|
+
draft: z.ZodBoolean;
|
|
25
|
+
merged_by_username: z.ZodString;
|
|
26
|
+
merge_status: z.ZodString;
|
|
27
|
+
has_conflicts: z.ZodBoolean;
|
|
28
|
+
created_at: z.ZodString;
|
|
29
|
+
updated_at: z.ZodString;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
}, z.core.$strip>>;
|
|
32
|
+
//# sourceMappingURL=create-merge-request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-merge-request.d.ts","sourceRoot":"","sources":["../../src/tools/create-merge-request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyC7B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { api } from '../gitlab-api.js';
|
|
4
|
+
import { mapMergeRequest, mergeRequestSchema } from './schemas.js';
|
|
5
|
+
export const createMergeRequest = defineTool({
|
|
6
|
+
name: 'create_merge_request',
|
|
7
|
+
displayName: 'Create Merge Request',
|
|
8
|
+
description: 'Create a new merge request in a project.',
|
|
9
|
+
summary: 'Create a new merge request',
|
|
10
|
+
icon: 'git-pull-request-arrow',
|
|
11
|
+
group: 'Merge Requests',
|
|
12
|
+
input: z.object({
|
|
13
|
+
project: z.string().min(1).describe('Project path (e.g., "group/project") or numeric project ID'),
|
|
14
|
+
title: z.string().min(1).describe('Merge request title'),
|
|
15
|
+
source_branch: z.string().min(1).describe('Source branch name'),
|
|
16
|
+
target_branch: z.string().min(1).describe('Target branch name'),
|
|
17
|
+
description: z.string().optional().describe('MR description in Markdown'),
|
|
18
|
+
labels: z.string().optional().describe('Comma-separated list of label names'),
|
|
19
|
+
assignee_id: z.number().optional().describe('User ID to assign'),
|
|
20
|
+
milestone_id: z.number().optional().describe('Milestone ID'),
|
|
21
|
+
remove_source_branch: z.boolean().optional().describe('Delete source branch after merge'),
|
|
22
|
+
squash: z.boolean().optional().describe('Squash commits when merging'),
|
|
23
|
+
}),
|
|
24
|
+
output: z.object({
|
|
25
|
+
merge_request: mergeRequestSchema.describe('The created merge request'),
|
|
26
|
+
}),
|
|
27
|
+
handle: async (params) => {
|
|
28
|
+
const body = {
|
|
29
|
+
title: params.title,
|
|
30
|
+
source_branch: params.source_branch,
|
|
31
|
+
target_branch: params.target_branch,
|
|
32
|
+
};
|
|
33
|
+
if (params.description !== undefined)
|
|
34
|
+
body.description = params.description;
|
|
35
|
+
if (params.labels !== undefined)
|
|
36
|
+
body.labels = params.labels;
|
|
37
|
+
if (params.assignee_id !== undefined)
|
|
38
|
+
body.assignee_id = params.assignee_id;
|
|
39
|
+
if (params.milestone_id !== undefined)
|
|
40
|
+
body.milestone_id = params.milestone_id;
|
|
41
|
+
if (params.remove_source_branch !== undefined)
|
|
42
|
+
body.remove_source_branch = params.remove_source_branch;
|
|
43
|
+
if (params.squash !== undefined)
|
|
44
|
+
body.squash = params.squash;
|
|
45
|
+
const data = await api(`/projects/${encodeURIComponent(params.project)}/merge_requests`, {
|
|
46
|
+
method: 'POST',
|
|
47
|
+
body,
|
|
48
|
+
});
|
|
49
|
+
return { merge_request: mapMergeRequest(data) };
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=create-merge-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-merge-request.js","sourceRoot":"","sources":["../../src/tools/create-merge-request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const createNote: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
project: z.ZodString;
|
|
4
|
+
noteable_type: z.ZodEnum<{
|
|
5
|
+
issues: "issues";
|
|
6
|
+
merge_requests: "merge_requests";
|
|
7
|
+
}>;
|
|
8
|
+
noteable_iid: z.ZodNumber;
|
|
9
|
+
body: z.ZodString;
|
|
10
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
11
|
+
note: z.ZodObject<{
|
|
12
|
+
id: z.ZodNumber;
|
|
13
|
+
body: z.ZodString;
|
|
14
|
+
author_username: z.ZodString;
|
|
15
|
+
system: z.ZodBoolean;
|
|
16
|
+
created_at: z.ZodString;
|
|
17
|
+
updated_at: z.ZodString;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
}, z.core.$strip>>;
|
|
20
|
+
//# sourceMappingURL=create-note.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-note.d.ts","sourceRoot":"","sources":["../../src/tools/create-note.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;kBAuBrB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { api } from '../gitlab-api.js';
|
|
4
|
+
import { mapNote, noteSchema } from './schemas.js';
|
|
5
|
+
export const createNote = defineTool({
|
|
6
|
+
name: 'create_note',
|
|
7
|
+
displayName: 'Create Note',
|
|
8
|
+
description: 'Add a comment (note) to an issue or merge request.',
|
|
9
|
+
summary: 'Add a comment to an issue or MR',
|
|
10
|
+
icon: 'message-square-plus',
|
|
11
|
+
group: 'Notes',
|
|
12
|
+
input: z.object({
|
|
13
|
+
project: z.string().min(1).describe('Project path (e.g., "group/project") or numeric project ID'),
|
|
14
|
+
noteable_type: z.enum(['issues', 'merge_requests']).describe('Type of the noteable: "issues" or "merge_requests"'),
|
|
15
|
+
noteable_iid: z.number().int().min(1).describe('IID of the issue or merge request'),
|
|
16
|
+
body: z.string().min(1).describe('Note body in Markdown'),
|
|
17
|
+
}),
|
|
18
|
+
output: z.object({
|
|
19
|
+
note: noteSchema.describe('The created note'),
|
|
20
|
+
}),
|
|
21
|
+
handle: async (params) => {
|
|
22
|
+
const data = await api(`/projects/${encodeURIComponent(params.project)}/${params.noteable_type}/${params.noteable_iid}/notes`, { method: 'POST', body: { body: params.body } });
|
|
23
|
+
return { note: mapNote(data) };
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=create-note.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-note.js","sourceRoot":"","sources":["../../src/tools/create-note.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,kBAAkB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,oDAAoD;IACjE,OAAO,EAAE,iCAAiC;IAC1C,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QACjG,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,oDAAoD,CAAC;QAClH,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACnF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KAC1D,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,CACpB,aAAa,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,YAAY,QAAQ,EACtG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAChD,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IACjC,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getFileContent: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
project: z.ZodString;
|
|
4
|
+
file_path: z.ZodString;
|
|
5
|
+
ref: z.ZodOptional<z.ZodString>;
|
|
6
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
7
|
+
content: z.ZodString;
|
|
8
|
+
file_path: z.ZodString;
|
|
9
|
+
}, z.core.$strip>>;
|
|
10
|
+
//# sourceMappingURL=get-file-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-file-content.d.ts","sourceRoot":"","sources":["../../src/tools/get-file-content.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,cAAc;;;;;;;kBAmCzB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { api } from '../gitlab-api.js';
|
|
4
|
+
export const getFileContent = defineTool({
|
|
5
|
+
name: 'get_file_content',
|
|
6
|
+
displayName: 'Get File Content',
|
|
7
|
+
description: 'Read a file from a repository. Returns the decoded content as text. Use the ref parameter to read from a specific branch or commit.',
|
|
8
|
+
summary: 'Read a file from a repository',
|
|
9
|
+
icon: 'file-text',
|
|
10
|
+
group: 'Content',
|
|
11
|
+
input: z.object({
|
|
12
|
+
project: z.string().min(1).describe('Project path (e.g., "group/project") or numeric project ID'),
|
|
13
|
+
file_path: z.string().min(1).describe('File path relative to repository root (e.g., "src/index.ts")'),
|
|
14
|
+
ref: z.string().optional().describe('Branch name, tag, or commit SHA (defaults to the default branch)'),
|
|
15
|
+
}),
|
|
16
|
+
output: z.object({
|
|
17
|
+
content: z.string().describe('Decoded file content as text'),
|
|
18
|
+
file_path: z.string().describe('File path'),
|
|
19
|
+
}),
|
|
20
|
+
handle: async (params) => {
|
|
21
|
+
const query = {
|
|
22
|
+
ref: params.ref ?? 'HEAD',
|
|
23
|
+
};
|
|
24
|
+
const encodedPath = encodeURIComponent(params.file_path);
|
|
25
|
+
const data = await api(`/projects/${encodeURIComponent(params.project)}/repository/files/${encodedPath}`, { query });
|
|
26
|
+
let content = data.content ?? '';
|
|
27
|
+
if (data.encoding === 'base64' && content) {
|
|
28
|
+
content = atob(content);
|
|
29
|
+
}
|
|
30
|
+
return { content, file_path: data.file_path ?? params.file_path };
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=get-file-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-file-content.js","sourceRoot":"","sources":["../../src/tools/get-file-content.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,kBAAkB,CAAC;AASvC,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,kBAAkB;IAC/B,WAAW,EACT,qIAAqI;IACvI,OAAO,EAAE,+BAA+B;IACxC,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QACjG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,8DAA8D,CAAC;QACrG,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;KACxG,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC5D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;KAC5C,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,KAAK,GAA0D;YACnE,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,MAAM;SAC1B,CAAC;QAEF,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,GAAG,CACpB,aAAa,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,WAAW,EAAE,EACjF,EAAE,KAAK,EAAE,CACV,CAAC;QAEF,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC1C,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;IACpE,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getIssue: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
project: z.ZodString;
|
|
4
|
+
issue_iid: z.ZodNumber;
|
|
5
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
6
|
+
issue: z.ZodObject<{
|
|
7
|
+
iid: z.ZodNumber;
|
|
8
|
+
title: z.ZodString;
|
|
9
|
+
state: z.ZodString;
|
|
10
|
+
description: z.ZodString;
|
|
11
|
+
web_url: z.ZodString;
|
|
12
|
+
author_username: z.ZodString;
|
|
13
|
+
labels: z.ZodArray<z.ZodString>;
|
|
14
|
+
assignees: z.ZodArray<z.ZodString>;
|
|
15
|
+
milestone_title: z.ZodString;
|
|
16
|
+
confidential: z.ZodBoolean;
|
|
17
|
+
created_at: z.ZodString;
|
|
18
|
+
updated_at: z.ZodString;
|
|
19
|
+
closed_at: z.ZodString;
|
|
20
|
+
}, z.core.$strip>;
|
|
21
|
+
}, z.core.$strip>>;
|
|
22
|
+
//# sourceMappingURL=get-issue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-issue.d.ts","sourceRoot":"","sources":["../../src/tools/get-issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;kBAoBnB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { api } from '../gitlab-api.js';
|
|
4
|
+
import { issueSchema, mapIssue } from './schemas.js';
|
|
5
|
+
export const getIssue = defineTool({
|
|
6
|
+
name: 'get_issue',
|
|
7
|
+
displayName: 'Get Issue',
|
|
8
|
+
description: 'Get detailed information about a specific issue.',
|
|
9
|
+
summary: 'Get issue details',
|
|
10
|
+
icon: 'circle-dot',
|
|
11
|
+
group: 'Issues',
|
|
12
|
+
input: z.object({
|
|
13
|
+
project: z.string().min(1).describe('Project path (e.g., "group/project") or numeric project ID'),
|
|
14
|
+
issue_iid: z.number().int().min(1).describe('Issue IID (project-scoped ID)'),
|
|
15
|
+
}),
|
|
16
|
+
output: z.object({
|
|
17
|
+
issue: issueSchema.describe('The issue'),
|
|
18
|
+
}),
|
|
19
|
+
handle: async (params) => {
|
|
20
|
+
const data = await api(`/projects/${encodeURIComponent(params.project)}/issues/${params.issue_iid}`);
|
|
21
|
+
return { issue: mapIssue(data) };
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=get-issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-issue.js","sourceRoot":"","sources":["../../src/tools/get-issue.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,kBAAkB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;IACjC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,kDAAkD;IAC/D,OAAO,EAAE,mBAAmB;IAC5B,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QACjG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KAC7E,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC;KACzC,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,GAAG,CACpB,aAAa,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,MAAM,CAAC,SAAS,EAAE,CAC7E,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnC,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getJobLog: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
project: z.ZodString;
|
|
4
|
+
job_id: z.ZodNumber;
|
|
5
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
6
|
+
log: z.ZodString;
|
|
7
|
+
}, z.core.$strip>>;
|
|
8
|
+
//# sourceMappingURL=get-job-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-job-log.d.ts","sourceRoot":"","sources":["../../src/tools/get-job-log.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,SAAS;;;;;kBAkBpB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { apiRaw } from '../gitlab-api.js';
|
|
4
|
+
export const getJobLog = defineTool({
|
|
5
|
+
name: 'get_job_log',
|
|
6
|
+
displayName: 'Get Job Log',
|
|
7
|
+
description: 'Get the log (trace) output of a CI/CD job. Returns the raw log text.',
|
|
8
|
+
summary: 'Get the log output of a job',
|
|
9
|
+
icon: 'scroll-text',
|
|
10
|
+
group: 'CI/CD',
|
|
11
|
+
input: z.object({
|
|
12
|
+
project: z.string().min(1).describe('Project path (e.g., "group/project") or numeric project ID'),
|
|
13
|
+
job_id: z.number().int().min(1).describe('Job ID'),
|
|
14
|
+
}),
|
|
15
|
+
output: z.object({
|
|
16
|
+
log: z.string().describe('Raw job log text'),
|
|
17
|
+
}),
|
|
18
|
+
handle: async (params) => {
|
|
19
|
+
const log = await apiRaw(`/projects/${encodeURIComponent(params.project)}/jobs/${params.job_id}/trace`);
|
|
20
|
+
return { log };
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=get-job-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-job-log.js","sourceRoot":"","sources":["../../src/tools/get-job-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC;IAClC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,sEAAsE;IACnF,OAAO,EAAE,6BAA6B;IACtC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QACjG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;KACnD,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC7C,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,QAAQ,CAAC,CAAC;QACxG,OAAO,EAAE,GAAG,EAAE,CAAC;IACjB,CAAC;CACF,CAAC,CAAC"}
|