agentic/code/frameworks/sdlc-complete/skills/issue-create/SKILL.md
Create a new ticket/issue with configurable backend (Gitea, GitHub, Jira, Linear, or local files)
npx skillsauth add jmagly/aiwg issue-createInstall 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.
Skill access pattern (post-kernel-pivot, 2026.5+)
Skill names referenced in this document are AIWG skills, not slash commands. Most are not kernel-listed and cannot be invoked as
/skill-nameby the platform. Reach them via:aiwg discover "<capability>" aiwg show skill <name>Only kernel-listed skills (
aiwg-doctor,aiwg-refresh,aiwg-status,aiwg-help,use,steward) are directly invokable as slash commands. See skill-discovery rule.
Create a new ticket/issue for tracking work items, bugs, features, or tasks. Automatically uses the configured ticketing provider (Gitea, GitHub, Jira, Linear) or falls back to local file-based tracking.
Given a ticket title and optional description:
.aiwg/config.yaml or project CLAUDE.md--check-regression)<title> (required): Short, descriptive title for the ticket[description] (optional): Detailed description of the work item--provider NAME (optional): Override configured provider (gitea|github|jira|linear|local)--labels "label1,label2" (optional): Comma-separated labels/tags--assignee USER (optional): Assign to specific user--priority LEVEL (optional): Priority level (low|medium|high|critical)--milestone NAME (optional): Associate with milestone (provider-dependent)--check-regression (optional): Run regression check for bug reports (auto-runs if labels include "bug" or "regression")Configuration sources (checked in order):
.aiwg/config.yaml - Project-level configurationCLAUDE.md - User-level configurationlocal providerRequired for Gitea:
giteahttps://git.integrolabs.net)~/.config/gitea/token (or configured path)Required for GitHub:
githubgh CLI authenticatedRequired for Jira:
jiraJIRA_API_TOKEN environment variableRequired for Linear:
linearhttps://api.linear.appLINEAR_API_TOKEN environment variableRequired for Local:
local.aiwg/issues/ (created if missing)Gitea/GitHub/Jira/Linear:
Local:
.aiwg/issues/ISSUE-{num}.mdExtract from command invocation:
# Basic usage
/issue-create "Implement user auth"
# With description
/issue-create "Fix navigation bug" "Nav menu not showing on mobile devices"
# With labels
/issue-create "Add dark mode" "Implement theme toggle" --labels "feature,ui"
# With assignee
/issue-create "Security audit" "Run penetration test" --assignee "security-team" --priority high
# Bug report with regression check
/issue-create "Login broken after deployment" "Users can't login" --labels "bug,critical" --check-regression
# Override provider
/issue-create "Local task" "Quick reminder" --provider local
Parameter extraction:
--flag value pairsResolution precedence (highest first):
--provider flag — explicit override always wins..aiwg/aiwg.config remotes.issue_tracker (#994) — derive provider from the remote's URL..aiwg/config.yaml (ticketing block) — back-compat for older projects.CLAUDE.md "Issueing Configuration" block — fallback for projects pre-dating either.local — default if nothing is configured.Resolving from .aiwg/aiwg.config (the preferred path):
import { readAiwgConfig, resolveRemotes, resolveRemoteProvider } from 'aiwg/config';
const cfg = await readAiwgConfig(projectDir);
const resolved = resolveRemotes(cfg?.remotes);
// resolved.issue_tracker is a git remote name (defaults to "origin")
// Resolve the URL via `git remote get-url <name>`
const url = exec(`git remote get-url ${resolved.issue_tracker}`).trim();
const provider = resolveRemoteProvider(url); // 'gitea' | 'github' | 'gitlab' | 'unknown'
When provider === 'unknown' (self-hosted instances we can't classify by URL), the operator must pass --provider explicitly. Don't guess.
Worked example for this repo (origin → git.integrolabs.net/roctinam/aiwg):
resolved.issue_tracker = 'origin'git remote get-url origin = [email protected]:roctinam/aiwg.gitresolveRemoteProvider(url) returns 'unknown' (the host doesn't include "gitea")--provider gitea, OR the project's aiwg.config providers list must explicitly include gitea so we can fall through to that.Override warning: if --provider differs from the auto-resolved one, print:
⚠️ Using --provider github (resolved from .aiwg/aiwg.config: gitea)
Trigger conditions:
--check-regression flag provided--labels contains "bug" OR "regression"Regression check process:
# Detect if regression check should run
if [[ "$LABELS" == *"bug"* ]] || [[ "$LABELS" == *"regression"* ]] || [[ "$CHECK_REGRESSION" == "true" ]]; then
echo "⏳ Running regression check..."
# Run regression check against main branch
/regression-check --baseline main --scope changed-files --format summary > /tmp/regression-results.md
# Parse results
REGRESSION_DETECTED=$(grep "REGRESSIONS DETECTED" /tmp/regression-results.md)
if [ -n "$REGRESSION_DETECTED" ]; then
# Escalate priority and add labels
PRIORITY="critical"
LABELS="${LABELS},regression-confirmed"
# Extract regression details for issue body
REGRESSION_SUMMARY=$(sed -n '/### Critical Regressions/,/###/p' /tmp/regression-results.md)
# Append to description
DESCRIPTION="${DESCRIPTION}
---
## Regression Analysis
${REGRESSION_SUMMARY}
**Full Report**: See attached regression-results.md"
else
# No regression detected
LABELS="${LABELS},no-regression"
fi
fi
Impact on issue creation:
| Regression Status | Priority | Labels | Action | |-------------------|----------|--------|--------| | REGRESSION DETECTED | Critical | bug, regression-confirmed | Escalate, include analysis | | NO REGRESSION | Original | bug, no-regression | Standard bug workflow | | CHECK FAILED | Original | bug, regression-check-failed | Create issue, note failure |
For each provider, validate required fields:
Gitea:
url present and valid URLowner presentrepo presentGitHub:
owner presentrepo presentgh CLI installed (which gh)gh authenticated (gh auth status)Jira:
url present and valid URLowner (project key) presentJIRA_API_TOKEN environment variable setLinear:
url present (default: https://api.linear.app)owner (team ID) presentLINEAR_API_TOKEN environment variable setLocal:
.aiwg/issues/ directory exists or can be createdError handling:
local provider with warningUse MCP tool mcp__gitea__create_issue:
# Load configuration
TOKEN=$(cat ~/.config/gitea/token)
URL="https://git.integrolabs.net"
OWNER="roctinam"
REPO="ai-writing-guide"
# Prepare issue body
BODY="${description}"
# Add metadata section if labels/assignee/priority specified
if [ -n "$LABELS" ] || [ -n "$ASSIGNEE" ] || [ -n "$PRIORITY" ]; then
BODY="${BODY}\n\n---\n\n"
[ -n "$LABELS" ] && BODY="${BODY}**Labels**: ${LABELS}\n"
[ -n "$ASSIGNEE" ] && BODY="${BODY}**Assignee**: @${ASSIGNEE}\n"
[ -n "$PRIORITY" ] && BODY="${BODY}**Priority**: ${PRIORITY}\n"
fi
# Create issue via MCP
# Note: Use actual MCP tool invocation here
MCP Tool Parameters:
owner: Organization/user namerepo: Repository nametitle: Issue titlebody: Issue description (markdown)assignee: Username (optional)labels: Array of label names (optional)Return format:
✅ Issue created: ISSUE-42
View at: https://git.integrolabs.net/roctinam/ai-writing-guide/issues/42
Title: Implement user auth
Status: open
Labels: feature, high-priority
Use gh CLI:
# Basic creation
gh issue create \
--repo "${OWNER}/${REPO}" \
--title "${TITLE}" \
--body "${DESCRIPTION}"
# With labels
gh issue create \
--repo "${OWNER}/${REPO}" \
--title "${TITLE}" \
--body "${DESCRIPTION}" \
--label "${LABELS}"
# With assignee
gh issue create \
--repo "${OWNER}/${REPO}" \
--title "${TITLE}" \
--body "${DESCRIPTION}" \
--assignee "${ASSIGNEE}"
# With milestone
gh issue create \
--repo "${OWNER}/${REPO}" \
--title "${TITLE}" \
--body "${DESCRIPTION}" \
--milestone "${MILESTONE}"
Return format:
✅ Issue created: #42
View at: https://github.com/jmagly/aiwg/issues/42
Title: Implement user auth
Status: open
Labels: feature, high-priority
Use Jira REST API v3:
# Prepare JSON payload
cat > /tmp/jira-issue.json <<EOF
{
"fields": {
"project": {
"key": "${PROJECT_KEY}"
},
"summary": "${TITLE}",
"description": {
"type": "doc",
"version": 1,
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "${DESCRIPTION}"
}
]
}
]
},
"issuetype": {
"name": "Task"
},
"priority": {
"name": "${PRIORITY:-Medium}"
}
}
}
EOF
# Create issue
curl -X POST "${JIRA_URL}/rest/api/3/issue" \
-u "${JIRA_EMAIL}:${JIRA_API_TOKEN}" \
-H "Content-Type: application/json" \
-d @/tmp/jira-issue.json
Return format:
✅ Issue created: PROJECT-42
View at: https://yourcompany.atlassian.net/browse/PROJECT-42
Title: Implement user auth
Status: To Do
Priority: High
Use Linear GraphQL API:
# Prepare GraphQL mutation
cat > /tmp/linear-mutation.json <<EOF
{
"query": "mutation IssueCreate(\$teamId: String!, \$title: String!, \$description: String) { issueCreate(input: { teamId: \$teamId, title: \$title, description: \$description }) { success issue { id identifier url } } }",
"variables": {
"teamId": "${TEAM_ID}",
"title": "${TITLE}",
"description": "${DESCRIPTION}"
}
}
EOF
# Create issue
curl -X POST https://api.linear.app/graphql \
-H "Authorization: ${LINEAR_API_TOKEN}" \
-H "Content-Type: application/json" \
-d @/tmp/linear-mutation.json
Return format:
✅ Issue created: ENG-42
View at: https://linear.app/team/issue/ENG-42
Title: Implement user auth
Status: Backlog
Priority: High
Create markdown file in .aiwg/issues/:
# Determine next ticket number
mkdir -p .aiwg/issues
NEXT_NUM=$(ls .aiwg/issues/ISSUE-*.md 2>/dev/null | wc -l)
NEXT_NUM=$((NEXT_NUM + 1))
TICKET_ID=$(printf "ISSUE-%03d" $NEXT_NUM)
TICKET_FILE=".aiwg/issues/${TICKET_ID}.md"
# Create ticket file
cat > "${TICKET_FILE}" <<EOF
---
id: ${TICKET_ID}
title: ${TITLE}
status: open
created: $(date +%Y-%m-%d)
updated: $(date +%Y-%m-%d)
assignee: ${ASSIGNEE:-unassigned}
labels: ${LABELS:-none}
priority: ${PRIORITY:-medium}
---
# ${TICKET_ID}: ${TITLE}
**Status**: open
**Created**: $(date +%Y-%m-%d)
**Updated**: $(date +%Y-%m-%d)
**Assignee**: ${ASSIGNEE:-unassigned}
**Priority**: ${PRIORITY:-medium}
## Description
${DESCRIPTION}
## Acceptance Criteria
- [ ] (Add acceptance criteria here)
## Comments
### $(date +%Y-%m-%d\ %H:%M)
Issue created.
EOF
Return format:
✅ Issue created: ISSUE-001
File: .aiwg/issues/ISSUE-001.md
Title: Implement user auth
Status: open
Priority: medium
If regression check was run and regression detected:
# Save regression report alongside issue
if [ -f /tmp/regression-results.md ]; then
cp /tmp/regression-results.md ".aiwg/issues/${TICKET_ID}-regression-report.md"
# Add reference to issue body (provider-specific)
# For local: already included in DESCRIPTION above
# For Gitea/GitHub: attach as comment or file
fi
Output format (consistent across providers):
✅ Issue created: {ticket-id}
{view-url-or-file-path}
**Title**: {title}
**Status**: {status}
**Priority**: {priority}
**Labels**: {labels}
**Assignee**: {assignee}
{If regression detected:}
⚠️ **Regression Detected**: Critical regressions found and documented in issue
## Next Steps
- View ticket: {url-or-command}
- Update status: `/issue-update {ticket-id} --status in_progress`
- Add comment: `/issue-update {ticket-id} --comment "Working on implementation"`
- List tickets: `issue-list`
Command:
/issue-create "Add dark mode" "Implement theme toggle for light/dark mode preferences" --labels "feature,ui" --priority high
Config (.aiwg/config.yaml):
ticketing:
provider: gitea
url: https://git.integrolabs.net
owner: roctinam
repo: ai-writing-guide
Output:
✅ Issue created: ISSUE-42
View at: https://git.integrolabs.net/roctinam/ai-writing-guide/issues/42
**Title**: Add dark mode
**Status**: open
**Priority**: high
**Labels**: feature, ui
**Assignee**: unassigned
## Next Steps
- View ticket: https://git.integrolabs.net/roctinam/ai-writing-guide/issues/42
- Update status: `/issue-update ISSUE-42 --status in_progress`
- Add comment: `/issue-update ISSUE-42 --comment "Started implementation"`
- List tickets: `/issue-list --label feature`
Command:
/issue-create "Login broken after deployment" "Users unable to authenticate since v2.1.4 deployment" --labels "bug,critical" --check-regression
Output:
⏳ Running regression check...
✓ Regression analysis complete: 2 critical regressions detected
✅ Issue created: ISSUE-003
File: .aiwg/issues/ISSUE-003.md
**Title**: Login broken after deployment
**Status**: open
**Priority**: critical
**Labels**: bug, critical, regression-confirmed
**Assignee**: unassigned
⚠️ **Regression Detected**: 2 critical regressions found
- Authentication validation failing at token refresh
- Session state not persisting across requests
**Regression Report**: .aiwg/issues/ISSUE-003-regression-report.md
## Next Steps
- View ticket: cat .aiwg/issues/ISSUE-003.md
- View regression details: cat .aiwg/issues/ISSUE-003-regression-report.md
- Update status: `/issue-update ISSUE-003 --status in_progress`
- Run regression analysis: `/regression-check --baseline v2.1.3 --format detailed`
- List regression issues: `/issue-list --label regression-confirmed`
Command:
/issue-create "Security audit" "Run penetration test on authentication endpoints" --assignee security-team --labels "security,high-priority" --milestone "Q1-2026"
Config (CLAUDE.md):
## Issueing Configuration
- **Provider**: github
- **Owner**: jmagly
- **Repo**: ai-writing-guide
Output:
✅ Issue created: #128
View at: https://github.com/jmagly/aiwg/issues/128
**Title**: Security audit
**Status**: open
**Priority**: medium (default)
**Labels**: security, high-priority
**Assignee**: @security-team
**Milestone**: Q1-2026
## Next Steps
- View ticket: gh issue view 128
- Update status: `/issue-update 128 --status in_progress`
- Add comment: `/issue-update 128 --comment "Starting audit tomorrow"`
- List tickets: `/issue-list --label security`
Command:
/issue-create "Payment calculation incorrect" "Discount not applying for orders > $1000" --labels "bug,payments"
Output:
ℹ️ Bug report detected, running automatic regression check...
⏳ Running regression check against baseline main...
✓ Regression confirmed: Introduced in commit abc1234
✅ Issue created: ISSUE-025
**Title**: Payment calculation incorrect
**Status**: open
**Priority**: critical (escalated due to regression)
**Labels**: bug, payments, regression-confirmed
**Assignee**: unassigned
⚠️ **Regression Confirmed**:
- Introduced in: commit abc1234 (2026-01-15)
- Root cause: Integer division in discount calculation
- Blast radius: 12 unit tests, 3 integration tests affected
**Actions**:
- Priority escalated to CRITICAL
- Regression analyst assigned
- Full report attached
**Regression Report**: .aiwg/issues/ISSUE-025-regression-report.md
## Next Steps
- View regression analysis: cat .aiwg/issues/ISSUE-025-regression-report.md
- Assign to developer: `/issue-update ISSUE-025 --assignee developer-name`
- Review introducing commit: git show abc1234
- Run targeted regression tests: npm test -- --grep "discount calculation"
⚠️ No ticketing configuration found.
Using default: local file-based tracking (.aiwg/issues/)
To configure a provider, create .aiwg/config.yaml:
ticketing:
provider: gitea
url: https://git.integrolabs.net
owner: roctinam
repo: ai-writing-guide
Or add to CLAUDE.md:
## Issueing Configuration
- **Provider**: gitea
- **URL**: https://git.integrolabs.net
- **Owner**: roctinam
- **Repo**: ai-writing-guide
Proceeding with local provider...
❌ Invalid ticketing configuration:
Issues:
- provider 'gitehub' not recognized (must be: gitea, github, jira, linear, local)
- missing required field: url
- missing required field: repo
Fix configuration in .aiwg/config.yaml or CLAUDE.md
Cannot create ticket without valid configuration.
❌ Failed to authenticate with Gitea:
Issues:
- Token file not found: ~/.config/gitea/token
- Create token at https://git.integrolabs.net/user/settings/applications
- Save to ~/.config/gitea/token (mode 600)
Falling back to local file-based tracking.
To retry with Gitea:
1. Create token at https://git.integrolabs.net/user/settings/applications
2. Save to ~/.config/gitea/token
3. Run command again
Proceeding with local provider...
⚠️ Regression check failed to complete:
Error: Baseline branch 'main' not found
Possible causes:
- Fresh repository without baseline
- Branch name incorrect
Creating issue without regression analysis.
Use `regression-check` manually after issue creation to verify.
❌ Issue title is required.
Usage: /issue-create <title> [description] [options]
Examples:
- /issue-create "Implement user auth"
- /issue-create "Fix bug" "Nav menu broken on mobile"
- /issue-create "Add feature" "Dark mode toggle" --labels "feature,ui"
Gitea MCP Error:
❌ Failed to create Gitea issue:
Error: 401 Unauthorized
- Token may be invalid or expired
- Verify token at https://git.integrolabs.net/user/settings/applications
- Check token file: ~/.config/gitea/token
Falling back to local provider...
GitHub CLI Error:
❌ Failed to create GitHub issue:
Error: gh: command not found
- Install GitHub CLI: brew install gh (or platform equivalent)
- Authenticate: gh auth login
Or use local provider: /issue-create "title" --provider local
Jira API Error:
❌ Failed to create Jira issue:
Error: 400 Bad Request - Invalid project key
- Verify project key: ${PROJECT_KEY}
- Check Jira URL: ${JIRA_URL}
- Verify API token: echo $JIRA_API_TOKEN
Falling back to local provider...
Local Filesystem Error:
❌ Failed to create local ticket file:
Error: Permission denied - .aiwg/issues/
- Check directory permissions: ls -la .aiwg/
- Ensure writable: chmod 755 .aiwg/issues/
Cannot create ticket.
.aiwg/config.yaml) for team consistencyfeature, bug, tech-debt)critical for urgent production issues--assignee to clarify ownership@.aiwg/requirements/UC-001.md)--milestone--check-regression for bug reports to detect regressions earlyRequirements Phase:
# Create tickets from use cases
/issue-create "Implement UC-001: User Login" "See @.aiwg/requirements/use-cases/UC-001-login.md" --labels "requirement,feature"
Architecture Phase:
# Create tickets from ADR decisions
/issue-create "Implement ADR-003: Use PostgreSQL" "Migrate from SQLite to PostgreSQL per @.aiwg/architecture/adrs/003-use-postgresql.md" --labels "architecture,database"
Testing Phase:
# Create tickets from test failures with regression check
/issue-create "Fix failing test: auth.test.ts" "Test failure in authentication module" --priority high --labels "bug,testing" --check-regression
Security Review:
# Create tickets from security audit findings
/issue-create "Fix SQL injection vulnerability" "Parameterize queries in auth module" --priority critical --labels "security,vulnerability"
Retrospectives:
# Create tickets from retro action items
/issue-create "Improve CI/CD pipeline" "Reduce build time from 10min to 5min" --labels "process-improvement,devops"
Regression Detection:
# Create issue from detected regression
/issue-create "Performance regression in API" "p99 latency increased from 200ms to 450ms" --labels "bug,performance,regression" --check-regression
data-ai
Report which research-corpus radar sidecars are overdue for refresh. Computes staleness (days since last refresh vs the cadence window) for every radar, sorted most-overdue-first. Runs via `aiwg corpus radar-status`.
data-ai
Aggregate research-corpus radar sidecars into a corpus or per-cluster freshness report — totals, overdue count, per-cluster / per-GRADE / per-trajectory breakdowns, an overdue table, and per-radar rationale snippets. Runs via `aiwg corpus radar-report`.
testing
Scaffold radar/freshness sidecars for research-corpus REFs. Pulls title/authors from the citation sidecar and GRADE from the analysis doc, defaults the refresh cadence from GRADE and the cluster from a corpus-local map, and stamps documentation/radar/REF-XXX-radar.md. Runs via `aiwg corpus radar-init`.
data-ai
Compute an entity's publication trajectory — per-year paper counts, topic drift, hot-streak detection (≥3 consecutive A-grade years), and career phase. Runs via `aiwg corpus profile-temporal`.