| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
ci(scan): deterministic static pin check for auto-exec MCP launchers (#2361) Statically classify every MCP server declared in a scanned entry's .mcp.json (and plugin.json mcpServers): a package-manager launcher (npx/bunx/uvx/pipx) with a floating spec — @latest/dist-tag, a version range, or a bare unversioned name that isn't locally vendored — executes registry-resolved code at session start, which the entry's pinned source SHA does not fix. - lib/pin-check.sh: pure classifier (rows/vendored-refine/waivers), jq @tsv rows so hostile server names can't forge or split rows - scripts/static-pin-check.sh: always-on, auth-free step — detection always annotates; hard-fail only behind the new fail-on-unpinned-autoexec input (per-consumer severity) - launch-shape-waivers input: package-grained repo-local exception file; every floating spec must match an adjudicated prefix - scan.sh joins unpinned_autoexec_{runtime,specs} into scanned[] (action-emitted, never model-produced) + summary column; new pin-scanned/pin-failed outputs; result falls back to the pin gate's verdict when the AI review is skipped - lib/targets.sh: target resolution factored out of scan.sh so both steps resolve the identical set - test-pin-check.sh: 59 golden vectors, wired into validate-plugins.yml Inert for existing consumers until they repin and opt in. Co-authored-by: Claude Fable 5 <noreply@anthropic.com> | 19 天前 | |
ci(scan): deterministic static pin check for auto-exec MCP launchers (#2361) Statically classify every MCP server declared in a scanned entry's .mcp.json (and plugin.json mcpServers): a package-manager launcher (npx/bunx/uvx/pipx) with a floating spec — @latest/dist-tag, a version range, or a bare unversioned name that isn't locally vendored — executes registry-resolved code at session start, which the entry's pinned source SHA does not fix. - lib/pin-check.sh: pure classifier (rows/vendored-refine/waivers), jq @tsv rows so hostile server names can't forge or split rows - scripts/static-pin-check.sh: always-on, auth-free step — detection always annotates; hard-fail only behind the new fail-on-unpinned-autoexec input (per-consumer severity) - launch-shape-waivers input: package-grained repo-local exception file; every floating spec must match an adjudicated prefix - scan.sh joins unpinned_autoexec_{runtime,specs} into scanned[] (action-emitted, never model-produced) + summary column; new pin-scanned/pin-failed outputs; result falls back to the pin gate's verdict when the AI review is skipped - lib/targets.sh: target resolution factored out of scan.sh so both steps resolve the identical set - test-pin-check.sh: 59 golden vectors, wired into validate-plugins.yml Inert for existing consumers until they repin and opt in. Co-authored-by: Claude Fable 5 <noreply@anthropic.com> | 19 天前 | |
maint: remove 2 entries with unavailable upstream sources; re-point 1 renamed source; drop stale freeze line (#2358) * maint: remove 3 entries with unavailable upstream sources; drop stale freeze line Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * restore klarity as a source re-point to its renamed org (not a removal) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> | 25 天前 | |
ci: source availability / owner verification — bump gate + scheduled sweep (#2357) * ci(bump): source-owner verification gate — hold pins on unavailable or owner-changed sources Before advancing any github.com pin, resolve the listed owner/repo via the API and require the canonical full_name to still match the listed owner (case-insensitive). 404, owner-change, and unverifiable lookups all hold the pin as a visible per-entry skip (fail closed; the run continues). Same-owner repo renames proceed with a refresh-the-URL warning. Placed after the staleness check so at-pin entries cost no API calls. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci: scheduled owner-liveness sweep + committed owner baseline Daily report-only sweep resolving every distinct external source owner and owner/repo pair via batched GraphQL, classified against a committed login → account-id baseline (seeded, 1764 owners). Identity change (a recorded login resolving to a different account id) is the only class that fails the run; owner/repo availability drift is reported in the step summary for listing review. Hermetic test suite wired into validate-plugins. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci(sweep): disposition split for missing owners — verify-successor vs review A missing owner whose repos still resolve at a canonical successor location is typically a publisher rebrand/transfer — the finding now carries the successor and a verify-successor disposition (refresh/re-pin the listing). A missing owner with no resolving repo left keeps the review disposition. Derived from data the sweep already collects; no extra lookups. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci(bump): owner-identity leg — compare live account id against the committed baseline full_name alone cannot see a re-registered owner: the login is freed and re-taken, a repo is created at the listed path, and the location checks all pass with no redirect. With the owner baseline committed, the gate now also compares the live owner's account id (from the same repos/ response — zero extra API cost) against the recorded one: mismatch or unverifiable id holds the pin loudly; an owner not yet in the baseline warns and proceeds (a new entry was human-reviewed at add time; holding would false-hold every add until the next baseline refresh). No baseline file → the leg is inactive, so callers without a baseline keep today's behavior. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> | 25 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 19 天前 | ||
| 19 天前 | ||
| 25 天前 | ||
| 25 天前 |