gapit 0.5.6__tar.gz → 0.6.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 (470) hide show
  1. {gapit-0.5.6 → gapit-0.6.2}/.github/workflows/ci.yml +20 -2
  2. gapit-0.6.2/.github/workflows/release.yml +54 -0
  3. {gapit-0.5.6 → gapit-0.6.2}/AGENTS.md +34 -16
  4. {gapit-0.5.6 → gapit-0.6.2}/CHANGELOG.md +120 -0
  5. gapit-0.6.2/CITATION.cff +18 -0
  6. gapit-0.6.2/CODE_QUALITY_REPORT.md +771 -0
  7. gapit-0.6.2/CONTRIBUTING.md +52 -0
  8. {gapit-0.5.6 → gapit-0.6.2}/PKG-INFO +36 -19
  9. {gapit-0.5.6 → gapit-0.6.2}/PLAN.md +6 -1
  10. {gapit-0.5.6 → gapit-0.6.2}/README.md +32 -14
  11. gapit-0.6.2/SECURITY.md +42 -0
  12. {gapit-0.5.6 → gapit-0.6.2}/SPEC.md +5 -2
  13. {gapit-0.5.6 → gapit-0.6.2}/docs/agents.md +9 -6
  14. {gapit-0.5.6 → gapit-0.6.2}/docs/agents.zh.md +7 -4
  15. {gapit-0.5.6 → gapit-0.6.2}/docs/custom-db.md +2 -2
  16. {gapit-0.5.6 → gapit-0.6.2}/docs/custom-db.zh.md +3 -3
  17. {gapit-0.5.6 → gapit-0.6.2}/docs/databases.md +38 -17
  18. {gapit-0.5.6 → gapit-0.6.2}/docs/databases.zh.md +39 -22
  19. gapit-0.6.2/docs/datadir.md +226 -0
  20. gapit-0.6.2/docs/datadir.zh.md +209 -0
  21. {gapit-0.5.6 → gapit-0.6.2}/docs/faq.md +7 -3
  22. {gapit-0.5.6 → gapit-0.6.2}/docs/faq.zh.md +8 -4
  23. gapit-0.6.2/docs/gseek-engine.md +74 -0
  24. gapit-0.6.2/docs/gseek-engine.zh.md +63 -0
  25. {gapit-0.5.6 → gapit-0.6.2}/docs/index.md +2 -0
  26. {gapit-0.5.6 → gapit-0.6.2}/docs/index.zh.md +2 -0
  27. {gapit-0.5.6 → gapit-0.6.2}/docs/installation.md +22 -9
  28. {gapit-0.5.6 → gapit-0.6.2}/docs/installation.zh.md +24 -11
  29. {gapit-0.5.6 → gapit-0.6.2}/docs/mcp.md +20 -16
  30. {gapit-0.5.6 → gapit-0.6.2}/docs/mcp.zh.md +20 -14
  31. {gapit-0.5.6 → gapit-0.6.2}/docs/outputs.md +11 -7
  32. {gapit-0.5.6 → gapit-0.6.2}/docs/outputs.zh.md +13 -9
  33. {gapit-0.5.6 → gapit-0.6.2}/docs/quickstart.md +2 -2
  34. {gapit-0.5.6 → gapit-0.6.2}/docs/quickstart.zh.md +2 -2
  35. {gapit-0.5.6 → gapit-0.6.2}/docs/reads.md +9 -9
  36. {gapit-0.5.6 → gapit-0.6.2}/docs/reads.zh.md +13 -13
  37. {gapit-0.5.6 → gapit-0.6.2}/docs/screen.md +6 -6
  38. {gapit-0.5.6 → gapit-0.6.2}/docs/screen.zh.md +10 -10
  39. {gapit-0.5.6 → gapit-0.6.2}/docs/summary.md +5 -2
  40. {gapit-0.5.6 → gapit-0.6.2}/docs/summary.zh.md +5 -2
  41. {gapit-0.5.6 → gapit-0.6.2}/docs/typing.md +1 -1
  42. {gapit-0.5.6 → gapit-0.6.2}/docs/typing.zh.md +2 -2
  43. {gapit-0.5.6 → gapit-0.6.2}/mkdocs.yml +5 -0
  44. {gapit-0.5.6 → gapit-0.6.2}/pixi.lock +113 -427
  45. {gapit-0.5.6 → gapit-0.6.2}/pixi.toml +12 -17
  46. {gapit-0.5.6 → gapit-0.6.2}/pyproject.toml +11 -6
  47. {gapit-0.5.6 → gapit-0.6.2}/scripts/generate_vp_typing.py +1 -1
  48. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/__init__.py +1 -1
  49. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/blast.py +37 -20
  50. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/bundled.py +10 -1
  51. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/bundled_cluster.py +23 -14
  52. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cli.py +54 -2
  53. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cluster.py +10 -3
  54. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/clusterbuild.py +67 -3
  55. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cmd_db.py +32 -4
  56. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cmd_screen.py +22 -2
  57. gapit-0.6.2/src/gapit/config.py +84 -0
  58. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/ecoh/bundled.json +2 -1
  59. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/ecoli_dec/bundled.json +2 -1
  60. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/lm_doumith/bundled.json +2 -1
  61. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/ncbi/bundled.json +2 -1
  62. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/resfinder/bundled.json +2 -1
  63. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/vc_serogroup/bundled.json +2 -1
  64. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/db.py +57 -28
  65. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/db_build_ops.py +39 -18
  66. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/db_ops.py +46 -2
  67. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/db_query_ops.py +6 -3
  68. gapit-0.6.2/src/gapit/db_txn.py +125 -0
  69. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/dbbuild.py +47 -9
  70. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/cluster.py +7 -6
  71. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/cluster2.py +22 -9
  72. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/cluster_md.py +2 -2
  73. gapit-0.6.2/src/gapit/formats/csvutil.py +38 -0
  74. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/md.py +25 -4
  75. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/reads_tsv.py +8 -4
  76. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/summary.py +16 -7
  77. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/tsv.py +11 -8
  78. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/typing_result.py +6 -5
  79. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/fragments.py +18 -6
  80. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/gbfeatures.py +13 -6
  81. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/gene_floors.py +27 -15
  82. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/gffparse.py +7 -0
  83. gapit-0.6.2/src/gapit/gseek_engine.py +371 -0
  84. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/mcp.py +3 -1
  85. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/mcp_schemas.py +8 -2
  86. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/mcp_tools.py +19 -5
  87. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/minimap2_run.py +96 -30
  88. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/paf.py +50 -34
  89. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/progress.py +4 -3
  90. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/cluster_common.py +47 -29
  91. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/common.py +95 -29
  92. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/megares.py +2 -2
  93. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/plasmidfinder.py +2 -2
  94. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/resfinder.py +2 -2
  95. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/vfdb.py +1 -1
  96. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/victors.py +2 -2
  97. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/readpairs.py +1 -1
  98. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/reads.py +6 -6
  99. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/records.py +19 -2
  100. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/screening.py +22 -7
  101. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/summary.py +21 -4
  102. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/typing_input.py +21 -6
  103. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/typing_models.py +30 -1
  104. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/typing_results.py +3 -2
  105. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster2_vp_none.json +1 -1
  106. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster2_vp_none.md +1 -1
  107. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster2_vp_o3k6.json +1 -1
  108. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster2_vp_o3k6.md +1 -1
  109. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_exact.json +1 -1
  110. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_exact.md +1 -1
  111. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_fragmented.json +1 -1
  112. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_fragmented.md +1 -1
  113. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_typing_ambiguous.json +1 -1
  114. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_typing_ambiguous.md +1 -1
  115. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_typing_cm_exact.json +1 -1
  116. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_typing_cm_exact.md +1 -1
  117. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_typing_exact.json +1 -1
  118. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_typing_exact.md +1 -1
  119. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_vc_inaba.json +1 -1
  120. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_vc_inaba.md +1 -1
  121. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/fragments_merge.json +1 -1
  122. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/fragments_merge.md +1 -1
  123. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_dec_pic_astA.json +1 -1
  124. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_dec_pic_astA.md +1 -1
  125. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_doumith_4b.json +1 -1
  126. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_doumith_4b.md +1 -1
  127. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_serotyping_l4b.json +1 -1
  128. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_serotyping_l4b.md +1 -1
  129. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_serotyping_mixed.json +1 -1
  130. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_serotyping_mixed.md +1 -1
  131. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_serotyping_vp_typed.json +1 -1
  132. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_serotyping_vp_typed.md +1 -1
  133. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_shigella_mixed.json +1 -1
  134. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_shigella_mixed.md +1 -1
  135. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_typing_exact.json +1 -1
  136. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/gene_typing_exact.md +1 -1
  137. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/reads_tinyamr.json +1 -1
  138. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/reads_tinyamr.md +1 -1
  139. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/screen_multi.json +1 -1
  140. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/screen_multi.md +1 -1
  141. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/summary_multi.json +4 -1
  142. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/summary_multi.md +2 -1
  143. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/typing_markers.json +1 -1
  144. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/typing_markers.md +1 -1
  145. {gapit-0.5.6 → gapit-0.6.2}/tests/test_blast_parse.py +10 -0
  146. {gapit-0.5.6 → gapit-0.6.2}/tests/test_bundled.py +33 -0
  147. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_aligner.py +48 -0
  148. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_db_build.py +19 -0
  149. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_db_fetch.py +34 -4
  150. gapit-0.6.2/tests/test_cli_db_path.py +70 -0
  151. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_schema.py +10 -0
  152. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_setupdb.py +26 -1
  153. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cluster2_build.py +38 -1
  154. gapit-0.6.2/tests/test_cluster_build_validation.py +120 -0
  155. gapit-0.6.2/tests/test_config.py +109 -0
  156. gapit-0.6.2/tests/test_csv_contract.py +184 -0
  157. gapit-0.6.2/tests/test_db_field_validation.py +76 -0
  158. {gapit-0.5.6 → gapit-0.6.2}/tests/test_db_list_extras.py +63 -0
  159. gapit-0.6.2/tests/test_db_txn.py +210 -0
  160. {gapit-0.5.6 → gapit-0.6.2}/tests/test_dbbuild.py +8 -1
  161. {gapit-0.5.6 → gapit-0.6.2}/tests/test_error_envelope.py +22 -2
  162. {gapit-0.5.6 → gapit-0.6.2}/tests/test_fragments.py +36 -2
  163. {gapit-0.5.6 → gapit-0.6.2}/tests/test_gbfeatures.py +21 -0
  164. {gapit-0.5.6 → gapit-0.6.2}/tests/test_gffparse.py +33 -0
  165. gapit-0.6.2/tests/test_gseek_engine.py +501 -0
  166. gapit-0.6.2/tests/test_gseek_parity.py +133 -0
  167. {gapit-0.5.6 → gapit-0.6.2}/tests/test_mcp.py +26 -8
  168. {gapit-0.5.6 → gapit-0.6.2}/tests/test_mcp_db_tools.py +62 -1
  169. {gapit-0.5.6 → gapit-0.6.2}/tests/test_mcp_reads.py +11 -3
  170. {gapit-0.5.6 → gapit-0.6.2}/tests/test_md_format.py +25 -0
  171. {gapit-0.5.6 → gapit-0.6.2}/tests/test_paf.py +10 -0
  172. gapit-0.6.2/tests/test_parser_fuzz.py +131 -0
  173. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_vfdb.py +1 -1
  174. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_victors.py +2 -2
  175. {gapit-0.5.6 → gapit-0.6.2}/tests/test_providers_common.py +73 -2
  176. {gapit-0.5.6 → gapit-0.6.2}/tests/test_readpairs.py +14 -0
  177. {gapit-0.5.6 → gapit-0.6.2}/tests/test_reads_streaming.py +64 -1
  178. {gapit-0.5.6 → gapit-0.6.2}/tests/test_summary_formats.py +14 -0
  179. {gapit-0.5.6 → gapit-0.6.2}/tests/test_tsv.py +3 -2
  180. {gapit-0.5.6 → gapit-0.6.2}/tests/test_typing_models.py +42 -0
  181. {gapit-0.5.6 → gapit-0.6.2}/tests/test_vp_ok.py +1 -1
  182. gapit-0.5.6/.github/workflows/release.yml +0 -28
  183. gapit-0.5.6/recipe/meta.yaml +0 -70
  184. gapit-0.5.6/src/gapit/config.py +0 -51
  185. gapit-0.5.6/src/gapit/data/typing/vp_ok.json +0 -1830
  186. gapit-0.5.6/stderr.txt +0 -7
  187. gapit-0.5.6/tests/test_config.py +0 -47
  188. {gapit-0.5.6 → gapit-0.6.2}/.gitattributes +0 -0
  189. {gapit-0.5.6 → gapit-0.6.2}/.github/workflows/docs.yml +0 -0
  190. {gapit-0.5.6 → gapit-0.6.2}/.gitignore +0 -0
  191. {gapit-0.5.6 → gapit-0.6.2}/LICENSE +0 -0
  192. {gapit-0.5.6 → gapit-0.6.2}/scripts/cluster_calibration.py +0 -0
  193. {gapit-0.5.6 → gapit-0.6.2}/scripts/vp_rules_matrix.tsv +0 -0
  194. {gapit-0.5.6 → gapit-0.6.2}/scripts/vp_typing_support.py +0 -0
  195. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cluster_math.py +0 -0
  196. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cmd_db_build.py +0 -0
  197. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cmd_db_install.py +0 -0
  198. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cmd_db_outdated.py +0 -0
  199. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cmd_db_search.py +0 -0
  200. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cmd_screen_positionals.py +0 -0
  201. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cmd_screen_reads_args.py +0 -0
  202. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cmd_summary.py +0 -0
  203. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/cmd_typing.py +0 -0
  204. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/ecoh/sequences +0 -0
  205. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/ecoli_dec/floors.json +0 -0
  206. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/ecoli_dec/records.jsonl +0 -0
  207. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/ecoli_dec/sequences +0 -0
  208. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/ecoli_dec/typing.json +0 -0
  209. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/lm_doumith/sequences +0 -0
  210. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/lm_doumith/typing.json +0 -0
  211. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/ncbi/sequences +0 -0
  212. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/resfinder/sequences +0 -0
  213. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/vc_serogroup/floors.json +0 -0
  214. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/vc_serogroup/records.jsonl +0 -0
  215. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/vc_serogroup/sequences +0 -0
  216. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/vc_serogroup/typing.json +0 -0
  217. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/vp_ok/bundled.json +0 -0
  218. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/vp_ok/features.json +0 -0
  219. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/vp_ok/sequences +0 -0
  220. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/data/dbs/vp_ok/typing.json +0 -0
  221. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/db_build_meta.py +0 -0
  222. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/dbcodec.py +0 -0
  223. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/dispatch.py +0 -0
  224. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/engines.py +0 -0
  225. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/errors.py +0 -0
  226. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/fasta.py +0 -0
  227. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/__init__.py +0 -0
  228. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/json.py +0 -0
  229. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/reads_json.py +0 -0
  230. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/formats/schemas.py +0 -0
  231. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/hits.py +0 -0
  232. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/minimap.py +0 -0
  233. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/proctools.py +0 -0
  234. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/__init__.py +0 -0
  235. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/ab_k.py +0 -0
  236. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/ab_o.py +0 -0
  237. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/argannot.py +0 -0
  238. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/bacmet2.py +0 -0
  239. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/card.py +0 -0
  240. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/ecoh.py +0 -0
  241. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/ecoli_kps.py +0 -0
  242. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/ecoli_vf.py +0 -0
  243. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/kosc_k.py +0 -0
  244. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/kosc_o.py +0 -0
  245. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/kpsc_k.py +0 -0
  246. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/kpsc_o.py +0 -0
  247. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/ncbi.py +0 -0
  248. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/providers/upec_expec_vf.py +0 -0
  249. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/py.typed +0 -0
  250. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/report.py +0 -0
  251. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/screening_cluster.py +0 -0
  252. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/screening_reads.py +0 -0
  253. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/screening_reads_positional.py +0 -0
  254. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/seqconvert.py +0 -0
  255. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/typing_cluster2.py +0 -0
  256. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/typing_decide.py +0 -0
  257. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/typing_engine.py +0 -0
  258. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/typing_gene.py +0 -0
  259. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/typing_ops.py +0 -0
  260. {gapit-0.5.6 → gapit-0.6.2}/src/gapit/typing_rules.py +0 -0
  261. {gapit-0.5.6 → gapit-0.6.2}/tests/data/bundled_differential/resfinder/HEAD.zip +0 -0
  262. {gapit-0.5.6 → gapit-0.6.2}/tests/data/bundled_differential/resfinder/README.md +0 -0
  263. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/bakta_style.gbk +0 -0
  264. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/clusters.gff3 +0 -0
  265. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/clusters_gz.gff3.gz +0 -0
  266. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/clusters_sidecar.fa +0 -0
  267. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/clusters_sidecar.gff3 +0 -0
  268. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/colliding_genes.gbk +0 -0
  269. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/compound.gbk +0 -0
  270. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/gz_input.gbk.gz +0 -0
  271. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/kaptive_style.gbk +0 -0
  272. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/nofasta.gff3 +0 -0
  273. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/screening.gbk +0 -0
  274. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/typing_invalid.json +0 -0
  275. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/typing_screen.json +0 -0
  276. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/typing_screen_cm.json +0 -0
  277. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/typing_screen_v2.json +0 -0
  278. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/typing_valid.json +0 -0
  279. {gapit-0.5.6 → gapit-0.6.2}/tests/data/cluster/unnamed_cds.gbk +0 -0
  280. {gapit-0.5.6 → gapit-0.6.2}/tests/data/contigs/full.fa +0 -0
  281. {gapit-0.5.6 → gapit-0.6.2}/tests/data/contigs/gap.fa +0 -0
  282. {gapit-0.5.6 → gapit-0.6.2}/tests/data/contigs/none.fa +0 -0
  283. {gapit-0.5.6 → gapit-0.6.2}/tests/data/contigs/partial.fa +0 -0
  284. {gapit-0.5.6 → gapit-0.6.2}/tests/data/contigs/sort.fa +0 -0
  285. {gapit-0.5.6 → gapit-0.6.2}/tests/data/convert/sample.embl +0 -0
  286. {gapit-0.5.6 → gapit-0.6.2}/tests/data/convert/sample.embl.bz2 +0 -0
  287. {gapit-0.5.6 → gapit-0.6.2}/tests/data/convert/sample.fa +0 -0
  288. {gapit-0.5.6 → gapit-0.6.2}/tests/data/convert/sample.fa.gz +0 -0
  289. {gapit-0.5.6 → gapit-0.6.2}/tests/data/convert/sample.fq +0 -0
  290. {gapit-0.5.6 → gapit-0.6.2}/tests/data/convert/sample.gbk +0 -0
  291. {gapit-0.5.6 → gapit-0.6.2}/tests/data/convert/sample.gbk.gz +0 -0
  292. {gapit-0.5.6 → gapit-0.6.2}/tests/data/db/tinyamr/sequences +0 -0
  293. {gapit-0.5.6 → gapit-0.6.2}/tests/data/fragments/fragdb/sequences +0 -0
  294. {gapit-0.5.6 → gapit-0.6.2}/tests/data/fragments/split3040.fa +0 -0
  295. {gapit-0.5.6 → gapit-0.6.2}/tests/data/fragments/split4060.fa +0 -0
  296. {gapit-0.5.6 → gapit-0.6.2}/tests/data/fragments/split5050.fa +0 -0
  297. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/argannot/ARG-ANNOT_NT_V6_July2019.txt +0 -0
  298. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/bacmet2/BacMet2_EXP_database.fasta +0 -0
  299. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/card/card.json +0 -0
  300. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/ecoh/EcOH.fasta +0 -0
  301. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/ecoli_vf/repaired_ecoli_vfs_shortnames.ffn +0 -0
  302. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/megares/megares_drugs_demo.fasta +0 -0
  303. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/ncbi/AMR_CDS.fa +0 -0
  304. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/ncbi/ReferenceGeneCatalog.txt +0 -0
  305. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/plasmidfinder/plasmids_a.fsa +0 -0
  306. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/plasmidfinder/plasmids_b.fsa +0 -0
  307. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/resfinder/aminoglycoside.fsa +0 -0
  308. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/resfinder/beta-lactam.fsa +0 -0
  309. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/resfinder/phenotypes.txt +0 -0
  310. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/upec_expec_vf/UPEC_ExPEC_VF.tsv +0 -0
  311. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/vfdb/VFDB_setA_nt.fas +0 -0
  312. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/victors/gen_downloads.php +0 -0
  313. {gapit-0.5.6 → gapit-0.6.2}/tests/data/providers/victors/gen_downloads_protein.php +0 -0
  314. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/bla_partial.fq +0 -0
  315. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/junk.fq +0 -0
  316. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/s1_1.fq.gz +0 -0
  317. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/s1_2.fq.gz +0 -0
  318. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/s2_R1.fq.gz +0 -0
  319. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/s2_R2.fq.gz +0 -0
  320. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/suly_partial.fq +0 -0
  321. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/tetx_R1.fq +0 -0
  322. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/tetx_R2.fq +0 -0
  323. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/tetx_full.fq +0 -0
  324. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/tetx_full.fq.gz +0 -0
  325. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/tetx_lane1.fq +0 -0
  326. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/tetx_lane2.fq +0 -0
  327. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/tetx_pe1_R1.fq +0 -0
  328. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/tetx_pe1_R2.fq +0 -0
  329. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/tetx_pe2_R1.fq +0 -0
  330. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads/tetx_pe2_R2.fq +0 -0
  331. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads2/ont_homologs.fq +0 -0
  332. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads2/sr_homologs.fq +0 -0
  333. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads2_db/homologs/sequences +0 -0
  334. {gapit-0.5.6 → gapit-0.6.2}/tests/data/reads_db/tinyreads/sequences +0 -0
  335. {gapit-0.5.6 → gapit-0.6.2}/tests/data/summary/empty.tsv +0 -0
  336. {gapit-0.5.6 → gapit-0.6.2}/tests/data/summary/multi_sample.tsv +0 -0
  337. {gapit-0.5.6 → gapit-0.6.2}/tests/data/summary/sample_a.csv +0 -0
  338. {gapit-0.5.6 → gapit-0.6.2}/tests/data/summary/sample_a.tsv +0 -0
  339. {gapit-0.5.6 → gapit-0.6.2}/tests/data/summary/sample_b.csv +0 -0
  340. {gapit-0.5.6 → gapit-0.6.2}/tests/data/summary/sample_b.tsv +0 -0
  341. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/dec_s1_aggR_pic_uidA.fasta +0 -0
  342. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/dec_s2_pic_astA_uidA.fasta +0 -0
  343. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/dec_s3_stx2a_escV_aggR_uidA.fasta +0 -0
  344. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/exact.fa +0 -0
  345. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/listeria_1c.fa +0 -0
  346. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/listeria_4b.fa +0 -0
  347. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/listeria_nogate.fa +0 -0
  348. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/markers.fa +0 -0
  349. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/mutated.fa +0 -0
  350. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/negative.fa +0 -0
  351. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/partial.fa +0 -0
  352. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/cholerae.gbk +0 -0
  353. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/cholerae.json +0 -0
  354. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/dec.fa +0 -0
  355. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/dec.json +0 -0
  356. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/doumith.fa +0 -0
  357. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/doumith.json +0 -0
  358. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/lm_doumith.fa +0 -0
  359. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/lm_doumith.json +0 -0
  360. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/meningotype.fa +0 -0
  361. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/meningotype.json +0 -0
  362. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/shigella.fa +0 -0
  363. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/shigella.json +0 -0
  364. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/vp_ok.gbk +0 -0
  365. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/schemes/vp_ok.json +0 -0
  366. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/serotyping.fa +0 -0
  367. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/typing_markers_v1.json +0 -0
  368. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/typing_markers_v2.json +0 -0
  369. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/typing_serotyping_v2.json +0 -0
  370. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/vp_mixed.fa +0 -0
  371. {gapit-0.5.6 → gapit-0.6.2}/tests/data/typing/vp_typed.fa +0 -0
  372. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster2_vp_none.tsv +0 -0
  373. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster2_vp_o3k6.tsv +0 -0
  374. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_exact.tsv +0 -0
  375. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_fragmented.tsv +0 -0
  376. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_typing_ambiguous.tsv +0 -0
  377. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_typing_cm_exact.tsv +0 -0
  378. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_typing_exact.tsv +0 -0
  379. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/cluster_vc_inaba.tsv +0 -0
  380. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/ecoli_dec_typed.tsv +0 -0
  381. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/ecoli_dec_typing.tsv +0 -0
  382. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/features_kaptive_style.json +0 -0
  383. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/features_screening.json +0 -0
  384. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/fragments_merge.tsv +0 -0
  385. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/lm_doumith_typing.tsv +0 -0
  386. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/summary_dutch.tsv +0 -0
  387. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/summary_multi.csv +0 -0
  388. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/summary_multi.tsv +0 -0
  389. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/tinyamr_multi_nopath.csv +0 -0
  390. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/tinyamr_multi_nopath.tsv +0 -0
  391. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/typing_markers.tsv +0 -0
  392. {gapit-0.5.6 → gapit-0.6.2}/tests/golden/typing_serotyping.tsv +0 -0
  393. {gapit-0.5.6 → gapit-0.6.2}/tests/parity/corpus/01_exact_and_junk.fa +0 -0
  394. {gapit-0.5.6 → gapit-0.6.2}/tests/parity/corpus/02_mutated.fa +0 -0
  395. {gapit-0.5.6 → gapit-0.6.2}/tests/parity/corpus/03_truncated.fa +0 -0
  396. {gapit-0.5.6 → gapit-0.6.2}/tests/parity/corpus/04_reverse.fa +0 -0
  397. {gapit-0.5.6 → gapit-0.6.2}/tests/parity/corpus/05_threshold.fa +0 -0
  398. {gapit-0.5.6 → gapit-0.6.2}/tests/parity/make_corpus.py +0 -0
  399. {gapit-0.5.6 → gapit-0.6.2}/tests/parity/run_parity.py +0 -0
  400. {gapit-0.5.6 → gapit-0.6.2}/tests/parity/run_summary_parity.py +0 -0
  401. {gapit-0.5.6 → gapit-0.6.2}/tests/test_blast_pipeline.py +0 -0
  402. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_bare_help.py +0 -0
  403. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_completion.py +0 -0
  404. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_db_build_cluster.py +0 -0
  405. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_db_query.py +0 -0
  406. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_fragments.py +0 -0
  407. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_reads.py +0 -0
  408. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_reads2.py +0 -0
  409. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_reads_glob.py +0 -0
  410. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_reads_glob_jobs.py +0 -0
  411. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_screen.py +0 -0
  412. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_screen_jobs.py +0 -0
  413. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_short_options.py +0 -0
  414. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cli_summary.py +0 -0
  415. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cluster_calibration.py +0 -0
  416. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cluster_db.py +0 -0
  417. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cluster_math.py +0 -0
  418. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cluster_screen.py +0 -0
  419. {gapit-0.5.6 → gapit-0.6.2}/tests/test_cluster_typing.py +0 -0
  420. {gapit-0.5.6 → gapit-0.6.2}/tests/test_db.py +0 -0
  421. {gapit-0.5.6 → gapit-0.6.2}/tests/test_db_fetch.py +0 -0
  422. {gapit-0.5.6 → gapit-0.6.2}/tests/test_db_headers.py +0 -0
  423. {gapit-0.5.6 → gapit-0.6.2}/tests/test_dbcodec.py +0 -0
  424. {gapit-0.5.6 → gapit-0.6.2}/tests/test_fasta.py +0 -0
  425. {gapit-0.5.6 → gapit-0.6.2}/tests/test_gapit_db_e2e.py +0 -0
  426. {gapit-0.5.6 → gapit-0.6.2}/tests/test_gene_floors.py +0 -0
  427. {gapit-0.5.6 → gapit-0.6.2}/tests/test_gene_floors_e2e.py +0 -0
  428. {gapit-0.5.6 → gapit-0.6.2}/tests/test_gene_typing.py +0 -0
  429. {gapit-0.5.6 → gapit-0.6.2}/tests/test_gene_typing2.py +0 -0
  430. {gapit-0.5.6 → gapit-0.6.2}/tests/test_hits.py +0 -0
  431. {gapit-0.5.6 → gapit-0.6.2}/tests/test_json_format.py +0 -0
  432. {gapit-0.5.6 → gapit-0.6.2}/tests/test_lm_doumith.py +0 -0
  433. {gapit-0.5.6 → gapit-0.6.2}/tests/test_mcp_protocol.py +0 -0
  434. {gapit-0.5.6 → gapit-0.6.2}/tests/test_minimap.py +0 -0
  435. {gapit-0.5.6 → gapit-0.6.2}/tests/test_mol_type.py +0 -0
  436. {gapit-0.5.6 → gapit-0.6.2}/tests/test_oversubscription.py +0 -0
  437. {gapit-0.5.6 → gapit-0.6.2}/tests/test_paf_identity.py +0 -0
  438. {gapit-0.5.6 → gapit-0.6.2}/tests/test_progress.py +0 -0
  439. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_argannot.py +0 -0
  440. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_bacmet2.py +0 -0
  441. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_card.py +0 -0
  442. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_ecoh.py +0 -0
  443. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_ecoli_vf.py +0 -0
  444. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_kaptive.py +0 -0
  445. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_megares.py +0 -0
  446. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_ncbi.py +0 -0
  447. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_plasmidfinder.py +0 -0
  448. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_resfinder.py +0 -0
  449. {gapit-0.5.6 → gapit-0.6.2}/tests/test_provider_upec_expec_vf.py +0 -0
  450. {gapit-0.5.6 → gapit-0.6.2}/tests/test_reads2_homologs.py +0 -0
  451. {gapit-0.5.6 → gapit-0.6.2}/tests/test_reads2_model.py +0 -0
  452. {gapit-0.5.6 → gapit-0.6.2}/tests/test_reads_aggregate.py +0 -0
  453. {gapit-0.5.6 → gapit-0.6.2}/tests/test_reads_integration.py +0 -0
  454. {gapit-0.5.6 → gapit-0.6.2}/tests/test_reads_interval_union.py +0 -0
  455. {gapit-0.5.6 → gapit-0.6.2}/tests/test_records.py +0 -0
  456. {gapit-0.5.6 → gapit-0.6.2}/tests/test_report.py +0 -0
  457. {gapit-0.5.6 → gapit-0.6.2}/tests/test_screen_integration.py +0 -0
  458. {gapit-0.5.6 → gapit-0.6.2}/tests/test_screening_reads_unit.py +0 -0
  459. {gapit-0.5.6 → gapit-0.6.2}/tests/test_seqconvert.py +0 -0
  460. {gapit-0.5.6 → gapit-0.6.2}/tests/test_seqconvert_differential.py +0 -0
  461. {gapit-0.5.6 → gapit-0.6.2}/tests/test_streaming_chunks.py +0 -0
  462. {gapit-0.5.6 → gapit-0.6.2}/tests/test_summary.py +0 -0
  463. {gapit-0.5.6 → gapit-0.6.2}/tests/test_typing_command.py +0 -0
  464. {gapit-0.5.6 → gapit-0.6.2}/tests/test_typing_engine.py +0 -0
  465. {gapit-0.5.6 → gapit-0.6.2}/tests/test_typing_schemes.py +0 -0
  466. {gapit-0.5.6 → gapit-0.6.2}/tests/test_typing_schemes_cluster.py +0 -0
  467. {gapit-0.5.6 → gapit-0.6.2}/tests/test_typing_stage2.py +0 -0
  468. {gapit-0.5.6 → gapit-0.6.2}/tests/test_vc_serogroup.py +0 -0
  469. {gapit-0.5.6 → gapit-0.6.2}/tests/test_version.py +0 -0
  470. {gapit-0.5.6 → gapit-0.6.2}/tests/test_vp_ok_acceptance.py +0 -0
@@ -4,6 +4,9 @@ on:
4
4
  push:
5
5
  branches: [main]
6
6
  pull_request:
7
+ schedule:
8
+ # Weekly clean-environment canary: no caches, locked dependencies.
9
+ - cron: "0 3 * * 1"
7
10
 
8
11
  concurrency:
9
12
  group: ${{ github.workflow }}-${{ github.ref }}
@@ -16,17 +19,32 @@ jobs:
16
19
  strategy:
17
20
  fail-fast: false
18
21
  matrix:
19
- env: [default, py311, py313]
22
+ env: [default]
20
23
  steps:
21
24
  - uses: actions/checkout@v4
22
25
  - uses: prefix-dev/setup-pixi@v0.8.1
23
26
  with:
24
27
  cache: true
25
28
  - run: pixi run -e ${{ matrix.env }} lint
26
- - run: pixi run -e ${{ matrix.env }} fmt -- --check
29
+ - run: pixi run -e ${{ matrix.env }} fmt-check
27
30
  - run: pixi run -e ${{ matrix.env }} typecheck
28
31
  - run: pixi run -e ${{ matrix.env }} test
29
32
 
33
+ clean-gates:
34
+ name: clean gates (no cache)
35
+ if: github.event_name == 'schedule'
36
+ runs-on: ubuntu-latest
37
+ steps:
38
+ - uses: actions/checkout@v4
39
+ - uses: prefix-dev/setup-pixi@v0.8.1
40
+ with:
41
+ cache: false
42
+ - run: pixi install --locked
43
+ - run: pixi run lint
44
+ - run: pixi run fmt-check
45
+ - run: pixi run typecheck
46
+ - run: pixi run test
47
+
30
48
  # Independent of gates: the bioconda solve is slow and orthogonal to the
31
49
  # python matrix. Needs BOTH envs installed — the harness runs on the default
32
50
  # env's python and invokes .pixi/envs/default/bin/gapit while parity env
@@ -0,0 +1,54 @@
1
+ name: Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ tags: ["v*"]
7
+
8
+ permissions:
9
+ contents: read
10
+ # OIDC token for PyPI trusted publishing (pypa/gh-action-pypi-publish).
11
+ id-token: write
12
+
13
+ jobs:
14
+ gates:
15
+ name: release gates
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+ - uses: prefix-dev/setup-pixi@v0.8.1
20
+ with:
21
+ cache: false
22
+ - run: pixi install --locked
23
+ - run: pixi run lint
24
+ - run: pixi run fmt-check
25
+ - run: pixi run typecheck
26
+ - run: pixi run test
27
+
28
+ publish:
29
+ needs: gates
30
+ runs-on: ubuntu-latest
31
+ steps:
32
+ - uses: actions/checkout@v4
33
+
34
+ - uses: actions/setup-python@v5
35
+ with:
36
+ python-version: "3.12"
37
+
38
+ - name: Build sdist and wheel
39
+ run: |
40
+ python -m pip install --upgrade pip build twine
41
+ python -m build
42
+
43
+ - name: Check distributions
44
+ run: python -m twine check dist/*
45
+
46
+ - name: Install the built wheel and smoke-test it
47
+ run: |
48
+ python -m pip install dist/*.whl
49
+ gapit --version
50
+ gapit schema report > /dev/null
51
+ gapit db path --json > /dev/null
52
+
53
+ - name: Publish to PyPI
54
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -23,8 +23,8 @@ are we?** A modern, typed, testable Python tool that:
23
23
  - **Environment manager**: [pixi](https://pixi.sh) (conda-forge channel). Never use pip/conda
24
24
  directly; add dependencies to `pixi.toml` (`pixi add <pkg>` for conda, `pixi add --pypi <pkg>`
25
25
  for PyPI).
26
- - **Python**: 3.14 in the pixi dev env (current stable); the package declares
27
- `requires-python = ">=3.11"` and CI tests 3.11 / 3.13 / 3.14.
26
+ - **Python**: 3.12 in the pixi dev env; the package declares
27
+ `requires-python = ">=3.12,<3.13"` and CI tests Python 3.12.
28
28
  - **External binaries**: BLAST+ (`blastn`, `blastx`, `makeblastdb`, `blastdbcmd`) and `minimap2`
29
29
  (FASTQ read screening, SPEC.md §10), all from conda-forge/bioconda. Invoked only via `subprocess`
30
30
  with an argument list — never `shell=True`. Input normalization (fa/fq/gbk/embl, gz/bz2) is
@@ -33,6 +33,8 @@ are we?** A modern, typed, testable Python tool that:
33
33
  `parity` pixi env (prepend `.pixi/envs/parity/bin` to PATH for the differential test).
34
34
  - **Core libraries**: `click` (CLI), `pydantic` v2 (data models / JSON schema), `rich` (terminal
35
35
  output). No biopython — FASTA I/O is a small streaming parser we own.
36
+ - **Optional engine**: `gseek` (`gapit[gseek]`, Python 3.12) behind `GAPIT_ENGINE`;
37
+ `legacy` remains the default and needs no gseek import.
36
38
  - **Quality gates**: `ruff` (lint + format), `basedpyright` (strict mode), `pytest`.
37
39
 
38
40
  ### Commands (pixi tasks)
@@ -40,6 +42,7 @@ are we?** A modern, typed, testable Python tool that:
40
42
  ```bash
41
43
  pixi run lint # ruff check
42
44
  pixi run fmt # ruff format
45
+ pixi run fmt-check # ruff format --check
43
46
  pixi run typecheck # basedpyright --strict
44
47
  pixi run test # pytest (unit, offline)
45
48
  pixi run gapit # the CLI itself
@@ -54,23 +57,27 @@ Every change must leave `lint`, `typecheck`, and `test` green.
54
57
  ```
55
58
  gapit/
56
59
  ├── AGENTS.md # this file
57
- ├── PLAN.md # development roadmap (phase-gated)
60
+ ├── CONTRIBUTING.md # contributor workflow and gates
61
+ ├── SECURITY.md # trust boundaries + vulnerability reporting
62
+ ├── CITATION.cff # citation metadata
63
+ ├── PLAN.md # historical development roadmap
58
64
  ├── SPEC.md # frozen contract for the baseline surface (distilled from abricate)
59
65
  ├── pixi.toml
60
66
  ├── recipe/
61
67
  │ └── meta.yaml # conda recipe (submission deferred)
62
68
  ├── .github/workflows/
63
- │ └── ci.yml # gates matrix 3.11/3.13/3.14 + parity job
69
+ │ └── ci.yml # gates matrix Python 3.12 + parity job
64
70
  ├── src/gapit/
65
71
  │ ├── __init__.py
66
- │ ├── cli.py # typer entrypoint: screen / summary / db / setupdb / schema / mcp
67
- │ ├── config.py # datadir resolution, defaults, env vars
72
+ │ ├── cli.py # click entrypoint: screen / summary / db / setupdb / schema / mcp
73
+ │ ├── config.py # datadir resolution, first-run bootstrap, defaults, env vars
68
74
  │ ├── dispatch.py # shared CLI dispatch (error envelope → exit codes) + --datadir option + --output target
69
75
  │ ├── proctools.py # external-tool plumbing: argv subprocess runner + stderr notes
70
76
  │ ├── fasta.py # streaming FASTA reader + shared gz/bz2 text opener
71
77
  │ ├── seqconvert.py # native input normalization: fa/fq/gbk/embl (±gz/bz2) → FASTA
72
78
  │ ├── db.py # database discovery, header parsing, makeblastdb wrapper
73
79
  │ ├── dbcodec.py # gapit/v1 tagged-header codec (percent-encoded ids)
80
+ │ ├── db_txn.py # per-db write lock + staging build + rename publish
74
81
  │ ├── records.py # records.jsonl truth store + gapit.manifest/1 provenance
75
82
  │ ├── dbbuild.py # deterministic native-db build pipeline with self-check
76
83
  │ ├── clusterbuild.py # cluster-db build pipeline: GBK/GFF → locus FASTA + features.json + typing copy
@@ -100,19 +107,23 @@ gapit/
100
107
  │ ├── paf.py # PAF row parsing + interval arithmetic (minimap2 output boundary)
101
108
  │ ├── report.py # Report model: the canonical in-memory result
102
109
  │ ├── engines.py # shared OutputFormat / AlignerEnum (leaf module for the three engines)
110
+ │ ├── gseek_engine.py # optional gseek bridge (legacy/gseek/shadow) for BLAST/minimap2
111
+ │ ├── progress.py # stderr-bound rich batch progress bar
103
112
  │ ├── screening.py # blastn screen use-case + the shared run_screen dispatcher
104
113
  │ ├── screening_cluster.py # cluster screen use-case: kind guards, typing wiring, rendering
105
114
  │ ├── screening_reads.py # minimap2 use-cases: --r1/--r2 reads + --aligner minimap2 assemblies
115
+ │ ├── screening_reads_positional.py # positional FASTQ wildcard: pairing + per-sample screens
106
116
  │ ├── typing_input.py # `gapit typing` input: screen TSV/CSV → per-FILE folded GeneCalls
107
117
  │ ├── typing_ops.py # `gapit typing` use-case: resolve db, run the engine, render
108
118
  │ ├── reads.py # FASTQ mode: minimap2 PAF parsing, coverage breadth/depth, presence
119
+ │ ├── readpairs.py # positional FASTQ filename → sample/lane inference
109
120
  │ ├── summary.py # summary core: parse report tables into a gene matrix
110
121
  │ ├── cmd_screen.py # `gapit screen` CLI (registered from cli.py)
111
122
  │ ├── cmd_screen_positionals.py # screen positional guard: db-name-as-file usage error
112
123
  │ ├── cmd_screen_reads_args.py # reads-mode CLI arg rules (comma split + flag rejects)
113
124
  │ ├── cmd_summary.py # `gapit summary` CLI (registered from cli.py)
114
125
  │ ├── cmd_typing.py # `gapit typing` CLI (registered from cli.py)
115
- │ ├── cmd_db.py # `gapit db` command group (fetch | list; registers the subcommands)
126
+ │ ├── cmd_db.py # `gapit db` command group (fetch/path/list/build/install/search/outdated)
116
127
  │ ├── cmd_db_install.py # `gapit db install`: SHA256-verified local-file install
117
128
  │ ├── cmd_db_build.py # `gapit db build` CLI (custom FASTA → native db)
118
129
  │ ├── cmd_db_search.py # `gapit db search` CLI (records.jsonl lookup)
@@ -123,8 +134,10 @@ gapit/
123
134
  │ ├── errors.py # typed errors + JSON error envelope
124
135
  │ ├── formats/
125
136
  │ │ ├── tsv.py # abricate-compatible TSV/CSV (phenotype-free in every typing version)
137
+ │ │ ├── csvutil.py # CSV RFC 4180 + TSV cell sanitization (streaming renderers)
126
138
  │ │ ├── json.py # versioned JSON (gapit.report/1 et al.)
127
139
  │ │ ├── reads_json.py # versioned JSON (gapit.reads/1, gapit.reads/2)
140
+ │ │ ├── reads_tsv.py # streaming reads TSV/CSV table
128
141
  │ │ ├── md.py # Markdown (human + agent readable, YAML frontmatter)
129
142
  │ │ ├── cluster.py # gapit.cluster/1 models + JSON/TSV renderers (typed variant)
130
143
  │ │ ├── cluster2.py # gapit.cluster/2 models + JSON/TSV renderers (multi-scheme phenotypes map)
@@ -179,15 +192,15 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
179
192
  byte-identically), then `gapit typing result.tsv [-D|-f|-o|-q]` designates from the screen
180
193
  table (`gapit.typing_result/1`; cluster dbs refuse — their typing rides the screen).
181
194
  No typing MCP tool yet (future work).
182
- - **DB acquisition** `[gapit-extension]`: `gapit db fetch|list|search|outdated|build|install` —
195
+ - **DB acquisition** `[gapit-extension]`: `gapit db fetch|path|list|search|outdated|build|install` —
183
196
  database fetch from the provider catalog (every provider downloads from upstream at fetch
184
197
  time — nothing catalog-side is bundled inside the wheel beyond the sanctioned exceptions,
185
198
  a license-compliance requirement: CARD/VFDB terms are non-commercial and Kaptive is GPL,
186
- so none of those may ride an MIT distribution; the sanctioned exceptions are the six
199
+ so none of those may ride an MIT distribution; the sanctioned exceptions are the seven
187
200
  content-provenance-audited bundles under `src/gapit/data/dbs/` — the public-domain
188
- `ecoli_dec` and `lm_doumith` panels, three permissively licensed provider snapshots
189
- (`ncbi` public domain, `resfinder` Apache-2.0, `ecoh` BSD-3-Clause), and the MIT
190
- `vp_ok` typed cluster snapshot — a pure built-in in the ecoli_dec/lm_doumith pattern: no
201
+ `ecoli_dec`, `lm_doumith`, and `vc_serogroup` panels, three permissively licensed
202
+ provider snapshots (`ncbi` public domain, `resfinder` Apache-2.0, `ecoh` BSD-3-Clause),
203
+ and the MIT `vp_ok` typed cluster snapshot — a pure built-in in the ecoli_dec/lm_doumith pattern: no
191
204
  provider module, no `db fetch`; vpautils OAgc+CPSgc merged content, MIT
192
205
  (GPL/NC content is never bundled) — materialized into the datadir on first use via
193
206
  `bundled.py` (gene bundles replay the gene pipeline, the cluster bundle the cluster
@@ -202,11 +215,16 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
202
215
  MIT-licensed `vp_ok` typed cluster bundle (OAgc+CPSgc merged: the committed typing asset
203
216
  installs a 3-scheme `gapit.typing/2` doc so one screen renders `gapit.cluster/2` with
204
217
  the composed `O:K` serotype, zero network from first install), and SHA256-verified
205
- local-file install.
218
+ local-file install. Datadir precedence is `--datadir`, `$GAPIT_DATADIR`,
219
+ `$XDG_DATA_HOME/gapit/db` (absolute XDG only), then `~/.local/share/gapit/db`;
220
+ `gapit db path [--json]` introspects it without creating, while `db list`/`setupdb`
221
+ bootstrap a missing root. See `docs/datadir.md` for the database anatomy, sharing and
222
+ Docker policy.
206
223
  - **MCP** `[gapit-extension]`: `gapit mcp` / `gapit-mcp` stdio server exposing nine tools:
207
224
  read-only `screen` (incl. `aligner minimap2` assembly survey), `screen_reads` (FASTQ via
208
- minimap2), `summary`, `schema`, `db_list`, `db_search`, `db_outdated`, plus the datadir-mutating
209
- `db_fetch` (installs databases from the provider catalog; may download) and `db_build` (writes a custom db);
225
+ minimap2), `summary`, `schema`, `db_search`, `db_outdated`, plus `db_list` (may create the
226
+ empty datadir on first use), and the datadir-mutating `db_fetch` (installs databases from
227
+ the provider catalog; may download) and `db_build` (writes a custom db);
210
228
  tool failures carry the `gapit.error/1` envelope.
211
229
  - **stdout purity**: data on stdout, diagnostics on stderr, always. `--quiet` only affects stderr.
212
230
  - **Self-description**: `gapit --version --json`, `gapit db list --json`, `gapit schema` — an agent
@@ -253,7 +271,7 @@ Growth tiers past the budget — split rather than inflate the ceiling:
253
271
  gene, %identity, %coverage). **From v0.5.0 this is a regression reference for the frozen
254
272
  baseline surface, not a release gate for new work** — new features need not check abricate
255
273
  and may diverge deliberately.
256
- - Full suite + CI matrix 3.11/3.13/3.14; parity byte-diff is opt-in via the `parity` pixi env.
274
+ - Full suite + CI matrix Python 3.12; parity byte-diff is opt-in via the `parity` pixi env.
257
275
  Offline tests stay fast.
258
276
 
259
277
  ## 8. Domain knowledge (abridged; full detail in SPEC.md)
@@ -5,8 +5,128 @@ 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.6.2] - 2026-10-26
9
+
10
+ ### Changed
11
+
12
+ - **Version-only release.** No functional changes since 0.6.1; this release aligns
13
+ the package, pixi lock, docs examples, goldens, CITATION, and conda recipe on the
14
+ requested 0.6.2 version and republishes the 0.6.1 hardening set.
15
+
16
+ ## [0.6.1] - 2026-10-26
17
+
18
+ ### Fixed
19
+
20
+ - **Fresh-install datadir bootstrap.** `gapit db list` (CLI, `--json`, and the MCP
21
+ `db_list` tool) no longer fails with `DATADIR_NOT_FOUND` when the datadir has never
22
+ been created: it bootstraps the resolved root and lists the catalog/bundled rows, so
23
+ a fresh `pip install gapit` can be inspected before any database is installed.
24
+ `gapit setupdb` likewise creates a missing datadir before materializing bundles.
25
+ Commands that consume installed databases keep the strict `DATADIR_NOT_FOUND`
26
+ semantics (bundled-name `screen`/`typing` still bootstrap on first use).
27
+ - **Shared-datadir writes are serialized and published atomically.** Database builds now
28
+ write into a hidden staging directory and swap it into place only after success; a
29
+ per-database `flock` prevents concurrent `db fetch`/`db build` writers from interleaving.
30
+ Hidden staging/backup/lock entries are ignored by database discovery. New datadirs and
31
+ staging directories are private (`0700`). Readers see the old database for the whole
32
+ build, then the new one after the swap (a short rename window remains).
33
+ - **CLI flag routing.** `--all-genes` is now forwarded to the minimap2 assembly
34
+ path, and reads-only flags (`--read-type`, `--min-breadth`, `--all-genes`) are
35
+ usage errors on blastn/cluster modes instead of being silently ignored.
36
+ - **Fragment merging is record-aware.** The merge key now includes database,
37
+ accession, and subject length; zero aligned lengths no longer divide by zero.
38
+ - **Cluster build rejects duplicate IDs.** Duplicate locus IDs and duplicate
39
+ gene IDs within a locus fail `BUILD_INVALID` before any artifact is written.
40
+ - **Typing configuration is table-safe and compose-safe.** Compose schemes need
41
+ at least one placeholder; phenotype/fallback/notes reject tab/CR/LF; malformed
42
+ documents fail as `TYPING_MALFORMED` instead of crashing at screen time.
43
+ - **Table output is delimiter-safe.** TSV cells neutralize embedded tab/CR/LF
44
+ (screen, reads, cluster, summary, typing, db list/search/outdated); product
45
+ tabs and cluster DB names are rejected at build time.
46
+ - **Gene/cluster builds no longer require minimap2.** Its manifest version is
47
+ optional; `makeblastdb_version` now records the actual makeblastdb version.
48
+ BLAST indexes build under a temporary prefix and replace the old index only on
49
+ success.
50
+ - **gseek parity fixes.** Missing gseek binaries map back to
51
+ `MISSING_DEPENDENCY`/exit 3, and the minimap2 index policy cache invalidates
52
+ when the target content changes.
53
+ - **Reads suffix consistency.** `.fastq.gzip`/`.fq.gzip` now pair correctly.
54
+ - **cluster/2 column collisions.** Schemes such as `o_group` and `o` fall back
55
+ to full evidence prefixes, keeping every column unique.
56
+ - **Summary params completeness.** `gapit.summary/1` records `metrics`, so `-ic`
57
+ can be reproduced from the JSON document.
58
+ - **Schema accuracy.** The never-serialized `PhenotypeDetail.winner` is omitted
59
+ from the public cluster schema.
60
+ - **Read/metadata errors are typed.** OSError/UnicodeDecodeError in manifests,
61
+ records, floors, features, bundled metadata, fofn, summary/typing tables is
62
+ wrapped as the documented input/database error.
63
+ - **Archive safety.** ZIP extraction rejects escaping members and caps expanded
64
+ size; plain-HTTP provider warnings survive `--quiet`.
65
+ - **MCP parity.** Protocol version negotiation, CSV formats, and
66
+ `db_build` `kind`/`typing`/`floors` now match the CLI.
67
+ - **Release safety.** The release workflow now runs the full gates, `twine check`,
68
+ and a wheel install smoke test before publishing.
69
+ - **Documentation:** new `docs/datadir.md` (+zh), complete database catalog rows,
70
+ fixed anchors/links, historical `PLAN.md`, synced AGENTS tree, and new
71
+ `CONTRIBUTING.md`/`SECURITY.md`/`CITATION.cff`.
72
+ - **Provider transport.** VFDB and Victors moved to HTTPS after verifying their
73
+ endpoints; BacMet2 remains HTTP-only and keeps the always-on warning.
74
+ - **Shared setupdb locking.** `setupdb` index rebuilds now take the same per-database
75
+ writer lock as fetch/build; gseek's index-policy cache is lock-protected and drops
76
+ stale keys for a replaced target.
77
+ - **GFF coordinate validation.** `end < 1` and `start > end` now raise typed
78
+ `GENE_OUT_OF_BOUNDS` instead of a pydantic `ValidationError`.
79
+ - **`db list` index visibility.** `gapit.dblist/1` entries carry `indexed`, so an
80
+ installed-but-unindexed database is distinguishable from a ready one.
81
+ - **MCP `all_genes`.** The screen/screen_reads tools expose the reads-table flag.
82
+ - **Typing Markdown safety.** Source paths in YAML frontmatter are quoted.
83
+ - **Fuzz/CI hardening.** Added deterministic parser fuzz smoke tests and a weekly
84
+ cache-free CI canary in addition to the release gates.
85
+
86
+ ### Added
87
+
88
+ - **`gapit db path [--json]`.** Prints the effective datadir without creating it;
89
+ `--json` emits `gapit.datadir/1` (`datadir`, `exists`, `source` = `cli|env|xdg|default`).
90
+ - **XDG Base Directory support.** Datadir precedence is now `--datadir`,
91
+ `$GAPIT_DATADIR`, `$XDG_DATA_HOME/gapit/db` (absolute XDG only), then
92
+ `~/.local/share/gapit/db`.
93
+
94
+ ### Changed
95
+
96
+ - **gapit now uses `gseek.compat` for `GAPIT_ENGINE`.** The shared switch
97
+ replaces gapit's duplicate mode parser and shadow fallback; legacy remains
98
+ the default and gapit still owns its result mapping.
99
+
100
+ - **Python 3.12 is now the supported version.** Drop the 3.11/3.13/3.14
101
+ environments from pixi/CI and align the package metadata, recipe, and docs
102
+ with gside/gmlst (`>=3.12,<3.13`).
103
+
104
+ ## [0.6.0] - 2026-10-25
105
+
106
+ ### Added
107
+
108
+ - **Optional gseek engine for BLAST and minimap2.** `GAPIT_ENGINE=legacy|gseek|shadow`
109
+ routes contig/protein screening, reads, and cluster minimap2 through
110
+ [gseek](https://github.com/indexofire/gseek). `legacy` remains the default and is
111
+ retained on every path; `shadow` logs coarse differences and returns the legacy
112
+ result. gseek requires Python >= 3.12 and is available through `gapit[gseek]` or
113
+ the pixi `default` environment.
114
+ - **FASTQ reads parity:** vfdb/card reads/1 and reads/2 are byte-identical to
115
+ legacy on a 3.07M-pair sample. gseek 0.8.1 allows duplicate minimap2 targets
116
+ (VFDB); the bridge uses `index="none"` for CARD's >255-character target names;
117
+ gseek 0.9.0 skips manifest-only query record counts.
118
+
8
119
  ## [0.5.6] - 2026-10-20
9
120
 
121
+ ### Added
122
+
123
+ - **Bundled `vc_serogroup`: V. cholerae O1/O139 serogrouping + ctxA toxigenicity.** A
124
+ gene-kind bundle handed over from gside: `wbeN` (O1 wbe cluster) and `wbfR` (O139 wbf
125
+ cluster) as an exact-set `serogroup` scheme, plus the ctxA toxigenicity marker; O1 and
126
+ O139 exclude each other by construction, so a double call flags a mixed sample. Ships
127
+ from the wheel with zero network (the seventh bundled database), with floors and a
128
+ `gapit.typing/2` document.
129
+
10
130
  ### Changed
11
131
 
12
132
  - **`gapit.cluster/2` TSV/CSV reshaped: per-scheme winner evidence replaces the packed
@@ -0,0 +1,18 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use gapit in research, please cite this software."
3
+ title: "gapit: mass screening of contigs and reads for known genes"
4
+ type: software
5
+ authors:
6
+ - name: "indexofire"
7
+ repository-code: "https://github.com/indexofire/gapit"
8
+ url: "https://indexofire.github.io/gapit/"
9
+ license: MIT
10
+ version: "0.6.2"
11
+ date-released: "2026-10-26"
12
+ keywords:
13
+ - bioinformatics
14
+ - genomics
15
+ - antimicrobial resistance
16
+ - virulence factors
17
+ - BLAST
18
+ - minimap2