registry  /  usrcp-github  /  0.2.1

usrcp-github@0.2.1

GitHub capture adapter for USRCP - polls the REST API for pull requests authored by the configured user and appends them to the local ledger

AI Security Review

scanned 3d ago · by lpm-firewall-ai

No confirmed malicious attack surface. The main risk is an install-time native dependency rebuild workaround; runtime behavior is a user-run GitHub polling adapter that stores matching activity locally.

Static reason
High-risk behavior combination matched malicious policy.
Trigger
npm install for postinstall; user runs usrcp-github or usrcp-github --reset-config for runtime/setup
Impact
Postinstall removes scoped dependency build directories before rebuild; runtime reads configured GitHub token and writes GitHub activity/cursors to local USRCP storage.
Mechanism
better-sqlite3 rebuild plus GitHub REST polling into local ledger
Rationale
Static inspection found a noisy lifecycle rebuild script but no credential harvesting, covert exfiltration, staged payload, or unconsented install/import-time attack behavior. GitHub token handling and network calls are package-aligned and user-configured.
Evidence
package.jsonREADME.mddist/index.jsdist/setup.jsdist/config.jsdist/capture.jsnode_modules/better-sqlite3/buildnode_modules/usrcp-core/node_modules/better-sqlite3/buildnode_modules/usrcp-stream/node_modules/better-sqlite3/build~/.usrcp/github-config.json
Network endpoints2
api.github.comgithub.com/settings/tokens

Decision evidence

public snapshot
AI called this Clean at 84.0% confidence as Benign with medium false-positive risk.
Evidence for block
  • package.json postinstall deletes better-sqlite3 build dirs and runs npm rebuild better-sqlite3 at install time.
  • dist/index.js can run execSync('usrcp setup --adapter=github') only when user passes --reset-config.
Evidence against
  • dist/index.js main is CLI-gated with require.main check; importing does not start polling.
  • Runtime network use is Octokit GitHub API polling for user-configured GitHub activity, matching README and package description.
  • dist/setup.js prompts for a PAT and validates it with GitHub before storing through dist/config.js secret config fields.
  • dist/capture.js appends filtered GitHub PR/issue/comment/review events to the local USRCP ledger; no exfiltration endpoint beyond GitHub API calls.
  • No eval/vm/dynamic payload loading, obfuscated strings, persistence, or AI-agent control-surface writes found.
Behavioral surface
Source
ChildProcessEnvironmentVars
Supply chain
UrlStrings
ManifestNo manifest risk signals triggered.
scanned 4 file(s), 49.1 KB of source, external domains: github.com

Source & flagged code

2 flagged · loading source
package.jsonView file
scripts.postinstall = node -e "const fs=require(\"fs\"); for (const p of [\"node_modules/better-sqlite3/build\",\"node_modules/usrcp-core/node_modules/better-sqlite3/build\",\"node_modules/usrcp-stream/...
Critical
Red Install Lifecycle Script

Install-time lifecycle script matches a deterministic static-gate block pattern.

package.jsonView on unpkg
scripts.postinstall = node -e "const fs=require(\"fs\"); for (const p of [\"node_modules/better-sqlite3/build\",\"node_modules/usrcp-core/node_modules/better-sqlite3/build\",\"node_modules/usrcp-stream/...
High
Install Time Lifecycle Scripts

Package defines install-time lifecycle scripts.

package.jsonView on unpkg

Findings

1 Critical1 High1 Medium2 Low
CriticalRed Install Lifecycle Scriptpackage.json
HighInstall Time Lifecycle Scriptspackage.json
MediumEnvironment Vars
LowScripts Present
LowUrl Strings