4
Referensi Perintah CLI
Guardian memasang satu entry point konsol bernama guardian yang menunjuk ke cli.main:app (pyproject.toml:53-541). Objek Typer dibuat dengan name="guardian", add_completion=False, dan rich_markup_mode="rich" (cli/main.py:64-692). Sembilan perintah didaftarkan lewat app.command(...) dan dua grup lewat app.add_typer(...) pada objek yang sama (cli/main.py:74-833). Perintah version menyusul lewat dekorator @app.command() (cli/main.py:103-1154).
Hampir semua perintah menerima typer.Option bernama. Pengecualiannya workflow, yang mengambil action sebagai typer.Argument, dan kb query, yang mengambil text sebagai argumen (cli/commands/workflow.py:18-525, cli/commands/kb.py:295-3136). Kegagalan validasi selalu berakhir dengan raise typer.Exit(1) sebelum pekerjaan dimulai.
Pohon perintah
graph TD
app["app — cli.main:app"] --> init["init"]
app --> scan["scan"]
app --> recon["recon"]
app --> analyze["analyze"]
app --> report["report"]
app --> workflow["workflow"]
app --> ai["ai"]
app --> models["models"]
app --> version["version"]
app --> kb["kb — Typer sub-app"]
app --> telemetry["telemetry — Typer sub-app"]
kb --> kb_status["kb status"]
kb --> kb_seed["kb seed"]
kb --> kb_update["kb update"]
kb --> kb_query["kb query"]
telemetry --> tel_export["telemetry export"]
telemetry --> tel_train["telemetry train"]
telemetry --> tel_status["telemetry status"]
style app fill:#f59e0b,color:#000
style kb fill:#336791,color:#fff
style telemetry fill:#8b5cf6,color:#fff
style version fill:#2d7d46,color:#fff
%% fig: Pohon perintah Typer Guardian
%% desc: Objek app di cli/main.py mendaftarkan sembilan perintah tunggal dan dua sub-app, lalu sub-app kb dan telemetry memecah diri menjadi subcommand masing-masing.| Perintah | Registrasi | Subcommand | Argumen wajib |
|---|---|---|---|
init | app.command(name="init") | — | — |
scan | app.command(name="scan") | — | --target |
recon | app.command(name="recon") | — | --target atau --domain |
analyze | app.command(name="analyze") | — | --input |
report | app.command(name="report") | — | --session |
workflow | app.command(name="workflow") | — | action posisional |
ai | app.command(name="ai") | — | --session atau --last |
models | app.command(name="models") | — | — |
version | @app.command() | — | — |
kb | app.add_typer(kb_app, name="kb") | status, seed, update, query | — |
telemetry | app.add_typer(telemetry_app, name="telemetry") | export, train, status | — |
Nama kolom pertama di tabel itu sama dengan nama yang dipakai pada app.command(name=...), dan tiga baris terakhir memakai nama yang diteruskan ke app.add_typer (cli/main.py:74-833).
init
| Opsi | Nilai default | Arti |
|---|---|---|
--config-dir, -c | Path.home() / ".guardian" | direktori konfigurasi |
--force, -f | False | menimpa konfigurasi yang sudah ada |
Signature dua opsi itu ada di cli/commands/init.py:14-277. Perintah menyalin template config/guardian.yaml ke <config_dir>/guardian.yaml, meminta kunci Gemini lewat prompt berpassword, lalu menulis <config_dir>/.env berisi GOOGLE_API_KEY=<kunci> (cli/commands/init.py:38-588). Dua direktori kerja ikut dibuat di akhir: ./reports dan ./logs (cli/commands/init.py:38-588). Bila guardian.yaml sudah ada dan --force tidak diberikan, perintah meminta konfirmasi Overwrite? sebelum menimpa (cli/commands/init.py:38-588).
scan
| Opsi | Nilai default | Arti |
|---|---|---|
--target, -t | wajib | IP atau domain target |
--ports, -p | top-1000 | daftar port atau preset |
--config, -c | config/guardian.yaml | path konfigurasi |
--model, -m | None | override model AI |
--provider | None | override provider AI |
Kelima opsi itu dideklarasikan di cli/commands/scan.py:16-369. scan hanyalah pembungkus NmapTool: konfigurasi dimuat, override diterapkan, lalu nmap.execute(target, ports=ports) dijalankan lewat asyncio.run (cli/commands/scan.py:16-369). Nilai --provider divalidasi terhadap daftar gemini, openai, claude, openrouter, requesty; nilai di luar daftar mencetak Invalid provider '{provider}'. Must be one of: ... lalu keluar dengan kode 1 (cli/commands/scan.py:47-5210).
recon
| Opsi | Nilai default | Arti |
|---|---|---|
--target, -t | None | domain atau host target |
--domain, -d | None | usang dan hidden=True |
--config, -c | config/guardian.yaml | path konfigurasi |
--save / --no-save | True | simpan hasil |
--dry-run | False | cetak rencana tanpa eksekusi |
--model, -m | None | override model AI |
--provider, -p | None | override provider AI |
Seluruh opsi tercantum di cli/commands/recon.py:18-6011. Bila hanya --domain yang diberikan, nilainya dipakai sebagai target dan sebuah pesan deprecation dicetak; bila keduanya kosong, perintah mencetak --target is required lalu keluar (cli/commands/recon.py:70-9112). Target divalidasi dengan is_valid_domain atau is_valid_url, dan --dry-run mencetak rencana lalu return sebelum konfigurasi dimuat (cli/commands/recon.py:70-91). Rencana dry-run terdiri dari empat langkah: Subfinder, Nmap, httpx, dan AI Analysis (cli/commands/recon.py:147-159). Override provider memakai daftar lima nilai yang sama seperti scan (cli/commands/recon.py:96-112).
ℹ️ Opsi
--save/--no-savedideklarasikan dengan defaultTrue, tetapisave_resultshanya muncul di blok signature dan tidak dibaca lagi di jalur eksekusi (cli/commands/recon.py:38-4215).
analyze
| Opsi | Nilai default | Arti |
|---|---|---|
--input, -i | wajib | berkas JSON hasil scan |
--format, -f | markdown | format keluaran |
Dua opsi itu ada di cli/commands/analyze.py:13-1616. Badan perintah memeriksa keberadaan berkas, memuat JSON, lalu mencetak AI analysis feature coming soon! beserta jumlah findings yang ditemukan (cli/commands/analyze.py:28-3717). Perintah ini belum menjalankan analisis apa pun.
report
| Opsi | Nilai default | Arti |
|---|---|---|
--session, -s | wajib | ID session sumber laporan |
--format, -f | markdown | markdown, html, atau json |
--output, -o | None | path berkas keluaran |
--config, -c | config/guardian.yaml | path konfigurasi |
--export, -e | [] | ekspor tambahan, dapat diulang |
--slack-webhook | None | URL webhook, env GUARDIAN_SLACK_WEBHOOK |
Himpunan ekspor yang sah dibatasi konstanta _VALID_EXPORTS = {"sarif", "defectdojo", "slack"} dan keenam opsi dideklarasikan sesudahnya (cli/commands/report.py:13-3818). Setiap nilai --export diperiksa lebih dulu agar kegagalan terjadi cepat; nilai asing mencetak Unknown export format '{fmt}'. Valid: ... lalu keluar (cli/commands/report.py:59-6719). Session dibaca dari ./reports/session_{session_id}.json, dan berkas yang tidak ada menghasilkan Session not found: ... (cli/commands/report.py:68-7220). Laporan ditulis lewat ReporterAgent.execute, dengan ekstensi keluaran dipilih dari {"markdown": "md", "html": "html", "json": "json"} (cli/commands/report.py:74-9621).
Ekspor tambahan berjalan sesudah berkas utama ditulis: sarif menghasilkan report_<id>.sarif, defectdojo menghasilkan report_<id>.defectdojo.json, dan slack memanggil slack_exporter.post lalu mencetak status HTTP (cli/commands/report.py:99-11922).
⚠️
--export slacktanpa--slack-webhookatau envGUARDIAN_SLACK_WEBHOOKlangsung berhenti dengan pesan--export slack requires --slack-webhook or GUARDIAN_SLACK_WEBHOOK env varsebelum payload dibangun (cli/commands/report.py:99-11922).
sequenceDiagram
participant U as operator
participant C as report_command
participant M as PentestMemory
participant R as ReporterAgent
participant X as core.exporters
U->>C: report --session id --export sarif
C->>C: validasi _VALID_EXPORTS
C->>C: cek ./reports/session_id.json
C->>M: load_state session file
C->>R: execute format
R-->>C: report content
C->>C: tulis berkas output
C->>X: export sarif / defectdojo / slack
X-->>C: dokumen atau HTTP status
%% fig: Urutan eksekusi guardian report
%% desc: Perintah memvalidasi pemilih ekspor dan berkas session lebih dulu, baru membangkitkan laporan dan menjalankan ekspor tambahan.workflow
| Posisi atau opsi | Nilai default | Arti |
|---|---|---|
action | wajib | run atau list |
--name, -n | None | nama workflow untuk run |
--target, -t | None | target workflow |
--config, -c | config/guardian.yaml | path konfigurasi |
--model, -m | None | override model AI |
--provider, -p | None | override provider AI |
--yes, -y | False | melewati konfirmasi per tool |
--resume, -r | None | melanjutkan session tersimpan |
Kedelapan parameter itu ada di cli/commands/workflow.py:18-525. action == "list" memanggil _list_workflows lalu kembali (cli/commands/workflow.py:62-8123). action == "run" mewajibkan --name; --target juga wajib kecuali --resume diberikan, dengan pesan --name is required for 'run' action dan --target is required for 'run' action (unless --resume is used). Aksi lain berakhir dengan Unknown action: {action} (cli/commands/workflow.py:62-8123).
list membaca setiap *.yaml di direktori workflows/, memakai nama berkas tanpa ekstensi sebagai nama workflow, dan menampilkan kolom Name, Description, Steps (cli/commands/workflow.py:84-12124). Pada run, provider divalidasi terhadap lima nilai yang sama lalu WorkflowEngine dibangun dan resume_session dipanggil bila --resume diisi; kegagalan menghasilkan Cannot resume session '{resume}' (cli/commands/workflow.py:125-15825). Nama autonomous dirutekan ke run_autonomous, nama lain ke run_workflow (cli/commands/workflow.py:125-15825). Override provider dan model diterapkan pada config["ai"] sebelum engine dibuat (cli/commands/workflow.py:131-14726).
ai
| Opsi | Nilai default | Arti |
|---|---|---|
--session, -s | None | ID session yang dijelaskan |
--last, -l | False | jelaskan keputusan terakhir |
--all, -a | False | tampilkan semua keputusan |
--format, -f | table | table atau json |
Opsi itu dideklarasikan di cli/commands/ai_explain.py:17-3427. Tanpa --session maupun --last, perintah mencetak Please specify --session <id> or use --last lalu keluar (cli/commands/ai_explain.py:17-3427). Keputusan dibaca dari kunci ai_decisions pada berkas session (cli/commands/ai_explain.py:17-3427).
models
models tidak menerima parameter apa pun (cli/commands/models.py:11-2328). Perintah mencetak satu tabel berisi lima kelompok provider beserta capability tiap model: GEMINI, OPENAI, CLAUDE, OPENROUTER, dan REQUESTY (cli/commands/models.py:11-2328). Baris penutup mengingatkan lima variabel lingkungan kunci: GOOGLE_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, OPENROUTER_API_KEY, REQUESTY_API_KEY (cli/commands/models.py:11-2328).
kb
| Subcommand | Argumen dan opsi | Keluaran |
|---|---|---|
kb status | — | tabel Kind dan Rows, lalu path index |
kb seed | — | jumlah entri yang dimasukkan |
kb update | --kind wajib, --accept-network, --file | jumlah entri yang diingest |
kb query | text posisional, --top, -k, --kind, --prompt | tabel skor atau prompt-block |
kb status mencetak jumlah baris per kind; bila index kosong ia mencetak KB is empty lalu keluar dengan kode 0 (cli/commands/kb.py:39-5429). kb seed memanggil KnowledgeBase().upsert(_seed_entries()) dan melaporkan jumlah entri yang ditulis (cli/commands/kb.py:163-16830).
kb update menerima --kind dengan nilai cve, cwe, attck, atau template, ditambah --accept-network dan --file (cli/commands/kb.py:174-19931).
⚠️ Tanpa
--file,kb updatemenolak melakukan fetch bila--accept-networktidak diberikan, dengan pesanRefusing to fetch without --accept-networkdan exit code 1 (cli/commands/kb.py:174-19931). Bila--accept-networkdiberikan tetapi tidak ada berkas, perintah mencetakNetwork corpus fetch is not bundled.lalu keluar dengan exit code 2 (cli/commands/kb.py:174-19931).
kb query menerima text posisional, --top dengan default 5, penyaring --kind, dan --prompt untuk merender hasil sebagai prompt-block (cli/commands/kb.py:295-3136).
telemetry
| Subcommand | Argumen dan opsi | Keluaran |
|---|---|---|
telemetry export | source posisional, --out, -o | jumlah baris JSONL |
telemetry train | jsonl posisional, --out, -o, --min-confidence | jumlah baris latih dan path model |
telemetry status | — | tabel top-3 tool per (phase, target) |
export menerima berkas session_<id>.json atau direktori reports/ dan menulis ke ./telemetry.jsonl bila --out tidak diisi (cli/commands/telemetry.py:30-4232). train memakai --min-confidence dengan default 0.7 sebagai ambang abstain ranker; bila train_from_jsonl mengembalikan 0, perintah mencetak No usable rows in JSONL. lalu keluar (cli/commands/telemetry.py:45-5933). status memuat ~/.guardian/ranker.pkl; bila berkas tidak ada ia mencetak No ranker trained yet. lalu keluar dengan kode 0 (cli/commands/telemetry.py:62-7534).
version
version mencetak guardian-cli <versi> (cli/main.py:103-1154). Versi berasal dari _get_version(), yang membaca metadata paket guardian-cli dan jatuh ke 0.0.0+local bila paket tidak terpasang (cli/main.py:103-1154).