relsec 0.1.0 → 0.1.1

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.
package/README.md CHANGED
@@ -1,185 +1,185 @@
1
- # relevant
2
-
3
- [![CI](https://github.com/MistanKh/relsec/actions/workflows/ci.yml/badge.svg)](https://github.com/MistanKh/relsec/actions/workflows/ci.yml)
4
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
5
- [![Node.js >=20](https://img.shields.io/badge/node-%3E%3D20-339933.svg)](package.json)
6
-
7
- Local-first security relevance for CVEs, advisories, IOCs, dependencies, logs, and service exposure.
8
-
9
- `relevant` helps answer the question most scanners leave to humans:
10
-
11
- > Does this finding actually matter in this environment?
12
-
13
- It is an open-source alpha for security engineers, AppSec teams, SOC analysts, platform teams, and curious builders who want evidence-first triage without sending code, logs, or inventories to a hosted service.
14
-
15
- The package name is `relsec`, and the CLI is exposed as both `relevant` and `relsec`.
16
-
17
- ## The Problem
18
-
19
- Modern teams receive security findings faster than they can investigate them:
20
-
21
- - A scanner says a dependency is vulnerable.
22
- - A vendor advisory says a package needs urgent patching.
23
- - A threat feed publishes IPs, domains, hashes, or other indicators.
24
- - A SOC alert references activity that may or may not exist in local logs.
25
- - A spreadsheet says a service is internet-facing, but nobody is sure which repo owns it.
26
-
27
- The hard part is not seeing the alert. The hard part is proving whether it matters in your environment.
28
-
29
- For example, imagine a critical upload-library CVE lands during a release freeze. A scanner flags `multer` somewhere in your monorepo. Before waking up every service owner, you need answers:
30
-
31
- - Which service actually has the vulnerable version?
32
- - Is that service internet-facing or internal-only?
33
- - Is the vulnerable upload API used in source code?
34
- - What evidence can be pasted into a ticket?
35
- - What should be done next?
36
-
37
- `relevant` turns that into a local evidence-gathering workflow instead of a meeting.
38
-
39
- ## What This Tool Does
40
-
41
- `relevant` reads local files and connects several pieces of security context:
42
-
43
- | Input | What it uses it for |
44
- | --- | --- |
45
- | Dependency manifests | Finds vulnerable package versions in `package-lock.json`, `requirements.txt`, and SBOM files. |
46
- | Advisory data | Maps CVEs, GHSA IDs, or imported OSV records to affected packages, ranges, and risky symbols. |
47
- | Service inventory | Understands whether a service is internet-facing, partner-facing, internal, or unknown. |
48
- | Source code | Searches for vulnerable symbols or APIs that make a package actually reachable. |
49
- | Logs | Matches IOCs against local log files, including gzip-compressed logs. |
50
- | Reports | Produces terminal, JSON, JSONL, Markdown, and SARIF output for humans and automation. |
51
-
52
- It does not try to replace a scanner. It helps explain scanner output with local evidence.
53
-
54
- ## Real-World Examples
55
-
56
- ### Example 1: Triage A Dependency CVE
57
-
58
- You receive a CVE for a vulnerable upload parser. Your scanner reports that `multer` exists somewhere in the repo.
59
-
60
- Run:
61
-
62
- ```bash
63
- relevant cve CVE-2026-41001 \
64
- --workspace examples/enterprise \
65
- --inventory examples/enterprise/security/inventory.json \
66
- --format markdown
67
- ```
68
-
69
- `relevant` checks:
70
-
71
- 1. Is there a local advisory record for the CVE?
72
- 2. Which package and version range are affected?
73
- 3. Which services contain the vulnerable package version?
74
- 4. Are those services exposed?
75
- 5. Does source code reference vulnerable symbols such as `upload.single` or `multer(`?
76
-
77
- Example result:
78
-
79
- ```txt
80
- CVE-2026-41001: relevant (critical)
81
-
82
- Evidence:
83
- - Found multer 1.4.4 in services/checkout-api/package-lock.json.
84
- - Reachable symbol upload.single in src/uploads.ts.
85
- - checkout-api has public ingress: https://checkout.example.com/v1/receipts.
86
-
87
- Recommended actions:
88
- - Upgrade multer to >=1.4.5-lts.1.
89
- - Restrict public upload endpoints until patched.
90
- - Search access logs for unusual multipart upload paths.
91
- ```
92
-
93
- That output gives AppSec, engineering, and incident response a shared artifact: vulnerable dependency, reachable code path, exposed service, and suggested next actions.
94
-
95
- ### Example 2: Check Whether Threat Indicators Appear In Logs
96
-
97
- A threat report publishes suspicious IPs and domains. You want to know whether those indicators appear in local Okta, proxy, CloudTrail, or server logs.
98
-
99
- Run:
100
-
101
- ```bash
102
- relevant ioc \
103
- --indicators examples/enterprise/security/cisa-aa26-141a.iocs \
104
- --logs examples/enterprise/security/logs/okta-auth-prod-2026-05-21.log \
105
- --logs examples/enterprise/security/logs/zscaler-web-prod-2026-05-21.log \
106
- --format json
107
- ```
108
-
109
- Example result:
110
-
111
- ```json
112
- {
113
- "totalMatches": 2,
114
- "matches": [
115
- {
116
- "indicator": "203.0.113.77",
117
- "type": "ip",
118
- "line": 3
119
- },
120
- {
121
- "indicator": "evil-update.example",
122
- "type": "domain",
123
- "line": 1
124
- }
125
- ]
126
- }
127
- ```
128
-
129
- That helps a SOC analyst quickly move from "this IOC exists in a feed" to "this IOC appears in these local files on these lines."
130
-
131
- ### Example 3: Build A Local Advisory File From OSV
132
-
133
- When you want broader advisory coverage, import OSV records for dependencies found in your inventory:
134
-
135
- ```bash
136
- relevant import osv \
137
- --workspace examples/enterprise \
138
- --inventory examples/enterprise/security/inventory.json \
139
- --output examples/enterprise/security/osv-advisories.json
140
- ```
141
-
142
- After that, later CVE/GHSA checks can use the local file without calling OSV again:
143
-
144
- ```bash
145
- relevant cve GHSA-example-id \
146
- --workspace examples/enterprise \
147
- --inventory examples/enterprise/security/inventory.json \
148
- --advisories examples/enterprise/security/osv-advisories.json
149
- ```
150
-
151
- ## Status
152
-
153
- This project is a **developer preview**. It is useful today for local experiments, demos, evidence collection, and early workflow design, but it is not a replacement for a vulnerability management platform, SIEM, SCA product, or incident response process.
154
-
155
- What is ready:
156
-
157
- - Deterministic local CVE relevance checks.
158
- - Local IOC matching across plain and gzip logs.
159
- - Service exposure inventory support.
160
- - Reachability evidence from source-code symbol search.
161
- - Explicit OSV advisory import.
162
- - JSON, JSONL, Markdown, SARIF, and terminal output.
163
- - Interactive command shell with profiles, history, completions, modules, and exports.
164
- - Cross-platform CI for Node 20 and 22 on Linux, macOS, and Windows.
165
-
166
- What is still evolving:
167
-
168
- - OSV multi-affected and multi-range normalization.
169
- - NVD and CISA KEV import.
170
- - Deeper SBOM support.
171
- - Docker image and Kubernetes exposure analysis.
172
- - Full YARA and Sigma engines.
173
- - More precise reachability analysis.
174
-
175
- ## Design Goals
176
-
177
- - Local-first by default.
178
- - Evidence over opaque risk scores.
179
- - Small enough to inspect.
180
- - Useful in terminals, scripts, tickets, and CI jobs.
181
- - Honest about uncertainty and limitations.
182
-
1
+ # relevant
2
+
3
+ [![CI](https://github.com/MistanKh/relsec/actions/workflows/ci.yml/badge.svg)](https://github.com/MistanKh/relsec/actions/workflows/ci.yml)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
5
+ [![Node.js >=20](https://img.shields.io/badge/node-%3E%3D20-339933.svg)](package.json)
6
+
7
+ Local-first security relevance for CVEs, advisories, IOCs, dependencies, logs, and service exposure.
8
+
9
+ `relevant` helps answer the question most scanners leave to humans:
10
+
11
+ > Does this finding actually matter in this environment?
12
+
13
+ It is an open-source alpha for security engineers, AppSec teams, SOC analysts, platform teams, and curious builders who want evidence-first triage without sending code, logs, or inventories to a hosted service.
14
+
15
+ The package name is `relsec`, and the CLI is exposed as both `relevant` and `relsec`.
16
+
17
+ ## The Problem
18
+
19
+ Modern teams receive security findings faster than they can investigate them:
20
+
21
+ - A scanner says a dependency is vulnerable.
22
+ - A vendor advisory says a package needs urgent patching.
23
+ - A threat feed publishes IPs, domains, hashes, or other indicators.
24
+ - A SOC alert references activity that may or may not exist in local logs.
25
+ - A spreadsheet says a service is internet-facing, but nobody is sure which repo owns it.
26
+
27
+ The hard part is not seeing the alert. The hard part is proving whether it matters in your environment.
28
+
29
+ For example, imagine a critical upload-library CVE lands during a release freeze. A scanner flags `multer` somewhere in your monorepo. Before waking up every service owner, you need answers:
30
+
31
+ - Which service actually has the vulnerable version?
32
+ - Is that service internet-facing or internal-only?
33
+ - Is the vulnerable upload API used in source code?
34
+ - What evidence can be pasted into a ticket?
35
+ - What should be done next?
36
+
37
+ `relevant` turns that into a local evidence-gathering workflow instead of a meeting.
38
+
39
+ ## What This Tool Does
40
+
41
+ `relevant` reads local files and connects several pieces of security context:
42
+
43
+ | Input | What it uses it for |
44
+ | --- | --- |
45
+ | Dependency manifests | Finds vulnerable package versions in `package-lock.json`, `requirements.txt`, and SBOM files. |
46
+ | Advisory data | Maps CVEs, GHSA IDs, or imported OSV records to affected packages, ranges, and risky symbols. |
47
+ | Service inventory | Understands whether a service is internet-facing, partner-facing, internal, or unknown. |
48
+ | Source code | Searches for vulnerable symbols or APIs that make a package actually reachable. |
49
+ | Logs | Matches IOCs against local log files, including gzip-compressed logs. |
50
+ | Reports | Produces terminal, JSON, JSONL, Markdown, and SARIF output for humans and automation. |
51
+
52
+ It does not try to replace a scanner. It helps explain scanner output with local evidence.
53
+
54
+ ## Real-World Examples
55
+
56
+ ### Example 1: Triage A Dependency CVE
57
+
58
+ You receive a CVE for a vulnerable upload parser. Your scanner reports that `multer` exists somewhere in the repo.
59
+
60
+ Run:
61
+
62
+ ```bash
63
+ relevant cve CVE-2026-41001 \
64
+ --workspace examples/enterprise \
65
+ --inventory examples/enterprise/security/inventory.json \
66
+ --format markdown
67
+ ```
68
+
69
+ `relevant` checks:
70
+
71
+ 1. Is there a local advisory record for the CVE?
72
+ 2. Which package and version range are affected?
73
+ 3. Which services contain the vulnerable package version?
74
+ 4. Are those services exposed?
75
+ 5. Does source code reference vulnerable symbols such as `upload.single` or `multer(`?
76
+
77
+ Example result:
78
+
79
+ ```txt
80
+ CVE-2026-41001: relevant (critical)
81
+
82
+ Evidence:
83
+ - Found multer 1.4.4 in services/checkout-api/package-lock.json.
84
+ - Reachable symbol upload.single in src/uploads.ts.
85
+ - checkout-api has public ingress: https://checkout.example.com/v1/receipts.
86
+
87
+ Recommended actions:
88
+ - Upgrade multer to >=1.4.5-lts.1.
89
+ - Restrict public upload endpoints until patched.
90
+ - Search access logs for unusual multipart upload paths.
91
+ ```
92
+
93
+ That output gives AppSec, engineering, and incident response a shared artifact: vulnerable dependency, reachable code path, exposed service, and suggested next actions.
94
+
95
+ ### Example 2: Check Whether Threat Indicators Appear In Logs
96
+
97
+ A threat report publishes suspicious IPs and domains. You want to know whether those indicators appear in local Okta, proxy, CloudTrail, or server logs.
98
+
99
+ Run:
100
+
101
+ ```bash
102
+ relevant ioc \
103
+ --indicators examples/enterprise/security/cisa-aa26-141a.iocs \
104
+ --logs examples/enterprise/security/logs/okta-auth-prod-2026-05-21.log \
105
+ --logs examples/enterprise/security/logs/zscaler-web-prod-2026-05-21.log \
106
+ --format json
107
+ ```
108
+
109
+ Example result:
110
+
111
+ ```json
112
+ {
113
+ "totalMatches": 2,
114
+ "matches": [
115
+ {
116
+ "indicator": "203.0.113.77",
117
+ "type": "ip",
118
+ "line": 3
119
+ },
120
+ {
121
+ "indicator": "evil-update.example",
122
+ "type": "domain",
123
+ "line": 1
124
+ }
125
+ ]
126
+ }
127
+ ```
128
+
129
+ That helps a SOC analyst quickly move from "this IOC exists in a feed" to "this IOC appears in these local files on these lines."
130
+
131
+ ### Example 3: Build A Local Advisory File From OSV
132
+
133
+ When you want broader advisory coverage, import OSV records for dependencies found in your inventory:
134
+
135
+ ```bash
136
+ relevant import osv \
137
+ --workspace examples/enterprise \
138
+ --inventory examples/enterprise/security/inventory.json \
139
+ --output examples/enterprise/security/osv-advisories.json
140
+ ```
141
+
142
+ After that, later CVE/GHSA checks can use the local file without calling OSV again:
143
+
144
+ ```bash
145
+ relevant cve GHSA-example-id \
146
+ --workspace examples/enterprise \
147
+ --inventory examples/enterprise/security/inventory.json \
148
+ --advisories examples/enterprise/security/osv-advisories.json
149
+ ```
150
+
151
+ ## Status
152
+
153
+ This project is a **developer preview**. It is useful today for local experiments, demos, evidence collection, and early workflow design, but it is not a replacement for a vulnerability management platform, SIEM, SCA product, or incident response process.
154
+
155
+ What is ready:
156
+
157
+ - Deterministic local CVE relevance checks.
158
+ - Local IOC matching across plain and gzip logs.
159
+ - Service exposure inventory support.
160
+ - Reachability evidence from source-code symbol search.
161
+ - Explicit OSV advisory import.
162
+ - JSON, JSONL, Markdown, SARIF, and terminal output.
163
+ - Interactive command shell with profiles, history, completions, modules, and exports.
164
+ - Cross-platform CI for Node 20 and 22 on Linux, macOS, and Windows.
165
+
166
+ What is still evolving:
167
+
168
+ - OSV multi-affected and multi-range normalization.
169
+ - NVD and CISA KEV import.
170
+ - Deeper SBOM support.
171
+ - Docker image and Kubernetes exposure analysis.
172
+ - Full YARA and Sigma engines.
173
+ - More precise reachability analysis.
174
+
175
+ ## Design Goals
176
+
177
+ - Local-first by default.
178
+ - Evidence over opaque risk scores.
179
+ - Small enough to inspect.
180
+ - Useful in terminals, scripts, tickets, and CI jobs.
181
+ - Honest about uncertainty and limitations.
182
+
183
183
  ## Quick Start
184
184
 
185
185
  Install from npm:
@@ -196,16 +196,16 @@ npm install
196
196
  npm run build
197
197
  node dist/cli.js cve CVE-2026-41001 --workspace examples/enterprise --inventory examples/enterprise/security/inventory.json --format markdown
198
198
  ```
199
-
200
- Example output:
201
-
202
- ```txt
203
- CVE-2026-41001: relevant (critical)
204
- Multer multipart upload path traversal in file field handling: vulnerable package is reachable from an externally exposed service.
205
- ```
206
-
207
- ## Quick Command Examples
208
-
199
+
200
+ Example output:
201
+
202
+ ```txt
203
+ CVE-2026-41001: relevant (critical)
204
+ Multer multipart upload path traversal in file field handling: vulnerable package is reachable from an externally exposed service.
205
+ ```
206
+
207
+ ## Quick Command Examples
208
+
209
209
  Check whether a CVE matters locally:
210
210
 
211
211
  ```bash
@@ -213,8 +213,8 @@ npx relsec cve CVE-2026-41001 \
213
213
  --workspace examples/enterprise \
214
214
  --inventory examples/enterprise/security/inventory.json \
215
215
  --format markdown
216
- ```
217
-
216
+ ```
217
+
218
218
  Scan logs for indicators:
219
219
 
220
220
  ```bash
@@ -222,155 +222,155 @@ npx relsec ioc \
222
222
  --indicators examples/enterprise/security/cisa-aa26-141a.iocs \
223
223
  --logs examples/enterprise/security/logs/okta-auth-prod-2026-05-21.log \
224
224
  --logs examples/enterprise/security/logs/zscaler-web-prod-2026-05-21.log \
225
- --format json
226
- ```
227
-
225
+ --format json
226
+ ```
227
+
228
228
  Open the interactive console:
229
229
 
230
230
  ```bash
231
231
  npx relsec
232
232
  ```
233
-
234
- ## Commands
235
-
236
- ```bash
237
- relevant cve <CVE-ID> --workspace . --inventory security/inventory.json --format json
238
- relevant ioc --indicators indicators.txt --logs auth.log --logs proxy.log --format json
239
- relevant import osv --workspace . --inventory security/inventory.json --output security/osv-advisories.json
240
- relevant advisories
241
- relevant version
242
- relevant
243
- ```
244
-
245
- Output formats:
246
-
247
- - `text`
248
- - `json`
249
- - `jsonl`
250
- - `markdown`
251
- - `sarif`
252
-
253
- ## Interactive Console
254
-
255
- Run `relevant` with no arguments to open a REPL-style command shell. It keeps session context, supports command history, profiles, named workspaces, path completion, and module-style workflows.
256
-
257
- ```txt
258
- rel > set workspace examples/enterprise
259
- rel > set inventory examples/enterprise/security/inventory.json
260
- rel > scan CVE-2026-41001
261
- rel > evidence
262
- rel > actions
263
- rel > export markdown finding.md
264
- rel > set indicators examples/enterprise/security/cisa-aa26-141a.iocs
265
- rel > ioc examples/enterprise/security/logs/okta-auth-prod-2026-05-21.log
266
- rel > exit
267
- ```
268
-
269
- Module workflow:
270
-
271
- ```txt
272
- rel > use cve
273
- rel(cve) > set cve CVE-2026-41001
274
- rel(cve) > show options
275
- rel(cve) > run
276
- rel(cve) > back
277
- rel > show modules
278
- ```
279
-
280
- Available modules:
281
-
282
- - `cve`: dependency CVE relevance
283
- - `ioc`: IOC log matching
284
- - `exposure`: externally exposed services
285
- - `sbom`: dependency inventory
286
- - `secrets`: obvious local secret patterns
287
- - `cloudtrail`: CloudTrail triage heuristics
288
- - `auth`: identity/auth log triage heuristics
289
- - `yara`: simple YARA literal rules
290
- - `sigma`: simple Sigma keyword rules
291
-
292
- ## Example Environment
293
-
294
- `examples/enterprise` is a dummy environment for testing and demos:
295
-
296
- - `checkout-api`: internet-facing Node service with vulnerable reachable `multer` upload usage.
297
- - `ml-worker`: internal Python worker with a vulnerable package version but no vulnerable parser reachability.
298
- - Okta, Zscaler, and AWS CloudTrail-style logs.
299
- - CISA-style IOC list.
300
- - Service exposure inventory.
301
-
302
- No real customer data is included.
303
-
304
- ## Privacy Model
305
-
306
- Normal scans are local-first:
307
-
308
- - CVE analysis reads local manifests, inventories, source files, SBOMs, and advisory files.
309
- - IOC analysis reads local logs directly.
310
- - Reports are written locally.
311
- - No telemetry is collected.
312
- - No cloud API is used during normal scans.
313
-
314
- The `import osv` command is the one intentional networked workflow. It sends discovered package names, ecosystems, and versions to the configured OSV API endpoint, then writes normalized advisory records to a local file for later offline use.
315
-
316
- ## Limitations
317
-
318
- This is an alpha project with deliberate constraints:
319
-
320
- - CVE relevance depends on advisory quality, manifest coverage, inventory accuracy, and symbol search.
321
- - Reachability is currently evidence-oriented string matching, not full program analysis.
322
- - OSV import does not yet preserve every multi-affected or multi-range advisory shape.
323
- - YARA support handles literal string rules, not the full YARA language.
324
- - Sigma support handles simple keyword-style rules, not a full Sigma backend.
325
- - CloudTrail and auth modules are deterministic triage heuristics, not SIEM replacements.
326
- - Secret detection is heuristic and should not replace dedicated secret scanning.
327
- - Generated reports may contain sensitive local evidence.
328
-
329
- ## Development
330
-
331
- ```bash
332
- npm install
333
- npm run typecheck
334
- npm test
335
- npm run build
336
- ```
337
-
338
- Full local release gate:
339
-
340
- ```bash
341
- npm run release:check
342
- npm run pack:dry-run
343
- ```
344
-
345
- CI runs typecheck, tests, build, and package dry-run on Node 20 and 22 across Linux, macOS, and Windows.
346
-
347
- ## Contributing
348
-
349
- Contributions are welcome. Good first areas:
350
-
351
- - More fixture environments.
352
- - Additional advisory import formats.
353
- - Better SBOM parsing.
354
- - More report templates.
355
- - Safer scanner heuristics.
356
- - Documentation and examples.
357
-
358
- Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request.
359
-
360
- ## Roadmap
361
-
362
- - Preserve OSV multi-affected and multi-range records.
363
- - Add NVD and CISA KEV import.
364
- - Expand CycloneDX and SPDX support.
365
- - Add Docker image and Kubernetes manifest exposure analysis.
366
- - Add GitHub and Jira export templates.
367
- - Add optional local summarization through Ollama or LM Studio.
368
- - Improve reachability analysis while keeping the tool local-first.
369
-
370
- ## Security
371
-
372
- See [SECURITY.md](SECURITY.md) for the security model, network behavior, sensitive data guidance, and vulnerability reporting notes.
373
-
374
- ## License
375
-
376
- MIT. See [LICENSE](LICENSE).
233
+
234
+ ## Commands
235
+
236
+ ```bash
237
+ relevant cve <CVE-ID> --workspace . --inventory security/inventory.json --format json
238
+ relevant ioc --indicators indicators.txt --logs auth.log --logs proxy.log --format json
239
+ relevant import osv --workspace . --inventory security/inventory.json --output security/osv-advisories.json
240
+ relevant advisories
241
+ relevant version
242
+ relevant
243
+ ```
244
+
245
+ Output formats:
246
+
247
+ - `text`
248
+ - `json`
249
+ - `jsonl`
250
+ - `markdown`
251
+ - `sarif`
252
+
253
+ ## Interactive Console
254
+
255
+ Run `relevant` with no arguments to open a REPL-style command shell. It keeps session context, supports command history, profiles, named workspaces, path completion, and module-style workflows.
256
+
257
+ ```txt
258
+ rel > set workspace examples/enterprise
259
+ rel > set inventory examples/enterprise/security/inventory.json
260
+ rel > scan CVE-2026-41001
261
+ rel > evidence
262
+ rel > actions
263
+ rel > export markdown finding.md
264
+ rel > set indicators examples/enterprise/security/cisa-aa26-141a.iocs
265
+ rel > ioc examples/enterprise/security/logs/okta-auth-prod-2026-05-21.log
266
+ rel > exit
267
+ ```
268
+
269
+ Module workflow:
270
+
271
+ ```txt
272
+ rel > use cve
273
+ rel(cve) > set cve CVE-2026-41001
274
+ rel(cve) > show options
275
+ rel(cve) > run
276
+ rel(cve) > back
277
+ rel > show modules
278
+ ```
279
+
280
+ Available modules:
281
+
282
+ - `cve`: dependency CVE relevance
283
+ - `ioc`: IOC log matching
284
+ - `exposure`: externally exposed services
285
+ - `sbom`: dependency inventory
286
+ - `secrets`: obvious local secret patterns
287
+ - `cloudtrail`: CloudTrail triage heuristics
288
+ - `auth`: identity/auth log triage heuristics
289
+ - `yara`: simple YARA literal rules
290
+ - `sigma`: simple Sigma keyword rules
291
+
292
+ ## Example Environment
293
+
294
+ `examples/enterprise` is a dummy environment for testing and demos:
295
+
296
+ - `checkout-api`: internet-facing Node service with vulnerable reachable `multer` upload usage.
297
+ - `ml-worker`: internal Python worker with a vulnerable package version but no vulnerable parser reachability.
298
+ - Okta, Zscaler, and AWS CloudTrail-style logs.
299
+ - CISA-style IOC list.
300
+ - Service exposure inventory.
301
+
302
+ No real customer data is included.
303
+
304
+ ## Privacy Model
305
+
306
+ Normal scans are local-first:
307
+
308
+ - CVE analysis reads local manifests, inventories, source files, SBOMs, and advisory files.
309
+ - IOC analysis reads local logs directly.
310
+ - Reports are written locally.
311
+ - No telemetry is collected.
312
+ - No cloud API is used during normal scans.
313
+
314
+ The `import osv` command is the one intentional networked workflow. It sends discovered package names, ecosystems, and versions to the configured OSV API endpoint, then writes normalized advisory records to a local file for later offline use.
315
+
316
+ ## Limitations
317
+
318
+ This is an alpha project with deliberate constraints:
319
+
320
+ - CVE relevance depends on advisory quality, manifest coverage, inventory accuracy, and symbol search.
321
+ - Reachability is currently evidence-oriented string matching, not full program analysis.
322
+ - OSV import does not yet preserve every multi-affected or multi-range advisory shape.
323
+ - YARA support handles literal string rules, not the full YARA language.
324
+ - Sigma support handles simple keyword-style rules, not a full Sigma backend.
325
+ - CloudTrail and auth modules are deterministic triage heuristics, not SIEM replacements.
326
+ - Secret detection is heuristic and should not replace dedicated secret scanning.
327
+ - Generated reports may contain sensitive local evidence.
328
+
329
+ ## Development
330
+
331
+ ```bash
332
+ npm install
333
+ npm run typecheck
334
+ npm test
335
+ npm run build
336
+ ```
337
+
338
+ Full local release gate:
339
+
340
+ ```bash
341
+ npm run release:check
342
+ npm run pack:dry-run
343
+ ```
344
+
345
+ CI runs typecheck, tests, build, and package dry-run on Node 20 and 22 across Linux, macOS, and Windows.
346
+
347
+ ## Contributing
348
+
349
+ Contributions are welcome. Good first areas:
350
+
351
+ - More fixture environments.
352
+ - Additional advisory import formats.
353
+ - Better SBOM parsing.
354
+ - More report templates.
355
+ - Safer scanner heuristics.
356
+ - Documentation and examples.
357
+
358
+ Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request.
359
+
360
+ ## Roadmap
361
+
362
+ - Preserve OSV multi-affected and multi-range records.
363
+ - Add NVD and CISA KEV import.
364
+ - Expand CycloneDX and SPDX support.
365
+ - Add Docker image and Kubernetes manifest exposure analysis.
366
+ - Add GitHub and Jira export templates.
367
+ - Add optional local summarization through Ollama or LM Studio.
368
+ - Improve reachability analysis while keeping the tool local-first.
369
+
370
+ ## Security
371
+
372
+ See [SECURITY.md](SECURITY.md) for the security model, network behavior, sensitive data guidance, and vulnerability reporting notes.
373
+
374
+ ## License
375
+
376
+ MIT. See [LICENSE](LICENSE).
package/SECURITY.md CHANGED
@@ -1,36 +1,36 @@
1
- # Security and Privacy
2
-
3
- `relevant` is designed as a local-first security relevance CLI.
4
-
5
- ## Local-First Behavior
6
-
7
- - CVE relevance analysis runs against local manifests, inventory files, source files, SBOMs, and logs.
8
- - IOC scans read local log files directly.
9
- - No telemetry is collected.
10
- - No project files, logs, indicators, or results are uploaded by default.
11
-
12
- ## Network Access
13
-
14
- The current CLI does not make network requests during normal scans.
15
-
16
- The `import osv` command fetches public advisory data from OSV only when explicitly requested by the user. It sends discovered package names, ecosystems, and versions to the configured OSV API endpoint and writes the normalized advisory records to a local file for later offline scans.
17
-
18
- Future advisory import commands must document the target source and the identifiers being requested before they are enabled by default.
19
-
20
- ## Sensitive Data
21
-
22
- The tool may process sensitive local logs, secrets, inventories, and source code. Treat generated reports as sensitive unless reviewed.
23
-
24
- The `secrets` module redacts obvious secret values in output, but it is heuristic and not a substitute for a dedicated secret-scanning product.
25
-
26
- ## Detector Limitations
27
-
28
- - CVE relevance depends on available advisory data, manifest coverage, inventory accuracy, and simple symbol reachability.
29
- - YARA support currently handles literal string rules. It is not a full YARA engine.
30
- - Sigma support currently handles simple keyword-style rules. It is not a full Sigma backend.
31
- - CloudTrail and auth modules use deterministic heuristics for local triage.
32
- - False positives and false negatives are expected.
33
-
34
- ## Reporting Vulnerabilities
35
-
36
- Before public release, use private issue reporting in the repository or contact the maintainer directly. Do not publish exploit details until a fix is available.
1
+ # Security and Privacy
2
+
3
+ `relevant` is designed as a local-first security relevance CLI.
4
+
5
+ ## Local-First Behavior
6
+
7
+ - CVE relevance analysis runs against local manifests, inventory files, source files, SBOMs, and logs.
8
+ - IOC scans read local log files directly.
9
+ - No telemetry is collected.
10
+ - No project files, logs, indicators, or results are uploaded by default.
11
+
12
+ ## Network Access
13
+
14
+ The current CLI does not make network requests during normal scans.
15
+
16
+ The `import osv` command fetches public advisory data from OSV only when explicitly requested by the user. It sends discovered package names, ecosystems, and versions to the configured OSV API endpoint and writes the normalized advisory records to a local file for later offline scans.
17
+
18
+ Future advisory import commands must document the target source and the identifiers being requested before they are enabled by default.
19
+
20
+ ## Sensitive Data
21
+
22
+ The tool may process sensitive local logs, secrets, inventories, and source code. Treat generated reports as sensitive unless reviewed.
23
+
24
+ The `secrets` module redacts obvious secret values in output, but it is heuristic and not a substitute for a dedicated secret-scanning product.
25
+
26
+ ## Detector Limitations
27
+
28
+ - CVE relevance depends on available advisory data, manifest coverage, inventory accuracy, and simple symbol reachability.
29
+ - YARA support currently handles literal string rules. It is not a full YARA engine.
30
+ - Sigma support currently handles simple keyword-style rules. It is not a full Sigma backend.
31
+ - CloudTrail and auth modules use deterministic heuristics for local triage.
32
+ - False positives and false negatives are expected.
33
+
34
+ ## Reporting Vulnerabilities
35
+
36
+ Before public release, use private issue reporting in the repository or contact the maintainer directly. Do not publish exploit details until a fix is available.
package/dist/theme.js CHANGED
@@ -14,17 +14,14 @@ export const colors = {
14
14
  export function renderBanner(input) {
15
15
  const width = 76;
16
16
  return [
17
- `${colors.red}${colors.bold} __ __${colors.reset}`,
18
- `${colors.red}${colors.bold} _____ / /__ _ __ ___ _ ____ / /_${colors.reset}`,
19
- `${colors.red}${colors.bold} / ___// //_/| | / // _ \`// __// __/${colors.reset}`,
20
- `${colors.red}${colors.bold} / / / ,< | |/ // __// / / /_${colors.reset}`,
21
- `${colors.red}${colors.bold}/_/ /_/|_| |___/ \\___//_/ \\__/${colors.reset}`,
22
- `${colors.muted} relevant console · local-first security relevance${colors.reset}`,
23
- `${colors.muted}${'─'.repeat(width)}${colors.reset}`,
24
- `${colors.muted}workspace ${colors.reset}${colors.text}${input.workspace}${colors.reset}`,
25
- `${colors.muted}inventory ${colors.reset}${colors.text}${input.inventory ?? 'not set'}${colors.reset}`,
26
- `${colors.muted}${'─'.repeat(width)}${colors.reset}`,
27
- `${colors.muted}type ${colors.yellow}help${colors.muted} for commands, ${colors.yellow}exit${colors.muted} to quit${colors.reset}`,
17
+ `${colors.bold}${colors.text}relsec / relevant${colors.reset}`,
18
+ `${colors.muted}local-first security relevance${colors.reset}`,
19
+ divider(width),
20
+ labeledRow('Workspace', input.workspace),
21
+ labeledRow('Inventory', input.inventory ?? 'not set'),
22
+ labeledRow('Mode', 'interactive console'),
23
+ divider(width),
24
+ `${colors.muted}Use ${colors.yellow}help${colors.muted} for commands, ${colors.yellow}show options${colors.muted} for context, ${colors.yellow}exit${colors.muted} to quit.${colors.reset}`,
28
25
  ''
29
26
  ].join('\n');
30
27
  }
@@ -32,29 +29,34 @@ export function renderResultCard(result) {
32
29
  const badge = verdictBadge(result.verdict);
33
30
  const risk = riskBadge(result.risk);
34
31
  return [
35
- `${colors.bold}${colors.text}${result.subject}${colors.reset} ${badge} ${risk}`,
36
- `${colors.muted}${'─'.repeat(76)}${colors.reset}`,
37
- wrap(result.summary, 76),
32
+ `${colors.bold}${colors.text}${result.subject}${colors.reset}`,
33
+ `${colors.muted}Verdict${colors.reset} ${badge} ${colors.muted}Risk${colors.reset} ${risk}`,
34
+ divider(76),
35
+ section('Summary'),
36
+ indent(wrap(result.summary, 72)),
38
37
  '',
39
- `${colors.blue}${colors.bold}Affected${colors.reset}`,
40
- ...(result.affectedComponents.length > 0
41
- ? result.affectedComponents.map((component) => ` ${colors.muted}•${colors.reset} ${component}`)
42
- : [` ${colors.muted}• none${colors.reset}`]),
38
+ section('Affected Components'),
39
+ ...bulletList(result.affectedComponents, 'none'),
43
40
  '',
44
- `${colors.blue}${colors.bold}Evidence${colors.reset}`,
45
- ...result.evidence.map((item) => ` ${colors.muted}•${colors.reset} ${item}`),
41
+ section('Evidence'),
42
+ ...bulletList(result.evidence, 'none'),
46
43
  '',
47
- `${colors.blue}${colors.bold}Actions${colors.reset}`,
48
- ...result.recommendedActions.map((item) => ` ${colors.muted}•${colors.reset} ${item}`)
44
+ section('Recommended Actions'),
45
+ ...bulletList(result.recommendedActions, 'none')
49
46
  ].join('\n');
50
47
  }
51
48
  export function renderIocSummary(result) {
49
+ const rows = result.matches.map((match) => [
50
+ match.indicator,
51
+ match.type,
52
+ `${match.file}:${match.line}`,
53
+ match.text
54
+ ]);
52
55
  return [
53
- `${colors.bold}${colors.text}IOC matches${colors.reset} ${riskBadge(result.totalMatches > 0 ? 'high' : 'low')} ${result.totalMatches}`,
54
- `${colors.muted}${''.repeat(76)}${colors.reset}`,
55
- ...(result.matches.length > 0
56
- ? result.matches.map((match) => ` ${colors.muted}•${colors.reset} ${colors.yellow}${match.indicator}${colors.reset} ${colors.muted}${match.type}${colors.reset} ${match.file}:${match.line}`)
57
- : [` ${colors.muted}• no indicators matched${colors.reset}`])
56
+ `${colors.bold}${colors.text}IOC scan summary${colors.reset}`,
57
+ `${colors.muted}IOC matches${colors.reset} ${riskBadge(result.totalMatches > 0 ? 'high' : 'low')} ${colors.text}${result.totalMatches}${colors.reset}`,
58
+ divider(76),
59
+ ...(rows.length > 0 ? iocTable(rows) : [` ${colors.muted}No indicators matched.${colors.reset}`])
58
60
  ].join('\n');
59
61
  }
60
62
  export function renderStatus(input) {
@@ -69,24 +71,33 @@ export function renderStatus(input) {
69
71
  export function renderHelp() {
70
72
  return [
71
73
  `${colors.bold}${colors.text}Interactive commands${colors.reset}`,
72
- `${colors.muted}${'─'.repeat(76)}${colors.reset}`,
73
- table([
74
+ divider(76),
75
+ commandSection('Context', [
74
76
  ['set workspace <path>', 'set repo/environment root'],
75
77
  ['set inventory <path>', 'set service exposure inventory'],
76
78
  ['set indicators <path>', 'set IOC list'],
77
79
  ['set format <text|json|markdown>', 'change output mode'],
78
80
  ['set logdir <dir> / set logglob <glob>', 'discover log files for hunts'],
79
81
  ['set target <path> / set rule <path>', 'set target/rule for scanner modules'],
82
+ ['show options/modules/advisories', 'inspect console state']
83
+ ]),
84
+ '',
85
+ commandSection('Scanning', [
80
86
  ['use <module>', 'select cve/ioc/exposure/sbom/secrets/cloudtrail/auth/yara/sigma'],
81
- ['show options/modules/advisories', 'inspect console state'],
82
87
  ['run', 'execute selected module'],
83
88
  ['back', 'clear selected module'],
84
89
  ['cve <CVE-ID>', 'scan using current workspace/inventory'],
85
90
  ['scan <CVE-ID>', 'alias for cve'],
86
91
  ['ioc <log> [more logs]', 'scan logs using current indicators'],
87
- ['explain / evidence / actions', 'inspect last CVE result'],
92
+ ['explain / evidence / actions', 'inspect last CVE result']
93
+ ]),
94
+ '',
95
+ commandSection('Output', [
88
96
  ['export markdown <file>', 'write last result as Markdown'],
89
- ['export json <file>', 'write last result as JSON'],
97
+ ['export json <file>', 'write last result as JSON']
98
+ ]),
99
+ '',
100
+ commandSection('Session', [
90
101
  ['config save | config show', 'persist or inspect defaults'],
91
102
  ['profile save/use/list', 'save and restore console profiles'],
92
103
  ['workspace add/use/list', 'manage named workspaces'],
@@ -157,6 +168,40 @@ function table(rows) {
157
168
  .map(([key, value]) => ` ${colors.muted}${key.padEnd(keyWidth)}${colors.reset} ${colors.text}${value}${colors.reset}`)
158
169
  .join('\n');
159
170
  }
171
+ function divider(width) {
172
+ return `${colors.muted}${'─'.repeat(width)}${colors.reset}`;
173
+ }
174
+ function labeledRow(label, value) {
175
+ return ` ${colors.muted}${label.padEnd(10)}${colors.reset} ${colors.text}${value}${colors.reset}`;
176
+ }
177
+ function section(title) {
178
+ return `${colors.blue}${colors.bold}${title}${colors.reset}`;
179
+ }
180
+ function commandSection(title, rows) {
181
+ return [section(title), table(rows)].join('\n');
182
+ }
183
+ function bulletList(items, empty) {
184
+ const values = items.length > 0 ? items : [empty];
185
+ return values.map((item) => ` ${colors.muted}•${colors.reset} ${item}`);
186
+ }
187
+ function indent(value) {
188
+ return value
189
+ .split('\n')
190
+ .map((line) => ` ${line}`)
191
+ .join('\n');
192
+ }
193
+ function iocTable(rows) {
194
+ const indicatorWidth = Math.min(28, Math.max('Indicator'.length, ...rows.map(([indicator]) => indicator.length)));
195
+ const typeWidth = Math.min(10, Math.max('Type'.length, ...rows.map(([, type]) => type.length)));
196
+ const locationWidth = Math.min(28, Math.max('Location'.length, ...rows.map(([, , location]) => location.length)));
197
+ const header = ` ${colors.muted}${'Indicator'.padEnd(indicatorWidth)} ${'Type'.padEnd(typeWidth)} ${'Location'.padEnd(locationWidth)}${colors.reset}`;
198
+ const line = ` ${colors.muted}${'-'.repeat(indicatorWidth)} ${'-'.repeat(typeWidth)} ${'-'.repeat(locationWidth)}${colors.reset}`;
199
+ const body = rows.flatMap(([indicator, type, location, text]) => [
200
+ ` ${colors.yellow}${truncate(indicator, indicatorWidth).padEnd(indicatorWidth)}${colors.reset} ${colors.text}${truncate(type, typeWidth).padEnd(typeWidth)}${colors.reset} ${colors.text}${truncate(location, locationWidth).padEnd(locationWidth)}${colors.reset}`,
201
+ ` ${colors.muted}${indent(wrap(text, 70)).trimStart()}${colors.reset}`
202
+ ]);
203
+ return [header, line, ...body];
204
+ }
160
205
  function optionTable(rows) {
161
206
  const nameWidth = Math.max('Name'.length, ...rows.map(([name]) => name.length));
162
207
  const valueWidth = Math.min(36, Math.max('Current Setting'.length, ...rows.map(([, value]) => stripAnsi(value).length)));
package/dist/theme.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,wBAAwB;IAC/B,MAAM,EAAE,wBAAwB;IAChC,GAAG,EAAE,wBAAwB;IAC7B,IAAI,EAAE,wBAAwB;IAC9B,KAAK,EAAE,wBAAwB;IAC/B,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE,wBAAwB;IAC9B,KAAK,EAAE,wBAAwB;CAChC,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,KAAgD;IAC3E,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,OAAO;QACL,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,oBAAoB,MAAM,CAAC,KAAK,EAAE;QAC9D,GAAG,MAAM,CAAC,KAAK,iCAAiC,MAAM,CAAC,KAAK,EAAE;QAC9D,OAAO,CAAC,KAAK,CAAC;QACd,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;QACxC,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC;QACrD,UAAU,CAAC,MAAM,EAAE,qBAAqB,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC;QACd,GAAG,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,MAAM,OAAO,MAAM,CAAC,KAAK,kBAAkB,MAAM,CAAC,MAAM,eAAe,MAAM,CAAC,KAAK,iBAAiB,MAAM,CAAC,MAAM,OAAO,MAAM,CAAC,KAAK,YAAY,MAAM,CAAC,KAAK,EAAE;QAC3L,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAuB;IACtD,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO;QACL,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE;QAC9D,GAAG,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE;QAC5F,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,SAAS,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAChC,EAAE;QACF,OAAO,CAAC,qBAAqB,CAAC;QAC9B,GAAG,UAAU,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC;QAChD,EAAE;QACF,OAAO,CAAC,UAAU,CAAC;QACnB,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;QACtC,EAAE;QACF,OAAO,CAAC,qBAAqB,CAAC;QAC9B,GAAG,UAAU,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC;KACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACzC,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,IAAI;QACV,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE;QAC7B,KAAK,CAAC,IAAI;KACgC,CAAC,CAAC;IAC9C,OAAO;QACL,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,mBAAmB,MAAM,CAAC,KAAK,EAAE;QAC7D,GAAG,MAAM,CAAC,KAAK,cAAc,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE;QACtJ,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,yBAAyB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;KACnG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAM5B;IACC,OAAO,KAAK,CAAC;QACX,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;QAC9B,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC;QAC3C,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;QAC7C,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;QACxB,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,IAAI,MAAM,CAAC;KAC9C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,uBAAuB,MAAM,CAAC,KAAK,EAAE;QACjE,OAAO,CAAC,EAAE,CAAC;QACX,cAAc,CAAC,SAAS,EAAE;YACxB,CAAC,sBAAsB,EAAE,2BAA2B,CAAC;YACrD,CAAC,sBAAsB,EAAE,gCAAgC,CAAC;YAC1D,CAAC,uBAAuB,EAAE,cAAc,CAAC;YACzC,CAAC,iCAAiC,EAAE,oBAAoB,CAAC;YACzD,CAAC,uCAAuC,EAAE,8BAA8B,CAAC;YACzE,CAAC,qCAAqC,EAAE,qCAAqC,CAAC;YAC9E,CAAC,iCAAiC,EAAE,uBAAuB,CAAC;SAC7D,CAAC;QACF,EAAE;QACF,cAAc,CAAC,UAAU,EAAE;YACzB,CAAC,cAAc,EAAE,iEAAiE,CAAC;YACnF,CAAC,KAAK,EAAE,yBAAyB,CAAC;YAClC,CAAC,MAAM,EAAE,uBAAuB,CAAC;YACjC,CAAC,cAAc,EAAE,wCAAwC,CAAC;YAC1D,CAAC,eAAe,EAAE,eAAe,CAAC;YAClC,CAAC,uBAAuB,EAAE,oCAAoC,CAAC;YAC/D,CAAC,8BAA8B,EAAE,yBAAyB,CAAC;SAC5D,CAAC;QACF,EAAE;QACF,cAAc,CAAC,QAAQ,EAAE;YACvB,CAAC,wBAAwB,EAAE,+BAA+B,CAAC;YAC3D,CAAC,oBAAoB,EAAE,2BAA2B,CAAC;SACpD,CAAC;QACF,EAAE;QACF,cAAc,CAAC,SAAS,EAAE;YACxB,CAAC,2BAA2B,EAAE,6BAA6B,CAAC;YAC5D,CAAC,uBAAuB,EAAE,mCAAmC,CAAC;YAC9D,CAAC,wBAAwB,EAAE,yBAAyB,CAAC;YACrD,CAAC,8BAA8B,EAAE,8BAA8B,CAAC;YAChE,CAAC,aAAa,EAAE,2BAA2B,CAAC;YAC5C,CAAC,YAAY,EAAE,mBAAmB,CAAC;YACnC,CAAC,MAAM,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAQ7B;IACC,MAAM,IAAI,GAAoC;QAC5C,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,EAAE,uBAAuB,CAAC;QACvD,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC;KAC1C,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS,EAAE,4BAA4B,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC/D,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,IAAI,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO;QACL,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,iBAAiB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE;QACpI,GAAG,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE;QACjD,WAAW,CAAC,IAAI,CAAC;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,KAAa;IAClD,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AACxH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,GAAG,MAAM,CAAC,GAAG,QAAQ,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,MAAe;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,KAAK,EAAE,CAAC;IACxF,IAAI,OAAO,KAAK,cAAc;QAAE,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,eAAe,MAAM,CAAC,KAAK,EAAE,CAAC;IAClG,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IACrH,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,KAAK,EAAE,CAAC;IACpF,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7E,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,KAAK,CAAC,IAA6B;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;SACvH,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,KAAa;IAC9C,OAAO,KAAK,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AACrG,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,IAA6B;IAClE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,UAAU,CAAC,KAAe,EAAE,KAAa;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK;SACT,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,IAA6C;IAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,AAAD,EAAG,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClH,MAAM,MAAM,GAAG,KAAK,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IACzJ,MAAM,IAAI,GAAG,KAAK,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IACrI,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC/D,KAAK,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE;QACtQ,KAAK,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE;KACxE,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,IAAqC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzH,MAAM,MAAM,GAAG,KAAK,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,MAAM,CAAC,KAAK,EAAE,CAAC;IACnI,MAAM,OAAO,GAAG,KAAK,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IACzH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,EAAE,CACnD,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,GAAG,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,CAC3L,CAAC;IACF,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAW;IAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,KAAa;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1 +1 @@
1
- export declare const VERSION = "0.1.0";
1
+ export declare const VERSION = "0.1.1";
@@ -1,2 +1,2 @@
1
- export const VERSION = '0.1.0';
1
+ export const VERSION = '0.1.1';
2
2
  //# sourceMappingURL=version-info.js.map
package/package.json CHANGED
@@ -1,64 +1,65 @@
1
- {
2
- "name": "relsec",
3
- "version": "0.1.0",
4
- "description": "Local-first security relevance CLI for CVEs, advisories, IOCs, repos, and enterprise evidence.",
5
- "license": "MIT",
6
- "author": "MistanKh",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/MistanKh/relsec.git"
10
- },
11
- "bugs": {
12
- "url": "https://github.com/MistanKh/relsec/issues"
13
- },
14
- "homepage": "https://github.com/MistanKh/relsec#readme",
15
- "type": "module",
16
- "bin": {
17
- "relevant": "dist/cli.js",
18
- "relsec": "dist/cli.js"
19
- },
20
- "exports": {
21
- ".": {
22
- "types": "./dist/cli.d.ts",
23
- "import": "./dist/cli.js"
24
- }
25
- },
26
- "files": [
27
- "dist",
28
- "README.md",
29
- "SECURITY.md",
30
- "LICENSE",
31
- "docs"
32
- ],
33
- "scripts": {
34
- "test": "vitest run",
35
- "typecheck": "tsc -p tsconfig.json --noEmit",
36
- "build": "tsc -p tsconfig.build.json",
37
- "dev": "tsx src/cli.ts",
38
- "release:check": "npm run typecheck && npm test && npm run build",
39
- "pack:dry-run": "npm pack --dry-run",
40
- "prepack": "npm run release:check"
41
- },
42
- "keywords": [
43
- "security",
44
- "cve",
45
- "ioc",
46
- "sbom",
47
- "soc",
48
- "appsec",
49
- "cli"
50
- ],
51
- "engines": {
52
- "node": ">=20"
53
- },
54
- "devDependencies": {
55
- "@types/node": "^22.15.29",
56
- "@types/semver": "^7.7.1",
57
- "tsx": "^4.19.4",
58
- "typescript": "^5.8.3",
59
- "vitest": "^3.2.4"
60
- },
61
- "dependencies": {
62
- "semver": "^7.8.1"
63
- }
64
- }
1
+ {
2
+ "name": "relsec",
3
+ "version": "0.1.1",
4
+ "description": "Local-first security relevance CLI for CVEs, advisories, IOCs, repos, and enterprise evidence.",
5
+ "license": "MIT",
6
+ "author": "MistanKh",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/MistanKh/relsec.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/MistanKh/relsec/issues"
13
+ },
14
+ "homepage": "https://github.com/MistanKh/relsec#readme",
15
+ "type": "module",
16
+ "bin": {
17
+ "relevant": "dist/cli.js",
18
+ "relsec": "dist/cli.js"
19
+ },
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/cli.d.ts",
23
+ "import": "./dist/cli.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md",
29
+ "SECURITY.md",
30
+ "LICENSE",
31
+ "docs"
32
+ ],
33
+ "scripts": {
34
+ "test": "vitest run",
35
+ "typecheck": "tsc -p tsconfig.json --noEmit",
36
+ "build": "tsc -p tsconfig.build.json",
37
+ "dev": "tsx src/cli.ts",
38
+ "release:check": "npm run typecheck && npm test && npm run build",
39
+ "pack:dry-run": "npm pack --dry-run",
40
+ "prepack": "npm run release:check",
41
+ "version": "node scripts/sync-version.mjs"
42
+ },
43
+ "keywords": [
44
+ "security",
45
+ "cve",
46
+ "ioc",
47
+ "sbom",
48
+ "soc",
49
+ "appsec",
50
+ "cli"
51
+ ],
52
+ "engines": {
53
+ "node": ">=20"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^22.15.29",
57
+ "@types/semver": "^7.7.1",
58
+ "tsx": "^4.19.4",
59
+ "typescript": "^5.8.3",
60
+ "vitest": "^3.2.4"
61
+ },
62
+ "dependencies": {
63
+ "semver": "^7.8.1"
64
+ }
65
+ }