tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1173Shell 64Rust 62Markdown 441482 Definiciones

Etapa G: cosecha tanda CLI Rust — 5 promovidos estáticos (corpus 154→159)

Drenada la cola de 14 staged. 5 sellados+publicados al repo firmado, todos
ESTÁTICOS y ejecutan (versión correcta):
  - topgrade 17.6.1, git-absorb 0.9.0, cargo-audit 0.22.1, yazi 26.5.6, cargo-edit 0.13.11

Patrón común de de-Alpinización (estilo zellij): el lab NO trae `cargo auditable`
⇒ reescritas LIMPIAS sin él ni manpage/completions. Claves de la tanda:
  - SIN fase compile custom ⇒ path default del lab (aplica crt-static tras `cargo
    rustc --`, sólo el bin top, NO en RUSTFLAGS donde rompería los proc-macros) +
    linker zig-cc ⇒ binario estático. Las fases custom con `cargo build` salían
    DINÁMICAS (musl pie) y no corrían en el host — corregido.
  - compiler="gcc" donde hay deps-C de build-script (git2/openssl/ring/mlua-lua/
    jemalloc/onig): el CC=zig global rechaza el triple x86_64-alpine-linux-musl; el
    gueto gcc-musl los compila, linker sigue zig-cc. +deps zlib en git-absorb/cargo-audit.
  - cargo-edit: 4 bins (cargo-add/rm/upgrade/set-version, no hay bin `cargo-edit`);
    el path default (`cargo rustc -- flags`) exige un único target ⇒ fase custom que
    itera los 4 bins con crt-static por-bin.
  - yazi: dropeado el patch system-lua + dep lua5.5 ⇒ mlua vendorea su Lua.

Diferidos a incoming/.deferred (frontera dura, motivo documentado):
  - jless → libxcb (clipboard X11, dep real sin receta)
  - b3sum → proyecto anidado con Cargo.lock propio (el vendor del lab no lo alcanza)
  - dprint/mprocs → libclang.a/bindgen (clang-sys estático)
  - hck → libz-sys (-lz no hallado), kalker → gmp, dura → Cargo.lock stale,
    xcp → libfs i32/u64 musl, mdcat → #![deny(warnings)] en lib (path default no
    deja inyectar --cap-lints)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

71bc228102f362fab5df25e898514f792c93c0bc · por sergio · (hace 4 meses) · padre 3ebee950a · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

28 archivos · +329 −428

diff --git a/recipes/cargo-audit.toml b/recipes/cargo-audit.toml
new file mode 100644
index 00000000..28167e59
--- /dev/null
+++ b/recipes/cargo-audit.toml
@@ -0,0 +1,21 @@
+# cargo-audit 0.22.1 — audita Cargo.lock contra la base RustSec. Etapa G, tier CLI Rust con dep-C.
+# Reescrita LIMPIA estilo zellij: sin `cargo auditable`. SIN fases ⇒ path default (crt-static +
+# linker zig ⇒ ESTÁTICO). `--features fix` añade el subcomando `cargo audit fix` (como Alpine).
+#   - compiler="gcc": deps-C de build-script (ring/constant_time, git2 vía la feature fix); el gueto
+#     gcc los compila (el CC=zig global no traga el triple alpine), linker zig-cc.
+#   - deps.build=["zlib"]: git2/openssl-sys enlazan -lz.
+name    = "cargo-audit"
+version = "0.22.1"
+
+[source]
+tarball = "https://github.com/RustSec/cargo-audit/archive/cargo-audit/v0.22.1.tar.gz"
+sha256  = "262d42fcca5db8629b6220d84e62e7ffda913846a36089a847ffe276e6b09446"
+
+[build]
+compiler = "gcc"
+target   = "x86_64-linux-musl"
+link     = "static"
+flags    = ["--features", "fix", "--bin", "cargo-audit"]
+
+[deps]
+build = ["zlib"]
diff --git a/recipes/cargo-edit.toml b/recipes/cargo-edit.toml
new file mode 100644
index 00000000..06011ff3
--- /dev/null
+++ b/recipes/cargo-edit.toml
@@ -0,0 +1,31 @@
+# cargo-edit 0.13.11 — cargo add/rm/upgrade/set-version. Etapa G, tier CLI Rust.
+# Caso especial: produce 4 bins (gated por las features default add/rm/upgrade/set-version) y NO
+# hay un bin `cargo-edit`. El path default del lab usa `cargo rustc -- <flags>` que exige UN único
+# target ⇒ inservible para multi-bin. Por eso una fase compile custom que REPLICA el setup estático
+# del lab (wrapper .hammer-zig-cc que reescribe --target + crt-static) pero con `cargo build` (todos
+# los bins). crt-static va TRAS `cargo rustc --` (sólo el bin top), NUNCA en RUSTFLAGS: ahí alcanza
+# a los proc-macros (clap_derive) y rustc aborta ("cannot produce proc-macro ... crt-static"). Como
+# `cargo rustc --` exige un único target, itero los 4 bins. El install lo auto-genera el lab.
+name    = "cargo-edit"
+version = "0.13.11"
+
+[source]
+repo   = "https://github.com/killercup/cargo-edit"
+commit = "98d58b713cb9a7715c01053dbd36cb84f3be1e4f"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "static"
+flags    = []
+
+[build.phases]
+compile = '''
+printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64-linux-musl ;; esac' 'set -- "$@" "$a"' 'shift' 'done' 'exec zig cc -mcpu=baseline "$@"' > "$PWD/.hammer-zig-cc"
+chmod +x "$PWD/.hammer-zig-cc"
+RF="-C linker=$PWD/.hammer-zig-cc"
+rustc -vV | grep -q 'host: .*-alpine-' || RF="$RF -C link-self-contained=no"
+for b in cargo-add cargo-rm cargo-upgrade cargo-set-version; do
+  CC=gcc CXX=g++ AR=ar RUSTFLAGS="$RF" cargo rustc --release --locked --bin "$b" -- -C target-feature=+crt-static -C relocation-model=static
+done
+'''
diff --git a/recipes/git-absorb.toml b/recipes/git-absorb.toml
new file mode 100644
index 00000000..7718a722
--- /dev/null
+++ b/recipes/git-absorb.toml
@@ -0,0 +1,21 @@
+# git-absorb 0.9.0 — autogenera commits fixup! y los absorbe. Etapa G, tier CLI Rust con dep-C.
+# Reescrita LIMPIA estilo zellij: sin `cargo auditable` (no está en el lab) ni manpage (asciidoc).
+# SIN fases ⇒ path default (crt-static + linker zig ⇒ ESTÁTICO).
+#   - compiler="gcc": git2/libgit2-sys vendorea libgit2 en C (build-script cc-rs); el gueto gcc lo
+#     compila (el CC=zig global no traga el triple alpine), el linker sigue zig-cc.
+#   - deps.build=["zlib"]: libgit2-sys enlaza -lz; el lab materializa libz.a en /usr/lib.
+name    = "git-absorb"
+version = "0.9.0"
+
+[source]
+tarball = "https://github.com/tummychow/git-absorb/archive/refs/tags/0.9.0.tar.gz"
+sha256  = "a0f74e6306d7fbd746d2b4a6856621d46a7f82e3e88b6bb8b6fc0480cf811f53"
+
+[build]
+compiler = "gcc"
+target   = "x86_64-linux-musl"
+link     = "static"
+flags    = ["--bin", "git-absorb"]
+
+[deps]
+build = ["zlib"]
diff --git a/recipes/incoming/b3sum.toml b/recipes/incoming/.deferred/b3sum.toml
similarity index 100%
rename from recipes/incoming/b3sum.toml
rename to recipes/incoming/.deferred/b3sum.toml
diff --git a/recipes/incoming/dprint.toml b/recipes/incoming/.deferred/dprint.toml
similarity index 100%
rename from recipes/incoming/dprint.toml
rename to recipes/incoming/.deferred/dprint.toml
diff --git a/recipes/incoming/dura.toml b/recipes/incoming/.deferred/dura.toml
similarity index 100%
rename from recipes/incoming/dura.toml
rename to recipes/incoming/.deferred/dura.toml
diff --git a/recipes/incoming/hck.toml b/recipes/incoming/.deferred/hck.toml
similarity index 100%
rename from recipes/incoming/hck.toml
rename to recipes/incoming/.deferred/hck.toml
diff --git a/recipes/incoming/.deferred/jless.toml b/recipes/incoming/.deferred/jless.toml
new file mode 100644
index 00000000..d80345a4
--- /dev/null
+++ b/recipes/incoming/.deferred/jless.toml
@@ -0,0 +1,25 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). Reescrita LIMPIA
+# (patrón zellij/xsv): sin `cargo auditable` (no está en el lab). Deps espurias de Alpine
+# dropeadas: python3 (sólo para tests), libxcb (no lo usa el build del binario).
+name    = "jless"
+version = "0.9.0"
+
+[source]
+tarball = "https://github.com/PaulJuliusMartinez/jless/archive/refs/tags/v0.9.0.tar.gz"
+sha256  = "43527a78ba2e5e43a7ebd8d0da8b5af17a72455c5f88b4d1134f34908a594239"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "static"
+flags    = []
+
+# CC=gcc: el shim C libc-stdhandle (dep) se compila con cc-rs, y el CC=zig global del
+# sandbox rechaza el triple x86_64-alpine-linux-musl (el wrapper .hammer-zig-cc sólo opera
+# en el path default, no en fases custom). gcc-musl nativo del rootfs lo compila limpio.
+[build.phases]
+compile = "CC=gcc CXX=g++ AR=ar cargo build --frozen --release"
+install = '''
+mkdir -p /out/usr/bin
+cp target/release/jless /out/usr/bin/jless
+'''
diff --git a/recipes/incoming/kalker.toml b/recipes/incoming/.deferred/kalker.toml
similarity index 100%
rename from recipes/incoming/kalker.toml
rename to recipes/incoming/.deferred/kalker.toml
diff --git a/recipes/incoming/mdcat.toml b/recipes/incoming/.deferred/mdcat.toml
similarity index 100%
rename from recipes/incoming/mdcat.toml
rename to recipes/incoming/.deferred/mdcat.toml
diff --git a/recipes/incoming/mprocs.toml b/recipes/incoming/.deferred/mprocs.toml
similarity index 100%
rename from recipes/incoming/mprocs.toml
rename to recipes/incoming/.deferred/mprocs.toml
diff --git a/recipes/incoming/xcp.toml b/recipes/incoming/.deferred/xcp.toml
similarity index 100%
rename from recipes/incoming/xcp.toml
rename to recipes/incoming/.deferred/xcp.toml
diff --git a/recipes/incoming/cargo-audit.toml b/recipes/incoming/cargo-audit.toml
deleted file mode 100644
index ec6f4b78..00000000
--- a/recipes/incoming/cargo-audit.toml
+++ /dev/null
@@ -1,37 +0,0 @@
-# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
-# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
-# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
-name    = "cargo-audit"
-version = "0.22.1"
-
-[source]
-tarball = "https://github.com/RustSec/cargo-audit/archive/cargo-audit/v0.22.1.tar.gz"
-# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
-# sha512 = "bafc8e553c4d82c1e709de8e6e416ad1ee13a73b7e6f2169783bec8bd5816244badb8df78050f8cabb40bb1ab85fa159ae7d0d7be21708fa3a9275518e8a3795"
-sha256  = "262d42fcca5db8629b6220d84e62e7ffda913846a36089a847ffe276e6b09446"
-
-[build]
-compiler = "zig-cc"
-target   = "x86_64-linux-musl"
-link     = "static"
-flags    = []
-
-[build.phases]
-# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
-compile = '''
-_abuild_phase() {
-cargo build --release --frozen --features fix
-}
-_abuild_phase
-'''
-# de package() de Alpine (traducido $pkgdir→/out):
-install = '''
-_abuild_phase() {
-install -Dm 755 target/release/cargo-audit -t "/out/usr/bin"
-	install -Dm 644 -t "/out/usr/share/doc/cargo-audit" README.md
-}
-_abuild_phase
-'''
-
-[deps]
-build = ["openssl"]
diff --git a/recipes/incoming/cargo-edit.toml b/recipes/incoming/cargo-edit.toml
deleted file mode 100644
index 69fdfae5..00000000
--- a/recipes/incoming/cargo-edit.toml
+++ /dev/null
@@ -1,22 +0,0 @@
-# Importada de nixpkgs por `hammer import-nix` (Etapa G). PUNTO DE PARTIDA, no final:
-# - el build usa el lab de hammer (zig-cc / musl estático), NO el stdenv de nix ⇒ revisá
-#   compiler/link/phases y adaptá hasta que compile.
-# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
-name    = "cargo-edit"
-version = "0.13.11"
-
-[source]
-repo   = "https://github.com/killercup/cargo-edit"
-commit = "98d58b713cb9a7715c01053dbd36cb84f3be1e4f"
-
-[build]
-compiler = "zig-cc"
-target   = "x86_64-linux-musl"
-link     = "static"
-flags    = ["--bin", "cargo-edit"]
-
-[build.phases]
-install = "mkdir -p /out/usr/bin && cp target/release/cargo-edit /out/usr/bin/cargo-edit"
-
-# buildInputs de nix (NO deps de hammer — cargo vendorea; backend Rust por
-# defecto). Si algún sys-crate C falla, adaptá per-paquete (patch/feature): openssl, zlib
diff --git a/recipes/incoming/git-absorb.toml b/recipes/incoming/git-absorb.toml
deleted file mode 100644
index 2d40946a..00000000
--- a/recipes/incoming/git-absorb.toml
+++ /dev/null
@@ -1,48 +0,0 @@
-# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
-# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
-# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
-name    = "git-absorb"
-version = "0.9.0"
-
-[source]
-tarball = "https://github.com/tummychow/git-absorb/archive/refs/tags/0.9.0.tar.gz"
-# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
-# sha512 = "5a02cbbb4df65340705dd6ef721cd40d8ae7eadf6926f9682de3a6ade20d9a2b1caf51e69d32b9c47e2b7a16c864f58992fbe486387c480965cc816f2b713011"
-sha256  = "a0f74e6306d7fbd746d2b4a6856621d46a7f82e3e88b6bb8b6fc0480cf811f53"
-
-[build]
-compiler = "zig-cc"
-target   = "x86_64-linux-musl"
-link     = "static"
-flags    = []
-
-[build.phases]
-# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
-compile = '''
-_abuild_phase() {
-cargo auditable build --frozen --release
-
-	target/release/git-absorb --gen-completions bash > git-absorb.bash
-	target/release/git-absorb --gen-completions fish > git-absorb.fish
-	target/release/git-absorb --gen-completions zsh > _git-absorb
-
-	make -C Documentation git-absorb.1
-}
-_abuild_phase
-'''
-# de package() de Alpine (traducido $pkgdir→/out):
-install = '''
-_abuild_phase() {
-install -Dm755 --target-directory="/out"/usr/bin target/release/git-absorb
-
-	install -Dm644 git-absorb.bash "/out"/usr/share/bash-completion/completions/git-absorb
-	install -Dm644 git-absorb.fish "/out"/usr/share/fish/vendor_completions.d/git-absorb.fish
-	install -Dm644 _git-absorb "/out"/usr/share/zsh/site-functions/_git-absorb
-
-	install -Dm644 --target-directory="/out"/usr/share/man/man1 Documentation/git-absorb.1
-}
-_abuild_phase
-'''
-
-[deps]
-build = ["asciidoc", "libgit2"]
diff --git a/recipes/incoming/jless.toml b/recipes/incoming/jless.toml
deleted file mode 100644
index 10b1e2a1..00000000
--- a/recipes/incoming/jless.toml
+++ /dev/null
@@ -1,36 +0,0 @@
-# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
-# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
-# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
-name    = "jless"
-version = "0.9.0"
-
-[source]
-tarball = "https://github.com/PaulJuliusMartinez/jless/archive/refs/tags/v0.9.0.tar.gz"
-# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
-# sha512 = "2c0f4b5d662f7e93727b25ef6b138368b453dc7246a6a2a3d14c158e15baeaf70df00252b0e1a813016837504bd6f75585d6e21760c52fc3ba76d61fc094ec7a"
-sha256  = "43527a78ba2e5e43a7ebd8d0da8b5af17a72455c5f88b4d1134f34908a594239"
-
-[build]
-compiler = "zig-cc"
-target   = "x86_64-linux-musl"
-link     = "static"
-flags    = []
-
-[build.phases]
-# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
-compile = '''
-_abuild_phase() {
-cargo auditable build --frozen --release
-}
-_abuild_phase
-'''
-# de package() de Alpine (traducido $pkgdir→/out):
-install = '''
-_abuild_phase() {
-install -Dm0755 target/release/jless "/out"/usr/bin/jless
-}
-_abuild_phase
-'''
-
-[deps]
-build = ["python3", "libxcb"]
diff --git a/recipes/incoming/topgrade.toml b/recipes/incoming/topgrade.toml
deleted file mode 100644
index 83ed90a4..00000000
--- a/recipes/incoming/topgrade.toml
+++ /dev/null
@@ -1,47 +0,0 @@
-# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
-# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
-# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
-name    = "topgrade"
-version = "17.6.1"
-
-[source]
-tarball = "https://github.com/topgrade-rs/topgrade/archive/refs/tags/v17.6.1.tar.gz"
-# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
-# sha512 = "4473e971a3c744ce4f07096c7b6e38d384b2d1eb8698cfa26bd6018c361a667f971f14410d265b2c82119d805485c9247d4d16465dc0e7e2b4b5f7b4529b600b"
-sha256  = "c25274461f61b8fa469c1645a892bb5b52236bb64dc448152c6f485f9ec1cb1d"
-
-[build]
-compiler = "zig-cc"
-target   = "x86_64-linux-musl"
-link     = "static"
-flags    = []
-
-[build.phases]
-# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
-compile = '''
-_abuild_phase() {
-cargo auditable build --release --frozen
-
-	target/release/topgrade --gen-completion bash > topgrade.bash
-	target/release/topgrade --gen-completion fish > topgrade.fish
-	target/release/topgrade --gen-completion zsh > _topgrade
-
-	target/release/topgrade --gen-manpage > topgrade.8
-}
-_abuild_phase
-'''
-# de package() de Alpine (traducido $pkgdir→/out):
-install = '''
-_abuild_phase() {
-install -Dm755 target/release/topgrade "/out"/usr/bin/topgrade
-	install -Dm644 LICENSE "/out"/usr/share/licenses/topgrade/LICENSE
-
-	install -Dm644 topgrade.bash "/out"/usr/share/bash-completion/completions/topgrade
-	install -Dm644 topgrade.fish "/out"/usr/share/fish/vendor_completions.d/topgrade.fish
-	install -Dm644 _topgrade "/out"/usr/share/zsh/site-functions/_topgrade
-
-	install -Dm644 config.example.toml "/out"/usr/share/doc/topgrade/config.example.toml
-	install -Dm644 topgrade.8 "/out"/usr/share/man/man8/topgrade.8
-}
-_abuild_phase
-'''
diff --git a/recipes/incoming/yazi.toml b/recipes/incoming/yazi.toml
deleted file mode 100644
index e91994af..00000000
--- a/recipes/incoming/yazi.toml
+++ /dev/null
@@ -1,41 +0,0 @@
-# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
-# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
-# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
-name    = "yazi"
-version = "26.5.6"
-
-[source]
-tarball = "https://github.com/sxyazi/yazi/archive/refs/tags/v26.5.6.tar.gz"
-# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
-# sha512 = "2f1b980753c82f5e4186759ec6c40df6c2d740b3521fe31edaff69802701b0c5292c03fde5a1e775e17e91c694ea63c0b16a149fa39ccc609b4780281421d38e"
-sha256  = "a18445df86a20068f7b17609d12d6f635de488958579ae7a2b143a244ba7e63f"
-patches = ["system-lua.patch"]
-
-[build]
-compiler = "zig-cc"
-target   = "x86_64-linux-musl"
-link     = "static"
-flags    = []
-
-[build.phases]
-# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
-compile = '''
-_abuild_phase() {
-YAZI_GEN_COMPLETIONS=true cargo auditable build --release --frozen --workspace --no-default-features
-}
-_abuild_phase
-'''
-# de package() de Alpine (traducido $pkgdir→/out):
-install = '''
-_abuild_phase() {
-install -Dm755 target/release/yazi "/out"/usr/bin/yazi
-	install -Dm644 yazi-boot/completions/yazi.bash "/out"/usr/share/bash-completion/completions/yazi
-	install -Dm644 yazi-boot/completions/yazi.fish "/out"/usr/share/fish/vendor_completions.d/yazi.fish
-	install -Dm644 yazi-boot/completions/_yazi "/out"/usr/share/zsh/site-functions/_yazi
-	install -Dm644 LICENSE "/out"/usr/share/licenses/yazi/LICENSE
-}
-_abuild_phase
-'''
-
-[deps]
-build = ["lua5.5"]
diff --git a/recipes/topgrade.toml b/recipes/topgrade.toml
new file mode 100644
index 00000000..626b10ed
--- /dev/null
+++ b/recipes/topgrade.toml
@@ -0,0 +1,16 @@
+# topgrade 17.6.1 — actualiza todas las herramientas del sistema de una. Etapa G, tier CLI Rust.
+# Reescrita LIMPIA estilo zellij: el import de Alpine traía `cargo auditable` (no está en el lab)
+# + manpage/completions. SIN fases ⇒ el lab autodetecta Cargo y usa el path default (que aplica
+# crt-static + linker zig-cc ⇒ binario ESTÁTICO). Pure-Rust ⇒ zig-cc baseline.
+name    = "topgrade"
+version = "17.6.1"
+
+[source]
+tarball = "https://github.com/topgrade-rs/topgrade/archive/refs/tags/v17.6.1.tar.gz"
+sha256  = "c25274461f61b8fa469c1645a892bb5b52236bb64dc448152c6f485f9ec1cb1d"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "static"
+flags    = ["--bin", "topgrade"]
diff --git a/recipes/yazi.toml b/recipes/yazi.toml
new file mode 100644
index 00000000..d5fd0f4d
--- /dev/null
+++ b/recipes/yazi.toml
@@ -0,0 +1,18 @@
+# yazi 26.5.6 — file manager de terminal (blazing-fast, async). Etapa G, tier CLI Rust con dep-C.
+# Reescrita LIMPIA estilo zellij: sin `cargo auditable`, sin el patch system-lua (mlua VENDOREA su
+# Lua). SIN fases ⇒ path default (crt-static + linker zig ⇒ ESTÁTICO).
+#   - compiler="gcc": mlua-sys (Lua C), tikv-jemalloc-sys, onig_sys y ring compilan C vía cc-rs; el
+#     gueto gcc los compila (el CC=zig global no traga el triple alpine), linker zig-cc.
+#   - --no-default-features: evita los plugins que pedirían un Lua externo.
+name    = "yazi"
+version = "26.5.6"
+
+[source]
+tarball = "https://github.com/sxyazi/yazi/archive/refs/tags/v26.5.6.tar.gz"
+sha256  = "a18445df86a20068f7b17609d12d6f635de488958579ae7a2b143a244ba7e63f"
+
+[build]
+compiler = "gcc"
+target   = "x86_64-linux-musl"
+link     = "static"
+flags    = ["--no-default-features", "--bin", "yazi"]