devguard 0.2.0__py3-none-any.whl

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 (60) hide show
  1. devguard/INTEGRATION_SUMMARY.md +121 -0
  2. devguard/__init__.py +3 -0
  3. devguard/__main__.py +6 -0
  4. devguard/checkers/__init__.py +41 -0
  5. devguard/checkers/api_usage.py +523 -0
  6. devguard/checkers/aws_cost.py +331 -0
  7. devguard/checkers/aws_iam.py +284 -0
  8. devguard/checkers/base.py +25 -0
  9. devguard/checkers/container.py +137 -0
  10. devguard/checkers/domain.py +189 -0
  11. devguard/checkers/firecrawl.py +117 -0
  12. devguard/checkers/fly.py +225 -0
  13. devguard/checkers/github.py +210 -0
  14. devguard/checkers/npm.py +327 -0
  15. devguard/checkers/npm_security.py +244 -0
  16. devguard/checkers/redteam.py +290 -0
  17. devguard/checkers/secret.py +279 -0
  18. devguard/checkers/swarm.py +376 -0
  19. devguard/checkers/tailscale.py +143 -0
  20. devguard/checkers/tailsnitch.py +303 -0
  21. devguard/checkers/tavily.py +179 -0
  22. devguard/checkers/vercel.py +192 -0
  23. devguard/cli.py +1510 -0
  24. devguard/cli_helpers.py +189 -0
  25. devguard/config.py +249 -0
  26. devguard/core.py +293 -0
  27. devguard/dashboard.py +715 -0
  28. devguard/discovery.py +363 -0
  29. devguard/http_client.py +142 -0
  30. devguard/llm_service.py +481 -0
  31. devguard/mcp_server.py +259 -0
  32. devguard/metrics.py +144 -0
  33. devguard/models.py +208 -0
  34. devguard/reporting.py +1571 -0
  35. devguard/sarif.py +295 -0
  36. devguard/scripts/ANALYSIS_SUMMARY.md +141 -0
  37. devguard/scripts/README.md +221 -0
  38. devguard/scripts/auto_fix_recommendations.py +145 -0
  39. devguard/scripts/generate_npmignore.py +175 -0
  40. devguard/scripts/generate_security_report.py +324 -0
  41. devguard/scripts/prepublish_check.sh +29 -0
  42. devguard/scripts/redteam_npm_packages.py +1262 -0
  43. devguard/scripts/review_all_repos.py +300 -0
  44. devguard/spec.py +617 -0
  45. devguard/sweeps/__init__.py +23 -0
  46. devguard/sweeps/ai_editor_config_audit.py +697 -0
  47. devguard/sweeps/cargo_publish_audit.py +655 -0
  48. devguard/sweeps/dependency_audit.py +419 -0
  49. devguard/sweeps/gitignore_audit.py +336 -0
  50. devguard/sweeps/local_dev.py +260 -0
  51. devguard/sweeps/local_dirty_worktree_secrets.py +521 -0
  52. devguard/sweeps/project_flaudit.py +636 -0
  53. devguard/sweeps/public_github_secrets.py +680 -0
  54. devguard/sweeps/publish_audit.py +478 -0
  55. devguard/sweeps/ssh_key_audit.py +327 -0
  56. devguard/utils.py +174 -0
  57. devguard-0.2.0.dist-info/METADATA +225 -0
  58. devguard-0.2.0.dist-info/RECORD +60 -0
  59. devguard-0.2.0.dist-info/WHEEL +4 -0
  60. devguard-0.2.0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,225 @@
1
+ Metadata-Version: 2.4
2
+ Name: devguard
3
+ Version: 0.2.0
4
+ Summary: Developer workstation security and hygiene sweeps -- secrets, deps, gitignore, SSH keys, AI editor configs, cargo publish CI, and more
5
+ Project-URL: Homepage, https://github.com/arclabs561/devguard
6
+ Project-URL: Repository, https://github.com/arclabs561/devguard
7
+ Project-URL: Issues, https://github.com/arclabs561/devguard/issues
8
+ Author: arclabs561
9
+ License-Expression: MIT
10
+ Keywords: dependency-audit,developer-tools,devops,secret-scanning,security
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Security
20
+ Classifier: Topic :: Software Development :: Quality Assurance
21
+ Requires-Python: >=3.11
22
+ Requires-Dist: httpx>=0.27.0
23
+ Requires-Dist: pydantic-settings>=2.5.0
24
+ Requires-Dist: pydantic>=2.9.0
25
+ Requires-Dist: python-dotenv>=1.0.0
26
+ Requires-Dist: pyyaml>=6.0.0
27
+ Requires-Dist: rich>=13.7.0
28
+ Requires-Dist: typer>=0.12.0
29
+ Provides-Extra: all
30
+ Requires-Dist: aiosmtplib>=3.0.0; extra == 'all'
31
+ Requires-Dist: fastapi>=0.109.0; extra == 'all'
32
+ Requires-Dist: mcp>=0.1.0; extra == 'all'
33
+ Requires-Dist: openai>=1.0.0; extra == 'all'
34
+ Requires-Dist: prometheus-client>=0.20.0; extra == 'all'
35
+ Requires-Dist: pygithub>=2.2.0; extra == 'all'
36
+ Requires-Dist: slowapi>=0.1.9; extra == 'all'
37
+ Requires-Dist: uvicorn>=0.27.0; extra == 'all'
38
+ Provides-Extra: dev
39
+ Requires-Dist: hypothesis>=6.0.0; extra == 'dev'
40
+ Requires-Dist: mypy>=1.11.0; extra == 'dev'
41
+ Requires-Dist: pytest-asyncio>=0.24.0; extra == 'dev'
42
+ Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
43
+ Requires-Dist: pytest>=8.3.0; extra == 'dev'
44
+ Requires-Dist: ruff>=0.6.0; extra == 'dev'
45
+ Provides-Extra: flaudit
46
+ Requires-Dist: openai>=1.0.0; extra == 'flaudit'
47
+ Provides-Extra: monitoring
48
+ Requires-Dist: aiosmtplib>=3.0.0; extra == 'monitoring'
49
+ Requires-Dist: fastapi>=0.109.0; extra == 'monitoring'
50
+ Requires-Dist: mcp>=0.1.0; extra == 'monitoring'
51
+ Requires-Dist: prometheus-client>=0.20.0; extra == 'monitoring'
52
+ Requires-Dist: pygithub>=2.2.0; extra == 'monitoring'
53
+ Requires-Dist: slowapi>=0.1.9; extra == 'monitoring'
54
+ Requires-Dist: uvicorn>=0.27.0; extra == 'monitoring'
55
+ Description-Content-Type: text/markdown
56
+
57
+ # devguard
58
+
59
+ devguard scans your developer workspace for security and hygiene issues. It runs a set of sweeps -- automated checks across local repos, SSH keys, dependencies, and more -- and reports findings in one pass.
60
+
61
+ ```
62
+ $ devguard sweep
63
+ local_dev: 142 repos scanned, 0 findings
64
+ public_github_secrets: 18 repos scanned, 0 findings
65
+ local_dirty_worktree_secrets: 47 repos scanned, 0 findings
66
+ gitignore_audit: 3 repos with gaps (1 public)
67
+ dependency_audit: 12 vulns across 5 repos (2 critical)
68
+ ssh_key_audit: 1 weak key, 2 stale GitHub keys
69
+ ai_editor_config_audit: 47 repos checked, 2 errors
70
+ ```
71
+
72
+ ## Quick start
73
+
74
+ ```bash
75
+ pip install -e . # or: uv pip install -e .
76
+ devguard doctor # check prerequisites (trufflehog, cargo-audit, etc.)
77
+ devguard sweep # run all enabled sweeps
78
+ ```
79
+
80
+ No spec file is required. Without one, devguard uses built-in defaults. Create `devguard.spec.yaml` to customize which sweeps run and their parameters.
81
+
82
+ ## Sweeps
83
+
84
+ ### Security
85
+
86
+ | Sweep | Description |
87
+ |-------|-------------|
88
+ | `public_github_secrets` | Scan public GitHub repos for committed secrets (TruffleHog). |
89
+ | `dependency_audit` | Check repos for known vulnerabilities in dependencies (npm audit, pip-audit, cargo-audit). |
90
+ | `ssh_key_audit` | Audit local SSH keys for weak algorithms, short key lengths, and stale GitHub deploy keys. |
91
+ | `local_dirty_worktree_secrets` | Scan uncommitted changes in local repos for secrets before they reach a commit. |
92
+
93
+ ### Hygiene
94
+
95
+ | Sweep | Description |
96
+ |-------|-------------|
97
+ | `gitignore_audit` | Find repos missing `.gitignore` or lacking expected ignore patterns for their language. |
98
+ | `ai_editor_config_audit` | Check AI editor configs (Cursor rules, Claude settings) for consistency across repos. |
99
+ | `cargo_publish_audit` | Verify Rust crates have publish CI, correct metadata, and no publish blockers. |
100
+
101
+ ### Analysis
102
+
103
+ | Sweep | Description |
104
+ |-------|-------------|
105
+ | `project_flaudit` | LLM-driven audit (OpenRouter/Gemini): README drift, test gaps, rule violations. |
106
+
107
+ ### Workspace
108
+
109
+ | Sweep | Description |
110
+ |-------|-------------|
111
+ | `local_dev` | Scan local repos for accidentally committed large files, binaries, and dev artifacts. |
112
+
113
+ ## Configuration
114
+
115
+ Copy `devguard.spec.example.yaml` to `devguard.spec.yaml` and edit to taste. The spec file controls which sweeps are enabled, their parameters, and output paths.
116
+
117
+ Most sweeps work with zero configuration. Sweeps that need external access:
118
+
119
+ - `public_github_secrets`: requires `GITHUB_TOKEN` (for GitHub API).
120
+ - `project_flaudit`: requires `OPENROUTER_API_KEY`.
121
+ - `ssh_key_audit` with `check_github: true`: requires `GITHUB_TOKEN`.
122
+ - `dependency_audit`: requires audit tools installed (`npm`, `pip-audit`, `cargo-audit`).
123
+
124
+ Environment variables can be set in `.env` or exported in your shell.
125
+
126
+ ## Pre-commit hooks
127
+
128
+ devguard ships `.pre-commit-hooks.yaml` with three hooks: `devguard-gitignore`, `devguard-ai-config`, and `devguard-secrets`. Add to your `.pre-commit-config.yaml`:
129
+
130
+ ```yaml
131
+ - repo: https://github.com/yourorg/devguard
132
+ rev: main
133
+ hooks:
134
+ - id: devguard-gitignore
135
+ - id: devguard-secrets
136
+ ```
137
+
138
+ ## Library usage
139
+
140
+ Sweep modules can be imported directly for scripting or integration:
141
+
142
+ ```python
143
+ from devguard.sweeps.ssh_key_audit import audit_ssh_keys
144
+ from devguard.sweeps.dependency_audit import audit_dependencies
145
+ ```
146
+
147
+ ## Development
148
+
149
+ ```bash
150
+ uv pip install -e ".[dev]"
151
+ pytest
152
+ ruff check .
153
+ mypy devguard/
154
+ ```
155
+
156
+ ## License
157
+
158
+ MIT
159
+
160
+ <details>
161
+ <summary>Legacy: Service monitoring (npm, Vercel, Fly.io, GitHub)</summary>
162
+
163
+ devguard originally provided unified monitoring for npm packages, GitHub repositories, and Fly.io/Vercel deployments. This functionality still exists but is secondary to the sweep system.
164
+
165
+ ### Monitored services
166
+
167
+ - **npm packages** for security vulnerabilities
168
+ - **GitHub repositories** for Dependabot security alerts
169
+ - **Fly.io deployments** for health status
170
+ - **Vercel deployments** for deployment status
171
+ - **Container/Dockerfile** security best practices
172
+ - **Secret scanning** (TruffleHog or regex fallback)
173
+ - **AWS IAM** security posture for satellite nodes
174
+ - **AWS Cost** monitoring with budget alerts
175
+ - **API usage/credits** for LLM providers (OpenRouter, Anthropic, OpenAI, Perplexity, Groq)
176
+ - **Firecrawl API** credit usage
177
+ - **Tavily API** usage tracking
178
+ - **Tailscale** mesh network health
179
+ - **Domain/SSL** certificate expiry
180
+ - **Docker Swarm** cluster health
181
+ - **Red team security testing** for deployment endpoints
182
+ - **Web dashboard** for real-time monitoring
183
+ - **MCP server** for AI agent integration
184
+
185
+ ### Legacy commands
186
+
187
+ ```bash
188
+ devguard check # run monitoring checks
189
+ devguard check --watch # continuous monitoring
190
+ devguard mcp # start MCP server
191
+ devguard dashboard # start web dashboard
192
+ devguard discover # auto-discover resources to monitor
193
+ devguard config # show current configuration
194
+ devguard auth gh # authenticate with GitHub
195
+ devguard auth-status # show auth status for all services
196
+ ```
197
+
198
+ ### Legacy configuration
199
+
200
+ Set environment variables in `.env`:
201
+
202
+ ```bash
203
+ GITHUB_TOKEN=your_github_token
204
+ VERCEL_TOKEN=your_vercel_token
205
+ FLY_API_TOKEN=your_fly_token
206
+ SNYK_TOKEN=your_snyk_token
207
+ GITHUB_ORG=your_org_name
208
+ NPM_PACKAGES_TO_MONITOR=package1,package2
209
+ GITHUB_REPOS_TO_MONITOR=owner/repo1,owner/repo2
210
+ FLY_APPS_TO_MONITOR=app1,app2
211
+ VERCEL_PROJECTS_TO_MONITOR=project1,project2
212
+ DASHBOARD_ENABLED=false
213
+ DASHBOARD_HOST=0.0.0.0
214
+ DASHBOARD_PORT=8080
215
+ DASHBOARD_API_KEY=your_secure_key
216
+ ```
217
+
218
+ ### Architecture (legacy)
219
+
220
+ - **Guardian**: Main orchestrator managing checkers and reports
221
+ - **BaseChecker**: Abstract base class for all checkers
222
+ - **Reporter**: Output formatting, webhooks, email delivery
223
+ - **Checkers**: NpmChecker, GitHubChecker, VercelChecker, FlyChecker, ContainerChecker, SecretChecker, AWSIAMChecker, RedTeamChecker
224
+
225
+ </details>
@@ -0,0 +1,60 @@
1
+ devguard/INTEGRATION_SUMMARY.md,sha256=tdDJKgo9ZpNeTqjRhxkCXCsz2jOfFwrM-HIQva-YN58,3286
2
+ devguard/__init__.py,sha256=hs6HgdGWWxwTbt-YVV_OqXJx1eS6HBogaR3GoP_fX_Y,98
3
+ devguard/__main__.py,sha256=v8JUiCNb3h74x6aSOxoubVnHWFCY0nllGw8CGE99SoQ,122
4
+ devguard/cli.py,sha256=j1XCKsXd515uD1fCuHvAiD01PEki76Bk_XaK1ZtCW_k,58238
5
+ devguard/cli_helpers.py,sha256=MTanW0D0rCJzDq2W277-5unYOsObxGif_Gz8_CehJfQ,6029
6
+ devguard/config.py,sha256=-sYh0pT1V2a09w2XQSRlYJRkOOdDiYMKQ16YdPMFu58,10356
7
+ devguard/core.py,sha256=96GcxpbCYpIJ6zTg10vyN2DjJmdKlBHyg9SJqv1ADCE,11356
8
+ devguard/dashboard.py,sha256=qSi7jfUxqCFFXNjUCE6dvaqtWBX2GS3ig9OdbBDL6RQ,25639
9
+ devguard/discovery.py,sha256=SwtHy58J35eo8EB31MtGAJuAKez-3IUPpFR-DgpgxbI,11991
10
+ devguard/http_client.py,sha256=juHLA907aUIjuWcF02CPjfeuZm9LIK4-CLn4lBMkeCI,4477
11
+ devguard/llm_service.py,sha256=yxIIJmQ66aIgE3g3TRZUoL42X8zzJDTvVRaGPVN4xWA,21224
12
+ devguard/mcp_server.py,sha256=JBbYvGU43veT6ExsInepW_kbif7K5o1u56Orydz6YbY,8913
13
+ devguard/metrics.py,sha256=xirsL65IQscw0z54kkRNaFhp4oQPqbodBKqJyfpZhhc,4247
14
+ devguard/models.py,sha256=ujbrhqRWJsv399NkCdy5CpVMdi1uUcVENGaE9_XsIlA,7493
15
+ devguard/reporting.py,sha256=9L6nb_GNUm3cFOEwtjbcyVPGOILwOlagSEPZEUi03DA,63249
16
+ devguard/sarif.py,sha256=rrL1OEXL3P6ZStdvibBGHyKZxhE9ABYX0dfUnpnfXyM,9588
17
+ devguard/spec.py,sha256=6MICRdZPmUjKwj3lroW2AZib05yq7h781jn9Y665PXA,23648
18
+ devguard/utils.py,sha256=pOl_gtYwmaf9QSlTuecWNEyM7EW6dXq8o1_tBvdP9Yo,4541
19
+ devguard/checkers/__init__.py,sha256=ZZzpwxcJKf-o4Le8B4IzxOnwq5XqeyXDIxMMjYqnbl0,1392
20
+ devguard/checkers/api_usage.py,sha256=CE_u449o9_10K4fpt3Q4OFTqqHjmEvtt8nFV5XFOORk,21749
21
+ devguard/checkers/aws_cost.py,sha256=lmsVgNrRANTibh7L0s8f_jHus3lFQSHjhWdzyvvofps,13005
22
+ devguard/checkers/aws_iam.py,sha256=IF9Zd3tzVdWPgv0QkHXKjpd0y6-inZEGZcH6KkH9_Cs,10410
23
+ devguard/checkers/base.py,sha256=B7ickLBylEE5gjP4bHZ7JHQLlEfmcb0EcCyei8bg3OU,607
24
+ devguard/checkers/container.py,sha256=XAgH9-HOP-0KcZVTy_iBtV8rEZcgHTv_mh5A-knY2WU,4932
25
+ devguard/checkers/domain.py,sha256=FarQRuSzfry3gbtaisWaT1Hw_PsAZZye9ikG7Ujowyc,7819
26
+ devguard/checkers/firecrawl.py,sha256=7GUCtIZ0wgteHAoIljt-dEuTjAuq-gaOfDZ1BQn4_uQ,4191
27
+ devguard/checkers/fly.py,sha256=vhD3HefnmVgppEoXfunsTJbyEvoZifkX01N0MkomznU,8633
28
+ devguard/checkers/github.py,sha256=b0XGduRn1KxmsYNqVS0l4bWlBEdFzhmvQ8ebAZnH9-A,7983
29
+ devguard/checkers/npm.py,sha256=HC_UnZ3RzTnbfQO6dFw-lEk6DwZhupBhNQB9sms5rBg,14640
30
+ devguard/checkers/npm_security.py,sha256=mRvfe3anEtVU9LGlMzoOaBET1rZ9m5HH5u6ev_zg368,9522
31
+ devguard/checkers/redteam.py,sha256=hhP8XW-oYjFkFWPLemsRU78_zdehRCt5Fpg-9yaEWgo,10595
32
+ devguard/checkers/secret.py,sha256=jPwqzDIYwcxZ1bq5o0oiHIqIrZd9ikTutaiYEy8jntI,10940
33
+ devguard/checkers/swarm.py,sha256=wwN0Mfm-srm2csJnhnoZuP14HrBWemqlLQDKJVXmVhs,15691
34
+ devguard/checkers/tailscale.py,sha256=IVY0uOnBptO6mxj6SUEpSpgPX4EXbuF6a_z9rOPVEOk,5398
35
+ devguard/checkers/tailsnitch.py,sha256=OFrIflicVGGjL2X-rSSr00XWaS5PjhG_gYpgyKcvhWM,12242
36
+ devguard/checkers/tavily.py,sha256=pT0VpQh5hszq0MD1Nf5K6W4uX_9AKkr-eYpd4TkTdPU,6910
37
+ devguard/checkers/vercel.py,sha256=s0SCmYeX5Zu-4wNFIc32glgA5JD8WSns8jVaSw5UX-Y,7244
38
+ devguard/scripts/ANALYSIS_SUMMARY.md,sha256=l7BdMOWdYrYoC8BDpDdTbATzOqKhuCY8nDoba7TB9QQ,3718
39
+ devguard/scripts/README.md,sha256=O8pPBElyWeJEUejpn8ZW04qKiZ3O08CvCfEjKzjsRuc,4967
40
+ devguard/scripts/auto_fix_recommendations.py,sha256=7ZXjT2GuB1O-DlVcIUoZriTMFozlFKG6EWRJ6dJLWg4,4876
41
+ devguard/scripts/generate_npmignore.py,sha256=vJBLgW-vl57k1OLINy87C0BKA63ZfV-qOj2ZmL3jays,4752
42
+ devguard/scripts/generate_security_report.py,sha256=H7JmcozQzvZ5dcj0n4qGpzqMiz_XYQtLgoXzVO831Ug,10808
43
+ devguard/scripts/prepublish_check.sh,sha256=0oxrp1DFitHuaVPLG4J7zFfq3eVUR5Zo4H12HOysmiM,786
44
+ devguard/scripts/redteam_npm_packages.py,sha256=-SjJkAbvh8yONv0QZ4ULd0u7sTe-TJLy5EF_VjH-40I,49228
45
+ devguard/scripts/review_all_repos.py,sha256=EEBC8AMjwkDPtg-Cu_ByndhdJU833MOtvu4sVTch3gM,11711
46
+ devguard/sweeps/__init__.py,sha256=rTxr2v31gMUplFAMq_Cp9WkprCnQwf8CNACqDgnv-s8,550
47
+ devguard/sweeps/ai_editor_config_audit.py,sha256=dBlDKsDd9gfwv9tNwJ-TuCURg74fKOQK15q0O-4p17c,26005
48
+ devguard/sweeps/cargo_publish_audit.py,sha256=cObKPld8oWZp2Gh87fcbbQQUbcKiPisQz0e0rP3y3OE,24244
49
+ devguard/sweeps/dependency_audit.py,sha256=al3uuK71HtWB6Wn37CiyV55mCFG6yvZm3w2Y4IQtc_s,14472
50
+ devguard/sweeps/gitignore_audit.py,sha256=ZNL7FLont_DOBQh1NG4w0S4RQJnCsLcuGxT2PsBQ6CE,11803
51
+ devguard/sweeps/local_dev.py,sha256=1S4-k7wWgLdJ2LPdzqxQW3jXtoEYVOyRnt_ow-C96PM,7784
52
+ devguard/sweeps/local_dirty_worktree_secrets.py,sha256=VT2GGOGlYkYCmhgBG072L_8gPgwDUTQiAmqFxRMuuHo,18097
53
+ devguard/sweeps/project_flaudit.py,sha256=EcjO-HMv0zabTig2AcMjvS414WlbMgeKU1vpxq-uOLI,22689
54
+ devguard/sweeps/public_github_secrets.py,sha256=rZEhrJ4ddUF6h8mzuPuYI7FaZshQ1u2F6JO2RavS3gg,24667
55
+ devguard/sweeps/publish_audit.py,sha256=IMV9oqAi6R0oLbJwfWsmc7uRoSC9x_Z54QsKqrl0p10,15557
56
+ devguard/sweeps/ssh_key_audit.py,sha256=-AH-mnZLquKaoNEwpGGYwW0qxQqBgPEWcdbW561SL7Q,11637
57
+ devguard-0.2.0.dist-info/METADATA,sha256=8ZHsUfGyL_eRBXAululOucZLOCHb6ym31lqzcG9iDXI,8400
58
+ devguard-0.2.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
59
+ devguard-0.2.0.dist-info/entry_points.txt,sha256=hRoADmIFOCpsRDQ6cZyyFI9x6Y8BiU_TkZH6f5hNmHA,47
60
+ devguard-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ devguard = devguard.cli:main