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…
⎇ e852f4849157d026552008ad054cf4c31b8eb532
recipes/incoming-gnome/gnome-shell-extension-blur-my-shell.toml
History
raw
takana etapa 5a: los comentarios de las 741 recetas
1# blur-my-shell 72 — PRIMERA extensión de GNOME Shell del catálogo, y la que fija el patrón.
2#
3# ══ POR QUÉ EXISTE ═════════════════════════════════════════════════════════════════════════════
4# GNOME manda a propósito una cáscara mínima y el ecosistema la completa con extensiones. Sin
5# ninguna empaquetada, nuestra imagen de GNOME es esa cáscara: el shell SÍ sabe cargarlas
6# —`ui/extensionSystem.js` va en el gresource sin opción que lo apague, y su gschema sellado trae
7# `enabled-extensions`— pero no hay ninguna que cargar.
8#
9# ══ LA FUENTE ES EL REPO DEL AUTOR, NO EL ZIP DE extensions.gnome.org ══════════════════════════
10# EGO publica un `.zip` por versión con URL inmutable, que parecía la fuente obvia. Dos razones
11# para no usarlo:
12# 1. **takana no lo sabe abrir.** El fetch extrae con `tar -x` (fetch.rs:581) y GNU tar no lee
13# zip — comprobado: «This does not look like a tar archive». Ninguna receta del corpus usa
14# .zip. Soportarlo sería tocar el fetcher y sumarle una herramienta al host.
15# 2. **Y aunque lo abriera, no es la fuente.** El zip de EGO es un ARTEFACTO que construye EGO a
16# partir de este mismo repo. Pinear el zip es pinear el binario de un tercero; pinear el
17# commit es pinear el código del autor, que es lo que hace el resto del corpus.
18# El tag `v72` es el que EGO sirve para shell 48: verificado preguntándole
19# (`extension-info/?uuid=blur-my-shell@aunetx&shell_version=48` → version 72) y confirmado en el
20# `metadata.json` del propio zip, que declara shell-version ['46','47','48','49','50'].
21# ⚠ Eso hay que preguntarlo por extensión, no asumirlo: nixpkgs va por GNOME 50 y hay extensiones
22# que ya sólo declaran el major nuevo.
23#
24# ══ SE INSTALA A MANO Y NO CON `gnome-extensions pack` ═════════════════════════════════════════
25# El `make build` de upstream llama a `gnome-extensions pack`, que es el CLI `extensions-tool` del
26# propio gnome-shell — y nuestra receta del shell va con `-Dextensions_tool=false`. Encenderlo
27# costaría una receta nueva (gnome-autoar) y re-hashear gnome-shell entero.
28# No hace falta: `pack` sólo arma el zip que después alguien descomprime. Lo que el shell lee es un
29# DIRECTORIO en /usr/share/gnome-shell/extensions/<uuid>/, así que se copia el árbol directamente.
30# El layout no se inventó: se leyó del zip de EGO v72, que es la salida de ese mismo `pack` —
31# `src/*` va a la raíz, `resources/icons`→`icons/`, `resources/ui`→`ui/`, más metadata.json y
32# LICENSE.
33#
34# ⚠ El zip de EGO **no trae `gschemas.compiled`** (verificado): trae el .xml y quien instala
35# compila. Por eso `glib-compile-schemas` va en el install y `glib` en [deps] — sin eso la
36# extensión carga y muere al abrir sus preferencias, que es el fallo que no se ve al sellar.
37name = "gnome-shell-extension-blur-my-shell"
38version = "72"
39# licencia: el README del commit pineado lo dice con todas las letras — «This program is distributed
40# under the terms of the GNU General Public License, version 3 or later». ⚠ La evidencia NO es el
41# fichero LICENSE: ahí sólo está el texto del GPL, y su apéndice «How to Apply» contiene la frase
42# «either version 3 … or any later version» SIEMPRE, así que grepearla da positivo aunque el
43# proyecto sea -only. Y el árbol JS no lleva cabecera de licencia en ningún fichero (verificado).
44license = "GPL-3.0-or-later"
45
46[source]
47repo = "https://github.com/aunetx/blur-my-shell"
48commit = "444df605b34529dfab7be77d0f434bf54a6dd4cc" # tag v72 (ADR 0006: commit fijo, nunca HEAD)
49
50[build]
51compiler = "zig-cc"
52target = "x86_64-linux-musl"
53link = "dynamic"
54
55[build.phases]
56# No hay nada que compilar: son JS, XML de esquema y catálogos de traducción.
57configure = "true"
58compile = "true"
59install = '''
60set -e
61UUID="blur-my-shell@aunetx"
62D="/out/usr/share/gnome-shell/extensions/$UUID"
63mkdir -p "$D"
64
65# 1. El árbol, con la MISMA forma que produce `gnome-extensions pack` (leída del zip de EGO v72).
66cp -r src/. "$D/"
67cp metadata.json LICENSE "$D/"
68cp -r resources/icons "$D/icons"
69cp -r resources/ui "$D/ui"
70
71# 2. El esquema: se copia el .xml Y se compila. El shell abre las preferencias con
72# Gio.SettingsSchemaSource.new_from_directory, que necesita el gschemas.compiled.
73mkdir -p "$D/schemas"
74cp schemas/*.gschema.xml "$D/schemas/"
75glib-compile-schemas "$D/schemas"
76
77# 3. Traducciones: un .mo por idioma, nombrado por el UUID (así lo busca el shell).
78for po in po/*.po; do
79 lang="$(basename "$po" .po)"
80 mkdir -p "$D/locale/$lang/LC_MESSAGES"
81 msgfmt -o "$D/locale/$lang/LC_MESSAGES/$UUID.mo" "$po"
82done
83
84# 4. INSTALADA ≠ ACTIVA. El shell sólo carga las extensiones que estén en la clave
85# `org.gnome.shell enabled-extensions`, así que sin esto el artefacto sella, el fichero está en
86# la imagen y NO PASA NADA al arrancar — el mismo cuadro de «sellado ≠ instalado» que este repo
87# ya se comió con foot, mpv y libnotify, un escalón más abajo.
88# Se hace con un override de GSettings, que cambia el DEFAULT sin tocar la config del usuario
89# (quien no la quiera la apaga y su dconf gana). El `gnome-start-qemu.sh` corre
90# `glib-compile-schemas` sobre este directorio en el primer arranque, así que el override entra.
91#
92# ⚠ TRAMPA PARA LA SEGUNDA EXTENSIÓN: `enabled-extensions` es un ARRAY y esto lo escribe ENTERO.
93# Si mañana otra receta instala su propio override para la misma clave, no se suman: gana el
94# fichero que compile último (orden alfabético) y la otra extensión queda instalada y muerta,
95# sin error. Cuando llegue la segunda, la lista pasa a un solo sitio que las liste a todas.
96mkdir -p /out/usr/share/glib-2.0/schemas
97cat > /out/usr/share/glib-2.0/schemas/60_hammer-extensiones.gschema.override <<OVR
98[org.gnome.shell]
99enabled-extensions=['$UUID']
100OVR
101
102# 5. Guardián barato: si el árbol quedara vacío o sin metadata, el artefacto sellaría igual y el
103# fallo aparecería recién al arrancar el escritorio (regla 3 de CLAUDE.md — un vacío llega hasta
104# el final diciendo que todo fue bien).
105test -s "$D/metadata.json"
106test -s "$D/extension.js"
107test -s "$D/schemas/gschemas.compiled"
108grep -q '"48"' "$D/metadata.json" # falla ruidoso si un bump de versión deja de soportar shell 48
109grep -q "$UUID" /out/usr/share/glib-2.0/schemas/60_hammer-extensiones.gschema.override
110'''
111
112[deps]
113# `glib` por glib-compile-schemas y `gettext-tiny` por msgfmt: las dos son herramientas del
114# sandbox, no librerías que la extensión enlace (no enlaza nada: es JavaScript).
115build = ["glib", "pcre2", "libffi", "zlib", "gettext-tiny"]