Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
81 lines (62 loc) · 2.82 KB
/
Copy pathMakefile
File metadata and controls
81 lines (62 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
.PHONY: install run collect fetch parse join fixes plan evaluate plot all clean docker test lint mre snapshot scan-mre scan-full
PYTHON ?= python3
TODAY := $(shell date -u +%Y-%m-%d)
install:
$(PYTHON) -m pip install -e ".[dev]"
# ── Quality gates ─────────────────────────────────────────────────────────────
test:
pytest tests/ -v
lint:
ruff check src/ tests/
# ── Minimal reproducible example (5 curated repos, no search API needed) ─────
mre:
$(PYTHON) -m src.collect_repos --curated data/curated_repos.txt
$(PYTHON) -m src.fetch_lockfiles
$(PYTHON) -m src.parse_lockfile
$(PYTHON) -m src.osv_kev_join
$(PYTHON) -m src.candidate_fixes
# ── KEV-positive discovery ────────────────────────────────────────────────────
# MRE: 20 positive repos, curated seed, no GitHub search needed
scan-mre:
$(PYTHON) -m src.find_kev_positive \
--seed-file data/curated_repos.txt \
--max-candidates 500 \
--target-n 20 \
--target-control 20 \
--random-seed 42
# Paper: 100 positive repos from bounded GitHub search (cap 5 000 candidates)
scan-full:
$(PYTHON) -m src.find_kev_positive \
--max-candidates 5000 \
--target-n 100 \
--target-control 100 \
--random-seed 42
# ── Reproducibility snapshot ─────────────────────────────────────────────────
snapshot:
$(PYTHON) scripts/consolidate_snapshot.py --tag $(TODAY)
# ── Individual pipeline stages ───────────────────────────────────────────────
collect:
$(PYTHON) -m src.collect_repos
fetch:
$(PYTHON) -m src.fetch_lockfiles
parse:
$(PYTHON) -m src.parse_lockfile
join:
$(PYTHON) -m src.osv_kev_join
fixes:
$(PYTHON) -m src.candidate_fixes
plan:
$(PYTHON) -m src.pipeline --stage plan
evaluate:
$(PYTHON) -m src.pipeline --stage evaluate
plot:
$(PYTHON) -m src.plotting
# ── Full pipeline ────────────────────────────────────────────────────────────
all:
$(PYTHON) -m src.pipeline
# ── Docker ───────────────────────────────────────────────────────────────────
docker:
docker build -t kevgraph .
docker run --rm -e GITHUB_TOKEN="$$GITHUB_TOKEN" -v "$$(pwd)/data:/app/data" kevgraph
clean:
rm -rf data/cached_api data/lockfiles data/graphs data/plots data/manifest.csv data/results.csv