@reneturcios/greenlight 0.15.0 → 0.16.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/dist/wave.js ADDED
@@ -0,0 +1,258 @@
1
+ /**
2
+ * Wave shortlist (v0.16.0): turn the Agent Policy Index into a build
3
+ * queue in one command.
4
+ *
5
+ * Field data (2026-10-19, PR wave): the wave coordinator hand-rolled
6
+ * vetting scripts (index filter plus per-issue timeline cross-checks
7
+ * across repos) because Greenlight could not produce a build queue in one
8
+ * command. This module is that pipeline, built from the existing parts:
9
+ * 1. Index filter: pure-open repos (policy_classes == ["open"]) with
10
+ * outsider merge share, star band, and starter-issue count.
11
+ * 2. Starter issues per repo (label search, the same source scan uses).
12
+ * 3. The EXISTING xray timeline verification per issue (reused, never
13
+ * forked): verdicts map GO -> CLEAR, TAKEN -> TAKEN (with the reason
14
+ * naming competing PRs).
15
+ * 4. Behavioral gate check (Feature 1) on repos that survive, only for
16
+ * repos that produced at least one CLEAR issue: a detected
17
+ * behavioral gate excludes the repo with the reason named.
18
+ * 5. A repo is also skipped when the authenticated user already has an
19
+ * open PR there (one search call, not one per repo).
20
+ *
21
+ * Budget honesty: every stage reports the GitHub API calls it used, and
22
+ * the run stops with partial results (marked partial) when the core
23
+ * budget falls under the floor, so a wave never strands the rate limit.
24
+ * Search-side throttling (GitHub's secondary rate limits) degrades to
25
+ * partial results the same way instead of failing the whole run.
26
+ */
27
+ import { apiGet, apiCallsUsed, listStarterIssues, RateLimitError } from "./github.js";
28
+ import { xrayIssue } from "./xray.js";
29
+ import { detectBehavioralGate } from "./behavior.js";
30
+ export const POLICY_INDEX_URL = "https://cloudcorprecords.github.io/greenlight/policy.json";
31
+ export const DEFAULT_WAVE_FILTERS = {
32
+ minShare: 40,
33
+ minStars: 1000,
34
+ maxStars: 150000,
35
+ maxRepos: 10,
36
+ issuesPerRepo: 3,
37
+ minBudget: 800,
38
+ };
39
+ /** Pure: the index-side filter. Candidates must be pure-open, actually
40
+ * merge outsider PRs, sit in the star band, and have starter issues. */
41
+ export function filterWaveRepos(entries, filters) {
42
+ return entries
43
+ .filter((e) => {
44
+ const classes = e.policy_classes ?? [];
45
+ if (classes.length !== 1 || classes[0] !== "open")
46
+ return false;
47
+ if ((e.good_first_issues ?? 0) < 1)
48
+ return false;
49
+ if ((e.outsider_merge_share ?? 0) < filters.minShare)
50
+ return false;
51
+ const stars = e.stars ?? 0;
52
+ if (stars < filters.minStars || stars > filters.maxStars)
53
+ return false;
54
+ return true;
55
+ })
56
+ .sort((a, b) => (b.stars ?? 0) - (a.stars ?? 0))
57
+ .slice(0, filters.maxRepos);
58
+ }
59
+ function mapXrayVerdict(v) {
60
+ switch (v) {
61
+ case "GO":
62
+ return "CLEAR";
63
+ case "RISKY":
64
+ return "RISKY";
65
+ case "TAKEN":
66
+ return "TAKEN";
67
+ default:
68
+ return "ERROR";
69
+ }
70
+ }
71
+ export async function runWave(index, filters, deps) {
72
+ const callsBefore = apiCallsUsed();
73
+ const finish = (repos, partial, partialReason) => {
74
+ const queue = [];
75
+ for (const r of repos) {
76
+ for (const i of r.issues) {
77
+ if (i.verdict === "CLEAR" || i.verdict === "RISKY")
78
+ queue.push(i);
79
+ }
80
+ }
81
+ const tier = { CLEAR: 0, RISKY: 1, TAKEN: 2, ERROR: 3 };
82
+ queue.sort((a, b) => (tier[a.verdict] ?? 9) - (tier[b.verdict] ?? 9));
83
+ return {
84
+ repos,
85
+ queue,
86
+ apiCalls: apiCallsUsed() - callsBefore,
87
+ partial,
88
+ partialReason,
89
+ filters,
90
+ candidatesConsidered: repos.length,
91
+ };
92
+ };
93
+ const candidates = filterWaveRepos(index, filters);
94
+ const rateLimited = (err) => err instanceof RateLimitError
95
+ ? finish([], true, `rate limited: ${err.message}`)
96
+ : null;
97
+ try {
98
+ if ((await deps.remainingBudget()) < filters.minBudget) {
99
+ return finish([], true, `core budget under the ${filters.minBudget} floor before the run started`);
100
+ }
101
+ }
102
+ catch (err) {
103
+ const partial = rateLimited(err);
104
+ if (partial)
105
+ return partial;
106
+ throw err;
107
+ }
108
+ let login;
109
+ let ownPrs;
110
+ try {
111
+ login = await deps.getLogin();
112
+ ownPrs = await deps.ownOpenPrRepos(login);
113
+ }
114
+ catch (err) {
115
+ const partial = rateLimited(err);
116
+ if (partial)
117
+ return partial;
118
+ throw err;
119
+ }
120
+ const repos = [];
121
+ for (const entry of candidates) {
122
+ try {
123
+ if ((await deps.remainingBudget()) < filters.minBudget) {
124
+ return finish(repos, true, `core budget fell under the ${filters.minBudget} floor at ${entry.repo}`);
125
+ }
126
+ const [owner, repoName] = entry.repo.split("/");
127
+ const base = {
128
+ repo: entry.repo,
129
+ url: entry.url ?? `https://github.com/${entry.repo}`,
130
+ stars: entry.stars ?? 0,
131
+ issues: [],
132
+ };
133
+ if (ownPrs.has(entry.repo.toLowerCase())) {
134
+ repos.push({ ...base, excluded: "you already have an open PR here" });
135
+ continue;
136
+ }
137
+ const starters = await deps.starterIssues(owner, repoName, filters.issuesPerRepo);
138
+ if (starters.length === 0) {
139
+ repos.push({ ...base, excluded: "no starter issues found via the label search" });
140
+ continue;
141
+ }
142
+ const issues = [];
143
+ for (const s of starters) {
144
+ const xr = await deps.xray(owner, repoName, s.number);
145
+ const competingPRs = xr.linkedPRs
146
+ .filter((p) => p.state === "open")
147
+ .map((p) => ({ number: p.number, url: p.url, state: p.state }));
148
+ issues.push({
149
+ repo: entry.repo,
150
+ number: s.number,
151
+ title: s.title,
152
+ url: s.url,
153
+ verdict: mapXrayVerdict(xr.verdict),
154
+ reasons: xr.reasons,
155
+ flags: xr.flags,
156
+ competingPRs,
157
+ apiCalls: xr.apiCalls,
158
+ });
159
+ }
160
+ const repoEntry = { ...base, issues };
161
+ const hasClear = issues.some((i) => i.verdict === "CLEAR");
162
+ if (hasClear) {
163
+ const gate = await deps.behavioral(owner, repoName);
164
+ repoEntry.behavioralGate = gate;
165
+ if (gate.detected) {
166
+ repos.push({
167
+ ...repoEntry,
168
+ excluded: `behavioral gate: maintainer rejects AI-built PRs in practice (${gate.strength} signal${gate.strength === 1 ? "" : "s"})`,
169
+ issues: [],
170
+ });
171
+ continue;
172
+ }
173
+ }
174
+ repos.push(repoEntry);
175
+ }
176
+ catch (err) {
177
+ if (err instanceof RateLimitError) {
178
+ return finish(repos, true, `rate limited at ${entry.repo}: ${err.message}`);
179
+ }
180
+ throw err;
181
+ }
182
+ }
183
+ return finish(repos, false);
184
+ }
185
+ /** Load the index from a URL or a local file path. */
186
+ export async function loadPolicyIndex(source) {
187
+ let raw;
188
+ if (/^https?:\/\//i.test(source)) {
189
+ const res = await fetch(source);
190
+ if (!res.ok)
191
+ throw new Error(`policy index fetch failed: ${res.status} ${source}`);
192
+ raw = await res.text();
193
+ }
194
+ else {
195
+ const { readFileSync } = await import("node:fs");
196
+ raw = readFileSync(source, "utf8");
197
+ }
198
+ const data = JSON.parse(raw);
199
+ if (!Array.isArray(data.entries))
200
+ throw new Error("policy index has no entries array");
201
+ return data.entries;
202
+ }
203
+ /** The real deps: one shared search for the user's open PRs, xray reuse. */
204
+ export function liveWaveDeps() {
205
+ return {
206
+ async getLogin() {
207
+ const me = (await apiGet("/user"));
208
+ return String(me.login ?? "");
209
+ },
210
+ async ownOpenPrRepos(login) {
211
+ const data = (await apiGet(`/search/issues?q=${encodeURIComponent(`author:${login} type:pr state:open`)}&per_page=100`));
212
+ const set = new Set();
213
+ for (const item of data.items ?? []) {
214
+ const m = /\/repos\/([^/]+\/[^/]+)$/.exec(item.repository_url ?? "");
215
+ if (m)
216
+ set.add(m[1].toLowerCase());
217
+ }
218
+ return set;
219
+ },
220
+ starterIssues(owner, repo, limit) {
221
+ return listStarterIssues(owner, repo, limit);
222
+ },
223
+ xray(owner, repo, number) {
224
+ return xrayIssue(owner, repo, number);
225
+ },
226
+ behavioral(owner, repo) {
227
+ return detectBehavioralGate(owner, repo);
228
+ },
229
+ async remainingBudget() {
230
+ const data = (await apiGet("/rate_limit"));
231
+ return data.resources?.core?.remaining ?? 0;
232
+ },
233
+ };
234
+ }
235
+ export function formatWaveHuman(result) {
236
+ const lines = [];
237
+ lines.push(`wave queue: ${result.queue.length} issue(s) across ${result.repos.length} repos`);
238
+ let n = 0;
239
+ for (const i of result.queue) {
240
+ n++;
241
+ lines.push(`${n}. [${i.verdict}] ${i.repo}#${i.number}: ${i.title}`);
242
+ lines.push(` ${i.url}`);
243
+ if (i.reasons[0])
244
+ lines.push(` why: ${i.reasons[0]}`);
245
+ if (i.competingPRs.length > 0) {
246
+ lines.push(` competing: ${i.competingPRs.map((p) => `#${p.number} (${p.state})`).join(", ")}`);
247
+ }
248
+ }
249
+ for (const r of result.repos) {
250
+ if (r.excluded)
251
+ lines.push(`skip: ${r.repo} (${r.excluded})`);
252
+ }
253
+ if (result.partial)
254
+ lines.push(`PARTIAL: ${result.partialReason}`);
255
+ lines.push(`API calls used: ${result.apiCalls}`);
256
+ return lines.join("\n");
257
+ }
258
+ //# sourceMappingURL=wave.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wave.js","sourceRoot":"","sources":["../src/wave.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "@modelcontextprotocol/sdk": "^1",
7
7
  "zod": "^3"
8
8
  },
9
- "description": "Pre-flight checks for open-source contributions: is this issue actually landable?",
9
+ "description": "Pre-flight and coordination layer for open-source contribution: issue verdicts, Timeline X-Ray, PR radar and review briefs. CLI + MCP server.",
10
10
  "devDependencies": {
11
11
  "@types/node": "^20",
12
12
  "tsx": "^4",
@@ -25,7 +25,7 @@
25
25
  "test": "tsx --test test/*.test.ts"
26
26
  },
27
27
  "type": "module",
28
- "version": "0.15.0",
28
+ "version": "0.16.0",
29
29
  "mcpName": "io.github.CloudCorpRecords/greenlight",
30
30
  "publishConfig": {
31
31
  "access": "public"
package/server.json CHANGED
@@ -6,13 +6,13 @@
6
6
  "url": "https://github.com/CloudCorpRecords/greenlight",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.15.0",
9
+ "version": "0.16.0",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "registryBaseUrl": "https://registry.npmjs.org",
14
14
  "identifier": "@reneturcios/greenlight",
15
- "version": "0.15.0",
15
+ "version": "0.16.0",
16
16
  "runtimeHint": "npx",
17
17
  "packageArguments": [
18
18
  {