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.
Files changed (998) hide show
  1. agentic_devtools-0.2.8/.github/copilot-instructions.md +1495 -0
  2. agentic_devtools-0.2.8/.github/workflows/auto-fix-on-failure.yml +201 -0
  3. agentic_devtools-0.2.8/.github/workflows/copilot-setup-steps.yml +38 -0
  4. agentic_devtools-0.2.8/.github/workflows/security-scan-on-merge.yml +343 -0
  5. agentic_devtools-0.2.8/CONTRIBUTING.md +327 -0
  6. agentic_devtools-0.2.8/PKG-INFO +888 -0
  7. agentic_devtools-0.2.8/README.md +863 -0
  8. agentic_devtools-0.2.8/agdt_ai_helpers/__init__.py +34 -0
  9. agentic_devtools-0.2.8/agentic_devtools/_version.py +34 -0
  10. agentic_devtools-0.2.8/agentic_devtools/background_tasks.py +598 -0
  11. agentic_devtools-0.2.8/agentic_devtools/cli/azure/app_insights_commands.py +908 -0
  12. agentic_devtools-0.2.8/agentic_devtools/cli/azure/auth.py +170 -0
  13. agentic_devtools-0.2.8/agentic_devtools/cli/azure_context/commands.py +126 -0
  14. agentic_devtools-0.2.8/agentic_devtools/cli/azure_context/management.py +231 -0
  15. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/async_commands.py +1492 -0
  16. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/commands.py +728 -0
  17. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/file_review_commands.py +1038 -0
  18. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/helpers.py +561 -0
  19. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/mark_reviewed.py +756 -0
  20. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/pipeline_commands.py +724 -0
  21. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/pr_summary_commands.py +579 -0
  22. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/pull_request_details_commands.py +596 -0
  23. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/review_commands.py +700 -0
  24. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/review_helpers.py +191 -0
  25. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/run_details_commands.py +935 -0
  26. agentic_devtools-0.2.8/agentic_devtools/cli/azure_devops/vpn_toggle.py +1224 -0
  27. agentic_devtools-0.2.8/agentic_devtools/cli/git/async_commands.py +294 -0
  28. agentic_devtools-0.2.8/agentic_devtools/cli/git/commands.py +399 -0
  29. agentic_devtools-0.2.8/agentic_devtools/cli/git/diff.py +210 -0
  30. agentic_devtools-0.2.8/agentic_devtools/cli/git/operations.py +754 -0
  31. agentic_devtools-0.2.8/agentic_devtools/cli/github/__init__.py +49 -0
  32. agentic_devtools-0.2.8/agentic_devtools/cli/github/async_commands.py +739 -0
  33. agentic_devtools-0.2.8/agentic_devtools/cli/github/issue_commands.py +516 -0
  34. agentic_devtools-0.2.8/agentic_devtools/cli/github/state_helpers.py +39 -0
  35. agentic_devtools-0.2.8/agentic_devtools/cli/jira/async_commands.py +439 -0
  36. agentic_devtools-0.2.8/agentic_devtools/cli/jira/comment_commands.py +141 -0
  37. agentic_devtools-0.2.8/agentic_devtools/cli/jira/formatting.py +129 -0
  38. agentic_devtools-0.2.8/agentic_devtools/cli/jira/get_commands.py +287 -0
  39. agentic_devtools-0.2.8/agentic_devtools/cli/jira/helpers.py +278 -0
  40. agentic_devtools-0.2.8/agentic_devtools/cli/jira/parse_error_report.py +352 -0
  41. agentic_devtools-0.2.8/agentic_devtools/cli/jira/role_commands.py +560 -0
  42. agentic_devtools-0.2.8/agentic_devtools/cli/jira/update_commands.py +222 -0
  43. agentic_devtools-0.2.8/agentic_devtools/cli/jira/vpn_wrapper.py +58 -0
  44. agentic_devtools-0.2.8/agentic_devtools/cli/release/commands.py +103 -0
  45. agentic_devtools-0.2.8/agentic_devtools/cli/release/helpers.py +105 -0
  46. agentic_devtools-0.2.8/agentic_devtools/cli/runner.py +395 -0
  47. agentic_devtools-0.2.8/agentic_devtools/cli/subprocess_utils.py +117 -0
  48. agentic_devtools-0.2.8/agentic_devtools/cli/tasks/commands.py +851 -0
  49. agentic_devtools-0.2.8/agentic_devtools/cli/testing.py +438 -0
  50. agentic_devtools-0.2.8/agentic_devtools/cli/vpn/runner.py +198 -0
  51. agentic_devtools-0.2.8/agentic_devtools/cli/workflows/advancement.py +204 -0
  52. agentic_devtools-0.2.8/agentic_devtools/cli/workflows/base.py +240 -0
  53. agentic_devtools-0.2.8/agentic_devtools/cli/workflows/checklist.py +278 -0
  54. agentic_devtools-0.2.8/agentic_devtools/cli/workflows/commands.py +1610 -0
  55. agentic_devtools-0.2.8/agentic_devtools/cli/workflows/manager.py +820 -0
  56. agentic_devtools-0.2.8/agentic_devtools/cli/workflows/preflight.py +323 -0
  57. agentic_devtools-0.2.8/agentic_devtools/cli/workflows/worktree_setup.py +1166 -0
  58. agentic_devtools-0.2.8/agentic_devtools/prompts/loader.py +377 -0
  59. agentic_devtools-0.2.8/agentic_devtools/state.py +746 -0
  60. agentic_devtools-0.2.8/agentic_devtools/task_state.py +902 -0
  61. agentic_devtools-0.2.8/pyproject.toml +186 -0
  62. agentic_devtools-0.2.8/scripts/run-pr-checks.sh +55 -0
  63. agentic_devtools-0.2.8/scripts/scaffold_tests.py +220 -0
  64. agentic_devtools-0.2.8/scripts/validate_test_structure.py +87 -0
  65. agentic_devtools-0.2.8/scripts/verify-agent-coverage.py +108 -0
  66. agentic_devtools-0.2.8/tests/README.md +306 -0
  67. agentic_devtools-0.2.8/tests/azure_context/test_commands.py +165 -0
  68. agentic_devtools-0.2.8/tests/azure_context/test_management.py +257 -0
  69. agentic_devtools-0.2.8/tests/azure_devops/conftest.py +43 -0
  70. agentic_devtools-0.2.8/tests/azure_devops/test_config.py +383 -0
  71. agentic_devtools-0.2.8/tests/cli/test_azure_app_insights_commands.py +710 -0
  72. agentic_devtools-0.2.8/tests/cli/test_azure_auth.py +172 -0
  73. agentic_devtools-0.2.8/tests/conftest.py +81 -0
  74. agentic_devtools-0.2.8/tests/e2e_smoke/conftest.py +160 -0
  75. agentic_devtools-0.2.8/tests/e2e_smoke/test_azure_devops_commands_e2e.py +83 -0
  76. agentic_devtools-0.2.8/tests/e2e_smoke/test_git_commands_e2e.py +115 -0
  77. agentic_devtools-0.2.8/tests/e2e_smoke/test_jira_commands_e2e.py +287 -0
  78. agentic_devtools-0.2.8/tests/network/test_detection.py +132 -0
  79. agentic_devtools-0.2.8/tests/test_git_commands.py +647 -0
  80. agentic_devtools-0.2.8/tests/test_git_operations.py +1001 -0
  81. agentic_devtools-0.2.8/tests/test_release_commands.py +166 -0
  82. agentic_devtools-0.2.8/tests/test_release_helpers.py +89 -0
  83. agentic_devtools-0.2.8/tests/test_release_integration.py +88 -0
  84. agentic_devtools-0.2.8/tests/test_validate_test_structure.py +295 -0
  85. agentic_devtools-0.2.8/tests/test_version.py +40 -0
  86. agentic_devtools-0.2.8/tests/unit/__init__.py +0 -0
  87. agentic_devtools-0.2.8/tests/unit/background_tasks/__init__.py +0 -0
  88. agentic_devtools-0.2.8/tests/unit/background_tasks/test_cleanup_old_logs.py +144 -0
  89. agentic_devtools-0.2.8/tests/unit/background_tasks/test_create_log_file_path.py +51 -0
  90. agentic_devtools-0.2.8/tests/unit/background_tasks/test_get_task_log_content.py +73 -0
  91. agentic_devtools-0.2.8/tests/unit/background_tasks/test_run_function_in_background.py +85 -0
  92. agentic_devtools-0.2.8/tests/unit/background_tasks/test_run_in_background.py +101 -0
  93. agentic_devtools-0.2.8/tests/unit/background_tasks/test_wait_for_task.py +68 -0
  94. agentic_devtools-0.2.8/tests/unit/cli/__init__.py +0 -0
  95. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/__init__.py +0 -0
  96. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/__init__.py +0 -0
  97. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/_helpers.py +16 -0
  98. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_add_pull_request_comment_async.py +18 -0
  99. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_approve_file_async.py +32 -0
  100. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_approve_pull_request_async.py +16 -0
  101. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_create_pull_request_async.py +31 -0
  102. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_generate_pr_summary_async.py +15 -0
  103. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_get_pull_request_details_async.py +15 -0
  104. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_get_pull_request_threads_async.py +16 -0
  105. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_get_run_details_async.py +13 -0
  106. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_mark_file_reviewed_async.py +13 -0
  107. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_mark_pull_request_draft_async.py +13 -0
  108. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_publish_pull_request_async.py +13 -0
  109. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_reply_to_pull_request_thread_async.py +18 -0
  110. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_request_changes_async.py +34 -0
  111. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_request_changes_with_suggestion_async.py +35 -0
  112. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_resolve_thread_async.py +17 -0
  113. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_run_e2e_tests_fabric_async.py +17 -0
  114. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_run_e2e_tests_synapse_async.py +15 -0
  115. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_run_wb_patch_async.py +13 -0
  116. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/async_commands/test_submit_file_review_async.py +15 -0
  117. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/auth/__init__.py +0 -0
  118. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/auth/test_get_auth_headers.py +21 -0
  119. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/auth/test_get_pat.py +35 -0
  120. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/__init__.py +0 -0
  121. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_add_pull_request_comment.py +203 -0
  122. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_approve_pull_request.py +60 -0
  123. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_create_pull_request.py +246 -0
  124. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_get_pull_request_threads.py +89 -0
  125. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_mark_pull_request_draft.py +122 -0
  126. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_publish_pull_request.py +264 -0
  127. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_reply_to_pull_request_thread.py +140 -0
  128. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/commands/test_resolve_thread.py +64 -0
  129. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/config/__init__.py +0 -0
  130. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/config/test_azure_devops_config.py +90 -0
  131. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/config/test_constants.py +27 -0
  132. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/config/test_get_repository_name_from_git_remote.py +261 -0
  133. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/conftest.py +25 -0
  134. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/__init__.py +0 -0
  135. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_approve_file.py +85 -0
  136. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_mark_file_as_submission_pending.py +9 -0
  137. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_request_changes.py +27 -0
  138. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_request_changes_with_suggestion.py +27 -0
  139. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_submit_file_review.py +112 -0
  140. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/file_review_commands/test_update_submission_to_completed.py +9 -0
  141. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/__init__.py +0 -0
  142. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_build_thread_context.py +37 -0
  143. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_convert_to_pull_request_title.py +38 -0
  144. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_format_approval_content.py +26 -0
  145. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_get_repository_id.py +41 -0
  146. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_parse_bool_from_state_value.py +44 -0
  147. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_require_content.py +22 -0
  148. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/helpers/test_require_requests.py +37 -0
  149. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/mark_reviewed/__init__.py +0 -0
  150. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/mark_reviewed/test_mark_file_reviewed.py +247 -0
  151. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/mark_reviewed/test_mark_file_reviewed_cli.py +89 -0
  152. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/mark_reviewed/test_normalize_repo_path.py +85 -0
  153. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/__init__.py +0 -0
  154. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_create_pipeline.py +202 -0
  155. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_get_pipeline_id.py +173 -0
  156. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_list_pipelines.py +157 -0
  157. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_run_e2e_tests_fabric.py +167 -0
  158. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_run_e2e_tests_synapse.py +199 -0
  159. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_run_wb_patch.py +278 -0
  160. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pipeline_commands/test_update_pipeline.py +10 -0
  161. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pr_summary_commands/__init__.py +0 -0
  162. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pr_summary_commands/test_generate_overarching_pr_comments.py +123 -0
  163. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pr_summary_commands/test_generate_overarching_pr_comments_cli.py +27 -0
  164. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/__init__.py +0 -0
  165. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_change_tracking_id_for_file.py +91 -0
  166. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_iteration_change_tracking_map.py +213 -0
  167. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_iteration_changes.py +64 -0
  168. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_details.py +270 -0
  169. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_iterations.py +44 -0
  170. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_threads.py +73 -0
  171. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_reviewer_payload.py +307 -0
  172. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_viewed_files_via_contribution.py +192 -0
  173. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_invoke_ado_rest.py +50 -0
  174. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/pull_request_details_commands/test_invoke_ado_rest_post.py +51 -0
  175. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/__init__.py +0 -0
  176. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_build_reviewed_paths_set.py +66 -0
  177. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_checkout_and_sync_branch.py +95 -0
  178. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_convert_to_prompt_filename.py +33 -0
  179. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_extract_jira_issue_key_from_title.py +55 -0
  180. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_fetch_and_display_jira_issue.py +58 -0
  181. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_fetch_pull_request_basic_info.py +80 -0
  182. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_filter_threads.py +94 -0
  183. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_generate_review_prompts.py +109 -0
  184. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_get_jira_issue_key_from_state.py +27 -0
  185. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_get_linked_pull_request_from_jira.py +207 -0
  186. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_get_pull_request_id_from_state.py +38 -0
  187. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_get_root_folder.py +34 -0
  188. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_get_threads_for_file.py +94 -0
  189. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_normalize_repo_path.py +39 -0
  190. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_print_review_instructions.py +37 -0
  191. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_setup_pull_request_review.py +197 -0
  192. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_commands/test_write_file_prompt.py +35 -0
  193. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/__init__.py +0 -0
  194. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_build_reviewed_paths_set.py +66 -0
  195. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_convert_to_prompt_filename.py +33 -0
  196. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_extract_jira_issue_key_from_title.py +78 -0
  197. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_filter_threads.py +94 -0
  198. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_get_root_folder.py +34 -0
  199. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_get_threads_for_file.py +94 -0
  200. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_helpers/test_normalize_repo_path.py +85 -0
  201. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/__init__.py +0 -0
  202. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_display_jira_issue_summary.py +55 -0
  203. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_extract_linked_pr_from_issue.py +94 -0
  204. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_extract_pr_id_from_development_panel.py +72 -0
  205. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_fetch_and_display_jira_issue.py +37 -0
  206. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_fetch_development_panel_prs.py +156 -0
  207. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_fetch_jira_issue.py +65 -0
  208. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_get_jira_credentials.py +40 -0
  209. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_get_linked_pull_request_from_jira.py +31 -0
  210. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_jira/test_get_pr_from_development_panel.py +44 -0
  211. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/__init__.py +0 -0
  212. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_build_file_prompt_content.py +109 -0
  213. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_generate_review_prompts.py +117 -0
  214. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_generate_review_prompts_edge_cases.py +70 -0
  215. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_get_prompts_output_dir.py +15 -0
  216. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_print_review_instructions.py +42 -0
  217. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/review_prompts/test_write_file_prompt.py +23 -0
  218. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/__init__.py +0 -0
  219. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_fetch_build_run.py +49 -0
  220. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_fetch_build_timeline.py +48 -0
  221. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_fetch_failed_job_logs.py +70 -0
  222. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_fetch_pipeline_run.py +49 -0
  223. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_fetch_task_log.py +48 -0
  224. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_get_failed_tasks.py +124 -0
  225. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_get_run_details.py +221 -0
  226. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_get_temp_folder.py +27 -0
  227. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_is_run_finished.py +46 -0
  228. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_print_failed_logs_summary.py +64 -0
  229. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_print_parameters.py +45 -0
  230. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_print_summary.py +50 -0
  231. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_save_json.py +42 -0
  232. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_save_log_file.py +47 -0
  233. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/run_details_commands/test_wait_for_run.py +251 -0
  234. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/__init__.py +0 -0
  235. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_check_network_status.py +60 -0
  236. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_connect_vpn.py +186 -0
  237. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_disconnect_vpn.py +53 -0
  238. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_is_on_corporate_network.py +58 -0
  239. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_is_pulse_secure_installed.py +29 -0
  240. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_is_vpn_connected.py +75 -0
  241. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_reconnect_vpn.py +53 -0
  242. agentic_devtools-0.2.8/tests/unit/cli/azure_devops/vpn_toggle/test_smart_connect_vpn.py +104 -0
  243. agentic_devtools-0.2.8/tests/unit/cli/git/__init__.py +0 -0
  244. agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/__init__.py +0 -0
  245. agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/_helpers.py +16 -0
  246. agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_amend_async.py +59 -0
  247. agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_commit_async.py +107 -0
  248. agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_force_push_async.py +22 -0
  249. agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_publish_async.py +22 -0
  250. agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_push_async.py +22 -0
  251. agentic_devtools-0.2.8/tests/unit/cli/git/async_commands/test_stage_async.py +22 -0
  252. agentic_devtools-0.2.8/tests/unit/cli/git/commands/__init__.py +0 -0
  253. agentic_devtools-0.2.8/tests/unit/cli/git/commands/conftest.py +21 -0
  254. agentic_devtools-0.2.8/tests/unit/cli/git/commands/test__get_issue_key_from_state.py +30 -0
  255. agentic_devtools-0.2.8/tests/unit/cli/git/commands/test__mark_checklist_items_completed.py +43 -0
  256. agentic_devtools-0.2.8/tests/unit/cli/git/commands/test__sync_with_main.py +58 -0
  257. agentic_devtools-0.2.8/tests/unit/cli/git/commands/test__trigger_implementation_review.py +25 -0
  258. agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_amend_cmd.py +80 -0
  259. agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_commit_cmd.py +247 -0
  260. agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_force_push_cmd.py +23 -0
  261. agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_publish_cmd.py +32 -0
  262. agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_push_cmd.py +23 -0
  263. agentic_devtools-0.2.8/tests/unit/cli/git/commands/test_stage_cmd.py +27 -0
  264. agentic_devtools-0.2.8/tests/unit/cli/git/conftest.py +17 -0
  265. agentic_devtools-0.2.8/tests/unit/cli/git/core/__init__.py +0 -0
  266. agentic_devtools-0.2.8/tests/unit/cli/git/core/test_get_bool_state.py +30 -0
  267. agentic_devtools-0.2.8/tests/unit/cli/git/core/test_get_commit_message.py +36 -0
  268. agentic_devtools-0.2.8/tests/unit/cli/git/core/test_get_current_branch.py +35 -0
  269. agentic_devtools-0.2.8/tests/unit/cli/git/core/test_run_git.py +61 -0
  270. agentic_devtools-0.2.8/tests/unit/cli/git/core/test_temp_message_file.py +50 -0
  271. agentic_devtools-0.2.8/tests/unit/cli/git/diff/__init__.py +0 -0
  272. agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_addedline.py +13 -0
  273. agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_addedlinesinfo.py +20 -0
  274. agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_diffentry.py +27 -0
  275. agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_get_added_lines_info.py +117 -0
  276. agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_get_diff_entries.py +119 -0
  277. agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_get_diff_patch.py +63 -0
  278. agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_normalize_ref_name.py +32 -0
  279. agentic_devtools-0.2.8/tests/unit/cli/git/diff/test_sync_git_ref.py +65 -0
  280. agentic_devtools-0.2.8/tests/unit/cli/git/operations/__init__.py +0 -0
  281. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_amend_commit.py +24 -0
  282. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_branch_has_commits_ahead_of_main.py +76 -0
  283. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_branchsafetycheckresult.py +37 -0
  284. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_check_branch_safe_to_recreate.py +74 -0
  285. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_checkout_branch.py +106 -0
  286. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_checkoutresult.py +39 -0
  287. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_create_commit.py +31 -0
  288. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_fetch_branch.py +51 -0
  289. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_fetch_main.py +30 -0
  290. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_force_push.py +21 -0
  291. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_get_commits_behind_main.py +33 -0
  292. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_get_files_changed_on_branch.py +73 -0
  293. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_get_last_commit_message.py +84 -0
  294. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_has_local_changes.py +90 -0
  295. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_last_commit_contains_issue_key.py +45 -0
  296. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_local_branch_matches_origin.py +199 -0
  297. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_publish_branch.py +33 -0
  298. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_push.py +21 -0
  299. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_rebase_onto_main.py +69 -0
  300. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_rebaseresult.py +40 -0
  301. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_should_amend_instead_of_commit.py +33 -0
  302. agentic_devtools-0.2.8/tests/unit/cli/git/operations/test_stage_changes.py +35 -0
  303. agentic_devtools-0.2.8/tests/unit/cli/github/__init__.py +0 -0
  304. agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/__init__.py +0 -0
  305. agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_bug_issue_async.py +76 -0
  306. agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_bug_issue_async_cli.py +59 -0
  307. agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_documentation_issue_async.py +70 -0
  308. agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_documentation_issue_async_cli.py +54 -0
  309. agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_feature_issue_async.py +82 -0
  310. agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_feature_issue_async_cli.py +55 -0
  311. agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_issue_async.py +51 -0
  312. agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_issue_async_cli.py +60 -0
  313. agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_task_issue_async.py +70 -0
  314. agentic_devtools-0.2.8/tests/unit/cli/github/async_commands/test_create_agdt_task_issue_async_cli.py +54 -0
  315. agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/__init__.py +0 -0
  316. agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test__append_related_issues.py +41 -0
  317. agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test__append_terminal_log.py +30 -0
  318. agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test__build_gh_create_args.py +63 -0
  319. agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test__check_gh_cli.py +24 -0
  320. agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test__get_environment_info.py +60 -0
  321. agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test_create_agdt_bug_issue.py +127 -0
  322. agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test_create_agdt_documentation_issue.py +82 -0
  323. agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test_create_agdt_feature_issue.py +96 -0
  324. agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test_create_agdt_issue.py +155 -0
  325. agentic_devtools-0.2.8/tests/unit/cli/github/issue_commands/test_create_agdt_task_issue.py +80 -0
  326. agentic_devtools-0.2.8/tests/unit/cli/github/state_helpers/__init__.py +0 -0
  327. agentic_devtools-0.2.8/tests/unit/cli/github/state_helpers/test_get_issue_value.py +60 -0
  328. agentic_devtools-0.2.8/tests/unit/cli/github/state_helpers/test_set_issue_value.py +40 -0
  329. agentic_devtools-0.2.8/tests/unit/cli/jira/__init__.py +0 -0
  330. agentic_devtools-0.2.8/tests/unit/cli/jira/adf/__init__.py +0 -0
  331. agentic_devtools-0.2.8/tests/unit/cli/jira/adf/test__convert_adf_to_text.py +289 -0
  332. agentic_devtools-0.2.8/tests/unit/cli/jira/adf/test__process_adf_children.py +35 -0
  333. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/__init__.py +0 -0
  334. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/conftest.py +36 -0
  335. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_add_comment_async.py +58 -0
  336. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_add_users_to_project_role_async.py +37 -0
  337. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_add_users_to_project_role_batch_async.py +37 -0
  338. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_check_user_exists_async.py +34 -0
  339. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_check_users_exist_async.py +34 -0
  340. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_create_epic_async.py +45 -0
  341. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_create_issue_async.py +45 -0
  342. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_create_subtask_async.py +46 -0
  343. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_find_role_id_by_name_async.py +37 -0
  344. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_get_issue_async.py +43 -0
  345. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_get_project_role_details_async.py +34 -0
  346. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_list_project_roles_async.py +42 -0
  347. agentic_devtools-0.2.8/tests/unit/cli/jira/async_commands/test_update_issue_async.py +43 -0
  348. agentic_devtools-0.2.8/tests/unit/cli/jira/async_status/__init__.py +0 -0
  349. agentic_devtools-0.2.8/tests/unit/cli/jira/async_status/conftest.py +36 -0
  350. agentic_devtools-0.2.8/tests/unit/cli/jira/async_status/test_write_async_status.py +69 -0
  351. agentic_devtools-0.2.8/tests/unit/cli/jira/comment_commands/__init__.py +0 -0
  352. agentic_devtools-0.2.8/tests/unit/cli/jira/comment_commands/test_add_comment.py +123 -0
  353. agentic_devtools-0.2.8/tests/unit/cli/jira/config/__init__.py +0 -0
  354. agentic_devtools-0.2.8/tests/unit/cli/jira/config/test_get_jira_auth_header.py +91 -0
  355. agentic_devtools-0.2.8/tests/unit/cli/jira/config/test_get_jira_base_url.py +31 -0
  356. agentic_devtools-0.2.8/tests/unit/cli/jira/config/test_get_jira_headers.py +19 -0
  357. agentic_devtools-0.2.8/tests/unit/cli/jira/create_commands/__init__.py +0 -0
  358. agentic_devtools-0.2.8/tests/unit/cli/jira/create_commands/test_create_epic.py +155 -0
  359. agentic_devtools-0.2.8/tests/unit/cli/jira/create_commands/test_create_issue.py +150 -0
  360. agentic_devtools-0.2.8/tests/unit/cli/jira/create_commands/test_create_issue_sync.py +139 -0
  361. agentic_devtools-0.2.8/tests/unit/cli/jira/create_commands/test_create_subtask.py +155 -0
  362. agentic_devtools-0.2.8/tests/unit/cli/jira/formatting/__init__.py +0 -0
  363. agentic_devtools-0.2.8/tests/unit/cli/jira/formatting/test_build_user_story_description.py +83 -0
  364. agentic_devtools-0.2.8/tests/unit/cli/jira/formatting/test_format_bullet_list.py +71 -0
  365. agentic_devtools-0.2.8/tests/unit/cli/jira/formatting/test_merge_labels.py +65 -0
  366. agentic_devtools-0.2.8/tests/unit/cli/jira/get_commands/__init__.py +0 -0
  367. agentic_devtools-0.2.8/tests/unit/cli/jira/get_commands/test__fetch_epic.py +78 -0
  368. agentic_devtools-0.2.8/tests/unit/cli/jira/get_commands/test__fetch_parent_issue.py +74 -0
  369. agentic_devtools-0.2.8/tests/unit/cli/jira/get_commands/test__fetch_remote_links.py +85 -0
  370. agentic_devtools-0.2.8/tests/unit/cli/jira/get_commands/test_get_issue.py +1029 -0
  371. agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/__init__.py +0 -0
  372. agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__count_certificates_in_pem.py +37 -0
  373. agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__ensure_jira_pem.py +137 -0
  374. agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__fetch_certificate_chain_openssl.py +65 -0
  375. agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__fetch_certificate_chain_ssl.py +53 -0
  376. agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__get_repo_jira_pem_path.py +20 -0
  377. agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__get_requests.py +28 -0
  378. agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__get_ssl_verify.py +176 -0
  379. agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__get_temp_jira_pem_path.py +19 -0
  380. agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__parse_comma_separated.py +50 -0
  381. agentic_devtools-0.2.8/tests/unit/cli/jira/helpers/test__parse_multiline_string.py +50 -0
  382. agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/__init__.py +0 -0
  383. agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_get_user_details.py +134 -0
  384. agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_get_user_details_api_calls.py +75 -0
  385. agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_parse_error_file.py +165 -0
  386. agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_parse_error_file_combined_errors.py +37 -0
  387. agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_parse_error_file_multiple_dataproducts.py +35 -0
  388. agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_parse_jira_error_report_command.py +89 -0
  389. agentic_devtools-0.2.8/tests/unit/cli/jira/parse_error_report/test_parse_jira_error_report_integration.py +35 -0
  390. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/__init__.py +0 -0
  391. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_add_users_to_project_role.py +89 -0
  392. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_add_users_to_project_role_additional_cases.py +108 -0
  393. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_add_users_to_project_role_batch.py +188 -0
  394. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_check_user_exists.py +143 -0
  395. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_check_user_exists_command.py +71 -0
  396. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_check_users_exist_command.py +31 -0
  397. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_check_users_exist_command_paths.py +59 -0
  398. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_find_role_id_by_name.py +166 -0
  399. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_get_project_role_details.py +90 -0
  400. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_get_project_role_details_command_paths.py +127 -0
  401. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_list_project_roles.py +77 -0
  402. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_list_project_roles_command_paths.py +76 -0
  403. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_role_commands_error_handling.py +53 -0
  404. agentic_devtools-0.2.8/tests/unit/cli/jira/role_commands/test_role_id_extraction.py +40 -0
  405. agentic_devtools-0.2.8/tests/unit/cli/jira/state_helpers/__init__.py +0 -0
  406. agentic_devtools-0.2.8/tests/unit/cli/jira/state_helpers/test_get_jira_value.py +30 -0
  407. agentic_devtools-0.2.8/tests/unit/cli/jira/state_helpers/test_set_jira_value.py +24 -0
  408. agentic_devtools-0.2.8/tests/unit/cli/jira/update_commands/__init__.py +0 -0
  409. agentic_devtools-0.2.8/tests/unit/cli/jira/update_commands/test__build_update_payload.py +108 -0
  410. agentic_devtools-0.2.8/tests/unit/cli/jira/update_commands/test_update_issue.py +160 -0
  411. agentic_devtools-0.2.8/tests/unit/cli/jira/vpn_wrapper/__init__.py +0 -0
  412. agentic_devtools-0.2.8/tests/unit/cli/jira/vpn_wrapper/test_with_jira_vpn_context_decorator.py +125 -0
  413. agentic_devtools-0.2.8/tests/unit/cli/jira/vpn_wrapper/test_with_jira_vpn_context_integration.py +56 -0
  414. agentic_devtools-0.2.8/tests/unit/cli/release/__init__.py +0 -0
  415. agentic_devtools-0.2.8/tests/unit/cli/release/helpers/__init__.py +0 -0
  416. agentic_devtools-0.2.8/tests/unit/cli/release/helpers/test_compute_sha256.py +14 -0
  417. agentic_devtools-0.2.8/tests/unit/cli/runner/__init__.py +0 -0
  418. agentic_devtools-0.2.8/tests/unit/cli/runner/test_command_map.py +93 -0
  419. agentic_devtools-0.2.8/tests/unit/cli/runner/test_command_map_integrity.py +119 -0
  420. agentic_devtools-0.2.8/tests/unit/cli/runner/test_main.py +83 -0
  421. agentic_devtools-0.2.8/tests/unit/cli/runner/test_main_entry_point.py +18 -0
  422. agentic_devtools-0.2.8/tests/unit/cli/runner/test_run_as_script.py +48 -0
  423. agentic_devtools-0.2.8/tests/unit/cli/runner/test_run_command.py +68 -0
  424. agentic_devtools-0.2.8/tests/unit/cli/state/__init__.py +0 -0
  425. agentic_devtools-0.2.8/tests/unit/cli/state/test_clear_cmd.py +16 -0
  426. agentic_devtools-0.2.8/tests/unit/cli/state/test_clear_workflow_cmd.py +25 -0
  427. agentic_devtools-0.2.8/tests/unit/cli/state/test_delete_cmd.py +32 -0
  428. agentic_devtools-0.2.8/tests/unit/cli/state/test_get_cmd.py +46 -0
  429. agentic_devtools-0.2.8/tests/unit/cli/state/test_get_workflow_cmd.py +27 -0
  430. agentic_devtools-0.2.8/tests/unit/cli/state/test_set_cmd.py +155 -0
  431. agentic_devtools-0.2.8/tests/unit/cli/state/test_show_cmd.py +27 -0
  432. agentic_devtools-0.2.8/tests/unit/cli/subprocess_utils/__init__.py +0 -0
  433. agentic_devtools-0.2.8/tests/unit/cli/subprocess_utils/test_run_safe.py +125 -0
  434. agentic_devtools-0.2.8/tests/unit/cli/subprocess_utils/test_run_safe_integration.py +43 -0
  435. agentic_devtools-0.2.8/tests/unit/cli/tasks/__init__.py +0 -0
  436. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/__init__.py +0 -0
  437. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_handle_task_completed.py +133 -0
  438. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_helper_functions.py +133 -0
  439. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_list_tasks.py +77 -0
  440. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_safe_print_unicode_error.py +60 -0
  441. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_show_other_incomplete_tasks.py +103 -0
  442. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_command_integration.py +77 -0
  443. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_id_argument.py +163 -0
  444. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_log.py +89 -0
  445. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_log_line_limits.py +119 -0
  446. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_status.py +74 -0
  447. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_wait.py +205 -0
  448. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_task_wait_value_error_handling.py +76 -0
  449. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_tasks_clean.py +110 -0
  450. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_try_advance_pr_review_to_summary.py +166 -0
  451. agentic_devtools-0.2.8/tests/unit/cli/tasks/commands/test_try_complete_pr_review_workflow.py +109 -0
  452. agentic_devtools-0.2.8/tests/unit/cli/testing/__init__.py +0 -0
  453. agentic_devtools-0.2.8/tests/unit/cli/testing/test__infer_test_file_from_source.py +20 -0
  454. agentic_devtools-0.2.8/tests/unit/cli/testing/test_async_wrappers.py +81 -0
  455. agentic_devtools-0.2.8/tests/unit/cli/testing/test_create_test_file_parser.py +34 -0
  456. agentic_devtools-0.2.8/tests/unit/cli/testing/test_get_package_root.py +33 -0
  457. agentic_devtools-0.2.8/tests/unit/cli/testing/test_run_subprocess_with_streaming.py +81 -0
  458. agentic_devtools-0.2.8/tests/unit/cli/testing/test_run_tests_file_sync.py +94 -0
  459. agentic_devtools-0.2.8/tests/unit/cli/testing/test_run_tests_pattern.py +60 -0
  460. agentic_devtools-0.2.8/tests/unit/cli/testing/test_run_tests_quick_sync.py +40 -0
  461. agentic_devtools-0.2.8/tests/unit/cli/testing/test_run_tests_sync.py +41 -0
  462. agentic_devtools-0.2.8/tests/unit/cli/vpn/__init__.py +0 -0
  463. agentic_devtools-0.2.8/tests/unit/cli/vpn/runner/__init__.py +0 -0
  464. agentic_devtools-0.2.8/tests/unit/cli/vpn/runner/test__detect_vpn_requirement_from_command.py +35 -0
  465. agentic_devtools-0.2.8/tests/unit/cli/vpn/runner/test__execute_command.py +59 -0
  466. agentic_devtools-0.2.8/tests/unit/cli/vpn/runner/test_run_with_vpn_context.py +222 -0
  467. agentic_devtools-0.2.8/tests/unit/cli/vpn/runner/test_vpnrequirement.py +13 -0
  468. agentic_devtools-0.2.8/tests/unit/cli/workflows/__init__.py +0 -0
  469. agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/__init__.py +0 -0
  470. agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_branch_pushed.py +49 -0
  471. agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_commit.py +70 -0
  472. agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_jira_comment.py +68 -0
  473. agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_jira_issue_retrieved.py +61 -0
  474. agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_pr_creation.py +59 -0
  475. agentic_devtools-0.2.8/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_pr_review.py +34 -0
  476. agentic_devtools-0.2.8/tests/unit/cli/workflows/base/__init__.py +0 -0
  477. agentic_devtools-0.2.8/tests/unit/cli/workflows/base/test__state_key_to_variable_name.py +58 -0
  478. agentic_devtools-0.2.8/tests/unit/cli/workflows/base/test_advance_workflow_step.py +78 -0
  479. agentic_devtools-0.2.8/tests/unit/cli/workflows/base/test_collect_variables_from_state.py +71 -0
  480. agentic_devtools-0.2.8/tests/unit/cli/workflows/base/test_initiate_workflow.py +118 -0
  481. agentic_devtools-0.2.8/tests/unit/cli/workflows/base/test_validate_required_state.py +81 -0
  482. agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/__init__.py +0 -0
  483. agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_checklist.py +198 -0
  484. agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_checklistitem.py +52 -0
  485. agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_get_checklist.py +55 -0
  486. agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_initialize_checklist.py +36 -0
  487. agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_mark_items_completed.py +54 -0
  488. agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_parse_completed_items_arg.py +60 -0
  489. agentic_devtools-0.2.8/tests/unit/cli/workflows/checklist/test_save_checklist.py +60 -0
  490. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/__init__.py +0 -0
  491. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test__execute_retrieve_step.py +123 -0
  492. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_advance_pull_request_review_workflow.py +200 -0
  493. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_advance_work_on_jira_issue_workflow.py +149 -0
  494. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_advance_workflow_cmd.py +133 -0
  495. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_create_checklist_cmd.py +259 -0
  496. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_get_workflow_cmd.py +91 -0
  497. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_apply_pull_request_review_suggestions_workflow.py +184 -0
  498. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_create_jira_epic_workflow.py +173 -0
  499. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_create_jira_issue_workflow.py +172 -0
  500. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_create_jira_subtask_workflow.py +183 -0
  501. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_pull_request_review_workflow.py +330 -0
  502. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_update_jira_issue_workflow.py +147 -0
  503. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_initiate_work_on_jira_issue_workflow.py +158 -0
  504. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_notify_workflow_event.py +310 -0
  505. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_setup_worktree_background_cmd.py +114 -0
  506. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_show_checklist_cmd.py +188 -0
  507. agentic_devtools-0.2.8/tests/unit/cli/workflows/commands/test_update_checklist_cmd.py +475 -0
  508. agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/__init__.py +0 -0
  509. agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test__build_command_hint.py +96 -0
  510. agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test__check_required_tasks_status.py +85 -0
  511. agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test__render_failure_prompt.py +61 -0
  512. agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test__render_waiting_prompt.py +68 -0
  513. agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test_get_next_step.py +52 -0
  514. agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test_get_next_workflow_prompt.py +212 -0
  515. agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test_get_workflow_definition.py +90 -0
  516. agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test_nextpromptresult.py +47 -0
  517. agentic_devtools-0.2.8/tests/unit/cli/workflows/manager/test_promptstatus.py +27 -0
  518. agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/__init__.py +0 -0
  519. agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_check_worktree_and_branch.py +132 -0
  520. agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_generate_setup_instructions.py +70 -0
  521. agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_get_current_git_branch.py +43 -0
  522. agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_get_git_repo_root.py +28 -0
  523. agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_perform_auto_setup.py +100 -0
  524. agentic_devtools-0.2.8/tests/unit/cli/workflows/preflight/test_preflightresult.py +68 -0
  525. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/__init__.py +0 -0
  526. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test__detect_git_root.py +93 -0
  527. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test__setup_worktree_from_state.py +97 -0
  528. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_check_worktree_exists.py +55 -0
  529. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_create_placeholder_and_setup_worktree.py +160 -0
  530. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_create_placeholder_issue.py +74 -0
  531. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_create_worktree.py +298 -0
  532. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_find_workspace_file.py +66 -0
  533. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_generate_workflow_branch_name.py +112 -0
  534. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_get_ai_agent_continuation_prompt.py +90 -0
  535. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_get_current_branch.py +38 -0
  536. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_get_main_repo_root.py +75 -0
  537. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_get_repos_parent_dir.py +30 -0
  538. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_get_worktree_continuation_prompt.py +120 -0
  539. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_inject_git_path_settings.py +195 -0
  540. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_is_in_worktree.py +55 -0
  541. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_open_vscode_workspace.py +97 -0
  542. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_placeholderissueresult.py +36 -0
  543. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_setup_worktree_environment.py +68 -0
  544. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_setup_worktree_in_background_sync.py +140 -0
  545. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_start_worktree_setup_background.py +116 -0
  546. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_switch_to_main_branch.py +40 -0
  547. agentic_devtools-0.2.8/tests/unit/cli/workflows/worktree_setup/test_worktreesetupresult.py +49 -0
  548. agentic_devtools-0.2.8/tests/unit/conftest.py +38 -0
  549. agentic_devtools-0.2.8/tests/unit/file_locking/__init__.py +0 -0
  550. agentic_devtools-0.2.8/tests/unit/file_locking/test_cross_platform_behavior.py +33 -0
  551. agentic_devtools-0.2.8/tests/unit/file_locking/test_file_lock_error.py +24 -0
  552. agentic_devtools-0.2.8/tests/unit/file_locking/test_lock_file.py +32 -0
  553. agentic_devtools-0.2.8/tests/unit/file_locking/test_lock_functions.py +32 -0
  554. agentic_devtools-0.2.8/tests/unit/file_locking/test_locked_file.py +74 -0
  555. agentic_devtools-0.2.8/tests/unit/file_locking/test_locked_file_edge_cases.py +39 -0
  556. agentic_devtools-0.2.8/tests/unit/file_locking/test_locked_state_file.py +84 -0
  557. agentic_devtools-0.2.8/tests/unit/file_locking/test_unix_file_locking.py +138 -0
  558. agentic_devtools-0.2.8/tests/unit/file_locking/test_unlock_file.py +24 -0
  559. agentic_devtools-0.2.8/tests/unit/file_locking/test_windows_file_locking.py +110 -0
  560. agentic_devtools-0.2.8/tests/unit/prompts/__init__.py +0 -0
  561. agentic_devtools-0.2.8/tests/unit/prompts/loader/__init__.py +0 -0
  562. agentic_devtools-0.2.8/tests/unit/prompts/loader/conftest.py +27 -0
  563. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_get_prompts_dir.py +21 -0
  564. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_get_required_variables.py +39 -0
  565. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_get_temp_output_dir.py +22 -0
  566. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_get_template_filename.py +24 -0
  567. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_get_template_path.py +27 -0
  568. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_load_and_render_prompt.py +62 -0
  569. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_load_prompt_template.py +45 -0
  570. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_log_prompt_with_save_notice.py +25 -0
  571. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_save_generated_prompt.py +27 -0
  572. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_silentundefined.py +39 -0
  573. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_substitute_variables.py +83 -0
  574. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_substitute_variables_syntax_error.py +11 -0
  575. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_template_validation_error.py +29 -0
  576. agentic_devtools-0.2.8/tests/unit/prompts/loader/test_validate_template_variables.py +42 -0
  577. agentic_devtools-0.2.8/tests/unit/state/__init__.py +0 -0
  578. agentic_devtools-0.2.8/tests/unit/state/test_clear_state.py +11 -0
  579. agentic_devtools-0.2.8/tests/unit/state/test_clear_temp_folder.py +103 -0
  580. agentic_devtools-0.2.8/tests/unit/state/test_clear_workflow_state.py +12 -0
  581. agentic_devtools-0.2.8/tests/unit/state/test_delete_value.py +46 -0
  582. agentic_devtools-0.2.8/tests/unit/state/test_get_all_keys.py +11 -0
  583. agentic_devtools-0.2.8/tests/unit/state/test_get_pull_request_id.py +9 -0
  584. agentic_devtools-0.2.8/tests/unit/state/test_get_pypi_dry_run.py +50 -0
  585. agentic_devtools-0.2.8/tests/unit/state/test_get_pypi_package_name.py +22 -0
  586. agentic_devtools-0.2.8/tests/unit/state/test_get_pypi_repository.py +22 -0
  587. agentic_devtools-0.2.8/tests/unit/state/test_get_pypi_version.py +22 -0
  588. agentic_devtools-0.2.8/tests/unit/state/test_get_state_dir.py +193 -0
  589. agentic_devtools-0.2.8/tests/unit/state/test_get_state_file_path.py +12 -0
  590. agentic_devtools-0.2.8/tests/unit/state/test_get_thread_id.py +9 -0
  591. agentic_devtools-0.2.8/tests/unit/state/test_get_value.py +50 -0
  592. agentic_devtools-0.2.8/tests/unit/state/test_get_workflow_state.py +25 -0
  593. agentic_devtools-0.2.8/tests/unit/state/test_is_dry_run.py +42 -0
  594. agentic_devtools-0.2.8/tests/unit/state/test_is_workflow_active.py +23 -0
  595. agentic_devtools-0.2.8/tests/unit/state/test_load_state.py +49 -0
  596. agentic_devtools-0.2.8/tests/unit/state/test_load_state_locked.py +11 -0
  597. agentic_devtools-0.2.8/tests/unit/state/test_save_state.py +27 -0
  598. agentic_devtools-0.2.8/tests/unit/state/test_save_state_locked.py +12 -0
  599. agentic_devtools-0.2.8/tests/unit/state/test_set_context_value.py +253 -0
  600. agentic_devtools-0.2.8/tests/unit/state/test_set_dry_run.py +15 -0
  601. agentic_devtools-0.2.8/tests/unit/state/test_set_pull_request_id.py +9 -0
  602. agentic_devtools-0.2.8/tests/unit/state/test_set_pypi_dry_run.py +15 -0
  603. agentic_devtools-0.2.8/tests/unit/state/test_set_pypi_package_name.py +9 -0
  604. agentic_devtools-0.2.8/tests/unit/state/test_set_pypi_repository.py +9 -0
  605. agentic_devtools-0.2.8/tests/unit/state/test_set_pypi_version.py +9 -0
  606. agentic_devtools-0.2.8/tests/unit/state/test_set_resolve_thread.py +15 -0
  607. agentic_devtools-0.2.8/tests/unit/state/test_set_thread_id.py +9 -0
  608. agentic_devtools-0.2.8/tests/unit/state/test_set_value.py +100 -0
  609. agentic_devtools-0.2.8/tests/unit/state/test_set_workflow_state.py +69 -0
  610. agentic_devtools-0.2.8/tests/unit/state/test_should_resolve_thread.py +42 -0
  611. agentic_devtools-0.2.8/tests/unit/state/test_update_workflow_context.py +25 -0
  612. agentic_devtools-0.2.8/tests/unit/state/test_update_workflow_step.py +37 -0
  613. agentic_devtools-0.2.8/tests/unit/state/test_workflow_state_integration.py +60 -0
  614. agentic_devtools-0.2.8/tests/unit/task_state/__init__.py +0 -0
  615. agentic_devtools-0.2.8/tests/unit/task_state/test_add_task.py +34 -0
  616. agentic_devtools-0.2.8/tests/unit/task_state/test_background_task.py +155 -0
  617. agentic_devtools-0.2.8/tests/unit/task_state/test_duration_seconds.py +75 -0
  618. agentic_devtools-0.2.8/tests/unit/task_state/test_from_dict_invalid_status.py +27 -0
  619. agentic_devtools-0.2.8/tests/unit/task_state/test_get_active_tasks.py +33 -0
  620. agentic_devtools-0.2.8/tests/unit/task_state/test_get_background_tasks.py +40 -0
  621. agentic_devtools-0.2.8/tests/unit/task_state/test_get_failed_most_recent_per_command.py +162 -0
  622. agentic_devtools-0.2.8/tests/unit/task_state/test_get_incomplete_most_recent_per_command.py +84 -0
  623. agentic_devtools-0.2.8/tests/unit/task_state/test_get_most_recent_tasks_per_command.py +50 -0
  624. agentic_devtools-0.2.8/tests/unit/task_state/test_get_other_incomplete_tasks.py +80 -0
  625. agentic_devtools-0.2.8/tests/unit/task_state/test_get_task_by_id.py +61 -0
  626. agentic_devtools-0.2.8/tests/unit/task_state/test_get_tasks_by_status.py +37 -0
  627. agentic_devtools-0.2.8/tests/unit/task_state/test_print_task_tracking_info.py +85 -0
  628. agentic_devtools-0.2.8/tests/unit/task_state/test_remove_task.py +61 -0
  629. agentic_devtools-0.2.8/tests/unit/task_state/test_sort_tasks.py +116 -0
  630. agentic_devtools-0.2.8/tests/unit/task_state/test_task_lifecycle.py +38 -0
  631. agentic_devtools-0.2.8/tests/unit/task_state/test_task_status.py +25 -0
  632. agentic_devtools-0.2.8/tests/unit/task_state/test_update_task.py +42 -0
  633. agentic_devtools-0.2.8/tests/vpn/test_vpn_runner.py +106 -0
  634. agentic_devtools-0.2.6/.github/copilot-instructions.md +0 -1328
  635. agentic_devtools-0.2.6/.github/workflows/auto-fix-on-failure.yml +0 -218
  636. agentic_devtools-0.2.6/.github/workflows/security-scan-on-merge.yml +0 -326
  637. agentic_devtools-0.2.6/CONTRIBUTING.md +0 -321
  638. agentic_devtools-0.2.6/PKG-INFO +0 -862
  639. agentic_devtools-0.2.6/README.md +0 -837
  640. agentic_devtools-0.2.6/agdt_ai_helpers/__init__.py +0 -34
  641. agentic_devtools-0.2.6/agentic_devtools/_version.py +0 -34
  642. agentic_devtools-0.2.6/agentic_devtools/background_tasks.py +0 -598
  643. agentic_devtools-0.2.6/agentic_devtools/cli/azure/app_insights_commands.py +0 -940
  644. agentic_devtools-0.2.6/agentic_devtools/cli/azure/auth.py +0 -180
  645. agentic_devtools-0.2.6/agentic_devtools/cli/azure_context/commands.py +0 -134
  646. agentic_devtools-0.2.6/agentic_devtools/cli/azure_context/management.py +0 -233
  647. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/async_commands.py +0 -1492
  648. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/commands.py +0 -728
  649. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/file_review_commands.py +0 -1038
  650. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/helpers.py +0 -561
  651. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/mark_reviewed.py +0 -756
  652. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/pipeline_commands.py +0 -724
  653. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/pr_summary_commands.py +0 -579
  654. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/pull_request_details_commands.py +0 -596
  655. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/review_commands.py +0 -700
  656. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/review_helpers.py +0 -191
  657. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/run_details_commands.py +0 -935
  658. agentic_devtools-0.2.6/agentic_devtools/cli/azure_devops/vpn_toggle.py +0 -1220
  659. agentic_devtools-0.2.6/agentic_devtools/cli/git/async_commands.py +0 -294
  660. agentic_devtools-0.2.6/agentic_devtools/cli/git/commands.py +0 -399
  661. agentic_devtools-0.2.6/agentic_devtools/cli/git/diff.py +0 -210
  662. agentic_devtools-0.2.6/agentic_devtools/cli/git/operations.py +0 -737
  663. agentic_devtools-0.2.6/agentic_devtools/cli/jira/async_commands.py +0 -439
  664. agentic_devtools-0.2.6/agentic_devtools/cli/jira/comment_commands.py +0 -141
  665. agentic_devtools-0.2.6/agentic_devtools/cli/jira/formatting.py +0 -131
  666. agentic_devtools-0.2.6/agentic_devtools/cli/jira/get_commands.py +0 -287
  667. agentic_devtools-0.2.6/agentic_devtools/cli/jira/helpers.py +0 -278
  668. agentic_devtools-0.2.6/agentic_devtools/cli/jira/parse_error_report.py +0 -352
  669. agentic_devtools-0.2.6/agentic_devtools/cli/jira/role_commands.py +0 -560
  670. agentic_devtools-0.2.6/agentic_devtools/cli/jira/update_commands.py +0 -222
  671. agentic_devtools-0.2.6/agentic_devtools/cli/jira/vpn_wrapper.py +0 -58
  672. agentic_devtools-0.2.6/agentic_devtools/cli/release/commands.py +0 -113
  673. agentic_devtools-0.2.6/agentic_devtools/cli/release/helpers.py +0 -113
  674. agentic_devtools-0.2.6/agentic_devtools/cli/runner.py +0 -374
  675. agentic_devtools-0.2.6/agentic_devtools/cli/subprocess_utils.py +0 -109
  676. agentic_devtools-0.2.6/agentic_devtools/cli/tasks/commands.py +0 -851
  677. agentic_devtools-0.2.6/agentic_devtools/cli/testing.py +0 -440
  678. agentic_devtools-0.2.6/agentic_devtools/cli/vpn/runner.py +0 -199
  679. agentic_devtools-0.2.6/agentic_devtools/cli/workflows/advancement.py +0 -204
  680. agentic_devtools-0.2.6/agentic_devtools/cli/workflows/base.py +0 -240
  681. agentic_devtools-0.2.6/agentic_devtools/cli/workflows/checklist.py +0 -278
  682. agentic_devtools-0.2.6/agentic_devtools/cli/workflows/commands.py +0 -1610
  683. agentic_devtools-0.2.6/agentic_devtools/cli/workflows/manager.py +0 -845
  684. agentic_devtools-0.2.6/agentic_devtools/cli/workflows/preflight.py +0 -323
  685. agentic_devtools-0.2.6/agentic_devtools/cli/workflows/worktree_setup.py +0 -1036
  686. agentic_devtools-0.2.6/agentic_devtools/prompts/loader.py +0 -377
  687. agentic_devtools-0.2.6/agentic_devtools/state.py +0 -754
  688. agentic_devtools-0.2.6/agentic_devtools/task_state.py +0 -902
  689. agentic_devtools-0.2.6/pyproject.toml +0 -178
  690. agentic_devtools-0.2.6/scripts/scaffold_tests.py +0 -222
  691. agentic_devtools-0.2.6/scripts/validate_test_structure.py +0 -88
  692. agentic_devtools-0.2.6/scripts/verify-agent-coverage.py +0 -109
  693. agentic_devtools-0.2.6/tests/README.md +0 -53
  694. agentic_devtools-0.2.6/tests/azure_context/test_commands.py +0 -166
  695. agentic_devtools-0.2.6/tests/azure_context/test_management.py +0 -261
  696. agentic_devtools-0.2.6/tests/azure_devops/conftest.py +0 -43
  697. agentic_devtools-0.2.6/tests/azure_devops/test_config.py +0 -386
  698. agentic_devtools-0.2.6/tests/cli/test_azure_app_insights_commands.py +0 -737
  699. agentic_devtools-0.2.6/tests/cli/test_azure_auth.py +0 -174
  700. agentic_devtools-0.2.6/tests/cli/test_runner.py +0 -383
  701. agentic_devtools-0.2.6/tests/conftest.py +0 -78
  702. agentic_devtools-0.2.6/tests/e2e_smoke/conftest.py +0 -161
  703. agentic_devtools-0.2.6/tests/e2e_smoke/test_azure_devops_commands_e2e.py +0 -84
  704. agentic_devtools-0.2.6/tests/e2e_smoke/test_git_commands_e2e.py +0 -117
  705. agentic_devtools-0.2.6/tests/e2e_smoke/test_jira_commands_e2e.py +0 -288
  706. agentic_devtools-0.2.6/tests/network/test_detection.py +0 -134
  707. agentic_devtools-0.2.6/tests/test_background_tasks.py +0 -344
  708. agentic_devtools-0.2.6/tests/test_checklist.py +0 -429
  709. agentic_devtools-0.2.6/tests/test_checklist_commands.py +0 -379
  710. agentic_devtools-0.2.6/tests/test_cli_state.py +0 -258
  711. agentic_devtools-0.2.6/tests/test_file_locking.py +0 -290
  712. agentic_devtools-0.2.6/tests/test_file_locking_platform.py +0 -234
  713. agentic_devtools-0.2.6/tests/test_git_commands.py +0 -616
  714. agentic_devtools-0.2.6/tests/test_git_operations.py +0 -1001
  715. agentic_devtools-0.2.6/tests/test_jira_adf.py +0 -319
  716. agentic_devtools-0.2.6/tests/test_jira_async.py +0 -324
  717. agentic_devtools-0.2.6/tests/test_jira_commands.py +0 -1685
  718. agentic_devtools-0.2.6/tests/test_jira_config.py +0 -138
  719. agentic_devtools-0.2.6/tests/test_jira_formatting.py +0 -209
  720. agentic_devtools-0.2.6/tests/test_jira_helpers.py +0 -575
  721. agentic_devtools-0.2.6/tests/test_jira_state.py +0 -60
  722. agentic_devtools-0.2.6/tests/test_jira_update_commands.py +0 -261
  723. agentic_devtools-0.2.6/tests/test_parse_error_report.py +0 -513
  724. agentic_devtools-0.2.6/tests/test_preflight.py +0 -414
  725. agentic_devtools-0.2.6/tests/test_prompt_loader.py +0 -402
  726. agentic_devtools-0.2.6/tests/test_release_commands.py +0 -180
  727. agentic_devtools-0.2.6/tests/test_release_helpers.py +0 -109
  728. agentic_devtools-0.2.6/tests/test_release_integration.py +0 -98
  729. agentic_devtools-0.2.6/tests/test_review_jira.py +0 -576
  730. agentic_devtools-0.2.6/tests/test_review_prompts.py +0 -384
  731. agentic_devtools-0.2.6/tests/test_role_commands.py +0 -1272
  732. agentic_devtools-0.2.6/tests/test_state.py +0 -1131
  733. agentic_devtools-0.2.6/tests/test_subprocess_utils.py +0 -163
  734. agentic_devtools-0.2.6/tests/test_task_state.py +0 -1034
  735. agentic_devtools-0.2.6/tests/test_tasks_commands.py +0 -1185
  736. agentic_devtools-0.2.6/tests/test_testing.py +0 -374
  737. agentic_devtools-0.2.6/tests/test_version.py +0 -42
  738. agentic_devtools-0.2.6/tests/test_vpn_wrapper.py +0 -171
  739. agentic_devtools-0.2.6/tests/test_workflow_advancement.py +0 -275
  740. agentic_devtools-0.2.6/tests/test_workflow_commands.py +0 -2230
  741. agentic_devtools-0.2.6/tests/test_workflow_prompt.py +0 -507
  742. agentic_devtools-0.2.6/tests/test_workflow_state.py +0 -277
  743. agentic_devtools-0.2.6/tests/test_worktree_setup.py +0 -1636
  744. agentic_devtools-0.2.6/tests/vpn/test_vpn_runner.py +0 -110
  745. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.devcontainer/README.md +0 -0
  746. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.devcontainer/devcontainer.json +0 -0
  747. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.dfly-temp/background-tasks/all-background-tasks.json +0 -0
  748. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.dfly-temp/dfly-state.json +0 -0
  749. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/MARKDOWN_LINTING.md +0 -0
  750. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/.markdownlint.json +0 -0
  751. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.apply-pr-suggestions.initiate.agent.md +0 -0
  752. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.create-jira-epic.initiate.agent.md +0 -0
  753. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.create-jira-issue.initiate.agent.md +0 -0
  754. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.create-jira-subtask.initiate.agent.md +0 -0
  755. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.pull-request-review.completion.agent.md +0 -0
  756. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.pull-request-review.decision.agent.md +0 -0
  757. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.pull-request-review.file-review.agent.md +0 -0
  758. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.pull-request-review.initiate.agent.md +0 -0
  759. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.pull-request-review.summary.agent.md +0 -0
  760. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.update-jira-issue.initiate.agent.md +0 -0
  761. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.checklist-creation.agent.md +0 -0
  762. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.commit.agent.md +0 -0
  763. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.completion.agent.md +0 -0
  764. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.implementation-review.agent.md +0 -0
  765. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.implementation.agent.md +0 -0
  766. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.initiate.agent.md +0 -0
  767. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.planning.agent.md +0 -0
  768. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.pull-request.agent.md +0 -0
  769. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.retrieve.agent.md +0 -0
  770. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.setup.agent.md +0 -0
  771. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/agdt.work-on-jira-issue.verification.agent.md +0 -0
  772. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/copilot-instructions.md +0 -0
  773. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/security-scan.agent.md +0 -0
  774. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/senior-python-developer.md +0 -0
  775. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.analyze.agent.md +0 -0
  776. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.checklist.agent.md +0 -0
  777. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.clarify.agent.md +0 -0
  778. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.constitution.agent.md +0 -0
  779. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.implement.agent.md +0 -0
  780. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.plan.agent.md +0 -0
  781. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.specify.agent.md +0 -0
  782. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.tasks.agent.md +0 -0
  783. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/agents/speckit.taskstoissues.agent.md +0 -0
  784. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/.markdownlint.json +0 -0
  785. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.apply-pr-suggestions.initiate.prompt.md +0 -0
  786. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.create-jira-epic.initiate.prompt.md +0 -0
  787. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.create-jira-issue.initiate.prompt.md +0 -0
  788. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.create-jira-subtask.initiate.prompt.md +0 -0
  789. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.pull-request-review.completion.prompt.md +0 -0
  790. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.pull-request-review.decision.prompt.md +0 -0
  791. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.pull-request-review.file-review.prompt.md +0 -0
  792. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.pull-request-review.initiate.prompt.md +0 -0
  793. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.pull-request-review.summary.prompt.md +0 -0
  794. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.update-jira-issue.initiate.prompt.md +0 -0
  795. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.checklist-creation.prompt.md +0 -0
  796. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.commit.prompt.md +0 -0
  797. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.completion.prompt.md +0 -0
  798. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.implementation-review.prompt.md +0 -0
  799. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.implementation.prompt.md +0 -0
  800. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.initiate.prompt.md +0 -0
  801. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.planning.prompt.md +0 -0
  802. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.pull-request.prompt.md +0 -0
  803. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.retrieve.prompt.md +0 -0
  804. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.setup.prompt.md +0 -0
  805. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/agdt.work-on-jira-issue.verification.prompt.md +0 -0
  806. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.analyze.prompt.md +0 -0
  807. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.checklist.prompt.md +0 -0
  808. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.clarify.prompt.md +0 -0
  809. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.constitution.prompt.md +0 -0
  810. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.implement.prompt.md +0 -0
  811. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.plan.prompt.md +0 -0
  812. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.specify.prompt.md +0 -0
  813. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.tasks.prompt.md +0 -0
  814. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/prompts/speckit.taskstoissues.prompt.md +0 -0
  815. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/check-idempotency.sh +0 -0
  816. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/create-spec-pr.sh +0 -0
  817. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/generate-spec-from-issue.sh +0 -0
  818. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/post-issue-comment.sh +0 -0
  819. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/sanitize-branch-name.sh +0 -0
  820. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/templates/.markdownlint.json +0 -0
  821. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/templates/already-processed.md +0 -0
  822. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/templates/completed.md +0 -0
  823. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/templates/failed.md +0 -0
  824. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/scripts/speckit-trigger/templates/started.md +0 -0
  825. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/README.md +0 -0
  826. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/lint.yml +0 -0
  827. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/publish.yml +0 -0
  828. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/release.yml +0 -0
  829. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/check-release-exists.sh +0 -0
  830. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/create-github-release.sh +0 -0
  831. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/create-release-packages.ps1 +0 -0
  832. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/create-release-packages.sh +0 -0
  833. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/generate-release-notes.sh +0 -0
  834. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/get-next-version.sh +0 -0
  835. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/scripts/update-version.sh +0 -0
  836. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/speckit-issue-trigger.yml +0 -0
  837. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.github/workflows/test.yml +0 -0
  838. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.gitignore +0 -0
  839. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.markdownlint-cli2.jsonc +0 -0
  840. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.markdownlint.json +0 -0
  841. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.push-trigger +0 -0
  842. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/SDD_QUICK_REFERENCE.md +0 -0
  843. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/memory/constitution.md +0 -0
  844. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  845. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/bash/common.sh +0 -0
  846. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/bash/create-new-feature.sh +0 -0
  847. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/bash/setup-plan.sh +0 -0
  848. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/bash/update-agent-context.sh +0 -0
  849. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/powershell/check-prerequisites.ps1 +0 -0
  850. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/powershell/common.ps1 +0 -0
  851. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/powershell/create-new-feature.ps1 +0 -0
  852. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/powershell/setup-plan.ps1 +0 -0
  853. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/scripts/powershell/update-agent-context.ps1 +0 -0
  854. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/agent-file-template.md +0 -0
  855. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/checklist-template.md +0 -0
  856. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/.markdownlint.json +0 -0
  857. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/analyze.md +0 -0
  858. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/checklist.md +0 -0
  859. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/clarify.md +0 -0
  860. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/constitution.md +0 -0
  861. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/implement.md +0 -0
  862. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/plan.md +0 -0
  863. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/specify.md +0 -0
  864. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/tasks.md +0 -0
  865. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/commands/taskstoissues.md +0 -0
  866. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/plan-template.md +0 -0
  867. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/spec-template.md +0 -0
  868. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/tasks-template.md +0 -0
  869. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.specify/templates/vscode-settings.json +0 -0
  870. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/.work-folder-info +0 -0
  871. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/CHANGELOG.md +0 -0
  872. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/LICENSE +0 -0
  873. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/PR_DESCRIPTION.md +0 -0
  874. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/PR_INSTRUCTIONS.md +0 -0
  875. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/RELEASING.md +0 -0
  876. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/SECURITY_SCANNING.md +0 -0
  877. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/SOLUTION_SUMMARY.md +0 -0
  878. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/SPEC_DRIVEN_DEVELOPMENT.md +0 -0
  879. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/__init__.py +0 -0
  880. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/__init__.py +0 -0
  881. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure/__init__.py +0 -0
  882. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure/config.py +0 -0
  883. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_context/__init__.py +0 -0
  884. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_context/config.py +0 -0
  885. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_devops/__init__.py +0 -0
  886. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_devops/auth.py +0 -0
  887. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_devops/config.py +0 -0
  888. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_devops/review_jira.py +0 -0
  889. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/azure_devops/review_prompts.py +0 -0
  890. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/git/__init__.py +0 -0
  891. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/git/core.py +0 -0
  892. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/__init__.py +0 -0
  893. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/adf.py +0 -0
  894. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/async_status.py +0 -0
  895. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/commands.py +0 -0
  896. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/config.py +0 -0
  897. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/create_commands.py +0 -0
  898. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/jira/state_helpers.py +0 -0
  899. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/network/__init__.py +0 -0
  900. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/network/commands.py +0 -0
  901. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/network/detection.py +0 -0
  902. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/release/__init__.py +0 -0
  903. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/state.py +0 -0
  904. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/tasks/__init__.py +0 -0
  905. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/vpn/__init__.py +0 -0
  906. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/vpn/commands.py +0 -0
  907. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/cli/workflows/__init__.py +0 -0
  908. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/file_locking.py +0 -0
  909. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/__init__.py +0 -0
  910. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/apply-pull-request-review-suggestions/default-initiate-prompt.md +0 -0
  911. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/create-jira-epic/default-initiate-prompt.md +0 -0
  912. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/create-jira-issue/default-initiate-prompt.md +0 -0
  913. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/create-jira-subtask/default-initiate-prompt.md +0 -0
  914. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/pull-request-review/default-completion-prompt.md +0 -0
  915. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/pull-request-review/default-decision-prompt.md +0 -0
  916. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/pull-request-review/default-file-review-prompt.md +0 -0
  917. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/pull-request-review/default-initiate-prompt.md +0 -0
  918. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/pull-request-review/default-summary-prompt.md +0 -0
  919. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/update-jira-issue/default-initiate-prompt.md +0 -0
  920. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-checklist-creation-prompt.md +0 -0
  921. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-commit-prompt.md +0 -0
  922. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-completion-prompt.md +0 -0
  923. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-implementation-prompt.md +0 -0
  924. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-implementation-review-prompt.md +0 -0
  925. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-initiate-prompt.md +0 -0
  926. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-planning-prompt.md +0 -0
  927. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-pull-request-prompt.md +0 -0
  928. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-retrieve-prompt.md +0 -0
  929. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-setup-prompt.md +0 -0
  930. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/agentic_devtools/prompts/work-on-jira-issue/default-verification-prompt.md +0 -0
  931. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/ayaiay.json +0 -0
  932. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/01-introduction-and-goals.md +0 -0
  933. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/02-architecture-constraints.md +0 -0
  934. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/03-system-context.md +0 -0
  935. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/04-solution-strategy.md +0 -0
  936. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/05-building-blocks.md +0 -0
  937. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/06-runtime-view.md +0 -0
  938. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/07-deployment-view.md +0 -0
  939. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/08-cross-cutting-concepts.md +0 -0
  940. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/09-architecture-decisions.md +0 -0
  941. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/10-quality-requirements.md +0 -0
  942. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/11-risks-and-technical-debt.md +0 -0
  943. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/12-glossary.md +0 -0
  944. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/docs/README.md +0 -0
  945. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-add-workflow-step-agents/checklists/requirements.md +0 -0
  946. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-add-workflow-step-agents/plan.md +0 -0
  947. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-add-workflow-step-agents/spec.md +0 -0
  948. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-add-workflow-step-agents/tasks.md +0 -0
  949. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-pypi-wheel-release/checklists/requirements.md +0 -0
  950. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-pypi-wheel-release/plan.md +0 -0
  951. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-pypi-wheel-release/spec.md +0 -0
  952. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-pypi-wheel-release/tasks.md +0 -0
  953. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-separate-docs/checklists/requirements.md +0 -0
  954. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-separate-docs/plan.md +0 -0
  955. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-separate-docs/spec.md +0 -0
  956. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/001-separate-docs/tasks.md +0 -0
  957. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/002-github-action-speckit-trigger/checklists/requirements.md +0 -0
  958. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/002-github-action-speckit-trigger/plan.md +0 -0
  959. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/002-github-action-speckit-trigger/spec.md +0 -0
  960. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/002-github-action-speckit-trigger/tasks.md +0 -0
  961. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/002-github-action-speckit-trigger/workflow-sequence-diagram.md +0 -0
  962. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/003-comprehensive-e2e-smoke-tests/checklists/requirements.md +0 -0
  963. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/003-comprehensive-e2e-smoke-tests/spec.md +0 -0
  964. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/003-e2e-smoke-tests-cli/plan.md +0 -0
  965. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/specs/README.md +0 -0
  966. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/__init__.py +0 -0
  967. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_context/__init__.py +0 -0
  968. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_context/test_config.py +0 -0
  969. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/__init__.py +0 -0
  970. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_async_commands.py +0 -0
  971. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_auth.py +0 -0
  972. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_commands_api.py +0 -0
  973. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_commands_dry_run.py +0 -0
  974. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_file_review_commands.py +0 -0
  975. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_helpers.py +0 -0
  976. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_mark_reviewed.py +0 -0
  977. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_pipeline_commands.py +0 -0
  978. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_pr_summary_commands.py +0 -0
  979. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_pull_request_details_commands.py +0 -0
  980. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_review_commands.py +0 -0
  981. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_run_details_commands.py +0 -0
  982. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/azure_devops/test_vpn_toggle.py +0 -0
  983. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/cli/test_azure_config.py +0 -0
  984. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/e2e_smoke/README.md +0 -0
  985. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/e2e_smoke/__init__.py +0 -0
  986. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/e2e_smoke/fixtures/cassettes/azure_devops_create_pr.yaml +0 -0
  987. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/e2e_smoke/fixtures/cassettes/jira_add_comment.yaml +0 -0
  988. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/e2e_smoke/fixtures/cassettes/jira_get_issue.yaml +0 -0
  989. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/network/test_network_cli.py +0 -0
  990. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_file_review_commands.py +0 -0
  991. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_file_review_queue_management.py +0 -0
  992. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_git_async.py +0 -0
  993. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_git_core.py +0 -0
  994. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_git_diff.py +0 -0
  995. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_git_utilities.py +0 -0
  996. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/test_scaffold_tests.py +0 -0
  997. {agentic_devtools-0.2.6 → agentic_devtools-0.2.8}/tests/vpn/test_vpn_commands.py +0 -0
  998. {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