Lompat ke konten
dokumentasi.id
Commit 51864a8
v1
Star1,9 rb

4

Referensi Perintah CLI

Guardian memasang satu entry point konsol bernama guardian yang menunjuk ke cli.main:app (pyproject.toml:53-54). Objek Typer dibuat dengan name="guardian", add_completion=False, dan rich_markup_mode="rich" (cli/main.py:64-69). Sembilan perintah didaftarkan lewat app.command(...) dan dua grup lewat app.add_typer(...) pada objek yang sama (cli/main.py:74-83). Perintah version menyusul lewat dekorator @app.command() (cli/main.py:103-115).

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-52, cli/commands/kb.py:295-313). 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.
Fig. 1: Pohon perintah Typer GuardianObjek 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.
PerintahRegistrasiSubcommandArgumen wajib
initapp.command(name="init")——
scanapp.command(name="scan")—--target
reconapp.command(name="recon")—--target atau --domain
analyzeapp.command(name="analyze")—--input
reportapp.command(name="report")—--session
workflowapp.command(name="workflow")—action posisional
aiapp.command(name="ai")—--session atau --last
modelsapp.command(name="models")——
version@app.command()——
kbapp.add_typer(kb_app, name="kb")status, seed, update, query—
telemetryapp.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-83).

init

OpsiNilai defaultArti
--config-dir, -cPath.home() / ".guardian"direktori konfigurasi
--force, -fFalsemenimpa konfigurasi yang sudah ada

Signature dua opsi itu ada di cli/commands/init.py:14-27. 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-58). Dua direktori kerja ikut dibuat di akhir: ./reports dan ./logs (cli/commands/init.py:38-58). Bila guardian.yaml sudah ada dan --force tidak diberikan, perintah meminta konfirmasi Overwrite? sebelum menimpa (cli/commands/init.py:38-58).

scan

OpsiNilai defaultArti
--target, -twajibIP atau domain target
--ports, -ptop-1000daftar port atau preset
--config, -cconfig/guardian.yamlpath konfigurasi
--model, -mNoneoverride model AI
--providerNoneoverride provider AI

Kelima opsi itu dideklarasikan di cli/commands/scan.py:16-36. scan hanyalah pembungkus NmapTool: konfigurasi dimuat, override diterapkan, lalu nmap.execute(target, ports=ports) dijalankan lewat asyncio.run (cli/commands/scan.py:16-36). 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-52).

recon

OpsiNilai defaultArti
--target, -tNonedomain atau host target
--domain, -dNoneusang dan hidden=True
--config, -cconfig/guardian.yamlpath konfigurasi
--save / --no-saveTruesimpan hasil
--dry-runFalsecetak rencana tanpa eksekusi
--model, -mNoneoverride model AI
--provider, -pNoneoverride provider AI

Seluruh opsi tercantum di cli/commands/recon.py:18-60. 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-91). 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-save dideklarasikan dengan default True, tetapi save_results hanya muncul di blok signature dan tidak dibaca lagi di jalur eksekusi (cli/commands/recon.py:38-42).

analyze

OpsiNilai defaultArti
--input, -iwajibberkas JSON hasil scan
--format, -fmarkdownformat keluaran

Dua opsi itu ada di cli/commands/analyze.py:13-16. Badan perintah memeriksa keberadaan berkas, memuat JSON, lalu mencetak AI analysis feature coming soon! beserta jumlah findings yang ditemukan (cli/commands/analyze.py:28-37). Perintah ini belum menjalankan analisis apa pun.

report

OpsiNilai defaultArti
--session, -swajibID session sumber laporan
--format, -fmarkdownmarkdown, html, atau json
--output, -oNonepath berkas keluaran
--config, -cconfig/guardian.yamlpath konfigurasi
--export, -e[]ekspor tambahan, dapat diulang
--slack-webhookNoneURL 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-38). 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-67). Session dibaca dari ./reports/session_{session_id}.json, dan berkas yang tidak ada menghasilkan Session not found: ... (cli/commands/report.py:68-72). Laporan ditulis lewat ReporterAgent.execute, dengan ekstensi keluaran dipilih dari {"markdown": "md", "html": "html", "json": "json"} (cli/commands/report.py:74-96).

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-119).

⚠️ --export slack tanpa --slack-webhook atau env GUARDIAN_SLACK_WEBHOOK langsung berhenti dengan pesan --export slack requires --slack-webhook or GUARDIAN_SLACK_WEBHOOK env var sebelum payload dibangun (cli/commands/report.py:99-119).

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.
Fig. 2: Urutan eksekusi guardian reportPerintah memvalidasi pemilih ekspor dan berkas session lebih dulu, baru membangkitkan laporan dan menjalankan ekspor tambahan.

workflow

Posisi atau opsiNilai defaultArti
actionwajibrun atau list
--name, -nNonenama workflow untuk run
--target, -tNonetarget workflow
--config, -cconfig/guardian.yamlpath konfigurasi
--model, -mNoneoverride model AI
--provider, -pNoneoverride provider AI
--yes, -yFalsemelewati konfirmasi per tool
--resume, -rNonemelanjutkan session tersimpan

Kedelapan parameter itu ada di cli/commands/workflow.py:18-52. action == "list" memanggil _list_workflows lalu kembali (cli/commands/workflow.py:62-81). 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-81).

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-121). 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-158). Nama autonomous dirutekan ke run_autonomous, nama lain ke run_workflow (cli/commands/workflow.py:125-158). Override provider dan model diterapkan pada config["ai"] sebelum engine dibuat (cli/commands/workflow.py:131-147).

ai

OpsiNilai defaultArti
--session, -sNoneID session yang dijelaskan
--last, -lFalsejelaskan keputusan terakhir
--all, -aFalsetampilkan semua keputusan
--format, -ftabletable atau json

Opsi itu dideklarasikan di cli/commands/ai_explain.py:17-34. Tanpa --session maupun --last, perintah mencetak Please specify --session <id> or use --last lalu keluar (cli/commands/ai_explain.py:17-34). Keputusan dibaca dari kunci ai_decisions pada berkas session (cli/commands/ai_explain.py:17-34).

models

models tidak menerima parameter apa pun (cli/commands/models.py:11-23). Perintah mencetak satu tabel berisi lima kelompok provider beserta capability tiap model: GEMINI, OPENAI, CLAUDE, OPENROUTER, dan REQUESTY (cli/commands/models.py:11-23). 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-23).

kb

SubcommandArgumen dan opsiKeluaran
kb status—tabel Kind dan Rows, lalu path index
kb seed—jumlah entri yang dimasukkan
kb update--kind wajib, --accept-network, --filejumlah entri yang diingest
kb querytext posisional, --top, -k, --kind, --prompttabel 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-54). kb seed memanggil KnowledgeBase().upsert(_seed_entries()) dan melaporkan jumlah entri yang ditulis (cli/commands/kb.py:163-168).

kb update menerima --kind dengan nilai cve, cwe, attck, atau template, ditambah --accept-network dan --file (cli/commands/kb.py:174-199).

⚠️ Tanpa --file, kb update menolak melakukan fetch bila --accept-network tidak diberikan, dengan pesan Refusing to fetch without --accept-network dan exit code 1 (cli/commands/kb.py:174-199). Bila --accept-network diberikan tetapi tidak ada berkas, perintah mencetak Network corpus fetch is not bundled. lalu keluar dengan exit code 2 (cli/commands/kb.py:174-199).

kb query menerima text posisional, --top dengan default 5, penyaring --kind, dan --prompt untuk merender hasil sebagai prompt-block (cli/commands/kb.py:295-313).

telemetry

SubcommandArgumen dan opsiKeluaran
telemetry exportsource posisional, --out, -ojumlah baris JSONL
telemetry trainjsonl posisional, --out, -o, --min-confidencejumlah 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-42). 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-59). 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-75).

version

version mencetak guardian-cli <versi> (cli/main.py:103-115). 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-115).