Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.mirage.strukto.ai/llms.txt

Use this file to discover all available pages before exploring further.

The Linear resource exposes Linear workspace data as a virtual filesystem mounted at some prefix such as /linear/. For API key setup, see Linear Setup.

Config

import os

from mirage import MountMode, Workspace
from mirage.resource.linear import LinearConfig, LinearResource

config = LinearConfig(api_key=os.environ["LINEAR_API_KEY"])
resource = LinearResource(config=config)
ws = Workspace({"/linear": resource}, mode=MountMode.READ)

Filesystem Layout

/linear/
  teams/
    <team-key>__<team-name>__<team-id>/
      team.json
      members/
        <display-name>__<user-id>.json
        ...
      issues/
        <issue-key>__<issue-id>/
          issue.json
          comments.jsonl
        ...
      projects/
        <name>__<project-id>.json
        ...
      cycles/
        <name>__<cycle-id>.json
        ...
Example:
/linear/
  teams/
    ENG__Engineering__abc123def/
      team.json
      members/
        alice__usr_001.json
        bob__usr_002.json
      issues/
        ENG-123__iss_001/
          issue.json
          comments.jsonl
        ENG-124__iss_002/
          issue.json
          comments.jsonl
      projects/
        Mirage__proj_001.json
      cycles/
        Sprint-12__cyc_001.json
Directory and file names embed the Linear ID after __ so that resource-specific commands can reference the correct resource without extra lookups.

Teams

Each team directory is named:
<team-key>__<team-name>__<team-id>
Inside the team directory:
  • team.json is the normalized team metadata
  • members/ contains one JSON file per member
  • issues/ contains one directory per issue
  • projects/ contains one JSON file per project, including lightweight related issue references
  • cycles/ contains one JSON file per cycle

Issues

Each issue directory is named:
<issue-key>__<issue-id>
Each issue directory contains:
  • issue.json — normalized issue metadata with command-aligned fields such as issue_id, issue_key, team_id, state_id, and assignee_id
  • comments.jsonl — normalized comment stream ordered by created_at
comments.jsonl is a Mirage representation chosen for shell-friendly workflows. It is not a native Linear file format.

Members

Each member file is named:
<display-name>__<user-id>.json
Member JSON includes command-aligned identifiers such as user_id and email so the value can be reused directly in commands like linear-issue-assign.

Projects and Cycles

Project and cycle files are named:
<name>__<id>.json
Project JSON includes lightweight related issue references. Cycle JSON includes cycle metadata such as start and end dates.

Cache

The Linear resource uses IndexCacheStore (same as Discord and other resources). There is no separate content cache — file content caching is handled by the workspace IOResult mechanism.

Example

See examples/linear/linear.py for the full working example.
# List teams
ls /linear/teams/

# Read team metadata
cat /linear/teams/ENG__Engineering__abc123/team.json

# List issues
ls /linear/teams/ENG__Engineering__abc123/issues/

# Read an issue
cat /linear/teams/ENG__Engineering__abc123/issues/ENG-123__iss_001/issue.json

# Read issue comments
cat /linear/teams/ENG__Engineering__abc123/issues/ENG-123__iss_001/comments.jsonl

# Extract issue ID with jq
cat /linear/teams/ENG__Engineering__abc123/issues/ENG-123__iss_001/issue.json \
  | jq '.issue_id'

# Read last 5 comments
tail -n 5 /linear/teams/ENG__Engineering__abc123/issues/ENG-123__iss_001/comments.jsonl

# List members
ls /linear/teams/ENG__Engineering__abc123/members/

# Read a project with its issues
cat /linear/teams/ENG__Engineering__abc123/projects/Mirage__proj_001.json \
  | jq '.issues'

# Tree view
tree -L 2 /linear/teams/

Finding IDs

IDs are embedded in directory and file names after __:
# Team ID -- embedded in directory name
ls /linear/teams/
# -> ENG__Engineering__abc123   <- team_id = abc123

# Issue ID -- embedded in issue directory name
ls /linear/teams/ENG__Engineering__abc123/issues/
# -> ENG-123__iss_001   <- issue_id = iss_001

# Member ID -- embedded in member file name
ls /linear/teams/ENG__Engineering__abc123/members/
# -> alice__usr_001.json   <- user_id = usr_001

# Use stat for structured metadata
stat /linear/teams/ENG__Engineering__abc123/issues/ENG-123__iss_001/issue.json

# Extract fields with jq
cat /linear/teams/ENG__Engineering__abc123/issues/ENG-123__iss_001/issue.json \
  | jq '{issue_id, issue_key, team_id, state_id, assignee_id}'

Shell Commands

Standard commands available on the mounted Linear tree:
CommandNotes
lsList teams, issues, members, projects
catRead .json metadata or .jsonl comments
head / tailFirst/last N lines
grep / rgPattern search (file or directory level)
jqQuery JSON fields
wcLine/word/byte counts
statFile metadata (name, size, type)
findRecursive search with -name, -maxdepth
treeDirectory tree view
basenameExtract file name from path
dirnameExtract directory from path
realpathResolve path to absolute form

Resource-Specific Commands

linear-issue-create

Create a new issue. Description can be passed via --description, --description_file, or stdin.
linear-issue-create --team_key ENG --title "New bug"
linear-issue-create --team_id abc123 --title "New bug" --description "Details here"
cat brief.md | linear-issue-create --team_key ENG --title "Agent bug"
OptionRequiredDescription
--team_id*Linear team ID
--team_key*Linear team key (e.g. ENG)
--titleyesIssue title
--descriptionnoInline description text
--description_filenoPath to file containing description
* One of --team_id or --team_key is required.

linear-issue-update

Update an existing issue. Description can be passed via --description, --description_file, or stdin.
linear-issue-update --issue_key ENG-123 --title "Updated title"
linear-issue-update --issue_id iss_001 --description "New description"
OptionRequiredDescription
--issue_id*Linear issue ID
--issue_key*Linear issue key (e.g. ENG-123)
--titlenoNew title
--descriptionnoInline description text
--description_filenoPath to file containing description
* One of --issue_id or --issue_key is required.

linear-issue-assign

Assign an issue to a user.
linear-issue-assign --issue_key ENG-123 --assignee_email "alice@example.com"
linear-issue-assign --issue_id iss_001 --assignee_id usr_001
OptionRequiredDescription
--issue_id*Linear issue ID
--issue_key*Linear issue key (e.g. ENG-123)
--assignee_id**Linear user ID
--assignee_email**User email address
* One of --issue_id or --issue_key is required. ** One of --assignee_id or --assignee_email is required.

linear-issue-transition

Transition an issue to a different workflow state.
linear-issue-transition --issue_key ENG-123 --state_name "In Progress"
linear-issue-transition --issue_id iss_001 --state_id state_001
OptionRequiredDescription
--issue_id*Linear issue ID
--issue_key*Linear issue key (e.g. ENG-123)
--state_id**Linear workflow state ID
--state_name**Workflow state name
* One of --issue_id or --issue_key is required. ** One of --state_id or --state_name is required.

linear-issue-set-priority

Set the priority of an issue.
linear-issue-set-priority --issue_key ENG-123 --priority 1
OptionRequiredDescription
--issue_id*Linear issue ID
--issue_key*Linear issue key (e.g. ENG-123)
--priorityyesPriority level (0=none, 1=urgent, 2=high, 3=medium, 4=low)
* One of --issue_id or --issue_key is required.

linear-issue-set-project

Assign an issue to a project.
linear-issue-set-project --issue_key ENG-123 --project_id proj_001
OptionRequiredDescription
--issue_id*Linear issue ID
--issue_key*Linear issue key (e.g. ENG-123)
--project_idyesLinear project ID
* One of --issue_id or --issue_key is required.

linear-issue-add-label

Add a label to an issue.
linear-issue-add-label --issue_key ENG-123 --label_id lbl_001
OptionRequiredDescription
--issue_id*Linear issue ID
--issue_key*Linear issue key (e.g. ENG-123)
--label_idyesLinear label ID
* One of --issue_id or --issue_key is required.

linear-issue-comment-add

Add a comment to an issue. Body can be passed via --body, --body_file, or stdin.
linear-issue-comment-add --issue_key ENG-123 --body "Looks good"
cat note.md | linear-issue-comment-add --issue_key ENG-123
OptionRequiredDescription
--issue_id*Linear issue ID
--issue_key*Linear issue key (e.g. ENG-123)
--body**Inline comment text
--body_file**Path to file containing body
* One of --issue_id or --issue_key is required. ** One of --body, --body_file, or stdin is required.

linear-issue-comment-update

Update an existing comment. Body can be passed via --body, --body_file, or stdin.
linear-issue-comment-update --comment_id cmt_001 --body "Updated text"
OptionRequiredDescription
--comment_idyesLinear comment ID
--body**Inline comment text
--body_file**Path to file containing body
** One of --body, --body_file, or stdin is required. Search issues across the workspace.
linear-search --query "authentication bug"
OptionRequiredDescription
--queryyesSearch query text
Returns matching issues as a JSON array.