Issues & Linear
Issues are a first-class concept in jig. Well-scoped tickets are the input to agent work — jig issues and jig spawn --issue integrate issue tracking directly into the spawn pipeline.
Why first-class issues?
Instead of copy-pasting ticket descriptions into agent prompts, jig fetches them for you:
jig spawn auth-jwt --issue ENG-123```
The agent gets the full issue description as its working context. The daemon can auto-spawn workers from your issue board. Dependencies between issues control spawn order. It's the bridge between your planning workflow and parallel agent execution.
## Setup
### 1. Create an API key
Go to **Linear > Settings > API > Personal API keys** and create a key.
### 2. Add it to global config
```toml
# ~/.config/jig/config.toml
[linear.profiles.work]
api_key = "lin_api_xxxxxxxxxxxx"
team = "ENG" # default team filter
projects = ["Backend", "Platform"] # default project filter
assignee = "me" # "me" = API key owner
labels = ["auto"] # default label filter
API keys live in global config — never in committed files.
3. Point your repo at Linear
# jig.toml
[issues]
provider = "linear"
[issues.linear]
profile = "work"
# team = "ENG" # override profile default
# projects = ["Backend"] # narrow profile default
Per-repo fields override profile-level defaults.
Multiple profiles
For multiple Linear workspaces:
# ~/.config/jig/config.toml
[linear.profiles.work]
api_key = "lin_api_xxxxxxxxxxxx"
[linear.profiles.oss]
api_key = "lin_api_yyyyyyyyyyyy"
Reference by name: profile = "oss".
Profile-level filters
Profiles carry default filters so you don’t repeat config in every repo:
[linear.profiles.work]
api_key = "lin_api_xxxxxxxxxxxx"
team = "ENG"
projects = ["Backend", "Platform"]
assignee = "me"
labels = ["auto"]
Per-repo jig.toml overrides these:
| Field | Resolution |
|---|---|
team |
jig.toml > profile > (error if missing) |
projects |
jig.toml > profile > (no filter) |
assignee |
jig.toml > profile > (no filter) |
labels |
jig.toml > profile > (no filter) |
assignee = "me" resolves to the API key owner via Linear’s viewer query.
Day-to-day usage
# Browse issues
jig issues
# Filter
jig issues --status planned --priority high
jig issues --category Backend
jig issues --label backend --label sprint-1
# View a ticket
jig issues ENG-123
# Spawn with full Linear context
jig spawn auth-jwt --issue ENG-123```
### Creating issues
```bash
jig issues create "Fix auth crash" \
--body "Stack trace shows null pointer in session handler" \
--priority high \
--label backend --label bug \
--category Backend
# Body from stdin
echo "detailed description" | jig issues create "Fix auth crash" --body -
# Create as sub-issue
jig issues create "Review data model" --parent ENG-19
Managing dependencies
# Add blockers
jig issues update ENG-22 --blocked-by ENG-21
jig issues update ENG-22 --blocked-by ENG-21,ENG-24
# Remove a blocker
jig issues update ENG-22 --remove-blocked-by ENG-21
# View (shown in single issue view)
jig issues ENG-22
# Blocked by: ENG-21, ENG-24
Updating issues
# Append to description
jig issues update ENG-123 --body "## Findings..." --append
# Change status
jig issues status ENG-123 backlog
jig issues status ENG-123 planned
# Set/remove parent
jig issues update ENG-21 --parent ENG-19
jig issues update ENG-21 --remove-parent
Auto-spawn
The daemon automatically spawns workers for issues in Planned status with all dependencies satisfied.
Labels
Labels are fetched from Linear’s native label system. Filter with --label:
jig issues --label backend # issues with "backend" label
jig issues --label backend --label sprint-1 # must have BOTH labels
Triage
The daemon can auto-triage new issues. When an issue enters Linear’s Triage status, jig spawns a lightweight read-only agent to investigate the codebase and enrich the issue.
[triage]
enabled = true
model = "sonnet"
timeout_seconds = 600
How it works
- Issue enters Triage status in Linear
- Daemon spawns a one-shot subprocess agent (no worktree, no tmux)
- Agent reads the codebase with restricted tools (
Read,Glob,Grep,Bash(jig *)) - Agent appends structured findings to the issue description
- Agent transitions the issue to Backlog
- Human reviews the enriched issue and decides next steps
The triage agent produces a structured analysis: affected files, proposed approach, complexity assessment, suggested priority, and risks. This gets appended to the Linear issue body.
Triage vs spawn
| Triage | Spawn | |
|---|---|---|
| Trigger | Issue in Triage status | Issue in Planned status |
| Execution | One-shot subprocess | Persistent tmux session |
| Worktree | None | Dedicated git worktree |
| Tools | Read-only | Full access |
| Output | Updates issue description | Commits code, opens PR |
| Duration | Minutes | Hours to days |
An issue flows: Triage → Backlog → (human promotes) → Planned → Spawn.
Status mapping
| Linear state type | jig status |
|---|---|
triage |
Triage |
backlog |
Backlog |
unstarted |
Planned |
started |
In Progress |
completed |
Complete |
canceled |
Complete |
Priority mapping
| Linear priority | jig priority |
|---|---|
| 1 (Urgent) | Urgent |
| 2 (High) | High |
| 3 (Normal) | Medium |
| 4 (Low) | Low |
| 0 (None) | (omitted) |
Troubleshooting
“Linear profile ‘X’ not found” — Check spelling in jig.toml against ~/.config/jig/config.toml profile names.
No issues returned — Verify the team key matches your Linear team key (e.g. ENG, not the full name). Check projects if set.
Authentication errors — Regenerate your API key from Linear settings.