Agent skill

Linear

by karanhudia in karanhudia/borg-ui

Use Symphony's lineargraphql client tool for raw Linear GraphQL operations such as comment editing and upload flows.

AGPL-3.0Auto-check passedBackend & APIs

Install Linear

skills CLI
$ npx skills add karanhudia/borg-ui --skill linear -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install karanhudia/borg-ui linear --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/karanhudia/borg-ui.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.codex/skills/linear .claude/skills/linear && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
linear
GitHub stars
1.7k
Token cost
~1.7k tokens
SKILL.md length
431 words
Files
1
Skills in repo
5
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Use Symphony's lineargraphql client tool for raw Linear GraphQL operations such as comment editing and upload flows.

  • Works in 3 steps: Call linear_graphql with fileUpload to… → Upload the local file bytes to uploadUrl… → Call linear_graphql again with…
  • Tasks that involve GraphQL
  • SKILL.md covers Primary tool, Discovering unfamiliar…, Common workflows and Usage rules
  • Calls curl

What it does

Linear is an agent skill from karanhudia/borg-ui. Use Symphony's lineargraphql client tool for raw Linear GraphQL operations such as comment editing and upload flows.

Its SKILL.md is about 1.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Backend & APIs, covering GraphQL. It works with GraphQL and GitHub. The repository describes itself as: Replace complex Borg Backup terminal commands with a beautiful web UI. Create, schedule, and restore backups with just a few clicks. The licence is AGPL-3.0.

When your agent uses it

  • Tasks that involve GraphQL

Example prompts

  • “/linear”

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Call linear_graphql with fileUpload to get uploadUrl, assetUrl, and
  2. Upload the local file bytes to uploadUrl with curl -X PUT and the exact
  3. Call linear_graphql again with commentCreate (or commentUpdate) and

What it can do on your machine

Read from SKILL.md and the folder at commit 196a74a. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Linear loads about 1.7k tokens when it runs. Until then it costs about 32 tokens; SKILL.md has 431 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~32
When it runs · the whole SKILL.md, loaded when a task matches
~1.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from karanhudia/borg-ui at commit 196a74a, republished under its AGPL-3.0 licence (© karanhudia). 431 words, ~1,710 tokens.

Download SKILL.mdSave it as .claude/skills/linear/SKILL.md (or your agent's skills folder).
name
linear
description
Use Symphony's `linear_graphql` client tool for raw Linear GraphQL operations such as comment editing and upload flows.

Linear GraphQL

Use this skill for raw Linear GraphQL work during Symphony app-server sessions.

Primary tool

Use the linear_graphql client tool exposed by Symphony's app-server session. It reuses Symphony's configured Linear auth for the session.

Tool input:

json
{
  "query": "query or mutation document",
  "variables": {
    "optional": "graphql variables object"
  }
}

Tool behavior:

  • Send one GraphQL operation per tool call.
  • Treat a top-level errors array as a failed GraphQL operation even if the tool call itself completed.
  • Keep queries/mutations narrowly scoped; ask only for the fields you need.

Discovering unfamiliar operations

When you need an unfamiliar mutation, input type, or object field, use targeted introspection through linear_graphql.

List mutation names:

graphql
query ListMutations {
  __type(name: "Mutation") {
    fields {
      name
    }
  }
}

Inspect a specific input object:

graphql
query CommentCreateInputShape {
  __type(name: "CommentCreateInput") {
    inputFields {
      name
      type {
        kind
        name
        ofType {
          kind
          name
        }
      }
    }
  }
}

Common workflows

Query an issue by key, identifier, or id

Use these progressively:

  • Start with issue(id: $key) when you have a ticket key such as MT-686.
  • Fall back to issues(filter: ...) when you need identifier search semantics.
  • Once you have the internal issue id, prefer issue(id: $id) for narrower reads.

Lookup by issue key:

graphql
query IssueByKey($key: String!) {
  issue(id: $key) {
    id
    identifier
    title
    state {
      id
      name
      type
    }
    project {
      id
      name
    }
    branchName
    url
    description
    updatedAt
    links {
      nodes {
        id
        url
        title
      }
    }
  }
}

Lookup by identifier filter:

graphql
query IssueByIdentifier($identifier: String!) {
  issues(filter: { identifier: { eq: $identifier } }, first: 1) {
    nodes {
      id
      identifier
      title
      state {
        id
        name
        type
      }
      project {
        id
        name
      }
      branchName
      url
      description
      updatedAt
    }
  }
}

Resolve a key to an internal id:

graphql
query IssueByIdOrKey($id: String!) {
  issue(id: $id) {
    id
    identifier
    title
  }
}

Read the issue once the internal id is known:

graphql
query IssueDetails($id: String!) {
  issue(id: $id) {
    id
    identifier
    title
    url
    description
    state {
      id
      name
      type
    }
    project {
      id
      name
    }
    attachments {
      nodes {
        id
        title
        url
        sourceType
      }
    }
  }
}
Query team workflow states for an issue

Use this before changing issue state when you need the exact stateId:

graphql
query IssueTeamStates($id: String!) {
  issue(id: $id) {
    id
    team {
      id
      key
      name
      states {
        nodes {
          id
          name
          type
        }
      }
    }
  }
}
Edit an existing comment

Use commentUpdate through linear_graphql:

graphql
mutation UpdateComment($id: String!, $body: String!) {
  commentUpdate(id: $id, input: { body: $body }) {
    success
    comment {
      id
      body
    }
  }
}
Create a comment

Use commentCreate through linear_graphql:

graphql
mutation CreateComment($issueId: String!, $body: String!) {
  commentCreate(input: { issueId: $issueId, body: $body }) {
    success
    comment {
      id
      url
    }
  }
}
Move an issue to a different state

Use issueUpdate with the destination stateId:

graphql
mutation MoveIssueToState($id: String!, $stateId: String!) {
  issueUpdate(id: $id, input: { stateId: $stateId }) {
    success
    issue {
      id
      identifier
      state {
        id
        name
      }
    }
  }
}
Attach a GitHub PR to an issue

Use the GitHub-specific attachment mutation when linking a PR:

graphql
mutation AttachGitHubPR($issueId: String!, $url: String!, $title: String) {
  attachmentLinkGitHubPR(
    issueId: $issueId
    url: $url
    title: $title
    linkKind: links
  ) {
    success
    attachment {
      id
      title
      url
    }
  }
}

If you only need a plain URL attachment and do not care about GitHub-specific link metadata, use:

graphql
mutation AttachURL($issueId: String!, $url: String!, $title: String) {
  attachmentLinkURL(issueId: $issueId, url: $url, title: $title) {
    success
    attachment {
      id
      title
      url
    }
  }
}
Show full SKILL.md (177 more words)Show less
Introspection patterns used during schema discovery

Use these when the exact field or mutation shape is unclear:

graphql
query QueryFields {
  __type(name: "Query") {
    fields {
      name
    }
  }
}
graphql
query IssueFieldArgs {
  __type(name: "Query") {
    fields {
      name
      args {
        name
        type {
          kind
          name
          ofType {
            kind
            name
            ofType {
              kind
              name
            }
          }
        }
      }
    }
  }
}
Upload a video to a comment

Do this in three steps:

  1. Call linear_graphql with fileUpload to get uploadUrl, assetUrl, and any required upload headers.
  2. Upload the local file bytes to uploadUrl with curl -X PUT and the exact headers returned by fileUpload.
  3. Call linear_graphql again with commentCreate (or commentUpdate) and include the resulting assetUrl in the comment body.

Useful mutations:

graphql
mutation FileUpload(
  $filename: String!
  $contentType: String!
  $size: Int!
  $makePublic: Boolean
) {
  fileUpload(
    filename: $filename
    contentType: $contentType
    size: $size
    makePublic: $makePublic
  ) {
    success
    uploadFile {
      uploadUrl
      assetUrl
      headers {
        key
        value
      }
    }
  }
}

Usage rules

  • Use linear_graphql for comment edits, uploads, and ad-hoc Linear API queries.
  • Prefer the narrowest issue lookup that matches what you already know: key -> identifier search -> internal id.
  • For state transitions, fetch team states first and use the exact stateId instead of hardcoding names inside mutations.
  • Prefer attachmentLinkGitHubPR over a generic URL attachment when linking a GitHub PR to a Linear issue.
  • Do not introduce new raw-token shell helpers for GraphQL access.
  • If you need shell work for uploads, only use it for signed upload URLs returned by fileUpload; those URLs already carry the needed authorization.

© karanhudia, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .codex/skills/linear of karanhudia/borg-ui.

Open the folder on GitHubat commit 196a74a

Compare with similar skills

Linear next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Linear compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Linear this skillkaranhudia/borg-ui1.7k—~1.7kAutomated safety check: PassAGPL-3.0
Cuga GitHub Issuescuga-project/cuga-agent895—~1.2kAutomated safety check: PassCustom licence
Distilled SDKalchemy-run/distilled431—~6kAutomated safety check: PassApache-2.0
Review PR Commentslatitude-dev/latitude-llm4.7k—~2.6kAutomated safety check: PassMIT
Merge Queuefullsend-ai/fullsend147—~712Automated safety check: PassApache-2.0
Golang Graphqlcontext-labs/whip1.1k1 repos~3.2kAutomated safety check: PassMIT

Similar skills

  • Cuga GitHub Issues

    cuga-project/cuga-agent

    Create GitHub issues for cuga-agent (bugs, features, epics, designs, and related work) against origin using gh, with epic → feature → issue hierarchy and GraphQL sub-issue linking.

    895 GitHub stars~1.2k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Distilled SDK

    alchemy-run/distilled

    Build or update a distilled SDK for an API provider — sourcing its OpenAPI/Smithy/GraphQL/discovery description, adding the spec mirror that feeds it, generating packages/<provider, listing it on…

    431 GitHub stars~6k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Review PR Comments

    latitude-dev/latitude-llm

    Triages a PR with GitHub CLI: loads issue-level and inline review feedback (gh pr view, gh api REST, gh api graphql as appropriate), walks items in order, replies in the correct thread, optional…

    4.7k GitHub stars~2.6k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Merge Queue

    fullsend-ai/fullsend

    A skill your agent uses when you need to add a PR to a GitHub merge queue, check what's currently queued, or find out why a PR was removed from the queue.

    147 GitHub stars~712 tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Golang Graphql

    context-labs/whip

    GraphQL APIs in Go using gqlgen or graphql-go. An agent skill from context-labs/whip.

    1.1k GitHub starsUsed in 1 repo~3.2k tokens
    Backend & APIsAuto-check passed
  • Copilot PR Autopilot

    github/awesome-copilot

    Official

    Copilot left 14 review comments on your PR — half are nits. An agent skill from github/awesome-copilot.

    40k GitHub stars~3.4k tokensUpdated yesterday
    Backend & APIsAuto-check passed

More from karanhudia/borg-ui

  • Borg Live Debug

    karanhudia/borg-ui

    Live Borg debugging by exec-ing into the borg-web-ui Docker container.

    1.7k GitHub stars~1.4k tokensUpdated yesterday
    Auto-check: notes
  • Pull

    karanhudia/borg-ui

    Pull latest origin/main into the current local branch and resolve merge conflicts (aka update-branch).

    1.7k GitHub starsUsed in 1 repo~1.2k tokens
    Auto-check passed
  • Push

    karanhudia/borg-ui

    Push current branch changes to origin and create or update the corresponding pull request; use when asked to push, publish updates, or create pull request.

    1.7k GitHub stars~1.2k tokensUpdated yesterday
    Auto-check passed
  • Continue Spec

    karanhudia/borg-ui

    Continue a multi-phase engineering spec from its progress table.

    1.7k GitHub stars~592 tokensUpdated yesterday
    Auto-check: notes

Works with

Categories

Questions about Linear

What does Linear do?

Use Symphony's lineargraphql client tool for raw Linear GraphQL operations such as comment editing and upload flows. Linear is an agent skill from karanhudia/borg-ui. Use Symphony's lineargraphql client tool for raw Linear GraphQL operations such as comment editing and upload flows.

When should I use Linear?

Linear fits situations like: tasks that involve GraphQL.

How do I install Linear in Claude Code?

Run `npx skills add karanhudia/borg-ui --skill linear -a claude-code`. Or copy the skill folder (.codex/skills/linear in karanhudia/borg-ui) into .claude/skills/linear in your project. Claude Code loads it when a task matches its description.

How do I install Linear in Codex?

Run `npx skills add karanhudia/borg-ui --skill linear -a codex`. Or copy the skill folder (.codex/skills/linear in karanhudia/borg-ui) into .agents/skills/linear in your project. Codex loads it when a task matches its description.

Can I use Linear in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add karanhudia/borg-ui --skill linear -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/linear, .gemini/skills/linear, .github/skills/linear and .opencode/skills/linear in your project.

What does Linear need to run?

Going by SKILL.md and its folder, Linear needs the command-line tools its instructions call (curl).

Does Linear access the network?

SKILL.md contains no URLs. Its commands use curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Linear safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Linear use?

Linear is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Linear use?

About 1.7k tokens (SKILL.md is roughly 6.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Linear?

Skills that share tags, products or a category with Linear: Cuga GitHub Issues (cuga-project/cuga-agent, 895 stars), Distilled SDK (alchemy-run/distilled, 431 stars), Review PR Comments (latitude-dev/latitude-llm, 4.7k stars) and Merge Queue (fullsend-ai/fullsend, 147 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Linear?

karanhudia (a GitHub user) maintains it in karanhudia/borg-ui, which has 1,656 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 7, 2026.

Source: karanhudia/borg-ui on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.