OperonDBS 0.8.0__tar.gz → 0.8.3__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 (316) hide show
  1. {operondbs-0.8.0 → operondbs-0.8.3}/.github/workflows/publish.yml +4 -2
  2. {operondbs-0.8.0 → operondbs-0.8.3}/.github/workflows/test.yml +12 -9
  3. {operondbs-0.8.0 → operondbs-0.8.3}/.gitignore +2 -1
  4. {operondbs-0.8.0 → operondbs-0.8.3}/AGENTS.md +110 -22
  5. {operondbs-0.8.0 → operondbs-0.8.3}/MANIFEST.in +3 -2
  6. {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/PKG-INFO +12 -6
  7. {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/SOURCES.txt +29 -6
  8. {operondbs-0.8.0 → operondbs-0.8.3}/PKG-INFO +12 -6
  9. {operondbs-0.8.0 → operondbs-0.8.3}/README.md +11 -5
  10. {operondbs-0.8.0 → operondbs-0.8.3}/README_ZH.md +11 -5
  11. operondbs-0.8.3/docs/conf_common.py +218 -0
  12. operondbs-0.8.3/docs/en/.readthedocs.yaml +29 -0
  13. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/external-analysis.md +13 -3
  14. operondbs-0.8.3/docs/en/conf.py +24 -0
  15. operondbs-0.8.3/docs/en/contributor/defect-tracking.md +71 -0
  16. operondbs-0.8.3/docs/en/contributor/development-testing.md +178 -0
  17. operondbs-0.8.3/docs/en/contributor/documentation-deployment.md +57 -0
  18. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/contributor/index.md +2 -0
  19. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/phylogenetics-workflow.md +1 -1
  20. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/qc-profiles.md +8 -3
  21. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/remote-execution.md +3 -2
  22. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/behaviors-and-limitations.md +29 -41
  23. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-analysis.md +7 -5
  24. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-decisions-reports.md +4 -4
  25. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-tui.md +111 -21
  26. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/index.md +2 -0
  27. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/recipe-fields.md +21 -2
  28. operondbs-0.8.3/docs/en/reference/resolved-issues.md +64 -0
  29. operondbs-0.8.3/docs/locales/README.md +34 -0
  30. operondbs-0.8.3/docs/zh/.readthedocs.yaml +28 -0
  31. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/external-analysis.md +44 -5
  32. operondbs-0.8.3/docs/zh/conf.py +23 -0
  33. operondbs-0.8.3/docs/zh/contributor/defect-tracking.md +55 -0
  34. operondbs-0.8.3/docs/zh/contributor/development-testing.md +163 -0
  35. operondbs-0.8.3/docs/zh/contributor/documentation-deployment.md +57 -0
  36. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/contributor/index.md +2 -0
  37. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/phylogenetics-workflow.md +1 -1
  38. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/qc-profiles.md +15 -5
  39. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/remote-execution.md +11 -3
  40. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/behaviors-and-limitations.md +27 -39
  41. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-analysis.md +20 -5
  42. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-decisions-reports.md +13 -8
  43. operondbs-0.8.3/docs/zh/reference/cli-tui.md +275 -0
  44. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/index.md +2 -0
  45. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/recipe-fields.md +30 -3
  46. operondbs-0.8.3/docs/zh/reference/resolved-issues.md +56 -0
  47. {operondbs-0.8.0 → operondbs-0.8.3}/operon/adapters/ncbi_datasets.py +16 -12
  48. {operondbs-0.8.0 → operondbs-0.8.3}/operon/adapters/timetree.py +4 -3
  49. {operondbs-0.8.0 → operondbs-0.8.3}/operon/classify.py +36 -14
  50. {operondbs-0.8.0 → operondbs-0.8.3}/operon/cli.py +35 -28
  51. {operondbs-0.8.0 → operondbs-0.8.3}/operon/config.py +2 -2
  52. {operondbs-0.8.0 → operondbs-0.8.3}/operon/coverage.py +6 -5
  53. {operondbs-0.8.0 → operondbs-0.8.3}/operon/database.py +53 -38
  54. {operondbs-0.8.0 → operondbs-0.8.3}/operon/demo.py +4 -7
  55. {operondbs-0.8.0 → operondbs-0.8.3}/operon/entity_view.py +9 -9
  56. {operondbs-0.8.0 → operondbs-0.8.3}/operon/environment_capture.py +45 -4
  57. {operondbs-0.8.0 → operondbs-0.8.3}/operon/execution.py +653 -74
  58. {operondbs-0.8.0 → operondbs-0.8.3}/operon/export.py +44 -33
  59. {operondbs-0.8.0 → operondbs-0.8.3}/operon/fanout.py +30 -23
  60. {operondbs-0.8.0 → operondbs-0.8.3}/operon/files.py +89 -15
  61. {operondbs-0.8.0 → operondbs-0.8.3}/operon/import_wizard.py +12 -3
  62. {operondbs-0.8.0 → operondbs-0.8.3}/operon/lifecycle.py +7 -6
  63. {operondbs-0.8.0 → operondbs-0.8.3}/operon/lineage.py +7 -1
  64. {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/__init__.py +21 -18
  65. {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/alignment.py +3 -2
  66. {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/measure.py +7 -7
  67. {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/parsers.py +2 -1
  68. {operondbs-0.8.0 → operondbs-0.8.3}/operon/release.py +33 -6
  69. {operondbs-0.8.0 → operondbs-0.8.3}/operon/remotes.py +40 -17
  70. {operondbs-0.8.0 → operondbs-0.8.3}/operon/reports.py +47 -0
  71. {operondbs-0.8.0 → operondbs-0.8.3}/operon/rules.py +7 -6
  72. {operondbs-0.8.0 → operondbs-0.8.3}/operon/schema.py +3 -2
  73. {operondbs-0.8.0 → operondbs-0.8.3}/operon/sequence_tools.py +3 -2
  74. {operondbs-0.8.0 → operondbs-0.8.3}/operon/shutdown.py +18 -2
  75. operondbs-0.8.3/operon/sql.py +18 -0
  76. {operondbs-0.8.0 → operondbs-0.8.3}/operon/table_import.py +8 -3
  77. {operondbs-0.8.0 → operondbs-0.8.3}/operon/taxonomy.py +6 -5
  78. {operondbs-0.8.0 → operondbs-0.8.3}/operon/timetree.py +36 -14
  79. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tools.py +644 -117
  80. operondbs-0.8.3/operon/tui/actions.py +1225 -0
  81. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/app.py +9 -1
  82. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/app.tcss +179 -1
  83. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/data.py +334 -32
  84. operondbs-0.8.3/operon/tui/parity.py +716 -0
  85. operondbs-0.8.3/operon/tui/screens/analyze.py +435 -0
  86. operondbs-0.8.3/operon/tui/screens/classify.py +102 -0
  87. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/common.py +265 -19
  88. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/config.py +526 -57
  89. operondbs-0.8.3/operon/tui/screens/config_classification.py +666 -0
  90. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/coverage.py +3 -6
  91. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/decisions.py +2 -3
  92. operondbs-0.8.3/operon/tui/screens/derived_ops.py +593 -0
  93. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/entities.py +4 -11
  94. operondbs-0.8.3/operon/tui/screens/environments.py +117 -0
  95. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/files.py +90 -5
  96. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/files_ops.py +55 -14
  97. operondbs-0.8.3/operon/tui/screens/hits.py +180 -0
  98. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/home.py +1 -1
  99. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/import_wizard.py +84 -37
  100. operondbs-0.8.3/operon/tui/screens/labels.py +103 -0
  101. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/publish.py +13 -12
  102. operondbs-0.8.3/operon/tui/screens/run_external.py +236 -0
  103. operondbs-0.8.3/operon/tui/screens/runs.py +633 -0
  104. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/splash.py +7 -3
  105. {operondbs-0.8.0 → operondbs-0.8.3}/operon/utils.py +3 -2
  106. {operondbs-0.8.0 → operondbs-0.8.3}/operon/workflow.py +121 -5
  107. {operondbs-0.8.0 → operondbs-0.8.3}/pyproject.toml +7 -4
  108. {operondbs-0.8.0 → operondbs-0.8.3}/tests/compatibility/test_python_support.py +0 -1
  109. {operondbs-0.8.0 → operondbs-0.8.3}/tests/helpers.py +30 -3
  110. operondbs-0.8.3/tests/integration/test_analysis_array.py +989 -0
  111. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_analysis_resume.py +1 -2
  112. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_analysis_shutdown.py +63 -9
  113. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_analysis_tools.py +6 -7
  114. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_classify_sequences.py +46 -2
  115. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_execution_backends.py +1 -3
  116. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_fanout_analyze.py +32 -2
  117. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_lineage_cascade.py +1 -2
  118. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_ncbi_datasets_adapter.py +30 -36
  119. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_pipeline_and_release.py +1 -3
  120. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_python_packaging.py +17 -6
  121. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_qc_remote_measure.py +1 -2
  122. {operondbs-0.8.0 → operondbs-0.8.3}/tests/regression/test_correctness.py +1 -2
  123. {operondbs-0.8.0 → operondbs-0.8.3}/tests/regression/test_cython_alignment_parity.py +1 -1
  124. {operondbs-0.8.0 → operondbs-0.8.3}/tests/regression/test_cython_parser_parity.py +1 -2
  125. {operondbs-0.8.0 → operondbs-0.8.3}/tests/regression/test_parser_semantics.py +1 -2
  126. operondbs-0.8.3/tests/regression/test_sql_identifier_security.py +124 -0
  127. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_alignment_qc.py +4 -5
  128. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_classify.py +35 -4
  129. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_core_coverage_more.py +10 -4
  130. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_database_edges_more.py +24 -0
  131. operondbs-0.8.3/tests/unit/test_defect_registry.py +121 -0
  132. operondbs-0.8.3/tests/unit/test_defects_cli.py +149 -0
  133. operondbs-0.8.3/tests/unit/test_docs_projects.py +188 -0
  134. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_docs_versions.py +1 -1
  135. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_environment.py +1 -2
  136. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_environment_capture.py +81 -6
  137. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_execution.py +512 -15
  138. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_execution_edges.py +303 -7
  139. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_export.py +62 -0
  140. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_fanout.py +114 -5
  141. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_files_edges.py +187 -4
  142. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_import_backup_show.py +0 -1
  143. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_lifecycle.py +4 -1
  144. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_misc_coverage_more.py +24 -7
  145. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_ncbi_coverage_gaps.py +6 -5
  146. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_parser_edge_paths.py +0 -1
  147. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_qc_and_rules.py +39 -3
  148. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_qc_edges_more.py +2 -3
  149. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_qc_measure.py +1 -2
  150. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_qc_remote_only.py +1 -2
  151. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_remote_taxonomy_more.py +12 -8
  152. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_remote_transport_edges.py +1 -1
  153. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_remotes.py +6 -7
  154. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_remotes_edges.py +10 -11
  155. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_schema_2_10.py +1 -2
  156. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_schema_2_11.py +1 -2
  157. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_schema_2_9.py +1 -2
  158. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_schema_and_metadata.py +1 -2
  159. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_sequence_tools.py +1 -4
  160. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_sequences.py +1 -2
  161. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_shutdown.py +42 -7
  162. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_support_edges.py +0 -1
  163. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_timetree_snapshots.py +70 -0
  164. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tools_edges.py +28 -0
  165. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tools_execution_more.py +4 -1
  166. operondbs-0.8.3/tests/unit/test_tui.py +2250 -0
  167. operondbs-0.8.3/tests/unit/test_tui_analyze.py +952 -0
  168. operondbs-0.8.3/tests/unit/test_tui_cli_parity.py +1233 -0
  169. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_config.py +857 -29
  170. operondbs-0.8.3/tests/unit/test_tui_derived_ops.py +703 -0
  171. operondbs-0.8.3/tests/unit/test_tui_m3_loop.py +273 -0
  172. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_publish.py +206 -2
  173. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_screens_more.py +7 -6
  174. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_splash_terminal.py +8 -1
  175. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_writes.py +320 -0
  176. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_views_release_reports_edges.py +60 -0
  177. operondbs-0.8.0/.readthedocs.yaml +0 -15
  178. operondbs-0.8.0/docs/_static/language-switcher.js +0 -20
  179. operondbs-0.8.0/docs/_static/operon.css +0 -32
  180. operondbs-0.8.0/docs/_templates/layout.html +0 -10
  181. operondbs-0.8.0/docs/conf.py +0 -129
  182. operondbs-0.8.0/docs/en/contributor/development-testing.md +0 -100
  183. operondbs-0.8.0/docs/en/contributor/documentation-deployment.md +0 -36
  184. operondbs-0.8.0/docs/index.md +0 -18
  185. operondbs-0.8.0/docs/zh/contributor/development-testing.md +0 -107
  186. operondbs-0.8.0/docs/zh/contributor/documentation-deployment.md +0 -36
  187. operondbs-0.8.0/docs/zh/reference/cli-tui.md +0 -200
  188. operondbs-0.8.0/operon/tui/actions.py +0 -620
  189. operondbs-0.8.0/operon/tui/screens/runs.py +0 -217
  190. operondbs-0.8.0/tests/unit/test_tui.py +0 -1068
  191. {operondbs-0.8.0 → operondbs-0.8.3}/LICENSE +0 -0
  192. {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/dependency_links.txt +0 -0
  193. {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/entry_points.txt +0 -0
  194. {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/requires.txt +0 -0
  195. {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/top_level.txt +0 -0
  196. {operondbs-0.8.0 → operondbs-0.8.3}/benchmarks/qc_representative_entities.tsv +0 -0
  197. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/extensibility.md +0 -0
  198. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/files-and-storage.md +0 -0
  199. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/index.md +0 -0
  200. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/metadata-and-data-model.md +0 -0
  201. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/overview.md +0 -0
  202. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/qc-and-rules.md +0 -0
  203. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/release-lifecycle.md +0 -0
  204. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/taxonomy-coverage.md +0 -0
  205. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/contributor/pypi-release.md +0 -0
  206. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/contributor/repository-guide.md +0 -0
  207. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/getting-started/daily-workflow.md +0 -0
  208. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/getting-started/first-project.md +0 -0
  209. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/getting-started/index.md +0 -0
  210. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/getting-started/installation.md +0 -0
  211. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/getting-started/quickstart.md +0 -0
  212. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/backup-migration.md +0 -0
  213. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/curation-lifecycle.md +0 -0
  214. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/external-analysis.md +0 -0
  215. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/file-archiving.md +0 -0
  216. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/index.md +0 -0
  217. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/metadata-import.md +0 -0
  218. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/ncbi-datasets.md +0 -0
  219. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/remote-first.md +0 -0
  220. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/remote-storage.md +0 -0
  221. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/taxonomy-coverage.md +0 -0
  222. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/troubleshooting.md +0 -0
  223. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/index.md +0 -0
  224. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/operations/database-compatibility.md +0 -0
  225. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/operations/index.md +0 -0
  226. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/operations/ncbi-recovery-migration.md +0 -0
  227. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/operations/qc-performance.md +0 -0
  228. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/overview.md +0 -0
  229. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-files-qc.md +0 -0
  230. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-project-metadata.md +0 -0
  231. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-remote.md +0 -0
  232. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-taxonomy-lifecycle-admin.md +0 -0
  233. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-workflow.md +0 -0
  234. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/data-model.md +0 -0
  235. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/recipe-overview.md +0 -0
  236. {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/recipe-parsers-examples.md +0 -0
  237. {operondbs-0.8.0 → operondbs-0.8.3}/docs/requirements.txt +0 -0
  238. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/extensibility.md +0 -0
  239. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/files-and-storage.md +0 -0
  240. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/index.md +0 -0
  241. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/metadata-and-data-model.md +0 -0
  242. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/overview.md +0 -0
  243. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/qc-and-rules.md +0 -0
  244. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/release-lifecycle.md +0 -0
  245. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/taxonomy-coverage.md +0 -0
  246. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/contributor/pypi-release.md +0 -0
  247. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/contributor/repository-guide.md +0 -0
  248. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/getting-started/daily-workflow.md +0 -0
  249. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/getting-started/first-project.md +0 -0
  250. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/getting-started/index.md +0 -0
  251. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/getting-started/installation.md +0 -0
  252. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/getting-started/quickstart.md +0 -0
  253. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/backup-migration.md +0 -0
  254. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/curation-lifecycle.md +0 -0
  255. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/external-analysis.md +0 -0
  256. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/file-archiving.md +0 -0
  257. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/index.md +0 -0
  258. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/metadata-import.md +0 -0
  259. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/ncbi-datasets.md +0 -0
  260. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/remote-first.md +0 -0
  261. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/remote-storage.md +0 -0
  262. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/taxonomy-coverage.md +0 -0
  263. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/troubleshooting.md +0 -0
  264. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/index.md +0 -0
  265. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/operations/database-compatibility.md +0 -0
  266. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/operations/index.md +0 -0
  267. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/operations/ncbi-recovery-migration.md +0 -0
  268. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/operations/qc-performance.md +0 -0
  269. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/overview.md +0 -0
  270. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-files-qc.md +0 -0
  271. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-project-metadata.md +0 -0
  272. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-remote.md +0 -0
  273. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-taxonomy-lifecycle-admin.md +0 -0
  274. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-workflow.md +0 -0
  275. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/data-model.md +0 -0
  276. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/recipe-overview.md +0 -0
  277. {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/recipe-parsers-examples.md +0 -0
  278. {operondbs-0.8.0 → operondbs-0.8.3}/operon/__init__.py +0 -0
  279. {operondbs-0.8.0 → operondbs-0.8.3}/operon/__main__.py +0 -0
  280. {operondbs-0.8.0 → operondbs-0.8.3}/operon/adapters/__init__.py +0 -0
  281. {operondbs-0.8.0 → operondbs-0.8.3}/operon/backup.py +0 -0
  282. {operondbs-0.8.0 → operondbs-0.8.3}/operon/environment.py +0 -0
  283. {operondbs-0.8.0 → operondbs-0.8.3}/operon/errors.py +0 -0
  284. {operondbs-0.8.0 → operondbs-0.8.3}/operon/metadata_files.py +0 -0
  285. {operondbs-0.8.0 → operondbs-0.8.3}/operon/ncbi_reconcile.py +0 -0
  286. {operondbs-0.8.0 → operondbs-0.8.3}/operon/profiles.py +0 -0
  287. {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/_alignment.pyx +0 -0
  288. {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/_parsers.pyx +0 -0
  289. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/__init__.py +0 -0
  290. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/assets/splash.png +0 -0
  291. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/assets/splash.rgb.z +0 -0
  292. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/__init__.py +0 -0
  293. {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/splash_terminal.py +0 -0
  294. {operondbs-0.8.0 → operondbs-0.8.3}/setup.cfg +0 -0
  295. {operondbs-0.8.0 → operondbs-0.8.3}/setup.py +0 -0
  296. {operondbs-0.8.0 → operondbs-0.8.3}/tests/__init__.py +0 -0
  297. {operondbs-0.8.0 → operondbs-0.8.3}/tests/compatibility/__init__.py +0 -0
  298. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/__init__.py +0 -0
  299. {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_taxonomy_coverage.py +1 -1
  300. {operondbs-0.8.0 → operondbs-0.8.3}/tests/regression/__init__.py +0 -0
  301. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/__init__.py +0 -0
  302. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_cli_edges.py +0 -0
  303. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_config_workflow_edges.py +0 -0
  304. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_coverage_edges.py +0 -0
  305. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_follow.py +0 -0
  306. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_import_wizard_edges.py +1 -1
  307. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_lineage.py +1 -1
  308. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_ncbi_edge_cases.py +1 -1
  309. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_ncbi_reconcile_edges.py +0 -0
  310. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_recipe_history.py +0 -0
  311. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_rules_schema_edges.py +0 -0
  312. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_table_import_edges.py +0 -0
  313. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_taxonomy_edges.py +0 -0
  314. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_timetree.py +0 -0
  315. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_flows_more.py +0 -0
  316. {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_workflow_cli.py +0 -0
@@ -43,7 +43,9 @@ jobs:
43
43
  python-version: "3.12"
44
44
  - run: python -m pip install --upgrade pip
45
45
  - run: python -m pip install -e '.[docs]'
46
- - run: sphinx-build -W --keep-going -b html docs docs/_build/html
46
+ - run: |
47
+ sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
48
+ sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
47
49
 
48
50
  wheels:
49
51
  strategy:
@@ -71,7 +73,7 @@ jobs:
71
73
  - run: python -m cibuildwheel --output-dir wheelhouse
72
74
  env:
73
75
  CIBW_ARCHS: ${{ matrix.architecture }}
74
- CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-* cp314-*"
76
+ CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-* cp314-* cp315-*"
75
77
  CIBW_SKIP: "*-musllinux_*"
76
78
  CIBW_TEST_COMMAND: >-
77
79
  python -c "import operon; import operon.qc._parsers;
@@ -25,27 +25,30 @@ jobs:
25
25
  cache-dependency-path: pyproject.toml
26
26
  - run: python -m pip install --upgrade pip
27
27
  - run: python -m pip install -e '.[docs]'
28
- - run: sphinx-build -W --keep-going -b html docs docs/_build/html
28
+ - run: |
29
+ sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
30
+ sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
29
31
 
30
32
  pytest:
31
33
  strategy:
32
34
  fail-fast: false
33
35
  matrix:
34
36
  os: [ ubuntu-latest, macos-latest ]
35
- python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
37
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"]
36
38
  runs-on: ${{ matrix.os }}
37
39
  steps:
38
40
  - uses: actions/checkout@v6
39
41
  - uses: actions/setup-python@v7
40
42
  with:
43
+ allow-prereleases: true
44
+ check-latest: true
41
45
  python-version: ${{ matrix.python-version }}
42
46
  cache: pip
43
47
  cache-dependency-path: pyproject.toml
44
- - run: python -m pip install --upgrade pip
45
- - run: python -m pip install -e '.[test]'
46
- - run: python -m pytest -n 2 --dist loadfile
47
- - if: ${{ !cancelled() }}
48
- uses: codecov/codecov-action@v7
48
+ - run: |
49
+ python -m pip install --upgrade pip
50
+ python -m pip install -e '.[test]'
51
+ python -m pytest
52
+ - uses: codacy/codacy-coverage-reporter-action@v1.3.0
49
53
  with:
50
- token: ${{ secrets.CODECOV_TOKEN }}
51
- report_type: test_results
54
+ project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
@@ -29,5 +29,6 @@ htmlcov/
29
29
  /site/
30
30
  /docs/_build/
31
31
  /workflows/
32
- /HPC/
32
+ /others/
33
33
  .matrix/
34
+ cobertura.xml
@@ -26,7 +26,7 @@ principle-to-implementation mapping.
26
26
 
27
27
  Current version markers (must stay consistent across code and docs):
28
28
 
29
- - `operon` 0.8.0 (`pyproject.toml`)
29
+ - `operon` 0.8.3 (`pyproject.toml`)
30
30
  - database schema 2.11 (`operon/database.py`, `SCHEMA_VERSION`)
31
31
  - metadata schema 1.4 (`operon/schema.py`, `METADATA_SCHEMA_VERSION`)
32
32
 
@@ -83,17 +83,48 @@ The project is licensed AGPL-3.0-or-later (`LICENSE` at the repo root).
83
83
  Confirm → background worker → notify + reload or inline error. Phase 3
84
84
  actions in the same module: `import_dataset` (commits wizard drafts
85
85
  through the shared single-transaction `import_wizard._commit`),
86
- `reserve_entity_ids`, `create_release`, `export`, and `run_coverage`
86
+ `reserve_entity_ids`, `create_release`, `export`, `run_coverage`
87
87
  (a below-threshold coverage report returns `exit_code=1` in the result
88
- dict — a warning, not an exception). The
88
+ dict — a warning, not an exception), `preflight_backend`, `run_analysis`
89
+ (backing the AnalyzeModal launched from the Config screen's Run analysis
90
+ button or the Tasks screen's New analysis button; the modal mirrors
91
+ `--backend` — project default / local / slurm / ssh — and preflights the
92
+ selection inline, and cancellation sets the core's cooperative
93
+ `cancel_event`, so a queued Slurm job or array is cancelled with one
94
+ `scancel`), `run_external` (backing the Tasks screen's Run external
95
+ dialog, which mirrors `run-external` field by field and opens the run
96
+ record when it finishes) and `write_analysis_report` (backing the
97
+ Analysis hits browser's Export button: it runs the same read-only query
98
+ and the same renderer as `report analysis --hits --format … --out …`, so
99
+ the file is byte-identical and, like that command, writes no provenance
100
+ rows). Phase 3 also covers the
101
+ derived-artifact loop: `run_classify` (the Config screen's Run classify
102
+ dialog, mirroring `classify-sequences` with the CLI's summary and a re-run
103
+ button), and — on the Files screen — `extract_domains`, `select_sequences`,
104
+ `adopt` and `fanout` (modals in `operon/tui/screens/derived_ops.py`:
105
+ extract/select chain into the adopt dialog with `derived_from` prefilled and
106
+ leave their output unregistered, adopt's manifest mode previews before
107
+ Confirm, and fanout's dry run is a mandatory preflight). Read-only TUI views added for `report analysis --hits` (alignment
108
+ hits with the CLI's filters and columns) and for `sequence_labels` (the
109
+ classify-sequences output: a per-file section in the Files detail plus
110
+ the project-wide label summary behind the Files screen's `l` binding), which
111
+ has no CLI reader at all. The
89
112
  Config screen (`operon/tui/screens/config.py`, nav key `6`) edits
90
- `config/profiles/*.yaml` (kind `qc`) and single recipes inside
113
+ `config/profiles/*.yaml` (kind `qc` and kind `sequence_classification` —
114
+ each kind has its own form, dispatched by the document's own kind, with the
115
+ classification widgets in `operon/tui/screens/config_classification.py`
116
+ and `actions.save_classification_profile` sharing `save_profile`'s version,
117
+ snapshot and rollback machinery; a profile whose conditions nest deeper
118
+ than one `any:`/`not:` level opens read-only) and single recipes inside
91
119
  `config/tools.yaml` through structured control-based forms (no free-text
92
120
  YAML): every save bumps the `version`, records the same content-addressed
93
121
  snapshot the CLI records (`qc_profiles` / `recipe_snapshots`), and
94
122
  restores the previous file bytes on failure; keys the forms do not model
95
123
  are preserved verbatim; history modals restore snapshots into the editor
96
124
  as the next version; tools-check runs in a worker with per-row updates.
125
+ `operon/tui/parity.py` is the CLI/TUI parity registry: every CLI leaf
126
+ command is registered `implemented`/`cli-only`/`planned`, enforced by
127
+ `tests/unit/test_tui_cli_parity.py` (see Conventions).
97
128
  Textual is imported only inside this package, which the `tui` command
98
129
  handler imports lazily.
99
130
  - Other top-level modules by responsibility: `database.py` (SQLite schema
@@ -127,13 +158,23 @@ The project is licensed AGPL-3.0-or-later (`LICENSE` at the repo root).
127
158
  - `docs/` — Sphinx documentation in two mirrored language trees, `docs/en/`
128
159
  and `docs/zh/`, each split into `overview.md`, `getting-started/`,
129
160
  `guides/`, `architecture/`, `reference/`, `operations/`, and
130
- `contributor/`. Built with `docs/conf.py`; published via Read the Docs
131
- (`.readthedocs.yaml`).
161
+ `contributor/`. Each tree is a Sphinx project of its own
162
+ (`docs/<language>/conf.py`, sharing settings from `docs/conf_common.py`) and
163
+ a Read the Docs project of its own, linked there as parent and translation:
164
+ `operonproject` (English) and `operonproject-zh` (Chinese). Read the Docs
165
+ accepts no build-configuration file name other than `.readthedocs.yaml`, so
166
+ each tree carries one next to its `conf.py`
167
+ (`docs/<language>/.readthedocs.yaml`) and the dashboard points the project at
168
+ that path. `docs/locales/` is the catalog directory
169
+ for a future gettext-maintained language; `tests/unit/test_docs_projects.py`
170
+ guards the layout.
132
171
  - `benchmarks/` — representative entity sets for QC performance diagnostics
133
172
  (see `docs/*/operations/qc-performance.md`).
134
173
  - `scripts/` — local developer tooling; `setup-test-matrix.sh` and
135
174
  `run-test-matrix.sh` build and drive the uv-managed Python 3.10–3.14
136
- matrix under .matrix/ (see `docs/*/contributor/development-testing.md`).
175
+ matrix under .matrix/ (see `docs/*/contributor/development-testing.md`);
176
+ `defects.sh` appends to and queries the defect registry (`defects.yml`,
177
+ see "Defect reports" below).
137
178
 
138
179
  ## Setup, test, and build
139
180
 
@@ -152,20 +193,42 @@ python -m pytest tests/unit # by category: unit / integration /
152
193
 
153
194
  python -m pytest --lf -q --no-cov # iterate: last failures, no coverage
154
195
  python -m pytest -n 4 --dist loadfile # parallel full suite (xdist, in the dev/test extras)
155
- scripts/run-test-matrix.sh # whole suite on 3.10-3.14 concurrently
196
+ scripts/run-test-matrix.sh # whole suite on 3.10-3.15 concurrently
156
197
 
157
198
  python setup.py build_ext --inplace # rebuild only the Cython extension
158
199
 
159
- sphinx-build -W --keep-going -b html docs docs/_build/html # strict docs build
200
+ sphinx-build -W --keep-going -b html docs/en docs/_build/en/html # strict build,
201
+ sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html # one per language
160
202
  ```
161
203
 
162
204
  Run the relevant test category after any change; run the full suite before
163
- considering work done. CI (`.github/workflows/test.yml`) runs pytest on
164
- Python 3.10–3.14 and the strict Sphinx build. Releases are published
165
- exclusively to PyPI; see `docs/*/contributor/pypi-release.md`.
205
+ considering work done.
166
206
 
167
- Do not commit or perform other git mutations unless the user explicitly
168
- asks.
207
+ CI (`.github/workflows/test.yml`) runs pytest on Python 3.10–3.15 and the strict
208
+ Sphinx build. Releases are published exclusively to PyPI; see `docs/*/contributor/pypi-release.md`.
209
+
210
+ The project uses `pytest-xdist` to parallel testing. Avoid sharing state between tests
211
+ to prevent unexpected or random test results.
212
+
213
+ > Running `python -m pytest` directly takes approx 35 seconds
214
+ > (auto: 24 workers). Running the local test matrix takes 3 minutes
215
+ > (6 jobs × 4 workers), or 4~5min (6 jobs × 2 workers in default).
216
+ >
217
+ > Measured on Intel Core i7-13700HX (16c24t).
218
+
219
+ ## Git
220
+
221
+ If the user requests or grants permission, do `git commit` after modify.
222
+ Avoid including overly large changes in a single commit. For commit messages,
223
+ follow the pattern used in the last five commits; otherwise, the Conventional
224
+ Commits guidelines.
225
+
226
+ **DO NOT** push any commit or tag unless the user **explicitly** requests that.
227
+
228
+ If times out, assume the user is not present and that a GPG signature
229
+ is required. Add `-c commit.gpgsign=false` behind `git` may help (However,
230
+ re-signing will reset the commit hash, and corrupt the defects.yml. Please
231
+ proceed with caution).
169
232
 
170
233
  ## Conventions
171
234
 
@@ -193,15 +256,34 @@ asks.
193
256
  bytes must raise `ConflictError`; identical bytes must be idempotent.
194
257
  - Manual overrides (e.g. `curate`, forced `set-state`) must always be
195
258
  recorded in the `changes` audit table.
259
+ - CLI-first: new capabilities land in the CLI/core first, and the TUI never
260
+ runs ahead of the CLI. Any change to CLI commands, flags, or the TUI
261
+ surface must update the parity registry `operon/tui/parity.py` in the same
262
+ commit — the parity tests in `tests/unit/test_tui_cli_parity.py` fail
263
+ otherwise. Commands intentionally not offered in the TUI are registered
264
+ `cli-only` with a reason; known gaps are registered `planned` with a
265
+ milestone.
196
266
  - `docs/*/operations/database-compatibility.md` lists migration code that
197
267
  exists only for pre-1.0 databases and is scheduled for removal at the 1.0
198
268
  release; check it before touching `operon/database.py` migrations or the
199
269
  NCBI adapter's schema-upgrade path.
200
- - The `operon.qc` module uses CFFI (specifically, Cython), so static analysis
201
- tools, such as `flake8`, will report "undefined reference" errors (F821).
202
- Using `# noqa: F821` behind the line **ONLY** when importing `operon.qc`
203
- and an F821 error is likely to occur. Globally ignoring F821 is **STRICKLY
204
- PROHIBITED**.
270
+ - Using `ruff` to re-format the code.
271
+
272
+ ## Defect reports
273
+
274
+ Confirmed defects are tracked in the machine-readable registry
275
+ `defects.yml` at the repository root (plus any `defects/*.yml` shards;
276
+ `scripts/defects.sh` appends and queries records). The full process is in
277
+ `docs/*/contributor/defect-tracking.md`; the binding rules are:
278
+
279
+ 1. **Register first.** When an audit or investigation confirms a defect,
280
+ append its `ODR-XXXX` record to `defects.yml` before the fix lands.
281
+ 2. **One commit per defect.** The fix and its regression tests ride in the
282
+ same commit; fill in `fix_commit` when committing.
283
+ 3. **Close the test loop.** Regression tests for a defect carry
284
+ `@pytest.mark.bug("ODR-XXXX")`, and every `fixed`/`verified` record
285
+ lists at least one such test; `tests/unit/test_defect_registry.py`
286
+ validates the registry schema and both directions of this closure.
205
287
 
206
288
  ## Documentation sync
207
289
 
@@ -217,12 +299,15 @@ change:
217
299
  `docs/*/operations/`
218
300
  - Contributor-facing processes → `docs/*/contributor/`; navigation →
219
301
  `docs/*/index.md`
302
+ - The set of language projects → `docs/<language>/conf.py`, its
303
+ `docs/<language>/.readthedocs.yaml`, and the registry in
304
+ `tests/unit/test_docs_projects.py`
220
305
 
221
- Version markers in docs (`operon` 0.8.0, database schema 2.11, metadata
306
+ Version markers in docs (`operon` 0.8.3, database schema 2.11, metadata
222
307
  schema 1.4) must match `pyproject.toml` and the code. Do not write the
223
308
  current values literally in Markdown sources: use the `myst_substitutions`
224
309
  references `{{ operon_version }}`, `{{ db_schema }}`, and
225
- `{{ metadata_schema }}`, which `docs/conf.py` resolves from the single
310
+ `{{ metadata_schema }}`, which `docs/conf_common.py` resolves from the single
226
311
  sources above at build time. Substitutions expand in paragraph text only,
227
312
  never inside code spans or fenced code blocks — examples there use
228
313
  `<version>` placeholders instead. Intentional historical pins stay literal — either on the
@@ -235,6 +320,9 @@ Sphinx-rendered); update the list above when bumping.
235
320
 
236
321
  ## Special Note For Codex/ChatGPT
237
322
 
238
- Due to specific limitations of the sandbox environment, executing certain TUI test code may cause the system to freeze; this often occurs on Codex/ChatGPT. The specific reason is that when this test code runs in the sandbox, it may results a Textual/asyncio cleanup block, and reports "FAIL" due to timeout.
323
+ Due to specific limitations of the sandbox environment, executing certain TUI
324
+ test code may cause the system to freeze; this often occurs on Codex/ChatGPT.
325
+ The specific reason is that when this test code runs in the sandbox, it may
326
+ result a Textual/asyncio cleanup block, and reports "FAIL" due to timeout.
239
327
 
240
328
  If you are Codex/ChatGPT, please execute TUI-related test code OUTSIDE the sandbox.
@@ -4,12 +4,13 @@ include LICENSE
4
4
  include MANIFEST.in
5
5
  include README.md
6
6
  include README_ZH.md
7
- include .readthedocs.yaml
7
+ include docs/en/.readthedocs.yaml
8
+ include docs/zh/.readthedocs.yaml
8
9
  include pyproject.toml
9
10
  include setup.py
10
11
  recursive-include .github *.yml
11
12
  recursive-include benchmarks *.tsv
12
- recursive-include docs *.css *.html *.js *.md *.py *.txt
13
+ recursive-include docs *.css *.html *.js *.md *.po *.py *.txt
13
14
  prune docs/_build
14
15
  recursive-include operon *.py *.pyx *.tcss
15
16
  recursive-include operon/tui/assets *.png *.z *.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OperonDBS
3
- Version: 0.8.0
3
+ Version: 0.8.3
4
4
  Summary: Operon the Database System: Archive, Quality-Control, Organize, Analyze and Release Your Bio-Data
5
5
  Author-email: hyli360 <lihuanyu2003@gmail.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -46,9 +46,14 @@ Requires-Dist: myst-parser<5,>=4.0; extra == "dev"
46
46
  Requires-Dist: sphinx-rtd-theme<4,>=3.0; extra == "dev"
47
47
  Dynamic: license-file
48
48
 
49
- # Operon
49
+ # Operon the Database System
50
50
 
51
- [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](https://codecov.io/gh/HYLi360/Operon)
51
+ [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
52
+ [![RtD badge](https://img.shields.io/badge/Read-the_Document-blue?style=flat)](https://operonproject.readthedocs.io/)
53
+ ![PyPI Version](https://img.shields.io/pypi/v/OperonDBS?link=https%3A%2F%2Fpypi.org%2Fproject%2FOperonDBS%2F)
54
+ ![GitHub commit activity](https://img.shields.io/github/commit-activity/t/HYLi360/Operon?logo=github)
55
+ [![Codacy Code quality Badge](https://app.codacy.com/project/badge/Grade/47d652651ff645ff86fa0646768a08b3)](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
56
+ [![Codacy Coverage Badge](https://app.codacy.com/project/badge/Coverage/47d652651ff645ff86fa0646768a08b3)](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage)
52
57
 
53
58
  A Python-based, **file-based database** designed for large-scale genomic data, used for archiving, quality control, analysis, and deterministic automation.
54
59
 
@@ -88,11 +93,12 @@ python -m pip install -e '.[dev]'
88
93
 
89
94
  ## Documentation
90
95
 
91
- The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). To build the Sphinx site locally:
96
+ The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). Each language is its own Sphinx project; build both without warnings:
92
97
 
93
98
  ```bash
94
99
  python -m pip install -e '.[docs]'
95
- sphinx-build -W --keep-going -b html docs docs/_build/html
100
+ sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
101
+ sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
96
102
  ```
97
103
 
98
- Read the Docs uses the repository's `.readthedocs.yaml` configuration and publishes a language-selection page with mirrored `/en/` and `/zh/` documentation trees.
104
+ Read the Docs publishes two projects linked as parent and translation: `operonproject` (English, `https://operonproject.readthedocs.io/en/latest/`) and `operonproject-zh` (Chinese, `https://operonproject.readthedocs.io/zh-cn/latest/`), each built from its own `docs/<language>/.readthedocs.yaml`.
@@ -1,5 +1,4 @@
1
1
  .gitignore
2
- .readthedocs.yaml
3
2
  AGENTS.md
4
3
  LICENSE
5
4
  MANIFEST.in
@@ -16,12 +15,10 @@ OperonDBS.egg-info/entry_points.txt
16
15
  OperonDBS.egg-info/requires.txt
17
16
  OperonDBS.egg-info/top_level.txt
18
17
  benchmarks/qc_representative_entities.tsv
19
- docs/conf.py
20
- docs/index.md
18
+ docs/conf_common.py
21
19
  docs/requirements.txt
22
- docs/_static/language-switcher.js
23
- docs/_static/operon.css
24
- docs/_templates/layout.html
20
+ docs/en/.readthedocs.yaml
21
+ docs/en/conf.py
25
22
  docs/en/index.md
26
23
  docs/en/overview.md
27
24
  docs/en/architecture/extensibility.md
@@ -33,6 +30,7 @@ docs/en/architecture/overview.md
33
30
  docs/en/architecture/qc-and-rules.md
34
31
  docs/en/architecture/release-lifecycle.md
35
32
  docs/en/architecture/taxonomy-coverage.md
33
+ docs/en/contributor/defect-tracking.md
36
34
  docs/en/contributor/development-testing.md
37
35
  docs/en/contributor/documentation-deployment.md
38
36
  docs/en/contributor/index.md
@@ -75,6 +73,10 @@ docs/en/reference/index.md
75
73
  docs/en/reference/recipe-fields.md
76
74
  docs/en/reference/recipe-overview.md
77
75
  docs/en/reference/recipe-parsers-examples.md
76
+ docs/en/reference/resolved-issues.md
77
+ docs/locales/README.md
78
+ docs/zh/.readthedocs.yaml
79
+ docs/zh/conf.py
78
80
  docs/zh/index.md
79
81
  docs/zh/overview.md
80
82
  docs/zh/architecture/extensibility.md
@@ -86,6 +88,7 @@ docs/zh/architecture/overview.md
86
88
  docs/zh/architecture/qc-and-rules.md
87
89
  docs/zh/architecture/release-lifecycle.md
88
90
  docs/zh/architecture/taxonomy-coverage.md
91
+ docs/zh/contributor/defect-tracking.md
89
92
  docs/zh/contributor/development-testing.md
90
93
  docs/zh/contributor/documentation-deployment.md
91
94
  docs/zh/contributor/index.md
@@ -128,6 +131,7 @@ docs/zh/reference/index.md
128
131
  docs/zh/reference/recipe-fields.md
129
132
  docs/zh/reference/recipe-overview.md
130
133
  docs/zh/reference/recipe-parsers-examples.md
134
+ docs/zh/reference/resolved-issues.md
131
135
  operon/__init__.py
132
136
  operon/__main__.py
133
137
  operon/backup.py
@@ -158,6 +162,7 @@ operon/rules.py
158
162
  operon/schema.py
159
163
  operon/sequence_tools.py
160
164
  operon/shutdown.py
165
+ operon/sql.py
161
166
  operon/table_import.py
162
167
  operon/taxonomy.py
163
168
  operon/timetree.py
@@ -178,27 +183,37 @@ operon/tui/actions.py
178
183
  operon/tui/app.py
179
184
  operon/tui/app.tcss
180
185
  operon/tui/data.py
186
+ operon/tui/parity.py
181
187
  operon/tui/splash.py
182
188
  operon/tui/splash_terminal.py
183
189
  operon/tui/assets/splash.png
184
190
  operon/tui/assets/splash.rgb.z
185
191
  operon/tui/screens/__init__.py
192
+ operon/tui/screens/analyze.py
193
+ operon/tui/screens/classify.py
186
194
  operon/tui/screens/common.py
187
195
  operon/tui/screens/config.py
196
+ operon/tui/screens/config_classification.py
188
197
  operon/tui/screens/coverage.py
189
198
  operon/tui/screens/decisions.py
199
+ operon/tui/screens/derived_ops.py
190
200
  operon/tui/screens/entities.py
201
+ operon/tui/screens/environments.py
191
202
  operon/tui/screens/files.py
192
203
  operon/tui/screens/files_ops.py
204
+ operon/tui/screens/hits.py
193
205
  operon/tui/screens/home.py
194
206
  operon/tui/screens/import_wizard.py
207
+ operon/tui/screens/labels.py
195
208
  operon/tui/screens/publish.py
209
+ operon/tui/screens/run_external.py
196
210
  operon/tui/screens/runs.py
197
211
  tests/__init__.py
198
212
  tests/helpers.py
199
213
  tests/compatibility/__init__.py
200
214
  tests/compatibility/test_python_support.py
201
215
  tests/integration/__init__.py
216
+ tests/integration/test_analysis_array.py
202
217
  tests/integration/test_analysis_resume.py
203
218
  tests/integration/test_analysis_shutdown.py
204
219
  tests/integration/test_analysis_tools.py
@@ -216,6 +231,7 @@ tests/regression/test_correctness.py
216
231
  tests/regression/test_cython_alignment_parity.py
217
232
  tests/regression/test_cython_parser_parity.py
218
233
  tests/regression/test_parser_semantics.py
234
+ tests/regression/test_sql_identifier_security.py
219
235
  tests/unit/__init__.py
220
236
  tests/unit/test_alignment_qc.py
221
237
  tests/unit/test_classify.py
@@ -224,6 +240,9 @@ tests/unit/test_config_workflow_edges.py
224
240
  tests/unit/test_core_coverage_more.py
225
241
  tests/unit/test_coverage_edges.py
226
242
  tests/unit/test_database_edges_more.py
243
+ tests/unit/test_defect_registry.py
244
+ tests/unit/test_defects_cli.py
245
+ tests/unit/test_docs_projects.py
227
246
  tests/unit/test_docs_versions.py
228
247
  tests/unit/test_environment.py
229
248
  tests/unit/test_environment_capture.py
@@ -267,8 +286,12 @@ tests/unit/test_timetree_snapshots.py
267
286
  tests/unit/test_tools_edges.py
268
287
  tests/unit/test_tools_execution_more.py
269
288
  tests/unit/test_tui.py
289
+ tests/unit/test_tui_analyze.py
290
+ tests/unit/test_tui_cli_parity.py
270
291
  tests/unit/test_tui_config.py
292
+ tests/unit/test_tui_derived_ops.py
271
293
  tests/unit/test_tui_flows_more.py
294
+ tests/unit/test_tui_m3_loop.py
272
295
  tests/unit/test_tui_publish.py
273
296
  tests/unit/test_tui_screens_more.py
274
297
  tests/unit/test_tui_splash_terminal.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OperonDBS
3
- Version: 0.8.0
3
+ Version: 0.8.3
4
4
  Summary: Operon the Database System: Archive, Quality-Control, Organize, Analyze and Release Your Bio-Data
5
5
  Author-email: hyli360 <lihuanyu2003@gmail.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -46,9 +46,14 @@ Requires-Dist: myst-parser<5,>=4.0; extra == "dev"
46
46
  Requires-Dist: sphinx-rtd-theme<4,>=3.0; extra == "dev"
47
47
  Dynamic: license-file
48
48
 
49
- # Operon
49
+ # Operon the Database System
50
50
 
51
- [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](https://codecov.io/gh/HYLi360/Operon)
51
+ [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
52
+ [![RtD badge](https://img.shields.io/badge/Read-the_Document-blue?style=flat)](https://operonproject.readthedocs.io/)
53
+ ![PyPI Version](https://img.shields.io/pypi/v/OperonDBS?link=https%3A%2F%2Fpypi.org%2Fproject%2FOperonDBS%2F)
54
+ ![GitHub commit activity](https://img.shields.io/github/commit-activity/t/HYLi360/Operon?logo=github)
55
+ [![Codacy Code quality Badge](https://app.codacy.com/project/badge/Grade/47d652651ff645ff86fa0646768a08b3)](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
56
+ [![Codacy Coverage Badge](https://app.codacy.com/project/badge/Coverage/47d652651ff645ff86fa0646768a08b3)](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage)
52
57
 
53
58
  A Python-based, **file-based database** designed for large-scale genomic data, used for archiving, quality control, analysis, and deterministic automation.
54
59
 
@@ -88,11 +93,12 @@ python -m pip install -e '.[dev]'
88
93
 
89
94
  ## Documentation
90
95
 
91
- The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). To build the Sphinx site locally:
96
+ The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). Each language is its own Sphinx project; build both without warnings:
92
97
 
93
98
  ```bash
94
99
  python -m pip install -e '.[docs]'
95
- sphinx-build -W --keep-going -b html docs docs/_build/html
100
+ sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
101
+ sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
96
102
  ```
97
103
 
98
- Read the Docs uses the repository's `.readthedocs.yaml` configuration and publishes a language-selection page with mirrored `/en/` and `/zh/` documentation trees.
104
+ Read the Docs publishes two projects linked as parent and translation: `operonproject` (English, `https://operonproject.readthedocs.io/en/latest/`) and `operonproject-zh` (Chinese, `https://operonproject.readthedocs.io/zh-cn/latest/`), each built from its own `docs/<language>/.readthedocs.yaml`.
@@ -1,6 +1,11 @@
1
- # Operon
1
+ # Operon the Database System
2
2
 
3
- [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](https://codecov.io/gh/HYLi360/Operon)
3
+ [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
4
+ [![RtD badge](https://img.shields.io/badge/Read-the_Document-blue?style=flat)](https://operonproject.readthedocs.io/)
5
+ ![PyPI Version](https://img.shields.io/pypi/v/OperonDBS?link=https%3A%2F%2Fpypi.org%2Fproject%2FOperonDBS%2F)
6
+ ![GitHub commit activity](https://img.shields.io/github/commit-activity/t/HYLi360/Operon?logo=github)
7
+ [![Codacy Code quality Badge](https://app.codacy.com/project/badge/Grade/47d652651ff645ff86fa0646768a08b3)](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
8
+ [![Codacy Coverage Badge](https://app.codacy.com/project/badge/Coverage/47d652651ff645ff86fa0646768a08b3)](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage)
4
9
 
5
10
  A Python-based, **file-based database** designed for large-scale genomic data, used for archiving, quality control, analysis, and deterministic automation.
6
11
 
@@ -40,11 +45,12 @@ python -m pip install -e '.[dev]'
40
45
 
41
46
  ## Documentation
42
47
 
43
- The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). To build the Sphinx site locally:
48
+ The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). Each language is its own Sphinx project; build both without warnings:
44
49
 
45
50
  ```bash
46
51
  python -m pip install -e '.[docs]'
47
- sphinx-build -W --keep-going -b html docs docs/_build/html
52
+ sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
53
+ sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
48
54
  ```
49
55
 
50
- Read the Docs uses the repository's `.readthedocs.yaml` configuration and publishes a language-selection page with mirrored `/en/` and `/zh/` documentation trees.
56
+ Read the Docs publishes two projects linked as parent and translation: `operonproject` (English, `https://operonproject.readthedocs.io/en/latest/`) and `operonproject-zh` (Chinese, `https://operonproject.readthedocs.io/zh-cn/latest/`), each built from its own `docs/<language>/.readthedocs.yaml`.
@@ -1,6 +1,11 @@
1
- # Operon
1
+ # Operon the Database System
2
2
 
3
- [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](https://codecov.io/gh/HYLi360/Operon)
3
+ [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
4
+ [![RtD badge](https://img.shields.io/badge/Read-the_Document-blue?style=flat)](https://operonproject.readthedocs.io/)
5
+ ![PyPI Version](https://img.shields.io/pypi/v/OperonDBS?link=https%3A%2F%2Fpypi.org%2Fproject%2FOperonDBS%2F)
6
+ ![GitHub commit activity](https://img.shields.io/github/commit-activity/t/HYLi360/Operon?logo=github)
7
+ [![Codacy Code quality Badge](https://app.codacy.com/project/badge/Grade/47d652651ff645ff86fa0646768a08b3)](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
8
+ [![Codacy Coverage Badge](https://app.codacy.com/project/badge/Coverage/47d652651ff645ff86fa0646768a08b3)](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage)
4
9
 
5
10
  一个基于 Python 的、面向大规模基因组数据的**基于文件的数据库**,用于归档、质控、分析与确定性自动化处理。
6
11
 
@@ -38,11 +43,12 @@ python -m pip install -e '.[dev]'
38
43
 
39
44
  ## 文档
40
45
 
41
- 完整文档同时维护[中文](docs/zh/index.md)和[英文](docs/en/index.md)版本。本地构建 Sphinx 站点:
46
+ 完整文档同时维护[中文](docs/zh/index.md)和[英文](docs/en/index.md)版本。每种语言是独立的 Sphinx 工程,两条构建都必须无警告通过:
42
47
 
43
48
  ```bash
44
49
  python -m pip install -e '.[docs]'
45
- sphinx-build -W --keep-going -b html docs docs/_build/html
50
+ sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
51
+ sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
46
52
  ```
47
53
 
48
- Read the Docs 使用仓库根目录的 `.readthedocs.yaml`,发布带语言选择入口及 `/zh/`、`/en/` 镜像目录的文档站点。
54
+ Read the Docs 发布两个互为父项目与翻译的项目:`operonproject`(英文,`https://operonproject.readthedocs.io/en/latest/`)与 `operonproject-zh`(中文,`https://operonproject.readthedocs.io/zh-cn/latest/`),各自从 `docs/<语言>/.readthedocs.yaml` 构建。