plugins/linear-orchestrator/skills/linear-attachments/SKILL.md
This skill should be used when uploading files to Linear, linking external URLs as attachments, or downloading existing attachments with auth. Activates on "linear attachment", "linear file upload", "fileUpload mutation", "attachmentLinkCreate".
npx skillsauth add markus41/claude Linear AttachmentsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
References:
| Type | Storage | Use case | |------|---------|----------| | File attachment | Linear S3 (pre-signed) | screenshots, logs, design files | | Link attachment | External URL only | GitHub PR, Figma, Notion, Loom |
// 1. Reserve upload URL
const reservation = await client.fileUpload({
contentType: "image/png",
filename: "screenshot.png",
size: file.length
});
// { uploadFile: { uploadUrl, headers: [{key,value}], assetUrl } }
// 2. PUT bytes
await fetch(reservation.uploadUrl, {
method: "PUT",
body: file,
headers: Object.fromEntries(reservation.headers.map(h => [h.key, h.value]))
});
// 3. Attach to issue
await client.attachmentCreate({
issueId,
url: reservation.assetUrl,
title: "Screenshot",
contentType: "image/png"
});
Helper in lib/attachment-upload.ts:
export async function uploadFileToLinear(
client: LinearClient,
issueId: string,
filePath: string,
title?: string
): Promise<string>; // returns attachment ID
For files >50MB:
partNumber query paramPOST ?uploads to finaliseMost use cases stay under 50MB; only logs and video do this.
await client.attachmentLinkCreate(issueId, "https://github.com/org/repo/pull/42", "PR #42");
Linear infers preview from URL pattern. Supported: GitHub PR / issue / commit, Figma, Notion, Loom, Vimeo, Slack thread, generic OG-rich pages.
Asset URLs require the same Linear token in Authorization: Bearer <token>. Don't share these URLs publicly — they expire after 7 days but exposing during that window is a leak.
const res = await fetch(assetUrl, {
headers: { Authorization: `Bearer ${process.env.LINEAR_API_KEY}` }
});
const buffer = Buffer.from(await res.arrayBuffer());
Or, mint a short-lived signed URL through your own service if you need to share with end users.
driveItem upload. The Planner task references field gets the OneDrive URL.tools
Build Teams-native agents with the Teams SDK (formerly Teams AI Library v2) — App class, activity routing, adaptive cards, streaming, AI-generated labels, feedback, message extensions, Teams-as-MCP-server, and the bring-your-own-AI pattern with Agent Framework.
tools
Run agents on Microsoft Foundry (formerly Azure AI Foundry) Agent Service — prompt agents vs hosted agents, threads/runs and the Responses API, built-in tools (Bing grounding, code interpreter, file search, MCP, OpenAPI, A2A), connected agents, Entra agent identity, SDKs, and observability/evaluations.
tools
Build and host custom engine agents with the Microsoft 365 Agents SDK — AgentApplication, the Activity protocol, channel reach via Azure Bot Service, hosting Agent Framework or Semantic Kernel engines, and the Agents Toolkit/Playground workflow. Successor to the Bot Framework SDK.
tools
Design, govern, and extend Microsoft Copilot Studio agents — topics, generative orchestration, knowledge, tools and MCP, agent flows, autonomous triggers, publishing channels, Copilot Credits pricing, and solution-based ALM on Power Platform.