Ana içeriğe geç

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:

  1. Kendiliğinden geçebilir mi? (eylem Kule::Action::"auto")
  2. Geçemiyorsa, bir insana sorulabilir mi? (eylem Kule::Action::"ask")

İlk evet kararı verir. İki hayır reddeder.

KararGösterimiAnlamı
Allowpasses on its ownkule commit onu uygular. Bir bağlantıya izin verilir.
Askwaits for approvalkule 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.
DenydeniedAsla 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.

KuralTürNeyle eşleşirEtkisi
ask-by-defaultpermit askHer şey.Bir forbid aksini söylemedikçe her şey bir insana sorulabilir.
filespermit autoHer dosya değişikliği (fs.*).Sıradan dosya değişiklikleri kendiliğinden geçer.
manifests-and-lockfilesforbid autoNeyin 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-filesforbid auto*.csproj, *.fsproj, requirements*.txt.Onay bekler. Hatırlanabilir.
automationforbid autoKimse 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-repositoryforbid autoÇalışma klasörünün içine yerleşmiş bir deponun .git klasöründeki dosyalar.Onay bekler.
nested-git-hooksforbid allİç içe bir depoda oluşturulan ya da değiştirilen bir hook.Reddedilir.
linksforbid autoOluş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-deleteforbid autoTek bir değişiklik kümesinde 200'den fazla silme. Bir taşıma silme sayılmaz.Onay bekler.
deletes-outside-gitforbid autoGit deposu olmayan bir klasörde 20'den fazla silme.Onay bekler. Onları yalnızca görevin kendi undo'su geri getirebilir.
branch-forwardpermit autoİleri taşınan (fast-forward) bir dal (refs/heads/*).Kendiliğinden geçer.
branch-createdpermit autoYeni bir dal.Kendiliğinden geçer. Yeni bir etiket (tag), not ya da replacement onay bekler.
package-registriespermit autoregistry.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-hooksforbid allOluş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:

KuralTürNeyle eşleşirEtkisi
carefulforbid autoHer 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.

AdNeredeAnlamı
no-rule-lets-it-passonay beklerHiçbir auto permit eşleşmedi.
no-rule-allows-askingreddedilirHiç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: …reddedilirCedar bir kuralı değerlendiremedi; reddeder.
rememberedkendiliğinden geçerKule'ye bir daha sormamasını söylediğiniz bir dosya (kule rules).
remembered-<id>kendiliğinden geçerKule'ye bir daha sormamasını söylediğiniz bir bağlantı.
profile-<agent>kendiliğinden geçerAjanı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:

ÖznitelikDeğer
kindfs.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_nameAynı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.
partsKüçük harfe çevrilmiş yolun parçaları; bir klasörü herhangi bir yerde eşleştirmek için (resource.parts.contains("migrations")).
entryfs.* için file, dir ya da symlink; diğerlerinde "".
changecreated, modified ya da deleted.
refgit.ref için: refs/heads/main gibi bir referans.
fast_forwardgit.ref için: yeni değer eskisini geçmişinde tutuyor mu.
commitsgit.ref için: kaç commit eklendiği.
host, portnet.connect için.

Ve context:

ContextDeğer
deletesBu değişiklik kümesinde silinen yollar (bir taşıma silme sayılmaz).
filesDeğ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 balanced ve careful reddeder. 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 permit reddedilir: .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.

Ayrıca bakın​