symtest-cli 1.5.0__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 (424) hide show
  1. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/LICENSE +1 -1
  2. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/MANIFEST.in +2 -1
  3. {symtest_cli-1.5.0/src/symtest_cli.egg-info → symtest_cli-1.5.1}/PKG-INFO +25 -44
  4. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/README.md +21 -18
  5. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/docs/design.md +31 -32
  6. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/docs/design_en.md +35 -35
  7. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/docs/user_manual.md +21 -120
  8. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/docs/user_manual_en.md +24 -117
  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.5.0 → 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.5.0 → symtest_cli-1.5.1}/src/symtest/commands/compare.py +43 -25
  25. symtest_cli-1.5.1/src/symtest/commands/find.py +275 -0
  26. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/commands/migrate.py +26 -0
  27. symtest_cli-1.5.0/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.5.0 → symtest_cli-1.5.1}/src/symtest/config/__init__.py +1 -1
  31. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/normalize.py +1 -1
  32. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/__init__.py +1 -1
  33. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/base_runner.py +7 -1
  34. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/config_loader.py +2 -2
  35. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/parallel_runner.py +31 -14
  36. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/result.py +1 -1
  37. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/test_case.py +13 -15
  38. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/validation/assertions.py +4 -2
  39. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/factory.py +25 -12
  40. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/logging_config.py +1 -1
  41. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/reporting/__init__.py +1 -1
  42. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/reporting/diagnosis.py +2 -2
  43. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/__init__.py +1 -1
  44. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/utils/__init__.py +2 -2
  45. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/utils/junit_xml_writer.py +1 -1
  46. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/utils/report_generator.py +13 -2
  47. {symtest_cli-1.5.0 → symtest_cli-1.5.1/src/symtest_cli.egg-info}/PKG-INFO +25 -44
  48. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/SOURCES.txt +18 -41
  49. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/requires.txt +0 -5
  50. symtest_cli-1.5.1/tests/README.md +15 -0
  51. symtest_cli-1.5.1/tests/__init__.py +3 -0
  52. symtest_cli-1.5.1/tests/__pycache__/__init__.cpython-312.pyc +0 -0
  53. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-312-pytest-7.4.4.pyc +0 -0
  54. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-312-pytest-9.0.3.pyc +0 -0
  55. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_csv_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  56. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_csv_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  57. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  58. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  59. symtest_cli-1.5.1/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-7.4.4.pyc +0 -0
  60. symtest_cli-1.5.1/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-9.0.3.pyc +0 -0
  61. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/test_parallel_runner.py +63 -0
  62. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-312-pytest-7.4.4.pyc +0 -0
  63. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-312-pytest-9.0.3.pyc +0 -0
  64. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_migrate.cpython-312-pytest-7.4.4.pyc +0 -0
  65. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_migrate.cpython-312-pytest-9.0.3.pyc +0 -0
  66. symtest_cli-1.5.1/tests/unit/commands/__pycache__/test_find.cpython-312-pytest-7.4.4.pyc +0 -0
  67. symtest_cli-1.5.1/tests/unit/commands/__pycache__/test_find.cpython-312-pytest-9.0.3.pyc +0 -0
  68. symtest_cli-1.5.1/tests/unit/commands/test_find.py +344 -0
  69. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_architecture_guard.cpython-312-pytest-7.4.4.pyc +0 -0
  70. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_architecture_guard.cpython-312-pytest-9.0.3.pyc +0 -0
  71. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-312-pytest-7.4.4.pyc +0 -0
  72. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-312-pytest-9.0.3.pyc +0 -0
  73. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_case_env.cpython-312-pytest-7.4.4.pyc +0 -0
  74. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_case_env.cpython-312-pytest-9.0.3.pyc +0 -0
  75. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-312-pytest-7.4.4.pyc +0 -0
  76. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-312-pytest-9.0.3.pyc +0 -0
  77. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader_new_features.cpython-312-pytest-7.4.4.pyc +0 -0
  78. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader_new_features.cpython-312-pytest-9.0.3.pyc +0 -0
  79. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution_new_features.cpython-312-pytest-7.4.4.pyc +0 -0
  80. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution_new_features.cpython-312-pytest-9.0.3.pyc +0 -0
  81. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_model_v2.cpython-312-pytest-7.4.4.pyc +0 -0
  82. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_model_v2.cpython-312-pytest-9.0.3.pyc +0 -0
  83. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_orchestration_accept.cpython-312-pytest-7.4.4.pyc +0 -0
  84. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_orchestration_accept.cpython-312-pytest-9.0.3.pyc +0 -0
  85. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-312-pytest-7.4.4.pyc +0 -0
  86. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-312-pytest-9.0.3.pyc +0 -0
  87. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_sequence_state.cpython-312-pytest-7.4.4.pyc +0 -0
  88. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_sequence_state.cpython-312-pytest-9.0.3.pyc +0 -0
  89. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_architecture_guard.py +6 -6
  90. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_case_env.py +0 -33
  91. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_model_v2.py +8 -9
  92. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_error_analysis.cpython-312-pytest-7.4.4.pyc +0 -0
  93. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_error_analysis.cpython-312-pytest-9.0.3.pyc +0 -0
  94. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_extractor_channels.cpython-312-pytest-7.4.4.pyc +0 -0
  95. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_extractor_channels.cpython-312-pytest-9.0.3.pyc +0 -0
  96. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  97. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  98. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_plugin_lifecycle.cpython-312-pytest-7.4.4.pyc +0 -0
  99. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_plugin_lifecycle.cpython-312-pytest-9.0.3.pyc +0 -0
  100. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
  101. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
  102. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_script_extract.cpython-312-pytest-7.4.4.pyc +0 -0
  103. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_script_extract.cpython-312-pytest-9.0.3.pyc +0 -0
  104. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-312-pytest-7.4.4.pyc +0 -0
  105. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-312-pytest-9.0.3.pyc +0 -0
  106. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_plugin_lifecycle.py +30 -0
  107. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_workspace_plugins.py +17 -2
  108. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_cli.py +41 -29
  109. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-312-pytest-7.4.4.pyc +0 -0
  110. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-312-pytest-9.0.3.pyc +0 -0
  111. symtest_cli-1.5.0/docs/tui_and_config_split_design.md +0 -818
  112. symtest_cli-1.5.0/pyproject.toml +0 -3
  113. symtest_cli-1.5.0/setup.py +0 -75
  114. symtest_cli-1.5.0/src/symtest/commands/__init__.py +0 -9
  115. symtest_cli-1.5.0/src/symtest/tui/__init__.py +0 -11
  116. symtest_cli-1.5.0/src/symtest/tui/app.py +0 -90
  117. symtest_cli-1.5.0/src/symtest/tui/controllers/__init__.py +0 -0
  118. symtest_cli-1.5.0/src/symtest/tui/controllers/case_controller.py +0 -336
  119. symtest_cli-1.5.0/src/symtest/tui/screens/__init__.py +0 -0
  120. symtest_cli-1.5.0/src/symtest/tui/screens/case_editor.py +0 -282
  121. symtest_cli-1.5.0/src/symtest/tui/screens/case_list.py +0 -255
  122. symtest_cli-1.5.0/src/symtest/tui/widgets/__init__.py +0 -0
  123. symtest_cli-1.5.0/src/symtest/tui/widgets/case_table.py +0 -113
  124. symtest_cli-1.5.0/src/symtest/tui/widgets/expected_editor.py +0 -159
  125. symtest_cli-1.5.0/src/symtest/tui/widgets/search_bar.py +0 -160
  126. symtest_cli-1.5.0/src/symtest/tui/widgets/steps_editor.py +0 -243
  127. symtest_cli-1.5.0/tests/README.md +0 -25
  128. symtest_cli-1.5.0/tests/__init__.py +0 -3
  129. symtest_cli-1.5.0/tests/__pycache__/__init__.cpython-312.pyc +0 -0
  130. symtest_cli-1.5.0/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-7.4.4.pyc +0 -0
  131. symtest_cli-1.5.0/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-312-pytest-9.0.3.pyc +0 -0
  132. symtest_cli-1.5.0/tests/unit/tui/__init__.py +0 -0
  133. symtest_cli-1.5.0/tests/unit/tui/__pycache__/__init__.cpython-312.pyc +0 -0
  134. symtest_cli-1.5.0/tests/unit/tui/__pycache__/__init__.cpython-313.pyc +0 -0
  135. symtest_cli-1.5.0/tests/unit/tui/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc +0 -0
  136. symtest_cli-1.5.0/tests/unit/tui/__pycache__/conftest.cpython-312-pytest-9.0.3.pyc +0 -0
  137. symtest_cli-1.5.0/tests/unit/tui/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
  138. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_app.cpython-312-pytest-7.4.4.pyc +0 -0
  139. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_app.cpython-312-pytest-9.0.3.pyc +0 -0
  140. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_app.cpython-313-pytest-9.0.2.pyc +0 -0
  141. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_case_controller.cpython-312-pytest-7.4.4.pyc +0 -0
  142. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_case_controller.cpython-312-pytest-9.0.3.pyc +0 -0
  143. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_case_controller.cpython-313-pytest-9.0.2.pyc +0 -0
  144. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_search_functions.cpython-312-pytest-7.4.4.pyc +0 -0
  145. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_search_functions.cpython-312-pytest-9.0.3.pyc +0 -0
  146. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_search_functions.cpython-313-pytest-9.0.2.pyc +0 -0
  147. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_tui_run_test.cpython-312-pytest-7.4.4.pyc +0 -0
  148. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_tui_run_test.cpython-312-pytest-9.0.3.pyc +0 -0
  149. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_tui_run_test.cpython-313-pytest-9.0.2.pyc +0 -0
  150. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_widgets_data.cpython-312-pytest-7.4.4.pyc +0 -0
  151. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_widgets_data.cpython-312-pytest-9.0.3.pyc +0 -0
  152. symtest_cli-1.5.0/tests/unit/tui/__pycache__/test_widgets_data.cpython-313-pytest-9.0.2.pyc +0 -0
  153. symtest_cli-1.5.0/tests/unit/tui/conftest.py +0 -73
  154. symtest_cli-1.5.0/tests/unit/tui/test_app.py +0 -106
  155. symtest_cli-1.5.0/tests/unit/tui/test_case_controller.py +0 -439
  156. symtest_cli-1.5.0/tests/unit/tui/test_search_functions.py +0 -187
  157. symtest_cli-1.5.0/tests/unit/tui/test_tui_run_test.py +0 -384
  158. symtest_cli-1.5.0/tests/unit/tui/test_widgets_data.py +0 -188
  159. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/setup.cfg +0 -0
  160. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/config_io.py +0 -0
  161. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/config_schema.py +0 -0
  162. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/import_expander.py +0 -0
  163. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/inheritance_expander.py +0 -0
  164. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/config/migrate.py +0 -0
  165. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/execution/__init__.py +0 -0
  166. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/execution/executor.py +0 -0
  167. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/execution/result.py +0 -0
  168. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/history_store.py +0 -0
  169. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/last_run_store.py +0 -0
  170. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/orchestration/__init__.py +0 -0
  171. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/orchestration/accept.py +0 -0
  172. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/orchestration/sequence.py +0 -0
  173. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/orchestration/single.py +0 -0
  174. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/process_worker.py +0 -0
  175. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/sequence_state.py +0 -0
  176. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/setup.py +0 -0
  177. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/types.py +0 -0
  178. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/validation/__init__.py +0 -0
  179. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/validation/result.py +0 -0
  180. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/core/validation/validator.py +0 -0
  181. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/__init__.py +0 -0
  182. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/base_comparator.py +0 -0
  183. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/binary_comparator.py +0 -0
  184. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/csv_comparator.py +0 -0
  185. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/extractor_comparator.py +0 -0
  186. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/file_comparator_base.py +0 -0
  187. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/h5_comparator.py +0 -0
  188. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/json_comparator.py +0 -0
  189. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/numeric_compare.py +0 -0
  190. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/result.py +0 -0
  191. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/script_comparator.py +0 -0
  192. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/script_extract_comparator.py +0 -0
  193. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/text_comparator.py +0 -0
  194. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/file_comparator/xml_comparator.py +0 -0
  195. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/config_runner.py +0 -0
  196. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/json_runner.py +0 -0
  197. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/parallel_config_runner.py +0 -0
  198. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/parallel_json_runner.py +0 -0
  199. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/parallel_yaml_runner.py +0 -0
  200. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/runners/yaml_runner.py +0 -0
  201. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest/utils/path_resolver.py +0 -0
  202. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/dependency_links.txt +0 -0
  203. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/entry_points.txt +0 -0
  204. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/src/symtest_cli.egg-info/top_level.txt +0 -0
  205. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/__init__.cpython-313.pyc +0 -0
  206. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/__init__.cpython-39.pyc +0 -0
  207. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc +0 -0
  208. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-312-pytest-9.0.3.pyc +0 -0
  209. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
  210. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/conftest.cpython-39-pytest-8.3.4.pyc +0 -0
  211. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-312.pyc +0 -0
  212. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-313.pyc +0 -0
  213. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/run_all.cpython-39.pyc +0 -0
  214. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/__pycache__/test_setup_module.cpython-312-pytest-7.4.4.pyc +0 -0
  215. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/conftest.py +0 -0
  216. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/demos/h5_filter_demo.py +0 -0
  217. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/demos/manual_report_example.py +0 -0
  218. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/demos/perf_parallel.py +0 -0
  219. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__init__.py +0 -0
  220. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-312.pyc +0 -0
  221. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-313.pyc +0 -0
  222. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/__init__.cpython-39.pyc +0 -0
  223. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-312-pytest-7.4.4.pyc +0 -0
  224. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-312-pytest-9.0.3.pyc +0 -0
  225. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-313-pytest-9.0.2.pyc +0 -0
  226. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/__pycache__/test_user_flows.cpython-39-pytest-8.3.4.pyc +0 -0
  227. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/e2e/test_user_flows.py +0 -0
  228. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/circular_config_a.json +0 -0
  229. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/circular_config_b.json +0 -0
  230. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/hourglass_stdout_mismatch.txt +0 -0
  231. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/hourglass_stdout_sample.txt +0 -0
  232. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/inheritance_base.json +0 -0
  233. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/inheritance_chain.json +0 -0
  234. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/inheritance_circular.json +0 -0
  235. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/main_config.json +0 -0
  236. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/circular_config_a.json +0 -0
  237. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/circular_config_b.json +0 -0
  238. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_base.json +0 -0
  239. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_chain.json +0 -0
  240. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/inheritance_circular.json +0 -0
  241. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/main_config.json +0 -0
  242. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/missing_fields.json +0 -0
  243. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/setup_main.json +0 -0
  244. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/setup_sub.json +0 -0
  245. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_golden_file.json +0 -0
  246. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_simple.json +0 -0
  247. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_simple.yaml +0 -0
  248. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/skill_test_cases_steps.json +0 -0
  249. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/sub_json_tests.yaml +0 -0
  250. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/sub_text_tests.json +0 -0
  251. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases.json +0 -0
  252. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases.yaml +0 -0
  253. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_cases1.json +0 -0
  254. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_with_setup.json +0 -0
  255. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/migration/v1/test_with_setup.yaml +0 -0
  256. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/missing_fields.json +0 -0
  257. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/mock_fail_script.py +0 -0
  258. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/mock_pass_script.py +0 -0
  259. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/setup_main.json +0 -0
  260. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/setup_sub.json +0 -0
  261. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/sub_json_tests.yaml +0 -0
  262. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/sub_text_tests.json +0 -0
  263. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/test_cases.json +0 -0
  264. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/test_cases.yaml +0 -0
  265. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/test_cases1.json +0 -0
  266. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/test_with_setup.json +0 -0
  267. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/fixtures/test_with_setup.yaml +0 -0
  268. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-312-pytest-7.4.4.pyc +0 -0
  269. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-312-pytest-9.0.3.pyc +0 -0
  270. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_history_feature.cpython-313-pytest-9.0.2.pyc +0 -0
  271. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-312-pytest-7.4.4.pyc +0 -0
  272. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-312-pytest-9.0.3.pyc +0 -0
  273. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_new_cli_features.cpython-313-pytest-9.0.2.pyc +0 -0
  274. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-312-pytest-7.4.4.pyc +0 -0
  275. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-312-pytest-9.0.3.pyc +0 -0
  276. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_real_command_execution.cpython-313-pytest-9.0.2.pyc +0 -0
  277. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/__pycache__/test_sequence.cpython-313-pytest-9.0.2.pyc +0 -0
  278. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  279. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  280. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  281. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_binary_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  282. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_csv_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  283. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  284. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  285. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  286. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_h5_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  287. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  288. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  289. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  290. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_json_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  291. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  292. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_text_compare.cpython-39-pytest-8.3.4.pyc +0 -0
  293. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_xml_compare.cpython-312-pytest-7.4.4.pyc +0 -0
  294. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_xml_compare.cpython-312-pytest-9.0.3.pyc +0 -0
  295. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/__pycache__/test_xml_compare.cpython-313-pytest-9.0.2.pyc +0 -0
  296. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_binary_compare.py +0 -0
  297. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_csv_compare.py +0 -0
  298. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_h5_compare.py +0 -0
  299. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_json_compare.py +0 -0
  300. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_text_compare.py +0 -0
  301. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/file_compare/test_xml_compare.py +0 -0
  302. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_depends_on.cpython-312-pytest-7.4.4.pyc +0 -0
  303. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_depends_on.cpython-312-pytest-9.0.3.pyc +0 -0
  304. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-313-pytest-9.0.2.pyc +0 -0
  305. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/__pycache__/test_parallel_runner.cpython-39-pytest-8.3.4.pyc +0 -0
  306. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/parallel/test_depends_on.py +0 -0
  307. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-312-pytest-7.4.4.pyc +0 -0
  308. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-312-pytest-9.0.3.pyc +0 -0
  309. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-313-pytest-9.0.2.pyc +0 -0
  310. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/path_handling/__pycache__/test_spaces_in_paths.cpython-39-pytest-8.3.4.pyc +0 -0
  311. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/path_handling/test_spaces_in_paths.py +0 -0
  312. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/test_history_feature.py +0 -0
  313. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/test_new_cli_features.py +0 -0
  314. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/test_real_command_execution.py +0 -0
  315. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/integration/test_sequence.py +0 -0
  316. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/run_all.py +0 -0
  317. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
  318. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
  319. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_binary_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
  320. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_cli.cpython-313-pytest-9.0.2.pyc +0 -0
  321. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-312-pytest-7.4.4.pyc +0 -0
  322. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-312-pytest-9.0.3.pyc +0 -0
  323. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_config_io.cpython-313-pytest-9.0.2.pyc +0 -0
  324. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
  325. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
  326. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_h5_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
  327. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-312-pytest-7.4.4.pyc +0 -0
  328. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-312-pytest-9.0.3.pyc +0 -0
  329. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_import_expander.cpython-313-pytest-9.0.2.pyc +0 -0
  330. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-312-pytest-7.4.4.pyc +0 -0
  331. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-312-pytest-9.0.3.pyc +0 -0
  332. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_inheritance_expander.cpython-313-pytest-9.0.2.pyc +0 -0
  333. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-312-pytest-7.4.4.pyc +0 -0
  334. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-312-pytest-9.0.3.pyc +0 -0
  335. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_result.cpython-313-pytest-9.0.2.pyc +0 -0
  336. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-312-pytest-7.4.4.pyc +0 -0
  337. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-312-pytest-9.0.3.pyc +0 -0
  338. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/__pycache__/test_run_all.cpython-313-pytest-9.0.2.pyc +0 -0
  339. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-312-pytest-7.4.4.pyc +0 -0
  340. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-312-pytest-9.0.3.pyc +0 -0
  341. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/commands/__pycache__/test_compare_command.cpython-313-pytest-9.0.2.pyc +0 -0
  342. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/commands/test_compare_command.py +0 -0
  343. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_assertions.cpython-313-pytest-9.0.2.pyc +0 -0
  344. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader.cpython-313-pytest-9.0.2.pyc +0 -0
  345. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_config_loader_new_features.cpython-313-pytest-9.0.2.pyc +0 -0
  346. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312-pytest-7.4.4.pyc +0 -0
  347. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312-pytest-9.0.3.pyc +0 -0
  348. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-312.pyc +0 -0
  349. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution.cpython-313-pytest-9.0.2.pyc +0 -0
  350. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_execution_new_features.cpython-313-pytest-9.0.2.pyc +0 -0
  351. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-312-pytest-7.4.4.pyc +0 -0
  352. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-312-pytest-9.0.3.pyc +0 -0
  353. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_history_store.cpython-313-pytest-9.0.2.pyc +0 -0
  354. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_last_run_store.cpython-312-pytest-7.4.4.pyc +0 -0
  355. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_last_run_store.cpython-312-pytest-9.0.3.pyc +0 -0
  356. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_last_run_store.cpython-313-pytest-9.0.2.pyc +0 -0
  357. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_process_worker.cpython-313-pytest-9.0.2.pyc +0 -0
  358. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-312-pytest-7.4.4.pyc +0 -0
  359. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-312-pytest-9.0.3.pyc +0 -0
  360. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-313-pytest-9.0.2.pyc +0 -0
  361. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_setup.cpython-39-pytest-8.3.4.pyc +0 -0
  362. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-312-pytest-7.4.4.pyc +0 -0
  363. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-312-pytest-9.0.3.pyc +0 -0
  364. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_validation_error.cpython-313-pytest-9.0.2.pyc +0 -0
  365. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-312-pytest-7.4.4.pyc +0 -0
  366. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-312-pytest-9.0.3.pyc +0 -0
  367. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/__pycache__/test_xfail.cpython-313-pytest-9.0.2.pyc +0 -0
  368. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_assertions.py +0 -0
  369. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_config_loader.py +0 -0
  370. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_config_loader_new_features.py +0 -0
  371. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_execution.py +0 -0
  372. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_execution_new_features.py +0 -0
  373. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_history_store.py +0 -0
  374. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_last_run_store.py +0 -0
  375. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_orchestration_accept.py +0 -0
  376. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_process_worker.py +0 -0
  377. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_sequence_state.py +0 -0
  378. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_setup.py +0 -0
  379. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_validation_error.py +0 -0
  380. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/core/test_xfail.py +0 -0
  381. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/__init__.cpython-312.pyc +0 -0
  382. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_error_analysis.cpython-313-pytest-9.0.2.pyc +0 -0
  383. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_hourglass_tangent_comparator.cpython-312-pytest-7.4.4.pyc +0 -0
  384. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_hourglass_tangent_comparator.cpython-312-pytest-9.0.3.pyc +0 -0
  385. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_hourglass_tangent_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
  386. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_parity.cpython-312-pytest-7.4.4.pyc +0 -0
  387. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_numeric_parity.cpython-312-pytest-9.0.3.pyc +0 -0
  388. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_script_comparator.cpython-313-pytest-9.0.2.pyc +0 -0
  389. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/__pycache__/test_workspace_plugins.cpython-313-pytest-9.0.2.pyc +0 -0
  390. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_error_analysis.py +0 -0
  391. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_extractor_channels.py +0 -0
  392. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_hourglass_tangent_comparator.py +0 -0
  393. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_numeric_compare.py +0 -0
  394. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_numeric_parity.py +0 -0
  395. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_script_comparator.py +0 -0
  396. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/file_comparator/test_script_extract.py +0 -0
  397. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312-pytest-7.4.4.pyc +0 -0
  398. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312-pytest-9.0.3.pyc +0 -0
  399. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-312.pyc +0 -0
  400. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-313-pytest-9.0.2.pyc +0 -0
  401. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_json_yaml_runner.cpython-39-pytest-8.3.4.pyc +0 -0
  402. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_filter.cpython-312-pytest-7.4.4.pyc +0 -0
  403. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_filter.cpython-312-pytest-9.0.3.pyc +0 -0
  404. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_filter.cpython-313-pytest-9.0.2.pyc +0 -0
  405. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_tag_filter.cpython-312-pytest-7.4.4.pyc +0 -0
  406. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_tag_filter.cpython-312-pytest-9.0.3.pyc +0 -0
  407. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/__pycache__/test_test_case_tag_filter.cpython-313-pytest-9.0.2.pyc +0 -0
  408. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/test_json_yaml_runner.py +0 -0
  409. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/test_test_case_filter.py +0 -0
  410. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/runners/test_test_case_tag_filter.py +0 -0
  411. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_binary_comparator.py +0 -0
  412. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_config_io.py +0 -0
  413. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_h5_comparator.py +0 -0
  414. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_import_expander.py +0 -0
  415. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_inheritance_expander.py +0 -0
  416. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_migrate.py +0 -0
  417. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_result.py +0 -0
  418. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/test_run_all.py +0 -0
  419. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_junit_xml_writer.cpython-312-pytest-7.4.4.pyc +0 -0
  420. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_junit_xml_writer.cpython-312-pytest-9.0.3.pyc +0 -0
  421. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_junit_xml_writer.cpython-313-pytest-9.0.2.pyc +0 -0
  422. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/__pycache__/test_report_generator.cpython-313-pytest-9.0.2.pyc +0 -0
  423. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/test_junit_xml_writer.py +0 -0
  424. {symtest_cli-1.5.0 → symtest_cli-1.5.1}/tests/unit/utils/test_report_generator.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.5.0
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` |
@@ -209,7 +208,7 @@ PathResolver 解析(系统命令直通、shell builtin 平台包装、复合
209
208
  ### 6.3 工厂与插件发现
210
209
 
211
210
  - `file_type` 取值:`text` / `json` / `csv` / `xml` / `h5` / `binary` / `script` / `script_extract`;工厂按类型分发,支持动态注册与全局 reset(测试用)
212
- - 插件发现四处来源:内置 `*_comparator.py` 自动发现、`workspace/comparators/` 自动扫描、`--plugin-dir` CLI 参数、`CLITEST_PLUGIN_DIRS` 环境变量(供进程模式 worker 使用)
211
+ - 插件发现四处来源:内置 `*_comparator.py` 自动发现、`workspace/comparators/` 自动扫描、`--plugin-dir` CLI 参数、`CLITEST_PLUGIN_DIRS` 环境变量(用户声明的输入;框架只读,进程模式 worker 经进程池 initializer 显式接收插件目录,框架从不修改 `os.environ`)
213
212
  - 命名约定:`*_comparator.py` + `*Comparator` 类名;可用类属性 `comparator_type` 显式指定类型名(如 `script_extract`);抽象基类自动跳过注册
214
213
  - 配置传递与严格校验:`actual`/`baseline`/`type`/`options` 之外的键转发给比较器构造函数(kwargs);构造器参数是**严格**的——未声明的键(拼写错误)在构造时大声失败并给出支持参数清单。`options` 是框架持有的插件配置命名空间(并入构造参数,显式顶层键优先),核心 schema 不为单个插件增加专属字段;`channels`/`default_channel` 属数据泳道框架结构
215
214
 
@@ -226,15 +225,17 @@ PathResolver 解析(系统命令直通、shell builtin 平台包装、复合
226
225
  `compare_numeric` / `NumericComparisonStats` / `parse_data_filter`。
227
226
  数据泳道插件只需依赖 `ExtractorComparator` + `ChannelData`,数值判定全部复用框架核心。
228
227
 
229
- ## 7. TUI 子系统
228
+ ## 7. 用例搜索命令(find)
230
229
 
231
- 基于 Textual 的终端交互界面:App + Controller(load / create / update /
232
- delete / run_single / save 业务动作)+ 列表 / 编辑两屏 + 表格封装、多模式搜索条
233
- (名称 / 命令 / 标签)、expected 编辑器、steps 编辑器。
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。
234
235
 
235
- 快捷键:`q` / Ctrl+Q 退出、`r` 刷新、`e` 编辑、`f` 单跑、`/` 搜索、`a` 新增、`d` 删除、`s` 保存。
236
-
237
- TUI 与 runner 共用同一解析器;宽松的展示形态在 TUI 侧自行处理(§10 原则 6)。
236
+ 原 TUI 的另一职责(给不习惯写配置的同事提供图形化定义/修改用例)由官方
237
+ skill(仓库根 `skill/`)承担:AI 编程助手按 skill 知识直接生成/修改
238
+ JSON/YAML 配置,学习成本更低且无交互界面维护负担。
238
239
 
239
240
  ## 8. 扩展点
240
241
 
@@ -245,7 +246,6 @@ TUI 与 runner 共用同一解析器;宽松的展示形态在 TUI 侧自行处
245
246
  | 自定义断言 | 扩展 `Assertions` | 特定业务校验逻辑 |
246
247
  | 新比较器 | `FileComparator` / `ExtractorComparator` / `ComparatorBase` | 按泳道选择基类(文件格式 / 数据提取+通道 / 全权分析),放入 `comparators/` 目录自动发现 |
247
248
  | 新 Runner | `ParallelRunner` / `BaseRunner` | 自定义并行调度策略 |
248
- | TUI 扩展 | `CaseController` / Widgets | 扩展终端管理界面 |
249
249
 
250
250
  ## 9. 设计决策
251
251
 
@@ -271,17 +271,16 @@ TUI 与 runner 共用同一解析器;宽松的展示形态在 TUI 侧自行处
271
271
  | DAG 依赖调度 | 基于 Kahn 拓扑 + 就绪队列,依赖满足后立即提交;依赖失败级联 skip 下游;无依赖时走 fast path 零开销 |
272
272
  | --update-baseline | 比较失败时自动将实际输出覆盖 baseline,适合批量更新基准 |
273
273
  | next_action_hint 结构化建议 | 失败结果附带下一步操作建议(update_baseline / update_expected / increase_timeout / investigate),便于 AI 消费 |
274
- | TUI 基于 Textual | 利用成熟的终端 UI 框架,提供交互式用例管理 |
274
+ | 移除 TUI,由官方 skill + `symtest find` 替代 | TUI 的两大职责均有更轻替代:定义/修改用例由 AI 编程助手按官方 skill 完成,跨文件搜索由复用同一解析管线的 `find` 命令覆盖;移除后砍掉 textual 重依赖与交互界面维护负担 |
275
275
  | JUnit XML 输出 | 兼容 GitLab CI / Jenkins / CircleCI 等主流 CI 系统的测试报告格式 |
276
276
  | Logging 统一化 | 通过 `logging` 模块集中管理,CLI 入口激活控制台输出,库用户按需启用 |
277
277
 
278
278
  ---
279
279
 
280
- ## 10. 核心架构宪法
280
+ ## 10. 架构不变量
281
281
 
282
- > **地位与效力**:本节自 Symtest 1.4 Phase 0 评审定稿,是本项目的核心架构契约,
283
- > 对所有后续 feature 具有最高约束力——任何功能需求先对照本宪法确定归属,再写代码。
284
- > 修订宪法必须在变更说明中显式指出所放宽/违反的条款及理由。
282
+ > **定位**:本节自 Symtest 1.4 Phase 0 评审定稿。这些不变量定义了模块归属与依赖方向;
283
+ > 新增 feature 应遵守它们,除非变更说明中显式记录了某条不变量为何需要演进。
285
284
 
286
285
  ### 10.1 数据流主线
287
286
 
@@ -359,10 +358,10 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
359
358
 
360
359
  #### 原则 6 — 核心模型不依赖表现层
361
360
 
362
- `core` 绝对不能 import:`cli` / `tui` / `reporter` / AI-specific adapter。
361
+ `core` 绝对不能 import:`cli` / `reporter` / AI-specific adapter。
363
362
 
364
- 解析器全系统唯一:TUI 与 runner 使用同一 parser,不允许存在 "TUI mode 后门"
365
- (如 workspace=None 时放宽校验);宽松形态由 TUI 侧自行处理。
363
+ 解析器全系统唯一:不允许存在宽松解析后门(如 workspace=None 时放宽校验);
364
+ 宽松形态由调用方先 normalize 再调用。
366
365
 
367
366
  ### 10.3 模块依赖方向
368
367
 
@@ -377,9 +376,9 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
377
376
  - `execution` 与 `validation` 互不 import;
378
377
  - `executor` 不得 import `assertions` / validation 侧模块;
379
378
  - `validator` 不得启动被测进程(见原则 3);
380
- - `core` 不得 import `cli` / `tui` / `reporter`。
379
+ - `core` 不得 import `cli` / `reporter`。
381
380
 
382
- ### 10.4 违宪归属速查
381
+ ### 10.4 归属速查
383
382
 
384
383
  任何新需求先问归属:
385
384
 
@@ -391,14 +390,14 @@ Reporter 的合法输入只能是 Result 类型;`next_action_hint` 属于 resu
391
390
  | AI 告诉我下一步该干嘛? | Result consumer / diagnosis |
392
391
 
393
392
  判据:若仍经常出现"这个功能到底放 execution、runner 还是 testcase?"的争论,
394
- 说明宪法没有被正确适用,应回到 10.2 逐条对照。
393
+ 说明不变量没有被正确适用,应回到 10.2 逐条对照。
395
394
 
396
- ### 10.5 宪法可执行化
395
+ ### 10.5 不变量可执行化
397
396
 
398
- 宪法不是纯文档约定,配套 architecture guard 测试并由 CI 强制:
397
+ 这些不变量不只是文档约定,配套 architecture guard 测试并由 CI 强制:
399
398
 
400
399
  - 断言 import 图:如 `execution/executor.py` 的 import 不得出现
401
- `assertions` / `validation`;`core/**` 不得 import `cli` / `tui` /
400
+ `assertions` / `validation`;`core/**` 不得 import `cli` /
402
401
  `reporter`;
403
402
  - guard 测试纳入常规回归套件(`python tests\run_all.py`),违规即失败;
404
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.