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.
Files changed (79) hide show
  1. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/CHANGELOG.md +13 -0
  2. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/DEVELOPMENT_STATUS.md +6 -5
  3. {universal_dev_security-1.0.0/src/universal_dev_security.egg-info → universal_dev_security-1.0.1}/PKG-INFO +30 -24
  4. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/README.md +29 -23
  5. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/commands.md +1 -1
  6. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/dashboard-design-system.md +1 -1
  7. universal_dev_security-1.0.1/docs/getting-started.md +176 -0
  8. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/installation.md +17 -4
  9. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/integrations.md +2 -2
  10. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/release.md +14 -0
  11. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/scanners.md +1 -1
  12. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/scripts/install.ps1 +1 -1
  13. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/scripts/install.sh +2 -2
  14. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/__init__.py +1 -1
  15. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/cli_extra.py +8 -3
  16. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1/src/universal_dev_security.egg-info}/PKG-INFO +30 -24
  17. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security.egg-info/SOURCES.txt +1 -0
  18. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_gitguard.py +12 -0
  19. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/CODE_OF_CONDUCT.md +0 -0
  20. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/CONTRIBUTING.md +0 -0
  21. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/LICENSE +0 -0
  22. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/MANIFEST.in +0 -0
  23. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/SECURITY.md +0 -0
  24. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/architecture.md +0 -0
  25. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/docs/security-model.md +0 -0
  26. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/policies/GLOBAL_SECURITY_POLICY.md +0 -0
  27. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/pyproject.toml +0 -0
  28. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/scripts/release.py +0 -0
  29. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/setup.cfg +0 -0
  30. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/__main__.py +0 -0
  31. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/cli.py +0 -0
  32. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/config.py +0 -0
  33. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/detector.py +0 -0
  34. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/engine.py +0 -0
  35. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/findings.py +0 -0
  36. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/fixes.py +0 -0
  37. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/gitguard.py +0 -0
  38. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/history.py +0 -0
  39. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/initializer.py +0 -0
  40. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/integrations/__init__.py +0 -0
  41. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/integrations/agents.py +0 -0
  42. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/integrations/claude_code.py +0 -0
  43. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/integrations/github.py +0 -0
  44. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/integrations/vscode.py +0 -0
  45. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/policy.py +0 -0
  46. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/projectfiles.py +0 -0
  47. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/recovery.py +0 -0
  48. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/redaction.py +0 -0
  49. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/reports.py +0 -0
  50. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanner.py +0 -0
  51. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/__init__.py +0 -0
  52. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/base.py +0 -0
  53. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/gitleaks.py +0 -0
  54. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/osv.py +0 -0
  55. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/semgrep.py +0 -0
  56. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/scanners/trivy.py +0 -0
  57. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/testing.py +0 -0
  58. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security/updates.py +0 -0
  59. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security.egg-info/dependency_links.txt +0 -0
  60. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security.egg-info/entry_points.txt +0 -0
  61. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security.egg-info/requires.txt +0 -0
  62. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/src/universal_dev_security.egg-info/top_level.txt +0 -0
  63. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/fakes.py +0 -0
  64. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/fixtures/osv-scanner-2.7.1.json +0 -0
  65. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/fixtures/trivy-0.76.2.json +0 -0
  66. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_cli.py +0 -0
  67. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_config.py +0 -0
  68. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_detector.py +0 -0
  69. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_exposure.py +0 -0
  70. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_history.py +0 -0
  71. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_initializer.py +0 -0
  72. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_integrations.py +0 -0
  73. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_policy.py +0 -0
  74. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_recovery_fixes.py +0 -0
  75. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_redaction.py +0 -0
  76. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_redos.py +0 -0
  77. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_reports.py +0 -0
  78. {universal_dev_security-1.0.0 → universal_dev_security-1.0.1}/tests/test_scanner.py +0 -0
  79. {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.0` — first stable release (tag `v1.0.0`). Previous: `1.0.0rc1` GitHub pre-release.
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. `uds update check --source pypi` will only be meaningful once UDS is published under that name;
71
- until then use `--source github:OWNER/REPO`.
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 the `v1.0.0` GitHub release (tag pushed; assets uploaded by the maintainer).
76
- - PyPI publication (not done).
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.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.0` — first stable release. See
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
- Requirements: Python 3.11+, Windows, Linux or macOS. Git is recommended.
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
- ```powershell
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
- # Linux / macOS
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
- Then, inside a project:
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
- - [Installation and upgrades](docs/installation.md)
101
- - [Commands](docs/commands.md)
102
- - [Scanners, severity and privacy](docs/scanners.md)
103
- - [Integrations: Claude Code, GitHub, VS Code, other agents](docs/integrations.md)
104
- - [Architecture](docs/architecture.md)
105
- - [Security model](docs/security-model.md) and [global policy](policies/GLOBAL_SECURITY_POLICY.md)
106
- - [Dashboard design system](docs/dashboard-design-system.md)
107
- - [Release process](docs/release.md)
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.0` — first stable release. See
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
- Requirements: Python 3.11+, Windows, Linux or macOS. Git is recommended.
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
- ```powershell
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
- # Linux / macOS
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
- Then, inside a project:
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
- - [Installation and upgrades](docs/installation.md)
69
- - [Commands](docs/commands.md)
70
- - [Scanners, severity and privacy](docs/scanners.md)
71
- - [Integrations: Claude Code, GitHub, VS Code, other agents](docs/integrations.md)
72
- - [Architecture](docs/architecture.md)
73
- - [Security model](docs/security-model.md) and [global policy](policies/GLOBAL_SECURITY_POLICY.md)
74
- - [Dashboard design system](docs/dashboard-design-system.md)
75
- - [Release process](docs/release.md)
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] [--python-path]` | Install `pre-commit` and `pre-push` hooks |
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) |
@@ -1,6 +1,6 @@
1
1
  # UDS Dashboard Design System
2
2
 
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
 
5
5
  ## Product surfaces
6
6
 
@@ -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.0\universal_dev_security-1.0.0-py3-none-any.whl
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.0/universal_dev_security-1.0.0-py3-none-any.whl
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` (or `--source pypi` once published). This is the
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 (once published): `python -m pip install --upgrade universal-dev-security`.
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 --python-path # embed this interpreter (works without uds on PATH)
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 | Fixtures only (see DEVELOPMENT_STATUS) | Source code present | Downloads registry rule packs; UDS forces `--metrics=off`; source is not uploaded |
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.0\universal_dev_security-1.0.0-py3-none-any.whl
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.0/universal_dev_security-1.0.0-py3-none-any.whl
8
- # sh scripts/install.sh --spec universal-dev-security==1.0.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=""
@@ -1,3 +1,3 @@
1
1
  """Universal Dev Security (UDS) — one security system for every project."""
2
2
 
3
- __version__ = "1.0.0"
3
+ __version__ = "1.0.1"
@@ -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
- hp.add_argument("--python-path", action="store_true",
199
- help="Embed this Python interpreter in the hook instead of relying on `uds` on PATH")
200
- hp.set_defaults(func=cmd_hooks)
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.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.0` — first stable release. See
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
- Requirements: Python 3.11+, Windows, Linux or macOS. Git is recommended.
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
- ```powershell
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
- # Linux / macOS
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
- Then, inside a project:
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
- - [Installation and upgrades](docs/installation.md)
101
- - [Commands](docs/commands.md)
102
- - [Scanners, severity and privacy](docs/scanners.md)
103
- - [Integrations: Claude Code, GitHub, VS Code, other agents](docs/integrations.md)
104
- - [Architecture](docs/architecture.md)
105
- - [Security model](docs/security-model.md) and [global policy](policies/GLOBAL_SECURITY_POLICY.md)
106
- - [Dashboard design system](docs/dashboard-design-system.md)
107
- - [Release process](docs/release.md)
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).
@@ -10,6 +10,7 @@ pyproject.toml
10
10
  docs/architecture.md
11
11
  docs/commands.md
12
12
  docs/dashboard-design-system.md
13
+ docs/getting-started.md
13
14
  docs/installation.md
14
15
  docs/integrations.md
15
16
  docs/release.md
@@ -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")