Dependency evidence API repository v2 · proof loop v1
Give a coding agent repository evidence before it acts, evaluate an exact npm version in bounded project context, then verify the resolved change and local receipts afterward. RepoPilot separates observed evidence, caller-asserted claims, and unknowns. It does not certify safety or production fit.
Quick start
curl -s "https://repopilot.app/api/v2/check?package=npm:express"{
"version": "2",
"status": "ok",
"repo": "expressjs/express",
"package": "npm:express",
"signal": "Healthy",
"recommendation": "proceed_with_review",
"decision_scope": "Repository-level signals only; verify the exact package version and fit.",
"signals": {
"license": "MIT",
"license_status": "verified",
"has_tests": true,
"tests_status": "present",
"test_receipts": ["test/app.js"],
"has_ci": true,
"ci_status": "present",
"ci_receipts": [".github/workflows/ci.yml"],
"cve_scan_status": "scanned",
"cve_dependencies_scanned": 12,
"evidence_complete": true
},
"concerns": [],
"disclaimer": "Decision support, not a certification or install approval."
}Check a dependency
/api/v2/check| package | npm package name, optionally prefixed with npm: |
| repo | owner/repo or GitHub URL. Use this for non-npm ecosystems. |
Pass exactly one target. Package-to-repository resolution currently supports npm. Cached verdicts return immediately. A miss returns bounded live GitHub/OpenSSF evidence with evidence_source: live_fallback, analysis_cached: false, and explicit unknowns. It does not start a full repository analysis or consume the uncached-analysis budget; do not treat limited evidence as approval.
Existing /api/v1/check callers keep the legacy go/caution/avoid recommendation values.
Evaluate and verify an exact npm change
Call evaluate before changing the manifest or lockfile. It combines immutable npm/deps.dev evidence with a bounded project snapshot and returns blockers, warnings, evidence gaps, required checks, and a deterministic verification context. RepoPilot never installs the package or runs a command.
/api/v1/dependency-change/evaluate{
"change": {
"ecosystem": "npm",
"name": "express",
"from_version": "4.21.2",
"to_version": "5.1.0",
"dependency_type": "runtime"
},
"project": {
"package_manager": "npm",
"node_version": "22.20.0",
"direct_dependencies": { "express": "^4.21.2" },
"installed_versions": { "express": "4.21.2" },
"scripts": ["test", "build"],
"manifest_path": "package.json",
"lockfile_path": "package-lock.json",
"lockfile_sha256": "<64 hex characters>"
},
"policy_profile": "strict",
"intent": "Upgrade the HTTP server"
}Policy profiles are permissive, balanced (default), and strict. Strict blocks high/critical advisories, requires an npm provenance attestation, and denies packages declaring install lifecycle hooks. Only hook names are returned, never bodies. The response includes a declarative rollback_planthat RepoPilot does not execute. Preserve the returned verification_context unchanged. After the approved change, send it back with the bounded after snapshot, resolved versions, new lockfile digest, and exact command/exit-code receipts.
/api/v1/dependency-change/verify{
evaluation: evaluateResponse.verification_context,
after: {
package_manager: "npm",
node_version: "22.20.0",
direct_dependencies: { express: "^5.1.0" },
installed_versions: { express: "5.1.0" },
lockfile_sha256: "<new 64-character digest>",
resolved_graph_complete: false,
resolved_changes: [{
name: "express",
from_version: "4.21.2",
to_version: "5.1.0",
direct: true,
dependency_type: "runtime"
}]
},
checks: [{ id: "test", command: "npm test", exit_code: 0 }]
}Verification reports complete, incomplete, or failed. Command receipts are labelled caller_asserted because RepoPilot checks them but did not execute them. Do not rebuild or edit the verification context. Set resolved_graph_complete to true only when the receipt covers the complete installed graph; this direct-change example therefore keeps it false. The verification response repeats the non-executing rollback plan.
Recommendation semantics
proceed_with_review — no blocking repository-level signal was found. Verify exact version, compatibility, provenance, and deployment constraints.
review — concerns or incomplete evidence need a human decision.
avoid — material concerns; require explicit approval and consider alternatives.
Evidence states are present, absent, or unknown. “Absent” is emitted only after a complete Git-tree scan. Ambiguous license metadata is unknown, not a non-standard license claim.
Full repository brief
/api/v1/onboard?repo_url=GITHUB_URLReturns the verdict, evidence, generated onboarding summary, and agent artifacts. Use this when entering an unfamiliar repository; use /check for dependency decisions.
curl -s "https://repopilot.app/api/v1/onboard?repo_url=https://github.com/sindresorhus/slugify"Change-risk heuristic
/api/v1/change-riskcurl -s -X POST https://repopilot.app/api/v1/change-risk \
-H "Content-Type: application/json" \
-d '{"repo":"honojs/hono","pr":5086}'Returns a deterministic 0–10 score based on diff size, file spread, tests touched, sensitive paths, hotspots, and blast radius. It is a change-shape heuristic, not a defect predictor or merge approval.
{
"repo": "owner/repo",
"files": [
{ "path": "src/auth.ts", "status": "modified", "additions": 4, "deletions": 1 }
]
}Structured file facts keep source and diff hunks local. Inputs are capped at 250 files and relative paths are bounded. Raw diff and repo + pr modes remain available.
MCP server
The live Streamable HTTP endpoint exposes check_dependency, evaluate_dependency_change, verify_dependency_change, analyze_repo, plan_repo_task, get_artifact, compare_repos, and check_change_risk. Each response includes structured agent guidance: a summary, confidence, explicit evidence gaps, and next actions. JSON text is also returned for older clients.
{
"mcpServers": {
"repopilot": { "url": "https://repopilot.app/api/mcp" }
}
}See the MCP quick start for one-line Codex and Claude Code installs, a test prompt, and tool-selection guidance.
Limits, authentication, and errors
- Cached dependency checks are free; fresh analysis allowances are operator-configured and may change live.
- Cold live-fallback evidence is capped at 500 repositories/day by default; five-minute fallback cache hits and full cached analyses do not consume that allowance.
- Per-minute abuse controls return
429withRetry-After. - Optional API keys use
Authorization: Bearer rp_…for attribution and metering; unkeyed public requests remain supported. evidence_source: live_fallbackmeans only bounded live repository metadata was checked; tests, CI, published dependency advisories, code structure, and exact versions remain unverified.404/not_analyzedon full briefs or artifacts means no cached full analysis, not that the package is safe.503means fresh analysis capacity is unavailable; cached pages and checks continue serving.
Want a rules file instead of wiring the API yourself? Install the Claude Code or Cursor rule.