@reneturcios/greenlight 0.9.2 → 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/README.md +35 -0
- package/dist/automate.js +11 -17
- package/dist/automate.js.map +1 -1
- package/dist/babysit.d.ts +10 -1
- package/dist/babysit.js +37 -6
- package/dist/babysit.js.map +1 -1
- package/dist/claims-registry.d.ts +21 -0
- package/dist/claims-registry.js +6 -1
- package/dist/claims-registry.js.map +1 -1
- package/dist/cli.js +70 -32
- package/dist/cli.js.map +1 -1
- package/dist/digest.d.ts +0 -1
- package/dist/digest.js +2 -2
- package/dist/digest.js.map +1 -1
- package/dist/friction.d.ts +12 -4
- package/dist/friction.js +45 -14
- package/dist/friction.js.map +1 -1
- package/dist/gates.d.ts +16 -0
- package/dist/gates.js +169 -4
- package/dist/gates.js.map +1 -1
- package/dist/github.d.ts +21 -1
- package/dist/github.js +93 -13
- package/dist/github.js.map +1 -1
- package/dist/guard.d.ts +0 -1
- package/dist/guard.js +2 -2
- package/dist/guard.js.map +1 -1
- package/dist/help.js +31 -1
- package/dist/help.js.map +1 -1
- package/dist/index.js +36 -2
- package/dist/index.js.map +1 -1
- package/dist/portfolio.d.ts +77 -0
- package/dist/portfolio.js +108 -0
- package/dist/portfolio.js.map +1 -0
- package/dist/posting-ledger.d.ts +51 -1
- package/dist/posting-ledger.js +145 -8
- package/dist/posting-ledger.js.map +1 -1
- package/dist/scout.d.ts +5 -0
- package/dist/scout.js +9 -1
- package/dist/scout.js.map +1 -1
- package/dist/sync.d.ts +88 -0
- package/dist/sync.js +320 -0
- package/dist/sync.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/package.json +1 -1
- package/server.json +2 -2
package/dist/sync.d.ts
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { type ClaimsRegistryFile } from "./claims-registry.js";
|
|
2
|
+
export interface CensusPr {
|
|
3
|
+
owner: string;
|
|
4
|
+
repo: string;
|
|
5
|
+
number: number;
|
|
6
|
+
url: string;
|
|
7
|
+
title: string;
|
|
8
|
+
state: "open" | "closed";
|
|
9
|
+
merged: boolean;
|
|
10
|
+
author: string;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
updatedAt: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The authoritative PR census for one author. Paginated; the search API
|
|
16
|
+
* caps at 1000 results, so maxPages bounds the walk (default 10).
|
|
17
|
+
*/
|
|
18
|
+
export declare function fetchAuthorCensus(author: string, perPage?: number, maxPages?: number): Promise<CensusPr[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Upsert the census into the registry's known-PRs section. New PRs are
|
|
21
|
+
* added; known ones get fresh state/title/lastSeen. Returns add/update
|
|
22
|
+
* counts so callers can report what moved.
|
|
23
|
+
*/
|
|
24
|
+
export declare function upsertKnownPrs(path: string, prs: CensusPr[], nowIso: string): {
|
|
25
|
+
added: number;
|
|
26
|
+
updated: number;
|
|
27
|
+
};
|
|
28
|
+
/** One row of an optional tracker file (repo, issue, pr_url, status columns). */
|
|
29
|
+
export interface TrackerRow {
|
|
30
|
+
repo: string;
|
|
31
|
+
issue: string;
|
|
32
|
+
prUrl: string;
|
|
33
|
+
status: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse a tracker file by extension: CSV with a header row, or a JSON
|
|
37
|
+
* array of objects. Columns/keys: repo, issue, pr_url, status (tolerant
|
|
38
|
+
* aliases accepted). Throws on an unreadable or unparseable file.
|
|
39
|
+
*/
|
|
40
|
+
export declare function parseTracker(text: string, format: "csv" | "json"): TrackerRow[];
|
|
41
|
+
export declare function loadTrackerFile(path: string): TrackerRow[];
|
|
42
|
+
export interface DriftItem {
|
|
43
|
+
kind: "unknown-pr" | "state-mismatch" | "stale-claim";
|
|
44
|
+
repo: string;
|
|
45
|
+
number: number;
|
|
46
|
+
url: string;
|
|
47
|
+
detail: string;
|
|
48
|
+
}
|
|
49
|
+
export interface SyncDrift {
|
|
50
|
+
unknownPrs: DriftItem[];
|
|
51
|
+
stateMismatches: DriftItem[];
|
|
52
|
+
staleClaims: DriftItem[];
|
|
53
|
+
counts: {
|
|
54
|
+
census: number;
|
|
55
|
+
open: number;
|
|
56
|
+
merged: number;
|
|
57
|
+
closedUnmerged: number;
|
|
58
|
+
registryClaims: number;
|
|
59
|
+
knownPrs: number;
|
|
60
|
+
trackerRows: number | null;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Pure drift computation: census (API truth) vs the local registry and
|
|
65
|
+
* an optional tracker. A claim counts as linked when its prUrl appears in
|
|
66
|
+
* the census; a registry PR counts as known when the census confirms it.
|
|
67
|
+
*/
|
|
68
|
+
export declare function computeDrift(census: CensusPr[], registry: ClaimsRegistryFile, tracker: TrackerRow[] | null, staleDays: number, nowMs: number): SyncDrift;
|
|
69
|
+
/** Human drift report: deltas first, counts after. */
|
|
70
|
+
export declare function formatSyncHuman(drift: SyncDrift, author: string): string;
|
|
71
|
+
export declare function syncJson(drift: SyncDrift, author: string): Record<string, unknown>;
|
|
72
|
+
export interface SyncRunOptions {
|
|
73
|
+
author: string;
|
|
74
|
+
trackerPath?: string;
|
|
75
|
+
staleDays?: number;
|
|
76
|
+
write?: boolean;
|
|
77
|
+
registryPath?: string;
|
|
78
|
+
nowMs?: number;
|
|
79
|
+
}
|
|
80
|
+
/** Full sync run: census, drift, optional tracker diff, optional registry write. */
|
|
81
|
+
export declare function runSync(opts: SyncRunOptions): Promise<{
|
|
82
|
+
drift: SyncDrift;
|
|
83
|
+
wrote: {
|
|
84
|
+
added: number;
|
|
85
|
+
updated: number;
|
|
86
|
+
} | null;
|
|
87
|
+
author: string;
|
|
88
|
+
}>;
|
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
|
package/dist/sync.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -181,6 +181,12 @@ export interface RepoSignals {
|
|
|
181
181
|
repo: string;
|
|
182
182
|
gates: Gate[];
|
|
183
183
|
externalPRMergeRate?: number | null;
|
|
184
|
+
/**
|
|
185
|
+
* v0.9.3: the same share as a 0..100 number. Ratio fields in JSON output
|
|
186
|
+
* always ship both units now (fraction + _pct) so consumers never have
|
|
187
|
+
* to guess: the fraction keeps its meaning, the _pct is unambiguous.
|
|
188
|
+
*/
|
|
189
|
+
externalPRMergeRate_pct?: number | null;
|
|
184
190
|
medianFirstReviewHours?: number | null;
|
|
185
191
|
maintainerIssueResponseHours?: number | null;
|
|
186
192
|
openGoodFirstIssueCount?: number | null;
|
|
@@ -248,4 +254,13 @@ export interface FrictionReport {
|
|
|
248
254
|
* median days to merge. Absent when it could not be computed.
|
|
249
255
|
*/
|
|
250
256
|
mergeVelocity?: import("./merge-velocity.js").MergeVelocityStats | null;
|
|
257
|
+
/**
|
|
258
|
+
* v0.9.3: outsider merge share with an explicit unit contract, because
|
|
259
|
+
* an implicit fraction was once rendered as a percent downstream.
|
|
260
|
+
* `outsider_merge_share` is the 0..1 fraction (same meaning as
|
|
261
|
+
* mergeVelocity.externalShare); `outsider_merge_share_pct` is the same
|
|
262
|
+
* number on a 0..100 scale, rounded. Both are null when uncomputable.
|
|
263
|
+
*/
|
|
264
|
+
outsider_merge_share?: number | null;
|
|
265
|
+
outsider_merge_share_pct?: number | null;
|
|
251
266
|
}
|
package/package.json
CHANGED
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
|
+
"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.
|
|
15
|
+
"version": "0.10.0",
|
|
16
16
|
"runtimeHint": "npx",
|
|
17
17
|
"packageArguments": [
|
|
18
18
|
{
|