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
devguard/sarif.py ADDED
@@ -0,0 +1,295 @@
1
+ """Convert devguard sweep reports to SARIF 2.1.0 format."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ SARIF_SCHEMA = (
8
+ "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/"
9
+ "sarif-2.1/schema/sarif-schema-2.1.0.json"
10
+ )
11
+
12
+ # Map severity strings used across sweeps to SARIF levels.
13
+ _SEVERITY_TO_LEVEL: dict[str, str] = {
14
+ "error": "error",
15
+ "critical": "error",
16
+ "high": "error",
17
+ "warning": "warning",
18
+ "medium": "warning",
19
+ "info": "note",
20
+ "note": "note",
21
+ "low": "note",
22
+ }
23
+
24
+
25
+ def _sarif_level(severity: str) -> str:
26
+ return _SEVERITY_TO_LEVEL.get(severity.lower(), "warning")
27
+
28
+
29
+ # ---------------------------------------------------------------------------
30
+ # Per-sweep extractors
31
+ # ---------------------------------------------------------------------------
32
+ # Each returns a list of (rule_id, level, message, uri | None) tuples.
33
+
34
+
35
+ def _extract_ai_editor_config(report: dict) -> list[tuple[str, str, str, str | None]]:
36
+ results: list[tuple[str, str, str, str | None]] = []
37
+ for repo in report.get("repos", []):
38
+ repo_path = repo.get("repo_path") or repo.get("repo_name")
39
+ for f in repo.get("findings", []):
40
+ results.append(
41
+ (
42
+ f.get("check", "unknown"),
43
+ _sarif_level(f.get("severity", "warning")),
44
+ f.get("message", ""),
45
+ repo_path,
46
+ )
47
+ )
48
+ return results
49
+
50
+
51
+ def _extract_cargo_publish(report: dict) -> list[tuple[str, str, str, str | None]]:
52
+ # Same shape as ai_editor_config: repos[].findings[].{check, severity, message}
53
+ return _extract_ai_editor_config(report)
54
+
55
+
56
+ def _extract_gitignore_audit(report: dict) -> list[tuple[str, str, str, str | None]]:
57
+ results: list[tuple[str, str, str, str | None]] = []
58
+ for repo in report.get("repos", []):
59
+ repo_path = repo.get("repo_path")
60
+ is_public = repo.get("is_public", False)
61
+ level = "error" if is_public else "warning"
62
+ if not repo.get("has_gitignore"):
63
+ results.append(
64
+ (
65
+ "missing_gitignore",
66
+ level,
67
+ "Repository has no .gitignore file",
68
+ repo_path,
69
+ )
70
+ )
71
+ for pattern in repo.get("missing_patterns", []):
72
+ results.append(
73
+ (
74
+ "missing_gitignore_pattern",
75
+ level,
76
+ f"Missing gitignore pattern: {pattern}",
77
+ repo_path,
78
+ )
79
+ )
80
+ for warn in repo.get("case_warnings", []):
81
+ results.append(
82
+ (
83
+ "gitignore_case_warning",
84
+ "note",
85
+ warn if isinstance(warn, str) else str(warn),
86
+ repo_path,
87
+ )
88
+ )
89
+ return results
90
+
91
+
92
+ def _extract_dependency_audit(report: dict) -> list[tuple[str, str, str, str | None]]:
93
+ results: list[tuple[str, str, str, str | None]] = []
94
+ for repo in report.get("repos", []):
95
+ repo_path = repo.get("repo_path")
96
+ for v in repo.get("vulns", []):
97
+ sev = v.get("severity", "unknown")
98
+ pkg = v.get("package", "?")
99
+ title = v.get("title", "")
100
+ vid = v.get("id", "unknown")
101
+ msg = f"{vid}: {pkg} - {title}" if title else f"{vid}: {pkg}"
102
+ results.append(
103
+ (
104
+ f"dependency_vuln_{sev}",
105
+ _sarif_level(sev),
106
+ msg,
107
+ repo_path,
108
+ )
109
+ )
110
+ return results
111
+
112
+
113
+ def _extract_ssh_key_audit(report: dict) -> list[tuple[str, str, str, str | None]]:
114
+ results: list[tuple[str, str, str, str | None]] = []
115
+ for key in report.get("keys", []):
116
+ key_file = key.get("file")
117
+ for issue in key.get("issues", []):
118
+ results.append(
119
+ (
120
+ "ssh_key_issue",
121
+ "warning",
122
+ issue,
123
+ key_file,
124
+ )
125
+ )
126
+ return results
127
+
128
+
129
+ def _extract_public_github_secrets(report: dict) -> list[tuple[str, str, str, str | None]]:
130
+ results: list[tuple[str, str, str, str | None]] = []
131
+ for f in report.get("findings", []):
132
+ detector = f.get("type", "unknown")
133
+ repo = f.get("repo", "")
134
+ file_path = f.get("file")
135
+ verified = f.get("verified")
136
+ level = "error" if verified else "warning"
137
+ msg = f"Secret detected: {detector} in {repo}"
138
+ if file_path:
139
+ msg += f" ({file_path})"
140
+ uri = file_path if file_path else repo
141
+ results.append(
142
+ (
143
+ f"secret_{detector}",
144
+ level,
145
+ msg,
146
+ uri,
147
+ )
148
+ )
149
+ return results
150
+
151
+
152
+ def _extract_local_dirty_worktree_secrets(report: dict) -> list[tuple[str, str, str, str | None]]:
153
+ # Same top-level findings[] shape as public_github_secrets
154
+ return _extract_public_github_secrets(report)
155
+
156
+
157
+ def _extract_local_dev(report: dict) -> list[tuple[str, str, str, str | None]]:
158
+ results: list[tuple[str, str, str, str | None]] = []
159
+ for hit in report.get("hits", []):
160
+ reason = hit.get("reason", "flagged file")
161
+ file_path = hit.get("file_path")
162
+ repo_path = hit.get("repo_path")
163
+ uri = file_path or repo_path
164
+ results.append(
165
+ (
166
+ "local_dev_hit",
167
+ "warning",
168
+ reason,
169
+ uri,
170
+ )
171
+ )
172
+ return results
173
+
174
+
175
+ def _extract_project_flaudit(report: dict) -> list[tuple[str, str, str, str | None]]:
176
+ results: list[tuple[str, str, str, str | None]] = []
177
+ for repo in report.get("repos", report.get("results", [])):
178
+ repo_path = repo.get("repo_path") or repo.get("repo_name", "")
179
+ for f in repo.get("findings", []):
180
+ # project_flaudit findings may have check/severity/message or
181
+ # category/severity/description
182
+ check = f.get("check") or f.get("category", "unknown")
183
+ sev = f.get("severity", "warning")
184
+ msg = f.get("message") or f.get("description", "")
185
+ results.append(
186
+ (
187
+ check,
188
+ _sarif_level(sev),
189
+ msg,
190
+ repo_path,
191
+ )
192
+ )
193
+ return results
194
+
195
+
196
+ _EXTRACTORS: dict[str, Any] = {
197
+ "ai_editor_config_audit": _extract_ai_editor_config,
198
+ "cargo_publish_audit": _extract_cargo_publish,
199
+ "gitignore_audit": _extract_gitignore_audit,
200
+ "dependency_audit": _extract_dependency_audit,
201
+ "ssh_key_audit": _extract_ssh_key_audit,
202
+ "public_github_secrets": _extract_public_github_secrets,
203
+ "local_dirty_worktree_secrets": _extract_local_dirty_worktree_secrets,
204
+ "local_dev": _extract_local_dev,
205
+ "project_flaudit": _extract_project_flaudit,
206
+ }
207
+
208
+
209
+ # ---------------------------------------------------------------------------
210
+ # Public API
211
+ # ---------------------------------------------------------------------------
212
+
213
+
214
+ def report_to_sarif(
215
+ report: dict,
216
+ sweep_name: str,
217
+ tool_version: str = "0.1.0",
218
+ ) -> dict:
219
+ """Convert a devguard sweep report to SARIF 2.1.0 format."""
220
+ extractor = _EXTRACTORS.get(sweep_name)
221
+ if extractor is None:
222
+ # Fallback: try the ai_editor_config shape (repos[].findings[])
223
+ extractor = _extract_ai_editor_config
224
+
225
+ raw_results = extractor(report)
226
+
227
+ # Collect unique rule IDs
228
+ rule_ids: dict[str, int] = {}
229
+ rules: list[dict] = []
230
+ for rule_id, _level, _msg, _uri in raw_results:
231
+ if rule_id not in rule_ids:
232
+ rule_ids[rule_id] = len(rules)
233
+ rules.append(
234
+ {
235
+ "id": rule_id,
236
+ "shortDescription": {"text": rule_id.replace("_", " ")},
237
+ }
238
+ )
239
+
240
+ sarif_results: list[dict] = []
241
+ for rule_id, level, message, uri in raw_results:
242
+ result: dict[str, Any] = {
243
+ "ruleId": rule_id,
244
+ "ruleIndex": rule_ids[rule_id],
245
+ "level": level,
246
+ "message": {"text": message},
247
+ }
248
+ if uri:
249
+ result["locations"] = [
250
+ {
251
+ "physicalLocation": {
252
+ "artifactLocation": {"uri": uri},
253
+ },
254
+ }
255
+ ]
256
+ sarif_results.append(result)
257
+
258
+ return {
259
+ "$schema": SARIF_SCHEMA,
260
+ "version": "2.1.0",
261
+ "runs": [
262
+ {
263
+ "tool": {
264
+ "driver": {
265
+ "name": "devguard",
266
+ "version": tool_version,
267
+ "informationUri": "https://github.com/arclabs561/devguard",
268
+ "rules": rules,
269
+ },
270
+ },
271
+ "results": sarif_results,
272
+ }
273
+ ],
274
+ }
275
+
276
+
277
+ def reports_to_sarif(
278
+ sweep_reports: list[tuple[str, dict]],
279
+ tool_version: str = "0.1.0",
280
+ ) -> dict:
281
+ """Convert multiple sweep reports into a single SARIF document.
282
+
283
+ Each entry in sweep_reports is (sweep_name, report_dict).
284
+ Each sweep becomes a separate run in the SARIF output.
285
+ """
286
+ runs: list[dict] = []
287
+ for sweep_name, report in sweep_reports:
288
+ single = report_to_sarif(report, sweep_name, tool_version=tool_version)
289
+ runs.extend(single["runs"])
290
+
291
+ return {
292
+ "$schema": SARIF_SCHEMA,
293
+ "version": "2.1.0",
294
+ "runs": runs,
295
+ }
@@ -0,0 +1,141 @@
1
+ # NPM Package Red Team Analysis - Complete Summary
2
+
3
+ ## Analysis Results
4
+
5
+ **Date:** 2025-11-17
6
+ **Packages Analyzed:** 5
7
+
8
+ ### Security Status: ✅ CLEAN
9
+
10
+ All packages passed comprehensive security analysis with no critical issues found.
11
+
12
+ ## Detailed Findings
13
+
14
+ ### Secrets & Credentials
15
+ - **Secrets Found:** 0
16
+ - **Base64/Hex Encoded Secrets:** 0
17
+ - **Secrets in Test Files:** 0
18
+ - **Secrets in Comments:** 0
19
+
20
+ ### Code Security
21
+ - **Obfuscated Code Patterns:** 19 (all low severity - legitimate uses)
22
+ - **Suspicious Scripts:** 0
23
+ - **Placeholder Values:** 0
24
+
25
+ ### File Security
26
+ - **Sensitive Files:** 0
27
+ - **Git History Published:** 0
28
+ - **Lock Files Published:** 0
29
+ - **CI/CD Configs:** 0
30
+ - **Unusual File Permissions:** 0
31
+
32
+ ### Package Configuration
33
+ - **Missing .npmignore:** 5 packages (recommendation to add)
34
+ - **Files Field Issues:** Minor (package.json not in files list)
35
+ - **Suspicious Package Names:** 0
36
+
37
+ ### Dependencies
38
+ - **Vulnerabilities:** 0
39
+ - **Critical/High Severity:** 0
40
+ - **Install Scripts:** 1 (review recommended)
41
+
42
+ ## Recommendations
43
+
44
+ ### High Priority
45
+ 1. **Add .npmignore files** to all 5 packages
46
+ - Command: `uv run python devguard/scripts/generate_npmignore.py`
47
+ - Improves security by explicitly excluding sensitive files
48
+
49
+ ### Medium Priority
50
+ 1. **Review obfuscated code patterns** (19 instances)
51
+ - All flagged as low severity
52
+ - Verify Function(), atob() usage is legitimate
53
+ - Most likely false positives for data encoding
54
+
55
+ 2. **Review install scripts** (1 instance)
56
+ - Check postinstall/preinstall scripts for security risks
57
+ - Ensure no malicious network requests
58
+
59
+ ## Analysis Capabilities
60
+
61
+ ### Secret Detection
62
+ - 20+ secret pattern types
63
+ - Base64/hex decoding and validation
64
+ - Context-aware filtering (test values, examples)
65
+ - OpenAI, Anthropic, AWS, GitHub, Stripe keys
66
+ - Database URLs, OAuth secrets, JWT secrets
67
+
68
+ ### Code Analysis
69
+ - Context-aware obfuscation detection
70
+ - Legitimate use pattern filtering
71
+ - Suspicious variable name detection
72
+ - Multi-factor severity assessment
73
+
74
+ ### File Analysis
75
+ - Sensitive file name detection
76
+ - Git history detection
77
+ - Lock file detection
78
+ - CI/CD config detection
79
+ - Source map detection
80
+ - Large file detection
81
+ - File permission analysis
82
+
83
+ ### Package Analysis
84
+ - package.json deep analysis
85
+ - Script security review
86
+ - Dependency risk assessment
87
+ - Package name typosquatting detection
88
+ - Files field validation
89
+
90
+ ### Dependency Security
91
+ - npm audit integration
92
+ - Vulnerability severity assessment
93
+ - CVE tracking
94
+ - Critical/High prioritization
95
+
96
+ ## Tools Created
97
+
98
+ 1. **redteam_npm_packages.py** (47KB)
99
+ - Comprehensive security analysis
100
+ - Real-time vulnerability checking
101
+ - Detailed reporting
102
+
103
+ 2. **generate_npmignore.py** (4.8KB)
104
+ - Automated .npmignore generation
105
+ - Best practices based
106
+ - Backup creation
107
+
108
+ 3. **generate_security_report.py** (10.6KB)
109
+ - JSON and Markdown reports
110
+ - Prioritized recommendations
111
+ - Comprehensive statistics
112
+
113
+ 4. **auto_fix_recommendations.py** (4.8KB)
114
+ - Automated fix suggestions
115
+ - Command generation
116
+ - Priority-based actions
117
+
118
+ 5. **prepublish_check.sh** (785B)
119
+ - Pre-publish hook integration
120
+ - Automated security checks
121
+ - Fail-safe publishing
122
+
123
+ ## Next Steps
124
+
125
+ 1. Generate .npmignore files for all packages
126
+ 2. Review the 1 install script found
127
+ 3. Verify obfuscated code patterns are legitimate
128
+ 4. Integrate pre-publish hooks into package.json
129
+ 5. Set up regular security audits
130
+
131
+ ## Continuous Improvement
132
+
133
+ The analysis system is designed to:
134
+ - Reduce false positives through context awareness
135
+ - Add new secret patterns as threats evolve
136
+ - Improve detection accuracy over time
137
+ - Provide actionable, prioritized recommendations
138
+
139
+ All packages are secure and ready for continued use! 🎉
140
+
141
+
@@ -0,0 +1,221 @@
1
+ # devguard NPM Security Scripts
2
+
3
+ Comprehensive security analysis and remediation tools for npm packages.
4
+
5
+ ## Scripts
6
+
7
+ ### `redteam_npm_packages.py`
8
+
9
+ Deep red team security analysis of published npm packages.
10
+
11
+ **Features:**
12
+ - **Secret Detection:**
13
+ - API keys (OpenAI, Anthropic, AWS, GitHub, Stripe, etc.)
14
+ - Tokens and passwords
15
+ - Database URLs
16
+ - OAuth secrets
17
+ - JWT secrets
18
+ - Base64/hex encoded secrets (with decoding)
19
+
20
+ - **Code Analysis:**
21
+ - Context-aware obfuscated code detection (eval, Function, atob, etc.)
22
+ - Suspicious script patterns
23
+ - Placeholder values
24
+ - Secrets in comments
25
+
26
+ - **File Analysis:**
27
+ - Sensitive file names
28
+ - Git history detection
29
+ - Lock files
30
+ - CI/CD configs
31
+ - Source maps
32
+ - Large files
33
+ - File permissions
34
+
35
+ - **Package Configuration:**
36
+ - Missing .npmignore
37
+ - Files field analysis
38
+ - Suspicious install scripts (postinstall/preinstall)
39
+ - Dependency risk assessment
40
+ - Package name typosquatting detection
41
+
42
+ - **Dependency Security:**
43
+ - npm audit integration
44
+ - Vulnerability severity assessment
45
+ - CVE tracking
46
+
47
+ **Usage:**
48
+ ```bash
49
+ uv run python devguard/scripts/redteam_npm_packages.py
50
+ ```
51
+
52
+ **Output:**
53
+ - Detailed per-package analysis with severity ratings
54
+ - Summary statistics
55
+ - Prioritized actionable recommendations
56
+
57
+ ### `generate_npmignore.py`
58
+
59
+ Generate `.npmignore` files based on npm best practices.
60
+
61
+ **Usage:**
62
+ ```bash
63
+ # Generate for all packages in default location (~/Documents/dev)
64
+ uv run python devguard/scripts/generate_npmignore.py
65
+
66
+ # Generate for specific directory
67
+ uv run python devguard/scripts/generate_npmignore.py /path/to/packages
68
+ ```
69
+
70
+ **Features:**
71
+ - Excludes test files
72
+ - Excludes CI/CD configs
73
+ - Excludes sensitive files
74
+ - Excludes lock files
75
+ - Creates backups of existing files
76
+ - Customizable based on package structure
77
+
78
+ ### `generate_security_report.py`
79
+
80
+ Generate comprehensive JSON and Markdown security reports.
81
+
82
+ **Usage:**
83
+ ```bash
84
+ uv run python devguard/scripts/generate_security_report.py
85
+ ```
86
+
87
+ **Output:**
88
+ - `npm_security_report.json` - Detailed JSON report with all findings
89
+ - `npm_security_report.md` - Human-readable Markdown report
90
+ - Summary statistics
91
+ - Prioritized recommendations (HIGH/MEDIUM/LOW)
92
+
93
+ ### `auto_fix_recommendations.py`
94
+
95
+ Generate automated fix commands based on security analysis.
96
+
97
+ **Usage:**
98
+ ```bash
99
+ uv run python devguard/scripts/auto_fix_recommendations.py
100
+ ```
101
+
102
+ **Features:**
103
+ - Analyzes security report
104
+ - Generates fix commands
105
+ - Optionally applies fixes automatically
106
+ - Prioritizes by severity
107
+
108
+ ## Best Practices
109
+
110
+ 1. **Run analysis before publishing:**
111
+ ```bash
112
+ uv run python devguard/scripts/redteam_npm_packages.py
113
+ ```
114
+
115
+ 2. **Generate .npmignore files:**
116
+ ```bash
117
+ uv run python devguard/scripts/generate_npmignore.py
118
+ ```
119
+
120
+ 3. **Review install scripts** - Especially `postinstall` and `preinstall` scripts
121
+
122
+ 4. **Use `files` field** in package.json instead of `.npmignore` when possible (more secure allowlist)
123
+
124
+ 5. **Never publish:**
125
+ - `.env` files
126
+ - `.git` directory
127
+ - Lock files
128
+ - CI/CD configs with secrets
129
+ - Test files with real credentials
130
+
131
+ 6. **Regular audits:**
132
+ ```bash
133
+ npm audit
134
+ npm audit fix
135
+ ```
136
+
137
+ ## Integration
138
+
139
+ Add to your `package.json` scripts:
140
+
141
+ ```json
142
+ {
143
+ "scripts": {
144
+ "prepublishOnly": "python devguard/scripts/redteam_npm_packages.py",
145
+ "check:security": "python devguard/scripts/redteam_npm_packages.py",
146
+ "fix:security": "python devguard/scripts/auto_fix_recommendations.py"
147
+ }
148
+ }
149
+ ```
150
+
151
+ ## Security Checks Performed
152
+
153
+ ### Secret Detection
154
+ - API keys (OpenAI, Anthropic, AWS, GitHub, Stripe, etc.)
155
+ - Tokens and passwords
156
+ - Database URLs
157
+ - OAuth secrets
158
+ - JWT secrets
159
+ - Base64/hex encoded secrets (with automatic decoding)
160
+
161
+ ### Code Analysis
162
+ - Context-aware obfuscated code detection
163
+ - Suspicious script patterns
164
+ - Placeholder values
165
+ - Secrets in comments
166
+ - Install script security risks
167
+
168
+ ### File Analysis
169
+ - Sensitive file names
170
+ - Git history
171
+ - Lock files
172
+ - CI/CD configs
173
+ - Source maps
174
+ - Large files
175
+ - File permissions
176
+
177
+ ### Package Configuration
178
+ - Missing .npmignore
179
+ - Files field issues
180
+ - Suspicious install scripts
181
+ - Dependency risks
182
+ - Repository exposure
183
+ - Package name typosquatting
184
+
185
+ ### Dependency Security
186
+ - npm audit integration
187
+ - Vulnerability severity assessment
188
+ - CVE tracking
189
+ - Critical/High severity prioritization
190
+
191
+ ## Continuous Improvement
192
+
193
+ The analysis continuously improves with:
194
+ - New secret patterns
195
+ - Better false positive filtering
196
+ - Additional security checks
197
+ - Enhanced reporting
198
+ - Context-aware detection
199
+
200
+ Run regularly to catch issues before they're published!
201
+
202
+ ## Workflow
203
+
204
+ 1. **Before publishing:**
205
+ ```bash
206
+ uv run python devguard/scripts/redteam_npm_packages.py
207
+ ```
208
+
209
+ 2. **Fix issues:**
210
+ ```bash
211
+ uv run python devguard/scripts/auto_fix_recommendations.py
212
+ ```
213
+
214
+ 3. **Generate reports:**
215
+ ```bash
216
+ uv run python devguard/scripts/generate_security_report.py
217
+ ```
218
+
219
+ 4. **Review and commit fixes**
220
+
221
+ 5. **Publish with confidence!**