@reneturcios/greenlight 0.9.3 → 0.10.1
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 +34 -0
- package/dist/automate.js +27 -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/capabilities.d.ts +52 -0
- package/dist/capabilities.js +135 -0
- package/dist/capabilities.js.map +1 -0
- 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 +140 -4
- 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/guard.d.ts +0 -1
- package/dist/guard.js +2 -2
- package/dist/guard.js.map +1 -1
- package/dist/help.js +61 -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/preflight.d.ts +39 -0
- package/dist/preflight.js +169 -0
- package/dist/preflight.js.map +1 -0
- package/dist/scout.d.ts +21 -0
- package/dist/scout.js +27 -1
- package/dist/scout.js.map +1 -1
- package/dist/shipcheck.d.ts +37 -0
- package/dist/shipcheck.js +228 -0
- package/dist/shipcheck.js.map +1 -0
- package/dist/sync.d.ts +88 -0
- package/dist/sync.js +320 -0
- package/dist/sync.js.map +1 -0
- package/package.json +1 -1
- package/server.json +26 -2
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `greenlight preflight`: a reads-only go/no-go check before building a
|
|
3
|
+
* fix or opening a PR, so structural dead ends surface before the work
|
|
4
|
+
* starts instead of after it finishes.
|
|
5
|
+
*
|
|
6
|
+
* Field lessons 2026-10-18:
|
|
7
|
+
* - F2: actualbudget/actual blocked PR creation (422) and
|
|
8
|
+
* modelcontextprotocol/typescript-sdk 404'd it despite a valid fork.
|
|
9
|
+
* Both were learned after full builds. The capability ledger now
|
|
10
|
+
* remembers; preflight reports KNOWN-BLOCKED with the evidence.
|
|
11
|
+
* - F3: actual #7333's upstream moved on the exact file the built fix
|
|
12
|
+
* touched, discovered at open time. With --base and --files,
|
|
13
|
+
* preflight compares each file's blob at the build base against the
|
|
14
|
+
* current upstream head and flags DRIFTED files by name.
|
|
15
|
+
*
|
|
16
|
+
* It also checks the fork exists with the right parent and summarizes
|
|
17
|
+
* the repo's policy gates via the existing gate detection. Reads only.
|
|
18
|
+
*/
|
|
19
|
+
import { apiGet, ApiNotFoundError, fetchPolicySources, detectRepoPolicy } from "./github.js";
|
|
20
|
+
import { parseGatesFromSources } from "./gates.js";
|
|
21
|
+
import { loadCapabilities, latestCapability, isBlockedOutcome, defaultCapabilitiesPath } from "./capabilities.js";
|
|
22
|
+
async function checkFork(owner, repo) {
|
|
23
|
+
let viewer;
|
|
24
|
+
try {
|
|
25
|
+
const me = (await apiGet("/user"));
|
|
26
|
+
viewer = String(me.login ?? "");
|
|
27
|
+
if (!viewer)
|
|
28
|
+
return { ok: false, detail: "could not determine the GitHub user (no token?)" };
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
return { ok: false, detail: `could not determine the GitHub user: ${err instanceof Error ? err.message : String(err)}` };
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const fork = (await apiGet(`/repos/${viewer}/${repo}`));
|
|
35
|
+
if (fork.fork !== true) {
|
|
36
|
+
return { ok: false, detail: `${viewer}/${repo} exists but is not a fork` };
|
|
37
|
+
}
|
|
38
|
+
const parent = String(fork.parent?.full_name ?? "").toLowerCase();
|
|
39
|
+
if (parent !== `${owner}/${repo}`.toLowerCase()) {
|
|
40
|
+
return { ok: false, detail: `${viewer}/${repo} is a fork of ${parent || "(unknown)"}, not ${owner}/${repo}` };
|
|
41
|
+
}
|
|
42
|
+
return { ok: true, detail: `${viewer}/${repo} is a fork of ${owner}/${repo}` };
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
if (err instanceof ApiNotFoundError) {
|
|
46
|
+
return { ok: false, detail: `no fork ${viewer}/${repo} exists` };
|
|
47
|
+
}
|
|
48
|
+
return { ok: false, detail: `could not check the fork: ${err instanceof Error ? err.message : String(err)}` };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function checkCapability(owner, repo, capabilitiesPath) {
|
|
52
|
+
const file = loadCapabilities(capabilitiesPath ?? defaultCapabilitiesPath());
|
|
53
|
+
const latest = latestCapability(file, `${owner}/${repo}`, "pr_create");
|
|
54
|
+
if (!latest) {
|
|
55
|
+
return { verdict: "NO-RECORD", detail: "no recorded pr_create outcome for this repo" };
|
|
56
|
+
}
|
|
57
|
+
if (isBlockedOutcome(latest.outcome)) {
|
|
58
|
+
return {
|
|
59
|
+
verdict: "KNOWN-BLOCKED",
|
|
60
|
+
detail: `pr_create ${latest.outcome} at ${latest.at}: ${latest.evidence}`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return { verdict: "CLEAR", detail: `latest pr_create outcome is ${latest.outcome} (${latest.at})` };
|
|
64
|
+
}
|
|
65
|
+
async function checkGates(owner, repo) {
|
|
66
|
+
const detected = [];
|
|
67
|
+
let collaboratorsOnly = false;
|
|
68
|
+
try {
|
|
69
|
+
const policy = await detectRepoPolicy(owner, repo);
|
|
70
|
+
collaboratorsOnly = policy.collaboratorsOnly;
|
|
71
|
+
if (collaboratorsOnly)
|
|
72
|
+
detected.push("collaborators-only");
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// policy detection is best-effort here
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const sources = await fetchPolicySources(owner, repo);
|
|
79
|
+
const gates = parseGatesFromSources(sources);
|
|
80
|
+
for (const g of gates) {
|
|
81
|
+
if (g.detected && !detected.includes(g.kind))
|
|
82
|
+
detected.push(g.kind);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// best effort
|
|
87
|
+
}
|
|
88
|
+
const detail = detected.length > 0 ? `detected: ${detected.join(", ")}` : "no contribution gates detected";
|
|
89
|
+
return { collaboratorsOnly, detected, detail };
|
|
90
|
+
}
|
|
91
|
+
async function blobShaAt(owner, repo, path, ref) {
|
|
92
|
+
try {
|
|
93
|
+
const data = (await apiGet(`/repos/${owner}/${repo}/contents/${path.split("/").map(encodeURIComponent).join("/")}?ref=${encodeURIComponent(ref)}`));
|
|
94
|
+
if (data.type && data.type !== "file")
|
|
95
|
+
return undefined;
|
|
96
|
+
return typeof data.sha === "string" ? data.sha : undefined;
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
if (err instanceof ApiNotFoundError)
|
|
100
|
+
return undefined;
|
|
101
|
+
throw err;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function checkDrift(owner, repo, base, files) {
|
|
105
|
+
const repoInfo = (await apiGet(`/repos/${owner}/${repo}`));
|
|
106
|
+
const branch = String(repoInfo.default_branch ?? "main");
|
|
107
|
+
const headRef = (await apiGet(`/repos/${owner}/${repo}/git/ref/heads/${branch}`));
|
|
108
|
+
const head = String(headRef.object?.sha ?? "");
|
|
109
|
+
if (!head)
|
|
110
|
+
throw new Error(`could not resolve upstream head for ${owner}/${repo}`);
|
|
111
|
+
const out = [];
|
|
112
|
+
for (const f of files) {
|
|
113
|
+
const atBase = await blobShaAt(owner, repo, f, base);
|
|
114
|
+
const atHead = await blobShaAt(owner, repo, f, head);
|
|
115
|
+
if (atBase === undefined || atHead === undefined) {
|
|
116
|
+
out.push({ path: f, status: "MISSING", detail: `not present at ${atBase === undefined ? "base" : "head"}` });
|
|
117
|
+
}
|
|
118
|
+
else if (atBase !== atHead) {
|
|
119
|
+
out.push({ path: f, status: "DRIFTED", detail: `changed upstream since ${base.slice(0, 8)}` });
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
out.push({ path: f, status: "CLEAN", detail: "unchanged since base" });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
export async function runPreflight(opts) {
|
|
128
|
+
const { owner, repo } = opts;
|
|
129
|
+
const reasons = [];
|
|
130
|
+
const fork = await checkFork(owner, repo);
|
|
131
|
+
if (!fork.ok)
|
|
132
|
+
reasons.push(`fork: ${fork.detail}`);
|
|
133
|
+
const capability = checkCapability(owner, repo, opts.capabilitiesPath);
|
|
134
|
+
if (capability.verdict === "KNOWN-BLOCKED")
|
|
135
|
+
reasons.push(`capability: ${capability.detail}`);
|
|
136
|
+
const gates = await checkGates(owner, repo);
|
|
137
|
+
if (gates.collaboratorsOnly)
|
|
138
|
+
reasons.push("gates: repo is collaborators-only");
|
|
139
|
+
let drift;
|
|
140
|
+
if (opts.base && opts.files && opts.files.length > 0) {
|
|
141
|
+
try {
|
|
142
|
+
drift = await checkDrift(owner, repo, opts.base, opts.files);
|
|
143
|
+
for (const d of drift) {
|
|
144
|
+
if (d.status !== "CLEAN")
|
|
145
|
+
reasons.push(`drift: ${d.path} is ${d.status} (${d.detail})`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
reasons.push(`drift: could not compare: ${err instanceof Error ? err.message : String(err)}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const verdict = reasons.length === 0 ? "GO" : "NO-GO";
|
|
153
|
+
return { owner, repo, fork, capability, gates, drift, verdict, reasons };
|
|
154
|
+
}
|
|
155
|
+
export function formatPreflightHuman(r) {
|
|
156
|
+
const lines = [`[${r.verdict}] preflight ${r.owner}/${r.repo}`];
|
|
157
|
+
lines.push(` fork: ${r.fork.ok ? "ok" : "PROBLEM"} (${r.fork.detail})`);
|
|
158
|
+
lines.push(` capability: ${r.capability.verdict} (${r.capability.detail})`);
|
|
159
|
+
lines.push(` gates: ${r.gates.detail}`);
|
|
160
|
+
if (r.drift) {
|
|
161
|
+
for (const d of r.drift) {
|
|
162
|
+
lines.push(` drift ${d.status === "CLEAN" ? "ok " : "FLAG"} ${d.path}: ${d.detail}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
for (const reason of r.reasons)
|
|
166
|
+
lines.push(` reason: ${reason}`);
|
|
167
|
+
return lines.join("\n");
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"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"}
|
package/dist/scout.d.ts
CHANGED
|
@@ -90,6 +90,14 @@ export interface ScoutOptions {
|
|
|
90
90
|
keepPerRepo?: number;
|
|
91
91
|
deps?: ScoutDeps;
|
|
92
92
|
now?: Date;
|
|
93
|
+
/**
|
|
94
|
+
* Capability ledger path. Repos whose latest recorded pr_create
|
|
95
|
+
* outcome is a structural block are excluded from scanning and
|
|
96
|
+
* listed as reposBlocked with the recorded reason (v0.10.1: the
|
|
97
|
+
* actual/ ts-sdk lesson — never pay to scout a repo the account
|
|
98
|
+
* cannot open PRs in).
|
|
99
|
+
*/
|
|
100
|
+
capabilitiesPath?: string;
|
|
93
101
|
}
|
|
94
102
|
export interface ScoutResult {
|
|
95
103
|
/** Ranked survivors across all processed repos. */
|
|
@@ -104,6 +112,14 @@ export interface ScoutResult {
|
|
|
104
112
|
reposProcessed: string[];
|
|
105
113
|
/** Repos skipped because the cursor had passed them or the budget hit. */
|
|
106
114
|
reposSkipped: string[];
|
|
115
|
+
/**
|
|
116
|
+
* Repos excluded before scanning because the capability ledger
|
|
117
|
+
* records a structural pr_create block for the account.
|
|
118
|
+
*/
|
|
119
|
+
reposBlocked: Array<{
|
|
120
|
+
repo: string;
|
|
121
|
+
reason: string;
|
|
122
|
+
}>;
|
|
107
123
|
apiCallsUsed: number;
|
|
108
124
|
markdown: string;
|
|
109
125
|
json: Record<string, unknown>;
|
|
@@ -111,4 +127,9 @@ export interface ScoutResult {
|
|
|
111
127
|
export declare const SCOUT_DEFAULT_BUDGET = 300;
|
|
112
128
|
export declare const SCOUT_DEFAULT_SCAN_LIMIT = 10;
|
|
113
129
|
export declare const SCOUT_DEFAULT_KEEP_PER_REPO = 5;
|
|
130
|
+
/**
|
|
131
|
+
* The scout report footer. Derived from the package version so a version
|
|
132
|
+
* bump can never leave a stale "Scout vX" behind (v0.10.0 regression fix).
|
|
133
|
+
*/
|
|
134
|
+
export declare function scoutFooter(callsUsed: number, budget: number): string;
|
|
114
135
|
export declare function scoutCampaign(opts: ScoutOptions): Promise<ScoutResult>;
|
package/dist/scout.js
CHANGED
|
@@ -30,6 +30,8 @@ import { fetchFrictionSummary } from "./friction.js";
|
|
|
30
30
|
import { fetchMergeVelocity } from "./merge-velocity.js";
|
|
31
31
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
32
32
|
import { dirname } from "node:path";
|
|
33
|
+
import { defaultPackageVersion } from "./doctor.js";
|
|
34
|
+
import { loadCapabilities, prCreateBlockReason, defaultCapabilitiesPath, } from "./capabilities.js";
|
|
33
35
|
export function loadCampaignFile(path) {
|
|
34
36
|
try {
|
|
35
37
|
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
@@ -118,6 +120,13 @@ function parseRepoRef(ref) {
|
|
|
118
120
|
export const SCOUT_DEFAULT_BUDGET = 300;
|
|
119
121
|
export const SCOUT_DEFAULT_SCAN_LIMIT = 10;
|
|
120
122
|
export const SCOUT_DEFAULT_KEEP_PER_REPO = 5;
|
|
123
|
+
/**
|
|
124
|
+
* The scout report footer. Derived from the package version so a version
|
|
125
|
+
* bump can never leave a stale "Scout vX" behind (v0.10.0 regression fix).
|
|
126
|
+
*/
|
|
127
|
+
export function scoutFooter(callsUsed, budget) {
|
|
128
|
+
return `_Scout v${defaultPackageVersion()}; budget ${callsUsed} calls used of ${budget}._`;
|
|
129
|
+
}
|
|
121
130
|
export async function scoutCampaign(opts) {
|
|
122
131
|
const deps = opts.deps ?? {};
|
|
123
132
|
const now = opts.now ?? new Date();
|
|
@@ -134,6 +143,10 @@ export async function scoutCampaign(opts) {
|
|
|
134
143
|
const appended = [];
|
|
135
144
|
const reposProcessed = [];
|
|
136
145
|
const reposSkipped = [];
|
|
146
|
+
const reposBlocked = [];
|
|
147
|
+
// Read the capability ledger once: repos the account structurally
|
|
148
|
+
// cannot open PRs in are excluded before any API budget is spent.
|
|
149
|
+
const capabilities = loadCapabilities(opts.capabilitiesPath ?? defaultCapabilitiesPath());
|
|
137
150
|
let budgetHit = false;
|
|
138
151
|
let stoppedAt = null;
|
|
139
152
|
for (let i = 0; i < opts.repos.length; i++) {
|
|
@@ -153,6 +166,11 @@ export async function scoutCampaign(opts) {
|
|
|
153
166
|
continue;
|
|
154
167
|
}
|
|
155
168
|
const repoTag = `${ref.owner}/${ref.repo}`;
|
|
169
|
+
const blockReason = prCreateBlockReason(capabilities, repoTag);
|
|
170
|
+
if (blockReason) {
|
|
171
|
+
reposBlocked.push({ repo: repoTag, reason: blockReason });
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
156
174
|
const raw = await listIssues(ref.owner, ref.repo, scanLimit);
|
|
157
175
|
const ranked = [];
|
|
158
176
|
// Fetch repo-level ranking inputs once per repo, in parallel with the
|
|
@@ -229,8 +247,14 @@ export async function scoutCampaign(opts) {
|
|
|
229
247
|
}
|
|
230
248
|
if (candidates.length === 0)
|
|
231
249
|
lines.push("_None._");
|
|
250
|
+
if (reposBlocked.length > 0) {
|
|
251
|
+
lines.push("");
|
|
252
|
+
lines.push(`**Excluded by capability ledger (${reposBlocked.length}): the account structurally cannot open PRs here**`);
|
|
253
|
+
for (const b of reposBlocked)
|
|
254
|
+
lines.push(`- **${b.repo}** — ${b.reason}`);
|
|
255
|
+
}
|
|
232
256
|
lines.push("");
|
|
233
|
-
lines.push(
|
|
257
|
+
lines.push(scoutFooter(budgetUsed(), opts.budget));
|
|
234
258
|
return {
|
|
235
259
|
candidates,
|
|
236
260
|
appended,
|
|
@@ -238,6 +262,7 @@ export async function scoutCampaign(opts) {
|
|
|
238
262
|
cursor,
|
|
239
263
|
reposProcessed,
|
|
240
264
|
reposSkipped,
|
|
265
|
+
reposBlocked,
|
|
241
266
|
apiCallsUsed: budgetUsed(),
|
|
242
267
|
markdown: lines.join("\n"),
|
|
243
268
|
json: {
|
|
@@ -259,6 +284,7 @@ export async function scoutCampaign(opts) {
|
|
|
259
284
|
cursor,
|
|
260
285
|
reposProcessed,
|
|
261
286
|
reposSkipped,
|
|
287
|
+
reposBlocked,
|
|
262
288
|
apiCallsUsed: budgetUsed(),
|
|
263
289
|
},
|
|
264
290
|
};
|
package/dist/scout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scout.js","sourceRoot":"","sources":["../src/scout.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scout.js","sourceRoot":"","sources":["../src/scout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type HttpResult = {
|
|
2
|
+
status: number;
|
|
3
|
+
json(): Promise<unknown>;
|
|
4
|
+
text(): Promise<string>;
|
|
5
|
+
};
|
|
6
|
+
export type HttpGet = (url: string, headers?: Record<string, string>) => Promise<HttpResult>;
|
|
7
|
+
export interface ShipcheckOptions {
|
|
8
|
+
owner: string;
|
|
9
|
+
repo: string;
|
|
10
|
+
/** Release version without the v prefix, e.g. "0.10.1". */
|
|
11
|
+
version: string;
|
|
12
|
+
/** npm package name; defaults from ./package.json, then the API. */
|
|
13
|
+
npmPackage?: string;
|
|
14
|
+
/** MCP registry server name; defaults from ./server.json (mcpName), then the API. */
|
|
15
|
+
mcpName?: string;
|
|
16
|
+
/** Injectable HTTP for the non-GitHub registries (tests). */
|
|
17
|
+
httpGet?: HttpGet;
|
|
18
|
+
}
|
|
19
|
+
export interface ShipcheckLink {
|
|
20
|
+
/** Stable id: tag, commit, package-json, release, npm, registry. */
|
|
21
|
+
id: string;
|
|
22
|
+
label: string;
|
|
23
|
+
ok: boolean;
|
|
24
|
+
detail: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ShipcheckResult {
|
|
27
|
+
owner: string;
|
|
28
|
+
repo: string;
|
|
29
|
+
version: string;
|
|
30
|
+
tag: string;
|
|
31
|
+
npmPackage: string;
|
|
32
|
+
mcpName?: string;
|
|
33
|
+
links: ShipcheckLink[];
|
|
34
|
+
pass: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function runShipcheck(opts: ShipcheckOptions): Promise<ShipcheckResult>;
|
|
37
|
+
export declare function formatShipcheckHuman(r: ShipcheckResult): string;
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `greenlight shipcheck`: independently verify every link of a release
|
|
3
|
+
* chain, so a broken ship can never again be reported as shipped.
|
|
4
|
+
*
|
|
5
|
+
* Field lesson 2026-10-18 (F1): a v0.9.3 ship report claimed a git
|
|
6
|
+
* commit that did not exist; tag v0.9.3 pointed at a nonexistent object
|
|
7
|
+
* while npm and the registry were genuinely fine. Every verification
|
|
8
|
+
* step that day checked the package and the listing, but nobody checked
|
|
9
|
+
* the git links. shipcheck checks all of them: tag ref, commit object,
|
|
10
|
+
* package.json at the tag, GitHub release, npm, and the MCP Registry.
|
|
11
|
+
* It exits non-zero and names the broken link on the first failure.
|
|
12
|
+
* Reads only: it never creates or changes anything.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { apiGet, ApiNotFoundError } from "./github.js";
|
|
17
|
+
const defaultHttpGet = async (url, headers) => {
|
|
18
|
+
const res = await fetch(url, { headers });
|
|
19
|
+
return {
|
|
20
|
+
status: res.status,
|
|
21
|
+
json: () => res.json(),
|
|
22
|
+
text: () => res.text(),
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
function readLocalJsonFile(name) {
|
|
26
|
+
try {
|
|
27
|
+
const path = join(process.cwd(), name);
|
|
28
|
+
if (!existsSync(path))
|
|
29
|
+
return undefined;
|
|
30
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function decodeContents(data) {
|
|
37
|
+
const d = data;
|
|
38
|
+
if (typeof d.content !== "string")
|
|
39
|
+
return undefined;
|
|
40
|
+
try {
|
|
41
|
+
return Buffer.from(d.content, d.encoding === "base64" ? "base64" : "utf8").toString("utf8");
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function packageJsonFromApi(owner, repo) {
|
|
48
|
+
try {
|
|
49
|
+
const text = decodeContents(await apiGet(`/repos/${owner}/${repo}/contents/package.json`));
|
|
50
|
+
if (!text)
|
|
51
|
+
return undefined;
|
|
52
|
+
return JSON.parse(text);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function serverJsonFromApi(owner, repo) {
|
|
59
|
+
try {
|
|
60
|
+
const text = decodeContents(await apiGet(`/repos/${owner}/${repo}/contents/server.json`));
|
|
61
|
+
if (!text)
|
|
62
|
+
return undefined;
|
|
63
|
+
return JSON.parse(text);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export async function runShipcheck(opts) {
|
|
70
|
+
const { owner, repo, version } = opts;
|
|
71
|
+
const tag = `v${version}`;
|
|
72
|
+
const httpGet = opts.httpGet ?? defaultHttpGet;
|
|
73
|
+
const links = [];
|
|
74
|
+
const fail = (id, label, detail) => {
|
|
75
|
+
links.push({ id, label, ok: false, detail });
|
|
76
|
+
return false;
|
|
77
|
+
};
|
|
78
|
+
// npm package and MCP name: explicit flags win, then the local
|
|
79
|
+
// checkout, then the API. A missing MCP name is not a broken link:
|
|
80
|
+
// it just skips the registry check.
|
|
81
|
+
let npmPackage = opts.npmPackage;
|
|
82
|
+
let mcpName = opts.mcpName;
|
|
83
|
+
if (!npmPackage || !mcpName) {
|
|
84
|
+
const localPkg = readLocalJsonFile("package.json");
|
|
85
|
+
const localServer = readLocalJsonFile("server.json");
|
|
86
|
+
npmPackage = npmPackage ?? (typeof localPkg?.name === "string" ? localPkg.name : undefined);
|
|
87
|
+
mcpName = mcpName ?? (typeof localServer?.name === "string" ? localServer.name : undefined);
|
|
88
|
+
}
|
|
89
|
+
if (!npmPackage || !mcpName) {
|
|
90
|
+
const apiPkg = await packageJsonFromApi(owner, repo);
|
|
91
|
+
const apiServer = !mcpName ? await serverJsonFromApi(owner, repo) : undefined;
|
|
92
|
+
npmPackage = npmPackage ?? (typeof apiPkg?.name === "string" ? apiPkg.name : undefined);
|
|
93
|
+
mcpName = mcpName ?? (typeof apiServer?.name === "string" ? apiServer.name : undefined);
|
|
94
|
+
}
|
|
95
|
+
if (!npmPackage) {
|
|
96
|
+
fail("npm", "npm package", `could not determine the npm package name for ${owner}/${repo}; pass --npm <name>`);
|
|
97
|
+
}
|
|
98
|
+
// Link 1: the tag ref must exist.
|
|
99
|
+
let tagSha;
|
|
100
|
+
try {
|
|
101
|
+
const ref = (await apiGet(`/repos/${owner}/${repo}/git/ref/tags/${tag}`));
|
|
102
|
+
tagSha = String(ref.object?.sha ?? "");
|
|
103
|
+
if (!tagSha) {
|
|
104
|
+
fail("tag", `tag ${tag}`, `tag ${tag} exists but carries no object SHA`);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
links.push({ id: "tag", label: `tag ${tag}`, ok: true, detail: `resolves to ${tagSha.slice(0, 12)}` });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
if (err instanceof ApiNotFoundError) {
|
|
112
|
+
fail("tag", `tag ${tag}`, `tag ${tag} does not exist on ${owner}/${repo}`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
fail("tag", `tag ${tag}`, `could not read the tag ref: ${err instanceof Error ? err.message : String(err)}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Link 2: the commit object the tag points at must exist. This is
|
|
119
|
+
// the exact F1 failure: the ref was present, the object was not.
|
|
120
|
+
if (tagSha) {
|
|
121
|
+
try {
|
|
122
|
+
await apiGet(`/repos/${owner}/${repo}/git/commits/${tagSha}`);
|
|
123
|
+
links.push({ id: "commit", label: "commit object", ok: true, detail: `${tagSha.slice(0, 12)} resolves` });
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
if (err instanceof ApiNotFoundError) {
|
|
127
|
+
fail("commit", "commit object", `tag ${tag} points at ${tagSha} but the commit object is missing (404): the tag is dangling`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
fail("commit", "commit object", `could not read the commit object: ${err instanceof Error ? err.message : String(err)}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Link 3: package.json at the tag must carry this version.
|
|
135
|
+
if (tagSha) {
|
|
136
|
+
try {
|
|
137
|
+
const text = decodeContents(await apiGet(`/repos/${owner}/${repo}/contents/package.json?ref=${encodeURIComponent(tag)}`));
|
|
138
|
+
const atTag = text ? JSON.parse(text) : undefined;
|
|
139
|
+
const atVersion = String(atTag?.version ?? "");
|
|
140
|
+
if (atVersion === version) {
|
|
141
|
+
links.push({ id: "package-json", label: "package.json at tag", ok: true, detail: `version ${atVersion}` });
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
fail("package-json", "package.json at tag", `tag ${tag} carries version "${atVersion || "(unreadable)"}", expected "${version}"`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
fail("package-json", "package.json at tag", `could not read package.json at ${tag}: ${err instanceof Error ? err.message : String(err)}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Link 4: a GitHub release must exist for the tag.
|
|
152
|
+
try {
|
|
153
|
+
await apiGet(`/repos/${owner}/${repo}/releases/tags/${encodeURIComponent(tag)}`);
|
|
154
|
+
links.push({ id: "release", label: "GitHub release", ok: true, detail: `release for ${tag} exists` });
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
if (err instanceof ApiNotFoundError) {
|
|
158
|
+
fail("release", "GitHub release", `no GitHub release exists for tag ${tag}`);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
fail("release", "GitHub release", `could not read the release: ${err instanceof Error ? err.message : String(err)}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Link 5: npm must show this version.
|
|
165
|
+
if (npmPackage && links.every((l) => l.id !== "npm" || l.ok)) {
|
|
166
|
+
try {
|
|
167
|
+
const res = await httpGet(`https://registry.npmjs.org/${encodeURIComponent(npmPackage)}`);
|
|
168
|
+
if (res.status !== 200) {
|
|
169
|
+
fail("npm", "npm package", `registry.npmjs.org returned ${res.status} for ${npmPackage}`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
const data = (await res.json());
|
|
173
|
+
if (data.versions && Object.prototype.hasOwnProperty.call(data.versions, version)) {
|
|
174
|
+
links.push({ id: "npm", label: "npm package", ok: true, detail: `${npmPackage}@${version} published` });
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
fail("npm", "npm package", `${npmPackage} has no published version ${version}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
fail("npm", "npm package", `could not reach the npm registry: ${err instanceof Error ? err.message : String(err)}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Link 6: the MCP Registry must show this version active, when a name is known.
|
|
186
|
+
if (mcpName) {
|
|
187
|
+
try {
|
|
188
|
+
const res = await httpGet(`https://registry.modelcontextprotocol.io/v0/servers?search=${encodeURIComponent(mcpName)}`);
|
|
189
|
+
if (res.status !== 200) {
|
|
190
|
+
fail("registry", "MCP Registry", `registry returned ${res.status} for search ${mcpName}`);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const data = (await res.json());
|
|
194
|
+
const match = (data.servers ?? []).find((s) => String(s.server?.name ?? "") === mcpName &&
|
|
195
|
+
String(s.server?.version ?? "") === version &&
|
|
196
|
+
String(s._meta?.["io.modelcontextprotocol.registry/official"]?.status ?? "") === "active");
|
|
197
|
+
if (match) {
|
|
198
|
+
links.push({ id: "registry", label: "MCP Registry", ok: true, detail: `${mcpName}@${version} active` });
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
fail("registry", "MCP Registry", `no active registry record for ${mcpName}@${version}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
fail("registry", "MCP Registry", `could not reach the registry: ${err instanceof Error ? err.message : String(err)}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
links.push({ id: "registry", label: "MCP Registry", ok: true, detail: "skipped: no MCP name known (pass --mcp-name)" });
|
|
211
|
+
}
|
|
212
|
+
const pass = links.every((l) => l.ok);
|
|
213
|
+
return { owner, repo, version, tag, npmPackage: npmPackage ?? "", mcpName, links, pass };
|
|
214
|
+
}
|
|
215
|
+
export function formatShipcheckHuman(r) {
|
|
216
|
+
const lines = [
|
|
217
|
+
`${r.pass ? "[PASS]" : "[FAIL]"} shipcheck ${r.owner}/${r.repo}@${r.version}`,
|
|
218
|
+
];
|
|
219
|
+
for (const l of r.links) {
|
|
220
|
+
lines.push(` ${l.ok ? "ok " : "FAIL"} ${l.label}: ${l.detail}`);
|
|
221
|
+
}
|
|
222
|
+
if (!r.pass) {
|
|
223
|
+
const broken = r.links.filter((l) => !l.ok).map((l) => l.id);
|
|
224
|
+
lines.push(`broken links: ${broken.join(", ")}`);
|
|
225
|
+
}
|
|
226
|
+
return lines.join("\n");
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=shipcheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shipcheck.js","sourceRoot":"","sources":["../src/shipcheck.ts"],"names":[],"mappings":"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"}
|