@argus/ci
Build'den sonra, deploy'dan önce koşan tarayıcı. Sızmış anahtar, herkese açık önekte gizli anahtar ve lockfile'da değişen içerik bulursa çıkış kodu 1 ile deploy'u kırar. Sıfır bağımlılık, hiçbir yere veri göndermez.
Ne denetler
Build çıktısındaki sırlar. .next, dist, build, out, .output, .svelte-kit/output, .nuxt/dist, .vercel/output, public/build altındaki metin dosyaları taranır; gzip ve brotli çıktılar açılarak okunur. Aynı sır on iki chunk'ta geçiyorsa tek bulgu; ilk beş konum yazılır, kalanı "+7 more" diye sayılır.
Herkese açık önekli ortam değişkenleri. NEXT_PUBLIC_, VITE_, REACT_APP_, PUBLIC_, EXPO_PUBLIC_, NUXT_PUBLIC_, GATSBY_, VUE_APP_ önekli her değişken build anında tarayıcı bundle'ına gömülür. Canlı process.env (CI'daki build ortamı) ve .env* dosyalarında yalnızca bu önekli değişkenlerin değeri denetlenir; öneksiz değişkenlerin değeri hiç okunmaz.
Lockfile bütünlüğü. Kurulacak package-lock.json, temel commit'tekiyle karşılaştırılır:
| Sinyal | Ağırlık |
|---|---|
| Aynı paket, aynı sürüm, farklı integrity hash | blok — yayımlanmış sürüm değişmez; bozulmuş lockfile ya da zehirli ayna imzası |
Ağaca yeni giren ya da betiksizken betik kazanan paket (preinstall/install/postinstall) | blok — bir insan bakıp ad@sürüm olarak izin listesine alana kadar |
| 30 günden yeni sürüm | uyarı — registry'ye sorulur; çevrimdışıysa atlanır ve söylenir |
| Registry dışı host, git/http kaynağı, integrity eksik | uyarı |
Hoist/dedupe (aynı ad ve sürüm, yeni yol) "yeni" sayılmaz; yalnızca içerik karşılaştırılır. Zaten betikli bir paketin sürüm atlaması (esbuild, sharp) bilgi olarak geçer.
Yanlış pozitif sıfır
Her dedektör ya satıcıya özgü sabit bir öneke ya da çözülebilir bir yapıya dayanır; "entropisi yüksek görünüyor" diye bulgu üretilmez.
- Supabase
service_roleanahtarı: JWT payload'ı çözülür, yalnızca"role":"service_role"bulgu olur. Anon anahtar tasarım gereği tarayıcıya gider, raporlanmaz. - Stripe
sk_live_/rk_live_(blok),sk_test_(uyarı). Yayımlanabilirpk_live_herkese açıktır, eşleşmez. - OpenAI
sk-proj-/sk-svcacct-, Anthropicsk-ant-, AWSAKIA/ASIA, GitHubghp_/github_pat_, Slackxox…, SendGridSG.…, npmnpm_, PEM özel anahtar başlığı. - Kimlik bilgili veritabanı URL'si (
postgres://user:pass@host): uzak host blok, yerel host ya da yer tutucu parola uyarı; parola her zaman maskelenir. - Bilerek yok: genel
sk-deseni, Google/Firebase API anahtarı (frontend'de meşru), Twilio SID (iki harf + hex).
Kullanım
Terminal
npm install --save-dev @argus/ci
# build adımından sonra
npx argus-ci
Komutlar
argus-ci [scan] [seçenekler] bundle sırları + herkese açık env + lockfile
argus-ci secrets [dizin...] yalnızca build çıktısı / ortam taraması
argus-ci lockfile yalnızca lockfile denetimi
- Name
--dir <yol>- Description
Taranacak build çıktısı, tekrarlanabilir. Verilmezse yukarıdaki dizinler otomatik aranır; hiçbiri yoksa uyarı.
- Name
--no-env / --env-file <yol>- Description
Ortam taramasını atla / ek dotenv dosyası (tekrarlanabilir). Varsayılan:
.env,.env.local,.env.production, …
- Name
--lockfile <yol>- Description
Varsayılan
package-lock.json, sonranpm-shrinkwrap.json.
- Name
--base-ref <git ref>- Description
Temel lockfile'ın alınacağı commit. Varsayılan
$ARGUS_CI_BASE_REF, sonraHEAD~1.
- Name
--base-file <yol>- Description
Temel lockfile'ı git yerine dosyadan al.
- Name
--allow-install-script <ad|ad@sürüm>- Description
Kurulum betiği incelenmiş, beklenen paket. Tekrarlanabilir.
- Name
--max-age-days <n>- Description
Bundan genç yeni sürümlerde uyar. Varsayılan 30.
- Name
--no-registry- Description
npm registry'ye hiç sorma; yaş kontrolü atlanır, ağ trafiği sıfır.
- Name
--strict- Description
Uyarılar da koşuyu kırar.
- Name
--json / --report <dosya>- Description
Raporu JSON olarak yaz / ayrıca dosyaya kaydet.
- Name
--config <dosya>- Description
Yapılandırma dosyası, varsayılan
.argus-ci.json.
- Name
--quiet / --no-color- Description
Yalnızca başarısızlıkta yaz / renksiz çıktı.
Yapılandırma
Çalışma dizinindeki .argus-ci.json; bayraklar dosyayı ezer.
.argus-ci.json
{
"dirs": [".next", "public/build"],
"allowInstallScripts": ["esbuild@0.25.12", "sharp"],
"maxAgeDays": 30,
"registry": true,
"env": true,
"strict": false
}
Ayrıca lockfile, baseRef ve envFiles anahtarları kabul edilir.
Çıkış kodları
| Kod | Anlamı |
|---|---|
0 | Blok bulgu yok; uyarılar basıldı, deploy sürebilir |
1 | Blok bulgu — ya da --strict altında uyarı — deploy sürmemeli |
2 | Kullanım hatası ya da iç hata |
GitHub Actions
.github/workflows/ci.yml
- uses: actions/checkout@v4
with:
fetch-depth: 0 # lockfile karşılaştırması için temel commit gerekir
- run: npm ci && npm run build
- run: npx argus-ci
env:
ARGUS_CI_BASE_REF: ${{ github.event.pull_request.base.sha || github.event.before }}
GITHUB_ACTIONS altında her bulgu şiddetine göre ::error / ::warning / ::notice file=…,line=… annotation'ı olarak basılır; pull request'te satır içinde görünür.
Bir bulgu nasıl görünür
Çıktı
BLOCK Supabase service_role key in build output: eyJhbGci…Xk3Q (219 chars)
JWT payload: role=service_role, iss=supabase, ref=abcdefghijklmnopqrst
expires: 2033-05-18
at .next/static/chunks/app/page-3f2a1b.js:1:48213
fix: Rotate the key in the Supabase dashboard (Settings → API) now. …
BLOCK evil-helper@0.0.3 is new and runs install scripts
not present in the baseline lockfile
resolved: https://registry.npmjs.org/evil-helper/-/evil-helper-0.0.3.tgz
path: node_modules/evil-helper
fix: … add "evil-helper@0.0.3" to allowInstallScripts in .argus-ci.json.
Kanıt, tavsiye değil: konum, çözülmüş alanlar, önce/sonra hash'leri, eklenecek izin listesi girdisi birebir. Değerler kısaltılır (sk_live_…MPLE (32 chars)); tam değer hiçbir çıktıda yer almaz, çünkü rapor CI loguna düşer.
Sınırlar
- Yalnızca npm lockfile'ları (
package-lock.jsonv1–v3,npm-shrinkwrap.json).yarn.lock/pnpm-lock.yaml"desteklenmiyor" diye raporlanır, "temiz" diye değil. - Lockfile v1 kurulum betiği bilgisi taşımaz; kurulu
node_modulesvarsa oradan okunur, yoksa "bilinmiyor" bilgisi düşer. - Yaş kontrolü
registry.npmjs.org'a ihtiyaç duyar. Oradaki her başarısızlık rapora not olur; asla blok, asla istisna. - Tarayıcı yalnızca dosya okur. Build'i çalıştırmaz, paket kurmaz, registry dışında hiçbir yere bağlanmaz (
--no-registryile ona da bağlanmaz).