symtest-cli 1.4.1__tar.gz → 1.5.1__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 (430) hide show
  1. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/LICENSE +1 -1
  2. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/MANIFEST.in +2 -1
  3. {symtest_cli-1.4.1/src/symtest_cli.egg-info → symtest_cli-1.5.1}/PKG-INFO +25 -44
  4. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/README.md +21 -18
  5. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/docs/design.md +73 -41
  6. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/docs/design_en.md +35 -35
  7. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/docs/user_manual.md +185 -141
  8. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/docs/user_manual_en.md +200 -139
  9. symtest_cli-1.5.1/pyproject.toml +47 -0
  10. symtest_cli-1.5.1/skill/SKILL.md +297 -0
  11. symtest_cli-1.5.1/skill/assets/full_runner_example.py +359 -0
  12. symtest_cli-1.5.1/skill/assets/templates/extract_channels_script.py +77 -0
  13. symtest_cli-1.5.1/skill/assets/templates/my_analysis_comparator.py +80 -0
  14. symtest_cli-1.5.1/skill/assets/templates/my_channel_extractor.py +83 -0
  15. symtest_cli-1.5.1/skill/assets/templates/test_cases_golden_file.json +35 -0
  16. symtest_cli-1.5.1/skill/assets/templates/test_cases_simple.json +18 -0
  17. symtest_cli-1.5.1/skill/assets/templates/test_cases_simple.yaml +12 -0
  18. symtest_cli-1.5.1/skill/assets/templates/test_cases_steps.json +31 -0
  19. symtest_cli-1.5.1/skill/references/field_reference.md +110 -0
  20. symtest_cli-1.5.1/skill/references/user_manual.md +2220 -0
  21. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/__init__.py +11 -2
  22. symtest_cli-1.5.1/src/symtest/cli.py +120 -0
  23. symtest_cli-1.5.1/src/symtest/commands/__init__.py +9 -0
  24. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/commands/compare.py +70 -40
  25. symtest_cli-1.5.1/src/symtest/commands/find.py +275 -0
  26. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/commands/migrate.py +26 -0
  27. symtest_cli-1.4.1/src/symtest/cli.py → symtest_cli-1.5.1/src/symtest/commands/run.py +62 -344
  28. symtest_cli-1.5.1/src/symtest/commands/schema.py +24 -0
  29. symtest_cli-1.5.1/src/symtest/commands/validate.py +80 -0
  30. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/__init__.py +1 -1
  31. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/config_schema.py +42 -8
  32. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/normalize.py +1 -1
  33. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/__init__.py +1 -1
  34. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/base_runner.py +7 -1
  35. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/config_loader.py +2 -2
  36. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/parallel_runner.py +31 -14
  37. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/result.py +1 -1
  38. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/test_case.py +13 -15
  39. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/validation/assertions.py +54 -4
  40. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/validation/validator.py +48 -9
  41. symtest_cli-1.5.1/src/symtest/file_comparator/__init__.py +44 -0
  42. symtest_cli-1.5.1/src/symtest/file_comparator/base_comparator.py +128 -0
  43. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/binary_comparator.py +6 -6
  44. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/csv_comparator.py +3 -4
  45. symtest_cli-1.5.1/src/symtest/file_comparator/extractor_comparator.py +199 -0
  46. symtest_cli-1.5.1/src/symtest/file_comparator/factory.py +354 -0
  47. symtest_cli-1.4.1/src/symtest/file_comparator/base_comparator.py → symtest_cli-1.5.1/src/symtest/file_comparator/file_comparator_base.py +57 -30
  48. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/h5_comparator.py +10 -6
  49. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/json_comparator.py +3 -4
  50. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/result.py +66 -0
  51. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/script_comparator.py +22 -41
  52. symtest_cli-1.5.1/src/symtest/file_comparator/script_extract_comparator.py +160 -0
  53. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/text_comparator.py +2 -2
  54. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/logging_config.py +1 -1
  55. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/reporting/__init__.py +1 -1
  56. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/reporting/diagnosis.py +2 -2
  57. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/__init__.py +1 -1
  58. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/utils/__init__.py +2 -2
  59. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/utils/junit_xml_writer.py +1 -1
  60. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/utils/report_generator.py +93 -19
  61. {symtest_cli-1.4.1 → symtest_cli-1.5.1/src/symtest_cli.egg-info}/PKG-INFO +25 -44
  62. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/SOURCES.txt +30 -41
  63. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/requires.txt +0 -5
  64. symtest_cli-1.5.1/tests/README.md +15 -0
  65. symtest_cli-1.5.1/tests/__init__.py +3 -0
  66. symtest_cli-1.5.1/tests/__pycache__/__init__.cpython-312.pyc +0 -0
  67. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-312-pytest-7.4.4.pyc +0 -0
  68. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-312-pytest-9.0.3.pyc +0 -0
  69. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_csv_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  70. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_csv_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  71. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  72. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  73. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_csv_compare.py +2 -2
  74. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_text_compare.py +8 -1
  75. symtest_cli-1.5.1/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-7.4.4.pyc +0 -0
  76. symtest_cli-1.5.1/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-9.0.3.pyc +0 -0
  77. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/test_parallel_runner.py +63 -0
  78. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-312-pytest-7.4.4.pyc +0 -0
  79. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-312-pytest-9.0.3.pyc +0 -0
  80. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_migrate.cpython-312-pytest-7.4.4.pyc +0 -0
  81. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_migrate.cpython-312-pytest-9.0.3.pyc +0 -0
  82. symtest_cli-1.5.1/tests/unit/commands/__pycache__/test_find.cpython-312-pytest-7.4.4.pyc +0 -0
  83. symtest_cli-1.5.1/tests/unit/commands/__pycache__/test_find.cpython-312-pytest-9.0.3.pyc +0 -0
  84. symtest_cli-1.5.1/tests/unit/commands/test_find.py +344 -0
  85. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_architecture_guard.cpython-312-pytest-7.4.4.pyc +0 -0
  86. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_architecture_guard.cpython-312-pytest-9.0.3.pyc +0 -0
  87. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-312-pytest-7.4.4.pyc +0 -0
  88. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-312-pytest-9.0.3.pyc +0 -0
  89. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_case_env.cpython-312-pytest-7.4.4.pyc +0 -0
  90. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_case_env.cpython-312-pytest-9.0.3.pyc +0 -0
  91. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-312-pytest-7.4.4.pyc +0 -0
  92. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-312-pytest-9.0.3.pyc +0 -0
  93. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader_new_features.cpython-312-pytest-7.4.4.pyc +0 -0
  94. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader_new_features.cpython-312-pytest-9.0.3.pyc +0 -0
  95. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution_new_features.cpython-312-pytest-7.4.4.pyc +0 -0
  96. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution_new_features.cpython-312-pytest-9.0.3.pyc +0 -0
  97. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_model_v2.cpython-312-pytest-7.4.4.pyc +0 -0
  98. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_model_v2.cpython-312-pytest-9.0.3.pyc +0 -0
  99. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_orchestration_accept.cpython-312-pytest-7.4.4.pyc +0 -0
  100. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_orchestration_accept.cpython-312-pytest-9.0.3.pyc +0 -0
  101. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-312-pytest-7.4.4.pyc +0 -0
  102. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-312-pytest-9.0.3.pyc +0 -0
  103. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_sequence_state.cpython-312-pytest-7.4.4.pyc +0 -0
  104. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_sequence_state.cpython-312-pytest-9.0.3.pyc +0 -0
  105. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_architecture_guard.py +6 -6
  106. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_assertions.py +20 -5
  107. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_case_env.py +0 -33
  108. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_model_v2.py +8 -9
  109. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_error_analysis.cpython-312-pytest-7.4.4.pyc +0 -0
  110. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_error_analysis.cpython-312-pytest-9.0.3.pyc +0 -0
  111. symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_extractor_channels.cpython-312-pytest-7.4.4.pyc +0 -0
  112. symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_extractor_channels.cpython-312-pytest-9.0.3.pyc +0 -0
  113. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  114. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  115. symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_plugin_lifecycle.cpython-312-pytest-7.4.4.pyc +0 -0
  116. symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_plugin_lifecycle.cpython-312-pytest-9.0.3.pyc +0 -0
  117. symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
  118. symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
  119. symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_script_extract.cpython-312-pytest-7.4.4.pyc +0 -0
  120. symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_script_extract.cpython-312-pytest-9.0.3.pyc +0 -0
  121. symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-312-pytest-7.4.4.pyc +0 -0
  122. symtest_cli-1.5.1/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-312-pytest-9.0.3.pyc +0 -0
  123. symtest_cli-1.5.1/tests/unit/file_comparator/test_extractor_channels.py +253 -0
  124. symtest_cli-1.5.1/tests/unit/file_comparator/test_plugin_lifecycle.py +420 -0
  125. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_script_comparator.py +10 -9
  126. symtest_cli-1.5.1/tests/unit/file_comparator/test_script_extract.py +187 -0
  127. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_workspace_plugins.py +46 -50
  128. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_cli.py +41 -29
  129. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-312-pytest-7.4.4.pyc +0 -0
  130. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-312-pytest-9.0.3.pyc +0 -0
  131. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/test_report_generator.py +177 -0
  132. symtest_cli-1.4.1/docs/tui_and_config_split_design.md +0 -818
  133. symtest_cli-1.4.1/pyproject.toml +0 -3
  134. symtest_cli-1.4.1/setup.py +0 -75
  135. symtest_cli-1.4.1/src/symtest/commands/__init__.py +0 -9
  136. symtest_cli-1.4.1/src/symtest/file_comparator/__init__.py +0 -10
  137. symtest_cli-1.4.1/src/symtest/file_comparator/factory.py +0 -191
  138. symtest_cli-1.4.1/src/symtest/tui/__init__.py +0 -11
  139. symtest_cli-1.4.1/src/symtest/tui/app.py +0 -90
  140. symtest_cli-1.4.1/src/symtest/tui/controllers/__init__.py +0 -0
  141. symtest_cli-1.4.1/src/symtest/tui/controllers/case_controller.py +0 -336
  142. symtest_cli-1.4.1/src/symtest/tui/screens/__init__.py +0 -0
  143. symtest_cli-1.4.1/src/symtest/tui/screens/case_editor.py +0 -282
  144. symtest_cli-1.4.1/src/symtest/tui/screens/case_list.py +0 -255
  145. symtest_cli-1.4.1/src/symtest/tui/widgets/__init__.py +0 -0
  146. symtest_cli-1.4.1/src/symtest/tui/widgets/case_table.py +0 -113
  147. symtest_cli-1.4.1/src/symtest/tui/widgets/expected_editor.py +0 -159
  148. symtest_cli-1.4.1/src/symtest/tui/widgets/search_bar.py +0 -160
  149. symtest_cli-1.4.1/src/symtest/tui/widgets/steps_editor.py +0 -243
  150. symtest_cli-1.4.1/tests/README.md +0 -25
  151. symtest_cli-1.4.1/tests/__init__.py +0 -3
  152. symtest_cli-1.4.1/tests/__pycache__/__init__.cpython-312.pyc +0 -0
  153. symtest_cli-1.4.1/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-7.4.4.pyc +0 -0
  154. symtest_cli-1.4.1/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-9.0.3.pyc +0 -0
  155. symtest_cli-1.4.1/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
  156. symtest_cli-1.4.1/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
  157. symtest_cli-1.4.1/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-312-pytest-7.4.4.pyc +0 -0
  158. symtest_cli-1.4.1/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-312-pytest-9.0.3.pyc +0 -0
  159. symtest_cli-1.4.1/tests/unit/tui/__init__.py +0 -0
  160. symtest_cli-1.4.1/tests/unit/tui/__pycache__/__init__.cpython-312.pyc +0 -0
  161. symtest_cli-1.4.1/tests/unit/tui/__pycache__/__init__.cpython-313.pyc +0 -0
  162. symtest_cli-1.4.1/tests/unit/tui/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc +0 -0
  163. symtest_cli-1.4.1/tests/unit/tui/__pycache__/conftest.cpython-312-pytest-9.0.3.pyc +0 -0
  164. symtest_cli-1.4.1/tests/unit/tui/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
  165. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_app.cpython-312-pytest-7.4.4.pyc +0 -0
  166. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_app.cpython-312-pytest-9.0.3.pyc +0 -0
  167. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_app.cpython-313-pytest-9.0.2.pyc +0 -0
  168. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_case_controller.cpython-312-pytest-7.4.4.pyc +0 -0
  169. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_case_controller.cpython-312-pytest-9.0.3.pyc +0 -0
  170. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_case_controller.cpython-313-pytest-9.0.2.pyc +0 -0
  171. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_search_functions.cpython-312-pytest-7.4.4.pyc +0 -0
  172. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_search_functions.cpython-312-pytest-9.0.3.pyc +0 -0
  173. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_search_functions.cpython-313-pytest-9.0.2.pyc +0 -0
  174. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_tui_run_test.cpython-312-pytest-7.4.4.pyc +0 -0
  175. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_tui_run_test.cpython-312-pytest-9.0.3.pyc +0 -0
  176. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_tui_run_test.cpython-313-pytest-9.0.2.pyc +0 -0
  177. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_widgets_data.cpython-312-pytest-7.4.4.pyc +0 -0
  178. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_widgets_data.cpython-312-pytest-9.0.3.pyc +0 -0
  179. symtest_cli-1.4.1/tests/unit/tui/__pycache__/test_widgets_data.cpython-313-pytest-9.0.2.pyc +0 -0
  180. symtest_cli-1.4.1/tests/unit/tui/conftest.py +0 -73
  181. symtest_cli-1.4.1/tests/unit/tui/test_app.py +0 -106
  182. symtest_cli-1.4.1/tests/unit/tui/test_case_controller.py +0 -439
  183. symtest_cli-1.4.1/tests/unit/tui/test_search_functions.py +0 -187
  184. symtest_cli-1.4.1/tests/unit/tui/test_tui_run_test.py +0 -384
  185. symtest_cli-1.4.1/tests/unit/tui/test_widgets_data.py +0 -188
  186. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/setup.cfg +0 -0
  187. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/config_io.py +0 -0
  188. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/import_expander.py +0 -0
  189. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/inheritance_expander.py +0 -0
  190. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/config/migrate.py +0 -0
  191. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/execution/__init__.py +0 -0
  192. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/execution/executor.py +0 -0
  193. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/execution/result.py +0 -0
  194. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/history_store.py +0 -0
  195. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/last_run_store.py +0 -0
  196. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/orchestration/__init__.py +0 -0
  197. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/orchestration/accept.py +0 -0
  198. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/orchestration/sequence.py +0 -0
  199. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/orchestration/single.py +0 -0
  200. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/process_worker.py +0 -0
  201. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/sequence_state.py +0 -0
  202. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/setup.py +0 -0
  203. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/types.py +0 -0
  204. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/validation/__init__.py +0 -0
  205. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/core/validation/result.py +0 -0
  206. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/numeric_compare.py +0 -0
  207. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/file_comparator/xml_comparator.py +0 -0
  208. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/config_runner.py +0 -0
  209. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/json_runner.py +0 -0
  210. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/parallel_config_runner.py +0 -0
  211. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/parallel_json_runner.py +0 -0
  212. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/parallel_yaml_runner.py +0 -0
  213. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/runners/yaml_runner.py +0 -0
  214. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest/utils/path_resolver.py +0 -0
  215. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/dependency_links.txt +0 -0
  216. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/entry_points.txt +0 -0
  217. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/top_level.txt +0 -0
  218. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/__init__.cpython-313.pyc +0 -0
  219. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/__init__.cpython-39.pyc +0 -0
  220. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc +0 -0
  221. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-312-pytest-9.0.3.pyc +0 -0
  222. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
  223. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-39-pytest-8.3.4.pyc +0 -0
  224. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-312.pyc +0 -0
  225. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-313.pyc +0 -0
  226. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-39.pyc +0 -0
  227. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/__pycache__/test_setup_module.cpython-312-pytest-7.4.4.pyc +0 -0
  228. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/conftest.py +0 -0
  229. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/demos/h5_filter_demo.py +0 -0
  230. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/demos/manual_report_example.py +0 -0
  231. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/demos/perf_parallel.py +0 -0
  232. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__init__.py +0 -0
  233. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-312.pyc +0 -0
  234. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-313.pyc +0 -0
  235. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-39.pyc +0 -0
  236. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-312-pytest-7.4.4.pyc +0 -0
  237. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-312-pytest-9.0.3.pyc +0 -0
  238. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-313-pytest-9.0.2.pyc +0 -0
  239. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-39-pytest-8.3.4.pyc +0 -0
  240. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/e2e/test_user_flows.py +0 -0
  241. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/circular_config_a.json +0 -0
  242. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/circular_config_b.json +0 -0
  243. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/hourglass_stdout_mismatch.txt +0 -0
  244. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/hourglass_stdout_sample.txt +0 -0
  245. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/inheritance_base.json +0 -0
  246. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/inheritance_chain.json +0 -0
  247. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/inheritance_circular.json +0 -0
  248. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/main_config.json +0 -0
  249. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/circular_config_a.json +0 -0
  250. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/circular_config_b.json +0 -0
  251. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_base.json +0 -0
  252. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_chain.json +0 -0
  253. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_circular.json +0 -0
  254. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/main_config.json +0 -0
  255. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/missing_fields.json +0 -0
  256. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/setup_main.json +0 -0
  257. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/setup_sub.json +0 -0
  258. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_golden_file.json +0 -0
  259. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_simple.json +0 -0
  260. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_simple.yaml +0 -0
  261. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_steps.json +0 -0
  262. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/sub_json_tests.yaml +0 -0
  263. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/sub_text_tests.json +0 -0
  264. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases.json +0 -0
  265. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases.yaml +0 -0
  266. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases1.json +0 -0
  267. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_with_setup.json +0 -0
  268. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_with_setup.yaml +0 -0
  269. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/missing_fields.json +0 -0
  270. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/mock_fail_script.py +0 -0
  271. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/mock_pass_script.py +0 -0
  272. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/setup_main.json +0 -0
  273. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/setup_sub.json +0 -0
  274. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/sub_json_tests.yaml +0 -0
  275. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/sub_text_tests.json +0 -0
  276. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/test_cases.json +0 -0
  277. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/test_cases.yaml +0 -0
  278. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/test_cases1.json +0 -0
  279. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/test_with_setup.json +0 -0
  280. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/fixtures/test_with_setup.yaml +0 -0
  281. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-312-pytest-7.4.4.pyc +0 -0
  282. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-312-pytest-9.0.3.pyc +0 -0
  283. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-313-pytest-9.0.2.pyc +0 -0
  284. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-312-pytest-7.4.4.pyc +0 -0
  285. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-312-pytest-9.0.3.pyc +0 -0
  286. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-313-pytest-9.0.2.pyc +0 -0
  287. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-312-pytest-7.4.4.pyc +0 -0
  288. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-312-pytest-9.0.3.pyc +0 -0
  289. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-313-pytest-9.0.2.pyc +0 -0
  290. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-313-pytest-9.0.2.pyc +0 -0
  291. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  292. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  293. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  294. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  295. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_csv_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  296. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  297. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  298. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  299. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  300. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  301. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  302. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  303. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  304. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  305. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  306. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_xml_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  307. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_xml_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  308. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_xml_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  309. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_binary_compare.py +0 -0
  310. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_h5_compare.py +0 -0
  311. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_json_compare.py +0 -0
  312. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/file_compare/test_xml_compare.py +0 -0
  313. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_depends_on.cpython-312-pytest-7.4.4.pyc +0 -0
  314. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_depends_on.cpython-312-pytest-9.0.3.pyc +0 -0
  315. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-313-pytest-9.0.2.pyc +0 -0
  316. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-39-pytest-8.3.4.pyc +0 -0
  317. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/parallel/test_depends_on.py +0 -0
  318. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-312-pytest-7.4.4.pyc +0 -0
  319. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-312-pytest-9.0.3.pyc +0 -0
  320. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-313-pytest-9.0.2.pyc +0 -0
  321. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-39-pytest-8.3.4.pyc +0 -0
  322. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/path_handling/test_spaces_in_paths.py +0 -0
  323. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/test_history_feature.py +0 -0
  324. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/test_new_cli_features.py +0 -0
  325. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/test_real_command_execution.py +0 -0
  326. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/integration/test_sequence.py +0 -0
  327. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/run_all.py +0 -0
  328. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
  329. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
  330. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
  331. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-313-pytest-9.0.2.pyc +0 -0
  332. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-312-pytest-7.4.4.pyc +0 -0
  333. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-312-pytest-9.0.3.pyc +0 -0
  334. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-313-pytest-9.0.2.pyc +0 -0
  335. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
  336. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
  337. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
  338. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-312-pytest-7.4.4.pyc +0 -0
  339. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-312-pytest-9.0.3.pyc +0 -0
  340. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-313-pytest-9.0.2.pyc +0 -0
  341. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-312-pytest-7.4.4.pyc +0 -0
  342. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-312-pytest-9.0.3.pyc +0 -0
  343. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-313-pytest-9.0.2.pyc +0 -0
  344. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-312-pytest-7.4.4.pyc +0 -0
  345. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-312-pytest-9.0.3.pyc +0 -0
  346. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-313-pytest-9.0.2.pyc +0 -0
  347. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-312-pytest-7.4.4.pyc +0 -0
  348. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-312-pytest-9.0.3.pyc +0 -0
  349. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-313-pytest-9.0.2.pyc +0 -0
  350. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-312-pytest-7.4.4.pyc +0 -0
  351. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-312-pytest-9.0.3.pyc +0 -0
  352. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-313-pytest-9.0.2.pyc +0 -0
  353. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/commands/test_compare_command.py +0 -0
  354. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-313-pytest-9.0.2.pyc +0 -0
  355. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-313-pytest-9.0.2.pyc +0 -0
  356. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader_new_features.cpython-313-pytest-9.0.2.pyc +0 -0
  357. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312-pytest-7.4.4.pyc +0 -0
  358. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312-pytest-9.0.3.pyc +0 -0
  359. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312.pyc +0 -0
  360. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-313-pytest-9.0.2.pyc +0 -0
  361. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution_new_features.cpython-313-pytest-9.0.2.pyc +0 -0
  362. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-312-pytest-7.4.4.pyc +0 -0
  363. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-312-pytest-9.0.3.pyc +0 -0
  364. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-313-pytest-9.0.2.pyc +0 -0
  365. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_last_run_store.cpython-312-pytest-7.4.4.pyc +0 -0
  366. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_last_run_store.cpython-312-pytest-9.0.3.pyc +0 -0
  367. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_last_run_store.cpython-313-pytest-9.0.2.pyc +0 -0
  368. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-313-pytest-9.0.2.pyc +0 -0
  369. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-312-pytest-7.4.4.pyc +0 -0
  370. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-312-pytest-9.0.3.pyc +0 -0
  371. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-313-pytest-9.0.2.pyc +0 -0
  372. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-39-pytest-8.3.4.pyc +0 -0
  373. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-312-pytest-7.4.4.pyc +0 -0
  374. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-312-pytest-9.0.3.pyc +0 -0
  375. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-313-pytest-9.0.2.pyc +0 -0
  376. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-312-pytest-7.4.4.pyc +0 -0
  377. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-312-pytest-9.0.3.pyc +0 -0
  378. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-313-pytest-9.0.2.pyc +0 -0
  379. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_config_loader.py +0 -0
  380. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_config_loader_new_features.py +0 -0
  381. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_execution.py +0 -0
  382. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_execution_new_features.py +0 -0
  383. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_history_store.py +0 -0
  384. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_last_run_store.py +0 -0
  385. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_orchestration_accept.py +0 -0
  386. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_process_worker.py +0 -0
  387. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_sequence_state.py +0 -0
  388. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_setup.py +0 -0
  389. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_validation_error.py +0 -0
  390. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/core/test_xfail.py +0 -0
  391. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/__init__.cpython-312.pyc +0 -0
  392. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_error_analysis.cpython-313-pytest-9.0.2.pyc +0 -0
  393. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_hourglass_tangent_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
  394. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_hourglass_tangent_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
  395. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_hourglass_tangent_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
  396. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_parity.cpython-312-pytest-7.4.4.pyc +0 -0
  397. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_parity.cpython-312-pytest-9.0.3.pyc +0 -0
  398. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
  399. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-313-pytest-9.0.2.pyc +0 -0
  400. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_error_analysis.py +0 -0
  401. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_hourglass_tangent_comparator.py +0 -0
  402. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_numeric_compare.py +0 -0
  403. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_numeric_parity.py +0 -0
  404. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312-pytest-7.4.4.pyc +0 -0
  405. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312-pytest-9.0.3.pyc +0 -0
  406. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312.pyc +0 -0
  407. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-313-pytest-9.0.2.pyc +0 -0
  408. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-39-pytest-8.3.4.pyc +0 -0
  409. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_filter.cpython-312-pytest-7.4.4.pyc +0 -0
  410. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_filter.cpython-312-pytest-9.0.3.pyc +0 -0
  411. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_filter.cpython-313-pytest-9.0.2.pyc +0 -0
  412. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_tag_filter.cpython-312-pytest-7.4.4.pyc +0 -0
  413. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_tag_filter.cpython-312-pytest-9.0.3.pyc +0 -0
  414. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_tag_filter.cpython-313-pytest-9.0.2.pyc +0 -0
  415. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/test_json_yaml_runner.py +0 -0
  416. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/test_test_case_filter.py +0 -0
  417. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/runners/test_test_case_tag_filter.py +0 -0
  418. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_binary_comparator.py +0 -0
  419. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_config_io.py +0 -0
  420. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_h5_comparator.py +0 -0
  421. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_import_expander.py +0 -0
  422. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_inheritance_expander.py +0 -0
  423. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_migrate.py +0 -0
  424. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_result.py +0 -0
  425. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/test_run_all.py +0 -0
  426. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_junit_xml_writer.cpython-312-pytest-7.4.4.pyc +0 -0
  427. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_junit_xml_writer.cpython-312-pytest-9.0.3.pyc +0 -0
  428. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_junit_xml_writer.cpython-313-pytest-9.0.2.pyc +0 -0
  429. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-313-pytest-9.0.2.pyc +0 -0
  430. {symtest_cli-1.4.1 → symtest_cli-1.5.1}/tests/unit/utils/test_junit_xml_writer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 CLI Test Framework Contributors
3
+ Copyright (c) 2024 SymTest Contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,4 +1,5 @@
1
1
  include README.md
2
2
  include LICENSE
3
3
  recursive-include docs *
4
- recursive-include tests *
4
+ recursive-include skill *
5
+ recursive-include tests *
@@ -1,20 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: symtest-cli
3
- Version: 1.4.1
3
+ Version: 1.5.1
4
4
  Summary: Regression testing for CLI applications, with multi-step workflows and numerical file comparison.
5
- Home-page: https://github.com/ozil111/symtest-cli
6
- Author: Xiaotong Wang
7
- Author-email: xiaotongwang98@gmail.com
5
+ Author-email: Xiaotong Wang <xiaotongwang98@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/ozil111/symtest-cli
8
8
  Project-URL: Documentation, https://github.com/ozil111/symtest-cli/blob/main/docs/user_manual.md
9
9
  Project-URL: Source, https://github.com/ozil111/symtest-cli
10
10
  Project-URL: Tracker, https://github.com/ozil111/symtest-cli/issues
11
- Classifier: Programming Language :: Python :: 3
12
- Classifier: License :: OSI Approved :: MIT License
13
- Classifier: Operating System :: OS Independent
14
- Classifier: Development Status :: 4 - Beta
15
- Classifier: Intended Audience :: Developers
16
- Classifier: Topic :: Software Development :: Testing
17
- Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
11
  Requires-Python: >=3.9
19
12
  Description-Content-Type: text/markdown
20
13
  License-File: LICENSE
@@ -23,31 +16,16 @@ Requires-Dist: numpy>=1.21.0; python_version < "3.12"
23
16
  Requires-Dist: numpy>=1.26.0; python_version >= "3.12"
24
17
  Provides-Extra: yaml
25
18
  Requires-Dist: PyYAML>=6.0; extra == "yaml"
26
- Provides-Extra: tui
27
- Requires-Dist: textual>=0.40.0; extra == "tui"
28
19
  Provides-Extra: all
29
20
  Requires-Dist: PyYAML>=6.0; extra == "all"
30
- Requires-Dist: textual>=0.40.0; extra == "all"
31
21
  Provides-Extra: dev
32
22
  Requires-Dist: PyYAML>=6.0; extra == "dev"
33
- Requires-Dist: textual>=0.40.0; extra == "dev"
34
23
  Requires-Dist: pytest>=7.0; extra == "dev"
35
24
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
36
25
  Requires-Dist: pytest-cov>=4.0; extra == "dev"
37
- Dynamic: author
38
- Dynamic: author-email
39
- Dynamic: classifier
40
- Dynamic: description
41
- Dynamic: description-content-type
42
- Dynamic: home-page
43
26
  Dynamic: license-file
44
- Dynamic: project-url
45
- Dynamic: provides-extra
46
- Dynamic: requires-dist
47
- Dynamic: requires-python
48
- Dynamic: summary
49
27
 
50
- # CLI Test Framework
28
+ # SymTest
51
29
 
52
30
  [中文](README_cn.md) | English
53
31
 
@@ -60,10 +38,14 @@ Dynamic: summary
60
38
  > pip install symtest-cli
61
39
  > ```
62
40
 
63
- A feature-focused automated testing framework for command-line applications.
64
- It is built for regression suites that need more than an exit-code check:
65
- multi-step commands, numerical result comparison, large configuration sets,
66
- parallel execution, and CI-ready reports.
41
+ Regression testing for numerical and scientific command-line workflows.
42
+
43
+ Run solvers, compare HDF5/CSV outputs with tolerances, diagnose numerical
44
+ regressions, and rerun only what failed.
45
+
46
+ SymTest can also be used as a general-purpose CLI regression framework:
47
+ multi-step commands, large configuration sets, parallel execution, and
48
+ CI-ready reports.
67
49
 
68
50
  The project grew out of finite-element solver development, where a single test
69
51
  may run several programs, produce HDF5 or CSV results, compare them with
@@ -71,7 +53,7 @@ tolerances, and track execution time across revisions.
71
53
 
72
54
  ## What it solves
73
55
 
74
- CLI Test Framework keeps the execution workflow and its acceptance criteria in
56
+ SymTest keeps the execution workflow and its acceptance criteria in
75
57
  one JSON or YAML configuration:
76
58
 
77
59
  - **Execute workflows** — single commands or fail-fast step sequences, with
@@ -79,8 +61,8 @@ one JSON or YAML configuration:
79
61
  - **Verify results** — return codes, output text and regular expressions, plus
80
62
  text, JSON, CSV, XML, HDF5, binary, and custom-script file comparisons.
81
63
  - **Manage large suites** — split configurations with `import`, reuse templates
82
- with `extends`, filter by name or tag, and inspect cases across files in the
83
- optional TUI.
64
+ with `extends`, filter by name or tag, and locate cases across files with
65
+ `symtest find`.
84
66
  - **Iterate and integrate** — parallel execution, `--last-failed`, step-level
85
67
  `--resume`, runtime history, structured reports, and JUnit XML output.
86
68
 
@@ -95,11 +77,10 @@ Python 3.9 or newer is required.
95
77
  pip install symtest-cli
96
78
  ```
97
79
 
98
- YAML and the TUI are optional:
80
+ YAML support is optional:
99
81
 
100
82
  ```bash
101
83
  pip install "symtest-cli[yaml]"
102
- pip install "symtest-cli[tui]"
103
84
  pip install "symtest-cli[all]"
104
85
  ```
105
86
 
@@ -204,7 +185,7 @@ symtest run solver_tests.json -t long_case --resume
204
185
  `--resume` deliberately trusts that workspace artifacts have not changed
205
186
  between runs.
206
187
 
207
- ## Large test suites and the optional TUI
188
+ ## Large test suites and cross-file search
208
189
 
209
190
  Large suites can be divided into sub-configurations:
210
191
 
@@ -217,12 +198,12 @@ Large suites can be divided into sub-configurations:
217
198
  }
218
199
  ```
219
200
 
220
- The optional TUI provides one searchable view across imported files. It is
221
- intended as an aid for locating cases and reviewing scenario coverage in large
222
- projects, rather than a requirement for normal test execution.
201
+ `symtest find` auto-expands all `import` references and searches across the
202
+ unified case set (substring / fuzzy / regex modes), making it easy to locate
203
+ cases and review scenario coverage in large projects:
223
204
 
224
205
  ```bash
225
- symtest tui main_config.json
206
+ symtest find main_config.json "login"
226
207
  ```
227
208
 
228
209
  ## Parallel execution and resources
@@ -298,9 +279,9 @@ requirement for using the framework.
298
279
  - [User manual](docs/user_manual_en.md)
299
280
  - [Design document](docs/design_en.md)
300
281
  - [Plugin examples](examples/plugins/README.md)
301
- - [AI Skill template](examples/skill/) — import framework knowledge into AI coding
302
- assistants so they can author test cases, acceptance criteria,
303
- and TDD workflows directly
282
+ - [Official AI Skill](skill/) — install this skill into AI coding assistants
283
+ so they can author test cases, acceptance criteria, and TDD workflows
284
+ directly — the recommended entry point for new users
304
285
 
305
286
  ## Development
306
287
 
@@ -1,4 +1,4 @@
1
- # CLI Test Framework
1
+ # SymTest
2
2
 
3
3
  [中文](README_cn.md) | English
4
4
 
@@ -11,10 +11,14 @@
11
11
  > pip install symtest-cli
12
12
  > ```
13
13
 
14
- A feature-focused automated testing framework for command-line applications.
15
- It is built for regression suites that need more than an exit-code check:
16
- multi-step commands, numerical result comparison, large configuration sets,
17
- parallel execution, and CI-ready reports.
14
+ Regression testing for numerical and scientific command-line workflows.
15
+
16
+ Run solvers, compare HDF5/CSV outputs with tolerances, diagnose numerical
17
+ regressions, and rerun only what failed.
18
+
19
+ SymTest can also be used as a general-purpose CLI regression framework:
20
+ multi-step commands, large configuration sets, parallel execution, and
21
+ CI-ready reports.
18
22
 
19
23
  The project grew out of finite-element solver development, where a single test
20
24
  may run several programs, produce HDF5 or CSV results, compare them with
@@ -22,7 +26,7 @@ tolerances, and track execution time across revisions.
22
26
 
23
27
  ## What it solves
24
28
 
25
- CLI Test Framework keeps the execution workflow and its acceptance criteria in
29
+ SymTest keeps the execution workflow and its acceptance criteria in
26
30
  one JSON or YAML configuration:
27
31
 
28
32
  - **Execute workflows** — single commands or fail-fast step sequences, with
@@ -30,8 +34,8 @@ one JSON or YAML configuration:
30
34
  - **Verify results** — return codes, output text and regular expressions, plus
31
35
  text, JSON, CSV, XML, HDF5, binary, and custom-script file comparisons.
32
36
  - **Manage large suites** — split configurations with `import`, reuse templates
33
- with `extends`, filter by name or tag, and inspect cases across files in the
34
- optional TUI.
37
+ with `extends`, filter by name or tag, and locate cases across files with
38
+ `symtest find`.
35
39
  - **Iterate and integrate** — parallel execution, `--last-failed`, step-level
36
40
  `--resume`, runtime history, structured reports, and JUnit XML output.
37
41
 
@@ -46,11 +50,10 @@ Python 3.9 or newer is required.
46
50
  pip install symtest-cli
47
51
  ```
48
52
 
49
- YAML and the TUI are optional:
53
+ YAML support is optional:
50
54
 
51
55
  ```bash
52
56
  pip install "symtest-cli[yaml]"
53
- pip install "symtest-cli[tui]"
54
57
  pip install "symtest-cli[all]"
55
58
  ```
56
59
 
@@ -155,7 +158,7 @@ symtest run solver_tests.json -t long_case --resume
155
158
  `--resume` deliberately trusts that workspace artifacts have not changed
156
159
  between runs.
157
160
 
158
- ## Large test suites and the optional TUI
161
+ ## Large test suites and cross-file search
159
162
 
160
163
  Large suites can be divided into sub-configurations:
161
164
 
@@ -168,12 +171,12 @@ Large suites can be divided into sub-configurations:
168
171
  }
169
172
  ```
170
173
 
171
- The optional TUI provides one searchable view across imported files. It is
172
- intended as an aid for locating cases and reviewing scenario coverage in large
173
- projects, rather than a requirement for normal test execution.
174
+ `symtest find` auto-expands all `import` references and searches across the
175
+ unified case set (substring / fuzzy / regex modes), making it easy to locate
176
+ cases and review scenario coverage in large projects:
174
177
 
175
178
  ```bash
176
- symtest tui main_config.json
179
+ symtest find main_config.json "login"
177
180
  ```
178
181
 
179
182
  ## Parallel execution and resources
@@ -249,9 +252,9 @@ requirement for using the framework.
249
252
  - [User manual](docs/user_manual_en.md)
250
253
  - [Design document](docs/design_en.md)
251
254
  - [Plugin examples](examples/plugins/README.md)
252
- - [AI Skill template](examples/skill/) — import framework knowledge into AI coding
253
- assistants so they can author test cases, acceptance criteria,
254
- and TDD workflows directly
255
+ - [Official AI Skill](skill/) — install this skill into AI coding assistants
256
+ so they can author test cases, acceptance criteria, and TDD workflows
257
+ directly — the recommended entry point for new users
255
258
 
256
259
  ## Development
257
260
 
@@ -1,17 +1,17 @@
1
- # CLI Test Framework 设计文档
1
+ # SymTest 设计文档
2
2
 
3
3
  > **维护原则(单一事实来源)**:本文档不镜像代码结构——不再维护目录树、类签名、
4
4
  > 函数清单、dataclass 字段定义等会随代码漂移的内容。目录结构与 API 以
5
5
  > `src/symtest/` 源码及其 docstring 为准,用法示例见 `examples/`。
6
6
  > 本文档只承载代码里读不出来的设计信息:架构分层、职责边界、关键流程语义、
7
- > 扩展契约、设计决策与核心架构宪法。
7
+ > 扩展契约、设计决策与核心架构不变量。
8
8
 
9
9
  ## 1. 架构总览
10
10
 
11
11
  ```
12
12
  ┌─────────────────────────────────────────────────────────────┐
13
- │ CLI 入口层 symtest run / tui / validate / schema / │
14
- │ compare-files(+ TUI 交互界面) │
13
+ │ CLI 入口层 symtest run / find / validate / schema / │
14
+ │ compare-files │
15
15
  └───────────────────────────┬─────────────────────────────────┘
16
16
  ▼
17
17
  ┌─────────────────────────────────────────────────────────────┐
@@ -32,10 +32,10 @@
32
32
  └─────────────────────────────────────────────────────────────┘
33
33
  ```
34
34
 
35
- 框架分为四层:**CLI 入口层**(含 TUI)、**Runner / Comparator 业务层**、**Config 管线层**、**Core 基础层**。
35
+ 框架分为四层:**CLI 入口层**、**Runner / Comparator 业务层**、**Config 管线层**、**Core 基础层**。
36
36
 
37
- 层与层不是自由组合:跨层数据流与依赖方向受 §10「核心架构宪法」约束,
38
- 新增 feature 请先对照宪法确定归属。
37
+ 层与层不是自由组合:跨层数据流与依赖方向受 §10「架构不变量」约束,
38
+ 新增 feature 请先对照不变量确定归属。
39
39
 
40
40
  ## 2. 模块地图
41
41
 
@@ -49,14 +49,13 @@
49
49
  | `runners/` | Config/JSON/YAML × 顺序/并行 的薄封装运行器 |
50
50
  | `file_comparator/` | 比较器家族 + 工厂 + workspace 插件发现(详见 §6) |
51
51
  | `utils/` | 路径解析、报告生成、JUnit XML 输出 |
52
- | `tui/` | Textual 交互式用例管理(详见 §7) |
53
52
 
54
53
  ### 2.1 入口点
55
54
 
56
55
  | 命令 | 映射 |
57
56
  |---|---|
58
57
  | `symtest run` | `symtest.cli:run_tests` |
59
- | `symtest tui` | `symtest.tui.app:run_tui` |
58
+ | `symtest find` | `symtest.commands.find:run_find` |
60
59
  | `symtest validate` | `symtest.cli:run_validate` |
61
60
  | `symtest schema` | `symtest.cli:run_schema` |
62
61
  | `symtest compare` | `symtest.cli:run_compare` |
@@ -175,33 +174,68 @@ PathResolver 解析(系统命令直通、shell builtin 平台包装、复合
175
174
 
176
175
  ## 6. 文件比较子系统
177
176
 
178
- ### 6.1 比较器分层
177
+ ### 6.1 三泳道比较器架构
179
178
 
180
- - 文本系比较器共享 difflib 行级基底,json / csv / xml 为其结构化特化(键对齐 / 列结构 / DOM 对齐)
181
- - h5 面向科学数据集;binary 流式分块 + LCS 相似度;script 委托外部脚本
182
- - 统一返回 ComparisonResult(identical / differences / error / script command_output),支持 text / json / html 渲染;支持行列窗口范围参数截取后比较
179
+ 所有比较器共享根契约 `ComparatorBase.compare(ctx) -> ComparisonResult`:
180
+ 框架构建 `CompareContext`(workspace / actual / baseline / params / error_analysis);
181
+ `actual`/`baseline` 以及插件 `path_params` 声明的构造参数在**比较器构造之前**
182
+ 按 workspace 统一解析,插件不得自行对 CWD resolve。配置单一事实源:
183
+ 比较器配置只存在于构造器捕获的实例状态,`ctx` 仅承载调用级上下文。
184
+ 三条泳道职责互斥:
183
185
 
184
- ### 6.2 工厂与插件发现
186
+ | 泳道 | 基类 | 契约 | verdict 归属 | 内置实例 |
187
+ |---|---|---|---|---|
188
+ | 文件泳道 | `FileComparator` | `read_content` + `compare_content`(两文件模型,行列窗口、line N 偏移、chunk_size、similarity 均属本泳道) | 插件 | text / json / csv / xml / h5 / binary |
189
+ | 数据泳道 | `ExtractorComparator` | `extract(ctx) -> {channel: ChannelData}`;框架逐通道跑 `compare_numeric`,per-channel 容差(`channels` / `default_channel`),聚合 `ChannelResult` | **框架**(容差语义对 AI 消费端可预期) | script_extract、extractor 插件 |
190
+ | 自主泳道 | 直接继承根 | `compare(ctx)` 全权判定 | 插件 | script、hourglass 式分析插件 |
185
191
 
186
- - `file_type` 取值:`text` / `json` / `csv` / `xml` / `h5` / `binary` / `script`;工厂按类型分发,支持动态注册与全局 reset(测试用)
187
- - 插件发现四处来源:内置 `*_comparator.py` 自动发现、`workspace/comparators/` 自动扫描、`--plugin-dir` CLI 参数、`CLITEST_PLUGIN_DIRS` 环境变量(供进程模式 worker 使用)
188
- - 命名约定:`*_comparator.py` + `*Comparator` 类名
192
+ - 文本系共享 difflib 行级基底,json / csv / xml 为其结构化特化;h5 面向科学数据集;binary 流式分块 + LCS 相似度
193
+ - 统一返回 `ComparisonResult`(identical / differences / error / error_stats / command_output / channels),支持 text / json / html 渲染
194
+ - 数据泳道插件可通过 `ChannelData.extra_stats` 附带自定义误差指标,存放在独立命名空间(`ChannelResult.extra_stats`),不可覆盖框架规范指标;但 verdict 仍由框架容差持有——需要自定 verdict 的走自主泳道
189
195
 
190
- ### 6.3 script 比较协议(对外契约)
196
+ ### 6.2 通道协议(数据泳道)
191
197
 
192
- - 子进程方式执行 `<interpreter> <script> <actual> <baseline>`
198
+ - 通道判定:`identical = all(channels.passed)`;差异 position 带通道前缀(`channel S33`);`error_stats` 按通道名嵌套
199
+ - 内置 `script_extract` 类型:子进程执行用户脚本(零改动接入),脚本 stdout 输出约定 JSON:
200
+
201
+ ```json
202
+ {"channels": {"S11": {"expected": [...], "actual": [...], "extra_stats": {...}}}}
203
+ ```
204
+
205
+ 非零退出、超时、畸形 JSON 一律判为比较 error(绝不静默通过);`actual`/`baseline` 按惯例以 baseline 在前的顺序追加为尾部 argv 槽位(可缺省)
206
+ - 结果粒度:一条 compareSpec = 一条断言;`ComparisonResult.channels` 携带通道级子结果,报告逐通道展示 pass/fail + stats;JSON 输出中通道 differences 按 per-channel 配额截断
207
+
208
+ ### 6.3 工厂与插件发现
209
+
210
+ - `file_type` 取值:`text` / `json` / `csv` / `xml` / `h5` / `binary` / `script` / `script_extract`;工厂按类型分发,支持动态注册与全局 reset(测试用)
211
+ - 插件发现四处来源:内置 `*_comparator.py` 自动发现、`workspace/comparators/` 自动扫描、`--plugin-dir` CLI 参数、`CLITEST_PLUGIN_DIRS` 环境变量(用户声明的输入;框架只读,进程模式 worker 经进程池 initializer 显式接收插件目录,框架从不修改 `os.environ`)
212
+ - 命名约定:`*_comparator.py` + `*Comparator` 类名;可用类属性 `comparator_type` 显式指定类型名(如 `script_extract`);抽象基类自动跳过注册
213
+ - 配置传递与严格校验:`actual`/`baseline`/`type`/`options` 之外的键转发给比较器构造函数(kwargs);构造器参数是**严格**的——未声明的键(拼写错误)在构造时大声失败并给出支持参数清单。`options` 是框架持有的插件配置命名空间(并入构造参数,显式顶层键优先),核心 schema 不为单个插件增加专属字段;`channels`/`default_channel` 属数据泳道框架结构
214
+
215
+ ### 6.4 script 比较协议(自主泳道对外契约)
216
+
217
+ - 子进程方式执行 `<interpreter> <script> <baseline> <actual>`(文件槽位可缺省)
193
218
  - 默认 exit code 0 → 通过;可选 `pass_pattern` / `fail_pattern` 正则匹配 stdout 细化判定
194
219
  - 超时可配
195
220
 
196
- ## 7. TUI 子系统
221
+ ### 6.5 插件公共 API
222
+
223
+ `symtest.file_comparator` 包导出:`ComparatorBase` / `CompareContext` /
224
+ `FileComparator` / `ExtractorComparator` / `ChannelData` / `ChannelResult` /
225
+ `compare_numeric` / `NumericComparisonStats` / `parse_data_filter`。
226
+ 数据泳道插件只需依赖 `ExtractorComparator` + `ChannelData`,数值判定全部复用框架核心。
197
227
 
198
- 基于 Textual 的终端交互界面:App + Controller(load / create / update /
199
- delete / run_single / save 业务动作)+ 列表 / 编辑两屏 + 表格封装、多模式搜索条
200
- (名称 / 命令 / 标签)、expected 编辑器、steps 编辑器。
228
+ ## 7. 用例搜索命令(find)
201
229
 
202
- 快捷键:`q` / Ctrl+Q 退出、`r` 刷新、`e` 编辑、`f` 单跑、`/` 搜索、`a` 新增、`d` 删除、`s` 保存。
230
+ 替代已移除的 TUI 搜索能力:`symtest find` 走与 runner 完全相同的加载路径
231
+ (`load_config` 自动展开 import + 继承解析,`parse_test_cases` 全系统唯一
232
+ 解析器),在展开后的用例集上按三种模式匹配(子串 / 模糊 / 正则,字段覆盖
233
+ name / command / args / tags / description),支持叠加标签过滤与 JSON 输出
234
+ (供 AI / 脚本消费)。退出码沿用 grep 语义:有匹配 0、无匹配 1、错误 2。
203
235
 
204
- TUI 与 runner 共用同一解析器;宽松的展示形态在 TUI 侧自行处理(§10 原则 6)。
236
+ 原 TUI 的另一职责(给不习惯写配置的同事提供图形化定义/修改用例)由官方
237
+ skill(仓库根 `skill/`)承担:AI 编程助手按 skill 知识直接生成/修改
238
+ JSON/YAML 配置,学习成本更低且无交互界面维护负担。
205
239
 
206
240
  ## 8. 扩展点
207
241
 
@@ -210,9 +244,8 @@ TUI 与 runner 共用同一解析器;宽松的展示形态在 TUI 侧自行处
210
244
  | 新配置格式 | `BaseRunner` | 支持新的测试定义格式(如 XML、TOML) |
211
245
  | 自定义 Setup | `BaseSetup` | 数据库初始化、服务启停等 |
212
246
  | 自定义断言 | 扩展 `Assertions` | 特定业务校验逻辑 |
213
- | 新比较器 | `BaseComparator` | 支持新的文件格式比较,放入 `comparators/` 目录自动发现 |
247
+ | 新比较器 | `FileComparator` / `ExtractorComparator` / `ComparatorBase` | 按泳道选择基类(文件格式 / 数据提取+通道 / 全权分析),放入 `comparators/` 目录自动发现 |
214
248
  | 新 Runner | `ParallelRunner` / `BaseRunner` | 自定义并行调度策略 |
215
- | TUI 扩展 | `CaseController` / Widgets | 扩展终端管理界面 |
216
249
 
217
250
  ## 9. 设计决策
218
251
 
@@ -238,17 +271,16 @@ TUI 与 runner 共用同一解析器;宽松的展示形态在 TUI 侧自行处
238
271
  | DAG 依赖调度 | 基于 Kahn 拓扑 + 就绪队列,依赖满足后立即提交;依赖失败级联 skip 下游;无依赖时走 fast path 零开销 |
239
272
  | --update-baseline | 比较失败时自动将实际输出覆盖 baseline,适合批量更新基准 |
240
273
  | next_action_hint 结构化建议 | 失败结果附带下一步操作建议(update_baseline / update_expected / increase_timeout / investigate),便于 AI 消费 |
241
- | TUI 基于 Textual | 利用成熟的终端 UI 框架,提供交互式用例管理 |
274
+ | 移除 TUI,由官方 skill + `symtest find` 替代 | TUI 的两大职责均有更轻替代:定义/修改用例由 AI 编程助手按官方 skill 完成,跨文件搜索由复用同一解析管线的 `find` 命令覆盖;移除后砍掉 textual 重依赖与交互界面维护负担 |
242
275
  | JUnit XML 输出 | 兼容 GitLab CI / Jenkins / CircleCI 等主流 CI 系统的测试报告格式 |
243
276
  | Logging 统一化 | 通过 `logging` 模块集中管理,CLI 入口激活控制台输出,库用户按需启用 |
244
277
 
245
278
  ---
246
279
 
247
- ## 10. 核心架构宪法
280
+ ## 10. 架构不变量
248
281
 
249
- > **地位与效力**:本节自 Symtest 1.4 Phase 0 评审定稿,是本项目的核心架构契约,
250
- > 对所有后续 feature 具有最高约束力——任何功能需求先对照本宪法确定归属,再写代码。
251
- > 修订宪法必须在变更说明中显式指出所放宽/违反的条款及理由。
282
+ > **定位**:本节自 Symtest 1.4 Phase 0 评审定稿。这些不变量定义了模块归属与依赖方向;
283
+ > 新增 feature 应遵守它们,除非变更说明中显式记录了某条不变量为何需要演进。
252
284
 
253
285
  ### 10.1 数据流主线
254
286
 
@@ -326,10 +358,10 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
326
358
 
327
359
  #### 原则 6 — 核心模型不依赖表现层
328
360
 
329
- `core` 绝对不能 import:`cli` / `tui` / `reporter` / AI-specific adapter。
361
+ `core` 绝对不能 import:`cli` / `reporter` / AI-specific adapter。
330
362
 
331
- 解析器全系统唯一:TUI 与 runner 使用同一 parser,不允许存在 "TUI mode 后门"
332
- (如 workspace=None 时放宽校验);宽松形态由 TUI 侧自行处理。
363
+ 解析器全系统唯一:不允许存在宽松解析后门(如 workspace=None 时放宽校验);
364
+ 宽松形态由调用方先 normalize 再调用。
333
365
 
334
366
  ### 10.3 模块依赖方向
335
367
 
@@ -344,9 +376,9 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
344
376
  - `execution` 与 `validation` 互不 import;
345
377
  - `executor` 不得 import `assertions` / validation 侧模块;
346
378
  - `validator` 不得启动被测进程(见原则 3);
347
- - `core` 不得 import `cli` / `tui` / `reporter`。
379
+ - `core` 不得 import `cli` / `reporter`。
348
380
 
349
- ### 10.4 违宪归属速查
381
+ ### 10.4 归属速查
350
382
 
351
383
  任何新需求先问归属:
352
384
 
@@ -358,14 +390,14 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
358
390
  | AI 告诉我下一步该干嘛? | Result consumer / diagnosis |
359
391
 
360
392
  判据:若仍经常出现"这个功能到底放 execution、runner 还是 testcase?"的争论,
361
- 说明宪法没有被正确适用,应回到 10.2 逐条对照。
393
+ 说明不变量没有被正确适用,应回到 10.2 逐条对照。
362
394
 
363
- ### 10.5 宪法可执行化
395
+ ### 10.5 不变量可执行化
364
396
 
365
- 宪法不是纯文档约定,配套 architecture guard 测试并由 CI 强制:
397
+ 这些不变量不只是文档约定,配套 architecture guard 测试并由 CI 强制:
366
398
 
367
399
  - 断言 import 图:如 `execution/executor.py` 的 import 不得出现
368
- `assertions` / `validation`;`core/**` 不得 import `cli` / `tui` /
400
+ `assertions` / `validation`;`core/**` 不得 import `cli` /
369
401
  `reporter`;
370
402
  - guard 测试纳入常规回归套件(`python tests\run_all.py`),违规即失败;
371
403
  - 冲突裁决次序:guard 测试 > 本节文字 > 个人偏好。
@@ -1,4 +1,4 @@
1
- # CLI Test Framework Design Document
1
+ # SymTest Design Document
2
2
 
3
3
  > **Maintenance principle (single source of truth)**: this document does not mirror
4
4
  > code structure — it no longer maintains directory trees, class signatures,
@@ -7,14 +7,14 @@
7
7
  > their docstrings; usage examples live in `examples/`.
8
8
  > This document only carries what cannot be read out of code: architecture
9
9
  > layering, responsibility boundaries, key flow semantics, extension contracts,
10
- > design decisions, and the architecture constitution.
10
+ > design decisions, and the architecture invariants.
11
11
 
12
12
  ## 1. Architecture Overview
13
13
 
14
14
  ```
15
15
  ┌─────────────────────────────────────────────────────────────┐
16
- │ CLI Entry Layer symtest run / tui / validate / schema / │
17
- │ compare-files (+ TUI interface) │
16
+ │ CLI Entry Layer symtest run / find / validate / schema / │
17
+ │ compare-files │
18
18
  └───────────────────────────┬─────────────────────────────────┘
19
19
  ▼
20
20
  ┌─────────────────────────────────────────────────────────────┐
@@ -37,13 +37,13 @@
37
37
  └─────────────────────────────────────────────────────────────┘
38
38
  ```
39
39
 
40
- The framework is divided into four layers: **CLI Entry Layer** (including TUI),
40
+ The framework is divided into four layers: **CLI Entry Layer**,
41
41
  **Runner / Comparator Business Layer**, **Config Pipeline Layer**, and
42
42
  **Core Foundation Layer**.
43
43
 
44
44
  Layers are not free-to-wire: cross-layer data flow and dependency directions are
45
- governed by the §10 Core Architecture Constitution. Resolve feature ownership
46
- against it first.
45
+ governed by the §10 architecture invariants. Resolve feature ownership
46
+ against them first.
47
47
 
48
48
  ## 2. Module Map
49
49
 
@@ -57,14 +57,13 @@ Responsibilities by package (file-level details and public APIs live in source):
57
57
  | `runners/` | Thin wrapper runners: Config/JSON/YAML × sequential/parallel |
58
58
  | `file_comparator/` | Comparator family + factory + workspace plugin discovery (see §6) |
59
59
  | `utils/` | Path resolution, report generation, JUnit XML output |
60
- | `tui/` | Interactive Textual case management (see §7) |
61
60
 
62
61
  ### 2.1 Entry Points
63
62
 
64
63
  | Command | Mapping |
65
64
  |---|---|
66
65
  | `symtest run` | `symtest.cli:run_tests` |
67
- | `symtest tui` | `symtest.tui.app:run_tui` |
66
+ | `symtest find` | `symtest.commands.find:run_find` |
68
67
  | `symtest validate` | `symtest.cli:run_validate` |
69
68
  | `symtest schema` | `symtest.cli:run_schema` |
70
69
  | `symtest compare` | `symtest.cli:run_compare` |
@@ -204,17 +203,21 @@ guarantees they are unmodified.
204
203
  - Default exit code 0 → pass; optional `pass_pattern` / `fail_pattern` regexes refine the verdict on stdout
205
204
  - Timeout configurable
206
205
 
207
- ## 7. TUI Subsystem
206
+ ## 7. Case Search Command (find)
208
207
 
209
- Textual-based terminal UI: App + Controller (load / create / update / delete /
210
- run_single / save actions) + list/edit screens + table wrapper, multi-mode
211
- search bar (name / command / tag), expected editor, steps editor.
208
+ Replaces the search capability of the retired TUI: `symtest find` goes through
209
+ exactly the same loading path as the runners (`load_config` auto-expands
210
+ imports + resolves inheritance; `parse_test_cases` is the single system-wide
211
+ parser), then matches cases in three modes (substring / fuzzy / regex, across
212
+ name / command / args / tags / description) with optional tag filtering and
213
+ JSON output (for AI / scripts). Exit codes follow grep semantics: 0 = match,
214
+ 1 = no match, 2 = error.
212
215
 
213
- Key bindings: `q` / Ctrl+Q quit, `r` refresh, `e` edit, `f` run single, `/`
214
- search, `a` add, `d` delete, `s` save.
215
-
216
- TUI and runners share the same parser; relaxed display shapes are handled on the
217
- TUI side itself (§10 Principle 6).
216
+ The TUI's other responsibility (graphical case authoring/editing for people
217
+ unfamiliar with writing configs) is now covered by the official skill
218
+ (`skill/` at the repository root): AI coding assistants author/modify
219
+ JSON/YAML configs directly from skill knowledge, with lower learning cost and
220
+ no interactive UI maintenance burden.
218
221
 
219
222
  ## 8. Extension Points
220
223
 
@@ -225,7 +228,6 @@ TUI side itself (§10 Principle 6).
225
228
  | Custom assertions | Extend `Assertions` | Specific business validation logic |
226
229
  | New comparator | `BaseComparator` | Support new file formats; place in `comparators/` for auto-discovery |
227
230
  | New Runner | `ParallelRunner` / `BaseRunner` | Custom parallel scheduling strategies |
228
- | TUI extensions | `CaseController` / Widgets | Extend the terminal management interface |
229
231
 
230
232
  ## 9. Design Decisions
231
233
 
@@ -250,19 +252,17 @@ TUI side itself (§10 Principle 6).
250
252
  | DAG dependency scheduling | Kahn topology + ready queue; submits dependents immediately once deps are satisfied; cascade-skips downstream on dep failure; zero-overhead fast path when no deps declared |
251
253
  | --update-baseline | Automatically overwrites baseline files with actual output on comparison failure; ideal for batch baseline updates |
252
254
  | next_action_hint structured suggestions | Failed results include actionable suggestions (update_baseline / update_expected / increase_timeout / investigate), convenient for AI consumption |
253
- | TUI based on Textual | Leverages a mature terminal UI framework for interactive case management |
255
+ | TUI removed; replaced by official skill + `symtest find` | Both TUI responsibilities have lighter replacements: case authoring/editing is done by AI assistants via the official skill; cross-file search is covered by the `find` command reusing the same parsing pipeline; removes the heavy textual dependency and interactive-UI maintenance burden |
254
256
  | JUnit XML output | Compatible with GitLab CI / Jenkins / CircleCI and other major CI system test report formats |
255
257
  | Centralized logging | All diagnostic messages go through Python's `logging` module; CLI entry activates console output; library users enable as needed |
256
258
 
257
259
  ---
258
260
 
259
- ## 10. Core Architecture Constitution
261
+ ## 10. Architecture Invariants
260
262
 
261
- > **Status and force**: ratified at Symtest 1.4 Phase 0 review. This section is the
262
- > project's core architectural contract with supreme authority over all future
263
- > features — resolve ownership against this constitution before writing any code.
264
- > Amending it requires explicitly naming the clause being relaxed/waived and the
265
- > rationale in the change description.
263
+ > **Status**: established at Symtest 1.4 Phase 0 review. These invariants define
264
+ > module ownership and dependency direction. New features should preserve them
265
+ > unless a change explicitly documents why an invariant must evolve.
266
266
 
267
267
  ### 10.1 Data Flow Spine
268
268
 
@@ -346,11 +346,11 @@ to result consumers (diagnosis) and must not exist in the execution layer.
346
346
 
347
347
  #### Principle 6 — The core model does not depend on presentation
348
348
 
349
- `core` must never import: `cli` / `tui` / `reporter` / AI-specific adapters.
349
+ `core` must never import: `cli` / `reporter` / AI-specific adapters.
350
350
 
351
- One parser for the whole system: TUI and runners use the same parser; a "TUI
352
- mode back door" (e.g., relaxed validation when workspace=None) is forbidden;
353
- relaxed shapes are handled on the TUI side itself.
351
+ One parser for the whole system: no relaxed-parsing back door is allowed
352
+ (e.g., relaxed validation when workspace=None); relaxed shapes are normalized
353
+ by the caller before invoking the parser.
354
354
 
355
355
  ### 10.3 Module Dependency Direction
356
356
 
@@ -365,7 +365,7 @@ Forbidden:
365
365
  - `execution` and `validation` must not import each other;
366
366
  - the `executor` must not import `assertions` / validation-side modules;
367
367
  - the `validator` must not launch the process under test (see Principle 3);
368
- - `core` must not import `cli` / `tui` / `reporter`.
368
+ - `core` must not import `cli` / `reporter`.
369
369
 
370
370
  ### 10.4 Ownership Quick Reference
371
371
 
@@ -379,17 +379,17 @@ For any new requirement, ask ownership first:
379
379
  | AI tells me what to do next? | Result consumer / diagnosis |
380
380
 
381
381
  Litmus test: if arguments like "does this go into execution, the runner, or the
382
- testcase?" keep recurring, the constitution is not being applied correctly — go
382
+ testcase?" keep recurring, the invariants are not being applied correctly — go
383
383
  back to 10.2 and check clause by clause.
384
384
 
385
- ### 10.5 Making the Constitution Enforceable
385
+ ### 10.5 Making the Invariants Enforceable
386
386
 
387
- The constitution is not a documentation-only convention; it comes with
387
+ These invariants are not documentation-only; they come with
388
388
  architecture guard tests enforced by CI:
389
389
 
390
390
  - Assert the import graph: e.g., imports of `execution/executor.py` must not
391
391
  contain `assertions` / `validation`; `core/**` must not import `cli` /
392
- `tui` / `reporter`;
392
+ `reporter`;
393
393
  - Guard tests are part of the regular regression suite
394
394
  (`python tests\run_all.py`); violations fail the build;
395
395
  - Conflict resolution order: guard tests > this text > personal preference.