--- name: scan_issues_dir kind: function lang: go domain: infra version: "0.1.0" purity: impure signature: "func ScanIssuesDir(root string) ([]Issue, error)" description: "Escanea el directorio dev/issues/ (root) y devuelve todos los Issues encontrados en *.md directos y en completed/*.md. Si un archivo falla al parsearse emite un warning al log y continua. Resultado ordenado por ID ascendente." tags: [issue, scanner, frontmatter, yaml, dev-ux, kanban] uses_functions: [parse_issue_md_go_infra] uses_types: [issue_go_infra] returns: [issue_go_infra] returns_optional: false error_type: "error_go_core" imports: ["fmt", "log", "os", "path/filepath", "sort", "strings"] params: - name: root desc: "Ruta al directorio dev/issues/ (absoluta o relativa). Debe existir o retorna error." output: "Slice de Issue ordenado por ID asc. Incluye issues de completed/ con Completed=true. Issues con YAML malformado se omiten con warning." tested: true tests: - "scan devuelve al menos 90 issues" - "issue 0130 esta presente" - "issues ordenados por ID asc" - "completed issues tienen Completed=true" - "directorio inexistente retorna error" test_file_path: "functions/infra/scan_issues_dir_test.go" file_path: "functions/infra/scan_issues_dir.go" --- ## Ejemplo ```go issues, err := infra.ScanIssuesDir("$HOME/fn_registry/dev/issues") if err != nil { log.Fatal(err) } fmt.Printf("Total issues: %d\n", len(issues)) for _, iss := range issues { fmt.Printf(" %s [%s] %s\n", iss.ID, iss.Status, iss.Title) } ``` ## Cuando usarla Al arrancar el backend de kanban_cpp para poblar la cache SQLite inicial. Tambien util para cualquier herramienta que necesite un snapshot completo de todos los issues del proyecto (stats, dashboards, fn doctor). ## Gotchas - Skippea automaticamente `INDEX.md` y `README.md` — no son issues. - Si `completed/` no existe (no hay issues completados), no retorna error — devuelve los issues directos. - La ordenacion es lexicografica por ID string, no numerica. `"0099" < "0100"` funciona bien con el formato de 4 digitos del registry. - Un issue con YAML invalido no aborta el scan entero — solo ese archivo se omite con un `log.Printf` warning. Si necesitas comportamiento strict (abort en primer error), parsea manualmente con `ParseIssueMd`.