Dokümantasyon / Geliştirici modu
Shell komutları
Bir ajanın run_shell ile çalıştırdığı her komut, çalışmadan önce izin ver, sor ya da reddet olarak sınıflandırılır. Bu kararın nasıl verildiği, reddedilen komutların tam listesi, kararı ayarlayan iki izin dosyası ve bir komutta geçen host'ların nasıl değerlendirildiği bu sayfada.
run_shell
run_shell çalışma alanında tek bir komut çalıştırır. Bu araç shell.full yetkisine sahip ajanlarda bulunur: ana ajan, Code Engineer, dönüştürücüler (Report Writer, Document and Deck Writer, PDF Operator) ve GitHub Clerk. strict profili bu aracı kaldırır.
Komutlar varsayılan olarak 120 saniyelik bir timeout ile çalışır. Bu süreyi bir izin dosyasındaki timeout ile değiştirebilirsiniz, ama hiçbir şeyin aşamayacağı 600 saniyelik bir üst sınır vardır. Süreyi aşan ya da çağrısını Esc ile iptal ettiğiniz bir komut, başlattığı her şeyle birlikte sonlandırılır. Uzun çıktıların tamamı .ivralo/spill/ altına yazılır. Ajana çıktının başı, sonu ve geri kalanının nerede olduğu verilir.
Komut yalnızca izin listesindeki ortam değişkenlerini görür: PATH, temp ve home yolları, locale, kullanıcı adı, TZ ve Windows'un temel değişkenleri. GH_TOKEN ve GITHUB_TOKEN dahil hiçbir anahtar, token ya da parola komuta ulaşmaz. gh sizin kendi gh auth login oturumunuzla kimlik doğrular. GIT_TERMINAL_PROMPT=0 ve GIT_EDITOR=true gibi sabit ayarlar sayesinde editör ya da prompt açacak bir komut turu askıda bırakmak yerine hemen hata verir.
Üç karar
Komut operatörlerinden (&&, ||, |, ;, &) parçalara ayrılır, her parça ayrı sınıflandırılır ve komutun tamamı en riskli parçası kadar riskli sayılır. Karar iki kez uygulanır: aracın kendisinde ve oturumda, size sorulmadan önce.
| Karar | Ne | Örnekler |
|---|---|---|
| allow | Politikanın baştan sona okuyabildiği salt okuma komutları, git ve gh'nin salt okuma alt komutları ve allow listenizin kapsadığı her şey | ls, cat, head, grep, wc, which, git status, git log, git diff, gh pr list |
| ask | Geri kalan her şey. Oturumda diyalog açar; başında kimse olmayan bir çalıştırmada reddedilir | uv run pytest, npm install, git commit, gh pr review |
| deny | Aşağıdaki temel liste ve deny listenizin kapsadığı her şey. Gerekçesiyle reddedilir ve bunu hiçbir şey kaldıramaz: ne /confirm, ne a, ne de bir allow kaydı | rm -rf build, curl https://..., git push |
Bir komut ancak politika içindeki her şeyi görebiliyorsa salt okuma olarak kalır. Tek tırnak dışında bir $(...), bir backtick ya da bir $NAME varsa komut onay ister, çünkü shell bunları program başlamadan önce doldurur. Paket kurmak salt okuma değildir, bu yüzden projedeki diğer değişiklikler gibi onay ister. ivralo'nun kendisini çağırması (uv run ivralo ask) her zaman onay ister.
git ve gh komutları iki kez okunur: bir kez yazıldığı gibi, bir kez de global seçenekleri, .exe uzantısı ve tırnakları çıkarılarak. Böylece git -C sub push --force ile "git" push --force aynı push sayılır. -c, --config-env ya da --exec-path içeren veya program çalıştıran ya da dosya yazan bir seçenek (--ext-diff, --output=) taşıyan bir git okuma komutu onay ister.
Reddedilen komutların temel listesi
| Sınıf | Reddedilenler |
|---|---|
| Özyinelemeli silme | rm -r / rm --recursive, rmdir /s, rd /s, /s ya da /q ile del, Remove-Item -Recurse ya da -Force, joker karakterle silme |
| Disk ya da sistem değişikliği | format, diskpart, bcdedit, shutdown, schtasks, sc, reg add/delete/import, net user, net localgroup, git config --global ya da --system (okumalar dahil) |
| Kodlanmış komut | powershell -e / -enc / -encodedcommand, certutil -decode, base64 -d |
| İç içe shell | sh, bash, zsh, cmd, powershell, pwsh |
| Ağ | curl, wget, ssh, scp, sftp, ftp, telnet, nc, ncat, Invoke-WebRequest, Invoke-RestMethod, iwr, irm |
| Sistem paket yöneticisi | apt, apt-get, dnf, yum, brew, choco, winget, scoop |
| Push ya da merge | bütün git push, git send-pack, git subtree push, gh pr merge, gh pr ready, gh pr review --approve, gh repo edit --enable-auto-merge komutları, merge ya da ready içeren bütün gh api çağrıları, body içeren bütün gh api graphql çağrıları |
| Geçmişi yeniden yazma | git reset --hard, git clean, git commit --amend, git rebase -i, git filter-branch, git filter-repo, git reflog expire, git gc --prune, git update-ref -d |
| Secret'lar | env, printenv, bir anahtar, token, secret ya da parola için set, git credential, bir credential için git config, gh auth token, gh auth logout, gh auth status --show-token, bir token için gh config get, gh ssh-key, gh gpg-key |
| Gizli komut | gh alias set, gh alias import, git config alias.* |
| Tarayıcı | gh browse, gh auth login, gh auth refresh |
| Geri alınamaz | gh repo/issue/release/run/gist/project delete, gh release delete-asset, gh cache delete --all, gh api -X DELETE, bir deleteRepository mutation'ı |
| Kapalı yollar | Bir .env ya da .env.* dosyasını, .ivralo/'yu, .git/'i ya da ivralo'nun kendi config dosyalarını gösteren her kelime; hangi şekilde yazılırsa yazılsın, glob ya da yönlendirme dahil |
| Erişim dışı | Çalışma alanının dışına çıkan bir yol ve dışarıya yazan bir yönlendirme |
Temel liste, yazılana değil programa gerçekte verilene bakar. Bu yüzden başa konan bir yönlendirme (>x curl https://x) ya da kelimenin içindeki tırnaklar (c"url") hiçbir şeyi gizleyemez. Windows'ta şapka işareti ya da tek tırnak içeren bir komut hem yazıldığı gibi hem de cmd.exe'nin çalıştıracağı şekliyle değerlendirilir ve daha katı olan karar geçerli olur.
İki izin dosyası
| Dosya | Nerede geçerli |
|---|---|
ivralo'nun home dizinindeki permissions.json (yerini IVRALO_PERMISSIONS ile değiştirebilirsiniz) | Bütün çalışma alanlarında |
Repo'daki .ivralo/permissions.json | Yalnızca o repo'da; git'in dışındadır, makinenizde kalır |
{
"version": 1,
"allow": ["uv run pytest", "libreoffice --headless"],
"deny": ["python -c"],
"timeout": 300,
"allow_tools": ["edit_file"],
"hosts": { "allow": ["pypi.internal.example.com"], "deny": ["tracker.example.net"] }
}
| Anahtar | Anlamı |
|---|---|
version | Dosya formatı, 1 |
allow | Onay istemeden çalışan komut önekleri |
deny | Reddedilen komut önekleri |
timeout | Bir komutun çalışabileceği saniye, en fazla 600 |
allow_tools | Başında kimse olmayan bir çalıştırmanın kullanabileceği dosya ve git araçları (Düzenleme ve onaylar) |
hosts | Host adları ya da adresleri için allow ve deny listeleri; bir ad alt alan adlarını da kapsar |
İki dosya birleştirilir: allow, deny, allow_tools ve her hosts listesi iki dosyanın birleşimidir. Yani iki dosyadan birinde reddedilen komut reddedilir ve temel liste, iki dosyadan birindeki izne her zaman baskın gelir. timeout için repo bir değer tanımladıysa o, tanımlamadıysa home dizinindeki değer kullanılır. ivralo doctor her dosyanın neye katkı yaptığını gösterir ve her sorunun başına ilgili dosyanın adını yazar. İki dosya da her duraklamada yeniden okunur. Yani elle yaptığınız bir değişiklik, onay isteyecek bir sonraki çağrıdan itibaren geçerli olur.
Güvenmediğiniz bir klasörde repo'nun dosyası yalnızca izinleri kısıtlayabilir: deny ve hosts.deny geçerlidir, allow, allow_tools, hosts.allow ve timeout geçerli değildir.
p: bu komuta her zaman izin ver
Diyalog tek bir shell komutu için onay istediğinde, kaydedeceği önekle birlikte p seçeneğini sunar. Örneğin uv run pytest -q tests/x.py için [p] always "uv run pytest …" in this repository. Önek, komutun ilk seçeneğe, yola, tırnaklı argümana, yönlendirmeye ya da pipe'a kadar olan baş kısmıdır ve en fazla üç kelimedir. p komutu çalıştırır ve öneki home dizinindekine değil, her zaman repo'nun .ivralo/permissions.json dosyasına ekler. O önekle başlayan bir sonraki komut, yeniden başlatma gerekmeden bir allowed satırıyla çalışır.
Hiçbir önek doğru çalışamayacaksa p sunulmaz. Bu durumlar şunlardır: önek, daha uzun bir komuttan kesilmiş tek bir kelime olacaksa (python script.py her python komutuna izin verirdi), program çalıştıran bir seçenek içeren bir git komutu, bir şeyi değiştiren bir gh api çağrısı, bir pipeline ya da bir && zinciri ya da önek kaydedilse bile çalışmasına izin verilmeyecek bir komut. Sunulan önek istediğinizden genişse komutu bir kez çalıştırmak için Enter'a basın. Güvenmediğiniz bir klasörde p sunulmaz.
/permissions iki dosyanın neye izin verip neyi reddettiği
/permissions remove 2 2. girdiyi bu repo'nun dosyasından çıkar
Host'lar ve egress
Komutta bir URL içinde ya da user@host:path şeklinde geçen bir host, web araçlarını ve Python worker'ını yöneten aynı egress politikasına göre değerlendirilir. Shell, host'ları DNS sorgusu yapmadan, metinde nasıl yazılıysa öyle okur.
| Host | Karar |
|---|---|
| Link-local ya da cloud metadata adresi | Reddedilir |
hosts.deny içinde | Reddedilir |
hosts.allow içinde | İzin verilir |
| Loopback, özel bir adres, yerel bir ad ya da listede olmayan herhangi bir host | Komut bir allow kaydıyla eşleşse bile onay ister |
Bir allow kaydı komutu onaylar, komutun nereye eriştiğini onaylamaz. Komutun onay istemesinin tek nedeni bir host ise p önek yerine host'u hosts.allow'a kaydeder: [p] always reach pypi.internal.example.com from this repository. Hiçbir host içermeyen bir gh komutu host açısından değerlendirilmez, çünkü gh yalnızca giriş yapılmış host'lara erişir.