jeremylongshore/claude-code-plugins-plus-skills
linear-pack
plugins/saas-packs/linear-pack/skills/linear-local-dev-loop/SKILL.md
January 22, 2026
Select agents to install to:
npx add-skill https://github.com/jeremylongshore/claude-code-plugins-plus-skills/blob/main/plugins/saas-packs/linear-pack/skills/linear-local-dev-loop/SKILL.md -a claude-code --skill linear-local-dev-loopInstallation paths:
.claude/skills/linear-local-dev-loop/# Linear Local Dev Loop
## Overview
Set up an efficient local development workflow for Linear integrations.
## Prerequisites
- Node.js 18+ with TypeScript
- Linear SDK installed
- Separate Linear workspace for development (recommended)
- ngrok or similar for webhook testing
## Instructions
### Step 1: Project Setup
```bash
# Initialize project
mkdir linear-integration && cd linear-integration
npm init -y
npm install @linear/sdk typescript ts-node dotenv
npm install -D @types/node vitest
# Create tsconfig.json
npx tsc --init --target ES2022 --module NodeNext --moduleResolution NodeNext
```
### Step 2: Environment Configuration
```bash
# Create .env for local development
cat > .env << 'EOF'
LINEAR_API_KEY=lin_api_dev_xxxxxxxxxxxx
LINEAR_WEBHOOK_SECRET=your_webhook_secret
NODE_ENV=development
EOF
# Create .env.example (commit this)
cat > .env.example << 'EOF'
LINEAR_API_KEY=lin_api_xxxxxxxxxxxx
LINEAR_WEBHOOK_SECRET=
NODE_ENV=development
EOF
# Add to .gitignore
echo ".env" >> .gitignore
echo ".env.local" >> .gitignore
```
### Step 3: Create Development Client
```typescript
// src/client.ts
import { LinearClient } from "@linear/sdk";
import dotenv from "dotenv";
dotenv.config();
export const linearClient = new LinearClient({
apiKey: process.env.LINEAR_API_KEY!,
});
export async function verifyClient(): Promise<boolean> {
try {
const viewer = await linearClient.viewer;
console.log(`[Linear] Connected as ${viewer.name}`);
return true;
} catch (error) {
console.error("[Linear] Connection failed:", error);
return false;
}
}
```
### Step 4: Create Test Utilities
```typescript
// src/test-utils.ts
import { linearClient } from "./client";
export async function createTestIssue(teamKey: string) {
const teams = await linearClient.teams();
const team = teams.nodes.find(t => t.key === teamKey);
if (!team) throw new Error(`Team ${teamKey} not found`);
const result = await linearClient.createIssue({
teamId: team.id,
title: `