Know which upstream changes actually matter to your coding-agent projects.
Always-on vulnerability and breaking-change impact monitoring for DeepSeek Harness plugins, with a native DSH adapter and a vendor-neutral task bridge for Codex, Claude Code, and other coding agents.
Vulnerability scanners tell you that a package is affected. Release bots tell you that a new version exists. They usually do not tell you:
- which plugin brought that package into a project;
- which exact dependency path is affected when multiple versions coexist;
- whether the vulnerable feature is reachable in this repository;
- whether the available upgrade breaks Node.js, DSH, the plugin entrypoint, or its bundle;
- which coding agent should investigate, and how to avoid handing untrusted advisory text control of that agent.
Upstream Radar closes that gap.
flowchart LR
feeds["OSV advisories<br/>npm releases"] --> match["Exact name@version match"]
match --> graph["Installed dependency path"]
graph --> incident["Project-specific incident<br/>new · updated · resolved"]
incident --> dsh["Native DSH follow-up"]
incident --> outbox["Durable task outbox"]
outbox --> codex["Codex"]
outbox --> claude["Claude Code"]
outbox --> other["Other coding agents"]
git clone https://github.com/MicroMilo/upstream-radar.git
cd upstream-radar
corepack enable
pnpm install --frozen-lockfile
pnpm test
pnpm run showcase:radarThe upstream-radar commands below refer to the package binary. From an unlinked source checkout, run the equivalent command as node dist/src/cli.js ... after pnpm build.
The network-free showcase starts from this installed graph:
plugin@1.0.0
├── framework@2.4.7
│ ├── parser@3.2.1
│ └── archive@1.8.0
└── logger@4.0.2
└── parser@2.9.0
When a new advisory affects only parser@2.9.0, the result is routed through the exact path:
[HIGH][NEW] Dependency vulnerability
Project: Payments API (payments-api)
Plugin: plugin@1.0.0
Affected: parser@2.9.0
Paths:
plugin@1.0.0 -> logger@4.0.2 -> parser@2.9.0
Fixed versions: 3.0.0
Route: payments-platform via feishu:payments-security
The same showcase detects that plugin@2.0.0 requires Node.js 24, excludes the installed DSH Agent peer version, changes its entrypoint and DSH bundle, and declares a breaking change.
Incidents remain current even while an agent is offline:
NEW: 2.0.0 queued tasks: 1
UPDATED: 3.0.0 queued tasks: 1
RESOLVED: caught up queued tasks: 0
Inspect the generated vulnerability event, constrained agent task, compatibility event, and incident lifecycle.
- Preserves physical dependency nodes, edges, duplicate versions, and bounded root-to-package paths.
- Queries OSV for exact installed npm
name@versionpairs. - Recognizes vulnerability and malicious-package records.
- Monitors npm releases for installed plugins and pre-1.0 DSH packages.
- Detects version compatibility boundaries, Node.js exclusions, DSH/Cordis peer exclusions, entrypoint and export-map changes, bundle changes, and removed dependencies.
- Emits only meaningful
new,updated, andresolvedtransitions. - Keeps one current queued task per stable incident; updates replace stale work and resolution cancels it.
| Agent | Works now | Delivery model |
|---|---|---|
| DeepSeek Harness | Native | Installable upstream-radar/dsh bundle; automatic polling and durable follow-up to a live Agent |
| Codex CLI | CLI bridge | Render one constrained task to stdin for codex exec in a read-only sandbox |
| Claude Code | CLI bridge | Render one constrained task to stdin for non-interactive claude -p in plan mode |
| Other agents / CI | Generic bridge | Consume the task as bounded text or canonical JSON |
List and render the durable outbox:
upstream-radar task list /absolute/path/radar-state.json
upstream-radar task show /absolute/path/radar-state.json analysis-abc123Send the task to Codex:
upstream-radar task show /absolute/path/codex-state.json analysis-abc123 \
| codex exec -C /absolute/path/to/project --sandbox read-only \
--output-schema /absolute/path/to/upstream-radar/schemas/analysis-result.schema.json -Or Claude Code:
cd /absolute/path/to/project
upstream-radar task show /absolute/path/claude-state.json analysis-abc123 \
| claude -p "Analyze the Upstream Radar task supplied on stdin." --permission-mode planAfter the consumer accepts the task:
upstream-radar task ack /absolute/path/radar-state.json analysis-abc123These are deliberately generic one-shot bridges, not native Codex or Claude Code plugins. Use one state file per dispatcher. See coding-agent integrations for the exact boundary and official CLI references.
Build an inventory shaped like examples/radar/config.json, then query OSV and npm while retaining durable incident state:
pnpm build
node dist/src/cli.js radar check /absolute/path/radar-config.json \
--state /absolute/path/radar-state.jsonCompare two supplied manifests without installing or executing either release:
node dist/src/cli.js radar compare \
examples/radar/config.json \
examples/radar/plugin-before.json \
examples/radar/plugin-candidate.json \
--notes examples/radar/release-notes.txtUpstream Radar is currently installed from a checkout or packed tarball:
pnpm build
export UPSTREAM_RADAR_CONFIG=/absolute/path/radar-config.json
export UPSTREAM_RADAR_STATE=/absolute/path/radar-state.json
export UPSTREAM_RADAR_INTERVAL_SECONDS=1800
dsh plugin --profile web add /absolute/path/upstream-radar
dsh --profile webWithout UPSTREAM_RADAR_CONFIG, the bundle is dormant. While DSH is running, it polls at a bounded interval, persists matched tasks before delivery, and submits a plugin-originated follow-up to the first live root Agent. With no live Agent, work remains queued on disk.
The program establishes facts that must not be guessed:
parser@2.9.0 is reported as affected
plugin -> logger -> parser is the installed path
the project runs Node.js 22
the candidate requires Node.js >=24
the installed DSH peer is outside the candidate range
The coding agent investigates questions that require repository context:
is the vulnerable feature reachable here?
can attacker-controlled input reach it?
which API or configuration would the upgrade disturb?
what is the least disruptive project-specific action?
Every advisory, release note, URL, package name, and repository string is treated as untrusted data. The generated task is read-only, requires project evidence, preserves uncertainty, and has a published result JSON Schema. Model reasoning cannot rewrite the deterministic match.
The original bounded scanner remains available as a supporting collector:
node dist/src/cli.js scan /path/to/dsh-plugin
node dist/src/cli.js inspect npm:dsh-cloudflare-browser-run@0.1.1 --deepIt verifies exact npm bytes, registry signatures and provenance when available, statically inspects package risks, and resolves the dependency graph with lifecycle scripts disabled. It does not claim that a package is safe merely because implemented checks found nothing.
- npm lock graphs are supported; pnpm and Yarn graph adapters are not implemented.
- OSV and npm
latestare the live sources; automatic GitHub release and migration-guide ingestion is deferred. - Compatibility signals identify changes requiring analysis; they do not prove runtime breakage.
- DSH currently routes to the first live root Agent rather than a project-specific session.
- Codex and Claude Code use manual one-shot dispatch; no background wakeup or result ingestion exists for them yet.
- Do not let two dispatchers write the same state file concurrently.
- No Issue, branch, Pull Request, dependency override, or merge is created automatically.
Upstream Radar is alpha software built against a developer-preview DSH ecosystem. Event schemas and adapter boundaries can still change.
- Architecture
- Showcase walkthrough
- Coding-agent integrations
- Product vision(中文)
- Checks and evidence(中文)
- Threat model
- Roadmap
- Contributing
- Security policy
Apache-2.0 licensed.