titan-cli 0.4.2__tar.gz → 0.4.4__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 (353) hide show
  1. {titan_cli-0.4.2 → titan_cli-0.4.4}/PKG-INFO +1 -1
  2. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/create_worktree_step.py +4 -0
  3. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/remove_worktree_step.py +4 -0
  4. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/worktree_command_step.py +8 -0
  5. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/plugin.py +8 -0
  6. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/steps/github_prompt_steps.py +21 -0
  7. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/steps/issue_steps.py +30 -0
  8. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/steps/preview_step.py +8 -0
  9. titan_cli-0.4.4/plugins/titan-plugin-github/titan_plugin_github/steps/pull_request_steps.py +199 -0
  10. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/clients/jira_client.py +59 -0
  11. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/issue_service.py +87 -0
  12. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/metadata_service.py +70 -0
  13. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/messages.py +23 -0
  14. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/operations/__init__.py +12 -0
  15. titan_cli-0.4.4/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_management_operations.py +33 -0
  16. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/plugin.py +16 -0
  17. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/ai_analyze_issue_step.py +5 -0
  18. titan_cli-0.4.4/plugins/titan-plugin-jira/titan_plugin_jira/steps/issue_management_steps.py +399 -0
  19. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/prompt_select_issue_step.py +4 -0
  20. {titan_cli-0.4.2 → titan_cli-0.4.4}/pyproject.toml +1 -1
  21. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/utils/autoupdate.py +20 -2
  22. {titan_cli-0.4.2 → titan_cli-0.4.4}/LICENSE +0 -0
  23. {titan_cli-0.4.2 → titan_cli-0.4.4}/README.md +0 -0
  24. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/__init__.py +0 -0
  25. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/__init__.py +0 -0
  26. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/git_client.py +0 -0
  27. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/network/__init__.py +0 -0
  28. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/network/git_network.py +0 -0
  29. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/services/__init__.py +0 -0
  30. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/services/branch_service.py +0 -0
  31. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/services/commit_service.py +0 -0
  32. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/services/diff_service.py +0 -0
  33. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/services/remote_service.py +0 -0
  34. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/services/stash_service.py +0 -0
  35. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/services/status_service.py +0 -0
  36. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/services/tag_service.py +0 -0
  37. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/clients/services/worktree_service.py +0 -0
  38. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/exceptions.py +0 -0
  39. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/messages.py +0 -0
  40. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/__init__.py +0 -0
  41. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/__init__.py +0 -0
  42. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/branch_mapper.py +0 -0
  43. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/commit_mapper.py +0 -0
  44. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/status_mapper.py +0 -0
  45. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/tag_mapper.py +0 -0
  46. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/worktree_mapper.py +0 -0
  47. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/network/__init__.py +0 -0
  48. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/network/branch.py +0 -0
  49. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/network/commit.py +0 -0
  50. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/network/status.py +0 -0
  51. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/network/tag.py +0 -0
  52. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/network/worktree.py +0 -0
  53. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/view/__init__.py +0 -0
  54. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/view/branch.py +0 -0
  55. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/view/commit.py +0 -0
  56. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/view/status.py +0 -0
  57. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/view/tag.py +0 -0
  58. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/models/view/worktree.py +0 -0
  59. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/operations/__init__.py +0 -0
  60. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/operations/branch_operations.py +0 -0
  61. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/operations/commit_operations.py +0 -0
  62. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/operations/diff_operations.py +0 -0
  63. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/plugin.py +0 -0
  64. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/__init__.py +0 -0
  65. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/ai_commit_message_step.py +0 -0
  66. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/branch_steps.py +0 -0
  67. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/checkout_step.py +0 -0
  68. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/commit_step.py +0 -0
  69. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/create_branch_step.py +0 -0
  70. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/diff_summary_step.py +0 -0
  71. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/pull_step.py +0 -0
  72. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/push_step.py +0 -0
  73. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/restore_original_branch_step.py +0 -0
  74. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/save_current_branch_step.py +0 -0
  75. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/steps/status_step.py +0 -0
  76. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/__init__.py +0 -0
  77. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/commit_ai_preview.py +0 -0
  78. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-git/titan_plugin_git/workflows/commit-ai.yaml +0 -0
  79. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/__init__.py +0 -0
  80. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/agents/__init__.py +0 -0
  81. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/agents/code_review_agent.py +0 -0
  82. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/agents/config_loader.py +0 -0
  83. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/agents/issue_generator.py +0 -0
  84. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/agents/pr_agent.py +0 -0
  85. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/checklists/__init__.py +0 -0
  86. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/checklists/defaults.py +0 -0
  87. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/__init__.py +0 -0
  88. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/github_client.py +0 -0
  89. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/network/__init__.py +0 -0
  90. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/network/gh_network.py +0 -0
  91. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_network.py +0 -0
  92. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_queries.py +0 -0
  93. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/protocols.py +0 -0
  94. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/services/__init__.py +0 -0
  95. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/services/issue_service.py +0 -0
  96. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/services/pr_service.py +0 -0
  97. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/services/release_service.py +0 -0
  98. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/services/review_service.py +0 -0
  99. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/clients/services/team_service.py +0 -0
  100. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/config/__init__.py +0 -0
  101. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/config/pr_agent.toml +0 -0
  102. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/exceptions.py +0 -0
  103. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/managers/__init__.py +0 -0
  104. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/managers/checklist_manager.py +0 -0
  105. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/managers/diff_context_manager.py +0 -0
  106. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/messages.py +0 -0
  107. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/__init__.py +0 -0
  108. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/diff_models.py +0 -0
  109. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/formatting.py +0 -0
  110. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/__init__.py +0 -0
  111. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/comment_mapper.py +0 -0
  112. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/issue_mapper.py +0 -0
  113. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/pr_mapper.py +0 -0
  114. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/release_mapper.py +0 -0
  115. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/review_mapper.py +0 -0
  116. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/thread_mapper.py +0 -0
  117. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/__init__.py +0 -0
  118. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/__init__.py +0 -0
  119. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/issue_comment.py +0 -0
  120. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_comment.py +0 -0
  121. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_thread.py +0 -0
  122. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/user.py +0 -0
  123. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/__init__.py +0 -0
  124. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/issue.py +0 -0
  125. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/pull_request.py +0 -0
  126. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/release.py +0 -0
  127. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/review.py +0 -0
  128. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/user.py +0 -0
  129. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/review_enums.py +0 -0
  130. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/review_models.py +0 -0
  131. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/validators.py +0 -0
  132. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/models/view.py +0 -0
  133. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/__init__.py +0 -0
  134. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/code_review_operations.py +0 -0
  135. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/comment_operations.py +0 -0
  136. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/context_resolution_operations.py +0 -0
  137. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/findings_operations.py +0 -0
  138. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/issue_operations.py +0 -0
  139. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/manifest_operations.py +0 -0
  140. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/plan_prompt_operations.py +0 -0
  141. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/pr_creation_operations.py +0 -0
  142. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/pr_operations.py +0 -0
  143. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/review_action_operations.py +0 -0
  144. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/thread_resolution_operations.py +0 -0
  145. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/operations/worktree_operations.py +0 -0
  146. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/steps/__init__.py +0 -0
  147. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/steps/ai_pr_step.py +0 -0
  148. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/steps/code_review_steps.py +0 -0
  149. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/steps/create_pr_step.py +0 -0
  150. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/steps/pr_review_steps.py +0 -0
  151. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/steps/select_cli_step.py +0 -0
  152. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/steps/worktree_steps.py +0 -0
  153. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/utils.py +0 -0
  154. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/widgets/__init__.py +0 -0
  155. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/widgets/code_block.py +0 -0
  156. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_thread.py +0 -0
  157. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_utils.py +0 -0
  158. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_view.py +0 -0
  159. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/widgets/reply_comment.py +0 -0
  160. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/__init__.py +0 -0
  161. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/create_pr_ai_preview.py +0 -0
  162. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-issue-ai.yaml +0 -0
  163. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-pr-ai.yaml +0 -0
  164. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/workflows/respond-pr-comments.yaml +0 -0
  165. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr-new-findings.yaml.disabled +0 -0
  166. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr-thread-resolution.yaml.disabled +0 -0
  167. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/__init__.py +0 -0
  168. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/agents/__init__.py +0 -0
  169. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/agents/config_loader.py +0 -0
  170. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/agents/jira_agent.py +0 -0
  171. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/agents/prompts.py +0 -0
  172. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/agents/response_parser.py +0 -0
  173. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/agents/token_tracker.py +0 -0
  174. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/agents/validators.py +0 -0
  175. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/clients/__init__.py +0 -0
  176. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/__init__.py +0 -0
  177. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/jira_network.py +0 -0
  178. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/__init__.py +0 -0
  179. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/comment_service.py +0 -0
  180. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/link_service.py +0 -0
  181. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/project_service.py +0 -0
  182. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/transition_service.py +0 -0
  183. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/config/jira_agent.toml +0 -0
  184. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/config/templates/generic_issue.md.j2 +0 -0
  185. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/config/templates/issue_analysis.md.j2 +0 -0
  186. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/constants/__init__.py +0 -0
  187. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/constants/defaults.py +0 -0
  188. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/constants/messages.py +0 -0
  189. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/constants/templates.py +0 -0
  190. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/constants.py +0 -0
  191. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/exceptions.py +0 -0
  192. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/__init__.py +0 -0
  193. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/markdown_formatter.py +0 -0
  194. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/__init__.py +0 -0
  195. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/enums.py +0 -0
  196. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/formatting.py +0 -0
  197. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/__init__.py +0 -0
  198. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/comment_mapper.py +0 -0
  199. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_mapper.py +0 -0
  200. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_type_mapper.py +0 -0
  201. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/priority_mapper.py +0 -0
  202. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/project_mapper.py +0 -0
  203. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/status_mapper.py +0 -0
  204. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/transition_mapper.py +0 -0
  205. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/user_mapper.py +0 -0
  206. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/version_mapper.py +0 -0
  207. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/__init__.py +0 -0
  208. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/comment.py +0 -0
  209. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue.py +0 -0
  210. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue_type.py +0 -0
  211. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/priority.py +0 -0
  212. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/project.py +0 -0
  213. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/status.py +0 -0
  214. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/transition.py +0 -0
  215. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/user.py +0 -0
  216. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/version.py +0 -0
  217. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/models/view.py +0 -0
  218. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_formatting_operations.py +0 -0
  219. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_operations.py +0 -0
  220. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/operations/jql_operations.py +0 -0
  221. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/ai_enhance_issue_description_step.py +0 -0
  222. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/confirm_auto_assign_step.py +0 -0
  223. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/create_generic_issue_step.py +0 -0
  224. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/get_issue_step.py +0 -0
  225. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/list_versions_step.py +0 -0
  226. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/prompt_issue_description_step.py +0 -0
  227. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/review_issue_description_step.py +0 -0
  228. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_jql_step.py +0 -0
  229. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_saved_query_step.py +0 -0
  230. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_priority_step.py +0 -0
  231. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_type_step.py +0 -0
  232. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/utils/__init__.py +0 -0
  233. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/utils/input_validation.py +0 -0
  234. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/utils/issue_sorter.py +0 -0
  235. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/utils/saved_queries.py +0 -0
  236. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/utils.py +0 -0
  237. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/analyze-jira-issues.yaml +0 -0
  238. {titan_cli-0.4.2 → titan_cli-0.4.4}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/create-generic-issue.yaml +0 -0
  239. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/__init__.py +0 -0
  240. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/__main__.py +0 -0
  241. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/__init__.py +0 -0
  242. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/agents/__init__.py +0 -0
  243. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/agents/base.py +0 -0
  244. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/client.py +0 -0
  245. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/constants.py +0 -0
  246. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/dependencies.py +0 -0
  247. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/exceptions.py +0 -0
  248. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/litellm_client.py +0 -0
  249. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/llm_tools.py +0 -0
  250. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/models.py +0 -0
  251. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/oauth_helper.py +0 -0
  252. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/providers/__init__.py +0 -0
  253. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/providers/anthropic.py +0 -0
  254. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/providers/base.py +0 -0
  255. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/providers/gemini.py +0 -0
  256. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/providers/litellm.py +0 -0
  257. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ai/providers/openai.py +0 -0
  258. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/cli.py +0 -0
  259. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/clients/__init__.py +0 -0
  260. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/clients/gcloud_client.py +0 -0
  261. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/__init__.py +0 -0
  262. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/config.py +0 -0
  263. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/discovery.py +0 -0
  264. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/errors.py +0 -0
  265. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/logging/__init__.py +0 -0
  266. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/logging/config.py +0 -0
  267. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/logging/decorators.py +0 -0
  268. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/migrations/__init__.py +0 -0
  269. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/migrations/base.py +0 -0
  270. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/migrations/legacy_to_v1.py +0 -0
  271. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/migrations/manager.py +0 -0
  272. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/models/__init__.py +0 -0
  273. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/models/code_review.py +0 -0
  274. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/plugins/available.py +0 -0
  275. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/plugins/community_sources.py +0 -0
  276. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/plugins/local_sources.py +0 -0
  277. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/plugins/models.py +0 -0
  278. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/plugins/plugin_base.py +0 -0
  279. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/plugins/plugin_registry.py +0 -0
  280. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/plugins/runtime.py +0 -0
  281. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/result.py +0 -0
  282. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/secrets.py +0 -0
  283. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/utils.py +0 -0
  284. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/validators/__init__.py +0 -0
  285. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/workflows/__init__.py +0 -0
  286. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/workflows/models.py +0 -0
  287. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/workflows/project_step_source.py +0 -0
  288. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/workflows/workflow_exceptions.py +0 -0
  289. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/workflows/workflow_filter_service.py +0 -0
  290. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/workflows/workflow_registry.py +0 -0
  291. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/core/workflows/workflow_sources.py +0 -0
  292. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/engine/__init__.py +0 -0
  293. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/engine/builder.py +0 -0
  294. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/engine/context.py +0 -0
  295. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/engine/mock_context.py +0 -0
  296. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/engine/results.py +0 -0
  297. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/engine/steps/ai_assistant_step.py +0 -0
  298. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/engine/steps/command_step.py +0 -0
  299. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/engine/utils/__init__.py +0 -0
  300. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/engine/utils/venv.py +0 -0
  301. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/engine/workflow_executor.py +0 -0
  302. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/external_cli/__init__.py +0 -0
  303. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/external_cli/adapters/__init__.py +0 -0
  304. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/external_cli/adapters/base.py +0 -0
  305. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/external_cli/adapters/claude.py +0 -0
  306. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/external_cli/adapters/codex.py +0 -0
  307. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/external_cli/adapters/gemini.py +0 -0
  308. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/external_cli/adapters/registry.py +0 -0
  309. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/external_cli/configs.py +0 -0
  310. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/external_cli/launcher.py +0 -0
  311. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/messages.py +0 -0
  312. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/__init__.py +0 -0
  313. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/__previews__/statusbar_preview.py +0 -0
  314. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/app.py +0 -0
  315. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/colors.py +0 -0
  316. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/icons.py +0 -0
  317. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/__init__.py +0 -0
  318. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/ai_config.py +0 -0
  319. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/ai_config_wizard.py +0 -0
  320. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/base.py +0 -0
  321. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/cli_launcher.py +0 -0
  322. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/global_setup_wizard.py +0 -0
  323. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/install_plugin_screen.py +0 -0
  324. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/main_menu.py +0 -0
  325. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/plugin_config_wizard.py +0 -0
  326. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/plugin_management.py +0 -0
  327. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/project_setup_wizard.py +0 -0
  328. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/workflow_execution.py +0 -0
  329. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/screens/workflows.py +0 -0
  330. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/textual_components.py +0 -0
  331. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/textual_workflow_executor.py +0 -0
  332. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/theme.py +0 -0
  333. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/__init__.py +0 -0
  334. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/button.py +0 -0
  335. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/decision_badge.py +0 -0
  336. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/dev_source_path_modal.py +0 -0
  337. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/header.py +0 -0
  338. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/multiline_input.py +0 -0
  339. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/panel.py +0 -0
  340. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/panel_container.py +0 -0
  341. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/prompt_choice.py +0 -0
  342. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/prompt_input.py +0 -0
  343. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/prompt_option_list.py +0 -0
  344. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/prompt_selection_list.py +0 -0
  345. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/prompt_textarea.py +0 -0
  346. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/segmented_switch.py +0 -0
  347. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/status_bar.py +0 -0
  348. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/step_container.py +0 -0
  349. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/styled_option_list.py +0 -0
  350. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/table.py +0 -0
  351. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/text.py +0 -0
  352. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/ui/tui/widgets/wizard.py +0 -0
  353. {titan_cli-0.4.2 → titan_cli-0.4.4}/titan_cli/utils/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: titan-cli
3
- Version: 0.4.2
3
+ Version: 0.4.4
4
4
  Summary: Modular development tools orchestrator - Streamline your workflows with AI integration and intuitive terminal UI
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -30,6 +30,10 @@ def create_worktree(ctx: WorkflowContext) -> WorkflowResult:
30
30
  worktree_path: Path to the created worktree
31
31
  base_branch: Base branch name (e.g., "develop" or "main")
32
32
 
33
+ Returns:
34
+ Success: If the worktree is created successfully.
35
+ Error: If the Git client is unavailable or worktree creation fails.
36
+
33
37
  Example:
34
38
  ```yaml
35
39
  - name: "Create Worktree"
@@ -21,6 +21,10 @@ def remove_worktree(ctx: WorkflowContext) -> WorkflowResult:
21
21
  path: Path to the worktree to remove (required, or uses worktree_path from context)
22
22
  force: Force removal even if worktree has uncommitted changes (default: false)
23
23
 
24
+ Returns:
25
+ Success: If the worktree is removed successfully or is already gone.
26
+ Error: If cleanup fails.
27
+
24
28
  Example:
25
29
  ```yaml
26
30
  - name: "Cleanup Worktree"
@@ -18,6 +18,10 @@ def worktree_commit(ctx: WorkflowContext) -> WorkflowResult:
18
18
  message: Commit message (required)
19
19
  add_all: Stage all changes before committing (default: true)
20
20
 
21
+ Returns:
22
+ Success: If the commit is created in the worktree.
23
+ Error: If required context is missing or the git command fails.
24
+
21
25
  Example:
22
26
  ```yaml
23
27
  - name: "Commit in Worktree"
@@ -105,6 +109,10 @@ def worktree_push(ctx: WorkflowContext) -> WorkflowResult:
105
109
  branch: Branch to push (optional, pushes current branch if not specified)
106
110
  set_upstream: Set upstream tracking (default: true)
107
111
 
112
+ Returns:
113
+ Success: If the branch is pushed from the worktree.
114
+ Error: If required context is missing or the git command fails.
115
+
108
116
  Example:
109
117
  ```yaml
110
118
  - name: "Push from Worktree"
@@ -136,6 +136,11 @@ class GitHubPlugin(TitanPlugin):
136
136
  from .steps.ai_pr_step import ai_suggest_pr_description_step
137
137
  from .steps.issue_steps import ai_suggest_issue_title_and_body_step, create_issue_steps
138
138
  from .steps.preview_step import preview_and_confirm_issue_step
139
+ from .steps.pull_request_steps import (
140
+ get_pull_request_step,
141
+ merge_pull_request_step,
142
+ verify_pull_request_state_step,
143
+ )
139
144
  from .steps.pr_review_steps import (
140
145
  select_pr_for_review_step,
141
146
  fetch_pending_comments_step,
@@ -184,6 +189,9 @@ class GitHubPlugin(TitanPlugin):
184
189
  "ai_suggest_issue_title_and_body": ai_suggest_issue_title_and_body_step,
185
190
  "create_issue": create_issue_steps,
186
191
  "preview_and_confirm_issue": preview_and_confirm_issue_step,
192
+ "get_pull_request": get_pull_request_step,
193
+ "merge_pull_request": merge_pull_request_step,
194
+ "verify_pull_request_state": verify_pull_request_state_step,
187
195
  "select_pr_for_review": select_pr_for_review_step,
188
196
  "fetch_pending_comments": fetch_pending_comments_step,
189
197
  "check_clean_state": check_clean_state_step,
@@ -134,6 +134,16 @@ def prompt_for_issue_body_step(ctx: WorkflowContext) -> WorkflowResult:
134
134
  def prompt_for_self_assign_step(ctx: WorkflowContext) -> WorkflowResult:
135
135
  """
136
136
  Asks the user if they want to assign the issue to themselves.
137
+
138
+ Requires:
139
+ ctx.github: An initialized GitHubClient.
140
+
141
+ Outputs (saved to ctx.data):
142
+ assignees (list[str]): Updated assignees list when the user chooses self-assignment.
143
+
144
+ Returns:
145
+ Success: If the assignment preference is captured successfully.
146
+ Error: If the GitHub client is unavailable or the prompt fails.
137
147
  """
138
148
  if not ctx.textual:
139
149
  return Error("Textual UI context is not available for this step.")
@@ -176,6 +186,17 @@ def prompt_for_self_assign_step(ctx: WorkflowContext) -> WorkflowResult:
176
186
  def prompt_for_labels_step(ctx: WorkflowContext) -> WorkflowResult:
177
187
  """
178
188
  Prompts the user to select labels for the issue.
189
+
190
+ Requires:
191
+ ctx.github: An initialized GitHubClient.
192
+
193
+ Outputs (saved to ctx.data):
194
+ labels (list[str]): Labels selected by the user.
195
+
196
+ Returns:
197
+ Success: If label selection completes successfully.
198
+ Skip: If the repository has no labels.
199
+ Error: If the GitHub client is unavailable or the prompt fails.
179
200
  """
180
201
  if not ctx.textual:
181
202
  return Error("Textual UI context is not available for this step.")
@@ -10,6 +10,20 @@ def ai_suggest_issue_title_and_body_step(ctx: WorkflowContext) -> WorkflowResult
10
10
  """
11
11
  Use AI to suggest a title and description for a GitHub issue.
12
12
  Auto-categorizes and selects the appropriate template.
13
+
14
+ Inputs (from ctx.data):
15
+ issue_body (str): Raw issue request entered by the user.
16
+
17
+ Outputs (saved to ctx.data):
18
+ issue_title (str): AI-generated or user-edited title.
19
+ issue_body (str): AI-generated or user-edited body.
20
+ issue_category (str): Detected issue category.
21
+ labels (list[str]): Suggested labels for the issue.
22
+
23
+ Returns:
24
+ Success: If issue content is generated and accepted.
25
+ Skip: If AI is unavailable or the user rejects the generated issue.
26
+ Error: If required context is missing or generation fails.
13
27
  """
14
28
  if not ctx.textual:
15
29
  return Error("Textual UI context is not available for this step.")
@@ -98,6 +112,22 @@ def ai_suggest_issue_title_and_body_step(ctx: WorkflowContext) -> WorkflowResult
98
112
  def create_issue_steps(ctx: WorkflowContext) -> WorkflowResult:
99
113
  """
100
114
  Create a new GitHub issue.
115
+
116
+ Requires:
117
+ ctx.github: An initialized GitHubClient.
118
+
119
+ Inputs (from ctx.data):
120
+ issue_title (str): Issue title.
121
+ issue_body (str): Issue body.
122
+ assignees (list, optional): Usernames to assign.
123
+ labels (list, optional): Labels to apply.
124
+
125
+ Outputs (saved to ctx.data):
126
+ issue (GitHubIssue): The created issue object.
127
+
128
+ Returns:
129
+ Success: If the issue is created successfully.
130
+ Error: If required context is missing or the GitHub call fails.
101
131
  """
102
132
  if not ctx.textual:
103
133
  return Error("Textual UI context is not available for this step.")
@@ -4,6 +4,14 @@ from titan_cli.engine.results import WorkflowResult, Success, Error
4
4
  def preview_and_confirm_issue_step(ctx: WorkflowContext) -> WorkflowResult:
5
5
  """
6
6
  Show a preview of the AI-generated issue and ask for confirmation.
7
+
8
+ Inputs (from ctx.data):
9
+ issue_title (str): Generated issue title.
10
+ issue_body (str): Generated issue body.
11
+
12
+ Returns:
13
+ Success: If the user confirms the issue preview.
14
+ Error: If required context is missing, the user rejects, or the prompt is cancelled.
7
15
  """
8
16
  if not ctx.textual:
9
17
  return Error("Textual UI context is not available for this step.")
@@ -0,0 +1,199 @@
1
+ """Reusable workflow steps for GitHub pull request operations."""
2
+
3
+ from titan_cli.core.result import ClientError, ClientSuccess
4
+ from titan_cli.engine import Error, Success, WorkflowContext, WorkflowResult
5
+
6
+ from ..messages import msg
7
+
8
+
9
+ def get_pull_request_step(ctx: WorkflowContext) -> WorkflowResult:
10
+ """
11
+ Fetch a pull request and store it in workflow context.
12
+
13
+ Requires:
14
+ ctx.github: An initialized GitHubClient.
15
+
16
+ Inputs (from ctx.data):
17
+ pr_number (int): Pull request number to fetch.
18
+
19
+ Outputs (saved to ctx.data):
20
+ pr_info: The fetched pull request object.
21
+
22
+ Returns:
23
+ Success: If the pull request is fetched successfully.
24
+ Error: If required context is missing or the GitHub call fails.
25
+ """
26
+ if not ctx.textual:
27
+ return Error("Textual UI context is not available for this step.")
28
+
29
+ ctx.textual.begin_step("Fetch Pull Request")
30
+
31
+ if not ctx.github:
32
+ ctx.textual.error_text("GitHub client not available")
33
+ ctx.textual.end_step("error")
34
+ return Error("GitHub client not available")
35
+
36
+ pr_number = ctx.get("pr_number")
37
+ if not pr_number:
38
+ ctx.textual.error_text("No PR number in context")
39
+ ctx.textual.end_step("error")
40
+ return Error("No PR number in context")
41
+
42
+ with ctx.textual.loading(f"Fetching PR #{pr_number}..."):
43
+ result = ctx.github.get_pull_request(int(pr_number))
44
+
45
+ match result:
46
+ case ClientSuccess(data=pr_info):
47
+ ctx.textual.success_text(f"PR #{pr_info.number}: {pr_info.title}")
48
+ ctx.textual.end_step("success")
49
+ return Success(
50
+ f"Fetched PR #{pr_info.number}",
51
+ metadata={"pr_info": pr_info},
52
+ )
53
+ case ClientError(error_message=err):
54
+ ctx.textual.error_text(f"Failed to fetch PR: {err}")
55
+ ctx.textual.end_step("error")
56
+ return Error(f"Failed to fetch PR: {err}")
57
+
58
+
59
+ def merge_pull_request_step(ctx: WorkflowContext) -> WorkflowResult:
60
+ """
61
+ Merge a pull request using the configured GitHub client.
62
+
63
+ Requires:
64
+ ctx.github: An initialized GitHubClient.
65
+
66
+ Inputs (from ctx.data):
67
+ pr_number (int): Pull request number to merge.
68
+ merge_method (str, optional): Merge strategy.
69
+ commit_title (str, optional): Override commit title.
70
+ commit_message (str, optional): Override commit message.
71
+
72
+ Outputs (saved to ctx.data):
73
+ merge_result: The GitHub merge result object.
74
+
75
+ Returns:
76
+ Success: If the pull request is merged successfully.
77
+ Error: If required context is missing or the GitHub call fails.
78
+ """
79
+ if not ctx.textual:
80
+ return Error("Textual UI context is not available for this step.")
81
+
82
+ ctx.textual.begin_step("Merge Pull Request")
83
+
84
+ if not ctx.github:
85
+ ctx.textual.error_text("GitHub client not available")
86
+ ctx.textual.end_step("error")
87
+ return Error("GitHub client not available")
88
+
89
+ pr_number = ctx.get("pr_number")
90
+ if not pr_number:
91
+ ctx.textual.error_text("No PR number in context")
92
+ ctx.textual.end_step("error")
93
+ return Error("No PR number in context")
94
+
95
+ merge_method = ctx.get("merge_method", "squash")
96
+ commit_title = ctx.get("commit_title")
97
+ commit_message = ctx.get("commit_message")
98
+
99
+ with ctx.textual.loading(f"Merging PR #{pr_number} with {merge_method}..."):
100
+ result = ctx.github.merge_pr(
101
+ int(pr_number),
102
+ merge_method=merge_method,
103
+ commit_title=commit_title,
104
+ commit_message=commit_message,
105
+ )
106
+
107
+ match result:
108
+ case ClientSuccess(data=merge_result):
109
+ if not merge_result.merged:
110
+ ctx.textual.error_text(f"Failed to merge PR #{pr_number}: {merge_result.message}")
111
+ ctx.textual.end_step("error")
112
+ return Error(f"Failed to merge PR #{pr_number}: {merge_result.message}")
113
+
114
+ ctx.textual.success_text(msg.GitHub.PR_MERGED.format(number=pr_number))
115
+ ctx.textual.end_step("success")
116
+ return Success(
117
+ f"Merged PR #{pr_number}",
118
+ metadata={"merge_result": merge_result},
119
+ )
120
+ case ClientError(error_message=err):
121
+ ctx.textual.error_text(f"Failed to merge PR: {err}")
122
+ ctx.textual.end_step("error")
123
+ return Error(f"Failed to merge PR: {err}")
124
+
125
+
126
+ def verify_pull_request_state_step(ctx: WorkflowContext) -> WorkflowResult:
127
+ """
128
+ Verify a pull request is currently in the expected state.
129
+
130
+ Requires:
131
+ ctx.github: An initialized GitHubClient.
132
+
133
+ Inputs (from ctx.data):
134
+ pr_number (int): Pull request number to inspect.
135
+ expected_state (str): Expected pull request state.
136
+
137
+ Outputs (saved to ctx.data):
138
+ verified_pr_info: The pull request object when verification succeeds.
139
+
140
+ Returns:
141
+ Success: If the pull request is in the expected state.
142
+ Error: If required context is missing, verification fails, or the GitHub call fails.
143
+ """
144
+ if not ctx.textual:
145
+ return Error("Textual UI context is not available for this step.")
146
+
147
+ ctx.textual.begin_step("Verify Pull Request State")
148
+
149
+ if not ctx.github:
150
+ ctx.textual.error_text("GitHub client not available")
151
+ ctx.textual.end_step("error")
152
+ return Error("GitHub client not available")
153
+
154
+ pr_number = ctx.get("pr_number")
155
+ if not pr_number:
156
+ ctx.textual.error_text("No PR number in context")
157
+ ctx.textual.end_step("error")
158
+ return Error("No PR number in context")
159
+
160
+ expected_state = ctx.get("expected_state")
161
+ if not expected_state:
162
+ ctx.textual.error_text("No expected PR state in context")
163
+ ctx.textual.end_step("error")
164
+ return Error("No expected PR state in context")
165
+
166
+ expected_state = str(expected_state).upper()
167
+
168
+ with ctx.textual.loading(f"Verifying PR #{pr_number} state..."):
169
+ result = ctx.github.get_pull_request(int(pr_number))
170
+
171
+ match result:
172
+ case ClientSuccess(data=pr_info):
173
+ actual_state = str(pr_info.state).upper()
174
+ if actual_state != expected_state:
175
+ ctx.textual.error_text(
176
+ f"PR #{pr_number} is {actual_state}, expected {expected_state}"
177
+ )
178
+ ctx.textual.end_step("error")
179
+ return Error(
180
+ f"PR #{pr_number} state mismatch: expected {expected_state}, got {actual_state}"
181
+ )
182
+
183
+ ctx.textual.success_text(f"PR #{pr_number} is {actual_state}")
184
+ ctx.textual.end_step("success")
185
+ return Success(
186
+ f"Verified PR #{pr_number} is {actual_state}",
187
+ metadata={"verified_pr_info": pr_info},
188
+ )
189
+ case ClientError(error_message=err):
190
+ ctx.textual.error_text(f"Failed to verify PR state: {err}")
191
+ ctx.textual.end_step("error")
192
+ return Error(f"Failed to verify PR state: {err}")
193
+
194
+
195
+ __all__ = [
196
+ "get_pull_request_step",
197
+ "merge_pull_request_step",
198
+ "verify_pull_request_state_step",
199
+ ]
@@ -360,6 +360,65 @@ class JiraClient:
360
360
 
361
361
  return self._metadata_service.list_project_versions(key)
362
362
 
363
+ def create_version(
364
+ self,
365
+ name: str,
366
+ project_key: Optional[str] = None,
367
+ description: Optional[str] = None,
368
+ release_date: Optional[str] = None,
369
+ ) -> ClientResult[UIJiraVersion]:
370
+ """Create a version in the provided or default Jira project."""
371
+ key = project_key or self.project_key
372
+ if not key:
373
+ return ClientError(
374
+ error_message="Project key not provided",
375
+ error_code="MISSING_PROJECT_KEY"
376
+ )
377
+
378
+ return self._metadata_service.create_version(
379
+ project_key=key,
380
+ name=name,
381
+ description=description,
382
+ release_date=release_date,
383
+ )
384
+
385
+ def ensure_version_exists(
386
+ self,
387
+ name: str,
388
+ project_key: Optional[str] = None,
389
+ description: Optional[str] = None,
390
+ release_date: Optional[str] = None,
391
+ ) -> ClientResult[UIJiraVersion]:
392
+ """Return an existing version by name or create it if missing."""
393
+ key = project_key or self.project_key
394
+ if not key:
395
+ return ClientError(
396
+ error_message="Project key not provided",
397
+ error_code="MISSING_PROJECT_KEY"
398
+ )
399
+
400
+ return self._metadata_service.ensure_version_exists(
401
+ project_key=key,
402
+ name=name,
403
+ description=description,
404
+ release_date=release_date,
405
+ )
406
+
407
+ def assign_fix_version(
408
+ self,
409
+ issue_key: str,
410
+ version_id: Optional[str] = None,
411
+ version_name: Optional[str] = None,
412
+ project_key: Optional[str] = None,
413
+ ) -> ClientResult[None]:
414
+ """Assign a fixVersion to an issue by version ID or version name."""
415
+ return self._issue_service.assign_fix_version_reference(
416
+ issue_key=issue_key,
417
+ project_key=project_key or self.project_key,
418
+ version_id=version_id,
419
+ version_name=version_name,
420
+ )
421
+
363
422
  def get_priorities(self) -> ClientResult[List[UIPriority]]:
364
423
  """
365
424
  Get all available priorities in Jira.
@@ -362,6 +362,93 @@ class IssueService:
362
362
  error_code="CREATE_SUBTASK_ERROR"
363
363
  )
364
364
 
365
+ @log_client_operation()
366
+ def assign_fix_version(
367
+ self,
368
+ issue_key: str,
369
+ version_id: str,
370
+ ) -> ClientResult[None]:
371
+ """Assign a fixVersion to an issue using a Jira version ID."""
372
+ try:
373
+ payload = {
374
+ "update": {
375
+ "fixVersions": [
376
+ {
377
+ "add": {"id": version_id}
378
+ }
379
+ ]
380
+ }
381
+ }
382
+
383
+ self.network.make_request("PUT", f"issue/{issue_key}", json=payload)
384
+
385
+ return ClientSuccess(
386
+ data=None,
387
+ message=f"Assigned fixVersion {version_id} to {issue_key}",
388
+ )
389
+
390
+ except JiraAPIError as e:
391
+ return ClientError(
392
+ error_message=f"Failed to assign fixVersion {version_id} to {issue_key}: {e.message}",
393
+ error_code="ASSIGN_FIX_VERSION_ERROR",
394
+ )
395
+
396
+ @log_client_operation()
397
+ def assign_fix_version_by_name(
398
+ self,
399
+ issue_key: str,
400
+ project_key: str,
401
+ version_name: str,
402
+ ) -> ClientResult[None]:
403
+ """Assign a fixVersion to an issue by resolving a project version name."""
404
+ if not self.metadata_service:
405
+ return ClientError(
406
+ error_message="MetadataService not available",
407
+ error_code="SERVICE_NOT_AVAILABLE"
408
+ )
409
+
410
+ versions_result = self.metadata_service.list_project_versions(project_key)
411
+ match versions_result:
412
+ case ClientSuccess(data=versions):
413
+ matching_version = next(
414
+ (version for version in versions if version.name == version_name),
415
+ None,
416
+ )
417
+ if not matching_version:
418
+ return ClientError(
419
+ error_message=f"Version '{version_name}' not found in project {project_key}",
420
+ error_code="VERSION_NOT_FOUND"
421
+ )
422
+ return self.assign_fix_version(issue_key, matching_version.id)
423
+ case ClientError() as error:
424
+ return error
425
+
426
+ @log_client_operation()
427
+ def assign_fix_version_reference(
428
+ self,
429
+ issue_key: str,
430
+ project_key: str | None = None,
431
+ version_id: str | None = None,
432
+ version_name: str | None = None,
433
+ ) -> ClientResult[None]:
434
+ """Assign a fixVersion to an issue by version ID or version name."""
435
+ if version_id:
436
+ return self.assign_fix_version(issue_key, version_id)
437
+
438
+ if not version_name:
439
+ return ClientError(
440
+ error_message="Either version_id or version_name is required",
441
+ error_code="MISSING_VERSION_REFERENCE"
442
+ )
443
+
444
+ if not project_key:
445
+ return ClientError(
446
+ error_message="Project key not provided",
447
+ error_code="MISSING_PROJECT_KEY"
448
+ )
449
+
450
+ return self.assign_fix_version_by_name(issue_key, project_key, version_name)
451
+
365
452
  def _convert_text_to_adf(self, text: str) -> dict:
366
453
  """
367
454
  Convert plain text to Atlassian Document Format (ADF).
@@ -224,6 +224,76 @@ class MetadataService:
224
224
  error_code="LIST_VERSIONS_ERROR",
225
225
  )
226
226
 
227
+ @log_client_operation()
228
+ def create_version(
229
+ self,
230
+ project_key: str,
231
+ name: str,
232
+ description: str | None = None,
233
+ release_date: str | None = None,
234
+ ) -> ClientResult[UIJiraVersion]:
235
+ """Create a Jira version for a project."""
236
+ try:
237
+ payload = {
238
+ "project": project_key,
239
+ "name": name,
240
+ }
241
+
242
+ if description:
243
+ payload["description"] = description
244
+ if release_date:
245
+ payload["releaseDate"] = release_date
246
+
247
+ data = self.network.make_request("POST", "version", json=payload)
248
+
249
+ network_version = NetworkJiraVersion(
250
+ id=data.get("id", ""),
251
+ name=data.get("name", name),
252
+ description=data.get("description"),
253
+ released=data.get("released", False),
254
+ releaseDate=data.get("releaseDate"),
255
+ )
256
+
257
+ return ClientSuccess(
258
+ data=from_network_version(network_version),
259
+ message=f"Version {name} created",
260
+ )
261
+
262
+ except JiraAPIError as e:
263
+ return ClientError(
264
+ error_message=f"Failed to create version {name} in {project_key}: {e.message}",
265
+ error_code="CREATE_VERSION_ERROR",
266
+ )
267
+
268
+ @log_client_operation()
269
+ def ensure_version_exists(
270
+ self,
271
+ project_key: str,
272
+ name: str,
273
+ description: str | None = None,
274
+ release_date: str | None = None,
275
+ ) -> ClientResult[UIJiraVersion]:
276
+ """Return an existing version by name or create it if missing."""
277
+ versions_result = self.list_project_versions(project_key)
278
+
279
+ match versions_result:
280
+ case ClientSuccess(data=versions):
281
+ existing_version = next((version for version in versions if version.name == name), None)
282
+ if existing_version:
283
+ return ClientSuccess(
284
+ data=existing_version,
285
+ message=f"Version {name} already exists",
286
+ )
287
+ case ClientError() as error:
288
+ return error
289
+
290
+ return self.create_version(
291
+ project_key=project_key,
292
+ name=name,
293
+ description=description,
294
+ release_date=release_date,
295
+ )
296
+
227
297
  def get_priorities(self) -> ClientResult[List[UIPriority]]:
228
298
  """
229
299
  Get all available priorities in Jira.
@@ -48,6 +48,29 @@ class Messages:
48
48
  GET_FAILED: str = "Failed to get JIRA issue: {e}"
49
49
  ISSUE_NOT_FOUND: str = "JIRA issue not found: {issue_key}"
50
50
 
51
+ class Versions:
52
+ """Version management step messages"""
53
+ LIST_PROJECT_REQUIRED: str = "project_key is required. Provide it in workflow params or configure default_project in JIRA plugin."
54
+ VERSION_NAME_REQUIRED: str = "version_name is required"
55
+ CREATE_SUCCESS: str = "Created JIRA version: {version_name}"
56
+ CREATE_FAILED: str = "Failed to create JIRA version: {e}"
57
+ ENSURE_SUCCESS: str = "Version available: {version_name}"
58
+ ASSIGN_SUCCESS: str = "Assigned fix version '{version_name}' to {issue_key}"
59
+ ASSIGN_FAILED: str = "Failed to assign fix version: {e}"
60
+ VERIFY_SUCCESS: str = "Issue {issue_key} has fix version '{version_name}'"
61
+ VERIFY_FAILED: str = "Issue {issue_key} does not have fix version '{version_name}'"
62
+
63
+ class Transitions:
64
+ """Transition workflow step messages"""
65
+ ISSUE_KEY_REQUIRED: str = "JIRA issue key is required"
66
+ TARGET_STATUS_REQUIRED: str = "target_status is required"
67
+ GET_SUCCESS: str = "Retrieved {count} transition(s) for {issue_key}"
68
+ GET_FAILED: str = "Failed to get transitions: {e}"
69
+ TRANSITION_SUCCESS: str = "Updated JIRA issue {issue_key} to {status}"
70
+ TRANSITION_FAILED: str = "Failed to transition JIRA issue: {e}"
71
+ VERIFY_SUCCESS: str = "Issue {issue_key} is in status '{status}'"
72
+ VERIFY_FAILED: str = "Issue {issue_key} is '{actual_status}', expected '{expected_status}'"
73
+
51
74
  class CreateIssue:
52
75
  """Create issue step messages"""
53
76
  CREATING_ISSUE: str = "Creating JIRA issue: {summary}"
@@ -29,6 +29,13 @@ from .issue_operations import (
29
29
  transition_issue_to_ready_for_dev,
30
30
  )
31
31
 
32
+ from .issue_management_operations import (
33
+ find_transition_by_target_status,
34
+ find_transition_by_name_contains,
35
+ find_version_by_name,
36
+ issue_has_fix_version,
37
+ )
38
+
32
39
  __all__ = [
33
40
  # JQL operations
34
41
  "substitute_jql_variables",
@@ -44,4 +51,9 @@ __all__ = [
44
51
  # Issue operations
45
52
  "find_ready_to_dev_transition",
46
53
  "transition_issue_to_ready_for_dev",
54
+ # Workflow operations
55
+ "find_transition_by_target_status",
56
+ "find_transition_by_name_contains",
57
+ "find_version_by_name",
58
+ "issue_has_fix_version",
47
59
  ]