| name | isq |
| description | Use the isq CLI for instant, offline-first GitHub, Linear, and JIRA issue management. Use this skill when the user wants to list issues, create issues, comment on issues, start working on an issue (creates git worktree), manage goals (milestones/projects), sync repositories, or work with issues offline. isq provides sub-millisecond reads from a local SQLite cache and integrates with git worktrees for seamless development workflows. |
isq CLI
A CLI for GitHub, Linear, and JIRA issues. Instant. Offline-first.
Installation
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.
Why isq is Fast
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
Core Commands
Link a Repository
Before using isq, link your repo to GitHub, Linear, or JIRA:
isq link github
isq link linear
isq link linear -o list-teams
isq link linear -o team=ENG
isq link linear -o reauth -o team=ENG
isq link jira
For JIRA, you can also use options to select a specific project:
isq link jira -o list-projects
isq link jira -o project=MYPROJ
Linear multi-workspace/account note:
- Credentials are repo-scoped for Linear.
- Use
-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.
Sync Issues
Manually sync issues from the remote:
isq sync
The daemon also syncs automatically in the background.
List Issues
isq issue list
isq issue list --state=open
isq issue list --state=closed
isq issue list --label=bug
isq issue list --mine
isq issue list --unassigned
isq issue list --goal "v1"
isq issue list --id 7,12,45
isq issue list --sort newest
isq issue list --sort updated
isq issue list --label=bug --state=open
isq issue list --json
isq issue list --tree
isq issue list --root-only
isq issue list --children-of 42
Note: --id gives a compact list view of specific issues. Use isq issue show <id> for full details including description and comments.
Show Issue Details
isq issue show 423
isq issue show 423 --json
Create Issues
isq issue create --title "Fix login bug"
isq issue create --title "Add feature" --body "Description here"
isq issue create --title "Bug" --label=bug
Edit Issue Fields
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 "..."
Priority scale:
0 urgent
1 high
2 medium
3 low
4 none
Forge notes:
- Linear supports priority updates directly.
- JIRA supports priority updates for
0..3 (no explicit none equivalent).
- GitHub has no native issue priority update via API; use labels/config mapping.
Comment on Issues
isq issue comment 423 "Fixed in commit abc123"
Close and Reopen
isq issue close 423
isq issue reopen 423
Manage Labels
isq issue label 423 add bug
isq issue label 423 remove bug
Assign Users
isq issue assign 423 username
Label Commands
List and create repository labels (for discovery and priority setup):
isq label list
isq label list --json
isq label create P0 --color ff0000
isq label create P1 --color orange --description "High priority"
Development Workflow
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.
Start Working on an Issue
isq start 891
This command:
- Creates a git worktree at
~/src/myapp-891-fix-auth-timeout
- Creates a branch named
891-fix-auth-timeout
- Marks the issue as in-progress (adds labels on GitHub, transitions state on Linear)
- Runs any setup script defined in
.config/isq.toml
Show Current Issue
isq
isq current
isq current -q
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
Automatic Commit References
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"
Clean Up
When done with an issue (PR merged, etc.):
isq cleanup
isq cleanup --keep
Cleanup undoes what isq start did:
- GitHub: Removes labels added on start (e.g., "in progress")
- Linear/JIRA: Can transition issue back to a state (e.g., "backlog")
Configure in .config/isq.toml:
[on_cleanup]
remove_labels = ["in progress"]
Goal Commands
Goals are time-bound containers for issues. They map to GitHub Milestones and Linear Projects.
List Goals
isq goal list
isq goal list --state=closed
isq goal list --state=all
isq goal list --json
Show Goal Details
isq goal show "v1"
isq goal show "v1" --json
Create Goals
isq goal create "v1"
isq goal create "v1" --target 2026-02-01
isq goal create "v1" --target 2026-02-01 --body "First public release"
Assign Issues to Goals
isq goal assign 423 "v1"
Close Goals
isq goal close "v1"
Daemon Commands
The daemon syncs issues in the background and enables instant reads.
isq daemon start
isq daemon stop
isq daemon status
Diagnostics and Updates
isq doctor
isq doctor --verbose
isq doctor --check auth
isq update check
isq update install
Other Commands
isq status
isq unlink
isq logout github
Offline Support
When offline, write operations queue locally and sync when back online:
isq issue create --title "New issue"
isq daemon status
JSON Output
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 (Saved Filters)
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
isq view create my-bugs --label=bug --state=open --mine --priority-lte=2
isq view create stale --unassigned --updated-before="30 days"
isq view create triage --state=open --unassigned --label-not=wontfix
Use a View
Reference views with @ prefix in issue list:
isq issue list @my-bugs
isq issue list @stale
isq issue list @triage
Views can be combined with additional flags (CLI flags override view settings):
isq issue list @my-bugs --label=security
isq issue list @triage --json
Manage Views
isq view list
isq view show my-bugs
isq view delete stale
Available View Filters
| 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 |
User Defaults
You can also set default JSON output mode in your config:
[defaults]
json = true
Command Reference
| 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 |
Guidance
- Prefer the CLI for all issue operations rather than calling GitHub/Linear APIs directly
- Use
isq start when beginning work on an issue—it sets up the worktree and tracks context automatically
- NEVER manually create branches with
git checkout -b when starting issue work—always use isq start <id> instead, then cd into the created worktree
- NEVER remove or clean up worktrees created by
isq start—they are the intended working environment
- Use
--json when you need structured output for further processing
- Reads are instant because they come from the local cache—no need to worry about API rate limits for queries
- Writes go directly to the API when online, or queue locally when offline
- The daemon is optional but recommended—it keeps the cache fresh automatically
Common Workflows
Initial Setup
cd /path/to/your/repo
isq link github
isq sync
isq daemon start
Feature Development
isq issue list --state=open --label=feature
isq start 891
isq cleanup
Daily Issue Triage
isq issue list --state=open --label=bug
isq issue show 423
isq issue comment 423 "Looking into this"
isq issue close 423
Working Offline
isq issue list
isq issue create --title "Idea"
isq daemon status
Finding What to Work On
When users ask "what should I work on?" or similar, use these patterns.
Understanding Priority
Issues have priority levels (shown in JSON output):
0 / urgent — Drop everything, fix now
1 / high — Important, do soon
2 / medium — Normal priority
3 / low — Nice to have
4 / none — No priority set
Issues 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
P1 = 1
bug = 1
P2 = 2
P3 = 3
Pre-assigned Teams
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.
Pull-from-Backlog Teams
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
Not Sure Which Model?
Ask: "Does your team pre-assign issues, or do you pull from a shared backlog?"
Example Workflow: "What Should I Work On?"
isq issue list --mine --json
isq start <id>
isq issue list --goal "Current Sprint" --unassigned --json
isq issue assign <id> <username>
isq start <id>
Setting Up Priority (GitHub)
If priority labels aren't configured for a GitHub repo:
- Check existing labels:
isq label list
- Either map existing labels to priorities in
.config/isq.toml
- Or create priority labels:
isq label create P0 --color ff0000
Example configuration:
[priority]
P0 = 0
P1 = 1
bug = 1
P2 = 2
P3 = 3
Troubleshooting
General Diagnosis
isq doctor
isq doctor --verbose
Daemon Not Starting
isq daemon status
launchctl stop com.isq.daemon
isq daemon start
Stale Cache
isq sync
Check What's Linked
isq status