agentic-devtools 0.2.6__tar.gz → 0.2.8__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.
- agentic_devtools-0.2.8/.github/copilot-instructions.md +1495 -0
- agentic_devtools-0.2.8/.github/workflows/auto-fix-on-failure.yml +201 -0
- agentic_devtools-0.2.8/.github/workflows/copilot-setup-steps.yml +38 -0
- agentic_devtools-0.2.8/.github/workflows/security-scan-on-merge.yml +343 -0
- agentic_devtools-0.2.8/CONTRIBUTING.md +327 -0
- agentic_devtools-0.2.8/PKG-INFO +888 -0
- agentic_devtools-0.2.8/README.md +863 -0
- agentic_devtools-0.2.8/agdt_ai_helpers/__init__.py +34 -0
- agentic_devtools-0.2.8/agentic_devtools/_version.py +34 -0
- agentic_devtools-0.2.8/agentic_devtools/background_tasks.py +598 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure/app_insights_commands.py +908 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure/auth.py +170 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_context/commands.py +126 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_context/management.py +231 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/async_commands.py +1492 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/commands.py +728 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/file_review_commands.py +1038 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/helpers.py +561 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/mark_reviewed.py +756 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/pipeline_commands.py +724 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/pr_summary_commands.py +579 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/pull_request_details_commands.py +596 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/review_commands.py +700 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/review_helpers.py +191 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/run_details_commands.py +935 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/vpn_toggle.py +1224 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/git/async_commands.py +294 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/git/commands.py +399 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/git/diff.py +210 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/git/operations.py +754 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/github/__init__.py +49 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/github/async_commands.py +739 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/github/issue_commands.py +516 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/github/state_helpers.py +39 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/jira/async_commands.py +439 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/jira/comment_commands.py +141 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/jira/formatting.py +129 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/jira/get_commands.py +287 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/jira/helpers.py +278 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/jira/parse_error_report.py +352 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/jira/role_commands.py +560 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/jira/update_commands.py +222 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/jira/vpn_wrapper.py +58 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/release/commands.py +103 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/release/helpers.py +105 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/runner.py +395 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/subprocess_utils.py +117 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/tasks/commands.py +851 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/testing.py +438 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/vpn/runner.py +198 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/workflows/advancement.py +204 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/workflows/base.py +240 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/workflows/checklist.py +278 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/workflows/commands.py +1610 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/workflows/manager.py +820 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/workflows/preflight.py +323 -0
- agentic_devtools-0.2.8/agentic_devtools/cli/workflows/worktree_setup.py +1166 -0
- agentic_devtools-0.2.8/agentic_devtools/prompts/loader.py +377 -0
- agentic_devtools-0.2.8/agentic_devtools/state.py +746 -0
- agentic_devtools-0.2.8/agentic_devtools/task_state.py +902 -0
- agentic_devtools-0.2.8/pyproject.toml +186 -0
- agentic_devtools-0.2.8/scripts/run-pr-checks.sh +55 -0
- agentic_devtools-0.2.8/scripts/scaffold_tests.py +220 -0
- agentic_devtools-0.2.8/scripts/validate_test_structure.py +87 -0
- agentic_devtools-0.2.8/scripts/verify-agent-coverage.py +108 -0
- agentic_devtools-0.2.8/tests/README.md +306 -0
- agentic_devtools-0.2.8/tests/azure_context/test_commands.py +165 -0
- agentic_devtools-0.2.8/tests/azure_context/test_management.py +257 -0
- agentic_devtools-0.2.8/tests/azure_devops/conftest.py +43 -0
- agentic_devtools-0.2.8/tests/azure_devops/test_config.py +383 -0
- agentic_devtools-0.2.8/tests/cli/test_azure_app_insights_commands.py +710 -0
- agentic_devtools-0.2.8/tests/cli/test_azure_auth.py +172 -0
- agentic_devtools-0.2.8/tests/conftest.py +81 -0
- agentic_devtools-0.2.8/tests/e2e_smoke/conftest.py +160 -0
- agentic_devtools-0.2.8/tests/e2e_smoke/test_azure_devops_commands_e2e.py +83 -0
- agentic_devtools-0.2.8/tests/e2e_smoke/test_git_commands_e2e.py +115 -0
- agentic_devtools-0.2.8/tests/e2e_smoke/test_jira_commands_e2e.py +287 -0
- agentic_devtools-0.2.8/tests/network/test_detection.py +132 -0
- agentic_devtools-0.2.8/tests/test_git_commands.py +647 -0
- agentic_devtools-0.2.8/tests/test_git_operations.py +1001 -0
- agentic_devtools-0.2.8/tests/test_release_commands.py +166 -0
- agentic_devtools-0.2.8/tests/test_release_helpers.py +89 -0
- agentic_devtools-0.2.8/tests/test_release_integration.py +88 -0
- agentic_devtools-0.2.8/tests/test_validate_test_structure.py +295 -0
- agentic_devtools-0.2.8/tests/test_version.py +40 -0
- agentic_devtools-0.2.8/tests/unit/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/background_tasks/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/background_tasks/test_cleanup_old_logs.py +144 -0
- agentic_devtools-0.2.8/tests/unit/background_tasks/test_create_log_file_path.py +51 -0
- agentic_devtools-0.2.8/tests/unit/background_tasks/test_get_task_log_content.py +73 -0
- agentic_devtools-0.2.8/tests/unit/background_tasks/test_run_function_in_background.py +85 -0
- agentic_devtools-0.2.8/tests/unit/background_tasks/test_run_in_background.py +101 -0
- agentic_devtools-0.2.8/tests/unit/background_tasks/test_wait_for_task.py +68 -0
- agentic_devtools-0.2.8/tests/unit/cli/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/_helpers.py +16 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_add_pull_request_comment_async.py +18 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_approve_file_async.py +32 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_approve_pull_request_async.py +16 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_create_pull_request_async.py +31 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_generate_pr_summary_async.py +15 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_get_pull_request_details_async.py +15 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_get_pull_request_threads_async.py +16 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_get_run_details_async.py +13 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_mark_file_reviewed_async.py +13 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_mark_pull_request_draft_async.py +13 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_publish_pull_request_async.py +13 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_reply_to_pull_request_thread_async.py +18 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_request_changes_async.py +34 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_request_changes_with_suggestion_async.py +35 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_resolve_thread_async.py +17 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_run_e2e_tests_fabric_async.py +17 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_run_e2e_tests_synapse_async.py +15 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_run_wb_patch_async.py +13 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_submit_file_review_async.py +15 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/auth/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/auth/test_get_auth_headers.py +21 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/auth/test_get_pat.py +35 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_add_pull_request_comment.py +203 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_approve_pull_request.py +60 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_create_pull_request.py +246 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_get_pull_request_threads.py +89 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_mark_pull_request_draft.py +122 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_publish_pull_request.py +264 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_reply_to_pull_request_thread.py +140 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_resolve_thread.py +64 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/config/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/config/test_azure_devops_config.py +90 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/config/test_constants.py +27 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/config/test_get_repository_name_from_git_remote.py +261 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/conftest.py +25 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_approve_file.py +85 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_mark_file_as_submission_pending.py +9 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_request_changes.py +27 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_request_changes_with_suggestion.py +27 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_submit_file_review.py +112 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_update_submission_to_completed.py +9 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_build_thread_context.py +37 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_convert_to_pull_request_title.py +38 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_format_approval_content.py +26 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_get_repository_id.py +41 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_parse_bool_from_state_value.py +44 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_require_content.py +22 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_require_requests.py +37 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/mark_reviewed/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/mark_reviewed/test_mark_file_reviewed.py +247 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/mark_reviewed/test_mark_file_reviewed_cli.py +89 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/mark_reviewed/test_normalize_repo_path.py +85 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_create_pipeline.py +202 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_get_pipeline_id.py +173 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_list_pipelines.py +157 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_run_e2e_tests_fabric.py +167 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_run_e2e_tests_synapse.py +199 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_run_wb_patch.py +278 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_update_pipeline.py +10 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pr_summary_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pr_summary_commands/test_generate_overarching_pr_comments.py +123 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pr_summary_commands/test_generate_overarching_pr_comments_cli.py +27 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_change_tracking_id_for_file.py +91 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_iteration_change_tracking_map.py +213 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_iteration_changes.py +64 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_details.py +270 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_iterations.py +44 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_threads.py +73 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_reviewer_payload.py +307 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_viewed_files_via_contribution.py +192 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_invoke_ado_rest.py +50 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_invoke_ado_rest_post.py +51 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_build_reviewed_paths_set.py +66 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_checkout_and_sync_branch.py +95 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_convert_to_prompt_filename.py +33 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_extract_jira_issue_key_from_title.py +55 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_fetch_and_display_jira_issue.py +58 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_fetch_pull_request_basic_info.py +80 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_filter_threads.py +94 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_generate_review_prompts.py +109 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_get_jira_issue_key_from_state.py +27 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_get_linked_pull_request_from_jira.py +207 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_get_pull_request_id_from_state.py +38 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_get_root_folder.py +34 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_get_threads_for_file.py +94 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_normalize_repo_path.py +39 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_print_review_instructions.py +37 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_setup_pull_request_review.py +197 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_write_file_prompt.py +35 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_build_reviewed_paths_set.py +66 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_convert_to_prompt_filename.py +33 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_extract_jira_issue_key_from_title.py +78 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_filter_threads.py +94 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_get_root_folder.py +34 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_get_threads_for_file.py +94 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_normalize_repo_path.py +85 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_display_jira_issue_summary.py +55 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_extract_linked_pr_from_issue.py +94 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_extract_pr_id_from_development_panel.py +72 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_fetch_and_display_jira_issue.py +37 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_fetch_development_panel_prs.py +156 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_fetch_jira_issue.py +65 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_get_jira_credentials.py +40 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_get_linked_pull_request_from_jira.py +31 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_get_pr_from_development_panel.py +44 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_build_file_prompt_content.py +109 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_generate_review_prompts.py +117 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_generate_review_prompts_edge_cases.py +70 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_get_prompts_output_dir.py +15 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_print_review_instructions.py +42 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_write_file_prompt.py +23 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_fetch_build_run.py +49 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_fetch_build_timeline.py +48 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_fetch_failed_job_logs.py +70 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_fetch_pipeline_run.py +49 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_fetch_task_log.py +48 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_get_failed_tasks.py +124 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_get_run_details.py +221 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_get_temp_folder.py +27 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_is_run_finished.py +46 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_print_failed_logs_summary.py +64 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_print_parameters.py +45 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_print_summary.py +50 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_save_json.py +42 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_save_log_file.py +47 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_wait_for_run.py +251 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_check_network_status.py +60 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_connect_vpn.py +186 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_disconnect_vpn.py +53 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_is_on_corporate_network.py +58 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_is_pulse_secure_installed.py +29 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_is_vpn_connected.py +75 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_reconnect_vpn.py +53 -0
- agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_smart_connect_vpn.py +104 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/_helpers.py +16 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_amend_async.py +59 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_commit_async.py +107 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_force_push_async.py +22 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_publish_async.py +22 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_push_async.py +22 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_stage_async.py +22 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/conftest.py +21 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/test__get_issue_key_from_state.py +30 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/test__mark_checklist_items_completed.py +43 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/test__sync_with_main.py +58 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/test__trigger_implementation_review.py +25 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_amend_cmd.py +80 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_commit_cmd.py +247 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_force_push_cmd.py +23 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_publish_cmd.py +32 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_push_cmd.py +23 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_stage_cmd.py +27 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/conftest.py +17 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/core/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/core/test_get_bool_state.py +30 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/core/test_get_commit_message.py +36 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/core/test_get_current_branch.py +35 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/core/test_run_git.py +61 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/core/test_temp_message_file.py +50 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/diff/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_addedline.py +13 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_addedlinesinfo.py +20 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_diffentry.py +27 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_get_added_lines_info.py +117 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_get_diff_entries.py +119 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_get_diff_patch.py +63 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_normalize_ref_name.py +32 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_sync_git_ref.py +65 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_amend_commit.py +24 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_branch_has_commits_ahead_of_main.py +76 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_branchsafetycheckresult.py +37 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_check_branch_safe_to_recreate.py +74 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_checkout_branch.py +106 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_checkoutresult.py +39 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_create_commit.py +31 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_fetch_branch.py +51 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_fetch_main.py +30 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_force_push.py +21 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_get_commits_behind_main.py +33 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_get_files_changed_on_branch.py +73 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_get_last_commit_message.py +84 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_has_local_changes.py +90 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_last_commit_contains_issue_key.py +45 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_local_branch_matches_origin.py +199 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_publish_branch.py +33 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_push.py +21 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_rebase_onto_main.py +69 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_rebaseresult.py +40 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_should_amend_instead_of_commit.py +33 -0
- agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_stage_changes.py +35 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_bug_issue_async.py +76 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_bug_issue_async_cli.py +59 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_documentation_issue_async.py +70 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_documentation_issue_async_cli.py +54 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_feature_issue_async.py +82 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_feature_issue_async_cli.py +55 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_issue_async.py +51 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_issue_async_cli.py +60 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_task_issue_async.py +70 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_task_issue_async_cli.py +54 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test__append_related_issues.py +41 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test__append_terminal_log.py +30 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test__build_gh_create_args.py +63 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test__check_gh_cli.py +24 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test__get_environment_info.py +60 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test_create_agdt_bug_issue.py +127 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test_create_agdt_documentation_issue.py +82 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test_create_agdt_feature_issue.py +96 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test_create_agdt_issue.py +155 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test_create_agdt_task_issue.py +80 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/state_helpers/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/state_helpers/test_get_issue_value.py +60 -0
- agentic_devtools-0.2.8/tests/unit/cli/github/state_helpers/test_set_issue_value.py +40 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/adf/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/adf/test__convert_adf_to_text.py +289 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/adf/test__process_adf_children.py +35 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/conftest.py +36 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_add_comment_async.py +58 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_add_users_to_project_role_async.py +37 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_add_users_to_project_role_batch_async.py +37 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_check_user_exists_async.py +34 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_check_users_exist_async.py +34 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_create_epic_async.py +45 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_create_issue_async.py +45 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_create_subtask_async.py +46 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_find_role_id_by_name_async.py +37 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_get_issue_async.py +43 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_get_project_role_details_async.py +34 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_list_project_roles_async.py +42 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_update_issue_async.py +43 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_status/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_status/conftest.py +36 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/async_status/test_write_async_status.py +69 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/comment_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/comment_commands/test_add_comment.py +123 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/config/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/config/test_get_jira_auth_header.py +91 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/config/test_get_jira_base_url.py +31 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/config/test_get_jira_headers.py +19 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/create_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/create_commands/test_create_epic.py +155 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/create_commands/test_create_issue.py +150 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/create_commands/test_create_issue_sync.py +139 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/create_commands/test_create_subtask.py +155 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/formatting/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/formatting/test_build_user_story_description.py +83 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/formatting/test_format_bullet_list.py +71 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/formatting/test_merge_labels.py +65 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/get_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/get_commands/test__fetch_epic.py +78 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/get_commands/test__fetch_parent_issue.py +74 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/get_commands/test__fetch_remote_links.py +85 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/get_commands/test_get_issue.py +1029 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__count_certificates_in_pem.py +37 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__ensure_jira_pem.py +137 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__fetch_certificate_chain_openssl.py +65 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__fetch_certificate_chain_ssl.py +53 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__get_repo_jira_pem_path.py +20 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__get_requests.py +28 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__get_ssl_verify.py +176 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__get_temp_jira_pem_path.py +19 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__parse_comma_separated.py +50 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__parse_multiline_string.py +50 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_get_user_details.py +134 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_get_user_details_api_calls.py +75 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_parse_error_file.py +165 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_parse_error_file_combined_errors.py +37 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_parse_error_file_multiple_dataproducts.py +35 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_parse_jira_error_report_command.py +89 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_parse_jira_error_report_integration.py +35 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_add_users_to_project_role.py +89 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_add_users_to_project_role_additional_cases.py +108 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_add_users_to_project_role_batch.py +188 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_check_user_exists.py +143 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_check_user_exists_command.py +71 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_check_users_exist_command.py +31 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_check_users_exist_command_paths.py +59 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_find_role_id_by_name.py +166 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_get_project_role_details.py +90 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_get_project_role_details_command_paths.py +127 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_list_project_roles.py +77 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_list_project_roles_command_paths.py +76 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_role_commands_error_handling.py +53 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_role_id_extraction.py +40 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/state_helpers/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/state_helpers/test_get_jira_value.py +30 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/state_helpers/test_set_jira_value.py +24 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/update_commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/update_commands/test__build_update_payload.py +108 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/update_commands/test_update_issue.py +160 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/vpn_wrapper/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/vpn_wrapper/test_with_jira_vpn_context_decorator.py +125 -0
- agentic_devtools-0.2.8/tests/unit/cli/jira/vpn_wrapper/test_with_jira_vpn_context_integration.py +56 -0
- agentic_devtools-0.2.8/tests/unit/cli/release/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/release/helpers/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/release/helpers/test_compute_sha256.py +14 -0
- agentic_devtools-0.2.8/tests/unit/cli/runner/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/runner/test_command_map.py +93 -0
- agentic_devtools-0.2.8/tests/unit/cli/runner/test_command_map_integrity.py +119 -0
- agentic_devtools-0.2.8/tests/unit/cli/runner/test_main.py +83 -0
- agentic_devtools-0.2.8/tests/unit/cli/runner/test_main_entry_point.py +18 -0
- agentic_devtools-0.2.8/tests/unit/cli/runner/test_run_as_script.py +48 -0
- agentic_devtools-0.2.8/tests/unit/cli/runner/test_run_command.py +68 -0
- agentic_devtools-0.2.8/tests/unit/cli/state/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/state/test_clear_cmd.py +16 -0
- agentic_devtools-0.2.8/tests/unit/cli/state/test_clear_workflow_cmd.py +25 -0
- agentic_devtools-0.2.8/tests/unit/cli/state/test_delete_cmd.py +32 -0
- agentic_devtools-0.2.8/tests/unit/cli/state/test_get_cmd.py +46 -0
- agentic_devtools-0.2.8/tests/unit/cli/state/test_get_workflow_cmd.py +27 -0
- agentic_devtools-0.2.8/tests/unit/cli/state/test_set_cmd.py +155 -0
- agentic_devtools-0.2.8/tests/unit/cli/state/test_show_cmd.py +27 -0
- agentic_devtools-0.2.8/tests/unit/cli/subprocess_utils/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/subprocess_utils/test_run_safe.py +125 -0
- agentic_devtools-0.2.8/tests/unit/cli/subprocess_utils/test_run_safe_integration.py +43 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_handle_task_completed.py +133 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_helper_functions.py +133 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_list_tasks.py +77 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_safe_print_unicode_error.py +60 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_show_other_incomplete_tasks.py +103 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_command_integration.py +77 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_id_argument.py +163 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_log.py +89 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_log_line_limits.py +119 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_status.py +74 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_wait.py +205 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_wait_value_error_handling.py +76 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_tasks_clean.py +110 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_try_advance_pr_review_to_summary.py +166 -0
- agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_try_complete_pr_review_workflow.py +109 -0
- agentic_devtools-0.2.8/tests/unit/cli/testing/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/testing/test__infer_test_file_from_source.py +20 -0
- agentic_devtools-0.2.8/tests/unit/cli/testing/test_async_wrappers.py +81 -0
- agentic_devtools-0.2.8/tests/unit/cli/testing/test_create_test_file_parser.py +34 -0
- agentic_devtools-0.2.8/tests/unit/cli/testing/test_get_package_root.py +33 -0
- agentic_devtools-0.2.8/tests/unit/cli/testing/test_run_subprocess_with_streaming.py +81 -0
- agentic_devtools-0.2.8/tests/unit/cli/testing/test_run_tests_file_sync.py +94 -0
- agentic_devtools-0.2.8/tests/unit/cli/testing/test_run_tests_pattern.py +60 -0
- agentic_devtools-0.2.8/tests/unit/cli/testing/test_run_tests_quick_sync.py +40 -0
- agentic_devtools-0.2.8/tests/unit/cli/testing/test_run_tests_sync.py +41 -0
- agentic_devtools-0.2.8/tests/unit/cli/vpn/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/vpn/runner/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/vpn/runner/test__detect_vpn_requirement_from_command.py +35 -0
- agentic_devtools-0.2.8/tests/unit/cli/vpn/runner/test__execute_command.py +59 -0
- agentic_devtools-0.2.8/tests/unit/cli/vpn/runner/test_run_with_vpn_context.py +222 -0
- agentic_devtools-0.2.8/tests/unit/cli/vpn/runner/test_vpnrequirement.py +13 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_branch_pushed.py +49 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_commit.py +70 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_jira_comment.py +68 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_jira_issue_retrieved.py +61 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_pr_creation.py +59 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_pr_review.py +34 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/base/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/base/test__state_key_to_variable_name.py +58 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/base/test_advance_workflow_step.py +78 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/base/test_collect_variables_from_state.py +71 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/base/test_initiate_workflow.py +118 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/base/test_validate_required_state.py +81 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_checklist.py +198 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_checklistitem.py +52 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_get_checklist.py +55 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_initialize_checklist.py +36 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_mark_items_completed.py +54 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_parse_completed_items_arg.py +60 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_save_checklist.py +60 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test__execute_retrieve_step.py +123 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_advance_pull_request_review_workflow.py +200 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_advance_work_on_jira_issue_workflow.py +149 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_advance_workflow_cmd.py +133 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_create_checklist_cmd.py +259 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_get_workflow_cmd.py +91 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_apply_pull_request_review_suggestions_workflow.py +184 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_create_jira_epic_workflow.py +173 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_create_jira_issue_workflow.py +172 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_create_jira_subtask_workflow.py +183 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_pull_request_review_workflow.py +330 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_update_jira_issue_workflow.py +147 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_work_on_jira_issue_workflow.py +158 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_notify_workflow_event.py +310 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_setup_worktree_background_cmd.py +114 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_show_checklist_cmd.py +188 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_update_checklist_cmd.py +475 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test__build_command_hint.py +96 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test__check_required_tasks_status.py +85 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test__render_failure_prompt.py +61 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test__render_waiting_prompt.py +68 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test_get_next_step.py +52 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test_get_next_workflow_prompt.py +212 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test_get_workflow_definition.py +90 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test_nextpromptresult.py +47 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test_promptstatus.py +27 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_check_worktree_and_branch.py +132 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_generate_setup_instructions.py +70 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_get_current_git_branch.py +43 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_get_git_repo_root.py +28 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_perform_auto_setup.py +100 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_preflightresult.py +68 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test__detect_git_root.py +93 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test__setup_worktree_from_state.py +97 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_check_worktree_exists.py +55 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_create_placeholder_and_setup_worktree.py +160 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_create_placeholder_issue.py +74 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_create_worktree.py +298 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_find_workspace_file.py +66 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_generate_workflow_branch_name.py +112 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_get_ai_agent_continuation_prompt.py +90 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_get_current_branch.py +38 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_get_main_repo_root.py +75 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_get_repos_parent_dir.py +30 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_get_worktree_continuation_prompt.py +120 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_inject_git_path_settings.py +195 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_is_in_worktree.py +55 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_open_vscode_workspace.py +97 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_placeholderissueresult.py +36 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_setup_worktree_environment.py +68 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_setup_worktree_in_background_sync.py +140 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_start_worktree_setup_background.py +116 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_switch_to_main_branch.py +40 -0
- agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_worktreesetupresult.py +49 -0
- agentic_devtools-0.2.8/tests/unit/conftest.py +38 -0
- agentic_devtools-0.2.8/tests/unit/file_locking/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/file_locking/test_cross_platform_behavior.py +33 -0
- agentic_devtools-0.2.8/tests/unit/file_locking/test_file_lock_error.py +24 -0
- agentic_devtools-0.2.8/tests/unit/file_locking/test_lock_file.py +32 -0
- agentic_devtools-0.2.8/tests/unit/file_locking/test_lock_functions.py +32 -0
- agentic_devtools-0.2.8/tests/unit/file_locking/test_locked_file.py +74 -0
- agentic_devtools-0.2.8/tests/unit/file_locking/test_locked_file_edge_cases.py +39 -0
- agentic_devtools-0.2.8/tests/unit/file_locking/test_locked_state_file.py +84 -0
- agentic_devtools-0.2.8/tests/unit/file_locking/test_unix_file_locking.py +138 -0
- agentic_devtools-0.2.8/tests/unit/file_locking/test_unlock_file.py +24 -0
- agentic_devtools-0.2.8/tests/unit/file_locking/test_windows_file_locking.py +110 -0
- agentic_devtools-0.2.8/tests/unit/prompts/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/conftest.py +27 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_get_prompts_dir.py +21 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_get_required_variables.py +39 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_get_temp_output_dir.py +22 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_get_template_filename.py +24 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_get_template_path.py +27 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_load_and_render_prompt.py +62 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_load_prompt_template.py +45 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_log_prompt_with_save_notice.py +25 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_save_generated_prompt.py +27 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_silentundefined.py +39 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_substitute_variables.py +83 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_substitute_variables_syntax_error.py +11 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_template_validation_error.py +29 -0
- agentic_devtools-0.2.8/tests/unit/prompts/loader/test_validate_template_variables.py +42 -0
- agentic_devtools-0.2.8/tests/unit/state/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/state/test_clear_state.py +11 -0
- agentic_devtools-0.2.8/tests/unit/state/test_clear_temp_folder.py +103 -0
- agentic_devtools-0.2.8/tests/unit/state/test_clear_workflow_state.py +12 -0
- agentic_devtools-0.2.8/tests/unit/state/test_delete_value.py +46 -0
- agentic_devtools-0.2.8/tests/unit/state/test_get_all_keys.py +11 -0
- agentic_devtools-0.2.8/tests/unit/state/test_get_pull_request_id.py +9 -0
- agentic_devtools-0.2.8/tests/unit/state/test_get_pypi_dry_run.py +50 -0
- agentic_devtools-0.2.8/tests/unit/state/test_get_pypi_package_name.py +22 -0
- agentic_devtools-0.2.8/tests/unit/state/test_get_pypi_repository.py +22 -0
- agentic_devtools-0.2.8/tests/unit/state/test_get_pypi_version.py +22 -0
- agentic_devtools-0.2.8/tests/unit/state/test_get_state_dir.py +193 -0
- agentic_devtools-0.2.8/tests/unit/state/test_get_state_file_path.py +12 -0
- agentic_devtools-0.2.8/tests/unit/state/test_get_thread_id.py +9 -0
- agentic_devtools-0.2.8/tests/unit/state/test_get_value.py +50 -0
- agentic_devtools-0.2.8/tests/unit/state/test_get_workflow_state.py +25 -0
- agentic_devtools-0.2.8/tests/unit/state/test_is_dry_run.py +42 -0
- agentic_devtools-0.2.8/tests/unit/state/test_is_workflow_active.py +23 -0
- agentic_devtools-0.2.8/tests/unit/state/test_load_state.py +49 -0
- agentic_devtools-0.2.8/tests/unit/state/test_load_state_locked.py +11 -0
- agentic_devtools-0.2.8/tests/unit/state/test_save_state.py +27 -0
- agentic_devtools-0.2.8/tests/unit/state/test_save_state_locked.py +12 -0
- agentic_devtools-0.2.8/tests/unit/state/test_set_context_value.py +253 -0
- agentic_devtools-0.2.8/tests/unit/state/test_set_dry_run.py +15 -0
- agentic_devtools-0.2.8/tests/unit/state/test_set_pull_request_id.py +9 -0
- agentic_devtools-0.2.8/tests/unit/state/test_set_pypi_dry_run.py +15 -0
- agentic_devtools-0.2.8/tests/unit/state/test_set_pypi_package_name.py +9 -0
- agentic_devtools-0.2.8/tests/unit/state/test_set_pypi_repository.py +9 -0
- agentic_devtools-0.2.8/tests/unit/state/test_set_pypi_version.py +9 -0
- agentic_devtools-0.2.8/tests/unit/state/test_set_resolve_thread.py +15 -0
- agentic_devtools-0.2.8/tests/unit/state/test_set_thread_id.py +9 -0
- agentic_devtools-0.2.8/tests/unit/state/test_set_value.py +100 -0
- agentic_devtools-0.2.8/tests/unit/state/test_set_workflow_state.py +69 -0
- agentic_devtools-0.2.8/tests/unit/state/test_should_resolve_thread.py +42 -0
- agentic_devtools-0.2.8/tests/unit/state/test_update_workflow_context.py +25 -0
- agentic_devtools-0.2.8/tests/unit/state/test_update_workflow_step.py +37 -0
- agentic_devtools-0.2.8/tests/unit/state/test_workflow_state_integration.py +60 -0
- agentic_devtools-0.2.8/tests/unit/task_state/__init__.py +0 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_add_task.py +34 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_background_task.py +155 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_duration_seconds.py +75 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_from_dict_invalid_status.py +27 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_get_active_tasks.py +33 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_get_background_tasks.py +40 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_get_failed_most_recent_per_command.py +162 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_get_incomplete_most_recent_per_command.py +84 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_get_most_recent_tasks_per_command.py +50 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_get_other_incomplete_tasks.py +80 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_get_task_by_id.py +61 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_get_tasks_by_status.py +37 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_print_task_tracking_info.py +85 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_remove_task.py +61 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_sort_tasks.py +116 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_task_lifecycle.py +38 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_task_status.py +25 -0
- agentic_devtools-0.2.8/tests/unit/task_state/test_update_task.py +42 -0
- agentic_devtools-0.2.8/tests/vpn/test_vpn_runner.py +106 -0
- agentic_devtools-0.2.6/.github/copilot-instructions.md +0 -1328
- agentic_devtools-0.2.6/.github/workflows/auto-fix-on-failure.yml +0 -218
- agentic_devtools-0.2.6/.github/workflows/security-scan-on-merge.yml +0 -326
- agentic_devtools-0.2.6/CONTRIBUTING.md +0 -321
- agentic_devtools-0.2.6/PKG-INFO +0 -862
- agentic_devtools-0.2.6/README.md +0 -837
- agentic_devtools-0.2.6/agdt_ai_helpers/__init__.py +0 -34
- agentic_devtools-0.2.6/agentic_devtools/_version.py +0 -34
- agentic_devtools-0.2.6/agentic_devtools/background_tasks.py +0 -598
- agentic_devtools-0.2.6/agentic_devtools/cli/azure/app_insights_commands.py +0 -940
- agentic_devtools-0.2.6/agentic_devtools/cli/azure/auth.py +0 -180
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_context/commands.py +0 -134
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_context/management.py +0 -233
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/async_commands.py +0 -1492
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/commands.py +0 -728
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/file_review_commands.py +0 -1038
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/helpers.py +0 -561
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/mark_reviewed.py +0 -756
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/pipeline_commands.py +0 -724
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/pr_summary_commands.py +0 -579
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/pull_request_details_commands.py +0 -596
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/review_commands.py +0 -700
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/review_helpers.py +0 -191
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/run_details_commands.py +0 -935
- agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/vpn_toggle.py +0 -1220
- agentic_devtools-0.2.6/agentic_devtools/cli/git/async_commands.py +0 -294
- agentic_devtools-0.2.6/agentic_devtools/cli/git/commands.py +0 -399
- agentic_devtools-0.2.6/agentic_devtools/cli/git/diff.py +0 -210
- agentic_devtools-0.2.6/agentic_devtools/cli/git/operations.py +0 -737
- agentic_devtools-0.2.6/agentic_devtools/cli/jira/async_commands.py +0 -439
- agentic_devtools-0.2.6/agentic_devtools/cli/jira/comment_commands.py +0 -141
- agentic_devtools-0.2.6/agentic_devtools/cli/jira/formatting.py +0 -131
- agentic_devtools-0.2.6/agentic_devtools/cli/jira/get_commands.py +0 -287
- agentic_devtools-0.2.6/agentic_devtools/cli/jira/helpers.py +0 -278
- agentic_devtools-0.2.6/agentic_devtools/cli/jira/parse_error_report.py +0 -352
- agentic_devtools-0.2.6/agentic_devtools/cli/jira/role_commands.py +0 -560
- agentic_devtools-0.2.6/agentic_devtools/cli/jira/update_commands.py +0 -222
- agentic_devtools-0.2.6/agentic_devtools/cli/jira/vpn_wrapper.py +0 -58
- agentic_devtools-0.2.6/agentic_devtools/cli/release/commands.py +0 -113
- agentic_devtools-0.2.6/agentic_devtools/cli/release/helpers.py +0 -113
- agentic_devtools-0.2.6/agentic_devtools/cli/runner.py +0 -374
- agentic_devtools-0.2.6/agentic_devtools/cli/subprocess_utils.py +0 -109
- agentic_devtools-0.2.6/agentic_devtools/cli/tasks/commands.py +0 -851
- agentic_devtools-0.2.6/agentic_devtools/cli/testing.py +0 -440
- agentic_devtools-0.2.6/agentic_devtools/cli/vpn/runner.py +0 -199
- agentic_devtools-0.2.6/agentic_devtools/cli/workflows/advancement.py +0 -204
- agentic_devtools-0.2.6/agentic_devtools/cli/workflows/base.py +0 -240
- agentic_devtools-0.2.6/agentic_devtools/cli/workflows/checklist.py +0 -278
- agentic_devtools-0.2.6/agentic_devtools/cli/workflows/commands.py +0 -1610
- agentic_devtools-0.2.6/agentic_devtools/cli/workflows/manager.py +0 -845
- agentic_devtools-0.2.6/agentic_devtools/cli/workflows/preflight.py +0 -323
- agentic_devtools-0.2.6/agentic_devtools/cli/workflows/worktree_setup.py +0 -1036
- agentic_devtools-0.2.6/agentic_devtools/prompts/loader.py +0 -377
- agentic_devtools-0.2.6/agentic_devtools/state.py +0 -754
- agentic_devtools-0.2.6/agentic_devtools/task_state.py +0 -902
- agentic_devtools-0.2.6/pyproject.toml +0 -178
- agentic_devtools-0.2.6/scripts/scaffold_tests.py +0 -222
- agentic_devtools-0.2.6/scripts/validate_test_structure.py +0 -88
- agentic_devtools-0.2.6/scripts/verify-agent-coverage.py +0 -109
- agentic_devtools-0.2.6/tests/README.md +0 -53
- agentic_devtools-0.2.6/tests/azure_context/test_commands.py +0 -166
- agentic_devtools-0.2.6/tests/azure_context/test_management.py +0 -261
- agentic_devtools-0.2.6/tests/azure_devops/conftest.py +0 -43
- agentic_devtools-0.2.6/tests/azure_devops/test_config.py +0 -386
- agentic_devtools-0.2.6/tests/cli/test_azure_app_insights_commands.py +0 -737
- agentic_devtools-0.2.6/tests/cli/test_azure_auth.py +0 -174
- agentic_devtools-0.2.6/tests/cli/test_runner.py +0 -383
- agentic_devtools-0.2.6/tests/conftest.py +0 -78
- agentic_devtools-0.2.6/tests/e2e_smoke/conftest.py +0 -161
- agentic_devtools-0.2.6/tests/e2e_smoke/test_azure_devops_commands_e2e.py +0 -84
- agentic_devtools-0.2.6/tests/e2e_smoke/test_git_commands_e2e.py +0 -117
- agentic_devtools-0.2.6/tests/e2e_smoke/test_jira_commands_e2e.py +0 -288
- agentic_devtools-0.2.6/tests/network/test_detection.py +0 -134
- agentic_devtools-0.2.6/tests/test_background_tasks.py +0 -344
- agentic_devtools-0.2.6/tests/test_checklist.py +0 -429
- agentic_devtools-0.2.6/tests/test_checklist_commands.py +0 -379
- agentic_devtools-0.2.6/tests/test_cli_state.py +0 -258
- agentic_devtools-0.2.6/tests/test_file_locking.py +0 -290
- agentic_devtools-0.2.6/tests/test_file_locking_platform.py +0 -234
- agentic_devtools-0.2.6/tests/test_git_commands.py +0 -616
- agentic_devtools-0.2.6/tests/test_git_operations.py +0 -1001
- agentic_devtools-0.2.6/tests/test_jira_adf.py +0 -319
- agentic_devtools-0.2.6/tests/test_jira_async.py +0 -324
- agentic_devtools-0.2.6/tests/test_jira_commands.py +0 -1685
- agentic_devtools-0.2.6/tests/test_jira_config.py +0 -138
- agentic_devtools-0.2.6/tests/test_jira_formatting.py +0 -209
- agentic_devtools-0.2.6/tests/test_jira_helpers.py +0 -575
- agentic_devtools-0.2.6/tests/test_jira_state.py +0 -60
- agentic_devtools-0.2.6/tests/test_jira_update_commands.py +0 -261
- agentic_devtools-0.2.6/tests/test_parse_error_report.py +0 -513
- agentic_devtools-0.2.6/tests/test_preflight.py +0 -414
- agentic_devtools-0.2.6/tests/test_prompt_loader.py +0 -402
- agentic_devtools-0.2.6/tests/test_release_commands.py +0 -180
- agentic_devtools-0.2.6/tests/test_release_helpers.py +0 -109
- agentic_devtools-0.2.6/tests/test_release_integration.py +0 -98
- agentic_devtools-0.2.6/tests/test_review_jira.py +0 -576
- agentic_devtools-0.2.6/tests/test_review_prompts.py +0 -384
- agentic_devtools-0.2.6/tests/test_role_commands.py +0 -1272
- agentic_devtools-0.2.6/tests/test_state.py +0 -1131
- agentic_devtools-0.2.6/tests/test_subprocess_utils.py +0 -163
- agentic_devtools-0.2.6/tests/test_task_state.py +0 -1034
- agentic_devtools-0.2.6/tests/test_tasks_commands.py +0 -1185
- agentic_devtools-0.2.6/tests/test_testing.py +0 -374
- agentic_devtools-0.2.6/tests/test_version.py +0 -42
- agentic_devtools-0.2.6/tests/test_vpn_wrapper.py +0 -171
- agentic_devtools-0.2.6/tests/test_workflow_advancement.py +0 -275
- agentic_devtools-0.2.6/tests/test_workflow_commands.py +0 -2230
- agentic_devtools-0.2.6/tests/test_workflow_prompt.py +0 -507
- agentic_devtools-0.2.6/tests/test_workflow_state.py +0 -277
- agentic_devtools-0.2.6/tests/test_worktree_setup.py +0 -1636
- agentic_devtools-0.2.6/tests/vpn/test_vpn_runner.py +0 -110
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.devcontainer/README.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.devcontainer/devcontainer.json +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.dfly-temp/background-tasks/all-background-tasks.json +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.dfly-temp/dfly-state.json +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/MARKDOWN_LINTING.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/.markdownlint.json +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.apply-pr-suggestions.initiate.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.create-jira-epic.initiate.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.create-jira-issue.initiate.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.create-jira-subtask.initiate.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.pull-request-review.completion.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.pull-request-review.decision.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.pull-request-review.file-review.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.pull-request-review.initiate.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.pull-request-review.summary.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.update-jira-issue.initiate.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.checklist-creation.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.commit.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.completion.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.implementation-review.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.implementation.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.initiate.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.planning.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.pull-request.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.retrieve.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.setup.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.verification.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/copilot-instructions.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/security-scan.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/senior-python-developer.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.analyze.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.checklist.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.clarify.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.constitution.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.implement.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.plan.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.specify.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.tasks.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.taskstoissues.agent.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/.markdownlint.json +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.apply-pr-suggestions.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.create-jira-epic.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.create-jira-issue.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.create-jira-subtask.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.pull-request-review.completion.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.pull-request-review.decision.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.pull-request-review.file-review.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.pull-request-review.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.pull-request-review.summary.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.update-jira-issue.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.checklist-creation.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.commit.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.completion.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.implementation-review.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.implementation.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.planning.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.pull-request.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.retrieve.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.setup.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.verification.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.analyze.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.checklist.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.clarify.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.constitution.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.implement.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.plan.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.specify.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.tasks.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.taskstoissues.prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/check-idempotency.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/create-spec-pr.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/generate-spec-from-issue.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/post-issue-comment.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/sanitize-branch-name.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/templates/.markdownlint.json +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/templates/already-processed.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/templates/completed.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/templates/failed.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/templates/started.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/README.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/lint.yml +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/publish.yml +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/release.yml +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/check-release-exists.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/create-github-release.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/create-release-packages.ps1 +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/create-release-packages.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/generate-release-notes.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/get-next-version.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/update-version.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/speckit-issue-trigger.yml +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/test.yml +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.gitignore +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.markdownlint-cli2.jsonc +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.markdownlint.json +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.push-trigger +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/SDD_QUICK_REFERENCE.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/memory/constitution.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/bash/common.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/bash/setup-plan.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/powershell/check-prerequisites.ps1 +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/powershell/common.ps1 +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/powershell/create-new-feature.ps1 +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/powershell/setup-plan.ps1 +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/powershell/update-agent-context.ps1 +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/agent-file-template.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/checklist-template.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/.markdownlint.json +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/analyze.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/checklist.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/clarify.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/constitution.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/implement.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/plan.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/specify.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/tasks.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/taskstoissues.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/plan-template.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/spec-template.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/tasks-template.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/vscode-settings.json +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.work-folder-info +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/CHANGELOG.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/LICENSE +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/PR_DESCRIPTION.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/PR_INSTRUCTIONS.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/RELEASING.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/SECURITY_SCANNING.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/SOLUTION_SUMMARY.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/SPEC_DRIVEN_DEVELOPMENT.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure/config.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_context/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_context/config.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_devops/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_devops/auth.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_devops/config.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_devops/review_jira.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_devops/review_prompts.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/git/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/git/core.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/adf.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/async_status.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/config.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/create_commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/state_helpers.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/network/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/network/commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/network/detection.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/release/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/state.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/tasks/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/vpn/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/vpn/commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/workflows/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/file_locking.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/apply-pull-request-review-suggestions/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/create-jira-epic/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/create-jira-issue/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/create-jira-subtask/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/pull-request-review/default-completion-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/pull-request-review/default-decision-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/pull-request-review/default-file-review-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/pull-request-review/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/pull-request-review/default-summary-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/update-jira-issue/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-checklist-creation-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-commit-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-completion-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-implementation-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-implementation-review-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-planning-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-pull-request-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-retrieve-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-setup-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-verification-prompt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/ayaiay.json +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/01-introduction-and-goals.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/02-architecture-constraints.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/03-system-context.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/04-solution-strategy.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/05-building-blocks.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/06-runtime-view.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/07-deployment-view.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/08-cross-cutting-concepts.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/09-architecture-decisions.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/10-quality-requirements.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/11-risks-and-technical-debt.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/12-glossary.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/README.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-add-workflow-step-agents/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-add-workflow-step-agents/plan.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-add-workflow-step-agents/spec.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-add-workflow-step-agents/tasks.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-pypi-wheel-release/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-pypi-wheel-release/plan.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-pypi-wheel-release/spec.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-pypi-wheel-release/tasks.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-separate-docs/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-separate-docs/plan.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-separate-docs/spec.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-separate-docs/tasks.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/002-github-action-speckit-trigger/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/002-github-action-speckit-trigger/plan.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/002-github-action-speckit-trigger/spec.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/002-github-action-speckit-trigger/tasks.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/002-github-action-speckit-trigger/workflow-sequence-diagram.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/003-comprehensive-e2e-smoke-tests/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/003-comprehensive-e2e-smoke-tests/spec.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/003-e2e-smoke-tests-cli/plan.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/README.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_context/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_context/test_config.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_async_commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_auth.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_commands_api.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_commands_dry_run.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_file_review_commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_helpers.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_mark_reviewed.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_pipeline_commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_pr_summary_commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_pull_request_details_commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_review_commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_run_details_commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_vpn_toggle.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/cli/test_azure_config.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/e2e_smoke/README.md +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/e2e_smoke/__init__.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/e2e_smoke/fixtures/cassettes/azure_devops_create_pr.yaml +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/e2e_smoke/fixtures/cassettes/jira_add_comment.yaml +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/e2e_smoke/fixtures/cassettes/jira_get_issue.yaml +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/network/test_network_cli.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_file_review_commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_file_review_queue_management.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_git_async.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_git_core.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_git_diff.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_git_utilities.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_scaffold_tests.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/vpn/test_vpn_commands.py +0 -0
- {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/trigger.txt +0 -0
|
@@ -0,0 +1,1495 @@
|
|
|
1
|
+
# AI Agent Instructions: agentic-devtools Python Package
|
|
2
|
+
|
|
3
|
+
> Parent Instruction Chain
|
|
4
|
+
>
|
|
5
|
+
> 1. [Root global instructions](../../../.github/copilot-instructions.md)
|
|
6
|
+
> 2. [Scripts & Automation Navigation Hub](../../.github/copilot-instructions.md)
|
|
7
|
+
>
|
|
8
|
+
> [`copilot-instructions.md` Precedence Model](../../../docs/copilot-instructions-precedence-model.md)
|
|
9
|
+
|
|
10
|
+
## 1. Purpose
|
|
11
|
+
|
|
12
|
+
`agentic-devtools` is a pip-installable Python package that provides CLI commands for AI agents to interact with
|
|
13
|
+
Git, Azure DevOps, Jira, and other services. The design prioritizes **auto-approval** in VS Code by using:
|
|
14
|
+
|
|
15
|
+
- A generic `agdt-set key value` command (approve once, works for all keys)
|
|
16
|
+
- Parameterless action commands like `agdt-git-save-work`, `agdt-add-jira-comment`
|
|
17
|
+
- Native Python CLI handling of special characters and multiline content (no replacement tokens needed!)
|
|
18
|
+
|
|
19
|
+
### Copilot Chat Agents
|
|
20
|
+
|
|
21
|
+
Workflow steps can be started from VS Code Copilot Chat using `/agdt.<workflow>.<step>` commands.
|
|
22
|
+
Agents live in `.github/agents/` and prompts live in `.github/prompts/`, mirroring the
|
|
23
|
+
existing `speckit.*` pattern.
|
|
24
|
+
|
|
25
|
+
### Multi-Worktree Development
|
|
26
|
+
|
|
27
|
+
The package supports **multi-worktree development** using a single global pip/pipx install of `agentic-devtools` shared across all
|
|
28
|
+
worktrees. Each worktree has its own `scripts/temp/agdt-state.json` file, so state is fully isolated between branches.
|
|
29
|
+
|
|
30
|
+
- **Single Global Install**: Install once with `pip install agentic-devtools` or `pipx install agentic-devtools`; all worktrees use the same installation
|
|
31
|
+
- **No Command Changes**: The same `agdt-*` commands work everywhere - entry points call implementations directly
|
|
32
|
+
|
|
33
|
+
### Background Task Architecture
|
|
34
|
+
|
|
35
|
+
**All action commands** spawn background tasks and return immediately:
|
|
36
|
+
|
|
37
|
+
- Commands like `agdt-git-save-work`, `agdt-add-jira-comment`, `agdt-create-pull-request` run in the background
|
|
38
|
+
- They return immediately with a task ID for tracking
|
|
39
|
+
- Results are written to output files in `scripts/temp/` when the task completes
|
|
40
|
+
- Use `agdt-task-status`, `agdt-task-log`, or `agdt-task-wait` to monitor progress
|
|
41
|
+
- The immediate console output tells the AI agent:
|
|
42
|
+
1. What background task was triggered
|
|
43
|
+
2. The task ID for status checking
|
|
44
|
+
3. Where to find results when complete (output file path)
|
|
45
|
+
|
|
46
|
+
### ⚠️ CRITICAL: Testing Commands
|
|
47
|
+
|
|
48
|
+
**When working on `agentic-devtools`, ALWAYS use `agdt-test` commands - NEVER run pytest directly!**
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Full test suite (background, ~55 seconds for 2000+ tests)
|
|
52
|
+
agdt-test
|
|
53
|
+
agdt-task-wait
|
|
54
|
+
|
|
55
|
+
# Quick tests without coverage (background)
|
|
56
|
+
agdt-test-quick
|
|
57
|
+
agdt-task-wait
|
|
58
|
+
|
|
59
|
+
# Specific source file with 100% coverage requirement (background)
|
|
60
|
+
agdt-test-file --source-file agentic_devtools/state.py # Auto-saves to state
|
|
61
|
+
agdt-task-wait
|
|
62
|
+
|
|
63
|
+
# Specific test - synchronous (simpler for quick checks)
|
|
64
|
+
agdt-test-pattern tests/test_jira_helpers.py::TestClassName -v
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Why:
|
|
68
|
+
|
|
69
|
+
- Tests run as background tasks to prevent AI agents from thinking something went wrong
|
|
70
|
+
- Logs are captured properly in `scripts/temp/background-tasks/logs/`
|
|
71
|
+
- Direct pytest calls don't integrate with the background task system
|
|
72
|
+
- `agdt-test-file` shows coverage ONLY for the specified source file
|
|
73
|
+
|
|
74
|
+
See [Testing](#13-testing) for all test commands.
|
|
75
|
+
|
|
76
|
+
### ⚠️ CRITICAL: Run PR Checks Before Pushing
|
|
77
|
+
|
|
78
|
+
**Before pushing ANY changes (especially before creating a PR), ALWAYS run the full PR check suite:**
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
bash scripts/run-pr-checks.sh
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
This script runs CI-blocking checks plus ruff formatting (applied by the auto-fix workflow):
|
|
85
|
+
|
|
86
|
+
1. Test structure validation
|
|
87
|
+
2. pytest with coverage
|
|
88
|
+
3. E2E smoke tests
|
|
89
|
+
4. ruff check (lint)
|
|
90
|
+
5. ruff format check
|
|
91
|
+
6. markdownlint
|
|
92
|
+
7. mypy (informational — does not block CI)
|
|
93
|
+
|
|
94
|
+
**If any check fails, fix the issues before pushing.** This prevents CI failures and avoids triggering the auto-fix workflow unnecessarily.
|
|
95
|
+
|
|
96
|
+
For quick auto-fixable lint issues:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
ruff check --fix .
|
|
100
|
+
ruff format .
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Then re-run `bash scripts/run-pr-checks.sh` to verify everything passes.
|
|
104
|
+
|
|
105
|
+
## 2. Package Structure
|
|
106
|
+
|
|
107
|
+
```text
|
|
108
|
+
agentic_devtools/
|
|
109
|
+
├── __init__.py # Package metadata
|
|
110
|
+
├── state.py # JSON state management (single file: agdt-state.json)
|
|
111
|
+
├── file_locking.py # Cross-platform file locking for state
|
|
112
|
+
├── task_state.py # Background task state schema and CRUD
|
|
113
|
+
├── background_tasks.py # Background task execution infrastructure
|
|
114
|
+
├── cli/
|
|
115
|
+
│ ├── __init__.py
|
|
116
|
+
│ ├── state.py # Generic set/get/delete/clear/show commands
|
|
117
|
+
│ ├── azure_devops/ # Azure DevOps module (modular package)
|
|
118
|
+
│ │ ├── __init__.py # Re-exports public API for backward compatibility
|
|
119
|
+
│ │ ├── config.py # Constants + AzureDevOpsConfig dataclass
|
|
120
|
+
│ │ ├── auth.py # PAT and auth header functions
|
|
121
|
+
│ │ ├── helpers.py # Pure utility functions (no state reading)
|
|
122
|
+
│ │ └── commands.py # CLI commands with dry_run + state reading
|
|
123
|
+
│ ├── git/ # Git workflow commands (package)
|
|
124
|
+
│ │ ├── __init__.py # Command exports
|
|
125
|
+
│ │ ├── core.py # State helpers, git execution, temp files
|
|
126
|
+
│ │ ├── operations.py # Individual git operations
|
|
127
|
+
│ │ └── commands.py # CLI entry points
|
|
128
|
+
│ ├── github/ # GitHub issue creation commands (package)
|
|
129
|
+
│ │ ├── __init__.py # Command exports
|
|
130
|
+
│ │ ├── state_helpers.py # issue.* namespace helpers
|
|
131
|
+
│ │ ├── issue_commands.py # Synchronous issue creation commands
|
|
132
|
+
│ │ └── async_commands.py # Background/async command wrappers + CLI entry points
|
|
133
|
+
│ ├── jira/ # Jira commands (package)
|
|
134
|
+
│ │ ├── __init__.py # Command exports
|
|
135
|
+
│ │ ├── config.py # Jira configuration and auth
|
|
136
|
+
│ │ ├── commands.py # Synchronous CLI entry points
|
|
137
|
+
│ │ ├── update_commands.py # Issue update command
|
|
138
|
+
│ │ └── async_commands.py # Background/async command wrappers
|
|
139
|
+
│ └── tasks/ # Background task monitoring (package)
|
|
140
|
+
│ ├── __init__.py # Command exports
|
|
141
|
+
│ └── commands.py # Task monitoring CLI commands
|
|
142
|
+
├── prompts/ # Prompt template system (package)
|
|
143
|
+
│ ├── __init__.py # Package exports
|
|
144
|
+
│ └── loader.py # Template loading, validation, substitution
|
|
145
|
+
└── pyproject.toml # Package config with entry points
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Module Responsibilities
|
|
149
|
+
|
|
150
|
+
| Module | Responsibility |
|
|
151
|
+
|--------|---------------|
|
|
152
|
+
| `azure_devops/config.py` | Constants (`DEFAULT_ORGANIZATION`, `APPROVAL_SENTINEL`, etc.) and `AzureDevOpsConfig` dataclass |
|
|
153
|
+
| `azure_devops/auth.py` | `get_pat()` and `get_auth_headers()` for Azure DevOps authentication |
|
|
154
|
+
| `azure_devops/helpers.py` | Pure utility functions: `build_thread_context`, `convert_to_pull_request_title`, `format_approval_content`, etc. |
|
|
155
|
+
| `azure_devops/commands.py` | CLI entry points: `reply_to_pull_request_thread`, `add_pull_request_comment`, `create_pull_request`, etc. |
|
|
156
|
+
| `azure_devops/file_review_commands.py` | File-level review: `approve_file`, `request_changes`, `request_changes_with_suggestion`, `submit_file_review` |
|
|
157
|
+
| `azure_devops/mark_reviewed.py` | Mark files as reviewed in Azure DevOps: updates Reviewers API and Contribution API for UI display |
|
|
158
|
+
| `azure_devops/review_commands.py` | PR review workflow: `review_pull_request`, prompt generation, Jira integration |
|
|
159
|
+
| `azure_devops/__init__.py` | Re-exports all public API for backward compatibility (`from agentic_devtools.cli.azure_devops import reply_to_pr_thread`) |
|
|
160
|
+
| `git/core.py` | State helpers, git command execution, temp file handling |
|
|
161
|
+
| `git/operations.py` | Individual git operations (stage, commit, push, etc.) and smart amend detection |
|
|
162
|
+
| `git/commands.py` | CLI entry points: `agdt-git-save-work` (auto-detects amend), `agdt-git-stage`, `agdt-git-push`, etc. |
|
|
163
|
+
| `github/__init__.py` | Re-exports public API for `agdt-create-agdt-*` commands |
|
|
164
|
+
| `github/state_helpers.py` | `get_issue_value()` and `set_issue_value()` for the `issue.*` state namespace |
|
|
165
|
+
| `github/issue_commands.py` | Sync implementations: `create_agdt_issue`, `create_agdt_bug_issue`, `create_agdt_feature_issue`, `create_agdt_documentation_issue`, `create_agdt_task_issue` |
|
|
166
|
+
| `github/async_commands.py` | Async wrappers (background tasks) and argparse CLI entry points for all `agdt-create-agdt-*` commands |
|
|
167
|
+
| `prompts/loader.py` | Template loading, variable extraction, validation, substitution, and output saving |
|
|
168
|
+
| `cli/workflows/base.py` | Base workflow utilities: `validate_required_state`, `initiate_workflow`, `advance_workflow_step` |
|
|
169
|
+
| `cli/workflows/commands.py` | Workflow initiation CLI commands for each workflow type |
|
|
170
|
+
| `cli/workflows/preflight.py` | Pre-flight checks for work-on-jira-issue: worktree/branch validation |
|
|
171
|
+
| `cli/workflows/advancement.py` | Auto-advancement helpers called by other commands to progress workflows |
|
|
172
|
+
|
|
173
|
+
## 3. State Management Pattern
|
|
174
|
+
|
|
175
|
+
All state is stored in a single JSON file (`scripts/temp/agdt-state.json`):
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
from agentic_devtools.state import get_value, set_value, load_state
|
|
179
|
+
|
|
180
|
+
# Set values
|
|
181
|
+
set_value("pr_id", 23046)
|
|
182
|
+
set_value("content", "My reply message")
|
|
183
|
+
|
|
184
|
+
# Get values
|
|
185
|
+
pr_id = get_value("pr_id")
|
|
186
|
+
content = get_value("content")
|
|
187
|
+
|
|
188
|
+
# Load entire state
|
|
189
|
+
state = load_state() # Returns dict
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Workflow State
|
|
193
|
+
|
|
194
|
+
Workflow state is stored separately under the `_workflow` key and managed through dedicated functions:
|
|
195
|
+
|
|
196
|
+
```python
|
|
197
|
+
from agentic_devtools.state import (
|
|
198
|
+
get_workflow_state, set_workflow_state, clear_workflow_state,
|
|
199
|
+
is_workflow_active, update_workflow_step, update_workflow_context
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
# Set workflow state
|
|
203
|
+
set_workflow_state(
|
|
204
|
+
name="pull-request-review",
|
|
205
|
+
status="active",
|
|
206
|
+
step="initiate",
|
|
207
|
+
context={"pull_request_id": "123"}
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
# Check if a workflow is active
|
|
211
|
+
if is_workflow_active():
|
|
212
|
+
workflow = get_workflow_state()
|
|
213
|
+
print(f"Active: {workflow['name']} at step {workflow['step']}")
|
|
214
|
+
|
|
215
|
+
# Update workflow progress
|
|
216
|
+
update_workflow_step("reviewing")
|
|
217
|
+
update_workflow_context(files_reviewed=5)
|
|
218
|
+
|
|
219
|
+
# Clear when done
|
|
220
|
+
clear_workflow_state()
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Workflow Transition Behavior
|
|
224
|
+
|
|
225
|
+
Workflows advance through steps via event-driven transitions. The transition behavior depends on the `auto_advance` flag and `required_tasks`:
|
|
226
|
+
|
|
227
|
+
1. **Immediate Advancement** (auto_advance=True, no required_tasks):
|
|
228
|
+
- The workflow step changes immediately
|
|
229
|
+
- The next step's prompt is rendered and printed to the console
|
|
230
|
+
- Examples: `CHECKLIST_CREATED`, `CHECKLIST_COMPLETE`, `JIRA_COMMENT_ADDED`
|
|
231
|
+
|
|
232
|
+
2. **Deferred Advancement** (auto_advance=True, has required_tasks):
|
|
233
|
+
- A `pending_transition` is recorded in the workflow context
|
|
234
|
+
- The step changes when `agdt-get-next-workflow-prompt` is called AND the background tasks complete
|
|
235
|
+
- Examples: `GIT_COMMIT_CREATED` (waits for agdt-git-commit task)
|
|
236
|
+
|
|
237
|
+
3. **Manual Advancement** (auto_advance=False):
|
|
238
|
+
- Requires explicit `agdt-advance-workflow` command
|
|
239
|
+
- Used for steps that need human confirmation
|
|
240
|
+
|
|
241
|
+
When a transition fires immediately, the output looks like:
|
|
242
|
+
|
|
243
|
+
```text
|
|
244
|
+
================================================================================
|
|
245
|
+
WORKFLOW ADVANCED: work-on-jira-issue
|
|
246
|
+
NEW STEP: implementation-review
|
|
247
|
+
================================================================================
|
|
248
|
+
|
|
249
|
+
# Work on Jira Issue - Implementation Review Step
|
|
250
|
+
...
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Jira Namespace
|
|
254
|
+
|
|
255
|
+
Jira commands use keys prefixed with `jira.`:
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
agdt-set jira.issue_key DFLY-1234
|
|
259
|
+
agdt-set jira.comment "My comment"
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## 4. CLI Commands
|
|
263
|
+
|
|
264
|
+
### State Management
|
|
265
|
+
|
|
266
|
+
| Command | Purpose | Example |
|
|
267
|
+
|---------|---------|---------|
|
|
268
|
+
| `agdt-set` | Set any key-value | `agdt-set pull_request_id 23046` |
|
|
269
|
+
| `agdt-get` | Get a value | `agdt-get content` |
|
|
270
|
+
| `agdt-delete` | Remove a key | `agdt-delete thread_id` |
|
|
271
|
+
| `agdt-clear` | Clear all state | `agdt-clear` |
|
|
272
|
+
| `agdt-show` | Show all state | `agdt-show` |
|
|
273
|
+
|
|
274
|
+
### Azure DevOps Actions (Background Tasks)
|
|
275
|
+
|
|
276
|
+
All action commands that mutate state or perform API calls spawn background tasks and return immediately with a task ID for tracking.
|
|
277
|
+
|
|
278
|
+
| Command | Purpose | Required State / CLI Args |
|
|
279
|
+
|---------|---------|---------------------------|
|
|
280
|
+
| `agdt-add-pull-request-comment` | Add new PR comment | pull_request_id, content |
|
|
281
|
+
| `agdt-approve-pull-request` | Approve PR with sentinel banner | pull_request_id, content |
|
|
282
|
+
| `agdt-create-pull-request` | Create a new pull request | source_branch, title OR `--source-branch`, `--title`, `--description` |
|
|
283
|
+
| `agdt-reply-to-pull-request-thread` | Reply to PR thread | pull_request_id, thread_id, content |
|
|
284
|
+
| `agdt-resolve-thread` | Resolve a PR thread | pull_request_id, thread_id |
|
|
285
|
+
| `agdt-mark-pull-request-draft` | Mark PR as draft | pull_request_id |
|
|
286
|
+
| `agdt-publish-pull-request` | Publish draft PR | pull_request_id |
|
|
287
|
+
| `agdt-run-e2e-tests` | Trigger E2E test pipeline | (pipeline params) |
|
|
288
|
+
| `agdt-run-wb-patch` | Trigger workbench patch pipeline | (pipeline params) |
|
|
289
|
+
| `agdt-review-pull-request` | Start PR review workflow | (optional) pull_request_id, jira.issue_key |
|
|
290
|
+
| `agdt-generate-pr-summary` | Generate PR summary comments | pull_request_id |
|
|
291
|
+
|
|
292
|
+
**Create Pull Request CLI Parameter Support:**
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
# Option A: With CLI parameters (explicit)
|
|
296
|
+
agdt-create-pull-request --source-branch "feature/DFLY-1234/new-feature" --title "feature(DFLY-1234): add new feature" --description "Description here"
|
|
297
|
+
|
|
298
|
+
# Option B: Parameterless (uses current state)
|
|
299
|
+
# Check current values: agdt-get source_branch, agdt-get title
|
|
300
|
+
agdt-create-pull-request
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Azure DevOps Query Commands (Background Tasks)
|
|
304
|
+
|
|
305
|
+
Query commands also spawn background tasks - results are written to output files:
|
|
306
|
+
|
|
307
|
+
| Command | Purpose | Required State | Output File |
|
|
308
|
+
|---------|---------|----------------|-------------|
|
|
309
|
+
| `agdt-get-pull-request-threads` | Get all PR comment threads | pull_request_id | `temp/pr-threads-{pr_id}.json` |
|
|
310
|
+
| `agdt-get-pull-request-details` | Get full PR details (diff, threads, iterations) | pull_request_id | `temp/pr-details-{pr_id}.json` |
|
|
311
|
+
| `agdt-get-run-details` | Get pipeline/build run details | run_id | `temp/run-details-{run_id}.json` |
|
|
312
|
+
|
|
313
|
+
### Pull Request Review Commands (Background Tasks)
|
|
314
|
+
|
|
315
|
+
| Command | Purpose | Required State / CLI Args |
|
|
316
|
+
|---------|---------|---------------------------|
|
|
317
|
+
| `agdt-review-pull-request` | Start PR review workflow | (optional) pull_request_id or jira.issue_key |
|
|
318
|
+
| `agdt-approve-file` | Approve a file during review | pull_request_id, file_review.file_path, content OR `--file-path`, `--content`, `--pull-request-id` |
|
|
319
|
+
| `agdt-request-changes` | Request changes on a file | pull_request_id, file_review.file_path, content, line OR `--file-path`, `--content`, `--line`, `--pull-request-id` |
|
|
320
|
+
| `agdt-request-changes-with-suggestion` | Request changes with code suggestion | pull_request_id, file_review.file_path, content, line OR `--file-path`, `--content`, `--line`, `--pull-request-id` |
|
|
321
|
+
| `agdt-mark-file-reviewed` | Mark a file as reviewed (standalone) | pull_request_id, file_review.file_path |
|
|
322
|
+
| `agdt-submit-file-review` | Submit batched file review | pull_request_id |
|
|
323
|
+
|
|
324
|
+
**File Review CLI Parameter Support:**
|
|
325
|
+
|
|
326
|
+
File review commands accept optional CLI arguments that override state values:
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
# Option A: With CLI parameters (explicit, self-documenting)
|
|
330
|
+
agdt-approve-file --file-path "src/app/component.ts" --content "LGTM - clean implementation"
|
|
331
|
+
agdt-request-changes --file-path "src/app/service.ts" --content "Missing null check" --line 42
|
|
332
|
+
agdt-request-changes-with-suggestion --file-path "src/utils.ts" --content "```suggestion
|
|
333
|
+
const value = x ?? defaultValue;
|
|
334
|
+
```" --line 15
|
|
335
|
+
|
|
336
|
+
# Option B: Parameterless (uses current state)
|
|
337
|
+
# Check current values: agdt-get file_review.file_path, agdt-get content, agdt-get line
|
|
338
|
+
agdt-approve-file
|
|
339
|
+
agdt-request-changes
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
**Review Command Behavior:**
|
|
343
|
+
|
|
344
|
+
All file review commands automatically:
|
|
345
|
+
|
|
346
|
+
1. Post the review comment (runs as background task)
|
|
347
|
+
2. Mark the file as reviewed in Azure DevOps (visible as "viewed" eye icon in PR UI)
|
|
348
|
+
3. Update the review queue (`queue.json`)
|
|
349
|
+
4. Print next steps (continue with next file or generate summary)
|
|
350
|
+
|
|
351
|
+
### Git Workflow Actions (Background Tasks)
|
|
352
|
+
|
|
353
|
+
All Git workflow commands spawn background tasks:
|
|
354
|
+
|
|
355
|
+
| Command | Purpose | Required State |
|
|
356
|
+
|---------|---------|----------------|
|
|
357
|
+
| `agdt-git-save-work` | Stage, commit/amend, publish/force-push | commit_message |
|
|
358
|
+
| `agdt-git-stage` | Stage all changes | (none) |
|
|
359
|
+
| `agdt-git-push` | Push to origin | (none) |
|
|
360
|
+
| `agdt-git-force-push` | Force push to origin | (none) |
|
|
361
|
+
| `agdt-git-publish` | Publish branch upstream | (none) |
|
|
362
|
+
|
|
363
|
+
**Smart Commit Detection:**
|
|
364
|
+
The `agdt-git-save-work` command automatically detects whether to create a new commit or amend:
|
|
365
|
+
|
|
366
|
+
- If branch has commits ahead of `origin/main` AND last commit contains current issue key → **amend + force push**
|
|
367
|
+
- Otherwise → **new commit + publish**
|
|
368
|
+
|
|
369
|
+
**Checklist Integration:**
|
|
370
|
+
Use `--completed` to mark checklist items during commit:
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
agdt-git-save-work --completed 1 2 3 # Marks items 1, 2, 3 complete before committing
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
**Optional Git state keys:**
|
|
377
|
+
|
|
378
|
+
- `dry_run` - Preview operations without executing
|
|
379
|
+
- `skip_stage` - Skip the staging step
|
|
380
|
+
- `skip_publish` - Skip branch publish after initial commit
|
|
381
|
+
|
|
382
|
+
### Jira Actions (Background Tasks)
|
|
383
|
+
|
|
384
|
+
All Jira action commands that mutate state spawn background tasks:
|
|
385
|
+
|
|
386
|
+
| Command | Purpose | Required State / CLI Args |
|
|
387
|
+
|---------|---------|---------------------------|
|
|
388
|
+
| `agdt-add-jira-comment` | Add comment to issue | `jira.issue_key`, `jira.comment` OR `--jira-comment`, `--jira-issue-key` |
|
|
389
|
+
| `agdt-update-jira-issue` | Update issue fields | jira.issue_key, plus field keys |
|
|
390
|
+
| `agdt-create-epic` | Create a new epic | jira.project_key, jira.summary, jira.epic_name, jira.role, jira.desired_outcome, jira.benefit |
|
|
391
|
+
| `agdt-create-issue` | Create a new issue | jira.project_key, jira.summary, jira.description (or role/outcome/benefit) |
|
|
392
|
+
| `agdt-create-subtask` | Create a subtask | jira.parent_key, jira.summary, jira.description |
|
|
393
|
+
|
|
394
|
+
**CLI Parameter Support:**
|
|
395
|
+
Some commands accept optional CLI arguments that override state values:
|
|
396
|
+
|
|
397
|
+
- `agdt-add-jira-comment --jira-comment "..." [--jira-issue-key KEY]` - Comment text and issue key can be passed directly
|
|
398
|
+
- When CLI args are provided, they are stored in state before execution
|
|
399
|
+
|
|
400
|
+
**Documentation Pattern for Commands with Optional Parameters:**
|
|
401
|
+
|
|
402
|
+
When documenting commands that support both CLI parameters and parameterless execution, show both options:
|
|
403
|
+
|
|
404
|
+
```bash
|
|
405
|
+
# Option A: With CLI parameters (explicit)
|
|
406
|
+
agdt-add-jira-comment --jira-comment "Your comment text here"
|
|
407
|
+
|
|
408
|
+
# Option B: Parameterless (uses current state)
|
|
409
|
+
# Current jira.issue_key: run `agdt-get jira.issue_key` to check
|
|
410
|
+
# Current jira.comment: run `agdt-get jira.comment` to check
|
|
411
|
+
agdt-add-jira-comment
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
This pattern:
|
|
415
|
+
|
|
416
|
+
1. Shows CLI parameters first for explicit, self-documenting usage
|
|
417
|
+
2. Shows parameterless alternative that uses current state values
|
|
418
|
+
3. Indicates how to check current state values before running parameterless
|
|
419
|
+
|
|
420
|
+
### Jira Role Management (Background Tasks)
|
|
421
|
+
|
|
422
|
+
| Command | Purpose | Required State |
|
|
423
|
+
|---------|---------|----------------|
|
|
424
|
+
| `agdt-list-project-roles` | List project roles | jira.project_key |
|
|
425
|
+
| `agdt-get-project-role-details` | Get role details | jira.project_key, jira.role_id |
|
|
426
|
+
| `agdt-add-users-to-project-role` | Add users to role | jira.project_key, jira.role_id, jira.usernames |
|
|
427
|
+
| `agdt-add-users-to-project-role-batch` | Batch add users | jira.project_key, jira.role_id, jira.usernames |
|
|
428
|
+
| `agdt-find-role-id-by-name` | Find role ID | jira.project_key, jira.role_name |
|
|
429
|
+
| `agdt-check-user-exists` | Check if user exists | jira.username |
|
|
430
|
+
| `agdt-check-users-exist` | Check multiple users | jira.usernames |
|
|
431
|
+
|
|
432
|
+
### Jira Query Commands (Background Tasks)
|
|
433
|
+
|
|
434
|
+
Jira query commands also spawn background tasks - results are written to output files:
|
|
435
|
+
|
|
436
|
+
| Command | Purpose | Required State | Output File |
|
|
437
|
+
|---------|---------|----------------|-------------|
|
|
438
|
+
| `agdt-get-jira-issue` | Get issue details | jira.issue_key | `temp/temp-get-issue-details-response.json` |
|
|
439
|
+
| `agdt-parse-jira-error-report` | Parse error report | (file input) | `temp/jira-error-report.json` |
|
|
440
|
+
|
|
441
|
+
**`agdt-get-jira-issue` Features:**
|
|
442
|
+
|
|
443
|
+
- **Automatic subtask detection**: Checks `issuetype.subtask` field
|
|
444
|
+
- **Automatic parent retrieval**: Fetches parent issue for subtasks → `temp/temp-get-parent-issue-details-response.json`
|
|
445
|
+
- **Automatic epic retrieval**: Fetches linked epic via `customfield_10008` → `temp/temp-get-epic-details-response.json`
|
|
446
|
+
- **Metadata references in state**: Stores file locations and timestamps, NOT full JSON:
|
|
447
|
+
- `jira.issue_details` → `{location, retrievalTimestamp}`
|
|
448
|
+
- `jira.parent_issue_details` → `{location, key, retrievalTimestamp}` (if subtask)
|
|
449
|
+
- `jira.epic_details` → `{location, key, retrievalTimestamp}` (if epic linked)
|
|
450
|
+
- **Console output**: Prints formatted issue details including parent/epic info
|
|
451
|
+
|
|
452
|
+
**Update Issue State Keys:**
|
|
453
|
+
|
|
454
|
+
- `jira.summary` - New summary text
|
|
455
|
+
- `jira.description` - New description text
|
|
456
|
+
- `jira.labels` - Comma-separated labels (replaces existing)
|
|
457
|
+
- `jira.labels_add` - Comma-separated labels to add
|
|
458
|
+
- `jira.labels_remove` - Comma-separated labels to remove
|
|
459
|
+
- `jira.assignee` - Username to assign (empty string to unassign)
|
|
460
|
+
- `jira.priority` - Priority name (e.g., "High", "Medium", "Low")
|
|
461
|
+
- `jira.custom_fields` - JSON object of custom field IDs to values
|
|
462
|
+
|
|
463
|
+
### Background Task Management
|
|
464
|
+
|
|
465
|
+
| Command | Purpose | Required State |
|
|
466
|
+
|---------|---------|----------------|
|
|
467
|
+
| `agdt-tasks` | List all background tasks | (none) |
|
|
468
|
+
| `agdt-task-status` | Show detailed task status | background.task_id |
|
|
469
|
+
| `agdt-task-log` | Display task output log | background.task_id |
|
|
470
|
+
| `agdt-task-wait` | Wait for task completion | background.task_id |
|
|
471
|
+
| `agdt-tasks-clean` | Clean up expired tasks | (none) |
|
|
472
|
+
|
|
473
|
+
**Optional Background Task State Keys:**
|
|
474
|
+
|
|
475
|
+
- `background.task_id` - Task ID to query/wait for
|
|
476
|
+
- `background.timeout` - Wait timeout in seconds (default: 300)
|
|
477
|
+
- `background.poll_interval` - Poll interval in seconds (default: 2)
|
|
478
|
+
- `background.log_lines` - Number of log lines to show (negative for tail)
|
|
479
|
+
- `background.expiry_hours` - Hours before tasks expire (default: 24)
|
|
480
|
+
|
|
481
|
+
**Background Task Pattern:**
|
|
482
|
+
|
|
483
|
+
Action commands spawn background processes and return immediately:
|
|
484
|
+
|
|
485
|
+
```bash
|
|
486
|
+
# Start background operation
|
|
487
|
+
agdt-set jira.issue_key DFLY-1234
|
|
488
|
+
agdt-set jira.comment "Processing complete"
|
|
489
|
+
agdt-add-jira-comment
|
|
490
|
+
# Output: Background task started: <task-id>
|
|
491
|
+
|
|
492
|
+
# Monitor the task
|
|
493
|
+
agdt-set background.task_id <task-id>
|
|
494
|
+
agdt-task-status # Check current status
|
|
495
|
+
agdt-task-log # View output log
|
|
496
|
+
agdt-task-wait # Wait for completion
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### Testing Actions
|
|
500
|
+
|
|
501
|
+
**⚠️ CRITICAL FOR AI AGENTS: ALWAYS use these agdt-test commands, NEVER run pytest directly!**
|
|
502
|
+
|
|
503
|
+
These commands run tests in BACKGROUND TASKS and return immediately with a task ID.
|
|
504
|
+
The test suite has 2000+ tests and takes ~55 seconds - running synchronously causes
|
|
505
|
+
AI agents to think something went wrong and restart tests multiple times.
|
|
506
|
+
|
|
507
|
+
| Command | Purpose | Required State |
|
|
508
|
+
|---------|---------|----------------|
|
|
509
|
+
| `agdt-test` | Run full test suite with coverage (~55s) | (none) |
|
|
510
|
+
| `agdt-test-quick` | Run tests without coverage (faster) | (none) |
|
|
511
|
+
| `agdt-test-file --source-file <path>` | Run tests for a specific source file with 100% coverage | (none - uses `--source-file` param) |
|
|
512
|
+
| `agdt-test-pattern <args>` | Run specific tests (SYNCHRONOUS) | (none - takes args) |
|
|
513
|
+
|
|
514
|
+
**Basic workflow (full test suite):**
|
|
515
|
+
|
|
516
|
+
```bash
|
|
517
|
+
# Run tests in background
|
|
518
|
+
agdt-test
|
|
519
|
+
|
|
520
|
+
# Wait for completion (REQUIRED - do not skip!)
|
|
521
|
+
agdt-task-wait
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
**Running tests for a specific source file (with focused coverage):**
|
|
525
|
+
|
|
526
|
+
```bash
|
|
527
|
+
# Specify source file via --source-file (auto-saved to state for future runs)
|
|
528
|
+
agdt-test-file --source-file agentic_devtools/state.py
|
|
529
|
+
agdt-task-wait
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
This is ideal when working on a single module and wanting to ensure full test coverage.
|
|
533
|
+
The command:
|
|
534
|
+
|
|
535
|
+
- Infers the test file from the source file name (e.g., `state.py` → `test_state.py`)
|
|
536
|
+
- Shows coverage ONLY for the specified source file (not the entire codebase)
|
|
537
|
+
- Requires 100% coverage for the target file to pass
|
|
538
|
+
- Auto-saves `--source-file` to state, so subsequent runs can omit the parameter
|
|
539
|
+
|
|
540
|
+
**Running specific test classes or methods (synchronous):**
|
|
541
|
+
|
|
542
|
+
```bash
|
|
543
|
+
# Test a specific class
|
|
544
|
+
agdt-test-pattern tests/test_jira_helpers.py::TestEnsureJiraPem -v
|
|
545
|
+
|
|
546
|
+
# Test a specific method
|
|
547
|
+
agdt-test-pattern "tests/test_state.py::TestWorkflowState::test_set_and_get_workflow_state" -v
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
**When to use which command:**
|
|
551
|
+
|
|
552
|
+
- `agdt-test` - Full suite validation before committing (required!)
|
|
553
|
+
- `agdt-test-quick` - Full suite without coverage for faster iteration
|
|
554
|
+
- `agdt-test-file` - Background execution for specific file/pattern (use when you want to check other things while tests run)
|
|
555
|
+
- `agdt-test-pattern` - Synchronous execution when you need immediate results from a specific test
|
|
556
|
+
|
|
557
|
+
**DO NOT:**
|
|
558
|
+
|
|
559
|
+
- Run `pytest` directly
|
|
560
|
+
- Run multiple test commands in parallel
|
|
561
|
+
- Assume tests failed if command returns quickly (they run in background)
|
|
562
|
+
|
|
563
|
+
### Workflow Management
|
|
564
|
+
|
|
565
|
+
| Command | Purpose | Required State |
|
|
566
|
+
|---------|---------|----------------|
|
|
567
|
+
| `agdt-get-workflow` | Display current workflow state | (none) |
|
|
568
|
+
| `agdt-clear-workflow` | Clear workflow state | (none) |
|
|
569
|
+
| `agdt-create-checklist` | Create checklist from CLI args | (none - takes args) |
|
|
570
|
+
| `agdt-update-checklist` | Update checklist items | (checklist in workflow) |
|
|
571
|
+
| `agdt-show-checklist` | Display current checklist | (checklist in workflow) |
|
|
572
|
+
|
|
573
|
+
### Workflow Initiation Commands
|
|
574
|
+
|
|
575
|
+
These commands initiate a workflow, loading and rendering the appropriate prompt template:
|
|
576
|
+
|
|
577
|
+
| Command | Purpose | Required Parameters |
|
|
578
|
+
|---------|---------|---------------------|
|
|
579
|
+
| `agdt-initiate-pull-request-review-workflow` | Start PR review workflow | `--pull-request-id` or `--issue-key` |
|
|
580
|
+
| `agdt-initiate-work-on-jira-issue-workflow` | Start work on Jira issue | `--issue-key` |
|
|
581
|
+
| `agdt-initiate-create-jira-issue-workflow` | Start create issue workflow | `--project-key` |
|
|
582
|
+
| `agdt-initiate-create-jira-epic-workflow` | Start create epic workflow | `--project-key` |
|
|
583
|
+
| `agdt-initiate-create-jira-subtask-workflow` | Start create subtask workflow | `--parent-key` |
|
|
584
|
+
| `agdt-initiate-update-jira-issue-workflow` | Start update issue workflow | `--issue-key` |
|
|
585
|
+
| `agdt-initiate-apply-pr-suggestions-workflow` | Apply PR review suggestions | `--pull-request-id` |
|
|
586
|
+
| `agdt-advance-workflow` | Advance to next workflow step | (active workflow) |
|
|
587
|
+
|
|
588
|
+
**Workflow Command Behavior:**
|
|
589
|
+
|
|
590
|
+
1. Validates required state keys are present
|
|
591
|
+
2. Collects variables from state (both required and optional)
|
|
592
|
+
3. Loads the appropriate prompt template (override if exists, else default)
|
|
593
|
+
4. Validates override template doesn't introduce new variables
|
|
594
|
+
5. Substitutes variables into the template
|
|
595
|
+
6. Saves the rendered prompt to `scripts/temp/temp-<workflow>-<step>-prompt.md`
|
|
596
|
+
7. Logs the prompt to console with a notice of where it was saved
|
|
597
|
+
8. Updates workflow state (name, status=active, step, context)
|
|
598
|
+
|
|
599
|
+
### Work-on-Jira-Issue Workflow (State Machine)
|
|
600
|
+
|
|
601
|
+
The `agdt-initiate-work-on-jira-issue-workflow` uses an enhanced state-machine approach:
|
|
602
|
+
|
|
603
|
+
**Pre-flight Checks:**
|
|
604
|
+
|
|
605
|
+
1. Validates that the current folder contains the issue key (case-insensitive)
|
|
606
|
+
2. Validates that the current git branch contains the issue key
|
|
607
|
+
3. If either check fails → outputs setup instructions with worktree/branch commands
|
|
608
|
+
|
|
609
|
+
**Steps:**
|
|
610
|
+
|
|
611
|
+
1. **setup** - If pre-flight fails: instructions to create worktree and branch
|
|
612
|
+
2. **retrieve** - Auto-fetches Jira issue details via `agdt-get-jira-issue`
|
|
613
|
+
3. **planning** - Analyze issue and post plan comment to Jira
|
|
614
|
+
4. **checklist-creation** - Create implementation checklist based on plan
|
|
615
|
+
5. **implementation** - Code changes, tests, documentation (with checklist tracking)
|
|
616
|
+
6. **implementation-review** - Review completed checklist before verification
|
|
617
|
+
7. **verification** - Run tests and quality gates
|
|
618
|
+
8. **commit** - Stage and commit changes
|
|
619
|
+
9. **pull-request** - Create PR
|
|
620
|
+
10. **completion** - Post final Jira comment
|
|
621
|
+
|
|
622
|
+
**Automatic Workflow Advancement:**
|
|
623
|
+
|
|
624
|
+
- `agdt-add-jira-comment` advances from `planning` → `checklist-creation`
|
|
625
|
+
- `agdt-create-checklist` advances from `checklist-creation` → `implementation`
|
|
626
|
+
- When all checklist items are complete → advances to `implementation-review`
|
|
627
|
+
- `agdt-git-save-work` advances from `commit` → `pull-request`
|
|
628
|
+
- `agdt-create-pull-request` advances from `pull-request` → `completion`
|
|
629
|
+
|
|
630
|
+
### Checklist Management Commands
|
|
631
|
+
|
|
632
|
+
| Command | Purpose | Required State |
|
|
633
|
+
|---------|---------|----------------|
|
|
634
|
+
| `agdt-create-checklist` | Create checklist from CLI args | (none - takes args) |
|
|
635
|
+
| `agdt-update-checklist` | Update checklist items | (checklist in workflow) |
|
|
636
|
+
| `agdt-show-checklist` | Display current checklist | (checklist in workflow) |
|
|
637
|
+
|
|
638
|
+
**Usage:**
|
|
639
|
+
|
|
640
|
+
```bash
|
|
641
|
+
# Create checklist
|
|
642
|
+
agdt-create-checklist "Implement domain model" "Add tests" "Update docs"
|
|
643
|
+
|
|
644
|
+
# Mark items as complete
|
|
645
|
+
agdt-update-checklist --completed 1 2
|
|
646
|
+
|
|
647
|
+
# View checklist
|
|
648
|
+
agdt-show-checklist
|
|
649
|
+
|
|
650
|
+
# Mark items complete during commit
|
|
651
|
+
agdt-git-save-work --completed 1 2 3
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
**Manual Advancement:**
|
|
655
|
+
|
|
656
|
+
```bash
|
|
657
|
+
# Advance to a specific step
|
|
658
|
+
agdt-advance-workflow implementation
|
|
659
|
+
agdt-advance-workflow verification
|
|
660
|
+
agdt-advance-workflow commit
|
|
661
|
+
|
|
662
|
+
# View current step
|
|
663
|
+
agdt-get-workflow
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
**Usage Examples:**
|
|
667
|
+
|
|
668
|
+
```bash
|
|
669
|
+
# Start work on a Jira issue
|
|
670
|
+
agdt-set jira.issue_key DFLY-1234
|
|
671
|
+
agdt-initiate-work-on-jira-issue-workflow
|
|
672
|
+
# If pre-flight fails: shows worktree/branch setup instructions
|
|
673
|
+
# If pre-flight passes: auto-fetches issue and shows planning prompt
|
|
674
|
+
|
|
675
|
+
# Check current workflow
|
|
676
|
+
agdt-get-workflow
|
|
677
|
+
# Output: name=work-on-jira-issue, status=in-progress, step=planning
|
|
678
|
+
|
|
679
|
+
# Post plan comment (auto-advances to implementation)
|
|
680
|
+
agdt-set jira.comment "h4. Plan..."
|
|
681
|
+
agdt-add-jira-comment
|
|
682
|
+
|
|
683
|
+
# Advance manually when needed
|
|
684
|
+
agdt-advance-workflow verification
|
|
685
|
+
|
|
686
|
+
# Clear workflow when done
|
|
687
|
+
agdt-clear-workflow
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
**Usage examples:**
|
|
691
|
+
|
|
692
|
+
```bash
|
|
693
|
+
# ⚠️ ALWAYS use agdt-test commands, NEVER pytest directly!
|
|
694
|
+
|
|
695
|
+
# Full suite with coverage (runs in background, ~55 seconds)
|
|
696
|
+
agdt-test
|
|
697
|
+
agdt-task-wait # REQUIRED: Wait for completion
|
|
698
|
+
|
|
699
|
+
# Quick run without coverage (runs in background)
|
|
700
|
+
agdt-test-quick
|
|
701
|
+
agdt-task-wait
|
|
702
|
+
|
|
703
|
+
# Specific file, class, or test via CLI argument (runs synchronously)
|
|
704
|
+
agdt-test-pattern tests/test_jira_helpers.py::TestEnsureJiraPem
|
|
705
|
+
agdt-test-pattern tests/test_jira_helpers.py::TestEnsureJiraPem::test_returns_existing_pem_path
|
|
706
|
+
|
|
707
|
+
# Test a specific source file with 100% coverage (runs in background)
|
|
708
|
+
agdt-test-file --source-file agentic_devtools/state.py # Auto-saved to state
|
|
709
|
+
agdt-task-wait # REQUIRED: Wait for completion
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
## 5. Key Design Decisions
|
|
713
|
+
|
|
714
|
+
### No Replacement Tokens
|
|
715
|
+
|
|
716
|
+
Unlike PowerShell, Python CLI handles special characters natively:
|
|
717
|
+
|
|
718
|
+
```bash
|
|
719
|
+
# This just works - no token replacement needed!
|
|
720
|
+
agdt-set content "Code with (parentheses) and [brackets]"
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
### No Multi-line Builder
|
|
724
|
+
|
|
725
|
+
Python preserves multiline strings directly:
|
|
726
|
+
|
|
727
|
+
```bash
|
|
728
|
+
agdt-set content "Line 1
|
|
729
|
+
Line 2
|
|
730
|
+
Line 3"
|
|
731
|
+
```
|
|
732
|
+
|
|
733
|
+
### Generic Setter Pattern
|
|
734
|
+
|
|
735
|
+
The `agdt-set` command accepts any key, so AI agents only need to approve it once:
|
|
736
|
+
|
|
737
|
+
```bash
|
|
738
|
+
agdt-set pr_id 12345 # Same command pattern
|
|
739
|
+
agdt-set thread_id 67890 # Same command pattern
|
|
740
|
+
agdt-set content "text" # Same command pattern
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
### ⚠️ Security: `run_safe` and User-Controlled Content
|
|
744
|
+
|
|
745
|
+
When calling `run_safe` with a list of arguments that includes
|
|
746
|
+
**user-controlled text** (e.g., issue titles, PR body content,
|
|
747
|
+
commit messages, file paths from state),
|
|
748
|
+
always pass **`shell=False`** explicitly:
|
|
749
|
+
|
|
750
|
+
```python
|
|
751
|
+
# ✅ CORRECT — user-controlled text, shell=False prevents env-var expansion on Windows
|
|
752
|
+
result = run_safe(["gh", "issue", "create", "--title", title, "--body", body],
|
|
753
|
+
capture_output=True, text=True, shell=False)
|
|
754
|
+
|
|
755
|
+
# ❌ DANGEROUS — default shell=None uses shell=True on Windows, allowing cmd.exe to
|
|
756
|
+
# expand %VARIABLE% patterns (e.g., %GITHUB_TOKEN%) in user-supplied text
|
|
757
|
+
result = run_safe(["gh", "issue", "create", "--title", title, "--body", body],
|
|
758
|
+
capture_output=True, text=True)
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
Only omit `shell=False` (or pass `shell=True` explicitly) for commands
|
|
762
|
+
known to be **`.cmd`/`.bat` batch scripts** on Windows, such as `az`
|
|
763
|
+
(Azure CLI) and `npm`. Proper executables like `gh`, `git`, `code`,
|
|
764
|
+
`python`, etc. must always be called with `shell=False` when argument
|
|
765
|
+
values contain user-supplied data.
|
|
766
|
+
|
|
767
|
+
## 6. Prompt Template System
|
|
768
|
+
|
|
769
|
+
Workflow commands use a template system for generating prompts:
|
|
770
|
+
|
|
771
|
+
### Template Location
|
|
772
|
+
|
|
773
|
+
- **Default templates**: `agentic_devtools/prompts/default-<step>-<workflow>-prompt.md`
|
|
774
|
+
- **Override templates**: `agentic_devtools/prompts/override-<step>-<workflow>-prompt.md`
|
|
775
|
+
- **Generated output**: `scripts/temp/temp-<workflow>-<step>-prompt.md`
|
|
776
|
+
|
|
777
|
+
### Template Variables
|
|
778
|
+
|
|
779
|
+
Templates use `{{variable_name}}` syntax for substitution:
|
|
780
|
+
|
|
781
|
+
```markdown
|
|
782
|
+
# Working on {{jira_issue_key}}
|
|
783
|
+
|
|
784
|
+
You are working on Jira issue **{{jira_issue_key}}**.
|
|
785
|
+
```
|
|
786
|
+
|
|
787
|
+
Variables are populated from state, with dot notation converted to underscores:
|
|
788
|
+
|
|
789
|
+
- State key `jira.issue_key` → Template variable `{{jira_issue_key}}`
|
|
790
|
+
- State key `pull_request_id` → Template variable `{{pull_request_id}}`
|
|
791
|
+
|
|
792
|
+
### Override Templates
|
|
793
|
+
|
|
794
|
+
Users can create override templates to customize workflow prompts:
|
|
795
|
+
|
|
796
|
+
1. Copy the default template to an override file
|
|
797
|
+
2. Modify as needed
|
|
798
|
+
3. **Important**: Override templates cannot introduce new variables not present in the default
|
|
799
|
+
|
|
800
|
+
Example validation error:
|
|
801
|
+
|
|
802
|
+
```text
|
|
803
|
+
TemplateValidationError: Override template uses variables not in default: {'new_variable'}
|
|
804
|
+
```
|
|
805
|
+
|
|
806
|
+
### Creating Custom Workflows
|
|
807
|
+
|
|
808
|
+
To add a new workflow:
|
|
809
|
+
|
|
810
|
+
1. Create the default prompt template in `agentic_devtools/prompts/`
|
|
811
|
+
2. Add the workflow initiation function in `cli/workflows/commands.py`
|
|
812
|
+
3. Export the function in `cli/workflows/__init__.py`
|
|
813
|
+
4. Add the CLI entry point in `pyproject.toml`
|
|
814
|
+
5. Document the required state keys
|
|
815
|
+
|
|
816
|
+
## 7. Installation
|
|
817
|
+
|
|
818
|
+
```bash
|
|
819
|
+
# From the package directory (scripts/agentic_devtools)
|
|
820
|
+
pip install -e .
|
|
821
|
+
|
|
822
|
+
# Or with dev dependencies
|
|
823
|
+
pip install -e ".[dev]"
|
|
824
|
+
```
|
|
825
|
+
|
|
826
|
+
### Multi-Worktree State Isolation
|
|
827
|
+
|
|
828
|
+
When working with multiple git worktrees (e.g., one for feature development and another for the main branch),
|
|
829
|
+
the `agdt-ai-helpers` package uses **smart repo-local state detection** to keep state isolated per worktree.
|
|
830
|
+
|
|
831
|
+
**How it works:**
|
|
832
|
+
|
|
833
|
+
1. State files are stored in `scripts/temp/` relative to the repository/worktree root
|
|
834
|
+
2. The `get_state_dir()` function walks up from the current directory looking for a `scripts` directory
|
|
835
|
+
3. Once found, it automatically creates `scripts/temp/` if it doesn't exist
|
|
836
|
+
4. This ensures each worktree has its own isolated state, even with a single global pip installation
|
|
837
|
+
|
|
838
|
+
**State directory resolution priority:**
|
|
839
|
+
|
|
840
|
+
1. `AGENTIC_DEVTOOLS_STATE_DIR` environment variable (explicit override)
|
|
841
|
+
2. `scripts/temp/` relative to repo root (auto-detected and created if needed)
|
|
842
|
+
3. `.agdt-temp/` in current working directory (fallback for non-repo contexts)
|
|
843
|
+
|
|
844
|
+
**New worktree setup:**
|
|
845
|
+
When creating a new worktree, `scripts/temp/` doesn't exist initially (it's gitignored). The helpers automatically create it on first use, so no manual setup is required.
|
|
846
|
+
|
|
847
|
+
**Tip:** Use the `agdt-initiate-work-on-jira-issue-workflow` command which includes worktree setup automation with VS Code integration.
|
|
848
|
+
|
|
849
|
+
## 8. Environment Variables
|
|
850
|
+
|
|
851
|
+
| Variable | Purpose |
|
|
852
|
+
|----------|---------||
|
|
853
|
+
| `AZURE_DEV_OPS_COPILOT_PAT` | PAT for Azure DevOps API calls |
|
|
854
|
+
| `JIRA_COPILOT_PAT` | PAT for Jira API calls |
|
|
855
|
+
| `JIRA_BASE_URL` | Override default Jira URL (default: `https://jira.swica.ch`) |
|
|
856
|
+
| `JIRA_SSL_VERIFY` | Set to "0" to disable SSL verification |
|
|
857
|
+
| `JIRA_CA_BUNDLE` | Path to custom CA bundle PEM file for Jira SSL |
|
|
858
|
+
| `REQUESTS_CA_BUNDLE` | Standard requests library CA bundle path (fallback) |
|
|
859
|
+
| `AGENTIC_DEVTOOLS_STATE_DIR` | Override default state directory (scripts/temp) |
|
|
860
|
+
| `DFLY_DRY_RUN` | Set to "1" for dry-run mode globally |
|
|
861
|
+
|
|
862
|
+
### SSL Certificate Handling
|
|
863
|
+
|
|
864
|
+
The Jira commands automatically handle SSL certificate verification for corporate internal CAs:
|
|
865
|
+
|
|
866
|
+
1. **Environment override**: Set `JIRA_SSL_VERIFY=0` to disable verification entirely
|
|
867
|
+
2. **Custom CA bundle**: Set `JIRA_CA_BUNDLE` to a path containing your CA certificates
|
|
868
|
+
3. **Repo-committed bundle**: The preferred CA bundle is committed at `scripts/jira_ca_bundle.pem` (contains the full certificate chain for jira.swica.ch)
|
|
869
|
+
4. **Auto-fetch fallback**: If the repo bundle doesn't exist, certificates are auto-fetched from the Jira server using `openssl s_client` and cached to `scripts/temp/jira_ca_bundle.pem`
|
|
870
|
+
5. **Last resort**: If auto-fetch fails, SSL verification is disabled with a warning
|
|
871
|
+
|
|
872
|
+
## 9. Adding New Commands
|
|
873
|
+
|
|
874
|
+
### Adding a new action command (background task pattern)
|
|
875
|
+
|
|
876
|
+
When adding a new command that performs side effects (API calls, git operations, file mutations):
|
|
877
|
+
|
|
878
|
+
1. **Add the sync function** in the appropriate module (e.g., `cli/azure_devops/commands.py`)
|
|
879
|
+
2. Read required state with `get_value()` or use existing helper functions like `parse_bool_from_state()`
|
|
880
|
+
3. Export the function in the module's `__init__.py`
|
|
881
|
+
4. **Create an async wrapper** that uses `run_in_background()` to spawn the sync command as a background task
|
|
882
|
+
5. **Add entry point** in `pyproject.toml`:
|
|
883
|
+
|
|
884
|
+
```toml
|
|
885
|
+
[project.scripts]
|
|
886
|
+
agdt-new-command = "agentic_devtools.cli.module.commands:new_command_async"
|
|
887
|
+
```
|
|
888
|
+
|
|
889
|
+
6. Reinstall: `pip install -e .`
|
|
890
|
+
7. **Document the command** in this file
|
|
891
|
+
|
|
892
|
+
### Adding new helper functions
|
|
893
|
+
|
|
894
|
+
1. Add pure utility functions (no state reading) to `cli/azure_devops/helpers.py`
|
|
895
|
+
2. Add functions that read state to `cli/azure_devops/commands.py`
|
|
896
|
+
3. Export in `__init__.py` if needed for external use
|
|
897
|
+
|
|
898
|
+
### Adding convenience state functions
|
|
899
|
+
|
|
900
|
+
Add typed functions in `state.py`:
|
|
901
|
+
|
|
902
|
+
```python
|
|
903
|
+
def get_new_field(required: bool = False) -> Optional[str]:
|
|
904
|
+
"""Get the new field from state."""
|
|
905
|
+
return get_value("new_field", required=required)
|
|
906
|
+
```
|
|
907
|
+
|
|
908
|
+
## 10. Protected / Auto-Generated Files
|
|
909
|
+
|
|
910
|
+
> **⚠️ AI AGENTS: Never edit, stage, or commit the files listed here.**
|
|
911
|
+
> They are auto-generated at build time. Any local changes are noise and must be discarded.
|
|
912
|
+
|
|
913
|
+
### `agentic_devtools/_version.py`
|
|
914
|
+
|
|
915
|
+
Generated automatically by `hatch-vcs` / `setuptools-scm` from Git tags. Its header reads:
|
|
916
|
+
_"file generated by setuptools-scm — don't change, don't track in version control."_
|
|
917
|
+
|
|
918
|
+
The file is listed in `.gitignore` and is **not tracked by git**. **Do not** `git add`, edit, or
|
|
919
|
+
commit it. Because it is untracked, `.gitignore` prevents `git add .` from ever staging it —
|
|
920
|
+
this applies to all tools including `report_progress` and the Copilot coding agent's own git
|
|
921
|
+
operations.
|
|
922
|
+
|
|
923
|
+
> **ℹ️ Note:** `agdt-git-save-work` also explicitly unstages `agentic_devtools/_version.py`
|
|
924
|
+
> before creating a commit, so it is doubly protected. If you ever see it appearing in
|
|
925
|
+
> `git status`, do **not** stage or commit it. For test-specific guidance see `tests/README.md`.
|
|
926
|
+
|
|
927
|
+
- To bump the package version, create a new Git tag — see [RELEASING.md](../RELEASING.md).
|
|
928
|
+
|
|
929
|
+
### Identifying auto-generated files in the future
|
|
930
|
+
|
|
931
|
+
A file is auto-generated when it contains a comment such as:
|
|
932
|
+
|
|
933
|
+
```text
|
|
934
|
+
# file generated by <tool>
|
|
935
|
+
# don't change, don't track in version control
|
|
936
|
+
```
|
|
937
|
+
|
|
938
|
+
When you encounter such a comment in a file you are about to edit or commit, **stop** — the file
|
|
939
|
+
should not be touched manually.
|
|
940
|
+
|
|
941
|
+
### Excluding auto-generated files from source-scanning tools
|
|
942
|
+
|
|
943
|
+
Any script that iterates over `agentic_devtools/` source files (e.g., `scripts/scaffold_tests.py`)
|
|
944
|
+
must **explicitly exclude** `_version.py` by name, in addition to `__init__.py`. Even though
|
|
945
|
+
`_version.py` currently has no public functions, the exclusion makes the intent clear and prevents
|
|
946
|
+
the file from accidentally appearing in generated output if it ever gains a public symbol.
|
|
947
|
+
|
|
948
|
+
Pattern to follow:
|
|
949
|
+
|
|
950
|
+
```python
|
|
951
|
+
if p.name not in {"__init__.py", "_version.py"} and "__pycache__" not in p.parts
|
|
952
|
+
```
|
|
953
|
+
|
|
954
|
+
## 11. 1:1:1 Test Structure
|
|
955
|
+
|
|
956
|
+
All new tests **must** be placed under `tests/unit/` and follow the 1:1:1 policy.
|
|
957
|
+
For the full reference, see [tests/README.md](../tests/README.md).
|
|
958
|
+
|
|
959
|
+
### Policy Summary
|
|
960
|
+
|
|
961
|
+
- **One folder per source file** — the test path mirrors the source path.
|
|
962
|
+
- **One test file per symbol** — one function or class per test file.
|
|
963
|
+
- **Every directory must contain `__init__.py`**.
|
|
964
|
+
|
|
965
|
+
### Path Convention
|
|
966
|
+
|
|
967
|
+
```text
|
|
968
|
+
tests/unit/{module_path}/{source_file_name}/test_{symbol_name}.py
|
|
969
|
+
```
|
|
970
|
+
|
|
971
|
+
| Source symbol | Test file |
|
|
972
|
+
|---|---|
|
|
973
|
+
| `agentic_devtools/cli/git/core.py` → `get_current_branch()` | `tests/unit/cli/git/core/test_get_current_branch.py` |
|
|
974
|
+
| `agentic_devtools/state.py` → `get_value()` | `tests/unit/state/test_get_value.py` |
|
|
975
|
+
| `agentic_devtools/cli/workflows/worktree_setup.py` → `WorktreeSetupResult` | `tests/unit/cli/workflows/worktree_setup/test_worktreesetupresult.py` |
|
|
976
|
+
|
|
977
|
+
Symbol naming rules:
|
|
978
|
+
|
|
979
|
+
- **Functions**: exact snake\_case name (e.g., `get_current_branch` → `test_get_current_branch.py`).
|
|
980
|
+
- **Classes / dataclasses / enums**: class name lowercased **without** added underscores
|
|
981
|
+
(e.g., `WorktreeSetupResult` → `test_worktreesetupresult.py`).
|
|
982
|
+
|
|
983
|
+
### Top-level source files (e.g., `state.py`, `background_tasks.py`)
|
|
984
|
+
|
|
985
|
+
Source files directly in `agentic_devtools/` (with no subdirectory) map to:
|
|
986
|
+
|
|
987
|
+
```text
|
|
988
|
+
tests/unit/{source_file_name}/test_{symbol_name}.py
|
|
989
|
+
```
|
|
990
|
+
|
|
991
|
+
For example:
|
|
992
|
+
|
|
993
|
+
- `agentic_devtools/state.py` → `tests/unit/state/test_get_workflow_state.py`
|
|
994
|
+
- `agentic_devtools/background_tasks.py` → `tests/unit/background_tasks/test_run_function_in_background.py`
|
|
995
|
+
|
|
996
|
+
The validator (`scripts/validate_test_structure.py`) requires a minimum of **2 path components**
|
|
997
|
+
under `tests/unit/`, so top-level source files are fully supported without any workaround.
|
|
998
|
+
|
|
999
|
+
> **⚠️ Do NOT create proxy/stub source files** (e.g., `agentic_devtools/root/state.py`) just to
|
|
1000
|
+
> add an extra path component. This approach pollutes the package with files that serve no
|
|
1001
|
+
> purpose beyond satisfying a validator that already handles the case natively.
|
|
1002
|
+
|
|
1003
|
+
### How to Add a New Test
|
|
1004
|
+
|
|
1005
|
+
1. Identify the source file, e.g. `agentic_devtools/cli/git/core.py`.
|
|
1006
|
+
2. Create `tests/unit/cli/git/core/` (and parent dirs if missing), each with `__init__.py`.
|
|
1007
|
+
3. Create `tests/unit/cli/git/core/test_<symbol>.py` for the function or class under test.
|
|
1008
|
+
4. Run the validator: `python scripts/validate_test_structure.py`
|
|
1009
|
+
|
|
1010
|
+
See [tests/README.md](../tests/README.md) for complete step-by-step instructions and examples.
|
|
1011
|
+
|
|
1012
|
+
### CI Enforcement
|
|
1013
|
+
|
|
1014
|
+
`scripts/validate_test_structure.py` runs in CI and **fails the build** when it finds structural
|
|
1015
|
+
issues in `tests/unit/` (incorrect source-file folder mapping or missing `__init__.py` files).
|
|
1016
|
+
It does **not** verify that every symbol has a corresponding test file or that each
|
|
1017
|
+
`test_<symbol>.py` maps to a real symbol — those parts of the 1:1:1 pattern are enforced via
|
|
1018
|
+
convention and code review. Run it locally before pushing:
|
|
1019
|
+
|
|
1020
|
+
```bash
|
|
1021
|
+
python scripts/validate_test_structure.py
|
|
1022
|
+
```
|
|
1023
|
+
|
|
1024
|
+
## 12. Python Coding Patterns
|
|
1025
|
+
|
|
1026
|
+
### Import ordering (ruff/isort)
|
|
1027
|
+
|
|
1028
|
+
Ruff enforces isort-style import ordering (rule set `I`). All Python files must use this order:
|
|
1029
|
+
|
|
1030
|
+
1. **Standard library** imports
|
|
1031
|
+
2. **Third-party** imports (e.g., `pytest`, `requests`)
|
|
1032
|
+
3. **First-party** imports (`agentic_devtools.*`, `agdt_ai_helpers.*`)
|
|
1033
|
+
|
|
1034
|
+
Within each group, `import X` lines come before `from X import Y` lines.
|
|
1035
|
+
|
|
1036
|
+
```python
|
|
1037
|
+
# Correct
|
|
1038
|
+
import os
|
|
1039
|
+
import time
|
|
1040
|
+
from unittest.mock import patch # stdlib — same group as os/time
|
|
1041
|
+
|
|
1042
|
+
import pytest # third-party
|
|
1043
|
+
|
|
1044
|
+
from agentic_devtools.state import get_value # first-party
|
|
1045
|
+
```
|
|
1046
|
+
|
|
1047
|
+
```python
|
|
1048
|
+
# Wrong — stdlib 'from unittest.mock import patch' placed after third-party 'import pytest'
|
|
1049
|
+
import pytest
|
|
1050
|
+
from unittest.mock import patch # ← ruff I001 violation
|
|
1051
|
+
```
|
|
1052
|
+
|
|
1053
|
+
To auto-fix: `ruff check --fix tests/` or `ruff check --fix --select I tests/`
|
|
1054
|
+
|
|
1055
|
+
### Dynamic script loading with `importlib`
|
|
1056
|
+
|
|
1057
|
+
When loading a script dynamically (e.g., loading a `scripts/*.py` file by path), always guard
|
|
1058
|
+
against `None` returns from `spec_from_file_location()` before calling `module_from_spec()` and
|
|
1059
|
+
`exec_module()`:
|
|
1060
|
+
|
|
1061
|
+
```python
|
|
1062
|
+
import importlib.util
|
|
1063
|
+
|
|
1064
|
+
spec = importlib.util.spec_from_file_location("module_name", script_path)
|
|
1065
|
+
if spec is None or spec.loader is None:
|
|
1066
|
+
raise RuntimeError(f"Could not load module from {script_path!s}")
|
|
1067
|
+
module = importlib.util.module_from_spec(spec)
|
|
1068
|
+
spec.loader.exec_module(module)
|
|
1069
|
+
```
|
|
1070
|
+
|
|
1071
|
+
`spec_from_file_location()` returns `None` when the file cannot be found or the path is not
|
|
1072
|
+
recognised as a loadable Python source. Without the guard, the very first call — `module_from_spec(spec)`
|
|
1073
|
+
— raises an obscure `AttributeError: 'NoneType' object has no attribute ...` that hides the real
|
|
1074
|
+
problem. The explicit `RuntimeError` surfaces the actual path that failed, making failures
|
|
1075
|
+
trivially easy to diagnose.
|
|
1076
|
+
|
|
1077
|
+
## 13. Testing
|
|
1078
|
+
|
|
1079
|
+
**⚠️ AI AGENTS: ALWAYS use agdt-test commands, NEVER pytest directly!**
|
|
1080
|
+
|
|
1081
|
+
```bash
|
|
1082
|
+
# Run tests (ALWAYS use these commands)
|
|
1083
|
+
agdt-test # Full suite with coverage (background, ~55s)
|
|
1084
|
+
agdt-task-wait # Wait for completion (REQUIRED!)
|
|
1085
|
+
|
|
1086
|
+
agdt-test-quick # Fast run without coverage (background)
|
|
1087
|
+
agdt-task-wait # Wait for completion (REQUIRED!)
|
|
1088
|
+
|
|
1089
|
+
# For specific tests (with CLI arguments, runs synchronously)
|
|
1090
|
+
agdt-test-pattern tests/test_state.py::TestSetValue
|
|
1091
|
+
|
|
1092
|
+
# Test a specific source file with 100% coverage requirement
|
|
1093
|
+
agdt-test-file --source-file agentic_devtools/state.py # Auto-saved for future runs
|
|
1094
|
+
agdt-task-wait # Wait for completion (REQUIRED!)
|
|
1095
|
+
```
|
|
1096
|
+
|
|
1097
|
+
**WHY background tasks?** The test suite has 2000+ tests and takes ~55 seconds.
|
|
1098
|
+
Running synchronously causes AI agents to think something went wrong during the
|
|
1099
|
+
wait, leading to multiple restarts and wasted resources.
|
|
1100
|
+
|
|
1101
|
+
## 14. Pre-commit Hooks
|
|
1102
|
+
|
|
1103
|
+
The repository has pre-commit hooks for linting Python files in `scripts/`. To enable:
|
|
1104
|
+
|
|
1105
|
+
```bash
|
|
1106
|
+
git config core.hooksPath .githooks
|
|
1107
|
+
```
|
|
1108
|
+
|
|
1109
|
+
The hooks run automatically on `git commit` and check:
|
|
1110
|
+
|
|
1111
|
+
- **ruff check**: Lints for pycodestyle errors (E), Pyflakes (F - unused imports/variables), warnings (W), import sorting (I), and pyupgrade (UP)
|
|
1112
|
+
- **ruff format**: Auto-formats code
|
|
1113
|
+
- **cspell**: Checks spelling against the dictionary in `cspell.json`
|
|
1114
|
+
|
|
1115
|
+
To disable hooks:
|
|
1116
|
+
|
|
1117
|
+
```bash
|
|
1118
|
+
git config --unset core.hooksPath
|
|
1119
|
+
```
|
|
1120
|
+
|
|
1121
|
+
To run checks manually:
|
|
1122
|
+
|
|
1123
|
+
```bash
|
|
1124
|
+
# Ruff lint (with auto-fix)
|
|
1125
|
+
ruff check --fix --config scripts/agentic_devtools/pyproject.toml scripts/agentic_devtools/
|
|
1126
|
+
|
|
1127
|
+
# Ruff format
|
|
1128
|
+
ruff format --config scripts/agentic_devtools/pyproject.toml scripts/agentic_devtools/
|
|
1129
|
+
|
|
1130
|
+
# cspell (use global install, not npx)
|
|
1131
|
+
cspell lint "scripts/**/*.py"
|
|
1132
|
+
```
|
|
1133
|
+
|
|
1134
|
+
### cspell Dictionary Setup
|
|
1135
|
+
|
|
1136
|
+
The `cspell.json` file is the single source of truth for spelling. The VS Code workspace imports it via `cSpell.import`.
|
|
1137
|
+
|
|
1138
|
+
**Required global installs** (one-time setup, requires disconnecting from VPN):
|
|
1139
|
+
|
|
1140
|
+
```bash
|
|
1141
|
+
npm install -g cspell @cspell/dict-de-de @cspell/dict-python @cspell/dict-dotnet @cspell/dict-companies @cspell/dict-fullstack @cspell/dict-typescript
|
|
1142
|
+
```
|
|
1143
|
+
|
|
1144
|
+
To add new words, edit `cspell.json` directly (keep alphabetically sorted). Multiple language dictionaries are enabled via imports in `cspell.json`.
|
|
1145
|
+
|
|
1146
|
+
## 15. Common Workflows
|
|
1147
|
+
|
|
1148
|
+
> **Note:** All action commands (those that mutate state or make API calls) spawn background tasks.
|
|
1149
|
+
> These return immediately. Use `agdt-task-status` or `agdt-task-wait` to monitor.
|
|
1150
|
+
|
|
1151
|
+
### Initial Git Commit & Publish
|
|
1152
|
+
|
|
1153
|
+
```bash
|
|
1154
|
+
# Option A: With CLI parameter (explicit)
|
|
1155
|
+
agdt-git-save-work --commit-message "feature([DFLY-1234](https://jira.swica.ch/browse/DFLY-1234)): implement feature
|
|
1156
|
+
|
|
1157
|
+
- Added new component
|
|
1158
|
+
- Updated tests
|
|
1159
|
+
|
|
1160
|
+
[DFLY-1234](https://jira.swica.ch/browse/DFLY-1234)"
|
|
1161
|
+
# Returns task ID immediately - use agdt-task-wait to block until complete
|
|
1162
|
+
|
|
1163
|
+
# Option B: Parameterless (uses current state)
|
|
1164
|
+
# Current commit_message: run `agdt-get commit_message` to check
|
|
1165
|
+
agdt-git-save-work
|
|
1166
|
+
```
|
|
1167
|
+
|
|
1168
|
+
### Amend Commit (Single Commit Policy - Automatic Detection)
|
|
1169
|
+
|
|
1170
|
+
`agdt-git-save-work` now automatically detects when to amend instead of creating a new commit:
|
|
1171
|
+
|
|
1172
|
+
- If current branch has commits ahead of main AND the last commit contains the same issue key → amend
|
|
1173
|
+
- Otherwise → new commit
|
|
1174
|
+
|
|
1175
|
+
```bash
|
|
1176
|
+
# Option A: With CLI parameter (explicit)
|
|
1177
|
+
agdt-git-save-work --commit-message "feature([DFLY-1234](https://jira.swica.ch/browse/DFLY-1234)): implement feature
|
|
1178
|
+
|
|
1179
|
+
- Added new component
|
|
1180
|
+
- Updated tests
|
|
1181
|
+
- Addressed PR feedback
|
|
1182
|
+
|
|
1183
|
+
[DFLY-1234](https://jira.swica.ch/browse/DFLY-1234)"
|
|
1184
|
+
# Automatically amends if already pushed a commit for this issue
|
|
1185
|
+
|
|
1186
|
+
# Option B: Parameterless (uses current state)
|
|
1187
|
+
# Current commit_message: run `agdt-get commit_message` to check
|
|
1188
|
+
agdt-git-save-work
|
|
1189
|
+
```
|
|
1190
|
+
|
|
1191
|
+
### Create a Pull Request
|
|
1192
|
+
|
|
1193
|
+
```bash
|
|
1194
|
+
agdt-set source_branch feature/DFLY-1234/my-changes
|
|
1195
|
+
agdt-set title "feature([DFLY-1234](https://jira.swica.ch/browse/DFLY-1234)): Add new feature"
|
|
1196
|
+
agdt-set description "This PR implements the new feature."
|
|
1197
|
+
agdt-create-pull-request
|
|
1198
|
+
```
|
|
1199
|
+
|
|
1200
|
+
### Create a Draft PR (default)
|
|
1201
|
+
|
|
1202
|
+
```bash
|
|
1203
|
+
agdt-set source_branch feature/my-branch
|
|
1204
|
+
agdt-set title "My PR Title"
|
|
1205
|
+
agdt-create-pull-request
|
|
1206
|
+
# Note: PRs are created as drafts by default
|
|
1207
|
+
```
|
|
1208
|
+
|
|
1209
|
+
### Create a Non-Draft PR
|
|
1210
|
+
|
|
1211
|
+
```bash
|
|
1212
|
+
agdt-set source_branch feature/my-branch
|
|
1213
|
+
agdt-set title "My PR Title"
|
|
1214
|
+
agdt-set draft false
|
|
1215
|
+
agdt-create-pull-request
|
|
1216
|
+
```
|
|
1217
|
+
|
|
1218
|
+
### Reply to PR Thread
|
|
1219
|
+
|
|
1220
|
+
```bash
|
|
1221
|
+
agdt-set pull_request_id 23046
|
|
1222
|
+
agdt-set thread_id 139474
|
|
1223
|
+
agdt-set content "Thanks for the feedback!
|
|
1224
|
+
|
|
1225
|
+
I've addressed your concerns."
|
|
1226
|
+
agdt-reply-to-pull-request-thread
|
|
1227
|
+
```
|
|
1228
|
+
|
|
1229
|
+
### Reply and Resolve Thread
|
|
1230
|
+
|
|
1231
|
+
```bash
|
|
1232
|
+
agdt-set pull_request_id 23046
|
|
1233
|
+
agdt-set thread_id 139474
|
|
1234
|
+
agdt-set resolve_thread true
|
|
1235
|
+
agdt-set content "Fixed, resolving thread."
|
|
1236
|
+
agdt-reply-to-pull-request-thread
|
|
1237
|
+
```
|
|
1238
|
+
|
|
1239
|
+
### Add a PR Comment
|
|
1240
|
+
|
|
1241
|
+
```bash
|
|
1242
|
+
agdt-set pull_request_id 23046
|
|
1243
|
+
agdt-set content "Here's a general comment on this PR."
|
|
1244
|
+
agdt-add-pull-request-comment
|
|
1245
|
+
```
|
|
1246
|
+
|
|
1247
|
+
### Add a PR Comment with Approval Sentinel
|
|
1248
|
+
|
|
1249
|
+
```bash
|
|
1250
|
+
agdt-set pull_request_id 23046
|
|
1251
|
+
agdt-set content "LGTM! All acceptance criteria met."
|
|
1252
|
+
agdt-set is_pr_approval true
|
|
1253
|
+
agdt-add-pull-request-comment
|
|
1254
|
+
```
|
|
1255
|
+
|
|
1256
|
+
### Approve a Pull Request (Convenience Command)
|
|
1257
|
+
|
|
1258
|
+
```bash
|
|
1259
|
+
agdt-set pull_request_id 23046
|
|
1260
|
+
agdt-set content "LGTM! Great work on this feature."
|
|
1261
|
+
agdt-approve-pull-request
|
|
1262
|
+
# Note: This automatically adds the approval sentinel banner
|
|
1263
|
+
```
|
|
1264
|
+
|
|
1265
|
+
### Resolve a Thread
|
|
1266
|
+
|
|
1267
|
+
```bash
|
|
1268
|
+
agdt-set pull_request_id 23046
|
|
1269
|
+
agdt-set thread_id 139474
|
|
1270
|
+
agdt-resolve-thread
|
|
1271
|
+
```
|
|
1272
|
+
|
|
1273
|
+
### Get All PR Threads (Sync - Immediate Output)
|
|
1274
|
+
|
|
1275
|
+
```bash
|
|
1276
|
+
agdt-set pull_request_id 23046
|
|
1277
|
+
agdt-get-pull-request-threads
|
|
1278
|
+
```
|
|
1279
|
+
|
|
1280
|
+
### Dry Run Mode
|
|
1281
|
+
|
|
1282
|
+
```bash
|
|
1283
|
+
agdt-set dry_run true
|
|
1284
|
+
agdt-git-save-work # Previews without executing git commands
|
|
1285
|
+
agdt-reply-to-pull-request-thread # Previews without API calls
|
|
1286
|
+
```
|
|
1287
|
+
|
|
1288
|
+
### Pull Request Review Workflow
|
|
1289
|
+
|
|
1290
|
+
The `agdt-review-pull-request` command orchestrates the entire PR review process:
|
|
1291
|
+
|
|
1292
|
+
```bash
|
|
1293
|
+
# Option 1: Start with Jira issue key
|
|
1294
|
+
agdt-set jira.issue_key DFLY-1840
|
|
1295
|
+
agdt-review-pull-request
|
|
1296
|
+
|
|
1297
|
+
# Option 2: Start with PR ID
|
|
1298
|
+
agdt-set pull_request_id 23523
|
|
1299
|
+
agdt-review-pull-request
|
|
1300
|
+
|
|
1301
|
+
# Option 3: Pass parameters directly
|
|
1302
|
+
agdt-review-pull-request --pull-request-id 23523 --jira-issue-key DFLY-1840
|
|
1303
|
+
|
|
1304
|
+
# Option 4: Include already-reviewed files
|
|
1305
|
+
agdt-review-pull-request --include-reviewed
|
|
1306
|
+
```
|
|
1307
|
+
|
|
1308
|
+
The command:
|
|
1309
|
+
|
|
1310
|
+
1. **Resolves both PR ID and Jira issue key** from params, state, or derived sources:
|
|
1311
|
+
- If Jira key provided but no PR ID → searches Jira for linked PRs
|
|
1312
|
+
- If PR ID provided but no Jira key → extracts issue key from PR title
|
|
1313
|
+
2. **Fetches full PR details** (diff, threads, iterations)
|
|
1314
|
+
3. **Fetches Jira issue details** (if available)
|
|
1315
|
+
4. **Generates per-file review prompts** in `scripts/temp/pull-request-review/prompts/<pr_id>/`
|
|
1316
|
+
5. **Prints instructions** for the review workflow
|
|
1317
|
+
|
|
1318
|
+
#### Generated Review Artifacts
|
|
1319
|
+
|
|
1320
|
+
| File | Purpose |
|
|
1321
|
+
|------|---------|
|
|
1322
|
+
| `queue.json` | Review queue manifest (pending/completed files) |
|
|
1323
|
+
| `pull-request-files.json` | Snapshot of all PR files |
|
|
1324
|
+
| `pull-request-threads.json` | Snapshot of existing comment threads |
|
|
1325
|
+
| `pull-request-jira-issue.json` | Copy of linked Jira issue |
|
|
1326
|
+
| `file-<hash>.md` | Individual file review prompt with diff and threads |
|
|
1327
|
+
|
|
1328
|
+
#### File Review Commands
|
|
1329
|
+
|
|
1330
|
+
After starting a review, use these commands for each file:
|
|
1331
|
+
|
|
1332
|
+
```bash
|
|
1333
|
+
# Approve a file (no issues found)
|
|
1334
|
+
agdt-set pull_request_id 23523
|
|
1335
|
+
agdt-set file_review.file_path "/path/to/file.ts"
|
|
1336
|
+
agdt-set content "LGTM - code follows conventions"
|
|
1337
|
+
agdt-approve-file
|
|
1338
|
+
|
|
1339
|
+
# Request changes (with line number)
|
|
1340
|
+
agdt-set line 42
|
|
1341
|
+
agdt-set content "Consider using a more descriptive variable name"
|
|
1342
|
+
agdt-request-changes
|
|
1343
|
+
|
|
1344
|
+
# Request changes with code suggestion
|
|
1345
|
+
agdt-set line 42
|
|
1346
|
+
agdt-set content "```suggestion
|
|
1347
|
+
const descriptiveVariableName = value;
|
|
1348
|
+
```"
|
|
1349
|
+
agdt-request-changes-with-suggestion
|
|
1350
|
+
```
|
|
1351
|
+
|
|
1352
|
+
### Get Jira Issue Details
|
|
1353
|
+
|
|
1354
|
+
```bash
|
|
1355
|
+
agdt-set jira.issue_key DFLY-1234
|
|
1356
|
+
agdt-get-jira-issue
|
|
1357
|
+
```
|
|
1358
|
+
|
|
1359
|
+
This fetches the issue and:
|
|
1360
|
+
|
|
1361
|
+
- Prints formatted details (key, summary, type, labels, description, comments)
|
|
1362
|
+
- Saves full JSON response to `scripts/temp/temp-get-issue-details-response.json`
|
|
1363
|
+
- Stores issue in state as `jira.last_issue`
|
|
1364
|
+
|
|
1365
|
+
### Add Comment to Jira Issue
|
|
1366
|
+
|
|
1367
|
+
```bash
|
|
1368
|
+
agdt-set jira.issue_key DFLY-1234
|
|
1369
|
+
agdt-set jira.comment "h4. Progress Update
|
|
1370
|
+
|
|
1371
|
+
*Completed:*
|
|
1372
|
+
* Task 1
|
|
1373
|
+
* Task 2
|
|
1374
|
+
|
|
1375
|
+
*Next Steps:*
|
|
1376
|
+
* Task 3"
|
|
1377
|
+
agdt-add-jira-comment
|
|
1378
|
+
```
|
|
1379
|
+
|
|
1380
|
+
After posting, the command automatically refreshes issue details.
|
|
1381
|
+
|
|
1382
|
+
### Create Jira Epic
|
|
1383
|
+
|
|
1384
|
+
```bash
|
|
1385
|
+
agdt-set jira.project_key DFLY
|
|
1386
|
+
agdt-set jira.summary "My Epic Title"
|
|
1387
|
+
agdt-set jira.epic_name "My Epic Name"
|
|
1388
|
+
agdt-set jira.role "developer"
|
|
1389
|
+
agdt-set jira.desired_outcome "a new feature"
|
|
1390
|
+
agdt-set jira.benefit "improved productivity"
|
|
1391
|
+
agdt-create-epic
|
|
1392
|
+
```
|
|
1393
|
+
|
|
1394
|
+
### Create Jira Issue
|
|
1395
|
+
|
|
1396
|
+
```bash
|
|
1397
|
+
agdt-set jira.project_key DFLY
|
|
1398
|
+
agdt-set jira.summary "Bug: Something is broken"
|
|
1399
|
+
agdt-set jira.description "Detailed description here"
|
|
1400
|
+
agdt-create-issue
|
|
1401
|
+
```
|
|
1402
|
+
|
|
1403
|
+
Or use the user story format:
|
|
1404
|
+
|
|
1405
|
+
```bash
|
|
1406
|
+
agdt-set jira.project_key DFLY
|
|
1407
|
+
agdt-set jira.summary "Feature request"
|
|
1408
|
+
agdt-set jira.role "user"
|
|
1409
|
+
agdt-set jira.desired_outcome "new capability"
|
|
1410
|
+
agdt-set jira.benefit "better experience"
|
|
1411
|
+
agdt-create-issue
|
|
1412
|
+
```
|
|
1413
|
+
|
|
1414
|
+
### Create Subtask
|
|
1415
|
+
|
|
1416
|
+
```bash
|
|
1417
|
+
agdt-set jira.parent_key DFLY-1234
|
|
1418
|
+
agdt-set jira.summary "Subtask title"
|
|
1419
|
+
agdt-set jira.description "Subtask details"
|
|
1420
|
+
agdt-create-subtask
|
|
1421
|
+
```
|
|
1422
|
+
|
|
1423
|
+
### Jira Dry Run Mode
|
|
1424
|
+
|
|
1425
|
+
```bash
|
|
1426
|
+
agdt-set jira.dry_run true
|
|
1427
|
+
agdt-add-jira-comment # Previews without posting
|
|
1428
|
+
```
|
|
1429
|
+
|
|
1430
|
+
## 16. Output Files
|
|
1431
|
+
|
|
1432
|
+
| File | Command | Content |
|
|
1433
|
+
|------|---------|---------|
|
|
1434
|
+
| `scripts/temp/agdt-state.json` | All commands | Persistent state storage |
|
|
1435
|
+
| `scripts/temp/temp-get-issue-details-response.json` | `agdt-get-jira-issue` | Full Jira API response |
|
|
1436
|
+
| `scripts/temp/temp-get-pull-request-details-response.json` | `agdt-get-pull-request-details` | Full PR details payload |
|
|
1437
|
+
| `scripts/temp/pull-request-review/prompts/<pr_id>/` | `agdt-review-pull-request` | Review prompts directory |
|
|
1438
|
+
| `scripts/temp/temp-<workflow>-<step>-prompt.md` | Workflow initiation commands | Rendered workflow prompts |
|
|
1439
|
+
|
|
1440
|
+
### Background Task Storage Structure
|
|
1441
|
+
|
|
1442
|
+
Background tasks use a separate storage structure in `scripts/temp/background-tasks/`:
|
|
1443
|
+
|
|
1444
|
+
```text
|
|
1445
|
+
scripts/temp/
|
|
1446
|
+
├── agdt-state.json # Main state file (contains background.recentTasks)
|
|
1447
|
+
└── background-tasks/
|
|
1448
|
+
├── all-background-tasks.json # Complete history of all tasks (never pruned)
|
|
1449
|
+
└── logs/
|
|
1450
|
+
└── <command>_<timestamp>.log # Task output logs
|
|
1451
|
+
```
|
|
1452
|
+
|
|
1453
|
+
**State Structure:**
|
|
1454
|
+
|
|
1455
|
+
The `agdt-state.json` file contains recent tasks under `background.recentTasks`:
|
|
1456
|
+
|
|
1457
|
+
```json
|
|
1458
|
+
{
|
|
1459
|
+
"background": {
|
|
1460
|
+
"recentTasks": [
|
|
1461
|
+
{
|
|
1462
|
+
"id": "task-abc123",
|
|
1463
|
+
"command": "agdt-git-save-work",
|
|
1464
|
+
"status": "completed",
|
|
1465
|
+
"start_time": "2024-12-19T15:50:26Z",
|
|
1466
|
+
"end_time": "2024-12-19T15:50:28Z",
|
|
1467
|
+
"exit_code": 0,
|
|
1468
|
+
"log_file": "/path/to/logs/dfly_git_commit_20241219_155026.log"
|
|
1469
|
+
}
|
|
1470
|
+
],
|
|
1471
|
+
"task_id": "task-abc123"
|
|
1472
|
+
}
|
|
1473
|
+
}
|
|
1474
|
+
```
|
|
1475
|
+
|
|
1476
|
+
**Sorting Rules:**
|
|
1477
|
+
|
|
1478
|
+
- Unfinished tasks appear first, sorted by start time (earliest first)
|
|
1479
|
+
- Finished tasks appear after, sorted by end time (earliest first)
|
|
1480
|
+
|
|
1481
|
+
**Auto-Pruning:**
|
|
1482
|
+
|
|
1483
|
+
- Recent tasks are automatically pruned when not running and finished more than 5 minutes ago
|
|
1484
|
+
- The `all-background-tasks.json` file keeps the complete history without pruning
|
|
1485
|
+
|
|
1486
|
+
## 17. Instruction Maintenance
|
|
1487
|
+
|
|
1488
|
+
Update this file when:
|
|
1489
|
+
|
|
1490
|
+
- Adding new CLI commands
|
|
1491
|
+
- Changing state file structure
|
|
1492
|
+
- Modifying the auto-approval pattern
|
|
1493
|
+
- Adding new integrations
|
|
1494
|
+
- Adding new workflow commands or prompt templates
|
|
1495
|
+
- Discovering new anti-patterns that AI agents should be warned about
|