Düzeltildi
Dotfiles
- Aynı origin’i paylaşan ve encrypted file takip eden makineler artık ciphertext’i sürekli birbirleri arasında değiştirip durmuyor. age encryption, aynı content için farklı ciphertext ürettiğinden mise dot watch, gerçekte hiçbir edit yapılmasa bile sonsuz şekilde commit yayınlayabiliyordu. mise artık decrypted content, mode ve recipient’lar aynıysa history’de bulunan ciphertext’i koruyor. Hâlihazırda loop’a girmiş makineler bir sonraki sync sonrasında normale dönüyor.
- Uzun history’lerde mise dot pull artık çok daha hızlı. Git process sayısı artık history uzunluğuyla birlikte artmıyor. 2.000 commit içeren bir testte pull süresi 137 saniyeden 6 saniyenin altına düştü.
- Başka bir operation daha önce save yaptığı için pull planı outdated olduğunda bu durum failed apply olarak değerlendiriliyor ve biri manuel olarak mise dot pull çalıştırana kadar sharing duraklatılıyordu. Artık henüz hiçbir şey yazılmadıysa mise bir sonraki attempt’te yeniden deniyor ve watcher değişiklikleri uygulamaya devam ediyor.
- Interrupted history operation sonrasında mise dot pull --yes artık "local saved history changed since planning" hatasıyla başarısız olmuyor. Pull işlemi artık planlama yapmadan önce interrupted operation’ı recover ediyor.
- Incoming version ile content ve mode açısından zaten aynı olan bir file artık sharing’i duraklatan unsaved edit veya conflict olarak tutulmuyor. Önceki bir pull tarafından zaten resolve edilmiş path için mise dot pull --take-remote <path> komutunu tekrar çalıştırmak da artık "is not a conflict" hatası vermiyor.
Eklendi
~/.local/share/mise/installs/maven/
- global runtime symlink: Her tool’un install directory’sine artık global ve system config’in seçtiği version’a işaret eden bir global link ekleniyor. mise çalıştıramayan IDE gibi programlar bu path’i kullanabiliyor ve mise use -g ile yapılan değişiklikleri otomatik olarak takip edebiliyor.
├── 3.9.13/
├── 3.9.16/
└── global -> ./3.9.16
Link, diğer runtime symlink’leriyle (latest, 3, vb.) birlikte güncelleniyor; örneğin mise use -g, mise install ve mise upgrade sonrasında. Project config ve MISE_*_VERSION bu link’i değiştirmiyor. Global config ilgili tool’u seçmiyorsa mise link’i kaldırıyor. global adlı gerçek bir directory varsa dokunulmuyor. Bu özellik her zaman açık ve kapatmak için bir setting bulunmuyor.
Düzeltildi
- HTTP request’ler artık response body transfer sırasında yarıda kesilirse http_retries değerine kadar retry ediliyor. Önceden yalnızca request ve header aşaması retry ediliyordu; bu yüzden version list veya release page transfer ortasında kesilirse error decoding response body hatası oluşuyordu. Bu davranış text, JSON ve byte request’lerinin yanı sıra version_regex ile okunan version list’ler için de geçerli.
- mise install, release tag içinde @ bulunan lockfile entry’lerini artık reddetmiyor. Örneğin [email protected]. mise lock bu tag’leri percent-encoded olarak cli%400.46.0 şeklinde yazıyordu ve locked-URL check bunu yanlışlıkla 400.46.0 version’ı olarak yorumluyordu.
- Dotfiles history index rebuild işlemleri artık içeriği değişmemiş checkpoint metadata file’larını atlıyor. Büyük history’lerde rebuild işlemi önceden tüm file’ları yeniden yazıyor, dakikalarca disk write oluşturuyor ve mise dot save komutunun another history operation is running hatasıyla başarısız olmasına yol açabiliyordu.
- JSON schema artık task’larda outputs = { auto = false } kullanımını kabul ediyor. Böylece tombi ve Taplo gibi editor ve linter’lar bunu yanlışlıkla error olarak işaretlemiyor. mise davranışı değişmedi; auto = false, outputs ayarını hiç belirtmemekle aynı anlama geliyor.
Dokümantasyon
- Dotfiles dokümantasyonu artık önerilen setup ile başlıyor.
- Modes-and-keys reference table üç daha okunabilir column olacak şekilde yeniden düzenlendi.
Registry
- Yeni aqua package’lar eklendi:
- runxhq/runx
- takumin/passt-bin
Eklendi
- Shell prompt’ta automatic update: Önceden auto_update, yalnızca bir shim veya mise exec bir tool launch ettiğinde çalışıyordu. mise activate ile tool’lar doğrudan PATH üzerinden çalıştığı için hiç update edilmiyorlardı. Artık check zamanı geldiğinde mise hook-env, update işlemini detached background process olarak başlatıyor. Prompt beklemiyor ve herhangi bir output gösterilmiyor. Update tamamlandıktan sonraki command yeni version’ı kullanıyor. Mevcut kurallar geçerliliğini koruyor: yalnızca global config dikkate alınıyor, exact version’lar değişmiyor, offline durumda, CI’da veya locked ile update yapılmıyor ve minimum_release_age uygulanıyor. tool-update service çalışıyorsa prompt’lar update işini ona bırakıyor. Başarısız background update’ler mise doctor içinde gösteriliyor.
- tool_update.global_auto: Global config içindeki tüm tool’lar için automatic update’i tek seferde etkinleştiriyor. auto_update ile aynı değerleri kabul ediyor: true, her tool_update.check_duration süresinde bir kontrol yapıyor (varsayılan 24 saat); duration verilirse interval olarak kullanılıyor. Tool’un kendi auto_update ayarı öncelikli olduğundan auto_update = false ile belirli bir tool devre dışı bırakılabiliyor. Project’ler bu setting’i etkinleştiremiyor. MISE_TOOL_UPDATE_GLOBAL_AUTO ile de ayarlanabilir. self_update.auto artık interval de kabul ediyor; örneğin self_update.auto = "1d".
~/.config/mise/config.toml
[settings]
tool_update.global_auto = "12h"
[tools]
claude = "latest" # Her 12 saatte kontrol edilir
node = { version = "24", auto_update = "6h" } # Kendi interval'i önceliklidir
python = { version = "3.13", auto_update = false } # Devre dışı
mise outdated --global claude --json
- mise upgrade --global ve mise outdated --global: Bir project kendi version’ını pin etse veya MISE_<TOOL>_VERSION ayarlanmış olsa bile yalnızca global ve system config içindeki tool request’leri üzerinde çalışıyor. Project’in mise.toml, lockfile ve [env] bölümü okunmuyor veya değiştirilmez. --bump, global config’e yazıyor. --global, --local veya --inactive ile birlikte kullanılamıyor. Ayrıca kendi kendini güncelleyen coding agent gibi tool’ların mise installation’ını algılayıp kendi kurulumlarının üzerine yazmak yerine mise üzerinden update olmasını açıklayan yeni bir Self-updating tools dokümantasyon sayfası eklendi.
mise upgrade --global claude
- Doğrulanmış download cache: Tamamlanan download’lar $MISE_CACHE_DIR/downloads-cas içinde tek kopya olarak saklanıyor ve her reuse öncesinde tekrar hash kontrolünden geçiriliyor. Cache’teki file artık eşleşmiyorsa silinip yeniden indiriliyor.
- Server ETag veya Last-Modified header gönderdiyse aynı URL için sonraki request conditional oluyor. 304 Not Modified durumunda mise file’ı tekrar download etmeden cache’ten kullanıyor. Bu davranış mise HTTP client üzerinden yapılan tüm download’lar için geçerli.
- Pinned checksum bulunan tool’larda — tool option, mise.lock veya packslip digest üzerinden — http, github, aqua, packslip ve precompiled core tool’lar (Node, Go, Bun, Deno, Zig, Java, Python, Ruby, Erlang, Elixir, Swift) cached file’ı network request yapmadan yeniden kullanıyor. File yerine hard link oluşturulduğu için ek disk alanı kullanılmıyor.
- --locked veya paranoid kullanıldığında mise cache’i yalnızca pinned checksum bulunan download’lar için kullanıyor. Böylece CI cache download süresini azaltabiliyor ancak neyin install edileceğini değiştiremiyor. CI guide artık installed tool’lar yerine ~/.cache/mise/downloads-cas cache’lenmesini gösteriyor.
- download_cache_max_size, cache size limit’ini belirliyor. Varsayılan 2GiB; 0 limitsiz anlamına geliyor. Cache dolduğunda least recently used file’lar kaldırılıyor.
- download_cache = false veya MISE_DOWNLOAD_CACHE=0 ile cache tamamen kapatılabiliyor.
- Executable kurmayan npm: package’lar artık warning gösteriyor: Örneğin mise use npm:lodash önceden hiçbir shim oluşturmamasına rağmen sessizce başarılı oluyordu. Install işlemi yine başarılı oluyor ancak artık warning gösteriliyor.
Düzeltildi
- 2026.10.3 sürümündeki .env parsing regression’ları düzeltildi. Bu sorunlar [env] _.file ve env_file setting’ini etkiliyordu:
- Single-quoted value içindeki backslash karakterleri yeniden literal olarak değerlendiriliyor. Böylece '\\fileserver\share' ve 'C:\temp\' gibi Windows path’leri doğru yükleniyor. Single quote gömmek için double quote kullanılmalı.
- Yan yana gelen quoted ve unquoted parçalar shell’de olduğu gibi yeniden birleştiriliyor. Örneğin A='it'\''s' → it's, B=a'b c'd → ab cd. Önceden bu satırlar syntax error oluşturup file’ın geri kalanının okunmamasına neden olabiliyordu.
- Unquoted value içindeki quote karakterleri artık kaldırılıyor. Quote’ları koruması gereken JSON değerleri single-quoted yazılmalı: CONFIG='{"debug": true}'.
- Aynı satırda matching closing quote bulunmayan quote literal olarak korunuyor. Örneğin NAME=O'Brien olduğu gibi okunuyor.
- mise run, install sonrasında tool list reload edilirken listeyi okuduğunda zaman zaman oluşan called Option::unwrap() on a None value crash’i artık yaşamıyor.
- Windows’ta core.autocrlf=true iken mise bootstrap repos status, yeni clone edilmiş repo’ları artık yanlışlıkla dirty olarak göstermiyor.
- Windows’ta mise dot apply, mode = "symlink" kullanan bir dotfile’ın target’ı directory junction ise ve source değişmişse artık bağlantıyı yeniden yönlendirebiliyor. Önceden os error 5 ile başarısız oluyordu.
- history.describe_command, home@work/... gibi variant üzerinden tracked file’larda artık düzgün çalışıyor. Variant directory içindeki eklenen veya kaldırılan file’lar da buna dahil. Encrypted file’lar diff dışında tutulmaya devam ediyor.
- history.enabled = false iken mise doctor artık dotfiles: bölümünü, history repo: ve origin: bilgileriyle birlikte gösteriyor. mise doctor --json çıktısına dotfiles.history_enabled ve dotfiles.tracking_error alanları eklendi.
- mise lock, aqua registry version prefix’lerini — örneğin Codex için rust- — version override seçmeden önce artık uyguluyor. Önceden windows-x64 gibi platform entry’leri atlanabiliyordu. Birden fazla prefix family eşleşirse mise artık warning gösterip entry’yi atlıyor; rastgele seçim yapmıyor.
- Rustup profile alias’ları m, d, c ve empty value artık sırasıyla minimal, default ve complete gibi değerlendiriliyor. profile = "d" kullanıldığında mise install, clippy ve rustfmt gibi eksik component’leri artık yeniden kuruyor. Geçersiz profile name’ler rustup’ın valid name listesini içeren error ile başarısız oluyor.
- Cargo backend, CARGO_HOME / RUSTUP_HOME değerleri rust.cargo_home / rust.rustup_home setting’leri veya [env] içindeki MISE_CARGO_HOME / MISE_RUSTUP_HOME ile ayarlandığında artık rust plugin ile aynı rust-state lock’u kullanıyor. Önceden parallel source-build install’lar race condition nedeniyle başarısız olabiliyordu.
- self_update.auto özelliğini etkinleştirme hint’i artık yalnızca ilk seferde değil, her mise version ve mise self-update çalıştırmasında gösteriliyor. Auto-update etkinleştirildiğinde veya mise settings add disable_hints auto_update çalıştırıldığında gösterim duruyor.
- JSON schema artık mise’ın gerçekten kabul ettiği yapıyla eşleşiyor; böylece tombi ve Taplo gibi editor ve linter’lar doğru error’ları raporluyor:
- Task array’leri { task = ... } ve { tasks = [...] } entry’lerini kabul ediyor.
- depends, depends_post ve wait_for tek table kabul ediyor; depends = [[]] gibi empty nested list’ler reddediliyor.
- [env] içinde value ile required = true veya help string’i birleştiren entry’ler ve value olmadan { required = false } kullanan entry’ler artık reddediliyor.
Eklendi
[vars.git_name]
- Makine bazlı [vars] prompt’ları: Bir var için prompt ile birlikte default veya required tanımlanabiliyor. mise değeri yalnızca bir kez soruyor ve cevabı config ile dotfiles history dışında, $MISE_STATE_DIR/vars.toml içine kaydediyor. Template, task ve tool’lar bu değeri normal şekilde kullanıyor. Böylece ortak bir dotfiles setup, her makinede farklı Git identity kullanabiliyor.
default = "Ada Lovelace"
prompt = "Git author name"
[vars.git_email]
required = "Run mise vars prompt to set git_email"
prompt = "Git email"
mise vars
mise vars prompt
mise vars git_name=Ada
mise vars unset git_name
mise bootstrap --prompt-vars
Yalnızca mise vars prompt ve mise bootstrap --prompt-vars kullanıcıya soru soruyor. Diğer tüm işlemler önce saved answer’ı, ardından default değerini kullanıyor. Öncelik sırası yüksekten düşüğe: process environment, daha yüksek öncelikli config file’daki değer, saved answer, default. Cevaplar var name’e göre tutulduğu için aynı adı kullanan project’ler aynı makinede aynı cevabı paylaşır. prompt, [env] içinde kullanılamıyor.
include = ["./config/tools.toml", "/etc/mise/team.toml"]
- include içinde local path desteği: mise.toml içindeki include artık yalnızca git:: ve oci:: reference’larını değil, local TOML file’larını da kabul ediyor. Path, include eden file’a göre relative veya absolute olabilir. Local file’lar remote include’larla aynı şekilde merge ediliyor ve include eden file’ın hemen altında precedence alıyor. Her load işleminde yeniden okunuyor; bu nedenle edit’ler anında uygulanıyor ve cached env invalidate ediliyor. Paranoid mode local include’ları reddediyor; safe mode ise project config içindeki tüm include’ları yine atlıyor.
- mise bootstrap, clone işleminden önce git ve ssh kurabiliyor: mise bootstrap --from ve --adopt, git bulunmadığında önceden spawn error ile başarısız oluyordu. Artık mise git’i kontrol ediyor; URL ssh:// veya user@host
ath biçimindeyse ssh’i de kontrol ediyor ve eksik olanları host package manager ile kurmayı teklif ediyor. Desteklenen manager’lar: apt, dnf, pacman, apk, zypper, Homebrew, scoop ve winget. --yes teklifi otomatik kabul ediyor, --dry-run ise yalnızca eksikleri raporluyor.
- mise dot save --re-encrypt: [history.encryption] recipients değiştirildikten sonra normal save, bazı encrypted file’ları eski key’lerle bırakabiliyordu. --re-encrypt, yeni checkpoint içindeki tüm saved file’ları mevcut recipient’lara göre yeniden encrypt ediyor. Unsaved edit’leri hiçbir zaman capture etmiyor. Makine bazı file’ların kilidini açamıyorsa hiçbir şey kaydedilmiyor ve error tüm sorunlu file’ları listeliyor.
- mise dot status artık unsaved change’leri gösteriyor: Latest checkpoint’ten sonra değişen tracked path’ler listeleniyor. Daha önce watcher durmuşsa veya entry --no-autosave kullanıyorsa bu değişiklikler görünmüyordu. --json çıktısında bu path’ler history.unsaved altında raporlanıyor. Henüz checkpoint yoksa veya encrypted file’lar prompt olmadan karşılaştırılamıyorsa değer null oluyor.
Değiştirildi
mise run --affected build
- mise run --affected artık working-tree change’lerini de hesaba katıyor; workspace graph experimental olmaktan çıktı: Committed base...head range’e ek olarak staged/unstaged edit’ler ve ignored olmayan untracked file’lar da dahil ediliyor. Seçim şu flag’lerle daraltılabiliyor:
- --affected-committed
- --affected-uncommitted
- --affected-untracked
Bunlar birlikte kullanılabiliyor. Environment variable karşılıkları MISE_AFFECTED_*. Working-tree change’leri yalnızca head current checkout olduğunda hesaba katılıyor. Eski committed-only davranışı için --affected-committed kullanılabilir.
mise run --affected --affected-uncommitted --affected-untracked build
mise run --affected --affected-committed build
--affected, mise tasks graph, [monorepo.task_defaults], [monorepo.projects] ve task.auto_infer artık experimental = true gerektirmiyor.
- Dotfile credential check’leri: .example, .sample veya .template ile biten file name’ler artık credential name rule’larına takılmıyor. Publish öncesi content scan ise bunları hâlâ kontrol ediyor. Bir file plaintext tracking için bir kez approve edildiyse mise artık her save’de tekrar warning göstermiyor.
- mise dot track plaintext için yalnızca terminalde confirmation istiyor: Credential-named bir file plaintext olarak kaydedilmeden önce yalnızca hem stdin hem stderr terminal ise soru soruluyor. Daha önce pipe edilen bir satır, örneğin while read loop’taki sonraki entry, yanlışlıkla cevap olarak alınabiliyordu. Script’lerde --allow-plaintext veya --encrypt kullanılması gerekiyor.
Düzeltildi
- Lazy tool’lar artık diğer lazy tool’lar için remote lookup tetiklemiyor: Önceden launch edilmeyen configured lazy tool’lar için bile version lookup yapılıyordu. Cold cache ve offline durumda tek bir tool launch etmek diğer tüm lookup’ları bekliyor ve warning üretebiliyordu. Offline bir testte launch süresi 41 saniyeye kadar çıkmıştı. Bu durum artık şu senaryolarda oluşmuyor:
- auto_update tool launch öncesi update
- mise x veya shim yeni version kurduktan sonra
- Lazy tool’un shim üzerinden ilk launch’ı
mise install, mise upgrade ve mise use yine tüm tool’ları resolve ediyor.- Parallel npm: install’larda Too many open files: macOS’un varsayılan launchd soft limit’i 256 olduğunda parallel install’lar başarısız olabiliyordu. Unix’te mise artık startup sırasında soft open-file limit’ini hard limit’e doğru, en fazla 10240 olacak şekilde yükseltiyor ve hiçbir zaman düşürmüyor.
- Düzensiz go.mod kullanan go: tool’lar: Published go.mod içinde eksik requirement bulunan tool’lar artık install edilebiliyor. Örneğin go:tailscale.com/cmd/tailscale. mise artık go install için -mod=readonly yerine -mod=mod kullanıyor. Project’in GOFLAGS=-mod=vendor ayarı bu install’ları yine etkilemiyor.
- Filesystem root’taki config: Docker image içindeki /mise.toml gibi / altında bulunan config file artık mise install ve mise exec sırasında panic oluşturmuyor.
- .NET install’ları: Başka mise-managed SDK shim’lerden önce PATH üzerinde olduğunda yeni .NET SDK install sonrasında "was not found in dotnet --list-sdks output" hatası oluşmuyordu. Post-install check artık doğrudan yeni SDK’nın dotnet executable’ını çalıştırıyor.
- Shim ve directory çakışmaları: Shim’ler ve mise which artık başka tool’un bin path’indeki bir directory’yi binary name olarak resolve etmiyor. Önceden hunk içindeki skills/ directory, npm:skills kullanımını Permission denied ile engelleyebiliyordu.
- mise oci build ve multiple version: Birden fazla version’a pin edilmiş tool artık embedded /etc/mise/config.toml içine resolution order ile tek array olarak yazılıyor. Önceden her version ayrı duplicate key oluşturuyor ve container içindeki config’i okunamaz hâle getiriyordu.
- Unlock edilemeyen encrypted file’lar: mise bootstrap --adopt, mise dot pull ve mise dot sync artık ilk encrypted file’da durmak yerine unlock edilemeyen tüm file’ları tek error içinde listeliyor. Damaged file’lar ise sync’i hâlâ anında durduruyor.
- Rollback ve undo message’ları: mise dot rollback <path> artık restore edilen version’ı hangi checkpoint’in kaydettiğini gösteriyor ve bu bilgi mise dot history --path ile eşleşiyor. Rollback ve undo ayrıca kaydettikleri iki checkpoint’i de adlandırıyor: operation sonucu ve operation öncesindeki state’i tutan checkpoint. Restore edilen içerik değişmedi.
- Adopt edilmiş makinelerde mise dot status: Shared setup adopt edilmiş bir makinede history tracked entry’ler içerirken artık yanlışlıkla "nothing configured in [dotfiles]" yazmıyor.
Yeni Katkıda Bulunanlar
- @jovial-liu
Değiştirildi
- Geri alınabilen dotfile işlemleri artık plan gösterildikten sonra confirmation istemiyor. Buna dot pull, dot track, undo, rollback, connect ve bootstrap --adopt dahil. --replace-history, dot recover --keep-current ve implode gibi destructive işlemler ise confirmation istemeye devam ediyor. --yes ve MISE_YES seçenekleri hâlâ destekleniyor.
- Safe mode (MISE_SAFE=1) artık project içindeki [bootstrap], [dotfiles] ve [dotfile_groups] yapılandırmalarını yok sayıyor. Önceden untrusted bir repository $HOME içine file linkleyebiliyor veya repository clone edebiliyordu. Global ve system config ise uygulanmaya devam ediyor.
Eklendi
- Dotfile group’ları. Artık [dotfile_groups.<name>] ile bir directory tree’yi grup olarak tanımlayabilirsiniz. GNU Stow benzeri şekilde her uygulama veya machine role için ayrı bir directory kullanılabilir. mise, grubun root dizinini tarar ve her dosyayı target altında aynı path’e deploy eder; varsayılan hedef ~ dizinidir. Böylece dosyaları tek tek listelemek gerekmez. Bir machine, hangi grupların uygulanacağını [bootstrap] dotfile_groups ile seçebilir. Bu liste tanımlanmazsa tüm gruplar uygulanır.
[dotfile_groups.home]
root = "home" # dotfiles.root'a göre relative
dot_prefix = true # dot-config/ -> .config/
exclude = ["README.md"]
[dotfile_groups.home.entries]
"~/.config/kitty" = { mode = "symlink" } # directory'nin tamamını linkle
"~/.gitconfig" = { source = "git/config.tmpl", mode = "template" }
[bootstrap]
dotfile_groups = ["home", "zsh"]
- Group’lar mode (symlink-each varsayılan; ayrıca copy veya symlink), exclude, dot_prefix, manifest ve relative seçeneklerini destekliyor.
- [dotfile_groups.<name>.entries] tablosu [dotfiles] ile aynı syntax’ı kullanıyor ve burada tanımlanan path’leri otomatik directory taramasından çıkarıyor. Böylece bir directory’nin tamamını linkleyebilir, template render edebilir veya bir dosyayı absent olarak işaretleyebilirsiniz.
- Seçili iki group aynı dosyaya yazmaya çalışırsa apply ve status, herhangi bir dosya yazılmadan önce başarısız oluyor ve hata mesajında iki group’un adı da gösteriliyor.
- mise, her group’un deploy ettiği dosyaları $MISE_STATE_DIR/dotfiles/groups/ altında kaydediyor. mise dot status, artık hiçbir aktif entry tarafından deploy edilmeyen dosyaları orphaned olarak gösteriyor. mise dot apply --prune, onay aldıktan sonra bunları kaldırıyor. mise dot unapply --group <name> ise group artık config’te bulunmasa bile o group’a ait dosyaları kaldırabiliyor. --force kullanılmadığı sürece mise yalnızca hâlâ source’una işaret eden symlink’leri ve yazdığı içerikle hâlâ eşleşen copy’leri kaldırıyor.
- mise dot add ve mise dot edit, dosyaları ilgili group’un target path’inden group root’una yerleştiriyor. Birden fazla group eşleşebiliyorsa her iki command da --group seçeneğini destekliyor.
- mise oci build, group directory tree’lerini pakete dahil etmiyor.
- [bootstrap.compose] içinde template desteği. Bir Compose project’indeki project_dir, files, env_files, command ve depends_on dahil tüm string field’lar artık tanımlandıkları config’in context’iyle Tera template olarak render ediliyor. Shared config’ler artık hardcoded absolute path yerine {{ config_root }}, {{ vars.* }} veya {{ env.* }} kullanabiliyor. Bu template’lerde exec() kullanımına izin verilmiyor.
[bootstrap.compose.mempalace]
project_dir = "{{ config_root }}/mempalace"
files = ["compose.yaml"]
env_files = [".env"]- Task confirm prompt’ları için custom label desteği. confirm’in object form’u artık yes ve no label’larını kabul ediyor. Bu label’lar message ile aynı template desteğine sahip. default artık optional ve belirtilmezse yine yes kullanılıyor. Pipe ile verilen cevaplar hâlâ y/n değerlerini kullanıyor ve --yes yine prompt’u atlıyor.
[tasks.deploy]
confirm = { message = "Deploy to production?", yes = "Deploy", no = "Cancel", default = "no" }
run = "deploy.sh"Düzeltildi
- Dotenv ${VAR} expansion artık önce dosyanın kendi değerlerini kontrol ediyor. Önceden bir dotenv dosyasındaki ${VAR} önce process environment’tan okunuyordu. mise activate başka bir .env dosyasını export ettiğinde, bir reference aynı dosyada daha önce tanımlanan değeri kullanmak yerine shell’deki değere genişleyebiliyordu. Artık önce dosyanın daha önceki assignment’ları, ardından daha önce yüklenmiş değerler (expand = true ile) veya process environment kontrol ediliyor. ${VAR:-default}, ${VAR:+alt} ve ${VAR:?message} biçimleri de artık çalışıyor. env_file ayarı bir syntax error ile karşılaşırsa mise, hata öncesinde okuduğu assignment’ları koruyor ve dosya için tek bir warning gösteriyor.
- mise x tool@latest artık diğer tool’ları eksik göstermiyor. Önceden herhangi bir @latest argument’i verilmesi, tüm configured tool’ların newest release’e göre resolve edilmesine ve lockfile’ın yok sayılmasına neden oluyordu. Bu yüzden kurulu ve lock edilmiş tool’lar missing olarak görünebiliyordu. Artık yalnızca command line’da belirtilen tool’lar latest sürüme resolve ediliyor.
- Ruby source build’leri artık depends tool’larını görebiliyor. ruby-build artık tanımlanmış dependency’leri PATH üzerinden görebiliyor. Örneğin JRuby build’leri system JDK yerine mise tarafından yönetilen java kullanabiliyor. Dependency tanımlanmamışsa PATH değişmeden kalıyor.
Güvenlik
- Secret değerlerin ekstra plaintext kopyaları artık oluşturulmuyor.
- Shell state: __MISE_DIFF ve __MISE_SESSION her child process’e aktarılıyor. Artık mise’in set ettiği her değer doğrudan saklanmak yerine blake3: digest’i olarak tutuluyor. Environment’ı restore edebilmek için önceki (old) değerler hâlâ plaintext olarak saklanıyor. Bunlar keyed hash olmadığı için düşük entropy’ye sahip değerler digest üzerinden brute-force edilebilir.
- Env cache: mise artık secret içeren environment’ları env cache’e yazmıyor. Buna age değerleri ([vars] üzerinden kullanılanlar dahil), sops-encrypted _.file entry’leri, redact = true kullanan tüm directive’ler ve cacheable = false döndüren env module’leri dahil. Önceden tool olmayan module’lerde cacheable = false yok sayılıyordu.
- Env module redact: Bir env module üzerinde tanımlanan redact ayarı, örneğin _.my-plugin = { redact = false }, artık plugin’in kendi tercihinin üzerine yazıyor. Önceden bu değer yok sayılıyordu. Boolean olmayan değerler artık config error olarak değerlendiriliyor.
- mise x -- fish: Env value’lar artık fish’in command-line argument’larına yazılmıyor; böylece ps üzerinden okunamıyor. --deny-env artık burada da uygulanıyor.
- Güncelleme: Eski mise sürümüyle başlatılmış shell’ler environment’larını doğru şekilde restore etmeye devam ediyor. mise, bir sonraki prompt’ta state’i yeni formata dönüştürüyor.
Registry
- jactionlint (github:jdx/jactionlint) eklendi. Bu proje, upstream fix’ler ve yeni check’ler içeren, aktif olarak bakımı yapılan bir actionlint fork’udur. actionlint artık deprecated olarak işaretleniyor ve kullanıcı jactionlint’e yönlendiriliyor. Mevcut actionlint kurulumları çalışmaya devam ediyor.
Dokümantasyon
- Installation guide, mise’in latest release’ini kurarken packslip bootstrapper’ın nasıl pin edileceğini gösterecek şekilde güncellendi.
- Docker cookbook’a digest ile pinlenmiş packslip image kullanan yeni bir multi-stage Debian örneği eklendi.
Eklendi
- Deneysel spinel: backend’i eklendi. GitHub repository’sindeki bir Ruby command-line tool’u, Matz’ın Ruby AOT compiler’ı olan Spinel ile native executable’a dönüştürüyor. Sürümler git ls-remote üzerinden git tag’lerinden alındığı için listeleme sırasında GitHub API çağrısı yapılmıyor. Kullanılabilir seçenekler: entrypoint, bin, tag_prefix, source_ref ve spinel. spinel compiler’ının PATH üzerinde bulunması gerekiyor; mise henüz bunu kendisi kurmuyor. Ayrıca mise settings experimental=true etkin olmalı. Yalnızca macOS ve Linux üzerinde çalışıyor ve ileride bakım yükü oluşturursa kaldırılabilir. nateberkopec/mise-backend-spinel temel alınarak geliştirildi.
[tools."spinel:tobi/try"]
version = "1.10.1"
entrypoint = "try.rb"
bin = "try"
tag_prefix = "v"- JSON schema’ya typed tool option desteği eklendi. schema/mise.json kullanan editor’lar artık tool prefix’ine göre her backend’in option’larını validate edip autocomplete edebiliyor. Desteklenen backend’ler arasında github, gitlab, forgejo, ubi, http, s3, aqua, cargo, npm, pypi/pipx, gem, go, conda, spm, packslip ve spinel bulunuyor. Ayrıca python, java, rust ve dotnet için core-tool option’ları, platform’a özel override’lar (platforms.<os>-<arch>) ve [tasks.*.tools] tabloları da kapsanıyor. Örneğin sayısal bir asset_pattern ya da java için release_type = "stable" artık hatalı olarak işaretleniyor. Boolean option’lar true/false, "true"/"false" ve 1/0 değerlerini kabul ediyor; bu mise’in kendi kabul ettiği değerlerle aynı. lazy_bins tek bir string kabul ediyor. Deprecated experimental_monorepo_root anahtarına yeniden izin verildi. Runtime davranışı değişmedi ancak editor mevcut config’lerdeki hataları artık işaretleyebilir.
- Windows’ta daemon preset desteği eklendi. mise daemons start artık Windows üzerinde preset daemon’ları reddetmiyor. Windows build’i bulunmayan redis hariç tüm preset’ler artık pitchfork’un varsayılan cmd /C shell’i altında çalışıyor. PostgreSQL’in düzgün kapanabilmesi için pitchfork 2.29.0 veya daha yenisi gerekiyor. PostgreSQL ayrıca elevated prompt üzerinden başlatılamıyor. Windows, Hyper-V ve WSL için bazı port aralıklarını reserve ettiği için preset’in varsayılan port’u engellenebilir. Böyle bir durumda ports ile farklı bir port ayarlanabilir.
[daemons.db]
preset = "postgres"
version = "18"
options = { database = "app" }- mise artık packslip ile kurulabiliyor. Installation guide, install script çalıştırmadan mise’in signed release’ini kurmayı kapsayacak şekilde güncellendi. packslip, Sigstore signature’ını ve archive digest’i doğruluyor. Bu kurulum yöntemiyle mise self-update da çalışıyor.
packslip install github.com/jdx/mise --pin ps1_nlhmwtfeufglxv5myvwvronk7aDüzeltildi
Config ve Activation
- Untrusted project config artık shell activation’ı tamamen bozmuyor. Önceden mise hook-env tamamen başarısız oluyor ve bu nedenle trusted global config’teki tool ve environment ayarları da uygulanmıyordu. Artık untrusted dosya atlanıyor, normal tek seferlik uyarı gösteriliyor ve diğer config’ler yükleniyor. mise run ve mise x gibi explicit command’lar untrusted config’lerde hâlâ hata veriyor.
- Başarısız settings reload artık crash yerine error olarak raporlanıyor. mise install, mise use, mise upgrade ve mise ls-remote --prerelease gibi command’lar işlem sırasında settings’i yeniden yüklüyor. Önceden reload başarısız olduğunda mise SIGABRT ile kapanıp core dump oluşturabiliyordu. Artık failed to reload settings mesajı ve hata nedeni gösteriliyor, ardından önceki settings kullanılmaya devam ediliyor.
- --no-config ve MISE_NO_CONFIG=1 artık .miserc.toml discovery işlemini atlıyor. Önceden bozuk bir project, global veya system miserc dosyası mise --no-config version gibi command’ları bile bozabiliyordu.
Görevler
- mise run --timeout artık çalıştırdığı görevleri de durduruyor. Önceden mise timeout hatasını yazdırıp çıkıyor ancak task process’leri arka planda çalışmaya devam edebiliyordu. Artık tüm run için uygulanan timeout (--timeout veya task.timeout ayarı), task başına tanımlanan timeout ile aynı şekilde görevleri durduruyor. Unix’te mise önce SIGTERM gönderiyor, 5 saniye sonra gerekirse SIGKILL uyguluyor. Windows’ta taskkill /F /T çalıştırılıyor. raw = true kullanan task’ler tüm run timeout’undan etkilenmiyor.
- Tek bir Ctrl-C artık task’lerin düzgün şekilde kapanmasına izin veriyor. Önceden tek Ctrl-C, task’ler cleanup işlemlerini tamamlamadan mise’in hemen çıkmasına neden olabiliyordu. Bu durum üç senaryoda görülüyordu: mise run çalıştıran bir task SIGINT’i iki kez alabiliyor, docker compose up gibi araçlar yinelenen SIGINT’i force quit olarak yorumlayabiliyor ve SIGINT sonrasında non-zero ile çıkan bir task mise’in sibling task’lere SIGTERM göndermesine neden olabiliyordu. Artık mise task’lerin tamamlanmasını bekliyor ve ardından status 130 ile çıkıyor. İkinci Ctrl-C hâlâ force quit yapıyor.
- :task kısaltması için Tab completion eklendi. Monorepo içinde mise run :<TAB> artık mevcut config root’taki task’leri öneriyor ve task flag’leri de kısaltmadan sonra tamamlanabiliyor.
Daemon’lar
[vars]
- Task daemon’ları artık Windows’ta başlatılabiliyor. task = ile tanımlanan bir daemon, cmd /C altında 'exec' is not recognized hatasıyla başarısız oluyordu. mise artık bunu bir argv command olarak kaydediyor ve pitchfork bunu shell kullanmadan başlatıyor. Böylece args tüm platformlarda task’e yazıldığı şekilde aktarılıyor. Bunun için pitchfork 2.28.0 veya daha yeni bir sürüm gerekiyor. Daha eski bir pitchfork kullanılıyorsa mise, örneğin mise use pitchfork@latest ile güncelleme yapılmasını isteyen bir hata gösteriyor. init kullanan task daemon’ları hâlâ shell üzerinden çalıştığı için cmd /C altında çalışmıyor.
- Daemon run command’ları artık [env] ve [vars] kullanabiliyor. Önceden {{ vars.test_var }} gibi bir template, Variable 'vars' is not defined hatası veriyordu. mise x artık daemon başlarken command’i project’in [env], [vars] değerleri ve mise template filter’larıyla render ediyor. Pitchfork’a ait {{ name }} gibi variable’lar çalışmaya devam ediyor. Bu yalnızca run için geçerli ve pitchfork 2.29.0’dan daha yeni bir sürüm gerektiriyor.
greeting = "it's"
[daemons.hello]
run = "exec echo {{ vars.greeting | quote }} from {{ name }}"
Windows shim’leri
- Yinelenen shim kopyalarının oluşturduğu sonsuz process chain’leri engellendi. PATH üzerinde iki farklı mise-shim.exe kopyası bulunuyorsa, örneğin biri winget’in Links directory’sindeyse, bunlar mise x üzerinden birbirlerini sürekli çağırabiliyordu. mise-shim artık kendi adıyla çalıştırıldığında hata vererek çıkıyor. mise x bir tool’u başka bir shim kopyasına resolve ederse mise tek adım sonra duruyor ve PATH’ten kaldırılması gereken directory’yi belirtiyor.
- Node IPC artık node.exe shim üzerinden çalışıyor. 'ipc' stdio girdisiyle shim başlatan bir Node parent process önceden sonsuza kadar bekleyebiliyordu. JSON IPC message’ları ve disconnect event’leri artık shim üzerinden aktarılıyor. Socket veya server handle’larının channel üzerinden geçirilmesi hâlâ desteklenmiyor.
Rust
- mise upgrade rust, stable ve beta toolchain’lerini artık güncelliyor. mise, rustup 1.29 ile gelen yeni update available: metnini tanımıyordu. Güncelleme algılansa bile toolchain zaten kurulu kabul edilip upgrade atlanabiliyordu. mise artık iki yazım biçimini de okuyabiliyor, yalnızca yönettiği toolchain’e ait update’leri sayıyor ve toolchain’i yerinde güncelliyor. Update başarısız olursa eski toolchain kullanılmaya devam edebiliyor.
- core:rust artık mise.lock dosyasını takip ediyor. mise, rustup symlink’lerini yanlışlıkla mise link ile bağlanan version’lar sanıyordu. Bu nedenle locked = true kullanılsa bile lockfile yok sayılıyor ve en yeni sürüm kuruluyordu.
Backend’ler, lockfile’lar ve bootstrap
- GitHub auto-detection artık metadata file’larını kurmuyor. Platform adı içeren *.tar.gz.sbom.json gibi SBOM, signature, checksum ve diğer sidecar file’lar yanlışlıkla tool olarak seçilip mise.lock içine kaydedilebiliyordu. Otomatik seçim artık bunları atlıyor. Açıkça belirtilen url ve asset_pattern seçenekleri değişmedi.
- mise lock artık eski duplicate entry’leri kaldırıyor. Örneğin bir pipx: tool’a uvx = false ekledikten sonra mise lock --upgrade, eski unbound entry ile yeni bound entry’yi birlikte bırakabiliyordu. Filtresiz mise lock çalıştırmaları artık eski entry’yi kaldırıyor; ancak eski entry’de yeni entry’de bulunmayan checksum veya URL gibi platform verileri varsa korunuyor.
- Upgrade sonrasında Aqua registry cache hataları düzeltildi. Önceki sürümlerden kalan compiled registry cache’ler yüklenebiliyor ancak package resolve edilirken hata verebiliyordu. mise artık bu cache’leri yok sayıp yeniden oluşturuyor.
- Packslip install işlemleri eksik skill’leri yeniden deniyor. Binary kurulmuş ancak tanımlı bir skill indirilememişse mise önceden install işlemini yine de tamamlanmış sayıyordu. Artık install hata veriyor. Bir sonraki mise install yalnızca eksik skill’leri indiriyor ve tool’u yeniden kurmuyor.