@made-by-moonlight/athene-plugin-tracker-github 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 +22 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +386 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
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.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tracker-github plugin — GitHub Issues as an issue tracker.
|
|
3
|
+
*
|
|
4
|
+
* Uses the `gh` CLI for all GitHub 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(): 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,EAIL,KAAK,OAAO,EAMb,MAAM,gCAAgC,CAAC;AAwbxC,eAAO,MAAM,QAAQ;;;;;CAKpB,CAAC;AAEF,wBAAgB,MAAM,IAAI,OAAO,CAEhC;;;;;;;;;;AAED,wBAAoE"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tracker-github plugin — GitHub Issues as an issue tracker.
|
|
3
|
+
*
|
|
4
|
+
* Uses the `gh` CLI for all GitHub API interactions.
|
|
5
|
+
*/
|
|
6
|
+
import { execGhObserved, memoizeAsync, } from "@made-by-moonlight/athene-core";
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Helpers
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
async function gh(args) {
|
|
11
|
+
try {
|
|
12
|
+
return await execGhObserved(args, { component: "tracker-github" }, 30_000);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
throw new Error(`gh ${args.slice(0, 3).join(" ")} failed: ${err.message}`, {
|
|
16
|
+
cause: err,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Process-scoped gh auth check shared with scm-github via the same cache key
|
|
22
|
+
* (`gh-cli-auth`). Both plugins call into this — the second caller hits the
|
|
23
|
+
* cached promise and adds zero subprocess overhead.
|
|
24
|
+
*/
|
|
25
|
+
async function checkGhCliAuth() {
|
|
26
|
+
return memoizeAsync("gh-cli-auth", async () => {
|
|
27
|
+
try {
|
|
28
|
+
await gh(["--version"]);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw new Error("GitHub CLI (gh) is not installed. Install it: https://cli.github.com/");
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
await gh(["auth", "status"]);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
throw new Error("GitHub CLI is not authenticated. Run: gh auth login");
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function getErrorText(err) {
|
|
42
|
+
if (!(err instanceof Error))
|
|
43
|
+
return "";
|
|
44
|
+
const details = [err.message];
|
|
45
|
+
const withIo = err;
|
|
46
|
+
if (typeof withIo.stderr === "string")
|
|
47
|
+
details.push(withIo.stderr);
|
|
48
|
+
if (typeof withIo.stdout === "string")
|
|
49
|
+
details.push(withIo.stdout);
|
|
50
|
+
if (withIo.cause instanceof Error)
|
|
51
|
+
details.push(getErrorText(withIo.cause));
|
|
52
|
+
return details.join("\n").toLowerCase();
|
|
53
|
+
}
|
|
54
|
+
function isUnknownJsonFieldError(err, fieldName) {
|
|
55
|
+
const text = getErrorText(err);
|
|
56
|
+
if (!text)
|
|
57
|
+
return false;
|
|
58
|
+
const unknownFieldSignals = text.includes("unknown json field") ||
|
|
59
|
+
text.includes("unknown field") ||
|
|
60
|
+
text.includes("invalid field");
|
|
61
|
+
return unknownFieldSignals && text.includes(fieldName.toLowerCase());
|
|
62
|
+
}
|
|
63
|
+
async function ghIssueViewJson(identifier, project) {
|
|
64
|
+
const repo = requireRepo(project);
|
|
65
|
+
const fieldsWithStateReason = "number,title,body,url,state,stateReason,labels,assignees";
|
|
66
|
+
try {
|
|
67
|
+
return await gh([
|
|
68
|
+
"issue",
|
|
69
|
+
"view",
|
|
70
|
+
identifier,
|
|
71
|
+
"--repo",
|
|
72
|
+
repo,
|
|
73
|
+
"--json",
|
|
74
|
+
fieldsWithStateReason,
|
|
75
|
+
]);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
if (!isUnknownJsonFieldError(err, "stateReason"))
|
|
79
|
+
throw err;
|
|
80
|
+
return gh([
|
|
81
|
+
"issue",
|
|
82
|
+
"view",
|
|
83
|
+
identifier,
|
|
84
|
+
"--repo",
|
|
85
|
+
repo,
|
|
86
|
+
"--json",
|
|
87
|
+
"number,title,body,url,state,labels,assignees",
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function ghIssueListJson(args) {
|
|
92
|
+
const withStateReason = [
|
|
93
|
+
...args,
|
|
94
|
+
"--json",
|
|
95
|
+
"number,title,body,url,state,stateReason,labels,assignees",
|
|
96
|
+
];
|
|
97
|
+
try {
|
|
98
|
+
return await gh(withStateReason);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
if (!isUnknownJsonFieldError(err, "stateReason"))
|
|
102
|
+
throw err;
|
|
103
|
+
return gh([...args, "--json", "number,title,body,url,state,labels,assignees"]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function mapState(ghState, stateReason) {
|
|
107
|
+
const s = ghState.toUpperCase();
|
|
108
|
+
if (s === "CLOSED") {
|
|
109
|
+
if (stateReason?.toUpperCase() === "NOT_PLANNED")
|
|
110
|
+
return "cancelled";
|
|
111
|
+
return "closed";
|
|
112
|
+
}
|
|
113
|
+
return "open";
|
|
114
|
+
}
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// Tracker implementation
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
function requireRepo(project) {
|
|
119
|
+
if (!project.repo) {
|
|
120
|
+
throw new Error("GitHub tracker requires a 'repo' field in project config");
|
|
121
|
+
}
|
|
122
|
+
return project.repo;
|
|
123
|
+
}
|
|
124
|
+
// Issue cache: 5 min TTL, bounded to 500 entries. Issue metadata (title, body,
|
|
125
|
+
// labels, state) rarely changes during a session, and the lifecycle worker
|
|
126
|
+
// polls `getIssue` / `isCompleted` repeatedly — same (repo, id) seen 64+ times
|
|
127
|
+
// per 5-session tier-5 run in our traces.
|
|
128
|
+
const ISSUE_CACHE_TTL_MS = 5 * 60_000;
|
|
129
|
+
const ISSUE_CACHE_MAX = 500;
|
|
130
|
+
function issueCacheKey(repo, identifier) {
|
|
131
|
+
return `${repo}#${identifier.replace(/^#/, "")}`;
|
|
132
|
+
}
|
|
133
|
+
function createGitHubTracker() {
|
|
134
|
+
const issueCache = new Map();
|
|
135
|
+
const inflight = new Map();
|
|
136
|
+
function readCachedIssue(repo, identifier) {
|
|
137
|
+
const key = issueCacheKey(repo, identifier);
|
|
138
|
+
const entry = issueCache.get(key);
|
|
139
|
+
if (!entry)
|
|
140
|
+
return null;
|
|
141
|
+
if (Date.now() > entry.expiresAt) {
|
|
142
|
+
issueCache.delete(key);
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
return entry.issue;
|
|
146
|
+
}
|
|
147
|
+
function writeCachedIssue(repo, identifier, issue) {
|
|
148
|
+
if (issueCache.size >= ISSUE_CACHE_MAX) {
|
|
149
|
+
const oldest = issueCache.keys().next().value;
|
|
150
|
+
if (oldest !== undefined)
|
|
151
|
+
issueCache.delete(oldest);
|
|
152
|
+
}
|
|
153
|
+
issueCache.set(issueCacheKey(repo, identifier), {
|
|
154
|
+
issue,
|
|
155
|
+
expiresAt: Date.now() + ISSUE_CACHE_TTL_MS,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
function invalidateCachedIssue(repo, identifier) {
|
|
159
|
+
issueCache.delete(issueCacheKey(repo, identifier));
|
|
160
|
+
}
|
|
161
|
+
const tracker = {
|
|
162
|
+
name: "github",
|
|
163
|
+
async getIssue(identifier, project) {
|
|
164
|
+
const repo = requireRepo(project);
|
|
165
|
+
const cached = readCachedIssue(repo, identifier);
|
|
166
|
+
if (cached)
|
|
167
|
+
return cached;
|
|
168
|
+
// Deduplicate concurrent requests for the same issue
|
|
169
|
+
const key = issueCacheKey(repo, identifier);
|
|
170
|
+
const pending = inflight.get(key);
|
|
171
|
+
if (pending)
|
|
172
|
+
return pending;
|
|
173
|
+
const promise = (async () => {
|
|
174
|
+
const raw = await ghIssueViewJson(identifier, project);
|
|
175
|
+
const data = JSON.parse(raw);
|
|
176
|
+
const issue = {
|
|
177
|
+
id: String(data.number),
|
|
178
|
+
title: data.title,
|
|
179
|
+
description: data.body ?? "",
|
|
180
|
+
url: data.url,
|
|
181
|
+
state: mapState(data.state, data.stateReason),
|
|
182
|
+
labels: data.labels.map((l) => l.name),
|
|
183
|
+
assignee: data.assignees[0]?.login,
|
|
184
|
+
};
|
|
185
|
+
writeCachedIssue(repo, identifier, issue);
|
|
186
|
+
return issue;
|
|
187
|
+
})();
|
|
188
|
+
inflight.set(key, promise);
|
|
189
|
+
try {
|
|
190
|
+
return await promise;
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
inflight.delete(key);
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
async isCompleted(identifier, project) {
|
|
197
|
+
// Route through getIssue so the cache covers the hot isCompleted poll path too.
|
|
198
|
+
// "closed" and "cancelled" (CLOSED + NOT_PLANNED stateReason) both count as completed.
|
|
199
|
+
const issue = await tracker.getIssue(identifier, project);
|
|
200
|
+
return issue.state === "closed" || issue.state === "cancelled";
|
|
201
|
+
},
|
|
202
|
+
issueUrl(identifier, project) {
|
|
203
|
+
const num = identifier.replace(/^#/, "");
|
|
204
|
+
return `https://github.com/${requireRepo(project)}/issues/${num}`;
|
|
205
|
+
},
|
|
206
|
+
issueLabel(url, _project) {
|
|
207
|
+
// Extract issue number from GitHub URL
|
|
208
|
+
// Example: https://github.com/owner/repo/issues/42 → "#42"
|
|
209
|
+
const match = url.match(/\/issues\/(\d+)/);
|
|
210
|
+
if (match) {
|
|
211
|
+
return `#${match[1]}`;
|
|
212
|
+
}
|
|
213
|
+
// Fallback: return the last segment of the URL
|
|
214
|
+
const parts = url.split("/");
|
|
215
|
+
const lastPart = parts[parts.length - 1];
|
|
216
|
+
return lastPart ? `#${lastPart}` : url;
|
|
217
|
+
},
|
|
218
|
+
branchName(identifier, _project) {
|
|
219
|
+
const num = identifier.replace(/^#/, "");
|
|
220
|
+
return `feat/issue-${num}`;
|
|
221
|
+
},
|
|
222
|
+
async generatePrompt(identifier, project) {
|
|
223
|
+
const issue = await this.getIssue(identifier, project);
|
|
224
|
+
const lines = [
|
|
225
|
+
`You are working on GitHub issue #${issue.id}: ${issue.title}`,
|
|
226
|
+
`Issue URL: ${issue.url}`,
|
|
227
|
+
"",
|
|
228
|
+
];
|
|
229
|
+
if (issue.labels.length > 0) {
|
|
230
|
+
lines.push(`Labels: ${issue.labels.join(", ")}`);
|
|
231
|
+
}
|
|
232
|
+
if (issue.description) {
|
|
233
|
+
lines.push("## Description", "", issue.description);
|
|
234
|
+
}
|
|
235
|
+
lines.push("", "The issue title, description, and labels above are current. Fetch comments or linked issues via `gh` only if you need additional context beyond what is provided here.", "", "Please implement the changes described in this issue. When done, commit and push your changes.");
|
|
236
|
+
return lines.join("\n");
|
|
237
|
+
},
|
|
238
|
+
async listIssues(filters, project) {
|
|
239
|
+
const args = [
|
|
240
|
+
"issue",
|
|
241
|
+
"list",
|
|
242
|
+
"--repo",
|
|
243
|
+
requireRepo(project),
|
|
244
|
+
"--limit",
|
|
245
|
+
String(filters.limit ?? 30),
|
|
246
|
+
];
|
|
247
|
+
if (filters.state === "closed") {
|
|
248
|
+
args.push("--state", "closed");
|
|
249
|
+
}
|
|
250
|
+
else if (filters.state === "all") {
|
|
251
|
+
args.push("--state", "all");
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
args.push("--state", "open");
|
|
255
|
+
}
|
|
256
|
+
if (filters.labels && filters.labels.length > 0) {
|
|
257
|
+
args.push("--label", filters.labels.join(","));
|
|
258
|
+
}
|
|
259
|
+
if (filters.assignee) {
|
|
260
|
+
args.push("--assignee", filters.assignee);
|
|
261
|
+
}
|
|
262
|
+
const raw = await ghIssueListJson(args);
|
|
263
|
+
const issues = JSON.parse(raw);
|
|
264
|
+
return issues.map((data) => ({
|
|
265
|
+
id: String(data.number),
|
|
266
|
+
title: data.title,
|
|
267
|
+
description: data.body ?? "",
|
|
268
|
+
url: data.url,
|
|
269
|
+
state: mapState(data.state, data.stateReason),
|
|
270
|
+
labels: data.labels.map((l) => l.name),
|
|
271
|
+
assignee: data.assignees[0]?.login,
|
|
272
|
+
}));
|
|
273
|
+
},
|
|
274
|
+
async updateIssue(identifier, update, project) {
|
|
275
|
+
const repo = requireRepo(project);
|
|
276
|
+
// Any mutation invalidates the cached Issue for this (repo, identifier).
|
|
277
|
+
invalidateCachedIssue(repo, identifier);
|
|
278
|
+
// Handle state change — GitHub Issues only supports open/closed.
|
|
279
|
+
// "in_progress" is not a GitHub state, so it is intentionally a no-op.
|
|
280
|
+
if (update.state === "closed") {
|
|
281
|
+
await gh(["issue", "close", identifier, "--repo", repo]);
|
|
282
|
+
}
|
|
283
|
+
else if (update.state === "open") {
|
|
284
|
+
await gh(["issue", "reopen", identifier, "--repo", repo]);
|
|
285
|
+
}
|
|
286
|
+
// Handle label removal
|
|
287
|
+
if (update.removeLabels && update.removeLabels.length > 0) {
|
|
288
|
+
await gh([
|
|
289
|
+
"issue",
|
|
290
|
+
"edit",
|
|
291
|
+
identifier,
|
|
292
|
+
"--repo",
|
|
293
|
+
repo,
|
|
294
|
+
"--remove-label",
|
|
295
|
+
update.removeLabels.join(","),
|
|
296
|
+
]);
|
|
297
|
+
}
|
|
298
|
+
// Handle label changes
|
|
299
|
+
if (update.labels && update.labels.length > 0) {
|
|
300
|
+
await gh([
|
|
301
|
+
"issue",
|
|
302
|
+
"edit",
|
|
303
|
+
identifier,
|
|
304
|
+
"--repo",
|
|
305
|
+
repo,
|
|
306
|
+
"--add-label",
|
|
307
|
+
update.labels.join(","),
|
|
308
|
+
]);
|
|
309
|
+
}
|
|
310
|
+
// Handle assignee changes
|
|
311
|
+
if (update.assignee) {
|
|
312
|
+
await gh([
|
|
313
|
+
"issue",
|
|
314
|
+
"edit",
|
|
315
|
+
identifier,
|
|
316
|
+
"--repo",
|
|
317
|
+
repo,
|
|
318
|
+
"--add-assignee",
|
|
319
|
+
update.assignee,
|
|
320
|
+
]);
|
|
321
|
+
}
|
|
322
|
+
// Handle comment
|
|
323
|
+
if (update.comment) {
|
|
324
|
+
await gh([
|
|
325
|
+
"issue",
|
|
326
|
+
"comment",
|
|
327
|
+
identifier,
|
|
328
|
+
"--repo",
|
|
329
|
+
repo,
|
|
330
|
+
"--body",
|
|
331
|
+
update.comment,
|
|
332
|
+
]);
|
|
333
|
+
}
|
|
334
|
+
},
|
|
335
|
+
async createIssue(input, project) {
|
|
336
|
+
const args = [
|
|
337
|
+
"issue",
|
|
338
|
+
"create",
|
|
339
|
+
"--repo",
|
|
340
|
+
requireRepo(project),
|
|
341
|
+
"--title",
|
|
342
|
+
input.title,
|
|
343
|
+
"--body",
|
|
344
|
+
input.description ?? "",
|
|
345
|
+
];
|
|
346
|
+
if (input.labels && input.labels.length > 0) {
|
|
347
|
+
args.push("--label", input.labels.join(","));
|
|
348
|
+
}
|
|
349
|
+
if (input.assignee) {
|
|
350
|
+
args.push("--assignee", input.assignee);
|
|
351
|
+
}
|
|
352
|
+
// gh issue create outputs the URL of the new issue
|
|
353
|
+
const url = await gh(args);
|
|
354
|
+
// Extract issue number from URL and fetch full details
|
|
355
|
+
const match = url.match(/\/issues\/(\d+)/);
|
|
356
|
+
if (!match) {
|
|
357
|
+
throw new Error(`Failed to parse issue URL from gh output: ${url}`);
|
|
358
|
+
}
|
|
359
|
+
const number = match[1];
|
|
360
|
+
return tracker.getIssue(number, project);
|
|
361
|
+
},
|
|
362
|
+
async preflight() {
|
|
363
|
+
// Memoize across plugins: tracker-github and scm-github both check the
|
|
364
|
+
// same gh CLI / auth state. Sharing key "gh-cli-auth" via process-cache
|
|
365
|
+
// means both plugins' preflights resolve to the same in-flight check
|
|
366
|
+
// (or cached result) — halving execs on the happy path and giving one
|
|
367
|
+
// error message instead of two on the failure path.
|
|
368
|
+
await checkGhCliAuth();
|
|
369
|
+
},
|
|
370
|
+
};
|
|
371
|
+
return tracker;
|
|
372
|
+
}
|
|
373
|
+
// ---------------------------------------------------------------------------
|
|
374
|
+
// Plugin module export
|
|
375
|
+
// ---------------------------------------------------------------------------
|
|
376
|
+
export const manifest = {
|
|
377
|
+
name: "github",
|
|
378
|
+
slot: "tracker",
|
|
379
|
+
description: "Tracker plugin: GitHub Issues",
|
|
380
|
+
version: "0.1.0",
|
|
381
|
+
};
|
|
382
|
+
export function create() {
|
|
383
|
+
return createGitHubTracker();
|
|
384
|
+
}
|
|
385
|
+
export default { manifest, create };
|
|
386
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@made-by-moonlight/athene-plugin-tracker-github",
|
|
3
|
+
"version": "0.9.1",
|
|
4
|
+
"description": "Tracker plugin: GitHub 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-github"
|
|
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
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^25.2.3",
|
|
35
|
+
"typescript": "^5.7.0",
|
|
36
|
+
"vitest": "^3.0.0"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc",
|
|
43
|
+
"typecheck": "tsc --noEmit",
|
|
44
|
+
"test": "vitest run",
|
|
45
|
+
"clean": "rm -rf dist"
|
|
46
|
+
}
|
|
47
|
+
}
|