--- id: 0130a title: 'Funciones registry: parser MD + scan dirs + writer + watcher' status: pendiente type: infra domain: - registry-quality - dev-ux scope: registry-only priority: alta depends: [] blocks: - 0130b related: - "0130" tags: - registry - go - parser - frontmatter - fsnotify flow: "0130" created: "2026-05-22" updated: "2026-05-22" --- # 0130a — Funciones registry para kanban_cpp v2 **Status:** pendiente ## Por que El backend de kanban_cpp v2 necesita parsear/escribir frontmatter YAML de los `.md` de `dev/issues/` y `dev/flows/`. Estas piezas son reusables (cualquier app del registry puede operar sobre issues/flows), asi que viven en el registry, no en el backend de la app. ## Funciones a crear (delegar a fn-constructor en paralelo) | ID | Firma | Pureza | |---|---|---| | `parse_issue_md_go_infra` | `(path string) (Issue, []byte body, error)` | impure (FS) | | `write_issue_md_go_infra` | `(path string, issue Issue, body []byte) error` | impure (FS) | | `scan_issues_dir_go_infra` | `(root string) ([]Issue, error)` | impure (FS) | | `scan_flows_dir_go_infra` | `(root string) ([]Flow, error)` | impure (FS) | | `watch_dir_fsnotify_go_infra` | `(ctx, root) (<-chan FsEvent, error)` | impure (FS, async) | Tipos: - `Issue_go_infra` — struct con campos del frontmatter (id, title, status, type, domain, scope, priority, depends, blocks, related, flow, tags, created, updated, file_path, mtime_ns). - `Flow_go_infra` — struct equivalente para flows. - `FsEvent_go_infra` — `{path, op}` con `op in {create, write, remove, rename}`. ## Notas de implementacion - Usar `gopkg.in/yaml.v3` para parsing (preserva orden de keys via `yaml.Node`). - Writer DEBE preservar: - Orden de campos del frontmatter original. - Body MD intacto (todo lo que va despues del segundo `---`). - Comentarios YAML (libre, best-effort). - `parse_issue_md` debe ser tolerante: si falta un campo opcional, default empty. - `watch_dir_fsnotify` recursivo, debounce 200ms. ## DoD - 5 pares `.go` + `.md` en `functions/infra/`. - Tests unitarios: - parse → write → parse round-trip preserva struct. - scan_issues_dir devuelve >=90 issues actuales. - watcher detecta creacion + modificacion + borrado. - `fn index` registra los 5 IDs + 3 tipos. - `fn doctor uses-functions` limpio. ## Anti-scope NO incluye en esta tanda: - Markdown rendering del body (eso lo hace el frontend si quiere). - Validacion contra TAXONOMY (existe `fn doctor issues`). - CRUD de issues nuevos (write_issue cubre el caso, pero crear file = scope del backend).