--- description: "Gestiona issues del registry en dev/issues/. Subcomandos: list, show, status, board, dep, roadmap, tag, done, stale, create. Frontmatter YAML canonico (issue 0100)." --- # /issue — Gestionar issues del registry Issues viven en `dev/issues/NNNN-.md` con frontmatter YAML canonico (id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags). Allowlists en `dev/TAXONOMY.md` (no inventar valores). Diferencia con `dev/flows/`: - **Issues** = bugs, features, refactors, chores, epics de implementacion. - **Flows** = casos de uso end-to-end multi-app. ## Sintaxis ``` /issue list [--domain X] [--type Y] [--status Z] [--prio P] [--epic NNNN] /issue show NNNN /issue status NNNN # acceptance % + estado deps /issue board # kanban pendiente/in-progress/bloqueado/done /issue dep NNNN # arbol bloquea/depende /issue roadmap NNNN # epic + sub-IDs (NNNNa, NNNNb, ...) /issue tag NNNN +X -Y # mantenimiento tags/domain /issue done NNNN # mueve a completed/, valida deps /issue stale [--days 30] /issue create --type T --domain D [--prio P] [--depends NNNN] ``` ## Implementacion **Fase 1 (manual via Claude):** El agente lee `dev/issues/*.md`, parsea frontmatter YAML con `yaml.safe_load`, aplica el filtro, imprime tabla. ```python import yaml, pathlib, re issues = [] for f in pathlib.Path("dev/issues").glob("*.md"): if f.name in {"README.md", "template.md"}: continue txt = f.read_text() m = re.match(r"^---\n(.*?)\n---", txt, re.S) if not m: continue fm = yaml.safe_load(m.group(1)) or {} fm["_path"] = str(f) issues.append(fm) # filter + print ``` **Fase 2 (cuando 0101 dev_console exista):** Cada subcomando se mapea a `./apps/dev_console/dev_console issue $ARGS`. ## Subcomandos clave ### `list` Imprime tabla `id | title | status | type | domain | priority | depends_pending`. Filtrable por flags. ### `show NNNN` Read directo del .md + render del frontmatter como tabla + body como markdown. ### `status NNNN` Cuenta checkboxes en `## Acceptance` + chequea si todos los `depends` estan en `status: completado`. Si alguno no, marca `bloqueado`. ### `board` Tabla 4 columnas (pendiente / in-progress / bloqueado / completado_hoy). Card por issue: id + title + prio. Status `bloqueado` se calcula on-the-fly desde `depends`. ### `roadmap NNNN` Si `type: epic`: lista sub-issues `NNNNa`, `NNNNb`, etc. con su estado. Si no epic: error "not an epic". ### `done NNNN` 1. Lee frontmatter. 2. Verifica todos `depends` cerrados (sino, error). 3. Cuenta `## Acceptance` 100% (sino, error). 4. `git mv dev/issues/NNNN-*.md dev/issues/completed/`. 5. Actualiza `status: completado` + `updated: today`. ### `create --type T --domain D` Genera siguiente ID libre (max existing + 1, zero-padded 4). Scaffold desde plantilla minima con frontmatter rellenado. ## Reglas - Domain debe estar en `dev/TAXONOMY.md` allowlist. - Scope/type/priority idem. - `id` siempre string `"NNNN"` (zero-padded, sub-IDs con sufijo `a-z`). - Modificar frontmatter SIEMPRE preserva campos no tocados (no overwrite).