@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.
Files changed (104) hide show
  1. package/dist/adapter.iife.js +15367 -0
  2. package/dist/adapter.iife.js.map +7 -0
  3. package/dist/gitlab-api.d.ts +13 -0
  4. package/dist/gitlab-api.d.ts.map +1 -0
  5. package/dist/gitlab-api.js +114 -0
  6. package/dist/gitlab-api.js.map +1 -0
  7. package/dist/index.d.ts +14 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +70 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/tools/create-issue.d.ts +27 -0
  12. package/dist/tools/create-issue.d.ts.map +1 -0
  13. package/dist/tools/create-issue.js +43 -0
  14. package/dist/tools/create-issue.js.map +1 -0
  15. package/dist/tools/create-merge-request.d.ts +32 -0
  16. package/dist/tools/create-merge-request.d.ts.map +1 -0
  17. package/dist/tools/create-merge-request.js +52 -0
  18. package/dist/tools/create-merge-request.js.map +1 -0
  19. package/dist/tools/create-note.d.ts +20 -0
  20. package/dist/tools/create-note.d.ts.map +1 -0
  21. package/dist/tools/create-note.js +26 -0
  22. package/dist/tools/create-note.js.map +1 -0
  23. package/dist/tools/get-file-content.d.ts +10 -0
  24. package/dist/tools/get-file-content.d.ts.map +1 -0
  25. package/dist/tools/get-file-content.js +33 -0
  26. package/dist/tools/get-file-content.js.map +1 -0
  27. package/dist/tools/get-issue.d.ts +22 -0
  28. package/dist/tools/get-issue.d.ts.map +1 -0
  29. package/dist/tools/get-issue.js +24 -0
  30. package/dist/tools/get-issue.js.map +1 -0
  31. package/dist/tools/get-job-log.d.ts +8 -0
  32. package/dist/tools/get-job-log.d.ts.map +1 -0
  33. package/dist/tools/get-job-log.js +23 -0
  34. package/dist/tools/get-job-log.js.map +1 -0
  35. package/dist/tools/get-merge-request-diff.d.ts +15 -0
  36. package/dist/tools/get-merge-request-diff.d.ts.map +1 -0
  37. package/dist/tools/get-merge-request-diff.js +41 -0
  38. package/dist/tools/get-merge-request-diff.js.map +1 -0
  39. package/dist/tools/get-merge-request.d.ts +24 -0
  40. package/dist/tools/get-merge-request.d.ts.map +1 -0
  41. package/dist/tools/get-merge-request.js +24 -0
  42. package/dist/tools/get-merge-request.js.map +1 -0
  43. package/dist/tools/get-project.d.ts +21 -0
  44. package/dist/tools/get-project.d.ts.map +1 -0
  45. package/dist/tools/get-project.js +23 -0
  46. package/dist/tools/get-project.js.map +1 -0
  47. package/dist/tools/get-user-profile.d.ts +17 -0
  48. package/dist/tools/get-user-profile.d.ts.map +1 -0
  49. package/dist/tools/get-user-profile.js +29 -0
  50. package/dist/tools/get-user-profile.js.map +1 -0
  51. package/dist/tools/list-branches.d.ts +16 -0
  52. package/dist/tools/list-branches.d.ts.map +1 -0
  53. package/dist/tools/list-branches.js +32 -0
  54. package/dist/tools/list-branches.js.map +1 -0
  55. package/dist/tools/list-commits.d.ts +22 -0
  56. package/dist/tools/list-commits.d.ts.map +1 -0
  57. package/dist/tools/list-commits.js +41 -0
  58. package/dist/tools/list-commits.js.map +1 -0
  59. package/dist/tools/list-issues.d.ts +40 -0
  60. package/dist/tools/list-issues.d.ts.map +1 -0
  61. package/dist/tools/list-issues.js +49 -0
  62. package/dist/tools/list-issues.js.map +1 -0
  63. package/dist/tools/list-merge-requests.d.ts +46 -0
  64. package/dist/tools/list-merge-requests.d.ts.map +1 -0
  65. package/dist/tools/list-merge-requests.js +56 -0
  66. package/dist/tools/list-merge-requests.js.map +1 -0
  67. package/dist/tools/list-notes.d.ts +29 -0
  68. package/dist/tools/list-notes.d.ts.map +1 -0
  69. package/dist/tools/list-notes.js +35 -0
  70. package/dist/tools/list-notes.js.map +1 -0
  71. package/dist/tools/list-pipeline-jobs.d.ts +20 -0
  72. package/dist/tools/list-pipeline-jobs.d.ts.map +1 -0
  73. package/dist/tools/list-pipeline-jobs.js +30 -0
  74. package/dist/tools/list-pipeline-jobs.js.map +1 -0
  75. package/dist/tools/list-pipelines.d.ts +42 -0
  76. package/dist/tools/list-pipelines.d.ts.map +1 -0
  77. package/dist/tools/list-pipelines.js +47 -0
  78. package/dist/tools/list-pipelines.js.map +1 -0
  79. package/dist/tools/list-projects.d.ts +42 -0
  80. package/dist/tools/list-projects.d.ts.map +1 -0
  81. package/dist/tools/list-projects.js +47 -0
  82. package/dist/tools/list-projects.js.map +1 -0
  83. package/dist/tools/merge-merge-request.d.ts +28 -0
  84. package/dist/tools/merge-merge-request.d.ts.map +1 -0
  85. package/dist/tools/merge-merge-request.js +37 -0
  86. package/dist/tools/merge-merge-request.js.map +1 -0
  87. package/dist/tools/schemas.d.ts +326 -0
  88. package/dist/tools/schemas.d.ts.map +1 -0
  89. package/dist/tools/schemas.js +213 -0
  90. package/dist/tools/schemas.js.map +1 -0
  91. package/dist/tools/search-projects.d.ts +35 -0
  92. package/dist/tools/search-projects.d.ts.map +1 -0
  93. package/dist/tools/search-projects.js +37 -0
  94. package/dist/tools/search-projects.js.map +1 -0
  95. package/dist/tools/update-issue.d.ts +32 -0
  96. package/dist/tools/update-issue.d.ts.map +1 -0
  97. package/dist/tools/update-issue.js +46 -0
  98. package/dist/tools/update-issue.js.map +1 -0
  99. package/dist/tools/update-merge-request.d.ts +35 -0
  100. package/dist/tools/update-merge-request.d.ts.map +1 -0
  101. package/dist/tools/update-merge-request.js +49 -0
  102. package/dist/tools/update-merge-request.js.map +1 -0
  103. package/dist/tools.json +2661 -0
  104. 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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"}
@@ -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":"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,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;IAC3C,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,sBAAsB;IACnC,WAAW,EAAE,0CAA0C;IACvD,OAAO,EAAE,4BAA4B;IACrC,IAAI,EAAE,wBAAwB;IAC9B,KAAK,EAAE,gBAAgB;IACvB,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,qBAAqB,CAAC;QACxD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC/D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC/D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACzE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QAC7E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAChE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC5D,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QACzF,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KACvE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,aAAa,EAAE,kBAAkB,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACxE,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAA4B;YACpC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC;QACF,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,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAC5E,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC/E,IAAI,MAAM,CAAC,oBAAoB,KAAK,SAAS;YAAE,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;QACvG,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAE7D,MAAM,IAAI,GAAG,MAAM,GAAG,CAA0B,aAAa,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE;YAChH,MAAM,EAAE,MAAM;YACd,IAAI;SACL,CAAC,CAAC;QACH,OAAO,EAAE,aAAa,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;IAClD,CAAC;CACF,CAAC,CAAC"}
@@ -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"}