mi-lopez / jira-cli-wizard
A beautiful CLI wizard for creating Jira tickets with interactive prompts and smart defaults
Requires
- php: ^8.1
- composer-runtime-api: ^2.0
- guzzlehttp/guzzle: ^7.0
- symfony/console: ^6.0|^7.0
- symfony/process: ^6.0|^7.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.21
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^10.0
- symfony/var-dumper: ^6.0|^7.0
This package is auto-updated.
Last update: 2026-08-19 15:07:40 UTC
README
A beautiful, interactive CLI wizard for creating Jira tickets with smart defaults and an intuitive user experience. Skip the web interface hassle and create tickets directly from your terminal!
β¨ Features
- π§ββοΈ Interactive Wizard: Step-by-step guided ticket creation
- π€ Non-Interactive Mode: Create tickets from scripts and AI agents using flags
- π― Smart Defaults: Suggests active sprints, recent epics, and assignees
- π Quick Creation: Create tickets based on existing ones
- βοΈ Update Command: Modify fields on existing tickets, interactively or by flag
- π Workflow Transitions: Move a ticket's status by name, and list the moves that are legal right now
- π View Command: Read a ticket and its comments in the terminal, with the text back in Markdown
- π Attachments: Upload files and screenshots on create, create-from and update
- π Markdown Descriptions: Headings, lists, bold, italic, code and links render as real Jira ADF
- π·οΈ Labels: Prompted in the wizard, prefilled from the template when copying a ticket
- π Template System: Copy settings from existing tickets
- π Resource Discovery: List projects, issue types, priorities, epics, sprints and transitions as JSON
- π§ͺ Dry Run: Preview the full payload before creating any ticket
- π Secure: API token-based authentication
- π¨ Beautiful UI: Colorful, user-friendly terminal interface
- β‘ Fast Setup: One-command configuration
- π Complete Support: Projects, issue types, priorities, assignees, sprints, and epics
- π Epic Linking: Automatically link tickets to epics
- π Sprint Integration: Add tickets to active sprints
- π Status Monitoring: Check configuration and connection status
- π Smart Search: Find projects, users, and issue types by name or partial match
π Quick Start
Installation
composer require mi-lopez/jira-cli-wizard --dev
Configuration
Configure your Jira credentials (one-time setup):
./vendor/bin/jira-wizard configure
You'll need:
- Your Jira instance URL (e.g.,
https://yourcompany.atlassian.net) - Your email address
- An API token (generate here)
Create Your First Ticket
./vendor/bin/jira-wizard create
The wizard will guide you through:
- Project Selection - Choose from your accessible projects
- Issue Type - Select Story, Bug, Task, etc.
- Summary - Enter a descriptive title
- Description - Add details (optional)
- Priority - Set importance level
- Assignee - Assign to team members or leave unassigned
- Additional Options - Link to epics, add to active sprint
π₯ Power Features
Create from Existing Ticket
The fastest way to create similar tickets:
# Copy all settings from an existing ticket ./vendor/bin/jira-wizard create-from CAM-1106 # Copy to a different project ./vendor/bin/jira-wizard create-from CAM-1106 --project TRIGB2B
What gets copied:
- β
Project (or override with
--project) - β Issue type
- β Priority
- β Assignee
- β Epic (if linked)
- β Sprint (current active sprint)
What you provide:
- β New summary
- β New description
- β Optional: modify any copied settings
π Usage Examples
Standard Ticket Creation
$ ./vendor/bin/jira-wizard create π― Jira CLI Wizard ================== β Connected to Jira successfully! [1/7] Select Project -------------------- Available projects: [0] PROJ - My Project [1] DEV - Development Team [2] CAM - CAMEL NETWORKS - OroCommerce project > 2 [2/7] Select Issue Type ----------------------- Available issue types: [0] Tarea - Un trabajo pequeΓ±o e independiente [1] Historia - Una funciΓ³n o funcionalidad expresada como objetivo del usuario [2] Error - Un problema o error > 1 [3/7] Enter Summary ------------------- Enter ticket summary: Implement user authentication system [4/7] Enter Description ----------------------- Enter description (optional): Add JWT-based authentication with login/logout functionality [5/7] Select Priority --------------------- Available priorities: [skip] Skip (use default) [0] Highest [1] High [2] Medium > 1 [6/7] Select Assignee -------------------- Available assignees: [unassigned] Unassigned [0] John Doe [1] Jane Smith [2] Miguel Lopez > 2 [7/7] Additional Options ----------------------- π Sprint Options Add to active sprint 'Sprint 23'? (y/N): y β Will add to sprint: Sprint 23 π Epic Options Select epic (optional): [skip] Skip (no epic) [0] CAM-1037 - Oro 6.1 Upgrade [1] CAM-761 - MVP3 Distributor Quote > 0 π Ticket Summary ================ π Project: CAM - CAMEL NETWORKS - OroCommerce project π― Type: Historia π Summary: Implement user authentication system π Description: Add JWT-based authentication with login/logout functionality β‘ Priority: High π€ Assignee: Miguel Lopez π Sprint: Sprint 23 π Epic: CAM-1037 π€ Create this ticket? (y/N): y π Creating ticket... β Ticket created successfully! π Issue Key: CAM-1107 π URL: https://yourcompany.atlassian.net/browse/CAM-1107 π Adding to sprint... β Added to sprint!
Quick Template Creation
$ ./vendor/bin/jira-wizard create-from CAM-1106 π Original Ticket Template ============================ π Project: CAM - CAMEL NETWORKS - OroCommerce project π― Type: Tarea π Summary: Test from API β‘ Priority: Medium π€ Assignee: Miguel Lopez π Sprint: CAMEL Sprint 18 π Epic: CAM-1037 - Oro 6.1 Upgrade π― Create New Ticket ==================== π Project: CAM - CAMEL NETWORKS - OroCommerce project π Enter new ticket summary: Fix login validation bug π Enter description (optional): Users cannot login with special characters in password π§ Do you want to modify the copied settings? (y/N): n π New Ticket Summary ===================== π Project: CAM - CAMEL NETWORKS - OroCommerce project π― Type: Tarea π Summary: Fix login validation bug π Description: Users cannot login with special characters in password β‘ Priority: Medium π€ Assignee: Miguel Lopez π Sprint: CAMEL Sprint 18 π Epic: CAM-1037 π€ Create this ticket? (y/N): y π Creating ticket... β Ticket created successfully! π Issue Key: CAM-1108 π URL: https://yourcompany.atlassian.net/browse/CAM-1108 π Adding to sprint... β Added to sprint!
Cross-Project Template
$ ./vendor/bin/jira-wizard create-from CAM-1106 --project TRIGB2B π Original Ticket Template ============================ π Project: CAM - CAMEL NETWORKS - OroCommerce project π― Type: Tarea π Summary: Test from API β‘ Priority: Medium π€ Assignee: Miguel Lopez π― Create New Ticket ==================== π Project: TRIGB2B - TRIGANO - B2B - Projet OroCommerce π Enter new ticket summary: Implement similar API feature π Enter description (optional): Port the API functionality to TRIGB2B project π§ Do you want to modify the copied settings? (y/N): y β‘ Change priority? (y/N): y Available priorities: [skip] Skip (use default) [0] Highest [1] High [2] Medium > 1 π€ Change assignee? (y/N): n π Creating ticket... β Ticket created successfully! π Issue Key: TRIGB2B-456
π οΈ Available Commands
Create Ticket (Interactive)
./vendor/bin/jira-wizard create
# or simply:
./vendor/bin/jira-wizard
Full interactive wizard for creating tickets from scratch.
Create Ticket (Non-Interactive)
Skip the wizard entirely by passing flags. Outputs only the issue key to stdout β ideal for scripts and AI agents.
./vendor/bin/jira-wizard create \ --project=ALDO \ --type=Task \ --summary="Upgrade bundle X for OroCommerce 6.1" \ --description="Check breaking changes in the CHANGELOG" \ --epic=ALDO-526 \ --labels=upgrade,orocommerce \ --priority=High \ --sprint=active # stdout: ALDO-123
Available flags:
| Flag | Short | Required | Description |
|---|---|---|---|
--project |
-p |
Yes | Project key (e.g. ALDO) |
--type |
-t |
Yes | Issue type name (e.g. Task, Story, Epic) |
--summary |
-s |
Yes | Ticket title |
--description |
-d |
No | Ticket description |
--parent |
No | Parent/epic key (e.g. ALDO-10) |
|
--epic |
No | Alias for --parent |
|
--labels |
-l |
No | Comma-separated labels (e.g. upgrade,backend) |
--priority |
No | Priority name (e.g. High, Medium, Low) |
|
--sprint |
No | Sprint ID or active to auto-resolve the current sprint |
|
--assignee |
-a |
No | Display name, email, account id, or me |
--attachment |
No | Path to a file to upload. Repeatable | |
--dry-run |
No | Print the JSON payload without creating the ticket |
--assigneeresolves by exact display name or email first, then by partial match. An ambiguous partial match is rejected with the list of candidates rather than silently picking one.
--dry-runrequires--project,--typeand--summary. Without them it fails instead of falling through to the interactive wizard, which would create a real ticket.
Capture the key in a script:
KEY=$(./vendor/bin/jira-wizard create --project=ALDO --type=Task --summary="..." --no-interaction) echo "Created: $KEY"
Preview before creating (dry-run):
./vendor/bin/jira-wizard create \
--project=ALDO --type=Task --summary="Test" --sprint=active --dry-run
Update an Existing Ticket
# Non-interactive: only the fields you pass are touched ./vendor/bin/jira-wizard update ALDO-123 \ --summary="New title" \ --description="## Context\n\n- point one\n- point two" \ --priority=High \ --assignee=me \ --labels=backend,upgrade \ --sprint=active \ --status="En cours" # Interactive: current values are offered as defaults ./vendor/bin/jira-wizard update ALDO-123 # Preview without writing ./vendor/bin/jira-wizard update ALDO-123 --summary="New title" --dry-run
Fields accept the same values as create. Two update-specific conventions:
--statusmoves the ticket through the workflow. Status is not a writable field in Jira, so this ridesPOST /issue/{key}/transitionsinstead of the field update. It accepts a transition id, a transition name, or the name of the resulting status, matched case-insensitively; an unambiguous fragment works too. When nothing matches, the error lists what is legal from the current status. Asking for the status the ticket already has is a no-op, not a failure, so re-running a script is safe.--assignee=unassigned(ornone) clears the assignee.--epic=noneclears the parent link.- An empty
--labels=clears every label, whereas omitting the flag leaves them untouched.
View a Ticket
./vendor/bin/jira-wizard view ALDO-123 # Keys are case-insensitive ./vendor/bin/jira-wizard view aldo-123 # Include the comment thread ./vendor/bin/jira-wizard view ALDO-123 --comments # Flattened summary for scripts and AI agents ./vendor/bin/jira-wizard view ALDO-123 --json
ALDO-123 Checkout crashes on retry
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Status In Progress
Type Bug
Priority High
Assignee Ada Lovelace
Reporter Alan Turing
Project ALDO
Parent ALDO-9 β Checkout
Labels backend, urgent
Created 2026-08-01 10:22
Updated 2026-08-18 16:40
URL https://your-domain.atlassian.net/browse/ALDO-123
Description
## Steps
1. Add an item to the cart
2. Retry the payment
The description comes back from Jira as ADF and is rendered in the same Markdown flavour
create and update accept, so a ticket can be read, edited and sent back without the
formatting drifting. Headings, lists, task lists, tables, code blocks, quotes, mentions and
links are all preserved; attachments show as [attachment: name].
--comments (-c) appends the thread, oldest first, with author, date and an (edited β¦)
marker when the comment was actually changed. Comments live behind their own endpoint, so
they cost an extra request and are only fetched when you ask for them:
Comments (2)
Victor Donoso Β· 2026-04-09 18:00
No se necesitan cambios, validado hoy con Marina.
Ada Lovelace Β· 2026-04-10 09:12 (edited 2026-04-10 09:30)
Reopened: it still fails on **staging**.
--json prints a flattened object β key, url, summary, status, type, priority, assignee,
reporter, project, parent, labels, timestamps and the Markdown description β rather than
Jira's raw payload, which also carries the changelog and every rendered field. With
--comments it also carries a comments array (author, created, updated, Markdown body);
without the flag the key is absent, which is a different claim from an empty list.
Attach Files
Works on create, create-from and update. The flag is repeatable and the wizard also
prompts for files:
./vendor/bin/jira-wizard create -p ALDO -t Bug -s "Checkout crash" \
--attachment=screenshot.png \
--attachment=stacktrace.log
Missing files are reported before anything is sent to Jira.
Markdown in Descriptions
Descriptions are converted to Jira's ADF, so markdown renders as real formatting instead of literal characters:
./vendor/bin/jira-wizard create -p ALDO -t Task -s "Upgrade" -d "$(cat <<'EOF' # Goal Upgrade the bundle to **6.1**. - Review the `CHANGELOG` - Check [the docs](https://example.com) 1. Bump the constraint 2. Run the suite EOF )"
Supported: headings, bullet and ordered lists, **bold**, *italic*, `code`,
[links](url), blank lines as paragraph breaks and single newlines as hard breaks.
List Resources as JSON
Discover valid values for flags before scripting or using with an AI agent:
# Show available resource types ./vendor/bin/jira-wizard list # List all projects ./vendor/bin/jira-wizard list projects # List issue types for a project ./vendor/bin/jira-wizard list issue-types --project=ALDO # List priorities ./vendor/bin/jira-wizard list priorities # List epics for a project ./vendor/bin/jira-wizard list epics --project=ALDO # List active sprint for a project ./vendor/bin/jira-wizard list sprints --project=ALDO # List the transitions available on a ticket right now ./vendor/bin/jira-wizard list transitions --issue=ALDO-123
Transitions are keyed off the issue, not the project: which moves are legal depends on where the ticket currently stands, so the list never offers a step Jira would reject.
[
{"id": "2", "name": "En cours de traitement", "to": "En cours de traitement"},
{"id": "271", "name": "AnnulΓ©", "to": "AnnulΓ©"}
]
Example output (list projects):
[
{"key": "ALDO", "name": "ALDO - B2B project"},
{"key": "SYN", "name": "Synoproject"}
]
Typical AI agent workflow:
# 1. Discover project key PROJECT=$(./vendor/bin/jira-wizard list projects | jq -r '.[] | select(.name | test("ALDO")) | .key') # 2. Discover epic key EPIC=$(./vendor/bin/jira-wizard list epics --project=$PROJECT | jq -r '.[0].key') # 3. Create ticket KEY=$(./vendor/bin/jira-wizard create \ --project=$PROJECT --type=Task \ --summary="Automated task" --epic=$EPIC --sprint=active \ --no-interaction) echo "Created: $KEY"
Create from Template
./vendor/bin/jira-wizard create-from <ISSUE-KEY>
Create a new ticket using an existing ticket as a template.
Examples:
# Copy all settings from CAM-1106 ./vendor/bin/jira-wizard create-from CAM-1106 # Copy settings but create in different project ./vendor/bin/jira-wizard create-from CAM-1106 --project TRIGB2B # Quick bug fix based on existing bug ./vendor/bin/jira-wizard create-from PROJ-123
View a Ticket
./vendor/bin/jira-wizard view <ISSUE-KEY> [--comments] [--json]
Examples:
# Read a ticket in the terminal ./vendor/bin/jira-wizard view ALDO-123 # Read it with its comment thread ./vendor/bin/jira-wizard view ALDO-123 -c # Pipe the ticket into another tool ./vendor/bin/jira-wizard view ALDO-123 --json | jq -r .description
Configure Credentials
./vendor/bin/jira-wizard configure
Set up or update your Jira credentials and connection settings.
Check Status
./vendor/bin/jira-wizard status
Display current configuration and test connection to Jira.
Get Help
./vendor/bin/jira-wizard --help ./vendor/bin/jira-wizard list --help ./vendor/bin/jira-wizard create-from --help
βοΈ Configuration
Configuration is stored in ~/.jira-cli-config.json. You can:
- View current config:
./vendor/bin/jira-wizard status - Reconfigure:
./vendor/bin/jira-wizard configure - Manual edit: Edit
~/.jira-cli-config.jsondirectly
Environment Variables
You can also set configuration via environment variables:
export JIRA_URL="https://yourcompany.atlassian.net" export JIRA_EMAIL="your.email@company.com" export JIRA_TOKEN="your-api-token"
π― Smart Features
Flexible Selection
All selection prompts support multiple input methods:
Projects:
- Number:
10(from numbered list) - Project key:
CAM(exact match) - Partial key:
CAM(if unique) - Project name:
CAMEL(partial match)
Issue Types:
- Number:
0(from numbered list) - Type name:
TareaorHistoria - Partial name:
Hist(matches Historia)
Priorities:
- Number:
2(from numbered list) - Priority name:
HighorMedium - Skip:
skip(use default)
Assignees:
- Number:
15(from numbered list) - Full name:
Miguel Lopez - Email:
miguel@company.com - Partial name:
Miguel - Unassigned:
unassigned
Smart Defaults
- Active Sprint: Automatically suggests current active sprint
- Recent Epics: Shows epics ordered by last updated
- Team Members: Lists assignable users for the project
- Cross-Project: Maintains settings when copying between projects
Error Handling
- Connection Testing: Validates credentials before use
- Graceful Fallbacks: Continues even if optional features fail
- Clear Messages: Descriptive error messages with solutions
- Multiple Matches: Shows options when partial matches are ambiguous
π§ Requirements
- PHP: ^8.1
- Jira: Cloud or Server with REST API access
- Extensions:
curl,json
π¨ Advanced Usage
Workflow Integration
Create tickets as part of your development workflow:
# Create a bug report for current issue ./vendor/bin/jira-wizard create-from PROJ-123 # Create feature ticket based on existing epic structure ./vendor/bin/jira-wizard create-from EPIC-456 --project NEWPROJ # Quick task creation for sprint ./vendor/bin/jira-wizard create-from SPRINT-TEMPLATE
Batch Operations
Use shell scripting for batch operations:
#!/bin/bash # Create multiple related tickets for feature in "login" "signup" "profile"; do echo "Creating ticket for $feature" ./vendor/bin/jira-wizard create-from TEMPLATE-123 \ --project MYPROJ \ --summary "Implement $feature feature" done
Team Productivity
Project Templates:
- Create a "template" ticket for each project type
- Use
create-fromto maintain consistency - Share template ticket keys with team
Sprint Planning:
- Clone user stories with
create-from - Maintain epic linkage across related tickets
- Quickly create test tickets for each feature
Custom Fields Support
The wizard automatically handles:
- Standard Fields: Summary, Description, Priority, Assignee
- Project Fields: Issue Types, Components, Versions
- Agile Fields: Sprint, Epic, Story Points
- Custom Fields: (via template copying)
π Troubleshooting
Common Issues
Connection Failed
β Connection failed: Unauthorized
Solution: Check your email and API token. Regenerate token if needed.
No Projects Found
No projects found or no access to projects.
Solution: Ensure your account has access to at least one Jira project.
Permission Denied
Failed to create issue: Forbidden
Solution: Verify you have permission to create issues in the selected project.
Template Ticket Not Found
β Ticket CAM-1106 not found or no access.
Solution: Check the ticket key and ensure you have access to view it.
Invalid Project Override
Project INVALID not found or no access.
Solution: Verify the project key exists and you have access to it.
Debug Information
# Check current status and configuration ./vendor/bin/jira-wizard status # View detailed configuration cat ~/.jira-cli-config.json # Test connection manually curl -u "email@example.com:api-token" \ "https://yourcompany.atlassian.net/rest/api/3/myself" # Test specific ticket access curl -u "email@example.com:api-token" \ "https://yourcompany.atlassian.net/rest/api/3/issue/CAM-1106"
Performance Tips
- Connection Caching: The CLI tests connection once per session
- Project Caching: Project lists are cached during wizard execution
- API Optimization: Minimal API calls for better performance
- Batch Operations: Use templates for creating multiple similar tickets
Getting Help
- π Documentation
- π Report Issues
- π¬ Discussions
- π§ Contact
π§ͺ Development
Setup Development Environment
# Clone the repository git clone https://github.com/mi-lopez/jira-cli-wizard.git cd jira-cli-wizard # Install dependencies composer install # Run tests composer test # Check code style composer cs-check # Fix code style composer cs-fix # Run static analysis composer phpstan
Project Structure
βββ bin/
β βββ jira-wizard # CLI entry point
βββ src/
β βββ Commands/
β β βββ CreateTicketCommand.php # Interactive wizard + non-interactive mode
β β βββ CreateFromCommand.php # Template creation command
β β βββ UpdateCommand.php # Field updates on existing tickets
β β βββ ViewCommand.php # Read a ticket in the terminal
β β βββ ListCommand.php # JSON resource listing
β β βββ ConfigureCommand.php # Configuration command
β β βββ StatusCommand.php # Status command
β βββ Helpers/
β β βββ AdfToText.php # Jira rich text back to Markdown
β β βββ AssigneeResolver.php # Name/email/account id/`me` resolution
β β βββ LabelParser.php # Label list parsing
β β βββ MarkdownToAdf.php # Markdown to Jira rich text
β β βββ ConsoleHelper.php # Pretty console output
β βββ JiraApiClient.php # Jira API integration
β βββ ConfigManager.php # Configuration management
β βββ Installer.php # Post-install setup
βββ tests/ # PHPUnit tests
βββ .github/
β βββ workflows/ # GitHub Actions CI
βββ composer.json # Package configuration
βββ README.md # This file
Running Tests
# Run all tests composer test # Run tests with coverage composer test-coverage # Run specific test ./vendor/bin/phpunit tests/Unit/ConfigManagerTest.php
π€ Contributing
We welcome contributions! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Add tests for new functionality
- Ensure all tests pass (
composer test) - Check code style (
composer cs-check) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Code Style
This project follows PSR-12 coding standards:
# Check code style composer cs-check # Auto-fix code style issues composer cs-fix
π Security
API Token Security
- API tokens are stored locally in
~/.jira-cli-config.json - Tokens are never logged or transmitted except to Jira
- Use file permissions to protect your config:
chmod 600 ~/.jira-cli-config.json
Best Practices
- Generate dedicated tokens: Create a token specifically for CLI use
- Regular rotation: Rotate API tokens periodically
- Minimal permissions: Use accounts with minimal required permissions
- Secure storage: Keep your config file secure
π Roadmap
Version 1.1.0
- Bulk Operations: Create multiple tickets at once
- Custom Templates: Save and reuse ticket templates locally
- Custom Fields: Enhanced support for custom Jira fields
- Watchers: Add watchers to tickets during creation
- Project Shortcuts: Quick project selection via aliases
Version 1.2.0
- Comments: Add initial comments to tickets
- Attachments: Upload files to tickets
- Sub-tasks: Create sub-tasks automatically
- Time Tracking: Add time estimates and logging
- Workflows: Support for custom workflow transitions
Version 2.0.0
- Multiple Instances: Support multiple Jira instances
- Plugins: Plugin system for extensions
- GUI Mode: Optional web interface
- AI Integration: AI-powered descriptions and summaries
- Git Integration: Create tickets from git commits/branches
π Performance
- Cold start: ~200ms (first run after configuration)
- Warm start: ~100ms (subsequent runs)
- Template operations: ~150ms (including API calls)
- API calls: Optimized to minimize requests
- Memory usage: ~12MB typical usage
π Star History
If this tool saves you time, please consider giving it a star! β
π License
This project is licensed under the MIT License - see the LICENSE file for details.
π Acknowledgments
- Atlassian: For providing the excellent Jira REST API
- Symfony Console: For the powerful CLI framework
- Guzzle HTTP: For reliable HTTP client functionality
- Contributors: All the amazing people who help improve this tool
π Changelog
[1.5.0] - 2026-08-19
Added
- π
update --statusβ move a ticket through its workflow by transition name, id or target status name, matched case-insensitively; unmatched values report what is legal from the current status, and asking for the status the ticket already has is a no-op - π
list transitions --issue=KEYβ the transitions available from where the ticket stands, for scripts and AI agents
[1.4.0] - 2026-08-19
Added
- π¬
view --comments(-c) β appends the comment thread, oldest first, with author, date and an(edited β¦)marker; paginated, so long threads come back whole
Fixed
- π
--versionreported1.0.0on every release. The string was hardcoded when the CLI was written and never bumped; it now comes from Composer's installed version
[1.3.0] - 2026-08-19
Added
- π
viewcommand β print a ticket's fields and description in the terminal, with--jsonfor scripts and AI agents - π€
AdfToTexthelper β converts Jira's ADF back to the Markdown flavourcreateandupdateaccept, so a description survives a read/edit round trip
[1.2.0] - 2026-08-05
β οΈ Upgrade strongly recommended: 1.1.0 does not start on current Symfony.
Added
- βοΈ
updatecommand β modify summary, description, type, epic/parent, priority, assignee, labels and sprint on an existing ticket, interactively or by flag, with--dry-run - π Attachment upload on
create,create-fromandupdatevia the repeatable--attachmentflag, plus a wizard prompt - π€
--assignee(-a) in non-interactive mode, resolving display name, email, account id orme - π Markdown descriptions rendered as real Jira ADF β headings, bullet and ordered lists, bold, italic, inline code, links and hard breaks
- π·οΈ Labels prompted in the
createwizard, and prefilled from the source ticket increate-from
Fixed
- π The CLI failed to start on symfony/console 6.0 and 7.4. Every command class redeclared
$defaultNamewith a type the parent declares untyped, which is a fatal error in PHP. Only 7.3.x happened to work, so1.1.0is broken on a fresh install. Commands now use#[AsCommand] - π Attachment uploads were never sent correctly. The request cleared its
Content-Typewith a null value, which makes Guzzle skipmultipart/form-data, so the body went out with no boundary for the server to parse - π
--dry-runcould create a real ticket. Without the non-interactive flags it fell through to the wizard, which ends by creating the ticket. It now fails up front - π An ambiguous
--assigneeno longer silently picks the first partial match; it lists the candidates and stops - π Issue types without a
descriptionno longer emit a PHP warning - π
getIssue()now requests thelabelsfield
Internal
- β Test suite grew from 31 to 114 tests; line coverage from ~19% to ~44%
- π
JiraApiClientis injectable into the commands, and accepts an HTTP client, so the suite runs fully offline - π The two duplicated assignee resolvers were merged into one tested helper
- βοΈ CI now runs. It had never executed once: it triggered on
main/developwhile the default branch ismaster. Test Analytics and Codecov PR reporting are wired up
[1.1.0] - 2026-06-02
- π€ NEW: Non-interactive mode for
createβ pass all fields as flags, get issue key on stdout - π§ͺ NEW:
--dry-runflag β preview the full JSON payload without creating any ticket - π NEW:
listcommand β outputs projects, issue-types, priorities, epics, and sprints as JSON - π NEW:
--sprint=activeβ auto-resolves the current active sprint at runtime - π FIX:
getEpics()migrated from deprecated/rest/api/3/searchto/rest/api/3/search/jql
[1.0.0] - 2025-07-03
- π Initial release
- β¨ Interactive ticket creation wizard
- π§ One-command configuration setup
- π― Smart defaults for sprints and epics
- π¨ Beautiful terminal interface
- π Status and health checking
- π Secure API token authentication
- π NEW: Create from existing ticket templates
- π NEW: Cross-project ticket copying
- π NEW: Smart search and selection
- β‘ NEW: Quick ticket creation workflows
Made with β€οΈ and PHP by mi-lopez