ara-cli 0.1.9.61__tar.gz → 0.1.9.63__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 (165) hide show
  1. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/PKG-INFO +2 -1
  2. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/__main__.py +4 -2
  3. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/ara_command_action.py +28 -1
  4. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/ara_command_parser.py +6 -0
  5. ara_cli-0.1.9.63/ara_cli/artefact_autofix.py +146 -0
  6. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/artefact_model.py +1 -1
  7. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/businessgoal_artefact_model.py +6 -1
  8. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/epic_artefact_model.py +6 -1
  9. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/feature_artefact_model.py +8 -3
  10. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/keyfeature_artefact_model.py +6 -1
  11. ara_cli-0.1.9.63/ara_cli/artefact_models/serialize_helper.py +18 -0
  12. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/userstory_artefact_model.py +6 -1
  13. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_scan.py +2 -0
  14. ara_cli-0.1.9.63/ara_cli/tag_extractor.py +56 -0
  15. ara_cli-0.1.9.63/ara_cli/tests/test_ara_autofix.py +113 -0
  16. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_ara_command_action.py +2 -1
  17. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/version.py +1 -1
  18. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli.egg-info/PKG-INFO +2 -1
  19. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli.egg-info/SOURCES.txt +3 -1
  20. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli.egg-info/requires.txt +1 -0
  21. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/setup.py +2 -1
  22. ara_cli-0.1.9.61/ara_cli/analyse_artefacts.py +0 -133
  23. ara_cli-0.1.9.61/ara_cli/tag_extractor.py +0 -31
  24. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/MANIFEST.in +0 -0
  25. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/README.md +0 -0
  26. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/__init__.py +0 -0
  27. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/ara_config.py +0 -0
  28. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_creator.py +0 -0
  29. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_deleter.py +0 -0
  30. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_fuzzy_search.py +0 -0
  31. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_link_updater.py +0 -0
  32. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_lister.py +0 -0
  33. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/artefact_load.py +0 -0
  34. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/artefact_mapping.py +0 -0
  35. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/artefact_templates.py +0 -0
  36. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/capability_artefact_model.py +0 -0
  37. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/example_artefact_model.py +0 -0
  38. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/issue_artefact_model.py +0 -0
  39. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/task_artefact_model.py +0 -0
  40. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_models/vision_artefact_model.py +0 -0
  41. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_reader.py +0 -0
  42. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/artefact_renamer.py +0 -0
  43. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/chat.py +0 -0
  44. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/classifier.py +0 -0
  45. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/codefusionretriever.py +0 -0
  46. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/codehierachieretriever.py +0 -0
  47. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/commandline_completer.py +0 -0
  48. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/directory_navigator.py +0 -0
  49. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/file_classifier.py +0 -0
  50. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/file_lister.py +0 -0
  51. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/filename_validator.py +0 -0
  52. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/list_filter.py +0 -0
  53. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/output_suppressor.py +0 -0
  54. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/prompt_chat.py +0 -0
  55. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/prompt_extractor.py +0 -0
  56. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/prompt_handler.py +0 -0
  57. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/prompt_rag.py +0 -0
  58. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/run_file_lister.py +0 -0
  59. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/template_manager.py +0 -0
  60. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/agile.artefacts +0 -0
  61. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/blueprints/complete_pytest_unittest.blueprint.md +0 -0
  62. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/blueprints/empty.blueprint.md +0 -0
  63. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/blueprints/task_todo_list_C4_architecture_analysis.blueprint.md +0 -0
  64. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/blueprints/task_todo_list_implement_feature_BDD_way.blueprint.md +0 -0
  65. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/architecture_C4_analysis.commands.md +0 -0
  66. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/architecture_radon_cc_score.commands.md +0 -0
  67. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/architecture_radon_halstead_v.commands.md +0 -0
  68. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/architecture_radon_maintainability_score.commands.md +0 -0
  69. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/artefact_classification.commands.md +0 -0
  70. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/artefact_extension.commands.md +0 -0
  71. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/artefact_formulation.commands.md +0 -0
  72. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/behave_step_generation.commands.md +0 -0
  73. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/code_generation_complex.commands.md +0 -0
  74. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/code_generation_simple.commands.md +0 -0
  75. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/empty.commands.md +0 -0
  76. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/error_fixing.commands.md +0 -0
  77. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/feature_file_update.commands.md +0 -0
  78. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/feature_formulation.commands.md +0 -0
  79. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/js_code_generation_simple.commands.md +0 -0
  80. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/refactoring.commands.md +0 -0
  81. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/refactoring_analysis.commands.md +0 -0
  82. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/reverse_engineer_feature_file.commands.md +0 -0
  83. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/commands/reverse_engineer_program_flow.commands.md +0 -0
  84. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/classify_task.intention.md +0 -0
  85. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/empty.intention.md +0 -0
  86. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/error_fixing.intention.md +0 -0
  87. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/feature_fix_steps_for_scenario.intention.md +0 -0
  88. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/feature_formulation.intention.md +0 -0
  89. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/feature_reverse_formulation_from_code.intention.md +0 -0
  90. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation.intention.md +0 -0
  91. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation_update.intention.md +0 -0
  92. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/feature_scenario_outline_extension.intention.md +0 -0
  93. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/feature_update_formulation.intention.md +0 -0
  94. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/fibonacci_example_implementation.intention.md +0 -0
  95. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/js_implementation_from_task_description.intention.md +0 -0
  96. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/js_steps_implementation.intention.md +0 -0
  97. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/python_cli_implementation_with_test.intention.md +0 -0
  98. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/python_code_understanding.intention.md +0 -0
  99. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/task_implementation.intention.md +0 -0
  100. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/task_prompt_control_by_status.intention.md +0 -0
  101. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_number.intention.md +0 -0
  102. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_status.intention.md +0 -0
  103. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/rules/architecture_analyst.rules.md +0 -0
  104. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/rules/code_analyst.rules.md +0 -0
  105. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/rules/empty.rules.md +0 -0
  106. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/rules/error_analyst.rules.md +0 -0
  107. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/rules/gherkin_expert.rules.md +0 -0
  108. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/rules/js_expert_developer.rules.md +0 -0
  109. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/rules/product_owner.rules.md +0 -0
  110. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/rules/python_behave.rules.md +0 -0
  111. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/prompt-modules/rules/python_developer.rules.md +0 -0
  112. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/specification_breakdown_files/template.concept.exploration.md +0 -0
  113. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/specification_breakdown_files/template.concept.md +0 -0
  114. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/specification_breakdown_files/template.customer.exploration.md +0 -0
  115. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/specification_breakdown_files/template.customer.md +0 -0
  116. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/specification_breakdown_files/template.persona.exploration.md +0 -0
  117. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/specification_breakdown_files/template.persona.md +0 -0
  118. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/specification_breakdown_files/template.step.exploration.md +0 -0
  119. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/specification_breakdown_files/template.step.md +0 -0
  120. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/specification_breakdown_files/template.technology.exploration.md +0 -0
  121. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/specification_breakdown_files/template.technology.md +0 -0
  122. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.businessgoal +0 -0
  123. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.businessgoal.prompt_log.md +0 -0
  124. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.capability +0 -0
  125. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.capability.prompt_log.md +0 -0
  126. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.epic +0 -0
  127. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.epic.prompt_log.md +0 -0
  128. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.example +0 -0
  129. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.example.prompt_log.md +0 -0
  130. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.feature +0 -0
  131. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.feature.prompt_log.md +0 -0
  132. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.issue +0 -0
  133. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.issue.prompt_log.md +0 -0
  134. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.keyfeature +0 -0
  135. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.keyfeature.prompt_log.md +0 -0
  136. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.steps.prompt_log.md +0 -0
  137. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.task +0 -0
  138. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.task.prompt_log.md +0 -0
  139. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.userstory +0 -0
  140. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.userstory.prompt_log.md +0 -0
  141. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.vision +0 -0
  142. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/templates/template.vision.prompt_log.md +0 -0
  143. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/__init__.py +0 -0
  144. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_ara_config.py +0 -0
  145. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_artefact_fuzzy_search.py +0 -0
  146. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_artefact_link_updater.py +0 -0
  147. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_artefact_lister.py +0 -0
  148. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_artefact_reader.py +0 -0
  149. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_artefact_renamer.py +0 -0
  150. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_artefact_scan.py +0 -0
  151. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_chat.py +0 -0
  152. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_classifier.py +0 -0
  153. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_directory_navigator.py +0 -0
  154. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_file_classifier.py +0 -0
  155. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_file_creator.py +0 -0
  156. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_file_lister.py +0 -0
  157. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_list_filter.py +0 -0
  158. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_tag_extractor.py +0 -0
  159. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_template_manager.py +0 -0
  160. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/tests/test_update_config_prompt.py +0 -0
  161. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli/update_config_prompt.py +0 -0
  162. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli.egg-info/dependency_links.txt +0 -0
  163. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli.egg-info/entry_points.txt +0 -0
  164. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/ara_cli.egg-info/top_level.txt +0 -0
  165. {ara_cli-0.1.9.61 → ara_cli-0.1.9.63}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ara_cli
3
- Version: 0.1.9.61
3
+ Version: 0.1.9.63
4
4
  Requires-Dist: litellm
5
5
  Requires-Dist: llama-index
6
6
  Requires-Dist: llama-index-llms-openai
@@ -12,4 +12,5 @@ Requires-Dist: argparse
12
12
  Requires-Dist: argcomplete
13
13
  Requires-Dist: cmd2>=2.5
14
14
  Requires-Dist: pydantic
15
+ Requires-Dist: pydantic_ai
15
16
  Dynamic: requires-dist
@@ -18,7 +18,8 @@ from ara_cli.ara_command_action import (
18
18
  set_status_action,
19
19
  set_user_action,
20
20
  classifier_directory_action,
21
- scan_action
21
+ scan_action,
22
+ autofix_action
22
23
  )
23
24
  import argcomplete
24
25
  import sys
@@ -42,7 +43,8 @@ def define_action_mapping():
42
43
  "set-status": set_status_action,
43
44
  "set-user": set_user_action,
44
45
  "classifier-directory": classifier_directory_action,
45
- "scan": scan_action
46
+ "scan": scan_action,
47
+ "autofix": autofix_action
46
48
  }
47
49
 
48
50
 
@@ -128,7 +128,10 @@ def list_tags_action(args):
128
128
  tag_classifier = args.include_classifier
129
129
 
130
130
  tag_extractor = TagExtractor()
131
- tags = tag_extractor.extract_tags(include_classifier=tag_classifier)
131
+ tags = tag_extractor.extract_tags(
132
+ include_classifier=tag_classifier,
133
+ filtered_extra_column=getattr(args, "filtered_extra_column", False)
134
+ )
132
135
 
133
136
  if args.json:
134
137
  output = json.dumps({"tags": tags})
@@ -538,3 +541,27 @@ def scan_action(args):
538
541
  if invalid:
539
542
  invalid_artefacts[classifier] = invalid
540
543
  show_results(invalid_artefacts)
544
+
545
+
546
+ def autofix_action(args):
547
+ from ara_cli.artefact_autofix import parse_report, apply_autofix, read_report_file
548
+
549
+ content = read_report_file()
550
+
551
+ if not content:
552
+ return False
553
+
554
+ issues = parse_report(content)
555
+
556
+ if not issues:
557
+ print("No issues found in the report. Nothing to fix.")
558
+ return
559
+
560
+ # print("Found issues to fix:")
561
+ for classifier, files in issues.items():
562
+ print(f"\nClassifier: {classifier}")
563
+ for file_path, reason in files:
564
+ print(f"Attempting to fix {file_path} for reason: {reason}")
565
+ apply_autofix(file_path, classifier, reason)
566
+
567
+ print("\nAutofix process completed. Please review the changes.")
@@ -121,6 +121,7 @@ def list_tags_parser(subparsers):
121
121
  tags_parser = subparsers.add_parser("list-tags", help="Show tags")
122
122
  tags_parser.add_argument("--json", "-j", help="Output tags as JSON", action=argparse.BooleanOptionalAction)
123
123
  tags_parser.add_argument("--include-classifier", choices=classifiers, help="Show tags for an artefact type")
124
+ tags_parser.add_argument("--filtered-extra-column", action="store_true", help="Filter tags for extra column")
124
125
 
125
126
 
126
127
  def add_chat_arguments(chat_parser):
@@ -220,6 +221,10 @@ def scan_parser(subparsers):
220
221
  subparsers.add_parser("scan", help="Scan ARA tree for incompatible artefacts.")
221
222
 
222
223
 
224
+ def autofix_parser(subparsers):
225
+ subparsers.add_parser("autofix", help="Fix ARA tree with llm models for scanned artefacts with ara scan command.")
226
+
227
+
223
228
  class CustomHelpFormatter(argparse.HelpFormatter):
224
229
  def format_help(self):
225
230
  from sys import argv
@@ -307,5 +312,6 @@ def action_parser():
307
312
  set_user_parser(subparsers)
308
313
  classifier_directory_parser(subparsers)
309
314
  scan_parser(subparsers)
315
+ autofix_parser(subparsers)
310
316
 
311
317
  return parser
@@ -0,0 +1,146 @@
1
+ def read_report_file():
2
+ file_path = "incompatible_artefacts_report.md"
3
+ try:
4
+ with open(file_path, "r", encoding="utf-8") as f:
5
+ content = f.read()
6
+ except OSError:
7
+ print('Artefact scan results file not found. Did you run the "ara scan" command?')
8
+ return
9
+
10
+ return content
11
+
12
+
13
+ def parse_report(content: str) -> dict:
14
+ """
15
+ Parses the incompatible artefacts report and returns structured data.
16
+ Returns a dictionary where keys are artefact classifiers, and values are lists of (file_path, reason) tuples.
17
+ """
18
+ lines = content.splitlines()
19
+ issues = {}
20
+ current_classifier = None
21
+
22
+ if not lines or lines[0] != "# Artefact Check Report":
23
+ return issues # Geçersiz rapor formatı
24
+
25
+ if len(lines) >= 3 and lines[2] == "No problems found.":
26
+ return issues # Hiç sorun bulunamadı
27
+
28
+ for line in lines[1:]: # Başlıktan sonraki satırları işle
29
+ line = line.strip()
30
+ if not line:
31
+ continue
32
+
33
+ # Classifier başlığı tespiti (## ile başlayan)
34
+ if line.startswith("## "):
35
+ current_classifier = line[3:].strip()
36
+ issues[current_classifier] = []
37
+
38
+ # Dosya listesi tespiti (- ile başlayan)
39
+ elif line.startswith("- ") and current_classifier is not None:
40
+ # Format: "- `file_path`: reason"
41
+ parts = line.split("`", 2)
42
+ if len(parts) < 3:
43
+ continue # Geçersiz format
44
+
45
+ file_path = parts[1]
46
+ reason = parts[2].split(
47
+ ":", 1)[1].strip() if ":" in parts[2] else ""
48
+ issues[current_classifier].append((file_path, reason))
49
+
50
+ return issues
51
+
52
+
53
+ def read_artefact(file_path):
54
+ """Reads the artefact text from the given file path."""
55
+ try:
56
+ with open(file_path, 'r') as file:
57
+ return file.read()
58
+ except FileNotFoundError:
59
+ print(f"File not found: {file_path}")
60
+ return None
61
+
62
+
63
+ def determine_artefact_type_and_class(classifier):
64
+ from ara_cli.artefact_models.artefact_mapping import artefact_type_mapping
65
+ from ara_cli.artefact_models.artefact_model import ArtefactType
66
+
67
+ try:
68
+ artefact_type = ArtefactType(classifier)
69
+ except ValueError:
70
+ print(f"Invalid classifier: {classifier}")
71
+ return None, None
72
+
73
+ artefact_class = artefact_type_mapping.get(artefact_type)
74
+ if not artefact_class:
75
+ print(f"No artefact class found for {artefact_type}")
76
+ return None, None
77
+
78
+ return artefact_type, artefact_class
79
+
80
+
81
+ def construct_prompt(artefact_type, reason, file_path, artefact_text):
82
+ from ara_cli.artefact_models.artefact_model import ArtefactType
83
+
84
+ prompt = (
85
+ f"Correct the following {artefact_type} artefact to fix the issue: {reason}. "
86
+ "Provide the complete, corrected artefact. Do not reformulate the artefact, "
87
+ "just fix the pydantic model errors, use correct grammar. "
88
+ "Do not remove comments. "
89
+ "You should follow the name of the file "
90
+ f"from its path {file_path} for naming the arteafact's title. "
91
+ "You are not allowed to use file extention in the artefact title. "
92
+ "You are not allowed to modify, delete or add tags. "
93
+ "User tag should be '@user_<username>'. The pydantic model already provides the '@user_' prefix. "
94
+ "So you should be careful to not make it @user_user_<username>. "
95
+ )
96
+
97
+ if artefact_type == ArtefactType.task:
98
+ prompt += (
99
+ "For task artefacts, if the action items looks like template or empty "
100
+ "then just delete those action items."
101
+ )
102
+
103
+ prompt += (
104
+ "\nThe current artefact is:\n"
105
+ "```\n"
106
+ f"{artefact_text}\n"
107
+ "```"
108
+ )
109
+
110
+ return prompt
111
+
112
+
113
+ def run_agent(prompt, artefact_class):
114
+ from pydantic_ai import Agent
115
+ # gpt-4o
116
+ # anthropic:claude-3-7-sonnet-20250219
117
+ agent = Agent(model="gpt-4o",
118
+ result_type=artefact_class, instrument=True)
119
+ result = agent.run_sync(prompt)
120
+ return result.data
121
+
122
+
123
+ def write_corrected_artefact(file_path, corrected_text):
124
+ with open(file_path, 'w') as file:
125
+ file.write(corrected_text)
126
+ print(f"Fixed artefact at {file_path}")
127
+
128
+
129
+ def apply_autofix(file_path, classifier, reason):
130
+ artefact_text = read_artefact(file_path)
131
+ if artefact_text is None:
132
+ return
133
+
134
+ artefact_type, artefact_class = determine_artefact_type_and_class(
135
+ classifier)
136
+ if artefact_type is None or artefact_class is None:
137
+ return
138
+
139
+ prompt = construct_prompt(artefact_type, reason, file_path, artefact_text)
140
+
141
+ try:
142
+ corrected_artefact = run_agent(prompt, artefact_class)
143
+ corrected_text = corrected_artefact.serialize()
144
+ write_corrected_artefact(file_path, corrected_text)
145
+ except Exception as e:
146
+ print(f"Failed to fix artefact at {file_path}: {e}")
@@ -179,7 +179,7 @@ class Artefact(BaseModel, ABC):
179
179
  )
180
180
  description: Optional[str] = Field(
181
181
  default=None,
182
- description="Optional further description to understand the artefact. It is strongly recommended to add a description to every artefact."
182
+ description="Optional further description to understand the artefact. The description should summerize the core intention of the artefact and give additional valuable information about the artefact."
183
183
  )
184
184
 
185
185
  @property
@@ -33,9 +33,14 @@ class BusinessgoalIntent(Intent):
33
33
  return v
34
34
 
35
35
  def serialize(self):
36
+ from ara_cli.artefact_models.serialize_helper import as_a_serializer
37
+
36
38
  lines = []
39
+
40
+ as_a_line = as_a_serializer(self.as_a)
41
+
37
42
  lines.append(f"In order to {self.in_order_to}")
38
- lines.append(f"As a {self.as_a}")
43
+ lines.append(as_a_line)
39
44
  lines.append(f"I want {self.i_want}")
40
45
 
41
46
  return "\n".join(lines)
@@ -34,9 +34,14 @@ class EpicIntent(Intent):
34
34
  return v
35
35
 
36
36
  def serialize(self):
37
+ from ara_cli.artefact_models.serialize_helper import as_a_serializer
38
+
37
39
  lines = []
40
+
41
+ as_a_line = as_a_serializer(self.as_a)
42
+
38
43
  lines.append(f"In order to {self.in_order_to}")
39
- lines.append(f"As a {self.as_a}")
44
+ lines.append(as_a_line)
40
45
  lines.append(f"I want {self.i_want}")
41
46
 
42
47
  return "\n".join(lines)
@@ -34,8 +34,13 @@ class FeatureIntent(Intent):
34
34
  return v
35
35
 
36
36
  def serialize(self):
37
+ from ara_cli.artefact_models.serialize_helper import as_a_serializer
38
+
37
39
  lines = []
38
- lines.append(f"As a {self.as_a}")
40
+
41
+ as_a_line = as_a_serializer(self.as_a)
42
+
43
+ lines.append(as_a_line)
39
44
  lines.append(f"I want to {self.i_want_to}")
40
45
  lines.append(f"So that {self.so_that}")
41
46
 
@@ -59,9 +64,9 @@ class FeatureIntent(Intent):
59
64
  as_a = line[len(as_a_prefix):].strip()
60
65
  if line.startswith(as_a_prefix_alt) and not as_a:
61
66
  as_a = line[len(as_a_prefix_alt):].strip()
62
- elif line.startswith(i_want_to_prefix) and not i_want_to:
67
+ if line.startswith(i_want_to_prefix) and not i_want_to:
63
68
  i_want_to = line[len(i_want_to_prefix):].strip()
64
- elif line.startswith(so_that_prefix) and not so_that:
69
+ if line.startswith(so_that_prefix) and not so_that:
65
70
  so_that = line[len(so_that_prefix):].strip()
66
71
  index += 1
67
72
 
@@ -33,9 +33,14 @@ class KeyfeatureIntent(Intent):
33
33
  return v
34
34
 
35
35
  def serialize(self):
36
+ from ara_cli.artefact_models.serialize_helper import as_a_serializer
37
+
36
38
  lines = []
39
+
40
+ as_a_line = as_a_serializer(self.as_a)
41
+
37
42
  lines.append(f"In order to {self.in_order_to}")
38
- lines.append(f"As a {self.as_a}")
43
+ lines.append(as_a_line)
39
44
  lines.append(f"I want {self.i_want}")
40
45
 
41
46
  return "\n".join(lines)
@@ -0,0 +1,18 @@
1
+ def as_a_serializer(as_a):
2
+ role = as_a.strip()
3
+
4
+ exceptions_for_a = ('user', 'university', 'one-time', 'european', 'unit')
5
+ exceptions_for_an = ('hour', 'honest', 'heir')
6
+ role_lower = role.lower()
7
+ as_a_prefix = ""
8
+
9
+ if any(role_lower.startswith(e) for e in exceptions_for_a):
10
+ as_a_prefix = "As a"
11
+ elif any(role_lower.startswith(e) for e in exceptions_for_an):
12
+ as_a_prefix = "As an"
13
+ elif role_lower.startswith(('a', 'e', 'i', 'o', 'u')):
14
+ as_a_prefix = "As an"
15
+ else:
16
+ as_a_prefix = "As a"
17
+
18
+ return f"{as_a_prefix} {role}"
@@ -33,9 +33,14 @@ class UserstoryIntent(Intent):
33
33
  return v
34
34
 
35
35
  def serialize(self):
36
+ from ara_cli.artefact_models.serialize_helper import as_a_serializer
37
+
36
38
  lines = []
39
+
40
+ as_a_line = as_a_serializer(self.as_a)
41
+
37
42
  lines.append(f"In order to {self.in_order_to}")
38
- lines.append(f"As a {self.as_a}")
43
+ lines.append(as_a_line)
39
44
  lines.append(f"I want {self.i_want}")
40
45
 
41
46
  return "\n".join(lines)
@@ -25,6 +25,8 @@ def find_invalid_files(classified_artefact_info, classifier):
25
25
  for artefact_info in classified_artefact_info[classifier]:
26
26
  if "templates/" in artefact_info["file_path"]:
27
27
  continue
28
+ if ".data" in artefact_info["file_path"]:
29
+ continue
28
30
  is_valid, reason = check_file(artefact_info["file_path"], artefact_class)
29
31
  if not is_valid:
30
32
  invalid_files.append((artefact_info["file_path"], reason))
@@ -0,0 +1,56 @@
1
+ import os
2
+ from ara_cli.artefact_models.artefact_load import artefact_from_content
3
+
4
+
5
+ class TagExtractor:
6
+ def __init__(self, file_system=None):
7
+ self.file_system = file_system or os
8
+
9
+ def extract_tags(self, navigate_to_target=False, include_classifier=None, filtered_extra_column=False):
10
+ from ara_cli.template_manager import DirectoryNavigator
11
+ from ara_cli.artefact_reader import ArtefactReader
12
+
13
+ navigator = DirectoryNavigator()
14
+ if navigate_to_target:
15
+ navigator.navigate_to_target()
16
+
17
+ artefacts = ArtefactReader.read_artefacts()
18
+
19
+ if include_classifier:
20
+ artefacts = {include_classifier: artefacts[include_classifier]}
21
+
22
+ unique_tags = set()
23
+
24
+ if filtered_extra_column:
25
+ status_tags = {"to-do", "in-progress", "review", "done", "closed"}
26
+ filtered_artefacts = []
27
+
28
+ for artefact_list in artefacts.values():
29
+ for artefact in artefact_list:
30
+ tags = artefact.tags + \
31
+ [artefact.status] if artefact.status else artefact.tags
32
+ tag_set = set(tag for tag in tags if tag is not None)
33
+ if not tag_set & status_tags:
34
+ filtered_artefacts.append(artefact)
35
+
36
+ for artefact in filtered_artefacts:
37
+ tags = [tag for tag in (
38
+ artefact.tags + [artefact.status]) if tag is not None]
39
+ for tag in tags:
40
+ if (
41
+ tag in status_tags
42
+ or tag.startswith("priority_")
43
+ or tag.startswith("user_")
44
+ ):
45
+ continue
46
+ unique_tags.add(tag)
47
+
48
+ else:
49
+ for artefact_list in artefacts.values():
50
+ for artefact in artefact_list:
51
+ user_tags = [f"user_{tag}" for tag in artefact.users]
52
+ tags = [tag for tag in (artefact.tags + [artefact.status] + user_tags) if tag is not None]
53
+ unique_tags.update(tags)
54
+
55
+ sorted_tags = sorted(unique_tags)
56
+ return sorted_tags
@@ -0,0 +1,113 @@
1
+ import pytest
2
+ from unittest.mock import patch, mock_open, MagicMock
3
+ from ara_cli.artefact_autofix import (
4
+ read_report_file,
5
+ parse_report,
6
+ apply_autofix,
7
+ read_artefact,
8
+ determine_artefact_type_and_class,
9
+ run_agent,
10
+ write_corrected_artefact
11
+ )
12
+ from ara_cli.ara_command_action import autofix_action
13
+
14
+
15
+ def test_read_report_file():
16
+ mock_content = "# Artefact Check Report\n\n## classifier\n- `file_path`: reason\n"
17
+ with patch("builtins.open", mock_open(read_data=mock_content)) as m:
18
+ content = read_report_file()
19
+ assert content == mock_content
20
+ m.assert_called_once_with(
21
+ "incompatible_artefacts_report.md", "r", encoding="utf-8")
22
+
23
+
24
+ def test_parse_report():
25
+ content = "# Artefact Check Report\n\n## classifier\n- `file_path`: reason\n"
26
+ expected_issues = {"classifier": [("file_path", "reason")]}
27
+ issues = parse_report(content)
28
+ assert issues == expected_issues
29
+
30
+
31
+ @patch("ara_cli.artefact_autofix.run_agent")
32
+ @patch("ara_cli.artefact_autofix.write_corrected_artefact")
33
+ def test_apply_autofix(mock_write_corrected_artefact, mock_run_agent):
34
+ mock_run_agent.return_value.serialize.return_value = "corrected content"
35
+ with patch("ara_cli.artefact_autofix.read_artefact", return_value="artefact text"):
36
+ with patch("ara_cli.artefact_autofix.determine_artefact_type_and_class", return_value=("ArtefactType", MagicMock())):
37
+ apply_autofix("file_path", "classifier", "reason")
38
+ mock_run_agent.assert_called_once()
39
+ mock_write_corrected_artefact.assert_called_once_with(
40
+ "file_path", "corrected content")
41
+
42
+
43
+ @patch("ara_cli.artefact_autofix.apply_autofix")
44
+ @patch("ara_cli.artefact_autofix.parse_report")
45
+ @patch("ara_cli.artefact_autofix.read_report_file")
46
+ def test_autofix_action(mock_read_report_file, mock_parse_report, mock_apply_autofix, capsys):
47
+ mock_read_report_file.return_value = "# Artefact Check Report\n\n## classifier\n- `file_path`: reason\n"
48
+ mock_parse_report.return_value = {"classifier": [("file_path", "reason")]}
49
+
50
+ args = MagicMock()
51
+ autofix_action(args)
52
+
53
+ captured = capsys.readouterr()
54
+ assert "Attempting to fix file_path for reason: reason" in captured.out
55
+ mock_apply_autofix.assert_called_once_with(
56
+ "file_path", "classifier", "reason")
57
+
58
+
59
+ def test_read_artefact():
60
+ mock_content = "artefact content"
61
+ with patch("builtins.open", mock_open(read_data=mock_content)) as m:
62
+ content = read_artefact("file_path")
63
+ assert content == mock_content
64
+ m.assert_called_once_with("file_path", "r")
65
+
66
+
67
+ def test_read_report_file_not_found(capsys):
68
+ with patch("builtins.open", side_effect=OSError("File not found")):
69
+ content = read_report_file()
70
+ captured = capsys.readouterr()
71
+ assert content is None
72
+ assert "Artefact scan results file not found" in captured.out
73
+
74
+
75
+ def test_parse_report_no_issues():
76
+ content = "# Artefact Check Report\n\nNo problems found.\n"
77
+ issues = parse_report(content)
78
+ assert issues == {}
79
+
80
+
81
+ def test_parse_report_invalid_format():
82
+ content = "Invalid Format"
83
+ issues = parse_report(content)
84
+ assert issues == {}
85
+
86
+
87
+ def test_determine_artefact_type_and_class_invalid():
88
+ artefact_type, artefact_class = determine_artefact_type_and_class(
89
+ "invalid_classifier")
90
+ assert artefact_type is None
91
+ assert artefact_class is None
92
+
93
+
94
+ def test_write_corrected_artefact():
95
+ corrected_content = "corrected content"
96
+ with patch("builtins.open", mock_open()) as m:
97
+ write_corrected_artefact("file_path", corrected_content)
98
+ m.assert_called_once_with("file_path", "w")
99
+ handle = m()
100
+ handle.write.assert_called_once_with(corrected_content)
101
+
102
+
103
+ @patch("ara_cli.artefact_autofix.read_artefact", return_value=None)
104
+ def test_apply_autofix_file_not_found(mock_read_artefact):
105
+ apply_autofix("file_path", "classifier", "reason")
106
+ mock_read_artefact.assert_called_once_with("file_path")
107
+
108
+
109
+ @patch("pydantic_ai.Agent")
110
+ def test_run_agent_exception_handling(mock_agent):
111
+ mock_agent.return_value.run_sync.side_effect = Exception("Agent error")
112
+ with pytest.raises(Exception, match="Agent error"):
113
+ run_agent("prompt", MagicMock())
@@ -11,7 +11,8 @@ from ara_cli.ara_command_action import (
11
11
  set_status_action,
12
12
  set_user_action,
13
13
  classifier_directory_action,
14
- scan_action
14
+ scan_action,
15
+ autofix_action
15
16
  )
16
17
 
17
18
 
@@ -1,2 +1,2 @@
1
1
  # version.py
2
- __version__ = "0.1.9.61" # fith parameter like .0 for local install test purposes only. official numbers should be 4 digit numbers
2
+ __version__ = "0.1.9.63" # fith parameter like .0 for local install test purposes only. official numbers should be 4 digit numbers
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ara_cli
3
- Version: 0.1.9.61
3
+ Version: 0.1.9.63
4
4
  Requires-Dist: litellm
5
5
  Requires-Dist: llama-index
6
6
  Requires-Dist: llama-index-llms-openai
@@ -12,4 +12,5 @@ Requires-Dist: argparse
12
12
  Requires-Dist: argcomplete
13
13
  Requires-Dist: cmd2>=2.5
14
14
  Requires-Dist: pydantic
15
+ Requires-Dist: pydantic_ai
15
16
  Dynamic: requires-dist
@@ -3,10 +3,10 @@ README.md
3
3
  setup.py
4
4
  ara_cli/__init__.py
5
5
  ara_cli/__main__.py
6
- ara_cli/analyse_artefacts.py
7
6
  ara_cli/ara_command_action.py
8
7
  ara_cli/ara_command_parser.py
9
8
  ara_cli/ara_config.py
9
+ ara_cli/artefact_autofix.py
10
10
  ara_cli/artefact_creator.py
11
11
  ara_cli/artefact_deleter.py
12
12
  ara_cli/artefact_fuzzy_search.py
@@ -52,6 +52,7 @@ ara_cli/artefact_models/example_artefact_model.py
52
52
  ara_cli/artefact_models/feature_artefact_model.py
53
53
  ara_cli/artefact_models/issue_artefact_model.py
54
54
  ara_cli/artefact_models/keyfeature_artefact_model.py
55
+ ara_cli/artefact_models/serialize_helper.py
55
56
  ara_cli/artefact_models/task_artefact_model.py
56
57
  ara_cli/artefact_models/userstory_artefact_model.py
57
58
  ara_cli/artefact_models/vision_artefact_model.py
@@ -139,6 +140,7 @@ ara_cli/templates/specification_breakdown_files/template.step.md
139
140
  ara_cli/templates/specification_breakdown_files/template.technology.exploration.md
140
141
  ara_cli/templates/specification_breakdown_files/template.technology.md
141
142
  ara_cli/tests/__init__.py
143
+ ara_cli/tests/test_ara_autofix.py
142
144
  ara_cli/tests/test_ara_command_action.py
143
145
  ara_cli/tests/test_ara_config.py
144
146
  ara_cli/tests/test_artefact_fuzzy_search.py
@@ -9,3 +9,4 @@ argparse
9
9
  argcomplete
10
10
  cmd2>=2.5
11
11
  pydantic
12
+ pydantic_ai
@@ -26,6 +26,7 @@ setup(
26
26
  'argparse',
27
27
  'argcomplete',
28
28
  'cmd2>=2.5',
29
- 'pydantic'
29
+ 'pydantic',
30
+ 'pydantic_ai'
30
31
  ],
31
32
  )