[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F8DMX6SEAZF64ZCG2N0RTC":3,"skill-same:01M6F8DMX6SEAZF64ZCG2N0RTC":76},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":59,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M6F8DMX6SEAZF64ZCG2N0RTC","openevidence-reference-architecture",null,"Implement OpenEvidence reference architecture with best-practice project layout.\nUse when designing new clinical AI integrations, reviewing project structure,\nor establishing architecture standards for healthcare applications.\nTrigger with phrases like \"openevidence architecture\", \"openevidence best practices\",\n\"openevidence project structure\", \"clinical ai architecture\".","Dicklesworthstone\u002Fpi_agent_rust","Dicklesworthstone","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F35050222?v=4","01M6CG26AR942CSVMN1M5E3DSE","Jeff Emanuel","01M6CG26EPP71PSHW1VDS71121",1992,"MIT","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fopenevidence-pack\u002Fskills\u002Fopenevidence-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,40,41,42,43],"architecture","openevidence reference architecture","reference","structure","new","when","for","ai architecture","with","architecture standards","trigger","io","clinical","layout","project","implement","standards","best-practice","use","read","integrations","healthcare","applications","best practices","project structure","2026-11-10 10:12:30",false,"---\nname: openevidence-reference-architecture\ndescription: |\n  Implement OpenEvidence reference architecture with best-practice project layout.\n  Use when designing new clinical AI integrations, reviewing project structure,\n  or establishing architecture standards for healthcare applications.\n  Trigger with phrases like \"openevidence architecture\", \"openevidence best practices\",\n  \"openevidence project structure\", \"clinical ai architecture\".\nallowed-tools: Read, Grep\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\n---\n\n# OpenEvidence Reference Architecture\n\n## Overview\nProduction-ready architecture patterns for OpenEvidence clinical AI integrations in healthcare environments.\n\n## Prerequisites\n- Understanding of layered architecture\n- OpenEvidence SDK knowledge\n- Healthcare compliance requirements\n- TypeScript\u002FNode.js project setup\n\n## Project Structure\n\n```\nclinical-evidence-api\u002F\n├── src\u002F\n│   ├── openevidence\u002F\n│   │   ├── client.ts           # Singleton client wrapper\n│   │   ├── config.ts           # Environment configuration\n│   │   ├── types.ts            # TypeScript types\n│   │   ├── errors.ts           # Custom error classes\n│   │   ├── cache.ts            # Caching layer\n│   │   └── handlers\u002F\n│   │       ├── webhooks.ts     # Webhook handlers\n│   │       └── events.ts       # Event processing\n│   ├── services\u002F\n│   │   └── clinical\u002F\n│   │       ├── index.ts        # Service facade\n│   │       ├── query.ts        # Clinical query service\n│   │       ├── deepconsult.ts  # DeepConsult service\n│   │       └── drug-info.ts    # Drug information service\n│   ├── api\u002F\n│   │   ├── routes\u002F\n│   │   │   ├── clinical.ts     # Clinical query endpoints\n│   │   │   └── webhooks.ts     # Webhook endpoints\n│   │   └── middleware\u002F\n│   │       ├── auth.ts         # Authentication\n│   │       ├── audit.ts        # HIPAA audit logging\n│   │       └── rate-limit.ts   # Rate limiting\n│   ├── integrations\u002F\n│   │   ├── ehr\u002F\n│   │   │   ├── fhir.ts         # FHIR integration\n│   │   │   ├── epic.ts         # Epic EHR hooks\n│   │   │   └── cerner.ts       # Cerner integration\n│   │   └── notifications\u002F\n│   │       ├── email.ts        # Email notifications\n│   │       └── push.ts         # Push notifications\n│   ├── compliance\u002F\n│   │   ├── hipaa\u002F\n│   │   │   ├── audit-log.ts    # HIPAA audit logging\n│   │   │   ├── phi-handler.ts  # PHI sanitization\n│   │   │   └── encryption.ts   # Data encryption\n│   │   └── retention.ts        # Data retention policies\n│   └── jobs\u002F\n│       ├── cleanup.ts          # Data cleanup job\n│       └── reporting.ts        # Usage reporting job\n├── tests\u002F\n│   ├── unit\u002F\n│   │   └── services\u002F\n│   ├── integration\u002F\n│   │   └── openevidence\u002F\n│   └── clinical-validation\u002F\n│       └── known-answers\u002F\n├── config\u002F\n│   ├── default.json\n│   ├── development.json\n│   ├── staging.json\n│   └── production.json\n├── docs\u002F\n│   ├── architecture.md\n│   ├── runbook.md\n│   └── api-reference.md\n└── scripts\u002F\n    ├── migrate.sh\n    └── deploy.sh\n```\n\n## Layer Architecture\n\n```\n┌─────────────────────────────────────────────────────┐\n│                  API Layer                           │\n│   (Controllers, Routes, Webhooks, Middleware)        │\n├─────────────────────────────────────────────────────┤\n│                Service Layer                         │\n│    (Business Logic, Orchestration, Validation)       │\n├─────────────────────────────────────────────────────┤\n│              OpenEvidence Layer                      │\n│     (Client, Types, Caching, Error Handling)         │\n├─────────────────────────────────────────────────────┤\n│             Compliance Layer                         │\n│       (HIPAA Audit, PHI Handling, Encryption)        │\n├─────────────────────────────────────────────────────┤\n│            Integration Layer                         │\n│    (EHR\u002FFHIR, Notifications, External Services)      │\n├─────────────────────────────────────────────────────┤\n│            Infrastructure Layer                      │\n│      (Database, Cache, Queue, Monitoring)            │\n└─────────────────────────────────────────────────────┘\n```\n\n## Key Components\n\n### Step 1: Client Wrapper with Caching & Monitoring\n```typescript\n\u002F\u002F src\u002Fopenevidence\u002Fclient.ts\nimport { OpenEvidenceClient } from '@openevidence\u002Fsdk';\nimport { ClinicalQueryCache } from '.\u002Fcache';\nimport { MetricsCollector } from '..\u002Fmonitoring\u002Fmetrics';\nimport { HIPAAAuditLogger } from '..\u002Fcompliance\u002Fhipaa\u002Faudit-log';\n\nexport interface OpenEvidenceServiceConfig {\n  apiKey: string;\n  orgId: string;\n  baseUrl: string;\n  timeout: number;\n  cache: ClinicalQueryCache;\n  metrics: MetricsCollector;\n  auditLogger: HIPAAAuditLogger;\n}\n\nexport class OpenEvidenceService {\n  private client: OpenEvidenceClient;\n  private cache: ClinicalQueryCache;\n  private metrics: MetricsCollector;\n  private auditLogger: HIPAAAuditLogger;\n\n  constructor(config: OpenEvidenceServiceConfig) {\n    this.client = new OpenEvidenceClient({\n      apiKey: config.apiKey,\n      orgId: config.orgId,\n      baseUrl: config.baseUrl,\n      timeout: config.timeout,\n    });\n    this.cache = config.cache;\n    this.metrics = config.metrics;\n    this.auditLogger = config.auditLogger;\n  }\n\n  async query(\n    request: ClinicalQueryRequest,\n    context: RequestContext\n  ): Promise\u003CClinicalQueryResponse> {\n    const timer = this.metrics.startTimer('clinical_query');\n\n    try {\n      \u002F\u002F Check cache\n      const cached = await this.cache.get(request.question, request.context);\n      if (cached) {\n        this.metrics.incrementCounter('cache_hit');\n        timer.stop({ cached: 'true' });\n        return cached;\n      }\n      this.metrics.incrementCounter('cache_miss');\n\n      \u002F\u002F Query API\n      const response = await this.client.query(request);\n\n      \u002F\u002F Cache response\n      await this.cache.set(request.question, request.context, response);\n\n      \u002F\u002F Audit log (without PHI)\n      await this.auditLogger.logQuery(context.userId, context.userRole, response.id, true);\n\n      timer.stop({ cached: 'false' });\n      return response;\n    } catch (error: any) {\n      this.metrics.incrementCounter('query_error', { error: error.code });\n      await this.auditLogger.logQuery(context.userId, context.userRole, null, false);\n      timer.stop({ error: 'true' });\n      throw error;\n    }\n  }\n\n  async deepConsult(\n    request: DeepConsultRequest,\n    context: RequestContext\n  ): Promise\u003Cstring> {\n    \u002F\u002F Return consultId for async tracking\n    const consultId = await this.client.deepConsult.create(request);\n    await this.auditLogger.logDeepConsult(context.userId, context.userRole, consultId, true);\n    return consultId;\n  }\n\n  async health(): Promise\u003CHealthStatus> {\n    try {\n      const start = Date.now();\n      await this.client.health.check();\n      return {\n        status: 'healthy',\n        latencyMs: Date.now() - start,\n      };\n    } catch (error: any) {\n      return { status: 'unhealthy', error: error.message };\n    }\n  }\n}\n```\n\n### Step 2: Service Facade\n```typescript\n\u002F\u002F src\u002Fservices\u002Fclinical\u002Findex.ts\nimport { OpenEvidenceService } from '..\u002F..\u002Fopenevidence\u002Fclient';\nimport { PHIHandler } from '..\u002F..\u002Fcompliance\u002Fhipaa\u002Fphi-handler';\n\nexport class ClinicalEvidenceService {\n  constructor(\n    private openEvidence: OpenEvidenceService,\n    private phiHandler: PHIHandler\n  ) {}\n\n  async queryClinicalEvidence(\n    question: string,\n    patientContext: PatientContext | undefined,\n    context: RequestContext\n  ): Promise\u003CFormattedClinicalAnswer> {\n    \u002F\u002F 1. Sanitize input (remove PHI)\n    const sanitizedRequest = this.phiHandler.sanitizeQuery(question, patientContext);\n\n    \u002F\u002F 2. Query OpenEvidence\n    const response = await this.openEvidence.query(sanitizedRequest, context);\n\n    \u002F\u002F 3. Format response for clinical use\n    return this.formatClinicalAnswer(response);\n  }\n\n  async requestDeepConsult(\n    question: string,\n    options: DeepConsultOptions,\n    context: RequestContext\n  ): Promise\u003C{ consultId: string; estimatedTime: number }> {\n    const sanitizedQuestion = this.phiHandler.sanitizeText(question);\n\n    const consultId = await this.openEvidence.deepConsult({\n      question: sanitizedQuestion,\n      context: {\n        specialty: options.specialty,\n        researchFocus: options.researchFocus,\n        timeframe: options.timeframe,\n      },\n    }, context);\n\n    return {\n      consultId,\n      estimatedTime: 180, \u002F\u002F 3 minutes typical\n    };\n  }\n\n  async checkDrugInteraction(\n    drugs: string[],\n    context: RequestContext\n  ): Promise\u003CDrugInteractionResult> {\n    const question = `What are the drug interactions between ${drugs.join(' and ')}?`;\n\n    const response = await this.openEvidence.query({\n      question,\n      context: {\n        specialty: 'pharmacology',\n        urgency: 'urgent',\n      },\n    }, context);\n\n    return this.parseDrugInteractionResponse(response);\n  }\n\n  private formatClinicalAnswer(response: ClinicalQueryResponse): FormattedClinicalAnswer {\n    return {\n      summary: response.answer.split('.')[0] + '.',\n      detailedAnswer: response.answer,\n      citations: response.citations.map(c => ({\n        source: c.source,\n        title: c.title,\n        year: c.year,\n      })),\n      confidence: {\n        score: response.confidence,\n        level: response.confidence > 0.9 ? 'high' : response.confidence > 0.7 ? 'moderate' : 'low',\n      },\n      disclaimer: 'For clinical decision support only. Verify with current guidelines.',\n    };\n  }\n\n  private parseDrugInteractionResponse(response: ClinicalQueryResponse): DrugInteractionResult {\n    \u002F\u002F Parse response to structured format\n    const answerLower = response.answer.toLowerCase();\n\n    return {\n      hasInteraction: !answerLower.includes('no significant interaction'),\n      severity: this.determineSeverity(answerLower),\n      details: response.answer,\n      citations: response.citations,\n    };\n  }\n\n  private determineSeverity(text: string): 'major' | 'moderate' | 'minor' | 'none' {\n    if (text.includes('contraindicated') || text.includes('major')) return 'major';\n    if (text.includes('moderate') || text.includes('caution')) return 'moderate';\n    if (text.includes('minor')) return 'minor';\n    return 'none';\n  }\n}\n```\n\n### Step 3: EHR Integration Layer\n```typescript\n\u002F\u002F src\u002Fintegrations\u002Fehr\u002Ffhir.ts\nimport { ClinicalEvidenceService } from '..\u002F..\u002Fservices\u002Fclinical';\n\n\u002F\u002F HL7 FHIR CDS Hooks implementation\ninterface CDSHooksRequest {\n  hook: string;\n  hookInstance: string;\n  context: {\n    patientId: string;\n    encounterId?: string;\n    medications?: FHIRMedication[];\n    conditions?: FHIRCondition[];\n  };\n  prefetch?: {\n    patient?: FHIRPatient;\n    medications?: FHIRBundle\u003CFHIRMedication>;\n  };\n}\n\ninterface CDSHooksResponse {\n  cards: CDSCard[];\n}\n\nexport class FHIRIntegration {\n  constructor(private clinicalService: ClinicalEvidenceService) {}\n\n  async handleCDSHook(request: CDSHooksRequest): Promise\u003CCDSHooksResponse> {\n    switch (request.hook) {\n      case 'medication-prescribe':\n        return this.handleMedicationPrescribe(request);\n      case 'order-sign':\n        return this.handleOrderSign(request);\n      default:\n        return { cards: [] };\n    }\n  }\n\n  private async handleMedicationPrescribe(\n    request: CDSHooksRequest\n  ): Promise\u003CCDSHooksResponse> {\n    const medications = request.context.medications?.map(\n      m => m.medicationCodeableConcept?.text\n    ).filter(Boolean) as string[];\n\n    if (medications.length \u003C 2) {\n      return { cards: [] };\n    }\n\n    \u002F\u002F Check for drug interactions\n    const interaction = await this.clinicalService.checkDrugInteraction(\n      medications,\n      { userId: 'system', userRole: 'cds-hook' }\n    );\n\n    if (!interaction.hasInteraction) {\n      return { cards: [] };\n    }\n\n    return {\n      cards: [{\n        uuid: crypto.randomUUID(),\n        summary: `Drug Interaction Alert: ${medications.join(', ')}`,\n        detail: interaction.details,\n        indicator: interaction.severity === 'major' ? 'critical' : 'warning',\n        source: {\n          label: 'OpenEvidence Clinical Decision Support',\n          url: 'https:\u002F\u002Fopenevidence.com',\n        },\n        suggestions: interaction.severity === 'major' ? [{\n          label: 'Review alternatives',\n          uuid: crypto.randomUUID(),\n        }] : undefined,\n      }],\n    };\n  }\n\n  private async handleOrderSign(request: CDSHooksRequest): Promise\u003CCDSHooksResponse> {\n    \u002F\u002F Similar implementation for order signing\n    return { cards: [] };\n  }\n}\n```\n\n## Data Flow Diagram\n\n```\nUser\u002FEHR Request\n       │\n       ▼\n┌─────────────────┐\n│   API Gateway   │\n│  (Auth, Rate)   │\n└────────┬────────┘\n         │\n         ▼\n┌─────────────────┐    ┌─────────────────┐\n│  PHI Sanitizer  │───▶│   HIPAA Audit   │\n└────────┬────────┘    └─────────────────┘\n         │\n         ▼\n┌─────────────────┐    ┌─────────────────┐\n│  Clinical       │───▶│   Cache Layer   │\n│  Query Service  │    │   (Redis)       │\n└────────┬────────┘    └────────┬────────┘\n         │                      │\n         ▼ (cache miss)         │\n┌─────────────────┐             │\n│  OpenEvidence   │◄────────────┘\n│  API Client     │   (cache hit)\n└────────┬────────┘\n         │\n         ▼\n┌─────────────────┐\n│  OpenEvidence   │\n│  Cloud API      │\n└─────────────────┘\n```\n\n## Configuration Management\n\n```typescript\n\u002F\u002F src\u002Fconfig\u002Findex.ts\nimport convict from 'convict';\n\nconst config = convict({\n  env: {\n    doc: 'Application environment',\n    format: ['development', 'staging', 'production'],\n    default: 'development',\n    env: 'NODE_ENV',\n  },\n  openevidence: {\n    apiKey: {\n      doc: 'OpenEvidence API key',\n      format: String,\n      default: '',\n      env: 'OPENEVIDENCE_API_KEY',\n      sensitive: true,\n    },\n    orgId: {\n      doc: 'OpenEvidence organization ID',\n      format: String,\n      default: '',\n      env: 'OPENEVIDENCE_ORG_ID',\n    },\n    baseUrl: {\n      doc: 'OpenEvidence API base URL',\n      format: 'url',\n      default: 'https:\u002F\u002Fapi.openevidence.com',\n      env: 'OPENEVIDENCE_BASE_URL',\n    },\n    timeout: {\n      doc: 'Request timeout in milliseconds',\n      format: 'int',\n      default: 30000,\n      env: 'OPENEVIDENCE_TIMEOUT',\n    },\n  },\n  cache: {\n    enabled: {\n      doc: 'Enable caching',\n      format: Boolean,\n      default: true,\n    },\n    ttlSeconds: {\n      doc: 'Default cache TTL',\n      format: 'int',\n      default: 3600,\n    },\n  },\n  hipaa: {\n    auditLogRetentionDays: {\n      doc: 'HIPAA audit log retention',\n      format: 'int',\n      default: 2190, \u002F\u002F 6 years\n    },\n  },\n});\n\nconfig.loadFile(`.\u002Fconfig\u002F${config.get('env')}.json`);\nconfig.validate({ allowed: 'strict' });\n\nexport default config;\n```\n\n## Output\n- Layered architecture with separation of concerns\n- HIPAA-compliant data handling\n- EHR integration ready\n- Comprehensive caching\n- Health checks and monitoring\n\n## Architecture Checklist\n- [ ] Layered architecture implemented\n- [ ] PHI sanitization in place\n- [ ] HIPAA audit logging\n- [ ] Caching strategy configured\n- [ ] EHR integration patterns\n- [ ] Health checks implemented\n- [ ] Configuration management\n- [ ] Error boundaries at each layer\n\n## Resources\n- [HL7 FHIR](https:\u002F\u002Fwww.hl7.org\u002Ffhir\u002F)\n- [CDS Hooks](https:\u002F\u002Fcds-hooks.hl7.org\u002F)\n- [SMART on FHIR](https:\u002F\u002Fsmarthealthit.org\u002F)\n\n## Flagship Skills\nFor multi-environment setup, see `openevidence-multi-env-setup`.\n","# OpenEvidence Reference Architecture\n\n## Overview\nProduction-ready architecture patterns for OpenEvidence clinical AI integrations in healthcare environments.\n\n## Prerequisites\n- Understanding of layered architecture\n- OpenEvidence SDK knowledge\n- Healthcare compliance requirements\n- TypeScript\u002FNode.js project setup\n\n## Project Structure\n\n```\nclinical-evidence-api\u002F\n├── src\u002F\n│   ├── openevidence\u002F\n│   │   ├── client.ts           # Singleton client wrapper\n│   │   ├── config.ts           # Environment configuration\n│   │   ├── types.ts            # TypeScript types\n│   │   ├── errors.ts           # Custom error classes\n│   │   ├── cache.ts            # Caching layer\n│   │   └── handlers\u002F\n│   │       ├── webhooks.ts     # Webhook handlers\n│   │       └── events.ts       # Event processing\n│   ├── services\u002F\n│   │   └── clinical\u002F\n│   │       ├── index.ts        # Service facade\n│   │       ├── query.ts        # Clinical query service\n│   │       ├── deepconsult.ts  # DeepConsult service\n│   │       └── drug-info.ts    # Drug information service\n│   ├── api\u002F\n│   │   ├── routes\u002F\n│   │   │   ├── clinical.ts     # Clinical query endpoints\n│   │   │   └── webhooks.ts     # Webhook endpoints\n│   │   └── middleware\u002F\n│   │       ├── auth.ts         # Authentication\n│   │       ├── audit.ts        # HIPAA audit logging\n│   │       └── rate-limit.ts   # Rate limiting\n│   ├── integrations\u002F\n│   │   ├── ehr\u002F\n│   │   │   ├── fhir.ts         # FHIR integration\n│   │   │   ├── epic.ts         # Epic EHR hooks\n│   │   │   └── cerner.ts       # Cerner integration\n│   │   └── notifications\u002F\n│   │       ├── email.ts        # Email notifications\n│   │       └── push.ts         # Push notifications\n│   ├── compliance\u002F\n│   │   ├── hipaa\u002F\n│   │   │   ├── audit-log.ts    # HIPAA audit logging\n│   │   │   ├── phi-handler.ts  # PHI sanitization\n│   │   │   └── encryption.ts   # Data encryption\n│   │   └── retention.ts        # Data retention policies\n│   └── jobs\u002F\n│       ├── cleanup.ts          # Data cleanup job\n│       └── reporting.ts        # Usage reporting job\n├── tests\u002F\n│   ├── unit\u002F\n│   │   └── services\u002F\n│   ├── integration\u002F\n│   │   └── openevidence\u002F\n│   └── clinical-validation\u002F\n│       └── known-answers\u002F\n├── config\u002F\n│   ├── default.json\n│   ├── development.json\n│   ├── staging.json\n│   └── production.json\n├── docs\u002F\n│   ├── architecture.md\n│   ├── runbook.md\n│   └── api-reference.md\n└── scripts\u002F\n    ├── migrate.sh\n    └── deploy.sh\n```\n\n## Layer Architecture\n\n```\n┌─────────────────────────────────────────────────────┐\n│                  API Layer                           │\n│   (Controllers, Routes, Webhooks, Middleware)        │\n├─────────────────────────────────────────────────────┤\n│                Service Layer                         │\n│    (Business Logic, Orchestration, Validation)       │\n├─────────────────────────────────────────────────────┤\n│              OpenEvidence Layer                      │\n│     (Client, Types, Caching, Error Handling)         │\n├─────────────────────────────────────────────────────┤\n│             Compliance Layer                         │\n│       (HIPAA Audit, PHI Handling, Encryption)        │\n├─────────────────────────────────────────────────────┤\n│            Integration Layer                         │\n│    (EHR\u002FFHIR, Notifications, External Services)      │\n├─────────────────────────────────────────────────────┤\n│            Infrastructure Layer                      │\n│      (Database, Cache, Queue, Monitoring)            │\n└─────────────────────────────────────────────────────┘\n```\n\n## Key Components\n\n### Step 1: Client Wrapper with Caching & Monitoring\n```typescript\n\u002F\u002F src\u002Fopenevidence\u002Fclient.ts\nimport { OpenEvidenceClient } from '@openevidence\u002Fsdk';\nimport { ClinicalQueryCache } from '.\u002Fcache';\nimport { MetricsCollector } from '..\u002Fmonitoring\u002Fmetrics';\nimport { HIPAAAuditLogger } from '..\u002Fcompliance\u002Fhipaa\u002Faudit-log';\n\nexport interface OpenEvidenceServiceConfig {\n  apiKey: string;\n  orgId: string;\n  baseUrl: string;\n  timeout: number;\n  cache: ClinicalQueryCache;\n  metrics: MetricsCollector;\n  auditLogger: HIPAAAuditLogger;\n}\n\nexport class OpenEvidenceService {\n  private client: OpenEvidenceClient;\n  private cache: ClinicalQueryCache;\n  private metrics: MetricsCollector;\n  private auditLogger: HIPAAAuditLogger;\n\n  constructor(config: OpenEvidenceServiceConfig) {\n    this.client = new OpenEvidenceClient({\n      apiKey: config.apiKey,\n      orgId: config.orgId,\n      baseUrl: config.baseUrl,\n      timeout: config.timeout,\n    });\n    this.cache = config.cache;\n    this.metrics = config.metrics;\n    this.auditLogger = config.auditLogger;\n  }\n\n  async query(\n    request: ClinicalQueryRequest,\n    context: RequestContext\n  ): Promise\u003CClinicalQueryResponse> {\n    const timer = this.metrics.startTimer('clinical_query');\n\n    try {\n      \u002F\u002F Check cache\n      const cached = await this.cache.get(request.question, request.context);\n      if (cached) {\n        this.metrics.incrementCounter('cache_hit');\n        timer.stop({ cached: 'true' });\n        return cached;\n      }\n      this.metrics.incrementCounter('cache_miss');\n\n      \u002F\u002F Query API\n      const response = await this.client.query(request);\n\n      \u002F\u002F Cache response\n      await this.cache.set(request.question, request.context, response);\n\n      \u002F\u002F Audit log (without PHI)\n      await this.auditLogger.logQuery(context.userId, context.userRole, response.id, true);\n\n      timer.stop({ cached: 'false' });\n      return response;\n    } catch (error: any) {\n      this.metrics.incrementCounter('query_error', { error: error.code });\n      await this.auditLogger.logQuery(context.userId, context.userRole, null, false);\n      timer.stop({ error: 'true' });\n      throw error;\n    }\n  }\n\n  async deepConsult(\n    request: DeepConsultRequest,\n    context: RequestContext\n  ): Promise\u003Cstring> {\n    \u002F\u002F Return consultId for async tracking\n    const consultId = await this.client.deepConsult.create(request);\n    await this.auditLogger.logDeepConsult(context.userId, context.userRole, consultId, true);\n    return consultId;\n  }\n\n  async health(): Promise\u003CHealthStatus> {\n    try {\n      const start = Date.now();\n      await this.client.health.check();\n      return {\n        status: 'healthy',\n        latencyMs: Date.now() - start,\n      };\n    } catch (error: any) {\n      return { status: 'unhealthy', error: error.message };\n    }\n  }\n}\n```\n\n### Step 2: Service Facade\n```typescript\n\u002F\u002F src\u002Fservices\u002Fclinical\u002Findex.ts\nimport { OpenEvidenceService } from '..\u002F..\u002Fopenevidence\u002Fclient';\nimport { PHIHandler } from '..\u002F..\u002Fcompliance\u002Fhipaa\u002Fphi-handler';\n\nexport class ClinicalEvidenceService {\n  constructor(\n    private openEvidence: OpenEvidenceService,\n    private phiHandler: PHIHandler\n  ) {}\n\n  async queryClinicalEvidence(\n    question: string,\n    patientContext: PatientContext | undefined,\n    context: RequestContext\n  ): Promise\u003CFormattedClinicalAnswer> {\n    \u002F\u002F 1. Sanitize input (remove PHI)\n    const sanitizedRequest = this.phiHandler.sanitizeQuery(question, patientContext);\n\n    \u002F\u002F 2. Query OpenEvidence\n    const response = await this.openEvidence.query(sanitizedRequest, context);\n\n    \u002F\u002F 3. Format response for clinical use\n    return this.formatClinicalAnswer(response);\n  }\n\n  async requestDeepConsult(\n    question: string,\n    options: DeepConsultOptions,\n    context: RequestContext\n  ): Promise\u003C{ consultId: string; estimatedTime: number }> {\n    const sanitizedQuestion = this.phiHandler.sanitizeText(question);\n\n    const consultId = await this.openEvidence.deepConsult({\n      question: sanitizedQuestion,\n      context: {\n        specialty: options.specialty,\n        researchFocus: options.researchFocus,\n        timeframe: options.timeframe,\n      },\n    }, context);\n\n    return {\n      consultId,\n      estimatedTime: 180, \u002F\u002F 3 minutes typical\n    };\n  }\n\n  async checkDrugInteraction(\n    drugs: string[],\n    context: RequestContext\n  ): Promise\u003CDrugInteractionResult> {\n    const question = `What are the drug interactions between ${drugs.join(' and ')}?`;\n\n    const response = await this.openEvidence.query({\n      question,\n      context: {\n        specialty: 'pharmacology',\n        urgency: 'urgent',\n      },\n    }, context);\n\n    return this.parseDrugInteractionResponse(response);\n  }\n\n  private formatClinicalAnswer(response: ClinicalQueryResponse): FormattedClinicalAnswer {\n    return {\n      summary: response.answer.split('.')[0] + '.',\n      detailedAnswer: response.answer,\n      citations: response.citations.map(c => ({\n        source: c.source,\n        title: c.title,\n        year: c.year,\n      })),\n      confidence: {\n        score: response.confidence,\n        level: response.confidence > 0.9 ? 'high' : response.confidence > 0.7 ? 'moderate' : 'low',\n      },\n      disclaimer: 'For clinical decision support only. Verify with current guidelines.',\n    };\n  }\n\n  private parseDrugInteractionResponse(response: ClinicalQueryResponse): DrugInteractionResult {\n    \u002F\u002F Parse response to structured format\n    const answerLower = response.answer.toLowerCase();\n\n    return {\n      hasInteraction: !answerLower.includes('no significant interaction'),\n      severity: this.determineSeverity(answerLower),\n      details: response.answer,\n      citations: response.citations,\n    };\n  }\n\n  private determineSeverity(text: string): 'major' | 'moderate' | 'minor' | 'none' {\n    if (text.includes('contraindicated') || text.includes('major')) return 'major';\n    if (text.includes('moderate') || text.includes('caution')) return 'moderate';\n    if (text.includes('minor')) return 'minor';\n    return 'none';\n  }\n}\n```\n\n### Step 3: EHR Integration Layer\n```typescript\n\u002F\u002F src\u002Fintegrations\u002Fehr\u002Ffhir.ts\nimport { ClinicalEvidenceService } from '..\u002F..\u002Fservices\u002Fclinical';\n\n\u002F\u002F HL7 FHIR CDS Hooks implementation\ninterface CDSHooksRequest {\n  hook: string;\n  hookInstance: string;\n  context: {\n    patientId: string;\n    encounterId?: string;\n    medications?: FHIRMedication[];\n    conditions?: FHIRCondition[];\n  };\n  prefetch?: {\n    patient?: FHIRPatient;\n    medications?: FHIRBundle\u003CFHIRMedication>;\n  };\n}\n\ninterface CDSHooksResponse {\n  cards: CDSCard[];\n}\n\nexport class FHIRIntegration {\n  constructor(private clinicalService: ClinicalEvidenceService) {}\n\n  async handleCDSHook(request: CDSHooksRequest): Promise\u003CCDSHooksResponse> {\n    switch (request.hook) {\n      case 'medication-prescribe':\n        return this.handleMedicationPrescribe(request);\n      case 'order-sign':\n        return this.handleOrderSign(request);\n      default:\n        return { cards: [] };\n    }\n  }\n\n  private async handleMedicationPrescribe(\n    request: CDSHooksRequest\n  ): Promise\u003CCDSHooksResponse> {\n    const medications = request.context.medications?.map(\n      m => m.medicationCodeableConcept?.text\n    ).filter(Boolean) as string[];\n\n    if (medications.length \u003C 2) {\n      return { cards: [] };\n    }\n\n    \u002F\u002F Check for drug interactions\n    const interaction = await this.clinicalService.checkDrugInteraction(\n      medications,\n      { userId: 'system', userRole: 'cds-hook' }\n    );\n\n    if (!interaction.hasInteraction) {\n      return { cards: [] };\n    }\n\n    return {\n      cards: [{\n        uuid: crypto.randomUUID(),\n        summary: `Drug Interaction Alert: ${medications.join(', ')}`,\n        detail: interaction.details,\n        indicator: interaction.severity === 'major' ? 'critical' : 'warning',\n        source: {\n          label: 'OpenEvidence Clinical Decision Support',\n          url: 'https:\u002F\u002Fopenevidence.com',\n        },\n        suggestions: interaction.severity === 'major' ? [{\n          label: 'Review alternatives',\n          uuid: crypto.randomUUID(),\n        }] : undefined,\n      }],\n    };\n  }\n\n  private async handleOrderSign(request: CDSHooksRequest): Promise\u003CCDSHooksResponse> {\n    \u002F\u002F Similar implementation for order signing\n    return { cards: [] };\n  }\n}\n```\n\n## Data Flow Diagram\n\n```\nUser\u002FEHR Request\n       │\n       ▼\n┌─────────────────┐\n│   API Gateway   │\n│  (Auth, Rate)   │\n└────────┬────────┘\n         │\n         ▼\n┌─────────────────┐    ┌─────────────────┐\n│  PHI Sanitizer  │───▶│   HIPAA Audit   │\n└────────┬────────┘    └─────────────────┘\n         │\n         ▼\n┌─────────────────┐    ┌─────────────────┐\n│  Clinical       │───▶│   Cache Layer   │\n│  Query Service  │    │   (Redis)       │\n└────────┬────────┘    └────────┬────────┘\n         │                      │\n         ▼ (cache miss)         │\n┌─────────────────┐             │\n│  OpenEvidence   │◄────────────┘\n│  API Client     │   (cache hit)\n└────────┬────────┘\n         │\n         ▼\n┌─────────────────┐\n│  OpenEvidence   │\n│  Cloud API      │\n└─────────────────┘\n```\n\n## Configuration Management\n\n```typescript\n\u002F\u002F src\u002Fconfig\u002Findex.ts\nimport convict from 'convict';\n\nconst config = convict({\n  env: {\n    doc: 'Application environment',\n    format: ['development', 'staging', 'production'],\n    default: 'development',\n    env: 'NODE_ENV',\n  },\n  openevidence: {\n    apiKey: {\n      doc: 'OpenEvidence API key',\n      format: String,\n      default: '',\n      env: 'OPENEVIDENCE_API_KEY',\n      sensitive: true,\n    },\n    orgId: {\n      doc: 'OpenEvidence organization ID',\n      format: String,\n      default: '',\n      env: 'OPENEVIDENCE_ORG_ID',\n    },\n    baseUrl: {\n      doc: 'OpenEvidence API base URL',\n      format: 'url',\n      default: 'https:\u002F\u002Fapi.openevidence.com',\n      env: 'OPENEVIDENCE_BASE_URL',\n    },\n    timeout: {\n      doc: 'Request timeout in milliseconds',\n      format: 'int',\n      default: 30000,\n      env: 'OPENEVIDENCE_TIMEOUT',\n    },\n  },\n  cache: {\n    enabled: {\n      doc: 'Enable caching',\n      format: Boolean,\n      default: true,\n    },\n    ttlSeconds: {\n      doc: 'Default cache TTL',\n      format: 'int',\n      default: 3600,\n    },\n  },\n  hipaa: {\n    auditLogRetentionDays: {\n      doc: 'HIPAA audit log retention',\n      format: 'int',\n      default: 2190, \u002F\u002F 6 years\n    },\n  },\n});\n\nconfig.loadFile(`.\u002Fconfig\u002F${config.get('env')}.json`);\nconfig.validate({ allowed: 'strict' });\n\nexport default config;\n```\n\n## Output\n- Layered architecture with separation of concerns\n- HIPAA-compliant data handling\n- EHR integration ready\n- Comprehensive caching\n- Health checks and monitoring\n\n## Architecture Checklist\n- [ ] Layered architecture implemented\n- [ ] PHI sanitization in place\n- [ ] HIPAA audit logging\n- [ ] Caching strategy configured\n- [ ] EHR integration patterns\n- [ ] Health checks implemented\n- [ ] Configuration management\n- [ ] Error boundaries at each layer\n\n## Resources\n- [HL7 FHIR](https:\u002F\u002Fwww.hl7.org\u002Ffhir\u002F)\n- [CDS Hooks](https:\u002F\u002Fcds-hooks.hl7.org\u002F)\n- [SMART on FHIR](https:\u002F\u002Fsmarthealthit.org\u002F)\n\n## Flagship Skills\nFor multi-environment setup, see `openevidence-multi-env-setup`.\n",{"name":5,"author":49,"license":15,"version":50,"description":51,"allowed-tools":52},"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Implement OpenEvidence reference architecture with best-practice project layout.\nUse when designing new clinical AI integrations, reviewing project structure,\nor establishing architecture standards for healthcare applications.\nTrigger with phrases like \"openevidence architecture\", \"openevidence best practices\",\n\"openevidence project structure\", \"clinical ai architecture\".\n","Read, Grep","main","90b50ed0778745a80fd5bfb13b1843d45b9e82f7","tests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fopenevidence-pack\u002Fskills\u002Fopenevidence-reference-architecture",233,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust","https:\u002F\u002Fgithub.com\u002FDicklesworthstone","https:\u002F\u002Fwww.jeffreyemanuel.com\u002F","Building in NY","2026-11-15 01:54:15",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add Dicklesworthstone\u002Fpi_agent_rust --skill openevidence-reference-architecture",{"tool":68,"command":69},"bunx","bunx skills add Dicklesworthstone\u002Fpi_agent_rust --skill openevidence-reference-architecture",{"tool":71,"command":72},"pnpm","pnpm dlx skills add Dicklesworthstone\u002Fpi_agent_rust --skill openevidence-reference-architecture","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fopenevidence-pack\u002Fskills\u002Fopenevidence-reference-architecture\u002FSKILL.md",true,[],[77,116,139,165,190,212],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":82,"sourceHtmlUrl":83,"categories":84,"keywords":90,"publishedAt":44},"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",[85],{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,37,109,110,111,112,113,25,114,115],"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","jsx","suite",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":120,"sourceHtmlUrl":121,"categories":122,"keywords":127,"publishedAt":44},"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",[123,126],{"categoryNo":124,"categoryName":125,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},[128,129,130,96,131,132,92,133,134,135,106,136,41,137,138,27,25],"testing","webapp testing","webapp","screenshots","playwright","debugging","toolkit","browser","logs","behavior","local",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":143,"sourceHtmlUrl":144,"categories":145,"keywords":146,"publishedAt":44},"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",[],[147,148,149,150,151,152,153,154,37,155,156,157,158,159,160,161,27,162,163,164,25,24],"analysis","neuropixels analysis","spike","metrics","data","open","quality","user","recordings","Neural","motion","visual","quality metrics","unit","sorting","curation","recording","load",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":169,"sourceHtmlUrl":170,"categories":171,"keywords":175,"publishedAt":44},"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",[172],{"categoryNo":173,"categoryName":174,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000023","Skill与智能体开发",[176,177,178,179,180,181,182,183,39,184,185,186,187,188,27,25,189,24,23],"skill creator","creator","workflows","create","update","capabilities","knowledge","tool","specialized","guide","new skill","existing skill","users","Existing",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":194,"sourceHtmlUrl":195,"categories":196,"keywords":198,"publishedAt":44},"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",[197],{"categoryNo":173,"categoryName":174,"taxonomyType":88,"taxonomyTypeDesc":89},[192,199,200,201,202,203,204,135,205,206,37,207,208,209,210,25,211],"google","browser automation","gemini","automation","auth","code","library","management","only","document","query","Citation","source",{"skillNo":213,"name":214,"nameZh":6,"description":215,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":216,"sourceHtmlUrl":217,"categories":218,"keywords":225,"publishedAt":44},"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",[219,222],{"categoryNo":220,"categoryName":221,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":223,"categoryName":224,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000016","图像与多媒体",[226,227,228,177,229,107,230,231,182,37,232,188,233,234,235,25,236,24],"slack gif creator","slack","gif","validation","constraints","Animation","me","make","Utilities","concepts","request"]