---
name: fn_sync_with_pass
kind: pipeline
lang: bash
domain: pipelines
version: "1.0.0"
purity: impure
signature: "fn_sync_with_pass [status|locations|<args>...]"
description: "Wrapper de fn sync que lee credenciales del password-store pass y exporta FN_REGISTRY_API y REGISTRY_API_TOKEN antes de invocar el CLI. Evita persistir secretos en ~/.zshrc."
tags: [sync, registry, pass, gpg, launcher]
uses_functions:
  - pass_get_bash_infra
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
params:
  - name: "registry/basicauth-user"
    desc: "Entry de pass con el usuario para basicAuth del registry API (linea 1)"
  - name: "registry/basicauth-pass"
    desc: "Entry de pass con la contraseña para basicAuth del registry API (linea 1)"
  - name: "registry/api-token"
    desc: "Entry de pass con el REGISTRY_API_TOKEN (linea 1)"
  - name: "args"
    desc: "Argumentos opcionales forwarded a fn sync: status, locations, o nada para push+pull completo"
output: "Mismo output que ./fn sync (stdin/stdout/stderr heredados). Exit code del subproceso fn sync."
tested: false
tests: []
test_file_path: ""
file_path: "bash/functions/pipelines/fn_sync_with_pass.sh"
---

## Ejemplo

```bash
# Sync simple (push+pull completo)
./fn run fn_sync_with_pass_bash_pipelines

# Ver estado local: PC, API, conteos
./fn run fn_sync_with_pass_bash_pipelines status

# Mapa de ubicaciones cross-PC
./fn run fn_sync_with_pass_bash_pipelines locations
```

## Cuando usarla

Cuando necesites ejecutar `fn sync` sin tener las credenciales exportadas en el entorno. Sustituye al bloque de `export FN_REGISTRY_API=...` que de otro modo habria que poner en `~/.zshrc`.

## Gotchas

- Si GPG no tiene la clave desbloqueada, `pass show` abre el prompt del agente gpg. Dejarlo pasar — no capturar stderr para no interferir con el pinentry.
- Requiere que el password-store este inicializado (`pass init`). Si no existe, `pass show` falla con error claro.
- `FN_REGISTRY_ROOT` debe apuntar a la raiz del registry donde vive el binario `./fn`. Si no esta seteado, se resuelve via `git rev-parse --show-toplevel`.
- Los tres entries de pass deben tener el valor en la **linea 1** (convencion estandar de pass). Metadata adicional en lineas siguientes es ignorada.
