ara-cli 0.1.13.2__tar.gz → 0.1.13.6__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 (248) hide show
  1. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/PKG-INFO +2 -2
  2. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/__main__.py +6 -5
  3. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_command_action.py +29 -23
  4. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_config.py +1 -1
  5. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/list.py +50 -20
  6. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/feature_artefact_model.py +8 -8
  7. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/chat.py +89 -62
  8. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/chat_script_runner/script_lister.py +12 -9
  9. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/chat_script_runner/script_runner.py +6 -2
  10. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/version.py +1 -1
  11. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli.egg-info/PKG-INFO +2 -2
  12. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli.egg-info/SOURCES.txt +1 -0
  13. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli.egg-info/requires.txt +1 -1
  14. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/docker/base/requirements.txt +1 -1
  15. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_ara_command_action.py +31 -19
  16. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_chat.py +160 -110
  17. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_chat_givens_images.py +4 -4
  18. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_chat_script_runner.py +26 -1
  19. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_prompt_chat.py +2 -2
  20. ara_cli-0.1.13.6/tests/test_setup_default_chat_prompt_mode.py +198 -0
  21. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/MANIFEST.in +0 -0
  22. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/README.md +0 -0
  23. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/__init__.py +0 -0
  24. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/__init__.py +0 -0
  25. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/autofix.py +0 -0
  26. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/chat.py +0 -0
  27. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/classifier_directory.py +0 -0
  28. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/common.py +0 -0
  29. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/config.py +0 -0
  30. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/convert.py +0 -0
  31. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/create.py +0 -0
  32. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/delete.py +0 -0
  33. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/extract.py +0 -0
  34. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/fetch.py +0 -0
  35. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/fetch_agents.py +0 -0
  36. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/fetch_scripts.py +0 -0
  37. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/fetch_templates.py +0 -0
  38. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/list_tags.py +0 -0
  39. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/load.py +0 -0
  40. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/prompt.py +0 -0
  41. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/read.py +0 -0
  42. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/read_status.py +0 -0
  43. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/read_user.py +0 -0
  44. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/reconnect.py +0 -0
  45. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/rename.py +0 -0
  46. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/scan.py +0 -0
  47. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/set_status.py +0 -0
  48. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/set_user.py +0 -0
  49. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/ara_subcommands/template.py +0 -0
  50. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_autofix.py +0 -0
  51. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_converter.py +0 -0
  52. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_creator.py +0 -0
  53. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_deleter.py +0 -0
  54. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_fuzzy_search.py +0 -0
  55. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_link_updater.py +0 -0
  56. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_lister.py +0 -0
  57. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/__init__.py +0 -0
  58. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/artefact_data_retrieval.py +0 -0
  59. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/artefact_load.py +0 -0
  60. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/artefact_mapping.py +0 -0
  61. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/artefact_model.py +0 -0
  62. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/artefact_templates.py +0 -0
  63. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/businessgoal_artefact_model.py +0 -0
  64. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/capability_artefact_model.py +0 -0
  65. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/epic_artefact_model.py +0 -0
  66. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/example_artefact_model.py +0 -0
  67. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/issue_artefact_model.py +0 -0
  68. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/keyfeature_artefact_model.py +0 -0
  69. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/serialize_helper.py +0 -0
  70. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/task_artefact_model.py +0 -0
  71. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/userstory_artefact_model.py +0 -0
  72. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_models/vision_artefact_model.py +0 -0
  73. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_reader.py +0 -0
  74. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_renamer.py +0 -0
  75. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/artefact_scan.py +0 -0
  76. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/chat_agent/__init__.py +0 -0
  77. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/chat_agent/agent_process_manager.py +0 -0
  78. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/chat_script_runner/__init__.py +0 -0
  79. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/chat_script_runner/script_completer.py +0 -0
  80. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/chat_script_runner/script_finder.py +0 -0
  81. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/chat_web_search/__init__.py +0 -0
  82. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/chat_web_search/web_search.py +0 -0
  83. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/classifier.py +0 -0
  84. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/codefusionretriever.py +0 -0
  85. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/codehierachieretriever.py +0 -0
  86. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commandline_completer.py +0 -0
  87. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/__init__.py +0 -0
  88. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/agent_run_command.py +0 -0
  89. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/command.py +0 -0
  90. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/extract_command.py +0 -0
  91. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/fetch_agents_command.py +0 -0
  92. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/fetch_scripts_command.py +0 -0
  93. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/fetch_templates_command.py +0 -0
  94. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/fetch_templates_commands.py +0 -0
  95. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/list_agents_command.py +0 -0
  96. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/load_command.py +0 -0
  97. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/load_image_command.py +0 -0
  98. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/commands/read_command.py +0 -0
  99. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/completers.py +0 -0
  100. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/constants.py +0 -0
  101. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/directory_navigator.py +0 -0
  102. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/error_handler.py +0 -0
  103. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_classifier.py +0 -0
  104. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_lister.py +0 -0
  105. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_loaders/__init__.py +0 -0
  106. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_loaders/binary_file_loader.py +0 -0
  107. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_loaders/document_file_loader.py +0 -0
  108. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_loaders/document_reader.py +0 -0
  109. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_loaders/document_readers.py +0 -0
  110. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_loaders/file_loader.py +0 -0
  111. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_loaders/file_loaders.py +0 -0
  112. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_loaders/image_processor.py +0 -0
  113. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_loaders/markdown_reader.py +0 -0
  114. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/file_loaders/text_file_loader.py +0 -0
  115. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/filename_validator.py +0 -0
  116. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/global_file_lister.py +0 -0
  117. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/list_filter.py +0 -0
  118. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/llm_utils.py +0 -0
  119. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/output_suppressor.py +0 -0
  120. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/prompt_chat.py +0 -0
  121. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/prompt_extractor.py +0 -0
  122. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/prompt_handler.py +0 -0
  123. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/prompt_rag.py +0 -0
  124. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/run_file_lister.py +0 -0
  125. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/tag_extractor.py +0 -0
  126. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/template_loader.py +0 -0
  127. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/template_manager.py +0 -0
  128. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/agile.artefacts +0 -0
  129. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/global-scripts/hello_global.py +0 -0
  130. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/blueprints/empty.blueprint.md +0 -0
  131. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/blueprints/task_todo_list_C4_architecture_analysis.blueprint.md +0 -0
  132. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/add_scenarios_for_new_behaviour.feature_creation_agent.commands.md +0 -0
  133. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/align_feature_with_implementation_changes.interview_agent.commands.md +0 -0
  134. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/analyze_codebase_and_plan_tasks.interview_agent.commands.md +0 -0
  135. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/architecture_C4_analysis.commands.md +0 -0
  136. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/architecture_radon_cc_score.commands.md +0 -0
  137. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/architecture_radon_halstead_v.commands.md +0 -0
  138. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/architecture_radon_maintainability_score.commands.md +0 -0
  139. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/choose_best_parent_artefact.interview_agent.commands.md +0 -0
  140. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/create_tasks_from_artefact_content.interview_agent.commands.md +0 -0
  141. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/create_tests_for_uncovered_modules.test_generation_agent.commands.md +0 -0
  142. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/derive_features_from_video_description.feature_creation_agent.commands.md +0 -0
  143. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/describe_agent_capabilities.agent.commands.md +0 -0
  144. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/empty.commands.md +0 -0
  145. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/execute_scoped_todos_in_task.interview_agent.commands.md +0 -0
  146. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/explain_single_file_purpose.interview_agent.commands.md +0 -0
  147. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/extract_file_information_bullets.interview_agent.commands.md +0 -0
  148. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/extract_general.commands.md +0 -0
  149. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/extract_markdown.commands.md +0 -0
  150. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/extract_python.commands.md +0 -0
  151. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/feature_add_or_modifiy_specified_behavior.commands.md +0 -0
  152. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/feature_generate_initial_specified_bevahior.commands.md +0 -0
  153. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/fix_failing_behave_step_definitions.interview_agent.commands.md +0 -0
  154. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/fix_failing_pytest_tests.interview_agent.commands.md +0 -0
  155. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/general_instruction_policy.commands.md +0 -0
  156. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/generate_and_fix_pytest_tests.test_generation_agent.commands.md +0 -0
  157. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/prompt_template_tech_stack_transformer.commands.md +0 -0
  158. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/python_bug_fixing_code.commands.md +0 -0
  159. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/python_generate_code.commands.md +0 -0
  160. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/python_refactoring_code.commands.md +0 -0
  161. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/python_step_definitions_generation_and_fixing.commands.md +0 -0
  162. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/python_unittest_generation_and_fixing.commands.md +0 -0
  163. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/suggest_next_story_child_tasks.interview_agent.commands.md +0 -0
  164. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/summarize_or_transcribe_media.interview_agent.commands.md +0 -0
  165. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/update_feature_to_match_implementation.feature_creation_agent.commands.md +0 -0
  166. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/commands/update_user_story_with_requirements.interview_agent.commands.md +0 -0
  167. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/classify_task.intention.md +0 -0
  168. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/empty.intention.md +0 -0
  169. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/error_fixing.intention.md +0 -0
  170. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/feature_fix_steps_for_scenario.intention.md +0 -0
  171. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/feature_formulation.intention.md +0 -0
  172. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/feature_reverse_formulation_from_code.intention.md +0 -0
  173. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation.intention.md +0 -0
  174. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation_update.intention.md +0 -0
  175. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/feature_scenario_outline_extension.intention.md +0 -0
  176. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/feature_update_formulation.intention.md +0 -0
  177. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/fibonacci_example_implementation.intention.md +0 -0
  178. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/js_implementation_from_task_description.intention.md +0 -0
  179. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/js_steps_implementation.intention.md +0 -0
  180. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/python_cli_implementation_with_test.intention.md +0 -0
  181. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/python_code_understanding.intention.md +0 -0
  182. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/task_implementation.intention.md +0 -0
  183. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/task_prompt_control_by_status.intention.md +0 -0
  184. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_number.intention.md +0 -0
  185. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_status.intention.md +0 -0
  186. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/rules/architecture_analyst.rules.md +0 -0
  187. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/rules/code_analyst.rules.md +0 -0
  188. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/rules/empty.rules.md +0 -0
  189. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/rules/error_analyst.rules.md +0 -0
  190. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/rules/gherkin_expert.rules.md +0 -0
  191. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/rules/js_expert_developer.rules.md +0 -0
  192. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/rules/product_owner.rules.md +0 -0
  193. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/rules/python_behave.rules.md +0 -0
  194. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/prompt-modules/rules/python_developer.rules.md +0 -0
  195. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/specification_breakdown_files/template.concept.exploration.md +0 -0
  196. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/specification_breakdown_files/template.concept.md +0 -0
  197. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/specification_breakdown_files/template.customer.exploration.md +0 -0
  198. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/specification_breakdown_files/template.customer.md +0 -0
  199. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/specification_breakdown_files/template.persona.exploration.md +0 -0
  200. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/specification_breakdown_files/template.persona.md +0 -0
  201. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/specification_breakdown_files/template.step.exploration.md +0 -0
  202. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/specification_breakdown_files/template.step.md +0 -0
  203. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/specification_breakdown_files/template.technology.exploration.md +0 -0
  204. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/specification_breakdown_files/template.technology.md +0 -0
  205. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/template.businessgoal.prompt_log.md +0 -0
  206. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/template.capability.prompt_log.md +0 -0
  207. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/template.epic.prompt_log.md +0 -0
  208. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/template.example.prompt_log.md +0 -0
  209. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/template.feature.prompt_log.md +0 -0
  210. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/template.issue.prompt_log.md +0 -0
  211. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/template.keyfeature.prompt_log.md +0 -0
  212. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/template.steps.prompt_log.md +0 -0
  213. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/template.task.prompt_log.md +0 -0
  214. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/template.userstory.prompt_log.md +0 -0
  215. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/templates/template.vision.prompt_log.md +0 -0
  216. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli/update_config_prompt.py +0 -0
  217. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli.egg-info/dependency_links.txt +0 -0
  218. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli.egg-info/entry_points.txt +0 -0
  219. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/ara_cli.egg-info/top_level.txt +0 -0
  220. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/setup.cfg +0 -0
  221. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/setup.py +0 -0
  222. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/__init__.py +0 -0
  223. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_ara_config.py +0 -0
  224. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_artefact_autofix.py +0 -0
  225. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_artefact_autofix_integration.py +0 -0
  226. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_artefact_converter.py +0 -0
  227. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_artefact_extraction.py +0 -0
  228. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_artefact_fuzzy_search.py +0 -0
  229. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_artefact_link_updater.py +0 -0
  230. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_artefact_lister.py +0 -0
  231. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_artefact_reader.py +0 -0
  232. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_artefact_renamer.py +0 -0
  233. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_artefact_scan.py +0 -0
  234. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_classifier.py +0 -0
  235. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_directory_navigator.py +0 -0
  236. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_file_classifier.py +0 -0
  237. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_file_creator.py +0 -0
  238. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_file_lister.py +0 -0
  239. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_global_file_lister.py +0 -0
  240. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_list_filter.py +0 -0
  241. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_llm_utils.py +0 -0
  242. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_prompt_extractor.py +0 -0
  243. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_prompt_handler.py +0 -0
  244. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_tag_extractor.py +0 -0
  245. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_template_loader.py +0 -0
  246. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_template_manager.py +0 -0
  247. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_update_config_prompt.py +0 -0
  248. {ara_cli-0.1.13.2 → ara_cli-0.1.13.6}/tests/test_web_search.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ara_cli
3
- Version: 0.1.13.2
3
+ Version: 0.1.13.6
4
4
  Summary: Powerful, open source command-line tool for managing, structuring and automating software development artifacts in line with Business-Driven Development (BDD) and AI-assisted processes
5
5
  Description-Content-Type: text/markdown
6
6
  Requires-Dist: langfuse
7
- Requires-Dist: litellm
7
+ Requires-Dist: litellm>=1.81.0
8
8
  Requires-Dist: llama-index
9
9
  Requires-Dist: llama-index-llms-openai
10
10
  Requires-Dist: llama-index-retrievers-bm25
@@ -169,15 +169,16 @@ ara artefact handling examples:
169
169
  > rename artefact and artefact data directory for e.g. a feature: ara rename feature {initial_feature_name} {new_feature_name}
170
170
  > create additional templates for a specific aspect (valid aspects are: customer,
171
171
  persona, concept, technology) related to an existing artefact like a feature: ara create feature {feature_name} aspect {aspect_name}
172
- > list artefact data with .md file extension ara list --data {classifier} {artefact_name} --include-extension .md
173
- > list artefact data with .md and .json file extensions ara list --data {classifier} {artefact_name} --include-extension .md .json
172
+ > list artefact data with .md file extension ara list {classifier} {artefact_name} --data --include-extension .md
173
+ > list artefact data with .md and .json file extensions ara list {classifier} {artefact_name} --data --include-extension .md .json
174
174
  > list everything but userstories ara list --exclude-extension .userstory
175
175
  > list all existing features: ara list --include-extension .feature
176
+ > list all artefacts of a specific classifier: ara list {classifier}
176
177
  > list all child artefacts contributing value to a parent artefact: ara list --include-content "Contributes to {name_of_parent_artefact} {ara classifier_of_parent_artefact}"
177
178
  > list tasks which contain 'example content' ara list --include-extension .task --include-content "example content"
178
- > list children artefacts of a userstory ara list --children userstory {name_of_userstory}
179
- > list parent artefacts of a userstory ara list --branch userstory {name_of_userstory}
180
- > list parent businessgoal artefact of a userstory ara list --branch userstory {name_of_userstory} --include-extension .businessgoal
179
+ > list children artefacts of a userstory ara list userstory {name_of_userstory} --children
180
+ > list parent artefacts of a userstory ara list userstory {name_of_userstory} --branch
181
+ > list parent businessgoal artefact of a userstory ara list userstory {name_of_userstory} --branch --include-extension .businessgoal
181
182
  > print any artefact template for e.g. a feature file template in the terminal: ara template feature
182
183
 
183
184
  ara prompt templates examples:
@@ -99,14 +99,22 @@ def rename_action(args):
99
99
  artefact_renamer.rename(args.parameter, args.aspect, args.classifier)
100
100
 
101
101
 
102
+ def _execute_list_method(method, classifier, artefact_name, list_filter, flag_name):
103
+ """Helper function to validate and execute list methods."""
104
+ if not classifier or not artefact_name:
105
+ raise AraError(
106
+ f"Both classifier and artefact_name are required for --{flag_name}"
107
+ )
108
+ method(classifier=classifier, artefact_name=artefact_name, list_filter=list_filter)
109
+
110
+
102
111
  @handle_errors(context="rename action", error_handler=error_handler)
103
112
  def list_action(args):
104
113
  from ara_cli.artefact_lister import ArtefactLister
105
114
  from ara_cli.list_filter import ListFilter
106
115
 
107
- branch_classifier, branch_artefact_name = args.branch_args
108
- children_classifier, children_artefact_name = args.children_args
109
- data_classifier, data_artefact_name = args.data_args
116
+ classifier = args.classifier
117
+ artefact_name = args.artefact_name
110
118
 
111
119
  artefact_lister = ArtefactLister()
112
120
 
@@ -119,29 +127,27 @@ def list_action(args):
119
127
  exclude_tags=args.exclude_tags
120
128
  )
121
129
 
122
- if branch_classifier and branch_artefact_name:
123
- artefact_lister.list_branch(
124
- classifier=branch_classifier,
125
- artefact_name=branch_artefact_name,
126
- list_filter=list_filter
127
- )
128
- return
130
+ # Map flags to their corresponding methods
131
+ flag_method_map = {
132
+ "branch": (args.branch, artefact_lister.list_branch),
133
+ "children": (args.children, artefact_lister.list_children),
134
+ "data": (args.data, artefact_lister.list_data),
135
+ }
129
136
 
130
- if children_classifier and children_artefact_name:
131
- artefact_lister.list_children(
132
- classifier=children_classifier,
133
- artefact_name=children_artefact_name,
134
- list_filter=list_filter
135
- )
136
- return
137
+ for flag_name, (flag_value, method) in flag_method_map.items():
138
+ if flag_value:
139
+ _execute_list_method(
140
+ method, classifier, artefact_name, list_filter, flag_name
141
+ )
142
+ return
137
143
 
138
- if data_classifier and data_artefact_name:
139
- artefact_lister.list_data(
140
- classifier=data_classifier,
141
- artefact_name=data_artefact_name,
142
- list_filter=list_filter
144
+ # If both classifier and artefact_name are present, but no specific action flag (branch, children, data)
145
+ # was provided, raise an error as per requirements.
146
+ if classifier and artefact_name:
147
+ raise AraError(
148
+ f"To list specific info for '{classifier} {artefact_name}', "
149
+ "you must provide one of: --children, --branch, or --data."
143
150
  )
144
- return
145
151
 
146
152
  artefact_lister.list_files(list_filter=list_filter)
147
153
 
@@ -34,7 +34,7 @@ def get_default_llm_config() -> Dict[str, "LLMConfigItem"]:
34
34
  "gpt-5-web": LLMConfigItem(
35
35
  provider="openai",
36
36
  model="openai/gpt-5-search-api",
37
- temperature=1,
37
+ temperature=None,
38
38
  max_completion_tokens=16000,
39
39
  ),
40
40
  "gpt-4o": LLMConfigItem(
@@ -2,6 +2,7 @@ import typer
2
2
  from ara_cli.error_handler import AraError
3
3
  from typing import Optional, List, Tuple
4
4
  from .common import MockArgs
5
+ from ara_cli.completers import DynamicCompleters
5
6
  from ara_cli.ara_command_action import list_action
6
7
 
7
8
 
@@ -16,19 +17,28 @@ def _validate_extension_options(
16
17
 
17
18
 
18
19
  def _validate_exclusive_options(
19
- branch: Optional[Tuple[str, str]],
20
- children: Optional[Tuple[str, str]],
21
- data: Optional[Tuple[str, str]],
20
+ branch: bool,
21
+ children: bool,
22
+ data: bool,
22
23
  ) -> None:
23
24
  """Validate that branch, children, and data options are mutually exclusive."""
24
25
  exclusive_options = [branch, children, data]
25
- non_none_options = [opt for opt in exclusive_options if opt is not None]
26
- if len(non_none_options) > 1:
26
+ true_options = [opt for opt in exclusive_options if opt]
27
+ if len(true_options) > 1:
27
28
  raise AraError("--branch, --children, and --data are mutually exclusive")
28
29
 
29
30
 
30
31
  def list_main(
31
- ctx: typer.Context,
32
+ classifier: Optional[str] = typer.Argument(
33
+ None,
34
+ help="The classifier of the artefact",
35
+ autocompletion=DynamicCompleters.create_classifier_completer(),
36
+ ),
37
+ artefact_name: Optional[str] = typer.Argument(
38
+ None,
39
+ help="The name of the artefact",
40
+ autocompletion=DynamicCompleters.create_artefact_name_completer(),
41
+ ),
32
42
  include_content: Optional[List[str]] = typer.Option(
33
43
  None,
34
44
  "-I",
@@ -61,44 +71,64 @@ def list_main(
61
71
  "--exclude-classifier",
62
72
  help="list of extensions to exclude from listing",
63
73
  ),
64
- branch: Optional[Tuple[str, str]] = typer.Option(
65
- None,
74
+ branch: bool = typer.Option(
75
+ False,
66
76
  "-b",
67
77
  "--branch",
68
- help="List artefacts in the parent chain (classifier artefact_name)",
78
+ help="List artefacts in the parent chain (requires classifier and artefact_name)",
69
79
  ),
70
- children: Optional[Tuple[str, str]] = typer.Option(
71
- None, "-c", "--children", help="List child artefacts (classifier artefact_name)"
80
+ children: bool = typer.Option(
81
+ False,
82
+ "-c",
83
+ "--children",
84
+ help="List child artefacts (requires classifier and artefact_name)",
72
85
  ),
73
- data: Optional[Tuple[str, str]] = typer.Option(
74
- None,
86
+ data: bool = typer.Option(
87
+ False,
75
88
  "-d",
76
89
  "--data",
77
- help="List file in the data directory (classifier artefact_name)",
90
+ help="List file in the data directory (requires classifier and artefact_name)",
78
91
  ),
79
92
  ):
80
93
  """List files with optional tags.
81
94
 
82
95
  Examples:
83
- ara list --data feature my_feature --include-extension .md
96
+ ara list feature my_feature --data --include-extension .md
84
97
  ara list --include-extension .feature
85
- ara list --children userstory my_story
86
- ara list --branch userstory my_story --include-extension .businessgoal
98
+ ara list userstory my_story --children
99
+ ara list userstory my_story --branch --include-extension .businessgoal
87
100
  ara list --include-content "example content" --include-extension .task
88
101
  """
89
102
  _validate_extension_options(include_extension, exclude_extension)
90
103
  _validate_exclusive_options(branch, children, data)
91
104
 
105
+ # If classifier is provided but no artefact_name, and no other specific flags are set,
106
+ # treat it as a filter by classifier (extension).
107
+ # This supports "ara list feature" -> lists all features.
108
+ if classifier and not artefact_name and not (branch or children or data):
109
+ # We append the classifier (prefixed with '.') to include_extension
110
+ # This assumes classifier names correspond to extensions (e.g. 'feature' -> '.feature')
111
+ # existing logic usually expects the extension format.
112
+ ext = f".{classifier}"
113
+ if include_extension:
114
+ include_extension.append(ext)
115
+ else:
116
+ include_extension = [ext]
117
+ # Clear classifier from args so it doesn't trigger other logic
118
+ classifier = None
119
+
92
120
  args = MockArgs(
121
+ classifier=classifier,
122
+ artefact_name=artefact_name,
93
123
  include_content=include_content,
94
124
  exclude_content=exclude_content,
95
125
  include_tags=include_tags,
96
126
  exclude_tags=exclude_tags,
97
127
  include_extension=include_extension,
98
128
  exclude_extension=exclude_extension,
99
- branch_args=tuple(branch) if branch else (None, None),
100
- children_args=tuple(children) if children else (None, None),
101
- data_args=tuple(data) if data else (None, None),
129
+ branch=branch,
130
+ children=children,
131
+ data=data,
102
132
  )
103
133
 
104
134
  list_action(args)
@@ -149,10 +149,10 @@ class Scenario(BaseModel):
149
149
  return steps
150
150
 
151
151
  @model_validator(mode='after')
152
- def check_no_placeholders(cls, values: 'Scenario') -> 'Scenario':
152
+ def check_no_placeholders(self) -> 'Scenario':
153
153
  """Ensure regular scenarios don't contain placeholders that should be in scenario outlines."""
154
154
  placeholders = set()
155
- for step in values.steps:
155
+ for step in self.steps:
156
156
  # Skip validation if step contains docstring placeholders (during parsing)
157
157
  if '__DOCSTRING_PLACEHOLDER_' in step:
158
158
  continue
@@ -170,7 +170,7 @@ class Scenario(BaseModel):
170
170
  f"Scenario Contains Placeholders ({placeholder_list}) but is not a Scenario Outline. "
171
171
  f"Use 'Scenario Outline:' instead of 'Scenario:' and provide an Examples table."
172
172
  )
173
- return values
173
+ return self
174
174
 
175
175
  @classmethod
176
176
  def from_lines(cls, lines: List[str], start_idx: int) -> Tuple['Scenario', int]:
@@ -219,18 +219,18 @@ class ScenarioOutline(BaseModel):
219
219
  return v
220
220
 
221
221
  @model_validator(mode='after')
222
- def check_placeholders(cls, values: 'ScenarioOutline') -> 'ScenarioOutline':
222
+ def check_placeholders(self) -> 'ScenarioOutline':
223
223
  """Ensure all placeholders in steps have corresponding values in examples."""
224
224
  placeholders = set()
225
- for step in values.steps:
225
+ for step in self.steps:
226
226
  found = re.findall(r'<([^>]+)>', step)
227
227
  placeholders.update(found)
228
- for example in values.examples:
228
+ for example in self.examples:
229
229
  missing = placeholders - set(example.values.keys())
230
230
  if missing:
231
231
  raise ValueError(
232
232
  f"Example is missing values for placeholders: {missing}")
233
- return values
233
+ return self
234
234
 
235
235
  @classmethod
236
236
  def from_lines(cls, lines: List[str], start_idx: int) -> Tuple['ScenarioOutline', int]:
@@ -298,7 +298,7 @@ class FeatureArtefact(Artefact):
298
298
  def validate_artefact_type(cls, v):
299
299
  if v != ArtefactType.feature:
300
300
  raise ValueError(
301
- f"FeatureArtefact must have artefact_type of '{ArtefactType.feature}', not '{v}'")
301
+ f"FeatureArtefact must have artefact_type of '{ArtefactType.feature.value}', not '{v}'")
302
302
  return v
303
303
 
304
304
  @classmethod
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import sys
2
3
  import argparse
3
4
  import cmd2
4
5
 
@@ -43,8 +44,7 @@ extract_parser.add_argument(
43
44
  )
44
45
 
45
46
  load_parser = argparse.ArgumentParser()
46
- load_parser.add_argument("file_name", nargs="?",
47
- default="", help="File to load")
47
+ load_parser.add_argument("file_name", nargs="?", default="", help="File to load")
48
48
  load_parser.add_argument(
49
49
  "--load-images",
50
50
  action="store_true",
@@ -147,9 +147,12 @@ class Chat(cmd2.Cmd):
147
147
  chat_file_short = os.path.split(chat_file)[-1]
148
148
 
149
149
  if reset is None:
150
- user_input = input(
151
- f"{chat_file_short} already exists. Do you want to reset the chat? (y/N): "
150
+ print(
151
+ f"{chat_file_short} already exists. Do you want to reset the chat? (y/N): ",
152
+ end="",
153
+ flush=True,
152
154
  )
155
+ user_input = sys.stdin.readline().strip()
153
156
  if user_input.lower() == "y":
154
157
  self.create_empty_chat_file(chat_file)
155
158
  if reset:
@@ -232,8 +235,7 @@ class Chat(cmd2.Cmd):
232
235
  for line in message.splitlines():
233
236
  match = image_pattern.search(line)
234
237
  if match:
235
- image_data = {"type": "image_url",
236
- "image_url": {"url": match.group(1)}}
238
+ image_data = {"type": "image_url", "image_url": {"url": match.group(1)}}
237
239
  image_data_list.append(image_data)
238
240
  else:
239
241
  text_content.append(line)
@@ -466,7 +468,8 @@ class Chat(cmd2.Cmd):
466
468
  files.sort()
467
469
  for i, file in enumerate(files):
468
470
  print(f"{i + 1}: {os.path.basename(file)}")
469
- choice = input("Please choose a file to load (enter number): ")
471
+ print("Please choose a file to load (enter number): ", end="", flush=True)
472
+ choice = sys.stdin.readline().strip()
470
473
  try:
471
474
  choice_index = int(choice) - 1
472
475
  if choice_index < 0 or choice_index >= len(files):
@@ -476,8 +479,7 @@ class Chat(cmd2.Cmd):
476
479
  return None
477
480
  file_path = files[choice_index]
478
481
  except ValueError as e:
479
- error_handler.report_error(
480
- ValueError("Invalid input. Aborting load."))
482
+ error_handler.report_error(ValueError("Invalid input. Aborting load."))
481
483
  return None
482
484
  else:
483
485
  file_path = files[0]
@@ -547,7 +549,7 @@ class Chat(cmd2.Cmd):
547
549
  def complete_LOAD(self, text, line, begidx, endidx):
548
550
  import glob
549
551
 
550
- return [x for x in glob.glob(text + "*")]
552
+ return [x for x in glob.glob(glob.escape(text) + "*")]
551
553
 
552
554
  def _retrieve_ara_config(self):
553
555
  from ara_cli.prompt_handler import ConfigManager
@@ -563,8 +565,13 @@ class Chat(cmd2.Cmd):
563
565
  import glob
564
566
 
565
567
  if file_name == "":
566
- file_name = input("What file do you want to load? ")
568
+ print("What file do you want to load? ", end="", flush=True)
569
+ file_name = sys.stdin.readline().strip()
567
570
  file_pattern = os.path.join(os.path.dirname(self.chat_name), file_name)
571
+
572
+ if os.path.exists(file_pattern):
573
+ return [file_pattern]
574
+
568
575
  matching_files = glob.glob(file_pattern)
569
576
  if not matching_files:
570
577
  error_handler.report_error(
@@ -588,8 +595,7 @@ class Chat(cmd2.Cmd):
588
595
  file_path=file_name, mime_type=file_type, prefix=prefix, suffix=suffix
589
596
  )
590
597
  error_handler.report_error(
591
- AraError(
592
- f"File {file_name} not recognized as image, could not load")
598
+ AraError(f"File {file_name} not recognized as image, could not load")
593
599
  )
594
600
 
595
601
  def _verify_llm_choice(self, model_name):
@@ -784,7 +790,8 @@ class Chat(cmd2.Cmd):
784
790
  def do_NEW(self, chat_name):
785
791
  """Create a new chat. Optionally provide a chat name in-line: NEW new_chat"""
786
792
  if chat_name == "":
787
- chat_name = input("What should be the new chat name? ")
793
+ print("What should be the new chat name? ", end="", flush=True)
794
+ chat_name = sys.stdin.readline().strip()
788
795
  current_directory = os.path.dirname(self.chat_name)
789
796
  chat_file_path = os.path.join(current_directory, chat_name)
790
797
  self.__init__(chat_file_path)
@@ -797,7 +804,8 @@ class Chat(cmd2.Cmd):
797
804
  @cmd2.with_category(CATEGORY_CHAT_CONTROL)
798
805
  def do_CLEAR(self, _):
799
806
  """Clear the chat and the file containing it"""
800
- user_input = input("Are you sure you want to clear the chat? (y/N): ")
807
+ print("Are you sure you want to clear the chat? (y/N): ", end="", flush=True)
808
+ user_input = sys.stdin.readline().strip()
801
809
  if user_input.lower() != "y":
802
810
  return
803
811
  self.create_empty_chat_file(self.chat_name)
@@ -829,8 +837,7 @@ class Chat(cmd2.Cmd):
829
837
  @cmd2.with_category(CATEGORY_CHAT_CONTROL)
830
838
  def do_LOAD_BLUEPRINT(self, blueprint_name):
831
839
  """Load specified blueprint. Specify global/<blueprint_name> to access globally defined blueprints"""
832
- self.template_loader.load_template(
833
- blueprint_name, "blueprint", self.chat_name)
840
+ self.template_loader.load_template(blueprint_name, "blueprint", self.chat_name)
834
841
 
835
842
  def _load_helper(
836
843
  self,
@@ -841,8 +848,7 @@ class Chat(cmd2.Cmd):
841
848
  ):
842
849
  import glob
843
850
 
844
- directory_path = os.path.join(
845
- os.path.dirname(self.chat_name), directory)
851
+ directory_path = os.path.join(os.path.dirname(self.chat_name), directory)
846
852
  file_pattern = os.path.join(directory_path, pattern)
847
853
 
848
854
  exclude_files = []
@@ -953,14 +959,12 @@ class Chat(cmd2.Cmd):
953
959
 
954
960
  # If no file_name, check for defaults
955
961
  default_files_to_check = [
956
- os.path.join(base_directory, "prompt.data",
957
- "config.prompt_givens.md"),
962
+ os.path.join(base_directory, "prompt.data", "config.prompt_givens.md"),
958
963
  os.path.join(
959
964
  base_directory, "prompt.data", "config.prompt_global_givens.md"
960
965
  ),
961
966
  ]
962
- existing_defaults = [
963
- f for f in default_files_to_check if os.path.exists(f)]
967
+ existing_defaults = [f for f in default_files_to_check if os.path.exists(f)]
964
968
  if existing_defaults:
965
969
  return existing_defaults
966
970
 
@@ -1176,61 +1180,84 @@ class Chat(cmd2.Cmd):
1176
1180
  return None
1177
1181
 
1178
1182
  @cmd2.with_category(CATEGORY_SCRIPT_CONTROL)
1179
- def do_run_pyscript(self, arg_list: list):
1180
- """Run a python script from the chat."""
1181
-
1182
- if not arg_list:
1183
- script_name = ""
1184
- else:
1185
- script_name = "".join(arg_list)
1186
-
1187
- script_map = {
1188
- "global/*": (
1189
- self.script_lister.get_global_scripts,
1190
- "No global scripts found. Have you run 'ara fetch --scripts'?",
1191
- "global/",
1192
- ),
1193
- "*": (
1194
- self.script_lister.get_custom_scripts,
1195
- "No custom scripts found.",
1196
- "",
1197
- ),
1198
- "": (self.script_lister.get_all_scripts, "No scripts found.", ""),
1199
- }
1200
-
1201
- script_to_run = script_name
1202
- if script_name in script_map:
1203
- get_scripts, msg, prefix = script_map[script_name]
1204
- scripts = get_scripts()
1205
-
1206
- prompt = "Please choose a script to run (enter number): "
1183
+ def do_run_pyscript(self, args):
1184
+ """Run a python script from the chat.
1185
+ Usage: run_pyscript <script_name> [args...]
1186
+ """
1187
+ script_name, script_args = self._parse_run_pyscript_args(args)
1207
1188
 
1208
- chosen_script = self._select_script_from_list(scripts, msg, prompt)
1209
- if not chosen_script:
1210
- return
1189
+ # If no script name provided, list available scripts grouped by type
1190
+ if not script_name:
1191
+ self._list_available_scripts()
1192
+ return
1211
1193
 
1212
- if prefix:
1213
- script_to_run = f"{prefix}{chosen_script}"
1214
- else:
1215
- script_to_run = chosen_script
1194
+ script_to_run = self._resolve_script_to_run(script_name, script_args)
1216
1195
 
1217
1196
  if not script_to_run:
1218
1197
  return
1219
1198
 
1220
- output = self.script_runner.run_script(script_to_run)
1199
+ # Pass arguments to script runner
1200
+ output = self.script_runner.run_script(script_to_run, script_args)
1221
1201
  if output:
1222
1202
  self.poutput(output.strip())
1223
1203
 
1204
+ def _list_available_scripts(self):
1205
+ """Lists available scripts grouped by type (global and custom)."""
1206
+ global_scripts = self.script_lister.get_global_scripts()
1207
+ custom_scripts = self.script_lister.get_custom_scripts()
1208
+
1209
+ if not global_scripts and not custom_scripts:
1210
+ self.poutput("No scripts found.")
1211
+ return
1212
+
1213
+ self.poutput("Available scripts:")
1214
+ self.poutput("")
1215
+
1216
+ if custom_scripts:
1217
+ self.poutput("Custom scripts:")
1218
+ for script in sorted(custom_scripts):
1219
+ self.poutput(f" {script}")
1220
+ self.poutput("")
1221
+
1222
+ if global_scripts:
1223
+ self.poutput("Global scripts:")
1224
+ for script in sorted(global_scripts):
1225
+ self.poutput(f" global/{script}")
1226
+
1227
+ def _parse_run_pyscript_args(self, args):
1228
+ """Parses arguments for run_pyscript command."""
1229
+ import shlex
1230
+
1231
+ if not args:
1232
+ return "", []
1233
+
1234
+ # args is a cmd2.Statement (subclass of str), so we can use it directly
1235
+ full_args = str(args)
1236
+ # Use shlex to split arguments, enabling quoted args support
1237
+ split_args = shlex.split(full_args)
1238
+ if not split_args:
1239
+ return "", []
1240
+
1241
+ script_name = split_args[0]
1242
+ script_args = split_args[1:] if len(split_args) > 1 else []
1243
+ return script_name, script_args
1244
+
1245
+ def _resolve_script_to_run(self, script_name, script_args):
1246
+ """Resolves the script name to run."""
1247
+ return script_name
1248
+
1224
1249
  def complete_run_pyscript(self, text, line, begidx, endidx):
1225
1250
  """Completer for the run_pyscript command."""
1226
1251
  # Get all scripts: ['custom.py', 'global/global.py']
1227
1252
  available_scripts = self.script_lister.get_all_scripts()
1228
1253
 
1229
1254
  # Add special commands
1230
- special_commands = ["*", "global/*", "global/"]
1255
+ special_commands = [
1256
+ # "global/"
1257
+ # "*", "global/*"
1258
+ ]
1231
1259
 
1232
- possible_completions = sorted(
1233
- list(set(available_scripts + special_commands)))
1260
+ possible_completions = sorted(list(set(available_scripts + special_commands)))
1234
1261
 
1235
1262
  # Filter based on what the user has typed
1236
1263
  return [s for s in possible_completions if s.startswith(text)]
@@ -11,23 +11,26 @@ class ScriptLister:
11
11
  custom_scripts = self.get_custom_scripts()
12
12
  global_scripts = self.get_global_scripts()
13
13
 
14
- # Combine custom and global scripts for direct, unprefixed access
15
- direct_access_scripts = set(custom_scripts + global_scripts)
14
+ # Custom scripts without prefix, global scripts with 'global/' prefix
15
+ prefixed_global_scripts = [f"global/{s}" for s in global_scripts]
16
16
 
17
- # Add global scripts with the 'global/' prefix for explicit access / backward compatibility
18
- prefixed_global_scripts = {f"global/{s}" for s in global_scripts}
19
-
20
- # Return a single, sorted, and unique list for autocompletion
21
- return sorted(list(direct_access_scripts.union(prefixed_global_scripts)))
17
+ # Return a single, sorted list for autocompletion
18
+ return sorted(custom_scripts + prefixed_global_scripts)
22
19
 
23
20
  def get_custom_scripts(self):
24
21
  custom_scripts_dir = self.script_finder.get_custom_scripts_dir()
25
22
  if not custom_scripts_dir or not os.path.isdir(custom_scripts_dir):
26
23
  return []
27
- return [os.path.basename(f) for f in glob.glob(os.path.join(custom_scripts_dir, "*.py"))]
24
+ return [
25
+ os.path.basename(f)
26
+ for f in glob.glob(os.path.join(custom_scripts_dir, "*.py"))
27
+ ]
28
28
 
29
29
  def get_global_scripts(self):
30
30
  global_scripts_dir = self.script_finder.get_global_scripts_dir()
31
31
  if not global_scripts_dir or not os.path.isdir(global_scripts_dir):
32
32
  return []
33
- return [os.path.basename(f) for f in glob.glob(os.path.join(global_scripts_dir, "*.py"))]
33
+ return [
34
+ os.path.basename(f)
35
+ for f in glob.glob(os.path.join(global_scripts_dir, "*.py"))
36
+ ]
@@ -9,14 +9,18 @@ class ScriptRunner:
9
9
  self.script_finder = ScriptFinder()
10
10
  self.script_lister = ScriptLister()
11
11
 
12
- def run_script(self, script_name: str):
12
+ def run_script(self, script_name: str, args: list[str] = None):
13
13
  script_path = self.script_finder.find_script(script_name)
14
14
  if not script_path:
15
15
  return f"Script '{script_name}' not found."
16
16
 
17
+ command = ["python", script_path]
18
+ if args:
19
+ command.extend(args)
20
+
17
21
  try:
18
22
  result = subprocess.run(
19
- ["python", script_path],
23
+ command,
20
24
  capture_output=True,
21
25
  text=True,
22
26
  check=True,
@@ -1,2 +1,2 @@
1
1
  # version.py
2
- __version__ = "0.1.13.2" # fith parameter like .0 for local install test purposes only. official numbers should be 4 digit numbers
2
+ __version__ = "0.1.13.6" # fith parameter like .0 for local install test purposes only. official numbers should be 4 digit numbers
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ara_cli
3
- Version: 0.1.13.2
3
+ Version: 0.1.13.6
4
4
  Summary: Powerful, open source command-line tool for managing, structuring and automating software development artifacts in line with Business-Driven Development (BDD) and AI-assisted processes
5
5
  Description-Content-Type: text/markdown
6
6
  Requires-Dist: langfuse
7
- Requires-Dist: litellm
7
+ Requires-Dist: litellm>=1.81.0
8
8
  Requires-Dist: llama-index
9
9
  Requires-Dist: llama-index-llms-openai
10
10
  Requires-Dist: llama-index-retrievers-bm25
@@ -238,6 +238,7 @@ tests/test_llm_utils.py
238
238
  tests/test_prompt_chat.py
239
239
  tests/test_prompt_extractor.py
240
240
  tests/test_prompt_handler.py
241
+ tests/test_setup_default_chat_prompt_mode.py
241
242
  tests/test_tag_extractor.py
242
243
  tests/test_template_loader.py
243
244
  tests/test_template_manager.py