Linear Native Node
Use scripts/linear.mjs to talk directly to Linear's GraphQL API at https://api.linear.app/graphql.
Native Node 18+. Zero npm dependencies. Windows, macOS, and Linux friendly. No bash, Python, OAuth gateway, browser login, or third-party proxy.
Security behavior
- Reads
LINEAR_API_KEYand optionalLINEAR_DEFAULT_TEAMfrom the process environment only. - Does not read credential files or
~/.openclaw/.env. - Sends GraphQL requests only to
https://api.linear.app/graphql. - Does not write files, log secrets, or print the API key.
- Write commands are explicit commands (
create,comment,status,priority,project-create); read-only commands are the default usage pattern.
Why this skill
This is the private/direct version of common Linear helper workflows:
- Keeps API access between this machine and Linear only.
- Uses
LINEAR_API_KEYfrom the process environment only; never print the key. - Avoids bash-oriented helpers that break on Windows.
- Avoids third-party OAuth/gateway tools; there is no Maton-style intermediary.
- Keeps a tight auditable scope: viewer/org/team lookup, issue list/read/create/update/comment, practical personal summaries, and branch names.
Setup
Create a Linear API key at:
https://linear.app/settings/api
PowerShell session-only setup:
$env:LINEAR_API_KEY = "<your-linear-key>"
$env:LINEAR_DEFAULT_TEAM = "TEAM"
macOS/Linux shell session-only setup:
export LINEAR_API_KEY="<your-linear-key>"
export LINEAR_DEFAULT_TEAM="TEAM"
LINEAR_DEFAULT_TEAM is optional. Examples below use TEAM and TEAM-123 as placeholders; replace them with your Linear team key and issue identifiers.
Run
From PowerShell, bash, zsh, or any shell with Node on PATH:
node "<skill-dir>/scripts/linear.mjs" help
node "<skill-dir>/scripts/linear.mjs" viewer
node "<skill-dir>/scripts/linear.mjs" issues --team TEAM --mine --limit 10
From OpenClaw, use the bundled script directly:
Run: node <skill-dir>/scripts/linear.mjs my-issues --team TEAM
Run: node <skill-dir>/scripts/linear.mjs create TEAM "Fix login error" "Users see an error after submitting credentials." --priority high
Add --json to commands when structured output is useful.
Commands
Read-only:
help
viewer
organization
teams
projects [--team TEAM] [--limit N]
states <TEAM_KEY>
issues [--team TEAM] [--mine] [--state STATE] [--limit N]
my-issues [--team TEAM] [--state STATE] [--limit N]
my-todos [--team TEAM] [--limit N]
urgent [--team TEAM] [--mine] [--limit N]
standup [--team TEAM] [--limit N]
issue <IDENTIFIER>
branch <IDENTIFIER>
Writes to Linear:
project-create [TEAM_KEY] "Name" ["Description"]
create [TEAM_KEY] "Title" ["Description"] [--priority urgent|high|medium|low|none]
comment <IDENTIFIER> "Comment"
status <IDENTIFIER> <state-name>
priority <IDENTIFIER> <urgent|high|medium|low|none>
For agent use, perform write commands only when the user clearly requested the Linear change or explicitly approved it.
Examples
List teams, projects, and states:
node "<skill-dir>/scripts/linear.mjs" teams
node "<skill-dir>/scripts/linear.mjs" projects --team TEAM --limit 20
node "<skill-dir>/scripts/linear.mjs" states TEAM
Create a project:
node "<skill-dir>/scripts/linear.mjs" project-create TEAM "Release Planning" "Track launch scope and milestones."
List issues:
node "<skill-dir>/scripts/linear.mjs" issues --team TEAM --limit 20
node "<skill-dir>/scripts/linear.mjs" issues --team TEAM --mine --state "In Progress"
node "<skill-dir>/scripts/linear.mjs" my-issues --team TEAM
node "<skill-dir>/scripts/linear.mjs" my-todos --team TEAM
node "<skill-dir>/scripts/linear.mjs" urgent --team TEAM
Read and update an issue:
node "<skill-dir>/scripts/linear.mjs" issue TEAM-123
node "<skill-dir>/scripts/linear.mjs" comment TEAM-123 "Added reproduction notes."
node "<skill-dir>/scripts/linear.mjs" status TEAM-123 "In Progress"
node "<skill-dir>/scripts/linear.mjs" priority TEAM-123 urgent
Create an issue:
node "<skill-dir>/scripts/linear.mjs" create TEAM "Fix notification delivery" "Notifications are delayed for some users." --priority high
Generate a GitHub-friendly branch name from the Linear issue title:
node "<skill-dir>/scripts/linear.mjs" branch TEAM-123
Get machine-readable output:
node "<skill-dir>/scripts/linear.mjs" my-issues --team TEAM --json
Notes
- Prefer issue identifiers like
TEAM-123; the script resolves them before updates that need Linear IDs. - Priority values map to Linear's native values:
urgent,high,medium,low,none. - Missing keys, 401/403 responses, GraphQL errors, missing teams/states, and invalid priorities produce clear stderr errors with non-zero exit codes.
standupsummarizes assigned active and recently completed issues; it is intentionally lightweight, not a time tracker.