Cross-ecosystem dependency policy gate for safer installs and updates.
Project description
SafeDeps
SafeDeps is a dependency safety gate.
It checks your project dependencies before install/update and can block risky changes (for example vulnerable, untrusted, or floating versions).
It works with Python, npm, NuGet, and Git dependency definitions.
You can use SafeDeps in two ways:
- Terminal/CLI mode (
safedeps scan,safedeps setup,safedeps help, etc.) - Web UI mode (recommended for guided usage)
Open the UI with:
safedeps ui --open-browser
What this command does:
- creates and uses a dedicated SafeDeps workspace automatically (
~/.safedeps/workspace) - keeps UI-generated files in that workspace by default (no random file scattering)
- auto-selects an available local port starting from
5200if the requested one is blocked - opens your browser directly on the local UI
Optional:
safedeps ui <your-project-path> --open-browser
Windows desktop launcher (creates a .bat on Desktop):
safedeps ui-shortcut
Quick desktop shortcut flow (Windows):
- Open PowerShell.
- Run
safedeps ui-shortcut. - Verify
SafeDeps UI.batexists on your Desktop. - If it is not created, run
safedeps helpand open an issue on GitHub with command output.
Install from PyPI (recommended for standard usage):
pip install safedeps
Status note (May 2026): PyPI publishing is now available.
npm and NuGet publishing are still being finalized.
Start In 60 Seconds
- Get the repository (choose one option):
Option A - clone with Git:
git clone https://github.com/jaydemks/SafeDeps.git
cd SafeDeps
Option B - download ZIP from GitHub and extract it:
cd /path/to/extracted/SafeDeps
- Create and activate a virtual environment:
macOS/Linux:
python3 -m venv .venv-test
source .venv-test/bin/activate
Windows (PowerShell):
py -m venv .venv-test
.\.venv-test\Scripts\Activate.ps1
If script execution is blocked in PowerShell:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\.venv-test\Scripts\Activate.ps1
- Install SafeDeps from the local repository folder:
python -m pip install -e .[dev]
- In your project folder, run one-time setup:
safedeps setup .
source .safedeps/activate.sh
Windows (PowerShell) setup + activation:
python -m safedeps.cli setup .
. .\.safedeps\activate.ps1
- Open the UI (recommended command, works even if shell entrypoint is missing):
safedeps ui --open-browser
Then open the URL printed in terminal (default start port is 5200).
Important reinstall note (Auto Guard state):
- After reinstall/upgrade, run
safedeps setup .once in the project you want to protect. - SafeDeps now re-syncs the real guard state (profile/PATH hooks) with the UI toggle.
- If you want to check commands again quickly, run
safedeps help.
- Re-scan from UI or CLI:
safedeps scan . --fail-on HIGH
After activation, runtime dependency operations are guarded in the shell session.
What It Is (Simple)
SafeDeps is a guardrail you run before installing or updating dependencies.
It helps you block risky dependency changes early, for example:
- unpinned/floating versions
- untrusted registries/sources
- known vulnerable packages (from configured local intelligence/feed)
- missing lockfiles
- suspicious package patterns
In short: it is a backend safety gate for dependency workflows in local dev and CI.
UI full guide: docs/UI_DOCUMENTATION.md
Test Status (Current)
- Tested and validated now:
- Python CLI flow
pipandpython -m pipruntime guard behavior- UI guard toggles and dynamic updates
- Still in active validation:
- npm runtime guard end-to-end
- NuGet/.NET runtime flows end-to-end
Current State
- Core engine: Python CLI/library (
safedepspackage) - npm distribution: wrapper package present in
packages/npm-wrapper - .NET global tool wrapper: implemented in
packages/dotnet-tool - Publish status:
- PyPI: published (installable with
pip install safedeps) - npm: not published yet
- NuGet: not published yet
- Target: finalize npm/NuGet publishing after release validation checks pass
- PyPI: published (installable with
- Security outputs:
security-artifacts/safedeps-report.jsonsecurity-artifacts/safedeps-sbom.json
Versioning Policy
- Single public version for all official distributions.
- Python core package version in
pyproject.tomlmust match:safedeps/__init__.py(__version__)packages/npm-wrapper/package.json(version)
- Release tags must follow
vX.Y.Z. - No package publish if versions are inconsistent.
- CI enforces this with
python scripts/check_versions.py.
Features
- Central policy file:
.safedeps/policy.json - Python scanning:
requirements*.txt
- npm scanning:
package.json.npmrc- lockfile presence checks
- install lifecycle scripts checks
pnpm-lock.yamldeep parsing (PyYAML-backed)
- .NET scanning:
.csprojNuGet.Config- lockfile presence checks
- Git dependency checks:
.gitmodules
- Rule enforcement:
- denylist packages
- floating/unpinned versions
- untrusted registries/indexes
- expired exceptions
- runtime strict checks for
pip,python -m pip, andnpmguarded wrappers
- CI-friendly exit codes
Install
Python (local development)
pip install .
Install with development tooling (tests):
pip install .[dev]
Or bootstrap a local virtual environment automatically:
./scripts/bootstrap_dev.sh
Windows manual setup:
py -m venv .venv-test
.\.venv-test\Scripts\Activate.ps1
pip install -e .[dev]
Python (from PyPI, after publish)
pip install safedeps
npm (from wrapper package)
From this repository:
cd packages/npm-wrapper
npm install -g .
From npm registry (after publish):
npm install -g @jaydemks/safedeps
Note: npm runtime flow is implemented, but full cross-environment validation is still in progress.
.NET
From this repository (after pack/install):
dotnet tool install --global --add-source ./artifacts/dotnet SafeDeps.Tool
Command:
safedeps-dotnet scan .
From NuGet (after publish):
dotnet tool install -g SafeDeps.Tool
Note: NuGet/.NET runtime flow is implemented, but full cross-environment validation is still in progress.
Quickstart
safedeps init
safedeps scan .
One-time project auto-configuration (guard pip install automatically in this project shell):
safedeps setup .
source .safedeps/activate.sh
Windows (PowerShell):
python -m safedeps.cli setup .
. .\.safedeps\activate.ps1
Quick help command (terminal/cmd/powershell):
safedeps help
Fail CI on high/critical findings:
safedeps scan . --fail-on HIGH
Optional online npm audit:
safedeps scan . --online-audit
Optional SARIF export:
safedeps scan . --sarif security-artifacts/safedeps.sarif
Optional CycloneDX export:
safedeps scan . --cyclonedx security-artifacts/safedeps.cdx.json
Optional SPDX export:
safedeps scan . --spdx security-artifacts/safedeps.spdx.json
Optional HTML export:
safedeps scan . --html security-artifacts/safedeps-report.html
Exporter notes:
- SARIF includes rule catalog and severity mapping.
- CycloneDX/SPDX exporters deduplicate repeated components.
- SPDX and CycloneDX include purl metadata when manager/version are available.
Validate local setup and metadata cache health:
safedeps doctor .
Explain a specific finding rule:
safedeps explain FLOATING_VERSION
Create vulnerability baseline from the latest report:
safedeps baseline . --report security-artifacts/safedeps-report.json --output .safedeps/vuln-baseline.json
Add/update an expiring suppression entry:
safedeps approve . --manager npm --rule FLOATING_VERSION --package lodash --file package.json --expires 2026-12-31
Run the local visual UI:
safedeps ui --open-browser
The UI is fully in English and includes visual flows for:
- initial auto-scan on UI open +
Re-Scan - dependency inventory table with quick approval action
- direct per-row
UninstallandSafe Updateactions - rule explanation (
explain) - baseline generation (
baseline) - expiring approvals (
approve --expires) - one-click finding pickup ("Use For Approval") to prefill approval fields
- policy quick editor for allowlist registries and deny packages
- pip install guard panel showing blocking pip findings and reasons
- intelligence editor for
.safedeps/vuln-feed.jsonand.safedeps/metadata-cache.json - one-click starter template generation for local "safe" intelligence files
- light/dark theme toggle persisted in browser
- dynamic partial refresh for scan/dependency actions (reduced full-page reload behavior)
UI options:
--host(default127.0.0.1)--port(default8765)--fail-on(defaultHIGH)
Protection scope behavior:
Project Only: guard blocks runtime dependency changes only when working inside this project path.Global: guard blocks runtime dependency changes both inside and outside this project path.- UI toggles are available under guard controls:
Scope: Project OnlyScope: Global
- Default scope:
- if SafeDeps runs inside a virtual environment:
Project Only - if SafeDeps runs system-wide:
Global
- if SafeDeps runs inside a virtual environment:
Minimal Policy Example
{
"allowed_registries": {
"npm": ["https://registry.npmjs.org/"],
"pip": ["https://pypi.org/simple", "https://pypi.org/simple/"],
"nuget": ["https://api.nuget.org/v3/index.json"]
},
"deny_packages": ["malicious-demo-package"],
"allow_unpinned": false,
"require_lockfiles": true,
"require_expiring_exceptions": true,
"exceptions": [
{
"manager": "npm",
"package": "demo-package",
"rule": "FLOATING_VERSION",
"expires": "2026-12-31",
"reason": "Temporary migration exception"
}
]
}
Vulnerability baseline support:
- Default file:
.safedeps/vuln-baseline.json - Matching findings can be suppressed via
suppressentries (manager,rule,package,file). - Suppression entries may include optional
expires(YYYY-MM-DD); expired entries are ignored.
Local vulnerability feed support:
- Optional file:
.safedeps/vuln-feed.json - Supported fields per entry:
manager,package,id,severity,message - Optional OSV-style entries via
vulnerabilities_osvare also supported in.safedeps/vuln-feed.json. - Severity is normalized to SafeDeps scale (
CRITICAL/HIGH/MEDIUM/LOW/INFO). - You can create/edit/validate this file directly from the UI ("Intelligence Settings"), no manual file editing required.
Local metadata cache support:
- Optional file:
.safedeps/metadata-cache.json - Used by age/churn/maintainer risk signals.
- You can create/edit/validate this file directly from the UI ("Intelligence Settings").
Verification Workflow
Run these checks before release:
safedeps scan examples/bad-projectmust fail (exit code 2).safedeps scan examples/safe-projectshould pass or produce only accepted non-blocking findings.python -m pytestmust pass.- CI must fail on an intentionally unsafe fixture branch.
Publishing
Python / PyPI
python -m build
python -m twine upload dist/*
npm
cd packages/npm-wrapper
npm publish --access public
.NET / NuGet (planned)
dotnet pack packages/dotnet-tool/SafeDeps.Tool.csproj -c Release -o artifacts/dotnet
dotnet nuget push artifacts/dotnet/*.nupkg --source https://api.nuget.org/v3/index.json --api-key YOUR_KEY
Use trusted publishing/OIDC whenever available.
Release Automation (Template)
Run local preflight checks before triggering a release:
python scripts/release/preflight.py --expected-version 0.2.9
Release workflow template:
.github/workflows/release-template.yml- includes:
- preflight checks
- Python distribution build artifact
- npm wrapper tarball artifact
- .NET tool
.nupkgartifact - release checksum manifest (
release-artifacts/release-manifest.json) - optional publish gates (
publish=true) for PyPI/npm/NuGet - tag-triggered release flow on
v*tags - GitHub release publication with attached artifacts
- build provenance attestation stage
Detailed process guide:
docs/release/RELEASE_PROCESS.md
Artifact validation helper:
python scripts/validate_artifacts.py security-artifacts
CI Templates
Ready-to-copy templates are available in examples/ci/ for:
- GitHub Actions
- GitLab CI
- Azure Pipelines
See examples/ci/README.md for usage details.
Pre-commit Integration
This repository includes a ready pre-commit hook config:
.pre-commit-config.yaml
Install and enable:
pip install pre-commit
pre-commit install
The hook runs:
safedeps scan . --fail-on HIGH --out security-artifacts
Security Scope
SafeDeps is a preventive gate, not a guarantee that every package is safe.
It should be used with lockfiles, code review, SBOM analysis, vulnerability feeds, signed releases where supported, and CI policy enforcement.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file safedeps-0.2.9.tar.gz.
File metadata
- Download URL: safedeps-0.2.9.tar.gz
- Upload date:
- Size: 59.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2847a4a98474a4454caadf95037a4927f6b9f98a015c955c0c8d7a86be707bd6
|
|
| MD5 |
97760b7fbd55ad13debfd9dc8dd6c944
|
|
| BLAKE2b-256 |
8f8700ac21fa1ed89d495768ddf7b641488e27b00b6813d568b749be7e74fcaf
|
File details
Details for the file safedeps-0.2.9-py3-none-any.whl.
File metadata
- Download URL: safedeps-0.2.9-py3-none-any.whl
- Upload date:
- Size: 55.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4762a96b29152a186ef4386d494f35fb0843e0c490856a005f9583bb629fbc78
|
|
| MD5 |
a19c5fb8991a65b9f76645ce17340df2
|
|
| BLAKE2b-256 |
0f8afe6c49db81320576531ef9fd05f25d2c19179215e1223f3cd1a8455b0041
|