/jira-create
Create JIRA issue from SpecWeave increment
> /plugin marketplace add anton-abyzov/specweave > /plugin install sw@specweave
How it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/jira-create
Context preview
What this command does when you run it.
Create JIRA issue from SpecWeave increment
Command definition
jira-create.mddescription: Create JIRA issue from SpecWeave increment
Create JIRA Issue Command
**Usage**: `sw-jira:create <increment-id>`
**Purpose**: Create an Epic or Story in JIRA from a SpecWeave increment
---
Command Behavior
When user runs this command, Claude should:
1. Check Permission Gate (MANDATORY FIRST STEP)
**Before ANY JIRA API calls**, check if write operations are allowed:
// Read .specweave/config.json
const config = JSON.parse(await fs.readFile('.specweave/config.json', 'utf-8'));
const canUpdateExternal = config?.sync?.settings?.canUpdateExternalItems ?? false;
if (!canUpdateExternal) {
// STOP HERE - Permission denied
console.log(`
❌ Permission Denied
JIRA write operations are disabled.
Setting: sync.settings.canUpdateExternalItems = false
To enable, update .specweave/config.json:
{
"sync": {
"settings": {
"canUpdateExternalItems": true
}
}
}
`);
return; // DO NOT proceed to create issue
}If `canUpdateExternalItems` is `false`, display the error and **STOP**. Do not invoke the JIRA Manager agent.
2. Resolve JIRA Profile
Use the increment's stored profile or fall back to global defaultProfile/activeProfile:
// Load increment metadata
const metadata = JSON.parse(await fs.readFile(
`.specweave/increments/${incrementId}/metadata.json`, 'utf-8'
));
// Check for increment-specific profile
let profileName = metadata?.external_sync?.jira?.profile;
// Fall back to global defaultProfile (v0.31.0+) or activeProfile (legacy)
if (!profileName) {
profileName = config?.sync?.defaultProfile ?? config?.sync?.activeProfile;
}
// Get profile config
const profileConfig = config?.sync?.profiles?.[profileName];
if (!profileConfig || profileConfig.provider !== 'jira') {
console.log(`❌ Profile "${profileName}" not found or not a JIRA profile`);
return;
}
const { domain, projectKey } = profileConfig.config;3. Validate Prerequisites
- Check JIRA plugin installed
- Check JIRA_API_TOKEN and JIRA_EMAIL environment variables set
- Check JIRA profile has domain and projectKey
4. Invoke JIRA Manager Skill
Use Skill tool: Skill({ skill: "sw-jira:jira-sync", args: "Create JIRA issue for increment {increment-id}.
IMPORTANT: Permission already verified (canUpdateExternalItems=true).
Use profile: {profileName} (domain: {domain}, project: {projectKey})
Steps:
1. Read .specweave/increments/{increment-id}/spec.md
2. Extract title and description
3. Use JIRA domain: {domain}, project key: {projectKey}
4. Create Epic via JIRA REST API (POST /rest/api/3/issue)
5. Store issue key in increment metadata.json external_sync.jira.issueKey
6. Store profile name in metadata.json external_sync.jira.profile
7. Display: Issue Key, URL, and confirmation"5. Display Result
✅ Created JIRA Epic
Issue: PROJ-123
URL: https://{domain}/browse/PROJ-123
Profile: {profileName}
Linked to increment: {increment-id}---
Permission Denied Output
If `canUpdateExternalItems` is false:
❌ Permission Denied: JIRA Write Operations Disabled
Your configuration prevents creating/updating JIRA issues.
Current setting:
sync.settings.canUpdateExternalItems = false
To enable JIRA writes:
1. Edit .specweave/config.json
2. Set sync.settings.canUpdateExternalItems to true
3. Re-run this command
This setting was configured during 'specweave init'.
---
Example Usage
User: sw-jira:create 0005-payment-integration
# If permission granted:
Claude: Checking JIRA permissions...
✓ canUpdateExternalItems: true
Resolving JIRA profile...
✓ Using profile: jira-my-project (from increment)
✓ Domain: company.atlassian.net
✓ Project: MYPROJ
Creating issue...
[Invokes JIRA Manager Agent]
✅ Created JIRA Epic MYPROJ-123
URL: https://company.atlassian.net/browse/MYPROJ-123
# If permission denied:
Claude: Checking JIRA permissions...
❌ Permission Denied
sync.settings.canUpdateExternalItems = false
To enable: Edit .specweave/config.json and set canUpdateExternalItems to true---
Metadata Updates
After successful creation, the increment's `metadata.json` will be updated:
{
"external_sync": {
"jira": {
"profile": "jira-my-project",
"issueKey": "MYPROJ-123",
"issueUrl": "https://company.atlassian.net/browse/MYPROJ-123",
"lastSyncedAt": "2025-12-07T04:30:00Z"
}
}
}---
Related
| Command | Purpose | |---------|---------| | `sw-jira:pull` | Pull changes from JIRA | | `sw-jira:push` | Push progress to JIRA | | `sw-jira:sync` | Two-way sync | | `sw-jira:status` | Check sync status | | `sw-jira:close` | Close issue when complete |
Read more
description: Create JIRA issue from SpecWeave increment
Create JIRA Issue Command
**Usage**: `sw-jira:create <increment-id>`
**Purpose**: Create an Epic or Story in JIRA from a SpecWeave increment
---
Command Behavior
When user runs this command, Claude should:
1. Check Permission Gate (MANDATORY FIRST STEP)
**Before ANY JIRA API calls**, check if write operations are allowed:
// Read .specweave/config.json
const config = JSON.parse(await fs.readFile('.specweave/config.json', 'utf-8'));
const canUpdateExternal = config?.sync?.settings?.canUpdateExternalItems ?? false;
if (!canUpdateExternal) {
// STOP HERE - Permission denied
console.log(`
❌ Permission Denied
JIRA write operations are disabled.
Setting: sync.settings.canUpdateExternalItems = false
To enable, update .specweave/config.json:
{
"sync": {
"settings": {
"canUpdateExternalItems": true
}
}
}
`);
return; // DO NOT proceed to create issue
}If `canUpdateExternalItems` is `false`, display the error and **STOP**. Do not invoke the JIRA Manager agent.
2. Resolve JIRA Profile
Use the increment's stored profile or fall back to global defaultProfile/activeProfile:
// Load increment metadata
const metadata = JSON.parse(await fs.readFile(
`.specweave/increments/${incrementId}/metadata.json`, 'utf-8'
));
// Check for increment-specific profile
let profileName = metadata?.external_sync?.jira?.profile;
// Fall back to global defaultProfile (v0.31.0+) or activeProfile (legacy)
if (!profileName) {
profileName = config?.sync?.defaultProfile ?? config?.sync?.activeProfile;
}
// Get profile config
const profileConfig = config?.sync?.profiles?.[profileName];
if (!profileConfig || profileConfig.provider !== 'jira') {
console.log(`❌ Profile "${profileName}" not found or not a JIRA profile`);
return;
}
const { domain, projectKey } = profileConfig.config;3. Validate Prerequisites
- Check JIRA plugin installed
- Check JIRA_API_TOKEN and JIRA_EMAIL environment variables set
- Check JIRA profile has domain and projectKey
4. Invoke JIRA Manager Skill
Use Skill tool: Skill({ skill: "sw-jira:jira-sync", args: "Create JIRA issue for increment {increment-id}.
IMPORTANT: Permission already verified (canUpdateExternalItems=true).
Use profile: {profileName} (domain: {domain}, project: {projectKey})
Steps:
1. Read .specweave/increments/{increment-id}/spec.md
2. Extract title and description
3. Use JIRA domain: {domain}, project key: {projectKey}
4. Create Epic via JIRA REST API (POST /rest/api/3/issue)
5. Store issue key in increment metadata.json external_sync.jira.issueKey
6. Store profile name in metadata.json external_sync.jira.profile
7. Display: Issue Key, URL, and confirmation"5. Display Result
✅ Created JIRA Epic
Issue: PROJ-123
URL: https://{domain}/browse/PROJ-123
Profile: {profileName}
Linked to increment: {increment-id}---
Permission Denied Output
If `canUpdateExternalItems` is false:
❌ Permission Denied: JIRA Write Operations Disabled Your configuration prevents creating/updating JIRA issues. Current setting: sync.settings.canUpdateExternalItems = false To enable JIRA writes: 1. Edit .specweave/config.json 2. Set sync.settings.canUpdateExternalItems to true 3. Re-run this command This setting was configured during 'specweave init'.
---
Example Usage
User: sw-jira:create 0005-payment-integration
# If permission granted:
Claude: Checking JIRA permissions...
✓ canUpdateExternalItems: true
Resolving JIRA profile...
✓ Using profile: jira-my-project (from increment)
✓ Domain: company.atlassian.net
✓ Project: MYPROJ
Creating issue...
[Invokes JIRA Manager Agent]
✅ Created JIRA Epic MYPROJ-123
URL: https://company.atlassian.net/browse/MYPROJ-123
# If permission denied:
Claude: Checking JIRA permissions...
❌ Permission Denied
sync.settings.canUpdateExternalItems = false
To enable: Edit .specweave/config.json and set canUpdateExternalItems to true---
Metadata Updates
After successful creation, the increment's `metadata.json` will be updated:
{
"external_sync": {
"jira": {
"profile": "jira-my-project",
"issueKey": "MYPROJ-123",
"issueUrl": "https://company.atlassian.net/browse/MYPROJ-123",
"lastSyncedAt": "2025-12-07T04:30:00Z"
}
}
}---
Related
| Command | Purpose | |---------|---------| | `sw-jira:pull` | Pull changes from JIRA | | `sw-jira:push` | Push progress to JIRA | | `sw-jira:sync` | Two-way sync | | `sw-jira:status` | Check sync status | | `sw-jira:close` | Close issue when complete |
Spec-first AI development: describe a feature → AI creates spec + plan + tasks, builds autonomously, syncs to GitHub/JIRA. Domain-expert skills for PM, Architect, Frontend, QA learn your patterns permanently. Claude Code, Codex, Cursor, Copilot & more.
Repo: anton-abyzov/specweave
Other commands on specweave.
- /abandon
Abandon an incomplete increment (requirements changed, obsolete)
Open command - /ado-cleanup-duplicates
Clean up duplicate Azure DevOps work items for a Feature. Finds work items with duplicate titles and closes all except the first created item.
Open command - /ado-clone
Clone Azure DevOps repositories to local workspace. Use after init if cloning was skipped, or to add repos later.
Open command - /ado-close
Close Azure DevOps work item when increment complete
Open command - /ado-create
Create Azure DevOps work item from SpecWeave increment
Open command - /ado-import-areas
Import Azure DevOps area paths from a project and map them to SpecWeave projects. Creates 2-level directory structure with area path-based organization.
Open command

