gapit 0.5.1__tar.gz → 0.5.2__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 (416) hide show
  1. {gapit-0.5.1 → gapit-0.5.2}/AGENTS.md +7 -6
  2. {gapit-0.5.1 → gapit-0.5.2}/CHANGELOG.md +40 -0
  3. {gapit-0.5.1 → gapit-0.5.2}/PKG-INFO +6 -5
  4. {gapit-0.5.1 → gapit-0.5.2}/README.md +5 -4
  5. {gapit-0.5.1 → gapit-0.5.2}/docs/agents.md +1 -1
  6. {gapit-0.5.1 → gapit-0.5.2}/docs/agents.zh.md +1 -1
  7. {gapit-0.5.1 → gapit-0.5.2}/docs/databases.md +93 -11
  8. {gapit-0.5.1 → gapit-0.5.2}/docs/databases.zh.md +84 -7
  9. {gapit-0.5.1 → gapit-0.5.2}/docs/installation.md +2 -2
  10. {gapit-0.5.1 → gapit-0.5.2}/docs/installation.zh.md +2 -2
  11. {gapit-0.5.1 → gapit-0.5.2}/docs/mcp.md +4 -4
  12. {gapit-0.5.1 → gapit-0.5.2}/docs/mcp.zh.md +4 -4
  13. {gapit-0.5.1 → gapit-0.5.2}/docs/outputs.md +4 -4
  14. {gapit-0.5.1 → gapit-0.5.2}/docs/outputs.zh.md +4 -4
  15. {gapit-0.5.1 → gapit-0.5.2}/docs/quickstart.md +1 -1
  16. {gapit-0.5.1 → gapit-0.5.2}/docs/quickstart.zh.md +1 -1
  17. {gapit-0.5.1 → gapit-0.5.2}/docs/reads.md +56 -7
  18. {gapit-0.5.1 → gapit-0.5.2}/docs/reads.zh.md +52 -7
  19. {gapit-0.5.1 → gapit-0.5.2}/docs/screen.md +2 -2
  20. {gapit-0.5.1 → gapit-0.5.2}/docs/screen.zh.md +2 -2
  21. {gapit-0.5.1 → gapit-0.5.2}/docs/summary.md +2 -2
  22. {gapit-0.5.1 → gapit-0.5.2}/docs/summary.zh.md +2 -2
  23. {gapit-0.5.1 → gapit-0.5.2}/docs/typing.md +37 -0
  24. {gapit-0.5.1 → gapit-0.5.2}/docs/typing.zh.md +37 -1
  25. {gapit-0.5.1 → gapit-0.5.2}/pixi.lock +2 -2
  26. {gapit-0.5.1 → gapit-0.5.2}/pixi.toml +1 -1
  27. {gapit-0.5.1 → gapit-0.5.2}/pyproject.toml +1 -1
  28. {gapit-0.5.1 → gapit-0.5.2}/recipe/meta.yaml +3 -3
  29. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/__init__.py +1 -1
  30. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/bundled.py +10 -2
  31. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cli.py +1 -1
  32. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_db_build.py +13 -0
  33. gapit-0.5.2/src/gapit/data/dbs/ecoli_dec/floors.json +1 -0
  34. gapit-0.5.2/src/gapit/data/dbs/lm_doumith/bundled.json +7 -0
  35. gapit-0.5.2/src/gapit/data/dbs/lm_doumith/sequences +58 -0
  36. gapit-0.5.2/src/gapit/data/dbs/lm_doumith/typing.json +72 -0
  37. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/db_build_ops.py +18 -2
  38. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/schemas.py +2 -0
  39. gapit-0.5.2/src/gapit/gene_floors.py +122 -0
  40. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/reads.py +10 -1
  41. gapit-0.5.2/tests/data/typing/schemes/lm_doumith.fa +58 -0
  42. gapit-0.5.2/tests/data/typing/schemes/lm_doumith.json +72 -0
  43. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_exact.json +1 -1
  44. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_exact.md +1 -1
  45. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_fragmented.json +1 -1
  46. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_fragmented.md +1 -1
  47. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_ambiguous.json +1 -1
  48. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_ambiguous.md +1 -1
  49. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_cm_exact.json +1 -1
  50. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_cm_exact.md +1 -1
  51. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_exact.json +1 -1
  52. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_exact.md +1 -1
  53. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_vc_inaba.json +1 -1
  54. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_vc_inaba.md +1 -1
  55. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/fragments_merge.json +1 -1
  56. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/fragments_merge.md +1 -1
  57. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_dec_pic_astA.json +1 -1
  58. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_dec_pic_astA.md +1 -1
  59. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_doumith_4b.json +1 -1
  60. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_doumith_4b.md +1 -1
  61. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_l4b.json +1 -1
  62. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_l4b.md +1 -1
  63. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_mixed.json +1 -1
  64. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_mixed.md +1 -1
  65. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_vp_typed.json +1 -1
  66. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_serotyping_vp_typed.md +1 -1
  67. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_shigella_mixed.json +1 -1
  68. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_shigella_mixed.md +1 -1
  69. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_typing_exact.json +1 -1
  70. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/gene_typing_exact.md +1 -1
  71. gapit-0.5.2/tests/golden/lm_doumith_typing.tsv +3 -0
  72. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/reads_tinyamr.json +1 -1
  73. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/reads_tinyamr.md +1 -1
  74. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/screen_multi.json +1 -1
  75. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/screen_multi.md +1 -1
  76. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/summary_multi.json +1 -1
  77. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/summary_multi.md +1 -1
  78. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/typing_markers.json +1 -1
  79. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/typing_markers.md +1 -1
  80. {gapit-0.5.1 → gapit-0.5.2}/tests/test_bundled.py +44 -24
  81. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_db_build.py +98 -0
  82. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_db_fetch.py +2 -0
  83. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_schema.py +11 -0
  84. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_setupdb.py +8 -5
  85. {gapit-0.5.1 → gapit-0.5.2}/tests/test_db_list_extras.py +2 -1
  86. gapit-0.5.2/tests/test_gene_floors.py +244 -0
  87. gapit-0.5.2/tests/test_gene_floors_e2e.py +144 -0
  88. gapit-0.5.2/tests/test_lm_doumith.py +313 -0
  89. {gapit-0.5.1 → gapit-0.5.2}/.gitattributes +0 -0
  90. {gapit-0.5.1 → gapit-0.5.2}/.github/workflows/ci.yml +0 -0
  91. {gapit-0.5.1 → gapit-0.5.2}/.github/workflows/docs.yml +0 -0
  92. {gapit-0.5.1 → gapit-0.5.2}/.github/workflows/release.yml +0 -0
  93. {gapit-0.5.1 → gapit-0.5.2}/.gitignore +0 -0
  94. {gapit-0.5.1 → gapit-0.5.2}/LICENSE +0 -0
  95. {gapit-0.5.1 → gapit-0.5.2}/PLAN.md +0 -0
  96. {gapit-0.5.1 → gapit-0.5.2}/SPEC.md +0 -0
  97. {gapit-0.5.1 → gapit-0.5.2}/docs/custom-db.md +0 -0
  98. {gapit-0.5.1 → gapit-0.5.2}/docs/custom-db.zh.md +0 -0
  99. {gapit-0.5.1 → gapit-0.5.2}/docs/faq.md +0 -0
  100. {gapit-0.5.1 → gapit-0.5.2}/docs/faq.zh.md +0 -0
  101. {gapit-0.5.1 → gapit-0.5.2}/docs/index.md +0 -0
  102. {gapit-0.5.1 → gapit-0.5.2}/docs/index.zh.md +0 -0
  103. {gapit-0.5.1 → gapit-0.5.2}/mkdocs.yml +0 -0
  104. {gapit-0.5.1 → gapit-0.5.2}/scripts/cluster_calibration.py +0 -0
  105. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/blast.py +0 -0
  106. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cluster.py +0 -0
  107. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cluster_math.py +0 -0
  108. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/clusterbuild.py +0 -0
  109. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_db.py +0 -0
  110. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_db_install.py +0 -0
  111. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_db_outdated.py +0 -0
  112. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_db_search.py +0 -0
  113. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_screen.py +0 -0
  114. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_screen_positionals.py +0 -0
  115. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_screen_reads_args.py +0 -0
  116. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_summary.py +0 -0
  117. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/cmd_typing.py +0 -0
  118. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/config.py +0 -0
  119. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ecoh/bundled.json +0 -0
  120. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ecoh/sequences +0 -0
  121. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ecoli_dec/bundled.json +0 -0
  122. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ecoli_dec/sequences +0 -0
  123. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ecoli_dec/typing.json +0 -0
  124. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ncbi/bundled.json +0 -0
  125. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/ncbi/sequences +0 -0
  126. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/resfinder/bundled.json +0 -0
  127. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/resfinder/sequences +0 -0
  128. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/upec_expec_vf/bundled.json +0 -0
  129. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/data/dbs/upec_expec_vf/sequences +0 -0
  130. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/db.py +0 -0
  131. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/db_ops.py +0 -0
  132. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/db_query_ops.py +0 -0
  133. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/dbbuild.py +0 -0
  134. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/dbcodec.py +0 -0
  135. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/dispatch.py +0 -0
  136. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/engines.py +0 -0
  137. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/errors.py +0 -0
  138. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/fasta.py +0 -0
  139. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/__init__.py +0 -0
  140. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/cluster.py +0 -0
  141. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/cluster_md.py +0 -0
  142. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/json.py +0 -0
  143. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/md.py +0 -0
  144. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/reads_json.py +0 -0
  145. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/reads_tsv.py +0 -0
  146. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/summary.py +0 -0
  147. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/tsv.py +0 -0
  148. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/formats/typing_result.py +0 -0
  149. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/fragments.py +0 -0
  150. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/gbfeatures.py +0 -0
  151. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/gffparse.py +0 -0
  152. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/hits.py +0 -0
  153. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/mcp.py +0 -0
  154. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/mcp_schemas.py +0 -0
  155. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/mcp_tools.py +0 -0
  156. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/minimap.py +0 -0
  157. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/minimap2_run.py +0 -0
  158. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/paf.py +0 -0
  159. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/proctools.py +0 -0
  160. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/__init__.py +0 -0
  161. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ab_k.py +0 -0
  162. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ab_o.py +0 -0
  163. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/argannot.py +0 -0
  164. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/bacmet2.py +0 -0
  165. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/card.py +0 -0
  166. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/cluster_common.py +0 -0
  167. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/common.py +0 -0
  168. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ecoh.py +0 -0
  169. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ecoli_kps.py +0 -0
  170. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ecoli_vf.py +0 -0
  171. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/kosc_k.py +0 -0
  172. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/kosc_o.py +0 -0
  173. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/kpsc_k.py +0 -0
  174. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/kpsc_o.py +0 -0
  175. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/megares.py +0 -0
  176. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/ncbi.py +0 -0
  177. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/plasmidfinder.py +0 -0
  178. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/resfinder.py +0 -0
  179. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/upec_expec_vf.py +0 -0
  180. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/vfdb.py +0 -0
  181. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/providers/victors.py +0 -0
  182. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/py.typed +0 -0
  183. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/readpairs.py +0 -0
  184. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/records.py +0 -0
  185. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/report.py +0 -0
  186. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/screening.py +0 -0
  187. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/screening_cluster.py +0 -0
  188. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/screening_reads.py +0 -0
  189. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/screening_reads_positional.py +0 -0
  190. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/seqconvert.py +0 -0
  191. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/summary.py +0 -0
  192. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_decide.py +0 -0
  193. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_engine.py +0 -0
  194. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_gene.py +0 -0
  195. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_input.py +0 -0
  196. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_models.py +0 -0
  197. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_ops.py +0 -0
  198. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_results.py +0 -0
  199. {gapit-0.5.1 → gapit-0.5.2}/src/gapit/typing_rules.py +0 -0
  200. {gapit-0.5.1 → gapit-0.5.2}/tests/data/bundled_differential/resfinder/HEAD.zip +0 -0
  201. {gapit-0.5.1 → gapit-0.5.2}/tests/data/bundled_differential/resfinder/README.md +0 -0
  202. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/bakta_style.gbk +0 -0
  203. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/clusters.gff3 +0 -0
  204. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/clusters_gz.gff3.gz +0 -0
  205. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/clusters_sidecar.fa +0 -0
  206. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/clusters_sidecar.gff3 +0 -0
  207. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/compound.gbk +0 -0
  208. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/gz_input.gbk.gz +0 -0
  209. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/kaptive_style.gbk +0 -0
  210. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/nofasta.gff3 +0 -0
  211. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/screening.gbk +0 -0
  212. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/typing_invalid.json +0 -0
  213. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/typing_screen.json +0 -0
  214. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/typing_screen_cm.json +0 -0
  215. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/typing_screen_v2.json +0 -0
  216. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/typing_valid.json +0 -0
  217. {gapit-0.5.1 → gapit-0.5.2}/tests/data/cluster/unnamed_cds.gbk +0 -0
  218. {gapit-0.5.1 → gapit-0.5.2}/tests/data/contigs/full.fa +0 -0
  219. {gapit-0.5.1 → gapit-0.5.2}/tests/data/contigs/gap.fa +0 -0
  220. {gapit-0.5.1 → gapit-0.5.2}/tests/data/contigs/none.fa +0 -0
  221. {gapit-0.5.1 → gapit-0.5.2}/tests/data/contigs/partial.fa +0 -0
  222. {gapit-0.5.1 → gapit-0.5.2}/tests/data/contigs/sort.fa +0 -0
  223. {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.embl +0 -0
  224. {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.embl.bz2 +0 -0
  225. {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.fa +0 -0
  226. {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.fa.gz +0 -0
  227. {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.fq +0 -0
  228. {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.gbk +0 -0
  229. {gapit-0.5.1 → gapit-0.5.2}/tests/data/convert/sample.gbk.gz +0 -0
  230. {gapit-0.5.1 → gapit-0.5.2}/tests/data/db/tinyamr/sequences +0 -0
  231. {gapit-0.5.1 → gapit-0.5.2}/tests/data/fragments/fragdb/sequences +0 -0
  232. {gapit-0.5.1 → gapit-0.5.2}/tests/data/fragments/split3040.fa +0 -0
  233. {gapit-0.5.1 → gapit-0.5.2}/tests/data/fragments/split4060.fa +0 -0
  234. {gapit-0.5.1 → gapit-0.5.2}/tests/data/fragments/split5050.fa +0 -0
  235. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/argannot/ARG-ANNOT_NT_V6_July2019.txt +0 -0
  236. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/bacmet2/BacMet2_EXP_database.fasta +0 -0
  237. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/card/card.json +0 -0
  238. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/ecoh/EcOH.fasta +0 -0
  239. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/ecoli_vf/repaired_ecoli_vfs_shortnames.ffn +0 -0
  240. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/megares/megares_drugs_demo.fasta +0 -0
  241. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/ncbi/AMR_CDS.fa +0 -0
  242. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/ncbi/ReferenceGeneCatalog.txt +0 -0
  243. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/plasmidfinder/plasmids_a.fsa +0 -0
  244. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/plasmidfinder/plasmids_b.fsa +0 -0
  245. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/resfinder/aminoglycoside.fsa +0 -0
  246. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/resfinder/beta-lactam.fsa +0 -0
  247. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/resfinder/phenotypes.txt +0 -0
  248. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/upec_expec_vf/UPEC_ExPEC_VF.tsv +0 -0
  249. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/vfdb/VFDB_setA_nt.fas +0 -0
  250. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/victors/gen_downloads.php +0 -0
  251. {gapit-0.5.1 → gapit-0.5.2}/tests/data/providers/victors/gen_downloads_protein.php +0 -0
  252. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/bla_partial.fq +0 -0
  253. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/junk.fq +0 -0
  254. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/s1_1.fq.gz +0 -0
  255. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/s1_2.fq.gz +0 -0
  256. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/s2_R1.fq.gz +0 -0
  257. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/s2_R2.fq.gz +0 -0
  258. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/suly_partial.fq +0 -0
  259. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_R1.fq +0 -0
  260. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_R2.fq +0 -0
  261. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_full.fq +0 -0
  262. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_full.fq.gz +0 -0
  263. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_lane1.fq +0 -0
  264. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_lane2.fq +0 -0
  265. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_pe1_R1.fq +0 -0
  266. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_pe1_R2.fq +0 -0
  267. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_pe2_R1.fq +0 -0
  268. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads/tetx_pe2_R2.fq +0 -0
  269. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads2/ont_homologs.fq +0 -0
  270. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads2/sr_homologs.fq +0 -0
  271. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads2_db/homologs/sequences +0 -0
  272. {gapit-0.5.1 → gapit-0.5.2}/tests/data/reads_db/tinyreads/sequences +0 -0
  273. {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/empty.tsv +0 -0
  274. {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/multi_sample.tsv +0 -0
  275. {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/sample_a.csv +0 -0
  276. {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/sample_a.tsv +0 -0
  277. {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/sample_b.csv +0 -0
  278. {gapit-0.5.1 → gapit-0.5.2}/tests/data/summary/sample_b.tsv +0 -0
  279. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/dec_s1_aggR_pic_uidA.fasta +0 -0
  280. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/dec_s2_pic_astA_uidA.fasta +0 -0
  281. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/dec_s3_stx2a_escV_aggR_uidA.fasta +0 -0
  282. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/exact.fa +0 -0
  283. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/listeria_1c.fa +0 -0
  284. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/listeria_4b.fa +0 -0
  285. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/listeria_nogate.fa +0 -0
  286. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/markers.fa +0 -0
  287. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/mutated.fa +0 -0
  288. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/negative.fa +0 -0
  289. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/partial.fa +0 -0
  290. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/cholerae.gbk +0 -0
  291. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/cholerae.json +0 -0
  292. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/dec.fa +0 -0
  293. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/dec.json +0 -0
  294. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/doumith.fa +0 -0
  295. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/doumith.json +0 -0
  296. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/meningotype.fa +0 -0
  297. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/meningotype.json +0 -0
  298. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/shigella.fa +0 -0
  299. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/shigella.json +0 -0
  300. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/vp_ok.gbk +0 -0
  301. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/schemes/vp_ok.json +0 -0
  302. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/serotyping.fa +0 -0
  303. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/typing_markers_v1.json +0 -0
  304. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/typing_markers_v2.json +0 -0
  305. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/typing_serotyping_v2.json +0 -0
  306. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/vp_mixed.fa +0 -0
  307. {gapit-0.5.1 → gapit-0.5.2}/tests/data/typing/vp_typed.fa +0 -0
  308. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_exact.tsv +0 -0
  309. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_fragmented.tsv +0 -0
  310. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_ambiguous.tsv +0 -0
  311. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_cm_exact.tsv +0 -0
  312. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_typing_exact.tsv +0 -0
  313. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/cluster_vc_inaba.tsv +0 -0
  314. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/ecoli_dec_typed.tsv +0 -0
  315. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/ecoli_dec_typing.tsv +0 -0
  316. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/fragments_merge.tsv +0 -0
  317. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/summary_dutch.tsv +0 -0
  318. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/summary_multi.csv +0 -0
  319. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/summary_multi.tsv +0 -0
  320. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/tinyamr_multi_nopath.csv +0 -0
  321. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/tinyamr_multi_nopath.tsv +0 -0
  322. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/typing_markers.tsv +0 -0
  323. {gapit-0.5.1 → gapit-0.5.2}/tests/golden/typing_serotyping.tsv +0 -0
  324. {gapit-0.5.1 → gapit-0.5.2}/tests/parity/corpus/01_exact_and_junk.fa +0 -0
  325. {gapit-0.5.1 → gapit-0.5.2}/tests/parity/corpus/02_mutated.fa +0 -0
  326. {gapit-0.5.1 → gapit-0.5.2}/tests/parity/corpus/03_truncated.fa +0 -0
  327. {gapit-0.5.1 → gapit-0.5.2}/tests/parity/corpus/04_reverse.fa +0 -0
  328. {gapit-0.5.1 → gapit-0.5.2}/tests/parity/corpus/05_threshold.fa +0 -0
  329. {gapit-0.5.1 → gapit-0.5.2}/tests/parity/make_corpus.py +0 -0
  330. {gapit-0.5.1 → gapit-0.5.2}/tests/parity/run_parity.py +0 -0
  331. {gapit-0.5.1 → gapit-0.5.2}/tests/parity/run_summary_parity.py +0 -0
  332. {gapit-0.5.1 → gapit-0.5.2}/tests/test_blast_parse.py +0 -0
  333. {gapit-0.5.1 → gapit-0.5.2}/tests/test_blast_pipeline.py +0 -0
  334. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_aligner.py +0 -0
  335. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_bare_help.py +0 -0
  336. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_completion.py +0 -0
  337. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_db_build_cluster.py +0 -0
  338. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_db_query.py +0 -0
  339. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_fragments.py +0 -0
  340. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_reads.py +0 -0
  341. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_reads2.py +0 -0
  342. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_reads_glob.py +0 -0
  343. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_reads_glob_jobs.py +0 -0
  344. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_screen.py +0 -0
  345. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_screen_jobs.py +0 -0
  346. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_short_options.py +0 -0
  347. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cli_summary.py +0 -0
  348. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cluster_calibration.py +0 -0
  349. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cluster_db.py +0 -0
  350. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cluster_math.py +0 -0
  351. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cluster_screen.py +0 -0
  352. {gapit-0.5.1 → gapit-0.5.2}/tests/test_cluster_typing.py +0 -0
  353. {gapit-0.5.1 → gapit-0.5.2}/tests/test_config.py +0 -0
  354. {gapit-0.5.1 → gapit-0.5.2}/tests/test_db.py +0 -0
  355. {gapit-0.5.1 → gapit-0.5.2}/tests/test_db_fetch.py +0 -0
  356. {gapit-0.5.1 → gapit-0.5.2}/tests/test_db_headers.py +0 -0
  357. {gapit-0.5.1 → gapit-0.5.2}/tests/test_dbbuild.py +0 -0
  358. {gapit-0.5.1 → gapit-0.5.2}/tests/test_dbcodec.py +0 -0
  359. {gapit-0.5.1 → gapit-0.5.2}/tests/test_error_envelope.py +0 -0
  360. {gapit-0.5.1 → gapit-0.5.2}/tests/test_fasta.py +0 -0
  361. {gapit-0.5.1 → gapit-0.5.2}/tests/test_fragments.py +0 -0
  362. {gapit-0.5.1 → gapit-0.5.2}/tests/test_gapit_db_e2e.py +0 -0
  363. {gapit-0.5.1 → gapit-0.5.2}/tests/test_gbfeatures.py +0 -0
  364. {gapit-0.5.1 → gapit-0.5.2}/tests/test_gene_typing.py +0 -0
  365. {gapit-0.5.1 → gapit-0.5.2}/tests/test_gene_typing2.py +0 -0
  366. {gapit-0.5.1 → gapit-0.5.2}/tests/test_gffparse.py +0 -0
  367. {gapit-0.5.1 → gapit-0.5.2}/tests/test_hits.py +0 -0
  368. {gapit-0.5.1 → gapit-0.5.2}/tests/test_json_format.py +0 -0
  369. {gapit-0.5.1 → gapit-0.5.2}/tests/test_mcp.py +0 -0
  370. {gapit-0.5.1 → gapit-0.5.2}/tests/test_mcp_db_tools.py +0 -0
  371. {gapit-0.5.1 → gapit-0.5.2}/tests/test_mcp_protocol.py +0 -0
  372. {gapit-0.5.1 → gapit-0.5.2}/tests/test_mcp_reads.py +0 -0
  373. {gapit-0.5.1 → gapit-0.5.2}/tests/test_md_format.py +0 -0
  374. {gapit-0.5.1 → gapit-0.5.2}/tests/test_minimap.py +0 -0
  375. {gapit-0.5.1 → gapit-0.5.2}/tests/test_mol_type.py +0 -0
  376. {gapit-0.5.1 → gapit-0.5.2}/tests/test_oversubscription.py +0 -0
  377. {gapit-0.5.1 → gapit-0.5.2}/tests/test_paf.py +0 -0
  378. {gapit-0.5.1 → gapit-0.5.2}/tests/test_paf_identity.py +0 -0
  379. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_argannot.py +0 -0
  380. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_bacmet2.py +0 -0
  381. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_card.py +0 -0
  382. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_ecoh.py +0 -0
  383. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_ecoli_vf.py +0 -0
  384. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_kaptive.py +0 -0
  385. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_megares.py +0 -0
  386. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_ncbi.py +0 -0
  387. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_plasmidfinder.py +0 -0
  388. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_resfinder.py +0 -0
  389. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_upec_expec_vf.py +0 -0
  390. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_vfdb.py +0 -0
  391. {gapit-0.5.1 → gapit-0.5.2}/tests/test_provider_victors.py +0 -0
  392. {gapit-0.5.1 → gapit-0.5.2}/tests/test_providers_common.py +0 -0
  393. {gapit-0.5.1 → gapit-0.5.2}/tests/test_readpairs.py +0 -0
  394. {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads2_homologs.py +0 -0
  395. {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads2_model.py +0 -0
  396. {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads_aggregate.py +0 -0
  397. {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads_integration.py +0 -0
  398. {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads_interval_union.py +0 -0
  399. {gapit-0.5.1 → gapit-0.5.2}/tests/test_reads_streaming.py +0 -0
  400. {gapit-0.5.1 → gapit-0.5.2}/tests/test_records.py +0 -0
  401. {gapit-0.5.1 → gapit-0.5.2}/tests/test_report.py +0 -0
  402. {gapit-0.5.1 → gapit-0.5.2}/tests/test_screen_integration.py +0 -0
  403. {gapit-0.5.1 → gapit-0.5.2}/tests/test_screening_reads_unit.py +0 -0
  404. {gapit-0.5.1 → gapit-0.5.2}/tests/test_seqconvert.py +0 -0
  405. {gapit-0.5.1 → gapit-0.5.2}/tests/test_seqconvert_differential.py +0 -0
  406. {gapit-0.5.1 → gapit-0.5.2}/tests/test_streaming_chunks.py +0 -0
  407. {gapit-0.5.1 → gapit-0.5.2}/tests/test_summary.py +0 -0
  408. {gapit-0.5.1 → gapit-0.5.2}/tests/test_summary_formats.py +0 -0
  409. {gapit-0.5.1 → gapit-0.5.2}/tests/test_tsv.py +0 -0
  410. {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_command.py +0 -0
  411. {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_engine.py +0 -0
  412. {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_models.py +0 -0
  413. {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_schemes.py +0 -0
  414. {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_schemes_cluster.py +0 -0
  415. {gapit-0.5.1 → gapit-0.5.2}/tests/test_typing_stage2.py +0 -0
  416. {gapit-0.5.1 → gapit-0.5.2}/tests/test_version.py +0 -0
@@ -80,6 +80,7 @@ gapit/
80
80
  │ ├── db_query_ops.py # db use-cases: search + outdated over installed DBs (shared CLI + MCP)
81
81
  │ ├── db_build_ops.py # db use-case: custom FASTA+TSV → gene db, GBK/GFF → cluster db (shared CLI + MCP)
82
82
  │ ├── gbfeatures.py # GenBank FEATURES/ORIGIN parser → LocusFeatures/GeneFeature + gapit.features/1
83
+ │ ├── gene_floors.py # gapit.floors/1 per-gene identity floors: model, loader, build validation, reads gate
83
84
  │ ├── gffparse.py # GFF3 parser (embedded ##FASTA or sidecar) → the same locus/gene models
84
85
  │ ├── typing_models.py # gapit.typing schema (rules + named schemes; /1 degrades to one default scheme)
85
86
  │ ├── typing_rules.py # gapit.typing rule models (weighted_genes/exact_set/cluster_match/learned_linear) + reference checks
@@ -160,7 +161,7 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
160
161
  - **Formats**: `--format tsv|csv|json|md` (default `tsv` for abricate compatibility).
161
162
  - **JSON**: top-level `"schema": "gapit.report/1"`; schema introspectable via
162
163
  `gapit schema report | reads | reads2 | summary | list | error | version` (plus
163
- `cluster | features | typing | typing_result`). Keys are snake_case,
164
+ `cluster | features | typing | typing_result | floors`). Keys are snake_case,
164
165
  units explicit (`identity_pct`, `coverage_pct`). Semver the schema; never rename or
165
166
  retype a field in a minor bump.
166
167
  - **Markdown**: YAML frontmatter (tool version, db, params, ISO-8601 UTC timestamp) + tables a
@@ -177,12 +178,12 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
177
178
  database fetch from the provider catalog (every provider downloads from upstream at fetch
178
179
  time — nothing catalog-side is bundled inside the wheel beyond the sanctioned exceptions,
179
180
  a license-compliance requirement: CARD/VFDB terms are non-commercial and Kaptive is GPL,
180
- so none of those may ride an MIT distribution; the sanctioned exceptions are the five
181
+ so none of those may ride an MIT distribution; the sanctioned exceptions are the six
181
182
  content-provenance-audited bundles under `src/gapit/data/dbs/` — the public-domain
182
- `ecoli_dec` panel plus four permissively licensed provider snapshots (`ncbi` public
183
- domain, `resfinder` Apache-2.0, `ecoh` BSD-3-Clause, `upec_expec_vf` MIT; GPL/NC content
184
- is never bundled) — materialized into the datadir on first use via `bundled.py`, with
185
- `db fetch <name>` still the fresh-upstream refresh path),
183
+ `ecoli_dec` and `lm_doumith` panels plus four permissively licensed provider snapshots
184
+ (`ncbi` public domain, `resfinder` Apache-2.0, `ecoh` BSD-3-Clause, `upec_expec_vf`
185
+ MIT; GPL/NC content is never bundled) — materialized into the datadir on first use via
186
+ `bundled.py`, with `db fetch <name>` still the fresh-upstream refresh path),
186
187
  database listing,
187
188
  records.jsonl gene search, staleness
188
189
  report, custom FASTA→native-db build, GBK/GFF→cluster-db build (`--typing` installs a
@@ -5,6 +5,46 @@ 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.2] - 2026-10-03
9
+
10
+ ### Added
11
+
12
+ - **Per-gene identity floors for reads-mode presence (`gapit.floors/1`) — the db-driven
13
+ fix for the 26ECO0084 `pic` SPATE false positive.** A gene database may carry an
14
+ optional `floors.json` sidecar declaring a minimum alignment identity (%) per gene:
15
+ in reads mode, alignments to a floored gene below its floor are dropped BEFORE
16
+ aggregation, so breadth is recomputed from the surviving rows (a ~86.6%-identity,
17
+ 97.59%-breadth SPATE homolog collapses below the presence threshold instead of
18
+ over-calling `pic`, matching the blastn contig verdict). **Strictly opt-in via
19
+ DATABASE metadata, not a CLI change**: a database without the sidecar screens
20
+ byte-identically to before, existing databases need nothing, and the blastn contig
21
+ path never reads floors (`--minid` already gates it). Floors compose conjunctively
22
+ with `gapit.reads/2` `--min-identity` (a row must clear both); `gapit.reads/1`
23
+ output shape is untouched (presence/breadth changes only for floored genes). New
24
+ module `gapit.gene_floors` (model registered as `gapit schema floors`), `gapit db
25
+ build NAME.fa --floors FILE` (gene builds only; cluster inputs reject it) installs a
26
+ validated copy — every listed gene must exist in the FASTA (`FLOORS_UNKNOWN_GENE`),
27
+ values in [0, 100] and structure per the schema (`FLOORS_MALFORMED`); dropping the
28
+ file into an existing db directory works too. The bundled `ecoli_dec` now ships
29
+ `{"genes": {"pic": 90.0}}` (true `pic` ≥95%; `astA` deliberately unfloored — true
30
+ alleles at 90.4–91% leave no margin), materialized with the bundle; MCP `screen_reads`
31
+ inherits the gate through the shared use-case.
32
+
33
+ - **Bundled `lm_doumith`: Listeria monocytogenes serogrouping (Doumith 2004) — the sixth
34
+ bundled database.** Five markers extracted from public-domain INSDC records (`prs`,
35
+ `lmo0737`, `lmo1118`, `ORF2819`, `ORF2110`; strand-corrected, `lmo0737` verified against
36
+ EGD-e) behind the `gapit.typing/2` scheme `doumith_serogroup` (95/95 floors, `prs`
37
+ control gene, cutoff 1.0 / margin 0.0). Rules follow Doumith's multiplex-PCR table
38
+ (IIa = 1/2a·3a, IIc = 1/2c·3c, IIb = 1/2b·3b·7, IVb = 4b·4d·4e) extended with Huang
39
+ 2011's 4b variant (`IVb-v`, declared before `IVb` so an lmo0737-carrying 4b profile
40
+ resolves to the variant); fallback `untypeable (4a/4c, atypical profile, or non-Lm
41
+ Listeria)`. Materializes on first screen like every bundle (zero network);
42
+ `tests/test_lm_doumith.py` pins the synthetic marker-subset matrix, the control gate,
43
+ the two-stage golden, and the bundled integration — the bundled roster grows to six
44
+ (discovery, red-flag scan, `db list`, and `setupdb` pins updated). Uppercase gene ids
45
+ (`ORF2819`/`ORF2110`) now ride a shipped database, locking that build/screen/typing
46
+ carry them verbatim.
47
+
8
48
  ## [0.5.1] - 2026-10-03
9
49
 
10
50
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gapit
3
- Version: 0.5.1
3
+ Version: 0.5.2
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/
@@ -91,7 +91,7 @@ gapit screen --r1 ont_reads.fastq.gz --db ncbi --read-type map-ont --format json
91
91
  # Summarize report tables into a gene presence/absence matrix
92
92
  gapit summary *.tsv
93
93
 
94
- # Databases: five ship in-wheel and work instantly; the rest download from upstream on fetch
94
+ # Databases: six ship in-wheel and work instantly; the rest download from upstream on fetch
95
95
  gapit db fetch all # default set (card, vfdb)
96
96
  gapit db fetch ncbi
97
97
  gapit db list
@@ -111,8 +111,9 @@ presence defaults to 90% alignment breadth (`--min-breadth 90`).
111
111
  A database is a directory under the datadir, resolved from `$GAPIT_DATADIR`, then
112
112
  `~/.local/share/gapit/db` (override per call with `--datadir`). Twelve databases are built
113
113
  into the catalog; all of them download from upstream and build on `gapit db fetch` — with
114
- five content-provenance-audited exceptions that ship inside the package (`ecoli_dec` plus
115
- the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public domain / Apache-2.0 /
114
+ six content-provenance-audited exceptions that ship inside the package (`ecoli_dec` and
115
+ `lm_doumith` plus the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public
116
+ domain / Apache-2.0 /
116
117
  BSD-3-Clause / MIT), materialized into the datadir on first use with zero network. Several
117
118
  upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's GPL-3.0) forbid
118
119
  redistribution inside an MIT-licensed distribution, so everything else is fetch-on-demand
@@ -204,6 +205,6 @@ guide, `CHANGELOG.md` the change history.
204
205
 
205
206
  gapit is MIT-licensed. It is a behavioral reimplementation of abricate (GPL-2.0) and
206
207
  copies no Perl code; abricate itself remains GPL-2.0. The only database content inside
207
- the package is the five audited, permissively licensed bundles under `src/gapit/data/dbs/`
208
+ the package is the six audited, permissively licensed bundles under `src/gapit/data/dbs/`
208
209
  (public domain / Apache-2.0 / BSD-3-Clause / MIT); every other provider downloads from
209
210
  upstream at fetch time, under its own license (SPEC.md §9).
@@ -61,7 +61,7 @@ gapit screen --r1 ont_reads.fastq.gz --db ncbi --read-type map-ont --format json
61
61
  # Summarize report tables into a gene presence/absence matrix
62
62
  gapit summary *.tsv
63
63
 
64
- # Databases: five ship in-wheel and work instantly; the rest download from upstream on fetch
64
+ # Databases: six ship in-wheel and work instantly; the rest download from upstream on fetch
65
65
  gapit db fetch all # default set (card, vfdb)
66
66
  gapit db fetch ncbi
67
67
  gapit db list
@@ -81,8 +81,9 @@ presence defaults to 90% alignment breadth (`--min-breadth 90`).
81
81
  A database is a directory under the datadir, resolved from `$GAPIT_DATADIR`, then
82
82
  `~/.local/share/gapit/db` (override per call with `--datadir`). Twelve databases are built
83
83
  into the catalog; all of them download from upstream and build on `gapit db fetch` — with
84
- five content-provenance-audited exceptions that ship inside the package (`ecoli_dec` plus
85
- the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public domain / Apache-2.0 /
84
+ six content-provenance-audited exceptions that ship inside the package (`ecoli_dec` and
85
+ `lm_doumith` plus the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public
86
+ domain / Apache-2.0 /
86
87
  BSD-3-Clause / MIT), materialized into the datadir on first use with zero network. Several
87
88
  upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's GPL-3.0) forbid
88
89
  redistribution inside an MIT-licensed distribution, so everything else is fetch-on-demand
@@ -174,6 +175,6 @@ guide, `CHANGELOG.md` the change history.
174
175
 
175
176
  gapit is MIT-licensed. It is a behavioral reimplementation of abricate (GPL-2.0) and
176
177
  copies no Perl code; abricate itself remains GPL-2.0. The only database content inside
177
- the package is the five audited, permissively licensed bundles under `src/gapit/data/dbs/`
178
+ the package is the six audited, permissively licensed bundles under `src/gapit/data/dbs/`
178
179
  (public domain / Apache-2.0 / BSD-3-Clause / MIT); every other provider downloads from
179
180
  upstream at fetch time, under its own license (SPEC.md §9).
@@ -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.1"}
16
+ {"schema":"gapit.version/1","name":"gapit","version":"0.5.2"}
17
17
  ```
18
18
 
19
19
  Output schemas. Ten documents are introspectable: `report`, `typing_result`, `reads`,
@@ -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.1"}
15
+ {"schema":"gapit.version/1","name":"gapit","version":"0.5.2"}
16
16
  ```
17
17
 
18
18
  输出 schema。十个文档可自省:`report`、`typing_result`、`reads`、`reads2`、`cluster`、
@@ -44,6 +44,7 @@ vfdb USTC (VFDB) available nucl VFDB virulence factors (set A, nucleotide)
44
44
  victors University of Chicago available nucl Victors virulence factors
45
45
  ecoh Holt lab (srst2) bundled nucl E. coli O and H antigens (srst2 EcOH)
46
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)
47
48
  ncbi NCBI bundled nucl NCBI AMRFinderPlus (reference finder) curated AMR
48
49
  resfinder DTU CGE bundled nucl CGE ResFinder acquired resistance genes
49
50
  upec_expec_vf FordeGenomics bundled nucl UPEC/ExPEC virulence genes (FordeGenomics)
@@ -51,7 +52,7 @@ upec_expec_vf FordeGenomics bundled nucl UPEC/ExPEC virulence genes (FordeGenomi
51
52
 
52
53
  NAME is the database name you pass to `--db`; PROVIDER names the upstream maintainer
53
54
  organisation. STATUS reads `installed (N)` when `<datadir>/<name>/gapit-manifest.json`
54
- exists, with N the record count, otherwise `available`. The last five rows are the
55
+ exists, with N the record count, otherwise `available`. The last six rows are the
55
56
  wheel-shipped [bundled](#bundled-databases-install-time-ready) databases, alphabetical:
56
57
  `bundled` before materialization, `installed (N)` after. Four of them (`ecoh`, `ncbi`,
57
58
  `resfinder`, `upec_expec_vf`) are also registry providers — such names render exactly
@@ -121,7 +122,7 @@ surface.) See [outputs.md](./outputs.md).
121
122
 
122
123
  Most databases download from upstream at `db fetch` time because their licenses forbid
123
124
  redistribution (see [Providers](#providers)). A small set of **bundled** databases ships
124
- inside the gapit wheel instead — five databases whose content provenance was audited
125
+ inside the gapit wheel instead — six databases whose content provenance was audited
125
126
  record-by-record (public-domain sources, or Apache-2.0 / BSD-3-Clause / MIT panels;
126
127
  GPL and non-commercial content never rides the wheel). Nothing to download, nothing to
127
128
  accept: a bundled database works out of the box.
@@ -130,6 +131,7 @@ accept: a bundled database works out of the box.
130
131
  |---|---|---|---|
131
132
  | `ecoh` | E. coli O and H antigens (597 records, srst2 EcOH) | 2026-10-02 | — |
132
133
  | `ecoli_dec` | Diarrheagenic E. coli marker panel (17 records, GB 4789.6 + risk-monitoring designation) | 2026-10-02 | `gapit.typing/2` (schemes `gb4789_6`, `risk_monitoring`) |
134
+ | `lm_doumith` | Listeria monocytogenes serogrouping (5 records, Doumith 2004 markers) | 2026-10-03 | `gapit.typing/2` (scheme `doumith_serogroup`) |
133
135
  | `ncbi` | NCBI AMRFinderPlus curated AMR (8373 records) | 2026-10-02 | — |
134
136
  | `resfinder` | CGE ResFinder acquired resistance genes (3206 records) | 2026-10-02 | — |
135
137
  | `upec_expec_vf` | UPEC/ExPEC virulence genes (77 records, FordeGenomics) | 2026-10-02 | — |
@@ -137,13 +139,15 @@ accept: a bundled database works out of the box.
137
139
  **License provenance.** Every `ecoli_dec` record was re-sourced from primary
138
140
  public-domain submissions (NCBI RefSeq/GenBank/DDBJ accessions, same alleles as the
139
141
  rightsholder panel); two VFDB-derived records found in the original panel were removed
140
- and replaced during the 2026-10 audit. The four provider snapshots (`ecoh`, `ncbi`,
141
- `resfinder`, `upec_expec_vf`) passed the 2026-10 content-level audit across **all**
142
- records: NCBI AMRFinderPlus content is public domain (US government work), the CGE
143
- ResFinder database is Apache-2.0, srst2's EcOH is BSD-3-Clause, and FordeGenomics'
144
- UPEC-ExPEC panel is MIT — all four permits redistribution inside the MIT-licensed wheel.
145
- A regression test pins that no `VF*` / `VFDB` / `ARO:` tags appear in any of the five
146
- bundles' headers.
142
+ and replaced during the 2026-10 audit. The `lm_doumith` panel was extracted the same
143
+ way from public-domain INSDC records (accessions in each header; reverse-complement
144
+ markers strand-corrected, `lmo0737` verified 100% against EGD-e). The four provider
145
+ snapshots (`ecoh`, `ncbi`, `resfinder`, `upec_expec_vf`) passed the 2026-10
146
+ content-level audit across **all** records: NCBI AMRFinderPlus content is public
147
+ domain (US government work), the CGE ResFinder database is Apache-2.0, srst2's EcOH
148
+ is BSD-3-Clause, and FordeGenomics' UPEC-ExPEC panel is MIT — all four permits
149
+ redistribution inside the MIT-licensed wheel. A regression test pins that no `VF*` /
150
+ `VFDB` / `ARO:` tags appear in any of the six bundles' headers.
147
151
 
148
152
  **Snapshots are point-in-time.** Each snapshot's `sequences` file is byte-for-byte what
149
153
  `gapit db fetch <name>` produces from upstream on the snapshot date (a regression test
@@ -167,6 +171,36 @@ manifest exists. `db list` shows the database as `bundled` before that and
167
171
  `installed (17)` after — on all four listing surfaces (TSV, rich table, `--json`, MCP
168
172
  `db_list`).
169
173
 
174
+ ### Listeria serogrouping (`lm_doumith`)
175
+
176
+ The typed bundle behind Listeria monocytogenes serogroup prediction: five markers —
177
+ `prs`, `lmo0737`, `lmo1118`, `ORF2819`, `ORF2110` — screened with 95/95 identity and
178
+ coverage floors and folded by the `doumith_serogroup` scheme into Doumith's multiplex-PCR
179
+ groups (Doumith et al. 2004, J Clin Microbiol 42:3819), extended with the Huang 2011
180
+ 4b variant: `prs` gates the scheme as a genus-level control gene, `IIa` (1/2a or 3a),
181
+ `IIc` (1/2c or 3c), `IIb` (1/2b, 3b or 7), `IVb` (4b, 4d or 4e), and `IVb-v` (the
182
+ lmo0737-carrying 4b variant) — the same in-silico semantics as tools like LisSero.
183
+ Designation runs through the two-stage pipeline: `gapit screen -o table.tsv --db
184
+ lm_doumith`, then `gapit typing table.tsv`.
185
+
186
+ Known limitations, carried on the calls as notes where relevant:
187
+
188
+ - **4b/4d/4e are unresolvable at gene level** — the three serovars share every published
189
+ molecular marker; resolve by cgMLST or antisera.
190
+ - **IVb-v is an emergent concern** — lmo0737 in an otherwise-4b profile (Huang 2011
191
+ "unusual 4b"; ST382/ST554 clones) is declared before IVb so the variant wins.
192
+ - **EGD-e types as IIc** — the 1/2a reference genome carries lmo1118 and lands in IIc;
193
+ documented in Doumith 2004, not a tool artifact.
194
+ - **Horizontal gene transfer cuts both ways** — the lineage-II lmo0737 cassette moves
195
+ between lineages, and rare HGT of the ORF markers can produce false IIb-looking
196
+ profiles; treat single-marker IIb calls in epidemiologically unlikely contexts with
197
+ care.
198
+ - **`prs` is genus-level, not Lm-specific** — other Listeria species carry it; a prs+
199
+ isolate with no serogroup markers falls back rather than being called non-Listeria.
200
+
201
+ The fallback call — `untypeable (4a/4c, atypical profile, or non-Lm Listeria)` — is the
202
+ honest answer for everything the five markers cannot resolve.
203
+
170
204
  ## Checking database freshness
171
205
 
172
206
  `gapit db outdated` reports every installed database's age against the staleness
@@ -263,7 +297,7 @@ unknown `--db NAME` is a usage error (exit 2) listing what is installed.
263
297
  ## Providers
264
298
 
265
299
  Nineteen providers ship with gapit. Every one of them — `card` and `vfdb` included —
266
- downloads from its upstream source at fetch time: with the exception of the five
300
+ downloads from its upstream source at fetch time: with the exception of the six
267
301
  audited, permissively licensed bundles above, nothing is bundled inside the package,
268
302
  because several upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's
269
303
  GPL-3.0) forbid redistribution inside an MIT-licensed distribution. The seven kaptive
@@ -410,6 +444,8 @@ $ gapit db install card.json \
410
444
  sequences generated FASTA projection (gapit/v1 tagged headers)
411
445
  sequences.n*|p* BLAST index built from sequences
412
446
  gapit-manifest.json provenance sidecar, written last
447
+ typing.json optional gapit.typing/1 or /2 scoring spec (typed dbs)
448
+ floors.json optional gapit.floors/1 per-gene identity floors (reads mode)
413
449
  ```
414
450
 
415
451
  ### records.jsonl
@@ -452,7 +488,7 @@ versions. A real one, from the plasmidfinder database:
452
488
  "upstream_version": "",
453
489
  "tool": {
454
490
  "name": "gapit",
455
- "version": "0.5.1"
491
+ "version": "0.5.2"
456
492
  },
457
493
  "makeblastdb_version": "blastn: 2.17.0+",
458
494
  "minimap2_version": "2.31-r1302"
@@ -479,6 +515,31 @@ versions. A real one, from the plasmidfinder database:
479
515
  `records.jsonl` and the manifest are file contracts. They never appear on stdout and are
480
516
  not registered with `gapit schema`.
481
517
 
518
+ ### floors.json — per-gene identity floors
519
+
520
+ An optional sidecar declaring a MINIMUM alignment identity (%) per gene for reads-mode
521
+ presence (schema `gapit.floors/1`, introspect with `gapit schema floors`; see
522
+ [reads.md](./reads.md#per-gene-identity-floors-gapitfloors1-database-side) for the
523
+ screening semantics and the `pic` worked example):
524
+
525
+ ```json
526
+ {"schema": "gapit.floors/1", "default": null, "genes": {"pic": 90.0}}
527
+ ```
528
+
529
+ | Field | Type | Meaning |
530
+ |---|---|---|
531
+ | `schema` | string | Always `gapit.floors/1` |
532
+ | `default` | number or null | Floor for genes not listed in `genes` (`null` = no floor) |
533
+ | `genes` | object | `{gene: minimum identity %}`, values in [0, 100] |
534
+
535
+ The file's presence IS the flag — no manifest field, no CLI switch. A database without
536
+ the sidecar screens byte-identically to before (the floors are a db-driven opt-in, not a
537
+ CLI contract change), and the blastn contig path never reads them. Built-in via
538
+ `db build --floors` (next sections), or drop the file into an existing db directory; it
539
+ is validated at screening time too (malformed content fails with `FLOORS_MALFORMED`,
540
+ exit 4). The bundled `ecoli_dec` ships `{"genes": {"pic": 90.0}}` — the SPATE-homolog
541
+ false-positive fix.
542
+
482
543
  ## Header formats and compatibility
483
544
 
484
545
  gapit reads two header formats and detects them per record:
@@ -581,6 +642,27 @@ gene accession function
581
642
  syn_betalac SYN-0001 ampicillin;cephalosporin
582
643
  ```
583
644
 
645
+ ### Per-gene identity floors (`--floors`)
646
+
647
+ `--floors FILE` installs a `gapit.floors/1` document as the database's `floors.json`
648
+ sidecar — the per-gene minimum alignment identity for reads-mode presence (see
649
+ [reads.md](./reads.md#per-gene-identity-floors-gapitfloors1-database-side)). The
650
+ document is validated before any artifact is written: every gene in `genes` must exist
651
+ in the FASTA (`FLOORS_UNKNOWN_GENE`, exit 4 — a floor for a missing gene is silently
652
+ dead safety config), values must lie in [0, 100] and the structure parse
653
+ (`FLOORS_MALFORMED`, exit 4). The file is then copied in byte-identical; the file's
654
+ presence is the flag (no manifest field changes). Gene builds only — a GBK/GFF cluster
655
+ input rejects `--floors` as a usage error.
656
+
657
+ ```console
658
+ $ cat my_floors.json
659
+ {"schema": "gapit.floors/1", "default": null, "genes": {"syn_betalac": 95.0}}
660
+ $ gapit db build tinyamr my_genes.fa --datadir ./db --tsv my_meta.tsv --floors my_floors.json
661
+ {"db":"tinyamr","records":2,"dbtype":"nucl","destination":"/tmp/opencode/gapit-build-demo/db/tinyamr"}
662
+ $ cat ./db/tinyamr/floors.json
663
+ {"schema": "gapit.floors/1", "default": null, "genes": {"syn_betalac": 95.0}}
664
+ ```
665
+
584
666
  ### Rebuilding
585
667
 
586
668
  Like `db fetch`, an existing database is never overwritten silently:
@@ -44,6 +44,7 @@ vfdb USTC (VFDB) available nucl VFDB virulence factors (set A, nucleotide)
44
44
  victors University of Chicago available nucl Victors virulence factors
45
45
  ecoh Holt lab (srst2) bundled nucl E. coli O and H antigens (srst2 EcOH)
46
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)
47
48
  ncbi NCBI bundled nucl NCBI AMRFinderPlus (reference finder) curated AMR
48
49
  resfinder DTU CGE bundled nucl CGE ResFinder acquired resistance genes
49
50
  upec_expec_vf FordeGenomics bundled nucl UPEC/ExPEC virulence genes (FordeGenomics)
@@ -51,7 +52,7 @@ upec_expec_vf FordeGenomics bundled nucl UPEC/ExPEC virulence genes (FordeGenomi
51
52
 
52
53
  NAME 是传给 `--db` 的数据库名;PROVIDER 是上游维护机构。当
53
54
  `<datadir>/<name>/gapit-manifest.json` 存在时 STATUS 显示 `installed (N)`,N 是
54
- 记录数,否则显示 `available`。最后五行是按名称排序的 wheel 内置数据库(见下文
55
+ 记录数,否则显示 `available`。最后六行是按名称排序的 wheel 内置数据库(见下文
55
56
  "内置数据库(即装即用)"一节):物化前为 `bundled`,物化后为 `installed (N)`。
56
57
  其中四个(`ecoh`、`ncbi`、`resfinder`、`upec_expec_vf`)同时是注册表提供商 ——
57
58
  这类名字只渲染一次,位于内置区(绝不会重复出现一条注册表 `available` 行),
@@ -117,7 +118,7 @@ abricate `--list` 的逐字节一致性。)见 [outputs.md](./outputs.md)。
117
118
  ## 内置数据库(即装即用)
118
119
 
119
120
  大多数数据库在 `db fetch` 时才从上游下载,因为许可证禁止再分发(见"提供商"一节)。
120
- 少数**内置**数据库随 gapit wheel 一起发布 —— 共五个,其内容经过逐条记录的来源
121
+ 少数**内置**数据库随 gapit wheel 一起发布 —— 共六个,其内容经过逐条记录的来源
121
122
  审计(公共领域来源,或 Apache-2.0 / BSD-3-Clause / MIT 宽松许可面板;GPL 与
122
123
  非商业许可内容绝不随 wheel 分发)。无需下载、无需确认:内置数据库开箱即用。
123
124
 
@@ -125,17 +126,20 @@ abricate `--list` 的逐字节一致性。)见 [outputs.md](./outputs.md)。
125
126
  |---|---|---|---|
126
127
  | `ecoh` | 大肠杆菌 O/H 抗原基因(597 条记录,srst2 EcOH) | 2026-10-02 | — |
127
128
  | `ecoli_dec` | 致腹泻大肠杆菌标志基因面板(17 条记录,GB 4789.6 + 风险监测判定) | 2026-10-02 | `gapit.typing/2`(`gb4789_6`、`risk_monitoring` 双方案) |
129
+ | `lm_doumith` | 单核细胞增生李斯特菌血清群分型(5 条记录,Doumith 2004 标记) | 2026-10-03 | `gapit.typing/2`(方案 `doumith_serogroup`) |
128
130
  | `ncbi` | NCBI AMRFinderPlus 精选 AMR(8373 条记录) | 2026-10-02 | — |
129
131
  | `resfinder` | CGE ResFinder 获得性耐药基因(3206 条记录) | 2026-10-02 | — |
130
132
  | `upec_expec_vf` | UPEC/ExPEC 毒力基因(77 条记录,FordeGenomics) | 2026-10-02 | — |
131
133
 
132
134
  **许可证来源声明。** `ecoli_dec` 的每条记录都取自公共领域的一级提交(NCBI
133
135
  RefSeq/GenBank/DDBJ 收录号,与权利方面板等位相同);2026-10 审计中发现原面板里
134
- 混入的两条 VFDB 来源记录已被移除并替换。四个提供商快照(`ecoh`、`ncbi`、
135
- `resfinder`、`upec_expec_vf`)通过了 2026-10 对**全部**记录的内容级审计:
136
+ 混入的两条 VFDB 来源记录已被移除并替换。`lm_doumith` 面板以同样方式取自公共领域
137
+ 的 INSDC 记录(收录号见每条头部;反向互补标记已做链向校正,`lmo0737` 经与 EGD-e
138
+ 比对验证 100% 一致)。四个提供商快照(`ecoh`、`ncbi`、`resfinder`、
139
+ `upec_expec_vf`)通过了 2026-10 对**全部**记录的内容级审计:
136
140
  NCBI AMRFinderPlus 内容属公共领域(美国政府作品),CGE ResFinder 数据库为
137
141
  Apache-2.0,srst2 的 EcOH 为 BSD-3-Clause,FordeGenomics 的 UPEC-ExPEC 面板为
138
- MIT —— 四者均允许随 MIT 许可的 wheel 再分发。回归测试锁定了五个内置库的头部
142
+ MIT —— 四者均允许随 MIT 许可的 wheel 再分发。回归测试锁定了六个内置库的头部
139
143
  不出现任何 `VF*` / `VFDB` / `ARO:` 标签。
140
144
 
141
145
  **快照是一个时间点。** 每个快照的 `sequences` 文件与快照当日 `gapit db fetch
@@ -156,6 +160,35 @@ ecoli_dec (17 records) into <datadir>`,`--quiet` 可静默),随后走标
156
160
  `bundled`、物化后显示 `installed (17)` —— 四个列表入口(TSV、rich 表格、
157
161
  `--json`、MCP `db_list`)一致。
158
162
 
163
+ ### 李斯特菌血清群分型(`lm_doumith`)
164
+
165
+ 用于单核细胞增生李斯特菌(Listeria monocytogenes)血清群预测的分型内置库:
166
+ 五个标记 —— `prs`、`lmo0737`、`lmo1118`、`ORF2819`、`ORF2110` —— 以 95/95
167
+ 的序列一致性与覆盖度阈值筛检,由 `doumith_serogroup` 方案折算为 Doumith 多重
168
+ PCR 分群(Doumith 等 2004,J Clin Microbiol 42:3819),并扩展了 Huang 2011 的
169
+ 4b 变体:`prs` 作为属级控制基因把关整个方案,`IIa`(1/2a 或 3a)、`IIc`
170
+ (1/2c 或 3c)、`IIb`(1/2b、3b 或 7)、`IVb`(4b、4d 或 4e)与 `IVb-v`(携带
171
+ lmo0737 的 4b 变体)—— 与 LisSero 等工具的 in-silico 语义一致。判定走两阶段
172
+ 管线:`gapit screen -o table.tsv --db lm_doumith`,然后 `gapit typing
173
+ table.tsv`。
174
+
175
+ 已知的局限(相关处以 notes 形式随判定输出):
176
+
177
+ - **4b/4d/4e 在基因层面无法区分** —— 三个血清型共享所有已发表的分子标记;
178
+ 需用 cgMLST 或血清学进一步判定。
179
+ - **IVb-v 是新出现的关注克隆** —— 4b 谱面中检出 lmo0737(Huang 2011
180
+ "unusual 4b";ST382/ST554 克隆)时,该规则先于 IVb 声明,变体优先胜出。
181
+ - **EGD-e 判为 IIc** —— 1/2a 参考基因组携带 lmo1118 而落入 IIc;这是 Doumith
182
+ 2004 原文记载的现象,不是工具假象。
183
+ - **水平基因转移是双向陷阱** —— 谱系 II 的 lmo0737 盒会在谱系间移动,罕见的
184
+ ORF 标记水平转移也可能造成貌似 IIb 的假谱面;在流行病学上不太可能的语境里,
185
+ 单标记 IIb 判定需谨慎对待。
186
+ - **`prs` 是属级基因,并非 Lm 特异** —— 其他李斯特菌物种也携带它;prs 阳性但
187
+ 无任何血清群标记的分离株回退为 fallback,而不是被判为"非李斯特菌"。
188
+
189
+ 回退判定 —— `untypeable (4a/4c, atypical profile, or non-Lm Listeria)` ——
190
+ 是这五个标记无法给出答案时的诚实输出。
191
+
159
192
  ## 检查数据库新鲜度
160
193
 
161
194
  `gapit db outdated` 报告每个已安装数据库相对于过期阈值的年龄。对装满的数据
@@ -251,7 +284,7 @@ $ gapit db search "tet(M)" --field gene --exact --json | head -1
251
284
  ## 提供商
252
285
 
253
286
  gapit 自带十九个提供商。每一个——包括 `card` 和 `vfdb`——都在抓取时从上游下载:
254
- 除上文五个通过审计、宽松许可的内置库之外,包里不内置任何内容,因为多家上游许可
287
+ 除上文六个通过审计、宽松许可的内置库之外,包里不内置任何内容,因为多家上游许可
255
288
  (CARD 的 McMaster 条款、VFDB 的 CC BY-NC、
256
289
  Kaptive 的 GPL-3.0)禁止随 MIT 许可的发行版再分发。七个 kaptive 提供商是**基因簇**
257
290
  数据库(抓取时经基因簇管线构建,见下文 Kaptive 提供商一节)。
@@ -390,6 +423,8 @@ $ gapit db install card.json \
390
423
  sequences generated FASTA projection (gapit/v1 tagged headers)
391
424
  sequences.n*|p* BLAST index built from sequences
392
425
  gapit-manifest.json provenance sidecar, written last
426
+ typing.json 可选的 gapit.typing/1 或 /2 评分规范(带分型的数据库)
427
+ floors.json 可选的 gapit.floors/1 按基因一致性下限(reads 模式)
393
428
  ```
394
429
 
395
430
  ### records.jsonl
@@ -431,7 +466,7 @@ manifest,来自 plasmidfinder 数据库:
431
466
  "upstream_version": "",
432
467
  "tool": {
433
468
  "name": "gapit",
434
- "version": "0.5.1"
469
+ "version": "0.5.2"
435
470
  },
436
471
  "makeblastdb_version": "blastn: 2.17.0+",
437
472
  "minimap2_version": "2.31-r1302"
@@ -458,6 +493,28 @@ manifest,来自 plasmidfinder 数据库:
458
493
  `records.jsonl` 和 manifest 是文件契约。它们从不出现在 stdout,也未注册到
459
494
  `gapit schema`。
460
495
 
496
+ ### floors.json — 按基因设置一致性下限
497
+
498
+ 一个可选边车,为 reads 模式的存在判定声明逐基因的最小比对一致性(%)(schema 为
499
+ `gapit.floors/1`,用 `gapit schema floors` 内省;筛查语义与 `pic` 实战示例见
500
+ [reads.zh.md](./reads.zh.md#按基因设置一致性下限gapitfloors1数据库侧)):
501
+
502
+ ```json
503
+ {"schema": "gapit.floors/1", "default": null, "genes": {"pic": 90.0}}
504
+ ```
505
+
506
+ | 字段 | 类型 | 含义 |
507
+ |---|---|---|
508
+ | `schema` | string | 恒为 `gapit.floors/1` |
509
+ | `default` | number 或 null | 未在 `genes` 中列出的基因的下限(`null` = 无下限) |
510
+ | `genes` | object | `{基因: 最小一致性 %}`,取值在 [0, 100] 内 |
511
+
512
+ 文件的存在本身就是开关——没有 manifest 字段,也没有 CLI 开关。不带边车的数据库
513
+ 输出与之前逐字节一致(下限是数据库驱动的可选开启,不是 CLI 契约变更);blastn
514
+ contig 路径从不读取它们。通过 `db build --floors` 安装(见下节),或把文件直接放
515
+ 进既有数据库目录;筛查时同样会校验(内容损坏以 `FLOORS_MALFORMED` 失败,exit 4)。
516
+ 内置的 `ecoli_dec` 携带 `{"genes": {"pic": 90.0}}`——SPATE 同源假阳性的修复。
517
+
461
518
  ## 表头格式与兼容性
462
519
 
463
520
  gapit 读取两种表头格式,逐记录检测:
@@ -552,6 +609,26 @@ gene accession function
552
609
  syn_betalac SYN-0001 ampicillin;cephalosporin
553
610
  ```
554
611
 
612
+ ### 按基因一致性下限(`--floors`)
613
+
614
+ `--floors FILE` 把一份 `gapit.floors/1` 文档安装为数据库的 `floors.json` 边车——
615
+ reads 模式存在判定的逐基因最小比对一致性(见
616
+ [reads.zh.md](./reads.zh.md#按基因设置一致性下限gapitfloors1数据库侧))。文档在
617
+ 任何产物落盘前先校验:`genes` 里的每个基因必须存在于 FASTA
618
+ (`FLOORS_UNKNOWN_GENE`,exit 4——给缺失基因设下限是静默失效的安全配置),取值必
619
+ 须在 [0, 100] 内、结构必须可解析(`FLOORS_MALFORMED`,exit 4)。随后文件原样拷入;
620
+ 文件的存在本身就是开关(manifest 字段不变)。仅限基因数据库——GBK/GFF 簇输入对
621
+ `--floors` 报用法错误。
622
+
623
+ ```console
624
+ $ cat my_floors.json
625
+ {"schema": "gapit.floors/1", "default": null, "genes": {"syn_betalac": 95.0}}
626
+ $ gapit db build tinyamr my_genes.fa --datadir ./db --tsv my_meta.tsv --floors my_floors.json
627
+ {"db":"tinyamr","records":2,"dbtype":"nucl","destination":"/tmp/opencode/gapit-build-demo/db/tinyamr"}
628
+ $ cat ./db/tinyamr/floors.json
629
+ {"schema": "gapit.floors/1", "default": null, "genes": {"syn_betalac": 95.0}}
630
+ ```
631
+
555
632
  ### 重建
556
633
 
557
634
  与 `db fetch` 一样,已有的数据库绝不被静默覆盖:
@@ -45,9 +45,9 @@ gapit --version
45
45
 
46
46
  ```console
47
47
  $ gapit --version
48
- gapit 0.5.1
48
+ gapit 0.5.2
49
49
  $ gapit --version --json
50
- {"schema":"gapit.version/1","name":"gapit","version":"0.5.1"}
50
+ {"schema":"gapit.version/1","name":"gapit","version":"0.5.2"}
51
51
  ```
52
52
 
53
53
  ## External binaries
@@ -44,9 +44,9 @@ gapit --version
44
44
 
45
45
  ```console
46
46
  $ gapit --version
47
- gapit 0.5.1
47
+ gapit 0.5.2
48
48
  $ gapit --version --json
49
- {"schema":"gapit.version/1","name":"gapit","version":"0.5.1"}
49
+ {"schema":"gapit.version/1","name":"gapit","version":"0.5.2"}
50
50
  ```
51
51
 
52
52
  ## 外部二进制
@@ -94,7 +94,7 @@ EOF
94
94
  Response line 1, verbatim:
95
95
 
96
96
  ```text
97
- {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"serverInfo":{"name":"gapit","version":"0.5.1"}}}
97
+ {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"serverInfo":{"name":"gapit","version":"0.5.2"}}}
98
98
  ```
99
99
 
100
100
  Response line 2 (real output, elided in the middle; each tool carries its full
@@ -117,7 +117,7 @@ the same run):
117
117
  ```json
118
118
  {
119
119
  "schema": "gapit.report/1",
120
- "tool": {"name": "gapit", "version": "0.5.1"},
120
+ "tool": {"name": "gapit", "version": "0.5.2"},
121
121
  "created_at": "2026-09-19T01:15:44Z",
122
122
  "params": {"db": "tinyamr", "minid": 80.0, "mincov": 80.0, "threads": 1},
123
123
  "files": [
@@ -173,7 +173,7 @@ the same run):
173
173
  ```json
174
174
  {
175
175
  "schema": "gapit.reads/1",
176
- "tool": {"name": "gapit", "version": "0.5.1"},
176
+ "tool": {"name": "gapit", "version": "0.5.2"},
177
177
  "created_at": "2026-09-22T00:07:35Z",
178
178
  "params": {
179
179
  "db": "tinyreads",
@@ -248,7 +248,7 @@ hit is the gene the agent just built the database from (real output):
248
248
  ```json
249
249
  {
250
250
  "schema": "gapit.report/1",
251
- "tool": {"name": "gapit", "version": "0.5.1"},
251
+ "tool": {"name": "gapit", "version": "0.5.2"},
252
252
  "created_at": "2026-09-20T13:38:39Z",
253
253
  "params": {"db": "myamr", "minid": 80.0, "mincov": 80.0, "threads": 1},
254
254
  "files": [
@@ -88,7 +88,7 @@ EOF
88
88
  响应第 1 行,原样:
89
89
 
90
90
  ```text
91
- {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"serverInfo":{"name":"gapit","version":"0.5.1"}}}
91
+ {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"serverInfo":{"name":"gapit","version":"0.5.2"}}}
92
92
  ```
93
93
 
94
94
  响应第 2 行(真实输出,中段省略;每个工具携带完整的 `inputSchema`):
@@ -109,7 +109,7 @@ EOF
109
109
  ```json
110
110
  {
111
111
  "schema": "gapit.report/1",
112
- "tool": {"name": "gapit", "version": "0.5.1"},
112
+ "tool": {"name": "gapit", "version": "0.5.2"},
113
113
  "created_at": "2026-09-19T01:15:44Z",
114
114
  "params": {"db": "tinyamr", "minid": 80.0, "mincov": 80.0, "threads": 1},
115
115
  "files": [
@@ -163,7 +163,7 @@ EOF
163
163
  ```json
164
164
  {
165
165
  "schema": "gapit.reads/1",
166
- "tool": {"name": "gapit", "version": "0.5.1"},
166
+ "tool": {"name": "gapit", "version": "0.5.2"},
167
167
  "created_at": "2026-09-22T00:07:35Z",
168
168
  "params": {
169
169
  "db": "tinyreads",
@@ -236,7 +236,7 @@ export GAPIT_DATADIR=/tmp/gapit-mcp-demo/datadir
236
236
  ```json
237
237
  {
238
238
  "schema": "gapit.report/1",
239
- "tool": {"name": "gapit", "version": "0.5.1"},
239
+ "tool": {"name": "gapit", "version": "0.5.2"},
240
240
  "created_at": "2026-09-20T13:38:39Z",
241
241
  "params": {"db": "myamr", "minid": 80.0, "mincov": 80.0, "threads": 1},
242
242
  "files": [