ghscout 0.1.0

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 (66) hide show
  1. package/README.md +195 -0
  2. package/dist/analysis/ai-scorer.d.ts +34 -0
  3. package/dist/analysis/ai-scorer.d.ts.map +1 -0
  4. package/dist/analysis/ai-scorer.js +139 -0
  5. package/dist/analysis/ai-scorer.js.map +1 -0
  6. package/dist/analysis/cluster.d.ts +14 -0
  7. package/dist/analysis/cluster.d.ts.map +1 -0
  8. package/dist/analysis/cluster.js +223 -0
  9. package/dist/analysis/cluster.js.map +1 -0
  10. package/dist/analysis/scorer.d.ts +27 -0
  11. package/dist/analysis/scorer.d.ts.map +1 -0
  12. package/dist/analysis/scorer.js +196 -0
  13. package/dist/analysis/scorer.js.map +1 -0
  14. package/dist/analysis/signals.d.ts +30 -0
  15. package/dist/analysis/signals.d.ts.map +1 -0
  16. package/dist/analysis/signals.js +59 -0
  17. package/dist/analysis/signals.js.map +1 -0
  18. package/dist/analysis/tokenizer.d.ts +15 -0
  19. package/dist/analysis/tokenizer.d.ts.map +1 -0
  20. package/dist/analysis/tokenizer.js +64 -0
  21. package/dist/analysis/tokenizer.js.map +1 -0
  22. package/dist/commands/evidence.d.ts +9 -0
  23. package/dist/commands/evidence.d.ts.map +1 -0
  24. package/dist/commands/evidence.js +229 -0
  25. package/dist/commands/evidence.js.map +1 -0
  26. package/dist/commands/scan-org.d.ts +3 -0
  27. package/dist/commands/scan-org.d.ts.map +1 -0
  28. package/dist/commands/scan-org.js +88 -0
  29. package/dist/commands/scan-org.js.map +1 -0
  30. package/dist/commands/scan.d.ts +32 -0
  31. package/dist/commands/scan.d.ts.map +1 -0
  32. package/dist/commands/scan.js +197 -0
  33. package/dist/commands/scan.js.map +1 -0
  34. package/dist/commands/trending.d.ts +14 -0
  35. package/dist/commands/trending.d.ts.map +1 -0
  36. package/dist/commands/trending.js +145 -0
  37. package/dist/commands/trending.js.map +1 -0
  38. package/dist/github/auth.d.ts +3 -0
  39. package/dist/github/auth.d.ts.map +1 -0
  40. package/dist/github/auth.js +33 -0
  41. package/dist/github/auth.js.map +1 -0
  42. package/dist/github/cache.d.ts +18 -0
  43. package/dist/github/cache.d.ts.map +1 -0
  44. package/dist/github/cache.js +51 -0
  45. package/dist/github/cache.js.map +1 -0
  46. package/dist/github/client.d.ts +24 -0
  47. package/dist/github/client.d.ts.map +1 -0
  48. package/dist/github/client.js +140 -0
  49. package/dist/github/client.js.map +1 -0
  50. package/dist/github/fetchers.d.ts +13 -0
  51. package/dist/github/fetchers.d.ts.map +1 -0
  52. package/dist/github/fetchers.js +142 -0
  53. package/dist/github/fetchers.js.map +1 -0
  54. package/dist/github/types.d.ts +46 -0
  55. package/dist/github/types.d.ts.map +1 -0
  56. package/dist/github/types.js +2 -0
  57. package/dist/github/types.js.map +1 -0
  58. package/dist/index.d.ts +3 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +116 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/output/formatters.d.ts +35 -0
  63. package/dist/output/formatters.d.ts.map +1 -0
  64. package/dist/output/formatters.js +195 -0
  65. package/dist/output/formatters.js.map +1 -0
  66. package/package.json +50 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/commands/evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type ScanOptions } from "./scan.js";
2
+ export declare function runOrgScan(org: string, opts: ScanOptions): Promise<void>;
3
+ //# sourceMappingURL=scan-org.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-org.d.ts","sourceRoot":"","sources":["../../src/commands/scan-org.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,WAAW,EAA4B,MAAM,WAAW,CAAC;AAIvE,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,CAsGf"}
@@ -0,0 +1,88 @@
1
+ import { resolveToken } from "../github/auth.js";
2
+ import { GitHubClient, RateLimitError } from "../github/client.js";
3
+ import { fetchOrgRepos, fetchIssues, fetchPulls, } from "../github/fetchers.js";
4
+ import { detectRejectedDemand, detectWorkarounds } from "../analysis/signals.js";
5
+ import { clusterIssues } from "../analysis/cluster.js";
6
+ import { scoreClusters } from "../analysis/scorer.js";
7
+ import { formatScanResult } from "../output/formatters.js";
8
+ import { mergeClustersAcrossRepos } from "./scan.js";
9
+ const MAX_ORG_REPOS = 10;
10
+ export async function runOrgScan(org, opts) {
11
+ try {
12
+ // 1. Resolve auth token
13
+ const token = await resolveToken();
14
+ // 2. Create client
15
+ const client = new GitHubClient(token);
16
+ // 3. Fetch org repos filtered by min-stars
17
+ process.stderr.write(`Fetching repos for org "${org}"...\n`);
18
+ const orgRepos = await fetchOrgRepos(client, org, opts.minStars);
19
+ // 4. Take top 10 repos by stars (already sorted by stars from API)
20
+ const topRepos = orgRepos
21
+ .sort((a, b) => b.stars - a.stars)
22
+ .slice(0, MAX_ORG_REPOS);
23
+ if (topRepos.length === 0) {
24
+ console.error(`No repos found for org "${org}" with min-stars ${opts.minStars}.`);
25
+ process.exit(1);
26
+ }
27
+ // 5. For each repo, run the scan pipeline
28
+ const allClusters = [];
29
+ let maxStars = 0;
30
+ for (let i = 0; i < topRepos.length; i++) {
31
+ const repo = topRepos[i];
32
+ const fullName = repo.fullName;
33
+ process.stderr.write(`Scanning ${i + 1}/${topRepos.length}: ${fullName}...\n`);
34
+ if (repo.stars > maxStars) {
35
+ maxStars = repo.stars;
36
+ }
37
+ // Fetch issues
38
+ const issues = await fetchIssues(client, fullName, {
39
+ limit: opts.limit,
40
+ period: opts.period,
41
+ });
42
+ // Fetch closed PRs
43
+ const pulls = await fetchPulls(client, fullName, {
44
+ state: "closed",
45
+ limit: 50,
46
+ });
47
+ // Detect signals
48
+ detectRejectedDemand(pulls);
49
+ detectWorkarounds(issues);
50
+ // Cluster issues for this repo
51
+ const clusters = clusterIssues(issues);
52
+ allClusters.push(...clusters);
53
+ }
54
+ // 6. Merge clusters across repos
55
+ const mergedClusters = mergeClustersAcrossRepos(allClusters);
56
+ // 7. Score merged clusters using synthetic RepoMeta (stars = max stars)
57
+ const syntheticMeta = {
58
+ owner: org,
59
+ repo: org,
60
+ fullName: org,
61
+ stars: maxStars,
62
+ pushedAt: new Date().toISOString(),
63
+ topics: [],
64
+ language: null,
65
+ description: `Aggregated scan for org ${org}`,
66
+ };
67
+ const scored = scoreClusters(mergedClusters, syntheticMeta, "cross");
68
+ // 8. Filter by minReactions
69
+ const filtered = scored.filter((c) => c.totalReactions >= opts.minReactions);
70
+ // 9. Format and output
71
+ const format = opts.output;
72
+ const result = formatScanResult(filtered, { format, top: opts.top });
73
+ console.log(result);
74
+ }
75
+ catch (error) {
76
+ if (error instanceof RateLimitError) {
77
+ console.error(`Rate limit exhausted. Resets at ${new Date(error.resetAt * 1000).toISOString()}. Try again later or authenticate with a GitHub token.`);
78
+ process.exit(1);
79
+ }
80
+ if (error instanceof Error) {
81
+ console.error(`Error: ${error.message}`);
82
+ process.exit(1);
83
+ }
84
+ console.error("An unexpected error occurred.");
85
+ process.exit(1);
86
+ }
87
+ }
88
+ //# sourceMappingURL=scan-org.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-org.js","sourceRoot":"","sources":["../../src/commands/scan-org.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Cluster } from "../analysis/cluster.js";
2
+ export interface ScanOptions {
3
+ output: string;
4
+ limit: number;
5
+ period: string;
6
+ minStars: number;
7
+ verbose: boolean;
8
+ noCache: boolean;
9
+ top: number;
10
+ minReactions: number;
11
+ aiScore?: boolean;
12
+ }
13
+ export declare function runScan(repo: string, opts: ScanOptions): Promise<void>;
14
+ export interface TopicScanOptions {
15
+ topic: string;
16
+ lang?: string;
17
+ output: string;
18
+ limit: number;
19
+ period: string;
20
+ minStars: number;
21
+ verbose: boolean;
22
+ noCache: boolean;
23
+ top: number;
24
+ minReactions: number;
25
+ }
26
+ /**
27
+ * Merge clusters from multiple repos. Clusters with the same name are merged:
28
+ * their issues are combined, counts and reactions are summed, and labels are unioned.
29
+ */
30
+ export declare function mergeClustersAcrossRepos(allClusters: Cluster[]): Cluster[];
31
+ export declare function runTopicScan(opts: TopicScanOptions): Promise<void>;
32
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAOtD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAQD,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G5E;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,OAAO,EAAE,GACrB,OAAO,EAAE,CAyBX;AAID,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0FxE"}
@@ -0,0 +1,197 @@
1
+ import { resolveToken } from "../github/auth.js";
2
+ import { GitHubClient, RateLimitError } from "../github/client.js";
3
+ import { fetchRepoMeta, fetchIssues, fetchPulls, searchReposByTopic } from "../github/fetchers.js";
4
+ import { detectRejectedDemand, detectWorkarounds } from "../analysis/signals.js";
5
+ import { clusterIssues } from "../analysis/cluster.js";
6
+ import { scoreClusters } from "../analysis/scorer.js";
7
+ import { aiScoreClusters } from "../analysis/ai-scorer.js";
8
+ import { formatScanResult, formatAIScanResult } from "../output/formatters.js";
9
+ function verbose(msg, enabled) {
10
+ if (enabled) {
11
+ process.stderr.write(msg + "\n");
12
+ }
13
+ }
14
+ export async function runScan(repo, opts) {
15
+ // 1. Validate repo format
16
+ if (!repo || !repo.includes("/")) {
17
+ console.error(`Error: Invalid repo format "${repo}". Expected "owner/repo" (e.g., "vercel/next.js").`);
18
+ process.exit(1);
19
+ }
20
+ const parts = repo.split("/");
21
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
22
+ console.error(`Error: Invalid repo format "${repo}". Expected "owner/repo" (e.g., "vercel/next.js").`);
23
+ process.exit(1);
24
+ }
25
+ try {
26
+ // 2. Resolve auth token
27
+ const token = await resolveToken();
28
+ // 3. Create client
29
+ const client = new GitHubClient(token);
30
+ // 4-5. Fetch repo metadata
31
+ verbose("Fetching repo metadata...", opts.verbose);
32
+ const repoMeta = await fetchRepoMeta(client, repo);
33
+ // 6-7. Fetch issues
34
+ const periodInfo = opts.period ? `, period: ${opts.period}` : ", all open";
35
+ verbose(`Fetching issues (limit: ${opts.limit}${periodInfo})...`, opts.verbose);
36
+ const issues = await fetchIssues(client, repo, {
37
+ limit: opts.limit,
38
+ period: opts.period || undefined,
39
+ });
40
+ // 8-9. Fetch closed PRs
41
+ verbose("Fetching closed PRs...", opts.verbose);
42
+ const pulls = await fetchPulls(client, repo, { state: "closed", limit: 50 });
43
+ // 10. Detect signals
44
+ const rejectedPRs = detectRejectedDemand(pulls);
45
+ const _workarounds = detectWorkarounds(issues);
46
+ // 11-12. Cluster issues
47
+ verbose(`Clustering ${issues.length} issues...`, opts.verbose);
48
+ const clusters = clusterIssues(issues);
49
+ // 13. Score clusters
50
+ const scored = scoreClusters(clusters, repoMeta, "single");
51
+ // 14. Filter by minReactions
52
+ const filtered = scored.filter((c) => c.totalReactions >= opts.minReactions);
53
+ // 15. AI scoring (optional)
54
+ if (opts.aiScore) {
55
+ verbose("Running AI scoring via Claude Code CLI...", opts.verbose);
56
+ const aiScored = await aiScoreClusters(filtered, repoMeta, {
57
+ verbose: opts.verbose,
58
+ });
59
+ const format = opts.output;
60
+ const result = formatAIScanResult(aiScored, { format, top: opts.top });
61
+ console.log(result);
62
+ }
63
+ else {
64
+ // 16. Format output (heuristic)
65
+ const format = opts.output;
66
+ const result = formatScanResult(filtered, { format, top: opts.top });
67
+ console.log(result);
68
+ }
69
+ // 17. Print rejected PRs section
70
+ if (rejectedPRs.length > 0) {
71
+ console.log("");
72
+ console.log("Rejected PRs with demand:");
73
+ for (const pr of rejectedPRs) {
74
+ console.log(` - ${pr.title} (${pr.htmlUrl}) [+${pr.reactions.thumbsUp} reactions]`);
75
+ }
76
+ }
77
+ }
78
+ catch (error) {
79
+ if (error instanceof RateLimitError) {
80
+ console.error(`Rate limit exhausted. Resets at ${new Date(error.resetAt * 1000).toISOString()}. Try again later or authenticate with a GitHub token.`);
81
+ process.exit(1);
82
+ }
83
+ if (error instanceof Error) {
84
+ const msg = error.message;
85
+ // Repo not found (404)
86
+ if (msg.includes("404")) {
87
+ console.error(`Repository "${repo}" not found. Check the owner/repo name and try again.`);
88
+ process.exit(1);
89
+ }
90
+ // Generic network / API error
91
+ console.error(`Error: ${msg}`);
92
+ process.exit(1);
93
+ }
94
+ console.error("An unexpected error occurred.");
95
+ process.exit(1);
96
+ }
97
+ }
98
+ /**
99
+ * Merge clusters from multiple repos. Clusters with the same name are merged:
100
+ * their issues are combined, counts and reactions are summed, and labels are unioned.
101
+ */
102
+ export function mergeClustersAcrossRepos(allClusters) {
103
+ const merged = new Map();
104
+ for (const cluster of allClusters) {
105
+ const existing = merged.get(cluster.name);
106
+ if (existing) {
107
+ existing.issues = [...existing.issues, ...cluster.issues];
108
+ existing.issueCount += cluster.issueCount;
109
+ existing.totalReactions += cluster.totalReactions;
110
+ // Union labels
111
+ const labelSet = new Set([...existing.labels, ...cluster.labels]);
112
+ existing.labels = Array.from(labelSet).sort();
113
+ }
114
+ else {
115
+ merged.set(cluster.name, {
116
+ ...cluster,
117
+ issues: [...cluster.issues],
118
+ labels: [...cluster.labels],
119
+ });
120
+ }
121
+ }
122
+ return Array.from(merged.values()).sort((a, b) => {
123
+ if (b.issueCount !== a.issueCount)
124
+ return b.issueCount - a.issueCount;
125
+ return b.totalReactions - a.totalReactions;
126
+ });
127
+ }
128
+ const MAX_REPOS = 10;
129
+ export async function runTopicScan(opts) {
130
+ try {
131
+ // 1. Resolve auth token
132
+ const token = await resolveToken();
133
+ const client = new GitHubClient(token);
134
+ // 2. Search repos by topic
135
+ verbose(`Searching repos for topic "${opts.topic}"...`, opts.verbose);
136
+ const repos = await searchReposByTopic(client, opts.topic, opts.lang, opts.minStars);
137
+ const topRepos = repos.slice(0, MAX_REPOS);
138
+ if (topRepos.length === 0) {
139
+ console.error(`No repos found for topic "${opts.topic}".`);
140
+ process.exit(1);
141
+ }
142
+ // 3. Run pipeline per repo, collect clusters
143
+ const allClusters = [];
144
+ // Use the first repo's meta as a representative for scoring (highest stars)
145
+ let bestRepoMeta = topRepos[0];
146
+ for (let i = 0; i < topRepos.length; i++) {
147
+ const repo = topRepos[i];
148
+ const fullName = repo.fullName;
149
+ process.stderr.write(`Scanning ${i + 1}/${topRepos.length}: ${fullName}...\n`);
150
+ if (repo.stars > bestRepoMeta.stars) {
151
+ bestRepoMeta = repo;
152
+ }
153
+ try {
154
+ const issues = await fetchIssues(client, fullName, {
155
+ limit: opts.limit,
156
+ period: opts.period,
157
+ });
158
+ const pulls = await fetchPulls(client, fullName, {
159
+ state: "closed",
160
+ limit: 50,
161
+ });
162
+ detectRejectedDemand(pulls);
163
+ detectWorkarounds(issues);
164
+ const clusters = clusterIssues(issues);
165
+ allClusters.push(...clusters);
166
+ }
167
+ catch (err) {
168
+ // Skip repos that fail (e.g. 404, permissions) but warn
169
+ const msg = err instanceof Error ? err.message : String(err);
170
+ process.stderr.write(` Warning: skipped ${fullName} (${msg})\n`);
171
+ }
172
+ }
173
+ // 4. Merge clusters across repos
174
+ const merged = mergeClustersAcrossRepos(allClusters);
175
+ // 5. Score merged clusters
176
+ const scored = scoreClusters(merged, bestRepoMeta, "cross");
177
+ // 6. Filter by minReactions
178
+ const filtered = scored.filter((c) => c.totalReactions >= opts.minReactions);
179
+ // 7. Format and output
180
+ const format = opts.output;
181
+ const result = formatScanResult(filtered, { format, top: opts.top });
182
+ console.log(result);
183
+ }
184
+ catch (error) {
185
+ if (error instanceof RateLimitError) {
186
+ console.error(`Rate limit exhausted. Resets at ${new Date(error.resetAt * 1000).toISOString()}. Try again later or authenticate with a GitHub token.`);
187
+ process.exit(1);
188
+ }
189
+ if (error instanceof Error) {
190
+ console.error(`Error: ${error.message}`);
191
+ process.exit(1);
192
+ }
193
+ console.error("An unexpected error occurred.");
194
+ process.exit(1);
195
+ }
196
+ }
197
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface TrendingOptions {
2
+ output: string;
3
+ top: number;
4
+ topic?: string;
5
+ lang?: string;
6
+ verbose: boolean;
7
+ noCache: boolean;
8
+ }
9
+ /**
10
+ * Calculate date 30 days ago in ISO 8601 date format (YYYY-MM-DD).
11
+ */
12
+ export declare function thirtyDaysAgo(): string;
13
+ export declare function runTrending(opts: TrendingOptions): Promise<void>;
14
+ //# sourceMappingURL=trending.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trending.d.ts","sourceRoot":"","sources":["../../src/commands/trending.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAUD;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAqCD,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8HtE"}
@@ -0,0 +1,145 @@
1
+ import { resolveToken } from "../github/auth.js";
2
+ import { GitHubClient, RateLimitError } from "../github/client.js";
3
+ import { searchReposByTopic } from "../github/fetchers.js";
4
+ import { clusterIssues } from "../analysis/cluster.js";
5
+ import { scoreClusters } from "../analysis/scorer.js";
6
+ import { formatScanResult } from "../output/formatters.js";
7
+ const BASE = "https://api.github.com";
8
+ function verbose(msg, enabled) {
9
+ if (enabled) {
10
+ process.stderr.write(msg + "\n");
11
+ }
12
+ }
13
+ /**
14
+ * Calculate date 30 days ago in ISO 8601 date format (YYYY-MM-DD).
15
+ */
16
+ export function thirtyDaysAgo() {
17
+ const date = new Date();
18
+ date.setDate(date.getDate() - 30);
19
+ return date.toISOString().split("T")[0];
20
+ }
21
+ /**
22
+ * Map a GitHub search issue item to our Issue type.
23
+ */
24
+ function mapSearchIssue(item) {
25
+ const reactions = item.reactions;
26
+ const labels = item.labels ?? [];
27
+ const user = item.user;
28
+ return {
29
+ number: item.number,
30
+ title: item.title,
31
+ body: item.body ?? "",
32
+ labels: labels.map((l) => (typeof l === "string" ? l : l.name)),
33
+ reactions: {
34
+ thumbsUp: reactions?.["+1"] ?? 0,
35
+ thumbsDown: reactions?.["-1"] ?? 0,
36
+ total: reactions?.total_count ?? 0,
37
+ },
38
+ commentsCount: item.comments ?? 0,
39
+ createdAt: item.created_at,
40
+ htmlUrl: item.html_url,
41
+ user: user?.login ?? "",
42
+ state: item.state,
43
+ };
44
+ }
45
+ /**
46
+ * Extract owner/repo from a repository_url like
47
+ * "https://api.github.com/repos/vercel/next.js"
48
+ */
49
+ function repoFromUrl(repositoryUrl) {
50
+ const match = repositoryUrl.match(/repos\/([^/]+\/[^/]+)$/);
51
+ return match ? match[1] : "unknown/unknown";
52
+ }
53
+ export async function runTrending(opts) {
54
+ try {
55
+ // 1. Resolve auth, create client
56
+ const token = await resolveToken();
57
+ const client = new GitHubClient(token);
58
+ const sinceDate = thirtyDaysAgo();
59
+ let issues;
60
+ if (opts.topic) {
61
+ // Topic filtering: search repos by topic first, then search issues in those repos
62
+ verbose(`Searching repos for topic "${opts.topic}"...`, opts.verbose);
63
+ const repos = await searchReposByTopic(client, opts.topic, opts.lang, 500);
64
+ const topRepos = repos.slice(0, 10);
65
+ if (topRepos.length === 0) {
66
+ console.error(`No repos found for topic "${opts.topic}".`);
67
+ process.exit(1);
68
+ }
69
+ // Search issues in each repo
70
+ const allIssues = [];
71
+ for (let i = 0; i < topRepos.length; i++) {
72
+ const repo = topRepos[i];
73
+ verbose(`Searching trending issues in ${repo.fullName} (${i + 1}/${topRepos.length})...`, opts.verbose);
74
+ try {
75
+ const repoQuery = `repo:${repo.fullName} reactions:>10 created:>${sinceDate}`;
76
+ const data = await client.get(`${BASE}/search/issues`, {
77
+ q: repoQuery,
78
+ sort: "reactions",
79
+ order: "desc",
80
+ per_page: "100",
81
+ });
82
+ allIssues.push(...data.items.map(mapSearchIssue));
83
+ }
84
+ catch (err) {
85
+ const msg = err instanceof Error ? err.message : String(err);
86
+ process.stderr.write(` Warning: skipped ${repo.fullName} (${msg})\n`);
87
+ }
88
+ }
89
+ issues = allIssues;
90
+ }
91
+ else {
92
+ // Direct search for high-reaction issues
93
+ let query = `reactions:>10 created:>${sinceDate}`;
94
+ if (opts.lang) {
95
+ query += ` language:${opts.lang}`;
96
+ }
97
+ verbose(`Searching trending issues: ${query}`, opts.verbose);
98
+ const data = await client.get(`${BASE}/search/issues`, {
99
+ q: query,
100
+ sort: "reactions",
101
+ order: "desc",
102
+ per_page: "100",
103
+ });
104
+ issues = data.items.map(mapSearchIssue);
105
+ }
106
+ if (issues.length === 0) {
107
+ console.log("No trending issues found matching your criteria.");
108
+ return;
109
+ }
110
+ verbose(`Found ${issues.length} trending issues, clustering...`, opts.verbose);
111
+ // 5. Cluster the issues
112
+ const clusters = clusterIssues(issues);
113
+ // 6. Create synthetic RepoMeta for scoring
114
+ // Extract repo info from issues to compute average stars (default 5000)
115
+ const syntheticMeta = {
116
+ owner: "trending",
117
+ repo: "github",
118
+ fullName: "trending/github",
119
+ stars: 5000,
120
+ pushedAt: new Date().toISOString(),
121
+ topics: opts.topic ? [opts.topic] : [],
122
+ language: opts.lang ?? null,
123
+ description: "Trending issues across GitHub",
124
+ };
125
+ // 7. Score clusters
126
+ const scored = scoreClusters(clusters, syntheticMeta, "cross");
127
+ // 8. Format output
128
+ const format = opts.output;
129
+ const result = formatScanResult(scored, { format, top: opts.top });
130
+ console.log(result);
131
+ }
132
+ catch (error) {
133
+ if (error instanceof RateLimitError) {
134
+ console.error(`Rate limit exhausted. Resets at ${new Date(error.resetAt * 1000).toISOString()}. Try again later or authenticate with a GitHub token.`);
135
+ process.exit(1);
136
+ }
137
+ if (error instanceof Error) {
138
+ console.error(`Error: ${error.message}`);
139
+ process.exit(1);
140
+ }
141
+ console.error("An unexpected error occurred.");
142
+ process.exit(1);
143
+ }
144
+ }
145
+ //# sourceMappingURL=trending.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trending.js","sourceRoot":"","sources":["../../src/commands/trending.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function resolveToken(): Promise<string | null>;
2
+ export declare function buildHeaders(token: string | null): Record<string, string>;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/github/auth.ts"],"names":[],"mappings":"AAEA,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsB3D;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB"}
@@ -0,0 +1,33 @@
1
+ import { execSync } from "node:child_process";
2
+ export async function resolveToken() {
3
+ // 1) GITHUB_TOKEN env var
4
+ const envToken = process.env.GITHUB_TOKEN;
5
+ if (envToken) {
6
+ return envToken;
7
+ }
8
+ // 2) gh auth token subprocess
9
+ try {
10
+ const token = execSync("gh auth token", {
11
+ encoding: "utf-8",
12
+ stdio: ["pipe", "pipe", "pipe"],
13
+ }).trim();
14
+ if (token) {
15
+ return token;
16
+ }
17
+ }
18
+ catch {
19
+ // gh CLI not installed or not authenticated — fall through
20
+ }
21
+ // 3) null (unauthenticated)
22
+ return null;
23
+ }
24
+ export function buildHeaders(token) {
25
+ const headers = {
26
+ Accept: "application/vnd.github.v3+json",
27
+ };
28
+ if (token) {
29
+ headers["Authorization"] = `Bearer ${token}`;
30
+ }
31
+ return headers;
32
+ }
33
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/github/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,EAAE;YACtC,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;IAED,4BAA4B;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAAoB;IAEpB,MAAM,OAAO,GAA2B;QACtC,MAAM,EAAE,gCAAgC;KACzC,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /** Repo metadata TTL: 24 hours */
2
+ export declare const REPO_TTL: number;
3
+ /** Issue data TTL: 1 hour */
4
+ export declare const ISSUE_TTL: number;
5
+ /**
6
+ * Generate a cache key from a URL and optional params.
7
+ * Returns the first 16 chars of a sha256 hex digest.
8
+ */
9
+ export declare function getCacheKey(url: string, params?: Record<string, string>): string;
10
+ /**
11
+ * Read a cached value. Returns null if missing or expired.
12
+ */
13
+ export declare function getCached<T>(key: string, ttlMs: number): Promise<T | null>;
14
+ /**
15
+ * Write a value to the cache.
16
+ */
17
+ export declare function setCache(key: string, data: unknown): Promise<void>;
18
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/github/cache.ts"],"names":[],"mappings":"AAKA,kCAAkC;AAClC,eAAO,MAAM,QAAQ,QAAsB,CAAC;AAE5C,6BAA6B;AAC7B,eAAO,MAAM,SAAS,QAAiB,CAAC;AAaxC;;;GAGG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAKR;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAYnB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,IAAI,CAAC,CAMf"}