/git-flow-master es la única puerta para todo lo que pasa en git: ramas, commits, pushes, pull requests, conflictos y cadenas de PRs. No asume un modelo de ramas: lee el que el proyecto eligió, comprueba lo que el host impone de verdad y adapta cada comando a eso.
Rama, árbol, upstream, remotos. Siempre, antes de todo.
git:policy verify en el primer push, PR o merge.
El bloque git_strategy, o detección, o pregunta.
Rama, commit, push, PR, conflicto o Strategy Setup.
Más de 400 líneas: árbol de decisión de PRs encadenados.
Se dispara aunque no la nombres: si el pedido tiene forma de rama, commit, push o PR, es esta skill. Las demás skills del repo le pasan la posta cuando llegan a esa capa.
El pedido elige la operación; la estrategia decide cómo corre. Los dos primeros pasos son los mismos para cualquier operación.
La estrategia se guarda en el bloque git_strategy de .agents/project.yaml y se lee en cada invocación. Nunca se infiere de un ejemplo de la skill ni de otro proyecto.
| Estrategia | Forma | Rama de trabajo sale de | El PR apunta a |
|---|---|---|---|
| solo-main | Una sola rama larga, main. Todo aterriza directo. | main | main, cuando hay PR |
| main-integration | main + una rama de integración (staging o similar). | integración | integración |
| enterprise | Integración + muchas feature/*, release/*, hotfix/*. | integración (hotfix: main) | integración (hotfix: main) |
| trunk-based | Solo el trunk; ramas de menos de un día, detrás de feature flags. | main | main |
| gitflow | main + develop + release y hotfix. | develop (hotfix: main) | develop; release y hotfix: main |
| github-flow | main siempre desplegable; rama, PR, merge, deploy. | main | main |
| gitlab-flow | GitHub Flow + ramas de entorno (pre-production, production). | main, que es su integración | main; la promoción va por entorno |
Primero el bloque: si git_strategy.strategy tiene valor, esa es la decisión. Si no, mira las ramas (solo main, main + una de integración, muchas feature/*) y las pistas del repo (.gitlab-ci.yml, ramas release/*). Si nada alcanza, te muestra el catálogo y eliges tú. Nunca elige en silencio.
El boilerplate entrega el bloque lleno con solo-main. Lo que separa "este proyecto eligió solo-main" de "nadie eligió" es meta.strategy_source: inherited o chosen. Solo Strategy Setup estampa chosen.
Si el bloque falta en un repo nuevo, si el proyecto aún no se configuró (project.project_name vacío), o si el proyecto ya tiene nombre pero la estrategia sigue inherited, la skill ofrece Strategy Setup una vez por sesión y te dice qué cuesta el default: sin rama de integración, sin camino de promoción, sin compuerta de review propia. Un "no" sigue con la estrategia que hay, sin escribir nada.
Es la única operación que crea ramas largas y escribe el bloque git_strategy. Las demás operaciones se adaptan a lo que esta deja.
| Pregunta | Aplica a | Opciones (default primero) | Se guarda en |
|---|---|---|---|
| Q1 · promoción integración → producción | estrategias con rama de integración | fast-forward only · merge commit · squash | decisions.promote_method |
| Q2 · merge de la rama de trabajo | estrategias de varias ramas | merge commit · squash · rebase + merge | decisions.feature_merge |
| Q3 · hotfixes | producción distinta de donde se trabaja | salir de producción + back-merge el mismo día · siempre por integración · sin política | decisions.hotfix_policy |
| Q4 · ramas protegidas | todas las estrategias | push directo, bypass de admin, reviews mínimas | policy.* |
Resuelve la estrategia, salta las preguntas que no aplican o que ya tienen respuesta, propone cada rama a crear y sincroniza solo por fast-forward.
La estrategia, cada respuesta del cuestionario, cada rama propuesta y el push de sincronización a una rama protegida.
El bloque git_strategy escrito en su lugar dentro de .agents/project.yaml, con strategy_source: chosen y policy_source: declared.
Antes de pushear a una rama protegida, la skill resuelve git_strategy.policy.direct_push_to_protected (AGENTS.md, Critical Rule #4). La respuesta nunca está escrita en la regla: está en el valor.
| Valor | Qué hace la IA |
|---|---|
| allowed | Pushea sin preguntar. El valor guardado es la autorización permanente; preguntar igual convertiría allowed en confirm. |
| confirm | Pregunta antes de cada push y espera un sí explícito. |
| forbidden | No pushea a la rama protegida: abre una rama de trabajo, la pushea y manda el cambio por PR. |
| bloque ausente o null | Se comporta como confirm: lo seguro es preguntar. |
El bloque policy registra lo que el equipo decidió. GitHub registra lo que se impone. Se desalinean, y la sorpresa llega en el peor momento: un merge rechazado a mitad de camino. Por eso la reconciliación es un script, no un procedimiento.
| Comando | Lee el host | Escribe | Para qué |
|---|---|---|---|
| bun run git:policy plan | no | nada | Ver qué ruleset deriva del bloque. |
| bun run git:policy verify | sí | nada | Al primer push, PR o merge de la sesión. Sale con 1 ante un desvío no aceptado. |
| … verify --stamp | sí | meta.policy_verified y policy_source | Registrar la reconciliación cuando está limpia. |
| bun run git:policy apply | sí | nada (dry run) | Mostrar el payload exacto antes de proponer la escritura. |
| … apply --yes | sí | el ruleset del host | Escribir, con tu elección. Nunca para tapar un desvío que no leíste. |
La IA propone el nombre de la rama y el bloque de commits completo, y espera tu OK antes de ejecutar. Puedes aceptar, cambiar o rechazar cada uno.
La base sale de la estrategia, el cuerpo se arma en el momento, y el merge queda como tu próximo paso explícito.
La base es la que fija la estrategia (tabla de la sección 03). Si la cambias con --base, la IA te lo marca contra el default. El título sigue el formato del commit, con menos de 70 caracteres.
Summary, Changes, Test Plan, Traceability (issue, rama, base, estrategia, worktree y sesión), Evidence y Risk. Lo que la skill no puede completar queda visible para que lo edites: no se borra en silencio. Te muestra cuerpo y base antes de enviarlos con gh pr create --body-file.
Te los pregunta. No inventa etiquetas que el repo quizás no tiene: si duda, las confirma con gh label list.
Con la política verificada dice "el host exige N aprobaciones en la base". Con la política solo declarada dice "declarado require_pr_reviews: N, no verificado contra el host".
Un arreglo equivocado aquí cuesta horas. La IA mira git status, git diff --check y los archivos de estado de .git/ para saber qué pasó antes de proponer nada.
Conflictos de contenido, de renombre o borrado, y de rebase o cherry-pick.
Ramas divergidas, push rechazado, detached HEAD, historias sin relación.
Conflicto al aplicar un stash, o un pre-commit que rechazó el commit.
git merge --abort, git rebase --abort: abortar siempre le gana a adivinar.
Arriba de ese presupuesto de review la detección de defectos cae fuerte. Antes de abrir PRs, la skill recorre un árbol de tres preguntas y se detiene en la primera hoja.
| Pregunta | Si es sí | Si es no |
|---|---|---|
| Q1 · es mayormente mecánico? (renombre, formateo, código generado) | size-exception: un PR, con tu override y una línea Why size-exception: | sigue a Q2 |
| Q2 · se parte en 2 a 4 tajadas independientes, cada una segura sola en la base? | stacked-to-main: PRs chicos sobre la base | sigue a Q3 |
| Q3 · hay andamiaje compartido que un merge parcial rompería? | feature-branch-chain: una rama de integración, PRs hijos, un PR final | volver a descomponer la historia: es un olor de planificación |
Un worktree es un segundo directorio de trabajo sobre el mismo .git, con su propia rama y su propio índice. Sirve para dos sesiones de IA en paralelo, un hotfix con una feature abierta, o trabajo riesgoso que no quieres mezclar.
git worktree add ../dir -b feat/x main funciona en cualquier host. La herramienta propia de un harness (en Claude Code EnterWorktree, o un worktree administrado por Codex) es un camino del harness, nunca el canon del repo, y necesita los mismos dos pasos alrededor. OpenCode no tiene equivalente: usa git.
Un worktree nuevo trae solo los archivos versionados. worktree:provision copia los insumos ignorados que no se pueden reconstruir (.env, .vercel/, settings locales), instala dependencias y crea el alias .claude/skills. La lista vive en código: PROVISION_COPIES en cli/lib/worktree.ts.
El estado durable (planes, progreso, locks, reportes) vive en <<PRIMARY_ROOT>>, el checkout principal, y se cita por ruta absoluta desde el worktree. Una copia diverge en silencio y muere con el worktree.
worktree:audit es de solo lectura y sale con 1 mientras haya estado que vive solo en el worktree; --rescue lo copia al principal sin pisar nada. Con Orca, el orca.yaml versionado corre los dos pasos como hooks de setup y archive, pero el CLI salta el hook de archive salvo con --run-hooks; sin hooks, se corre bun run worktree:audit <wt> --rescue a mano.
La lista completa vive en SKILL.md (Compact Rules, Critical rules y antipatrones). Estos son los que más se notan desde afuera.
El deck no repite valores: cada uno se lee en su dueño, que es lo que la skill también hace.
| Archivo o comando | Qué resuelve |
|---|---|
| .agents/project.yaml → git_strategy | Estrategia, ramas, protegidas, decisiones, política, divergencias aceptadas y la procedencia en meta. |
| package.json | Los scripts git:policy, worktree:provision y worktree:audit. |
| .husky/commit-msg | El aviso de trailers, vía scripts/check-commit-trailers.ts. |
| cli/lib/worktree.ts · orca.yaml | Qué copia el provisionado y los hooks de setup y archive en Orca. |
| .agents/README.md · "Checkout roots" | Qué es <<REPO_ROOT>> y qué es <<PRIMARY_ROOT>>. |
| .agents/instructions/agent-project.md · "Git Strategy" | Solo un puntero al bloque, más el contexto en prosa de una divergencia aceptada. |
| .agents/skills/REGISTRY.md | Las Compact Rules de la skill que viajan en el briefing de un subagente. |
La skill no tiene modos con nombre: la operación sale de tu frase, en español o en inglés. Muchas veces ni hace falta nombrarla.
La barra carga la skill; el resto de la frase elige la operación.
Sin barra: nombras la skill en la frase.
Mismo patrón que OpenCode, en CLI o Desktop.
| Si dices algo como… | Corre |
|---|---|
| "start work on PROJ-123" · "crear branch" | Branch |
| "commit this" · "commitear esto" · "commit and push" | Commit, y Push si lo pediste |
| "create PR" · "abrir PR" | Pull request |
| "fix conflict" · "push rejected" · "resolver conflicto" | Conflict |
| "split this PR" · "PR demasiado grande" | Árbol de PRs encadenados |
| "set up our git strategy" · "configura el flujo de git" | Strategy Setup |
Implementa y revisa; le pide a esta skill el PR, la cadena con su traza y la política de push. Ver el deck.
Rojo, verde, refactor; los tests van en el mismo commit que el comportamiento. Ver el deck.
Si el pedido es sobre historias y no sobre git, va ahí. Ver el deck.
Las operaciones de Jira que dispara un commit o un PR.
Un conductor que lanza workers supervisados, cada uno en su worktree; Orca crea, provisiona y audita.