Politika kuralları
Bir görevin yaptığı her değişiklik ve bağlantı, klasörünüze ulaşmadan önce
bir Cedar politikası tarafından
değerlendirilir. Bu sayfa Kule'nin iki yerleşik politikasındaki her kuralı,
kule status, kule commit ve ağ kaydında gördüğünüz kural adlarını ve
kendi kurallarınızı nasıl yazacağınızı anlatır. Arkasındaki fikir için bkz.
Politika.
Bir karara nasıl varılır
Cedar yalnızca allow (izin ver) ya da deny (reddet) yanıtını verir; bu yüzden Kule, bir görevin yaptığı her şey (her etki, effect) hakkında ona iki soru sorar:
- Kendiliğinden geçebilir mi? (eylem
Kule::Action::"auto") - Geçemiyorsa, bir insana sorulabilir mi? (eylem
Kule::Action::"ask")
İlk evet kararı verir. İki hayır reddeder.
| Karar | Gösterimi | Anlamı |
|---|---|---|
| Allow | passes on its own | kule commit onu uygular. Bir bağlantıya izin verilir. |
| Ask | waits for approval | kule commit --approve ya da uygulamada Approve and commit gerekir. Bir bağlantı uygulamada yanıtınızı bekler; komut satırında sorulacak kimse olmadığı için reddedilir. |
| Deny | denied | Asla geçmez. |
Bir değişiklik kümesinin tamamı, etkilerinin en katı kararını alır.
Cedar'da bir forbid her zaman bir permit'e üstün gelir ve değerlendirme
sırasındaki bir hata reddeder.
Köşeli parantezlerdeki kural adları her kuralın @id'sidir:
policy: waits for approval
Cargo.toml · waits for approval (manifests-and-lockfiles)
net: example.com:443 · refused, would wait for approval; the command line asks no one (no-rule-lets-it-pass)
Kule'nin balanced politikası
Varsayılan budur. Geçerliyken kule policy ile yazdırın.
| Kural | Tür | Neyle eşleşir | Etkisi |
|---|---|---|---|
ask-by-default | permit ask | Her şey. | Bir forbid aksini söylemedikçe her şey bir insana sorulabilir. |
files | permit auto | Her dosya değişikliği (fs.*). | Sıradan dosya değişiklikleri kendiliğinden geçer. |
manifests-and-lockfiles | forbid auto | Neyin kurulacağını ya da derleneceğini belirleyen dosyalar; adlarına göre, herhangi bir klasörde, büyük/küçük harf fark etmeksizin: package.json, package-lock.json, npm-shrinkwrap.json, yarn.lock, pnpm-lock.yaml, bun.lock(b), Cargo.toml, Cargo.lock, Directory.Packages.props, Directory.Build.props/.targets, nuget.config, packages.lock.json, global.json, go.mod, go.sum, pyproject.toml, setup.py, setup.cfg, poetry.lock, uv.lock, Pipfile(.lock), Gemfile(.lock), Gradle derleme ve ayar dosyaları, pom.xml. | Onay bekler. Hatırlanabilir. |
project-files | forbid auto | *.csproj, *.fsproj, requirements*.txt. | Onay bekler. Hatırlanabilir. |
automation | forbid auto | Kimse projeyi çalıştırmadan kod çalıştıran ya da bir ajanı yönlendiren şeyler. .github, .circleci, .devcontainer, .vscode, .idea, .zed, .kule, .husky, .claude, .cursor, .gemini, .codex, .cargo, .mvn, .yarn, .buildkite, .gitea, .forgejo, .woodpecker, .windsurf, .continue, .roo, .clinerules ya da gradle/wrapper/ içindeki her şey; ve .gitlab-ci*, .envrc, .gitattributes, .gitmodules, .npmrc, .yarnrc(.yml), .pnpmfile.cjs, build.rs, gradlew, mise.toml, .tool-versions, .pre-commit-config.yaml, lefthook.yml, .mcp.json, CLAUDE.md, AGENTS.md, GEMINI.md, .cursorrules, rust-toolchain(.toml), mvnw, bunfig.toml, dotnet-tools.json, azure-pipelines.yml, .travis.yml, Jenkinsfile, bitbucket-pipelines.yml, opencode.json, .aider.conf.yml gibi dosyalar. | Onay bekler. Hatırlanabilir (.kule/ altındakiler hariç). |
nested-repository | forbid auto | Çalışma klasörünün içine yerleşmiş bir deponun .git klasöründeki dosyalar. | Onay bekler. |
nested-git-hooks | forbid all | İç içe bir depoda oluşturulan ya da değiştirilen bir hook. | Reddedilir. |
links | forbid auto | Oluşturulan, değiştirilen ya da silinen bir sembolik bağlantı. | Onay bekler. Bir bağlantı, gösterdiği her yere götürür. |
mass-delete | forbid auto | Tek bir değişiklik kümesinde 200'den fazla silme. Bir taşıma silme sayılmaz. | Onay bekler. |
deletes-outside-git | forbid auto | Git deposu olmayan bir klasörde 20'den fazla silme. | Onay bekler. Onları yalnızca görevin kendi undo'su geri getirebilir. |
branch-forward | permit auto | İleri taşınan (fast-forward) bir dal (refs/heads/*). | Kendiliğinden geçer. |
branch-created | permit auto | Yeni bir dal. | Kendiliğinden geçer. Yeni bir etiket (tag), not ya da replacement onay bekler. |
package-registries | permit auto | registry.npmjs.org, registry.yarnpkg.com, crates.io, index.crates.io, static.crates.io, static.rust-lang.org, api.nuget.org, globalcdn.nuget.org, pypi.org, files.pythonhosted.org, rubygems.org, repo.maven.apache.org, repo1.maven.org adreslerine HTTPS (443 numaralı port). | Kendiliğinden geçer. |
git-hooks | forbid all | Oluşturulan ya da değiştirilen bir git hook'u. Hook'lar bir sonraki git komutunuzda, sizin yetkilerinizle çalışır. | Reddedilir. |
Hiçbir auto permit ile eşleşmeyen ve bu yüzden onay bekleyenler
(no-rule-lets-it-pass): git config değişiklikleri, dosyalardan farklı
olan stage'lenmiş girdiler, geçmişin yeniden yazılması, silinen dallar,
değiştirilen bir HEAD, diğer ref'ler (etiketler, notlar, replacement'lar)
ve git host'ları dahil yukarıda listelenmeyen her host (TLS içinde bir
push, bir fetch'ten ayırt edilemez).
Kule'nin careful politikası
kule policy careful, balanced politikayı sonuna bir kural daha ekleyerek
yazar:
| Kural | Tür | Neyle eşleşir | Etkisi |
|---|---|---|---|
careful | forbid auto | Her dosya değişikliği ve her git değişikliği. | Her değişiklik sizi bekler. Yalnızca yukarıdaki bağlantılar (ve her ajanın kendi host'ları) kendiliğinden geçer. |
Careful altında hatırlanan bir dosya geçmez: careful her dosyayı sorar ve
bu soru kalıcı olarak yanıtlanamaz.
Kule'nin eklediği adlar
Bunlar politika metninde görünmez; Kule onları değerlendirme sırasında ekler.
| Ad | Nerede | Anlamı |
|---|---|---|
no-rule-lets-it-pass | onay bekler | Hiçbir auto permit eşleşmedi. |
no-rule-allows-asking | reddedilir | Hiçbir ask permit eşleşmedi; bu yüzden size sorulamaz bile. ask-by-default'u dışarıda bırakan kendi politikanızla olur. |
policy-error: … | reddedilir | Cedar bir kuralı değerlendiremedi; reddeder. |
remembered | kendiliğinden geçer | Kule'ye bir daha sormamasını söylediğiniz bir dosya (kule rules). |
remembered-<id> | kendiliğinden geçer | Kule'ye bir daha sormamasını söylediğiniz bir bağlantı. |
profile-<agent> | kendiliğinden geçer | Ajanın profilindeki bir host ya da modelinin API'si; yalnızca o ajan çalışırken açıktır (örneğin api.anthropic.com için profile-claude-code). |
Bir kuralın bakabildikleri
Her etki, şu özniteliklere sahip bir Kule::Effect varlığıdır:
| Öznitelik | Değer |
|---|---|
kind | fs.create, fs.modify, fs.delete, git.ref, git.config, git.hook, git.staged, git.other, net.connect |
path, name | Çalışma klasöründeki yol ve son parçası (git.ref için ""). |
folded_path, folded_name | Aynıları, küçük harfle. Bunlarla eşleştirin: macOS diskleri varsayılan olarak büyük/küçük harfi yok sayar, onları okuyan araçlar da öyle. |
parts | Küçük harfe çevrilmiş yolun parçaları; bir klasörü herhangi bir yerde eşleştirmek için (resource.parts.contains("migrations")). |
entry | fs.* için file, dir ya da symlink; diğerlerinde "". |
change | created, modified ya da deleted. |
ref | git.ref için: refs/heads/main gibi bir referans. |
fast_forward | git.ref için: yeni değer eskisini geçmişinde tutuyor mu. |
commits | git.ref için: kaç commit eklendiği. |
host, port | net.connect için. |
Ve context:
| Context | Değer |
|---|---|
deletes | Bu değişiklik kümesinde silinen yollar (bir taşıma silme sayılmaz). |
files | Değişen yollar. |
repository | Çalışma klasörünün bir git deposu olup olmadığı. |
Kendi politikanız, her görev için
Bir politikayı Kule'nin ev dizinine policy.cedar olarak kaydedin
(~/.kule/policy.cedar). Bu, her görev için Kule'ninkinin yerine geçer
(kendi politikası olan bir grup kendisininkini korur). Bir forbid hiçbir
zaman geçersiz kılınamadığı için Kule'nin kurallarını gevşetmenin tek yolu
onları değiştirmektir; bu yüzden Kule'nin metninden başlayın ve yalnızca
değiştirmek istediğiniz yeri değiştirin:
kule policy > ~/my-policy.cedar # balanced geçerliyken
# düzenleyin, sonra:
cp ~/my-policy.cedar ~/.kule/policy.cedar
kule policy | tail -5 # Kule artık sizinkini yazar
Örnek: bir şirket paket aynasının (mirror) sormadan geçmesine izin verin. Kopyanın sonuna ekleyin:
// Our own: the company's package mirror passes on its own.
@id("company-mirror")
permit (principal, action == Kule::Action::"auto", resource)
when { resource.kind == "net.connect" && resource.port == 443 && resource.host == "npm.example.com" };
Oraya giden bir bağlantı sonra şöyle görünür:
net: npm.example.com:443 · tunneled (company-mirror)
- Kule dosyanızın üzerine asla yazmaz: dosya oradayken
kule policy balancedvecarefulreddeder. Geri dönmek için dosyayı silin ya da taşıyın. - Ayrıştırılamayan bir dosya Kule'nin değerlendirme yapmasını durdurur; bu
yüzden komutlar, çalıştırmalar ve commit'ler, dosya düzeltilene kadar
reddedilir (
kule: policy: unexpected end of input). ask-by-default'u tutun; yoksa size hiçbir şey sorulamaz ve bekletilen her değişiklik reddedilir.
Bir deponun kendi kuralları
Bir depo, kökündeki .kule/policy.cedar ile üzerinde çalışan herkes için
politikayı sıkılaştırabilir. Bu dosya yalnızca forbid kuralları
içerebilir:
// Changes to database migrations never pass, not even with approval.
@id("no-migrations")
forbid (principal, action, resource)
when { resource.kind like "fs.*" && resource.parts.contains("migrations") };
Sonra:
$ kule status 1046fb30
4 file changes: +4 ~0 -0
+ db/
+ db/migrations/
+ db/migrations/001.sql
+ notes.md
policy: denied
db/migrations · denied (no-migrations)
db/migrations/001.sql · denied (no-migrations)
$ kule commit 1046fb30 --approve
...
kule: not committed; the policy denies the changes above
forbid (principal, action, resource) iki soruyu da kapsar; bu yüzden
değişiklik reddedilir. Onun yerine onay beklemesi için
action == Kule::Action::"auto" yazın.
- Kule bu dosyayı bir görevin kopyasından değil, her zaman gerçek
klasörünüzden okur; böylece bir ajan onu zayıflatamaz. Bir kopyada ona
yapılan değişiklikler sizi bekler (
automation) ve hatırlanamaz. - İçindeki bir
permitreddedilir:.kule/policy.cedar may only contain forbid rules: a repository can tighten the policy, never loosen it. - Deponun forbid kuralları her politikada geçerlidir: balanced, careful, sizinki ve her grubunki.
Bir grubun kendi politikası
kule group policy ID own --file PATH, bir gruba kaydedilmeden önce
denetlenen kendi politikasını verir. policy.cedar için geçerli olan
kurallar aynen geçerlidir. Bkz. kule group.