chore(mcp): convert bin/loopover-mcp.js to TypeScript (Phase 3 of #7291) - #7431
chore(mcp): convert bin/loopover-mcp.js to TypeScript (Phase 3 of #7291)#7431oktofeesh1 wants to merge 2 commits into
Conversation
…Nbored#7291) Straight 1:1 rename to bin/loopover-mcp.ts, compiled in place to the same bin/loopover-mcp.js the package has always shipped. Pragmatic typing throughout (explicit `any` where the original plain JS carried no type information) rather than a type-safety redesign, matching the scope of the prior mcp migration phases. Excludes bin/*.ts from the published tarball via package.json's files field, mirroring the existing lib/*.ts exclusion.
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
bin/loopover-mcp.js became bin/loopover-mcp.ts; its two pre-existing fallback-API-host mentions need a baseline entry under the new path.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #7431 +/- ##
==========================================
- Coverage 91.35% 91.14% -0.21%
==========================================
Files 716 716
Lines 72990 73152 +162
Branches 21628 22454 +826
==========================================
Hits 66678 66678
- Misses 5272 5434 +162
Partials 1040 1040
Flags with carried forward coverage won't be shown. Click here to find out more.
|
|
Caution 🛑 LoopOver review result - reject/close recommendedReview updated: 2026-07-20 10:54:19 UTC
Review summary Nits — 5 non-blocking
Why this is blocked
📋 Copy for AI agents — paste into your coding agentDecision drivers
Context & advisory signals — never blocks the verdict
Linked issue satisfactionAddressed Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.
Full command reference: https://loopover.ai/docs/loopover-commands 🧪 Experimental — new and may change. 🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.
|
|
LoopOver is closing this pull request on the maintainer's behalf (Patch-less file(s) could not be fully scanned for secrets (1)). This is an automated maintenance action — to pursue this change, please open a new pull request with the issues resolved. Closed PRs may be analyzed later to improve review accuracy, but they are not automatically reopened or re-reviewed. |
…ing the PR (#9082) (#9103) incompletePatchLessSecretScanFinding emitted code "secret_leak" whenever a patch-less file's content couldn't be fetched or verified within the scan cap (a Contents API 404/5xx, a >4MB file, a rate limit, or the fetch budget being exhausted) -- sharing the code with a REAL, matched credential. secret_leak is unconditional and breaker-exempt by design (CONCRETE_EVIDENCE_BLOCKER_CODES), so an unreadable file auto-closed a legitimate PR with no live re-check ever getting a chance to clear it. Confirmed live: 4 contributor PRs were closed this way (metagraphed#4600, loopover#7155/#7431/#8376). Gives the incomplete case its own code, secret_scan_incomplete, and routes it through evaluateGateCheckCore's no-deterministic-blocker branch -- mirroring ai_review_inconclusive's existing pattern exactly, and deliberately NOT the unconditional isEvaluationBlocker check: it only holds when nothing else already hard-blocked, so a real secret_leak on a DIFFERENT file in the same PR still fails the gate rather than being buried in this new hold. Re-evaluates automatically on the next sync/push, same as pre_merge_check_unresolved. secret_leak itself is completely unchanged: a genuine match still hard-blocks unconditionally, with no opt-in. Tests: a gate-level regression pinning the neutral-vs-failure split (including the real-leak-still-fails case with both finding codes present on one PR), the end-to-end maybeAddSecretLeakFinding wiring test rewritten to assert the new code and that secret_leak is absent, and the unit-level code assertion in patchless-secret-scan.test.ts. Closes #9082
Summary
packages/loopover-mcp/bin/loopover-mcp.js(the MCP stdio server + CLI entry point) tobin/loopover-mcp.ts, a straight 1:1 rename compiled in place to the samebin/loopover-mcp.jsthe package has always shipped — no consumer-facing behavior change.anywhere the original plain JS carried no type information (parameters, destructured options, empty-object-literal accumulators, catch-clause errors), matching the scope of the earlier mcp migration phases rather than a type-safety redesign.!bin/**/*.tstopackage.json'sfilesfield so the new source file is excluded from the published npm tarball, mirroring the existing!lib/**/*.tsexclusion.Fixes #7330.
Test plan
npx tsc -p packages/loopover-mcp/tsconfig.json --noEmit— 0 errorsnpm run build --workspace @loopover/mcp(tsc +check-syntax.mjs) — passesnpm run typecheck(root) — passesbin/loopover-mcp.jstest suite (test/unit/mcp-cli-*.test.ts,mcp-discovery.test.ts,check-mcp-package.test.ts,mcp-release-candidate.test.ts,coding-agent-miner.test.ts,forbidden-content.test.ts,worker-entry-boundary.test.ts, etc.) — all passing against the recompiled outputnpm run test:ci(full local gate, incl.git diff --check,test:coverage,test:mcp-pack) — greennpm audit --audit-level=moderate— pre-existingadm-zip/github-actionlintdev-only advisory only, unrelated to this change (no lockfile diff)