chore: auto-commit (4 archivos modificados)

- .claude/commands/full-git-pull.md
- .claude/commands/full-git-push.md
- .claude/rules/frontend_theming.md
- go.sum

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-06 19:05:24 +02:00
parent 32fc9c725b
commit c0e0ceadd8
4 changed files with 84 additions and 8 deletions
+33 -4
View File
@@ -70,7 +70,36 @@ git submodule update --init --recursive 2>&1 | tail -10
CGO_ENABLED=1 ./fn index 2>&1 | tail -3
```
### 5. fn sync
### 5. Pull del repo de pass (`~/.password-store`)
El password store es su propio repo Git en Gitea (`dataforge/pass-secrets`). `pass insert/edit/rm` commitea automaticamente, asi que aqui SOLO hay que pullear los commits remotos.
```bash
PASS_DIR="$HOME/.password-store"
if [ -d "$PASS_DIR/.git" ]; then
( cd "$PASS_DIR" \
&& DIRTY=$(git status --porcelain | wc -l) \
&& if [ "$DIRTY" -gt 0 ]; then
git stash push -m "auto-stash before /full-git-pull" --include-untracked >/dev/null
STASHED=1
else
STASHED=0
fi \
&& git fetch origin 2>&1 | tail -1 \
&& git pull --ff-only 2>&1 | tail -3 \
&& if [ "$STASHED" = "1" ]; then
git stash pop 2>&1 | tail -3
fi
)
fi
```
Reglas:
- Mismo patron que el resto de repos: stash → fetch → pull --ff-only → pop.
- Si `--ff-only` falla por divergencia, reportar y seguir; no resolver a mano.
- Si `stash pop` da conflicto, avisar al final.
### 6. fn sync
```bash
USER=$(pass registry/basicauth-user | head -1)
@@ -81,11 +110,11 @@ export REGISTRY_API_TOKEN="$TOKEN"
./fn sync
```
Si `pass` falla → gpg-agent bloqueado, pedir al usuario `pass show registry/api-token` en su terminal real.
Si `pass` falla → gpg-agent bloqueado, pedir al usuario `pass show unlock` en su terminal real (entrada dummy que devuelve "Desbloqueada!" sin exponer API keys).
### 6. Resumen
### 7. Resumen
Tabla concisa: por repo, commits pulleados o "ya estaba al día"; submodules actualizados; resultado de `fn index`; resultado de `fn sync`. Si algún repo quedó con conflicto de stash o divergencia, listarlos al final con la acción sugerida.
Tabla concisa: por repo, commits pulleados o "ya estaba al día"; estado de `pass-secrets`; submodules actualizados; resultado de `fn index`; resultado de `fn sync`. Si algún repo quedó con conflicto de stash o divergencia, listarlos al final con la acción sugerida.
## Notas
+34 -4
View File
@@ -135,7 +135,37 @@ Reglas:
Si `push` rechaza por non-fast-forward (rama behind), no abortar el resto. Reportar ese repo concreto y sugerir `/full-git-pull` antes; seguir con los demás repos.
### 5. fn sync
### 5. Push del repo de pass (`~/.password-store`)
El password store es su propio repo Git en Gitea (`dataforge/pass-secrets`). `pass insert/edit/rm` ya commitea automaticamente, por lo que aqui SOLO hay que pushear los commits locales.
```bash
PASS_DIR="$HOME/.password-store"
if [ -d "$PASS_DIR/.git" ]; then
( cd "$PASS_DIR" \
&& DIRTY=$(git status --porcelain | wc -l) \
&& if [ "$DIRTY" -gt 0 ]; then
echo "[warn] $PASS_DIR tiene cambios sin commitear; pass deberia commitear solo. Saltando push."
else
BRANCH=$(git rev-parse --abbrev-ref HEAD) \
&& AHEAD=$(git rev-list --count @{u}..HEAD 2>/dev/null) \
&& if [ "${AHEAD:-0}" -gt 0 ]; then
echo "[push] pass-secrets ($BRANCH, $AHEAD commits ahead)"
git push origin "$BRANCH" 2>&1 | tail -3
else
echo "[skip] pass-secrets (up-to-date)"
fi
fi
)
fi
```
Reglas:
- NO hacer `git add` ni `git commit` en `~/.password-store` (pass lo gestiona). Si hay dirty tree, avisar y saltar.
- NO escanear `*.gpg` por patrones de secrets — son secrets cifrados, su contenido es opaco.
- El push usa el remote ya configurado (`dataforge/pass-secrets` en Gitea).
### 6. fn sync
```bash
USER=$(pass registry/basicauth-user | head -1)
@@ -146,11 +176,11 @@ export REGISTRY_API_TOKEN="$TOKEN"
./fn sync
```
Si `pass` falla con "decryption failed" → gpg-agent bloqueado. Pedir al usuario que ejecute `pass show registry/api-token` en su terminal real (Bash tool no tiene TTY) y reintentar.
Si `pass` falla con "decryption failed" → gpg-agent bloqueado. Pedir al usuario que ejecute `pass show unlock` en su terminal real (Bash tool no tiene TTY) y reintentar. Esa entrada es un dummy que solo muestra `Desbloqueada!` para cachear el passphrase sin exponer ninguna API key.
### 6. Resumen
### 7. Resumen
Tabla concisa: por repo, commits creados (cuántos y subject), commits pusheados, o "ya estaba al día". Y resultado de `fn sync` (sent / received / imported).
Tabla concisa: por repo, commits creados (cuántos y subject), commits pusheados, o "ya estaba al día". Estado de `pass-secrets` (pushed / skipped / dirty). Y resultado de `fn sync` (sent / received / imported).
## Notas
+16
View File
@@ -9,3 +9,19 @@ El sistema de UI es Mantine v9. Todos los componentes de @fn_library wrappean co
**Iconos:** Se usa `@tabler/icons-react` (el set nativo de Mantine), no lucide-react.
**Layout:** Se usan los componentes de layout de Mantine: `Group`, `Stack`, `Grid`, `Flex`, `SimpleGrid`, `AppShell`, `Container`, `Box`, `Paper`.
**AppShell.Navbar / AppShell.Aside (gotchas v9):**
- NO override `position` via `style` (ej. `style={{ position: "relative" }}`). Mantine aplica `position: fixed` con CSS class; si lo pisas, el slot cae al flow normal y empuja el resto del layout abajo (root altura 2x).
- Para anclar children `position: absolute` (drag handle, badge flotante), el `position: fixed` del propio slot ya actua como containing block — no necesitas relative.
- Por defecto el navbar **empuja** el main (anade `padding-inline-start: navbar-width`). Para **overlay** (navbar tapa main):
```tsx
<AppShell styles={{ main: { paddingInlineStart: 0 } }}>
```
Idem `paddingInlineEnd: 0` para aside overlay.
- Si quieres backdrop dimming + click-outside-close: usa `<Drawer position="left">` en lugar de `AppShell.Navbar`.
- **Memoizar configs**: `header`/`navbar`/`aside`/`styles` aceptan objetos. Si el componente padre se re-renderiza cada N (tick, ws, etc.), los objetos literales se recrean y Mantine regenera el `<style>` inline. Wrap con `useMemo([deps])`:
```tsx
const navbarCfg = useMemo(() => ({ width, breakpoint: "md", collapsed: { ... } }), [width, navOpen]);
<AppShell navbar={navbarCfg} ...>
```
+1
View File
@@ -157,6 +157,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI=
golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q=
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc=
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=