Interactive Git + Jira + GitLab workflow tools with fzf interfaces.
cd ~/bin
git clone <repo-url> dev-workflow-tools
cd dev-workflow-tools
cp .env.example .env
# Edit .env with your Jira credentialsAdd to ~/.zshrc:
source ~/bin/dev-workflow-tools/shell/dev-workflow.zshRequired: git, fzf, jq, curl, glab
Optional: xclip, bat, eza, fd, wmctrl
Edit .env:
JIRA_DOMAIN="<your-company>.atlassian.net"
JIRA_PROJECT="<PROJ|DEV|ENG>"
JIRA_EMAIL="your-email@company.com"
JIRA_API_TOKEN="your-api-token"
# Optional
JIRA_ME="Your Name"
TICKET_CREATOR_BOT_TOKEN="xoxb-..."
FZF_PERSIST_MODE=1 # For xmonad scratchpads/tmux popups
# QA Branch Integration (for publish-changes)
JIRA_QA_BRANCH_FIELD="customfield_12345" # Auto-detected if not set
JIRA_QA_BRANCH_DOMAIN="qa.example.com" # Single domain or comma/space-separated listGet Jira API token: https://id.atlassian.com/manage-profile/security/api-tokens
The TICKET_CREATOR_BOT_TOKEN is used by oneshot to post ticket and MR links to Slack threads. The bot requires these OAuth scopes:
chat:write- Post messages to channels/threadschannels:read- Verify bot membership in public channelsgroups:read- Verify bot membership in private channels
To add these scopes:
- Go to https://api.slack.com/apps → Your App → OAuth & Permissions
- Add the scopes under "Bot Token Scopes"
- Reinstall the app to your workspace
- Copy the "Bot User OAuth Token" (starts with
xoxb-) to.env
Note: The bot must be added to channels before it can post. Use /invite @your-bot-name in the channel.
When creating a merge request with publish-changes, the tool can automatically set a "QA Branch" field in your Jira ticket. This is useful if your workflow includes deploying feature branches to QA environments.
Configuration:
JIRA_QA_BRANCH_DOMAIN- The domain(s) where QA branches are deployed (e.g.,"qa.example.com")- Supports multiple domains:
"qa1.example.com,qa2.example.com"or"qa1.example.com qa2.example.com" - Multiple domains will show an fzf menu to select which one to use
- The branch name will be formatted as:
branch-name.qa.example.com
- Supports multiple domains:
JIRA_QA_BRANCH_FIELD- The custom field ID in Jira (e.g.,"customfield_12345")- If not set, the tool will auto-detect fields matching "QA Branch" or "Branch QA"
Example:
JIRA_QA_BRANCH_DOMAIN="qa.example.com"
# When you create an MR from branch "PROJ-123", Jira will show: PROJ-123.qa.example.comBy default, fzf tools exit after selection (normal CLI behavior). Set FZF_PERSIST_MODE=1 if using xmonad scratchpads or tmux popups to keep the interface open after actions.
Browse/search Jira tickets, create new tickets, checkout branches, create MRs.
Usage: jira-fzf [--persist] [--one-shot] [--dry-run] [--labels "bug,ui"]
--persist- Keep open after actions (for scratchpads/tmux popups)--one-shot- Exit after selection (default)
Keys: <CR> maximize | ^y copy | ^o open | ^t new ticket | ^g create MR | ^c checkout | ^s sort | ^r refresh
Create Jira tickets with interactive prompts.
create-jira-ticket # Interactive
create-jira-ticket --summary "Fix bug" # Quick
create-jira-ticket --slack-url URL # Link to SlackOne-shot workflow: staged changes → branch → commit → MR.
oneshot # Interactive
oneshot PROJ-1234 # Use ticket
oneshot https://slack... # From Slack threadCreate GitLab MRs with Jira integration.
publish-changes # Interactive
publish-changes PROJ-1234 # With ticket
publish-changes --draft # Draft MRRecent branches with Jira info.
r # Recent local branches
r -o # Remote branches
r -r # Refresh cacheKeys: ^l load more | ^o toggle local/remote
Interactive file finder/editor.
Keys: <CR> nvim | ^o cursor | ^s shell | ^r refresh | ^c copy path
Unstage two WIP commits, keeping oldest staged.
Apply staged changes to a commit via fixup+autosquash.
apply_staged_to_commit <commit-sha>The shell/dev-workflow.zsh provides:
Ctrl+G- Commit message history widget (with^f/^x/^r/^ofor conventional commit types)
gcm "message"- Commit with message (saves to history)nvgcm "message"- Commit without verification hooks
Commits:
wip- Quick WIP commit (no hooks)gca- Amend last commit (no edit)reword- Amend commit message
Branches:
r- Recent branches (uses rr.sh)gc- Switch branch with previewgcb- Create and checkout branch
Reset:
soft/so- Soft reset HEAD~1 + unstagerho/gr/gru- Hard reset to upstream
Stash:
gs- Stash changesgsk- Stash with untrackedgsp- Stash popswip- Add all + WIP + status
Fetch/Pull:
p/pull- Pull changesgf- Fetch all remotesgfpa- Fetch with prune
Rebase:
grom- Rebase onto origin/maingfgrom- Fetch + rebase origin/maingrc- Continue rebasegra- Abort rebase
Cherry-pick:
gcpc- Continue cherry-pickgcpa- Abort cherry-pick
Other:
push/mush- Push changesos- Alias for oneshot
"JIRA_EMAIL and JIRA_API_TOKEN must be set"
→ Create .env from .env.example
"glab CLI not found" → Install from https://gitlab.com/gitlab-org/cli
Jira tickets not showing
→ Check credentials, verify JIRA_PROJECT, try r -r