[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F6C08HE4QPZ33PM0X8GFPS":3,"skill-same:01M6F6C08HE4QPZ33PM0X8GFPS":80},{"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":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":60,"repositoryHtmlUrl":61,"repositoryHomepageUrl":62,"ownerHtmlUrl":63,"ownerBlogUrl":6,"ownerDescription":64,"updatedAt":65,"install":66,"resources":79},"01M6F6C08HE4QPZ33PM0X8GFPS","abridge-upgrade-migration",null,"Plan and execute Abridge integration upgrades and EHR migration procedures.\nUse when upgrading Abridge API versions, migrating between EHR systems,\nor handling breaking changes in clinical documentation workflows.\nTrigger: \"abridge upgrade\", \"abridge migration\", \"abridge version update\",\n\"migrate abridge EHR\", \"abridge breaking changes\".","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fabridge-upgrade-migration\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"abridge upgrade migration","abridge","upgrade","migration","write","trigger","io","clinical","clinical documentation","edit","workflows","read","plan","migrate","Bash","healthcare","api","code","update","documentation","2026-11-10 10:12:30",false,"---\nname: abridge-upgrade-migration\ndescription: |\n  Plan and execute Abridge integration upgrades and EHR migration procedures.\n  Use when upgrading Abridge API versions, migrating between EHR systems,\n  or handling breaking changes in clinical documentation workflows.\n  Trigger: \"abridge upgrade\", \"abridge migration\", \"abridge version update\",\n  \"migrate abridge EHR\", \"abridge breaking changes\".\nallowed-tools: Read, Write, Edit, Bash(npm:*), Grep\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ntags: [saas, healthcare, ai, abridge, migration]\ncompatible-with: claude-code\n---\n\n# Abridge Upgrade & Migration\n\n## Overview\n\nProcedures for upgrading Abridge API integrations and migrating between EHR systems. Healthcare migrations are high-risk — clinical documentation cannot have gaps.\n\n## Common Migration Scenarios\n\n| Scenario | Complexity | Downtime | Risk |\n|----------|-----------|----------|------|\n| API version bump (v1 → v2) | Medium | Zero (dual-version) | Low |\n| EHR migration (Epic → Athena) | High | Planned window | High |\n| New specialty onboarding | Low | Zero | Low |\n| Note template changes | Medium | Zero | Medium |\n| Multi-site rollout | High | Per-site windows | Medium |\n\n## Instructions\n\n### Step 1: API Version Migration\n\n```typescript\n\u002F\u002F src\u002Fmigration\u002Fapi-version-adapter.ts\n\u002F\u002F Dual-version adapter for zero-downtime API upgrades\n\ninterface ApiVersionConfig {\n  v1BaseUrl: string;  \u002F\u002F Current production\n  v2BaseUrl: string;  \u002F\u002F New version (canary)\n  canaryPercent: number;  \u002F\u002F Percentage of traffic to v2\n}\n\nclass AbridgeVersionAdapter {\n  constructor(private config: ApiVersionConfig) {}\n\n  getBaseUrl(): string {\n    \u002F\u002F Gradual canary rollout\n    const useV2 = Math.random() * 100 \u003C this.config.canaryPercent;\n    return useV2 ? this.config.v2BaseUrl : this.config.v1BaseUrl;\n  }\n\n  \u002F\u002F Map v1 response to v2 format (or vice versa)\n  normalizeNoteResponse(response: any, version: 'v1' | 'v2'): any {\n    if (version === 'v1') {\n      return {\n        ...response,\n        \u002F\u002F v2 adds quality_metrics — provide defaults for v1\n        quality_metrics: response.quality_metrics || {\n          confidence_score: response.confidence || 0,\n          completeness_score: 0,\n          coding_accuracy: 0,\n        },\n      };\n    }\n    return response;\n  }\n}\n```\n\n### Step 2: EHR Migration Procedure\n\n```typescript\n\u002F\u002F src\u002Fmigration\u002Fehr-migration.ts\ninterface EhrMigrationPlan {\n  sourceEhr: 'epic' | 'athena' | 'cerner' | 'eclinicalworks';\n  targetEhr: 'epic' | 'athena' | 'cerner' | 'eclinicalworks';\n  migrationDate: Date;\n  providerCount: number;\n  steps: MigrationStep[];\n}\n\ninterface MigrationStep {\n  order: number;\n  name: string;\n  description: string;\n  rollbackable: boolean;\n  estimatedMinutes: number;\n}\n\nfunction generateMigrationPlan(source: string, target: string): EhrMigrationPlan {\n  return {\n    sourceEhr: source as any,\n    targetEhr: target as any,\n    migrationDate: new Date(),\n    providerCount: 0, \u002F\u002F Set per org\n    steps: [\n      { order: 1, name: 'Freeze new enrollments', description: 'Stop new provider enrollments on source EHR', rollbackable: true, estimatedMinutes: 5 },\n      { order: 2, name: 'Export note templates', description: 'Export all custom note templates and SmartPhrases', rollbackable: true, estimatedMinutes: 30 },\n      { order: 3, name: 'Configure target EHR', description: 'Set up FHIR endpoints and OAuth for target EHR', rollbackable: true, estimatedMinutes: 60 },\n      { order: 4, name: 'Parallel run', description: 'Run both EHRs for 1 week — compare note output', rollbackable: true, estimatedMinutes: 10080 },\n      { order: 5, name: 'Provider re-enrollment', description: 'Re-enroll providers on target EHR', rollbackable: true, estimatedMinutes: 120 },\n      { order: 6, name: 'Cutover', description: 'Switch primary EHR integration to target', rollbackable: true, estimatedMinutes: 15 },\n      { order: 7, name: 'Decommission source', description: 'Disable source EHR integration after 30-day soak', rollbackable: false, estimatedMinutes: 30 },\n    ],\n  };\n}\n```\n\n### Step 3: Note Template Migration\n\n```typescript\n\u002F\u002F src\u002Fmigration\u002Ftemplate-migration.ts\ninterface NoteTemplate {\n  id: string;\n  name: string;\n  specialty: string;\n  sections: string[];\n  smartPhrases: Record\u003Cstring, string>;  \u002F\u002F Epic-specific\n}\n\nasync function migrateTemplates(\n  sourceApi: any,\n  targetApi: any,\n): Promise\u003C{ migrated: number; failed: string[] }> {\n  const { data: templates } = await sourceApi.get('\u002Fnote-templates');\n  const failed: string[] = [];\n  let migrated = 0;\n\n  for (const template of templates) {\n    try {\n      \u002F\u002F Remove EHR-specific fields\n      const { smartPhrases, ...portable } = template;\n\n      await targetApi.post('\u002Fnote-templates', {\n        ...portable,\n        \u002F\u002F Map SmartPhrases to target EHR equivalent if applicable\n      });\n      migrated++;\n    } catch (err) {\n      failed.push(template.id);\n    }\n  }\n\n  return { migrated, failed };\n}\n```\n\n## Rollback Procedures\n\n```bash\n#!\u002Fbin\u002Fbash\n# scripts\u002Fabridge-migration-rollback.sh\n\necho \"=== Migration Rollback ===\"\necho \"Step 1: Revert FHIR endpoint to source EHR\"\necho \"Step 2: Re-enable source EHR Abridge module\"\necho \"Step 3: Notify providers of rollback\"\necho \"Step 4: Verify note generation on source EHR\"\necho \"=== Rollback Complete ===\"\n```\n\n## Output\n\n- Dual-version API adapter for zero-downtime upgrades\n- EHR migration plan with parallel run validation\n- Note template migration with rollback\n- Provider re-enrollment procedure\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| Template incompatible | EHR-specific fields | Strip EHR-specific data before migration |\n| Provider enrollment fails | Credentials not migrated | Re-issue provider credentials on target |\n| Note format mismatch | Different FHIR profiles | Map FHIR profiles between EHR systems |\n\n## Resources\n\n- [Abridge Platform](https:\u002F\u002Fwww.abridge.com\u002Fproduct)\n- [HL7 FHIR Migration Guide](https:\u002F\u002Fhl7.org\u002Ffhir\u002FR4\u002Fcomparison.html)\n\n## Next Steps\n\nFor CI\u002FCD pipeline setup, see `abridge-ci-integration`.\n\n","# Abridge Upgrade & Migration\n\n## Overview\n\nProcedures for upgrading Abridge API integrations and migrating between EHR systems. Healthcare migrations are high-risk — clinical documentation cannot have gaps.\n\n## Common Migration Scenarios\n\n| Scenario | Complexity | Downtime | Risk |\n|----------|-----------|----------|------|\n| API version bump (v1 → v2) | Medium | Zero (dual-version) | Low |\n| EHR migration (Epic → Athena) | High | Planned window | High |\n| New specialty onboarding | Low | Zero | Low |\n| Note template changes | Medium | Zero | Medium |\n| Multi-site rollout | High | Per-site windows | Medium |\n\n## Instructions\n\n### Step 1: API Version Migration\n\n```typescript\n\u002F\u002F src\u002Fmigration\u002Fapi-version-adapter.ts\n\u002F\u002F Dual-version adapter for zero-downtime API upgrades\n\ninterface ApiVersionConfig {\n  v1BaseUrl: string;  \u002F\u002F Current production\n  v2BaseUrl: string;  \u002F\u002F New version (canary)\n  canaryPercent: number;  \u002F\u002F Percentage of traffic to v2\n}\n\nclass AbridgeVersionAdapter {\n  constructor(private config: ApiVersionConfig) {}\n\n  getBaseUrl(): string {\n    \u002F\u002F Gradual canary rollout\n    const useV2 = Math.random() * 100 \u003C this.config.canaryPercent;\n    return useV2 ? this.config.v2BaseUrl : this.config.v1BaseUrl;\n  }\n\n  \u002F\u002F Map v1 response to v2 format (or vice versa)\n  normalizeNoteResponse(response: any, version: 'v1' | 'v2'): any {\n    if (version === 'v1') {\n      return {\n        ...response,\n        \u002F\u002F v2 adds quality_metrics — provide defaults for v1\n        quality_metrics: response.quality_metrics || {\n          confidence_score: response.confidence || 0,\n          completeness_score: 0,\n          coding_accuracy: 0,\n        },\n      };\n    }\n    return response;\n  }\n}\n```\n\n### Step 2: EHR Migration Procedure\n\n```typescript\n\u002F\u002F src\u002Fmigration\u002Fehr-migration.ts\ninterface EhrMigrationPlan {\n  sourceEhr: 'epic' | 'athena' | 'cerner' | 'eclinicalworks';\n  targetEhr: 'epic' | 'athena' | 'cerner' | 'eclinicalworks';\n  migrationDate: Date;\n  providerCount: number;\n  steps: MigrationStep[];\n}\n\ninterface MigrationStep {\n  order: number;\n  name: string;\n  description: string;\n  rollbackable: boolean;\n  estimatedMinutes: number;\n}\n\nfunction generateMigrationPlan(source: string, target: string): EhrMigrationPlan {\n  return {\n    sourceEhr: source as any,\n    targetEhr: target as any,\n    migrationDate: new Date(),\n    providerCount: 0, \u002F\u002F Set per org\n    steps: [\n      { order: 1, name: 'Freeze new enrollments', description: 'Stop new provider enrollments on source EHR', rollbackable: true, estimatedMinutes: 5 },\n      { order: 2, name: 'Export note templates', description: 'Export all custom note templates and SmartPhrases', rollbackable: true, estimatedMinutes: 30 },\n      { order: 3, name: 'Configure target EHR', description: 'Set up FHIR endpoints and OAuth for target EHR', rollbackable: true, estimatedMinutes: 60 },\n      { order: 4, name: 'Parallel run', description: 'Run both EHRs for 1 week — compare note output', rollbackable: true, estimatedMinutes: 10080 },\n      { order: 5, name: 'Provider re-enrollment', description: 'Re-enroll providers on target EHR', rollbackable: true, estimatedMinutes: 120 },\n      { order: 6, name: 'Cutover', description: 'Switch primary EHR integration to target', rollbackable: true, estimatedMinutes: 15 },\n      { order: 7, name: 'Decommission source', description: 'Disable source EHR integration after 30-day soak', rollbackable: false, estimatedMinutes: 30 },\n    ],\n  };\n}\n```\n\n### Step 3: Note Template Migration\n\n```typescript\n\u002F\u002F src\u002Fmigration\u002Ftemplate-migration.ts\ninterface NoteTemplate {\n  id: string;\n  name: string;\n  specialty: string;\n  sections: string[];\n  smartPhrases: Record\u003Cstring, string>;  \u002F\u002F Epic-specific\n}\n\nasync function migrateTemplates(\n  sourceApi: any,\n  targetApi: any,\n): Promise\u003C{ migrated: number; failed: string[] }> {\n  const { data: templates } = await sourceApi.get('\u002Fnote-templates');\n  const failed: string[] = [];\n  let migrated = 0;\n\n  for (const template of templates) {\n    try {\n      \u002F\u002F Remove EHR-specific fields\n      const { smartPhrases, ...portable } = template;\n\n      await targetApi.post('\u002Fnote-templates', {\n        ...portable,\n        \u002F\u002F Map SmartPhrases to target EHR equivalent if applicable\n      });\n      migrated++;\n    } catch (err) {\n      failed.push(template.id);\n    }\n  }\n\n  return { migrated, failed };\n}\n```\n\n## Rollback Procedures\n\n```bash\n#!\u002Fbin\u002Fbash\n# scripts\u002Fabridge-migration-rollback.sh\n\necho \"=== Migration Rollback ===\"\necho \"Step 1: Revert FHIR endpoint to source EHR\"\necho \"Step 2: Re-enable source EHR Abridge module\"\necho \"Step 3: Notify providers of rollback\"\necho \"Step 4: Verify note generation on source EHR\"\necho \"=== Rollback Complete ===\"\n```\n\n## Output\n\n- Dual-version API adapter for zero-downtime upgrades\n- EHR migration plan with parallel run validation\n- Note template migration with rollback\n- Provider re-enrollment procedure\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| Template incompatible | EHR-specific fields | Strip EHR-specific data before migration |\n| Provider enrollment fails | Credentials not migrated | Re-issue provider credentials on target |\n| Note format mismatch | Different FHIR profiles | Map FHIR profiles between EHR systems |\n\n## Resources\n\n- [Abridge Platform](https:\u002F\u002Fwww.abridge.com\u002Fproduct)\n- [HL7 FHIR Migration Guide](https:\u002F\u002Fhl7.org\u002Ffhir\u002FR4\u002Fcomparison.html)\n\n## Next Steps\n\nFor CI\u002FCD pipeline setup, see `abridge-ci-integration`.\n\n",{"name":5,"tags":49,"author":52,"license":15,"version":53,"description":54,"allowed-tools":55,"compatible-with":56},[50,39,51,25,27],"saas","ai","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Plan and execute Abridge integration upgrades and EHR migration procedures.\nUse when upgrading Abridge API versions, migrating between EHR systems,\nor handling breaking changes in clinical documentation workflows.\nTrigger: \"abridge upgrade\", \"abridge migration\", \"abridge version update\",\n\"migrate abridge EHR\", \"abridge breaking changes\".\n","Read, Write, Edit, Bash(npm:*), Grep","claude-code","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fabridge-upgrade-migration",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill abridge-upgrade-migration",{"tool":72,"command":73},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill abridge-upgrade-migration",{"tool":75,"command":76},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill abridge-upgrade-migration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fabridge-upgrade-migration\u002FSKILL.md",true,[],[81,95,105,114,120,127],{"skillNo":82,"name":83,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":91,"publishedAt":44},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[86],{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[92,93,94],"model","model hierarchy","model hierarchy skill",{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":101,"publishedAt":44},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[100],{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},[102,103,104],"MCP","zoom","zoom mcp",{"skillNo":106,"name":107,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":44},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[111,112,113,103],"sdk","zoom apps sdk","apps",{"skillNo":115,"name":116,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":44},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[116],{"skillNo":121,"name":122,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":126,"publishedAt":44},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[125],{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},[122],{"skillNo":128,"name":129,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":44},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[129]]