Create ticket
Config-driven SDLC skills for coding agents: task flow, releases, debugging, and security triage.
npx -y skills add vecten/sdlc-toolkit --skill create-ticketAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Create a structured issue in the configured PM tool with required metadata prompts, defaults, cached IDs from skills-config.yaml, and fallback ID refresh. Use when user says "create ticket", "open ticket", "log request", or similar.
SKILL.md
4.4 KB, as published. Nobody here has run it
Create Ticket
Use this workflow when the user asks to create a ticket (for example: "create ticket", "open ticket", "log request").
This skill reads pm_tool from config to determine which PM integration to use. Currently supported: linear. The instructions below use Linear-specific MCP tools; when support for other PM tools is added, the tool calls will change but the workflow structure remains the same.
Config dependency
Read <workspace>/.cursor/skills-config.yaml before acting. If the file is missing, tell the user to run bootstrap-config first.
Required config keys:
pm_tool— which PM tool to use (default:linear)linear.team_name,linear.team_idlinear.default_project,linear.default_project_idlinear.projects[]linear.labels[]linear.default_prioritylinear.custom_input
Guardrails
- If any required data is unclear, ask the user before creating the issue.
- Keep the final issue description structured for both humans and AI agents.
Cached identifiers
Use IDs from skills-config.yaml first to avoid repeated lookups. The config contains team ID, project IDs, and label IDs pre-resolved by bootstrap-config.
Fallback cache refresh
If Linear rejects a cached ID (not found/invalid):
- Refresh only that entity:
- team ->
list_teams - project ->
list_projects - label ->
list_issue_labels
- team ->
- Update in-memory mapping for this run.
- Continue without re-fetching unrelated IDs.
Required metadata policy
Team is always fixed to the value in config. If the user does not provide a field, ask whether to apply the default:
| Field | Default | Prompt style |
|---|---|---|
| Project | linear.default_project | Choose from list |
| Priority | linear.default_priority | Apply default? Y/N |
| Label | — | Choose from list + None |
| Assignee | — | me / Unassigned / Other |
| Cycle | — | Current / None |
Incorporate any additional rules from linear.custom_input.
Intake flow
- Parse provided inputs from user message: title, optional body/context, optional metadata.
- Ask for missing fields using structured multiple-choice questions.
- For each missing field, ask "Apply default?" when a default exists.
- For label, require one explicit choice from the config label list including
None. - For assignee, require one explicit choice:
me,Unassigned, orOther. - For cycle, require explicit choice:
CurrentorNone. - Resolve names to IDs using config cached mappings.
Ticket content standard (human + AI)
When creating a ticket description, use this template:
## Context
<background and why this is needed>
## Problem statement
<current issue/gap>
## Requested change
<what needs to be implemented>
## Acceptance criteria
- <criterion 1>
- <criterion 2>
## Validation / test plan
- <how to verify behavior>
## Risks / scope guardrails
- <known risk or constraint>
## Production verification notes
<prod checks required later, or "Not required">
If user gives loose notes, normalize them into the template before creating the issue.
Issue creation call
Use save_issue with:
team: fromlinear.team_nametitle: concise, action-orienteddescription: structured markdown template above- optional metadata from intake:
projectprioritylabels(single-item array when label is selected; omit whenNone)assigneecycle(set current cycle only when user selectsCurrent; omit whenNone)
Completion output format
After creating the issue, return:
- Issue ID and title
- URL
- Applied metadata: team, project, priority, label, assignee, cycle
- Defaults audit: fields defaulted vs. user-provided
Use this response shape:
Created:
- Issue: <ID> — <Title>
- URL: <url>
Applied metadata:
- Team: <value>
- Project: <value>
- Priority: <value>
- Label: <value>
- Assignee: <value>
- Cycle: <value or None>
Defaults used:
- <field>: <default used>
Provided by user:
- <field>: <value>