gapit 0.5.2__tar.gz → 0.5.4__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 (420) hide show
  1. {gapit-0.5.2 → gapit-0.5.4}/AGENTS.md +1 -0
  2. {gapit-0.5.2 → gapit-0.5.4}/CHANGELOG.md +54 -0
  3. {gapit-0.5.2 → gapit-0.5.4}/PKG-INFO +16 -8
  4. {gapit-0.5.2 → gapit-0.5.4}/README.md +15 -7
  5. {gapit-0.5.2 → gapit-0.5.4}/docs/agents.md +5 -4
  6. {gapit-0.5.2 → gapit-0.5.4}/docs/agents.zh.md +5 -4
  7. {gapit-0.5.2 → gapit-0.5.4}/docs/custom-db.md +5 -2
  8. {gapit-0.5.2 → gapit-0.5.4}/docs/custom-db.zh.md +5 -2
  9. {gapit-0.5.2 → gapit-0.5.4}/docs/databases.md +15 -7
  10. {gapit-0.5.2 → gapit-0.5.4}/docs/databases.zh.md +15 -7
  11. {gapit-0.5.2 → gapit-0.5.4}/docs/faq.md +53 -17
  12. {gapit-0.5.2 → gapit-0.5.4}/docs/faq.zh.md +42 -12
  13. {gapit-0.5.2 → gapit-0.5.4}/docs/index.md +1 -1
  14. {gapit-0.5.2 → gapit-0.5.4}/docs/index.zh.md +1 -1
  15. {gapit-0.5.2 → gapit-0.5.4}/docs/installation.md +14 -8
  16. {gapit-0.5.2 → gapit-0.5.4}/docs/installation.zh.md +11 -8
  17. {gapit-0.5.2 → gapit-0.5.4}/docs/mcp.md +5 -5
  18. {gapit-0.5.2 → gapit-0.5.4}/docs/mcp.zh.md +5 -5
  19. {gapit-0.5.2 → gapit-0.5.4}/docs/outputs.md +14 -13
  20. {gapit-0.5.2 → gapit-0.5.4}/docs/outputs.zh.md +15 -14
  21. {gapit-0.5.2 → gapit-0.5.4}/docs/quickstart.md +87 -17
  22. {gapit-0.5.2 → gapit-0.5.4}/docs/quickstart.zh.md +79 -15
  23. {gapit-0.5.2 → gapit-0.5.4}/docs/reads.md +14 -6
  24. {gapit-0.5.2 → gapit-0.5.4}/docs/reads.zh.md +13 -6
  25. {gapit-0.5.2 → gapit-0.5.4}/docs/screen.md +19 -10
  26. {gapit-0.5.2 → gapit-0.5.4}/docs/screen.zh.md +19 -7
  27. {gapit-0.5.2 → gapit-0.5.4}/docs/summary.md +21 -19
  28. {gapit-0.5.2 → gapit-0.5.4}/docs/summary.zh.md +21 -19
  29. {gapit-0.5.2 → gapit-0.5.4}/docs/typing.md +8 -8
  30. {gapit-0.5.2 → gapit-0.5.4}/docs/typing.zh.md +9 -8
  31. {gapit-0.5.2 → gapit-0.5.4}/pixi.lock +2 -2
  32. {gapit-0.5.2 → gapit-0.5.4}/pixi.toml +1 -1
  33. {gapit-0.5.2 → gapit-0.5.4}/pyproject.toml +1 -1
  34. {gapit-0.5.2 → gapit-0.5.4}/recipe/meta.yaml +3 -3
  35. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/__init__.py +1 -1
  36. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cmd_db_build.py +1 -1
  37. gapit-0.5.4/src/gapit/data/dbs/ecoli_dec/records.jsonl +16 -0
  38. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/ecoli_dec/sequences +16 -21
  39. gapit-0.5.4/src/gapit/db_build_meta.py +98 -0
  40. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/db_build_ops.py +23 -87
  41. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/db_ops.py +12 -3
  42. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/dbbuild.py +23 -0
  43. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/mcp_tools.py +1 -1
  44. gapit-0.5.4/src/gapit/progress.py +119 -0
  45. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/screening.py +37 -27
  46. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/screening_reads_positional.py +46 -36
  47. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_exact.json +1 -1
  48. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_exact.md +1 -1
  49. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_fragmented.json +1 -1
  50. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_fragmented.md +1 -1
  51. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_typing_ambiguous.json +1 -1
  52. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_typing_ambiguous.md +1 -1
  53. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_typing_cm_exact.json +1 -1
  54. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_typing_cm_exact.md +1 -1
  55. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_typing_exact.json +1 -1
  56. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_typing_exact.md +1 -1
  57. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_vc_inaba.json +1 -1
  58. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_vc_inaba.md +1 -1
  59. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/fragments_merge.json +1 -1
  60. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/fragments_merge.md +1 -1
  61. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_dec_pic_astA.json +1 -1
  62. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_dec_pic_astA.md +1 -1
  63. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_doumith_4b.json +1 -1
  64. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_doumith_4b.md +1 -1
  65. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_serotyping_l4b.json +1 -1
  66. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_serotyping_l4b.md +1 -1
  67. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_serotyping_mixed.json +1 -1
  68. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_serotyping_mixed.md +1 -1
  69. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_serotyping_vp_typed.json +1 -1
  70. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_serotyping_vp_typed.md +1 -1
  71. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_shigella_mixed.json +1 -1
  72. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_shigella_mixed.md +1 -1
  73. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_typing_exact.json +1 -1
  74. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/gene_typing_exact.md +1 -1
  75. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/reads_tinyamr.json +1 -1
  76. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/reads_tinyamr.md +1 -1
  77. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/screen_multi.json +1 -1
  78. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/screen_multi.md +1 -1
  79. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/summary_multi.json +1 -1
  80. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/summary_multi.md +1 -1
  81. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/typing_markers.json +1 -1
  82. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/typing_markers.md +1 -1
  83. {gapit-0.5.2 → gapit-0.5.4}/tests/test_bundled.py +6 -6
  84. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_db_build.py +86 -0
  85. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_setupdb.py +3 -3
  86. {gapit-0.5.2 → gapit-0.5.4}/tests/test_dbbuild.py +39 -1
  87. {gapit-0.5.2 → gapit-0.5.4}/tests/test_gene_floors_e2e.py +4 -1
  88. gapit-0.5.4/tests/test_progress.py +271 -0
  89. {gapit-0.5.2 → gapit-0.5.4}/.gitattributes +0 -0
  90. {gapit-0.5.2 → gapit-0.5.4}/.github/workflows/ci.yml +0 -0
  91. {gapit-0.5.2 → gapit-0.5.4}/.github/workflows/docs.yml +0 -0
  92. {gapit-0.5.2 → gapit-0.5.4}/.github/workflows/release.yml +0 -0
  93. {gapit-0.5.2 → gapit-0.5.4}/.gitignore +0 -0
  94. {gapit-0.5.2 → gapit-0.5.4}/LICENSE +0 -0
  95. {gapit-0.5.2 → gapit-0.5.4}/PLAN.md +0 -0
  96. {gapit-0.5.2 → gapit-0.5.4}/SPEC.md +0 -0
  97. {gapit-0.5.2 → gapit-0.5.4}/mkdocs.yml +0 -0
  98. {gapit-0.5.2 → gapit-0.5.4}/scripts/cluster_calibration.py +0 -0
  99. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/blast.py +0 -0
  100. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/bundled.py +0 -0
  101. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cli.py +0 -0
  102. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cluster.py +0 -0
  103. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cluster_math.py +0 -0
  104. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/clusterbuild.py +0 -0
  105. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cmd_db.py +0 -0
  106. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cmd_db_install.py +0 -0
  107. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cmd_db_outdated.py +0 -0
  108. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cmd_db_search.py +0 -0
  109. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cmd_screen.py +0 -0
  110. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cmd_screen_positionals.py +0 -0
  111. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cmd_screen_reads_args.py +0 -0
  112. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cmd_summary.py +0 -0
  113. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/cmd_typing.py +0 -0
  114. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/config.py +0 -0
  115. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/ecoh/bundled.json +0 -0
  116. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/ecoh/sequences +0 -0
  117. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/ecoli_dec/bundled.json +0 -0
  118. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/ecoli_dec/floors.json +0 -0
  119. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/ecoli_dec/typing.json +0 -0
  120. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/lm_doumith/bundled.json +0 -0
  121. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/lm_doumith/sequences +0 -0
  122. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/lm_doumith/typing.json +0 -0
  123. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/ncbi/bundled.json +0 -0
  124. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/ncbi/sequences +0 -0
  125. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/resfinder/bundled.json +0 -0
  126. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/resfinder/sequences +0 -0
  127. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/upec_expec_vf/bundled.json +0 -0
  128. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/data/dbs/upec_expec_vf/sequences +0 -0
  129. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/db.py +0 -0
  130. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/db_query_ops.py +0 -0
  131. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/dbcodec.py +0 -0
  132. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/dispatch.py +0 -0
  133. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/engines.py +0 -0
  134. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/errors.py +0 -0
  135. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/fasta.py +0 -0
  136. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/formats/__init__.py +0 -0
  137. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/formats/cluster.py +0 -0
  138. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/formats/cluster_md.py +0 -0
  139. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/formats/json.py +0 -0
  140. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/formats/md.py +0 -0
  141. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/formats/reads_json.py +0 -0
  142. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/formats/reads_tsv.py +0 -0
  143. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/formats/schemas.py +0 -0
  144. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/formats/summary.py +0 -0
  145. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/formats/tsv.py +0 -0
  146. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/formats/typing_result.py +0 -0
  147. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/fragments.py +0 -0
  148. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/gbfeatures.py +0 -0
  149. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/gene_floors.py +0 -0
  150. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/gffparse.py +0 -0
  151. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/hits.py +0 -0
  152. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/mcp.py +0 -0
  153. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/mcp_schemas.py +0 -0
  154. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/minimap.py +0 -0
  155. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/minimap2_run.py +0 -0
  156. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/paf.py +0 -0
  157. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/proctools.py +0 -0
  158. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/__init__.py +0 -0
  159. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/ab_k.py +0 -0
  160. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/ab_o.py +0 -0
  161. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/argannot.py +0 -0
  162. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/bacmet2.py +0 -0
  163. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/card.py +0 -0
  164. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/cluster_common.py +0 -0
  165. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/common.py +0 -0
  166. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/ecoh.py +0 -0
  167. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/ecoli_kps.py +0 -0
  168. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/ecoli_vf.py +0 -0
  169. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/kosc_k.py +0 -0
  170. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/kosc_o.py +0 -0
  171. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/kpsc_k.py +0 -0
  172. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/kpsc_o.py +0 -0
  173. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/megares.py +0 -0
  174. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/ncbi.py +0 -0
  175. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/plasmidfinder.py +0 -0
  176. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/resfinder.py +0 -0
  177. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/upec_expec_vf.py +0 -0
  178. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/vfdb.py +0 -0
  179. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/providers/victors.py +0 -0
  180. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/py.typed +0 -0
  181. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/readpairs.py +0 -0
  182. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/reads.py +0 -0
  183. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/records.py +0 -0
  184. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/report.py +0 -0
  185. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/screening_cluster.py +0 -0
  186. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/screening_reads.py +0 -0
  187. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/seqconvert.py +0 -0
  188. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/summary.py +0 -0
  189. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/typing_decide.py +0 -0
  190. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/typing_engine.py +0 -0
  191. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/typing_gene.py +0 -0
  192. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/typing_input.py +0 -0
  193. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/typing_models.py +0 -0
  194. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/typing_ops.py +0 -0
  195. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/typing_results.py +0 -0
  196. {gapit-0.5.2 → gapit-0.5.4}/src/gapit/typing_rules.py +0 -0
  197. {gapit-0.5.2 → gapit-0.5.4}/tests/data/bundled_differential/resfinder/HEAD.zip +0 -0
  198. {gapit-0.5.2 → gapit-0.5.4}/tests/data/bundled_differential/resfinder/README.md +0 -0
  199. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/bakta_style.gbk +0 -0
  200. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/clusters.gff3 +0 -0
  201. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/clusters_gz.gff3.gz +0 -0
  202. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/clusters_sidecar.fa +0 -0
  203. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/clusters_sidecar.gff3 +0 -0
  204. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/compound.gbk +0 -0
  205. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/gz_input.gbk.gz +0 -0
  206. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/kaptive_style.gbk +0 -0
  207. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/nofasta.gff3 +0 -0
  208. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/screening.gbk +0 -0
  209. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/typing_invalid.json +0 -0
  210. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/typing_screen.json +0 -0
  211. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/typing_screen_cm.json +0 -0
  212. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/typing_screen_v2.json +0 -0
  213. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/typing_valid.json +0 -0
  214. {gapit-0.5.2 → gapit-0.5.4}/tests/data/cluster/unnamed_cds.gbk +0 -0
  215. {gapit-0.5.2 → gapit-0.5.4}/tests/data/contigs/full.fa +0 -0
  216. {gapit-0.5.2 → gapit-0.5.4}/tests/data/contigs/gap.fa +0 -0
  217. {gapit-0.5.2 → gapit-0.5.4}/tests/data/contigs/none.fa +0 -0
  218. {gapit-0.5.2 → gapit-0.5.4}/tests/data/contigs/partial.fa +0 -0
  219. {gapit-0.5.2 → gapit-0.5.4}/tests/data/contigs/sort.fa +0 -0
  220. {gapit-0.5.2 → gapit-0.5.4}/tests/data/convert/sample.embl +0 -0
  221. {gapit-0.5.2 → gapit-0.5.4}/tests/data/convert/sample.embl.bz2 +0 -0
  222. {gapit-0.5.2 → gapit-0.5.4}/tests/data/convert/sample.fa +0 -0
  223. {gapit-0.5.2 → gapit-0.5.4}/tests/data/convert/sample.fa.gz +0 -0
  224. {gapit-0.5.2 → gapit-0.5.4}/tests/data/convert/sample.fq +0 -0
  225. {gapit-0.5.2 → gapit-0.5.4}/tests/data/convert/sample.gbk +0 -0
  226. {gapit-0.5.2 → gapit-0.5.4}/tests/data/convert/sample.gbk.gz +0 -0
  227. {gapit-0.5.2 → gapit-0.5.4}/tests/data/db/tinyamr/sequences +0 -0
  228. {gapit-0.5.2 → gapit-0.5.4}/tests/data/fragments/fragdb/sequences +0 -0
  229. {gapit-0.5.2 → gapit-0.5.4}/tests/data/fragments/split3040.fa +0 -0
  230. {gapit-0.5.2 → gapit-0.5.4}/tests/data/fragments/split4060.fa +0 -0
  231. {gapit-0.5.2 → gapit-0.5.4}/tests/data/fragments/split5050.fa +0 -0
  232. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/argannot/ARG-ANNOT_NT_V6_July2019.txt +0 -0
  233. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/bacmet2/BacMet2_EXP_database.fasta +0 -0
  234. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/card/card.json +0 -0
  235. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/ecoh/EcOH.fasta +0 -0
  236. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/ecoli_vf/repaired_ecoli_vfs_shortnames.ffn +0 -0
  237. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/megares/megares_drugs_demo.fasta +0 -0
  238. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/ncbi/AMR_CDS.fa +0 -0
  239. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/ncbi/ReferenceGeneCatalog.txt +0 -0
  240. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/plasmidfinder/plasmids_a.fsa +0 -0
  241. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/plasmidfinder/plasmids_b.fsa +0 -0
  242. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/resfinder/aminoglycoside.fsa +0 -0
  243. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/resfinder/beta-lactam.fsa +0 -0
  244. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/resfinder/phenotypes.txt +0 -0
  245. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/upec_expec_vf/UPEC_ExPEC_VF.tsv +0 -0
  246. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/vfdb/VFDB_setA_nt.fas +0 -0
  247. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/victors/gen_downloads.php +0 -0
  248. {gapit-0.5.2 → gapit-0.5.4}/tests/data/providers/victors/gen_downloads_protein.php +0 -0
  249. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/bla_partial.fq +0 -0
  250. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/junk.fq +0 -0
  251. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/s1_1.fq.gz +0 -0
  252. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/s1_2.fq.gz +0 -0
  253. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/s2_R1.fq.gz +0 -0
  254. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/s2_R2.fq.gz +0 -0
  255. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/suly_partial.fq +0 -0
  256. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/tetx_R1.fq +0 -0
  257. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/tetx_R2.fq +0 -0
  258. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/tetx_full.fq +0 -0
  259. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/tetx_full.fq.gz +0 -0
  260. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/tetx_lane1.fq +0 -0
  261. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/tetx_lane2.fq +0 -0
  262. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/tetx_pe1_R1.fq +0 -0
  263. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/tetx_pe1_R2.fq +0 -0
  264. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/tetx_pe2_R1.fq +0 -0
  265. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads/tetx_pe2_R2.fq +0 -0
  266. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads2/ont_homologs.fq +0 -0
  267. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads2/sr_homologs.fq +0 -0
  268. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads2_db/homologs/sequences +0 -0
  269. {gapit-0.5.2 → gapit-0.5.4}/tests/data/reads_db/tinyreads/sequences +0 -0
  270. {gapit-0.5.2 → gapit-0.5.4}/tests/data/summary/empty.tsv +0 -0
  271. {gapit-0.5.2 → gapit-0.5.4}/tests/data/summary/multi_sample.tsv +0 -0
  272. {gapit-0.5.2 → gapit-0.5.4}/tests/data/summary/sample_a.csv +0 -0
  273. {gapit-0.5.2 → gapit-0.5.4}/tests/data/summary/sample_a.tsv +0 -0
  274. {gapit-0.5.2 → gapit-0.5.4}/tests/data/summary/sample_b.csv +0 -0
  275. {gapit-0.5.2 → gapit-0.5.4}/tests/data/summary/sample_b.tsv +0 -0
  276. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/dec_s1_aggR_pic_uidA.fasta +0 -0
  277. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/dec_s2_pic_astA_uidA.fasta +0 -0
  278. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/dec_s3_stx2a_escV_aggR_uidA.fasta +0 -0
  279. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/exact.fa +0 -0
  280. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/listeria_1c.fa +0 -0
  281. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/listeria_4b.fa +0 -0
  282. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/listeria_nogate.fa +0 -0
  283. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/markers.fa +0 -0
  284. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/mutated.fa +0 -0
  285. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/negative.fa +0 -0
  286. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/partial.fa +0 -0
  287. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/cholerae.gbk +0 -0
  288. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/cholerae.json +0 -0
  289. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/dec.fa +0 -0
  290. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/dec.json +0 -0
  291. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/doumith.fa +0 -0
  292. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/doumith.json +0 -0
  293. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/lm_doumith.fa +0 -0
  294. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/lm_doumith.json +0 -0
  295. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/meningotype.fa +0 -0
  296. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/meningotype.json +0 -0
  297. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/shigella.fa +0 -0
  298. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/shigella.json +0 -0
  299. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/vp_ok.gbk +0 -0
  300. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/schemes/vp_ok.json +0 -0
  301. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/serotyping.fa +0 -0
  302. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/typing_markers_v1.json +0 -0
  303. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/typing_markers_v2.json +0 -0
  304. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/typing_serotyping_v2.json +0 -0
  305. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/vp_mixed.fa +0 -0
  306. {gapit-0.5.2 → gapit-0.5.4}/tests/data/typing/vp_typed.fa +0 -0
  307. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_exact.tsv +0 -0
  308. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_fragmented.tsv +0 -0
  309. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_typing_ambiguous.tsv +0 -0
  310. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_typing_cm_exact.tsv +0 -0
  311. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_typing_exact.tsv +0 -0
  312. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/cluster_vc_inaba.tsv +0 -0
  313. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/ecoli_dec_typed.tsv +0 -0
  314. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/ecoli_dec_typing.tsv +0 -0
  315. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/fragments_merge.tsv +0 -0
  316. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/lm_doumith_typing.tsv +0 -0
  317. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/summary_dutch.tsv +0 -0
  318. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/summary_multi.csv +0 -0
  319. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/summary_multi.tsv +0 -0
  320. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/tinyamr_multi_nopath.csv +0 -0
  321. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/tinyamr_multi_nopath.tsv +0 -0
  322. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/typing_markers.tsv +0 -0
  323. {gapit-0.5.2 → gapit-0.5.4}/tests/golden/typing_serotyping.tsv +0 -0
  324. {gapit-0.5.2 → gapit-0.5.4}/tests/parity/corpus/01_exact_and_junk.fa +0 -0
  325. {gapit-0.5.2 → gapit-0.5.4}/tests/parity/corpus/02_mutated.fa +0 -0
  326. {gapit-0.5.2 → gapit-0.5.4}/tests/parity/corpus/03_truncated.fa +0 -0
  327. {gapit-0.5.2 → gapit-0.5.4}/tests/parity/corpus/04_reverse.fa +0 -0
  328. {gapit-0.5.2 → gapit-0.5.4}/tests/parity/corpus/05_threshold.fa +0 -0
  329. {gapit-0.5.2 → gapit-0.5.4}/tests/parity/make_corpus.py +0 -0
  330. {gapit-0.5.2 → gapit-0.5.4}/tests/parity/run_parity.py +0 -0
  331. {gapit-0.5.2 → gapit-0.5.4}/tests/parity/run_summary_parity.py +0 -0
  332. {gapit-0.5.2 → gapit-0.5.4}/tests/test_blast_parse.py +0 -0
  333. {gapit-0.5.2 → gapit-0.5.4}/tests/test_blast_pipeline.py +0 -0
  334. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_aligner.py +0 -0
  335. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_bare_help.py +0 -0
  336. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_completion.py +0 -0
  337. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_db_build_cluster.py +0 -0
  338. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_db_fetch.py +0 -0
  339. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_db_query.py +0 -0
  340. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_fragments.py +0 -0
  341. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_reads.py +0 -0
  342. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_reads2.py +0 -0
  343. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_reads_glob.py +0 -0
  344. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_reads_glob_jobs.py +0 -0
  345. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_schema.py +0 -0
  346. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_screen.py +0 -0
  347. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_screen_jobs.py +0 -0
  348. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_short_options.py +0 -0
  349. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cli_summary.py +0 -0
  350. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cluster_calibration.py +0 -0
  351. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cluster_db.py +0 -0
  352. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cluster_math.py +0 -0
  353. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cluster_screen.py +0 -0
  354. {gapit-0.5.2 → gapit-0.5.4}/tests/test_cluster_typing.py +0 -0
  355. {gapit-0.5.2 → gapit-0.5.4}/tests/test_config.py +0 -0
  356. {gapit-0.5.2 → gapit-0.5.4}/tests/test_db.py +0 -0
  357. {gapit-0.5.2 → gapit-0.5.4}/tests/test_db_fetch.py +0 -0
  358. {gapit-0.5.2 → gapit-0.5.4}/tests/test_db_headers.py +0 -0
  359. {gapit-0.5.2 → gapit-0.5.4}/tests/test_db_list_extras.py +0 -0
  360. {gapit-0.5.2 → gapit-0.5.4}/tests/test_dbcodec.py +0 -0
  361. {gapit-0.5.2 → gapit-0.5.4}/tests/test_error_envelope.py +0 -0
  362. {gapit-0.5.2 → gapit-0.5.4}/tests/test_fasta.py +0 -0
  363. {gapit-0.5.2 → gapit-0.5.4}/tests/test_fragments.py +0 -0
  364. {gapit-0.5.2 → gapit-0.5.4}/tests/test_gapit_db_e2e.py +0 -0
  365. {gapit-0.5.2 → gapit-0.5.4}/tests/test_gbfeatures.py +0 -0
  366. {gapit-0.5.2 → gapit-0.5.4}/tests/test_gene_floors.py +0 -0
  367. {gapit-0.5.2 → gapit-0.5.4}/tests/test_gene_typing.py +0 -0
  368. {gapit-0.5.2 → gapit-0.5.4}/tests/test_gene_typing2.py +0 -0
  369. {gapit-0.5.2 → gapit-0.5.4}/tests/test_gffparse.py +0 -0
  370. {gapit-0.5.2 → gapit-0.5.4}/tests/test_hits.py +0 -0
  371. {gapit-0.5.2 → gapit-0.5.4}/tests/test_json_format.py +0 -0
  372. {gapit-0.5.2 → gapit-0.5.4}/tests/test_lm_doumith.py +0 -0
  373. {gapit-0.5.2 → gapit-0.5.4}/tests/test_mcp.py +0 -0
  374. {gapit-0.5.2 → gapit-0.5.4}/tests/test_mcp_db_tools.py +0 -0
  375. {gapit-0.5.2 → gapit-0.5.4}/tests/test_mcp_protocol.py +0 -0
  376. {gapit-0.5.2 → gapit-0.5.4}/tests/test_mcp_reads.py +0 -0
  377. {gapit-0.5.2 → gapit-0.5.4}/tests/test_md_format.py +0 -0
  378. {gapit-0.5.2 → gapit-0.5.4}/tests/test_minimap.py +0 -0
  379. {gapit-0.5.2 → gapit-0.5.4}/tests/test_mol_type.py +0 -0
  380. {gapit-0.5.2 → gapit-0.5.4}/tests/test_oversubscription.py +0 -0
  381. {gapit-0.5.2 → gapit-0.5.4}/tests/test_paf.py +0 -0
  382. {gapit-0.5.2 → gapit-0.5.4}/tests/test_paf_identity.py +0 -0
  383. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_argannot.py +0 -0
  384. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_bacmet2.py +0 -0
  385. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_card.py +0 -0
  386. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_ecoh.py +0 -0
  387. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_ecoli_vf.py +0 -0
  388. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_kaptive.py +0 -0
  389. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_megares.py +0 -0
  390. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_ncbi.py +0 -0
  391. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_plasmidfinder.py +0 -0
  392. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_resfinder.py +0 -0
  393. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_upec_expec_vf.py +0 -0
  394. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_vfdb.py +0 -0
  395. {gapit-0.5.2 → gapit-0.5.4}/tests/test_provider_victors.py +0 -0
  396. {gapit-0.5.2 → gapit-0.5.4}/tests/test_providers_common.py +0 -0
  397. {gapit-0.5.2 → gapit-0.5.4}/tests/test_readpairs.py +0 -0
  398. {gapit-0.5.2 → gapit-0.5.4}/tests/test_reads2_homologs.py +0 -0
  399. {gapit-0.5.2 → gapit-0.5.4}/tests/test_reads2_model.py +0 -0
  400. {gapit-0.5.2 → gapit-0.5.4}/tests/test_reads_aggregate.py +0 -0
  401. {gapit-0.5.2 → gapit-0.5.4}/tests/test_reads_integration.py +0 -0
  402. {gapit-0.5.2 → gapit-0.5.4}/tests/test_reads_interval_union.py +0 -0
  403. {gapit-0.5.2 → gapit-0.5.4}/tests/test_reads_streaming.py +0 -0
  404. {gapit-0.5.2 → gapit-0.5.4}/tests/test_records.py +0 -0
  405. {gapit-0.5.2 → gapit-0.5.4}/tests/test_report.py +0 -0
  406. {gapit-0.5.2 → gapit-0.5.4}/tests/test_screen_integration.py +0 -0
  407. {gapit-0.5.2 → gapit-0.5.4}/tests/test_screening_reads_unit.py +0 -0
  408. {gapit-0.5.2 → gapit-0.5.4}/tests/test_seqconvert.py +0 -0
  409. {gapit-0.5.2 → gapit-0.5.4}/tests/test_seqconvert_differential.py +0 -0
  410. {gapit-0.5.2 → gapit-0.5.4}/tests/test_streaming_chunks.py +0 -0
  411. {gapit-0.5.2 → gapit-0.5.4}/tests/test_summary.py +0 -0
  412. {gapit-0.5.2 → gapit-0.5.4}/tests/test_summary_formats.py +0 -0
  413. {gapit-0.5.2 → gapit-0.5.4}/tests/test_tsv.py +0 -0
  414. {gapit-0.5.2 → gapit-0.5.4}/tests/test_typing_command.py +0 -0
  415. {gapit-0.5.2 → gapit-0.5.4}/tests/test_typing_engine.py +0 -0
  416. {gapit-0.5.2 → gapit-0.5.4}/tests/test_typing_models.py +0 -0
  417. {gapit-0.5.2 → gapit-0.5.4}/tests/test_typing_schemes.py +0 -0
  418. {gapit-0.5.2 → gapit-0.5.4}/tests/test_typing_schemes_cluster.py +0 -0
  419. {gapit-0.5.2 → gapit-0.5.4}/tests/test_typing_stage2.py +0 -0
  420. {gapit-0.5.2 → gapit-0.5.4}/tests/test_version.py +0 -0
@@ -79,6 +79,7 @@ gapit/
79
79
  │ ├── db_ops.py # db use-cases: fetch + list (shared CLI + MCP; no typer)
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
+ │ ├── db_build_meta.py # `db build --tsv` metadata sidecar: parse + merge (shared by the build use-case)
82
83
  │ ├── gbfeatures.py # GenBank FEATURES/ORIGIN parser → LocusFeatures/GeneFeature + gapit.features/1
83
84
  │ ├── gene_floors.py # gapit.floors/1 per-gene identity floors: model, loader, build validation, reads gate
84
85
  │ ├── gffparse.py # GFF3 parser (embedded ##FASTA or sidecar) → the same locus/gene models
@@ -5,6 +5,60 @@ 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.4] - 2026-10-03
9
+
10
+ ### Added
11
+
12
+ - **Rich progress bar on long batch runs** (stderr only; modeled on the gmlst UX).
13
+ Multi-file contig screening, the positional-FASTQ wildcard batch, and
14
+ `gapit db fetch all` now show a spinner + bar + M/N + percent + elapsed bar on an
15
+ interactive stderr, with the description tracking the current file/sample/database and
16
+ replacing the per-file stderr notes while it runs. Under `--quiet` or a non-TTY stderr
17
+ (pipes, CI) the bar is disabled and today's plain notes print byte-identically; stdout
18
+ data streams are untouched in every case (the bar never captures stdout — rich's Live
19
+ redirection is pinned off), so output bytes are identical with the bar on or off.
20
+
21
+ ## [0.5.3] - 2026-10-03
22
+
23
+ ### Added
24
+
25
+ - **Build-time exact-duplicate dedup for gene databases.** `gapit db build` (CLI and MCP)
26
+ and bundled materialization now drop records whose `(gene, sequence)` pair repeats an
27
+ earlier one — the FIRST copy is kept, a stderr note counts the drops when not
28
+ `--quiet`, and the build receipt gains an additive `duplicates_dropped` field (omitted
29
+ when 0, so no-duplicate receipts stay byte-identical). Records with identical sequences
30
+ under DIFFERENT gene names are kept (possible aliases); the provider fetch pipeline is
31
+ untouched (it already deduplicates upstream).
32
+
33
+ ### Fixed
34
+
35
+ - **Bundled `ecoli_dec` regenerated 17 → 16 records (the 26ECO0094 `sth` divergence).**
36
+ The panel carried `estA3` (M18346.1) and `estA4` (J03311.1) as byte-identical 219 bp
37
+ `sth` sequences, so reads mode — which aggregates per record — reported two `sth` rows
38
+ while the blastn contig path's `-culling_limit 1` kept one. Build-time dedup drops the
39
+ `estA4` copy; both surfaces now agree on the single `estA3` `sth` row (verified on
40
+ 26ECO0094 reads and assembly; `astA`/`uidA` unchanged).
41
+
42
+ ### Docs
43
+
44
+ - Audited docs refresh (no behavior change): README and FAQ now state the shipped
45
+ stance — the abricate-compatible contig surface is a frozen baseline and the parity
46
+ harness is a regression reference, not a release gate; the false "nothing is bundled"
47
+ claims in FAQ/installation are replaced with the six in-wheel audited bundles
48
+ (materialized on first use). The `gapit typing` TSV column order in every example is
49
+ corrected to `FILE SCHEME PHENOTYPE GENES CONFIDENCE SCORE RUNNER_UP NOTES`; summary
50
+ examples now paste the real default `+`/`-` cells; schema rosters add `floors`
51
+ (eleven documents) and the `gapit.dblist/1` field table gains `kind`; the database
52
+ catalog is described as its real 21-row self (12 gene + 7 kaptive cluster + the
53
+ `ecoli_dec`/`lm_doumith` bundles); the quickstart gains a "Type your samples"
54
+ tutorial (two-stage designation, the screen|typing pipe, wildcard-FASTQ auto-pairing)
55
+ and uses `gapit setupdb` as the bootstrap path; `gapit screen` docs list
56
+ `--min-identity`/`-I` and `--min-mapq`/`-M`; the `gapit db build` reference lists
57
+ `--kind`/`-k`, `--typing`/`-T`, and `--floors`/`-F`. New FAQ entries: two-stage
58
+ typing designation, per-gene identity floors (the `pic` case), wildcard-FASTQ
59
+ auto-pairing. All fixes applied to the English pages and their `.zh.md` mirrors; all
60
+ replacement examples re-run against the real CLI.
61
+
8
62
  ## [0.5.2] - 2026-10-03
9
63
 
10
64
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gapit
3
- Version: 0.5.2
3
+ Version: 0.5.4
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/
@@ -37,9 +37,11 @@ JSON and Markdown.
37
37
 
38
38
  ## Why gapit
39
39
 
40
- - **Drop-in abricate replacement.** Same BLAST pipeline, same hit rules, abricate-format
41
- TSV on stdout. Parity with abricate 1.4.0 is a release gate, checked by diffing gene
42
- calls against real abricate (`pixi run -e parity parity`).
40
+ - **Frozen abricate-compatible baseline.** Contig screening keeps the same BLAST
41
+ pipeline, hit rules, and abricate-format TSV as a frozen baseline surface for existing
42
+ pipelines. From v0.5.0 gapit pursues its own contract; abricate parity is no longer a
43
+ release gate — the parity harness (`pixi run -e parity parity`) remains a regression
44
+ reference for that frozen surface.
43
45
  - **Machine-readable by design.** Versioned output schemas (`gapit.report/1`,
44
46
  `gapit.reads/1`, `gapit.summary/1`), self-describing via `gapit schema`, typed JSON error
45
47
  envelopes on stderr, documented exit codes. An agent can discover the whole contract
@@ -109,12 +111,16 @@ presence defaults to 90% alignment breadth (`--min-breadth 90`).
109
111
  ## Databases
110
112
 
111
113
  A database is a directory under the datadir, resolved from `$GAPIT_DATADIR`, then
112
- `~/.local/share/gapit/db` (override per call with `--datadir`). Twelve databases are built
113
- into the catalog; all of them download from upstream and build on `gapit db fetch` — with
114
- six content-provenance-audited exceptions that ship inside the package (`ecoli_dec` and
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`,
117
+ which downloads from upstream — and six content-provenance-audited ones also ship inside
118
+ the package (`ecoli_dec` and
115
119
  `lm_doumith` plus the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public
116
120
  domain / Apache-2.0 /
117
- BSD-3-Clause / MIT), materialized into the datadir on first use with zero network. Several
121
+ BSD-3-Clause / MIT), materialized into the datadir on first use with zero network; the
122
+ bundled `ecoli_dec` additionally carries per-gene identity floors (`floors.json`, `pic`
123
+ at 90%) that reads mode applies before presence calls. Several
118
124
  upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's GPL-3.0) forbid
119
125
  redistribution inside an MIT-licensed distribution, so everything else is fetch-on-demand
120
126
  — and `db fetch <name>` always refreshes a bundled name from the latest upstream.
@@ -128,8 +134,10 @@ redistribution inside an MIT-licensed distribution, so everything else is fetch-
128
134
  | `plasmidfinder` | CGE PlasmidFinder replicons | nucl |
129
135
  | `megares` | MEGARes antimicrobial resistance genes | nucl |
130
136
  | `ecoh` | E. coli O and H antigens (srst2 EcOH) | nucl |
137
+ | `ecoli_dec` | Diarrheagenic E. coli marker panel (GB 4789.6 + risk-monitoring designation) | nucl |
131
138
  | `vfdb` | VFDB virulence factors (set A, nucleotide) | nucl |
132
139
  | `ecoli_vf` | E. coli virulence factors | nucl |
140
+ | `lm_doumith` | Listeria monocytogenes serogrouping (Doumith 2004) | nucl |
133
141
  | `bacmet2` | BacMet2 biocide/resistance genes (protein) | prot |
134
142
  | `victors` | Victors virulence factors | nucl |
135
143
  | `upec_expec_vf` | UPEC/ExPEC virulence genes | nucl |
@@ -7,9 +7,11 @@ JSON and Markdown.
7
7
 
8
8
  ## Why gapit
9
9
 
10
- - **Drop-in abricate replacement.** Same BLAST pipeline, same hit rules, abricate-format
11
- TSV on stdout. Parity with abricate 1.4.0 is a release gate, checked by diffing gene
12
- calls against real abricate (`pixi run -e parity parity`).
10
+ - **Frozen abricate-compatible baseline.** Contig screening keeps the same BLAST
11
+ pipeline, hit rules, and abricate-format TSV as a frozen baseline surface for existing
12
+ pipelines. From v0.5.0 gapit pursues its own contract; abricate parity is no longer a
13
+ release gate — the parity harness (`pixi run -e parity parity`) remains a regression
14
+ reference for that frozen surface.
13
15
  - **Machine-readable by design.** Versioned output schemas (`gapit.report/1`,
14
16
  `gapit.reads/1`, `gapit.summary/1`), self-describing via `gapit schema`, typed JSON error
15
17
  envelopes on stderr, documented exit codes. An agent can discover the whole contract
@@ -79,12 +81,16 @@ presence defaults to 90% alignment breadth (`--min-breadth 90`).
79
81
  ## Databases
80
82
 
81
83
  A database is a directory under the datadir, resolved from `$GAPIT_DATADIR`, then
82
- `~/.local/share/gapit/db` (override per call with `--datadir`). Twelve databases are built
83
- into the catalog; all of them download from upstream and build on `gapit db fetch` — with
84
- six content-provenance-audited exceptions that ship inside the package (`ecoli_dec` and
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`,
87
+ which downloads from upstream — and six content-provenance-audited ones also ship inside
88
+ the package (`ecoli_dec` and
85
89
  `lm_doumith` plus the `ncbi`, `resfinder`, `ecoh`, `upec_expec_vf` snapshots: public
86
90
  domain / Apache-2.0 /
87
- BSD-3-Clause / MIT), materialized into the datadir on first use with zero network. Several
91
+ BSD-3-Clause / MIT), materialized into the datadir on first use with zero network; the
92
+ bundled `ecoli_dec` additionally carries per-gene identity floors (`floors.json`, `pic`
93
+ at 90%) that reads mode applies before presence calls. Several
88
94
  upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's GPL-3.0) forbid
89
95
  redistribution inside an MIT-licensed distribution, so everything else is fetch-on-demand
90
96
  — and `db fetch <name>` always refreshes a bundled name from the latest upstream.
@@ -98,8 +104,10 @@ redistribution inside an MIT-licensed distribution, so everything else is fetch-
98
104
  | `plasmidfinder` | CGE PlasmidFinder replicons | nucl |
99
105
  | `megares` | MEGARes antimicrobial resistance genes | nucl |
100
106
  | `ecoh` | E. coli O and H antigens (srst2 EcOH) | nucl |
107
+ | `ecoli_dec` | Diarrheagenic E. coli marker panel (GB 4789.6 + risk-monitoring designation) | nucl |
101
108
  | `vfdb` | VFDB virulence factors (set A, nucleotide) | nucl |
102
109
  | `ecoli_vf` | E. coli virulence factors | nucl |
110
+ | `lm_doumith` | Listeria monocytogenes serogrouping (Doumith 2004) | nucl |
103
111
  | `bacmet2` | BacMet2 biocide/resistance genes (protein) | prot |
104
112
  | `victors` | Victors virulence factors | nucl |
105
113
  | `upec_expec_vf` | UPEC/ExPEC virulence genes | nucl |
@@ -13,12 +13,12 @@ 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.2"}
16
+ {"schema":"gapit.version/1","name":"gapit","version":"0.5.4"}
17
17
  ```
18
18
 
19
- Output schemas. Ten documents are introspectable: `report`, `typing_result`, `reads`,
19
+ Output schemas. Eleven documents are introspectable: `report`, `typing_result`, `reads`,
20
20
  `reads2`, `cluster`, `summary`, `error`, `version`, plus the database-side
21
- documents `features` and `typing`. Each prints its full JSON Schema:
21
+ documents `features`, `typing`, and `floors`. Each prints its full JSON Schema:
22
22
 
23
23
  ```console
24
24
  $ gapit schema report # gapit.report/1 (contig screening)
@@ -31,6 +31,7 @@ $ gapit schema error # gapit.error/1
31
31
  $ gapit schema version # gapit.version/1
32
32
  $ gapit schema features # gapit.features/1 (cluster db feature table)
33
33
  $ gapit schema typing # gapit.typing/2 (db scoring spec; /1 still reads)
34
+ $ gapit schema floors # gapit.floors/1 (per-gene identity floors, reads mode)
34
35
  ```
35
36
 
36
37
  For example, `gapit schema version` (real output):
@@ -62,7 +63,7 @@ For example, `gapit schema version` (real output):
62
63
  ```
63
64
 
64
65
  Databases: the database catalog and install state (`gapit db list --json`; real output,
65
- first two of twelve shown, trimmed):
66
+ first two of twenty-one shown, trimmed):
66
67
 
67
68
  ```console
68
69
  $ gapit db list --json
@@ -12,11 +12,11 @@ gapit 生来就是被程序驱动的。每个输出都以机器可读为设计
12
12
 
13
13
  ```console
14
14
  $ gapit --version --json
15
- {"schema":"gapit.version/1","name":"gapit","version":"0.5.2"}
15
+ {"schema":"gapit.version/1","name":"gapit","version":"0.5.4"}
16
16
  ```
17
17
 
18
- 输出 schema。十个文档可自省:`report`、`typing_result`、`reads`、`reads2`、`cluster`、
19
- `summary`、`error`、`version`,外加数据库侧文档 `features` 和 `typing`。每个都打印完整的
18
+ 输出 schema。十一个文档可自省:`report`、`typing_result`、`reads`、`reads2`、`cluster`、
19
+ `summary`、`error`、`version`,外加数据库侧文档 `features`、`typing` 和 `floors`。每个都打印完整的
20
20
  JSON Schema:
21
21
 
22
22
  ```console
@@ -30,6 +30,7 @@ $ gapit schema error # gapit.error/1
30
30
  $ gapit schema version # gapit.version/1
31
31
  $ gapit schema features # gapit.features/1 (cluster db feature table)
32
32
  $ gapit schema typing # gapit.typing/2 (db scoring spec; /1 still reads)
33
+ $ gapit schema floors # gapit.floors/1 (per-gene identity floors, reads mode)
33
34
  ```
34
35
 
35
36
  例如 `gapit schema version`(真实输出):
@@ -60,7 +61,7 @@ $ gapit schema typing # gapit.typing/2 (db scoring spec; /1 still reads
60
61
  }
61
62
  ```
62
63
 
63
- 数据库:数据库目录与安装状态(`gapit db list --json`;真实输出,十二个中的前两
64
+ 数据库:数据库目录与安装状态(`gapit db list --json`;真实输出,二十一个中的前两
64
65
  个,有删节):
65
66
 
66
67
  ```console
@@ -20,6 +20,9 @@ gapit db build NAME FASTA [OPTIONS]
20
20
  | `FASTA` (argument) | path | Input FASTA: plain, abricate `~~~`, or `gapit\|` headers, detected per record (`.gz`/`.bz2` accepted). |
21
21
  | `--tsv` | path | Metadata TSV: header row with `gene`/`accession`/`function` columns. |
22
22
  | `--dbtype` | `nucl` or `prot` | Force the molecule type (default: auto-detect from the sequences). |
23
+ | `--kind` / `-k` | `gene` or `cluster` | Force the database kind (default: auto-detect from the input suffix; a disagreement is a usage error). |
24
+ | `--typing` / `-T` | path | `gapit.typing/1` or `/2` scoring spec: validated, copied into the db as `typing.json`, recorded in its manifest. |
25
+ | `--floors` / `-F` | path | `gapit.floors/1` per-gene identity floors for reads-mode presence: validated, copied into the db as `floors.json` (gene builds only). |
23
26
  | `--datadir` | path | Database directory (default: `$GAPIT_DATADIR`, then `~/.local/share/gapit/db`). |
24
27
  | `--description` | text | Default product for records whose FASTA header has no description text. |
25
28
  | `--force` | flag | Overwrite the database if it already exists. |
@@ -293,8 +296,8 @@ $ cat sample2.tsv
293
296
  sample2.fa SAM002 16 255 + labcur2 1-240/240 =============== 0/0 100.00 100.00 labmeta LAB-0002 synthetic macrolide esterase macrolide
294
297
  $ gapit summary sample1.tsv sample2.tsv
295
298
  #FILE NUM_FOUND labcur1 labcur2
296
- sample1.tsv 1 100.00 .
297
- sample2.tsv 1 . 100.00
299
+ sample1.tsv 1 + -
300
+ sample2.tsv 1 - +
298
301
  ```
299
302
 
300
303
  ## Rules and edge behavior
@@ -22,6 +22,9 @@ gapit db build NAME FASTA [OPTIONS]
22
22
  | `FASTA`(位置参数) | path | 输入 FASTA:plain、abricate `~~~` 或 `gapit\|` 表头,逐记录检测(接受 `.gz`/`.bz2`)。 |
23
23
  | `--tsv` | path | 元数据 TSV:带 `gene`/`accession`/`function` 列的表头行。 |
24
24
  | `--dbtype` | `nucl` 或 `prot` | 强制分子类型(默认:从序列自动检测)。 |
25
+ | `--kind` / `-k` | `gene` 或 `cluster` | 强制数据库类型(默认:从输入后缀自动检测;与后缀不一致是用法错误)。 |
26
+ | `--typing` / `-T` | path | `gapit.typing/1` 或 `/2` 评分规范:先校验,再复制进数据库成为 `typing.json`,并记入其 manifest。 |
27
+ | `--floors` / `-F` | path | `gapit.floors/1` 逐基因一致性下限,用于 reads 模式的存在判定:先校验,再复制进数据库成为 `floors.json`(仅限基因库构建)。 |
25
28
  | `--datadir` | path | 数据库目录(默认:`$GAPIT_DATADIR`,然后 `~/.local/share/gapit/db`)。 |
26
29
  | `--description` | 文本 | FASTA 表头没有描述文本的记录的默认产物。 |
27
30
  | `--force` | 开关 | 数据库已存在时覆盖。 |
@@ -320,8 +323,8 @@ $ cat sample2.tsv
320
323
  sample2.fa SAM002 16 255 + labcur2 1-240/240 =============== 0/0 100.00 100.00 labmeta LAB-0002 synthetic macrolide esterase macrolide
321
324
  $ gapit summary sample1.tsv sample2.tsv
322
325
  #FILE NUM_FOUND labcur1 labcur2
323
- sample1.tsv 1 100.00 .
324
- sample2.tsv 1 . 100.00
326
+ sample1.tsv 1 + -
327
+ sample2.tsv 1 - +
325
328
  ```
326
329
 
327
330
  ## 规则与边缘行为
@@ -78,6 +78,7 @@ $ gapit db list --json
78
78
  "description": "ARG-ANNOT acquired resistance genes",
79
79
  "dbtype": "nucl",
80
80
  "installed": true,
81
+ "kind": "gene",
81
82
  "records": 2224
82
83
  },
83
84
  {
@@ -86,6 +87,7 @@ $ gapit db list --json
86
87
  "description": "BacMet2 experimentally confirmed biocide/resistance genes (protein)",
87
88
  "dbtype": "prot",
88
89
  "installed": true,
90
+ "kind": "gene",
89
91
  "records": 746
90
92
  },
91
93
  {
@@ -94,6 +96,7 @@ $ gapit db list --json
94
96
  "description": "CARD protein homolog resistance models",
95
97
  "dbtype": "nucl",
96
98
  "installed": true,
99
+ "kind": "gene",
97
100
  "records": 6059
98
101
  }
99
102
  ]
@@ -108,6 +111,7 @@ $ gapit db list --json
108
111
  | `providers[].vendor` | string | Upstream maintainer organisation (NCBI, DTU CGE, Kaptive (klebgenomics), ...) |
109
112
  | `providers[].description` | string | Short content summary |
110
113
  | `providers[].dbtype` | string | `nucl` (screened with blastn) or `prot` (screened with blastx) |
114
+ | `providers[].kind` | string | `gene` (per-gene BLAST screening) or `cluster` (minimap2 locus screening, [screen.md](./screen.md#cluster-databases-kind-cluster)) |
111
115
  | `providers[].installed` | boolean | True when a manifest exists in the datadir |
112
116
  | `providers[].records` | integer | Record count, omitted when the database isn't installed |
113
117
  | `providers[].license` | string | Upstream content license, omitted unless the provider pins one (card, vfdb, ecoli_vf, kaptive) |
@@ -130,7 +134,7 @@ accept: a bundled database works out of the box.
130
134
  | Name | Content | Snapshot | Typed |
131
135
  |---|---|---|---|
132
136
  | `ecoh` | E. coli O and H antigens (597 records, srst2 EcOH) | 2026-10-02 | — |
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`) |
137
+ | `ecoli_dec` | Diarrheagenic E. coli marker panel (16 records, GB 4789.6 + risk-monitoring designation) | 2026-10-02 | `gapit.typing/2` (schemes `gb4789_6`, `risk_monitoring`) |
134
138
  | `lm_doumith` | Listeria monocytogenes serogrouping (5 records, Doumith 2004 markers) | 2026-10-03 | `gapit.typing/2` (scheme `doumith_serogroup`) |
135
139
  | `ncbi` | NCBI AMRFinderPlus curated AMR (8373 records) | 2026-10-02 | — |
136
140
  | `resfinder` | CGE ResFinder acquired resistance genes (3206 records) | 2026-10-02 | — |
@@ -139,7 +143,9 @@ accept: a bundled database works out of the box.
139
143
  **License provenance.** Every `ecoli_dec` record was re-sourced from primary
140
144
  public-domain submissions (NCBI RefSeq/GenBank/DDBJ accessions, same alleles as the
141
145
  rightsholder panel); two VFDB-derived records found in the original panel were removed
142
- and replaced during the 2026-10 audit. The `lm_doumith` panel was extracted the same
146
+ and replaced during the 2026-10 audit, and the byte-identical `estA4` (J03311.1) copy of
147
+ `estA3` (M18346.1) — one `sth` gene, one sequence — was dropped by the build pipeline's
148
+ exact-duplicate dedup in the 2026-10 rebuild, leaving 16 records. The `lm_doumith` panel was extracted the same
143
149
  way from public-domain INSDC records (accessions in each header; reverse-complement
144
150
  markers strand-corrected, `lmo0737` verified 100% against EGD-e). The four provider
145
151
  snapshots (`ecoh`, `ncbi`, `resfinder`, `upec_expec_vf`) passed the 2026-10
@@ -161,14 +167,16 @@ drift — comparing the wheel snapshots against latest upstream is future work.)
161
167
 
162
168
  **How materialization works.** The first `gapit screen ... --db <bundled-name>` against
163
169
  a datadir that does not hold the database builds it there automatically — one stderr note
164
- (`gapit: materializing bundled database ecoli_dec (17 records) into <datadir>`,
170
+ (`gapit: materializing bundled database ecoli_dec (16 records) into <datadir>`,
165
171
  silenced by `--quiet`), then the standard gene-build pipeline: `records.jsonl`, the
166
172
  `sequences` FASTA with gapit/v1 headers, the BLAST index, the `typing.json` copy when the
167
- bundle ships one, and a manifest stamped `source: "bundled"`. Deterministic, zero
173
+ bundle ships one, and a manifest stamped `source: "bundled"`. That pipeline — shared with
174
+ `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
168
176
  network. A missing datadir is created on this path only; `gapit setupdb` materializes
169
177
  every bundled database alongside indexing; re-running either is a no-op once the
170
178
  manifest exists. `db list` shows the database as `bundled` before that and
171
- `installed (17)` after — on all four listing surfaces (TSV, rich table, `--json`, MCP
179
+ `installed (16)` after — on all four listing surfaces (TSV, rich table, `--json`, MCP
172
180
  `db_list`).
173
181
 
174
182
  ### Listeria serogrouping (`lm_doumith`)
@@ -204,7 +212,7 @@ honest answer for everything the five markers cannot resolve.
204
212
  ## Checking database freshness
205
213
 
206
214
  `gapit db outdated` reports every installed database's age against the staleness
207
- threshold. Against a fully installed datadir (output trimmed to three of twelve rows):
215
+ threshold. Against a fully installed datadir (output trimmed to three of twenty-one rows):
208
216
 
209
217
  ```console
210
218
  $ gapit db outdated --days 30
@@ -488,7 +496,7 @@ versions. A real one, from the plasmidfinder database:
488
496
  "upstream_version": "",
489
497
  "tool": {
490
498
  "name": "gapit",
491
- "version": "0.5.2"
499
+ "version": "0.5.4"
492
500
  },
493
501
  "makeblastdb_version": "blastn: 2.17.0+",
494
502
  "minimap2_version": "2.31-r1302"
@@ -76,6 +76,7 @@ $ gapit db list --json
76
76
  "description": "ARG-ANNOT acquired resistance genes",
77
77
  "dbtype": "nucl",
78
78
  "installed": true,
79
+ "kind": "gene",
79
80
  "records": 2224
80
81
  },
81
82
  {
@@ -84,6 +85,7 @@ $ gapit db list --json
84
85
  "description": "BacMet2 experimentally confirmed biocide/resistance genes (protein)",
85
86
  "dbtype": "prot",
86
87
  "installed": true,
88
+ "kind": "gene",
87
89
  "records": 746
88
90
  },
89
91
  {
@@ -92,6 +94,7 @@ $ gapit db list --json
92
94
  "description": "CARD protein homolog resistance models",
93
95
  "dbtype": "nucl",
94
96
  "installed": true,
97
+ "kind": "gene",
95
98
  "records": 6059
96
99
  }
97
100
  ]
@@ -106,6 +109,7 @@ $ gapit db list --json
106
109
  | `providers[].vendor` | string | 上游维护机构(NCBI、DTU CGE、Kaptive (klebgenomics) 等) |
107
110
  | `providers[].description` | string | 内容简述 |
108
111
  | `providers[].dbtype` | string | `nucl`(用 blastn 筛查)或 `prot`(用 blastx 筛查) |
112
+ | `providers[].kind` | string | `gene`(逐基因 BLAST 筛查)或 `cluster`(minimap2 位点筛查,见 [screen.md](./screen.md)) |
109
113
  | `providers[].installed` | boolean | 数据目录里存在 manifest 时为 true |
110
114
  | `providers[].records` | integer | 记录数,数据库未安装时省略 |
111
115
  | `providers[].license` | string | 上游内容许可证,仅提供商声明时出现(card、vfdb、ecoli_vf、kaptive) |
@@ -125,7 +129,7 @@ abricate `--list` 的逐字节一致性。)见 [outputs.md](./outputs.md)。
125
129
  | 名称 | 内容 | 快照日期 | 分型 |
126
130
  |---|---|---|---|
127
131
  | `ecoh` | 大肠杆菌 O/H 抗原基因(597 条记录,srst2 EcOH) | 2026-10-02 | — |
128
- | `ecoli_dec` | 致腹泻大肠杆菌标志基因面板(17 条记录,GB 4789.6 + 风险监测判定) | 2026-10-02 | `gapit.typing/2`(`gb4789_6`、`risk_monitoring` 双方案) |
132
+ | `ecoli_dec` | 致腹泻大肠杆菌标志基因面板(16 条记录,GB 4789.6 + 风险监测判定) | 2026-10-02 | `gapit.typing/2`(`gb4789_6`、`risk_monitoring` 双方案) |
129
133
  | `lm_doumith` | 单核细胞增生李斯特菌血清群分型(5 条记录,Doumith 2004 标记) | 2026-10-03 | `gapit.typing/2`(方案 `doumith_serogroup`) |
130
134
  | `ncbi` | NCBI AMRFinderPlus 精选 AMR(8373 条记录) | 2026-10-02 | — |
131
135
  | `resfinder` | CGE ResFinder 获得性耐药基因(3206 条记录) | 2026-10-02 | — |
@@ -133,7 +137,9 @@ abricate `--list` 的逐字节一致性。)见 [outputs.md](./outputs.md)。
133
137
 
134
138
  **许可证来源声明。** `ecoli_dec` 的每条记录都取自公共领域的一级提交(NCBI
135
139
  RefSeq/GenBank/DDBJ 收录号,与权利方面板等位相同);2026-10 审计中发现原面板里
136
- 混入的两条 VFDB 来源记录已被移除并替换。`lm_doumith` 面板以同样方式取自公共领域
140
+ 混入的两条 VFDB 来源记录已被移除并替换;2026-10 重建时,构建管线的精确去重又丢弃了
141
+ 与 `estA3`(M18346.1)逐字节相同的 `estA4`(J03311.1)副本 —— 同一个 `sth` 基因、
142
+ 同一序列 —— 面板因此为 16 条记录。`lm_doumith` 面板以同样方式取自公共领域
137
143
  的 INSDC 记录(收录号见每条头部;反向互补标记已做链向校正,`lmo0737` 经与 EGD-e
138
144
  比对验证 100% 一致)。四个提供商快照(`ecoh`、`ncbi`、`resfinder`、
139
145
  `upec_expec_vf`)通过了 2026-10 对**全部**记录的内容级审计:
@@ -152,12 +158,14 @@ MIT —— 四者均允许随 MIT 许可的 wheel 再分发。回归测试锁定
152
158
 
153
159
  **物化机制。** 第一次 `gapit screen ... --db <内置库名>` 发现数据目录里没有该库
154
160
  时,会自动构建它 —— stderr 一行提示(`gapit: materializing bundled database
155
- ecoli_dec (17 records) into <datadir>`,`--quiet` 可静默),随后走标准基因库
161
+ ecoli_dec (16 records) into <datadir>`,`--quiet` 可静默),随后走标准基因库
156
162
  构建管线:`records.jsonl`、gapit/v1 头部的 `sequences`、BLAST 索引、(库自带时)
157
- `typing.json` 副本,以及盖上 `source: "bundled"` 的 manifest。全程确定性、零
163
+ `typing.json` 副本,以及盖上 `source: "bundled"` 的 manifest。该管线与
164
+ `gapit db build` 共享,会在构建时丢弃精确重复的(基因, 序列)记录(保留首条;
165
+ stderr 提示与回执中的 `duplicates_dropped` 计数)。全程确定性、零
158
166
  网络。仅这条路径会在数据目录缺失时自动创建它;`gapit setupdb` 在建索引的同时
159
167
  物化全部内置库;manifest 一旦存在,两者重跑都是无操作。`db list` 在物化前显示
160
- `bundled`、物化后显示 `installed (17)` —— 四个列表入口(TSV、rich 表格、
168
+ `bundled`、物化后显示 `installed (16)` —— 四个列表入口(TSV、rich 表格、
161
169
  `--json`、MCP `db_list`)一致。
162
170
 
163
171
  ### 李斯特菌血清群分型(`lm_doumith`)
@@ -192,7 +200,7 @@ table.tsv`。
192
200
  ## 检查数据库新鲜度
193
201
 
194
202
  `gapit db outdated` 报告每个已安装数据库相对于过期阈值的年龄。对装满的数据
195
- 目录(输出裁剪到十二行中的三行):
203
+ 目录(输出裁剪到二十一行中的三行):
196
204
 
197
205
  ```console
198
206
  $ gapit db outdated --days 30
@@ -466,7 +474,7 @@ manifest,来自 plasmidfinder 数据库:
466
474
  "upstream_version": "",
467
475
  "tool": {
468
476
  "name": "gapit",
469
- "version": "0.5.2"
477
+ "version": "0.5.4"
470
478
  },
471
479
  "makeblastdb_version": "blastn: 2.17.0+",
472
480
  "minimap2_version": "2.31-r1302"
@@ -5,11 +5,14 @@ the source or a live run.
5
5
 
6
6
  ## Is gapit a drop-in abricate replacement?
7
7
 
8
- For contig screening, yes: same BLAST pipeline, same hit rules, abricate-format
9
- TSV on stdout, byte-parity checked against real abricate on a corpus. It reads
10
- abricate-format databases (legacy `~~~` headers) as-is. The reverse does not
11
- hold: gapit-native databases (`gapit/v1` tagged headers) cannot be read by
12
- abricate. Details: `./databases.md`.
8
+ Contig screening keeps the abricate surface on purpose: same BLAST pipeline, same hit
9
+ rules, abricate-format TSV on stdout, byte-checked against real abricate on a corpus.
10
+ From v0.5.0 that baseline is frozen rather than a release gate — gapit pursues its own
11
+ contract (native JSON/Markdown, reads and cluster engines, typing), and the parity
12
+ harness (`pixi run -e parity parity`) serves as a regression reference for the frozen
13
+ surface. gapit reads abricate-format databases (legacy `~~~` headers) as-is. The
14
+ reverse does not hold: gapit-native databases (`gapit/v1` tagged headers) cannot be
15
+ read by abricate. Details: `./databases.md`.
13
16
 
14
17
  ## Why does a hit showing 80.00% coverage get filtered?
15
18
 
@@ -75,6 +78,15 @@ minimap2 cluster engine and reports one best-locus call per file, with
75
78
  per-gene verdicts and, on typed databases, a phenotype. Details:
76
79
  `./screen.md` and `./databases.md`.
77
80
 
81
+ ## How do I designate a pathotype or serogroup?
82
+
83
+ Designation is two-stage on gene databases: screen with a typed database, then read
84
+ the table back. The bundled `ecoli_dec` panel carries the dual-scheme DEC designation:
85
+ `gapit screen -d ecoli_dec sample.fna -o result.tsv`, then `gapit typing result.tsv`
86
+ — or pipe one straight into the other. Cluster databases are the exception: their
87
+ designation is integrated into the screen itself (the `PHENOTYPE` column). Details:
88
+ `./typing.md`.
89
+
78
90
  ## What is the difference between `--threads` and `--jobs`?
79
91
 
80
92
  `--threads` is BLAST worker threads inside one screening run (passed to
@@ -90,15 +102,35 @@ puts the sample key in the first `#SAMPLE` column; `--format json` (or `md`) giv
90
102
  versioned `gapit.reads/1` document instead:
91
103
 
92
104
  ```console
93
- $ gapit screen --r1 reads.fq --read-type sr --db tinyamr
94
- #SAMPLE GENE BREADTH% DEPTH READS PRESENT DATABASE ACCESSION PRODUCT RESISTANCE
95
- reads.fq tetX 97.70 2.09 12 yes tinyamr SYN-001 extended resistance determinant tetX TETRACYCLINE
96
- $ gapit screen --r1 reads.fq --read-type sr --db tinyamr --format json
105
+ $ gapit screen --r1 tests/data/reads/tetx_full.fq --read-type sr --db tinyreads
106
+ #SAMPLE GENE BREADTH% DEPTH READS PRESENT DATABASE ACCESSION PRODUCT
107
+ tests/data/reads/tetx_full.fq tetX 100.00 2.30 12 yes tinyreads SYN-001 extended resistance determinant tetX
108
+ $ gapit screen --r1 tests/data/reads/tetx_full.fq --read-type sr --db tinyreads --format json
97
109
  {"schema": "gapit.reads/1", ...}
98
110
  ```
99
111
 
100
112
  Reads mode: `./reads.md`.
101
113
 
114
+ ## Can I screen a wildcard of FASTQ files?
115
+
116
+ Yes: when every positional file is FASTQ, `gapit screen` enters reads mode and
117
+ auto-pairs samples from the filenames (`_R1`/`_R2`, `_1`/`_2` conventions), so
118
+ `gapit screen -d ecoli_dec *.fq.gz -j 4` screens all samples concurrently with one
119
+ command. Mixing FASTA and FASTQ positionals is a usage error; the pairing conventions
120
+ and the per-sample output are documented in `./reads.md`.
121
+
122
+ ## What are per-gene identity floors?
123
+
124
+ A database-side `floors.json` (`gapit.floors/1`) declares a minimum alignment identity
125
+ per gene for reads-mode presence: alignments below the floor are dropped before
126
+ breadth and depth are aggregated, so a close-but-not-exact homolog no longer over-calls
127
+ the gene. The real case that motivated it: the SPATE-homolog `pic` in the bundled
128
+ `ecoli_dec` panel read about 86.6% identity at 97.6% breadth and crossed the 90%
129
+ presence threshold, while the blastn contig path correctly rejected it; the shipped
130
+ floor (`pic` at 90) makes reads mode agree. Install one with `gapit db build --floors
131
+ FILE` or by dropping the file into the db directory; a database without one screens
132
+ byte-identically to before. Details: `./reads.md` and `./databases.md`.
133
+
102
134
  ## What is this "MISSING_DEPENDENCY" error?
103
135
 
104
136
  An external binary (blastn, makeblastdb, blastdbcmd, minimap2) is
@@ -113,16 +145,20 @@ PATH.
113
145
 
114
146
  ## What licenses apply to the databases?
115
147
 
116
- gapit itself is MIT-licensed. No database content ships inside the package: every
117
- provider downloads from upstream at fetch time, and the content keeps its original
118
- licenses (NCBI public domain, CARD's McMaster non-commercial terms, VFDB's CC BY-NC,
148
+ gapit itself is MIT-licensed. Six audited, permissively licensed bundles ship inside
149
+ the wheel (the public-domain `ecoli_dec` and `lm_doumith` panels plus the `ncbi`,
150
+ `resfinder`, `ecoh`, `upec_expec_vf` snapshots: Apache-2.0 / BSD-3-Clause / MIT) and
151
+ materialize into the datadir on first use; every other provider downloads from upstream
152
+ at fetch time, and the content keeps its original
153
+ licenses (CARD's McMaster non-commercial terms, VFDB's CC BY-NC,
119
154
  CGE, Kaptive's GPL-3.0, and so on); gapit does not relicense it. Providers that pin a
120
- license expose it in `gapit db list --json`. Details in SPEC.md §9.
155
+ license expose it in `gapit db list --json`. Details in SPEC.md §9 and the
156
+ [bundled section](./databases.md#bundled-databases-install-time-ready).
121
157
 
122
158
  ## How do I add a new database to the default set?
123
159
 
124
160
  Write a provider module and fetch it by name: every provider downloads from its
125
- upstream source at fetch time, transforms the records, and builds locally — nothing is
126
- ever bundled (upstream licenses such as CARD's or VFDB's forbid redistribution inside an
127
- MIT-licensed distribution). The header format, transforms, and build pipeline are
128
- specified in SPEC.md §11.
161
+ upstream source at fetch time, transforms the records, and builds locally. Nothing
162
+ beyond the six audited bundles ships in the wheel (upstream licenses such as CARD's or
163
+ VFDB's forbid redistribution inside an MIT-licensed distribution). The header format,
164
+ transforms, and build pipeline are specified in SPEC.md §11.