@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 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-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
+ }