Planos · agentic-dev-boilerplate
00 · administración de Jira

Dos operaciones de admin que no se deshacen con un undo.

/jira-administration cubre dos trabajos de administración del proyecto de Jira: reconciliar sus Components con los módulos reales de la app, o repuntar el repo a otra instancia de Atlassian después de una migración de sitio. Los dos escriben fuera del repo (en Jira, o en la sesión de acli de toda la máquina), así que los dos pasan por la misma secuencia: leer primero, mostrar el plan y esperar tu aprobación antes de tocar nada.

para quien mantiene el repo un modo por corrida, nunca los dos nada se escribe sin tu sí explícito
Modo

Uno solo

components o instance-migration. Si no está claro, pregunta.

→
Leer

El estado vivo

Los Components actuales, o las dos instancias y todo lo que nombra la vieja.

→
Proponer

Plan o auditoría

Una tabla que ves completa: qué cambia, qué no, y qué está en juego.

→
Aplicar

Recién con tu sí

Escribe, y después verifica leyendo el destino, no el código de salida.

01 · cuándo usarla

Administrar el proyecto, no operar tickets

Es una skill de uso raro y consecuencias grandes. El día a día con Jira (crear, transicionar, comentar) pasa por otra puerta.

Úsala cuando

El proyecto o la instancia cambian de forma

  • "Sincroniza los Components de Jira" · "jira-components": el módulo de Components del proyecto quedó desalineado con lo que la app realmente tiene.
  • "Cambió la URL de Jira" · "repoint jira" · "jira-instance-migration": la empresa movió el sitio de Atlassian y el repo sigue apuntando al viejo.
No la uses para

Lo que pertenece a otra herramienta

  • Poner un component en un ticket u otra operación sobre issues: eso es /acli.
  • Refrescar los catálogos sin cambio de instancia: se corren los bun run jira:sync-* directamente.
  • Configurar Jira por primera vez: está en docs/setup/README.md, sección "Jira (lado dev)".
02 · el mapa

Dos carriles que nunca se cruzan

Cada corrida elige exactamente un modo y carga solo su referencia. Nunca combina los dos ni cae de uno en el otro. Un "arregla Jira" a secas no alcanza para elegir: la IA te pregunta.

Modo Frases que lo disparan Lee
components "jira-components" · reconcile / sync Jira Components references/components.md
instance-migration "jira-instance-migration" · changed / repoint Jira instance references/instance-migration.md

los viejos nombres de comando (jira-components, jira-instance-migration) sobreviven solo como frases disparadoras

03 · el contrato sellado

Las reglas que valen en cualquiera de los dos modos

Viven en el bloque ## Compact Rules de la skill, que es lo que viaja a los subagentes a través de .agents/skills/REGISTRY.md.

Lee antes de cada mutación. El plan se escribe después de mirar el estado vivo, nunca de memoria.
Aprobación dentro de la misma corrida. Nada se crea, aplica, borra ni repunta sin tu sí explícito. Silencio o ambigüedad significan parar y preguntar.
Credenciales faltantes = parada dura. Nombra la variable exacta, te manda a .env / .env.example y pide reiniciar la sesión del agente. Sin atajos ni corrida parcial.
Carga /acli antes de cualquier operación de Jira, en los dos modos. Otras skills dueñas de herramientas, solo si la referencia elegida las pide.
Verifica solo con los pasos de su modo. Nunca corre la verificación del otro.
Reenvía el resto de los argumentos tal cual: todo lo que viene después de la palabra del modo llega intacto a la referencia.
04 · modo components

Un component es un módulo de la app que corre

No una épica. Una épica es una unidad de trabajo; un component es una unidad del sistema en marcha, más fina a propósito, porque un filtro sirve tanto como discrimina. Es un campo nativo de Jira (se setea directo, nunca a través de {{jira.*}}) y es el eje de agrupación de filtros JQL, métricas y dashboards.

Fase 1 · derivar el mapa de módulos

Dos entradas. Lo que existe: el árbol de rutas de la app (app/**/page.tsx y app/api/**/route.ts en Next.js App Router), agrupado con el vocabulario del producto. Lo que viene: épicas e historias del backlog que todavía no tienen ruta.

Un component se puede declarar antes que el código: una feature en refinamiento ya tiene historias que necesitan dónde colgarse. La IA propone, no decide.

Fase 2 · leer los Components vivos

Lista cada component con su cantidad de issues. Ese número es el punto: borrar y recrear uno con nombre nuevo dejaría huérfanos a todos sus issues.

Cada módulo propuesto queda clasificado: ya existe (skip), existe con otro nombre (rename) o falta (create).

Fase 3 · plan y aprobación

Escribe el plan en .context/reports/jira-components-plan.json, te lo muestra como tabla (renames aparte, cada uno con su cantidad de issues) y corre el dry run. Si quieres cambiar nombres o agrupación, regenera y vuelve a mostrar.

Fase 4 · aplicar y verificar

Solo después de tu sí: --apply, y enseguida otro --list. La lista viva tiene que coincidir con el plan aprobado.

# fase 2 · estado actual, con cantidad de issues
bun scripts/sync-jira-components.ts --list --project {{PROJECT_KEY}}

# fase 3 · dry run (es el default: no escribe nada)
bun scripts/sync-jira-components.ts .context/reports/jira-components-plan.json

# fase 4 · solo con aprobación explícita
bun scripts/sync-jira-components.ts .context/reports/jira-components-plan.json --apply
bun scripts/sync-jira-components.ts --list --project {{PROJECT_KEY}}
La IA hace

Lee el código y el backlog, agrupa rutas en módulos y arma el plan.

Avisa si el vocabulario del producto choca con nombres genéricos (Tests, Runs, Bugs) y propone prefijar cada component con el nombre del producto.

Tú decides

La agrupación y los nombres de cada módulo.

Si se aplica el prefijo: nunca va en silencio, es parte del plan.

El sí que habilita el --apply.

Sale

El plan en .context/reports/.

El módulo de Components del proyecto reconciliado, y un reporte de lo renombrado, creado y salteado.

Gate la lista viva de Components coincide con el plan aprobado.
Rename no es createUn rename conserva todas las asignaciones existentes. Así migra un component a una convención nueva sin editar issues en masa.
Re-correr es normalUn rename cuyo origen ya no está, o cuyo destino ya existe, se degrada a un skip documentado. Un plan aplicado a medias se puede volver a correr.
Por qué un script RESTacli no puede crear, renombrar ni borrar Components. Es un límite documentado de la herramienta, no un atajo.
05 · modo instance-migration

Por qué no es un buscar y reemplazar

Una migración de sitio reasigna los IDs de los campos personalizados. El ID viejo suele seguir existiendo en la instancia nueva, apuntando a otro campo. La falla no es un 404: es un 200 OK que escribe tus datos en el campo equivocado, en silencio.

Mitad fácil

Repuntar el host

  • Una línea en .agents/project.yaml.
  • Re-login de acli. Las credenciales REST y la sesión de acli son independientes: si cambias una sola, REST le pega a la instancia nueva y acli sigue leyendo la vieja, sin error.
Mitad que evita corrupción

Regenerar los catálogos

  • Los catálogos de .agents/ describen una instancia que ya no existe. Ver catálogos.

Fase 0 · resolver las dos instancias

Origen: lo detecta leyendo .agents/project.yaml, la sesión de acli y lo que resuelve bun run jira:url. Si no coinciden, el repo ya está a medio migrar: lo trata como una reparación y te pregunta cuál es el "antes" real. Destino: nunca lo adivina, te lo pide.

Confirma los dos hosts en una línea, y antes de seguir comprueba que el destino responde 200 en /rest/api/3/myself. Migrar a una instancia vacía publica catálogos vacíos.

Fase 1 · auditar antes de editar

Barre el repo buscando el host viejo y clasifica cada hallazgo en "cambia" o "no cambia". Te muestra la tabla antes de tocar nada. Lo que no encaja en ninguna lista (un workflow de CI, un README, .mcp.json) lo pregunta.

Fase 2 · aplicar

Primero atlassian_url en .agents/project.yaml, que es lo que todo lo demás lee. Después borra cualquier ATLASSIAN_URL suelto. Al final, el re-login de acli con el host leído de vuelta del yaml.

Fase 3 · verificar

Cinco chequeos en una tabla: el yaml, lo que resuelve jira:url y la sesión de acli nombran el destino; la sonda de presencia [ -n "${ATLASSIAN_URL+x}" ] dice unset; la llamada REST devuelve 200. Cualquier cosa menos que eso es una migración fallida.

Cambia No cambia
.agents/project.yaml → atlassian_url: el único lugar donde se escribe el host Un dominio alias de la organización: suele redirigir a la instancia activa. Pero no se ve desde el repo, así que lo confirmas a mano
Un ATLASSIAN_URL viejo en .env o en el proceso: se borra, no se actualiza Registros históricos: reportes de sprint, retros, changelogs. Reescribirlos falsea el pasado
La sesión de acli: re-login por máquina Código que ya matchea con una regex general, y el caché regenerable de .context/PBI/
La sesión de acli es de toda la máquina. Vive en ~/.config/acli, no en el repo: el re-login repunta cada proyecto del equipo, no solo este. Si todavía necesitas la instancia vieja para otro repo, la IA para y te avisa; vas a alternar con la operación de cambio de sesión de /acli.
06 · fases 4 y 5

Regenerar los catálogos y probar que los IDs se movieron

Las variables de los agentes nunca guardan IDs de Jira: resuelven slugs contra tres catálogos propios de cada workspace. Es la parte que la gente saltea, y la que corrompe datos.

Catálogo Se regenera con Guarda Ojo
.agents/jira-fields.json bun run jira:sync-fields --force IDs de campos personalizados y sus opciones sin --force frena: el catálogo ya está poblado
.agents/jira-workflows.json bun run jira:sync-workflows estados y transiciones por tipo de trabajo idempotente; --force no suma nada
.agents/jira-link-types.json bun run jira:sync-link-types tipos de vínculo entre issues no tiene --force, y lo traga sin avisar

Antes: el manifiesto pone el techo

.agents/jira-required.yaml no guarda IDs, pero es la entrada de la regeneración: jira:sync-workflows cataloga solo los tipos de trabajo que declara. Un manifiesto viejo produce un catálogo amputado que sale con código 0.

Se compara contra el de upstream y, si hay diferencia, la IA para y te deja elegir tipo por tipo: el archivo es co-propiedad del upstream y del proyecto.

Después: un ID cambiado no es un ID correcto

Un diff sin cambios de ID significa que el sync no llegó a la instancia nueva. Pero dos slugs pueden intercambiar IDs y sobrevivir a ese chequeo. Por eso pregunta a la instancia viva qué es cada ID catalogado y lo compara con el nombre registrado.

Revisa también campos que quedaron con opciones vacías, IDs literales fuera de los catálogos y cualquier variable que fije un ID por encima del catálogo.

Commit: responsabilidades separadas

Un commit para el repunte de atlassian_url, otro para los tres catálogos. Si el manifiesto cambió, va antes, en un tercero. Todo a través de /git-flow-master, y sin push sin tu confirmación.

--upex casi nuncaBaja un catálogo de referencia generado contra el workspace de los autores del boilerplate. Si migras tu propia instancia, sus IDs no son los tuyos. Solo sirve como andamio sin permiso de Administer, y queda marcado como dato incorrecto.
Sin backup del .env en el repoUn .env.bak queda sin ignorar, con un token vivo adentro, a un git add de distancia. La edición es de una línea y se revierte sola.
Nunca abrir el .env, ni filtrado por claveNi cat, ni grep, ni cut: las variables se usan por nombre dentro de bunx varlock run, y si hace falta saber si existen, se corre bunx varlock load --agent, que las redacta. Si un token llega a imprimirse, la IA lo dice y recomienda rotarlo.
Tres cosas quedan para un humano en el reporte de cierre: confirmar que el dominio alias ya resuelve al destino, saber que un manifiesto que se atrasó se va a volver a atrasar (el updater no lo vigila), y avisar al equipo que cada uno rehaga el login de acli en su máquina.
07 · el ancla del host

El host vive en un solo lugar

.agents/project.yaml → issue_tracker.atlassian_url, y en ningún otro lado del repo. Una segunda copia es lo que se pone viejo: tras una migración, un host suelto en el entorno apunta los scripts al sitio anterior y reporta éxito.

Cómo se lee

Siempre a través del resolver

  • Desde código: cli/lib/atlassian-instance.ts, nunca process.env.ATLASSIAN_URL.
  • Desde la terminal: bun run --silent jira:url (URL base) o --slug (el host pelado que pide acli --site).
  • Si una variable de entorno vieja discrepa, gana el yaml y el resolver avisa con los dos valores.
Contaminación

Un ATLASSIAN_URL suelto se borra

  • No es una variable local de este repo: un hit en .env o en el proceso es un resto de antes de la separación.
  • Un valor heredado del proceso sobrevive a cada reinicio. bun run vars:env:check y bun run setup:doctor lo reportan.
  • Actualizarlo en vez de borrarlo recrea la copia que se va a poner vieja en la próxima migración.
Repo plantilla, valores en null. Si project.project_name es null, el repo es una plantilla sin onboarding: atlassian_url y project_key se quedan en null, el reporte lo dice, y no se fabrica un commit vacío para disimularlo.
08 · qué le dices a la IA

Invocarla en las tres terminales

La primera palabra después del nombre de la skill elige el modo, y el resto viaja tal cual a la referencia: la clave del proyecto y la ruta de la app, o las dos instancias.

Claude Code

/jira-administration components

Barra de la skill más el modo. Sin modo, la IA lo saca de la frase o pregunta.

OpenCode

carga la skill jira-administration, modo instance-migration

Sin barra: nombras la skill y el modo en la frase.

Codex

carga la skill jira-administration, modo components

Mismo patrón que OpenCode, CLI o Desktop.

# components: clave y fuente explícitas, o vacío para que la fase 1 las resuelva
/jira-administration components BK ../bunkai

# instance-migration: origen y destino, en ese orden, o vacío para que la fase 0 detecte y pregunte
/jira-administration instance-migration oldsite.atlassian.net newsite.atlassian.net
09 · alrededor de esta skill

Con quién trabaja

Al entrar resuelve sus categorías complementarias (issue-tracker, meta-skill) desde .agents/skills/REGISTRY.md.

Siempre · los dos modos

/acli

Dueña de cada lectura de Jira, del estado de autenticación y del cambio de sitio. Se carga antes de cualquier operación. También es la puerta para el trabajo diario con tickets.

Después · migración, fase 5

/git-flow-master

Dueña del contrato de commit, branch y push con el que se publican el repunte y los catálogos. Nunca empuja sin confirmación.

Al lado · el caché de Jira

.context/PBI/

El espejo local del backlog, y por qué un host viejo lo corrompe reportando éxito. Deck: PBI como caché de Jira.

Para leer más: .agents/skills/jira-administration/SKILL.md y sus dos referencias en references/, una por modo. El ancla del host está en .agents/instructions/agent-project-variables.md §7.