kollabor 0.4.9__py3-none-any.whl → 0.4.15__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.
- agents/__init__.py +2 -0
- agents/coder/__init__.py +0 -0
- agents/coder/agent.json +4 -0
- agents/coder/api-integration.md +2150 -0
- agents/coder/cli-pretty.md +765 -0
- agents/coder/code-review.md +1092 -0
- agents/coder/database-design.md +1525 -0
- agents/coder/debugging.md +1102 -0
- agents/coder/dependency-management.md +1397 -0
- agents/coder/git-workflow.md +1099 -0
- agents/coder/refactoring.md +1454 -0
- agents/coder/security-hardening.md +1732 -0
- agents/coder/system_prompt.md +1448 -0
- agents/coder/tdd.md +1367 -0
- agents/creative-writer/__init__.py +0 -0
- agents/creative-writer/agent.json +4 -0
- agents/creative-writer/character-development.md +1852 -0
- agents/creative-writer/dialogue-craft.md +1122 -0
- agents/creative-writer/plot-structure.md +1073 -0
- agents/creative-writer/revision-editing.md +1484 -0
- agents/creative-writer/system_prompt.md +690 -0
- agents/creative-writer/worldbuilding.md +2049 -0
- agents/data-analyst/__init__.py +30 -0
- agents/data-analyst/agent.json +4 -0
- agents/data-analyst/data-visualization.md +992 -0
- agents/data-analyst/exploratory-data-analysis.md +1110 -0
- agents/data-analyst/pandas-data-manipulation.md +1081 -0
- agents/data-analyst/sql-query-optimization.md +881 -0
- agents/data-analyst/statistical-analysis.md +1118 -0
- agents/data-analyst/system_prompt.md +928 -0
- agents/default/__init__.py +0 -0
- agents/default/agent.json +4 -0
- agents/default/dead-code.md +794 -0
- agents/default/explore-agent-system.md +585 -0
- agents/default/system_prompt.md +1448 -0
- agents/kollabor/__init__.py +0 -0
- agents/kollabor/analyze-plugin-lifecycle.md +175 -0
- agents/kollabor/analyze-terminal-rendering.md +388 -0
- agents/kollabor/code-review.md +1092 -0
- agents/kollabor/debug-mcp-integration.md +521 -0
- agents/kollabor/debug-plugin-hooks.md +547 -0
- agents/kollabor/debugging.md +1102 -0
- agents/kollabor/dependency-management.md +1397 -0
- agents/kollabor/git-workflow.md +1099 -0
- agents/kollabor/inspect-llm-conversation.md +148 -0
- agents/kollabor/monitor-event-bus.md +558 -0
- agents/kollabor/profile-performance.md +576 -0
- agents/kollabor/refactoring.md +1454 -0
- agents/kollabor/system_prompt copy.md +1448 -0
- agents/kollabor/system_prompt.md +757 -0
- agents/kollabor/trace-command-execution.md +178 -0
- agents/kollabor/validate-config.md +879 -0
- agents/research/__init__.py +0 -0
- agents/research/agent.json +4 -0
- agents/research/architecture-mapping.md +1099 -0
- agents/research/codebase-analysis.md +1077 -0
- agents/research/dependency-audit.md +1027 -0
- agents/research/performance-profiling.md +1047 -0
- agents/research/security-review.md +1359 -0
- agents/research/system_prompt.md +492 -0
- agents/technical-writer/__init__.py +0 -0
- agents/technical-writer/agent.json +4 -0
- agents/technical-writer/api-documentation.md +2328 -0
- agents/technical-writer/changelog-management.md +1181 -0
- agents/technical-writer/readme-writing.md +1360 -0
- agents/technical-writer/style-guide.md +1410 -0
- agents/technical-writer/system_prompt.md +653 -0
- agents/technical-writer/tutorial-creation.md +1448 -0
- core/__init__.py +0 -2
- core/application.py +343 -88
- core/cli.py +229 -10
- core/commands/menu_renderer.py +463 -59
- core/commands/registry.py +14 -9
- core/commands/system_commands.py +2461 -14
- core/config/loader.py +151 -37
- core/config/service.py +18 -6
- core/events/bus.py +29 -9
- core/events/executor.py +205 -75
- core/events/models.py +27 -8
- core/fullscreen/command_integration.py +20 -24
- core/fullscreen/components/__init__.py +10 -1
- core/fullscreen/components/matrix_components.py +1 -2
- core/fullscreen/components/space_shooter_components.py +654 -0
- core/fullscreen/plugin.py +5 -0
- core/fullscreen/renderer.py +52 -13
- core/fullscreen/session.py +52 -15
- core/io/__init__.py +29 -5
- core/io/buffer_manager.py +6 -1
- core/io/config_status_view.py +7 -29
- core/io/core_status_views.py +267 -347
- core/io/input/__init__.py +25 -0
- core/io/input/command_mode_handler.py +711 -0
- core/io/input/display_controller.py +128 -0
- core/io/input/hook_registrar.py +286 -0
- core/io/input/input_loop_manager.py +421 -0
- core/io/input/key_press_handler.py +502 -0
- core/io/input/modal_controller.py +1011 -0
- core/io/input/paste_processor.py +339 -0
- core/io/input/status_modal_renderer.py +184 -0
- core/io/input_errors.py +5 -1
- core/io/input_handler.py +211 -2452
- core/io/key_parser.py +7 -0
- core/io/layout.py +15 -3
- core/io/message_coordinator.py +111 -2
- core/io/message_renderer.py +129 -4
- core/io/status_renderer.py +147 -607
- core/io/terminal_renderer.py +97 -51
- core/io/terminal_state.py +21 -4
- core/io/visual_effects.py +816 -165
- core/llm/agent_manager.py +1063 -0
- core/llm/api_adapters/__init__.py +44 -0
- core/llm/api_adapters/anthropic_adapter.py +432 -0
- core/llm/api_adapters/base.py +241 -0
- core/llm/api_adapters/openai_adapter.py +326 -0
- core/llm/api_communication_service.py +167 -113
- core/llm/conversation_logger.py +322 -16
- core/llm/conversation_manager.py +556 -30
- core/llm/file_operations_executor.py +84 -32
- core/llm/llm_service.py +934 -103
- core/llm/mcp_integration.py +541 -57
- core/llm/message_display_service.py +135 -18
- core/llm/plugin_sdk.py +1 -2
- core/llm/profile_manager.py +1183 -0
- core/llm/response_parser.py +274 -56
- core/llm/response_processor.py +16 -3
- core/llm/tool_executor.py +6 -1
- core/logging/__init__.py +2 -0
- core/logging/setup.py +34 -6
- core/models/resume.py +54 -0
- core/plugins/__init__.py +4 -2
- core/plugins/base.py +127 -0
- core/plugins/collector.py +23 -161
- core/plugins/discovery.py +37 -3
- core/plugins/factory.py +6 -12
- core/plugins/registry.py +5 -17
- core/ui/config_widgets.py +128 -28
- core/ui/live_modal_renderer.py +2 -1
- core/ui/modal_actions.py +5 -0
- core/ui/modal_overlay_renderer.py +0 -60
- core/ui/modal_renderer.py +268 -7
- core/ui/modal_state_manager.py +29 -4
- core/ui/widgets/base_widget.py +7 -0
- core/updates/__init__.py +10 -0
- core/updates/version_check_service.py +348 -0
- core/updates/version_comparator.py +103 -0
- core/utils/config_utils.py +685 -526
- core/utils/plugin_utils.py +1 -1
- core/utils/session_naming.py +111 -0
- fonts/LICENSE +21 -0
- fonts/README.md +46 -0
- fonts/SymbolsNerdFont-Regular.ttf +0 -0
- fonts/SymbolsNerdFontMono-Regular.ttf +0 -0
- fonts/__init__.py +44 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/METADATA +54 -4
- kollabor-0.4.15.dist-info/RECORD +228 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/top_level.txt +2 -0
- plugins/agent_orchestrator/__init__.py +39 -0
- plugins/agent_orchestrator/activity_monitor.py +181 -0
- plugins/agent_orchestrator/file_attacher.py +77 -0
- plugins/agent_orchestrator/message_injector.py +135 -0
- plugins/agent_orchestrator/models.py +48 -0
- plugins/agent_orchestrator/orchestrator.py +403 -0
- plugins/agent_orchestrator/plugin.py +976 -0
- plugins/agent_orchestrator/xml_parser.py +191 -0
- plugins/agent_orchestrator_plugin.py +9 -0
- plugins/enhanced_input/box_styles.py +1 -0
- plugins/enhanced_input/color_engine.py +19 -4
- plugins/enhanced_input/config.py +2 -2
- plugins/enhanced_input_plugin.py +61 -11
- plugins/fullscreen/__init__.py +6 -2
- plugins/fullscreen/example_plugin.py +1035 -222
- plugins/fullscreen/setup_wizard_plugin.py +592 -0
- plugins/fullscreen/space_shooter_plugin.py +131 -0
- plugins/hook_monitoring_plugin.py +436 -78
- plugins/query_enhancer_plugin.py +66 -30
- plugins/resume_conversation_plugin.py +1494 -0
- plugins/save_conversation_plugin.py +98 -32
- plugins/system_commands_plugin.py +70 -56
- plugins/tmux_plugin.py +154 -78
- plugins/workflow_enforcement_plugin.py +94 -92
- system_prompt/default.md +952 -886
- core/io/input_mode_manager.py +0 -402
- core/io/modal_interaction_handler.py +0 -315
- core/io/raw_input_processor.py +0 -946
- core/storage/__init__.py +0 -5
- core/storage/state_manager.py +0 -84
- core/ui/widget_integration.py +0 -222
- core/utils/key_reader.py +0 -171
- kollabor-0.4.9.dist-info/RECORD +0 -128
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/WHEEL +0 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/entry_points.txt +0 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,1027 @@
|
|
|
1
|
+
<!-- Dependency Audit skill - security and compliance investigation of project dependencies -->
|
|
2
|
+
|
|
3
|
+
dependency-audit mode: READ ONLY SECURITY AUDIT
|
|
4
|
+
|
|
5
|
+
when this skill is active, you follow systematic dependency investigation.
|
|
6
|
+
this is a comprehensive guide to auditing project dependencies.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
PHASE 0: ENVIRONMENT AND PACKAGE MANAGER VERIFICATION
|
|
10
|
+
|
|
11
|
+
before auditing ANY dependencies, identify the package manager and tools.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
identify the package manager
|
|
15
|
+
|
|
16
|
+
check for python package managers:
|
|
17
|
+
<terminal>ls -la | grep -E "(requirements\.txt|pyproject\.toml|setup\.py|Pipfile|poetry\.lock|pyproject\.toml)"</terminal>
|
|
18
|
+
|
|
19
|
+
check for node package managers:
|
|
20
|
+
<terminal>ls -la | grep -E "(package\.json|package-lock\.json|yarn\.lock|pnpm-lock\.yaml)"</terminal>
|
|
21
|
+
|
|
22
|
+
check for rust:
|
|
23
|
+
<terminal>ls -la | grep -E "Cargo\.toml|Cargo\.lock"</terminal>
|
|
24
|
+
|
|
25
|
+
check for go:
|
|
26
|
+
<terminal>ls -la | grep -E "go\.mod|go\.sum"</terminal>
|
|
27
|
+
|
|
28
|
+
check for java/maven:
|
|
29
|
+
<terminal>ls -la | grep -E "pom\.xml"</terminal>
|
|
30
|
+
|
|
31
|
+
check for java/gradle:
|
|
32
|
+
<terminal>ls -la | grep -E "build\.gradle|gradle\.lockfile"</terminal>
|
|
33
|
+
|
|
34
|
+
check for ruby:
|
|
35
|
+
<terminal>ls -la | grep -E "Gemfile|gemfile\.lock"</terminal>
|
|
36
|
+
|
|
37
|
+
check for php/composer:
|
|
38
|
+
<terminal>ls -la | grep -E "composer\.json|composer\.lock"</terminal>
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
verify audit tools availability
|
|
42
|
+
|
|
43
|
+
python vulnerability scanners:
|
|
44
|
+
<terminal>which pip-audit</terminal>
|
|
45
|
+
<terminal>pip-audit --version 2>/dev/null || echo "pip-audit not installed"</terminal>
|
|
46
|
+
|
|
47
|
+
<terminal>which safety</terminal>
|
|
48
|
+
<terminal>safety --version 2>/dev/null || echo "safety not installed"</terminal>
|
|
49
|
+
|
|
50
|
+
<terminal>which bandit</terminal>
|
|
51
|
+
<terminal>bandit --version 2>/dev/null || echo "bandit not installed"</terminal>
|
|
52
|
+
|
|
53
|
+
node vulnerability scanners:
|
|
54
|
+
<terminal>which npm</terminal>
|
|
55
|
+
<terminal>npm --version</terminal>
|
|
56
|
+
|
|
57
|
+
<terminal>which yarn</terminal>
|
|
58
|
+
<terminal>yarn --version 2>/dev/null || echo "yarn not installed"</terminal>
|
|
59
|
+
|
|
60
|
+
general scanners:
|
|
61
|
+
<terminal>which snyk</terminal>
|
|
62
|
+
<terminal>snyk --version 2>/dev/null || echo "snyk not installed"</terminal>
|
|
63
|
+
|
|
64
|
+
<terminal>which grype</terminal>
|
|
65
|
+
<terminal>grype --version 2>/dev/null || echo "grype not installed"</terminal>
|
|
66
|
+
|
|
67
|
+
<terminal>which trivy</terminal>
|
|
68
|
+
<terminal>trivy --version 2>/dev/null || echo "trivy not installed"</terminal>
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
install missing tools if authorized
|
|
72
|
+
|
|
73
|
+
for python projects:
|
|
74
|
+
<terminal>pip install pip-audit safety bandit 2>/dev/null || echo "install failed"</terminal>
|
|
75
|
+
|
|
76
|
+
for container scanning:
|
|
77
|
+
<terminal>brew install grype trivy 2>/dev/null || echo "install failed"</terminal>
|
|
78
|
+
|
|
79
|
+
note: research agent reports tool availability, does not force installation.
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
verify lock files exist
|
|
83
|
+
|
|
84
|
+
lock files are critical for accurate audits:
|
|
85
|
+
|
|
86
|
+
python:
|
|
87
|
+
<terminal>ls -la pipenv.lock poetry.lock requirements.txt 2>/dev/null</terminal>
|
|
88
|
+
|
|
89
|
+
node:
|
|
90
|
+
<terminal>ls -la package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null</terminal>
|
|
91
|
+
|
|
92
|
+
rust:
|
|
93
|
+
<terminal>ls -la Cargo.lock 2>/dev/null</terminal>
|
|
94
|
+
|
|
95
|
+
go:
|
|
96
|
+
<terminal>ls -la go.sum 2>/dev/null</terminal>
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
PHASE 1: DEPENDENCY INVENTORY
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
list all direct dependencies
|
|
103
|
+
|
|
104
|
+
python - requirements.txt:
|
|
105
|
+
<read><file>requirements.txt</file></read>
|
|
106
|
+
|
|
107
|
+
python - pyproject.toml:
|
|
108
|
+
<terminal>cat pyproject.toml 2>/dev/null | grep -A50 "dependencies"</terminal>
|
|
109
|
+
|
|
110
|
+
python - setup.py:
|
|
111
|
+
<terminal>cat setup.py 2>/dev/null | grep -A30 "install_requires"</terminal>
|
|
112
|
+
|
|
113
|
+
python - pipenv:
|
|
114
|
+
<terminal>cat Pipfile 2>/dev/null | grep -A20 "\[packages\]"</terminal>
|
|
115
|
+
|
|
116
|
+
python - poetry:
|
|
117
|
+
<terminal>cat pyproject.toml 2>/dev/null | grep -A50 "\[tool.poetry.dependencies\]"</terminal>
|
|
118
|
+
|
|
119
|
+
node - package.json:
|
|
120
|
+
<terminal>cat package.json 2>/dev/null | grep -A100 '"dependencies"'</terminal>
|
|
121
|
+
|
|
122
|
+
rust - cargo.toml:
|
|
123
|
+
<terminal>cat Cargo.toml 2>/dev/null | grep -A50 "\[dependencies\]"</terminal>
|
|
124
|
+
|
|
125
|
+
go - go.mod:
|
|
126
|
+
<terminal>cat go.mod 2>/dev/null | grep -A100 "require"</terminal>
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
list all transitive dependencies
|
|
130
|
+
|
|
131
|
+
python:
|
|
132
|
+
<terminal>pip list 2>/dev/null | head -50</terminal>
|
|
133
|
+
|
|
134
|
+
<terminal>pip freeze 2>/dev/null | head -50</terminal>
|
|
135
|
+
|
|
136
|
+
node:
|
|
137
|
+
<terminal>npm list 2>/dev/null | head -50</terminal>
|
|
138
|
+
|
|
139
|
+
<terminal>npm list --all 2>/dev/null | wc -l</terminal>
|
|
140
|
+
|
|
141
|
+
rust:
|
|
142
|
+
<terminal>cargo tree 2>/dev/null | head -50</terminal>
|
|
143
|
+
|
|
144
|
+
go:
|
|
145
|
+
<terminal>go list -m all 2>/dev/null | head -50</terminal>
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
count dependencies by category
|
|
149
|
+
|
|
150
|
+
python:
|
|
151
|
+
<terminal>pip list 2>/dev/null | wc -l</terminal>
|
|
152
|
+
|
|
153
|
+
<terminal>pip freeze 2>/dev/null | wc -l</terminal>
|
|
154
|
+
|
|
155
|
+
node:
|
|
156
|
+
<terminal>npm list --all 2>/dev/null | grep -v "extraneous" | wc -l</terminal>
|
|
157
|
+
|
|
158
|
+
count direct dependencies:
|
|
159
|
+
<terminal>cat package.json 2>/dev/null | grep -A100 '"dependencies"' | grep '":' | grep -v '"dependencies"' | wc -l</terminal>
|
|
160
|
+
|
|
161
|
+
count dev dependencies:
|
|
162
|
+
<terminal>cat package.json 2>/dev/null | grep -A100 '"devDependencies"' | grep '":' | grep -v '"devDependencies"' | wc -l</terminal>
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
document dependency inventory
|
|
166
|
+
|
|
167
|
+
direct dependencies: [count]
|
|
168
|
+
transitive dependencies: [count]
|
|
169
|
+
total: [count]
|
|
170
|
+
|
|
171
|
+
largest dependency trees:
|
|
172
|
+
- [package] - [transitive count]
|
|
173
|
+
|
|
174
|
+
dependency sources:
|
|
175
|
+
- [registry 1] - [count]
|
|
176
|
+
- [registry 2] - [count]
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
PHASE 2: VULNERABILITY SCANNING
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
run pip-audit for python projects
|
|
183
|
+
|
|
184
|
+
basic scan:
|
|
185
|
+
<terminal>pip-audit 2>/dev/null || pip-audit --requirement requirements.txt 2>/dev/null</terminal>
|
|
186
|
+
|
|
187
|
+
scan with lock file:
|
|
188
|
+
<terminal>pip-audit --requirement requirements.txt 2>/dev/null</terminal>
|
|
189
|
+
|
|
190
|
+
scan installed packages:
|
|
191
|
+
<terminal>pip-audit --local 2>/dev/null</terminal>
|
|
192
|
+
|
|
193
|
+
detailed output:
|
|
194
|
+
<terminal>pip-audit --format json 2>/dev/null</terminal>
|
|
195
|
+
|
|
196
|
+
strict mode (fail on any vuln):
|
|
197
|
+
<terminal>pip-audit --strict 2>/dev/null</terminal>
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
run safety for python projects
|
|
201
|
+
|
|
202
|
+
basic scan:
|
|
203
|
+
<terminal>safety check --file requirements.txt 2>/dev/null || safety check 2>/dev/null</terminal>
|
|
204
|
+
|
|
205
|
+
json output:
|
|
206
|
+
<terminal>safety check --json 2>/dev/null</terminal>
|
|
207
|
+
|
|
208
|
+
detailed report:
|
|
209
|
+
<terminal>safety check --full-report 2>/dev/null</terminal>
|
|
210
|
+
|
|
211
|
+
scan installed packages:
|
|
212
|
+
<terminal>safety check 2>/dev/null</terminal>
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
run npm audit for node projects
|
|
216
|
+
|
|
217
|
+
basic scan:
|
|
218
|
+
<terminal>npm audit 2>/dev/null</terminal>
|
|
219
|
+
|
|
220
|
+
json output:
|
|
221
|
+
<terminal>npm audit --json 2>/dev/null</terminal>
|
|
222
|
+
|
|
223
|
+
fixable vulnerabilities:
|
|
224
|
+
<terminal>npm audit --fix --dry-run 2>/dev/null</terminal>
|
|
225
|
+
|
|
226
|
+
production dependencies only:
|
|
227
|
+
<terminal>npm audit --production 2>/dev/null>
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
run yarn audit for node projects
|
|
231
|
+
|
|
232
|
+
basic scan:
|
|
233
|
+
<terminal>yarn audit 2>/dev/null</terminal>
|
|
234
|
+
|
|
235
|
+
json output:
|
|
236
|
+
<terminal>yarn audit --json 2>/dev/null</terminal>
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
run cargo audit for rust projects
|
|
240
|
+
|
|
241
|
+
<terminal>cargo audit 2>/dev/null || echo "cargo-audit not installed"</terminal>
|
|
242
|
+
|
|
243
|
+
install if needed:
|
|
244
|
+
<terminal>cargo install cargo-audit 2>/dev/null</terminal>
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
run go vulnerability checks
|
|
248
|
+
|
|
249
|
+
<terminal>govulncheck ./... 2>/dev/null || echo "govulncheck not installed"</terminal>
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
run snyk if available
|
|
253
|
+
|
|
254
|
+
authenticate first:
|
|
255
|
+
<terminal>snyk auth 2>/dev/null || echo "authentication required"</terminal>
|
|
256
|
+
|
|
257
|
+
test for vulnerabilities:
|
|
258
|
+
<terminal>snyk test 2>/dev/null</terminal>
|
|
259
|
+
|
|
260
|
+
monitor dependencies:
|
|
261
|
+
<terminal>snyk monitor 2>/v/null || echo "monitoring requires auth"</terminal>
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
run container scanning if dockerfiles exist
|
|
265
|
+
|
|
266
|
+
<terminal>find . -name "Dockerfile*" -o -name "docker-compose*" | head -5</terminal>
|
|
267
|
+
|
|
268
|
+
with grype:
|
|
269
|
+
<terminal>grype . 2>/dev/null || echo "grype scan failed"</terminal>
|
|
270
|
+
|
|
271
|
+
with trivy:
|
|
272
|
+
<terminal>trivy fs . 2>/dev/null || echo "trivy scan failed"</terminal>
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
document vulnerability findings
|
|
276
|
+
|
|
277
|
+
critical: [count] - [package names]
|
|
278
|
+
high: [count] - [package names]
|
|
279
|
+
medium: [count] - [package names]
|
|
280
|
+
low: [count] - [package names]
|
|
281
|
+
|
|
282
|
+
vulnerable packages:
|
|
283
|
+
- [package] - [version] - [cve id] - [severity] - [fix available]
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
PHASE 3: LICENSE COMPLIANCE
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
extract license information
|
|
290
|
+
|
|
291
|
+
python:
|
|
292
|
+
<terminal>pip show [package-name] 2>/dev/null | grep -i license</terminal>
|
|
293
|
+
|
|
294
|
+
<terminal>pip-licenses 2>/dev/null || pip install pip-licenses 2>/dev/null && pip-licenses 2>/dev/null</terminal>
|
|
295
|
+
|
|
296
|
+
<terminal>pip-licenses --format=json 2>/dev/null</terminal>
|
|
297
|
+
|
|
298
|
+
node:
|
|
299
|
+
<terminal>npm list --json --depth=0 2>/dev/null | grep -i license</terminal>
|
|
300
|
+
|
|
301
|
+
<terminal>cat package.json 2>/dev/null | grep -A3 "license"</terminal>
|
|
302
|
+
|
|
303
|
+
<terminal>npm ls --long 2>/dev/null | grep -i license</terminal>
|
|
304
|
+
|
|
305
|
+
rust:
|
|
306
|
+
<terminal>cato about 2>/dev/null | grep -i license</terminal>
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
identify license types in use
|
|
310
|
+
|
|
311
|
+
python:
|
|
312
|
+
<terminal>pip-licenses --from=classification 2>/dev/null</terminal>
|
|
313
|
+
|
|
314
|
+
<terminal>pip-licenses --only-classifier 2>/dev/null</terminal>
|
|
315
|
+
|
|
316
|
+
common license types to look for:
|
|
317
|
+
- mit (permissive, widely compatible)
|
|
318
|
+
- apache-2.0 (permissive, patent clause)
|
|
319
|
+
- bsd-3-clause (permissive)
|
|
320
|
+
- gplv3 (copyleft, requires derivative works to be gpl)
|
|
321
|
+
- lgplv3 (lesser gpl, allows linking)
|
|
322
|
+
- mpl-2.0 (weak copyleft)
|
|
323
|
+
- unlicense (public domain)
|
|
324
|
+
- proprietary/commercial (restrictive)
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
check for problematic licenses
|
|
328
|
+
|
|
329
|
+
gpl/agpl/lgpl detection:
|
|
330
|
+
<terminal>pip-licenses --grep=gpl 2>/dev/null || echo "pip-licenses not available"</terminal>
|
|
331
|
+
|
|
332
|
+
<terminal>pip-licenses --grep=affero 2>/dev/null</terminal>
|
|
333
|
+
|
|
334
|
+
sspl (server side public license) detection:
|
|
335
|
+
<terminal>grep -ri "sspl" package.json README.md LICENSE* 2>/dev/null</terminal>
|
|
336
|
+
|
|
337
|
+
proprietary licenses:
|
|
338
|
+
<terminal>pip-licenses --fail-on="proprietary" --format=csv 2>/dev/null || echo "check failed"</terminal>
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
generate license report
|
|
342
|
+
|
|
343
|
+
python - full license report:
|
|
344
|
+
<terminal>pip-licenses --format=markdown --output-file=LICENSES.md 2>/dev/null</terminal>
|
|
345
|
+
|
|
346
|
+
<terminal>pip-licenses --format=csv --output-file=LICENSES.csv 2>/dev/null</terminal>
|
|
347
|
+
|
|
348
|
+
node:
|
|
349
|
+
<terminal>npm install -g license-report 2>/dev/null && license-report --output=csv 2>/dev/null</terminal>
|
|
350
|
+
|
|
351
|
+
<terminal>npm install -g nlf && nlf 2>/dev/null</terminal>
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
check project license compatibility
|
|
355
|
+
|
|
356
|
+
read project license:
|
|
357
|
+
<read><file>LICENSE</file></read>
|
|
358
|
+
|
|
359
|
+
<read><file>LICENSE.txt</file></read>
|
|
360
|
+
|
|
361
|
+
<read><file>LICENSE.md</file></read>
|
|
362
|
+
|
|
363
|
+
check license declaration:
|
|
364
|
+
<terminal>cat pyproject.toml 2>/dev/null | grep -i license</terminal>
|
|
365
|
+
|
|
366
|
+
<terminal>cat package.json 2>/dev/null | grep -i license</terminal>
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
document license findings
|
|
370
|
+
|
|
371
|
+
project license: [license type]
|
|
372
|
+
|
|
373
|
+
dependency licenses:
|
|
374
|
+
- mit: [count]
|
|
375
|
+
- apache-2.0: [count]
|
|
376
|
+
- bsd: [count]
|
|
377
|
+
- gpl/gplv3/lgpl: [count]
|
|
378
|
+
- other: [count]
|
|
379
|
+
|
|
380
|
+
compatibility concerns:
|
|
381
|
+
- [package] - [license] - [compatibility issue]
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
PHASE 4: DEPENDENCY FRESHNESS
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
identify outdated dependencies
|
|
388
|
+
|
|
389
|
+
python:
|
|
390
|
+
<terminal>pip list --outdated 2>/dev/null | head -30</terminal>
|
|
391
|
+
|
|
392
|
+
<terminal>pip list --outdated --format=json 2>/dev/null</terminal>
|
|
393
|
+
|
|
394
|
+
node:
|
|
395
|
+
<terminal>npm outdated 2>/dev/null | head -30</terminal>
|
|
396
|
+
|
|
397
|
+
<terminal>yarn outdated 2>/dev/null | head -30</terminal>
|
|
398
|
+
|
|
399
|
+
rust:
|
|
400
|
+
<terminal>cargo outdated 2>/dev/null || echo "cargo-outdated not installed"</terminal>
|
|
401
|
+
|
|
402
|
+
go:
|
|
403
|
+
<terminal>go list -u -m all 2>/dev/null | head -30</terminal>
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
check version pinning
|
|
407
|
+
|
|
408
|
+
python - analyze version constraints:
|
|
409
|
+
<terminal>grep -E "^[a-zA-Z].*==" requirements.txt 2>/dev/null | head -20</terminal>
|
|
410
|
+
|
|
411
|
+
<terminal>grep -E "^[a-zA-Z].*[>=<>{]" requirements.txt 2>/dev/null | head -20</terminal>
|
|
412
|
+
|
|
413
|
+
<terminal>grep -E "^[a-zA-Z].*[^=><{]$]" requirements.txt 2>/dev/null | head -20</terminal>
|
|
414
|
+
|
|
415
|
+
node - analyze semver ranges:
|
|
416
|
+
<terminal>cat package.json 2>/dev/null | grep -A50 '"dependencies"' | grep -E '\^|~|\*|>=|x'</terminal>
|
|
417
|
+
|
|
418
|
+
check for caret (^) - minor updates allowed:
|
|
419
|
+
<terminal>cat package.json 2>/dev/null | grep '": "\^' | head -20</terminal>
|
|
420
|
+
|
|
421
|
+
check for tilde (~) - patch updates only:
|
|
422
|
+
<terminal>cat package.json 2>/dev/null | grep '": "~' | head -20</terminal>
|
|
423
|
+
|
|
424
|
+
check for wildcard (*) - any version:
|
|
425
|
+
<terminal>cat package.json 2>/dev/null | grep '": "\*'|'": "*"' | head -20</terminal>
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
check for unmaintained dependencies
|
|
429
|
+
|
|
430
|
+
python:
|
|
431
|
+
<terminal>pip index versions [package-name] 2>/dev/null | grep -E "WARNING:|Available versions:"</terminal>
|
|
432
|
+
|
|
433
|
+
check last published date on pypi for critical packages
|
|
434
|
+
|
|
435
|
+
node:
|
|
436
|
+
<terminal>npm view [package-name] time 2>/dev/null | tail -5</terminal>
|
|
437
|
+
|
|
438
|
+
<terminal>npm view [package-name] --json 2>/dev/null | grep -E '"time"|"version"'</terminal>
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
check for deprecated packages
|
|
442
|
+
|
|
443
|
+
python:
|
|
444
|
+
<terminal>pip show [package-name] 2>/dev/null | grep -i "warning:\|deprecated"</terminal>
|
|
445
|
+
|
|
446
|
+
node:
|
|
447
|
+
<terminal>npm view [package-name] 2>/dev/null | grep -i "deprecated"</terminal>
|
|
448
|
+
|
|
449
|
+
<terminal>npm deprecate 2>/dev/null || echo "check npm registry directly"</terminal>
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
check for security advisories
|
|
453
|
+
|
|
454
|
+
python:
|
|
455
|
+
<terminal>pip-audit --format json 2>/dev/null | grep -i "advisory"</terminal>
|
|
456
|
+
|
|
457
|
+
node:
|
|
458
|
+
<terminal>npm audit --json 2>/dev/null | grep -i "advisory"</terminal>
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
check for abandoned projects
|
|
462
|
+
|
|
463
|
+
indicators:
|
|
464
|
+
- no commits in 2+ years
|
|
465
|
+
- open issues not addressed
|
|
466
|
+
- no response to prs
|
|
467
|
+
- depends on unmaintained transitive deps
|
|
468
|
+
|
|
469
|
+
check github activity:
|
|
470
|
+
<terminal>gh repo view [owner]/[repo] 2>/dev/null || echo "gh cli not available"</terminal>
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
document freshness findings
|
|
474
|
+
|
|
475
|
+
severely outdated (major versions behind):
|
|
476
|
+
- [package] - [current] - [latest]
|
|
477
|
+
|
|
478
|
+
moderately outdated (minor versions behind):
|
|
479
|
+
- [package] - [current] - [latest]
|
|
480
|
+
|
|
481
|
+
unmaintained packages:
|
|
482
|
+
- [package] - [last update date] - [impact]
|
|
483
|
+
|
|
484
|
+
deprecated packages:
|
|
485
|
+
- [package] - [replacement]
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
PHASE 5: UNUSED DEPENDENCY ANALYSIS
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
identify potentially unused dependencies
|
|
492
|
+
|
|
493
|
+
python:
|
|
494
|
+
<terminal>pip install pipdeptree 2>/dev/null</terminal>
|
|
495
|
+
|
|
496
|
+
<terminal>pipdeptree 2>/dev/null | grep -v "==" | head -50</terminal>
|
|
497
|
+
|
|
498
|
+
find deps not imported anywhere:
|
|
499
|
+
<terminal>grep -r "^import\|^from" --include="*.py" . 2>/dev/null | sed 's/from //' | sed 's/ import.*//' | sort | uniq</terminal>
|
|
500
|
+
|
|
501
|
+
node:
|
|
502
|
+
<terminal>npm install -g depcheck 2>/dev/null</terminal>
|
|
503
|
+
|
|
504
|
+
<terminal>depcheck 2>/dev/null || echo "depcheck not available"</terminal>
|
|
505
|
+
|
|
506
|
+
<terminal>npx depcheck 2>/dev/null</terminal>
|
|
507
|
+
|
|
508
|
+
<terminal>npm ls --depth=0 2>/dev/null</terminal>
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
find dev dependencies in production
|
|
512
|
+
|
|
513
|
+
python:
|
|
514
|
+
<terminal>grep -i "pytest\|test\|lint\|black\|flake8\|mypy" requirements.txt 2>/dev/null</terminal>
|
|
515
|
+
|
|
516
|
+
node:
|
|
517
|
+
<terminal>cat package.json 2>/dev/null | grep -A20 '"dependencies"' | grep -E "jest|test|vitest|cypress|eslint|prettier|webpack"</terminal>
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
find duplicate functionality
|
|
521
|
+
|
|
522
|
+
multiple http clients:
|
|
523
|
+
<terminal>grep -r "requests\|httpx\|urllib\|aiohttp" --include="*.py" . 2>/dev/null | wc -l</terminal>
|
|
524
|
+
|
|
525
|
+
multiple cli frameworks:
|
|
526
|
+
<terminal>grep -r "click\|typer\|argparse\|fire" --include="*.py" . 2>/dev/null | wc -l</terminal>
|
|
527
|
+
|
|
528
|
+
multiple testing frameworks:
|
|
529
|
+
<terminal>grep -r "pytest\|unittest\|nose" --include="*.py" . 2>/dev/null | wc -l</terminal>
|
|
530
|
+
|
|
531
|
+
node:
|
|
532
|
+
<terminal>cat package.json 2>/dev/null | grep -E "lodash|underscore|ramda"</terminal>
|
|
533
|
+
|
|
534
|
+
<terminal>cat package.json 2>/dev/null | grep -E "moment|date-fns|dayjs|luxon"</terminal>
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
document unused dependencies
|
|
538
|
+
|
|
539
|
+
potentially unused:
|
|
540
|
+
- [package] - [not imported, 0 references]
|
|
541
|
+
|
|
542
|
+
dev deps in production:
|
|
543
|
+
- [package] - [should be devdependency]
|
|
544
|
+
|
|
545
|
+
duplicate functionality:
|
|
546
|
+
- [package 1] + [package 2] - [same purpose]
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
PHASE 6: DEPENDENCY SIZE ANALYSIS
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
analyze bundle/package size
|
|
553
|
+
|
|
554
|
+
node:
|
|
555
|
+
<terminal>npm install -g cost-of-modules 2>/dev/null</terminal>
|
|
556
|
+
|
|
557
|
+
<terminal>cost-of-modules 2>/dev/null || npx cost-of-modules 2>/dev/null</terminal>
|
|
558
|
+
|
|
559
|
+
<terminal>du -sh node_modules/ 2>/dev/null</terminal>
|
|
560
|
+
|
|
561
|
+
find largest packages:
|
|
562
|
+
<terminal>du -sh node_modules/*/ 2>/dev/null | sort -rh | head -20</terminal>
|
|
563
|
+
|
|
564
|
+
python:
|
|
565
|
+
<terminal>pip install pip-disk 2>/dev/null</terminal>
|
|
566
|
+
|
|
567
|
+
<terminal>pip disk 2>/dev/null || echo "pip-disk not available"</terminal>
|
|
568
|
+
|
|
569
|
+
find largest packages:
|
|
570
|
+
<terminal>pip show -f [package-name] 2>/dev/null | grep "Location:" | head -1</terminal>
|
|
571
|
+
|
|
572
|
+
<terminal>du -sh $(pip show [package-name] 2>/dev/null | grep Location: | cut -d' ' -f2)/*/[package-name]* 2>/dev/null</terminal>
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
find oversized dependencies
|
|
576
|
+
|
|
577
|
+
node:
|
|
578
|
+
<terminal>ls -lh node_modules/ | head -30</terminal>
|
|
579
|
+
|
|
580
|
+
check for webpacked dependencies:
|
|
581
|
+
<terminal>find node_modules -name "*.umd.min.js" -o -name "*.bundle.js" 2>/dev/null | xargs ls -lh 2>/dev/null | head -20</terminal>
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
check for tree-shaking potential
|
|
585
|
+
|
|
586
|
+
node:
|
|
587
|
+
<terminal>cat package.json 2>/dev/null | grep -A50 '"dependencies"' | grep -E "lodash|moment"</terminal>
|
|
588
|
+
|
|
589
|
+
lodash individual imports vs full:
|
|
590
|
+
<terminal>grep -r "from 'lodash'" --include="*.js" --include="*.ts" . 2>/dev/null | wc -l</terminal>
|
|
591
|
+
|
|
592
|
+
<terminal>grep -r "from 'lodash/" --include="*.js" --include="*.ts" . 2>/dev/null | wc -l</terminal>
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
document size findings
|
|
596
|
+
|
|
597
|
+
total dependency size: [disk usage]
|
|
598
|
+
|
|
599
|
+
largest packages:
|
|
600
|
+
- [package] - [size] - [purpose]
|
|
601
|
+
|
|
602
|
+
optimization opportunities:
|
|
603
|
+
- [package] - [lighter alternative available]
|
|
604
|
+
|
|
605
|
+
|
|
606
|
+
PHASE 7: TRANSITIVE DEPENDENCY ANALYZIS
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
visualize dependency trees
|
|
610
|
+
|
|
611
|
+
python:
|
|
612
|
+
<terminal>pipdeptree --graph 2>/dev/null | head -50</terminal>
|
|
613
|
+
|
|
614
|
+
<terminal>pipdeptree --packages 2>/dev/null | head -30</terminal>
|
|
615
|
+
|
|
616
|
+
node:
|
|
617
|
+
<terminal>npm ls 2>/dev/null | head -50</terminal>
|
|
618
|
+
|
|
619
|
+
<terminal>npm ls --json 2>/dev/null | head -100</terminal>
|
|
620
|
+
|
|
621
|
+
rust:
|
|
622
|
+
<terminal>cargo tree 2>/dev/null | head -50</terminal>
|
|
623
|
+
|
|
624
|
+
<terminal>cargo tree --duplicates 2>/dev/null</terminal>
|
|
625
|
+
|
|
626
|
+
|
|
627
|
+
find duplicate dependencies
|
|
628
|
+
|
|
629
|
+
rust:
|
|
630
|
+
<terminal>cargo tree --duplicates 2>/dev/null</terminal>
|
|
631
|
+
|
|
632
|
+
node:
|
|
633
|
+
<terminal>npm ls --json 2>/dev/null | grep -E '"deduped"' | wc -l</terminal>
|
|
634
|
+
|
|
635
|
+
python:
|
|
636
|
+
<terminal>pipdeptree --json 2>/dev/null | grep -E '"key".*:"[^"]+",' | sort | uniq -d</terminal>
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
find conflicting version requirements
|
|
640
|
+
|
|
641
|
+
python:
|
|
642
|
+
<terminal>pip install pip-check 2>/dev/null</terminal>
|
|
643
|
+
|
|
644
|
+
<terminal>pip-check 2>/dev/null || echo "pip-check not available"</terminal>
|
|
645
|
+
|
|
646
|
+
node:
|
|
647
|
+
<terminal>npm ls --json 2>/dev/null | grep -A2 '"extraneous"'</terminal>
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
identify dependency hell risks
|
|
651
|
+
|
|
652
|
+
circular dependency indicators:
|
|
653
|
+
<terminal>pipdeptree --graph 2>/dev/null | grep -B2 -A2 "cycle"</terminal>
|
|
654
|
+
|
|
655
|
+
version conflicts:
|
|
656
|
+
<terminal>pipdeptree --packages --json 2>/dev/null | python -c "import sys,json; d=json.load(sys.stdin); [print(p['key']) for p in d if p.get('dependencies')]" 2>/dev/null</terminal>
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
document transitive issues
|
|
660
|
+
|
|
661
|
+
dependency depth:
|
|
662
|
+
- shallowest: [package] - [depth]
|
|
663
|
+
- deepest: [package] - [depth]
|
|
664
|
+
|
|
665
|
+
duplicate versions:
|
|
666
|
+
- [package] - [count of different versions]
|
|
667
|
+
|
|
668
|
+
version conflicts:
|
|
669
|
+
- [package 1] requires [package 2] [version a]
|
|
670
|
+
- [package 3] requires [package 2] [version b]
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
PHASE 8: SECURITY BEST PRACTICES REVIEW
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
check for hardcoded credentials in dependencies
|
|
677
|
+
|
|
678
|
+
scan node_modules for secrets:
|
|
679
|
+
<terminal>grep -r "api_key\|apikey\|api-key\|password\|secret\|token" node_modules/ 2>/dev/null | grep -v node_modules/.bin | head -20</terminal>
|
|
680
|
+
|
|
681
|
+
scan site-packages for secrets:
|
|
682
|
+
<terminal>grep -r "api_key\|apikey\|api-key\|password\|secret\|token" $(pip show pip 2>/dev/null | grep Location | cut -d' ' -f2) 2>/dev/null | head -20</terminal>
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
check for known malicious packages
|
|
686
|
+
|
|
687
|
+
python:
|
|
688
|
+
<terminal>pip-audit --no-deps 2>/dev/null</terminal>
|
|
689
|
+
|
|
690
|
+
cross-reference with:
|
|
691
|
+
- https://github.com/pypa/advisory-database
|
|
692
|
+
- https://pysec.io
|
|
693
|
+
|
|
694
|
+
node:
|
|
695
|
+
<terminal>npm audit 2>/dev/null</terminal>
|
|
696
|
+
|
|
697
|
+
cross-reference with:
|
|
698
|
+
- https://github.com/nodejs/security-wg
|
|
699
|
+
- https://npmjs.com/advisories
|
|
700
|
+
|
|
701
|
+
|
|
702
|
+
check for typosquatting attacks
|
|
703
|
+
|
|
704
|
+
look for suspicious package names:
|
|
705
|
+
- slight misspellings of popular packages
|
|
706
|
+
- packages with similar names to official ones
|
|
707
|
+
|
|
708
|
+
python:
|
|
709
|
+
<terminal>pip list 2>/dev/null | grep -E "requets|reqeusts|djanggo|flaskk|numpyy"</terminal>
|
|
710
|
+
|
|
711
|
+
node:
|
|
712
|
+
<terminal>npm ls 2>/dev/null | grep -E "expreess|reactt|nodemonn|babel|wekpack"</terminal>
|
|
713
|
+
|
|
714
|
+
verify official packages:
|
|
715
|
+
<terminal>npm view [package-name] 2>/dev/null | grep -E "author|maintainer|license"</terminal>
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
check for scripts in dependencies
|
|
719
|
+
|
|
720
|
+
node - examine install scripts:
|
|
721
|
+
<terminal>cat node_modules/[package-name]/package.json 2>/dev/null | grep -A10 '"scripts"'</terminal>
|
|
722
|
+
|
|
723
|
+
<terminal>find node_modules -name "package.json" -exec grep -l "preinstall\|postinstall\|prepublish" {} \; 2>/dev/null | head -20</terminal>
|
|
724
|
+
|
|
725
|
+
python - check for post-install hooks:
|
|
726
|
+
<terminal>pip show -f [package-name] 2>/dev/null | grep -E "\.exe$|\.sh$|\.bat$"</terminal>
|
|
727
|
+
|
|
728
|
+
|
|
729
|
+
document security concerns
|
|
730
|
+
|
|
731
|
+
critical vulnerabilities:
|
|
732
|
+
- [cve-id] - [package] - [severity] - [exploitability]
|
|
733
|
+
|
|
734
|
+
suspicious packages:
|
|
735
|
+
- [package] - [reason for concern]
|
|
736
|
+
|
|
737
|
+
risky scripts:
|
|
738
|
+
- [package] - [script type] - [what it does]
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
PHASE 9: SUPPLY CHAIN ANALYSIS
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
check for signed packages
|
|
745
|
+
|
|
746
|
+
python:
|
|
747
|
+
<terminal>pip install -q certifi 2>/dev/null</terminal>
|
|
748
|
+
|
|
749
|
+
check if downloads are verified:
|
|
750
|
+
<terminal>pip install [package-name] --dry-run --verbose 2>/dev/null | grep -i "verified\|signed"</terminal>
|
|
751
|
+
|
|
752
|
+
node:
|
|
753
|
+
<terminal>npm config get registry 2>/dev/null</terminal>
|
|
754
|
+
|
|
755
|
+
<terminal>npm audit --json 2>/dev/null | grep -i "integrity"</terminal>
|
|
756
|
+
|
|
757
|
+
|
|
758
|
+
check for checksum verification
|
|
759
|
+
|
|
760
|
+
verify package integrity:
|
|
761
|
+
<terminal>cat package-lock.json 2>/dev/null | grep -i "integrity\|sha512"</terminal>
|
|
762
|
+
|
|
763
|
+
<terminal>cat yarn.lock 2>/dev/null | grep -i "checksum\|integrity"</terminal>
|
|
764
|
+
|
|
765
|
+
<terminal>cat Cargo.lock 2>/dev/null | grep -i "checksum"</terminal>
|
|
766
|
+
|
|
767
|
+
<terminal>cat go.sum 2>/dev/null | head -20</terminal>
|
|
768
|
+
|
|
769
|
+
|
|
770
|
+
check for provenance
|
|
771
|
+
|
|
772
|
+
node - npm provenance:
|
|
773
|
+
<terminal>npm view [package-name] --json 2>/dev/null | grep -E "provenance|attestation"</terminal>
|
|
774
|
+
|
|
775
|
+
python - PyPI provenance:
|
|
776
|
+
check package page on pypi.org for provenance badges
|
|
777
|
+
|
|
778
|
+
|
|
779
|
+
identify subdependency risks
|
|
780
|
+
|
|
781
|
+
scan for dependencies from unknown sources:
|
|
782
|
+
<terminal>pipdeptree --json 2>/dev/null | python -c "import sys,json; d=json.load(sys.stdin); deps=set(); [deps.add(p.get('package_name','')) for p in d]; print('\n'.join(sorted(deps)))" 2>/dev/null</terminal>
|
|
783
|
+
|
|
784
|
+
check registry sources:
|
|
785
|
+
<terminal>cat .npmrc 2>/dev/null | grep -i registry</terminal>
|
|
786
|
+
|
|
787
|
+
<terminal>cat pip.conf 2>/dev/null || cat pip.ini 2>/dev/null || cat ~/.pip/pip.conf 2>/dev/null | grep -i index-url</terminal>
|
|
788
|
+
|
|
789
|
+
|
|
790
|
+
document supply chain status
|
|
791
|
+
|
|
792
|
+
verified packages: [count] / [total]
|
|
793
|
+
|
|
794
|
+
unsigned packages:
|
|
795
|
+
- [package] - [no signature]
|
|
796
|
+
|
|
797
|
+
registry security:
|
|
798
|
+
- source registry: [url]
|
|
799
|
+
- tls: [yes/no]
|
|
800
|
+
- verified: [yes/no]
|
|
801
|
+
|
|
802
|
+
|
|
803
|
+
PHASE 10: COMPLIANCE AND POLICY CHECKS
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
check against organizational policies
|
|
807
|
+
|
|
808
|
+
common policy violations:
|
|
809
|
+
|
|
810
|
+
gpl/agpl in commercial products:
|
|
811
|
+
<terminal>pip-licenses --grep=gpl --fail-on="gpl" 2>/dev/null || echo "no gpl found"</terminal>
|
|
812
|
+
|
|
813
|
+
weak cryptographic algorithms:
|
|
814
|
+
<terminal>grep -r "md5\|sha1" --include="*.py" --include="*.js" . 2>/dev/null | wc -l</terminal>
|
|
815
|
+
|
|
816
|
+
deprecated tls versions:
|
|
817
|
+
<terminal>grep -r "tlsv1\|tlsv1\.1" --include="*.py" --include="*.js" . 2>/dev/null | wc -l</terminal>
|
|
818
|
+
|
|
819
|
+
|
|
820
|
+
check for data collection/telemetry
|
|
821
|
+
|
|
822
|
+
scan for telemetry code:
|
|
823
|
+
<terminal>grep -r "telemetry\|analytics\|segment\|mixpanel\|amplitude" --include="*.py" --include="*.js" node_modules/ site-packages/ 2>/dev/null | grep -v "__pycache__" | head -20</terminal>
|
|
824
|
+
|
|
825
|
+
check package metadata:
|
|
826
|
+
<terminal>npm view [package-name] --json 2>/dev/null | grep -E "segment|analytics|telemetry"</terminal>
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
check for gdpr/ccpa compliance
|
|
830
|
+
|
|
831
|
+
identify data processing packages:
|
|
832
|
+
<terminal>pip list 2>/dev/null | grep -i "analytics|tracking|monitoring|telemetry"</terminal>
|
|
833
|
+
|
|
834
|
+
check privacy policy references:
|
|
835
|
+
<terminal>grep -r "privacy\|gdpr\|data.*collect" node_modules/*/README.md 2>/dev/null | head -10</terminal>
|
|
836
|
+
|
|
837
|
+
|
|
838
|
+
document compliance status
|
|
839
|
+
|
|
840
|
+
policy compliance:
|
|
841
|
+
- gpl-free: [yes/no]
|
|
842
|
+
- encryption standards: [met/violated]
|
|
843
|
+
- telemetry: [present/absent]
|
|
844
|
+
- data collection: [identified packages]
|
|
845
|
+
|
|
846
|
+
legal risks:
|
|
847
|
+
- [package] - [license] - [restriction]
|
|
848
|
+
|
|
849
|
+
|
|
850
|
+
PHASE 11: AUDIT REPORT TEMPLATE
|
|
851
|
+
|
|
852
|
+
|
|
853
|
+
use this template to structure your findings:
|
|
854
|
+
|
|
855
|
+
|
|
856
|
+
dependency audit report
|
|
857
|
+
generated: [timestamp]
|
|
858
|
+
|
|
859
|
+
|
|
860
|
+
summary:
|
|
861
|
+
total dependencies: [direct] + [transitive]
|
|
862
|
+
critical vulnerabilities: [count]
|
|
863
|
+
high vulnerabilities: [count]
|
|
864
|
+
license issues: [count]
|
|
865
|
+
outdated packages: [count]
|
|
866
|
+
|
|
867
|
+
|
|
868
|
+
vulnerability findings:
|
|
869
|
+
|
|
870
|
+
critical:
|
|
871
|
+
- [cve-id] - [package] [version] - [description] - [fix version]
|
|
872
|
+
|
|
873
|
+
high:
|
|
874
|
+
- [cve-id] - [package] [version] - [description] - [fix version]
|
|
875
|
+
|
|
876
|
+
medium:
|
|
877
|
+
- [cve-id] - [package] [version] - [description] - [fix version]
|
|
878
|
+
|
|
879
|
+
low:
|
|
880
|
+
- [cve-id] - [package] [version] - [description] - [fix version]
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
license compliance:
|
|
884
|
+
|
|
885
|
+
project license: [type]
|
|
886
|
+
|
|
887
|
+
dependency licenses:
|
|
888
|
+
- mit: [count]
|
|
889
|
+
- apache-2.0: [count]
|
|
890
|
+
- bsd: [count]
|
|
891
|
+
- gpl/gplv3/lgpl: [count] - [list if any]
|
|
892
|
+
- other: [count]
|
|
893
|
+
|
|
894
|
+
compatibility concerns:
|
|
895
|
+
- [package] - [license] - [issue]
|
|
896
|
+
|
|
897
|
+
|
|
898
|
+
freshness assessment:
|
|
899
|
+
|
|
900
|
+
severely outdated (major versions):
|
|
901
|
+
- [package] - [current] - [latest] - [risk]
|
|
902
|
+
|
|
903
|
+
unmaintained:
|
|
904
|
+
- [package] - [last update] - [impact]
|
|
905
|
+
|
|
906
|
+
deprecated:
|
|
907
|
+
- [package] - [replacement]
|
|
908
|
+
|
|
909
|
+
|
|
910
|
+
unused/unnecessary:
|
|
911
|
+
|
|
912
|
+
unused dependencies:
|
|
913
|
+
- [package] - [no imports found]
|
|
914
|
+
|
|
915
|
+
dev deps in production:
|
|
916
|
+
- [package] - [should be devdependency]
|
|
917
|
+
|
|
918
|
+
duplicate functionality:
|
|
919
|
+
- [package 1] + [package 2] - [both do x]
|
|
920
|
+
|
|
921
|
+
|
|
922
|
+
size analysis:
|
|
923
|
+
|
|
924
|
+
total dependency size: [disk usage]
|
|
925
|
+
|
|
926
|
+
largest packages:
|
|
927
|
+
- [package] - [size]
|
|
928
|
+
|
|
929
|
+
optimization candidates:
|
|
930
|
+
- [package] - [lighter alternative]
|
|
931
|
+
|
|
932
|
+
|
|
933
|
+
supply chain:
|
|
934
|
+
|
|
935
|
+
signed packages: [count] / [total]
|
|
936
|
+
|
|
937
|
+
verified integrity: [yes/no]
|
|
938
|
+
|
|
939
|
+
suspicious packages:
|
|
940
|
+
- [package] - [concern]
|
|
941
|
+
|
|
942
|
+
|
|
943
|
+
recommendations:
|
|
944
|
+
|
|
945
|
+
immediate actions:
|
|
946
|
+
[1] [action] - [package affected]
|
|
947
|
+
[2] [action] - [package affected]
|
|
948
|
+
|
|
949
|
+
short term:
|
|
950
|
+
[1] [action] - [reason]
|
|
951
|
+
[2] [action] - [reason]
|
|
952
|
+
|
|
953
|
+
long term:
|
|
954
|
+
[1] [action] - [reason]
|
|
955
|
+
|
|
956
|
+
|
|
957
|
+
PHASE 12: AUDIT RULES (STRICT MODE)
|
|
958
|
+
|
|
959
|
+
|
|
960
|
+
while this skill is active, these rules are MANDATORY:
|
|
961
|
+
|
|
962
|
+
[1] NEVER modify files
|
|
963
|
+
research agent only reads and reports
|
|
964
|
+
use <terminal> and <read> tags only
|
|
965
|
+
no <edit> or <create> tags
|
|
966
|
+
|
|
967
|
+
[2] never auto-fix vulnerabilities
|
|
968
|
+
report findings only
|
|
969
|
+
let the user decide remediation
|
|
970
|
+
note available fixes
|
|
971
|
+
|
|
972
|
+
[3] verify findings from multiple sources
|
|
973
|
+
cross-reference vulnerability databases
|
|
974
|
+
check advisory links
|
|
975
|
+
confirm severity ratings
|
|
976
|
+
|
|
977
|
+
[4] document evidence
|
|
978
|
+
include cve ids
|
|
979
|
+
include advisory links
|
|
980
|
+
include version numbers
|
|
981
|
+
|
|
982
|
+
[5] prioritize by risk
|
|
983
|
+
critical > high > medium > low
|
|
984
|
+
consider exploitability
|
|
985
|
+
consider project exposure
|
|
986
|
+
|
|
987
|
+
[6] note uncertainty
|
|
988
|
+
if tool is unavailable, say so
|
|
989
|
+
if check cannot be performed, explain why
|
|
990
|
+
distinguish between confirmed and suspected issues
|
|
991
|
+
|
|
992
|
+
[7] be thorough but concise
|
|
993
|
+
scan all dependencies
|
|
994
|
+
summarize findings in report
|
|
995
|
+
include actionable recommendations
|
|
996
|
+
|
|
997
|
+
|
|
998
|
+
FINAL REMINDERS
|
|
999
|
+
|
|
1000
|
+
|
|
1001
|
+
dependency auditing is security reconnaissance
|
|
1002
|
+
|
|
1003
|
+
you are finding risks, not fixing them.
|
|
1004
|
+
clear reporting enables remediation.
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
context matters
|
|
1008
|
+
|
|
1009
|
+
a vulnerability in a dev-only tool
|
|
1010
|
+
is different from one in production code.
|
|
1011
|
+
consider usage context when reporting.
|
|
1012
|
+
|
|
1013
|
+
|
|
1014
|
+
the report drives action
|
|
1015
|
+
|
|
1016
|
+
prioritize clearly.
|
|
1017
|
+
provide evidence.
|
|
1018
|
+
include fix information.
|
|
1019
|
+
|
|
1020
|
+
|
|
1021
|
+
you enable security
|
|
1022
|
+
|
|
1023
|
+
your thoroughness prevents breaches.
|
|
1024
|
+
your attention to detail protects users.
|
|
1025
|
+
your reporting informs decisions.
|
|
1026
|
+
|
|
1027
|
+
now go audit some dependencies.
|