chore: auto-commit (95 archivos)

- cmd/fn/doctor.go
- cmd/fn/main.go
- cpp/apps/primitives_gallery/playground/tables/CMakeLists.txt
- cpp/apps/primitives_gallery/playground/tables/data_table.cpp
- cpp/apps/primitives_gallery/playground/tables/data_table_logic.cpp
- cpp/apps/primitives_gallery/playground/tables/data_table_logic.h
- cpp/apps/primitives_gallery/playground/tables/self_test.cpp
- cpp/apps/primitives_gallery/playground/tables/tql.cpp
- cpp/apps/primitives_gallery/playground/tables/viz.cpp
- cpp/apps/primitives_gallery/playground/tables/viz.h
- ...

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-13 00:50:34 +02:00
parent ef60449e64
commit a802f59f55
189 changed files with 18964 additions and 330 deletions
+74
View File
@@ -0,0 +1,74 @@
---
name: vault_inventory_scan
kind: function
lang: go
domain: infra
version: "1.0.0"
purity: impure
signature: "func VaultInventoryScan(vaultPath, vaultID, vaultName string) ([]VaultFile, error)"
description: "Recorre vaultPath con filepath.WalkDir y retorna un slice de VaultFile ordenado por RelPath para cada archivo regular, computando sha256 por streaming, MIME por extension/magic y bucket/sub-bucket por posicion en el arbol."
tags: [vault, inventory, scan, filesystem, sha256, mime, infra]
uses_functions: []
uses_types: ["vault_file_go_infra"]
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [crypto/sha256, encoding/hex, fmt, io, net/http, os, path/filepath, sort, strings]
params:
- name: vaultPath
desc: "ruta absoluta o relativa al directorio raiz del vault"
- name: vaultID
desc: "identificador del vault (ej: turismo_spain_app_turismo) — se copia a cada VaultFile"
- name: vaultName
desc: "nombre legible del vault (ej: turismo_spain) — se copia a cada VaultFile"
output: "slice de VaultFile ordenado lexicograficamente por RelPath; slice vacio (no nil) si el vault esta vacio"
tested: true
tests:
- "tmpdir vacio retorna slice vacio"
- "data layout — bucket y sub_bucket correctos"
- "knowledge layout — bucket y sub_bucket correctos"
- "omite vault_index.db y .git"
- "sha256 determinista para mismo contenido"
- "orden lexicografico del resultado"
test_file_path: "functions/infra/vault_inventory_scan_test.go"
file_path: "functions/infra/vault_inventory_scan.go"
---
## Ejemplo
```go
files, err := VaultInventoryScan("/data/vaults/turismo_spain", "turismo_spain_v1", "turismo_spain")
if err != nil {
log.Fatal(err)
}
for _, f := range files {
fmt.Printf("%s %s %s/%s\n", f.RelPath, f.Mime, f.Bucket, f.SubBucket)
}
```
## Notas
### Archivos omitidos
- `vault_index.db`, `vault_index.db-shm`, `vault_index.db-wal` (siempre)
- `.git/` en cualquier profundidad (SkipDir)
- Entradas cuyo nombre empieza por `.` solo en la raiz del vault (nivel 0)
### Deteccion de MIME
`file_validate_type_go_infra` (FileValidateType) no se usa porque su firma
requiere una lista blanca de tipos permitidos y retorna (mime, bool) — esta
disenada para validacion de uploads, no para escaneo inventarial donde
cualquier MIME es valido. Se usan en su lugar:
1. Override por extension (prioridad alta): `.csv``text/csv`, `.md``text/markdown`,
`.parquet``application/parquet`. Necesario porque `http.DetectContentType`
clasifica CSV como `text/plain` y no conoce Parquet.
2. `http.DetectContentType` sobre primeros 512 bytes (magic bytes, stdlib) para el resto.
### SHA-256
Calculado por streaming con `io.Copy` a `sha256.New()` — no carga el archivo completo
a memoria. Valido para archivos de cualquier tamano.
### Bucket / SubBucket
Derivados de la posicion en el arbol:
- `bucket` = primer segmento del RelPath (tipicamente "data" o "knowledge")
- `subBucket` = segundo segmento si existe; vacio si el archivo esta en la raiz del bucket