Skip to content

[Linear] Add Base Integration#3080

Open
ainiroadmike-openclaw wants to merge 2 commits intosuperplanehq:mainfrom
ainiroadmike-openclaw:feature/linear-integration
Open

[Linear] Add Base Integration#3080
ainiroadmike-openclaw wants to merge 2 commits intosuperplanehq:mainfrom
ainiroadmike-openclaw:feature/linear-integration

Conversation

@ainiroadmike-openclaw
Copy link

Summary

Adds Linear project management integration to SuperPlane with base components for issue tracking workflows.

Changes

  • Authentication: Personal API key support
  • GraphQL Client: Query and mutation support for Linear API
  • Action Component: linear.createIssue - Create issues with full field support
  • Trigger Component: linear.onIssueCreated - React to new issues with team/label filtering
  • Webhook Handler: Processes Linear webhook events
  • Resource Listing: Team selection in UI
  • Tests: Unit tests for components and trigger matching

Components

Create Issue (Action)

  • Team selection (required)
  • Title and description
  • Assignee, priority, state, labels
  • Returns issue ID, identifier, URL

On Issue Created (Trigger)

  • Triggers on new issue creation
  • Optional team filter
  • Optional label filter
  • Provides full issue data to workflow

Use Cases

  • Auto-create Linear issues from other tool events
  • Notify teams when issues are created
  • Sync issues across platforms
  • Start workflows based on Linear activity

Reference

Closes #2485


Demo video will be added after initial review.

ainiroadmike-openclaw added 2 commits February 13, 2026 00:14
Implements a new component to retrieve billable GitHub Actions usage for orgs and repos.

- Adds Get Workflow Usage action component
- Supports org-wide and per-repo usage queries
- Filters by time range (year/month/day) and runner OS/SKU
- Returns total minutes and breakdown by OS
- Updates GitHub App manifest to request admin:read permission for billing API access

Fixes superplanehq#2277
Implements Linear project management integration for SuperPlane.

Features:
- Personal API key authentication
- GraphQL client for Linear API
- Create Issue action component
- On Issue Created trigger with team/label filtering
- Webhook handler for Linear events
- Team resource listing
- Comprehensive tests

Components:
- linear.createIssue: Create issues with team, title, description, assignee, priority, state, labels
- linear.onIssueCreated: Trigger workflows on new issue creation

Fixes superplanehq#2485
Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 4 potential issues.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

This is the final PR Bugbot will review for you during this billing cycle

Your free Bugbot reviews will reset on March 12

Details

Your team is on the Bugbot Free tier. On this plan, Bugbot will review limited PRs each billing cycle for each member of your team.

To receive Bugbot reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

}

usageData.MinutesUsed = response.TotalPaidMinutesUsed
usageData.TotalPaidMinutes = response.TotalPaidMinutesUsed
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MinutesUsed and TotalPaidMinutes always have identical values

High Severity

usageData.MinutesUsed and usageData.TotalPaidMinutes are both assigned from response.TotalPaidMinutesUsed, making them always identical. The response struct declares TotalMinutesUsed (total billable minutes) as a separate field, but it's never read. MinutesUsed was likely intended to use response.TotalMinutesUsed to distinguish total usage from paid-only usage. The same issue occurs in both the org-wide and per-repo code paths.

Additional Locations (1)

Fix in Cursor Fix in Web

return nil
}
return metadata.Team
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exported function GetTeamFromMetadata is never called

Low Severity

GetTeamFromMetadata is an exported function that has no callers anywhere in the codebase. The associated NodeMetadata struct is also unused outside this function. This is dead code that adds confusion about the integration's design.

Fix in Cursor Fix in Web


if _, err := client.Do(context.Background(), req, &response); err != nil {
continue
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Per-repo API errors silently swallowed producing incomplete data

Medium Severity

In the per-repo code path, both the request creation error and the API call error are handled with continue, silently skipping failed repositories. The caller receives partial billing data with no indication that some repos failed. For a billing/cost monitoring component, silently undercounting usage is worse than returning an error.

Fix in Cursor Fix in Web

return err
}

req.Header.Set("Authorization", apiKey)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Linear API auth header missing Bearer token prefix

High Severity

The Authorization header is set to the raw API key without the Bearer prefix. Linear's API requires the Authorization: Bearer <token> format, consistent with every other integration in this codebase (cloudflare, cursor, dash0, daytona all use "Bearer " + token). This causes all Linear API calls to fail with an authentication error, rendering the entire integration non-functional.

Fix in Cursor Fix in Web

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Linear] Base

1 participant