@reneturcios/greenlight 0.9.3 → 0.10.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/sync.js ADDED
@@ -0,0 +1,320 @@
1
+ /**
2
+ * `greenlight sync`: reconcile the campaign's local memory with the GitHub
3
+ * API census (v0.10.0).
4
+ *
5
+ * Multi-agent field lesson 2026-10-18: several agents now open PRs in
6
+ * parallel threads, and the local claims registry only knows about PRs
7
+ * this process created. `sync` pulls the authoritative census
8
+ * (author:<login> type:pr via the search API) and reports drift:
9
+ *
10
+ * - PRs the registry has never seen (another agent opened them),
11
+ * - state mismatches (the registry says open, the API says merged),
12
+ * - stale claims (a claim older than --stale-days with no linked PR).
13
+ *
14
+ * With --write the census upserts the registry's known-PRs section; with
15
+ * --tracker <csv|json> it also diffs a tracker file. READS ONLY: sync
16
+ * never posts, claims, or closes anything on GitHub.
17
+ */
18
+ import { readFileSync } from "node:fs";
19
+ import { apiGet } from "./github.js";
20
+ import { defaultRegistryPath, loadRegistry, saveRegistry, } from "./claims-registry.js";
21
+ /**
22
+ * The authoritative PR census for one author. Paginated; the search API
23
+ * caps at 1000 results, so maxPages bounds the walk (default 10).
24
+ */
25
+ export async function fetchAuthorCensus(author, perPage = 100, maxPages = 10) {
26
+ const prs = [];
27
+ const q = encodeURIComponent(`author:${author} type:pr`);
28
+ for (let page = 1; page <= maxPages; page++) {
29
+ const data = (await apiGet(`/search/issues?q=${q}&per_page=${perPage}&page=${page}&sort=updated&order=desc`));
30
+ const items = data?.items ?? [];
31
+ for (const i of items) {
32
+ const m = /^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)/.exec(i.html_url ?? "");
33
+ if (!m)
34
+ continue;
35
+ prs.push({
36
+ owner: m[1],
37
+ repo: m[2],
38
+ number: Number(m[3]),
39
+ url: `https://github.com/${m[1]}/${m[2]}/pull/${m[3]}`,
40
+ title: i.title ?? "",
41
+ state: i.state === "open" ? "open" : "closed",
42
+ merged: !!(i.pull_request && i.pull_request.merged_at),
43
+ author: i.user?.login ?? author,
44
+ createdAt: i.created_at ?? "",
45
+ updatedAt: i.updated_at ?? "",
46
+ });
47
+ }
48
+ if (items.length < perPage)
49
+ break;
50
+ }
51
+ return prs;
52
+ }
53
+ /**
54
+ * Upsert the census into the registry's known-PRs section. New PRs are
55
+ * added; known ones get fresh state/title/lastSeen. Returns add/update
56
+ * counts so callers can report what moved.
57
+ */
58
+ export function upsertKnownPrs(path, prs, nowIso) {
59
+ const registry = loadRegistry(path);
60
+ const known = new Map((registry.prs ?? []).map((p) => [p.prUrl.toLowerCase(), p]));
61
+ let added = 0;
62
+ let updated = 0;
63
+ for (const c of prs) {
64
+ const key = c.url.toLowerCase();
65
+ const existing = known.get(key);
66
+ if (existing) {
67
+ existing.state = c.state;
68
+ existing.merged = c.merged;
69
+ existing.title = c.title;
70
+ existing.lastSeen = nowIso;
71
+ updated++;
72
+ }
73
+ else {
74
+ known.set(key, {
75
+ prUrl: c.url,
76
+ owner: c.owner,
77
+ repo: c.repo,
78
+ number: c.number,
79
+ state: c.state,
80
+ merged: c.merged,
81
+ title: c.title,
82
+ firstSeen: nowIso,
83
+ lastSeen: nowIso,
84
+ source: "census",
85
+ });
86
+ added++;
87
+ }
88
+ }
89
+ registry.prs = [...known.values()].sort((a, b) => a.repo === b.repo ? a.number - b.number : a.repo.localeCompare(b.repo));
90
+ saveRegistry(path, registry);
91
+ return { added, updated };
92
+ }
93
+ const TRACKER_KEYS = {
94
+ repo: ["repo", "repository"],
95
+ issue: ["issue", "issue_number", "number"],
96
+ prUrl: ["pr_url", "prurl", "pr", "pull_request"],
97
+ status: ["status", "state"],
98
+ };
99
+ function pick(row, keys) {
100
+ for (const k of keys) {
101
+ for (const actual of Object.keys(row)) {
102
+ if (actual.toLowerCase() === k) {
103
+ const v = row[actual];
104
+ if (v !== undefined && v !== null)
105
+ return String(v);
106
+ }
107
+ }
108
+ }
109
+ return "";
110
+ }
111
+ /**
112
+ * Parse a tracker file by extension: CSV with a header row, or a JSON
113
+ * array of objects. Columns/keys: repo, issue, pr_url, status (tolerant
114
+ * aliases accepted). Throws on an unreadable or unparseable file.
115
+ */
116
+ export function parseTracker(text, format) {
117
+ if (format === "json") {
118
+ const parsed = JSON.parse(text);
119
+ if (!Array.isArray(parsed))
120
+ throw new Error("tracker JSON must be an array of objects");
121
+ return parsed.map((r) => ({
122
+ repo: pick(r, TRACKER_KEYS.repo),
123
+ issue: pick(r, TRACKER_KEYS.issue),
124
+ prUrl: pick(r, TRACKER_KEYS.prUrl),
125
+ status: pick(r, TRACKER_KEYS.status),
126
+ }));
127
+ }
128
+ // Minimal CSV: header row, comma-separated, double-quote escaping.
129
+ const rows = [];
130
+ let cur = "";
131
+ let row = [];
132
+ let inQuotes = false;
133
+ for (let i = 0; i < text.length; i++) {
134
+ const ch = text[i];
135
+ if (inQuotes) {
136
+ if (ch === '"' && text[i + 1] === '"') {
137
+ cur += '"';
138
+ i++;
139
+ }
140
+ else if (ch === '"') {
141
+ inQuotes = false;
142
+ }
143
+ else {
144
+ cur += ch;
145
+ }
146
+ }
147
+ else if (ch === '"') {
148
+ inQuotes = true;
149
+ }
150
+ else if (ch === ",") {
151
+ row.push(cur);
152
+ cur = "";
153
+ }
154
+ else if (ch === "\n" || ch === "\r") {
155
+ if (ch === "\r" && text[i + 1] === "\n")
156
+ i++;
157
+ row.push(cur);
158
+ cur = "";
159
+ if (row.some((c) => c.trim().length > 0))
160
+ rows.push(row);
161
+ row = [];
162
+ }
163
+ else {
164
+ cur += ch;
165
+ }
166
+ }
167
+ row.push(cur);
168
+ if (row.some((c) => c.trim().length > 0))
169
+ rows.push(row);
170
+ if (rows.length === 0)
171
+ return [];
172
+ const header = rows[0].map((h) => h.trim().toLowerCase());
173
+ const idx = (keys) => {
174
+ for (const k of keys) {
175
+ const i = header.indexOf(k);
176
+ if (i >= 0)
177
+ return i;
178
+ }
179
+ return -1;
180
+ };
181
+ const ri = idx(TRACKER_KEYS.repo);
182
+ const ii = idx(TRACKER_KEYS.issue);
183
+ const pi = idx(TRACKER_KEYS.prUrl);
184
+ const si = idx(TRACKER_KEYS.status);
185
+ return rows.slice(1).map((r) => ({
186
+ repo: ri >= 0 ? (r[ri] ?? "").trim() : "",
187
+ issue: ii >= 0 ? (r[ii] ?? "").trim() : "",
188
+ prUrl: pi >= 0 ? (r[pi] ?? "").trim() : "",
189
+ status: si >= 0 ? (r[si] ?? "").trim() : "",
190
+ }));
191
+ }
192
+ export function loadTrackerFile(path) {
193
+ const text = readFileSync(path, "utf8");
194
+ const lower = path.toLowerCase();
195
+ if (lower.endsWith(".json"))
196
+ return parseTracker(text, "json");
197
+ if (lower.endsWith(".csv"))
198
+ return parseTracker(text, "csv");
199
+ throw new Error(`tracker file must end in .csv or .json: ${path}`);
200
+ }
201
+ /**
202
+ * Pure drift computation: census (API truth) vs the local registry and
203
+ * an optional tracker. A claim counts as linked when its prUrl appears in
204
+ * the census; a registry PR counts as known when the census confirms it.
205
+ */
206
+ export function computeDrift(census, registry, tracker, staleDays, nowMs) {
207
+ const censusByUrl = new Map(census.map((c) => [c.url.toLowerCase(), c]));
208
+ const knownUrls = new Set((registry.prs ?? []).map((p) => p.prUrl.toLowerCase()));
209
+ const claimPrUrls = new Set(registry.claims.map((c) => (c.prUrl ?? "").toLowerCase()).filter((u) => u.length > 0));
210
+ const unknownPrs = [];
211
+ for (const c of census) {
212
+ const key = c.url.toLowerCase();
213
+ if (!knownUrls.has(key) && !claimPrUrls.has(key)) {
214
+ unknownPrs.push({
215
+ kind: "unknown-pr",
216
+ repo: `${c.owner}/${c.repo}`,
217
+ number: c.number,
218
+ url: c.url,
219
+ detail: `${c.state}${c.merged ? " (merged)" : ""}: ${c.title}`.trim(),
220
+ });
221
+ }
222
+ }
223
+ const stateMismatches = [];
224
+ const checkState = (url, localState, source) => {
225
+ const c = censusByUrl.get(url.toLowerCase());
226
+ if (!c)
227
+ return;
228
+ const apiState = c.merged ? "merged" : c.state;
229
+ if (localState.toLowerCase() !== apiState) {
230
+ stateMismatches.push({
231
+ kind: "state-mismatch",
232
+ repo: `${c.owner}/${c.repo}`,
233
+ number: c.number,
234
+ url: c.url,
235
+ detail: `${source} says "${localState}", API says "${apiState}"`,
236
+ });
237
+ }
238
+ };
239
+ for (const p of registry.prs ?? []) {
240
+ checkState(p.prUrl, p.merged ? "merged" : p.state, "registry");
241
+ }
242
+ if (tracker) {
243
+ for (const t of tracker) {
244
+ if (t.prUrl)
245
+ checkState(t.prUrl, t.status, "tracker");
246
+ }
247
+ }
248
+ const staleClaims = [];
249
+ const staleMs = staleDays * 24 * 60 * 60 * 1000;
250
+ for (const cl of registry.claims) {
251
+ if (cl.prUrl)
252
+ continue;
253
+ const age = nowMs - Date.parse(cl.postedAt);
254
+ if (Number.isFinite(age) && age >= staleMs) {
255
+ staleClaims.push({
256
+ kind: "stale-claim",
257
+ repo: `${cl.owner}/${cl.repo}`,
258
+ number: cl.number,
259
+ url: cl.issueUrl,
260
+ detail: `claimed ${Math.round(age / (24 * 60 * 60 * 1000))}d ago, no linked PR`,
261
+ });
262
+ }
263
+ }
264
+ return {
265
+ unknownPrs,
266
+ stateMismatches,
267
+ staleClaims,
268
+ counts: {
269
+ census: census.length,
270
+ open: census.filter((c) => c.state === "open").length,
271
+ merged: census.filter((c) => c.merged).length,
272
+ closedUnmerged: census.filter((c) => c.state === "closed" && !c.merged).length,
273
+ registryClaims: registry.claims.length,
274
+ knownPrs: registry.prs?.length ?? 0,
275
+ trackerRows: tracker ? tracker.length : null,
276
+ },
277
+ };
278
+ }
279
+ /** Human drift report: deltas first, counts after. */
280
+ export function formatSyncHuman(drift, author) {
281
+ const lines = [];
282
+ const total = drift.unknownPrs.length + drift.stateMismatches.length + drift.staleClaims.length;
283
+ lines.push(`**sync: ${total} drift item${total === 1 ? "" : "s"}** (census author:${author})`);
284
+ const section = (title, items) => {
285
+ lines.push("");
286
+ lines.push(`## ${title} (${items.length})`);
287
+ if (items.length === 0)
288
+ lines.push("_None._");
289
+ else
290
+ for (const i of items)
291
+ lines.push(`- ${i.repo}#${i.number} — ${i.detail} (${i.url})`);
292
+ };
293
+ section("PRs the registry does not know", drift.unknownPrs);
294
+ section("State mismatches (local vs API truth)", drift.stateMismatches);
295
+ section("Stale claims (no PR after the window)", drift.staleClaims);
296
+ lines.push("");
297
+ const c = drift.counts;
298
+ lines.push(`_census: ${c.census} PRs (${c.open} open, ${c.merged} merged, ${c.closedUnmerged} closed unmerged); registry: ${c.registryClaims} claims, ${c.knownPrs} known PRs${c.trackerRows === null ? "" : `; tracker: ${c.trackerRows} rows`}._`);
299
+ return lines.join("\n");
300
+ }
301
+ export function syncJson(drift, author) {
302
+ return { author, drift };
303
+ }
304
+ /** Full sync run: census, drift, optional tracker diff, optional registry write. */
305
+ export async function runSync(opts) {
306
+ const registryPath = opts.registryPath ?? defaultRegistryPath();
307
+ const nowMs = opts.nowMs ?? Date.now();
308
+ const census = await fetchAuthorCensus(opts.author);
309
+ let tracker = null;
310
+ if (opts.trackerPath)
311
+ tracker = loadTrackerFile(opts.trackerPath);
312
+ const registry = loadRegistry(registryPath);
313
+ const drift = computeDrift(census, registry, tracker, opts.staleDays ?? 7, nowMs);
314
+ let wrote = null;
315
+ if (opts.write) {
316
+ wrote = upsertKnownPrs(registryPath, census, new Date(nowMs).toISOString());
317
+ }
318
+ return { drift, wrote, author: opts.author };
319
+ }
320
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -25,7 +25,7 @@
25
25
  "test": "tsx --test test/*.test.ts"
26
26
  },
27
27
  "type": "module",
28
- "version": "0.9.3",
28
+ "version": "0.10.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.9.3",
9
+ "version": "0.10.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.9.3",
15
+ "version": "0.10.0",
16
16
  "runtimeHint": "npx",
17
17
  "packageArguments": [
18
18
  {