opencode-knowledge-work 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/LICENSE +212 -0
  2. package/README.md +124 -2
  3. package/content/bio-research/.mcp.json +48 -0
  4. package/content/bio-research/CONNECTORS.md +23 -0
  5. package/content/bio-research/LICENSE +202 -0
  6. package/content/bio-research/README.md +83 -0
  7. package/content/bio-research/skills/bio-research-instrument-data-to-allotrope/LICENSE.txt +201 -0
  8. package/content/bio-research/skills/bio-research-instrument-data-to-allotrope/SKILL.md +280 -0
  9. package/content/bio-research/skills/bio-research-instrument-data-to-allotrope/references/asm_schema_overview.md +226 -0
  10. package/content/bio-research/skills/bio-research-instrument-data-to-allotrope/references/field_classification_guide.md +503 -0
  11. package/content/bio-research/skills/bio-research-instrument-data-to-allotrope/references/flattening_guide.md +254 -0
  12. package/content/bio-research/skills/bio-research-instrument-data-to-allotrope/references/supported_instruments.md +151 -0
  13. package/content/bio-research/skills/bio-research-instrument-data-to-allotrope/requirements.txt +26 -0
  14. package/content/bio-research/skills/bio-research-instrument-data-to-allotrope/scripts/convert_to_asm.py +543 -0
  15. package/content/bio-research/skills/bio-research-instrument-data-to-allotrope/scripts/export_parser.py +481 -0
  16. package/content/bio-research/skills/bio-research-instrument-data-to-allotrope/scripts/flatten_asm.py +254 -0
  17. package/content/bio-research/skills/bio-research-instrument-data-to-allotrope/scripts/validate_asm.py +1102 -0
  18. package/content/bio-research/skills/bio-research-nextflow-development/LICENSE.txt +201 -0
  19. package/content/bio-research/skills/bio-research-nextflow-development/SKILL.md +290 -0
  20. package/content/bio-research/skills/bio-research-nextflow-development/references/geo-sra-acquisition.md +416 -0
  21. package/content/bio-research/skills/bio-research-nextflow-development/references/installation.md +96 -0
  22. package/content/bio-research/skills/bio-research-nextflow-development/references/pipelines/atacseq.md +138 -0
  23. package/content/bio-research/skills/bio-research-nextflow-development/references/pipelines/rnaseq.md +118 -0
  24. package/content/bio-research/skills/bio-research-nextflow-development/references/pipelines/sarek.md +145 -0
  25. package/content/bio-research/skills/bio-research-nextflow-development/references/troubleshooting.md +137 -0
  26. package/content/bio-research/skills/bio-research-nextflow-development/scripts/check_environment.py +452 -0
  27. package/content/bio-research/skills/bio-research-nextflow-development/scripts/config/genomes.yaml +148 -0
  28. package/content/bio-research/skills/bio-research-nextflow-development/scripts/config/pipelines/atacseq.yaml +187 -0
  29. package/content/bio-research/skills/bio-research-nextflow-development/scripts/config/pipelines/rnaseq.yaml +147 -0
  30. package/content/bio-research/skills/bio-research-nextflow-development/scripts/config/pipelines/sarek.yaml +233 -0
  31. package/content/bio-research/skills/bio-research-nextflow-development/scripts/detect_data_type.py +300 -0
  32. package/content/bio-research/skills/bio-research-nextflow-development/scripts/generate_samplesheet.py +455 -0
  33. package/content/bio-research/skills/bio-research-nextflow-development/scripts/manage_genomes.py +521 -0
  34. package/content/bio-research/skills/bio-research-nextflow-development/scripts/sra_geo_fetch.py +732 -0
  35. package/content/bio-research/skills/bio-research-nextflow-development/scripts/utils/__init__.py +69 -0
  36. package/content/bio-research/skills/bio-research-nextflow-development/scripts/utils/file_discovery.py +189 -0
  37. package/content/bio-research/skills/bio-research-nextflow-development/scripts/utils/ncbi_utils.py +808 -0
  38. package/content/bio-research/skills/bio-research-nextflow-development/scripts/utils/sample_inference.py +290 -0
  39. package/content/bio-research/skills/bio-research-nextflow-development/scripts/utils/validators.py +256 -0
  40. package/content/bio-research/skills/bio-research-scientific-problem-selection/LICENSE.txt +201 -0
  41. package/content/bio-research/skills/bio-research-scientific-problem-selection/SKILL.md +269 -0
  42. package/content/bio-research/skills/bio-research-scientific-problem-selection/references/01-intuition-pumps.md +264 -0
  43. package/content/bio-research/skills/bio-research-scientific-problem-selection/references/02-risk-assessment.md +323 -0
  44. package/content/bio-research/skills/bio-research-scientific-problem-selection/references/03-optimization-function.md +481 -0
  45. package/content/bio-research/skills/bio-research-scientific-problem-selection/references/04-parameter-strategy.md +396 -0
  46. package/content/bio-research/skills/bio-research-scientific-problem-selection/references/05-decision-tree.md +85 -0
  47. package/content/bio-research/skills/bio-research-scientific-problem-selection/references/06-adversity-planning.md +123 -0
  48. package/content/bio-research/skills/bio-research-scientific-problem-selection/references/07-problem-inversion.md +152 -0
  49. package/content/bio-research/skills/bio-research-scientific-problem-selection/references/08-integration-synthesis.md +173 -0
  50. package/content/bio-research/skills/bio-research-scientific-problem-selection/references/09-meta-framework.md +504 -0
  51. package/content/bio-research/skills/bio-research-scvi-tools/LICENSE.txt +201 -0
  52. package/content/bio-research/skills/bio-research-scvi-tools/SKILL.md +155 -0
  53. package/content/bio-research/skills/bio-research-scvi-tools/references/atac_peakvi.md +398 -0
  54. package/content/bio-research/skills/bio-research-scvi-tools/references/batch_correction_sysvi.md +417 -0
  55. package/content/bio-research/skills/bio-research-scvi-tools/references/citeseq_totalvi.md +420 -0
  56. package/content/bio-research/skills/bio-research-scvi-tools/references/data_preparation.md +286 -0
  57. package/content/bio-research/skills/bio-research-scvi-tools/references/environment_setup.md +254 -0
  58. package/content/bio-research/skills/bio-research-scvi-tools/references/label_transfer.md +373 -0
  59. package/content/bio-research/skills/bio-research-scvi-tools/references/multiome_multivi.md +384 -0
  60. package/content/bio-research/skills/bio-research-scvi-tools/references/rna_velocity_velovi.md +410 -0
  61. package/content/bio-research/skills/bio-research-scvi-tools/references/scarches_mapping.md +401 -0
  62. package/content/bio-research/skills/bio-research-scvi-tools/references/scrna_integration.md +429 -0
  63. package/content/bio-research/skills/bio-research-scvi-tools/references/spatial_deconvolution.md +438 -0
  64. package/content/bio-research/skills/bio-research-scvi-tools/references/troubleshooting.md +420 -0
  65. package/content/bio-research/skills/bio-research-scvi-tools/scripts/cluster_embed.py +212 -0
  66. package/content/bio-research/skills/bio-research-scvi-tools/scripts/differential_expression.py +220 -0
  67. package/content/bio-research/skills/bio-research-scvi-tools/scripts/integrate_datasets.py +237 -0
  68. package/content/bio-research/skills/bio-research-scvi-tools/scripts/model_utils.py +634 -0
  69. package/content/bio-research/skills/bio-research-scvi-tools/scripts/prepare_data.py +169 -0
  70. package/content/bio-research/skills/bio-research-scvi-tools/scripts/train_model.py +370 -0
  71. package/content/bio-research/skills/bio-research-scvi-tools/scripts/transfer_labels.py +224 -0
  72. package/content/bio-research/skills/bio-research-scvi-tools/scripts/validate_adata.py +397 -0
  73. package/content/bio-research/skills/bio-research-single-cell-rna-qc/LICENSE.txt +201 -0
  74. package/content/bio-research/skills/bio-research-single-cell-rna-qc/SKILL.md +175 -0
  75. package/content/bio-research/skills/bio-research-single-cell-rna-qc/references/scverse_qc_guidelines.md +186 -0
  76. package/content/bio-research/skills/bio-research-single-cell-rna-qc/scripts/qc_analysis.py +232 -0
  77. package/content/bio-research/skills/bio-research-single-cell-rna-qc/scripts/qc_core.py +233 -0
  78. package/content/bio-research/skills/bio-research-single-cell-rna-qc/scripts/qc_plotting.py +235 -0
  79. package/content/bio-research/skills/bio-research-start/SKILL.md +79 -0
  80. package/content/customer-support/.mcp.json +40 -0
  81. package/content/customer-support/CONNECTORS.md +19 -0
  82. package/content/customer-support/LICENSE +202 -0
  83. package/content/customer-support/README.md +140 -0
  84. package/content/customer-support/skills/customer-support-customer-escalation/SKILL.md +248 -0
  85. package/content/customer-support/skills/customer-support-customer-research/SKILL.md +252 -0
  86. package/content/customer-support/skills/customer-support-draft-response/SKILL.md +418 -0
  87. package/content/customer-support/skills/customer-support-kb-article/SKILL.md +351 -0
  88. package/content/customer-support/skills/customer-support-ticket-triage/SKILL.md +275 -0
  89. package/content/data/.mcp.json +36 -0
  90. package/content/data/CONNECTORS.md +18 -0
  91. package/content/data/LICENSE +202 -0
  92. package/content/data/README.md +121 -0
  93. package/content/data/skills/data-analyze/SKILL.md +119 -0
  94. package/content/data/skills/data-build-dashboard/SKILL.md +924 -0
  95. package/content/data/skills/data-create-viz/SKILL.md +154 -0
  96. package/content/data/skills/data-data-context-extractor/SKILL.md +227 -0
  97. package/content/data/skills/data-data-context-extractor/references/domain-template.md +147 -0
  98. package/content/data/skills/data-data-context-extractor/references/example-output.md +198 -0
  99. package/content/data/skills/data-data-context-extractor/references/skill-template.md +148 -0
  100. package/content/data/skills/data-data-context-extractor/references/sql-dialects.md +121 -0
  101. package/content/data/skills/data-data-context-extractor/scripts/package_data_skill.py +126 -0
  102. package/content/data/skills/data-data-visualization/SKILL.md +305 -0
  103. package/content/data/skills/data-explore-data/SKILL.md +325 -0
  104. package/content/data/skills/data-sql-queries/SKILL.md +428 -0
  105. package/content/data/skills/data-statistical-analysis/SKILL.md +245 -0
  106. package/content/data/skills/data-validate-data/SKILL.md +383 -0
  107. package/content/data/skills/data-write-query/SKILL.md +122 -0
  108. package/content/design/.mcp.json +44 -0
  109. package/content/design/CONNECTORS.md +18 -0
  110. package/content/design/README.md +117 -0
  111. package/content/design/skills/design-accessibility-review/SKILL.md +128 -0
  112. package/content/design/skills/design-design-critique/SKILL.md +118 -0
  113. package/content/design/skills/design-design-handoff/SKILL.md +131 -0
  114. package/content/design/skills/design-design-system/SKILL.md +190 -0
  115. package/content/design/skills/design-research-synthesis/SKILL.md +92 -0
  116. package/content/design/skills/design-user-research/SKILL.md +41 -0
  117. package/content/design/skills/design-ux-copy/SKILL.md +107 -0
  118. package/content/engineering/.mcp.json +48 -0
  119. package/content/engineering/CONNECTORS.md +19 -0
  120. package/content/engineering/README.md +136 -0
  121. package/content/engineering/skills/engineering-architecture/SKILL.md +85 -0
  122. package/content/engineering/skills/engineering-code-review/SKILL.md +118 -0
  123. package/content/engineering/skills/engineering-debug/SKILL.md +95 -0
  124. package/content/engineering/skills/engineering-deploy-checklist/SKILL.md +78 -0
  125. package/content/engineering/skills/engineering-documentation/SKILL.md +49 -0
  126. package/content/engineering/skills/engineering-incident-response/SKILL.md +158 -0
  127. package/content/engineering/skills/engineering-standup/SKILL.md +75 -0
  128. package/content/engineering/skills/engineering-system-design/SKILL.md +42 -0
  129. package/content/engineering/skills/engineering-tech-debt/SKILL.md +32 -0
  130. package/content/engineering/skills/engineering-testing-strategy/SKILL.md +33 -0
  131. package/content/enterprise-search/.mcp.json +36 -0
  132. package/content/enterprise-search/CONNECTORS.md +21 -0
  133. package/content/enterprise-search/LICENSE +202 -0
  134. package/content/enterprise-search/README.md +157 -0
  135. package/content/enterprise-search/skills/enterprise-search-digest/SKILL.md +173 -0
  136. package/content/enterprise-search/skills/enterprise-search-knowledge-synthesis/SKILL.md +258 -0
  137. package/content/enterprise-search/skills/enterprise-search-search/SKILL.md +178 -0
  138. package/content/enterprise-search/skills/enterprise-search-search-strategy/SKILL.md +222 -0
  139. package/content/enterprise-search/skills/enterprise-search-source-management/SKILL.md +173 -0
  140. package/content/finance/.mcp.json +32 -0
  141. package/content/finance/CONNECTORS.md +20 -0
  142. package/content/finance/LICENSE +202 -0
  143. package/content/finance/README.md +92 -0
  144. package/content/finance/skills/finance-audit-support/SKILL.md +374 -0
  145. package/content/finance/skills/finance-close-management/SKILL.md +221 -0
  146. package/content/finance/skills/finance-financial-statements/SKILL.md +335 -0
  147. package/content/finance/skills/finance-journal-entry/SKILL.md +131 -0
  148. package/content/finance/skills/finance-journal-entry-prep/SKILL.md +186 -0
  149. package/content/finance/skills/finance-reconciliation/SKILL.md +175 -0
  150. package/content/finance/skills/finance-sox-testing/SKILL.md +218 -0
  151. package/content/finance/skills/finance-variance-analysis/SKILL.md +266 -0
  152. package/content/human-resources/.mcp.json +28 -0
  153. package/content/human-resources/CONNECTORS.md +19 -0
  154. package/content/human-resources/README.md +138 -0
  155. package/content/human-resources/skills/human-resources-comp-analysis/SKILL.md +92 -0
  156. package/content/human-resources/skills/human-resources-draft-offer/SKILL.md +82 -0
  157. package/content/human-resources/skills/human-resources-interview-prep/SKILL.md +37 -0
  158. package/content/human-resources/skills/human-resources-onboarding/SKILL.md +104 -0
  159. package/content/human-resources/skills/human-resources-org-planning/SKILL.md +28 -0
  160. package/content/human-resources/skills/human-resources-people-report/SKILL.md +99 -0
  161. package/content/human-resources/skills/human-resources-performance-review/SKILL.md +149 -0
  162. package/content/human-resources/skills/human-resources-policy-lookup/SKILL.md +94 -0
  163. package/content/human-resources/skills/human-resources-recruiting-pipeline/SKILL.md +31 -0
  164. package/content/legal/.mcp.json +36 -0
  165. package/content/legal/CONNECTORS.md +21 -0
  166. package/content/legal/LICENSE +202 -0
  167. package/content/legal/README.md +234 -0
  168. package/content/legal/skills/legal-brief/SKILL.md +208 -0
  169. package/content/legal/skills/legal-compliance-check/SKILL.md +274 -0
  170. package/content/legal/skills/legal-legal-response/SKILL.md +457 -0
  171. package/content/legal/skills/legal-legal-risk-assessment/SKILL.md +265 -0
  172. package/content/legal/skills/legal-meeting-briefing/SKILL.md +220 -0
  173. package/content/legal/skills/legal-review-contract/SKILL.md +358 -0
  174. package/content/legal/skills/legal-signature-request/SKILL.md +104 -0
  175. package/content/legal/skills/legal-triage-nda/SKILL.md +262 -0
  176. package/content/legal/skills/legal-vendor-check/SKILL.md +159 -0
  177. package/content/manifest.json +86 -0
  178. package/content/marketing/.mcp.json +60 -0
  179. package/content/marketing/CONNECTORS.md +20 -0
  180. package/content/marketing/LICENSE +202 -0
  181. package/content/marketing/README.md +90 -0
  182. package/content/marketing/skills/marketing-brand-review/SKILL.md +276 -0
  183. package/content/marketing/skills/marketing-campaign-plan/SKILL.md +308 -0
  184. package/content/marketing/skills/marketing-competitive-brief/SKILL.md +331 -0
  185. package/content/marketing/skills/marketing-content-creation/SKILL.md +157 -0
  186. package/content/marketing/skills/marketing-draft-content/SKILL.md +117 -0
  187. package/content/marketing/skills/marketing-email-sequence/SKILL.md +220 -0
  188. package/content/marketing/skills/marketing-performance-report/SKILL.md +392 -0
  189. package/content/marketing/skills/marketing-seo-audit/SKILL.md +190 -0
  190. package/content/operations/.mcp.json +32 -0
  191. package/content/operations/CONNECTORS.md +20 -0
  192. package/content/operations/README.md +135 -0
  193. package/content/operations/skills/operations-capacity-plan/SKILL.md +113 -0
  194. package/content/operations/skills/operations-change-request/SKILL.md +121 -0
  195. package/content/operations/skills/operations-compliance-tracking/SKILL.md +44 -0
  196. package/content/operations/skills/operations-process-doc/SKILL.md +82 -0
  197. package/content/operations/skills/operations-process-optimization/SKILL.md +39 -0
  198. package/content/operations/skills/operations-risk-assessment/SKILL.md +40 -0
  199. package/content/operations/skills/operations-runbook/SKILL.md +87 -0
  200. package/content/operations/skills/operations-status-report/SKILL.md +77 -0
  201. package/content/operations/skills/operations-vendor-review/SKILL.md +104 -0
  202. package/content/pdf-viewer/.mcp.json +8 -0
  203. package/content/pdf-viewer/CONNECTORS.md +15 -0
  204. package/content/pdf-viewer/LICENSE +202 -0
  205. package/content/pdf-viewer/README.md +57 -0
  206. package/content/pdf-viewer/commands/annotate.md +51 -0
  207. package/content/pdf-viewer/commands/fill-form.md +73 -0
  208. package/content/pdf-viewer/commands/open.md +34 -0
  209. package/content/pdf-viewer/commands/sign.md +54 -0
  210. package/content/pdf-viewer/skills/pdf-viewer-view-pdf/SKILL.md +147 -0
  211. package/content/product-management/.mcp.json +72 -0
  212. package/content/product-management/CONNECTORS.md +22 -0
  213. package/content/product-management/LICENSE +202 -0
  214. package/content/product-management/README.md +118 -0
  215. package/content/product-management/commands/brainstorm.md +120 -0
  216. package/content/product-management/skills/product-management-competitive-brief/SKILL.md +302 -0
  217. package/content/product-management/skills/product-management-metrics-review/SKILL.md +388 -0
  218. package/content/product-management/skills/product-management-product-brainstorming/SKILL.md +273 -0
  219. package/content/product-management/skills/product-management-roadmap-update/SKILL.md +266 -0
  220. package/content/product-management/skills/product-management-sprint-planning/SKILL.md +94 -0
  221. package/content/product-management/skills/product-management-stakeholder-update/SKILL.md +352 -0
  222. package/content/product-management/skills/product-management-synthesize-research/SKILL.md +312 -0
  223. package/content/product-management/skills/product-management-write-spec/SKILL.md +250 -0
  224. package/content/productivity/.mcp.json +44 -0
  225. package/content/productivity/CONNECTORS.md +18 -0
  226. package/content/productivity/LICENSE +202 -0
  227. package/content/productivity/README.md +97 -0
  228. package/content/productivity/skills/dashboard.html +3111 -0
  229. package/content/productivity/skills/productivity-memory-management/SKILL.md +323 -0
  230. package/content/productivity/skills/productivity-start/SKILL.md +158 -0
  231. package/content/productivity/skills/productivity-task-management/SKILL.md +91 -0
  232. package/content/productivity/skills/productivity-update/SKILL.md +168 -0
  233. package/content/sales/.mcp.json +100 -0
  234. package/content/sales/CONNECTORS.md +36 -0
  235. package/content/sales/LICENSE +202 -0
  236. package/content/sales/README.md +148 -0
  237. package/content/sales/skills/sales-account-context/SKILL.md +94 -0
  238. package/content/sales/skills/sales-account-plan/SKILL.md +95 -0
  239. package/content/sales/skills/sales-account-research/SKILL.md +99 -0
  240. package/content/sales/skills/sales-account-tiering/SKILL.md +101 -0
  241. package/content/sales/skills/sales-call-prep/SKILL.md +111 -0
  242. package/content/sales/skills/sales-call-summary/SKILL.md +111 -0
  243. package/content/sales/skills/sales-close-plan/SKILL.md +106 -0
  244. package/content/sales/skills/sales-competitive-intelligence/SKILL.md +102 -0
  245. package/content/sales/skills/sales-create-an-asset/SKILL.md +105 -0
  246. package/content/sales/skills/sales-crm-hygiene-check/SKILL.md +103 -0
  247. package/content/sales/skills/sales-customer-health/SKILL.md +108 -0
  248. package/content/sales/skills/sales-customer-voice/SKILL.md +94 -0
  249. package/content/sales/skills/sales-daily-briefing/SKILL.md +61 -0
  250. package/content/sales/skills/sales-deal-advance-gap/SKILL.md +102 -0
  251. package/content/sales/skills/sales-deal-review/SKILL.md +105 -0
  252. package/content/sales/skills/sales-deal-signals/SKILL.md +96 -0
  253. package/content/sales/skills/sales-deal-slip-scenario/SKILL.md +101 -0
  254. package/content/sales/skills/sales-draft-outreach/SKILL.md +116 -0
  255. package/content/sales/skills/sales-end-of-day/SKILL.md +114 -0
  256. package/content/sales/skills/sales-expansion-whitespace/SKILL.md +97 -0
  257. package/content/sales/skills/sales-forecast/SKILL.md +100 -0
  258. package/content/sales/skills/sales-handle-objection/SKILL.md +93 -0
  259. package/content/sales/skills/sales-inbox-sweep/SKILL.md +114 -0
  260. package/content/sales/skills/sales-lead-triage/SKILL.md +105 -0
  261. package/content/sales/skills/sales-log-activity/SKILL.md +111 -0
  262. package/content/sales/skills/sales-pipeline-review/SKILL.md +97 -0
  263. package/content/sales/skills/sales-renewal-radar/SKILL.md +95 -0
  264. package/content/sales/skills/sales-rep-context/SKILL.md +90 -0
  265. package/content/sales/skills/sales-route-lead/SKILL.md +111 -0
  266. package/content/sales/skills/sales-schedule-meeting/SKILL.md +99 -0
  267. package/content/sales/skills/sales-setup/SKILL.md +195 -0
  268. package/content/sales/skills/sales-stakeholder-map/SKILL.md +107 -0
  269. package/content/sales/skills/sales-team-pipeline/SKILL.md +105 -0
  270. package/content/sales/skills/sales-update-opportunity/SKILL.md +111 -0
  271. package/content/sales/skills/sales-weekly-wrap/SKILL.md +90 -0
  272. package/content/sales/skills/sales-win-loss-review/SKILL.md +88 -0
  273. package/content/small-business/.mcp.json +148 -0
  274. package/content/small-business/README.md +117 -0
  275. package/content/small-business/skills/small-business-ad-manager/SKILL.md +128 -0
  276. package/content/small-business/skills/small-business-ad-manager/reference/ad_copy.md +112 -0
  277. package/content/small-business/skills/small-business-ad-manager/reference/change_playbook.md +127 -0
  278. package/content/small-business/skills/small-business-ad-manager/reference/data_sources.md +100 -0
  279. package/content/small-business/skills/small-business-ad-manager/reference/diagnostics.md +89 -0
  280. package/content/small-business/skills/small-business-ad-manager/reference/gotchas.md +181 -0
  281. package/content/small-business/skills/small-business-ap-processor/SKILL.md +158 -0
  282. package/content/small-business/skills/small-business-ap-processor/reference/coding_rules.md +70 -0
  283. package/content/small-business/skills/small-business-ap-processor/reference/gotchas.md +131 -0
  284. package/content/small-business/skills/small-business-ap-processor/reference/intake_and_extraction.md +82 -0
  285. package/content/small-business/skills/small-business-ap-processor/reference/matching_and_exceptions.md +80 -0
  286. package/content/small-business/skills/small-business-ap-processor/reference/payment_run.md +77 -0
  287. package/content/small-business/skills/small-business-brand-style/SKILL.md +106 -0
  288. package/content/small-business/skills/small-business-build-agent/SKILL.md +105 -0
  289. package/content/small-business/skills/small-business-build-agent/reference/capture.md +133 -0
  290. package/content/small-business/skills/small-business-build-agent/reference/gotchas.md +204 -0
  291. package/content/small-business/skills/small-business-build-agent/reference/skill_authoring.md +165 -0
  292. package/content/small-business/skills/small-business-build-connector/SKILL.md +102 -0
  293. package/content/small-business/skills/small-business-build-connector/reference/discovery.md +120 -0
  294. package/content/small-business/skills/small-business-build-connector/reference/gotchas.md +237 -0
  295. package/content/small-business/skills/small-business-build-connector/reference/paths.md +106 -0
  296. package/content/small-business/skills/small-business-build-connector/reference/use-zapier.md +128 -0
  297. package/content/small-business/skills/small-business-business-pulse/SKILL.md +181 -0
  298. package/content/small-business/skills/small-business-business-pulse/reference/data_sources.md +173 -0
  299. package/content/small-business/skills/small-business-business-pulse/reference/gotchas.md +103 -0
  300. package/content/small-business/skills/small-business-business-pulse/reference/output_template.md +109 -0
  301. package/content/small-business/skills/small-business-business-pulse/reference/thresholds.md +71 -0
  302. package/content/small-business/skills/small-business-business-pulse/reference/v2_sources.md +63 -0
  303. package/content/small-business/skills/small-business-call-list/SKILL.md +82 -0
  304. package/content/small-business/skills/small-business-canva-creator/SKILL.md +448 -0
  305. package/content/small-business/skills/small-business-canva-creator/reference/canva-api.md +208 -0
  306. package/content/small-business/skills/small-business-canva-creator/reference/examples/boutique-brief-campaign.md +181 -0
  307. package/content/small-business/skills/small-business-canva-creator/reference/gotchas.md +380 -0
  308. package/content/small-business/skills/small-business-canva-creator/reference/hubspot-staging.md +137 -0
  309. package/content/small-business/skills/small-business-cash-flow-snapshot/SKILL.md +251 -0
  310. package/content/small-business/skills/small-business-cash-flow-snapshot/reference/examples/worked-example.md +92 -0
  311. package/content/small-business/skills/small-business-cash-flow-snapshot/reference/gotchas.md +62 -0
  312. package/content/small-business/skills/small-business-cash-flow-snapshot/reference/v2_sources.md +84 -0
  313. package/content/small-business/skills/small-business-close-month/SKILL.md +86 -0
  314. package/content/small-business/skills/small-business-content-strategy/SKILL.md +152 -0
  315. package/content/small-business/skills/small-business-content-strategy/reference/examples/retail-boutique-example.md +71 -0
  316. package/content/small-business/skills/small-business-content-strategy/reference/gotchas.md +104 -0
  317. package/content/small-business/skills/small-business-content-strategy/reference/v2_sources.md +40 -0
  318. package/content/small-business/skills/small-business-contract-review/SKILL.md +158 -0
  319. package/content/small-business/skills/small-business-contract-review/reference/docusign-fetch.md +32 -0
  320. package/content/small-business/skills/small-business-contract-review/reference/examples/flagged-summary-saas.md +97 -0
  321. package/content/small-business/skills/small-business-contract-review/reference/gmail-fetch.md +30 -0
  322. package/content/small-business/skills/small-business-contract-review/reference/gotchas.md +105 -0
  323. package/content/small-business/skills/small-business-contract-review/reference/m365-fetch.md +60 -0
  324. package/content/small-business/skills/small-business-crm-autopilot/SKILL.md +162 -0
  325. package/content/small-business/skills/small-business-crm-autopilot/reference/cleanup-checklist.md +82 -0
  326. package/content/small-business/skills/small-business-crm-autopilot/reference/examples/cleanup-deal.md +83 -0
  327. package/content/small-business/skills/small-business-crm-autopilot/reference/examples/log-call-happy-path.md +68 -0
  328. package/content/small-business/skills/small-business-crm-autopilot/reference/examples/log-email-happy-path.md +50 -0
  329. package/content/small-business/skills/small-business-crm-autopilot/reference/gotchas.md +110 -0
  330. package/content/small-business/skills/small-business-crm-autopilot/reference/hubspot-fields.md +62 -0
  331. package/content/small-business/skills/small-business-crm-autopilot/reference/lightweight_crm.md +125 -0
  332. package/content/small-business/skills/small-business-crm-autopilot/reference/salesforce-fields.md +122 -0
  333. package/content/small-business/skills/small-business-crm-autopilot/reference/standing_mode.md +144 -0
  334. package/content/small-business/skills/small-business-grant-rfp-writer/SKILL.md +162 -0
  335. package/content/small-business/skills/small-business-grant-rfp-writer/reference/drafting.md +129 -0
  336. package/content/small-business/skills/small-business-grant-rfp-writer/reference/go_no_go.md +125 -0
  337. package/content/small-business/skills/small-business-grant-rfp-writer/reference/gotchas.md +180 -0
  338. package/content/small-business/skills/small-business-grant-rfp-writer/reference/opportunity_sources.md +90 -0
  339. package/content/small-business/skills/small-business-grant-rfp-writer/reference/org_profile.md +81 -0
  340. package/content/small-business/skills/small-business-grow-pipeline/SKILL.md +92 -0
  341. package/content/small-business/skills/small-business-growth-pulse/SKILL.md +143 -0
  342. package/content/small-business/skills/small-business-growth-pulse/reference/data_sources.md +113 -0
  343. package/content/small-business/skills/small-business-growth-pulse/reference/gotchas.md +175 -0
  344. package/content/small-business/skills/small-business-growth-pulse/reference/output_template.md +122 -0
  345. package/content/small-business/skills/small-business-growth-pulse/reference/thresholds.md +110 -0
  346. package/content/small-business/skills/small-business-hiring-screener/SKILL.md +137 -0
  347. package/content/small-business/skills/small-business-hiring-screener/reference/candidate_comms.md +132 -0
  348. package/content/small-business/skills/small-business-hiring-screener/reference/fair_screening.md +103 -0
  349. package/content/small-business/skills/small-business-hiring-screener/reference/gotchas.md +183 -0
  350. package/content/small-business/skills/small-business-hiring-screener/reference/onboarding.md +82 -0
  351. package/content/small-business/skills/small-business-hiring-screener/reference/rubric.md +122 -0
  352. package/content/small-business/skills/small-business-inbox-manager/SKILL.md +130 -0
  353. package/content/small-business/skills/small-business-inbox-manager/reference/digest_format.md +110 -0
  354. package/content/small-business/skills/small-business-inbox-manager/reference/gotchas.md +220 -0
  355. package/content/small-business/skills/small-business-inbox-manager/reference/handoffs.md +77 -0
  356. package/content/small-business/skills/small-business-inbox-manager/reference/reply_drafting.md +116 -0
  357. package/content/small-business/skills/small-business-inbox-manager/reference/triage_rules.md +72 -0
  358. package/content/small-business/skills/small-business-inventory-planner/SKILL.md +126 -0
  359. package/content/small-business/skills/small-business-inventory-planner/reference/data_sources.md +94 -0
  360. package/content/small-business/skills/small-business-inventory-planner/reference/gotchas.md +153 -0
  361. package/content/small-business/skills/small-business-inventory-planner/reference/po_drafting.md +92 -0
  362. package/content/small-business/skills/small-business-inventory-planner/reference/seasonality.md +112 -0
  363. package/content/small-business/skills/small-business-inventory-planner/reference/velocity_and_reorder.md +154 -0
  364. package/content/small-business/skills/small-business-invoice-chase/SKILL.md +131 -0
  365. package/content/small-business/skills/small-business-invoice-chase/reference/examples/firm-reminder.md +28 -0
  366. package/content/small-business/skills/small-business-invoice-chase/reference/examples/gentle-reminder.md +27 -0
  367. package/content/small-business/skills/small-business-invoice-chase/reference/gotchas.md +75 -0
  368. package/content/small-business/skills/small-business-invoice-chase/reference/tone-matching.md +44 -0
  369. package/content/small-business/skills/small-business-invoice-chase/reference/v2_sources.md +78 -0
  370. package/content/small-business/skills/small-business-job-post-builder/SKILL.md +204 -0
  371. package/content/small-business/skills/small-business-job-post-builder/reference/docusign-routing.md +63 -0
  372. package/content/small-business/skills/small-business-job-post-builder/reference/examples/worked-example.md +110 -0
  373. package/content/small-business/skills/small-business-job-post-builder/reference/existing-document-merge.md +58 -0
  374. package/content/small-business/skills/small-business-job-post-builder/reference/gotchas.md +68 -0
  375. package/content/small-business/skills/small-business-job-post-builder/reference/interview-guide-structure.md +93 -0
  376. package/content/small-business/skills/small-business-job-post-builder/reference/job-post-structure.md +62 -0
  377. package/content/small-business/skills/small-business-job-post-builder/reference/offer-letter-template.md +145 -0
  378. package/content/small-business/skills/small-business-job-post-builder/reference/role-intake.md +73 -0
  379. package/content/small-business/skills/small-business-lead-finder/SKILL.md +119 -0
  380. package/content/small-business/skills/small-business-lead-finder/reference/gotchas.md +152 -0
  381. package/content/small-business/skills/small-business-lead-finder/reference/icp_method.md +97 -0
  382. package/content/small-business/skills/small-business-lead-finder/reference/output_template.md +124 -0
  383. package/content/small-business/skills/small-business-lead-finder/reference/scoring.md +92 -0
  384. package/content/small-business/skills/small-business-lead-finder/reference/sourcing.md +78 -0
  385. package/content/small-business/skills/small-business-lead-triage/SKILL.md +81 -0
  386. package/content/small-business/skills/small-business-lead-triage/reference/examples/happy-path-triage.md +68 -0
  387. package/content/small-business/skills/small-business-lead-triage/reference/gotchas.md +76 -0
  388. package/content/small-business/skills/small-business-lead-triage/reference/hubspot-scoring.md +169 -0
  389. package/content/small-business/skills/small-business-marketing-monday/SKILL.md +108 -0
  390. package/content/small-business/skills/small-business-monday-brief/SKILL.md +97 -0
  391. package/content/small-business/skills/small-business-month-end-prep/SKILL.md +331 -0
  392. package/content/small-business/skills/small-business-month-end-prep/reference/close-packet-format.md +127 -0
  393. package/content/small-business/skills/small-business-month-end-prep/reference/examples/pl-narrative.md +52 -0
  394. package/content/small-business/skills/small-business-month-end-prep/reference/gotchas.md +113 -0
  395. package/content/small-business/skills/small-business-month-end-prep/reference/paypal-settlements.md +110 -0
  396. package/content/small-business/skills/small-business-month-end-prep/reference/quickbooks-reconcile.md +71 -0
  397. package/content/small-business/skills/small-business-month-end-prep/reference/v2_sources.md +125 -0
  398. package/content/small-business/skills/small-business-month-end-prep/reference/xero-reconcile.md +175 -0
  399. package/content/small-business/skills/small-business-month-end-prep/reference/zoho-books-reconcile.md +168 -0
  400. package/content/small-business/skills/small-business-outreach-composer/SKILL.md +144 -0
  401. package/content/small-business/skills/small-business-outreach-composer/reference/gotchas.md +213 -0
  402. package/content/small-business/skills/small-business-outreach-composer/reference/output_template.md +147 -0
  403. package/content/small-business/skills/small-business-outreach-composer/reference/sequence_patterns.md +99 -0
  404. package/content/small-business/skills/small-business-outreach-composer/reference/slop_test.md +164 -0
  405. package/content/small-business/skills/small-business-pay-the-bills/SKILL.md +101 -0
  406. package/content/small-business/skills/small-business-payroll-prep/SKILL.md +139 -0
  407. package/content/small-business/skills/small-business-payroll-prep/reference/anomaly_rules.md +99 -0
  408. package/content/small-business/skills/small-business-payroll-prep/reference/books_sync.md +72 -0
  409. package/content/small-business/skills/small-business-payroll-prep/reference/gotchas.md +153 -0
  410. package/content/small-business/skills/small-business-payroll-prep/reference/run_sheet_format.md +90 -0
  411. package/content/small-business/skills/small-business-payroll-prep/reference/timesheet_intake.md +118 -0
  412. package/content/small-business/skills/small-business-plan-payroll/SKILL.md +88 -0
  413. package/content/small-business/skills/small-business-proposal-builder/SKILL.md +168 -0
  414. package/content/small-business/skills/small-business-proposal-builder/reference/discovery_extraction.md +138 -0
  415. package/content/small-business/skills/small-business-proposal-builder/reference/gotchas.md +184 -0
  416. package/content/small-business/skills/small-business-proposal-builder/reference/output_template.md +128 -0
  417. package/content/small-business/skills/small-business-proposal-builder/reference/pricing_method.md +125 -0
  418. package/content/small-business/skills/small-business-proposal-builder/reference/proposal_structure.md +120 -0
  419. package/content/small-business/skills/small-business-reactivate/SKILL.md +109 -0
  420. package/content/small-business/skills/small-business-report-builder/SKILL.md +142 -0
  421. package/content/small-business/skills/small-business-report-builder/reference/data_sources.md +168 -0
  422. package/content/small-business/skills/small-business-report-builder/reference/gotchas.md +155 -0
  423. package/content/small-business/skills/small-business-report-builder/reference/output_template.md +109 -0
  424. package/content/small-business/skills/small-business-report-builder/reference/report_spec.md +109 -0
  425. package/content/small-business/skills/small-business-report-builder/reference/saved_reports.md +50 -0
  426. package/content/small-business/skills/small-business-report-pack/SKILL.md +83 -0
  427. package/content/small-business/skills/small-business-restock/SKILL.md +88 -0
  428. package/content/small-business/skills/small-business-review-reputation/SKILL.md +130 -0
  429. package/content/small-business/skills/small-business-review-reputation/reference/churn-signals.md +110 -0
  430. package/content/small-business/skills/small-business-review-reputation/reference/examples/example-report.md +150 -0
  431. package/content/small-business/skills/small-business-review-reputation/reference/gotchas.md +164 -0
  432. package/content/small-business/skills/small-business-review-reputation/reference/response-patterns.md +123 -0
  433. package/content/small-business/skills/small-business-review-reputation/reference/sources.md +116 -0
  434. package/content/small-business/skills/small-business-seo-ai-visibility/SKILL.md +143 -0
  435. package/content/small-business/skills/small-business-seo-ai-visibility/reference/ai_visibility.md +173 -0
  436. package/content/small-business/skills/small-business-seo-ai-visibility/reference/audit_checklist.md +134 -0
  437. package/content/small-business/skills/small-business-seo-ai-visibility/reference/catalog_refresh.md +126 -0
  438. package/content/small-business/skills/small-business-seo-ai-visibility/reference/content_rewrite.md +113 -0
  439. package/content/small-business/skills/small-business-seo-ai-visibility/reference/gotchas.md +211 -0
  440. package/content/small-business/skills/small-business-smb-onboard/SKILL.md +82 -0
  441. package/content/small-business/skills/small-business-smb-onboard/reference/examples/happy-path.md +190 -0
  442. package/content/small-business/skills/small-business-smb-onboard/reference/gotchas.md +111 -0
  443. package/content/small-business/skills/small-business-smb-onboard/reference/onboard-checklist.md +99 -0
  444. package/content/small-business/skills/small-business-smb-onboard/reference/website-research.md +82 -0
  445. package/content/small-business/skills/small-business-smb-router/SKILL.md +216 -0
  446. package/content/small-business/skills/small-business-smb-router/reference/connector-map.md +96 -0
  447. package/content/small-business/skills/small-business-social-content-engine/SKILL.md +162 -0
  448. package/content/small-business/skills/small-business-social-content-engine/reference/calendar.md +116 -0
  449. package/content/small-business/skills/small-business-social-content-engine/reference/canva-api.md +208 -0
  450. package/content/small-business/skills/small-business-social-content-engine/reference/examples/okonkwo-campaign.md +190 -0
  451. package/content/small-business/skills/small-business-social-content-engine/reference/gotchas.md +447 -0
  452. package/content/small-business/skills/small-business-social-content-engine/reference/publishing.md +166 -0
  453. package/content/small-business/skills/small-business-social-content-engine/reference/shopify-assets.md +77 -0
  454. package/content/small-business/skills/small-business-speed-to-lead/SKILL.md +172 -0
  455. package/content/small-business/skills/small-business-speed-to-lead/reference/approval.md +61 -0
  456. package/content/small-business/skills/small-business-speed-to-lead/reference/gotchas.md +167 -0
  457. package/content/small-business/skills/small-business-speed-to-lead/reference/qualification.md +153 -0
  458. package/content/small-business/skills/small-business-speed-to-lead/reference/response_patterns.md +184 -0
  459. package/content/small-business/skills/small-business-tax-prep/SKILL.md +85 -0
  460. package/content/small-business/skills/small-business-tax-season-organizer/SKILL.md +210 -0
  461. package/content/small-business/skills/small-business-tax-season-organizer/reference/calculation-assumptions.md +177 -0
  462. package/content/small-business/skills/small-business-tax-season-organizer/reference/connector-queries.md +267 -0
  463. package/content/small-business/skills/small-business-tax-season-organizer/reference/examples/quarterly-estimate.md +92 -0
  464. package/content/small-business/skills/small-business-tax-season-organizer/reference/examples/year-end-1099.md +102 -0
  465. package/content/small-business/skills/small-business-tax-season-organizer/reference/gotchas.md +104 -0
  466. package/content/small-business/skills/small-business-tax-season-organizer/reference/output-formats.md +68 -0
  467. package/content/small-business/skills/small-business-ticket-deflector/SKILL.md +164 -0
  468. package/content/small-business/skills/small-business-ticket-deflector/reference/examples/deny-refund-request.md +98 -0
  469. package/content/small-business/skills/small-business-ticket-deflector/reference/examples/respond-refund-request.md +77 -0
  470. package/content/small-business/skills/small-business-ticket-deflector/reference/gotchas.md +57 -0
  471. package/index.ts +83 -0
  472. package/package.json +28 -3
@@ -0,0 +1,634 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Utility functions for scvi-tools model training and evaluation.
4
+
5
+ Usage:
6
+ from model_utils import prepare_adata, train_scvi, evaluate_integration
7
+ """
8
+
9
+ import numpy as np
10
+ import scanpy as sc
11
+ from typing import Optional, List, Dict, Tuple
12
+ import warnings
13
+
14
+
15
+ def get_mito_genes(adata) -> np.ndarray:
16
+ """
17
+ Identify mitochondrial genes for both human and mouse data.
18
+
19
+ Handles common prefixes:
20
+ - Human: MT- (e.g., MT-CO1, MT-ND1)
21
+ - Mouse: mt- or Mt- (e.g., mt-Co1, Mt-Nd1)
22
+
23
+ Returns
24
+ -------
25
+ Boolean array indicating mitochondrial genes
26
+ """
27
+ return (
28
+ adata.var_names.str.startswith('MT-') |
29
+ adata.var_names.str.startswith('mt-') |
30
+ adata.var_names.str.startswith('Mt-')
31
+ )
32
+
33
+
34
+ def prepare_adata(
35
+ adata,
36
+ batch_key: Optional[str] = None,
37
+ n_top_genes: int = 2000,
38
+ min_genes: int = 200,
39
+ max_genes: int = 5000,
40
+ max_mito_pct: float = 20.0,
41
+ min_cells: int = 3,
42
+ copy: bool = True
43
+ ):
44
+ """
45
+ Prepare AnnData for scvi-tools models.
46
+
47
+ Parameters
48
+ ----------
49
+ adata : AnnData
50
+ Raw count data
51
+ batch_key : str, optional
52
+ Column for batch information
53
+ n_top_genes : int
54
+ Number of highly variable genes
55
+ min_genes : int
56
+ Minimum genes per cell
57
+ max_genes : int
58
+ Maximum genes per cell
59
+ max_mito_pct : float
60
+ Maximum mitochondrial percentage
61
+ min_cells : int
62
+ Minimum cells per gene
63
+ copy : bool
64
+ Return copy of data
65
+
66
+ Returns
67
+ -------
68
+ AnnData prepared for scvi-tools
69
+ """
70
+ if copy:
71
+ adata = adata.copy()
72
+
73
+ # Calculate QC metrics
74
+ adata.var['mt'] = get_mito_genes(adata)
75
+ sc.pp.calculate_qc_metrics(adata, qc_vars=['mt'], inplace=True)
76
+
77
+ # Filter cells
78
+ adata = adata[adata.obs['n_genes_by_counts'] >= min_genes].copy()
79
+ adata = adata[adata.obs['n_genes_by_counts'] <= max_genes].copy()
80
+ adata = adata[adata.obs['pct_counts_mt'] < max_mito_pct].copy()
81
+
82
+ # Filter genes
83
+ sc.pp.filter_genes(adata, min_cells=min_cells)
84
+
85
+ # Store raw counts
86
+ adata.layers["counts"] = adata.X.copy()
87
+
88
+ # HVG selection
89
+ if batch_key and batch_key in adata.obs.columns:
90
+ sc.pp.highly_variable_genes(
91
+ adata,
92
+ n_top_genes=n_top_genes,
93
+ flavor="seurat_v3",
94
+ batch_key=batch_key,
95
+ layer="counts"
96
+ )
97
+ else:
98
+ # Need to normalize for non-seurat_v3 flavor
99
+ sc.pp.normalize_total(adata, target_sum=1e4)
100
+ sc.pp.log1p(adata)
101
+ sc.pp.highly_variable_genes(adata, n_top_genes=n_top_genes)
102
+ # Restore counts to X
103
+ adata.X = adata.layers["counts"].copy()
104
+
105
+ # Subset to HVGs
106
+ adata = adata[:, adata.var['highly_variable']].copy()
107
+
108
+ print(f"Prepared AnnData: {adata.shape}")
109
+ if batch_key:
110
+ print(f"Batches: {adata.obs[batch_key].nunique()}")
111
+
112
+ return adata
113
+
114
+
115
+ def train_scvi(
116
+ adata,
117
+ batch_key: Optional[str] = None,
118
+ labels_key: Optional[str] = None,
119
+ n_latent: int = 30,
120
+ n_layers: int = 2,
121
+ max_epochs: int = 200,
122
+ early_stopping: bool = True,
123
+ use_gpu: bool = True
124
+ ):
125
+ """
126
+ Train scVI or scANVI model.
127
+
128
+ Parameters
129
+ ----------
130
+ adata : AnnData
131
+ Prepared data with counts layer
132
+ batch_key : str, optional
133
+ Batch column
134
+ labels_key : str, optional
135
+ Cell type labels (uses scANVI if provided)
136
+ n_latent : int
137
+ Latent dimensions
138
+ n_layers : int
139
+ Encoder/decoder layers
140
+ max_epochs : int
141
+ Maximum training epochs
142
+ early_stopping : bool
143
+ Use early stopping
144
+ use_gpu : bool
145
+ Use GPU if available
146
+
147
+ Returns
148
+ -------
149
+ Trained model
150
+ """
151
+ import scvi
152
+
153
+ # Setup AnnData
154
+ scvi.model.SCVI.setup_anndata(
155
+ adata,
156
+ layer="counts",
157
+ batch_key=batch_key
158
+ )
159
+
160
+ if labels_key and labels_key in adata.obs.columns:
161
+ # Train scVI first
162
+ scvi_model = scvi.model.SCVI(
163
+ adata,
164
+ n_latent=n_latent,
165
+ n_layers=n_layers
166
+ )
167
+ scvi_model.train(
168
+ max_epochs=max_epochs,
169
+ early_stopping=early_stopping
170
+ )
171
+
172
+ # Initialize scANVI
173
+ model = scvi.model.SCANVI.from_scvi_model(
174
+ scvi_model,
175
+ labels_key=labels_key,
176
+ unlabeled_category="Unknown"
177
+ )
178
+ model.train(max_epochs=max_epochs // 4)
179
+
180
+ # Store representation
181
+ adata.obsm["X_scANVI"] = model.get_latent_representation()
182
+ else:
183
+ # Train scVI only
184
+ model = scvi.model.SCVI(
185
+ adata,
186
+ n_latent=n_latent,
187
+ n_layers=n_layers
188
+ )
189
+ model.train(
190
+ max_epochs=max_epochs,
191
+ early_stopping=early_stopping
192
+ )
193
+
194
+ # Store representation
195
+ adata.obsm["X_scVI"] = model.get_latent_representation()
196
+
197
+ return model
198
+
199
+
200
+ def evaluate_integration(
201
+ adata,
202
+ batch_key: str,
203
+ label_key: str,
204
+ embedding_key: str = "X_scVI"
205
+ ) -> Dict[str, float]:
206
+ """
207
+ Evaluate integration quality using basic metrics.
208
+
209
+ Parameters
210
+ ----------
211
+ adata : AnnData
212
+ Integrated data
213
+ batch_key : str
214
+ Batch column
215
+ label_key : str
216
+ Cell type column
217
+ embedding_key : str
218
+ Key in obsm for embedding
219
+
220
+ Returns
221
+ -------
222
+ Dictionary of metrics
223
+ """
224
+ from sklearn.metrics import silhouette_score
225
+ from sklearn.neighbors import NearestNeighbors
226
+
227
+ X = adata.obsm[embedding_key]
228
+ batch = adata.obs[batch_key].values
229
+ labels = adata.obs[label_key].values
230
+
231
+ metrics = {}
232
+
233
+ # Silhouette scores
234
+ try:
235
+ # Cell type silhouette (higher = better separation)
236
+ metrics["silhouette_label"] = silhouette_score(X, labels)
237
+
238
+ # Batch silhouette (lower = better mixing)
239
+ metrics["silhouette_batch"] = silhouette_score(X, batch)
240
+ except Exception as e:
241
+ warnings.warn(f"Silhouette calculation failed: {e}")
242
+
243
+ # Batch mixing in neighbors
244
+ try:
245
+ nn = NearestNeighbors(n_neighbors=50)
246
+ nn.fit(X)
247
+ distances, indices = nn.kneighbors(X)
248
+
249
+ batch_mixing = []
250
+ for i in range(len(X)):
251
+ neighbor_batches = batch[indices[i]]
252
+ unique_batches = len(np.unique(neighbor_batches))
253
+ batch_mixing.append(unique_batches / len(np.unique(batch)))
254
+
255
+ metrics["batch_mixing"] = np.mean(batch_mixing)
256
+ except Exception as e:
257
+ warnings.warn(f"Batch mixing calculation failed: {e}")
258
+
259
+ return metrics
260
+
261
+
262
+ def get_marker_genes(
263
+ model,
264
+ adata,
265
+ groupby: str,
266
+ n_genes: int = 10
267
+ ) -> Dict[str, List[str]]:
268
+ """
269
+ Get marker genes using scVI differential expression.
270
+
271
+ Parameters
272
+ ----------
273
+ model : scvi model
274
+ Trained scVI/scANVI model
275
+ adata : AnnData
276
+ Data used for training
277
+ groupby : str
278
+ Column to group cells by
279
+ n_genes : int
280
+ Number of top markers per group
281
+
282
+ Returns
283
+ -------
284
+ Dictionary of {group: [marker_genes]}
285
+ """
286
+ markers = {}
287
+ groups = adata.obs[groupby].unique()
288
+
289
+ for group in groups:
290
+ # Get DE results for this group vs rest
291
+ de_results = model.differential_expression(
292
+ groupby=groupby,
293
+ group1=group
294
+ )
295
+
296
+ # Filter and sort
297
+ de_sig = de_results[
298
+ (de_results["is_de_fdr_0.05"] == True) &
299
+ (de_results["lfc_mean"] > 0.5)
300
+ ].sort_values("lfc_mean", ascending=False)
301
+
302
+ markers[group] = de_sig.index[:n_genes].tolist()
303
+
304
+ return markers
305
+
306
+
307
+ def plot_training_history(model, save_path: Optional[str] = None):
308
+ """
309
+ Plot model training history.
310
+
311
+ Parameters
312
+ ----------
313
+ model : scvi model
314
+ Trained model
315
+ save_path : str, optional
316
+ Path to save figure
317
+ """
318
+ import matplotlib.pyplot as plt
319
+
320
+ fig, axes = plt.subplots(1, 2, figsize=(12, 4))
321
+
322
+ # ELBO
323
+ if "elbo_train" in model.history:
324
+ axes[0].plot(model.history["elbo_train"], label="Train")
325
+ if "elbo_validation" in model.history:
326
+ axes[0].plot(model.history["elbo_validation"], label="Validation")
327
+ axes[0].set_xlabel("Epoch")
328
+ axes[0].set_ylabel("ELBO")
329
+ axes[0].legend()
330
+ axes[0].set_title("Training Loss")
331
+
332
+ # Reconstruction
333
+ if "reconstruction_loss_train" in model.history:
334
+ axes[1].plot(model.history["reconstruction_loss_train"], label="Train")
335
+ if "reconstruction_loss_validation" in model.history:
336
+ axes[1].plot(model.history["reconstruction_loss_validation"], label="Validation")
337
+ axes[1].set_xlabel("Epoch")
338
+ axes[1].set_ylabel("Reconstruction Loss")
339
+ axes[1].legend()
340
+ axes[1].set_title("Reconstruction Loss")
341
+
342
+ plt.tight_layout()
343
+
344
+ if save_path:
345
+ plt.savefig(save_path, dpi=150, bbox_inches="tight")
346
+
347
+ return fig
348
+
349
+
350
+ def save_results(
351
+ model,
352
+ adata,
353
+ output_dir: str,
354
+ save_model: bool = True,
355
+ save_adata: bool = True,
356
+ plot_umap: bool = True
357
+ ):
358
+ """
359
+ Save model, processed data, and visualization.
360
+
361
+ Parameters
362
+ ----------
363
+ model : scvi model
364
+ Trained model
365
+ adata : AnnData
366
+ Processed data with latent representation
367
+ output_dir : str
368
+ Output directory path
369
+ save_model : bool
370
+ Save the trained model
371
+ save_adata : bool
372
+ Save the processed AnnData
373
+ plot_umap : bool
374
+ Generate and save UMAP plot
375
+ """
376
+ import os
377
+ import scanpy as sc
378
+ import matplotlib.pyplot as plt
379
+
380
+ os.makedirs(output_dir, exist_ok=True)
381
+
382
+ # Save model
383
+ if save_model:
384
+ model_path = os.path.join(output_dir, "model")
385
+ model.save(model_path)
386
+ print(f"Model saved to {model_path}")
387
+
388
+ # Save AnnData
389
+ if save_adata:
390
+ adata_path = os.path.join(output_dir, "adata_processed.h5ad")
391
+ adata.write(adata_path)
392
+ print(f"AnnData saved to {adata_path}")
393
+
394
+ # Generate UMAP if needed
395
+ if plot_umap:
396
+ # Determine which embedding to use
397
+ if "X_scANVI" in adata.obsm:
398
+ rep_key = "X_scANVI"
399
+ elif "X_scVI" in adata.obsm:
400
+ rep_key = "X_scVI"
401
+ else:
402
+ rep_key = None
403
+
404
+ if rep_key is not None:
405
+ # Compute neighbors and UMAP if not present
406
+ if "X_umap" not in adata.obsm:
407
+ sc.pp.neighbors(adata, use_rep=rep_key)
408
+ sc.tl.umap(adata)
409
+
410
+ # Plot
411
+ fig, axes = plt.subplots(1, 2, figsize=(12, 5))
412
+
413
+ # Plot by batch if available
414
+ batch_cols = [c for c in adata.obs.columns if 'batch' in c.lower()]
415
+ if batch_cols:
416
+ sc.pl.umap(adata, color=batch_cols[0], ax=axes[0], show=False, title="By Batch")
417
+
418
+ # Plot by cluster
419
+ if "leiden" not in adata.obs:
420
+ sc.tl.leiden(adata)
421
+ sc.pl.umap(adata, color="leiden", ax=axes[1], show=False, title="Clusters")
422
+
423
+ plt.tight_layout()
424
+ plot_path = os.path.join(output_dir, "umap.png")
425
+ plt.savefig(plot_path, dpi=150, bbox_inches="tight")
426
+ plt.close()
427
+ print(f"UMAP plot saved to {plot_path}")
428
+
429
+
430
+ def auto_select_model(adata) -> str:
431
+ """
432
+ Suggest the best scvi-tools model based on available data.
433
+
434
+ Parameters
435
+ ----------
436
+ adata : AnnData
437
+ Data to analyze
438
+
439
+ Returns
440
+ -------
441
+ String with model recommendation and reasoning
442
+ """
443
+ suggestions = []
444
+
445
+ # Check for multi-modal data
446
+ if 'protein_expression' in adata.obsm:
447
+ suggestions.append({
448
+ 'model': 'totalVI',
449
+ 'reason': 'CITE-seq data detected (protein + RNA)',
450
+ 'priority': 1
451
+ })
452
+
453
+ if 'spliced' in adata.layers and 'unspliced' in adata.layers:
454
+ suggestions.append({
455
+ 'model': 'veloVI',
456
+ 'reason': 'RNA velocity data detected (spliced + unspliced)',
457
+ 'priority': 1
458
+ })
459
+
460
+ # Check for ATAC data indicators
461
+ if adata.n_vars > 100000: # Many peaks suggest ATAC
462
+ suggestions.append({
463
+ 'model': 'PeakVI',
464
+ 'reason': f'Large number of features ({adata.n_vars}) suggests ATAC-seq peaks',
465
+ 'priority': 2
466
+ })
467
+
468
+ # Check for labels
469
+ label_cols = [c for c in adata.obs.columns if 'cell' in c.lower() or 'type' in c.lower() or 'label' in c.lower()]
470
+ has_labels = len(label_cols) > 0
471
+
472
+ # Check for batch info
473
+ batch_cols = [c for c in adata.obs.columns if 'batch' in c.lower() or 'sample' in c.lower()]
474
+ has_batch = len(batch_cols) > 0
475
+
476
+ if has_batch:
477
+ if has_labels:
478
+ suggestions.append({
479
+ 'model': 'scANVI',
480
+ 'reason': f'Batch info ({batch_cols[0]}) + labels ({label_cols[0]}) available',
481
+ 'priority': 1
482
+ })
483
+ else:
484
+ suggestions.append({
485
+ 'model': 'scVI',
486
+ 'reason': f'Batch info ({batch_cols[0]}) available, no labels',
487
+ 'priority': 1
488
+ })
489
+ else:
490
+ suggestions.append({
491
+ 'model': 'scVI',
492
+ 'reason': 'Standard scRNA-seq analysis',
493
+ 'priority': 2
494
+ })
495
+
496
+ # Sort by priority
497
+ suggestions.sort(key=lambda x: x['priority'])
498
+
499
+ # Format output
500
+ lines = ["Recommended models (in order of priority):"]
501
+ for i, s in enumerate(suggestions, 1):
502
+ lines.append(f" {i}. {s['model']}: {s['reason']}")
503
+
504
+ return "\n".join(lines)
505
+
506
+
507
+ def compare_integrations(
508
+ adata,
509
+ batch_key: str,
510
+ label_key: str,
511
+ embedding_keys: List[str] = None
512
+ ) -> Dict[str, Dict[str, float]]:
513
+ """
514
+ Compare multiple integration methods using standard metrics.
515
+
516
+ Parameters
517
+ ----------
518
+ adata : AnnData
519
+ Data with integration embeddings in obsm
520
+ batch_key : str
521
+ Batch column in obs
522
+ label_key : str
523
+ Cell type column in obs
524
+ embedding_keys : list, optional
525
+ Keys in obsm to compare (default: auto-detect)
526
+
527
+ Returns
528
+ -------
529
+ Dictionary of {embedding: {metric: value}}
530
+ """
531
+ from sklearn.metrics import silhouette_score
532
+
533
+ # Auto-detect embeddings
534
+ if embedding_keys is None:
535
+ embedding_keys = [k for k in adata.obsm.keys()
536
+ if k.startswith('X_') and 'umap' not in k.lower()]
537
+
538
+ results = {}
539
+
540
+ for key in embedding_keys:
541
+ if key not in adata.obsm:
542
+ continue
543
+
544
+ X = adata.obsm[key]
545
+ batch = adata.obs[batch_key].values
546
+ labels = adata.obs[label_key].values
547
+
548
+ metrics = {}
549
+
550
+ try:
551
+ # Silhouette scores
552
+ metrics["silhouette_label"] = silhouette_score(X, labels)
553
+ metrics["silhouette_batch"] = silhouette_score(X, batch)
554
+
555
+ # Combined score (higher label preservation, lower batch separation = better)
556
+ metrics["integration_score"] = metrics["silhouette_label"] - metrics["silhouette_batch"]
557
+
558
+ except Exception as e:
559
+ metrics["error"] = str(e)
560
+
561
+ results[key] = metrics
562
+
563
+ return results
564
+
565
+
566
+ def quick_clustering(
567
+ adata,
568
+ use_rep: str = None,
569
+ resolution: float = 1.0,
570
+ n_neighbors: int = 15
571
+ ):
572
+ """
573
+ Quick clustering pipeline on latent representation.
574
+
575
+ Parameters
576
+ ----------
577
+ adata : AnnData
578
+ Data with latent representation
579
+ use_rep : str, optional
580
+ Key in obsm (auto-detects scVI/scANVI if not specified)
581
+ resolution : float
582
+ Leiden clustering resolution
583
+ n_neighbors : int
584
+ Number of neighbors for graph
585
+
586
+ Returns
587
+ -------
588
+ AnnData with neighbors, UMAP, and leiden clustering
589
+ """
590
+ import scanpy as sc
591
+
592
+ # Auto-detect representation
593
+ if use_rep is None:
594
+ if "X_scANVI" in adata.obsm:
595
+ use_rep = "X_scANVI"
596
+ elif "X_scVI" in adata.obsm:
597
+ use_rep = "X_scVI"
598
+ elif "X_totalVI" in adata.obsm:
599
+ use_rep = "X_totalVI"
600
+ elif "X_PeakVI" in adata.obsm:
601
+ use_rep = "X_PeakVI"
602
+ elif "X_MultiVI" in adata.obsm:
603
+ use_rep = "X_MultiVI"
604
+ else:
605
+ raise ValueError("No scvi-tools embedding found in obsm")
606
+
607
+ print(f"Using representation: {use_rep}")
608
+
609
+ # Compute neighbors
610
+ sc.pp.neighbors(adata, use_rep=use_rep, n_neighbors=n_neighbors)
611
+
612
+ # UMAP
613
+ sc.tl.umap(adata)
614
+
615
+ # Leiden clustering
616
+ sc.tl.leiden(adata, resolution=resolution)
617
+
618
+ print(f"Found {adata.obs['leiden'].nunique()} clusters")
619
+
620
+ return adata
621
+
622
+
623
+ if __name__ == "__main__":
624
+ print("scvi-tools model utilities")
625
+ print("\nAvailable functions:")
626
+ print(" - prepare_adata: Standard data preparation (QC, HVG, layer setup)")
627
+ print(" - train_scvi: Train scVI or scANVI with sensible defaults")
628
+ print(" - evaluate_integration: Compute batch mixing and silhouette metrics")
629
+ print(" - get_marker_genes: Extract markers using scVI differential expression")
630
+ print(" - plot_training_history: Visualize training convergence")
631
+ print(" - save_results: Save model, data, and visualizations")
632
+ print(" - auto_select_model: Suggest best model for your data")
633
+ print(" - compare_integrations: Compare multiple integration embeddings")
634
+ print(" - quick_clustering: Quick clustering on latent representation")