From B Pipeline
Convierte la conversación actual (o un plan/PRD/doc) en issues de GitHub sliceados en vertical (tracer-bullet), con dependencias y epic de tracking, listos para drenar con b10-ship --epic. Usar cuando el usuario pida convertir lo conversado o un plan en issues/tareas/tickets ("crea los issues de esto", "turn this into issues"), pida partir trabajo en vertical slices, o cuando una sesión de diseño/brainstorm converge en trabajo por registrar. TAMBIÉN al INICIO: con una idea cruda ("quiero conversar una idea", "ayúdame a pensar X antes de codear") entra en modo diseño — entrevista 1x1 que madura la idea hasta un plan sliceable y recién ahí crea los issues. Paso génesis, antes de b1-triage: no implementa, no triagea, no abre PRs.
How this skill is triggered — by the user, by Claude, or both
Slash command
/b-pipeline:b0-conversation-to-issuesopusThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Paso **b0**: el génesis del pipeline. Toma lo discutido en la sesión y lo deja como **issues de GitHub bien formados**, **sliceados en vertical**, **ordenados por dependencia** y agrupados bajo un **epic** — exactamente la forma que `b10-ship --epic=<N>` sabe drenar. No construye nada: produce el input del resto del pipeline (b1 → … → b10).
Paso b0: el génesis del pipeline. Toma lo discutido en la sesión y lo deja como issues de GitHub bien formados, sliceados en vertical, ordenados por dependencia y agrupados bajo un epic — exactamente la forma que b10-ship --epic=<N> sabe drenar. No construye nada: produce el input del resto del pipeline (b1 → … → b10).
En este proyecto "tarea" = issue de GitHub. Trato ambos como sinónimos.
context: fork — a propósitoFuente de verdad = historial de esta sesión; usuario presente para el gate (AskUserQuestion). Razonamiento (destilar, slicear, gate) en el main loop; delegar solo grounding read-only (Paso 2) y redacción de bodies aprobados (Paso 6). Ningún subagente decide el slicing.
[--design] forzar modo diseño (entrevista) aunque la conversación parezca madura
[--from=<archivo>] leer ADEMÁS un plan/PRD/spec/doc como fuente (se combina con la conversación)
[--scope=<area>] hint de scope para labels y rama (ej. productos, ventas, auth)
[--epic-title="..."] título explícito del epic; si falta, se deriva del tema
[--no-epic] no crear epic de tracking (issues sueltos; usar solo con 1-2 issues independientes)
[--lang=es|en] idioma de los issues; default autodetectado de la conversación
[--cluster-hint] marcar slices secuenciales del mismo scope como cluster sugerido para b8-swarm
[--fast] junto con --yes: estampar epic-auto-merge sin preguntar (modo rápido headless)
[--yes] saltar el gate de confirmación (power users); por default el gate es OBLIGATORIO
[--dry-run] llegar hasta el preview y NO crear nada en GitHub
Argumentos recibidos en esta invocación:
$ARGUMENTS
Si
$ARGUMENTSaparece vacío, usar defaults (fuente = conversación, epic on, lang autodetectado).
Esta es la decisión de diseño central del skill — y donde más se equivoca un modelo. Cada issue debe ser una rebanada vertical end-to-end: algo que un usuario puede usar al mergearse, atravesando todo el stack (Drizzle → remote function → pantalla). NO una capa técnica.
| Slice VERTICAL (correcto) | Capa HORIZONTAL (incorrecto) |
|---|---|
"Listar productos en /productos" (DB + get_products + +page.svelte) | "Crear el schema Drizzle de todo el módulo" |
| "Crear/editar producto con formulario upsert" | "Escribir todas las remote functions" |
| "Eliminar producto con confirmación" | "Maquetar todos los componentes UI" |
| "Filtrar y buscar en el listado" | "Conectar el front al back" |
Por qué vertical: cada slice = un PR de b7 = entrega valor verificable en el browser por sí solo. Las capas horizontales no se pueden revisar visualmente, no cierran nada útil, y rompen el modelo screen-first del plugin (b2/b7 construyen y revisan por pantalla, no por capa).
El primer slice es el tracer bullet: el camino más delgado que ejerce todo el stack de punta a punta (típicamente "listar X read-only" — una query, una pantalla, auth). Prueba que la arquitectura cierra. Los slices siguientes agregan una capacidad encima (crear, editar, borrar, filtrar, exportar…), cada uno dependiente del tracer.
Cada slice debe caber en un PR de b7: simple (3-5 archivos) o medium (5-8). Si un slice pinta complex (8-15+), partirlo en más slices — el bot no construye complex sin gate, y un issue gigante no es un buen slice. Mejor 4 slices simples que 1 complex.
Antes de crear nada en GitHub, confirmar con el usuario. Esto es ADN del plugin (igual que b1-triage entiende antes de construir, y b9 nunca mergea sin un humano): registrar mal una conversación propaga el error por todo el pipeline. Un issue mal scopeado se construye, se revisa y casi se mergea antes de que alguien note que no era lo pedido.
El gate ataca el objetivo real, no la solución literal (problema XY).
Mecánica del gate (Paso 5): presentar en texto el entendimiento + el breakdown propuesto (epic + slices + orden de olas), y recién ahí usar AskUserQuestion para confirmar / ajustar / corregir. No crear issues hasta tener el OK. Con --yes se omite (power users que confían en el breakdown), pero el default SIEMPRE confirma.
Evaluar si la conversación aguanta el slicing: objetivo claro, entidades y operaciones nombradas, pocas ambigüedades.
--yes): flujo clásico — seguir al Paso 1.--design explícito: modo diseño. Leer references/design-interview.md y seguir su protocolo: resumen inteligente si hubo conversación previa, entrevista 1x1 con respuesta recomendada por pregunta, design doc en docs/plans/<tema>.md actualizado a medida que las decisiones cierran, convergencia propuesta cuando el checklist cierra. Al converger, volver acá y seguir al Paso 1 (la destilación sale casi gratis: ES el design doc).AskUserQuestion — slicear supuestos sin madurar propaga el error por todo el pipeline (el mismo argumento del gate).Releer la conversación de esta sesión (y --from=<archivo> si se pasó) y destilar:
Regla dura: no agregar requisitos que no estén en la conversación o el doc. Si algo falta para slicear bien, es material del gate (preguntarlo), no para rellenar de oficio.
Para que los issues nombren rutas/entidades REALES (no inventadas), un grounding breve — mismo espíritu acotado que b1-triage (grounding, no exploración exhaustiva).
Primero, un probe FUNCIONAL de codegraph (no confiar en "existe .codegraph/": la db puede estar rota o stale). Correr el probe compartido y, si dice ok, confirmar con una query real de la entidad 1:
bash "$CLAUDE_PLUGIN_ROOT/skills/b1-add-worktree/scripts/codegraph-probe.sh" . # -> CODEGRAPH_STATUS=ok|stale|missing|broken db_age_days=<n>
codegraph query "<entidad-1>" -p . # solo si status=ok: confirma que devuelve rutas usables
El probe SIEMPRE sale 0; el CODEGRAPH_STATUS elige la rama de grounding. codegraph es recomendación con fallback, nunca gate.
ok: codegraph en el main loop, CERO Explore agentsCon la db usable, hacer una query de codegraph por entidad en el main loop (no delegar a subagentes):
codegraph_search "<entidad>" (o codegraph query "<entidad>" -p .) por cada entidad → rutas + tablas reales. Una sola consulta suele cubrir varias entidades relacionadas.Agent(Explore): la query directa es más rápida y barata, y evita el fan-out.scope:<area>).stale/missing/broken: fallback rg + ExploreCuando el probe no da ok, usar rg/grep y Explore (y NO invocar tools codegraph_*: devolverían datos stale o fallarían):
rg -l "<entidad>" src/routes src/lib/server/db/schema.scope:<area>).Para entidades múltiples o un codebase desconocido, delegar el grounding a Agent(subagent_type=Explore) para no gastar el contexto principal — y paralelizar cuando hay varias entidades:
Agent(Explore) acotado ("ubica las rutas y tablas de X, Y, Z; reporta paths exactos").Agent(Explore) en paralelo (todos en un mismo mensaje, un agente por entidad o par de entidades cohesivas), cada uno con encargo cerrado: "¿existe src/routes/<area>? ¿qué tabla Drizzle la respalda? reporta paths exactos o 'no existe'". Read-only y disjuntos → seguro en paralelo, y corta el wall-clock de N búsquedas secuenciales. Cap razonable: ~6 agentes.El grounding es read-only: no decide nada, solo devuelve paths reales para que el slicing nombre rutas/tablas que existen (o confirme que son nuevas). Consolidas los reportes en el main loop antes de slicear.
Aplicar el principio de arriba. Para CADA slice definir:
s1-list, s2-upsert) — interno, lo usa el plan para deps.feat(scope): …, fix(scope): …).feature|bug|enhancement + scope:<area> (+ simple|medium como hint; b1-triage reconfirma).Asignar blocked_by (lista de slice-ids) a cada slice:
blocked_by únicamente cuando el slice consume algo que otro CREA (schema, query, pantalla). Prohibido encadenar por orden estético o "flujo natural" — todo lo que solo depende del tracer va JUNTO en la ola 1, aunque sean 5 slices. Cada dep artificial es una ola extra de espera: las olas anchas son lo que b10 paraleliza (wave-build / cluster b8).## Archivos previstos disjuntos entre slices de scopes distintos (precondición de wave-build). Mismo scope compartiendo archivos → candidatos a cluster, no a deps.Esto se materializa como la sección ## Blocked by en cada body (el script la inyecta resolviendo ids → #números reales). Es la MISMA convención que epic-graph.sh de b10 parsea para calcular olas y el closing_slice.
Cluster (opcional): si ≥2 slices son secuenciales, del mismo scope, simple|medium, y conviene un PR combinado, marcarlo como cluster (con --cluster-hint) para sugerir luego b10-ship --epic --cluster (que invoca b8-swarm). Slices de scopes distintos NUNCA van al mismo cluster.
Presentar al usuario, en texto:
Luego AskUserQuestion con DOS preguntas:
Pregunta 1 — el breakdown:
Pregunta 2 — modo de ejecución:
epic-auto-merge en el epic; b10 drena PRs con b6 blockers=0 sin gate por PR y activa paralelismo (wave-build, cluster, cap dinámico). Revisión humana concentrada en epic-review final + gates batcheados.merge-approved humano, builds secuenciales (comportamiento clásico).Iterar hasta el OK. Con --yes, saltar este paso (modo de ejecución: supervisado, salvo --fast explícito en los argumentos). Nunca crear antes del OK.
Escribir el plan JSON a un scratch (ej. "$(mktemp -t b0-plan.XXXX).json") con el schema que documenta scripts/create-epic.sh:
{
"lang": "es",
"epic": { "title": "Epic: <tema>", "labels": ["scope:<area>"], "closing_slice": "epic" },
"issues": [
{ "id": "s1-list", "title": "feat(<area>): …", "body": "<markdown SIN ## Blocked by>",
"labels": ["feature", "scope:<area>", "simple"], "blocked_by": [] },
{ "id": "s2-upsert", "title": "feat(<area>): …", "body": "…",
"labels": ["feature", "scope:<area>", "medium"], "blocked_by": ["s1-list"] }
]
}
Las deps van SOLO en
blocked_by(ids), no escribir## Blocked byni#numerosen elbody— esos issues aún no existen; el script inyecta la sección resolviendo ids → números reales.closing_slice: "epic"hace que el epic dependa de TODOS los subs y se vuelva el slice de cierre de b10 (build último, tras epic-review). Útil cuando el cierre del epic incluye limpieza/swap. Si no aplica,null. Con--no-epic: omitir la claveepic(issues sueltos, sin linkeo).
El cuerpo de cada slice es independiente: distinto archivo, distinta pantalla. El slicing (objetivo, deps, olas) es la parte difícil y ya quedó fijado y aprobado en el gate; redactar los markdown es trabajo mecánico que sigue el template de references/slicing-guide.md.
Workflow — un agent() (haiku/sonnet) por slice. Cada agente recibe lo MISMO para no divergir: (a) el template del slicing-guide, (b) la lista completa de slices (título + alcance de cada uno) para que su sección ## Alcance referencie bien lo que queda para OTROS slices, (c) los grounding facts (rutas/tablas reales del Paso 2), (d) el idioma, (e) el path del design doc si existe (docs/plans/<tema>.md) — cada body lo linkea en vez de repetir las reglas globales. Devuelve {id, body}. El main loop ensambla los bodies devueltos en el array issues del plan JSON. Cap de paralelismo razonable: ~8.Script del Workflow: cargar (Read) scripts/draft-bodies.workflow.js e invocar Workflow({ script:<contenido>, args:{ slices:[{id,title,scope}], lang:'es', grounding:'<resumen Paso 2>' } }). Tras recibir {bodies}, mapear id → body y completar cada issue del plan. El slicing NO se delega — los agentes solo escriben prosa de slices que tú ya decidiste; no inventan slices nuevos ni cambian deps.
Correr el preview (no toca GitHub):
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(cat "$HOME/.claude/b-pipeline.root" 2>/dev/null || ls -d "$HOME"/.claude/plugins/marketplaces/b-pipeline* 2>/dev/null | head -1)}"
B0="$PLUGIN_ROOT/skills/b0-conversation-to-issues/scripts/create-epic.sh"
bash "$B0" "$PLAN_JSON" --dry-run
Mostrar el árbol de olas. Si --dry-run global: parar acá, reportar el path del plan para inspección, emitir B0_DONE … mode=dry-run.
bash "$B0" "$PLAN_JSON"
El script: asegura labels, crea cada sub-issue resolviendo deps, crea el epic (rollup) y vincula los sub-issues nativos vía epic-link.sh. Es idempotente-lite (título idéntico abierto → reusa, no duplica). Parsear su última línea:
B0_DONE epic=<N|none> issues=<n1,n2,...> waves=<k> mode=created
Post-creación (en este orden):
issues-creados (#<epic>), commitear docs-only a la rama default y pushear — git add docs/plans/<tema>.md && git commit -m "docs(plans): diseño de <tema> (#<epic>)" && git push. Riesgo cero (solo docs/), y deja el tree limpio para el preflight de b10 (exit 18) con el doc referenciable desde los bodies. NO mezclar nada más en ese commit.gh issue edit <EPIC> --add-label epic-auto-merge — comando separado POST-creación, nunca en los labels del plan JSON: garantiza un evento labeled con tu token (actor humano) que bp_label_event valida en b10. El humano ya decidió en el gate; el label solo lo materializa. Quitarlo del epic en GitHub apaga el modo rápido en cualquier momento.Resumen corto en terminal:
/b-pipeline:b10-ship --epic=<N> — sin flags ni env vars: si el epic tiene epic-auto-merge, b10 activa solo el modo rápido completo (drenaje auto-merge + wave-build + cluster + cap dinámico).Última línea SIEMPRE (machine-readable, por si otro orquestador la consume):
B0_DONE epic=<N|none> issues=<csv> waves=<k> mode=<created|dry-run>
## Blocked by con #N en el body → epic-graph.sh la parsea para las olas.epic-link.sh → el epic muestra progreso nativo y b10 --epic los enumera (con fallback a los #N del rollup si el linkeo falla).## Blocked by sobre todos los subs (≥80% del grafo) → b10 lo construye último, tras el gate de epic-review.scope, simple|medium → candidatos a b8-swarm (1 PR combinado).create-epic.sh estampa los sub-issues con label ready (el epic no) — como el grounding y el gate humano ya se pagaron acá, b1 --auto los reusa sin re-triagear (deriva el veredicto de los labels + ## Blocked by). Solo re-triagea si un humano comentó el issue después de crearlo. b0 no reemplaza el triage: lo pre-paga.gh issue create a mano para esto — usar create-epic.sh (resuelve deps, linkea el epic, evita duplicados).references/design-interview.md — protocolo del modo diseño: entrevista 1x1, checklist de convergencia, template del design doc. Leer al entrar en modo diseño (Paso 0).references/slicing-guide.md — vertical vs horizontal, método tracer-bullet, ejemplo completo con grafo de deps y plan JSON, y el template de cuerpo de issue. Leer al redactar los bodies.scripts/draft-bodies.workflow.js — script Workflow para redacción paralela de bodies (breakdown >=6 slices).scripts/create-epic.sh — creación determinística: labels + sub-issues + deps + epic + linkeo nativo. Soporta --dry-run.../b10-ship/scripts/epic-graph.sh — lo que b10 usa para leer este grafo (referencia del contrato de deps/olas).npx claudepluginhub jporre/sveltekit-verticalslices --plugin b-pipelineGuides completion of development work by verifying tests, detecting environment, and presenting structured options for merge, PR, or cleanup.
Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.
Dispatches multiple subagents concurrently for independent tasks without shared state. Use when facing 2+ unrelated failures or subsystems that can be investigated in parallel.