skills/create-ticket/SKILL.md
Create a ticket in YouTrack or GitHub based on project config. Use when the user asks to create a ticket, new issue, or add a task, or provides a structured spec. Can invoke product-analyst agent to structure raw ideas before submission. Do NOT use for unstructured need expression (use express-need skill instead).
npx skillsauth add nicolas-codemate/claudecodeconfig create-ticketInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill creates a new ticket/issue in the project's configured tracking system (YouTrack or GitHub). It detects whether the user provides a raw idea or a structured spec, and adapts accordingly.
Before anything else, determine what the user gave us:
| Input | Detection | Action |
|-------|-----------|--------|
| Raw idea (free text, no structure) | No headings, no FR/AC, informal language | → Step 0b: Product Analysis |
| Structured spec (from /express-need) | Has ## Functional Requirements, ## Acceptance Criteria | → Step 1: Detect Source |
| Requirements file path | Argument ends in .md, file exists | → Step 1: Detect Source (read file) |
| Just --type + short title | Short text + flag, clearly just a title | → Step 1: Detect Source (wizard for description) |
The user gave a raw idea. Propose to structure it via the product-analyst agent:
AskUserQuestion:
questions:
- question: "Je détecte un besoin brut. Voulez-vous le structurer avant de créer le ticket ?"
header: "Analyse produit"
multiSelect: false
options:
- label: "Oui, analyser avec l'agent produit"
description: "Scout + interview + synthèse via product-analyst (détecte les concerns architecturales)"
- label: "Non, créer directement"
description: "Utiliser le texte tel quel comme description"
If "Non": Use the raw text as-is as the description. Continue to Step 1.
If "Oui": run the scout/interview/synthesis flow below, then use the final document as the ticket description and continue to Step 1.
Launch the product-analyst agent in scout mode:
Agent:
subagent_type: product-analyst
model: sonnet
description: "Scout raw idea: {short summary}"
prompt: |
SCOUT PHASE — no answers provided yet.
Raw need: {raw text}
Your job in this invocation:
1. Lightweight codebase scan
2. Detect cross-cutting concerns triggered by the need
3. For each concern, check the framework via Context7 for native solutions
4. Produce EITHER a `## Clarification Needed` block (1-5 targeted questions)
OR the full synthesis document if no concerns detected.
Discipline: only ask questions that would change an architectural decision.
Store output as scout_output.
scout_output contains ## Clarification Needed: proceed to Step 0b.2 (INTERVIEW)scout_output contains ## Functional Requirements: skip to Step 0b.4, set structured_document = scout_outputParse the ## Clarification Needed section. For each question (Q1, Q2, ...), present it via AskUserQuestion using the scout-provided header, context, question text, and options. Always append an "Autre (préciser)" option for free-form answers.
Collect answers into a scout_answers block:
## Scout Answers
- Q1 ({question title}): {answer}
- Q2 ({question title}): {answer}
Relaunch product-analyst in synthesis mode with the raw need AND the scout answers:
Agent:
subagent_type: product-analyst
model: sonnet
description: "Synthesize raw idea: {short summary}"
prompt: |
SYNTHESIS PHASE — scout answers provided below.
Raw need: {raw text}
{scout_answers}
Produce the full structured document. Bake scout answers into Architectural
Constraints where applicable. Every constraint must have a rationale tied to
a product commitment. Do NOT return Clarification Needed.
Store the agent's output as structured_document.
Use the structured_document as the ticket description. Extract the # Title as the default ticket title. Continue to Step 1.
Read .claude/ticket-config.json to determine the target system.
ticket-config.json → Determine Source
├── --source flag provided → Use flag value (youtrack | github)
├── default_source == "youtrack" → YouTrack
├── default_source == "github" → GitHub
├── default_source == "auto"
│ ├── Only youtrack.project_prefix set → YouTrack
│ ├── Only github.repo set → GitHub
│ └── Both configured → Ask user via AskUserQuestion
└── No config found → Ask user via AskUserQuestion
AskUserQuestion:
question: "Où souhaitez-vous créer le ticket ?"
header: "Destination"
options:
- label: "YouTrack"
description: "Créer dans le projet YouTrack"
- label: "GitHub"
description: "Créer comme issue GitHub"
If .claude/ticket-config.json does not exist, display:
# Configuration manquante
Le fichier `.claude/ticket-config.json` est introuvable.
**Options** :
1. Lancer `/resolve --init` pour configurer le projet
2. Utiliser `--source youtrack` ou `--source github` pour forcer la destination
Three modes, by priority:
If the user passed a title or description inline:
--type is provided, use it; otherwise default to taskIf a file path is passed (typically from /express-need):
taskIf no arguments provided, collect via AskUserQuestion:
Step 1 - Title (required):
AskUserQuestion:
question: "Quel est le titre du ticket ?"
header: "Titre"
Step 2 - Type (default: task):
AskUserQuestion:
question: "Quel type de ticket ?"
header: "Type"
options:
- label: "Task"
description: "Tâche technique ou fonctionnelle"
- label: "Bug"
description: "Rapport de bug"
- label: "Feature"
description: "Nouvelle fonctionnalité"
Step 3 - Description (required):
AskUserQuestion:
question: "Décrivez le ticket (contexte, objectif, critères d'acceptation)"
header: "Description"
Step 4 - Priority (optional):
AskUserQuestion:
question: "Quelle priorité ?"
header: "Priorité"
options:
- label: "Pas de priorité"
description: "Ne pas définir de priorité"
- label: "Critical"
description: "Bloquant, à traiter immédiatement"
- label: "Major"
description: "Important, à traiter rapidement"
- label: "Normal"
description: "Priorité standard"
- label: "Minor"
description: "Peut attendre"
Step 5 - Labels/tags (optional):
AskUserQuestion:
question: "Labels ou tags à ajouter ? (séparés par des virgules, ou 'aucun')"
header: "Labels"
Step 6 - Milestone/sprint (optional):
AskUserQuestion:
question: "Milestone ou sprint ? (laisser vide pour aucun)"
header: "Milestone"
Display a formatted preview of the ticket before submission:
# Aperçu du ticket
| Champ | Valeur |
|-------------|-----------------------------|
| Destination | {YouTrack / GitHub} |
| Projet | {project prefix or repo} |
| Type | {bug / feature / task} |
| Titre | {title} |
| Priorité | {priority or "Non définie"} |
| Labels | {labels or "Aucun"} |
| Milestone | {milestone or "Aucun"} |
## Description
{description content}
---
Then ask for confirmation:
AskUserQuestion:
question: "Confirmer la création de ce ticket ?"
header: "Confirmation"
options:
- label: "Créer"
description: "Soumettre le ticket"
- label: "Modifier"
description: "Revenir en arrière pour corriger"
- label: "Annuler"
description: "Abandonner la création"
Determine project from ticket-config.json field youtrack.project_prefix
mcp__youtrack__find_projects or mcp__youtrack__get_projects to list available projects and ask user to pick oneCall mcp__youtrack__create_issue:
project: project prefix (e.g., "PROJ")summary: ticket titledescription: ticket description (markdown)Capture the returned issue ID and URL
Determine repository from ticket-config.json field github.repo
git remote get-url originBuild label list:
bug -> bug, feature -> enhancement, task -> (no label or custom)Run:
gh issue create \
--title "{title}" \
--body "{description}" \
--label "{labels}" \
--repo "{owner/repo}"
--milestone "{milestone}" if specifiedgh auth login"Display the result:
# Ticket créé avec succès
| Champ | Valeur |
|--------|---------------|
| ID | {ticket-id} |
| URL | {ticket-url} |
| Titre | {title} |
| Source | {YouTrack / GitHub} |
---
## Prochaine étape
Lancer `/resolve {ticket-id}` pour commencer l'implémentation ?
tools
--- name: deep-review description: Performs deep code review via an isolated fresh agent (triple perspective, anti-bias). Use when the user asks for an in-depth review of current branch changes, or when invoked by /resolve step 08. Do NOT use for reviewing PRs from GitHub (use review-pr skill instead) or for a quick correctness scan with effort levels (use bundled /code-review instead). argument-hint: [--ticket <id>] [--base <branch>] [--fix] [--severity <level>] allowed-tools: Read, Glob, Grep,
tools
Resolve git rebase conflicts methodically. Classifies each conflict (imports/namespace cleanup vs real logic clash), analyzes the commit introducing the change against the current ticket context, auto-fixes only trivial cases with a per-file summary, and asks the user when ambiguous. Verifies static analysis tools pass at the end and optionally runs functional tests. Use after `git rebase` triggers conflicts, or when the user asks to "resolve conflicts", "fix rebase", "j'ai des conflits", "aide-moi sur ce rebase".
development
Synchronize the markdown test plan in docs/qa/ with the current state of the codebase. Use after adding or modifying features to keep the plan up to date, or to bootstrap a test plan for the first time. Do NOT use to execute tests (use /qa-run instead) and do NOT use to design product specs (use /express-need instead).
tools
Execute the markdown test plan in docs/qa/ via Playwright MCP and create a ticket on each failing scenario. Use after /qa-sync, before a release, or to validate a feature end-to-end. Do NOT use to design or update scenarios (use /qa-sync instead) and do NOT use for visual regression (use visual-verify agent instead).