ara-cli 0.1.9.65__tar.gz → 0.1.9.67__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.
Potentially problematic release.
This version of ara-cli might be problematic. Click here for more details.
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/MANIFEST.in +2 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/PKG-INFO +1 -1
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/README.md +1 -1
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/ara_command_action.py +15 -5
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/ara_command_parser.py +4 -1
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/ara_config.py +9 -19
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_autofix.py +73 -27
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/artefact_model.py +1 -4
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_scan.py +11 -1
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/prompt_handler.py +14 -14
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/version.py +1 -1
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli.egg-info/PKG-INFO +1 -1
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli.egg-info/SOURCES.txt +22 -20
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli.egg-info/top_level.txt +1 -0
- ara_cli-0.1.9.67/docker/base/requirements.txt +12 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/setup.py +4 -14
- ara_cli-0.1.9.67/tests/__init__.py +0 -0
- ara_cli-0.1.9.67/tests/test_ara_autofix.py +219 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_artefact_renamer.py +3 -5
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_artefact_scan.py +37 -10
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_chat.py +39 -22
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_file_creator.py +1 -1
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_template_manager.py +37 -21
- ara_cli-0.1.9.65/ara_cli/tests/test_ara_autofix.py +0 -113
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/__init__.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/__main__.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_creator.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_deleter.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_fuzzy_search.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_link_updater.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_lister.py +0 -0
- {ara_cli-0.1.9.65/ara_cli/tests → ara_cli-0.1.9.67/ara_cli/artefact_models}/__init__.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/artefact_load.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/artefact_mapping.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/artefact_templates.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/businessgoal_artefact_model.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/capability_artefact_model.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/epic_artefact_model.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/example_artefact_model.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/feature_artefact_model.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/issue_artefact_model.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/keyfeature_artefact_model.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/serialize_helper.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/task_artefact_model.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/userstory_artefact_model.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_models/vision_artefact_model.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_reader.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/artefact_renamer.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/chat.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/classifier.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/codefusionretriever.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/codehierachieretriever.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/commandline_completer.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/directory_navigator.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/file_classifier.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/file_lister.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/filename_validator.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/list_filter.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/output_suppressor.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/prompt_chat.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/prompt_extractor.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/prompt_rag.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/run_file_lister.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/tag_extractor.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/template_manager.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/agile.artefacts +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/blueprints/complete_pytest_unittest.blueprint.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/blueprints/empty.blueprint.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/blueprints/task_todo_list_C4_architecture_analysis.blueprint.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/blueprints/task_todo_list_implement_feature_BDD_way.blueprint.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/architecture_C4_analysis.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/architecture_radon_cc_score.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/architecture_radon_halstead_v.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/architecture_radon_maintainability_score.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/artefact_classification.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/artefact_extension.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/artefact_formulation.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/behave_step_generation.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/code_generation_complex.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/code_generation_simple.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/empty.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/error_fixing.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/feature_file_update.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/feature_formulation.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/js_code_generation_simple.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/refactoring.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/refactoring_analysis.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/reverse_engineer_feature_file.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/commands/reverse_engineer_program_flow.commands.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/classify_task.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/empty.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/error_fixing.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/feature_fix_steps_for_scenario.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/feature_formulation.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/feature_reverse_formulation_from_code.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation_update.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/feature_scenario_outline_extension.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/feature_update_formulation.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/fibonacci_example_implementation.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/js_implementation_from_task_description.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/js_steps_implementation.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/python_cli_implementation_with_test.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/python_code_understanding.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/task_implementation.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/task_prompt_control_by_status.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_number.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_status.intention.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/rules/architecture_analyst.rules.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/rules/code_analyst.rules.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/rules/empty.rules.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/rules/error_analyst.rules.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/rules/gherkin_expert.rules.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/rules/js_expert_developer.rules.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/rules/product_owner.rules.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/rules/python_behave.rules.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/prompt-modules/rules/python_developer.rules.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/specification_breakdown_files/template.concept.exploration.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/specification_breakdown_files/template.concept.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/specification_breakdown_files/template.customer.exploration.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/specification_breakdown_files/template.customer.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/specification_breakdown_files/template.persona.exploration.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/specification_breakdown_files/template.persona.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/specification_breakdown_files/template.step.exploration.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/specification_breakdown_files/template.step.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/specification_breakdown_files/template.technology.exploration.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/specification_breakdown_files/template.technology.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.businessgoal +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.businessgoal.prompt_log.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.capability +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.capability.prompt_log.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.epic +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.epic.prompt_log.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.example +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.example.prompt_log.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.feature +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.feature.prompt_log.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.issue +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.issue.prompt_log.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.keyfeature +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.keyfeature.prompt_log.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.steps.prompt_log.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.task +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.task.prompt_log.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.userstory +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.userstory.prompt_log.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.vision +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/templates/template.vision.prompt_log.md +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli/update_config_prompt.py +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli.egg-info/dependency_links.txt +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli.egg-info/entry_points.txt +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/ara_cli.egg-info/requires.txt +0 -0
- {ara_cli-0.1.9.65 → ara_cli-0.1.9.67}/setup.cfg +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_ara_command_action.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_ara_config.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_artefact_fuzzy_search.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_artefact_link_updater.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_artefact_lister.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_artefact_reader.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_classifier.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_directory_navigator.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_file_classifier.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_file_lister.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_list_filter.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_tag_extractor.py +0 -0
- {ara_cli-0.1.9.65/ara_cli → ara_cli-0.1.9.67}/tests/test_update_config_prompt.py +0 -0
|
@@ -46,7 +46,7 @@ To update dependencies, add package names in `setup.py`. The packages will ONLY
|
|
|
46
46
|
3. --> in container --> for behave BDD tests `bash test-feature.sh`
|
|
47
47
|
3. a) --> in container --> for only 1 test: behave ara/features/<name>.feature
|
|
48
48
|
3. b) --> in container --> for unit tests and (if successful) feature tests: `bash test-all.sh`
|
|
49
|
-
4. --> in container --> for unit tests in folder ara_cli `pytest --cov=. --cov-report term-missing
|
|
49
|
+
4. --> in container --> for unit tests in folder ara_cli `pytest --cov=. --cov-report term-missing tests/ `
|
|
50
50
|
5. --> in container --> example for running a single unit test in ara_cli folder `pytest tests/test_template_manager.py::test_files_created_from_template`
|
|
51
51
|
6. if change is successfull always commit before proceeding with next change
|
|
52
52
|
7. if change was successfully reviewd merge in gitlab: https://git.talsen.team/talsen-products/ara-cli/-/merge_requests/new
|
|
@@ -576,22 +576,32 @@ def scan_action(args):
|
|
|
576
576
|
def autofix_action(args):
|
|
577
577
|
from ara_cli.artefact_autofix import parse_report, apply_autofix, read_report_file
|
|
578
578
|
|
|
579
|
-
|
|
579
|
+
# If the user passes --non-deterministic, only_deterministic_fix becomes False.
|
|
580
|
+
# If the user passes --deterministic, only_non_deterministic_fix becomes False.
|
|
581
|
+
# If no flags are passed, both are True, and all fixes are attempted.
|
|
582
|
+
run_deterministic = not args.non_deterministic
|
|
583
|
+
run_non_deterministic = not args.deterministic
|
|
580
584
|
|
|
585
|
+
content = read_report_file()
|
|
581
586
|
if not content:
|
|
582
587
|
return False
|
|
583
588
|
|
|
584
589
|
issues = parse_report(content)
|
|
585
|
-
|
|
586
590
|
if not issues:
|
|
587
591
|
print("No issues found in the report. Nothing to fix.")
|
|
588
592
|
return
|
|
589
593
|
|
|
590
|
-
# print("
|
|
594
|
+
# print("\nStarting autofix process...")
|
|
591
595
|
for classifier, files in issues.items():
|
|
592
596
|
print(f"\nClassifier: {classifier}")
|
|
593
597
|
for file_path, reason in files:
|
|
594
|
-
|
|
595
|
-
|
|
598
|
+
apply_autofix(
|
|
599
|
+
file_path,
|
|
600
|
+
classifier,
|
|
601
|
+
reason,
|
|
602
|
+
deterministic=run_deterministic,
|
|
603
|
+
non_deterministic=run_non_deterministic
|
|
604
|
+
)
|
|
596
605
|
|
|
597
606
|
print("\nAutofix process completed. Please review the changes.")
|
|
607
|
+
|
|
@@ -229,7 +229,10 @@ def scan_parser(subparsers):
|
|
|
229
229
|
|
|
230
230
|
|
|
231
231
|
def autofix_parser(subparsers):
|
|
232
|
-
subparsers.add_parser("autofix", help="Fix ARA tree with llm models for scanned artefacts with ara scan command.")
|
|
232
|
+
autofix_parser = subparsers.add_parser("autofix", help="Fix ARA tree with llm models for scanned artefacts with ara scan command.")
|
|
233
|
+
determinism_group = autofix_parser.add_mutually_exclusive_group()
|
|
234
|
+
determinism_group.add_argument("--deterministic", "-d", action="store_true", help="Run only deterministic fixes e.g Title-FileName Mismatch fix")
|
|
235
|
+
determinism_group.add_argument("--non-deterministic", "-nd", action="store_true", help="Run only non-deterministic fixes")
|
|
233
236
|
|
|
234
237
|
|
|
235
238
|
class CustomHelpFormatter(argparse.HelpFormatter):
|
|
@@ -42,9 +42,9 @@ class ARAconfig(BaseModel):
|
|
|
42
42
|
"model": "openai/gpt-4o",
|
|
43
43
|
"temperature": 0.8
|
|
44
44
|
},
|
|
45
|
-
"gpt-4.
|
|
45
|
+
"gpt-4.1": {
|
|
46
46
|
"provider": "openai",
|
|
47
|
-
"model": "openai/gpt-4.
|
|
47
|
+
"model": "openai/gpt-4.1",
|
|
48
48
|
"temperature": 0.8,
|
|
49
49
|
},
|
|
50
50
|
"o3-mini": {
|
|
@@ -52,9 +52,14 @@ class ARAconfig(BaseModel):
|
|
|
52
52
|
"model": "openai/o3-mini",
|
|
53
53
|
"temperature": 1.0,
|
|
54
54
|
},
|
|
55
|
-
"
|
|
55
|
+
"opus-4": {
|
|
56
|
+
"provider": "anthropic",
|
|
57
|
+
"model": "anthropic/claude-opus-4-20250514",
|
|
58
|
+
"temperature": 0.8,
|
|
59
|
+
},
|
|
60
|
+
"sonnet-4": {
|
|
56
61
|
"provider": "anthropic",
|
|
57
|
-
"model": "anthropic/claude-
|
|
62
|
+
"model": "anthropic/claude-sonnet-4-20250514",
|
|
58
63
|
"temperature": 0.8,
|
|
59
64
|
},
|
|
60
65
|
"together-ai-llama-2": {
|
|
@@ -67,21 +72,6 @@ class ARAconfig(BaseModel):
|
|
|
67
72
|
"model": "groq/llama3-70b-8192",
|
|
68
73
|
"temperature": 0.8,
|
|
69
74
|
},
|
|
70
|
-
"opus-4": {
|
|
71
|
-
"provider": "anthropic",
|
|
72
|
-
"model": "anthropic/claude-opus-4-20250514",
|
|
73
|
-
"temperature": 0.8,
|
|
74
|
-
},
|
|
75
|
-
"sonnet-3.7": {
|
|
76
|
-
"provider": "anthropic",
|
|
77
|
-
"model": "anthropic/claude-3-7-sonnet-20250219",
|
|
78
|
-
"temperature": 0.8,
|
|
79
|
-
},
|
|
80
|
-
"sonnet-4": {
|
|
81
|
-
"provider": "anthropic",
|
|
82
|
-
"model": "anthropic/claude-sonnet-4-20250514",
|
|
83
|
-
"temperature": 0.8,
|
|
84
|
-
},
|
|
85
75
|
}
|
|
86
76
|
default_llm: Optional[str] = "gpt-4o"
|
|
87
77
|
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from typing import Dict, List, Tuple
|
|
3
|
+
|
|
1
4
|
def read_report_file():
|
|
2
5
|
file_path = "incompatible_artefacts_report.md"
|
|
3
6
|
try:
|
|
@@ -5,12 +8,11 @@ def read_report_file():
|
|
|
5
8
|
content = f.read()
|
|
6
9
|
except OSError:
|
|
7
10
|
print('Artefact scan results file not found. Did you run the "ara scan" command?')
|
|
8
|
-
return
|
|
9
|
-
|
|
11
|
+
return None
|
|
10
12
|
return content
|
|
11
13
|
|
|
12
14
|
|
|
13
|
-
def parse_report(content: str) ->
|
|
15
|
+
def parse_report(content: str) -> Dict[str, List[Tuple[str, str]]]:
|
|
14
16
|
"""
|
|
15
17
|
Parses the incompatible artefacts report and returns structured data.
|
|
16
18
|
Returns a dictionary where keys are artefact classifiers, and values are lists of (file_path, reason) tuples.
|
|
@@ -20,31 +22,27 @@ def parse_report(content: str) -> dict:
|
|
|
20
22
|
current_classifier = None
|
|
21
23
|
|
|
22
24
|
if not lines or lines[0] != "# Artefact Check Report":
|
|
23
|
-
return issues
|
|
25
|
+
return issues
|
|
24
26
|
|
|
25
27
|
if len(lines) >= 3 and lines[2] == "No problems found.":
|
|
26
|
-
return issues
|
|
28
|
+
return issues
|
|
27
29
|
|
|
28
|
-
for line in lines[1:]:
|
|
30
|
+
for line in lines[1:]:
|
|
29
31
|
line = line.strip()
|
|
30
32
|
if not line:
|
|
31
33
|
continue
|
|
32
34
|
|
|
33
|
-
# Classifier başlığı tespiti (## ile başlayan)
|
|
34
35
|
if line.startswith("## "):
|
|
35
36
|
current_classifier = line[3:].strip()
|
|
36
37
|
issues[current_classifier] = []
|
|
37
38
|
|
|
38
|
-
# Dosya listesi tespiti (- ile başlayan)
|
|
39
39
|
elif line.startswith("- ") and current_classifier is not None:
|
|
40
|
-
# Format: "- `file_path`: reason"
|
|
41
40
|
parts = line.split("`", 2)
|
|
42
41
|
if len(parts) < 3:
|
|
43
|
-
continue
|
|
42
|
+
continue
|
|
44
43
|
|
|
45
44
|
file_path = parts[1]
|
|
46
|
-
reason = parts[2].split(
|
|
47
|
-
":", 1)[1].strip() if ":" in parts[2] else ""
|
|
45
|
+
reason = parts[2].split(":", 1)[1].strip() if ":" in parts[2] else ""
|
|
48
46
|
issues[current_classifier].append((file_path, reason))
|
|
49
47
|
|
|
50
48
|
return issues
|
|
@@ -53,7 +51,7 @@ def parse_report(content: str) -> dict:
|
|
|
53
51
|
def read_artefact(file_path):
|
|
54
52
|
"""Reads the artefact text from the given file path."""
|
|
55
53
|
try:
|
|
56
|
-
with open(file_path, 'r') as file:
|
|
54
|
+
with open(file_path, 'r', encoding="utf-8") as file:
|
|
57
55
|
return file.read()
|
|
58
56
|
except FileNotFoundError:
|
|
59
57
|
print(f"File not found: {file_path}")
|
|
@@ -82,7 +80,7 @@ def construct_prompt(artefact_type, reason, file_path, artefact_text):
|
|
|
82
80
|
from ara_cli.artefact_models.artefact_model import ArtefactType
|
|
83
81
|
|
|
84
82
|
prompt = (
|
|
85
|
-
f"Correct the following {artefact_type} artefact to fix the issue: {reason}. "
|
|
83
|
+
f"Correct the following {artefact_type.value} artefact to fix the issue: {reason}. "
|
|
86
84
|
"Provide the corrected artefact. Do not reformulate the artefact, "
|
|
87
85
|
"just fix the pydantic model errors, use correct grammar. "
|
|
88
86
|
"You should follow the name of the file "
|
|
@@ -113,33 +111,81 @@ def run_agent(prompt, artefact_class):
|
|
|
113
111
|
from pydantic_ai import Agent
|
|
114
112
|
# gpt-4o
|
|
115
113
|
# anthropic:claude-3-7-sonnet-20250219
|
|
116
|
-
|
|
114
|
+
# anthropic:claude-4-sonnet-20250514
|
|
115
|
+
agent = Agent(model="anthropic:claude-4-sonnet-20250514",
|
|
117
116
|
result_type=artefact_class, instrument=True)
|
|
118
117
|
result = agent.run_sync(prompt)
|
|
119
118
|
return result.data
|
|
120
119
|
|
|
121
120
|
|
|
122
121
|
def write_corrected_artefact(file_path, corrected_text):
|
|
123
|
-
with open(file_path, 'w') as file:
|
|
122
|
+
with open(file_path, 'w', encoding="utf-8") as file:
|
|
124
123
|
file.write(corrected_text)
|
|
125
124
|
print(f"Fixed artefact at {file_path}")
|
|
126
125
|
|
|
127
126
|
|
|
128
|
-
def
|
|
127
|
+
def fix_title_mismatch(file_path: str, artefact_text: str, artefact_class) -> str:
|
|
128
|
+
"""
|
|
129
|
+
Deterministically fixes the title in the artefact text to match the filename.
|
|
130
|
+
"""
|
|
131
|
+
base_name = os.path.basename(file_path)
|
|
132
|
+
correct_title_underscores, _ = os.path.splitext(base_name)
|
|
133
|
+
correct_title_spaces = correct_title_underscores.replace('_', ' ')
|
|
134
|
+
|
|
135
|
+
title_prefix = artefact_class._title_prefix()
|
|
136
|
+
|
|
137
|
+
lines = artefact_text.splitlines()
|
|
138
|
+
new_lines = []
|
|
139
|
+
title_found_and_replaced = False
|
|
140
|
+
|
|
141
|
+
for line in lines:
|
|
142
|
+
if not title_found_and_replaced and line.strip().startswith(title_prefix):
|
|
143
|
+
new_lines.append(f"{title_prefix} {correct_title_spaces}")
|
|
144
|
+
title_found_and_replaced = True
|
|
145
|
+
else:
|
|
146
|
+
new_lines.append(line)
|
|
147
|
+
|
|
148
|
+
if not title_found_and_replaced:
|
|
149
|
+
print(f"Warning: Title prefix '{title_prefix}' not found in {file_path}. Title could not be fixed.")
|
|
150
|
+
return artefact_text
|
|
151
|
+
|
|
152
|
+
return "\n".join(new_lines)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def apply_autofix(file_path: str, classifier: str, reason: str, deterministic: bool, non_deterministic: bool) -> bool:
|
|
129
156
|
artefact_text = read_artefact(file_path)
|
|
130
157
|
if artefact_text is None:
|
|
131
|
-
return
|
|
158
|
+
return False
|
|
132
159
|
|
|
133
|
-
artefact_type, artefact_class = determine_artefact_type_and_class(
|
|
134
|
-
classifier)
|
|
160
|
+
artefact_type, artefact_class = determine_artefact_type_and_class(classifier)
|
|
135
161
|
if artefact_type is None or artefact_class is None:
|
|
136
|
-
return
|
|
162
|
+
return False
|
|
137
163
|
|
|
138
|
-
|
|
164
|
+
is_deterministic_issue = "Filename-Title Mismatch" in reason
|
|
139
165
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
corrected_text =
|
|
166
|
+
if deterministic and is_deterministic_issue:
|
|
167
|
+
print(f"Attempting deterministic fix for {file_path}...")
|
|
168
|
+
corrected_text = fix_title_mismatch(file_path, artefact_text, artefact_class)
|
|
143
169
|
write_corrected_artefact(file_path, corrected_text)
|
|
144
|
-
|
|
145
|
-
|
|
170
|
+
return True
|
|
171
|
+
|
|
172
|
+
# Attempt non-deterministic fix if requested and the issue is NOT deterministic
|
|
173
|
+
if non_deterministic and not is_deterministic_issue:
|
|
174
|
+
print(f"Attempting non-deterministic (LLM) fix for {file_path}...")
|
|
175
|
+
prompt = construct_prompt(artefact_type, reason, file_path, artefact_text)
|
|
176
|
+
try:
|
|
177
|
+
corrected_artefact = run_agent(prompt, artefact_class)
|
|
178
|
+
corrected_text = corrected_artefact.serialize()
|
|
179
|
+
write_corrected_artefact(file_path, corrected_text)
|
|
180
|
+
return True
|
|
181
|
+
except Exception as e:
|
|
182
|
+
print(f"LLM agent failed to fix artefact at {file_path}: {e}")
|
|
183
|
+
return False
|
|
184
|
+
|
|
185
|
+
# Log if a fix was skipped due to flags
|
|
186
|
+
if is_deterministic_issue and not deterministic:
|
|
187
|
+
print(f"Skipping deterministic fix for {file_path} as per request.")
|
|
188
|
+
elif not is_deterministic_issue and not non_deterministic:
|
|
189
|
+
print(f"Skipping non-deterministic fix for {file_path} as per request.")
|
|
190
|
+
|
|
191
|
+
return False
|
|
@@ -49,16 +49,13 @@ class Contribution(BaseModel):
|
|
|
49
49
|
|
|
50
50
|
@model_validator(mode="after")
|
|
51
51
|
def validate_parent(self) -> Self:
|
|
52
|
+
|
|
52
53
|
artefact_name = self.artefact_name
|
|
53
54
|
classifier = self.classifier
|
|
54
55
|
rule = self.rule
|
|
55
56
|
|
|
56
57
|
if artefact_name:
|
|
57
58
|
artefact_name = replace_space_with_underscore(artefact_name)
|
|
58
|
-
if artefact_name and classifier:
|
|
59
|
-
artefact_name = artefact_name.removesuffix(f"_{classifier}")
|
|
60
|
-
artefact_name = artefact_name.removesuffix(f"_{classifier.capitalize()}")
|
|
61
|
-
self.artefact_name = artefact_name
|
|
62
59
|
if not artefact_name or not classifier:
|
|
63
60
|
self.artefact_name = None
|
|
64
61
|
self.classifier = None
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from textwrap import indent
|
|
2
|
+
import os
|
|
2
3
|
|
|
3
4
|
|
|
4
5
|
def check_file(file_path, artefact_class):
|
|
@@ -9,7 +10,16 @@ def check_file(file_path, artefact_class):
|
|
|
9
10
|
except OSError as e:
|
|
10
11
|
return False, f"File error: {e}"
|
|
11
12
|
try:
|
|
12
|
-
artefact_class.deserialize(content)
|
|
13
|
+
artefact_instance = artefact_class.deserialize(content)
|
|
14
|
+
|
|
15
|
+
base_name = os.path.basename(file_path)
|
|
16
|
+
file_name_without_ext, _ = os.path.splitext(base_name)
|
|
17
|
+
|
|
18
|
+
if artefact_instance.title != file_name_without_ext:
|
|
19
|
+
reason = (f"Filename-Title Mismatch: The file name '{file_name_without_ext}' "
|
|
20
|
+
f"does not match the artefact title '{artefact_instance.title}'.")
|
|
21
|
+
return False, reason
|
|
22
|
+
|
|
13
23
|
return True, None
|
|
14
24
|
except (ValidationError, ValueError, AssertionError) as e:
|
|
15
25
|
return False, str(e)
|
|
@@ -81,7 +81,8 @@ def send_prompt(prompt):
|
|
|
81
81
|
completion = litellm.completion(
|
|
82
82
|
**config_parameters,
|
|
83
83
|
messages=prompt,
|
|
84
|
-
stream=True
|
|
84
|
+
stream=True,
|
|
85
|
+
max_tokens=8192
|
|
85
86
|
)
|
|
86
87
|
for chunk in completion:
|
|
87
88
|
yield chunk
|
|
@@ -357,10 +358,8 @@ def prepend_system_prompt(message_list):
|
|
|
357
358
|
def append_images_to_message(message, image_data_list):
|
|
358
359
|
if not image_data_list:
|
|
359
360
|
return message
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
message["content"] = new_content_list
|
|
361
|
+
message_content = message["content"]
|
|
362
|
+
message["content"] = message_content + image_data_list
|
|
364
363
|
|
|
365
364
|
return message
|
|
366
365
|
|
|
@@ -380,23 +379,24 @@ def create_and_send_custom_prompt(classifier, parameter):
|
|
|
380
379
|
append_headings(classifier, parameter, "prompt")
|
|
381
380
|
write_prompt_result(classifier, parameter, prompt)
|
|
382
381
|
|
|
383
|
-
|
|
382
|
+
message = {
|
|
384
383
|
"role": "user",
|
|
385
384
|
"content": combined_content_markdown
|
|
386
385
|
}
|
|
387
386
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
message_list_to_send = [final_message]
|
|
387
|
+
message_list = [message]
|
|
391
388
|
|
|
389
|
+
message_list = append_images_to_message(message_list, image_data_list)
|
|
392
390
|
append_headings(classifier, parameter, "result")
|
|
391
|
+
|
|
393
392
|
artefact_data_path = f"ara/{sub_directory}/{parameter}.data/{classifier}.prompt_log.md"
|
|
394
393
|
with open(artefact_data_path, 'a') as file:
|
|
395
|
-
for chunk in send_prompt(
|
|
396
|
-
|
|
397
|
-
if
|
|
398
|
-
|
|
399
|
-
|
|
394
|
+
for chunk in send_prompt(message_list):
|
|
395
|
+
chunk_content = chunk.choices[0].delta.content
|
|
396
|
+
if not chunk_content:
|
|
397
|
+
continue
|
|
398
|
+
file.write(chunk_content)
|
|
399
|
+
file.flush()
|
|
400
400
|
# write_prompt_result(classifier, parameter, response)
|
|
401
401
|
|
|
402
402
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# version.py
|
|
2
|
-
__version__ = "0.1.9.
|
|
2
|
+
__version__ = "0.1.9.67" # fith parameter like .0 for local install test purposes only. official numbers should be 4 digit numbers
|
|
@@ -41,6 +41,7 @@ ara_cli.egg-info/dependency_links.txt
|
|
|
41
41
|
ara_cli.egg-info/entry_points.txt
|
|
42
42
|
ara_cli.egg-info/requires.txt
|
|
43
43
|
ara_cli.egg-info/top_level.txt
|
|
44
|
+
ara_cli/artefact_models/__init__.py
|
|
44
45
|
ara_cli/artefact_models/artefact_load.py
|
|
45
46
|
ara_cli/artefact_models/artefact_mapping.py
|
|
46
47
|
ara_cli/artefact_models/artefact_model.py
|
|
@@ -139,23 +140,24 @@ ara_cli/templates/specification_breakdown_files/template.step.exploration.md
|
|
|
139
140
|
ara_cli/templates/specification_breakdown_files/template.step.md
|
|
140
141
|
ara_cli/templates/specification_breakdown_files/template.technology.exploration.md
|
|
141
142
|
ara_cli/templates/specification_breakdown_files/template.technology.md
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
143
|
+
docker/base/requirements.txt
|
|
144
|
+
tests/__init__.py
|
|
145
|
+
tests/test_ara_autofix.py
|
|
146
|
+
tests/test_ara_command_action.py
|
|
147
|
+
tests/test_ara_config.py
|
|
148
|
+
tests/test_artefact_fuzzy_search.py
|
|
149
|
+
tests/test_artefact_link_updater.py
|
|
150
|
+
tests/test_artefact_lister.py
|
|
151
|
+
tests/test_artefact_reader.py
|
|
152
|
+
tests/test_artefact_renamer.py
|
|
153
|
+
tests/test_artefact_scan.py
|
|
154
|
+
tests/test_chat.py
|
|
155
|
+
tests/test_classifier.py
|
|
156
|
+
tests/test_directory_navigator.py
|
|
157
|
+
tests/test_file_classifier.py
|
|
158
|
+
tests/test_file_creator.py
|
|
159
|
+
tests/test_file_lister.py
|
|
160
|
+
tests/test_list_filter.py
|
|
161
|
+
tests/test_tag_extractor.py
|
|
162
|
+
tests/test_template_manager.py
|
|
163
|
+
tests/test_update_config_prompt.py
|
|
@@ -5,6 +5,9 @@ version = {}
|
|
|
5
5
|
with open("./ara_cli/version.py") as fp:
|
|
6
6
|
exec(fp.read(), version)
|
|
7
7
|
|
|
8
|
+
with open("./docker/base/requirements.txt", "r") as pip_reqs_file:
|
|
9
|
+
reqs = [line.strip() for line in pip_reqs_file.readlines()]
|
|
10
|
+
|
|
8
11
|
setup(
|
|
9
12
|
name="ara_cli",
|
|
10
13
|
version=version['__version__'],
|
|
@@ -15,18 +18,5 @@ setup(
|
|
|
15
18
|
"ara = ara_cli.__main__:cli",
|
|
16
19
|
],
|
|
17
20
|
},
|
|
18
|
-
install_requires=
|
|
19
|
-
'litellm',
|
|
20
|
-
'llama-index',
|
|
21
|
-
'llama-index-llms-openai',
|
|
22
|
-
'llama-index-retrievers-bm25',
|
|
23
|
-
'openai',
|
|
24
|
-
'markdown-it-py',
|
|
25
|
-
'json-repair',
|
|
26
|
-
'argparse',
|
|
27
|
-
'argcomplete',
|
|
28
|
-
'cmd2>=2.5',
|
|
29
|
-
'pydantic',
|
|
30
|
-
'pydantic_ai'
|
|
31
|
-
],
|
|
21
|
+
install_requires=reqs,
|
|
32
22
|
)
|
|
File without changes
|