gapit 0.5.4__tar.gz → 0.5.6__tar.gz

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 (453) hide show
  1. {gapit-0.5.4 → gapit-0.5.6}/AGENTS.md +59 -15
  2. {gapit-0.5.4 → gapit-0.5.6}/CHANGELOG.md +64 -0
  3. {gapit-0.5.4 → gapit-0.5.6}/PKG-INFO +20 -9
  4. {gapit-0.5.4 → gapit-0.5.6}/PLAN.md +16 -0
  5. {gapit-0.5.4 → gapit-0.5.6}/README.md +18 -7
  6. {gapit-0.5.4 → gapit-0.5.6}/docs/agents.md +2 -2
  7. {gapit-0.5.4 → gapit-0.5.6}/docs/agents.zh.md +2 -2
  8. {gapit-0.5.4 → gapit-0.5.6}/docs/databases.md +89 -42
  9. {gapit-0.5.4 → gapit-0.5.6}/docs/databases.zh.md +79 -43
  10. {gapit-0.5.4 → gapit-0.5.6}/docs/faq.md +3 -2
  11. {gapit-0.5.4 → gapit-0.5.6}/docs/faq.zh.md +2 -2
  12. {gapit-0.5.4 → gapit-0.5.6}/docs/installation.md +27 -5
  13. {gapit-0.5.4 → gapit-0.5.6}/docs/installation.zh.md +26 -4
  14. {gapit-0.5.4 → gapit-0.5.6}/docs/mcp.md +5 -5
  15. {gapit-0.5.4 → gapit-0.5.6}/docs/mcp.zh.md +5 -5
  16. {gapit-0.5.4 → gapit-0.5.6}/docs/outputs.md +4 -4
  17. {gapit-0.5.4 → gapit-0.5.6}/docs/outputs.zh.md +4 -4
  18. {gapit-0.5.4 → gapit-0.5.6}/docs/quickstart.md +7 -7
  19. {gapit-0.5.4 → gapit-0.5.6}/docs/quickstart.zh.md +6 -6
  20. {gapit-0.5.4 → gapit-0.5.6}/docs/reads.md +6 -6
  21. {gapit-0.5.4 → gapit-0.5.6}/docs/reads.zh.md +6 -6
  22. {gapit-0.5.4 → gapit-0.5.6}/docs/screen.md +2 -2
  23. {gapit-0.5.4 → gapit-0.5.6}/docs/screen.zh.md +2 -2
  24. {gapit-0.5.4 → gapit-0.5.6}/docs/summary.md +2 -2
  25. {gapit-0.5.4 → gapit-0.5.6}/docs/summary.zh.md +2 -2
  26. {gapit-0.5.4 → gapit-0.5.6}/docs/typing.md +42 -15
  27. {gapit-0.5.4 → gapit-0.5.6}/docs/typing.zh.md +35 -14
  28. {gapit-0.5.4 → gapit-0.5.6}/pixi.lock +6 -35
  29. {gapit-0.5.4 → gapit-0.5.6}/pixi.toml +1 -1
  30. {gapit-0.5.4 → gapit-0.5.6}/pyproject.toml +5 -5
  31. {gapit-0.5.4 → gapit-0.5.6}/recipe/meta.yaml +4 -4
  32. {gapit-0.5.4 → gapit-0.5.6}/scripts/cluster_calibration.py +7 -2
  33. gapit-0.5.6/scripts/generate_vp_typing.py +294 -0
  34. gapit-0.5.6/scripts/vp_rules_matrix.tsv +8 -0
  35. gapit-0.5.6/scripts/vp_typing_support.py +148 -0
  36. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/__init__.py +1 -1
  37. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/bundled.py +64 -27
  38. gapit-0.5.6/src/gapit/bundled_cluster.py +116 -0
  39. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cli.py +44 -45
  40. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cluster.py +5 -2
  41. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/clusterbuild.py +57 -8
  42. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_db.py +36 -41
  43. gapit-0.5.6/src/gapit/cmd_db_build.py +110 -0
  44. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_db_install.py +21 -21
  45. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_db_outdated.py +21 -24
  46. gapit-0.5.6/src/gapit/cmd_db_search.py +82 -0
  47. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_screen.py +174 -188
  48. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_screen_reads_args.py +1 -1
  49. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_summary.py +45 -40
  50. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_typing.py +38 -29
  51. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoh/bundled.json +1 -0
  52. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoli_dec/bundled.json +1 -0
  53. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/lm_doumith/bundled.json +1 -0
  54. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ncbi/bundled.json +1 -0
  55. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/resfinder/bundled.json +1 -0
  56. gapit-0.5.6/src/gapit/data/dbs/vc_serogroup/bundled.json +8 -0
  57. gapit-0.5.6/src/gapit/data/dbs/vc_serogroup/floors.json +5 -0
  58. gapit-0.5.6/src/gapit/data/dbs/vc_serogroup/records.jsonl +3 -0
  59. gapit-0.5.6/src/gapit/data/dbs/vc_serogroup/sequences +97 -0
  60. gapit-0.5.6/src/gapit/data/dbs/vc_serogroup/typing.json +68 -0
  61. gapit-0.5.6/src/gapit/data/dbs/vp_ok/bundled.json +10 -0
  62. gapit-0.5.6/src/gapit/data/dbs/vp_ok/features.json +47815 -0
  63. gapit-0.5.6/src/gapit/data/dbs/vp_ok/sequences +115266 -0
  64. gapit-0.5.6/src/gapit/data/dbs/vp_ok/typing.json +1830 -0
  65. gapit-0.5.6/src/gapit/data/typing/vp_ok.json +1830 -0
  66. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/db_build_ops.py +1 -1
  67. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/db_ops.py +14 -11
  68. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/db_query_ops.py +1 -1
  69. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/dispatch.py +49 -13
  70. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/cluster.py +4 -4
  71. gapit-0.5.6/src/gapit/formats/cluster2.py +225 -0
  72. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/cluster_md.py +116 -16
  73. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/schemas.py +2 -0
  74. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/gbfeatures.py +9 -1
  75. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/mcp.py +2 -2
  76. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/mcp_schemas.py +3 -1
  77. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/cluster_common.py +49 -10
  78. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/screening.py +4 -4
  79. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/screening_cluster.py +67 -24
  80. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/screening_reads.py +4 -4
  81. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/screening_reads_positional.py +4 -4
  82. gapit-0.5.6/src/gapit/typing_cluster2.py +62 -0
  83. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_decide.py +55 -8
  84. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_engine.py +26 -8
  85. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_gene.py +2 -40
  86. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_models.py +10 -14
  87. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_ops.py +2 -2
  88. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_results.py +44 -4
  89. gapit-0.5.6/stderr.txt +7 -0
  90. gapit-0.5.6/tests/data/cluster/colliding_genes.gbk +55 -0
  91. gapit-0.5.6/tests/golden/cluster2_vp_none.json +60 -0
  92. gapit-0.5.6/tests/golden/cluster2_vp_none.md +26 -0
  93. gapit-0.5.6/tests/golden/cluster2_vp_none.tsv +2 -0
  94. gapit-0.5.6/tests/golden/cluster2_vp_o3k6.json +187 -0
  95. gapit-0.5.6/tests/golden/cluster2_vp_o3k6.md +32 -0
  96. gapit-0.5.6/tests/golden/cluster2_vp_o3k6.tsv +2 -0
  97. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_exact.json +1 -1
  98. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_exact.md +1 -1
  99. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_fragmented.json +1 -1
  100. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_fragmented.md +1 -1
  101. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_ambiguous.json +1 -1
  102. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_ambiguous.md +1 -1
  103. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_cm_exact.json +1 -1
  104. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_cm_exact.md +1 -1
  105. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_exact.json +1 -1
  106. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_exact.md +1 -1
  107. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_vc_inaba.json +1 -1
  108. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_vc_inaba.md +1 -1
  109. gapit-0.5.6/tests/golden/features_kaptive_style.json +47 -0
  110. gapit-0.5.6/tests/golden/features_screening.json +54 -0
  111. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/fragments_merge.json +1 -1
  112. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/fragments_merge.md +1 -1
  113. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_dec_pic_astA.json +1 -1
  114. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_dec_pic_astA.md +1 -1
  115. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_doumith_4b.json +1 -1
  116. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_doumith_4b.md +1 -1
  117. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_l4b.json +1 -1
  118. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_l4b.md +1 -1
  119. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_mixed.json +1 -1
  120. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_mixed.md +1 -1
  121. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_vp_typed.json +1 -1
  122. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_vp_typed.md +1 -1
  123. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_shigella_mixed.json +1 -1
  124. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_shigella_mixed.md +1 -1
  125. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_typing_exact.json +1 -1
  126. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_typing_exact.md +1 -1
  127. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/reads_tinyamr.json +1 -1
  128. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/reads_tinyamr.md +1 -1
  129. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/screen_multi.json +1 -1
  130. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/screen_multi.md +1 -1
  131. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/summary_multi.json +1 -1
  132. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/summary_multi.md +1 -1
  133. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/typing_markers.json +1 -1
  134. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/typing_markers.md +1 -1
  135. {gapit-0.5.4 → gapit-0.5.6}/tests/test_bundled.py +186 -51
  136. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_aligner.py +3 -3
  137. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_bare_help.py +11 -13
  138. gapit-0.5.6/tests/test_cli_completion.py +87 -0
  139. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_db_build.py +1 -1
  140. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_db_build_cluster.py +3 -3
  141. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_db_fetch.py +24 -19
  142. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_db_query.py +1 -1
  143. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_fragments.py +1 -1
  144. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_reads.py +3 -3
  145. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_reads2.py +3 -3
  146. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_reads_glob.py +1 -1
  147. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_reads_glob_jobs.py +1 -1
  148. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_schema.py +1 -1
  149. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_screen.py +4 -4
  150. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_screen_jobs.py +1 -1
  151. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_setupdb.py +13 -8
  152. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_short_options.py +26 -28
  153. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_summary.py +1 -1
  154. gapit-0.5.6/tests/test_cluster2_build.py +260 -0
  155. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cluster_calibration.py +1 -1
  156. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cluster_db.py +1 -1
  157. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cluster_screen.py +1 -1
  158. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cluster_typing.py +2 -3
  159. {gapit-0.5.4 → gapit-0.5.6}/tests/test_db_fetch.py +1 -1
  160. {gapit-0.5.4 → gapit-0.5.6}/tests/test_db_list_extras.py +9 -8
  161. {gapit-0.5.4 → gapit-0.5.6}/tests/test_error_envelope.py +1 -1
  162. {gapit-0.5.4 → gapit-0.5.6}/tests/test_gapit_db_e2e.py +1 -1
  163. {gapit-0.5.4 → gapit-0.5.6}/tests/test_gene_floors_e2e.py +1 -1
  164. {gapit-0.5.4 → gapit-0.5.6}/tests/test_gene_typing.py +1 -1
  165. {gapit-0.5.4 → gapit-0.5.6}/tests/test_gene_typing2.py +1 -1
  166. {gapit-0.5.4 → gapit-0.5.6}/tests/test_json_format.py +1 -1
  167. {gapit-0.5.4 → gapit-0.5.6}/tests/test_lm_doumith.py +4 -4
  168. {gapit-0.5.4 → gapit-0.5.6}/tests/test_mcp.py +1 -1
  169. {gapit-0.5.4 → gapit-0.5.6}/tests/test_mcp_reads.py +1 -1
  170. {gapit-0.5.4 → gapit-0.5.6}/tests/test_md_format.py +1 -1
  171. {gapit-0.5.4 → gapit-0.5.6}/tests/test_oversubscription.py +1 -1
  172. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_kaptive.py +5 -4
  173. {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads2_homologs.py +1 -1
  174. {gapit-0.5.4 → gapit-0.5.6}/tests/test_streaming_chunks.py +1 -1
  175. {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_command.py +1 -1
  176. {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_engine.py +29 -13
  177. {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_models.py +37 -19
  178. {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_schemes.py +1 -1
  179. {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_schemes_cluster.py +120 -19
  180. gapit-0.5.6/tests/test_vc_serogroup.py +43 -0
  181. {gapit-0.5.4 → gapit-0.5.6}/tests/test_version.py +1 -1
  182. gapit-0.5.6/tests/test_vp_ok.py +139 -0
  183. gapit-0.5.6/tests/test_vp_ok_acceptance.py +143 -0
  184. gapit-0.5.4/src/gapit/cmd_db_build.py +0 -124
  185. gapit-0.5.4/src/gapit/cmd_db_search.py +0 -75
  186. gapit-0.5.4/src/gapit/data/dbs/upec_expec_vf/bundled.json +0 -7
  187. gapit-0.5.4/src/gapit/data/dbs/upec_expec_vf/sequences +0 -2648
  188. gapit-0.5.4/tests/test_cli_completion.py +0 -70
  189. {gapit-0.5.4 → gapit-0.5.6}/.gitattributes +0 -0
  190. {gapit-0.5.4 → gapit-0.5.6}/.github/workflows/ci.yml +0 -0
  191. {gapit-0.5.4 → gapit-0.5.6}/.github/workflows/docs.yml +0 -0
  192. {gapit-0.5.4 → gapit-0.5.6}/.github/workflows/release.yml +0 -0
  193. {gapit-0.5.4 → gapit-0.5.6}/.gitignore +0 -0
  194. {gapit-0.5.4 → gapit-0.5.6}/LICENSE +0 -0
  195. {gapit-0.5.4 → gapit-0.5.6}/SPEC.md +0 -0
  196. {gapit-0.5.4 → gapit-0.5.6}/docs/custom-db.md +0 -0
  197. {gapit-0.5.4 → gapit-0.5.6}/docs/custom-db.zh.md +0 -0
  198. {gapit-0.5.4 → gapit-0.5.6}/docs/index.md +0 -0
  199. {gapit-0.5.4 → gapit-0.5.6}/docs/index.zh.md +0 -0
  200. {gapit-0.5.4 → gapit-0.5.6}/mkdocs.yml +0 -0
  201. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/blast.py +0 -0
  202. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cluster_math.py +0 -0
  203. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_screen_positionals.py +0 -0
  204. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/config.py +0 -0
  205. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoh/sequences +0 -0
  206. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoli_dec/floors.json +0 -0
  207. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoli_dec/records.jsonl +0 -0
  208. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoli_dec/sequences +0 -0
  209. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoli_dec/typing.json +0 -0
  210. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/lm_doumith/sequences +0 -0
  211. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/lm_doumith/typing.json +0 -0
  212. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ncbi/sequences +0 -0
  213. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/resfinder/sequences +0 -0
  214. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/db.py +0 -0
  215. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/db_build_meta.py +0 -0
  216. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/dbbuild.py +0 -0
  217. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/dbcodec.py +0 -0
  218. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/engines.py +0 -0
  219. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/errors.py +0 -0
  220. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/fasta.py +0 -0
  221. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/__init__.py +0 -0
  222. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/json.py +0 -0
  223. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/md.py +0 -0
  224. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/reads_json.py +0 -0
  225. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/reads_tsv.py +0 -0
  226. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/summary.py +0 -0
  227. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/tsv.py +0 -0
  228. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/typing_result.py +0 -0
  229. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/fragments.py +0 -0
  230. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/gene_floors.py +0 -0
  231. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/gffparse.py +0 -0
  232. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/hits.py +0 -0
  233. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/mcp_tools.py +0 -0
  234. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/minimap.py +0 -0
  235. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/minimap2_run.py +0 -0
  236. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/paf.py +0 -0
  237. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/proctools.py +0 -0
  238. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/progress.py +0 -0
  239. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/__init__.py +0 -0
  240. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ab_k.py +0 -0
  241. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ab_o.py +0 -0
  242. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/argannot.py +0 -0
  243. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/bacmet2.py +0 -0
  244. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/card.py +0 -0
  245. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/common.py +0 -0
  246. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ecoh.py +0 -0
  247. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ecoli_kps.py +0 -0
  248. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ecoli_vf.py +0 -0
  249. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/kosc_k.py +0 -0
  250. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/kosc_o.py +0 -0
  251. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/kpsc_k.py +0 -0
  252. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/kpsc_o.py +0 -0
  253. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/megares.py +0 -0
  254. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ncbi.py +0 -0
  255. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/plasmidfinder.py +0 -0
  256. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/resfinder.py +0 -0
  257. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/upec_expec_vf.py +0 -0
  258. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/vfdb.py +0 -0
  259. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/victors.py +0 -0
  260. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/py.typed +0 -0
  261. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/readpairs.py +0 -0
  262. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/reads.py +0 -0
  263. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/records.py +0 -0
  264. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/report.py +0 -0
  265. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/seqconvert.py +0 -0
  266. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/summary.py +0 -0
  267. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_input.py +0 -0
  268. {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_rules.py +0 -0
  269. {gapit-0.5.4 → gapit-0.5.6}/tests/data/bundled_differential/resfinder/HEAD.zip +0 -0
  270. {gapit-0.5.4 → gapit-0.5.6}/tests/data/bundled_differential/resfinder/README.md +0 -0
  271. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/bakta_style.gbk +0 -0
  272. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/clusters.gff3 +0 -0
  273. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/clusters_gz.gff3.gz +0 -0
  274. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/clusters_sidecar.fa +0 -0
  275. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/clusters_sidecar.gff3 +0 -0
  276. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/compound.gbk +0 -0
  277. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/gz_input.gbk.gz +0 -0
  278. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/kaptive_style.gbk +0 -0
  279. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/nofasta.gff3 +0 -0
  280. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/screening.gbk +0 -0
  281. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/typing_invalid.json +0 -0
  282. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/typing_screen.json +0 -0
  283. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/typing_screen_cm.json +0 -0
  284. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/typing_screen_v2.json +0 -0
  285. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/typing_valid.json +0 -0
  286. {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/unnamed_cds.gbk +0 -0
  287. {gapit-0.5.4 → gapit-0.5.6}/tests/data/contigs/full.fa +0 -0
  288. {gapit-0.5.4 → gapit-0.5.6}/tests/data/contigs/gap.fa +0 -0
  289. {gapit-0.5.4 → gapit-0.5.6}/tests/data/contigs/none.fa +0 -0
  290. {gapit-0.5.4 → gapit-0.5.6}/tests/data/contigs/partial.fa +0 -0
  291. {gapit-0.5.4 → gapit-0.5.6}/tests/data/contigs/sort.fa +0 -0
  292. {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.embl +0 -0
  293. {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.embl.bz2 +0 -0
  294. {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.fa +0 -0
  295. {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.fa.gz +0 -0
  296. {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.fq +0 -0
  297. {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.gbk +0 -0
  298. {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.gbk.gz +0 -0
  299. {gapit-0.5.4 → gapit-0.5.6}/tests/data/db/tinyamr/sequences +0 -0
  300. {gapit-0.5.4 → gapit-0.5.6}/tests/data/fragments/fragdb/sequences +0 -0
  301. {gapit-0.5.4 → gapit-0.5.6}/tests/data/fragments/split3040.fa +0 -0
  302. {gapit-0.5.4 → gapit-0.5.6}/tests/data/fragments/split4060.fa +0 -0
  303. {gapit-0.5.4 → gapit-0.5.6}/tests/data/fragments/split5050.fa +0 -0
  304. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/argannot/ARG-ANNOT_NT_V6_July2019.txt +0 -0
  305. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/bacmet2/BacMet2_EXP_database.fasta +0 -0
  306. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/card/card.json +0 -0
  307. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/ecoh/EcOH.fasta +0 -0
  308. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/ecoli_vf/repaired_ecoli_vfs_shortnames.ffn +0 -0
  309. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/megares/megares_drugs_demo.fasta +0 -0
  310. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/ncbi/AMR_CDS.fa +0 -0
  311. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/ncbi/ReferenceGeneCatalog.txt +0 -0
  312. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/plasmidfinder/plasmids_a.fsa +0 -0
  313. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/plasmidfinder/plasmids_b.fsa +0 -0
  314. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/resfinder/aminoglycoside.fsa +0 -0
  315. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/resfinder/beta-lactam.fsa +0 -0
  316. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/resfinder/phenotypes.txt +0 -0
  317. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/upec_expec_vf/UPEC_ExPEC_VF.tsv +0 -0
  318. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/vfdb/VFDB_setA_nt.fas +0 -0
  319. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/victors/gen_downloads.php +0 -0
  320. {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/victors/gen_downloads_protein.php +0 -0
  321. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/bla_partial.fq +0 -0
  322. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/junk.fq +0 -0
  323. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/s1_1.fq.gz +0 -0
  324. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/s1_2.fq.gz +0 -0
  325. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/s2_R1.fq.gz +0 -0
  326. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/s2_R2.fq.gz +0 -0
  327. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/suly_partial.fq +0 -0
  328. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_R1.fq +0 -0
  329. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_R2.fq +0 -0
  330. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_full.fq +0 -0
  331. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_full.fq.gz +0 -0
  332. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_lane1.fq +0 -0
  333. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_lane2.fq +0 -0
  334. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_pe1_R1.fq +0 -0
  335. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_pe1_R2.fq +0 -0
  336. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_pe2_R1.fq +0 -0
  337. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_pe2_R2.fq +0 -0
  338. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads2/ont_homologs.fq +0 -0
  339. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads2/sr_homologs.fq +0 -0
  340. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads2_db/homologs/sequences +0 -0
  341. {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads_db/tinyreads/sequences +0 -0
  342. {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/empty.tsv +0 -0
  343. {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/multi_sample.tsv +0 -0
  344. {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/sample_a.csv +0 -0
  345. {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/sample_a.tsv +0 -0
  346. {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/sample_b.csv +0 -0
  347. {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/sample_b.tsv +0 -0
  348. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/dec_s1_aggR_pic_uidA.fasta +0 -0
  349. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/dec_s2_pic_astA_uidA.fasta +0 -0
  350. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/dec_s3_stx2a_escV_aggR_uidA.fasta +0 -0
  351. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/exact.fa +0 -0
  352. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/listeria_1c.fa +0 -0
  353. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/listeria_4b.fa +0 -0
  354. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/listeria_nogate.fa +0 -0
  355. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/markers.fa +0 -0
  356. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/mutated.fa +0 -0
  357. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/negative.fa +0 -0
  358. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/partial.fa +0 -0
  359. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/cholerae.gbk +0 -0
  360. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/cholerae.json +0 -0
  361. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/dec.fa +0 -0
  362. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/dec.json +0 -0
  363. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/doumith.fa +0 -0
  364. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/doumith.json +0 -0
  365. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/lm_doumith.fa +0 -0
  366. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/lm_doumith.json +0 -0
  367. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/meningotype.fa +0 -0
  368. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/meningotype.json +0 -0
  369. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/shigella.fa +0 -0
  370. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/shigella.json +0 -0
  371. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/vp_ok.gbk +0 -0
  372. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/vp_ok.json +0 -0
  373. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/serotyping.fa +0 -0
  374. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/typing_markers_v1.json +0 -0
  375. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/typing_markers_v2.json +0 -0
  376. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/typing_serotyping_v2.json +0 -0
  377. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/vp_mixed.fa +0 -0
  378. {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/vp_typed.fa +0 -0
  379. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_exact.tsv +0 -0
  380. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_fragmented.tsv +0 -0
  381. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_ambiguous.tsv +0 -0
  382. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_cm_exact.tsv +0 -0
  383. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_exact.tsv +0 -0
  384. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_vc_inaba.tsv +0 -0
  385. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/ecoli_dec_typed.tsv +0 -0
  386. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/ecoli_dec_typing.tsv +0 -0
  387. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/fragments_merge.tsv +0 -0
  388. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/lm_doumith_typing.tsv +0 -0
  389. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/summary_dutch.tsv +0 -0
  390. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/summary_multi.csv +0 -0
  391. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/summary_multi.tsv +0 -0
  392. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/tinyamr_multi_nopath.csv +0 -0
  393. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/tinyamr_multi_nopath.tsv +0 -0
  394. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/typing_markers.tsv +0 -0
  395. {gapit-0.5.4 → gapit-0.5.6}/tests/golden/typing_serotyping.tsv +0 -0
  396. {gapit-0.5.4 → gapit-0.5.6}/tests/parity/corpus/01_exact_and_junk.fa +0 -0
  397. {gapit-0.5.4 → gapit-0.5.6}/tests/parity/corpus/02_mutated.fa +0 -0
  398. {gapit-0.5.4 → gapit-0.5.6}/tests/parity/corpus/03_truncated.fa +0 -0
  399. {gapit-0.5.4 → gapit-0.5.6}/tests/parity/corpus/04_reverse.fa +0 -0
  400. {gapit-0.5.4 → gapit-0.5.6}/tests/parity/corpus/05_threshold.fa +0 -0
  401. {gapit-0.5.4 → gapit-0.5.6}/tests/parity/make_corpus.py +0 -0
  402. {gapit-0.5.4 → gapit-0.5.6}/tests/parity/run_parity.py +0 -0
  403. {gapit-0.5.4 → gapit-0.5.6}/tests/parity/run_summary_parity.py +0 -0
  404. {gapit-0.5.4 → gapit-0.5.6}/tests/test_blast_parse.py +0 -0
  405. {gapit-0.5.4 → gapit-0.5.6}/tests/test_blast_pipeline.py +0 -0
  406. {gapit-0.5.4 → gapit-0.5.6}/tests/test_cluster_math.py +0 -0
  407. {gapit-0.5.4 → gapit-0.5.6}/tests/test_config.py +0 -0
  408. {gapit-0.5.4 → gapit-0.5.6}/tests/test_db.py +0 -0
  409. {gapit-0.5.4 → gapit-0.5.6}/tests/test_db_headers.py +0 -0
  410. {gapit-0.5.4 → gapit-0.5.6}/tests/test_dbbuild.py +0 -0
  411. {gapit-0.5.4 → gapit-0.5.6}/tests/test_dbcodec.py +0 -0
  412. {gapit-0.5.4 → gapit-0.5.6}/tests/test_fasta.py +0 -0
  413. {gapit-0.5.4 → gapit-0.5.6}/tests/test_fragments.py +0 -0
  414. {gapit-0.5.4 → gapit-0.5.6}/tests/test_gbfeatures.py +0 -0
  415. {gapit-0.5.4 → gapit-0.5.6}/tests/test_gene_floors.py +0 -0
  416. {gapit-0.5.4 → gapit-0.5.6}/tests/test_gffparse.py +0 -0
  417. {gapit-0.5.4 → gapit-0.5.6}/tests/test_hits.py +0 -0
  418. {gapit-0.5.4 → gapit-0.5.6}/tests/test_mcp_db_tools.py +0 -0
  419. {gapit-0.5.4 → gapit-0.5.6}/tests/test_mcp_protocol.py +0 -0
  420. {gapit-0.5.4 → gapit-0.5.6}/tests/test_minimap.py +0 -0
  421. {gapit-0.5.4 → gapit-0.5.6}/tests/test_mol_type.py +0 -0
  422. {gapit-0.5.4 → gapit-0.5.6}/tests/test_paf.py +0 -0
  423. {gapit-0.5.4 → gapit-0.5.6}/tests/test_paf_identity.py +0 -0
  424. {gapit-0.5.4 → gapit-0.5.6}/tests/test_progress.py +0 -0
  425. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_argannot.py +0 -0
  426. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_bacmet2.py +0 -0
  427. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_card.py +0 -0
  428. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_ecoh.py +0 -0
  429. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_ecoli_vf.py +0 -0
  430. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_megares.py +0 -0
  431. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_ncbi.py +0 -0
  432. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_plasmidfinder.py +0 -0
  433. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_resfinder.py +0 -0
  434. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_upec_expec_vf.py +0 -0
  435. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_vfdb.py +0 -0
  436. {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_victors.py +0 -0
  437. {gapit-0.5.4 → gapit-0.5.6}/tests/test_providers_common.py +0 -0
  438. {gapit-0.5.4 → gapit-0.5.6}/tests/test_readpairs.py +0 -0
  439. {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads2_model.py +0 -0
  440. {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads_aggregate.py +0 -0
  441. {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads_integration.py +0 -0
  442. {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads_interval_union.py +0 -0
  443. {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads_streaming.py +0 -0
  444. {gapit-0.5.4 → gapit-0.5.6}/tests/test_records.py +0 -0
  445. {gapit-0.5.4 → gapit-0.5.6}/tests/test_report.py +0 -0
  446. {gapit-0.5.4 → gapit-0.5.6}/tests/test_screen_integration.py +0 -0
  447. {gapit-0.5.4 → gapit-0.5.6}/tests/test_screening_reads_unit.py +0 -0
  448. {gapit-0.5.4 → gapit-0.5.6}/tests/test_seqconvert.py +0 -0
  449. {gapit-0.5.4 → gapit-0.5.6}/tests/test_seqconvert_differential.py +0 -0
  450. {gapit-0.5.4 → gapit-0.5.6}/tests/test_summary.py +0 -0
  451. {gapit-0.5.4 → gapit-0.5.6}/tests/test_summary_formats.py +0 -0
  452. {gapit-0.5.4 → gapit-0.5.6}/tests/test_tsv.py +0 -0
  453. {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_stage2.py +0 -0
@@ -31,7 +31,7 @@ are we?** A modern, typed, testable Python tool that:
31
31
  native (`seqconvert.py`); `any2fasta` is no longer a gapit dependency anywhere — the
32
32
  differential-validation oracle binary arrives transitively via abricate in the opt-in
33
33
  `parity` pixi env (prepend `.pixi/envs/parity/bin` to PATH for the differential test).
34
- - **Core libraries**: `typer` (CLI), `pydantic` v2 (data models / JSON schema), `rich` (terminal
34
+ - **Core libraries**: `click` (CLI), `pydantic` v2 (data models / JSON schema), `rich` (terminal
35
35
  output). No biopython — FASTA I/O is a small streaming parser we own.
36
36
  - **Quality gates**: `ruff` (lint + format), `basedpyright` (strict mode), `pytest`.
37
37
 
@@ -89,7 +89,9 @@ gapit/
89
89
  │ ├── typing_results.py # typing evaluation-result models (PhenotypeDetail, SchemeCall)
90
90
  │ ├── typing_engine.py # typing evaluation, cluster path: rule scoring → phenotype call + breakdown
91
91
  │ ├── typing_gene.py # typing evaluation, gene path (DEC markers): hits → per-scheme report phenotypes
92
- │ ├── bundled.py # bundled databases: discovery + materialize-into-datadir (public-domain panels)
92
+ │ ├── typing_cluster2.py # typing evaluation, multi-scheme cluster path: report → per-scheme phenotypes map
93
+ │ ├── bundled.py # bundled databases: discovery + kind-forked materialize-into-datadir
94
+ │ ├── bundled_cluster.py # cluster-bundle materialization: committed artifacts → cluster build
93
95
  │ ├── blast.py # blastn invocation + tabular output parsing
94
96
  │ ├── hits.py # Hit model, identity/coverage computation, filtering, dedup
95
97
  │ ├── fragments.py # opt-in --merge-fragments cross-contig gene-fragment merging
@@ -125,14 +127,16 @@ gapit/
125
127
  │ │ ├── reads_json.py # versioned JSON (gapit.reads/1, gapit.reads/2)
126
128
  │ │ ├── md.py # Markdown (human + agent readable, YAML frontmatter)
127
129
  │ │ ├── cluster.py # gapit.cluster/1 models + JSON/TSV renderers (typed variant)
128
- │ │ ├── cluster_md.py # gapit.cluster/1 Markdown renderer (Phenotype column when typed)
130
+ │ │ ├── cluster2.py # gapit.cluster/2 models + JSON/TSV renderers (multi-scheme phenotypes map)
131
+ │ │ ├── cluster_md.py # gapit.cluster/1 + /2 Markdown renderers (Phenotype(s) column when typed)
129
132
  │ │ ├── typing_result.py # gapit.typing_result/1 models + TSV/JSON/MD renderers
130
133
  │ │ ├── schemas.py # registered output models behind `gapit schema`
131
134
  │ │ └── summary.py # summary matrix renderers (TSV/CSV/JSON/MD)
132
135
  │ ├── providers/ # 19 database provider modules (12 gene + 7 kaptive cluster) + cluster_common.py + common.py
133
136
  │ └── py.typed
134
137
  ├── scripts/
135
- │ └── cluster_calibration.py # developer calibration harness for typed cluster dbs
138
+ │ ├── cluster_calibration.py # developer calibration harness for typed cluster dbs (single-scheme split dbs)
139
+ │ └── generate_vp_typing.py # regenerates the committed vp_ok typing asset from the vpautils OAgc/CPSgc GBKs
136
140
  └── tests/
137
141
  ├── data/ # tiny synthetic db + contigs + reads (fast, offline)
138
142
  ├── golden/ # expected outputs incl. abricate reference TSVs
@@ -162,7 +166,7 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
162
166
  - **Formats**: `--format tsv|csv|json|md` (default `tsv` for abricate compatibility).
163
167
  - **JSON**: top-level `"schema": "gapit.report/1"`; schema introspectable via
164
168
  `gapit schema report | reads | reads2 | summary | list | error | version` (plus
165
- `cluster | features | typing | typing_result | floors`). Keys are snake_case,
169
+ `cluster | cluster2 | features | typing | typing_result | floors`). Keys are snake_case,
166
170
  units explicit (`identity_pct`, `coverage_pct`). Semver the schema; never rename or
167
171
  retype a field in a minor bump.
168
172
  - **Markdown**: YAML frontmatter (tool version, db, params, ISO-8601 UTC timestamp) + tables a
@@ -181,15 +185,24 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
181
185
  a license-compliance requirement: CARD/VFDB terms are non-commercial and Kaptive is GPL,
182
186
  so none of those may ride an MIT distribution; the sanctioned exceptions are the six
183
187
  content-provenance-audited bundles under `src/gapit/data/dbs/` — the public-domain
184
- `ecoli_dec` and `lm_doumith` panels plus four permissively licensed provider snapshots
185
- (`ncbi` public domain, `resfinder` Apache-2.0, `ecoh` BSD-3-Clause, `upec_expec_vf`
186
- MIT; GPL/NC content is never bundled) — materialized into the datadir on first use via
187
- `bundled.py`, with `db fetch <name>` still the fresh-upstream refresh path),
188
+ `ecoli_dec` and `lm_doumith` panels, three permissively licensed provider snapshots
189
+ (`ncbi` public domain, `resfinder` Apache-2.0, `ecoh` BSD-3-Clause), and the MIT
190
+ `vp_ok` typed cluster snapshot — a pure built-in in the ecoli_dec/lm_doumith pattern: no
191
+ provider module, no `db fetch`; vpautils OAgc+CPSgc merged content, MIT
192
+ (GPL/NC content is never bundled) — materialized into the datadir on first use via
193
+ `bundled.py` (gene bundles replay the gene pipeline, the cluster bundle the cluster
194
+ pipeline), with `db fetch <name>` the fresh-upstream refresh path for the
195
+ provider-backed bundled names (ecoh, ncbi, resfinder); what may
196
+ ride the wheel is governed by the §6 policy),
188
197
  database listing,
189
198
  records.jsonl gene search, staleness
190
199
  report, custom FASTA→native-db build, GBK/GFF→cluster-db build (`--typing` installs a
191
- validated `gapit.typing/1` or `/2` spec on either kind), the four download-on-fetch kaptive cluster providers
192
- (GPL content, never bundled), and SHA256-verified local-file install.
200
+ validated `gapit.typing/1` or `/2` spec on either kind), the seven download-on-fetch
201
+ kaptive cluster providers (four upstream repos, GPL content, never bundled), the
202
+ MIT-licensed `vp_ok` typed cluster bundle (OAgc+CPSgc merged: the committed typing asset
203
+ installs a 3-scheme `gapit.typing/2` doc so one screen renders `gapit.cluster/2` with
204
+ the composed `O:K` serotype, zero network from first install), and SHA256-verified
205
+ local-file install.
193
206
  - **MCP** `[gapit-extension]`: `gapit mcp` / `gapit-mcp` stdio server exposing nine tools:
194
207
  read-only `screen` (incl. `aligner minimap2` assembly survey), `screen_reads` (FASTQ via
195
208
  minimap2), `summary`, `schema`, `db_list`, `db_search`, `db_outdated`, plus the datadir-mutating
@@ -199,7 +212,38 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
199
212
  - **Self-description**: `gapit --version --json`, `gapit db list --json`, `gapit schema` — an agent
200
213
  must be able to discover everything without reading docs.
201
214
 
202
- ## 6. Testing strategy
215
+ ## 6. Bundled-database policy (what may ride the wheel)
216
+
217
+ `src/gapit/data/dbs/` is the sanctioned home for license-clean content shipped inside the
218
+ wheel: a directory qualifies by carrying `sequences` + `bundled.json` (auto-discovered by
219
+ `gapit.bundled`; `kind: cluster` in the metadata additionally requires `features.json`).
220
+ Materialization is kind-aware: gene bundles replay the gene-build pipeline, cluster
221
+ bundles the cluster-build pipeline (`bundled_cluster.py` rebuilds from the committed
222
+ locus FASTA + resolved feature table — gene ids stay snapshot-resolved, the typing spec
223
+ re-validates against them).
224
+ Bundling stays the exception, not the pattern: the other providers fetch from upstream at
225
+ `db fetch` time. Every new bundle passes two gates, in order:
226
+
227
+ 1. **License gate** (hard, independent of location): only public-domain or permissive
228
+ content (PD, Apache-2.0, BSD, MIT), provenance-audited. GPL (Kaptive) and
229
+ non-commercial terms (CARD, VFDB) never ride the MIT distribution — moving files
230
+ cannot fix this.
231
+ 2. **Size gate** (budget): the bundled-root total stays ≤ 30 MiB, mechanically enforced by
232
+ `tests/test_bundled.py` (every `pip install gapit` re-downloads all bundles; PyPI caps
233
+ one file at 100 MiB).
234
+
235
+ Growth tiers past the budget — split rather than inflate the ceiling:
236
+
237
+ - **≤ 30 MiB**: keep adding to `src/gapit/data/dbs/`. Atomic data-with-code versioning,
238
+ zero packaging machinery; the abricate precedent ships 16 MiB in-package.
239
+ - **30–100 MiB**: split a separate `gapit-data` wheel with its own version (the
240
+ `spacy[lookups]` → `spacy-lookups-data` pattern), pulled via a `gapit[datasets]` extra;
241
+ `bundled_databases()` grows a second discovery root.
242
+ - **> 100 MiB, or fast-moving upstreams**: fetch-on-demand only. `db fetch` is the
243
+ freshness path for every bundled name anyway — snapshots are point-in-time, and each
244
+ bundled upstream refresh would otherwise force a wheel release.
245
+
246
+ ## 7. Testing strategy
203
247
 
204
248
  - **Unit**: pure functions (coverage %, merge rules, header parsing) — no I/O beyond `tests/data`.
205
249
  - **Golden files**: fixed tiny db + fixed contigs → expected TSV/JSON/MD committed; update the
@@ -212,7 +256,7 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
212
256
  - Full suite + CI matrix 3.11/3.13/3.14; parity byte-diff is opt-in via the `parity` pixi env.
213
257
  Offline tests stay fast.
214
258
 
215
- ## 7. Domain knowledge (abridged; full detail in SPEC.md)
259
+ ## 8. Domain knowledge (abridged; full detail in SPEC.md)
216
260
 
217
261
  - A **database** is a directory `<datadir>/<dbname>/sequences`: a nucleotide FASTA whose headers
218
262
  encode `>~~~GENE~~~PRODUCT` (and accession / resistance metadata depending on the source db).
@@ -234,13 +278,13 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
234
278
  surfaces (reads, cluster, typing) follow their own documented contracts and may diverge from
235
279
  abricate by design.
236
280
 
237
- ## 8. Git & workflow
281
+ ## 9. Git & workflow
238
282
 
239
283
  - Conventional Commits (`feat:`, `fix:`, `test:`, `docs:`, `refactor:`).
240
284
  - Never commit unless the user explicitly asks. Never force-push.
241
285
  - `PLAN.md` tracks phases; update it when scope changes, not retroactively.
242
286
 
243
- ## 9. For agents working in this repo
287
+ ## 10. For agents working in this repo
244
288
 
245
289
  1. Read `SPEC.md` before touching `blast.py`, `hits.py`, or `minimap.py`.
246
290
  2. Public contract changes (JSON schema, exit codes, CLI flags) require a schema version bump and
@@ -5,6 +5,70 @@ All notable changes to gapit are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this
6
6
  project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.5.6] - 2026-10-20
9
+
10
+ ### Changed
11
+
12
+ - **`gapit.cluster/2` TSV/CSV reshaped: per-scheme winner evidence replaces the packed
13
+ PHENOTYPES cell and the global-best columns.** The header now derives from the typing
14
+ document: each compose scheme's value column renders first (`SEROTYPE` — the headline
15
+ answer leads), then every non-compose scheme carries its call plus the winning locus's
16
+ own evidence (`O_GROUP, O_LOCUS, O_COVERAGE, O_IDENTITY, O_PRESENT, O_PARTIAL,
17
+ O_MISSING` — the `o_group` evidence prefix shortens to `O`); `-` cells where no winner
18
+ exists. The misleading `BEST_LOCUS`/global-evidence columns are gone (they described
19
+ whichever locus of either family ranked first), and the JSON `phenotypes` map gains
20
+ additive `winner_*` fields (`winner_locus`, `winner_coverage_pct`, `winner_identity_pct`,
21
+ `winner_present`, `winner_partial`, `winner_missing`). Amendment of a contract shipped
22
+ in 0.5.5 days earlier with no downstream adoption; `/1` and `gapit.typing_result/1`
23
+ outputs are byte-frozen.
24
+
25
+ ## [0.5.5] - 2026-10-13
26
+
27
+ ### Added
28
+
29
+ - **`gapit.cluster/2` — multi-scheme cluster output.** A cluster database whose typing
30
+ document holds more than one scheme now renders `gapit.cluster/2`: same body as /1,
31
+ `best` drops its phenotype fields, and each file gains `phenotypes: {scheme: SchemeCall}`
32
+ in document order — compose schemes (e.g. `"{o_group}:{k_group}"`) render from sibling
33
+ calls, and schemes evaluate even without a best call. TSV/CSV swap PHENOTYPE for a packed
34
+ PHENOTYPES column (`o_group=O3;k_group=K6;serotype=O3:K6`); MD mirrors it plus per-scheme
35
+ lines. Untyped and single-scheme databases keep byte-identical `gapit.cluster/1`.
36
+ /2 builds guarantee globally-unique gene ids (collision-aware
37
+ /gene→locus_tag→`locus:id@start` resolution at build time). Registered as
38
+ `gapit schema cluster2`.
39
+
40
+ - **Bundled `vp_ok`: V. parahaemolyticus O:K serotyping, one scan.** The wheel now ships a
41
+ typed cluster bundle (six bundles total; ~7.9 MiB committed artifacts) built from the
42
+ vpasero OAgc/CPSgc reference loci (195 loci, MIT): `pip install gapit` →
43
+ `gapit screen genome.fna --db vp_ok` auto-materializes with zero network and renders
44
+ `gapit.cluster/2` with `o_group`, `k_group`, and the composed `O:K` serotype
45
+ (RIMD 2210633 → O3:K6). Kind-aware cluster-bundle materialization replays the same
46
+ cluster build entry `db build` uses — bundle ≡ build, byte-identical `sequences` +
47
+ `features.json` (regression-locked). Coverage floors calibrated over a 14,801-genome
48
+ corpus against Kaptive-style references: 90% coverage / 95% identity (O agreement
49
+ 89.08%, K 82.91%, true cross-calls 29/29,602 calls); the HARD-locus matrix is committed
50
+ (`scripts/vp_rules_matrix.tsv`) and `scripts/generate_vp_typing.py` regenerates the
51
+ typing asset reproducibly.
52
+
53
+ - **Bundled-database policy (AGENTS.md §6) with a mechanical 30 MiB budget guard** —
54
+ license gate (PD/Apache/BSD/MIT only) + size gate enforced by `tests/test_bundled.py`;
55
+ growth tiers documented (split a `gapit-data` wheel past the budget rather than inflate).
56
+
57
+ ### Changed
58
+
59
+ - **CLI migrated from typer to click 8.5.** Same flags, exit codes, envelopes, and stdout
60
+ bytes on every gapit-owned surface; a net dependency diet (typer/shellingham/annotated-doc
61
+ out, click in). Framework-rendered help is now plain click, and shell completion moved
62
+ from typer's `--install-completion`/`--show-completion` flags to the
63
+ `_GAPIT_COMPLETE=bash_source` env-var activation model (bash/zsh/fish; docs updated).
64
+
65
+ - **`gapit db list`: DESCRIPTION now precedes PROVIDER** (TSV and the rich table), and the
66
+ rich table renders with uniformly thin rule lines (was a heavy header separator).
67
+
68
+ - **`upec_expec_vf` no longer rides the wheel** — it returns to pure fetch-on-demand in
69
+ the provider catalog; the sanctioned bundled set is `ecoh`, `ecoli_dec`, `lm_doumith`,
70
+ `ncbi`, `resfinder`, `vp_ok`.
71
+
8
72
  ## [0.5.4] - 2026-10-03
9
73
 
10
74
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gapit
3
- Version: 0.5.4
3
+ Version: 0.5.6
4
4
  Summary: Mass screening of contigs and reads for known genes — agent-first Python reimplementation of abricate
5
5
  Project-URL: Homepage, https://github.com/indexofire/gapit
6
6
  Project-URL: Documentation, https://indexofire.github.io/gapit/
@@ -23,9 +23,9 @@ Classifier: Programming Language :: Python :: 3.13
23
23
  Classifier: Programming Language :: Python :: 3.14
24
24
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
25
25
  Requires-Python: >=3.11
26
+ Requires-Dist: click>=8.2
26
27
  Requires-Dist: pydantic>=2.7
27
28
  Requires-Dist: rich>=13
28
- Requires-Dist: typer>=0.12
29
29
  Description-Content-Type: text/markdown
30
30
 
31
31
  # gapit
@@ -111,19 +111,22 @@ presence defaults to 90% alignment breadth (`--min-breadth 90`).
111
111
  ## Databases
112
112
 
113
113
  A database is a directory under the datadir, resolved from `$GAPIT_DATADIR`, then
114
- `~/.local/share/gapit/db` (override per call with `--datadir`). Twenty-one databases are
115
- built into the catalog — twelve gene providers, seven kaptive cluster providers, and the
116
- two typed bundles `ecoli_dec` and `lm_doumith`. All of them build on `gapit db fetch`,
114
+ `~/.local/share/gapit/db` (override per call with `--datadir`). Twenty-two databases are
115
+ built into the catalog — twelve gene providers, seven kaptive cluster providers, and
116
+ three typed bundles (`ecoli_dec`, `lm_doumith`, and the cluster-kind `vp_ok`). Every
117
+ provider builds on `gapit db fetch`,
117
118
  which downloads from upstream — and six content-provenance-audited ones also ship inside
118
119
  the package (`ecoli_dec` and
119
- `lm_doumith` plus the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public
120
+ `lm_doumith` plus the `ncbi`, `resfinder`, `ecoh` snapshots — public
120
121
  domain / Apache-2.0 /
121
- BSD-3-Clause / MIT), materialized into the datadir on first use with zero network; the
122
+ BSD-3-Clause / MIT — and the MIT typed-cluster snapshot `vp_ok`), materialized into the
123
+ datadir on first use with zero network; the
122
124
  bundled `ecoli_dec` additionally carries per-gene identity floors (`floors.json`, `pic`
123
125
  at 90%) that reads mode applies before presence calls. Several
124
126
  upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's GPL-3.0) forbid
125
127
  redistribution inside an MIT-licensed distribution, so everything else is fetch-on-demand
126
- — and `db fetch <name>` always refreshes a bundled name from the latest upstream.
128
+ — and `db fetch <name>` refreshes the provider-backed bundled names (`ecoh`, `ncbi`,
129
+ `resfinder`) from the latest upstream.
127
130
 
128
131
  | Name | Content | dbtype |
129
132
  |---|---|---|
@@ -141,6 +144,7 @@ redistribution inside an MIT-licensed distribution, so everything else is fetch-
141
144
  | `bacmet2` | BacMet2 biocide/resistance genes (protein) | prot |
142
145
  | `victors` | Victors virulence factors | nucl |
143
146
  | `upec_expec_vf` | UPEC/ExPEC virulence genes | nucl |
147
+ | `vp_ok` | V. parahaemolyticus O and K antigen loci (OAgc/CPSgc, vpasero; cluster, MIT, one-scan O:K serotype) | nucl |
144
148
 
145
149
  gapit also reads datadirs built by abricate itself (legacy `~~~` headers). The reverse
146
150
  does not hold: gapit-native databases use the `gapit/v1` header format (see SPEC.md §11),
@@ -150,7 +154,14 @@ Gene **cluster** databases are a second kind: `gapit db build NAME loci.gbk|gff3
150
154
  `kind: cluster` db (locus calls via minimap2, optional `--typing FILE` phenotype scoring),
151
155
  and the seven Kaptive cluster databases (kpsc_k, kpsc_o, kosc_k, kosc_o, ab_k, ab_o,
152
156
  ecoli_kps) fetch the Kaptive antigen-locus references at install time (GPL-3.0 content, so
153
- nothing is bundled — cite Kaptive/Wyres et al. 2020 for results). `gapit db list --json`
157
+ nothing is bundled — cite Kaptive/Wyres et al. 2020 for results). The typed cluster
158
+ bundle `vp_ok`
159
+ merges the vpasero OAgc + CPSgc references (MIT) into one bundled db — a pure built-in in
160
+ the ecoli_dec/lm_doumith pattern, no `db fetch` — where a single
161
+ `gapit screen --db vp_ok` renders gapit.cluster/2 with `o_group`, `k_group`, and the
162
+ composed `serotype` O:K call (RIMD 2210633 → O3:K6), working straight after
163
+ `pip install gapit` with zero network.
164
+ `gapit db list --json`
154
165
  surfaces each provider's content license where one is pinned.
155
166
 
156
167
  ## Output contract
@@ -226,6 +226,22 @@ consumes abricate-built datadirs.
226
226
  seven-column TSV/MD table. Cluster typing stays integrated in `gapit screen`
227
227
  (`TYPING_CLUSTER_DB` on the command). No typing MCP tool yet (future work). Parity
228
228
  15/15 + summary 6/6 unchanged; no version bump.
229
+ > **`gapit.cluster/2` — multi-scheme cluster output (2026-10-12):** a cluster db whose
230
+ > typing doc holds more than one scheme (compose allowed) renders `gapit.cluster/2`:
231
+ > same body as /1, `best` drops its phenotype fields, each file gains
232
+ > `phenotypes: {scheme: SchemeCall}` in doc order (compose schemes render from sibling
233
+ > calls via the shared decision layer; schemes evaluate even without a best call).
234
+ > TSV/CSV swap PHENOTYPE for a packed `PHENOTYPES` column (`o_group=O3;k_group=K6`);
235
+ > MD mirrors it plus per-scheme lines. Untyped and single-scheme dbs keep byte-identical
236
+ > `gapit.cluster/1`. /2 builds guarantee globally-unique gene ids (collision-aware
237
+ > /gene→locus_tag→`locus:id@start` resolution at build time). Registered as
238
+ > `gapit schema cluster2`. The vp_ok cookbook now installs as one merged db.
239
+ > **Amended (2026-10-20, pre-adoption):** the packed `PHENOTYPES` cell and the
240
+ > global-best columns are replaced by document-derived per-scheme columns — compose
241
+ > value columns first (`SEROTYPE`), then each scheme's call + winner-locus evidence
242
+ > (`O_LOCUS/O_COVERAGE/...`); JSON `phenotypes` gains additive `winner_*` fields. /2
243
+ > shipped in 0.5.5 days earlier with no downstream adoption; /1 and typing_result/1
244
+ > stay byte-frozen.
229
245
 
230
246
  ## Milestones
231
247
 
@@ -81,19 +81,22 @@ presence defaults to 90% alignment breadth (`--min-breadth 90`).
81
81
  ## Databases
82
82
 
83
83
  A database is a directory under the datadir, resolved from `$GAPIT_DATADIR`, then
84
- `~/.local/share/gapit/db` (override per call with `--datadir`). Twenty-one databases are
85
- built into the catalog — twelve gene providers, seven kaptive cluster providers, and the
86
- two typed bundles `ecoli_dec` and `lm_doumith`. All of them build on `gapit db fetch`,
84
+ `~/.local/share/gapit/db` (override per call with `--datadir`). Twenty-two databases are
85
+ built into the catalog — twelve gene providers, seven kaptive cluster providers, and
86
+ three typed bundles (`ecoli_dec`, `lm_doumith`, and the cluster-kind `vp_ok`). Every
87
+ provider builds on `gapit db fetch`,
87
88
  which downloads from upstream — and six content-provenance-audited ones also ship inside
88
89
  the package (`ecoli_dec` and
89
- `lm_doumith` plus the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public
90
+ `lm_doumith` plus the `ncbi`, `resfinder`, `ecoh` snapshots — public
90
91
  domain / Apache-2.0 /
91
- BSD-3-Clause / MIT), materialized into the datadir on first use with zero network; the
92
+ BSD-3-Clause / MIT — and the MIT typed-cluster snapshot `vp_ok`), materialized into the
93
+ datadir on first use with zero network; the
92
94
  bundled `ecoli_dec` additionally carries per-gene identity floors (`floors.json`, `pic`
93
95
  at 90%) that reads mode applies before presence calls. Several
94
96
  upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's GPL-3.0) forbid
95
97
  redistribution inside an MIT-licensed distribution, so everything else is fetch-on-demand
96
- — and `db fetch <name>` always refreshes a bundled name from the latest upstream.
98
+ — and `db fetch <name>` refreshes the provider-backed bundled names (`ecoh`, `ncbi`,
99
+ `resfinder`) from the latest upstream.
97
100
 
98
101
  | Name | Content | dbtype |
99
102
  |---|---|---|
@@ -111,6 +114,7 @@ redistribution inside an MIT-licensed distribution, so everything else is fetch-
111
114
  | `bacmet2` | BacMet2 biocide/resistance genes (protein) | prot |
112
115
  | `victors` | Victors virulence factors | nucl |
113
116
  | `upec_expec_vf` | UPEC/ExPEC virulence genes | nucl |
117
+ | `vp_ok` | V. parahaemolyticus O and K antigen loci (OAgc/CPSgc, vpasero; cluster, MIT, one-scan O:K serotype) | nucl |
114
118
 
115
119
  gapit also reads datadirs built by abricate itself (legacy `~~~` headers). The reverse
116
120
  does not hold: gapit-native databases use the `gapit/v1` header format (see SPEC.md §11),
@@ -120,7 +124,14 @@ Gene **cluster** databases are a second kind: `gapit db build NAME loci.gbk|gff3
120
124
  `kind: cluster` db (locus calls via minimap2, optional `--typing FILE` phenotype scoring),
121
125
  and the seven Kaptive cluster databases (kpsc_k, kpsc_o, kosc_k, kosc_o, ab_k, ab_o,
122
126
  ecoli_kps) fetch the Kaptive antigen-locus references at install time (GPL-3.0 content, so
123
- nothing is bundled — cite Kaptive/Wyres et al. 2020 for results). `gapit db list --json`
127
+ nothing is bundled — cite Kaptive/Wyres et al. 2020 for results). The typed cluster
128
+ bundle `vp_ok`
129
+ merges the vpasero OAgc + CPSgc references (MIT) into one bundled db — a pure built-in in
130
+ the ecoli_dec/lm_doumith pattern, no `db fetch` — where a single
131
+ `gapit screen --db vp_ok` renders gapit.cluster/2 with `o_group`, `k_group`, and the
132
+ composed `serotype` O:K call (RIMD 2210633 → O3:K6), working straight after
133
+ `pip install gapit` with zero network.
134
+ `gapit db list --json`
124
135
  surfaces each provider's content license where one is pinned.
125
136
 
126
137
  ## Output contract
@@ -13,7 +13,7 @@ Version, as one JSON line:
13
13
 
14
14
  ```console
15
15
  $ gapit --version --json
16
- {"schema":"gapit.version/1","name":"gapit","version":"0.5.4"}
16
+ {"schema":"gapit.version/1","name":"gapit","version":"0.5.6"}
17
17
  ```
18
18
 
19
19
  Output schemas. Eleven documents are introspectable: `report`, `typing_result`, `reads`,
@@ -63,7 +63,7 @@ For example, `gapit schema version` (real output):
63
63
  ```
64
64
 
65
65
  Databases: the database catalog and install state (`gapit db list --json`; real output,
66
- first two of twenty-one shown, trimmed):
66
+ first two of twenty-two shown, trimmed):
67
67
 
68
68
  ```console
69
69
  $ gapit db list --json
@@ -12,7 +12,7 @@ gapit 生来就是被程序驱动的。每个输出都以机器可读为设计
12
12
 
13
13
  ```console
14
14
  $ gapit --version --json
15
- {"schema":"gapit.version/1","name":"gapit","version":"0.5.4"}
15
+ {"schema":"gapit.version/1","name":"gapit","version":"0.5.6"}
16
16
  ```
17
17
 
18
18
  输出 schema。十一个文档可自省:`report`、`typing_result`、`reads`、`reads2`、`cluster`、
@@ -61,7 +61,7 @@ $ gapit schema floors # gapit.floors/1 (per-gene identity floors, reads
61
61
  }
62
62
  ```
63
63
 
64
- 数据库:数据库目录与安装状态(`gapit db list --json`;真实输出,二十一个中的前两
64
+ 数据库:数据库目录与安装状态(`gapit db list --json`;真实输出,二十二个中的前两
65
65
  个,有删节):
66
66
 
67
67
  ```console
@@ -26,38 +26,39 @@ $ gapit db list --datadir /no/such/dir
26
26
 
27
27
  ```console
28
28
  $ gapit db list
29
- NAME PROVIDER STATUS DBTYPE DESCRIPTION
30
- ab_k Kaptive (Kenyon lab) available nucl A. baumannii K locus (Kaptive)
31
- ab_o Kaptive (Kenyon lab) available nucl A. baumannii OC locus — official keyword ab_o (Kaptive)
32
- argannot IHU Méditerranée-Infection available nucl ARG-ANNOT acquired resistance genes
33
- bacmet2 University of Gothenburg available prot BacMet2 experimentally confirmed biocide/resistance genes (protein)
34
- card McMaster University available nucl CARD protein homolog resistance models
35
- ecoli_kps Kaptive (Gladstone lab) available nucl E. coli group 2+3 capsular polysaccharide loci (Kaptive)
36
- ecoli_vf PHAC-NML available nucl E. coli virulence factors (phac-nml)
37
- kosc_k Kaptive (klebgenomics) available nucl K. oxytoca species complex K locus (Kaptive)
38
- kosc_o Kaptive (klebgenomics) available nucl K. oxytoca species complex O locus (Kaptive)
39
- kpsc_k Kaptive (klebgenomics) available nucl K. pneumoniae species complex K locus (Kaptive)
40
- kpsc_o Kaptive (klebgenomics) available nucl K. pneumoniae species complex O locus (Kaptive)
41
- megares MEG Lab available nucl MEGARes antimicrobial resistance genes
42
- plasmidfinder DTU CGE available nucl CGE PlasmidFinder replicons
43
- vfdb USTC (VFDB) available nucl VFDB virulence factors (set A, nucleotide)
44
- victors University of Chicago available nucl Victors virulence factors
45
- ecoh Holt lab (srst2) bundled nucl E. coli O and H antigens (srst2 EcOH)
46
- ecoli_dec gapit-curated (public-domain sources) bundled nucl Diarrheagenic E. coli marker panel (GB 4789.6 + risk-monitoring designation)
47
- lm_doumith gapit-curated (public-domain INSDC sources) bundled nucl Listeria monocytogenes serogrouping (Doumith 2004)
48
- ncbi NCBI bundled nucl NCBI AMRFinderPlus (reference finder) curated AMR
49
- resfinder DTU CGE bundled nucl CGE ResFinder acquired resistance genes
50
- upec_expec_vf FordeGenomics bundled nucl UPEC/ExPEC virulence genes (FordeGenomics)
29
+ NAME DESCRIPTION STATUS DBTYPE PROVIDER
30
+ ab_k A. baumannii K locus (Kaptive) available nucl Kaptive (Kenyon lab)
31
+ ab_o A. baumannii OC locus — official keyword ab_o (Kaptive) available nucl Kaptive (Kenyon lab)
32
+ argannot ARG-ANNOT acquired resistance genes available nucl IHU Méditerranée-Infection
33
+ bacmet2 BacMet2 experimentally confirmed biocide/resistance genes (protein) available prot University of Gothenburg
34
+ card CARD protein homolog resistance models available nucl McMaster University
35
+ ecoli_kps E. coli group 2+3 capsular polysaccharide loci (Kaptive) available nucl Kaptive (Gladstone lab)
36
+ ecoli_vf E. coli virulence factors (phac-nml) available nucl PHAC-NML
37
+ kosc_k K. oxytoca species complex K locus (Kaptive) available nucl Kaptive (klebgenomics)
38
+ kosc_o K. oxytoca species complex O locus (Kaptive) available nucl Kaptive (klebgenomics)
39
+ kpsc_k K. pneumoniae species complex K locus (Kaptive) available nucl Kaptive (klebgenomics)
40
+ kpsc_o K. pneumoniae species complex O locus (Kaptive) available nucl Kaptive (klebgenomics)
41
+ megares MEGARes antimicrobial resistance genes available nucl MEG Lab
42
+ plasmidfinder CGE PlasmidFinder replicons available nucl DTU CGE
43
+ vfdb VFDB virulence factors (set A, nucleotide) available nucl USTC (VFDB)
44
+ victors Victors virulence factors available nucl University of Chicago
45
+ ecoh E. coli O and H antigens (srst2 EcOH) bundled nucl Holt lab (srst2)
46
+ ecoli_dec Diarrheagenic E. coli marker panel (GB 4789.6 + risk-monitoring designation) bundled nucl gapit-curated (public-domain sources)
47
+ lm_doumith Listeria monocytogenes serogrouping (Doumith 2004) bundled nucl gapit-curated (public-domain INSDC sources)
48
+ ncbi NCBI AMRFinderPlus (reference finder) curated AMR bundled nucl NCBI
49
+ resfinder CGE ResFinder acquired resistance genes bundled nucl DTU CGE
50
+ vp_ok V. parahaemolyticus O and K antigen loci (OAgc/CPSgc, vpasero) bundled nucl gapit-curated (vpasero)
51
51
  ```
52
52
 
53
53
  NAME is the database name you pass to `--db`; PROVIDER names the upstream maintainer
54
54
  organisation. STATUS reads `installed (N)` when `<datadir>/<name>/gapit-manifest.json`
55
55
  exists, with N the record count, otherwise `available`. The last six rows are the
56
56
  wheel-shipped [bundled](#bundled-databases-install-time-ready) databases, alphabetical:
57
- `bundled` before materialization, `installed (N)` after. Four of them (`ecoh`, `ncbi`,
58
- `resfinder`, `upec_expec_vf`) are also registry providers — such names render exactly
59
- once, in the bundled section (never as a duplicate registry `available` row), and
60
- `gapit db fetch <name>` remains their fresh-upstream update path. Databases installed
57
+ `bundled` before materialization, `installed (N)` after. Three of them (`ecoh`, `ncbi`,
58
+ `resfinder`) are also registry providers — such names render
59
+ exactly once, in the bundled section (never as a duplicate registry `available` row), and
60
+ `gapit db fetch <name>` remains their fresh-upstream update path; `vp_ok` is bundled-only
61
+ (no provider, no fetch). Databases installed
61
62
  into the datadir outside the catalog also appear, after the bundled section and sorted by
62
63
  name: `db build` products (gene and cluster kinds alike) and manifest-less directories
63
64
  (abricate-style or `db install` bytes) render with PROVIDER `local`, the record count
@@ -138,7 +139,7 @@ accept: a bundled database works out of the box.
138
139
  | `lm_doumith` | Listeria monocytogenes serogrouping (5 records, Doumith 2004 markers) | 2026-10-03 | `gapit.typing/2` (scheme `doumith_serogroup`) |
139
140
  | `ncbi` | NCBI AMRFinderPlus curated AMR (8373 records) | 2026-10-02 | — |
140
141
  | `resfinder` | CGE ResFinder acquired resistance genes (3206 records) | 2026-10-02 | — |
141
- | `upec_expec_vf` | UPEC/ExPEC virulence genes (77 records, FordeGenomics) | 2026-10-02 | — |
142
+ | `vp_ok` | V. parahaemolyticus O and K antigen loci (195 loci, vpautils OAgc+CPSgc; cluster kind) | 2026-10-12 | `gapit.typing/2` (schemes `o_group`, `k_group`, `serotype`) |
142
143
 
143
144
  **License provenance.** Every `ecoli_dec` record was re-sourced from primary
144
145
  public-domain submissions (NCBI RefSeq/GenBank/DDBJ accessions, same alleles as the
@@ -147,20 +148,29 @@ and replaced during the 2026-10 audit, and the byte-identical `estA4` (J03311.1)
147
148
  `estA3` (M18346.1) — one `sth` gene, one sequence — was dropped by the build pipeline's
148
149
  exact-duplicate dedup in the 2026-10 rebuild, leaving 16 records. The `lm_doumith` panel was extracted the same
149
150
  way from public-domain INSDC records (accessions in each header; reverse-complement
150
- markers strand-corrected, `lmo0737` verified 100% against EGD-e). The four provider
151
- snapshots (`ecoh`, `ncbi`, `resfinder`, `upec_expec_vf`) passed the 2026-10
151
+ markers strand-corrected, `lmo0737` verified 100% against EGD-e). The three provider
152
+ snapshots (`ecoh`, `ncbi`, `resfinder`) passed the 2026-10
152
153
  content-level audit across **all** records: NCBI AMRFinderPlus content is public
153
- domain (US government work), the CGE ResFinder database is Apache-2.0, srst2's EcOH
154
- is BSD-3-Clause, and FordeGenomics' UPEC-ExPEC panel is MIT — all four permits
155
- redistribution inside the MIT-licensed wheel. A regression test pins that no `VF*` /
156
- `VFDB` / `ARO:` tags appear in any of the six bundles' headers.
154
+ domain (US government work), the CGE ResFinder database is Apache-2.0, and srst2's EcOH
155
+ is BSD-3-Clause — all three permit
156
+ redistribution inside the MIT-licensed wheel. The `vp_ok` cluster snapshot is
157
+ MIT-licensed vpautils content (lab-curated loci, Bakta-annotated, via
158
+ [indexofire/vpautils](https://github.com/indexofire/vpautils)); it ships as the
159
+ resolved `sequences` + `features.json` pair a completed gapit.typing/2 build
160
+ produces. A regression test pins that no `VF*` / `VFDB` / `ARO:` tags appear in any
161
+ of the six bundles' headers.
157
162
 
158
163
  **Snapshots are point-in-time.** Each snapshot's `sequences` file is byte-for-byte what
159
- `gapit db fetch <name>` produces from upstream on the snapshot date (a regression test
160
- proves the byte-identity for `resfinder` against a pinned copy of the upstream archive).
161
- The wheel copy therefore drifts as upstream curation moves on: `gapit db fetch <name>`
164
+ the upstream content produces on the snapshot date (a regression test proves the
165
+ byte-identity for `resfinder` against a pinned copy of the upstream archive, and for
166
+ `vp_ok` against a `gapit db build` over the real vpautils GenBank files when local
167
+ copies exist — `features.json` included, gene-id resolution included).
168
+ The wheel copy therefore drifts as upstream curation moves on: for the provider-backed
169
+ names (`ecoh`, `ncbi`, `resfinder`) `gapit db fetch <name>`
162
170
  (alone, or with `--force` to overwrite a materialized copy) re-downloads the **latest**
163
- upstream content and rebuilds the datadir database — the freshness path. `bundled.json`
171
+ upstream content and rebuilds the datadir database — the freshness path. `vp_ok` has no
172
+ provider: a refresh means a new resolved snapshot riding a wheel release.
173
+ `bundled.json`
164
174
  records the snapshot date for reference. (`db outdated` stays manifest-based in v1:
165
175
  it reports the materialization/fetch time of what is installed, not bundled-vs-upstream
166
176
  drift — comparing the wheel snapshots against latest upstream is future work.)
@@ -172,7 +182,11 @@ silenced by `--quiet`), then the standard gene-build pipeline: `records.jsonl`,
172
182
  `sequences` FASTA with gapit/v1 headers, the BLAST index, the `typing.json` copy when the
173
183
  bundle ships one, and a manifest stamped `source: "bundled"`. That pipeline — shared with
174
184
  `gapit db build` — drops exact `(gene, sequence)` duplicate records at build time (first
175
- kept; a stderr note and the receipt's `duplicates_dropped` count the drops). Deterministic, zero
185
+ kept; a stderr note and the receipt's `duplicates_dropped` count the drops). Cluster
186
+ bundles (`vp_ok`) run the cluster pipeline instead: materialization rebuilds the locus
187
+ FASTA and `features.json` from the committed artifacts through the same cluster build
188
+ entry a `db build` uses — gene ids stay snapshot-resolved, the typing spec re-validates
189
+ against them, no re-resolution. Deterministic, zero
176
190
  network. A missing datadir is created on this path only; `gapit setupdb` materializes
177
191
  every bundled database alongside indexing; re-running either is a no-op once the
178
192
  manifest exists. `db list` shows the database as `bundled` before that and
@@ -209,10 +223,41 @@ Known limitations, carried on the calls as notes where relevant:
209
223
  The fallback call — `untypeable (4a/4c, atypical profile, or non-Lm Listeria)` — is the
210
224
  honest answer for everything the five markers cannot resolve.
211
225
 
226
+ ### vp_ok (V. parahaemolyticus O:K, MIT, typed on install)
227
+
228
+ `vp_ok` wraps the two *Vibrio parahaemolyticus* serotype references of
229
+ [indexofire/vpautils](https://github.com/indexofire/vpautils) — `OAgc.gbk` (32
230
+ O-antigen gene cluster loci) and `CPSgc.gbk` (163 capsular polysaccharide loci) —
231
+ into ONE merged `kind: cluster` database. It is a PURE built-in bundled database in
232
+ the `ecoli_dec`/`lm_doumith` pattern: no provider, no source URLs, no
233
+ `gapit db fetch vp_ok`. The committed three-scheme typing asset
234
+ (`src/gapit/data/typing/vp_ok.json`, generated reproducibly by
235
+ `scripts/generate_vp_typing.py`) installs with it, so screening renders
236
+ `gapit.cluster/2` with per-file phenotypes `o_group`, `k_group`, and the composed
237
+ `serotype` `"{o_group}:{k_group}"` (fallbacks `OUT`/`KUT`) — the O:K serotype from a
238
+ single scan:
239
+
240
+ ```console
241
+ $ gapit screen RIMD.fna --db vp_ok --format json
242
+ {"schema": "gapit.cluster/2", ..., "phenotypes": {"o_group": {"phenotype": "O3"},
243
+ "k_group": {"phenotype": "K6"}, "serotype": {"phenotype": "O3:K6"}}}
244
+ ```
245
+
246
+ The database content is **MIT** (Bakta-annotated, via vpautils), so unlike the
247
+ kaptive providers it is license-clean for redistribution — a resolved snapshot ships
248
+ inside the wheel as the sixth bundled database (8.3 MiB committed artifacts, within
249
+ the 30 MiB budget), and first use materializes it with zero network. The
250
+ typing rules recompute sequence-unique key genes per locus (variants fold: OL4V1 →
251
+ O4, KL20V1 → K20; untyped OLU*/KLU* loci get no rule and fall back to OUT/KUT), and
252
+ the asset validates against the loci at build and materialization time — a drifted
253
+ upstream GBK fails `TYPING_UNKNOWN_GENE` instead of installing silently. Calibrated
254
+ against real genomes with RIMD 2210633 locked to O3:K6 (see the rule notes for the
255
+ documented per-locus tuning).
256
+
212
257
  ## Checking database freshness
213
258
 
214
259
  `gapit db outdated` reports every installed database's age against the staleness
215
- threshold. Against a fully installed datadir (output trimmed to three of twenty-one rows):
260
+ threshold. Against a fully installed datadir (output trimmed to three of twenty-two rows):
216
261
 
217
262
  ```console
218
263
  $ gapit db outdated --days 30
@@ -309,8 +354,10 @@ downloads from its upstream source at fetch time: with the exception of the six
309
354
  audited, permissively licensed bundles above, nothing is bundled inside the package,
310
355
  because several upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's
311
356
  GPL-3.0) forbid redistribution inside an MIT-licensed distribution. The seven kaptive
312
- providers are **cluster** databases (built through the cluster pipeline at fetch time —
313
- see [Kaptive providers](#kaptive-providers-gpl-downloaded-on-fetch)).
357
+ providers are **cluster** databases (built through the cluster pipeline at
358
+ fetch time — see [Kaptive providers](#kaptive-providers-gpl-downloaded-on-fetch));
359
+ the eighth cluster database, the typed `vp_ok`, is bundled-only
360
+ ([vp_ok](#vp_ok-v-parahaemolyticus-ok-mit-typed-on-install)).
314
361
 
315
362
  | Name | Maintainer | Content | dbtype |
316
363
  |---|---|---|---|
@@ -496,7 +543,7 @@ versions. A real one, from the plasmidfinder database:
496
543
  "upstream_version": "",
497
544
  "tool": {
498
545
  "name": "gapit",
499
- "version": "0.5.4"
546
+ "version": "0.5.6"
500
547
  },
501
548
  "makeblastdb_version": "blastn: 2.17.0+",
502
549
  "minimap2_version": "2.31-r1302"