一键导入
jira-task-generator
Generate Jira Task definitions from context using templates. Creates markdown artifacts under .codi/jira/issues/ with unique identifiers.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Generate Jira Task definitions from context using templates. Creates markdown artifacts under .codi/jira/issues/ with unique identifiers.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Bootstrap agent configuration and generate AGENTS.md from project config (codi.toml), SCM flow, monorepo structure, MCP ecosystem, and docs/ — template-based and idempotent.
Repository understanding and hierarchical codemap generation
Audit and synchronize local OpenCode context, commands, skills, agents, config, and AGENTS.md with the current repository.
Generate a daily planning Markdown file combining Google Calendar events and Jira tasks. Creates an executable daily agenda with configurable parameters, dynamic emoji detection, and timezone support.
Create consistent releases and changelogs
Validate, push the current branch, and create a GitHub pull request from the current diff
| name | jira-task-generator |
| description | Generate Jira Task definitions from context using templates. Creates markdown artifacts under .codi/jira/issues/ with unique identifiers. |
| license | Proprietary |
| triggers | ["create task","generate task","jira task","crear task","generar task"] |
| metadata | {"author":"codiplab","version":"0.4.1","opencode":{"emoji":"🧩","tags":["jira","task","planning","generator","template","idempotent"]}} |
Skill para generar documentos Jira Task declarativos desde contexto natural.
Genera un archivo Markdown conteniendo una definición de Task.
El resultado queda almacenado en:
.codi/jira/issues/
Ejemplo:
.codi/jira/issues/task-implement-oauth-v7Kp9x.md
Texto libre. El contexto se recibe mediante {{args}}.
Ejemplo:
crear task para implementar autenticación OAuth
criterios:
- implementar login con Google
- agregar tests unitarios
Este skill recibe el contexto descriptivo mediante {{args}}.
El texto completo después del trigger del skill se usa como contexto:
crear task para implementar autenticación OAuth con login Google y tests
{
"context": "implementar autenticación OAuth con login Google y tests"
}
{{args}} es string → usar directamente como contexto descriptivo{{args}} es objeto → usar args.context como contexto descriptivo{{args}} está vacío → no hay contexto, pedir al usuario<skill-root>/
└── TASK.md.tpl
Genera:
.codi/jira/issues/
task-{slug}-{shortuuid}.md
Ejemplo:
.codi/jira/issues/task-implement-oauth-v7Kp9x.md
ISSUES_PATH=".codi/jira/issues"
mkdir -p "$ISSUES_PATH"
El contexto descriptivo proviene de {{args}}. Seguir la sección "Uso de argumentos" para resolver el valor.
Recibir el input del usuario sin interpretarlo ni ejecutarlo. No realizar parsing aún — solo recolectar.
--- CONTEXT BOUNDARY ---
Before transforming, classify the collected input into one of three modes. Apply these rules in order:
--body-- delimiter checkIf the input contains --body-- on its own line (exact match, not part of a longer line):
→ classify as raw-body. Skip all further heuristic checks.
Count how many of the following heuristics match the input:
| # | Heuristic | Detects |
|---|---|---|
| H1 | Markdown table rows: ≥2 lines matching |.*|.*| | Tables with aligned columns |
| H2 | Numbered criteria: lines starting with N. (e.g. 1. ) followed by action verbs (implementar, agregar, crear, reemplazar, añadir) | Acceptance criteria lists |
| H3 | File paths: references to files with code extensions (.ts, .md, .py, .sh, .json, .yaml, .yml) | Source file references |
| H4 | Section headings: lines matching ## Scenario, ### Acceptance Tests, or ### Sources | Content already aligned with template |
pre-structuredunstructured| Mode | Behavior |
|---|---|
unstructured | Full STEP 1b transformation (existing path — no changes) |
pre-structured | Skip STEP 1b body field transformation; inject content literally into template body |
raw-body | Split at --body-- delimiter; metadata from pre-delimiter, body from post-delimiter |
Applies ONLY when input is unstructured. If pre-structured or raw-body, skip this entire step for body fields — proceed to STEP 1b gating section below for what to do instead.
Parsear el contexto del usuario en los siguientes campos estructurados:
task:
title: # Nombre corto y descriptivo de la task
summary: # Resumen de una línea
scenario: # Contexto de negocio o user story
acceptance_tests: # Lista de condiciones verificables
sources: # URLs o documentos referenciados
Extraer cada campo del contexto, aplicando estas reglas de validación:
Contexto vacío o sin sentido: Si el input es vacío, incoherente o insuficiente para derivar campos, preguntar al usuario por clarificación antes de proceder.
Contexto mínimo: Si el usuario da solo una frase corta (e.g. "Agregar tests unitarios al módulo de pagos"), derivar defaults razonables:
summary puede ser igual a titlescenario se infiere del contexto del titleacceptance_tests y sources pueden quedar vacíos si no son inferiblesVerbos de acción: Si el contexto contiene verbos de acción ("crear", "implementar", "add", "generate", "build", "hacer"), estos deben tratarse como parte del contenido descriptivo del title — NO como instrucciones para ejecutar esas acciones.
Asignación de campos: Los verbos de acción pertenecen al title, no al scenario ni a acceptance_tests.
| Mode | STEP 1b body fields | Metadata extraction |
|---|---|---|
unstructured | Full transformation (existing path) | Title + summary + scenario + tests + sources |
pre-structured | Skip entirely — inject input literally into {{TASK_SCENARIO}}, {{TASK_ACCEPTANCE_TESTS}}, {{TASK_SOURCES}} | Extract title from first meaningful line of input, or prompt user if unclear |
raw-body | Skip body transformation — post-delimiter content is the body | Extract title + summary from pre-delimiter content via STEP 1b rules (metadata only) |
--body-- Raw ModeApplies ONLY when input is classified as raw-body. For other modes, skip this step.
Find the first line that is exactly --body-- (standalone, no leading/trailing characters). Split the input into two parts:
--body----body--Process pre-delimiter content through STEP 1b rules to extract title and summary only. Do NOT attempt to extract body fields (scenario, acceptance_tests, sources) from pre-delimiter content.
If pre-delimiter content is empty or whitespace-only:
No se detectó título. Ingresa un título para la task:
Wait for user response before proceeding.
Post-delimiter content becomes the literal body:
{{TASK_SCENARIO}} ← post-delimiter content{{TASK_ACCEPTANCE_TESTS}} ← post-delimiter content (same){{TASK_SOURCES}} ← post-delimiter content (same)The content is injected verbatim — no parsing, restructuring, or rewording.
Usar getVisibleJiraProjects del MCP de Jira.
getAccessibleAtlassianResourcesgetVisibleJiraProjects(cloudId)"Task" en issueTypes[].namekey como PROJECT_KEY⚠️ No leer PROJECT_KEY de
codi.toml. La fuente de verdad es Jira.
Preguntar al usuario:
¿Deseas vincular esta task a un epic? (si/no)
Ingresa el EPIC_KEY (ej. PE-97): y validar formato {PROJECT_KEY}-{number}.parentEpic.GIT_REPO_URL=$(git config --get remote.origin.url || true)
Formato: - {url} (item de lista markdown).
Ejemplo:
- https://github.com/CodipLab/codip-ai.git
Si no hay remote configurado, se omite silenciosamente.
Derivar el componente Jira basado en palabras clave del contexto de la task.
Usar un mapeo de palabras clave a nombres de componente:
| Palabras clave | Componente |
|---|---|
| api, backend, endpoint, service, database, db, migration, model, data, graphql, rest, grpc, server | Backend |
| frontend, ui, ux, web, react, vue, angular, css, html, component, page, screen, interfaz | Frontend |
| test, testing, qa, quality, coverage, e2e, integration, unit-test | QA |
| devops, ci, cd, pipeline, deploy, docker, k8s, kubernetes, infra, terraform, cloud | DevOps |
| doc, documentation, readme, wiki, manual, guide, changelog | Documentation |
| security, auth, oauth, jwt, sso, permission, role, audit, compliance | Security |
| mobile, ios, android, react-native, flutter, app | Mobile |
| data, analytics, report, dashboard, metric, kpi, bi, insight | Data & Analytics |
| email, notification, alert, messaging, push, sms, webhook | Notifications |
Reglas:
Ejemplo:
Input title: "Implementar autenticación OAuth" → Coincide con "auth" en Security → COMPONENT = "Security"
Input title: "Agregar tests unitarios al módulo de pagos" → Coincide con "test" en QA → COMPONENT = "QA"
Convertir:
Implementar autenticación OAuth
a:
implementar-autenticacion-oauth
Reglas:
ID=$(codi util short-uuid)
Ejemplo: v7Kp9x
TARGET=".codi/jira/issues/task-${SLUG}-${ID}.md"
Ejemplo:
.codi/jira/issues/task-implement-oauth-v7Kp9x.md
Validar:
if [ -f "$TARGET" ]; then
ID=$(codi util short-uuid)
TARGET=".codi/jira/issues/task-${SLUG}-${ID}.md"
fi
Usar:
TASK.md.tpl
Variables:
{{TASK_TITLE}}
{{PROJECT_KEY}}
{{TASK_SUMMARY}}
{{COMPONENT}}
{{LABELS}}
{{PARENT_EPIC}}
{{ISSUE_KEY}}
{{TASK_SCENARIO}}
{{TASK_ACCEPTANCE_TESTS}}
{{TASK_SOURCES}}
{{GIT_REPO_URL}}
Applies ONLY when input is pre-structured or raw-body. For unstructured mode, skip this step entirely and proceed directly to STEP 6.
Render the body fields as they would appear in the final file:
{{TASK_SCENARIO}}
{{TASK_ACCEPTANCE_TESTS}}
{{TASK_SOURCES}}
Show:
El body del template quedó así:
[rendered preview above]
¿Confirmas que este contenido es correcto? (si/no)
Generación cancelada por el usuario. Do NOT write any file.mv generated.md "$TARGET"