opencode-knowledge-work 0.0.0-stage → 0.1.0

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 +84 -0
  472. package/package.json +30 -3
@@ -0,0 +1,224 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Transfer cell type labels from reference to query using scANVI.
4
+
5
+ Maps query cells to a pre-trained reference model and predicts cell types.
6
+
7
+ Usage:
8
+ python transfer_labels.py reference_model/ query.h5ad output_dir/
9
+ python transfer_labels.py reference_model/ query.h5ad output_dir/ --confidence 0.7
10
+ """
11
+
12
+ import argparse
13
+ import os
14
+ import sys
15
+
16
+
17
+ def transfer_labels(
18
+ reference_model,
19
+ adata_query,
20
+ max_epochs=100,
21
+ confidence_threshold=0.5
22
+ ):
23
+ """
24
+ Transfer labels from reference to query.
25
+
26
+ Parameters
27
+ ----------
28
+ reference_model : SCANVI model
29
+ Pre-trained scANVI model
30
+ adata_query : AnnData
31
+ Query data to annotate
32
+ max_epochs : int
33
+ Fine-tuning epochs
34
+ confidence_threshold : float
35
+ Minimum confidence for predictions
36
+
37
+ Returns
38
+ -------
39
+ AnnData with predictions
40
+ """
41
+ import scvi
42
+ import numpy as np
43
+
44
+ # Get reference genes
45
+ ref_genes = reference_model.adata.var_names
46
+ print(f"Reference genes: {len(ref_genes)}")
47
+
48
+ # Check gene overlap
49
+ query_genes = adata_query.var_names
50
+ common = ref_genes.intersection(query_genes)
51
+ print(f"Query genes: {len(query_genes)}")
52
+ print(f"Common genes: {len(common)} ({len(common)/len(ref_genes)*100:.1f}%)")
53
+
54
+ if len(common) < len(ref_genes) * 0.5:
55
+ print("Warning: Less than 50% gene overlap. Results may be unreliable.")
56
+
57
+ # Subset query to reference genes
58
+ # Missing genes will be filled with zeros
59
+ adata_query = adata_query[:, adata_query.var_names.isin(ref_genes)].copy()
60
+
61
+ # Ensure counts layer
62
+ if "counts" not in adata_query.layers:
63
+ adata_query.layers["counts"] = adata_query.X.copy()
64
+
65
+ # Prepare query for mapping
66
+ print("Preparing query data...")
67
+ scvi.model.SCANVI.prepare_query_anndata(adata_query, reference_model)
68
+
69
+ # Create query model
70
+ print("Creating query model...")
71
+ query_model = scvi.model.SCANVI.load_query_data(
72
+ adata_query,
73
+ reference_model
74
+ )
75
+
76
+ # Fine-tune
77
+ print(f"Fine-tuning ({max_epochs} epochs)...")
78
+ query_model.train(
79
+ max_epochs=max_epochs,
80
+ plan_kwargs={"weight_decay": 0.0}
81
+ )
82
+
83
+ # Get predictions
84
+ print("Getting predictions...")
85
+ predictions = query_model.predict()
86
+ soft_predictions = query_model.predict(soft=True)
87
+
88
+ adata_query.obs["predicted_cell_type"] = predictions
89
+ adata_query.obs["prediction_confidence"] = soft_predictions.max(axis=1)
90
+ adata_query.obs["confident_prediction"] = adata_query.obs["prediction_confidence"] >= confidence_threshold
91
+
92
+ # Get latent representation
93
+ adata_query.obsm["X_scANVI"] = query_model.get_latent_representation()
94
+
95
+ # Stats
96
+ n_confident = adata_query.obs["confident_prediction"].sum()
97
+ print(f"\nPrediction summary:")
98
+ print(f" Total cells: {adata_query.n_obs}")
99
+ print(f" Confident (>= {confidence_threshold}): {n_confident} ({n_confident/adata_query.n_obs*100:.1f}%)")
100
+ print(f" Mean confidence: {adata_query.obs['prediction_confidence'].mean():.3f}")
101
+
102
+ print("\nPredicted cell types:")
103
+ print(adata_query.obs["predicted_cell_type"].value_counts())
104
+
105
+ return adata_query, query_model
106
+
107
+
108
+ def plot_predictions(adata, output_dir):
109
+ """Plot prediction results."""
110
+ import scanpy as sc
111
+ import matplotlib.pyplot as plt
112
+
113
+ # Compute UMAP if needed
114
+ if "X_umap" not in adata.obsm:
115
+ sc.pp.neighbors(adata, use_rep="X_scANVI")
116
+ sc.tl.umap(adata)
117
+
118
+ # Plot
119
+ fig, axes = plt.subplots(1, 3, figsize=(15, 4))
120
+
121
+ sc.pl.umap(adata, color="predicted_cell_type", ax=axes[0], show=False,
122
+ title="Predicted Cell Type")
123
+ sc.pl.umap(adata, color="prediction_confidence", ax=axes[1], show=False,
124
+ title="Prediction Confidence", cmap="viridis")
125
+ sc.pl.umap(adata, color="confident_prediction", ax=axes[2], show=False,
126
+ title="Confident Predictions")
127
+
128
+ plt.tight_layout()
129
+ plot_path = os.path.join(output_dir, "predictions.png")
130
+ plt.savefig(plot_path, dpi=150, bbox_inches="tight")
131
+ plt.close()
132
+ print(f"Prediction plot saved to {plot_path}")
133
+
134
+
135
+ def main():
136
+ parser = argparse.ArgumentParser(
137
+ description="Transfer cell type labels using scANVI",
138
+ formatter_class=argparse.RawDescriptionHelpFormatter,
139
+ epilog="""
140
+ Examples:
141
+ # Basic label transfer
142
+ python transfer_labels.py reference_model/ query.h5ad results/
143
+
144
+ # With confidence threshold
145
+ python transfer_labels.py reference_model/ query.h5ad results/ --confidence 0.7
146
+
147
+ # More fine-tuning
148
+ python transfer_labels.py reference_model/ query.h5ad results/ --max-epochs 200
149
+ """
150
+ )
151
+ parser.add_argument("model_dir", help="Directory containing reference scANVI model")
152
+ parser.add_argument("query", help="Query h5ad file to annotate")
153
+ parser.add_argument("output_dir", help="Output directory")
154
+ parser.add_argument("--reference-adata", help="Reference adata used for training (if not saved with model)")
155
+ parser.add_argument("--max-epochs", type=int, default=100,
156
+ help="Fine-tuning epochs (default: 100)")
157
+ parser.add_argument("--confidence", type=float, default=0.5,
158
+ help="Confidence threshold (default: 0.5)")
159
+
160
+ args = parser.parse_args()
161
+
162
+ try:
163
+ import scvi
164
+ import scanpy as sc
165
+ except ImportError:
166
+ print("Error: scvi-tools and scanpy required")
167
+ sys.exit(1)
168
+
169
+ # Create output directory
170
+ os.makedirs(args.output_dir, exist_ok=True)
171
+
172
+ # Load query data
173
+ print(f"Loading query data: {args.query}")
174
+ adata_query = sc.read_h5ad(args.query)
175
+ print(f"Query: {adata_query.shape}")
176
+
177
+ # Load reference model
178
+ print(f"Loading reference model: {args.model_dir}")
179
+ if args.reference_adata:
180
+ ref_adata = sc.read_h5ad(args.reference_adata)
181
+ reference_model = scvi.model.SCANVI.load(args.model_dir, adata=ref_adata)
182
+ else:
183
+ # Try loading without adata (works if model was saved with adata)
184
+ try:
185
+ reference_model = scvi.model.SCANVI.load(args.model_dir)
186
+ except ValueError as e:
187
+ if "no saved anndata" in str(e).lower():
188
+ print("Error: Model was saved without adata. Please provide --reference-adata")
189
+ sys.exit(1)
190
+ raise
191
+ print(f"Reference: {reference_model.adata.shape}")
192
+
193
+ # Transfer labels
194
+ adata_annotated, query_model = transfer_labels(
195
+ reference_model,
196
+ adata_query,
197
+ max_epochs=args.max_epochs,
198
+ confidence_threshold=args.confidence
199
+ )
200
+
201
+ # Save results
202
+ adata_path = os.path.join(args.output_dir, "query_annotated.h5ad")
203
+ adata_annotated.write_h5ad(adata_path)
204
+ print(f"\nAnnotated data saved to {adata_path}")
205
+
206
+ # Save query model
207
+ model_path = os.path.join(args.output_dir, "query_model")
208
+ query_model.save(model_path)
209
+ print(f"Query model saved to {model_path}")
210
+
211
+ # Save predictions CSV
212
+ pred_df = adata_annotated.obs[["predicted_cell_type", "prediction_confidence", "confident_prediction"]]
213
+ pred_path = os.path.join(args.output_dir, "predictions.csv")
214
+ pred_df.to_csv(pred_path)
215
+ print(f"Predictions saved to {pred_path}")
216
+
217
+ # Plot
218
+ plot_predictions(adata_annotated, args.output_dir)
219
+
220
+ print("\nDone!")
221
+
222
+
223
+ if __name__ == "__main__":
224
+ main()
@@ -0,0 +1,397 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Validation utilities for checking AnnData compatibility with scvi-tools.
4
+
5
+ Usage:
6
+ python validate_adata.py data.h5ad
7
+
8
+ # Or import as module
9
+ from validate_adata import validate_for_scvi, ValidationResult
10
+ result = validate_for_scvi(adata)
11
+ print(result.summary())
12
+ """
13
+
14
+ import argparse
15
+ import sys
16
+ from dataclasses import dataclass, field
17
+ from typing import Optional, List, Dict, Any
18
+ import warnings
19
+
20
+
21
+ @dataclass
22
+ class ValidationResult:
23
+ """Results from AnnData validation."""
24
+
25
+ is_valid: bool = True
26
+ errors: List[str] = field(default_factory=list)
27
+ warnings: List[str] = field(default_factory=list)
28
+ info: Dict[str, Any] = field(default_factory=dict)
29
+ recommendations: List[str] = field(default_factory=list)
30
+
31
+ def add_error(self, msg: str):
32
+ """Add an error (makes validation fail)."""
33
+ self.errors.append(msg)
34
+ self.is_valid = False
35
+
36
+ def add_warning(self, msg: str):
37
+ """Add a warning (doesn't fail validation)."""
38
+ self.warnings.append(msg)
39
+
40
+ def add_recommendation(self, msg: str):
41
+ """Add a recommendation for improvement."""
42
+ self.recommendations.append(msg)
43
+
44
+ def summary(self) -> str:
45
+ """Generate summary report."""
46
+ lines = []
47
+ lines.append("=" * 60)
48
+ lines.append("scvi-tools AnnData Validation Report")
49
+ lines.append("=" * 60)
50
+
51
+ # Status
52
+ status = "PASSED" if self.is_valid else "FAILED"
53
+ lines.append(f"\nStatus: {status}")
54
+
55
+ # Info
56
+ if self.info:
57
+ lines.append("\n--- Data Summary ---")
58
+ for key, value in self.info.items():
59
+ lines.append(f" {key}: {value}")
60
+
61
+ # Errors
62
+ if self.errors:
63
+ lines.append(f"\n--- Errors ({len(self.errors)}) ---")
64
+ for i, err in enumerate(self.errors, 1):
65
+ lines.append(f" {i}. {err}")
66
+
67
+ # Warnings
68
+ if self.warnings:
69
+ lines.append(f"\n--- Warnings ({len(self.warnings)}) ---")
70
+ for i, warn in enumerate(self.warnings, 1):
71
+ lines.append(f" {i}. {warn}")
72
+
73
+ # Recommendations
74
+ if self.recommendations:
75
+ lines.append(f"\n--- Recommendations ({len(self.recommendations)}) ---")
76
+ for i, rec in enumerate(self.recommendations, 1):
77
+ lines.append(f" {i}. {rec}")
78
+
79
+ lines.append("\n" + "=" * 60)
80
+ return "\n".join(lines)
81
+
82
+
83
+ def validate_for_scvi(
84
+ adata,
85
+ layer: Optional[str] = None,
86
+ batch_key: Optional[str] = None,
87
+ labels_key: Optional[str] = None,
88
+ check_hvg: bool = True
89
+ ) -> ValidationResult:
90
+ """
91
+ Validate AnnData for scvi-tools compatibility.
92
+
93
+ Parameters
94
+ ----------
95
+ adata : AnnData
96
+ Data to validate
97
+ layer : str, optional
98
+ Layer containing counts (if None, checks X)
99
+ batch_key : str, optional
100
+ Expected batch column in obs
101
+ labels_key : str, optional
102
+ Expected labels column in obs
103
+ check_hvg : bool
104
+ Check for highly variable genes
105
+
106
+ Returns
107
+ -------
108
+ ValidationResult with errors, warnings, and recommendations
109
+ """
110
+ import numpy as np
111
+ from scipy.sparse import issparse
112
+
113
+ result = ValidationResult()
114
+
115
+ # Basic info
116
+ result.info["shape"] = f"{adata.n_obs} cells x {adata.n_vars} genes"
117
+ result.info["layers"] = list(adata.layers.keys()) if adata.layers else "None"
118
+
119
+ # Get data matrix to check
120
+ if layer is not None:
121
+ if layer not in adata.layers:
122
+ result.add_error(f"Layer '{layer}' not found. Available: {list(adata.layers.keys())}")
123
+ return result
124
+ X = adata.layers[layer]
125
+ result.info["checking"] = f"layer '{layer}'"
126
+ else:
127
+ X = adata.X
128
+ result.info["checking"] = "adata.X"
129
+
130
+ # Check for None or empty
131
+ if X is None:
132
+ result.add_error("Data matrix is None")
133
+ return result
134
+
135
+ if X.shape[0] == 0 or X.shape[1] == 0:
136
+ result.add_error(f"Data matrix is empty: shape {X.shape}")
137
+ return result
138
+
139
+ # Convert to array for checking
140
+ if issparse(X):
141
+ result.info["sparse"] = True
142
+ X_check = X.data # Just check non-zero values
143
+ else:
144
+ result.info["sparse"] = False
145
+ X_check = X.flatten()
146
+
147
+ # Check for raw counts (integers)
148
+ if len(X_check) > 0:
149
+ is_integer = np.allclose(X_check, X_check.astype(int))
150
+ result.info["contains_integers"] = is_integer
151
+
152
+ if not is_integer:
153
+ result.add_error(
154
+ "Data does not contain integers (raw counts required). "
155
+ "Found float values - data may be normalized."
156
+ )
157
+ result.add_recommendation(
158
+ "Use adata.raw.to_adata() to recover raw counts, "
159
+ "or specify a layer with raw counts"
160
+ )
161
+
162
+ # Check for negative values
163
+ min_val = X.min()
164
+ if min_val < 0:
165
+ result.add_error(f"Data contains negative values (min={min_val})")
166
+
167
+ # Check for NaN/Inf
168
+ if issparse(X):
169
+ has_nan = np.isnan(X.data).any()
170
+ has_inf = np.isinf(X.data).any()
171
+ else:
172
+ has_nan = np.isnan(X).any()
173
+ has_inf = np.isinf(X).any()
174
+
175
+ if has_nan:
176
+ result.add_error("Data contains NaN values")
177
+ if has_inf:
178
+ result.add_error("Data contains Inf values")
179
+
180
+ # Check data range
181
+ max_val = X.max()
182
+ result.info["value_range"] = f"[{min_val}, {max_val}]"
183
+
184
+ if max_val < 10:
185
+ result.add_warning(
186
+ f"Maximum value is {max_val}, which is very low. "
187
+ "Data may be log-transformed or normalized."
188
+ )
189
+
190
+ # Check sparsity
191
+ if issparse(X):
192
+ sparsity = 1 - (X.nnz / (X.shape[0] * X.shape[1]))
193
+ result.info["sparsity"] = f"{sparsity:.1%}"
194
+
195
+ if sparsity < 0.5:
196
+ result.add_warning(
197
+ f"Data is only {sparsity:.1%} sparse. "
198
+ "Consider if this is expected for your data type."
199
+ )
200
+
201
+ # Check batch key
202
+ if batch_key is not None:
203
+ if batch_key not in adata.obs.columns:
204
+ result.add_error(
205
+ f"batch_key '{batch_key}' not found in obs. "
206
+ f"Available columns: {list(adata.obs.columns)}"
207
+ )
208
+ else:
209
+ n_batches = adata.obs[batch_key].nunique()
210
+ result.info["n_batches"] = n_batches
211
+
212
+ if n_batches == 1:
213
+ result.add_warning(
214
+ "Only 1 batch found. Batch correction may not be needed."
215
+ )
216
+
217
+ # Check for small batches
218
+ batch_counts = adata.obs[batch_key].value_counts()
219
+ small_batches = batch_counts[batch_counts < 50]
220
+ if len(small_batches) > 0:
221
+ result.add_warning(
222
+ f"{len(small_batches)} batches have fewer than 50 cells. "
223
+ "Consider merging small batches."
224
+ )
225
+
226
+ # Check labels key
227
+ if labels_key is not None:
228
+ if labels_key not in adata.obs.columns:
229
+ result.add_error(
230
+ f"labels_key '{labels_key}' not found in obs. "
231
+ f"Available columns: {list(adata.obs.columns)}"
232
+ )
233
+ else:
234
+ n_labels = adata.obs[labels_key].nunique()
235
+ result.info["n_labels"] = n_labels
236
+
237
+ # Check for rare labels
238
+ label_counts = adata.obs[labels_key].value_counts()
239
+ rare_labels = label_counts[label_counts < 30]
240
+ if len(rare_labels) > 0:
241
+ result.add_warning(
242
+ f"{len(rare_labels)} cell types have fewer than 30 cells. "
243
+ "Rare types may not be well learned."
244
+ )
245
+
246
+ # Check HVG
247
+ if check_hvg:
248
+ if 'highly_variable' not in adata.var.columns:
249
+ result.add_recommendation(
250
+ "No highly variable genes found. Run sc.pp.highly_variable_genes() "
251
+ "and subset to HVGs for better performance."
252
+ )
253
+ else:
254
+ n_hvg = adata.var['highly_variable'].sum()
255
+ result.info["n_hvg"] = n_hvg
256
+
257
+ if n_hvg < 1000:
258
+ result.add_warning(
259
+ f"Only {n_hvg} HVGs selected. Consider using 2000-4000 for best results."
260
+ )
261
+ elif n_hvg > 5000:
262
+ result.add_warning(
263
+ f"{n_hvg} HVGs selected. Consider reducing to 2000-4000 "
264
+ "for efficiency."
265
+ )
266
+
267
+ # Check gene count
268
+ if adata.n_vars > 30000:
269
+ result.add_recommendation(
270
+ f"Dataset has {adata.n_vars} genes. Subset to HVGs (2000-4000) "
271
+ "for faster training and better results."
272
+ )
273
+
274
+ # Check cell count
275
+ if adata.n_obs < 1000:
276
+ result.add_warning(
277
+ f"Dataset has only {adata.n_obs} cells. "
278
+ "Deep learning models work best with >5000 cells."
279
+ )
280
+
281
+ # Check for counts layer
282
+ if layer is None and 'counts' not in adata.layers:
283
+ result.add_recommendation(
284
+ "Store raw counts in adata.layers['counts'] before any normalization. "
285
+ "This preserves the original data for scvi-tools."
286
+ )
287
+
288
+ # Check for raw attribute
289
+ if adata.raw is not None:
290
+ result.info["has_raw"] = True
291
+ result.add_recommendation(
292
+ "adata.raw exists. If X is normalized, use adata.raw.to_adata() "
293
+ "to recover raw counts."
294
+ )
295
+ else:
296
+ result.info["has_raw"] = False
297
+
298
+ return result
299
+
300
+
301
+ def suggest_model(adata, result: ValidationResult) -> str:
302
+ """
303
+ Suggest appropriate scvi-tools model based on data.
304
+
305
+ Parameters
306
+ ----------
307
+ adata : AnnData
308
+ Data to analyze
309
+ result : ValidationResult
310
+ Validation result with info
311
+
312
+ Returns
313
+ -------
314
+ String with model suggestion
315
+ """
316
+ suggestions = []
317
+
318
+ # Check for multi-modal data
319
+ if 'protein_expression' in adata.obsm:
320
+ suggestions.append("totalVI: CITE-seq data detected (protein + RNA)")
321
+
322
+ if 'spliced' in adata.layers and 'unspliced' in adata.layers:
323
+ suggestions.append("veloVI: RNA velocity data detected (spliced + unspliced)")
324
+
325
+ # Check for labels
326
+ has_labels = result.info.get('n_labels', 0) > 0
327
+ has_batches = result.info.get('n_batches', 0) > 1
328
+
329
+ if has_batches:
330
+ if has_labels:
331
+ suggestions.append(
332
+ "scANVI: Integration with cell type labels (recommended for label transfer)"
333
+ )
334
+ else:
335
+ suggestions.append(
336
+ "scVI: Unsupervised batch integration"
337
+ )
338
+ else:
339
+ suggestions.append(
340
+ "scVI: Dimensionality reduction and differential expression"
341
+ )
342
+
343
+ if not suggestions:
344
+ suggestions.append("scVI: General-purpose single-cell analysis")
345
+
346
+ return "\n".join([f" - {s}" for s in suggestions])
347
+
348
+
349
+ def main():
350
+ """Command-line interface."""
351
+ parser = argparse.ArgumentParser(
352
+ description="Validate AnnData for scvi-tools compatibility"
353
+ )
354
+ parser.add_argument("file", help="Path to h5ad file")
355
+ parser.add_argument("--layer", help="Layer to check (default: X)")
356
+ parser.add_argument("--batch-key", help="Batch column to check")
357
+ parser.add_argument("--labels-key", help="Labels column to check")
358
+ parser.add_argument("--suggest", action="store_true", help="Suggest model type")
359
+
360
+ args = parser.parse_args()
361
+
362
+ try:
363
+ import scanpy as sc
364
+ except ImportError:
365
+ print("Error: scanpy is required. Install with: pip install scanpy")
366
+ sys.exit(1)
367
+
368
+ # Load data
369
+ print(f"Loading {args.file}...")
370
+ try:
371
+ adata = sc.read_h5ad(args.file)
372
+ except Exception as e:
373
+ print(f"Error loading file: {e}")
374
+ sys.exit(1)
375
+
376
+ # Validate
377
+ result = validate_for_scvi(
378
+ adata,
379
+ layer=args.layer,
380
+ batch_key=args.batch_key,
381
+ labels_key=args.labels_key
382
+ )
383
+
384
+ # Print report
385
+ print(result.summary())
386
+
387
+ # Suggest model
388
+ if args.suggest:
389
+ print("\nSuggested models:")
390
+ print(suggest_model(adata, result))
391
+
392
+ # Exit code
393
+ sys.exit(0 if result.is_valid else 1)
394
+
395
+
396
+ if __name__ == "__main__":
397
+ main()