@made-by-moonlight/athene-plugin-tracker-gitlab 0.9.1

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/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Composio, Inc.
4
+ Copyright (c) 2026 slievr (Athene fork)
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
@@ -0,0 +1,24 @@
1
+ /**
2
+ * tracker-gitlab plugin — GitLab Issues as an issue tracker.
3
+ *
4
+ * Uses the `glab` CLI for all GitLab API interactions.
5
+ */
6
+ import type { Tracker } from "@made-by-moonlight/athene-core";
7
+ export declare const manifest: {
8
+ name: string;
9
+ slot: "tracker";
10
+ description: string;
11
+ version: string;
12
+ };
13
+ export declare function create(config?: Record<string, unknown>): Tracker;
14
+ declare const _default: {
15
+ manifest: {
16
+ name: string;
17
+ slot: "tracker";
18
+ description: string;
19
+ version: string;
20
+ };
21
+ create: typeof create;
22
+ };
23
+ export default _default;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAEV,OAAO,EAMR,MAAM,gCAAgC,CAAC;AA4MxC,eAAO,MAAM,QAAQ;;;;;CAKpB,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAEhE;;;;;;;;;;AAED,wBAAoE"}
package/dist/index.js ADDED
@@ -0,0 +1,157 @@
1
+ /**
2
+ * tracker-gitlab plugin — GitLab Issues as an issue tracker.
3
+ *
4
+ * Uses the `glab` CLI for all GitLab API interactions.
5
+ */
6
+ import { glab, parseJSON, extractHost, stripHost } from "@made-by-moonlight/athene-plugin-scm-gitlab/glab-utils";
7
+ function toIssue(data) {
8
+ return {
9
+ id: String(data.iid),
10
+ title: data.title,
11
+ description: data.description ?? "",
12
+ url: data.web_url,
13
+ state: data.state.toLowerCase() === "closed" ? "closed" : "open",
14
+ labels: data.labels ?? [],
15
+ assignee: data.assignees?.[0]?.username,
16
+ };
17
+ }
18
+ function requireRepo(project) {
19
+ if (!project.repo) {
20
+ throw new Error("GitLab tracker requires a 'repo' field in project config");
21
+ }
22
+ return project.repo;
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // Tracker implementation
26
+ // ---------------------------------------------------------------------------
27
+ function createGitLabTracker(config) {
28
+ const hostname = typeof config?.host === "string" ? config.host : undefined;
29
+ const defaultHost = hostname ?? "gitlab.com";
30
+ return {
31
+ name: "gitlab",
32
+ async getIssue(identifier, project) {
33
+ const raw = await glab(["issue", "view", identifier, "--repo", requireRepo(project), "-F", "json"], hostname);
34
+ return toIssue(parseJSON(raw, `getIssue for issue ${identifier}`));
35
+ },
36
+ async isCompleted(identifier, project) {
37
+ const raw = await glab(["issue", "view", identifier, "--repo", requireRepo(project), "-F", "json"], hostname);
38
+ const data = parseJSON(raw, `isCompleted for issue ${identifier}`);
39
+ return data.state.toLowerCase() === "closed";
40
+ },
41
+ issueUrl(identifier, project) {
42
+ const num = identifier.replace(/^#/, "");
43
+ const repo = requireRepo(project);
44
+ const host = extractHost(repo) ?? defaultHost;
45
+ return `https://${host}/${stripHost(repo)}/-/issues/${num}`;
46
+ },
47
+ issueLabel(url, _project) {
48
+ const match = url.match(/\/-\/issues\/(\d+)/);
49
+ if (match)
50
+ return `#${match[1]}`;
51
+ const parts = url.split("/");
52
+ const lastPart = parts[parts.length - 1];
53
+ return lastPart ? `#${lastPart}` : url;
54
+ },
55
+ branchName(identifier, _project) {
56
+ return `feat/issue-${identifier.replace(/^#/, "")}`;
57
+ },
58
+ async generatePrompt(identifier, project) {
59
+ const issue = await this.getIssue(identifier, project);
60
+ const lines = [
61
+ `You are working on GitLab issue #${issue.id}: ${issue.title}`,
62
+ `Issue URL: ${issue.url}`,
63
+ "",
64
+ ];
65
+ if (issue.labels.length > 0) {
66
+ lines.push(`Labels: ${issue.labels.join(", ")}`);
67
+ }
68
+ if (issue.description) {
69
+ lines.push("## Description", "", issue.description);
70
+ }
71
+ lines.push("", "Please implement the changes described in this issue. When done, commit and push your changes.");
72
+ return lines.join("\n");
73
+ },
74
+ async listIssues(filters, project) {
75
+ const args = [
76
+ "issue",
77
+ "list",
78
+ "--repo",
79
+ requireRepo(project),
80
+ "-O",
81
+ "json",
82
+ "-P",
83
+ String(filters.limit ?? 30),
84
+ ];
85
+ if (filters.state === "closed") {
86
+ args.push("--closed");
87
+ }
88
+ else if (filters.state === "all") {
89
+ args.push("--all");
90
+ }
91
+ if (filters.labels && filters.labels.length > 0) {
92
+ for (const label of filters.labels) {
93
+ args.push("--label", label);
94
+ }
95
+ }
96
+ if (filters.assignee) {
97
+ args.push("--assignee", filters.assignee);
98
+ }
99
+ const raw = await glab(args, hostname);
100
+ const issues = parseJSON(raw, "listIssues");
101
+ return issues.map(toIssue);
102
+ },
103
+ async updateIssue(identifier, update, project) {
104
+ const repo = requireRepo(project);
105
+ if (update.state === "closed") {
106
+ await glab(["issue", "close", identifier, "--repo", repo], hostname);
107
+ }
108
+ else if (update.state === "open") {
109
+ await glab(["issue", "reopen", identifier, "--repo", repo], hostname);
110
+ }
111
+ if (update.labels && update.labels.length > 0) {
112
+ await glab(["issue", "update", identifier, "--repo", repo, "--label", update.labels.join(",")], hostname);
113
+ }
114
+ if (update.comment) {
115
+ await glab(["issue", "note", identifier, "--repo", repo, "-m", update.comment], hostname);
116
+ }
117
+ },
118
+ async createIssue(input, project) {
119
+ const args = [
120
+ "issue",
121
+ "create",
122
+ "--repo",
123
+ requireRepo(project),
124
+ "--title",
125
+ input.title,
126
+ "--description",
127
+ input.description ?? "",
128
+ ];
129
+ if (input.labels && input.labels.length > 0) {
130
+ args.push("--label", input.labels.join(","));
131
+ }
132
+ if (input.assignee) {
133
+ args.push("--assignee", input.assignee);
134
+ }
135
+ const url = await glab(args, hostname);
136
+ const match = url.match(/\/-\/issues\/(\d+)/);
137
+ if (!match?.[1]) {
138
+ throw new Error(`Failed to parse issue URL from glab output: ${url}`);
139
+ }
140
+ return this.getIssue(match[1], project);
141
+ },
142
+ };
143
+ }
144
+ // ---------------------------------------------------------------------------
145
+ // Plugin module export
146
+ // ---------------------------------------------------------------------------
147
+ export const manifest = {
148
+ name: "gitlab",
149
+ slot: "tracker",
150
+ description: "Tracker plugin: GitLab Issues",
151
+ version: "0.1.0",
152
+ };
153
+ export function create(config) {
154
+ return createGitLabTracker(config);
155
+ }
156
+ export default { manifest, create };
157
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,wDAAwD,CAAC;AAgBjH,SAAS,OAAO,CAAC,IAAqB;IACpC,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QACpB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QACnC,GAAG,EAAE,IAAI,CAAC,OAAO;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;QAChE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACzB,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAsB;IACzC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,SAAS,mBAAmB,CAAC,MAAgC;IAC3D,MAAM,QAAQ,GAAG,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,MAAM,WAAW,GAAG,QAAQ,IAAI,YAAY,CAAC;IAE7C,OAAO;QACL,IAAI,EAAE,QAAQ;QAEd,KAAK,CAAC,QAAQ,CAAC,UAAkB,EAAE,OAAsB;YACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CACpB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,EAC3E,QAAQ,CACT,CAAC;YACF,OAAO,OAAO,CAAC,SAAS,CAAkB,GAAG,EAAE,sBAAsB,UAAU,EAAE,CAAC,CAAC,CAAC;QACtF,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,OAAsB;YAC1D,MAAM,GAAG,GAAG,MAAM,IAAI,CACpB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,EAC3E,QAAQ,CACT,CAAC;YACF,MAAM,IAAI,GAAG,SAAS,CAAoB,GAAG,EAAE,yBAAyB,UAAU,EAAE,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC;QAC/C,CAAC;QAED,QAAQ,CAAC,UAAkB,EAAE,OAAsB;YACjD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;YAC9C,OAAO,WAAW,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAC9D,CAAC;QAED,UAAU,CAAC,GAAW,EAAE,QAAuB;YAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC9C,IAAI,KAAK;gBAAE,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzC,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,CAAC;QAED,UAAU,CAAC,UAAkB,EAAE,QAAuB;YACpD,OAAO,cAAc,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACtD,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,UAAkB,EAAE,OAAsB;YAC7D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG;gBACZ,oCAAoC,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE;gBAC9D,cAAc,KAAK,CAAC,GAAG,EAAE;gBACzB,EAAE;aACH,CAAC;YAEF,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACtD,CAAC;YAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,gGAAgG,CACjG,CAAC;YAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,OAAqB,EAAE,OAAsB;YAC5D,MAAM,IAAI,GAAG;gBACX,OAAO;gBACP,MAAM;gBACN,QAAQ;gBACR,WAAW,CAAC,OAAO,CAAC;gBACpB,IAAI;gBACJ,MAAM;gBACN,IAAI;gBACJ,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;aAC5B,CAAC;YAEF,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,SAAS,CAAoB,GAAG,EAAE,YAAY,CAAC,CAAC;YAC/D,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAED,KAAK,CAAC,WAAW,CACf,UAAkB,EAClB,MAAmB,EACnB,OAAsB;YAEtB,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;YACvE,CAAC;iBAAM,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;gBACnC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;YACxE,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,CACR,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACnF,QAAQ,CACT,CAAC;YACJ,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,IAAI,CACR,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,EACnE,QAAQ,CACT,CAAC;YACJ,CAAC;QACH,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,KAAuB,EAAE,OAAsB;YAC/D,MAAM,IAAI,GAAG;gBACX,OAAO;gBACP,QAAQ;gBACR,QAAQ;gBACR,WAAW,CAAC,OAAO,CAAC;gBACpB,SAAS;gBACT,KAAK,CAAC,KAAK;gBACX,eAAe;gBACf,KAAK,CAAC,WAAW,IAAI,EAAE;aACxB,CAAC;YAEF,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAEvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,EAAE,CAAC,CAAC;YACxE,CAAC;YAED,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,SAAkB;IACxB,WAAW,EAAE,+BAA+B;IAC5C,OAAO,EAAE,OAAO;CACjB,CAAC;AAEF,MAAM,UAAU,MAAM,CAAC,MAAgC;IACrD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAkC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@made-by-moonlight/athene-plugin-tracker-gitlab",
3
+ "version": "0.9.1",
4
+ "description": "Tracker plugin: GitLab Issues",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/slievr/Athene.git",
21
+ "directory": "packages/plugins/tracker-gitlab"
22
+ },
23
+ "homepage": "https://github.com/slievr/Athene",
24
+ "bugs": {
25
+ "url": "https://github.com/slievr/Athene/issues"
26
+ },
27
+ "engines": {
28
+ "node": ">=20.0.0"
29
+ },
30
+ "dependencies": {
31
+ "@made-by-moonlight/athene-core": "0.9.1",
32
+ "@made-by-moonlight/athene-plugin-scm-gitlab": "0.9.1"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^25.2.3",
36
+ "typescript": "^5.7.0",
37
+ "vitest": "^3.0.0"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc",
44
+ "typecheck": "tsc --noEmit",
45
+ "test": "vitest run",
46
+ "clean": "rm -rf dist"
47
+ }
48
+ }