npx skills add https://github.com/odysseus0/symphony --skill linear所有 Linear 操作都通过 Symphony 应用服务器暴露的 linear_graphql 客户端工具进行。它会自动处理身份验证。
{
"query": "query or mutation document",
"variables": { "optional": "graphql variables" }
}
每次工具调用执行一个操作。顶层的 errors 数组意味着操作失败,即使工具调用已完成。
在你的工作空间中维护一个本地的 workpad.md。可以自由编辑(零 API 成本),然后在关键节点同步到 Linear —— 例如计划确定后、实现完成后、验证完成时。不要在每次微小更改后都同步。
首次同步 —— 创建评论,保存 ID:
mutation CreateComment($issueId: String!, $body: String!) {
commentCreate(input: { issueId: $issueId, body: $body }) {
success
comment { id }
}
}
将返回的 comment.id 写入 ,以便后续同步可以更新。
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
.workpad-id后续同步 —— 读取 .workpad-id,原地更新:
mutation UpdateComment($id: String!, $body: String!) {
commentUpdate(id: $id, input: { body: $body }) { success }
}
编排器在启动时会将问题上下文(标识符、标题、描述、状态、标签、URL)注入到你的提示中。通常你不需要重新读取。
当你需要时,根据你已有的信息使用最精确的查找方式:
# 通过工单键(例如 MT-686)
query($key: String!) {
issue(id: $key) {
id identifier title url description
state { id name type }
project { id name }
}
}
对于评论和附件:
query($id: String!) {
issue(id: $id) {
comments(first: 50) { nodes { id body user { name } createdAt } }
attachments(first: 20) { nodes { url title sourceType } }
}
}
首先获取团队状态,然后使用确切的 stateId 进行移动:
query($id: String!) {
issue(id: $id) {
team { states { nodes { id name } } }
}
}
mutation($id: String!, $stateId: String!) {
issueUpdate(id: $id, input: { stateId: $stateId }) {
success
issue { state { name } }
}
}
# GitHub PR(PR 首选)
mutation($issueId: String!, $url: String!, $title: String) {
attachmentLinkGitHubPR(issueId: $issueId, url: $url, title: $title, linkKind: links) {
success
}
}
# 普通 URL
mutation($issueId: String!, $url: String!, $title: String) {
attachmentLinkURL(issueId: $issueId, url: $url, title: $title) {
success
}
}
三个步骤:
mutation($filename: String!, $contentType: String!, $size: Int!) {
fileUpload(filename: $filename, contentType: $contentType, size: $size, makePublic: true) {
success
uploadFile { uploadUrl assetUrl headers { key value } }
}
}
PUT 方法发送到 uploadUrl(使用 curl)。 的形式嵌入 assetUrl。首先将项目短标识符解析为 ID:
query($slug: String!) {
projects(filter: { slugId: { eq: $slug } }) {
nodes { id teams { nodes { id key states { nodes { id name } } } } }
}
}
然后创建:
mutation($input: IssueCreateInput!) {
issueCreate(input: $input) {
success
issue { identifier url }
}
}
$input 字段:title、teamId、projectId,以及可选的 description、priority(0–4)、stateId。对于关联关系,后续使用:
mutation($input: IssueRelationCreateInput!) {
issueRelationCreate(input: $input) { success }
}
输入:issueId、relatedIssueId、type(blocks 或 related)。
__type 或 __schema 查询。它们会返回整个 Linear 模式(约 20 万个字符)并浪费上下文窗口。你需要的所有模式都已在上方文档中说明。attachmentLinkGitHubPR 而非通用的 URL 附件。每周安装量
126
代码仓库
GitHub 星标数
53
首次出现
14 天前
安全审计
安装于
codex125
claude-code6
opencode5
github-copilot5
amp5
cline5
All Linear operations go through the linear_graphql client tool exposed by Symphony's app server. It handles auth automatically.
{
"query": "query or mutation document",
"variables": { "optional": "graphql variables" }
}
One operation per tool call. A top-level errors array means the operation failed even if the tool call completed.
Maintain a local workpad.md in your workspace. Edit freely (zero API cost), then sync to Linear at milestones — plan finalized, implementation done, validation complete. Do not sync after every small change.
First sync — create the comment, save the ID:
mutation CreateComment($issueId: String!, $body: String!) {
commentCreate(input: { issueId: $issueId, body: $body }) {
success
comment { id }
}
}
Write the returned comment.id to .workpad-id so subsequent syncs can update.
Subsequent syncs — read .workpad-id, update in place:
mutation UpdateComment($id: String!, $body: String!) {
commentUpdate(id: $id, input: { body: $body }) { success }
}
The orchestrator injects issue context (identifier, title, description, state, labels, URL) into your prompt at startup. You usually do not need to re-read.
When you do, use the narrowest lookup for what you have:
# By ticket key (e.g. MT-686)
query($key: String!) {
issue(id: $key) {
id identifier title url description
state { id name type }
project { id name }
}
}
For comments and attachments:
query($id: String!) {
issue(id: $id) {
comments(first: 50) { nodes { id body user { name } createdAt } }
attachments(first: 20) { nodes { url title sourceType } }
}
}
Fetch team states first, then move with the exact stateId:
query($id: String!) {
issue(id: $id) {
team { states { nodes { id name } } }
}
}
mutation($id: String!, $stateId: String!) {
issueUpdate(id: $id, input: { stateId: $stateId }) {
success
issue { state { name } }
}
}
# GitHub PR (preferred for PRs)
mutation($issueId: String!, $url: String!, $title: String) {
attachmentLinkGitHubPR(issueId: $issueId, url: $url, title: $title, linkKind: links) {
success
}
}
# Plain URL
mutation($issueId: String!, $url: String!, $title: String) {
attachmentLinkURL(issueId: $issueId, url: $url, title: $title) {
success
}
}
Three steps:
mutation($filename: String!, $contentType: String!, $size: Int!) {
fileUpload(filename: $filename, contentType: $contentType, size: $size, makePublic: true) {
success
uploadFile { uploadUrl assetUrl headers { key value } }
}
}
2. PUT file bytes to uploadUrl with the returned headers (use curl).
3. Embed assetUrl in comments/workpad as .
Resolve project slug to IDs first:
query($slug: String!) {
projects(filter: { slugId: { eq: $slug } }) {
nodes { id teams { nodes { id key states { nodes { id name } } } } }
}
}
Then create:
mutation($input: IssueCreateInput!) {
issueCreate(input: $input) {
success
issue { identifier url }
}
}
$input fields: title, teamId, projectId, and optionally description, priority (0–4), stateId. For relations, follow up with:
mutation($input: IssueRelationCreateInput!) {
issueRelationCreate(input: $input) { success }
}
Input: issueId, relatedIssueId, type (blocks or related).
__type or __schema queries. They return the entire Linear schema (~200K chars) and waste the context window. Every pattern you need is documented above.attachmentLinkGitHubPR over generic URL attachment for GitHub PRs.Weekly Installs
126
Repository
GitHub Stars
53
First Seen
14 days ago
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
codex125
claude-code6
opencode5
github-copilot5
amp5
cline5
通过 LiteLLM 代理让 Claude Code 对接 GitHub Copilot 运行 | 高级变通方案指南
40,000 周安装
gog 命令行工具:高效管理 Gmail、日历、云端硬盘等 Google 服务
2,100 周安装
Git防护栏:阻止Claude执行危险Git命令的安全钩子脚本
2,100 周安装
需求不明确时主动提问技能:AI助手澄清模糊需求,避免错误工作流程
2,100 周安装
MySQL数据库优化实战指南:索引设计、查询优化与事务管理最佳实践
2,100 周安装
Nano Banana Pro 提示词推荐:10000+ AI 图像生成提示词库,支持 Midjourney、DALL-E 3、Stable Diffusion
2,100 周安装
Python专家技能:10年经验开发者代码审查与优化指南
2,100 周安装