@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:

SinyalAğırlık
Aynı paket, aynı sürüm, farklı integrity hashblok — 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ümuyarı — registry'ye sorulur; çevrimdışıysa atlanır ve söylenir
Registry dışı host, git/http kaynağı, integrity eksikuyarı

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_role anahtarı: 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ımlanabilir pk_live_ herkese açıktır, eşleşmez.
  • OpenAI sk-proj- / sk-svcacct-, Anthropic sk-ant-, AWS AKIA/ASIA, GitHub ghp_ / github_pat_, Slack xox…, SendGrid SG.…, npm npm_, 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, sonra npm-shrinkwrap.json.

  • Name
    --base-ref <git ref>
    Description

    Temel lockfile'ın alınacağı commit. Varsayılan $ARGUS_CI_BASE_REF, sonra HEAD~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ı

KodAnlamı
0Blok bulgu yok; uyarılar basıldı, deploy sürebilir
1Blok bulgu — ya da --strict altında uyarı — deploy sürmemeli
2Kullanı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.json v1–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_modules varsa 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-registry ile ona da bağlanmaz).