---
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-<slug>.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 <slug> --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 <subcomando> $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 <slug> --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).
