Config-driven Jira-to-PR pipeline powered by Claude Code. Polls Jira for "In Progress" tickets, gathers context (issue details, images, videos, Figma specs), implements the feature using headless Claude, runs tests, commits, pushes, creates PR, and moves Jira to Code Review. All automated on a VPS.
Jira (In Progress) → VPS (Claude Code) → PR + Code Review
↑ ↓
You plan & Implements,
assign tickets tests, pushes
Two deployment modes. Pick based on whether you want the workflow on a remote VPS or on your own Mac.
git clone https://github.com/tomdwipo/auto-workflow.git
cd auto-workflow
cp setup-template.yaml my-setup.yaml
nano my-setup.yaml # Add Jira + Git credentials (+ VPS if remote)Remote VPS (always-on, credentials on the server):
./install.sh my-setup.yamlThe installer SSHs into your VPS, installs deps, and wires up a cron scheduler.
Local Mac (credentials stay on your device, runs while Mac is awake):
./install.sh my-setup.yaml --localThe installer sets up everything locally with a launchd agent — no SSH, no remote server.
| Local Mac | Remote VPS | |
|---|---|---|
| Credentials stored | On your Mac only | On the VPS |
| Runs when Mac sleeps | No | Yes |
| Scheduler | launchd (~/Library/LaunchAgents) |
cron |
| Needs SSH / remote server | No | Yes |
| Best for | Solo dev, security-conscious | 24/7 automation |
| Type | Test Command | Extra Setup |
|---|---|---|
| Android | ./gradlew testDebugUnitTest |
Java 17 + Android SDK (auto-installed) |
| Node.js | npm test |
None |
| Python | pytest |
None |
| Go | go test ./... |
None |
| React | npm test -- --watchAll=false |
None |
| iOS | xcodebuild test |
Xcode on VPS (manual) |
See docs/examples/ for ready-to-use config snippets.
Both modes follow the same 10 steps; the only differences are where files go and which scheduler is used.
- Reads your YAML config + env var overrides
- Installs dependencies (git, node, yq, ffmpeg, Claude Code, etc.)
- Installs MCP servers (Jira, Bitbucket/GitHub, Figma, video-to-image)
- Clones your project repo (skipped if
project.local_diralready exists in--localmode) - Generates
workflow-config.yaml→ deploys - Generates
.mcp.jsonwith your API tokens → deploys (chmod 600 in local mode) - Deploys workflow scripts + safety hooks
- Sets up scheduler — cron (VPS) or launchd (local,
~/Library/LaunchAgents/com.tomdwipo.auto-workflow.plist) - Runs verification (23 checks local / 22 checks VPS)
- Prints next-step instructions
Native SwiftUI app at app/VPSController/ — control the pipeline from your iPhone.
- Dashboard: status, enable/disable, trigger, ticket list
- Terminal: execute commands, run Claude prompts
- Plan Feature: interactive planning → breakdown → Jira task creation
- TRD Builder: build Technical Requirements Documents via chat
Open app/VPSController/VPSController.xcodeproj in Xcode, enter your VPS host in Settings — it auto-detects project config from VPS.
HUMAN MACHINE HUMAN
───── ─────── ─────
Plan & → Implement → Code Review
Assign Test & Push Merge (human only)
Tickets Create PR QA & Release
The machine never merges PRs. You control what gets planned, what gets started, and what ships.
See docs/ARCHITECTURE.md for the full pipeline, MCP servers, per-ticket state, retry logic, and safety hooks.
| Component | Version |
|---|---|
| VPS | Ubuntu 22+ / Debian 12+ (or any Linux with apt/dnf) |
| Mac | For running install.sh + iOS app |
| SSH | Key-based auth (recommended) or password |
| Claude Code | Pro/Team plan (auto-installed) |
| Jira | Cloud with API token |
| Git | Bitbucket or GitHub with app password/PAT |
Secrets can be passed via env vars instead of putting them in the YAML:
JIRA_API_TOKEN=xxx GIT_APP_PASSWORD=yyy ./install.sh my-setup.yaml| Variable | Overrides |
|---|---|
JIRA_API_TOKEN |
jira.api_token |
GIT_APP_PASSWORD |
git.app_password |
FIGMA_TOKEN |
figma.access_token |
VPS_PASSWORD |
SSH password (use key auth instead) |
After setup, the same ~/w helper controls both modes.
Local Mac:
bash ~/w on # Enable
bash ~/w off # Disable
bash ~/w s # JSON status
bash ~/w tickets # Human-readable status
bash ~/w run # Trigger now
bash ~/w log 30 # Last 30 log lines
bash ~/w rerun XX-1 # Retry a ticketPause / resume the scheduler:
launchctl unload ~/Library/LaunchAgents/com.tomdwipo.auto-workflow.plist # pause
launchctl load ~/Library/LaunchAgents/com.tomdwipo.auto-workflow.plist # resume
launchctl list | grep com.tomdwipo.auto-workflowRemote VPS:
ssh your-vps "bash ~/w on" # Enable
ssh your-vps "bash ~/w off" # Disable
ssh your-vps "bash ~/w s" # JSON status
ssh your-vps "bash ~/w tickets" # Human-readable status
ssh your-vps "bash ~/w run" # Trigger now
ssh your-vps "bash ~/w log 30" # Last 30 log lines
ssh your-vps "bash ~/w rerun XX-1" # Retry a ticket| Document | Description |
|---|---|
| docs/ARCHITECTURE.md | Pipeline design, MCP servers, per-ticket state, safety hooks |
| docs/SETUP_GUIDE.md | Credential setup, install steps, troubleshooting |
| workflow/README.md | Script details, standalone deployment without install.sh |
| docs/examples/ | Config snippets: Android, Node.js, Python, Go, React |
| CLAUDE.md | Developer guidance for Claude Code |
MIT