Sync Commands
Commands for running synchronization between JPD and GitHub.
dev Command
The main sync command that creates and updates GitHub issues from JPD.
Basic Usage
pnpm run dev
Performs full synchronization:
- Fetches issues from JPD
- Fetches existing GitHub issues
- Creates new GitHub issues
- Updates existing GitHub issues
- Syncs status changes
- Syncs comments (if enabled)
Dry-Run Mode
Preview changes without making them:
pnpm run dev -- --dry-run
What dry-run does:
- Fetches all data from both systems
- Calculates what would change
- Shows detailed plan of operations
- Does not create or modify anything
Always run dry-run first:
- Before first sync
- After configuration changes
- When testing new field mappings
- To verify behavior
Output Format
Standard Sync Output
Gluecraft JPD Sync
==================
Connecting to services...
→ JPD: https://acme-corp.atlassian.net
→ GitHub: acme-corp/product-roadmap
Fetching data...
✓ Fetched 25 JPD issues
✓ Fetched 10 existing GitHub issues
Synchronizing...
→ Creating MTT-1: Mobile App Redesign
✓ Created issue #45
→ Updating MTT-5 (existing #48)
✓ Updated status
✓ Added labels: priority:high
→ Skipping MTT-3 (unchanged)
Summary
-------
Created: 15 issues
Updated: 5 issues
Skipped: 5 issues
Duration: 45 seconds
Dry-Run Output
Gluecraft JPD Sync (DRY RUN)
============================
Would create 15 new GitHub issues:
MTT-1: Mobile App Redesign
Title: [MTT-1] Mobile App Redesign
Labels: type:epic, theme:mobile, priority:high
MTT-2: Implement New Navigation
Title: [MTT-2] Implement New Navigation
Labels: type:story, epic:MTT-1, priority:high
Would update 5 existing issues:
#48 (MTT-5): Status change: In Progress → open
#49 (MTT-7): Add labels: theme:mobile
Would skip 5 unchanged issues:
MTT-3, MTT-4, MTT-6, MTT-8, MTT-9
No changes made (dry-run mode)
Command Options
--dry-run
Preview without making changes:
pnpm run dev -- --dry-run
Use cases:
- Verify configuration changes
- See what will be synced
- Test field mappings
- Check label generation
--config PATH
Use alternate configuration file:
pnpm run dev -- --config config/prod-config.yaml
Or use environment variable:
CONFIG_PATH=config/prod.yaml pnpm run dev
--filter JQL
Override JQL filter from config:
pnpm run dev -- --filter "project = MTT AND created >= -7d"
Useful for:
- Testing specific issues
- Partial syncs
- Debugging
--force
Skip caches and force full sync:
pnpm run dev -- --force
What it does:
- Bypasses connection cache
- Recalculates all sync hashes
- Forces re-evaluation of all issues
When to use:
- After major configuration changes
- When cache seems stale
- Troubleshooting sync issues
Sync Behavior
What Gets Synced
Issues synced when:
- Status matches hierarchy criteria (if configured)
- Passes JQL filter
- Has changed since last sync
- Doesn't exist in GitHub yet
Issues skipped when:
- Already synced and unchanged
- Status doesn't match hierarchy
- Filtered out by JQL
- No changes detected (hash unchanged)
Change Detection
The connector uses sync hashes to detect changes:
<!-- jpd-sync-metadata
issue_key: MTT-1
sync_hash: abc123def456
last_synced: 2024-12-30T10:30:00Z
-->
Hash includes:
- Issue title and description
- All mapped custom fields
- Status
- Labels
- Parent relationships
Issue is updated when:
- Hash differs from last sync
- Any mapped field changed
- Status changed
- Parent relationship changed
Bidirectional Sync
When direction: bidirectional is configured:
JPD → GitHub:
- Issue creation
- Content updates
- Status changes
- Comment sync
GitHub → JPD:
- Status changes (when issue closed/reopened)
- Comment sync
sync:
direction: "bidirectional"
github_closed_status: "Done"
Performance and Rate Limits
Sync Duration
Sync speed depends on:
- Number of issues
- Number of changes
- API rate limits
- Network latency
Typical performance:
- First sync: 5-10 seconds per issue created
- Subsequent syncs: 1-2 seconds per issue updated
- Unchanged issues: Near instant (skipped)
Rate Limit Handling
The connector automatically handles rate limits:
Rate limit approaching, slowing down...
→ Waiting 2 seconds before next request
Rate limit exceeded, retrying...
→ Attempt 1/3: Waiting 5 seconds
→ Attempt 2/3: Waiting 10 seconds
Configuration:
rate_limiting:
max_retries: 3
initial_delay_ms: 1000
backoff_multiplier: 2
Batch Processing
Large syncs are processed in batches:
Processing batch 1/3 (50 issues)...
→ Created 45 issues
→ Updated 5 issues
Processing batch 2/3 (50 issues)...
Configuration:
sync:
batch_size: 50
batch_delay_ms: 2000
Error Handling
Partial Failures
If some issues fail, sync continues:
✓ Created MTT-1 → #45
✓ Created MTT-2 → #46
✗ Failed to create MTT-3: Rate limit exceeded
✓ Created MTT-4 → #47
Summary
-------
Succeeded: 3 issues
Failed: 1 issue
Failed issues:
MTT-3: Rate limit exceeded (will retry next sync)
Failed issues are automatically retried on next sync.
Fatal Errors
Sync stops on fatal errors:
✗ Fatal error: Configuration validation failed
Field customfield_10001 not found in JPD
Please fix configuration and try again.
Common fatal errors:
- Invalid configuration
- Authentication failures
- Permission denied
- Missing required fields
Monitoring and Logging
Standard Output
Enable progress indicators:
pnpm run dev
Shows:
- Connection status
- Fetch progress
- Sync operations
- Summary statistics
Debug Logging
Enable verbose logging:
DEBUG=1 pnpm run dev
Shows:
- API requests and responses
- Field transformation details
- Hash calculations
- Cache operations
Log Files
Configure log output:
logging:
file: "./logs/sync.log"
level: "info"
format: "json"
Automation and Scheduling
GitHub Actions
Run sync automatically:
.github/workflows/sync.yml:
name: JPD Sync
on:
schedule:
- cron: '*/15 * * * *' # Every 15 minutes
workflow_dispatch: # Manual trigger
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '22'
- name: Install dependencies
run: pnpm install
- name: Run sync
run: pnpm run dev
env:
JPD_BASE_URL: ${{ secrets.JPD_BASE_URL }}
JPD_EMAIL: ${{ secrets.JPD_EMAIL }}
JPD_API_KEY: ${{ secrets.JPD_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Cron Job
Run sync on a server:
# Run every 15 minutes
*/15 * * * * cd /path/to/connector && pnpm run dev
Manual Trigger
Run on-demand:
# In your terminal
pnpm run dev
# Or via curl (if webhook configured)
curl -X POST https://your-server/webhook/trigger
Troubleshooting
No Issues Synced
Check:
- JQL filter:
pnpm run dev -- --dry-run - Hierarchy configuration (if enabled)
- Field mappings
Debug:
DEBUG=1 pnpm run dev -- --dry-run
Issues Not Updating
Causes:
- No changes detected (hash unchanged)
- Field mapping errors
- Permission issues
Check sync metadata in GitHub issue body:
<!-- jpd-sync-metadata
issue_key: MTT-1
sync_hash: abc123def456
last_synced: 2024-12-30T10:30:00Z
-->
Rate Limit Errors
Symptoms:
Rate limit exceeded, retrying...
Solutions:
- Wait for automatic retry
- Reduce sync frequency
- Decrease batch size
- Check rate limit status:
pnpm run health-check
Connection Failures
Error: "Failed to connect to JPD/GitHub"
Solutions:
- Verify credentials in
.env - Check network connectivity
- Test connections:
pnpm run test-connection
Best Practices
Daily Sync Workflow
# 1. Validate configuration (quick)
pnpm run validate-config
# 2. Preview changes
pnpm run dev -- --dry-run
# 3. Review dry-run output carefully
# 4. Run actual sync
pnpm run dev
After Configuration Changes
# 1. Validate new config
pnpm run validate-config
# 2. Test with dry-run
pnpm run dev -- --dry-run
# 3. Review ALL planned changes
# 4. If safe, proceed
pnpm run dev
Production Deployment
-
Test in staging first:
CONFIG_PATH=config/staging.yaml pnpm run dev -
Monitor first production sync:
DEBUG=1 pnpm run dev -
Automate after successful test:
- Set up GitHub Actions
- Configure monitoring
- Set up alerts
Next Steps
- Validation Tools - Validate before syncing
- Common Workflows - Typical command sequences
- Configuration - Customize sync behavior
- Troubleshooting - Debug sync issues
The first sync creates many GitHub issues and can take 10-20 minutes for large projects. Subsequent syncs are much faster as they only process changed issues.