[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F7YN3GHHGK6KTWDJCD62XT":3,"skill-same:01M6F7YN3GHHGK6KTWDJCD62XT":72},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M6F7YN3GHHGK6KTWDJCD62XT","linear-reference-architecture",null,"Production-grade Linear integration architecture patterns.\nUse when designing system architecture, planning integrations,\nor reviewing architectural decisions.\nTrigger with phrases like \"linear architecture\", \"linear system design\",\n\"linear integration patterns\", \"linear best practices architecture\".","Dicklesworthstone\u002Fpi_agent_rust","Dicklesworthstone","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F35050222?v=4","01M6CG26AR942CSVMN1M5E3DSE","Jeff Emanuel","01M6CG26EPP71PSHW1VDS71121",1981,"MIT","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Flinear-pack\u002Fskills\u002Flinear-reference-architecture\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"architecture","linear reference architecture","linear","reference","when","design","with","trigger","io","system design","use","edit","write","read","decisions","grep","integrations","system","integration","best practices","planning","2026-11-10 10:12:30",false,"---\nname: linear-reference-architecture\ndescription: |\n  Production-grade Linear integration architecture patterns.\n  Use when designing system architecture, planning integrations,\n  or reviewing architectural decisions.\n  Trigger with phrases like \"linear architecture\", \"linear system design\",\n  \"linear integration patterns\", \"linear best practices architecture\".\nallowed-tools: Read, Write, Edit, Grep\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\n---\n\n# Linear Reference Architecture\n\n## Overview\nProduction-grade architectural patterns for Linear integrations.\n\n## Prerequisites\n- Understanding of distributed systems\n- Experience with cloud infrastructure\n- Familiarity with event-driven architecture\n\n## Architecture Patterns\n\n### Pattern 1: Simple Integration\nBest for: Small teams, single applications\n\n```\n┌─────────────────────────────────────────────────────────┐\n│                    Your Application                      │\n├─────────────────────────────────────────────────────────┤\n│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  │\n│  │ Linear SDK   │  │ Cache Layer  │  │ Webhook      │  │\n│  │ (API calls)  │  │ (In-memory)  │  │ Handler      │  │\n│  └──────────────┘  └──────────────┘  └──────────────┘  │\n└─────────────────────────────────────────────────────────┘\n                         │\n                         ▼\n              ┌──────────────────────┐\n              │   Linear API         │\n              │   api.linear.app     │\n              └──────────────────────┘\n```\n\n```typescript\n\u002F\u002F Simple architecture implementation\n\u002F\u002F lib\u002Fsimple-linear.ts\nimport { LinearClient } from \"@linear\u002Fsdk\";\n\nconst cache = new Map\u003Cstring, { data: any; expires: number }>();\n\nexport class SimpleLinearService {\n  private client: LinearClient;\n\n  constructor() {\n    this.client = new LinearClient({\n      apiKey: process.env.LINEAR_API_KEY!,\n    });\n  }\n\n  async getWithCache\u003CT>(key: string, fetcher: () => Promise\u003CT>, ttl = 300): Promise\u003CT> {\n    const cached = cache.get(key);\n    if (cached && cached.expires > Date.now()) {\n      return cached.data;\n    }\n\n    const data = await fetcher();\n    cache.set(key, { data, expires: Date.now() + ttl * 1000 });\n    return data;\n  }\n\n  async getTeams() {\n    return this.getWithCache(\"teams\", () => this.client.teams());\n  }\n}\n```\n\n### Pattern 2: Service-Oriented Architecture\nBest for: Medium teams, multiple applications\n\n```\n┌────────────────────────────────────────────────────────────────┐\n│                       API Gateway                               │\n└────────────────────────────────────────────────────────────────┘\n         │                    │                    │\n         ▼                    ▼                    ▼\n┌─────────────────┐  ┌─────────────────┐  ┌─────────────────────┐\n│ Issues Service  │  │ Projects Service│  │ Notifications Svc   │\n│ (CRUD + sync)   │  │ (Planning)      │  │ (Slack, Email)      │\n└─────────────────┘  └─────────────────┘  └─────────────────────┘\n         │                    │                    │\n         └────────────────────┼────────────────────┘\n                              ▼\n                    ┌─────────────────┐\n                    │ Linear Gateway  │\n                    │ (Rate limiting, │\n                    │  caching, auth) │\n                    └─────────────────┘\n                              │\n                              ▼\n                    ┌─────────────────┐\n                    │   Linear API    │\n                    └─────────────────┘\n```\n\n```typescript\n\u002F\u002F lib\u002Flinear-gateway.ts\nimport { LinearClient } from \"@linear\u002Fsdk\";\nimport Redis from \"ioredis\";\n\nexport class LinearGateway {\n  private client: LinearClient;\n  private redis: Redis;\n  private rateLimiter: RateLimiter;\n\n  constructor() {\n    this.client = new LinearClient({ apiKey: process.env.LINEAR_API_KEY! });\n    this.redis = new Redis(process.env.REDIS_URL);\n    this.rateLimiter = new RateLimiter({\n      maxRequests: 1000, \u002F\u002F Leave buffer from 1500 limit\n      windowMs: 60000,\n    });\n  }\n\n  async execute\u003CT>(operation: string, fn: () => Promise\u003CT>): Promise\u003CT> {\n    \u002F\u002F Check cache first\n    const cacheKey = `linear:${operation}`;\n    const cached = await this.redis.get(cacheKey);\n    if (cached) return JSON.parse(cached);\n\n    \u002F\u002F Rate limit\n    await this.rateLimiter.acquire();\n\n    \u002F\u002F Execute with metrics\n    const start = Date.now();\n    try {\n      const result = await fn();\n\n      \u002F\u002F Cache result\n      await this.redis.setex(cacheKey, 60, JSON.stringify(result));\n\n      \u002F\u002F Record metrics\n      metrics.requestDuration.observe(Date.now() - start);\n\n      return result;\n    } catch (error) {\n      metrics.errors.inc({ operation });\n      throw error;\n    }\n  }\n}\n```\n\n### Pattern 3: Event-Driven Architecture\nBest for: Large teams, real-time requirements\n\n```\n┌─────────────────────────────────────────────────────────────────────┐\n│                        Event Bus (Kafka\u002FSQS)                        │\n└─────────────────────────────────────────────────────────────────────┘\n         ▲                         │                        │\n         │                         ▼                        ▼\n┌─────────────────┐       ┌─────────────────┐      ┌─────────────────┐\n│ Webhook Ingester│       │ Event Processor │      │ Notification    │\n│ (Linear events) │       │ (Business logic)│      │ Service         │\n└─────────────────┘       └─────────────────┘      └─────────────────┘\n                                   │\n                                   ▼\n                          ┌─────────────────┐\n                          │ State Store     │\n                          │ (PostgreSQL)    │\n                          └─────────────────┘\n                                   │\n                                   ▼\n                          ┌─────────────────┐\n                          │ Linear Sync     │\n                          │ (Outbound)      │\n                          └─────────────────┘\n                                   │\n                                   ▼\n                          ┌─────────────────┐\n                          │   Linear API    │\n                          └─────────────────┘\n```\n\n```typescript\n\u002F\u002F services\u002Fwebhook-ingester.ts\nimport { Kafka } from \"kafkajs\";\n\nconst kafka = new Kafka({\n  brokers: [process.env.KAFKA_BROKER!],\n});\n\nconst producer = kafka.producer();\n\nexport async function ingestWebhook(event: LinearWebhookEvent): Promise\u003Cvoid> {\n  \u002F\u002F Verify signature\n  if (!verifySignature(event)) {\n    throw new Error(\"Invalid signature\");\n  }\n\n  \u002F\u002F Publish to appropriate topic\n  await producer.send({\n    topic: `linear.${event.type.toLowerCase()}`,\n    messages: [{\n      key: event.data.id,\n      value: JSON.stringify(event),\n      headers: {\n        action: event.action,\n        timestamp: event.webhookTimestamp.toString(),\n      },\n    }],\n  });\n}\n\n\u002F\u002F services\u002Fevent-processor.ts\nconst consumer = kafka.consumer({ groupId: \"linear-processor\" });\n\nawait consumer.subscribe({ topics: [\"linear.issue\", \"linear.comment\"] });\n\nawait consumer.run({\n  eachMessage: async ({ topic, message }) => {\n    const event = JSON.parse(message.value!.toString());\n\n    switch (topic) {\n      case \"linear.issue\":\n        await processIssueEvent(event);\n        break;\n      case \"linear.comment\":\n        await processCommentEvent(event);\n        break;\n    }\n  },\n});\n```\n\n### Pattern 4: CQRS with Event Sourcing\nBest for: Complex domains, audit requirements\n\n```\n┌─────────────────────────────────────────────────────────────────────┐\n│                         Command Side                                 │\n├─────────────────────────────────────────────────────────────────────┤\n│  Commands → Command Handler → Event Store → Event Publisher         │\n└─────────────────────────────────────────────────────────────────────┘\n                                       │\n                                       ▼\n┌─────────────────────────────────────────────────────────────────────┐\n│                          Query Side                                  │\n├─────────────────────────────────────────────────────────────────────┤\n│  Event Subscriber → Projector → Read Models → Query API             │\n└─────────────────────────────────────────────────────────────────────┘\n```\n\n```typescript\n\u002F\u002F cqrs\u002Fevent-store.ts\ninterface StoredEvent {\n  id: string;\n  aggregateId: string;\n  aggregateType: string;\n  eventType: string;\n  data: Record\u003Cstring, unknown>;\n  metadata: {\n    userId: string;\n    correlationId: string;\n    causationId: string;\n    timestamp: Date;\n  };\n  version: number;\n}\n\nclass EventStore {\n  async append(aggregateId: string, events: StoredEvent[]): Promise\u003Cvoid> {\n    await db.transaction(async (tx) => {\n      for (const event of events) {\n        await tx.insert(eventsTable).values(event);\n      }\n    });\n\n    \u002F\u002F Publish to subscribers\n    for (const event of events) {\n      await eventBus.publish(event);\n    }\n  }\n\n  async getEvents(aggregateId: string): Promise\u003CStoredEvent[]> {\n    return db.select().from(eventsTable)\n      .where(eq(eventsTable.aggregateId, aggregateId))\n      .orderBy(eventsTable.version);\n  }\n}\n\n\u002F\u002F Projector for read model\nclass IssueProjector {\n  @Subscribe(\"IssueCreated\")\n  async onIssueCreated(event: StoredEvent): Promise\u003Cvoid> {\n    await db.insert(issueReadModel).values({\n      id: event.aggregateId,\n      ...event.data,\n      createdAt: event.metadata.timestamp,\n    });\n  }\n\n  @Subscribe(\"IssueUpdated\")\n  async onIssueUpdated(event: StoredEvent): Promise\u003Cvoid> {\n    await db.update(issueReadModel)\n      .set(event.data)\n      .where(eq(issueReadModel.id, event.aggregateId));\n  }\n}\n```\n\n## Project Structure\n```\nlinear-integration\u002F\n├── src\u002F\n│   ├── api\u002F                    # REST\u002FGraphQL API\n│   │   ├── routes\u002F\n│   │   └── middleware\u002F\n│   ├── services\u002F               # Business logic\n│   │   ├── issue-service.ts\n│   │   ├── project-service.ts\n│   │   └── sync-service.ts\n│   ├── infrastructure\u002F         # External integrations\n│   │   ├── linear\u002F\n│   │   │   ├── client.ts\n│   │   │   ├── cache.ts\n│   │   │   └── webhook-handler.ts\n│   │   ├── database\u002F\n│   │   └── cache\u002F\n│   ├── domain\u002F                 # Domain models\n│   │   ├── issue.ts\n│   │   └── project.ts\n│   └── config\u002F                 # Configuration\n│       └── index.ts\n├── tests\u002F\n│   ├── unit\u002F\n│   ├── integration\u002F\n│   └── e2e\u002F\n└── infrastructure\u002F             # IaC\n    ├── terraform\u002F\n    └── kubernetes\u002F\n```\n\n## Resources\n- [Linear API Best Practices](https:\u002F\u002Fdevelopers.linear.app\u002Fdocs\u002Fgraphql\u002Fbest-practices)\n- [Event-Driven Architecture](https:\u002F\u002Fmartinfowler.com\u002Farticles\u002F201701-event-driven.html)\n- [CQRS Pattern](https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FCQRS.html)\n\n## Next Steps\nConfigure multi-environment setup with `linear-multi-env-setup`.\n","# Linear Reference Architecture\n\n## Overview\nProduction-grade architectural patterns for Linear integrations.\n\n## Prerequisites\n- Understanding of distributed systems\n- Experience with cloud infrastructure\n- Familiarity with event-driven architecture\n\n## Architecture Patterns\n\n### Pattern 1: Simple Integration\nBest for: Small teams, single applications\n\n```\n┌─────────────────────────────────────────────────────────┐\n│                    Your Application                      │\n├─────────────────────────────────────────────────────────┤\n│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  │\n│  │ Linear SDK   │  │ Cache Layer  │  │ Webhook      │  │\n│  │ (API calls)  │  │ (In-memory)  │  │ Handler      │  │\n│  └──────────────┘  └──────────────┘  └──────────────┘  │\n└─────────────────────────────────────────────────────────┘\n                         │\n                         ▼\n              ┌──────────────────────┐\n              │   Linear API         │\n              │   api.linear.app     │\n              └──────────────────────┘\n```\n\n```typescript\n\u002F\u002F Simple architecture implementation\n\u002F\u002F lib\u002Fsimple-linear.ts\nimport { LinearClient } from \"@linear\u002Fsdk\";\n\nconst cache = new Map\u003Cstring, { data: any; expires: number }>();\n\nexport class SimpleLinearService {\n  private client: LinearClient;\n\n  constructor() {\n    this.client = new LinearClient({\n      apiKey: process.env.LINEAR_API_KEY!,\n    });\n  }\n\n  async getWithCache\u003CT>(key: string, fetcher: () => Promise\u003CT>, ttl = 300): Promise\u003CT> {\n    const cached = cache.get(key);\n    if (cached && cached.expires > Date.now()) {\n      return cached.data;\n    }\n\n    const data = await fetcher();\n    cache.set(key, { data, expires: Date.now() + ttl * 1000 });\n    return data;\n  }\n\n  async getTeams() {\n    return this.getWithCache(\"teams\", () => this.client.teams());\n  }\n}\n```\n\n### Pattern 2: Service-Oriented Architecture\nBest for: Medium teams, multiple applications\n\n```\n┌────────────────────────────────────────────────────────────────┐\n│                       API Gateway                               │\n└────────────────────────────────────────────────────────────────┘\n         │                    │                    │\n         ▼                    ▼                    ▼\n┌─────────────────┐  ┌─────────────────┐  ┌─────────────────────┐\n│ Issues Service  │  │ Projects Service│  │ Notifications Svc   │\n│ (CRUD + sync)   │  │ (Planning)      │  │ (Slack, Email)      │\n└─────────────────┘  └─────────────────┘  └─────────────────────┘\n         │                    │                    │\n         └────────────────────┼────────────────────┘\n                              ▼\n                    ┌─────────────────┐\n                    │ Linear Gateway  │\n                    │ (Rate limiting, │\n                    │  caching, auth) │\n                    └─────────────────┘\n                              │\n                              ▼\n                    ┌─────────────────┐\n                    │   Linear API    │\n                    └─────────────────┘\n```\n\n```typescript\n\u002F\u002F lib\u002Flinear-gateway.ts\nimport { LinearClient } from \"@linear\u002Fsdk\";\nimport Redis from \"ioredis\";\n\nexport class LinearGateway {\n  private client: LinearClient;\n  private redis: Redis;\n  private rateLimiter: RateLimiter;\n\n  constructor() {\n    this.client = new LinearClient({ apiKey: process.env.LINEAR_API_KEY! });\n    this.redis = new Redis(process.env.REDIS_URL);\n    this.rateLimiter = new RateLimiter({\n      maxRequests: 1000, \u002F\u002F Leave buffer from 1500 limit\n      windowMs: 60000,\n    });\n  }\n\n  async execute\u003CT>(operation: string, fn: () => Promise\u003CT>): Promise\u003CT> {\n    \u002F\u002F Check cache first\n    const cacheKey = `linear:${operation}`;\n    const cached = await this.redis.get(cacheKey);\n    if (cached) return JSON.parse(cached);\n\n    \u002F\u002F Rate limit\n    await this.rateLimiter.acquire();\n\n    \u002F\u002F Execute with metrics\n    const start = Date.now();\n    try {\n      const result = await fn();\n\n      \u002F\u002F Cache result\n      await this.redis.setex(cacheKey, 60, JSON.stringify(result));\n\n      \u002F\u002F Record metrics\n      metrics.requestDuration.observe(Date.now() - start);\n\n      return result;\n    } catch (error) {\n      metrics.errors.inc({ operation });\n      throw error;\n    }\n  }\n}\n```\n\n### Pattern 3: Event-Driven Architecture\nBest for: Large teams, real-time requirements\n\n```\n┌─────────────────────────────────────────────────────────────────────┐\n│                        Event Bus (Kafka\u002FSQS)                        │\n└─────────────────────────────────────────────────────────────────────┘\n         ▲                         │                        │\n         │                         ▼                        ▼\n┌─────────────────┐       ┌─────────────────┐      ┌─────────────────┐\n│ Webhook Ingester│       │ Event Processor │      │ Notification    │\n│ (Linear events) │       │ (Business logic)│      │ Service         │\n└─────────────────┘       └─────────────────┘      └─────────────────┘\n                                   │\n                                   ▼\n                          ┌─────────────────┐\n                          │ State Store     │\n                          │ (PostgreSQL)    │\n                          └─────────────────┘\n                                   │\n                                   ▼\n                          ┌─────────────────┐\n                          │ Linear Sync     │\n                          │ (Outbound)      │\n                          └─────────────────┘\n                                   │\n                                   ▼\n                          ┌─────────────────┐\n                          │   Linear API    │\n                          └─────────────────┘\n```\n\n```typescript\n\u002F\u002F services\u002Fwebhook-ingester.ts\nimport { Kafka } from \"kafkajs\";\n\nconst kafka = new Kafka({\n  brokers: [process.env.KAFKA_BROKER!],\n});\n\nconst producer = kafka.producer();\n\nexport async function ingestWebhook(event: LinearWebhookEvent): Promise\u003Cvoid> {\n  \u002F\u002F Verify signature\n  if (!verifySignature(event)) {\n    throw new Error(\"Invalid signature\");\n  }\n\n  \u002F\u002F Publish to appropriate topic\n  await producer.send({\n    topic: `linear.${event.type.toLowerCase()}`,\n    messages: [{\n      key: event.data.id,\n      value: JSON.stringify(event),\n      headers: {\n        action: event.action,\n        timestamp: event.webhookTimestamp.toString(),\n      },\n    }],\n  });\n}\n\n\u002F\u002F services\u002Fevent-processor.ts\nconst consumer = kafka.consumer({ groupId: \"linear-processor\" });\n\nawait consumer.subscribe({ topics: [\"linear.issue\", \"linear.comment\"] });\n\nawait consumer.run({\n  eachMessage: async ({ topic, message }) => {\n    const event = JSON.parse(message.value!.toString());\n\n    switch (topic) {\n      case \"linear.issue\":\n        await processIssueEvent(event);\n        break;\n      case \"linear.comment\":\n        await processCommentEvent(event);\n        break;\n    }\n  },\n});\n```\n\n### Pattern 4: CQRS with Event Sourcing\nBest for: Complex domains, audit requirements\n\n```\n┌─────────────────────────────────────────────────────────────────────┐\n│                         Command Side                                 │\n├─────────────────────────────────────────────────────────────────────┤\n│  Commands → Command Handler → Event Store → Event Publisher         │\n└─────────────────────────────────────────────────────────────────────┘\n                                       │\n                                       ▼\n┌─────────────────────────────────────────────────────────────────────┐\n│                          Query Side                                  │\n├─────────────────────────────────────────────────────────────────────┤\n│  Event Subscriber → Projector → Read Models → Query API             │\n└─────────────────────────────────────────────────────────────────────┘\n```\n\n```typescript\n\u002F\u002F cqrs\u002Fevent-store.ts\ninterface StoredEvent {\n  id: string;\n  aggregateId: string;\n  aggregateType: string;\n  eventType: string;\n  data: Record\u003Cstring, unknown>;\n  metadata: {\n    userId: string;\n    correlationId: string;\n    causationId: string;\n    timestamp: Date;\n  };\n  version: number;\n}\n\nclass EventStore {\n  async append(aggregateId: string, events: StoredEvent[]): Promise\u003Cvoid> {\n    await db.transaction(async (tx) => {\n      for (const event of events) {\n        await tx.insert(eventsTable).values(event);\n      }\n    });\n\n    \u002F\u002F Publish to subscribers\n    for (const event of events) {\n      await eventBus.publish(event);\n    }\n  }\n\n  async getEvents(aggregateId: string): Promise\u003CStoredEvent[]> {\n    return db.select().from(eventsTable)\n      .where(eq(eventsTable.aggregateId, aggregateId))\n      .orderBy(eventsTable.version);\n  }\n}\n\n\u002F\u002F Projector for read model\nclass IssueProjector {\n  @Subscribe(\"IssueCreated\")\n  async onIssueCreated(event: StoredEvent): Promise\u003Cvoid> {\n    await db.insert(issueReadModel).values({\n      id: event.aggregateId,\n      ...event.data,\n      createdAt: event.metadata.timestamp,\n    });\n  }\n\n  @Subscribe(\"IssueUpdated\")\n  async onIssueUpdated(event: StoredEvent): Promise\u003Cvoid> {\n    await db.update(issueReadModel)\n      .set(event.data)\n      .where(eq(issueReadModel.id, event.aggregateId));\n  }\n}\n```\n\n## Project Structure\n```\nlinear-integration\u002F\n├── src\u002F\n│   ├── api\u002F                    # REST\u002FGraphQL API\n│   │   ├── routes\u002F\n│   │   └── middleware\u002F\n│   ├── services\u002F               # Business logic\n│   │   ├── issue-service.ts\n│   │   ├── project-service.ts\n│   │   └── sync-service.ts\n│   ├── infrastructure\u002F         # External integrations\n│   │   ├── linear\u002F\n│   │   │   ├── client.ts\n│   │   │   ├── cache.ts\n│   │   │   └── webhook-handler.ts\n│   │   ├── database\u002F\n│   │   └── cache\u002F\n│   ├── domain\u002F                 # Domain models\n│   │   ├── issue.ts\n│   │   └── project.ts\n│   └── config\u002F                 # Configuration\n│       └── index.ts\n├── tests\u002F\n│   ├── unit\u002F\n│   ├── integration\u002F\n│   └── e2e\u002F\n└── infrastructure\u002F             # IaC\n    ├── terraform\u002F\n    └── kubernetes\u002F\n```\n\n## Resources\n- [Linear API Best Practices](https:\u002F\u002Fdevelopers.linear.app\u002Fdocs\u002Fgraphql\u002Fbest-practices)\n- [Event-Driven Architecture](https:\u002F\u002Fmartinfowler.com\u002Farticles\u002F201701-event-driven.html)\n- [CQRS Pattern](https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FCQRS.html)\n\n## Next Steps\nConfigure multi-environment setup with `linear-multi-env-setup`.\n",{"name":5,"author":45,"license":15,"version":46,"description":47,"allowed-tools":48},"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Production-grade Linear integration architecture patterns.\nUse when designing system architecture, planning integrations,\nor reviewing architectural decisions.\nTrigger with phrases like \"linear architecture\", \"linear system design\",\n\"linear integration patterns\", \"linear best practices architecture\".\n","Read, Write, Edit, Grep","main","90b50ed0778745a80fd5bfb13b1843d45b9e82f7","tests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Flinear-pack\u002Fskills\u002Flinear-reference-architecture",231,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust","https:\u002F\u002Fgithub.com\u002FDicklesworthstone","https:\u002F\u002Fwww.jeffreyemanuel.com\u002F","Building in NY","2026-11-12 03:15:57",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add Dicklesworthstone\u002Fpi_agent_rust --skill linear-reference-architecture",{"tool":64,"command":65},"bunx","bunx skills add Dicklesworthstone\u002Fpi_agent_rust --skill linear-reference-architecture",{"tool":67,"command":68},"pnpm","pnpm dlx skills add Dicklesworthstone\u002Fpi_agent_rust --skill linear-reference-architecture","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Flinear-pack\u002Fskills\u002Flinear-reference-architecture\u002FSKILL.md",true,[],[73,113,137,163,189,211],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":77,"licenseFileUrl":78,"sourceHtmlUrl":79,"categories":80,"keywords":86,"publishedAt":40},"01M6FEGPPK0ZTKCCM0R3E3KS33","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FSKILL.md",[81],{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,29,105,106,107,108,109,110,111,112],"web artifacts builder","web","artifacts","artifacts builder","builder","frontend","css","components","react","component","routing","state management","state","shadcn","file","ui","Tools","Tailwind","html","single-file","simple","ui components","multi","for","jsx","suite",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":77,"licenseFileUrl":117,"sourceHtmlUrl":118,"categories":119,"keywords":124,"publishedAt":40},"01M6FEE9VTK1W4GY21AKREJXRG","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FSKILL.md",[120,123],{"categoryNo":121,"categoryName":122,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},[125,126,127,92,128,129,88,130,131,132,102,133,134,135,136,25,110],"testing","webapp testing","webapp","screenshots","playwright","debugging","toolkit","browser","logs","applications","behavior","local",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":141,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":40},"01M6FE20F7ZTQBFWKF4MPJ2SBX","neuropixels-analysis","Neuropixels neural recording analysis. Load SpikeGLX\u002FOpenEphys data, preprocess, motion correction, Kilosort4 spike sorting, quality metrics, Allen\u002FIBL curation, AI-assisted visual analysis, for Neuropixels 1.0\u002F2.0 extracellular electrophysiology. Use when working with neural recordings, spike sorting, extracellular electrophysiology, or when the user mentions Neuropixels, SpikeGLX, Open Ephys, Kilosort, quality metrics, or unit curation.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fneuropixels-analysis\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fneuropixels-analysis\u002FSKILL.md",[],[145,146,147,148,149,150,151,152,29,153,154,155,156,157,158,159,25,160,161,162,110,23],"analysis","neuropixels analysis","spike","metrics","data","open","quality","user","recordings","Neural","motion","visual","quality metrics","unit","sorting","curation","recording","load",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":77,"licenseFileUrl":167,"sourceHtmlUrl":168,"categories":169,"keywords":173,"publishedAt":40},"01M6FDP0PDK6F1GGX395C7625Z","skill-creator","Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fskill-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fskill-creator\u002FSKILL.md",[170],{"categoryNo":171,"categoryName":172,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000023","Skill与智能体开发",[174,175,176,177,178,179,180,181,35,182,183,184,185,186,25,110,187,23,188],"skill creator","creator","workflows","create","update","capabilities","knowledge","tool","specialized","guide","new skill","existing skill","users","Existing","new",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":193,"sourceHtmlUrl":194,"categories":195,"keywords":197,"publishedAt":40},"01M6FDM8Y7VK7NYG9SM7QPA3PW","notebooklm","Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automation, library management, persistent auth. Drastically reduced hallucinations through document-only responses.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fnotebooklm\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fnotebooklm\u002FSKILL.md",[196],{"categoryNo":171,"categoryName":172,"taxonomyType":84,"taxonomyTypeDesc":85},[191,198,199,200,201,202,203,132,204,205,29,206,207,208,209,110,210],"google","browser automation","gemini","automation","auth","code","library","management","only","document","query","Citation","source",{"skillNo":212,"name":213,"nameZh":6,"description":214,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":77,"licenseFileUrl":215,"sourceHtmlUrl":216,"categories":217,"keywords":224,"publishedAt":40},"01M6FDHPXE10J3XGTCH5HBHS1M","slack-gif-creator","Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like \"make me a GIF of X doing Y for Slack.\"","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fenterprise-communication\u002Fslack-gif-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fenterprise-communication\u002Fslack-gif-creator\u002FSKILL.md",[218,221],{"categoryNo":219,"categoryName":220,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":222,"categoryName":223,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000016","图像与多媒体",[225,226,227,175,228,103,229,230,180,29,231,186,232,233,234,110,235,23],"slack gif creator","slack","gif","validation","constraints","Animation","me","make","Utilities","concepts","request"]