Communitygithub.com

lguidolin/ship-it

Úsalo cuando el usuario quiera enviar trabajo: hacer push, PR, archivar registros de decisiones, fusionar y limpiar. Maneja el ciclo de vida completo desde confirmar cambios finales hasta la limpieza posterior a la fusión, incluyendo la conversión de especificaciones/planes en registros de decisiones compactos.

¿Qué es ship-it?

Esta habilidad automatiza el ciclo de envío completo para desarrolladores que trabajan con agentes de IA como Claude Code, Cursor o Codex. Gestiona desde la verificación inicial de pruebas y la creación de branches con commits convencionales, hasta la apertura de Pull Requests (PRs), el archivado posterior a la fusión de especificaciones y planes en registros de decisiones compactos optimizados para LLMs, y la limpieza de branches. Es fundamental para proyectos que requieren que cada cambio pase por un branch y un PR (nunca push directo a main), y que despliegan vistas previas por PR. La habilidad se integra con `superpowers:finishing-a-development-branch` para la detección del entorno (repositorio normal, worktree con nombre, HEAD separado) y la determinación del branch base, pero también proporciona un plan de respaldo si esa skill no está disponible. Su filosofía clave es "una suite de pruebas roja nunca se convierte en PR", por lo que ejecuta la suite de pruebas completa antes de cualquier commit, y considera que el envío termina en la vista previa del PR; la promoción a staging y producción es responsabilidad de otra skill (como `cloud-delivery-aks`).

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lguidolin/agent-skills/tree/main/skills/ship-it

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Ship It

Gestiona el ciclo de envío completo: preparar, confirmar, hacer push, abrir un PR, archivar registros de decisiones después de la fusión y limpiar.

Resumen

Cada cambio pasa por un branch y un PR. Nunca hagas push directamente a main. Esta skill maneja el ciclo de cierre completo, incluido el archivado de documentación posterior a la fusión.

Los mensajes de commit son documentación. El título del PR se convierte en el commit de squash-merge en main y aparece en el changelog. Hazlo bien en el momento de crear el PR.

Archiva después de la fusión, nunca antes. Las especificaciones y planes permanecen accesibles hasta que el PR se fusiona. Solo después de la fusión los convertimos en registros de decisiones compactos.

Cuándo usarla

  • El usuario dice "push", "envíalo", "vamos a enviar", "abre un PR", "crea un PR"
  • El usuario dice "fusionado", "está fusionado", "tira y limpia" después de que se haya abierto un PR
  • El usuario ha completado la implementación y quiere finalizar
  • Después de completar un plan donde el siguiente paso es enviar el trabajo

Cuándo NO usarla

  • El usuario quiere explícitamente hacer push directamente a main (confirma primero que esto sea intencional)
  • El repositorio no tiene un remoto configurado
  • Los cambios son trabajo en progreso que el usuario aún no está listo para enviar
  • El usuario solo quiere confirmar cambios sin enviar (usa conventional-commits-and-releases)

Proceso

Fase 0: Verificar y Detectar

Una suite roja nunca se convierte en PR. Ejecuta la suite de pruebas completa del proyecto primero. Si algo falla, informa de los fallos y detente — no confirmes, hagas push ni abras un PR. Esta regla es política del proyecto y no se delega.

La detección del entorno (repositorio normal vs. worktree con nombre vs. HEAD separado) y la determinación del branch base se delegan a superpowers:finishing-a-development-branch, que ya maneja los tres casos.

Comprueba la disponibilidad de la manera correcta: busca finishing-a-development-branch en tu propia lista de skills disponibles. Si aparece listada, se puede invocar. Si no aparece listada, no se puede — continúa con el plan de respaldo.

No investigues el sistema de archivos para encontrarla. ~/.claude/plugins/cache/ contiene todas las versiones que se han descargado, incluidos plugins que están instalados pero deshabilitados, y las skills pueden ser proporcionadas por mecanismos distintos al caché de plugins. Que exista una ruta en el caché no prueba que puedas invocar la skill.

Si está disponible — invócala para la verificación de pruebas, detección del entorno y determinación del branch base, luego detente antes de su menú de opciones.

La decisión de integración ya está tomada por la regla del proyecto y no es decisión del usuario revocarla aquí: este proyecto fusiona solo a través de un PR, porque el PR es lo que produce el despliegue de vista previa y lo que la CI controla. Su opción "fusionar de vuelta a <base> localmente" no está disponible. Su opción "mantener el branch como está" sigue siendo válida — es una decisión de aplazar, no de saltarse el control.

Si falta — recurre al plan de respaldo, sin perder nada que controle la corrección:

  • Ejecuta la suite de pruebas directamente.
  • Trata el upstream del branch, o main, como la base; confírmalo con el usuario antes de continuar.
  • Omite la limpieza de worktree en la Fase 6; borra el branch normalmente.

Fase 1: Preparar y Confirmar Cambios

git status --short
git branch --show-current
git log --oneline @{upstream}..HEAD 2>/dev/null || echo "No upstream set"

Árbol de decisión:

  • En main con cambios sin confirmar → crear branch, confirmar, push, PR
  • En un branch de funcionalidad con cambios sin confirmar → confirmar, push, PR (o actualizar PR existente)
  • En un branch de funcionalidad con commits sin enviar → push, PR (o actualizar PR existente)
  • En un branch de funcionalidad con PR existente → push (el PR ya existe)

Si hay cambios sin staged:

  • Pregunta al usuario si se deben incluir todos los cambios o archivos específicos
  • Si los cambios abarcan varios temas, sugiere dividirlos

Redacta el mensaje de commit:

TipoCuándo
featNueva funcionalidad
fixCorrección de errores
docsSolo documentación
choreConfiguración, dependencias, herramientas
refactorReestructuración de código, sin cambio de comportamiento
testAñadir o modificar pruebas
ciCambios en el flujo de CI/CD

Formato: <tipo>[ámbito opcional]: <descripción en imperativo>

Reglas:

  • Modo imperativo ("añade", no "añadido" ni "añade")
  • Primera palabra en minúsculas después de los dos puntos
  • Sin punto al final
  • Corto (50 caracteres o menos para el asunto)
  • Describe qué hace el commit, no cómo

Presenta el mensaje de commit propuesto al usuario y confirma antes de confirmar.

Fase 2: Branch y Push

Si estás en main, crea un branch:

<tipo>/<descripción-corta>

Ejemplos:

  • feat/login-oauth
  • fix/manejo-respuesta-nula
  • docs/permisos-flujo-release

Push:

git push -u origin $(git branch --show-current)

Fase 3: Abrir PR

Título del PR = mensaje de commit convencional (usado para squash-merge en main).

Estructura del cuerpo del PR:

## Qué cambió

[Descripción específica de adiciones/modificaciones/eliminaciones]

## Por qué

[Motivación — ¿qué problema resuelve esto?]

Crea usando la CLI de gh:

gh pr create --title "<mensaje de commit convencional>" --body "<cuerpo del PR>"

Si gh no está disponible, proporciona la URL del PR desde la salida de git push o constrúyela.

Verifica que el entorno de vista previa se haya levantado. Si el proyecto despliega vistas previas por PR, espera ese flujo de trabajo y confirma que el entorno sea accesible antes de entregar el PR:

gh pr checks --watch

Si la vista previa falla al desplegar, infórmalo y detente. Un PR que nadie puede revisar no está enviado.

Donde termina esta skill. ship-it finaliza su conciencia de despliegue en la vista previa. La promoción a staging y producción no es su trabajo — pertenece a la skill de entrega del proyecto (cloud-delivery-aks, o su equivalente). Las Fases 4-6 a continuación son higiene de git y documentación, no despliegue.

Fase 4: Esperar la Fusión

Después de crear el PR, pregunta: "Avísame cuando esté fusionado y me encargaré de la limpieza y el archivado."

Espera la confirmación del usuario (por ejemplo, "fusionado", "hecho", "está fusionado").

Fase 5: Post-Fusión — Archivar Registros de Decisiones

Las especificaciones y planes son detallados por diseño — buenos para un humano que lee el historial, costosos cada vez que Claude carga uno. Convertirlos en registros de decisiones compactos mantiene las decisiones esenciales baratas de leer mientras la narrativa completa permanece en disco, archivada, sin costar nada hasta que alguien la abre deliberadamente.

Solo después de que el PR se fusiona, verifica si hay especificaciones/planes sin convertir:

ls docs/superpowers/specs/ 2>/dev/null
ls docs/superpowers/decisions/ 2>/dev/null

La skill recording-decisions incluye dos ayudantes para esto. Localízalos — la skill puede estar instalada en el proyecto o globalmente:

for base in .claude/skills ~/.claude/skills; do
  d="$base/recording-decisions/scripts"
  [ -d "$d" ] && echo "$d" && break
done

Si se encuentra, $d/doc-archive.sh lista las especificaciones no convertidas e imprime un prompt de conversión, y $d/index-rebuild.sh regenera el índice. Si no se encuentra, haz el mismo trabajo manualmente usando los pasos a continuación — son autocontenidos.

Si existen especificaciones/planes no convertidos:

  1. Pregunta al usuario: "Encontré especificaciones/planes que pueden corresponder a este trabajo. ¿Quieres que los convierta en registros de decisiones compactos y archive los originales?"

  2. Si sí, para cada especificación:

    • Lee el contenido de la especificación
    • Genera un registro de decisión con frontmatter YAML:
      ---
      title: <extraído de la especificación>
      date: <desde el nombre del archivo de especificación>
      component: <inferido del contenido>
      status: implemented
      supersedes: null
      dependencies: [<inferido>]
      ---
      
    • Escribe ~30-50 líneas capturando: decisiones clave, interfaces, restricciones
    • Guarda en docs/superpowers/decisions/<fecha>-<tema>.md
    • Mueve la especificación original a docs/superpowers/archive/specs/
    • Mueve el plan correspondiente a docs/superpowers/archive/plans/
  3. Reconstruye el índice maestro — regenera docs/superpowers/index.md a partir del frontmatter de cada registro de decisión, agrupado en una tabla de Decisiones Activas (componente, título, fecha, dependencias) y una tabla de Reemplazadas (componente, título, reemplazada por). Ejecuta $d/index-rebuild.sh si lo localizaste arriba; de lo contrario, escribe el archivo directamente.

  4. Confirma los cambios de archivado:

    git add docs/superpowers/
    git commit -m "docs: archivar especificaciones y actualizar índice de decisiones"
    git push
    

Fase 6: Limpieza

git checkout main
git pull
git branch -d <nombre-del-branch>
git push origin --delete <nombre-del-branch> 2>/dev/null || true
git fetch --prune

Verifica el estado limpio:

git branch --show-current
git log --oneline -3

Si el trabajo ocurrió en un git worktree, delega el desmontaje a superpowers:finishing-a-development-branch (su limpieza basada en procedencia — sabe qué worktrees posee y deja intactos los gestionados externamente). Si esa skill no está disponible, elimina el worktree manualmente con git worktree remove <ruta> y confírmalo primero con el usuario.

Principios Clave

  • Una suite roja nunca se convierte en PR — verifica antes que nada (Fase 0)
  • Nunca hagas push a main directamente — siempre branch + PR. El PR es el despliegue de vista previa y el control de CI; una fusión local se salta ambos. Esto anula cualquier flujo de trabajo que ofrezca fusionar localmente como opción.
  • El envío termina en la vista previa — la fusión, el archivado y la limpieza son higiene; la promoción a staging y producción es trabajo de otra skill
  • Commits convencionales — el título del PR es la entrada del changelog
  • Archivar solo después de la fusión — las especificaciones permanecen accesibles durante la revisión
  • Los registros de decisiones son compactos — ~30-50 líneas, indexados en YAML, optimizados para LLMs
  • Limpia completamente — sin branches obsoletos ni referencias de seguimiento

Individual skills in this repo

This repo contains 18 individual skills — each has its own dedicated page.

lguidolin/change-hygiene-and-code-craft

Use when writing or refactoring code, structuring a commit or PR, or deciding whether to abstract duplication. Symptoms — mixing reorg with logic changes, a PR doing several things at once, a file growing large, the second copy of similar code, or unsure whether to DRY something up.

lguidolin/cloud-delivery-aks

Use when deploying to Kubernetes or Azure Kubernetes Service (AKS), configuring cloud secrets, setting up progressive rollout/canary, per-PR ephemeral environments, or k8s health probes. Keywords — Kubernetes, AKS, Key Vault, Argo Rollouts, Flagger, canary, blue-green, liveness, readiness, PodDisruptionBudget, HPA, rollback, GHCR.

lguidolin/commit-history-rewrite

Use when an existing repository has messy commit history that needs to conform to conventional commits before adopting release-please, or when intermediate WIP/fixup/merge commits need to be cleaned up.

lguidolin/conventional-commits-and-releases

Use when committing, writing a commit message, opening a PR that will be squash-merged, or configuring automated versioning/changelogs. Keywords — conventional commits, release-please, semver, feat/fix/chore, breaking change, changelog.

lguidolin/defense-in-depth-security

Use when handling untrusted input, secrets, authentication/authorization, or dependencies — or threat-modeling a new surface. Keywords — STRIDE, threat model, least privilege, secrets management, supply chain, dependency scanning, input validation, audit log, defense in depth.

lguidolin/designing-before-building

Use when starting a feature, fixing a non-trivial bug, or about to write implementation code — before any code exists. Symptoms you need this: "this is simple, I'll just code it", reaching for the editor before a design is approved, or an idea that hasn't been turned into a spec and plan.

lguidolin/engineering-constitution

Use when starting work in a project that follows the engineering constitution, orienting to its rules, or deciding which engineering practice applies to a task — spec writing, commits, testing, security, deploys, database, or UI work.

lguidolin/graphql-contract-testing

Use when writing a GraphQL query/mutation that the UI and a test will share, or building route/schema contract or smoke tests. Symptoms — copying a query into a test, a test asserting on query text, schema change that didn't break the UI build, or RLS/permission drift. Keywords — graphql-codegen, typed document, contract test, route smoke test.

lguidolin/init-repo-CI

Use when setting up a new repository with conventional commits, release-please, and CI automation, or when retrofitting an existing repository that lacks automated versioning and PR validation workflows.

lguidolin/interface-craft-and-accessibility

Use when building or styling UI — components, layouts, forms, design tokens — or making accessibility decisions. Keywords — a11y, WCAG, keyboard navigation, focus state, contrast, design system, minimalist UI, component reuse, ARIA, semantic HTML.

lguidolin/merge-gates-and-automation

Use when setting up or changing CI, pre-push hooks, or a task runner, or deciding what must pass before merge. Symptoms — tempted to put authoritative checks only in a local hook, skip CI, bypass with --no-verify, or unsure what gates a merge vs. runs locally.

lguidolin/observability-and-slos

Use when adding logging, metrics, tracing, health checks, SLOs, or alerting — or when building a service surface that needs to be operable and debuggable. Keywords — structured logs, OpenTelemetry, correlation id, RED metrics, liveness, readiness, SLI, SLO, error budget, alerting.

lguidolin/performance-and-scale

Use when working on hot paths, list endpoints, pagination, data-access in loops, or public interfaces/schemas. Symptoms — unbounded queries, N+1 access, no latency budget, optimizing without measuring, or changing an interface many consumers depend on. Keywords — pagination, N+1, Hyrum's Law, performance budget, bundle size.

lguidolin/postgres-postgraphile-rls-and-sql

Use when writing PostgreSQL, PostGraphile config, Row-Level Security policies, SQL schema files, or working on the Browser→App→PostGraphile→Postgres data path. Keywords — RLS, SECURITY DEFINER, search_path, pgSettings, grants, roles, GraphQL depth limit, query cost, statement_timeout, SQL file organization.

lguidolin/recording-decisions

Use when a design or architecture decision has been made and needs to be captured — writing a decision record or ADR, updating a decision index, noting a deferred idea, or superseding a past decision. Keywords — ADR, decision record, rationale, rejected alternatives, dependency index.

lguidolin/resilience-and-deploy-safety

Use when planning a deploy, designing a rollback, or responding to an incident or writing a postmortem. Keywords — deploy safety, rollback, immutable artifact, progressive delivery, canary, blast radius, incident response, blameless postmortem, error budget.

lguidolin/tests-as-a-control

Use when writing or modifying tests, when a test breaks during a refactor, or when testing permission/role rules. Symptoms — tempted to edit a test to make it pass, testing only the happy path, a deny-test that started passing, flaky tests, or unsure what to assert.

lguidolin/zero-downtime-migrations

Use when changing a database schema where data must survive the change — adding/removing/renaming columns, constraints, indexes, or backfilling. Symptoms — a destructive migration bundled with a code deploy, a NOT NULL column with a backfill, a table-locking UPDATE, or a rename. Keywords — expand/contract, parallel change, backfill, NOT VALID, CREATE INDEX CONCURRENTLY, graphile-migrate.

Skills relacionados