ara-cli 0.1.13.2__tar.gz → 0.1.13.5__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.
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/PKG-INFO +2 -2
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/__main__.py +6 -5
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_command_action.py +29 -23
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_config.py +1 -1
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/list.py +50 -20
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/feature_artefact_model.py +8 -8
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/chat.py +89 -62
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/chat_script_runner/script_lister.py +12 -9
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/chat_script_runner/script_runner.py +6 -2
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/version.py +1 -1
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli.egg-info/PKG-INFO +2 -2
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli.egg-info/SOURCES.txt +1 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli.egg-info/requires.txt +1 -1
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/docker/base/requirements.txt +1 -1
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_ara_command_action.py +31 -19
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_chat.py +160 -110
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_chat_givens_images.py +4 -4
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_chat_script_runner.py +26 -1
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_prompt_chat.py +2 -2
- ara_cli-0.1.13.5/tests/test_setup_default_chat_prompt_mode.py +198 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/MANIFEST.in +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/README.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/__init__.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/__init__.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/autofix.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/chat.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/classifier_directory.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/common.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/config.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/convert.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/create.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/delete.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/extract.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/fetch.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/fetch_agents.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/fetch_scripts.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/fetch_templates.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/list_tags.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/load.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/prompt.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/read.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/read_status.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/read_user.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/reconnect.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/rename.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/scan.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/set_status.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/set_user.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/ara_subcommands/template.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_autofix.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_converter.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_creator.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_deleter.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_fuzzy_search.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_link_updater.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_lister.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/__init__.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/artefact_data_retrieval.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/artefact_load.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/artefact_mapping.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/artefact_model.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/artefact_templates.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/businessgoal_artefact_model.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/capability_artefact_model.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/epic_artefact_model.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/example_artefact_model.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/issue_artefact_model.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/keyfeature_artefact_model.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/serialize_helper.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/task_artefact_model.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/userstory_artefact_model.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_models/vision_artefact_model.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_reader.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_renamer.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/artefact_scan.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/chat_agent/__init__.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/chat_agent/agent_process_manager.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/chat_script_runner/__init__.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/chat_script_runner/script_completer.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/chat_script_runner/script_finder.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/chat_web_search/__init__.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/chat_web_search/web_search.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/classifier.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/codefusionretriever.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/codehierachieretriever.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commandline_completer.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/__init__.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/agent_run_command.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/command.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/extract_command.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/fetch_agents_command.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/fetch_scripts_command.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/fetch_templates_command.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/fetch_templates_commands.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/list_agents_command.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/load_command.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/load_image_command.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/commands/read_command.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/completers.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/constants.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/directory_navigator.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/error_handler.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_classifier.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_lister.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_loaders/__init__.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_loaders/binary_file_loader.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_loaders/document_file_loader.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_loaders/document_reader.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_loaders/document_readers.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_loaders/file_loader.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_loaders/file_loaders.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_loaders/image_processor.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_loaders/markdown_reader.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/file_loaders/text_file_loader.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/filename_validator.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/global_file_lister.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/list_filter.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/llm_utils.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/output_suppressor.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/prompt_chat.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/prompt_extractor.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/prompt_handler.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/prompt_rag.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/run_file_lister.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/tag_extractor.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/template_loader.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/template_manager.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/agile.artefacts +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/global-scripts/hello_global.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/blueprints/empty.blueprint.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/blueprints/task_todo_list_C4_architecture_analysis.blueprint.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/add_scenarios_for_new_behaviour.feature_creation_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/align_feature_with_implementation_changes.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/analyze_codebase_and_plan_tasks.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/architecture_C4_analysis.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/architecture_radon_cc_score.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/architecture_radon_halstead_v.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/architecture_radon_maintainability_score.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/choose_best_parent_artefact.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/create_tasks_from_artefact_content.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/create_tests_for_uncovered_modules.test_generation_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/derive_features_from_video_description.feature_creation_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/describe_agent_capabilities.agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/empty.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/execute_scoped_todos_in_task.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/explain_single_file_purpose.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/extract_file_information_bullets.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/extract_general.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/extract_markdown.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/extract_python.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/feature_add_or_modifiy_specified_behavior.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/feature_generate_initial_specified_bevahior.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/fix_failing_behave_step_definitions.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/fix_failing_pytest_tests.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/general_instruction_policy.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/generate_and_fix_pytest_tests.test_generation_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/prompt_template_tech_stack_transformer.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/python_bug_fixing_code.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/python_generate_code.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/python_refactoring_code.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/python_step_definitions_generation_and_fixing.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/python_unittest_generation_and_fixing.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/suggest_next_story_child_tasks.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/summarize_or_transcribe_media.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/update_feature_to_match_implementation.feature_creation_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/commands/update_user_story_with_requirements.interview_agent.commands.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/classify_task.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/empty.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/error_fixing.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/feature_fix_steps_for_scenario.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/feature_formulation.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/feature_reverse_formulation_from_code.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation_update.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/feature_scenario_outline_extension.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/feature_update_formulation.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/fibonacci_example_implementation.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/js_implementation_from_task_description.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/js_steps_implementation.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/python_cli_implementation_with_test.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/python_code_understanding.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/task_implementation.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/task_prompt_control_by_status.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_number.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_status.intention.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/rules/architecture_analyst.rules.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/rules/code_analyst.rules.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/rules/empty.rules.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/rules/error_analyst.rules.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/rules/gherkin_expert.rules.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/rules/js_expert_developer.rules.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/rules/product_owner.rules.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/rules/python_behave.rules.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/prompt-modules/rules/python_developer.rules.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/specification_breakdown_files/template.concept.exploration.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/specification_breakdown_files/template.concept.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/specification_breakdown_files/template.customer.exploration.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/specification_breakdown_files/template.customer.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/specification_breakdown_files/template.persona.exploration.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/specification_breakdown_files/template.persona.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/specification_breakdown_files/template.step.exploration.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/specification_breakdown_files/template.step.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/specification_breakdown_files/template.technology.exploration.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/specification_breakdown_files/template.technology.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/template.businessgoal.prompt_log.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/template.capability.prompt_log.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/template.epic.prompt_log.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/template.example.prompt_log.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/template.feature.prompt_log.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/template.issue.prompt_log.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/template.keyfeature.prompt_log.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/template.steps.prompt_log.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/template.task.prompt_log.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/template.userstory.prompt_log.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/templates/template.vision.prompt_log.md +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli/update_config_prompt.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli.egg-info/dependency_links.txt +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli.egg-info/entry_points.txt +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/ara_cli.egg-info/top_level.txt +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/setup.cfg +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/setup.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/__init__.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_ara_config.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_artefact_autofix.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_artefact_autofix_integration.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_artefact_converter.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_artefact_extraction.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_artefact_fuzzy_search.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_artefact_link_updater.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_artefact_lister.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_artefact_reader.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_artefact_renamer.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_artefact_scan.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_classifier.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_directory_navigator.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_file_classifier.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_file_creator.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_file_lister.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_global_file_lister.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_list_filter.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_llm_utils.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_prompt_extractor.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_prompt_handler.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_tag_extractor.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_template_loader.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_template_manager.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/tests/test_update_config_prompt.py +0 -0
- {ara_cli-0.1.13.2 → ara_cli-0.1.13.5}/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.
|
|
3
|
+
Version: 0.1.13.5
|
|
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.49.7
|
|
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
|
|
173
|
-
> list artefact data with .md and .json file extensions ara list
|
|
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
|
|
179
|
-
> list parent artefacts of a userstory ara list
|
|
180
|
-
> list parent businessgoal artefact of a userstory ara list
|
|
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
|
-
|
|
108
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
|
|
@@ -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:
|
|
20
|
-
children:
|
|
21
|
-
data:
|
|
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
|
-
|
|
26
|
-
if len(
|
|
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
|
-
|
|
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:
|
|
65
|
-
|
|
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:
|
|
71
|
-
|
|
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:
|
|
74
|
-
|
|
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
|
|
96
|
+
ara list feature my_feature --data --include-extension .md
|
|
84
97
|
ara list --include-extension .feature
|
|
85
|
-
ara list
|
|
86
|
-
ara list
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
225
|
+
for step in self.steps:
|
|
226
226
|
found = re.findall(r'<([^>]+)>', step)
|
|
227
227
|
placeholders.update(found)
|
|
228
|
-
for example in
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
1180
|
-
"""Run a python script from the chat.
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
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
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 = [
|
|
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
|
-
#
|
|
15
|
-
|
|
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
|
-
#
|
|
18
|
-
|
|
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 [
|
|
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 [
|
|
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
|
-
|
|
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
|
+
__version__ = "0.1.13.5" # 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.
|
|
3
|
+
Version: 0.1.13.5
|
|
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.49.7
|
|
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
|