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.
- package/README.md +195 -0
- package/dist/analysis/ai-scorer.d.ts +34 -0
- package/dist/analysis/ai-scorer.d.ts.map +1 -0
- package/dist/analysis/ai-scorer.js +139 -0
- package/dist/analysis/ai-scorer.js.map +1 -0
- package/dist/analysis/cluster.d.ts +14 -0
- package/dist/analysis/cluster.d.ts.map +1 -0
- package/dist/analysis/cluster.js +223 -0
- package/dist/analysis/cluster.js.map +1 -0
- package/dist/analysis/scorer.d.ts +27 -0
- package/dist/analysis/scorer.d.ts.map +1 -0
- package/dist/analysis/scorer.js +196 -0
- package/dist/analysis/scorer.js.map +1 -0
- package/dist/analysis/signals.d.ts +30 -0
- package/dist/analysis/signals.d.ts.map +1 -0
- package/dist/analysis/signals.js +59 -0
- package/dist/analysis/signals.js.map +1 -0
- package/dist/analysis/tokenizer.d.ts +15 -0
- package/dist/analysis/tokenizer.d.ts.map +1 -0
- package/dist/analysis/tokenizer.js +64 -0
- package/dist/analysis/tokenizer.js.map +1 -0
- package/dist/commands/evidence.d.ts +9 -0
- package/dist/commands/evidence.d.ts.map +1 -0
- package/dist/commands/evidence.js +229 -0
- package/dist/commands/evidence.js.map +1 -0
- package/dist/commands/scan-org.d.ts +3 -0
- package/dist/commands/scan-org.d.ts.map +1 -0
- package/dist/commands/scan-org.js +88 -0
- package/dist/commands/scan-org.js.map +1 -0
- package/dist/commands/scan.d.ts +32 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +197 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/trending.d.ts +14 -0
- package/dist/commands/trending.d.ts.map +1 -0
- package/dist/commands/trending.js +145 -0
- package/dist/commands/trending.js.map +1 -0
- package/dist/github/auth.d.ts +3 -0
- package/dist/github/auth.d.ts.map +1 -0
- package/dist/github/auth.js +33 -0
- package/dist/github/auth.js.map +1 -0
- package/dist/github/cache.d.ts +18 -0
- package/dist/github/cache.d.ts.map +1 -0
- package/dist/github/cache.js +51 -0
- package/dist/github/cache.js.map +1 -0
- package/dist/github/client.d.ts +24 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +140 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/fetchers.d.ts +13 -0
- package/dist/github/fetchers.d.ts.map +1 -0
- package/dist/github/fetchers.js +142 -0
- package/dist/github/fetchers.js.map +1 -0
- package/dist/github/types.d.ts +46 -0
- package/dist/github/types.d.ts.map +1 -0
- package/dist/github/types.js +2 -0
- package/dist/github/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/output/formatters.d.ts +35 -0
- package/dist/output/formatters.d.ts.map +1 -0
- package/dist/output/formatters.js +195 -0
- package/dist/output/formatters.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|