ara-cli 0.1.9.60__tar.gz → 0.1.9.62__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 (163) hide show
  1. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/PKG-INFO +2 -1
  2. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/README.md +11 -9
  3. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/__main__.py +4 -2
  4. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/ara_command_action.py +24 -0
  5. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/ara_command_parser.py +5 -0
  6. ara_cli-0.1.9.62/ara_cli/artefact_autofix.py +134 -0
  7. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_creator.py +4 -8
  8. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/businessgoal_artefact_model.py +3 -0
  9. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/epic_artefact_model.py +3 -0
  10. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/feature_artefact_model.py +4 -1
  11. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/keyfeature_artefact_model.py +3 -0
  12. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/userstory_artefact_model.py +3 -0
  13. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_scan.py +5 -1
  14. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/file_classifier.py +2 -0
  15. ara_cli-0.1.9.62/ara_cli/tests/test_ara_autofix.py +113 -0
  16. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_ara_command_action.py +3 -1
  17. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_artefact_scan.py +3 -0
  18. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_file_classifier.py +22 -1
  19. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/version.py +1 -1
  20. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli.egg-info/PKG-INFO +2 -1
  21. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli.egg-info/SOURCES.txt +2 -1
  22. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli.egg-info/requires.txt +1 -0
  23. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/setup.py +2 -1
  24. ara_cli-0.1.9.60/ara_cli/analyse_artefacts.py +0 -133
  25. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/MANIFEST.in +0 -0
  26. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/__init__.py +0 -0
  27. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/ara_config.py +0 -0
  28. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_deleter.py +0 -0
  29. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_fuzzy_search.py +0 -0
  30. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_link_updater.py +0 -0
  31. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_lister.py +0 -0
  32. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/artefact_load.py +0 -0
  33. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/artefact_mapping.py +0 -0
  34. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/artefact_model.py +0 -0
  35. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/artefact_templates.py +0 -0
  36. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/capability_artefact_model.py +0 -0
  37. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/example_artefact_model.py +0 -0
  38. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/issue_artefact_model.py +0 -0
  39. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/task_artefact_model.py +0 -0
  40. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_models/vision_artefact_model.py +0 -0
  41. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_reader.py +0 -0
  42. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/artefact_renamer.py +0 -0
  43. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/chat.py +0 -0
  44. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/classifier.py +0 -0
  45. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/codefusionretriever.py +0 -0
  46. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/codehierachieretriever.py +0 -0
  47. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/commandline_completer.py +0 -0
  48. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/directory_navigator.py +0 -0
  49. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/file_lister.py +0 -0
  50. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/filename_validator.py +0 -0
  51. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/list_filter.py +0 -0
  52. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/output_suppressor.py +0 -0
  53. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/prompt_chat.py +0 -0
  54. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/prompt_extractor.py +0 -0
  55. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/prompt_handler.py +0 -0
  56. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/prompt_rag.py +0 -0
  57. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/run_file_lister.py +0 -0
  58. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tag_extractor.py +0 -0
  59. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/template_manager.py +0 -0
  60. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/agile.artefacts +0 -0
  61. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/blueprints/complete_pytest_unittest.blueprint.md +0 -0
  62. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/blueprints/empty.blueprint.md +0 -0
  63. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/blueprints/task_todo_list_C4_architecture_analysis.blueprint.md +0 -0
  64. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/blueprints/task_todo_list_implement_feature_BDD_way.blueprint.md +0 -0
  65. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/architecture_C4_analysis.commands.md +0 -0
  66. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/architecture_radon_cc_score.commands.md +0 -0
  67. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/architecture_radon_halstead_v.commands.md +0 -0
  68. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/architecture_radon_maintainability_score.commands.md +0 -0
  69. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/artefact_classification.commands.md +0 -0
  70. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/artefact_extension.commands.md +0 -0
  71. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/artefact_formulation.commands.md +0 -0
  72. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/behave_step_generation.commands.md +0 -0
  73. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/code_generation_complex.commands.md +0 -0
  74. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/code_generation_simple.commands.md +0 -0
  75. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/empty.commands.md +0 -0
  76. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/error_fixing.commands.md +0 -0
  77. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/feature_file_update.commands.md +0 -0
  78. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/feature_formulation.commands.md +0 -0
  79. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/js_code_generation_simple.commands.md +0 -0
  80. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/refactoring.commands.md +0 -0
  81. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/refactoring_analysis.commands.md +0 -0
  82. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/reverse_engineer_feature_file.commands.md +0 -0
  83. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/commands/reverse_engineer_program_flow.commands.md +0 -0
  84. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/classify_task.intention.md +0 -0
  85. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/empty.intention.md +0 -0
  86. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/error_fixing.intention.md +0 -0
  87. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/feature_fix_steps_for_scenario.intention.md +0 -0
  88. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/feature_formulation.intention.md +0 -0
  89. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/feature_reverse_formulation_from_code.intention.md +0 -0
  90. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation.intention.md +0 -0
  91. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation_update.intention.md +0 -0
  92. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/feature_scenario_outline_extension.intention.md +0 -0
  93. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/feature_update_formulation.intention.md +0 -0
  94. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/fibonacci_example_implementation.intention.md +0 -0
  95. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/js_implementation_from_task_description.intention.md +0 -0
  96. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/js_steps_implementation.intention.md +0 -0
  97. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/python_cli_implementation_with_test.intention.md +0 -0
  98. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/python_code_understanding.intention.md +0 -0
  99. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/task_implementation.intention.md +0 -0
  100. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/task_prompt_control_by_status.intention.md +0 -0
  101. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_number.intention.md +0 -0
  102. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_status.intention.md +0 -0
  103. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/rules/architecture_analyst.rules.md +0 -0
  104. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/rules/code_analyst.rules.md +0 -0
  105. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/rules/empty.rules.md +0 -0
  106. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/rules/error_analyst.rules.md +0 -0
  107. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/rules/gherkin_expert.rules.md +0 -0
  108. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/rules/js_expert_developer.rules.md +0 -0
  109. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/rules/product_owner.rules.md +0 -0
  110. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/rules/python_behave.rules.md +0 -0
  111. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/prompt-modules/rules/python_developer.rules.md +0 -0
  112. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/specification_breakdown_files/template.concept.exploration.md +0 -0
  113. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/specification_breakdown_files/template.concept.md +0 -0
  114. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/specification_breakdown_files/template.customer.exploration.md +0 -0
  115. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/specification_breakdown_files/template.customer.md +0 -0
  116. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/specification_breakdown_files/template.persona.exploration.md +0 -0
  117. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/specification_breakdown_files/template.persona.md +0 -0
  118. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/specification_breakdown_files/template.step.exploration.md +0 -0
  119. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/specification_breakdown_files/template.step.md +0 -0
  120. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/specification_breakdown_files/template.technology.exploration.md +0 -0
  121. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/specification_breakdown_files/template.technology.md +0 -0
  122. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.businessgoal +0 -0
  123. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.businessgoal.prompt_log.md +0 -0
  124. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.capability +0 -0
  125. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.capability.prompt_log.md +0 -0
  126. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.epic +0 -0
  127. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.epic.prompt_log.md +0 -0
  128. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.example +0 -0
  129. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.example.prompt_log.md +0 -0
  130. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.feature +0 -0
  131. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.feature.prompt_log.md +0 -0
  132. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.issue +0 -0
  133. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.issue.prompt_log.md +0 -0
  134. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.keyfeature +0 -0
  135. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.keyfeature.prompt_log.md +0 -0
  136. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.steps.prompt_log.md +0 -0
  137. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.task +0 -0
  138. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.task.prompt_log.md +0 -0
  139. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.userstory +0 -0
  140. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.userstory.prompt_log.md +0 -0
  141. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.vision +0 -0
  142. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/templates/template.vision.prompt_log.md +0 -0
  143. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/__init__.py +0 -0
  144. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_ara_config.py +0 -0
  145. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_artefact_fuzzy_search.py +0 -0
  146. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_artefact_link_updater.py +0 -0
  147. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_artefact_lister.py +0 -0
  148. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_artefact_reader.py +0 -0
  149. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_artefact_renamer.py +0 -0
  150. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_chat.py +0 -0
  151. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_classifier.py +0 -0
  152. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_directory_navigator.py +0 -0
  153. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_file_creator.py +0 -0
  154. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_file_lister.py +0 -0
  155. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_list_filter.py +0 -0
  156. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_tag_extractor.py +0 -0
  157. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_template_manager.py +0 -0
  158. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/tests/test_update_config_prompt.py +0 -0
  159. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli/update_config_prompt.py +0 -0
  160. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli.egg-info/dependency_links.txt +0 -0
  161. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli.egg-info/entry_points.txt +0 -0
  162. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/ara_cli.egg-info/top_level.txt +0 -0
  163. {ara_cli-0.1.9.60 → ara_cli-0.1.9.62}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ara_cli
3
- Version: 0.1.9.60
3
+ Version: 0.1.9.62
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
@@ -6,7 +6,6 @@
6
6
  - [update dependencies](#update-dependencies)
7
7
  - [test and run during development](#test-and-run-during-development)
8
8
  - [set version and build and install locally for testing outside of container](#set-version-and-build-and-install-locally-for-testing-outside-of-container)
9
- - [upload to test pypi with test pypi API key](#upload-to-test-pypi-with-test-pypi-api-key)
10
9
  - [upload to live pypi with talsen team production API key (from main branch)](#upload-to-live-pypi-with-talsen-team-production-api-key-from-main-branch)
11
10
 
12
11
  # ara usage
@@ -59,6 +58,8 @@ To update dependencies, add package names in `setup.py`. The packages will ONLY
59
58
  4. Test the functionality
60
59
 
61
60
 
61
+ <!--
62
+ #### DEPRECATED
62
63
  ## upload to test pypi with test pypi API key
63
64
  1. run `bash deploy.sh`
64
65
  2. run `login.sh`
@@ -73,19 +74,20 @@ twine upload --repository testpypi dist/* --verbose -u __token__ -p pypi-AgENdGV
73
74
 
74
75
  this will upload to a test pypi account.
75
76
 
76
-
77
- 6. run `python3 -m pip install --index-url https://test.pypi.org/simple/ ara_cli==<VERSION>`
78
- 7. run `ara -h`
79
- 8. if everything has worked (upload, installation and usage) you can now continue to upload the package to pypi (live)
77
+ 1. run `python3 -m pip install --index-url https://test.pypi.org/simple/ ara_cli==<VERSION>`
78
+ 2. run `ara -h`
79
+ 3. if everything has worked (upload, installation and usage) you can now continue to upload the package to pypi (live)
80
+ -->
80
81
 
81
82
 
82
83
  ## upload to live pypi with talsen team production API key (from main branch)
83
84
  1. run `bash deploy.sh`
84
85
  2. run `login.sh`
85
- 3. `dist` folder should still be there from the testupload (otherwise do `python setup.py sdist bdist_wheel` inside the container again), do NOT upload to live without previously testing in test pypi!
86
- 4. Get the API-Key from [nextcloud](https://cloud.talsen.team/apps/keeweb/?open=%2Finfrastructure%2Fpublic-services%2Fapi-keys.kdbx)
87
- 5. Get the Password from Hans or DevOps
88
- 6. run the following command:
86
+ 3. from inside container run `python setup.py sdist bdist_wheel`
87
+ 4. `dist` folder should now contain the built wheel ready to upload
88
+ 5. Get the API-Key from [nextcloud](https://cloud.talsen.team/apps/keeweb/?open=%2Finfrastructure%2Fpublic-services%2Fapi-keys.kdbx)
89
+ 6. Get the Password from Hans or DevOps
90
+ 7. run the following command:
89
91
  ```bash
90
92
  twine upload dist/* --verbose -u __token__ -p <API-Key>
91
93
  ```
@@ -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
 
@@ -538,3 +538,27 @@ def scan_action(args):
538
538
  if invalid:
539
539
  invalid_artefacts[classifier] = invalid
540
540
  show_results(invalid_artefacts)
541
+
542
+
543
+ def autofix_action(args):
544
+ from ara_cli.artefact_autofix import parse_report, apply_autofix, read_report_file
545
+
546
+ content = read_report_file()
547
+
548
+ if not content:
549
+ return False
550
+
551
+ issues = parse_report(content)
552
+
553
+ if not issues:
554
+ print("No issues found in the report. Nothing to fix.")
555
+ return
556
+
557
+ # print("Found issues to fix:")
558
+ for classifier, files in issues.items():
559
+ print(f"\nClassifier: {classifier}")
560
+ for file_path, reason in files:
561
+ print(f"Attempting to fix {file_path} for reason: {reason}")
562
+ apply_autofix(file_path, classifier, reason)
563
+
564
+ print("\nAutofix process completed. Please review the changes.")
@@ -220,6 +220,10 @@ def scan_parser(subparsers):
220
220
  subparsers.add_parser("scan", help="Scan ARA tree for incompatible artefacts.")
221
221
 
222
222
 
223
+ def autofix_parser(subparsers):
224
+ subparsers.add_parser("autofix", help="Fix ARA tree with llm models for scanned artefacts with ara scan command.")
225
+
226
+
223
227
  class CustomHelpFormatter(argparse.HelpFormatter):
224
228
  def format_help(self):
225
229
  from sys import argv
@@ -307,5 +311,6 @@ def action_parser():
307
311
  set_user_parser(subparsers)
308
312
  classifier_directory_parser(subparsers)
309
313
  scan_parser(subparsers)
314
+ autofix_parser(subparsers)
310
315
 
311
316
  return parser
@@ -0,0 +1,134 @@
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
+ f"Provide the complete, corrected artefact. Don't change the artefact's content, "
87
+ f"just fix the pydantic model errors. You should follow the name of the file "
88
+ f"from its path {file_path} for naming the arteafact's title. The current artefact is:\n{artefact_text}"
89
+ )
90
+
91
+ if artefact_type == ArtefactType.task:
92
+ prompt += (
93
+ "\nFor task artefacts, if the action items looks like template or empty "
94
+ "then just delete those action items."
95
+ "\nFor user tag it should be '@user_{username}'. So you should be careful to "
96
+ "not make it @user_user_{username}"
97
+ )
98
+
99
+ return prompt
100
+
101
+
102
+ def run_agent(prompt, artefact_class):
103
+ from pydantic_ai import Agent
104
+
105
+ agent = Agent(model="openai:gpt-4o",
106
+ result_type=artefact_class, instrument=True)
107
+ result = agent.run_sync(prompt)
108
+ return result.data
109
+
110
+
111
+ def write_corrected_artefact(file_path, corrected_text):
112
+ with open(file_path, 'w') as file:
113
+ file.write(corrected_text)
114
+ print(f"Fixed artefact at {file_path}")
115
+
116
+
117
+ def apply_autofix(file_path, classifier, reason):
118
+ artefact_text = read_artefact(file_path)
119
+ if artefact_text is None:
120
+ return
121
+
122
+ artefact_type, artefact_class = determine_artefact_type_and_class(
123
+ classifier)
124
+ if artefact_type is None or artefact_class is None:
125
+ return
126
+
127
+ prompt = construct_prompt(artefact_type, reason, file_path, artefact_text)
128
+
129
+ try:
130
+ corrected_artefact = run_agent(prompt, artefact_class)
131
+ corrected_text = corrected_artefact.serialize()
132
+ write_corrected_artefact(file_path, corrected_text)
133
+ except Exception as e:
134
+ print(f"Failed to fix artefact at {file_path}: {e}")
@@ -59,9 +59,9 @@ class ArtefactCreator:
59
59
 
60
60
  return True
61
61
 
62
- def handle_existing_files(self, file_exists, dir_exists):
63
- if file_exists or dir_exists:
64
- user_choice = input("File or directory already exists. Do you want to overwrite the existing file and directory? (y/N): ")
62
+ def handle_existing_files(self, file_exists):
63
+ if file_exists:
64
+ user_choice = input("File already exists. Do you want to overwrite the existing file and directory? (y/N): ")
65
65
  if user_choice.lower() != "y":
66
66
  print("No changes were made to the existing file and directory.")
67
67
  return False
@@ -102,12 +102,8 @@ class ArtefactCreator:
102
102
  dir_path = self.file_system.path.join(sub_directory, f"{filename}.data")
103
103
 
104
104
  file_exists = self.file_system.path.exists(file_path)
105
- dir_exists = self.file_system.path.exists(dir_path)
106
105
 
107
- if dir_exists and not os.listdir(dir_path):
108
- dir_exists = False
109
-
110
- if not self.handle_existing_files(file_exists, dir_exists):
106
+ if not self.handle_existing_files(file_exists):
111
107
  return
112
108
 
113
109
  artefact = template_artefact_of_type(classifier, filename)
@@ -48,6 +48,7 @@ class BusinessgoalIntent(Intent):
48
48
 
49
49
  in_order_to_prefix = "In order to "
50
50
  as_a_prefix = "As a "
51
+ as_a_prefix_alt = "As an "
51
52
  i_want_prefix = "I want "
52
53
 
53
54
  index = start_index
@@ -57,6 +58,8 @@ class BusinessgoalIntent(Intent):
57
58
  in_order_to = line[len(in_order_to_prefix):].strip()
58
59
  elif line.startswith(as_a_prefix) and not as_a:
59
60
  as_a = line[len(as_a_prefix):].strip()
61
+ elif line.startswith(as_a_prefix_alt) and not as_a:
62
+ as_a = line[len(as_a_prefix_alt):].strip()
60
63
  elif line.startswith(i_want_prefix) and not i_want:
61
64
  i_want = line[len(i_want_prefix):].strip()
62
65
  index += 1
@@ -49,6 +49,7 @@ class EpicIntent(Intent):
49
49
 
50
50
  in_order_to_prefix = "In order to "
51
51
  as_a_prefix = "As a "
52
+ as_a_prefix_alt = "As an "
52
53
  i_want_prefix = "I want "
53
54
 
54
55
  index = start_index
@@ -58,6 +59,8 @@ class EpicIntent(Intent):
58
59
  in_order_to = line[len(in_order_to_prefix):].strip()
59
60
  elif line.startswith(as_a_prefix) and not as_a:
60
61
  as_a = line[len(as_a_prefix):].strip()
62
+ elif line.startswith(as_a_prefix_alt) and not as_a:
63
+ as_a = line[len(as_a_prefix_alt):].strip()
61
64
  elif line.startswith(i_want_prefix) and not i_want:
62
65
  i_want = line[len(i_want_prefix):].strip()
63
66
  index += 1
@@ -1,5 +1,5 @@
1
1
  from pydantic import BaseModel, field_validator, model_validator, Field
2
- from typing import Optional, List, Dict, Tuple, Union
2
+ from typing import List, Dict, Tuple, Union
3
3
  from ara_cli.artefact_models.artefact_model import Artefact, ArtefactType, Intent
4
4
  import re
5
5
 
@@ -48,6 +48,7 @@ class FeatureIntent(Intent):
48
48
  so_that = None
49
49
 
50
50
  as_a_prefix = "As a "
51
+ as_a_prefix_alt = "As an "
51
52
  i_want_to_prefix = "I want to "
52
53
  so_that_prefix = "So that "
53
54
 
@@ -56,6 +57,8 @@ class FeatureIntent(Intent):
56
57
  line = lines[index]
57
58
  if line.startswith(as_a_prefix) and not as_a:
58
59
  as_a = line[len(as_a_prefix):].strip()
60
+ if line.startswith(as_a_prefix_alt) and not as_a:
61
+ as_a = line[len(as_a_prefix_alt):].strip()
59
62
  elif line.startswith(i_want_to_prefix) and not i_want_to:
60
63
  i_want_to = line[len(i_want_to_prefix):].strip()
61
64
  elif line.startswith(so_that_prefix) and not so_that:
@@ -48,6 +48,7 @@ class KeyfeatureIntent(Intent):
48
48
 
49
49
  in_order_to_prefix = "In order to "
50
50
  as_a_prefix = "As a "
51
+ as_a_prefix_alt = "As an "
51
52
  i_want_prefix = "I want "
52
53
 
53
54
  index = start_index
@@ -57,6 +58,8 @@ class KeyfeatureIntent(Intent):
57
58
  in_order_to = line[len(in_order_to_prefix):].strip()
58
59
  elif line.startswith(as_a_prefix) and not as_a:
59
60
  as_a = line[len(as_a_prefix):].strip()
61
+ elif line.startswith(as_a_prefix_alt) and not as_a:
62
+ as_a = line[len(as_a_prefix_alt):].strip()
60
63
  elif line.startswith(i_want_prefix) and not i_want:
61
64
  i_want = line[len(i_want_prefix):].strip()
62
65
  index += 1
@@ -48,6 +48,7 @@ class UserstoryIntent(Intent):
48
48
 
49
49
  in_order_to_prefix = "In order to "
50
50
  as_a_prefix = "As a "
51
+ as_a_prefix_alt = "As an "
51
52
  i_want_prefix = "I want "
52
53
 
53
54
  index = start_index
@@ -57,6 +58,8 @@ class UserstoryIntent(Intent):
57
58
  in_order_to = line[len(in_order_to_prefix):].strip()
58
59
  elif line.startswith(as_a_prefix) and not as_a:
59
60
  as_a = line[len(as_a_prefix):].strip()
61
+ elif line.startswith(as_a_prefix_alt) and not as_a:
62
+ as_a = line[len(as_a_prefix_alt):].strip()
60
63
  elif line.startswith(i_want_prefix) and not i_want:
61
64
  i_want = line[len(i_want_prefix):].strip()
62
65
  index += 1
@@ -1,3 +1,6 @@
1
+ from textwrap import indent
2
+
3
+
1
4
  def check_file(file_path, artefact_class):
2
5
  from pydantic import ValidationError
3
6
  try:
@@ -38,7 +41,8 @@ def show_results(invalid_artefacts):
38
41
  print(f"\nIncompatible {classifier} Files:")
39
42
  report.write(f"## {classifier}\n")
40
43
  for file, reason in files:
41
- print(f"\t- {file}")
44
+ indented_reason = indent(reason, prefix="\t\t")
45
+ print(f"\t- {file}\n{indented_reason}")
42
46
  report.write(f"- `{file}`: {reason}\n")
43
47
  report.write("\n")
44
48
  if not has_issues:
@@ -68,6 +68,8 @@ class FileClassifier:
68
68
  files_by_classifier = {classifier: [] for classifier in Classifier.ordered_classifiers()}
69
69
 
70
70
  for root, _, files in self.file_system.walk("."):
71
+ if root.endswith(".data"):
72
+ continue
71
73
  for file in files:
72
74
  file_path = self.file_system.path.join(root, file)
73
75
  classifier = self.classify_file(file_path, 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
 
@@ -647,6 +648,7 @@ def test_scan_action_with_issues(capsys):
647
648
  expected_output = (
648
649
  "\nIncompatible classifier1 Files:\n"
649
650
  "\t- file1.txt\n"
651
+ "\t\treason1\n"
650
652
  )
651
653
  assert captured.out == expected_output
652
654
  m.assert_called_once_with("incompatible_artefacts_report.md", "w")
@@ -106,9 +106,12 @@ def test_show_results_with_issues(capsys):
106
106
  expected_output = (
107
107
  "\nIncompatible classifier1 Files:\n"
108
108
  "\t- file1.txt\n"
109
+ "\t\treason1\n"
109
110
  "\t- file2.txt\n"
111
+ "\t\treason2\n"
110
112
  "\nIncompatible classifier2 Files:\n"
111
113
  "\t- file3.txt\n"
114
+ "\t\treason3\n"
112
115
  )
113
116
  assert captured.out == expected_output
114
117
  m.assert_called_once_with("incompatible_artefacts_report.md", "w")
@@ -247,4 +247,25 @@ def test_find_closest_artefact_name_match(mock_file_system):
247
247
  mock_fuzzy.assert_called_once_with('file3', ['file1', 'file2'])
248
248
 
249
249
  # No match for classifier
250
- assert classifier.find_closest_artefact_name_match('file1', 'txt') is None
250
+ assert classifier.find_closest_artefact_name_match('file1', 'txt') is None
251
+
252
+
253
+ @pytest.mark.parametrize("walk_return_value, expected_result", [
254
+ (
255
+ [('.', ['subdir'], ['file1.py']), ('subdir.data', [], ['file_in_data.txt'])],
256
+ {'py': [{'file_path': './file1.py', 'title': 'file1'}], 'txt': [], 'bin': []}
257
+ ),
258
+ (
259
+ [('.', ['subdir'], ['file1.py']), ('subdir', [], ['file2.txt'])],
260
+ {'py': [{'file_path': './file1.py', 'title': 'file1'}], 'txt': [{'file_path': 'subdir/file2.txt', 'title': 'file2'}], 'bin': []}
261
+ )
262
+ ])
263
+ def test_classify_files_skips_data_directories(mock_file_system, mock_classifier, walk_return_value, expected_result):
264
+ mock_file_system.walk.return_value = walk_return_value
265
+ mock_file_system.path.join.side_effect = lambda root, file: f"{root}/{file}"
266
+
267
+ classifier = FileClassifier(mock_file_system)
268
+
269
+ result = classifier.classify_files()
270
+
271
+ assert result == expected_result
@@ -1,2 +1,2 @@
1
1
  # version.py
2
- __version__ = "0.1.9.60" # fith parameter like .0 for local install test purposes only. official numbers should be 4 digit numbers
2
+ __version__ = "0.1.9.62" # 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.60
3
+ Version: 0.1.9.62
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
@@ -139,6 +139,7 @@ ara_cli/templates/specification_breakdown_files/template.step.md
139
139
  ara_cli/templates/specification_breakdown_files/template.technology.exploration.md
140
140
  ara_cli/templates/specification_breakdown_files/template.technology.md
141
141
  ara_cli/tests/__init__.py
142
+ ara_cli/tests/test_ara_autofix.py
142
143
  ara_cli/tests/test_ara_command_action.py
143
144
  ara_cli/tests/test_ara_config.py
144
145
  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
  )