npx claudepluginhub camwest/isq --plugin isqThis skill uses the workspace's default tool permissions.
A CLI for GitHub, Linear, and JIRA issues. Instant. Offline-first.
Manages full GitHub issue lifecycle: create with conventional commit titles, sub-issues, cross-repo links, edit/view/list, dump trees to markdown/YAML, push from files, comment/label/close.
Manages Linear issues, projects, and teams using MCP tools, linear CLI, and GraphQL API. Create, update, query issues; handle labels, status, references, and backlogs.
Manages backlog items synced to GitHub Issues via MCP tools. Create, list, view, update, close, resolve, groom, and sync without direct file edits.
Share bugs, ideas, or general feedback.
A CLI for GitHub, Linear, and JIRA issues. Instant. Offline-first.
Before using any isq commands, verify isq is installed:
isq --version
If the command fails or isq is not found, install it:
curl -LsSf https://cameronwestland.com/isq/install.sh | sh
After installation, verify it succeeded by running isq --version again.
Note: macOS and Linux only. Windows is not supported.
isq syncs issues to a local SQLite database. All reads come from this cache—no network round-trip. A background daemon keeps the cache fresh automatically.
CLI reads → Local SQLite (instant, <1ms)
CLI writes → API directly (then cached)
Daemon → Syncs in background every 15s
Before using isq, link your repo to GitHub, Linear, or JIRA:
isq link github # Link current repo to GitHub Issues
isq link linear # Link current repo to Linear (current auth context)
isq link linear -o list-teams # List teams in current Linear auth context
isq link linear -o team=ENG # Link specific Linear team
isq link linear -o reauth -o team=ENG # Force fresh Linear auth for this repo
isq link jira # Link current repo to JIRA Cloud
For JIRA, you can also use options to select a specific project:
isq link jira -o list-projects # List available JIRA projects
isq link jira -o project=MYPROJ # Link to specific project
Linear multi-workspace/account note:
-o reauth when a repo must bind to a different Linear account/workspace than another repo.Linking also installs a git commit hook that auto-appends issue references to commits.
Manually sync issues from the remote:
isq sync
The daemon also syncs automatically in the background.
isq issue list # All issues (sorted by priority)
isq issue list --state=open # Open issues only
isq issue list --state=closed # Closed issues only
isq issue list --label=bug # Filter by label
isq issue list --mine # Issues assigned to me
isq issue list --unassigned # Issues with no assignee
isq issue list --goal "v1" # Issues in a goal/milestone
isq issue list --id 7,12,45 # Filter by specific issue IDs
isq issue list --sort newest # Sort by issue number (newest first)
isq issue list --sort updated # Sort by last updated
isq issue list --label=bug --state=open # Combine filters
isq issue list --json # JSON output
isq issue list --tree # Show as parent-child hierarchy
isq issue list --root-only # Only top-level issues (no parents)
isq issue list --children-of 42 # Children of issue #42 for scripts
Note: --id gives a compact list view of specific issues. Use isq issue show <id> for full details including description and comments.
isq issue show 423 # Show issue #423
isq issue show 423 --json # JSON output
isq issue create --title "Fix login bug"
isq issue create --title "Add feature" --body "Description here"
isq issue create --title "Bug" --label=bug
isq issue edit 423 --title "Refined issue title"
isq issue edit 423 --body "Updated description"
cat summary.md | isq issue edit 423 --body -
isq issue edit 423 --priority 2
isq issue update 423 --title "..." # Alias for edit
Priority scale:
0 urgent1 high2 medium3 low4 noneForge notes:
0..3 (no explicit none equivalent).isq issue comment 423 "Fixed in commit abc123"
isq issue close 423
isq issue reopen 423
isq issue label 423 add bug
isq issue label 423 remove bug
isq issue assign 423 username
List and create repository labels (for discovery and priority setup):
isq label list # List all repo labels
isq label list --json # JSON output
isq label create P0 --color ff0000 # Create a label
isq label create P1 --color orange --description "High priority"
isq integrates with git worktrees so your filesystem becomes your context. Each worktree is associated with an issue—no need to track issue IDs manually.
isq start 891
This command:
~/src/myapp-891-fix-auth-timeout891-fix-auth-timeout.config/isq.tomlisq # Show current issue with full details
isq current # Just the issue number (for scripts)
isq current -q # Quiet mode: no output if no issue, exit code 1
When in a worktree, isq (no args) shows the associated issue:
#891 Auth timeout on slow connections open
───────────────────────────────────────────────────────────────────
Connections time out after 30s on slow networks...
Branch: 891-fix-auth-timeout
Worktree: ~/src/myapp-891-fix-auth-timeout
When you commit in a worktree with an associated issue, the commit message automatically gets the issue reference appended:
git commit -m "Fix connection pool sizing"
# Becomes: "Fix connection pool sizing [#891]"
When done with an issue (PR merged, etc.):
isq cleanup # Remove worktree, clear association, and clean up issue state
isq cleanup --keep # Keep worktree directory, just clear association
Cleanup undoes what isq start did:
Configure in .config/isq.toml:
[on_cleanup]
remove_labels = ["in progress"] # GitHub
# transition = "backlog" # Linear/JIRA
Goals are time-bound containers for issues. They map to GitHub Milestones and Linear Projects.
isq goal list # Open goals (default)
isq goal list --state=closed # Closed goals
isq goal list --state=all # All goals
isq goal list --json # JSON output
isq goal show "v1" # Show goal by name
isq goal show "v1" --json # JSON output
isq goal create "v1"
isq goal create "v1" --target 2026-02-01
isq goal create "v1" --target 2026-02-01 --body "First public release"
isq goal assign 423 "v1" # Assign issue #423 to goal "v1"
isq goal close "v1"
The daemon syncs issues in the background and enables instant reads.
isq daemon start # Start the background daemon
isq daemon stop # Stop the daemon
isq daemon status # Check daemon status and watched repos
isq doctor # Diagnose common issues and suggest fixes
isq doctor --verbose # Show detailed diagnostics
isq doctor --check auth # Run specific check (auth, repo, sync, service, database, network)
isq update check # Check if a newer version is available
isq update install # Download and install the latest version
isq status # Show auth, sync health, and daemon status
isq unlink # Remove link and commit hook from current repo
isq logout github # Remove stored credentials for a forge
When offline, write operations queue locally and sync when back online:
# Works offline - queues the operation
isq issue create --title "New issue"
# Output: ✓ Queued: New issue (offline, 8ms)
# When back online, daemon syncs automatically
isq daemon status
# Output: ✓ Synced 2 pending operations
All commands support --json for machine-readable output. Use this for scripts and AI agent workflows:
isq issue list --json
isq issue show 423 --json
isq issue create --title "Bug" --json
isq status --json
Views are named filter combinations that save you from typing repetitive flags. They're stored in your user config (~/.config/isq/config.toml) and work across all repositories.
# Create a view for high-priority bugs assigned to me
isq view create my-bugs --label=bug --state=open --mine --priority-lte=2
# Create a view for stale unassigned issues
isq view create stale --unassigned --updated-before="30 days"
# Create a view for backlog triage
isq view create triage --state=open --unassigned --label-not=wontfix
Reference views with @ prefix in issue list:
isq issue list @my-bugs # Expands to: --label=bug --state=open --mine --priority-lte=2
isq issue list @stale # Expands to: --unassigned --updated-before="30 days"
isq issue list @triage # Expands to: --state=open --unassigned --label-not=wontfix
Views can be combined with additional flags (CLI flags override view settings):
isq issue list @my-bugs --label=security # Overrides label from view
isq issue list @triage --json # Adds json output
isq view list # List all views
isq view show my-bugs # Show view details
isq view delete stale # Delete a view
| Flag | Description | Example |
|---|---|---|
--label | Include issues with this label | --label=bug |
--label-not | Exclude issues with this label | --label-not=wontfix |
--label-any | Include issues with any of these labels (comma-separated) | --label-any=bug,security |
--state | Filter by state | --state=open |
--mine | Issues assigned to me | --mine |
--unassigned | Issues with no assignee | --unassigned |
--goal | Issues in a goal/milestone | --goal="v1" |
--priority | Exact priority match | --priority=1 |
--priority-lte | Priority ≤ value (0=urgent, 1=high, ...) | --priority-lte=2 |
--priority-gte | Priority ≥ value | --priority-gte=2 |
--updated-before | Not updated in duration | --updated-before="30 days" |
--updated-after | Updated within duration | --updated-after="7 days" |
--created-before | Created before duration | --created-before="90 days" |
--created-after | Created within duration | --created-after="7 days" |
--sort | Sort order | --sort=updated |
You can also set default JSON output mode in your config:
# ~/.config/isq/config.toml
[defaults]
json = true # All commands output JSON by default
| Command | Description |
|---|---|
isq link <github|linear|jira> | Link repo to backend, install commit hook. Linear supports -o team=..., -o list-teams, -o reauth |
isq unlink | Remove link and commit hook |
isq logout <forge> | Remove stored credentials from local credential store (Linear clears global + scoped credentials) |
isq status | Show auth, sync health, and daemon status |
isq doctor | Diagnose common issues and suggest fixes (--verbose, --check) |
isq sync | Manually sync issues and goals |
isq update check | Check if a newer version is available |
isq update install | Download and install the latest version |
isq start <id> | Create worktree, branch, mark issue in-progress |
isq current | Show current issue number (-q for scripts) |
isq cleanup | Remove worktree, clear association, clean up issue state (--keep to preserve) |
isq issue list | List issues (--label, --state, --mine, --tree, --root-only, --children-of, --json) |
isq issue list --id 7,12 | Filter to specific issue IDs (compact view) |
isq issue list --mine | Show only issues assigned to me |
isq issue list --unassigned | Show only unassigned issues |
isq issue list --goal "X" | Filter to issues in goal/milestone X |
isq issue list --sort priority | Sort by priority (default) |
isq issue list --sort newest | Sort by issue number (newest first) |
isq issue list --sort updated | Sort by last updated |
isq issue list --tree | Display as hierarchical tree (indented by parent-child) |
isq issue list --root-only | Show only root issues (no parent) |
isq issue list --children-of 42 | Show only children of issue #42 |
isq issue show <id> | Show issue details |
isq issue create --title "..." | Create new issue |
isq issue edit <id> [--title] [--body] [--priority] | Edit mutable issue fields (update alias) |
isq issue comment <id> "..." | Add comment |
isq issue close <id> | Close issue |
isq issue reopen <id> | Reopen issue |
isq issue label <id> add|remove <label> | Manage labels on an issue |
isq issue assign <id> <user> | Assign user |
isq label list | List all labels in the repository |
isq label create <name> | Create a label (--color, --description) |
isq goal list | List goals (--state, --json) |
isq goal show <name> | Show goal details |
isq goal create <name> | Create goal (--target, --body) |
isq goal assign <issue> <goal> | Assign issue to goal |
isq goal close <name> | Close goal |
isq view create <name> | Create a view (--label, --state, --mine, --priority-lte, etc.) |
isq view list | List all views |
isq view show <name> | Show view details |
isq view delete <name> | Delete a view |
isq issue list @<view> | Use a view in issue list |
isq daemon start | Start background daemon |
isq daemon stop | Stop daemon |
isq daemon status | Check daemon status |
isq start when beginning work on an issue—it sets up the worktree and tracks context automaticallygit checkout -b when starting issue work—always use isq start <id> instead, then cd into the created worktreeisq start—they are the intended working environment--json when you need structured output for further processingcd /path/to/your/repo
isq link github # or: isq link linear, isq link jira
# For different Linear workspace/account per repo:
# isq link linear -o reauth -o team=ENG
isq sync # Initial sync
isq daemon start # Start background sync
# Find an issue to work on
isq issue list --state=open --label=feature
# Start working (creates worktree, branch, marks in-progress)
isq start 891
# Work on the feature...
# Commits auto-reference the issue: "Add feature [#891]"
# When done, clean up
isq cleanup
isq issue list --state=open --label=bug
isq issue show 423
isq issue comment 423 "Looking into this"
isq issue close 423
# On a plane, no internet
isq issue list # Works! Reads from cache
isq issue create --title "Idea" # Queues locally
# Back online
isq daemon status # Shows pending ops synced
When users ask "what should I work on?" or similar, use these patterns.
Issues have priority levels (shown in JSON output):
0 / urgent — Drop everything, fix now1 / high — Important, do soon2 / medium — Normal priority3 / low — Nice to have4 / none — No priority setIssues are sorted by priority by default. Always recommend highest priority first.
Linear: Priority is native (works out of box).
GitHub: Priority requires explicit [priority] config in .config/isq.toml:
[priority]
P0 = 0 # urgent
P1 = 1 # high
bug = 1 # treat bugs as high priority
P2 = 2 # medium
P3 = 3 # low
If issues are assigned during sprint planning, find the user's top priority work:
isq issue list --mine --json
Recommend the highest priority assigned issue.
If the team pulls from a shared backlog:
isq issue list --goal "Sprint 5" --unassigned --json
Recommend the highest priority unassigned issue, then assign and start:
isq issue assign 42 username
isq start 42
Ask: "Does your team pre-assign issues, or do you pull from a shared backlog?"
# Pre-assigned model
isq issue list --mine --json
# Look at top result (highest priority)
# Recommend it to user
isq start <id>
# Pull model
isq issue list --goal "Current Sprint" --unassigned --json
# Look at top result
# Recommend it, then:
isq issue assign <id> <username>
isq start <id>
If priority labels aren't configured for a GitHub repo:
isq label list.config/isq.tomlisq label create P0 --color ff0000Example configuration:
# .config/isq.toml
[priority]
P0 = 0
P1 = 1
bug = 1
P2 = 2
P3 = 3
isq doctor # Check auth, repo, sync, service, database, network
isq doctor --verbose # Show detailed diagnostics
isq daemon status
# If stuck on macOS:
launchctl stop com.isq.daemon
isq daemon start
isq sync # Force manual sync
isq status