merge: quick/params-schema-composability — params_schema para composabilidad de funciones
This commit is contained in:
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: container_name
|
||||
desc: "nombre del contenedor Docker a verificar"
|
||||
output: "sin salida; exit code 0 si existe y está corriendo, 1 si no"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,14 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: local_path
|
||||
desc: "ruta del archivo local a copiar"
|
||||
- name: container_name
|
||||
desc: "nombre del contenedor Docker destino"
|
||||
- name: dest_path
|
||||
desc: "ruta destino dentro del contenedor"
|
||||
output: "JSON con local_size y remote_size en bytes"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: project_dir
|
||||
desc: "directorio del proyecto donde crear el venv (default: directorio actual)"
|
||||
output: "ruta absoluta del venv creado o existente"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: project_dir
|
||||
desc: "directorio del proyecto con venv existente"
|
||||
output: "sin salida"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,8 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params: []
|
||||
output: "sin salida; muestra estado de instalación"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: country
|
||||
desc: "país de destino (opcional; default: auto)"
|
||||
- name: city
|
||||
desc: "ciudad de destino (opcional; default: auto)"
|
||||
output: "JSON con ok, server, country, city"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,8 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params: []
|
||||
output: "JSON con ok y status"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,8 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params: []
|
||||
output: "JSON con ok, ip, vpn_connected, vpn_server, source"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: country
|
||||
desc: "nombre del país en NordVPN (ej: Spain, United_States)"
|
||||
output: "JSON con ok, country, count, cities (array de strings)"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,8 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params: []
|
||||
output: "JSON con ok, count, countries (array de strings ordenado alfabéticamente)"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: protocol
|
||||
desc: "protocolo a usar: NordLynx (WireGuard) u OpenVPN"
|
||||
output: "JSON con ok y protocol confirmado"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,8 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params: []
|
||||
output: "JSON con estado de VPN: ok, connected, status, hostname, ip, country, city, etc"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,14 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: project_dir
|
||||
desc: "directorio raíz del proyecto con venv y notebooks"
|
||||
- name: pattern
|
||||
desc: "glob de notebooks a convertir (default: notebooks/*.ipynb)"
|
||||
- name: output_dir
|
||||
desc: "directorio destino para PDFs relativo a project_dir (default: notebooks/pdf/)"
|
||||
output: "lista de PDFs generados con sus rutas"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: entry
|
||||
desc: "ruta de entrada en el password store (ej: agentes/token)"
|
||||
output: "sin salida"
|
||||
tested: true
|
||||
tests: ["elimina entrada de test", "falla con entrada inexistente"]
|
||||
test_file_path: "bash/functions/infra/pass_test.sh"
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: entry
|
||||
desc: "ruta de entrada en el password store"
|
||||
- name: length
|
||||
desc: "longitud del password (default: 24 caracteres)"
|
||||
output: "password generado en texto plano"
|
||||
tested: true
|
||||
tests: ["genera password de longitud especifica", "default 24 chars"]
|
||||
test_file_path: "bash/functions/infra/pass_test.sh"
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: entry
|
||||
desc: "ruta de entrada en el password store"
|
||||
output: "valor del secreto en texto plano"
|
||||
tested: true
|
||||
tests: ["lee entrada existente", "falla con entrada inexistente"]
|
||||
test_file_path: "bash/functions/infra/pass_test.sh"
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: prefix
|
||||
desc: "prefijo para filtrar entradas (opcional; ej: agentes)"
|
||||
output: "JSON array de nombres de entradas"
|
||||
tested: true
|
||||
tests: ["lista todas las entradas", "filtra por prefijo"]
|
||||
test_file_path: "bash/functions/infra/pass_test.sh"
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: entry
|
||||
desc: "ruta de entrada en el password store"
|
||||
- name: value
|
||||
desc: "valor del secreto (opcional; se lee de stdin si no se proporciona)"
|
||||
output: "sin salida"
|
||||
tested: true
|
||||
tests: ["inserta valor y lo lee de vuelta", "sobreescribe valor existente"]
|
||||
test_file_path: "bash/functions/infra/pass_test.sh"
|
||||
|
||||
@@ -14,6 +14,8 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params: []
|
||||
output: "JSON con resultados de pull y push"
|
||||
tested: true
|
||||
tests: ["sincroniza con remoto"]
|
||||
test_file_path: "bash/functions/infra/pass_test.sh"
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: project_dir
|
||||
desc: "directorio del proyecto con venv existente"
|
||||
- name: packages
|
||||
desc: "nombres de paquetes Python a instalar (variadic)"
|
||||
output: "sin salida"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: project_dir
|
||||
desc: "directorio del proyecto Jupyter (default: directorio actual)"
|
||||
output: "ruta del archivo .claude/CLAUDE.md generado o actualizado"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: project_dir
|
||||
desc: "directorio del proyecto Jupyter (default: directorio actual)"
|
||||
output: "ruta del script run-jupyter-lab.sh generado"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: project_dir
|
||||
desc: "directorio del proyecto Jupyter (default: directorio actual)"
|
||||
output: "ruta del archivo startup generado"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: project_dir
|
||||
desc: "directorio del proyecto Jupyter (default: directorio actual)"
|
||||
- name: port
|
||||
desc: "puerto Jupyter (default: detectado automáticamente)"
|
||||
output: "ruta del archivo .mcp.json generado o actualizado"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -19,6 +19,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: output_file
|
||||
desc: "archivo de salida con rutas rotas (default: broken_paths.txt en raíz)"
|
||||
output: "sin salida directa; genera archivo con rutas inválidas"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -17,6 +17,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: nombre
|
||||
desc: "nombre del análisis en analysis/{nombre}/"
|
||||
- name: pattern
|
||||
desc: "glob de notebooks a exportar (default: notebooks/*.ipynb)"
|
||||
output: "sin salida directa; genera PDFs en notebooks/pdf/"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -22,6 +22,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: nombre
|
||||
desc: "nombre del análisis a crear"
|
||||
- name: paquetes_extra
|
||||
desc: "paquetes Python adicionales a instalar (variadic, opcional)"
|
||||
output: "sin salida directa; estructura completa en analysis/{nombre}/"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -18,6 +18,14 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: registry_db_path
|
||||
desc: "ruta a registry.db local (default: /home/lucas/fn_registry/registry.db)"
|
||||
- name: container_name
|
||||
desc: "nombre del contenedor Metabase (default: metabase)"
|
||||
- name: dest_path
|
||||
desc: "ruta destino dentro del contenedor (default: /registry.db)"
|
||||
output: "sin salida directa; verifica transferencia con coincidencia de tamaños"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: command_name
|
||||
desc: "nombre del comando a verificar en PATH"
|
||||
output: "sin salida en éxito"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: file_path
|
||||
desc: "ruta del archivo a verificar"
|
||||
output: "tamaño del archivo en bytes"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,14 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: []
|
||||
params:
|
||||
- name: total_steps
|
||||
desc: "número total de pasos ejecutados"
|
||||
- name: ok_steps
|
||||
desc: "número de pasos exitosos"
|
||||
- name: failed_steps
|
||||
desc: "número de pasos fallidos"
|
||||
output: "exit code: 0 (éxito), 1 (fallo), o 2 (parcial)"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: start_port
|
||||
desc: "puerto inicial del rango (default: 8888)"
|
||||
- name: end_port
|
||||
desc: "puerto final del rango (default: 8899)"
|
||||
output: "número de puerto TCP libre"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,22 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: []
|
||||
params:
|
||||
- name: flow_name
|
||||
desc: "nombre del flujo ejecutado"
|
||||
- name: status
|
||||
desc: "estado final: success, failure, o partial"
|
||||
- name: exit_code
|
||||
desc: "código de salida: 0, 1, o 2"
|
||||
- name: started_at
|
||||
desc: "timestamp ISO8601 de inicio"
|
||||
- name: ended_at
|
||||
desc: "timestamp ISO8601 de fin"
|
||||
- name: duration_ms
|
||||
desc: "duración total en milisegundos"
|
||||
- name: steps_file
|
||||
desc: "archivo TSV con resultados de cada paso"
|
||||
output: "JSON estructurado con metadatos de ejecución y array de pasos"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: yaml_file
|
||||
desc: "archivo YAML con especificación de pasos"
|
||||
- name: --strict
|
||||
desc: "flag opcional para mapear partial a failure"
|
||||
output: "JSON de ejecución con detalles de cada paso"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,14 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: db_path
|
||||
desc: "ruta a registry.db"
|
||||
- name: table
|
||||
desc: "tabla a validar: functions o types"
|
||||
- name: root_dir
|
||||
desc: "directorio raíz del repositorio"
|
||||
output: "TSV con id, file_path, domain, tabla de rutas inválidas"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -35,6 +35,8 @@ func main() {
|
||||
cmdProposal(os.Args[2:])
|
||||
case "run":
|
||||
cmdRun(os.Args[2:])
|
||||
case "check":
|
||||
cmdCheck(os.Args[2:])
|
||||
case "app":
|
||||
cmdApp(os.Args[2:])
|
||||
case "analysis":
|
||||
@@ -58,6 +60,7 @@ Usage:
|
||||
fn show <id> Muestra entrada completa
|
||||
fn add [-k kind] Abre $EDITOR con template
|
||||
fn run <id_or_name> [args...] Ejecuta funcion/pipeline (go/py/bash)
|
||||
fn check params Lista funciones sin params_schema
|
||||
fn ops <subcommand> Gestiona operations.db (fn ops help)
|
||||
fn proposal <add|list|show|update> Gestiona proposals
|
||||
fn app <list|clone|pull> Gestiona apps externas (Gitea)
|
||||
@@ -387,6 +390,9 @@ func printFunction(f *registry.Function) {
|
||||
if len(f.Imports) > 0 {
|
||||
fmt.Printf("Imports: %s\n", strings.Join(f.Imports, ", "))
|
||||
}
|
||||
if f.ParamsSchema != "" {
|
||||
fmt.Printf("Params: %s\n", f.ParamsSchema)
|
||||
}
|
||||
if f.Example != "" {
|
||||
fmt.Printf("\nExample:\n%s\n", f.Example)
|
||||
}
|
||||
@@ -512,6 +518,53 @@ func printAnalysisEntry(a *registry.Analysis) {
|
||||
}
|
||||
}
|
||||
|
||||
// --- check ---
|
||||
|
||||
func cmdCheck(args []string) {
|
||||
if len(args) < 1 {
|
||||
fmt.Fprintln(os.Stderr, "usage: fn check <subcommand>\n\nSubcommands:\n params Lista funciones sin params_schema documentado")
|
||||
os.Exit(1)
|
||||
}
|
||||
switch args[0] {
|
||||
case "params":
|
||||
cmdCheckParams()
|
||||
default:
|
||||
fmt.Fprintf(os.Stderr, "unknown check subcommand: %s\n", args[0])
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func cmdCheckParams() {
|
||||
db := openDB()
|
||||
defer db.Close()
|
||||
|
||||
fns, err := db.SearchFunctions("", "", "", "", "")
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "error: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
var missing []registry.Function
|
||||
for _, f := range fns {
|
||||
if f.ParamsSchema == "" {
|
||||
missing = append(missing, f)
|
||||
}
|
||||
}
|
||||
|
||||
if len(missing) == 0 {
|
||||
fmt.Printf("All %d functions have params_schema documented.\n", len(fns))
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("%d/%d functions missing params_schema:\n\n", len(missing), len(fns))
|
||||
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
|
||||
fmt.Fprintln(w, "ID\tLANG\tDOMAIN\tKIND")
|
||||
for _, f := range missing {
|
||||
fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", f.ID, f.Lang, f.Domain, f.Kind)
|
||||
}
|
||||
w.Flush()
|
||||
}
|
||||
|
||||
// --- add ---
|
||||
|
||||
func cmdAdd(args []string) {
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: []
|
||||
params:
|
||||
- name: index
|
||||
desc: "Índice cíclico en la paleta de colores (ciclará sobre 5 colores disponibles)"
|
||||
output: "String con variable CSS de color para gráficos (ej: 'hsl(var(--chart-1, 220 70% 50%))')"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [clsx, tailwind-merge]
|
||||
params:
|
||||
- name: inputs
|
||||
desc: "Clases CSS en cualquier formato: strings, arrays, objetos con condiciones booleanas"
|
||||
output: "String con clases CSS combinadas y mergeadas, sin duplicados y conflictos Tailwind resueltos"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: []
|
||||
params:
|
||||
- name: "n"
|
||||
desc: "Número a formatear de forma compacta"
|
||||
- name: decimals
|
||||
desc: "Cantidad de decimales a mostrar (por defecto 1)"
|
||||
output: "String con número formateado en notación compacta (ej: '1.2K', '1.5M', '1.0G')"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: []
|
||||
params:
|
||||
- name: colors
|
||||
desc: "Objeto con pares clave-valor de nombre variable CSS a valor de color"
|
||||
- name: selector
|
||||
desc: "Selector CSS donde inyectar variables (':root' por defecto)"
|
||||
output: "String con bloque CSS completo conteniendo definiciones de variables de tema"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: cssVar
|
||||
desc: "Variable CSS a resolver (acepta '--primary', 'primary' o 'var(--primary)')"
|
||||
output: "String con valor RGB computado por el browser (ej: 'rgb(120, 80, 220)')"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: []
|
||||
params:
|
||||
- name: index
|
||||
desc: "Índice de serie (ciclará sobre paleta de 5 colores)"
|
||||
- name: color
|
||||
desc: "Color explícito a usar si se proporciona (opcional)"
|
||||
output: "String con color HEX o el color explícito proporcionado"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
output: "Objeto ThemeTokens con todas las variables CSS de tema resueltas (colores, tipografía, espaciado)"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: []
|
||||
params:
|
||||
- name: config
|
||||
desc: "Configuración de tema con propiedades semánticas de color"
|
||||
output: "Objeto ThemeColors con variables CSS estandarizadas mapeadas de la config"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: []
|
||||
output: "Clase WailsCache con métodos get, set, invalidate, subscribe para gestionar caché reactiva con invalidación jerárquica"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react/collapsible", "lucide-react"]
|
||||
output: "Componente Accordion que renderiza secciones colapsables con soporte para múltiples items abiertos simultáneamente"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react, class-variance-authority]
|
||||
output: "Componente Alert que renderiza una alerta accesible con slots para título, descripción, icono y acción"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
params:
|
||||
- name: props
|
||||
desc: "Configuración del dashboard: título, métricas con deltas, y lista de charts con span"
|
||||
output: "Componente ReactElement que renderiza un dashboard de analytics completo con header, KPIs y grid de charts"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: theme
|
||||
desc: "Objeto Theme con nombre, label y colores a inyectar como CSS variables"
|
||||
output: "Void - función impura que inyecta CSS variables en document.documentElement"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [recharts]
|
||||
output: "Componente JSX que renderiza un gráfico de área con gradientes, multi-series y tooltips temáticos"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["class-variance-authority"]
|
||||
output: "Componente Avatar que renderiza imagen de usuario circular con fallback a iniciales generadas"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["class-variance-authority"]
|
||||
output: "Componente Badge que renderiza un indicador visual con 10 variantes semánticas de estado"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [recharts]
|
||||
output: "Componente JSX que renderiza un gráfico de barras vertical u horizontal con multi-series y tooltips temáticos"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["lucide-react"]
|
||||
output: "Componente Breadcrumb que renderiza navegación jerárquica con separadores, elipsis y soporte para router links"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react", "class-variance-authority"]
|
||||
output: "JSX.Element: botón renderizado con los estilos y comportamientos configurados"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["react"]
|
||||
output: "Componente Card que renderiza un contenedor con slots composables (header, content, footer) y 3 variantes visuales"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [recharts, react]
|
||||
output: "Componente ChartContainer que renderiza base responsive para gráficos Recharts con tooltip y legend temáticos"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react/checkbox", "class-variance-authority"]
|
||||
output: "Componente Checkbox que renderiza input booleano accesible con label opcional y estado indeterminate"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["lucide-react"]
|
||||
output: "Componente Command que renderiza combobox de búsqueda y selección con filtrado reactivo, grupos e iconos"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
params:
|
||||
- name: props
|
||||
desc: "Configuración CRUD: título, datos, columnas de tabla, campos de formulario y callbacks para add/edit/delete"
|
||||
output: "Componente ReactElement que renderiza página CRUD completa con tabla y botones de acción"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
params:
|
||||
- name: props
|
||||
desc: "Configuración de layout: número de columnas y array de widgets con id, título, contenido y span"
|
||||
output: "Componente ReactElement que renderiza grid responsive de dashboard con ancho adaptable por widget"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
output: "Componente DataTable que renderiza tabla con sticky header, heatmap condicional y formato automático de datos"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
params:
|
||||
- name: props
|
||||
desc: "Configuración de página de detalle: título, avatar, badge, tabs, timeline y campos de metadata"
|
||||
output: "Componente ReactElement que renderiza página de detalle con header, grid de campos y timeline de actividad"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react", lucide-react, react]
|
||||
output: "Componente Dialog que renderiza modal accesible con overlay blur, focus trap y sistema de slots composables"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react/menu", "lucide-react"]
|
||||
output: "Componente DropdownMenu que renderiza menú desplegable accesible con items, checkboxes, radios y submenus"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
output: "Componente FormField que renderiza wrapper de campo con label, helper text, error y ARIA automáticos"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["graphology", "graphology-layout-forceatlas2", "sigma"]
|
||||
output: "Componente GraphContainer que renderiza grafo interactivo con sigma.js, ForceAtlas2 layout y legend"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react", "react"]
|
||||
output: "Componente Input que renderiza campo de entrada accesible con soporte para iconos y validación ARIA"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
output: "Componente KPICard que renderiza card de métrica con label, valor, delta descriptivo, icono y slot de mini chart"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["react"]
|
||||
output: "Componente Label que renderiza etiqueta de formulario accesible con soporte para estados disabled"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [recharts]
|
||||
output: "Componente LineChart que renderiza gráfico de líneas multi-series con zoom, curvas customizables y líneas de referencia"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
output: "Componente PageHeader que renderiza cabecera de página con título, acciones, tabs integrados y modo sticky"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["lucide-react", "./button"]
|
||||
output: "Componente Pagination que renderiza controles de navegación de páginas con Previous/Next y números"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [recharts]
|
||||
output: "Componente PieChart que renderiza gráfico de torta o dona con labels de porcentaje, leyenda y tooltip"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react/popover"]
|
||||
output: "Componente Popover que renderiza contenido flotante accesible posicionado automáticamente"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [class-variance-authority]
|
||||
output: "Componente ProgressBar que renderiza barra de progreso con animaciones, buffer y modo indeterminado"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react/radio-group", "@base-ui/react/radio"]
|
||||
output: "Componente RadioGroup que renderiza grupo de opciones exclusivas accesible"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,14 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["lucide-react"]
|
||||
params:
|
||||
- name: onSearch
|
||||
desc: "Callback que se ejecuta con la query debounceada"
|
||||
- name: placeholder
|
||||
desc: "Placeholder del input (por defecto 'Search...')"
|
||||
- name: debounceMs
|
||||
desc: "Delay en milisegundos para el debounce (por defecto 300)"
|
||||
output: "Componente SearchBar que renderiza input de búsqueda con icono y botón de limpiar"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react", lucide-react, react]
|
||||
output: "Componente Select que renderiza dropdown genérico accesible con grupos, separadores y posicionamiento automático"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
params:
|
||||
- name: props
|
||||
desc: "Configuración: título, secciones con campos (text, number, toggle, select, textarea) y callback onSave"
|
||||
output: "Componente ReactElement que renderiza página de configuración con sidebar y secciones navegables"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react/dialog", "class-variance-authority", "lucide-react"]
|
||||
output: "Componente Sheet que renderiza panel deslizante lateral accesible con animaciones"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
output: "Componente SimpleSelect que renderiza dropdown simplificado con soporte para opciones planas o agrupadas"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
output: "Componente Skeleton que renderiza placeholder de carga con 6 variantes preconfiguradas (text, card, avatar, button, table)"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
output: "Componente Sparkline que renderiza mini gráfico SVG inline con variantes line, area y bar"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react/switch"]
|
||||
output: "Componente SwitchToggle que renderiza switch on/off accesible con label opcional"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react", class-variance-authority]
|
||||
output: "Componente Tabs que renderiza sistema de navegación por tabs con orientación y variantes configurables"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: []
|
||||
output: "Componente Textarea que renderiza input multilinea accesible con auto-resize opcional"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
output: "Componente ThemeProvider que renderiza context de tema con persistencia en localStorage y hook useTheme"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["class-variance-authority", "lucide-react"]
|
||||
output: "Componente Toast que renderiza notificación temporal con variantes semánticas, auto-dismiss y hook useToast"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: ["@base-ui/react", react]
|
||||
output: "Componente Tooltip que renderiza tooltip accesible con posicionamiento automático y delay configurable"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
params:
|
||||
- name: options
|
||||
desc: "Configuración: fps (target), draw (callback de renderizado), opcionalmente DPR"
|
||||
output: "Hook que retorna canvasRef y renderFpsRef para renderizado animado a N fps"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
params:
|
||||
- name: opts
|
||||
desc: "Configuración: eventName, onEvent callback, once, enabled para controlar suscripción"
|
||||
output: "Hook que retorna lastData, eventCount, emit y funciones para suscribirse a eventos Wails bidireccionales"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
params:
|
||||
- name: opts
|
||||
desc: "Configuración: mutationFn, invalidateQueries, onMutate para optimistic updates"
|
||||
output: "Hook que retorna mutate, mutateAsync, isLoading, error para ejecutar escrituras IPC con cache"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
params:
|
||||
- name: opts
|
||||
desc: "Configuración: queryKey para cache, queryFn que ejecuta binding Wails, enabled, refetchInterval, staleTime"
|
||||
output: "Hook que retorna data, loading, error, refetch, invalidate para queries cacheadas vía IPC"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
params:
|
||||
- name: opts
|
||||
desc: "Configuración: streamName, startFn/stopFn para control, bufferSize, transform para procesamiento"
|
||||
output: "Hook que retorna data (array bufferado), isStreaming, start, stop, clear para streaming Go→TS"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,7 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: [react]
|
||||
output: "Componente WailsProvider que proporciona context de cache y opciones default para hooks Wails"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: [fmt, strconv, strings]
|
||||
params:
|
||||
- name: c
|
||||
desc: "conexión CDP activa"
|
||||
- name: selector
|
||||
desc: "selector CSS del elemento a hacer click"
|
||||
output: "error si el selector no coincide o falla la acción"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: [fmt, os]
|
||||
params:
|
||||
- name: c
|
||||
desc: "conexión CDP (puede ser nil)"
|
||||
- name: pid
|
||||
desc: "PID del proceso Chrome (0 para no matar)"
|
||||
output: "error si falla la desconexión o el cierre del proceso"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
|
||||
@@ -14,6 +14,10 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: [fmt, net, net/url, strings]
|
||||
params:
|
||||
- name: port
|
||||
desc: "puerto del servidor CDP (localhost:{port})"
|
||||
output: "(*CDPConn, error): conexión WebSocket lista para usar"
|
||||
tested: true
|
||||
tests: ["TestChromeLaunchAndConnect"]
|
||||
test_file_path: "functions/browser/chrome_launch_test.go"
|
||||
|
||||
@@ -14,6 +14,12 @@ returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: [fmt]
|
||||
params:
|
||||
- name: c
|
||||
desc: "conexión CDP activa"
|
||||
- name: expression
|
||||
desc: "expresión JavaScript a evaluar"
|
||||
output: "string: resultado serializado, o error si falla"
|
||||
tested: true
|
||||
tests: ["TestCdpEvaluate"]
|
||||
test_file_path: "functions/browser/chrome_launch_test.go"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user