universal-dev-security 1.0.0__tar.gz → 1.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/CHANGELOG.md +13 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/DEVELOPMENT_STATUS.md +6 -5
- {universal_dev_security-1.0.0/src/universal_dev_security.egg-info → universal_dev_security-1.0.1}/PKG-INFO +30 -24
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/README.md +29 -23
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/commands.md +1 -1
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/dashboard-design-system.md +1 -1
- universal_dev_security-1.0.1/docs/getting-started.md +176 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/installation.md +17 -4
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/integrations.md +2 -2
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/release.md +14 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/scanners.md +1 -1
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/scripts/install.ps1 +1 -1
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/scripts/install.sh +2 -2
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/__init__.py +1 -1
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/cli_extra.py +8 -3
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1/src/universal_dev_security.egg-info}/PKG-INFO +30 -24
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security.egg-info/SOURCES.txt +1 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_gitguard.py +12 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/CODE_OF_CONDUCT.md +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/CONTRIBUTING.md +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/LICENSE +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/MANIFEST.in +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/SECURITY.md +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/architecture.md +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/security-model.md +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/policies/GLOBAL_SECURITY_POLICY.md +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/pyproject.toml +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/scripts/release.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/setup.cfg +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/__main__.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/cli.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/config.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/detector.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/engine.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/findings.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/fixes.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/gitguard.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/history.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/initializer.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/integrations/__init__.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/integrations/agents.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/integrations/claude_code.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/integrations/github.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/integrations/vscode.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/policy.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/projectfiles.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/recovery.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/redaction.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/reports.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanner.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/__init__.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/base.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/gitleaks.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/osv.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/semgrep.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/trivy.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/testing.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/updates.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security.egg-info/dependency_links.txt +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security.egg-info/entry_points.txt +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security.egg-info/requires.txt +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security.egg-info/top_level.txt +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/fakes.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/fixtures/osv-scanner-2.7.1.json +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/fixtures/trivy-0.76.2.json +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_cli.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_config.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_detector.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_exposure.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_history.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_initializer.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_integrations.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_policy.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_recovery_fixes.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_redaction.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_redos.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_reports.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_scanner.py +0 -0
- {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_scanner_fixtures.py +0 -0
|
@@ -4,6 +4,19 @@ All notable changes to this project are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
|
|
5
5
|
Semantic Versioning (PEP 440 pre-release suffixes).
|
|
6
6
|
|
|
7
|
+
## [1.0.1] — 2026-11-14
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- `docs/getting-started.md`: step-by-step guide from installation to a protected project,
|
|
11
|
+
with real example output; linked from the README.
|
|
12
|
+
- README links are absolute so they work on the PyPI project page.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- `uds hooks install` now embeds the current Python interpreter by default (Git hooks are never
|
|
16
|
+
committed, so the machine-specific path is safe), with `uds` on PATH as fallback. Previously a
|
|
17
|
+
hook relying only on PATH blocked every commit made without the virtual environment
|
|
18
|
+
activated. Use `--path-only` for the old behavior.
|
|
19
|
+
|
|
7
20
|
## [1.0.0] — 2026-11-14
|
|
8
21
|
|
|
9
22
|
First stable release. Includes everything in 1.0.0rc1 plus improvements from the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Development Status
|
|
2
2
|
|
|
3
|
-
**Current version:** `1.0.
|
|
3
|
+
**Current version:** `1.0.1` (tag `v1.0.1`). Previous: `1.0.0` (first stable, GitHub + PyPI), `1.0.0rc1` pre-release.
|
|
4
4
|
**Last updated:** 2026-11-14
|
|
5
5
|
**Previous version:** 0.4.1 (original source archived at `dist/uds-0.4.1-original-source-backup.zip`, git-ignored)
|
|
6
6
|
|
|
@@ -67,13 +67,13 @@
|
|
|
67
67
|
5. `install.sh` is written for Linux/macOS and has not been executed.
|
|
68
68
|
6. Python 3.15 is newer than some packages support (PyYAML, Semgrep wheels); UDS itself is
|
|
69
69
|
dependency-free and works on 3.11–3.15.
|
|
70
|
-
7.
|
|
71
|
-
|
|
70
|
+
7. ~~PyPI not published~~ — published 2026-11-14 via Trusted Publishing; PyPI files are identical
|
|
71
|
+
to the GitHub release assets (verified SHA-256), and `pip install universal-dev-security` was tested.
|
|
72
72
|
|
|
73
73
|
## Pending decisions (need maintainer approval)
|
|
74
74
|
|
|
75
|
-
- Publishing
|
|
76
|
-
-
|
|
75
|
+
- Publishing `v1.0.1`: GitHub release (maintainer) and PyPI (maintainer runs the publish workflow).
|
|
76
|
+
- `1.0.0` is published on GitHub and PyPI.
|
|
77
77
|
- Private vulnerability reporting is enabled (verified via API); secret-scanning push protection
|
|
78
78
|
was enabled by the maintainer but cannot be verified without repository-admin authentication.
|
|
79
79
|
|
|
@@ -84,3 +84,4 @@
|
|
|
84
84
|
3. Pin GitHub Actions to commit SHAs in both workflows.
|
|
85
85
|
4. Optional offline mode for OSV-Scanner (local databases) to avoid sending package metadata.
|
|
86
86
|
5. Hosted web dashboard consuming report schema 2.0 (with authentication and authorization).
|
|
87
|
+
6. ~~README links on PyPI~~ — fixed in 1.0.1 (absolute links).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: universal-dev-security
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.1
|
|
4
4
|
Summary: One security system for every project: secrets, code, dependency and configuration scanning with a central policy engine, Git and AI-agent guards, and a local security dashboard.
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/jet1x/Universal-Dev-Security
|
|
@@ -39,8 +39,8 @@ industry-standard scanners on any project, normalizes their results into one
|
|
|
39
39
|
schema, enforces a central security policy for Git and AI coding agents, and
|
|
40
40
|
produces a dark, self-contained HTML security dashboard.
|
|
41
41
|
|
|
42
|
-
> **Status:** `1.0.
|
|
43
|
-
> [DEVELOPMENT_STATUS.md](DEVELOPMENT_STATUS.md) for verified functionality,
|
|
42
|
+
> **Status:** `1.0.1` — stable. See
|
|
43
|
+
> [DEVELOPMENT_STATUS.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/DEVELOPMENT_STATUS.md) for verified functionality,
|
|
44
44
|
> known issues and test results. UDS reports what its scanners find; a clean
|
|
45
45
|
> result is never proof that a project is secure.
|
|
46
46
|
|
|
@@ -68,19 +68,24 @@ else is `unclassified`. No security score is invented.
|
|
|
68
68
|
|
|
69
69
|
## Quick start
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
New to UDS? The **[Getting started guide](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/getting-started.md)**
|
|
72
|
+
walks through installation, your first scan, reading the dashboard, fixing findings and turning
|
|
73
|
+
on protection, with real example output.
|
|
72
74
|
|
|
73
|
-
|
|
74
|
-
# Windows (from a release folder containing the wheel and SHA256SUMS)
|
|
75
|
-
.\scripts\install.ps1 -Wheel .\dist\1.0.0\universal_dev_security-1.0.0-py3-none-any.whl
|
|
76
|
-
```
|
|
75
|
+
Requirements: Python 3.11+, Windows, Linux or macOS. Git is recommended.
|
|
77
76
|
|
|
78
77
|
```bash
|
|
79
|
-
|
|
80
|
-
sh scripts/install.sh --wheel dist/1.0.0/universal_dev_security-1.0.0-py3-none-any.whl
|
|
78
|
+
python -m pip install universal-dev-security
|
|
81
79
|
```
|
|
82
80
|
|
|
83
|
-
|
|
81
|
+
The package on [PyPI](https://pypi.org/project/universal-dev-security/) is identical to the
|
|
82
|
+
assets of the [GitHub release](https://github.com/jet1x/Universal-Dev-Security/releases)
|
|
83
|
+
(same SHA-256). Prefer an isolated install? Use `pipx install universal-dev-security`, or the
|
|
84
|
+
checksum-verifying installers described in
|
|
85
|
+
[docs/installation.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/installation.md).
|
|
86
|
+
|
|
87
|
+
Install at least [Gitleaks](https://github.com/gitleaks/gitleaks#installing); `uds doctor`
|
|
88
|
+
shows the official install command for every scanner. Then, inside a project:
|
|
84
89
|
|
|
85
90
|
```bash
|
|
86
91
|
uds doctor # runtime, config and scanner availability (+ official install sources)
|
|
@@ -92,19 +97,20 @@ uds integrate claude-code --apply # enforce the UDS policy inside Claude Code
|
|
|
92
97
|
```
|
|
93
98
|
|
|
94
99
|
Every command that changes files is a **dry run by default** and shows a diff;
|
|
95
|
-
`--apply` creates a recovery checkpoint first. See [docs/installation.md](docs/installation.md)
|
|
96
|
-
for scanner installation and upgrades, and [docs/commands.md](docs/commands.md) for all commands.
|
|
100
|
+
`--apply` creates a recovery checkpoint first. See [docs/installation.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/installation.md)
|
|
101
|
+
for scanner installation and upgrades, and [docs/commands.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/commands.md) for all commands.
|
|
97
102
|
|
|
98
103
|
## Documentation
|
|
99
104
|
|
|
100
|
-
- [
|
|
101
|
-
- [
|
|
102
|
-
- [
|
|
103
|
-
- [
|
|
104
|
-
- [
|
|
105
|
-
- [
|
|
106
|
-
- [
|
|
107
|
-
- [
|
|
105
|
+
- [Getting started](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/getting-started.md)
|
|
106
|
+
- [Installation and upgrades](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/installation.md)
|
|
107
|
+
- [Commands](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/commands.md)
|
|
108
|
+
- [Scanners, severity and privacy](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/scanners.md)
|
|
109
|
+
- [Integrations: Claude Code, GitHub, VS Code, other agents](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/integrations.md)
|
|
110
|
+
- [Architecture](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/architecture.md)
|
|
111
|
+
- [Security model](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/security-model.md) and [global policy](https://github.com/jet1x/Universal-Dev-Security/blob/main/policies/GLOBAL_SECURITY_POLICY.md)
|
|
112
|
+
- [Dashboard design system](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/dashboard-design-system.md)
|
|
113
|
+
- [Release process](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/release.md)
|
|
108
114
|
|
|
109
115
|
## Safety guarantees
|
|
110
116
|
|
|
@@ -120,9 +126,9 @@ repository-level protections (for example GitHub push protection) enabled too.
|
|
|
120
126
|
|
|
121
127
|
## Contributing and security
|
|
122
128
|
|
|
123
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md) and [SECURITY.md](SECURITY.md).
|
|
124
|
-
Changes are listed in [CHANGELOG.md](CHANGELOG.md).
|
|
129
|
+
See [CONTRIBUTING.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/CONTRIBUTING.md) and [SECURITY.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/SECURITY.md).
|
|
130
|
+
Changes are listed in [CHANGELOG.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/CHANGELOG.md).
|
|
125
131
|
|
|
126
132
|
## License
|
|
127
133
|
|
|
128
|
-
Apache License 2.0. See [LICENSE](LICENSE).
|
|
134
|
+
Apache License 2.0. See [LICENSE](https://github.com/jet1x/Universal-Dev-Security/blob/main/LICENSE).
|
|
@@ -7,8 +7,8 @@ industry-standard scanners on any project, normalizes their results into one
|
|
|
7
7
|
schema, enforces a central security policy for Git and AI coding agents, and
|
|
8
8
|
produces a dark, self-contained HTML security dashboard.
|
|
9
9
|
|
|
10
|
-
> **Status:** `1.0.
|
|
11
|
-
> [DEVELOPMENT_STATUS.md](DEVELOPMENT_STATUS.md) for verified functionality,
|
|
10
|
+
> **Status:** `1.0.1` — stable. See
|
|
11
|
+
> [DEVELOPMENT_STATUS.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/DEVELOPMENT_STATUS.md) for verified functionality,
|
|
12
12
|
> known issues and test results. UDS reports what its scanners find; a clean
|
|
13
13
|
> result is never proof that a project is secure.
|
|
14
14
|
|
|
@@ -36,19 +36,24 @@ else is `unclassified`. No security score is invented.
|
|
|
36
36
|
|
|
37
37
|
## Quick start
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
New to UDS? The **[Getting started guide](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/getting-started.md)**
|
|
40
|
+
walks through installation, your first scan, reading the dashboard, fixing findings and turning
|
|
41
|
+
on protection, with real example output.
|
|
40
42
|
|
|
41
|
-
|
|
42
|
-
# Windows (from a release folder containing the wheel and SHA256SUMS)
|
|
43
|
-
.\scripts\install.ps1 -Wheel .\dist\1.0.0\universal_dev_security-1.0.0-py3-none-any.whl
|
|
44
|
-
```
|
|
43
|
+
Requirements: Python 3.11+, Windows, Linux or macOS. Git is recommended.
|
|
45
44
|
|
|
46
45
|
```bash
|
|
47
|
-
|
|
48
|
-
sh scripts/install.sh --wheel dist/1.0.0/universal_dev_security-1.0.0-py3-none-any.whl
|
|
46
|
+
python -m pip install universal-dev-security
|
|
49
47
|
```
|
|
50
48
|
|
|
51
|
-
|
|
49
|
+
The package on [PyPI](https://pypi.org/project/universal-dev-security/) is identical to the
|
|
50
|
+
assets of the [GitHub release](https://github.com/jet1x/Universal-Dev-Security/releases)
|
|
51
|
+
(same SHA-256). Prefer an isolated install? Use `pipx install universal-dev-security`, or the
|
|
52
|
+
checksum-verifying installers described in
|
|
53
|
+
[docs/installation.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/installation.md).
|
|
54
|
+
|
|
55
|
+
Install at least [Gitleaks](https://github.com/gitleaks/gitleaks#installing); `uds doctor`
|
|
56
|
+
shows the official install command for every scanner. Then, inside a project:
|
|
52
57
|
|
|
53
58
|
```bash
|
|
54
59
|
uds doctor # runtime, config and scanner availability (+ official install sources)
|
|
@@ -60,19 +65,20 @@ uds integrate claude-code --apply # enforce the UDS policy inside Claude Code
|
|
|
60
65
|
```
|
|
61
66
|
|
|
62
67
|
Every command that changes files is a **dry run by default** and shows a diff;
|
|
63
|
-
`--apply` creates a recovery checkpoint first. See [docs/installation.md](docs/installation.md)
|
|
64
|
-
for scanner installation and upgrades, and [docs/commands.md](docs/commands.md) for all commands.
|
|
68
|
+
`--apply` creates a recovery checkpoint first. See [docs/installation.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/installation.md)
|
|
69
|
+
for scanner installation and upgrades, and [docs/commands.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/commands.md) for all commands.
|
|
65
70
|
|
|
66
71
|
## Documentation
|
|
67
72
|
|
|
68
|
-
- [
|
|
69
|
-
- [
|
|
70
|
-
- [
|
|
71
|
-
- [
|
|
72
|
-
- [
|
|
73
|
-
- [
|
|
74
|
-
- [
|
|
75
|
-
- [
|
|
73
|
+
- [Getting started](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/getting-started.md)
|
|
74
|
+
- [Installation and upgrades](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/installation.md)
|
|
75
|
+
- [Commands](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/commands.md)
|
|
76
|
+
- [Scanners, severity and privacy](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/scanners.md)
|
|
77
|
+
- [Integrations: Claude Code, GitHub, VS Code, other agents](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/integrations.md)
|
|
78
|
+
- [Architecture](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/architecture.md)
|
|
79
|
+
- [Security model](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/security-model.md) and [global policy](https://github.com/jet1x/Universal-Dev-Security/blob/main/policies/GLOBAL_SECURITY_POLICY.md)
|
|
80
|
+
- [Dashboard design system](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/dashboard-design-system.md)
|
|
81
|
+
- [Release process](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/release.md)
|
|
76
82
|
|
|
77
83
|
## Safety guarantees
|
|
78
84
|
|
|
@@ -88,9 +94,9 @@ repository-level protections (for example GitHub push protection) enabled too.
|
|
|
88
94
|
|
|
89
95
|
## Contributing and security
|
|
90
96
|
|
|
91
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md) and [SECURITY.md](SECURITY.md).
|
|
92
|
-
Changes are listed in [CHANGELOG.md](CHANGELOG.md).
|
|
97
|
+
See [CONTRIBUTING.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/CONTRIBUTING.md) and [SECURITY.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/SECURITY.md).
|
|
98
|
+
Changes are listed in [CHANGELOG.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/CHANGELOG.md).
|
|
93
99
|
|
|
94
100
|
## License
|
|
95
101
|
|
|
96
|
-
Apache License 2.0. See [LICENSE](LICENSE).
|
|
102
|
+
Apache License 2.0. See [LICENSE](https://github.com/jet1x/Universal-Dev-Security/blob/main/LICENSE).
|
|
@@ -52,7 +52,7 @@ incomplete with `--require-complete`, or invalid input.
|
|
|
52
52
|
|
|
53
53
|
| Command | Purpose |
|
|
54
54
|
|---|---|
|
|
55
|
-
| `uds hooks install [PATH] [--apply] [--
|
|
55
|
+
| `uds hooks install [PATH] [--apply] [--path-only]` | Install `pre-commit` and `pre-push` hooks (embed this Python interpreter, with `uds` on PATH as fallback; `--path-only` uses PATH only) |
|
|
56
56
|
| `uds hooks uninstall [PATH] [--apply]` | Remove UDS-owned hooks only |
|
|
57
57
|
| `uds hooks status [PATH]` | Show hook state (`uds`, `foreign`, `missing`) |
|
|
58
58
|
| `uds hook git-pre-commit` / `git-pre-push` | Hook entry points (called by Git) |
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Getting started
|
|
2
|
+
|
|
3
|
+
This guide takes you from installation to a protected project in about ten minutes.
|
|
4
|
+
UDS runs locally: it checks your project with established security scanners, shows the
|
|
5
|
+
results in one dashboard, and can stop mistakes such as committing a password before they
|
|
6
|
+
happen.
|
|
7
|
+
|
|
8
|
+
## 1. Install UDS
|
|
9
|
+
|
|
10
|
+
You need Python 3.11 or newer.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
python -m pip install universal-dev-security
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Check what is available on your machine:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
uds doctor
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
UDS 1.0.1 · Python 3.12.4 · Windows 11
|
|
24
|
+
Git available: yes
|
|
25
|
+
Project config: not initialized
|
|
26
|
+
Scanners:
|
|
27
|
+
Gitleaks OK 8.30.1
|
|
28
|
+
Semgrep not installed
|
|
29
|
+
install: python -m pip install semgrep (inside the UDS virtual environment)
|
|
30
|
+
OSV-Scanner not installed
|
|
31
|
+
install: winget install --id Google.OSVScanner -e or download from https://github.com/google/osv-scanner/releases
|
|
32
|
+
Trivy not installed
|
|
33
|
+
install: winget install --id AquaSecurity.Trivy -e
|
|
34
|
+
UDS runtime: OK (no network access used, no global settings modified)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 2. Install the scanners you want
|
|
38
|
+
|
|
39
|
+
UDS never installs software for you. `uds doctor` prints the official install command for
|
|
40
|
+
your operating system. What each scanner adds:
|
|
41
|
+
|
|
42
|
+
| Scanner | Finds | Recommended |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| **Gitleaks** | Passwords, API keys and tokens in your files | **Yes — the minimum** |
|
|
45
|
+
| Semgrep | Risky code patterns (injection, unsafe functions, …) | Yes |
|
|
46
|
+
| Trivy | Vulnerable libraries and insecure Docker / Kubernetes / Terraform configuration | Yes |
|
|
47
|
+
| OSV-Scanner | Vulnerable libraries (a second, independent database) | Optional — sends package names and versions to osv.dev, so it only runs when you allow network use |
|
|
48
|
+
|
|
49
|
+
Run `uds doctor` again afterwards; installed scanners show `OK`.
|
|
50
|
+
|
|
51
|
+
## 3. Scan a project
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
cd path/to/your-project
|
|
55
|
+
uds scan
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
UDS scan 20261114T121420244950Z-edd0df · path/to/your-project
|
|
60
|
+
Overall status: FINDINGS
|
|
61
|
+
gitleaks clean 0 No findings reported by Gitleaks.
|
|
62
|
+
semgrep not_installed - Semgrep was not found. See https://semgrep.dev/docs/getting-started/quickstart ...
|
|
63
|
+
osv-scanner not_installed - OSV-Scanner was not found. See https://google.github.io/osv-scanner/installation/ ...
|
|
64
|
+
trivy findings 9 9 finding(s) reported by Trivy.
|
|
65
|
+
Findings: critical 0, high 3, medium 6, low 0, unclassified 0 (total 9)
|
|
66
|
+
Report (json): path/to/your-project/.uds/reports/security-report.json
|
|
67
|
+
Report (html): path/to/your-project/.uds/reports/security-report.html
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
What happened:
|
|
71
|
+
|
|
72
|
+
1. UDS detected the project's technologies (Python, Next.js, Docker, …).
|
|
73
|
+
2. It ran only the scanners that apply to them, and says clearly which ones did not run.
|
|
74
|
+
3. It wrote a JSON report and an HTML dashboard to `.uds/reports/` (excluded from Git).
|
|
75
|
+
|
|
76
|
+
To include OSV-Scanner, approve its network use explicitly: `uds scan --allow-network`.
|
|
77
|
+
|
|
78
|
+
## 4. Read the results
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
uds dashboard --open
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The dashboard opens in your browser (it works offline and loads nothing from the internet):
|
|
85
|
+
|
|
86
|
+
- **Findings by severity** — critical, high, medium, low, and *unclassified* when the scanner
|
|
87
|
+
gives no severity. UDS never invents a severity or a "security score".
|
|
88
|
+
- **Recommendations** — what to do first, for example *"Upgrade jinja2 → 2.10.1"* or
|
|
89
|
+
*"Rotate 1 credential found in Git-tracked files"*.
|
|
90
|
+
- **Findings** — search and filter; open a finding to see the file, line, explanation, fix and
|
|
91
|
+
references. Secrets are marked **in Git** (already shared — rotate them) or **local only**.
|
|
92
|
+
- **Change since previous scan** — what is new and what was fixed since your last `uds scan`.
|
|
93
|
+
|
|
94
|
+
Secret values are never shown — only the file and line where they are.
|
|
95
|
+
|
|
96
|
+
## 5. Fix what was found
|
|
97
|
+
|
|
98
|
+
- **Vulnerable library:** upgrade it to the version shown, then run your tests (`uds test`).
|
|
99
|
+
- **Secret in a file:** move it to an environment variable or a secret manager. If it was ever
|
|
100
|
+
committed or shared, also **revoke or rotate it** with the service that issued it.
|
|
101
|
+
- **Code or configuration issue:** follow the remediation shown in the finding.
|
|
102
|
+
|
|
103
|
+
UDS can apply a few safe fixes itself, such as adding `.env` files to `.gitignore`:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
uds fix # shows what it would change
|
|
107
|
+
uds fix --apply # applies it, runs your tests, and undoes the change if they fail
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Then run `uds scan` again to confirm.
|
|
111
|
+
|
|
112
|
+
## 6. Prevent new problems
|
|
113
|
+
|
|
114
|
+
### Block secrets before they reach Git
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
uds hooks install --apply
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
From now on a commit that contains a secret is stopped:
|
|
121
|
+
|
|
122
|
+
```text
|
|
123
|
+
$ git commit -m "add settings"
|
|
124
|
+
UDS: 1 potential secret(s) found in staged changes (Gitleaks). Blocked.
|
|
125
|
+
- generic-api-key: settings.py:1
|
|
126
|
+
UDS: remove the secret, rotate it if it was ever pushed, and use environment variables or a secret manager.
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Pushes are checked the same way. Existing Git hooks are never overwritten.
|
|
130
|
+
|
|
131
|
+
### Keep AI coding assistants within safe limits (Claude Code)
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
uds integrate claude-code --apply
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Claude Code will then ask for your approval before `git push`, recursive deletes or reading
|
|
138
|
+
`.env` files, and is blocked from writing credentials into files or bypassing Git hooks with
|
|
139
|
+
`--no-verify`. Restart Claude Code after installing. Other agents can use the same policy
|
|
140
|
+
through `uds guard` (see [integrations](integrations.md)).
|
|
141
|
+
|
|
142
|
+
### Check every pull request on GitHub
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
uds integrate github --apply
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
This creates `.github/workflows/uds-security.yml`. Review it and commit it yourself — UDS never
|
|
149
|
+
commits or pushes. Findings appear in the repository's *Security → Code scanning* tab.
|
|
150
|
+
|
|
151
|
+
## Safety rules UDS follows
|
|
152
|
+
|
|
153
|
+
- **Nothing changes without your say.** Commands that modify files show a preview first and
|
|
154
|
+
change something only with `--apply`.
|
|
155
|
+
- **Everything can be undone.** Each change creates a recovery point: `uds rollback <id>`.
|
|
156
|
+
- **Honest results.** A scanner that did not run is reported as such; a clean result means only
|
|
157
|
+
that the scanners that ran found nothing.
|
|
158
|
+
- **Private by default.** No telemetry; nothing leaves your machine unless you allow it.
|
|
159
|
+
|
|
160
|
+
## Command cheat sheet
|
|
161
|
+
|
|
162
|
+
| I want to… | Command |
|
|
163
|
+
|---|---|
|
|
164
|
+
| See what is installed | `uds doctor` |
|
|
165
|
+
| Scan the project | `uds scan` |
|
|
166
|
+
| Open the results | `uds dashboard --open` |
|
|
167
|
+
| Compare with the previous scan | `uds compare` |
|
|
168
|
+
| Apply safe fixes | `uds fix --apply` |
|
|
169
|
+
| Block secrets in commits and pushes | `uds hooks install --apply` |
|
|
170
|
+
| Protect work with Claude Code | `uds integrate claude-code --apply` |
|
|
171
|
+
| Check every pull request | `uds integrate github --apply` |
|
|
172
|
+
| Undo a change made by UDS | `uds rollback <id>` |
|
|
173
|
+
| Fail a CI job on serious findings | `uds scan --fail-on high` |
|
|
174
|
+
|
|
175
|
+
Next: [all commands](commands.md) · [scanners and severity](scanners.md) ·
|
|
176
|
+
[integrations](integrations.md) · [security model](security-model.md)
|
|
@@ -4,10 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
UDS requires Python 3.11 or newer and has no runtime dependencies.
|
|
6
6
|
|
|
7
|
+
**From PyPI (simplest):**
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
python -m pip install universal-dev-security # or: pipx install universal-dev-security
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The PyPI files are the same files attached to the GitHub release (identical SHA-256),
|
|
14
|
+
published through Trusted Publishing.
|
|
15
|
+
|
|
16
|
+
**With the checksum-verifying installers** (download the wheel and `SHA256SUMS` from the
|
|
17
|
+
[GitHub release](https://github.com/jet1x/Universal-Dev-Security/releases); the scripts are in the
|
|
18
|
+
release's source archive):
|
|
19
|
+
|
|
7
20
|
**Windows (user-level, no administrator rights):**
|
|
8
21
|
|
|
9
22
|
```powershell
|
|
10
|
-
.\scripts\install.ps1 -Wheel .\dist\1.0.
|
|
23
|
+
.\scripts\install.ps1 -Wheel .\dist\1.0.1\universal_dev_security-1.0.1-py3-none-any.whl
|
|
11
24
|
# optional: add the venv Scripts folder to your *user* PATH
|
|
12
25
|
.\scripts\install.ps1 -Wheel <wheel> -AddToPath
|
|
13
26
|
```
|
|
@@ -15,7 +28,7 @@ UDS requires Python 3.11 or newer and has no runtime dependencies.
|
|
|
15
28
|
**Linux / macOS:**
|
|
16
29
|
|
|
17
30
|
```bash
|
|
18
|
-
sh scripts/install.sh --wheel dist/1.0.
|
|
31
|
+
sh scripts/install.sh --wheel dist/1.0.1/universal_dev_security-1.0.1-py3-none-any.whl
|
|
19
32
|
export PATH="$HOME/.local/share/uds/venv/bin:$PATH"
|
|
20
33
|
```
|
|
21
34
|
|
|
@@ -54,12 +67,12 @@ as `skipped` with reason `unsupported_version`.
|
|
|
54
67
|
|
|
55
68
|
## Upgrade UDS
|
|
56
69
|
|
|
57
|
-
1. Check: `uds update check --source github:jet1x/Universal-Dev-Security`
|
|
70
|
+
1. Check: `uds update check --source pypi` (or `--source github:jet1x/Universal-Dev-Security`). This is the
|
|
58
71
|
only command that contacts the network for updates, and only when a source is given.
|
|
59
72
|
2. Read the [CHANGELOG](../CHANGELOG.md) for breaking changes.
|
|
60
73
|
3. Upgrade inside the UDS virtual environment:
|
|
61
74
|
- from a verified wheel: re-run the installer with the new wheel;
|
|
62
|
-
- from PyPI
|
|
75
|
+
- from PyPI: `python -m pip install --upgrade universal-dev-security`.
|
|
63
76
|
4. Run `uds doctor` and `uds scan`.
|
|
64
77
|
|
|
65
78
|
Project files (`.uds/config.toml`, history, checkpoints) are compatible across
|
|
@@ -66,8 +66,8 @@ as "do not proceed". Responses never contain secret values.
|
|
|
66
66
|
## Git hooks
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
|
-
uds hooks install --apply # pre-commit + pre-push
|
|
70
|
-
uds hooks install --apply --
|
|
69
|
+
uds hooks install --apply # pre-commit + pre-push (embeds this interpreter)
|
|
70
|
+
uds hooks install --apply --path-only # rely only on `uds` from PATH
|
|
71
71
|
uds hooks status
|
|
72
72
|
```
|
|
73
73
|
|
|
@@ -26,6 +26,20 @@ python scripts/release.py
|
|
|
26
26
|
- [ ] Artifacts and `SHA256SUMS` attached to a signed Git tag.
|
|
27
27
|
- [ ] Private vulnerability reporting enabled on the repository (see SECURITY.md).
|
|
28
28
|
|
|
29
|
+
## Publish to PyPI (Trusted Publishing)
|
|
30
|
+
|
|
31
|
+
PyPI publication uses OIDC Trusted Publishing — no API token exists anywhere.
|
|
32
|
+
|
|
33
|
+
One-time setup on PyPI (account with 2FA): *Your account → Publishing → Add a new pending
|
|
34
|
+
publisher* with project `universal-dev-security`, owner `jet1x`, repository
|
|
35
|
+
`Universal-Dev-Security`, workflow `publish-pypi.yml`, environment `pypi`.
|
|
36
|
+
|
|
37
|
+
For each release: publish the GitHub release with its assets and `SHA256SUMS` first, then run
|
|
38
|
+
*Actions → publish to PyPI → Run workflow* with the tag. The workflow downloads the release
|
|
39
|
+
assets, verifies them against `SHA256SUMS`, runs `twine check --strict`, and uploads exactly
|
|
40
|
+
those files, so PyPI and GitHub serve identical artifacts. PyPI files are immutable: a mistake
|
|
41
|
+
requires a new version number.
|
|
42
|
+
|
|
29
43
|
## Versioning
|
|
30
44
|
|
|
31
45
|
Semantic Versioning. Pre-releases use PEP 440 suffixes (`1.0.0rc1`). The JSON
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
| Scanner | Category | Minimum | Verified with | Applies when | Network behavior |
|
|
6
6
|
|---|---|---|---|---|---|
|
|
7
7
|
| Gitleaks | Secrets | 8.19.0 (`gitleaks dir`) | 8.30.1 (real binary) | Always | Fully offline |
|
|
8
|
-
| Semgrep | Code (SAST) | 1.0.0 |
|
|
8
|
+
| Semgrep | Code (SAST) | 1.0.0 | CI (latest PyPI release, self-scan) | Source code present | Downloads registry rule packs; UDS forces `--metrics=off`; source is not uploaded |
|
|
9
9
|
| OSV-Scanner | Dependencies | 1.4.0 (v1 and v2 CLI) | 2.7.1 (real binary) | Manifests/lockfiles present | **Sends package names + versions to osv.dev** — requires `--allow-network` or `allow_network = true` |
|
|
10
10
|
| Trivy | Dependencies + misconfiguration | 0.45.0 | 0.76.2 (real binary) | Manifests or Docker/IaC files present | Downloads vulnerability DB and checks; files analysed locally |
|
|
11
11
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
-AddToPath is given (user PATH only).
|
|
10
10
|
|
|
11
11
|
.EXAMPLE
|
|
12
|
-
.\scripts\install.ps1 -Wheel .\dist\1.0.
|
|
12
|
+
.\scripts\install.ps1 -Wheel .\dist\1.0.1\universal_dev_security-1.0.1-py3-none-any.whl
|
|
13
13
|
#>
|
|
14
14
|
[CmdletBinding()]
|
|
15
15
|
param(
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
# SHA256SUMS when present) or a pip specification. Does not install scanners and
|
|
5
5
|
# does not modify shell profiles.
|
|
6
6
|
#
|
|
7
|
-
# sh scripts/install.sh --wheel dist/1.0.
|
|
8
|
-
# sh scripts/install.sh --spec universal-dev-security==1.0.
|
|
7
|
+
# sh scripts/install.sh --wheel dist/1.0.1/universal_dev_security-1.0.1-py3-none-any.whl
|
|
8
|
+
# sh scripts/install.sh --spec universal-dev-security==1.0.1
|
|
9
9
|
set -eu
|
|
10
10
|
|
|
11
11
|
WHEEL=""
|
|
@@ -195,9 +195,14 @@ def register(sub: Any, with_path: Callable[[argparse.ArgumentParser], argparse.A
|
|
|
195
195
|
for name in ("install", "uninstall"):
|
|
196
196
|
hp = with_path(hsub.add_parser(name))
|
|
197
197
|
hp.add_argument("--apply", action="store_true", help="Make the change (default is a dry run)")
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
198
|
+
# Git hooks live in .git/hooks, which is never committed, so embedding this machine's
|
|
199
|
+
# interpreter path is safe and avoids blocking commits when `uds` is not on PATH
|
|
200
|
+
# (e.g. committing from an editor without the virtual environment activated).
|
|
201
|
+
hp.add_argument("--path-only", dest="python_path", action="store_false",
|
|
202
|
+
help="Rely only on `uds` from PATH instead of embedding this Python interpreter")
|
|
203
|
+
hp.add_argument("--python-path", dest="python_path", action="store_true",
|
|
204
|
+
help="Embed this Python interpreter (default; kept for compatibility)")
|
|
205
|
+
hp.set_defaults(func=cmd_hooks, python_path=True)
|
|
201
206
|
with_path(hsub.add_parser("status")).set_defaults(func=cmd_hooks, apply=False, python_path=False)
|
|
202
207
|
|
|
203
208
|
p = sub.add_parser("integrate", help="Set up Claude Code, GitHub Actions or VS Code integration")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: universal-dev-security
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.1
|
|
4
4
|
Summary: One security system for every project: secrets, code, dependency and configuration scanning with a central policy engine, Git and AI-agent guards, and a local security dashboard.
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/jet1x/Universal-Dev-Security
|
|
@@ -39,8 +39,8 @@ industry-standard scanners on any project, normalizes their results into one
|
|
|
39
39
|
schema, enforces a central security policy for Git and AI coding agents, and
|
|
40
40
|
produces a dark, self-contained HTML security dashboard.
|
|
41
41
|
|
|
42
|
-
> **Status:** `1.0.
|
|
43
|
-
> [DEVELOPMENT_STATUS.md](DEVELOPMENT_STATUS.md) for verified functionality,
|
|
42
|
+
> **Status:** `1.0.1` — stable. See
|
|
43
|
+
> [DEVELOPMENT_STATUS.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/DEVELOPMENT_STATUS.md) for verified functionality,
|
|
44
44
|
> known issues and test results. UDS reports what its scanners find; a clean
|
|
45
45
|
> result is never proof that a project is secure.
|
|
46
46
|
|
|
@@ -68,19 +68,24 @@ else is `unclassified`. No security score is invented.
|
|
|
68
68
|
|
|
69
69
|
## Quick start
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
New to UDS? The **[Getting started guide](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/getting-started.md)**
|
|
72
|
+
walks through installation, your first scan, reading the dashboard, fixing findings and turning
|
|
73
|
+
on protection, with real example output.
|
|
72
74
|
|
|
73
|
-
|
|
74
|
-
# Windows (from a release folder containing the wheel and SHA256SUMS)
|
|
75
|
-
.\scripts\install.ps1 -Wheel .\dist\1.0.0\universal_dev_security-1.0.0-py3-none-any.whl
|
|
76
|
-
```
|
|
75
|
+
Requirements: Python 3.11+, Windows, Linux or macOS. Git is recommended.
|
|
77
76
|
|
|
78
77
|
```bash
|
|
79
|
-
|
|
80
|
-
sh scripts/install.sh --wheel dist/1.0.0/universal_dev_security-1.0.0-py3-none-any.whl
|
|
78
|
+
python -m pip install universal-dev-security
|
|
81
79
|
```
|
|
82
80
|
|
|
83
|
-
|
|
81
|
+
The package on [PyPI](https://pypi.org/project/universal-dev-security/) is identical to the
|
|
82
|
+
assets of the [GitHub release](https://github.com/jet1x/Universal-Dev-Security/releases)
|
|
83
|
+
(same SHA-256). Prefer an isolated install? Use `pipx install universal-dev-security`, or the
|
|
84
|
+
checksum-verifying installers described in
|
|
85
|
+
[docs/installation.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/installation.md).
|
|
86
|
+
|
|
87
|
+
Install at least [Gitleaks](https://github.com/gitleaks/gitleaks#installing); `uds doctor`
|
|
88
|
+
shows the official install command for every scanner. Then, inside a project:
|
|
84
89
|
|
|
85
90
|
```bash
|
|
86
91
|
uds doctor # runtime, config and scanner availability (+ official install sources)
|
|
@@ -92,19 +97,20 @@ uds integrate claude-code --apply # enforce the UDS policy inside Claude Code
|
|
|
92
97
|
```
|
|
93
98
|
|
|
94
99
|
Every command that changes files is a **dry run by default** and shows a diff;
|
|
95
|
-
`--apply` creates a recovery checkpoint first. See [docs/installation.md](docs/installation.md)
|
|
96
|
-
for scanner installation and upgrades, and [docs/commands.md](docs/commands.md) for all commands.
|
|
100
|
+
`--apply` creates a recovery checkpoint first. See [docs/installation.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/installation.md)
|
|
101
|
+
for scanner installation and upgrades, and [docs/commands.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/commands.md) for all commands.
|
|
97
102
|
|
|
98
103
|
## Documentation
|
|
99
104
|
|
|
100
|
-
- [
|
|
101
|
-
- [
|
|
102
|
-
- [
|
|
103
|
-
- [
|
|
104
|
-
- [
|
|
105
|
-
- [
|
|
106
|
-
- [
|
|
107
|
-
- [
|
|
105
|
+
- [Getting started](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/getting-started.md)
|
|
106
|
+
- [Installation and upgrades](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/installation.md)
|
|
107
|
+
- [Commands](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/commands.md)
|
|
108
|
+
- [Scanners, severity and privacy](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/scanners.md)
|
|
109
|
+
- [Integrations: Claude Code, GitHub, VS Code, other agents](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/integrations.md)
|
|
110
|
+
- [Architecture](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/architecture.md)
|
|
111
|
+
- [Security model](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/security-model.md) and [global policy](https://github.com/jet1x/Universal-Dev-Security/blob/main/policies/GLOBAL_SECURITY_POLICY.md)
|
|
112
|
+
- [Dashboard design system](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/dashboard-design-system.md)
|
|
113
|
+
- [Release process](https://github.com/jet1x/Universal-Dev-Security/blob/main/docs/release.md)
|
|
108
114
|
|
|
109
115
|
## Safety guarantees
|
|
110
116
|
|
|
@@ -120,9 +126,9 @@ repository-level protections (for example GitHub push protection) enabled too.
|
|
|
120
126
|
|
|
121
127
|
## Contributing and security
|
|
122
128
|
|
|
123
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md) and [SECURITY.md](SECURITY.md).
|
|
124
|
-
Changes are listed in [CHANGELOG.md](CHANGELOG.md).
|
|
129
|
+
See [CONTRIBUTING.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/CONTRIBUTING.md) and [SECURITY.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/SECURITY.md).
|
|
130
|
+
Changes are listed in [CHANGELOG.md](https://github.com/jet1x/Universal-Dev-Security/blob/main/CHANGELOG.md).
|
|
125
131
|
|
|
126
132
|
## License
|
|
127
133
|
|
|
128
|
-
Apache License 2.0. See [LICENSE](LICENSE).
|
|
134
|
+
Apache License 2.0. See [LICENSE](https://github.com/jet1x/Universal-Dev-Security/blob/main/LICENSE).
|
|
@@ -131,3 +131,15 @@ def test_hook_install_is_recoverable(repo):
|
|
|
131
131
|
restore = RecoveryManager(repo).restore(result["checkpoint"])
|
|
132
132
|
assert restore["status"] == "restored"
|
|
133
133
|
assert not (repo / ".git" / "hooks" / "pre-commit").exists()
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def test_cli_hooks_embed_interpreter_by_default(repo, capsys):
|
|
137
|
+
# Regression (found while writing the getting-started guide): hooks that relied only on
|
|
138
|
+
# `uds` from PATH blocked every commit made outside the activated virtual environment.
|
|
139
|
+
from universal_dev_security.cli import main
|
|
140
|
+
assert main(["hooks", "install", str(repo), "--apply"]) == 0
|
|
141
|
+
script = (repo / ".git" / "hooks" / "pre-commit").read_text(encoding="utf-8")
|
|
142
|
+
assert "UDS_PY=" in script and "command -v uds" in script # interpreter first, PATH fallback
|
|
143
|
+
main(["hooks", "uninstall", str(repo), "--apply"])
|
|
144
|
+
assert main(["hooks", "install", str(repo), "--apply", "--path-only"]) == 0
|
|
145
|
+
assert "UDS_PY=" not in (repo / ".git" / "hooks" / "pre-commit").read_text(encoding="utf-8")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/policies/GLOBAL_SECURITY_POLICY.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/__main__.py
RENAMED
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/cli.py
RENAMED
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/config.py
RENAMED
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/detector.py
RENAMED
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/engine.py
RENAMED
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/findings.py
RENAMED
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/fixes.py
RENAMED
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/gitguard.py
RENAMED
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/history.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/policy.py
RENAMED
|
File without changes
|
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/recovery.py
RENAMED
|
File without changes
|
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/reports.py
RENAMED
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanner.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/testing.py
RENAMED
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/updates.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/fixtures/osv-scanner-2.7.1.json
RENAMED
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/fixtures/trivy-0.76.2.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_scanner_fixtures.py
RENAMED
|
File without changes
|