Předběžný návod k nastavení a použití

Raný a záměrně nedoladěný návod, sepsaný 30. 9. 2026 podle toho, jak kód funguje dnes. Bude se rozrůstat. Každá část má štítek se stavem, takže hned vidíte, co je skutečné:

1. Co dnes existuje

SoučástStavKde
Jádro skeneru: kontext, sken a skeptická vícekolová triážFungujeOpen source: github.com/Huge/nano-analyzer
Úloha pro merge requesty v GitLabu, která přidá jeden komentář s reportemNetestovánoPrivátní kód, sdílíme v rámci raného přístupu
GitHub ActionKonceptPrivátní kód, sdílíme v rámci raného přístupu
Příkaz @budgetscan v komentáři s limitem rozpočtu a termínuPlánováno—
Předplacené kredity a hostované skeny na inferenci s nulovou retencí datPlánováno—

Veřejný repozitář je open-source jádro. Kromě něj udržujeme mnohem pokročilejší privátní kód; integrace do CI popsané níže žijí právě tam.

2. Rychlý start z příkazové řádky Funguje

Potřebujete Python 3.8+ a API klíč: OpenAI (výchozí model je gpt-5.4-nano) nebo OpenRouter (názvy modelů s lomítkem, například qwen/qwen3-32b). Volitelně si nainstalujte ripgrep (rg), aby triáž mohla prohledávat váš kód. Žádné další závislosti nejsou.

git clone https://github.com/Huge/nano-analyzer.git
cd nano-analyzer

# modely OpenAI (název modelu bez lomítka)
export OPENAI_API_KEY=sk-...
# nebo modely přes OpenRouter (název modelu s lomítkem)
export OPENROUTER_API_KEY=sk-or-...

# sken jednoho souboru nebo celého adresáře
python3 scan.py ./cesta/ke/zdrojakum

Každá fáze volá LLM, takže cena roste s množstvím kódu a počtem kol triáže. Začněte jedním adresářem a podívejte se, kolik to stojí, než skener pustíte na celý repozitář.

Nejčastější volby

VolbaCo dělá
--modelModel pro všechny fáze, např. --model qwen/qwen3-32b
--parallel NCelkový počet souběžných volání API
--triage-rounds NPočet skeptických kol na jeden nález (výchozí 5)
--triage-thresholdNejnižší závažnost, která se triáží (výchozí medium)
--min-confidence 0.7Zobrazí jen nálezy s alespoň touto jistotou
--repo-dir ./Kořen repozitáře, který triáž prohledává; hodí se, když skenujete jen podadresář
--extensions, --ignore-dirsZúžení množiny skenovaných souborů
--output-dirKam se uloží výsledky (výchozí ~/nano-analyzer-results/<časové razítko>/)

3. Jak číst výsledky

<časové razítko>/
├── summary.md              # začněte tady
├── findings/               # nálezy, které triáž přežily
│   └── VULN-001_<soubor>.md
├── triage_survivors.md     # souhrn potvrzených nálezů
├── triage.json             # všechny verdikty
├── triages/                # zdůvodnění u každého nálezu
└── <soubor>.md / .json / .context.md   # surový výstup po souborech

Jistota typu 80% [VVIVV→V] je podíl kol triáže, která nález uznala za platný; poslední písmeno je konečné rozhodnutí arbitra. Než podle nějakého nálezu začnete jednat, vždy si ho ověřte ručně.

4. Integrace s merge requesty v GitLabu Netestováno

CI úloha, která proskenuje soubory změněné v merge requestu a udržuje na něm jednu aktuální diskusi s reportem. Existuje v našem privátním kódu a zatím nebyla vyzkoušena od začátku do konce, takže počítejte s drobnými nedodělky. Soubory vám rádi pošleme v rámci raného přístupu (viz Dotazy).

  1. Sestavte a publikujte image. Dockerfile nainstaluje git, ripgrep a volitelné nástroje pro vyhledávání v kódu:
    docker build -f gitlab/Dockerfile -t registry.gitlab.com/<skupina>/<projekt>/nano-analyzer:latest .
    docker push registry.gitlab.com/<skupina>/<projekt>/nano-analyzer:latest
  2. Přidejte úlohu. Zkopírujte scan.py a složku gitlab/ do projektu, který chcete skenovat (wrapper zatím spouští scan.py z kořene toho projektu; toto balení se pravděpodobně změní), pak vložte šablonu a nastavte image:
    include:
      - local: gitlab/.gitlab-ci.yml
    
    variables:
      NANO_GITLAB_IMAGE: registry.gitlab.com/<skupina>/<projekt>/nano-analyzer:latest
  3. Nastavte CI/CD proměnné (masked): NANO_GITLAB_API_TOKEN, tedy token, který smí zapisovat poznámky k merge requestu, a váš klíč k LLM, například OPENROUTER_API_KEY.
  4. Otevřete merge request. Úloha běží jen v pipelinech merge requestů. Nejdřív upraví report na „This analysis is being updated...“, potom ho nahradí tabulkou s počty nálezů podle závažnosti pro každý soubor, stavem, časem a SHA commitu.

Jak se chová

ProměnnáK čemu slouží
NANO_GITLAB_SCAN_MODEchanged (výchozí) nebo all
NANO_GITLAB_SCAN_TARGETCo skenovat v režimu all (výchozí .)
NANO_GITLAB_CHANGED_BASEVýslovný základní commit nebo větev pro diff
NANO_GITLAB_ENFORCE_ONCE_PER_COMMITPřeskočí už reportované commity (výchozí true)
NANO_GITLAB_REOPEN_RESOLVED_THREADZnovu otevře vyřešenou diskusi s reportem (výchozí true)
NANO_GITLAB_RESOURCE_GROUPKlíč zámku, který zajistí, že skeny běží jeden po druhém
NANO_GITLAB_MODEL, NANO_GITLAB_PARALLEL, NANO_GITLAB_TRIAGE_ROUNDSPředávají se skeneru

Bezpečnostní poznámka: API tokeny i klíče k LLM držte masked a chráněné a nezpřístupňujte je pipelinům z nedůvěryhodných forků.

5. GitHub pull requesty Koncept

V našem privátním kódu je definice GitHub Action, která spustí skener a udržuje na pull requestu jeden aktuální komentář. Je to koncept: vstupy pro cíl, model, paralelismus, limit velikosti, nastavení triáže, práh jistoty a adresář repozitáře jsou se skenerem propojené, ale několik dalších je zatím jen deklarováno a nezapojeno: format, scope, provider, nahrávání SARIF, nahrávání artefaktů a politika fail-*. Navíc spouští scan.py z pracovního prostoru volajícího, takže ji zatím nejde použít jako hotovou akci z jiného repozitáře.

Než to doladíme, nejjednodušší je pustit skener z příkazové řádky ve vlastním workflow. Je to netestovaná ukázka:

name: nano-analyzer
on: pull_request
permissions:
  contents: read
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: actions/checkout@v4
        with:
          repository: Huge/nano-analyzer
          path: .nano-analyzer
      - name: Scan changed source files
        env:
          OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
        run: |
          git diff --name-only --diff-filter=AMRT "origin/${{ github.base_ref }}...HEAD" \
            | grep -E '\.(c|h|cc|cpp|go|py|js|ts|rs|java)$' > changed.txt || true
          [ -s changed.txt ] || { echo "No source changes"; exit 0; }
          xargs -a changed.txt python3 .nano-analyzer/scan.py \
            --model qwen/qwen3-32b --repo-dir . --output-dir scan-results
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: nano-analyzer-results
          path: scan-results

Pull requesty z forků ve výchozím stavu nedostanou tajné proměnné repozitáře. To je záměr: neobcházejte to přes pull_request_target spojené s checkoutem kódu z pull requestu.

6. Připravovaný příkaz @budgetscan Plánováno

Myšlenka: reviewer napíše komentář k pull nebo merge requestu a BudgetScan naplánuje sken, který se vejde do limitu i termínu. Nic z níže uvedeného zatím neběží a syntaxe se ještě může změnit.

KomentářZáměr
@budgetscan $0.25Rychlý průchod změněnými soubory s limitem $0.25
@budgetscan $0.50 --max-delay 5mHlubší průchod, který se blížícím pětiminutovým termínem přestane pouštět do nové práce a zveřejní částečný report s tím, co pokryl
@budgetscan $5.00 --depth deepVyšší limit se investuje do širšího kontextu a více kol triáže

7. Kam putuje váš kód

Stručně: hostované skeny běží u našeho partnera Kosmik Compute (Praha, nulová retence dat), nebo si open-source skener pustíte proti vlastnímu endpointu na vlastní infrastruktuře. Podrobnosti jsou v části Kam putuje můj kód?

8. Omezení

9. Dotazy a raný přístup

Chcete privátní integrace, máte dotaz, nebo jste v návodu našli chybu? Napište nám (dev@ehlas.cz a safeAIwork@gmail.com).

← Zpět na přehled