From issue-fix-workflow
Flujo de trabajo para llevar UN issue de GitHub desde que se elige hasta un PR probado y con evidencia, en CUALQUIER repo. Úsalo SIEMPRE que el usuario decida trabajar en un issue, pida crear una rama para un hallazgo, o vaya a abrir un PR de una corrección — aunque no nombre el flujo explícitamente. Se dispara con frases como "trabajemos el issue #N", "vamos con el #1", "arreglemos el hallazgo", "crea la rama para", "hagamos el PR del issue", "let's work on issue #", "fix this issue", "open a PR for". Cubre: detectar y recordar las convenciones del repo (rama de integración, gestor de paquetes, stack de pruebas, CI), crear la rama con convención de nombres, reproducir antes de arreglar, implementar SOLO el fix, pruebas con evidencia antes/después, y PR con evidencia.
How this skill is triggered — by the user, by Claude, or both
Slash command
/issue-fix-workflow:issue-fix-workflowThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Este es el contrato de trabajo. La meta no es solo "arreglar el bug", sino
Este es el contrato de trabajo. La meta no es solo "arreglar el bug", sino dejar prueba reproducible de que el problema existía y de que quedó resuelto, en un PR que contenga únicamente ese arreglo. Un PR sin evidencia o con cambios mezclados no está listo, por bien que se vea el código.
Agnóstico del repo. Este flujo no asume un stack ni una rama concreta. La primera vez que lo usas en un repo, el Paso 0 detecta sus convenciones (rama de integración, gestor de paquetes, stack de pruebas, CI) y las guarda en un archivo local; de ahí en adelante las relee. Todos los
<placeholders>de abajo salen de ese archivo.ghya detecta el repo actual, así que no hace falta--reposalvo que quieras forzarlo.
develop en Gitflow o main). CI corre su compuerta en cada PR.Cambios triviales pactados con el usuario fuera del tablero (un typo, ajustar un texto) no necesitan rama/issue/PR formal si el usuario lo dice. Ante la duda, sigue el flujo: es barato y deja trazabilidad.
Este flujo se adapta al repo, no al revés. Antes de tocar nada, asegúrate de tener
las convenciones registradas en un archivo local: .claude/issue-fix-workflow.local.md.
.git/info/exclude (el exclude local del repo,
que nunca se commitea). No uses .gitignore salvo que el usuario lo prefiera.Detección (usa lo que el repo te diga; pregunta solo los huecos):
| Convención | Cómo detectarla |
|---|---|
| Rama de integración | gh repo view --json defaultBranchRef -q .defaultBranchRef.name; si existe una rama develop, suele ser la base de los PR. Confirma si hay duda. |
| Gestor de paquetes | lockfile: pnpm-lock.yaml→pnpm · package-lock.json→npm · yarn.lock→yarn · bun.lockb→bun |
| Monorepo / paquete objetivo | pnpm-workspace.yaml / turbo.json / nx.json; lista los workspaces y pregunta cuál es el paquete que se prueba (o "(paquete único)" si no hay monorepo) |
| Stack de pruebas | deps en package.json: vitest/jest (unit), @playwright/test/cypress (e2e). Otro lenguaje → su runner (pytest, go test, etc.) |
| Compuerta de CI | lee .github/workflows/*.yml: qué corre en cada PR (build/typecheck/test/lint) |
| Visibilidad del repo | gh repo view --json isPrivate -q .isPrivate (define cómo se adjunta la evidencia, ver Paso 7) |
| Convención de commits/ramas | mira git log --oneline -20 (¿Conventional Commits? ¿idioma?); pregunta el idioma si no es claro |
Plantilla del archivo (rellena con lo detectado):
# issue-fix-workflow — convenciones de este repo (local, no versionado)
- Rama de integración: develop # o main
- Gestor de paquetes: pnpm # npm | yarn | bun
- Workspace/paquete objetivo: @scope/web # o "(paquete único)"
- Unit tests: vitest → comando: pnpm test
- E2E: playwright → comando: pnpm --filter @scope/web test:e2e
- Compuerta de CI: build, typecheck, test
- Visibilidad: público # privado
- Commits: Conventional Commits, español; `Refs #N` en commits, `Closes #N` en el PR
- Artefactos de prueba: <paquete>/test-results/ (gitignored)
Excluirlo localmente (sin tocar archivos versionados):
mkdir -p .claude
grep -qxF '.claude/issue-fix-workflow.local.md' .git/info/exclude 2>/dev/null \
|| echo '.claude/issue-fix-workflow.local.md' >> .git/info/exclude
De aquí en adelante, cada
<placeholder>(rama de integración,<pm>,<paquete>, comandos de test/CI) sale de ese archivo.
El usuario decide qué issue se trabaja; este flujo arranca después de esa decisión. Primero:
gh issue view <N>.Convención de rama: <tipo>/<N>-<nombre-corto-kebab> (idioma del nombre según
el Paso 0).
| tipo | cuándo |
|---|---|
security/ | vulnerabilidad / control de acceso |
fix/ | bug de lógica o comportamiento incorrecto |
feat/ | funcionalidad nueva |
refactor/ | reestructura sin cambiar comportamiento |
perf/ | rendimiento |
chore/ | tooling, dependencias, CI, config |
docs/ | documentación |
test/ | solo pruebas o infraestructura de pruebas |
git checkout <rama-integración> && git pull origin <rama-integración>
git checkout -b security/1-rechazar-acceso-ajeno
Nombre corto: 2–4 palabras, describe el arreglo, no el síntoma
(security/2-cifrar-dato-sensible, no security/2-dato-en-texto-plano).
1 PR por issue es la regla. La primera vez que el repo no tiene infraestructura de pruebas, el setup (ver
references/test-setup.md) viaja dentro del PR del primer fix que lo necesita — excepción de una sola vez, déjala explícita en el cuerpo del PR. De ahí en adelante, cada PR es solo su fix + su test.
Escribe la prueba que falla por el bug, según el tipo de issue:
| Tipo de hallazgo | Reproducción / evidencia |
|---|---|
| Comportamiento de UI (flujo, estado, navegación) | Test e2e que actúa como el usuario; con grabación de video activa captura el "antes" (falla) |
| Seguridad / control de acceso / IDOR | Test que ejerce el abuso — p. ej. invocar una acción/endpoint con un identificador ajeno — y espera ser rechazado. Falla hoy, pasa con el fix |
| Lógica pura / cálculo | Test unitario con el caso que da el resultado incorrecto |
| Datos en texto plano / fuga al cliente | Test que inspecciona el payload/persistencia y asserta que el dato sensible no aparece en claro |
| Visual / estilos | Captura "antes" (screenshot del test e2e) |
Corre la prueba y confirma que falla por la razón correcta. Guarda la salida: ese rojo es la mitad de tu evidencia.
Si para este issue ningún artefacto evidente aplica (o el video no demostraría nada), dilo y acuerda con el usuario qué mostrar antes de implementar.
# ANTES: corre el spec contra el estado pre-fix (stash del fix o checkout de la rama de integración)
git stash && <pm> <cmd-e2e> <spec> # graba "antes"
git stash pop
# DESPUÉS: con el fix aplicado
<pm> <cmd-e2e> <spec> # graba "después"
Los videos quedan en el directorio de resultados del Paso 0 (p. ej.
<paquete>/test-results/, gitignored). Renómbralos a
proof/issue-<N>/antes.<ext> y después.<ext> para adjuntarlos al PR.No abras el PR hasta que esto pase entero — es exactamente lo que correrá CI (los comandos exactos están en el Paso 0):
# compuerta de CI, p. ej.:
<pm> build && <pm> typecheck && <pm> test
<pm> <cmd-e2e> # E2E + videos, si aplica
Muestra la salida real al usuario (no afirmes "pasa" sin pegar el resultado). Aplica la disciplina de evidencia: probar antes de declarar hecho.
Conventional Commits, en el idioma del Paso 0, con scope y referencia al issue.
Usa Refs #N en commits (no Closes, para no cerrar el issue al pushear la
rama; el cierre lo hace el PR al mergear).
security(api): derivar la identidad desde la sesión, no del cliente
La acción confiaba en un identificador enviado por el cliente y corría con
privilegios elevados, saltándose las reglas de acceso. Ahora la identidad
sale de la sesión verificada en el servidor.
Refs #1
Co-Authored-By: Claude <[email protected]>
Antes de commitear, revisa el alcance: git diff <rama-integración>...HEAD --stat.
Cada archivo debe pertenecer al issue. Saca cualquier cosa ajena (formateos
sueltos, reportes, scripts de exploración, .env*, artefactos). Recuerda que
reportes y scripts auxiliares de auditoría viven fuera del repo a propósito.
PR hacia la rama de integración. Título: [<tipo>] #<N> · <resumen corto>.
Cuerpo según la plantilla assets/pr-body.md (Closes #N, qué/por qué, evidencia
antes/después, checklist).
git push -u origin security/1-rechazar-acceso-ajeno
gh pr create --base <rama-integración> \
--title "[security] #1 · Identidad desde la sesión verificada" \
--body-file <(...) # usa assets/pr-body.md como base
La evidencia no siempre es un video: muchas veces basta una captura (un estado, un antes/después de UI, una tabla, un error). El script incluido en este skill acepta imágenes (.png/.jpg/.gif/.webp) y videos (.webm/.mp4 → los convierte a gif):
scripts/publicar-evidencia.sh <N> \
antes.png despues.png # o videos: .../antes.webm .../despues.webm
(Ruta del script: la carpeta scripts/ de este skill. Si lo invocas desde otro
directorio, usa la ruta absoluta a ese archivo.)
Para verse inline, GitHub necesita una URL accesible sin auth — y ahí está el quiebre público vs privado (la visibilidad la fijaste en el Paso 0):
media/issue-N y los
comenta vía raw.githubusercontent → inline. Automático.raw dan 404 al proxy y subir adjuntos por API
no se puede (el endpoint user-attachments del drag-drop exige sesión de
navegador, no token — verificado: 422). El script lo detecta y deja los archivos
en evidencia-issue-N/ para que los arrastres al PR (imágenes inline; .webm
con reproductor nativo) — o súbelos como artefacto de CI para descarga.Espera la aprobación del usuario antes de pushear y abrir el PR — es una acción de cara al exterior. El merge lo decide el equipo con CI en verde y review.
Antes de marcar listo, verifica:
git diff <rama-integración>...HEAD --stat — todo pertenece al issue #N.Closes #N) y no toca nada fuera de alcance.security/1-rechazar-acceso-ajeno → test que invoca
la acción con un identificador ajeno y espera rechazo (rojo→verde) + e2e del
login real.security/2-cifrar-dato-sensible → test que
asserta que el payload al cliente no contiene el dato en claro.fix/3-calculo-estable → unit test que
fija la fecha y prueba que el resultado no cambia entre días.fix/4-evitar-division-cero → unit test con la entrada
0 esperando un resultado vacío, no NaN.references/test-setup.md — ejemplo de bootstrap de pruebas (Vitest +
Playwright sobre un monorepo pnpm/Turbo con Firestore). Adáptalo a tu stack; las
rutas y comandos salen del Paso 0.assets/pr-body.md — plantilla del cuerpo del PR.scripts/publicar-evidencia.sh — publica evidencia (imágenes o videos→gif)
inline en el PR vía rama media/issue-N en repo público, o la deja lista para
arrastrar en repo privado. Requiere gh (+ ffmpeg solo para videos).Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub jachana/claude-marketplace --plugin issue-fix-workflow