titan-cli 0.3.2__tar.gz → 0.4.1__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.3.2 → titan_cli-0.4.1}/PKG-INFO +8 -6
  2. {titan_cli-0.3.2 → titan_cli-0.4.1}/README.md +5 -5
  3. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/messages.py +1 -1
  4. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/agents/__init__.py +2 -2
  5. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/agents/pr_agent.py +32 -5
  6. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/github_client.py +26 -2
  7. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/network/gh_network.py +2 -2
  8. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/services/__init__.py +2 -0
  9. titan_cli-0.4.1/plugins/titan-plugin-github/titan_plugin_github/clients/services/release_service.py +110 -0
  10. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/messages.py +1 -1
  11. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/__init__.py +2 -0
  12. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/__init__.py +2 -0
  13. titan_cli-0.4.1/plugins/titan-plugin-github/titan_plugin_github/models/mappers/release_mapper.py +22 -0
  14. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/__init__.py +2 -0
  15. titan_cli-0.4.1/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/release.py +29 -0
  16. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/view.py +15 -0
  17. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/steps/ai_pr_step.py +30 -10
  18. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/constants/messages.py +1 -1
  19. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/constants.py +1 -1
  20. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/messages.py +1 -1
  21. {titan_cli-0.3.2 → titan_cli-0.4.1}/pyproject.toml +3 -1
  22. titan_cli-0.4.1/titan_cli/ai/client.py +240 -0
  23. titan_cli-0.4.1/titan_cli/ai/constants.py +103 -0
  24. titan_cli-0.4.1/titan_cli/ai/dependencies.py +86 -0
  25. titan_cli-0.4.1/titan_cli/ai/litellm_client.py +80 -0
  26. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ai/llm_tools.py +17 -39
  27. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ai/models.py +3 -3
  28. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ai/providers/__init__.py +4 -0
  29. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ai/providers/anthropic.py +4 -2
  30. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ai/providers/gemini.py +3 -1
  31. titan_cli-0.4.1/titan_cli/ai/providers/litellm.py +190 -0
  32. titan_cli-0.4.1/titan_cli/ai/providers/openai.py +93 -0
  33. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/config.py +201 -32
  34. titan_cli-0.4.1/titan_cli/core/migrations/__init__.py +19 -0
  35. titan_cli-0.4.1/titan_cli/core/migrations/base.py +31 -0
  36. titan_cli-0.4.1/titan_cli/core/migrations/legacy_to_v1.py +121 -0
  37. titan_cli-0.4.1/titan_cli/core/migrations/manager.py +64 -0
  38. titan_cli-0.4.1/titan_cli/core/models/__init__.py +136 -0
  39. titan_cli-0.4.1/titan_cli/core/plugins/local_sources.py +58 -0
  40. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/plugins/plugin_registry.py +31 -10
  41. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/engine/builder.py +11 -1
  42. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/external_cli/adapters/registry.py +1 -1
  43. titan_cli-0.4.1/titan_cli/ui/tui/screens/ai_config.py +806 -0
  44. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/ai_config_wizard.py +281 -208
  45. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/base.py +16 -7
  46. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/global_setup_wizard.py +2 -2
  47. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/plugin_management.py +208 -25
  48. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/__init__.py +5 -0
  49. titan_cli-0.4.1/titan_cli/ui/tui/widgets/dev_source_path_modal.py +73 -0
  50. titan_cli-0.4.1/titan_cli/ui/tui/widgets/segmented_switch.py +224 -0
  51. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/status_bar.py +3 -3
  52. titan_cli-0.3.2/titan_cli/ai/client.py +0 -170
  53. titan_cli-0.3.2/titan_cli/ai/constants.py +0 -56
  54. titan_cli-0.3.2/titan_cli/core/models/__init__.py +0 -52
  55. titan_cli-0.3.2/titan_cli/ui/tui/screens/ai_config.py +0 -502
  56. {titan_cli-0.3.2 → titan_cli-0.4.1}/LICENSE +0 -0
  57. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/__init__.py +0 -0
  58. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/__init__.py +0 -0
  59. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/git_client.py +0 -0
  60. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/network/__init__.py +0 -0
  61. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/network/git_network.py +0 -0
  62. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/services/__init__.py +0 -0
  63. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/services/branch_service.py +0 -0
  64. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/services/commit_service.py +0 -0
  65. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/services/diff_service.py +0 -0
  66. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/services/remote_service.py +0 -0
  67. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/services/stash_service.py +0 -0
  68. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/services/status_service.py +0 -0
  69. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/services/tag_service.py +0 -0
  70. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/clients/services/worktree_service.py +0 -0
  71. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/exceptions.py +0 -0
  72. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/__init__.py +0 -0
  73. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/__init__.py +0 -0
  74. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/branch_mapper.py +0 -0
  75. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/commit_mapper.py +0 -0
  76. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/status_mapper.py +0 -0
  77. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/tag_mapper.py +0 -0
  78. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/worktree_mapper.py +0 -0
  79. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/network/__init__.py +0 -0
  80. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/network/branch.py +0 -0
  81. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/network/commit.py +0 -0
  82. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/network/status.py +0 -0
  83. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/network/tag.py +0 -0
  84. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/network/worktree.py +0 -0
  85. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/view/__init__.py +0 -0
  86. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/view/branch.py +0 -0
  87. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/view/commit.py +0 -0
  88. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/view/status.py +0 -0
  89. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/view/tag.py +0 -0
  90. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/models/view/worktree.py +0 -0
  91. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/operations/__init__.py +0 -0
  92. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/operations/branch_operations.py +0 -0
  93. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/operations/commit_operations.py +0 -0
  94. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/operations/diff_operations.py +0 -0
  95. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/plugin.py +0 -0
  96. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/__init__.py +0 -0
  97. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/ai_commit_message_step.py +0 -0
  98. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/branch_steps.py +0 -0
  99. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/checkout_step.py +0 -0
  100. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/commit_step.py +0 -0
  101. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/create_branch_step.py +0 -0
  102. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/create_worktree_step.py +0 -0
  103. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/diff_summary_step.py +0 -0
  104. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/pull_step.py +0 -0
  105. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/push_step.py +0 -0
  106. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/remove_worktree_step.py +0 -0
  107. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/restore_original_branch_step.py +0 -0
  108. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/save_current_branch_step.py +0 -0
  109. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/status_step.py +0 -0
  110. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/steps/worktree_command_step.py +0 -0
  111. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/__init__.py +0 -0
  112. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/commit_ai_preview.py +0 -0
  113. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-git/titan_plugin_git/workflows/commit-ai.yaml +0 -0
  114. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/__init__.py +0 -0
  115. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/agents/code_review_agent.py +0 -0
  116. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/agents/config_loader.py +0 -0
  117. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/agents/issue_generator.py +0 -0
  118. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/checklists/__init__.py +0 -0
  119. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/checklists/defaults.py +0 -0
  120. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/__init__.py +0 -0
  121. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/network/__init__.py +0 -0
  122. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_network.py +0 -0
  123. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_queries.py +0 -0
  124. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/protocols.py +0 -0
  125. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/services/issue_service.py +0 -0
  126. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/services/pr_service.py +0 -0
  127. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/services/review_service.py +0 -0
  128. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/clients/services/team_service.py +0 -0
  129. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/config/__init__.py +0 -0
  130. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/config/pr_agent.toml +0 -0
  131. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/exceptions.py +0 -0
  132. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/managers/__init__.py +0 -0
  133. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/managers/checklist_manager.py +0 -0
  134. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/managers/diff_context_manager.py +0 -0
  135. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/diff_models.py +0 -0
  136. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/formatting.py +0 -0
  137. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/comment_mapper.py +0 -0
  138. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/issue_mapper.py +0 -0
  139. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/pr_mapper.py +0 -0
  140. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/review_mapper.py +0 -0
  141. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/thread_mapper.py +0 -0
  142. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/network/__init__.py +0 -0
  143. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/__init__.py +0 -0
  144. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/issue_comment.py +0 -0
  145. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_comment.py +0 -0
  146. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_thread.py +0 -0
  147. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/user.py +0 -0
  148. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/issue.py +0 -0
  149. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/pull_request.py +0 -0
  150. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/review.py +0 -0
  151. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/user.py +0 -0
  152. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/review_enums.py +0 -0
  153. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/review_models.py +0 -0
  154. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/models/validators.py +0 -0
  155. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/__init__.py +0 -0
  156. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/code_review_operations.py +0 -0
  157. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/comment_operations.py +0 -0
  158. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/context_resolution_operations.py +0 -0
  159. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/findings_operations.py +0 -0
  160. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/issue_operations.py +0 -0
  161. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/manifest_operations.py +0 -0
  162. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/plan_prompt_operations.py +0 -0
  163. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/pr_creation_operations.py +0 -0
  164. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/pr_operations.py +0 -0
  165. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/review_action_operations.py +0 -0
  166. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/thread_resolution_operations.py +0 -0
  167. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/operations/worktree_operations.py +0 -0
  168. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/plugin.py +0 -0
  169. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/steps/__init__.py +0 -0
  170. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/steps/code_review_steps.py +0 -0
  171. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/steps/create_pr_step.py +0 -0
  172. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/steps/github_prompt_steps.py +0 -0
  173. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/steps/issue_steps.py +0 -0
  174. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/steps/pr_review_steps.py +0 -0
  175. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/steps/preview_step.py +0 -0
  176. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/steps/select_cli_step.py +0 -0
  177. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/steps/worktree_steps.py +0 -0
  178. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/utils.py +0 -0
  179. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/widgets/__init__.py +0 -0
  180. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/widgets/code_block.py +0 -0
  181. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_thread.py +0 -0
  182. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_utils.py +0 -0
  183. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_view.py +0 -0
  184. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/widgets/reply_comment.py +0 -0
  185. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/__init__.py +0 -0
  186. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/create_pr_ai_preview.py +0 -0
  187. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-issue-ai.yaml +0 -0
  188. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-pr-ai.yaml +0 -0
  189. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/workflows/respond-pr-comments.yaml +0 -0
  190. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr-new-findings.yaml.disabled +0 -0
  191. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr-thread-resolution.yaml.disabled +0 -0
  192. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/__init__.py +0 -0
  193. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/agents/__init__.py +0 -0
  194. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/agents/config_loader.py +0 -0
  195. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/agents/jira_agent.py +0 -0
  196. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/agents/prompts.py +0 -0
  197. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/agents/response_parser.py +0 -0
  198. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/agents/token_tracker.py +0 -0
  199. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/agents/validators.py +0 -0
  200. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/clients/__init__.py +0 -0
  201. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/clients/jira_client.py +0 -0
  202. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/__init__.py +0 -0
  203. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/jira_network.py +0 -0
  204. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/__init__.py +0 -0
  205. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/comment_service.py +0 -0
  206. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/issue_service.py +0 -0
  207. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/link_service.py +0 -0
  208. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/metadata_service.py +0 -0
  209. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/project_service.py +0 -0
  210. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/transition_service.py +0 -0
  211. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/config/jira_agent.toml +0 -0
  212. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/config/templates/generic_issue.md.j2 +0 -0
  213. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/config/templates/issue_analysis.md.j2 +0 -0
  214. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/constants/__init__.py +0 -0
  215. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/constants/defaults.py +0 -0
  216. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/constants/templates.py +0 -0
  217. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/exceptions.py +0 -0
  218. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/__init__.py +0 -0
  219. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/markdown_formatter.py +0 -0
  220. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/__init__.py +0 -0
  221. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/enums.py +0 -0
  222. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/formatting.py +0 -0
  223. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/__init__.py +0 -0
  224. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/comment_mapper.py +0 -0
  225. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_mapper.py +0 -0
  226. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_type_mapper.py +0 -0
  227. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/priority_mapper.py +0 -0
  228. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/project_mapper.py +0 -0
  229. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/status_mapper.py +0 -0
  230. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/transition_mapper.py +0 -0
  231. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/user_mapper.py +0 -0
  232. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/version_mapper.py +0 -0
  233. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/__init__.py +0 -0
  234. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/comment.py +0 -0
  235. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue.py +0 -0
  236. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue_type.py +0 -0
  237. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/priority.py +0 -0
  238. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/project.py +0 -0
  239. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/status.py +0 -0
  240. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/transition.py +0 -0
  241. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/user.py +0 -0
  242. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/version.py +0 -0
  243. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/models/view.py +0 -0
  244. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/operations/__init__.py +0 -0
  245. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_formatting_operations.py +0 -0
  246. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_operations.py +0 -0
  247. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/operations/jql_operations.py +0 -0
  248. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/plugin.py +0 -0
  249. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/ai_analyze_issue_step.py +0 -0
  250. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/ai_enhance_issue_description_step.py +0 -0
  251. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/confirm_auto_assign_step.py +0 -0
  252. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/create_generic_issue_step.py +0 -0
  253. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/get_issue_step.py +0 -0
  254. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/list_versions_step.py +0 -0
  255. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/prompt_issue_description_step.py +0 -0
  256. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/prompt_select_issue_step.py +0 -0
  257. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/review_issue_description_step.py +0 -0
  258. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_jql_step.py +0 -0
  259. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_saved_query_step.py +0 -0
  260. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_priority_step.py +0 -0
  261. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_type_step.py +0 -0
  262. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/utils/__init__.py +0 -0
  263. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/utils/input_validation.py +0 -0
  264. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/utils/issue_sorter.py +0 -0
  265. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/utils/saved_queries.py +0 -0
  266. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/utils.py +0 -0
  267. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/analyze-jira-issues.yaml +0 -0
  268. {titan_cli-0.3.2 → titan_cli-0.4.1}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/create-generic-issue.yaml +0 -0
  269. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/__init__.py +0 -0
  270. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/__main__.py +0 -0
  271. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ai/__init__.py +0 -0
  272. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ai/agents/__init__.py +0 -0
  273. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ai/agents/base.py +0 -0
  274. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ai/exceptions.py +0 -0
  275. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ai/oauth_helper.py +0 -0
  276. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ai/providers/base.py +0 -0
  277. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/cli.py +0 -0
  278. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/clients/__init__.py +0 -0
  279. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/clients/gcloud_client.py +0 -0
  280. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/__init__.py +0 -0
  281. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/discovery.py +0 -0
  282. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/errors.py +0 -0
  283. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/logging/__init__.py +0 -0
  284. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/logging/config.py +0 -0
  285. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/logging/decorators.py +0 -0
  286. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/models/code_review.py +0 -0
  287. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/plugins/available.py +0 -0
  288. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/plugins/community.py +0 -0
  289. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/plugins/models.py +0 -0
  290. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/plugins/plugin_base.py +0 -0
  291. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/result.py +0 -0
  292. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/secrets.py +0 -0
  293. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/utils.py +0 -0
  294. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/validators/__init__.py +0 -0
  295. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/workflows/__init__.py +0 -0
  296. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/workflows/models.py +0 -0
  297. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/workflows/project_step_source.py +0 -0
  298. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/workflows/workflow_exceptions.py +0 -0
  299. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/workflows/workflow_filter_service.py +0 -0
  300. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/workflows/workflow_registry.py +0 -0
  301. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/core/workflows/workflow_sources.py +0 -0
  302. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/engine/__init__.py +0 -0
  303. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/engine/context.py +0 -0
  304. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/engine/mock_context.py +0 -0
  305. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/engine/results.py +0 -0
  306. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/engine/steps/ai_assistant_step.py +0 -0
  307. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/engine/steps/command_step.py +0 -0
  308. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/engine/utils/__init__.py +0 -0
  309. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/engine/utils/venv.py +0 -0
  310. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/engine/workflow_executor.py +0 -0
  311. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/external_cli/__init__.py +0 -0
  312. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/external_cli/adapters/__init__.py +0 -0
  313. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/external_cli/adapters/base.py +0 -0
  314. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/external_cli/adapters/claude.py +0 -0
  315. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/external_cli/adapters/codex.py +0 -0
  316. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/external_cli/adapters/gemini.py +0 -0
  317. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/external_cli/configs.py +0 -0
  318. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/external_cli/launcher.py +0 -0
  319. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/messages.py +0 -0
  320. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/__init__.py +0 -0
  321. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/__previews__/statusbar_preview.py +0 -0
  322. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/app.py +0 -0
  323. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/colors.py +0 -0
  324. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/icons.py +0 -0
  325. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/__init__.py +0 -0
  326. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/cli_launcher.py +0 -0
  327. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/install_plugin_screen.py +0 -0
  328. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/main_menu.py +0 -0
  329. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/plugin_config_wizard.py +0 -0
  330. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/project_setup_wizard.py +0 -0
  331. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/workflow_execution.py +0 -0
  332. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/screens/workflows.py +0 -0
  333. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/textual_components.py +0 -0
  334. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/textual_workflow_executor.py +0 -0
  335. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/theme.py +0 -0
  336. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/button.py +0 -0
  337. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/decision_badge.py +0 -0
  338. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/header.py +0 -0
  339. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/multiline_input.py +0 -0
  340. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/panel.py +0 -0
  341. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/panel_container.py +0 -0
  342. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/prompt_choice.py +0 -0
  343. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/prompt_input.py +0 -0
  344. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/prompt_option_list.py +0 -0
  345. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/prompt_selection_list.py +0 -0
  346. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/prompt_textarea.py +0 -0
  347. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/step_container.py +0 -0
  348. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/styled_option_list.py +0 -0
  349. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/table.py +0 -0
  350. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/text.py +0 -0
  351. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/ui/tui/widgets/wizard.py +0 -0
  352. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/utils/__init__.py +0 -0
  353. {titan_cli-0.3.2 → titan_cli-0.4.1}/titan_cli/utils/autoupdate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: titan-cli
3
- Version: 0.3.2
3
+ Version: 0.4.1
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
@@ -22,8 +22,10 @@ Classifier: Programming Language :: Python :: 3.14
22
22
  Requires-Dist: anthropic (>=0.75.0,<0.76.0)
23
23
  Requires-Dist: google-auth (>=2.43.0,<3.0.0)
24
24
  Requires-Dist: google-genai (>=1.58.0,<2.0.0)
25
+ Requires-Dist: h2 (>=4.1.0,<5.0.0)
25
26
  Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
26
27
  Requires-Dist: keyring (>=25.7.0,<26.0.0)
28
+ Requires-Dist: openai (>=2.0.0,<3.0.0)
27
29
  Requires-Dist: packaging (>=23.0,<25.0)
28
30
  Requires-Dist: pydantic (>=2.0.0,<3.0.0)
29
31
  Requires-Dist: python-dotenv (>=1.2.1,<2.0.0)
@@ -50,7 +52,7 @@ Titan CLI is a powerful command-line orchestrator that automates Git, GitHub, JI
50
52
  - 🔧 **Project Configuration** - Centralized `.titan/config.toml` for project-specific settings
51
53
  - 🔌 **Plugin System** - Extend functionality with Git, GitHub, JIRA, and custom plugins
52
54
  - 🎨 **Modern TUI** - Beautiful terminal interface powered by Textual
53
- - 🤖 **AI Integration** - Optional AI assistance (Claude & Gemini) for commits, PRs, and analysis
55
+ - 🤖 **AI Integration** - Optional AI assistance through direct providers and LLM gateways
54
56
  - ⚡ **Workflow Engine** - Compose atomic steps into powerful automated workflows
55
57
  - 🔐 **Secure Secrets** - OS keyring integration for API tokens and credentials
56
58
 
@@ -100,7 +102,7 @@ titan
100
102
  ```
101
103
 
102
104
  On first run, Titan will guide you through:
103
- 1. **Global Setup** - Configure AI providers (optional)
105
+ 1. **Global Setup** - Configure AI connections (optional)
104
106
  2. **Project Setup** - Enable plugins and configure project settings
105
107
 
106
108
  ### Basic Usage
@@ -123,10 +125,10 @@ Titan CLI v1.0.0 includes three core plugins:
123
125
 
124
126
  ## 🤖 AI Integration
125
127
 
126
- Titan supports multiple AI providers:
128
+ Titan supports multiple AI connections:
127
129
 
128
- - **Anthropic Claude** (Sonnet, Opus, Haiku)
129
- - **Google Gemini** (Pro, Flash)
130
+ - **Direct Provider**: Anthropic, OpenAI, Gemini
131
+ - **LLM Gateway**: OpenAI-compatible endpoints such as LiteLLM
130
132
 
131
133
  Configure during first setup or later via the TUI settings.
132
134
 
@@ -9,7 +9,7 @@ Titan CLI is a powerful command-line orchestrator that automates Git, GitHub, JI
9
9
  - 🔧 **Project Configuration** - Centralized `.titan/config.toml` for project-specific settings
10
10
  - 🔌 **Plugin System** - Extend functionality with Git, GitHub, JIRA, and custom plugins
11
11
  - 🎨 **Modern TUI** - Beautiful terminal interface powered by Textual
12
- - 🤖 **AI Integration** - Optional AI assistance (Claude & Gemini) for commits, PRs, and analysis
12
+ - 🤖 **AI Integration** - Optional AI assistance through direct providers and LLM gateways
13
13
  - ⚡ **Workflow Engine** - Compose atomic steps into powerful automated workflows
14
14
  - 🔐 **Secure Secrets** - OS keyring integration for API tokens and credentials
15
15
 
@@ -59,7 +59,7 @@ titan
59
59
  ```
60
60
 
61
61
  On first run, Titan will guide you through:
62
- 1. **Global Setup** - Configure AI providers (optional)
62
+ 1. **Global Setup** - Configure AI connections (optional)
63
63
  2. **Project Setup** - Enable plugins and configure project settings
64
64
 
65
65
  ### Basic Usage
@@ -82,10 +82,10 @@ Titan CLI v1.0.0 includes three core plugins:
82
82
 
83
83
  ## 🤖 AI Integration
84
84
 
85
- Titan supports multiple AI providers:
85
+ Titan supports multiple AI connections:
86
86
 
87
- - **Anthropic Claude** (Sonnet, Opus, Haiku)
88
- - **Google Gemini** (Pro, Flash)
87
+ - **Direct Provider**: Anthropic, OpenAI, Gemini
88
+ - **LLM Gateway**: OpenAI-compatible endpoints such as LiteLLM
89
89
 
90
90
  Configure during first setup or later via the TUI settings.
91
91
 
@@ -88,7 +88,7 @@ class Messages:
88
88
  PROMPT_FAILED: str = "Failed to prompt for commit message: {e}"
89
89
 
90
90
  class AICommitMessage:
91
- AI_NOT_CONFIGURED: str = "AI not configured. Run 'titan ai configure' to enable AI features."
91
+ AI_NOT_CONFIGURED: str = "AI not configured. Open AI Configuration to enable AI features."
92
92
  NO_CHANGES_TO_COMMIT: str = "No changes to commit"
93
93
  ANALYZING_CHANGES: str = "Analyzing uncommitted changes..."
94
94
  NO_UNCOMMITTED_CHANGES: str = "No uncommitted changes to analyze"
@@ -1,7 +1,7 @@
1
1
  # plugins/titan-plugin-github/titan_plugin_github/agents/__init__.py
2
2
  """AI agents for GitHub plugin."""
3
3
 
4
- from .pr_agent import PRAgent, PRAnalysis
4
+ from .pr_agent import PRAgent, PRAnalysis, PRStatus
5
5
  from .code_review_agent import CodeReviewAgent
6
6
 
7
- __all__ = ["PRAgent", "PRAnalysis", "CodeReviewAgent"]
7
+ __all__ = ["PRAgent", "PRAnalysis", "PRStatus", "CodeReviewAgent"]
@@ -9,6 +9,7 @@ This agent analyzes the complete context of a branch and automatically:
9
9
  """
10
10
 
11
11
  from dataclasses import dataclass
12
+ from enum import StrEnum
12
13
  from pathlib import Path
13
14
  from typing import Optional
14
15
 
@@ -22,6 +23,16 @@ from ..utils import calculate_pr_size, is_i18n_change
22
23
  logger = get_logger(__name__)
23
24
 
24
25
 
26
+ class PRStatus(StrEnum):
27
+ """Outcome of the PR analysis portion of PRAgent."""
28
+
29
+ OK = "ok"
30
+ NO_COMMITS = "no_commits"
31
+ SOURCE_DATA_FAILED = "source_data_failed"
32
+ GENERATION_FAILED = "generation_failed"
33
+ INCOMPLETE = "incomplete"
34
+
35
+
25
36
  @dataclass
26
37
  class PRAnalysis:
27
38
  """Complete analysis result from PRAgent."""
@@ -35,6 +46,8 @@ class PRAnalysis:
35
46
  pr_title: Optional[str] = None
36
47
  pr_body: Optional[str] = None
37
48
  pr_size: Optional[str] = None
49
+ pr_status: PRStatus = PRStatus.OK
50
+ pr_error: Optional[str] = None
38
51
 
39
52
  # Metadata
40
53
  total_tokens_used: int = 0
@@ -133,6 +146,8 @@ class PRAgent(BaseAIAgent):
133
146
  pr_title = None
134
147
  pr_body = None
135
148
  pr_size = None
149
+ pr_status = PRStatus.OK
150
+ pr_error = None
136
151
  files_changed = 0
137
152
  lines_changed = 0
138
153
  commits = []
@@ -204,9 +219,11 @@ class PRAgent(BaseAIAgent):
204
219
 
205
220
  match (commits_result, diff_result):
206
221
  case (ClientSuccess(data=commits_data), ClientSuccess(data=branch_diff)):
207
- if branch_diff and commits_data:
208
- commits = commits_data # Extract commits list
222
+ commits = commits_data or []
209
223
 
224
+ if not commits or not branch_diff:
225
+ pr_status = PRStatus.NO_COMMITS
226
+ else:
210
227
  # Read PR template (uses embedded default if file not found)
211
228
  template = self._read_pr_template()
212
229
 
@@ -228,17 +245,25 @@ class PRAgent(BaseAIAgent):
228
245
  lines_changed = pr_result["lines_changed"]
229
246
  total_tokens += pr_result["tokens_used"]
230
247
 
248
+ if not pr_title or not pr_body:
249
+ pr_status = PRStatus.INCOMPLETE
250
+ else:
251
+ pr_status = PRStatus.OK
252
+
231
253
  except Exception as e:
232
254
  logger.error(f"Failed to generate PR description: {e}")
233
- # Return analysis without PR data
255
+ pr_status = PRStatus.GENERATION_FAILED
256
+ pr_error = str(e)
234
257
 
235
258
  case _:
236
259
  logger.error("Failed to get branch commits or diff")
237
- # Return analysis without PR data
260
+ pr_status = PRStatus.SOURCE_DATA_FAILED
261
+ pr_error = "Failed to get branch commits or diff."
238
262
 
239
263
  except Exception as e:
240
264
  logger.error(f"Failed to analyze branch for PR: {e}")
241
- # Return analysis without PR data
265
+ pr_status = PRStatus.SOURCE_DATA_FAILED
266
+ pr_error = str(e)
242
267
 
243
268
  return PRAnalysis(
244
269
  needs_commit=needs_commit,
@@ -247,6 +272,8 @@ class PRAgent(BaseAIAgent):
247
272
  pr_title=pr_title,
248
273
  pr_body=pr_body,
249
274
  pr_size=pr_size,
275
+ pr_status=pr_status,
276
+ pr_error=pr_error,
250
277
  total_tokens_used=total_tokens,
251
278
  branch_commits=commits,
252
279
  files_changed=files_changed,
@@ -14,8 +14,8 @@ from titan_cli.core.plugins.models import GitHubPluginConfig
14
14
  from titan_plugin_git.clients.git_client import GitClient
15
15
 
16
16
  from .network import GHNetwork, GraphQLNetwork
17
- from .services import PRService, ReviewService, IssueService, TeamService
18
- from ..models.view import UIPullRequest, UICommentThread, UIIssue, UIPRMergeResult, UIReview, UIFileChange, UIPRCreated
17
+ from .services import PRService, ReviewService, IssueService, TeamService, ReleaseService
18
+ from ..models.view import UIPullRequest, UICommentThread, UIIssue, UIPRMergeResult, UIReview, UIFileChange, UIPRCreated, UIRelease
19
19
 
20
20
 
21
21
  class GitHubClient:
@@ -75,6 +75,7 @@ class GitHubClient:
75
75
  self._review_service = ReviewService(self._gh_network, self._graphql_network)
76
76
  self._issue_service = IssueService(self._gh_network)
77
77
  self._team_service = TeamService(self._gh_network)
78
+ self._release_service = ReleaseService(self._gh_network)
78
79
 
79
80
  def get_pr_template(self) -> Optional[str]:
80
81
  """Get the PR template if available."""
@@ -262,6 +263,29 @@ class GitHubClient:
262
263
  """List all labels in the repository."""
263
264
  return self._issue_service.list_labels()
264
265
 
266
+ # ============================================================================
267
+ # Release Operations
268
+ # ============================================================================
269
+
270
+ def create_release(
271
+ self,
272
+ tag_name: str,
273
+ title: Optional[str] = None,
274
+ notes: Optional[str] = None,
275
+ generate_notes: bool = False,
276
+ verify_tag: bool = True,
277
+ prerelease: bool = False,
278
+ ) -> ClientResult[UIRelease]:
279
+ """Create a GitHub release."""
280
+ return self._release_service.create_release(
281
+ tag_name=tag_name,
282
+ title=title,
283
+ notes=notes,
284
+ generate_notes=generate_notes,
285
+ verify_tag=verify_tag,
286
+ prerelease=prerelease,
287
+ )
288
+
265
289
  # ============================================================================
266
290
  # Team Operations
267
291
  # ============================================================================
@@ -99,7 +99,7 @@ class GHNetwork:
99
99
  )
100
100
  return result.stdout.strip()
101
101
  except subprocess.CalledProcessError as e:
102
- self._logger.debug(
102
+ self._logger.error(
103
103
  "gh_command_failed",
104
104
  subcommand=subcommand,
105
105
  action=action,
@@ -107,7 +107,7 @@ class GHNetwork:
107
107
  exit_code=e.returncode,
108
108
  )
109
109
  error_msg = e.stderr.strip() if e.stderr else str(e)
110
- raise GitHubAPIError(msg.GitHub.API_ERROR.format(error_msg=error_msg))
110
+ raise GitHubAPIError(msg.GitHub.API_ERROR.format(error_msg=error_msg)) from e
111
111
  except FileNotFoundError:
112
112
  raise GitHubError(msg.GitHub.CLI_NOT_FOUND)
113
113
  except Exception as e:
@@ -9,10 +9,12 @@ from .pr_service import PRService
9
9
  from .review_service import ReviewService
10
10
  from .issue_service import IssueService
11
11
  from .team_service import TeamService
12
+ from .release_service import ReleaseService
12
13
 
13
14
  __all__ = [
14
15
  "PRService",
15
16
  "ReviewService",
16
17
  "IssueService",
17
18
  "TeamService",
19
+ "ReleaseService",
18
20
  ]
@@ -0,0 +1,110 @@
1
+ # plugins/titan-plugin-github/titan_plugin_github/clients/services/release_service.py
2
+ """
3
+ Release Service
4
+
5
+ Business logic for GitHub release operations.
6
+ Uses gh CLI through the network layer.
7
+ """
8
+
9
+ import json
10
+ from typing import Optional
11
+
12
+ from titan_cli.core.result import ClientResult, ClientSuccess, ClientError
13
+ from titan_cli.core.logging import log_client_operation
14
+
15
+ from ..network import GHNetwork
16
+ from ...exceptions import GitHubAPIError
17
+ from ...models.network.rest import NetworkRelease
18
+ from ...models.view import UIRelease
19
+ from ...models.mappers import from_network_release
20
+
21
+
22
+ class ReleaseService:
23
+ """
24
+ Service for GitHub release operations.
25
+
26
+ Handles creating GitHub releases for a repository.
27
+ """
28
+
29
+ def __init__(self, gh_network: GHNetwork):
30
+ """
31
+ Initialize release service.
32
+
33
+ Args:
34
+ gh_network: GHNetwork instance for REST/CLI operations
35
+ """
36
+ self.gh = gh_network
37
+
38
+ @log_client_operation()
39
+ def create_release(
40
+ self,
41
+ tag_name: str,
42
+ title: Optional[str] = None,
43
+ notes: Optional[str] = None,
44
+ generate_notes: bool = False,
45
+ verify_tag: bool = True,
46
+ prerelease: bool = False,
47
+ ) -> ClientResult[UIRelease]:
48
+ """
49
+ Create a GitHub release and return a UI release model.
50
+
51
+ Args:
52
+ tag_name: Tag to publish
53
+ title: Release title
54
+ notes: Optional release notes body
55
+ generate_notes: Ask GitHub to generate release notes
56
+ verify_tag: Require tag to exist remotely
57
+ prerelease: Mark release as prerelease
58
+
59
+ Returns:
60
+ ClientResult[UIRelease]
61
+ """
62
+ if notes and generate_notes:
63
+ return ClientError(
64
+ error_message="Specify either notes or generate_notes, not both",
65
+ error_code="INVALID_INPUT",
66
+ )
67
+
68
+ try:
69
+ args = ["release", "create", tag_name]
70
+
71
+ if title:
72
+ args.extend(["--title", title])
73
+
74
+ if notes:
75
+ args.extend(["--notes", notes])
76
+ elif generate_notes:
77
+ args.append("--generate-notes")
78
+
79
+ if verify_tag:
80
+ args.append("--verify-tag")
81
+
82
+ if prerelease:
83
+ args.append("--prerelease")
84
+
85
+ args.extend(self.gh.get_repo_arg())
86
+
87
+ self.gh.run_command(args)
88
+
89
+ view_args = [
90
+ "release", "view", tag_name,
91
+ "--json", "tagName,name,url,isPrerelease",
92
+ ] + self.gh.get_repo_arg()
93
+
94
+ output = self.gh.run_command(view_args)
95
+ data = json.loads(output)
96
+ network_release = NetworkRelease.from_json(data)
97
+ ui_release = from_network_release(network_release)
98
+
99
+ return ClientSuccess(
100
+ data=ui_release,
101
+ message=f"Release '{tag_name}' created"
102
+ )
103
+
104
+ except json.JSONDecodeError as e:
105
+ return ClientError(
106
+ error_message=f"Failed to parse release data: {e}",
107
+ error_code="JSON_PARSE_ERROR"
108
+ )
109
+ except GitHubAPIError as e:
110
+ return ClientError(error_message=str(e), error_code="API_ERROR")
@@ -53,7 +53,7 @@ class Messages:
53
53
  AUTH_INVALID: str = "Invalid GitHub token"
54
54
 
55
55
  class AI:
56
- AI_NOT_CONFIGURED: str = "AI not configured. Run 'titan ai configure' to enable AI features."
56
+ AI_NOT_CONFIGURED: str = "AI not configured. Open AI Configuration to enable AI features."
57
57
  GITHUB_CLIENT_NOT_AVAILABLE: str = "GitHub client is not available in the workflow context."
58
58
  GIT_CLIENT_NOT_AVAILABLE: str = "Git client is not available in the workflow context."
59
59
  MISSING_PR_HEAD_BRANCH: str = "Missing pr_head_branch in context"
@@ -33,6 +33,7 @@ from .view import (
33
33
  UICommentThread,
34
34
  UIPullRequest,
35
35
  UIIssue,
36
+ UIRelease,
36
37
  UIReviewSuggestion,
37
38
  )
38
39
 
@@ -67,6 +68,7 @@ __all__ = [
67
68
  "UICommentThread",
68
69
  "UIPullRequest",
69
70
  "UIIssue",
71
+ "UIRelease",
70
72
  "UIReviewSuggestion",
71
73
  # Mappers
72
74
  "from_rest_pr",
@@ -16,6 +16,7 @@ from .issue_mapper import from_rest_issue
16
16
  from .comment_mapper import from_graphql_review_comment, from_graphql_issue_comment
17
17
  from .thread_mapper import from_graphql_review_thread
18
18
  from .review_mapper import from_network_review
19
+ from .release_mapper import from_network_release
19
20
 
20
21
  __all__ = [
21
22
  "from_rest_pr",
@@ -27,4 +28,5 @@ __all__ = [
27
28
  "from_graphql_issue_comment",
28
29
  "from_graphql_review_thread",
29
30
  "from_network_review",
31
+ "from_network_release",
30
32
  ]
@@ -0,0 +1,22 @@
1
+ """Mapper for GitHub release: Network model -> UI model."""
2
+
3
+ from ..network.rest import NetworkRelease
4
+ from ..view import UIRelease
5
+
6
+
7
+ def from_network_release(network_release: NetworkRelease) -> UIRelease:
8
+ """
9
+ Transform network release model to UI release model.
10
+
11
+ Args:
12
+ network_release: Raw release data from gh CLI JSON
13
+
14
+ Returns:
15
+ UIRelease ready for rendering
16
+ """
17
+ return UIRelease(
18
+ tag_name=network_release.tag_name,
19
+ title=network_release.name,
20
+ url=network_release.url,
21
+ is_prerelease=network_release.is_prerelease,
22
+ )
@@ -10,6 +10,7 @@ from .user import NetworkUser
10
10
  from .review import NetworkReview
11
11
  from .pull_request import NetworkPullRequest, NetworkPRSearchResult, NetworkPRMergeResult, NetworkPRFile, NetworkPRCreated
12
12
  from .issue import NetworkIssue
13
+ from .release import NetworkRelease
13
14
 
14
15
  __all__ = [
15
16
  "NetworkUser",
@@ -20,4 +21,5 @@ __all__ = [
20
21
  "NetworkPRFile",
21
22
  "NetworkPRCreated",
22
23
  "NetworkIssue",
24
+ "NetworkRelease",
23
25
  ]
@@ -0,0 +1,29 @@
1
+ """
2
+ Network model for GitHub release data returned by gh CLI JSON output.
3
+ """
4
+
5
+ from dataclasses import dataclass
6
+ from typing import Any, Dict
7
+
8
+
9
+ @dataclass
10
+ class NetworkRelease:
11
+ """
12
+ Raw GitHub release model faithful to gh CLI JSON fields.
13
+ """
14
+ tag_name: str
15
+ name: str
16
+ url: str
17
+ is_prerelease: bool
18
+
19
+ @classmethod
20
+ def from_json(cls, data: Dict[str, Any]) -> "NetworkRelease":
21
+ """
22
+ Parse raw gh JSON into NetworkRelease.
23
+ """
24
+ return cls(
25
+ tag_name=data.get("tagName", ""),
26
+ name=data.get("name", "") or data.get("tagName", ""),
27
+ url=data.get("url", ""),
28
+ is_prerelease=bool(data.get("isPrerelease", False)),
29
+ )
@@ -230,6 +230,20 @@ class UIPRCreated:
230
230
  state: str # "open" or "draft"
231
231
 
232
232
 
233
+ @dataclass
234
+ class UIRelease:
235
+ """
236
+ UI model for a newly created GitHub release.
237
+
238
+ Returned after create_release — contains the identifiers needed
239
+ to display the result or navigate to the release page.
240
+ """
241
+ tag_name: str
242
+ title: str
243
+ url: str
244
+ is_prerelease: bool
245
+
246
+
233
247
  @dataclass
234
248
  class UIReviewSuggestion:
235
249
  """AI-generated review comment for a PR."""
@@ -251,5 +265,6 @@ __all__ = [
251
265
  "UIPRMergeResult",
252
266
  "UIFileChange",
253
267
  "UIPRCreated",
268
+ "UIRelease",
254
269
  "UIReviewSuggestion",
255
270
  ]
@@ -8,7 +8,7 @@ Uses PRAgent to analyze branch context and generate PR content.
8
8
  from titan_cli.core.logging import get_logger
9
9
  from titan_cli.engine import WorkflowContext, WorkflowResult, Success, Error, Skip
10
10
 
11
- from ..agents import PRAgent
11
+ from ..agents import PRAgent, PRStatus
12
12
  from ..messages import msg
13
13
 
14
14
  logger = get_logger(__name__)
@@ -103,12 +103,34 @@ def ai_suggest_pr_description_step(ctx: WorkflowContext) -> WorkflowResult:
103
103
  has_literal_newlines,
104
104
  )
105
105
 
106
- # Check if PR content was generated (need commits in branch)
107
- if not analysis.pr_title or not analysis.pr_body:
108
- ctx.textual.dim_text("No commits found in branch to generate PR description.")
106
+ if analysis.pr_status in {
107
+ PRStatus.GENERATION_FAILED,
108
+ PRStatus.SOURCE_DATA_FAILED,
109
+ }:
110
+ error_message = msg.GitHub.AI.AI_GENERATION_FAILED.format(
111
+ e=analysis.pr_error or "Unknown error"
112
+ )
113
+ ctx.textual.error_text(error_message)
114
+ ctx.textual.end_step("error")
115
+ return Error(error_message)
116
+
117
+ if analysis.pr_status == PRStatus.NO_COMMITS:
118
+ ctx.textual.dim_text(
119
+ "No commits found in branch to generate PR description."
120
+ )
109
121
  ctx.textual.end_step("skip")
110
122
  return Skip("No commits found for PR generation")
111
123
 
124
+ if analysis.pr_status == PRStatus.INCOMPLETE:
125
+ ctx.textual.warning_text("AI did not generate complete PR content.")
126
+ ctx.textual.end_step("skip")
127
+ return Skip("AI did not generate complete PR content")
128
+
129
+ if not analysis.pr_title or not analysis.pr_body:
130
+ ctx.textual.warning_text("AI did not generate PR content for this branch.")
131
+ ctx.textual.end_step("skip")
132
+ return Skip("AI did not generate PR content")
133
+
112
134
  # Show PR size info
113
135
  if analysis.pr_size:
114
136
  ctx.textual.dim_text(msg.GitHub.AI.PR_SIZE_INFO.format(
@@ -151,12 +173,10 @@ def ai_suggest_pr_description_step(ctx: WorkflowContext) -> WorkflowResult:
151
173
  )
152
174
 
153
175
  except Exception as e:
154
- # Don't fail the workflow, just skip AI and use manual prompts
155
- ctx.textual.warning_text(msg.GitHub.AI.AI_GENERATION_FAILED.format(e=e))
156
- ctx.textual.dim_text(msg.GitHub.AI.FALLBACK_TO_MANUAL)
157
-
158
- ctx.textual.end_step("skip")
159
- return Skip(msg.GitHub.AI.AI_GENERATION_FAILED.format(e=e))
176
+ error_message = msg.GitHub.AI.AI_GENERATION_FAILED.format(e=e)
177
+ ctx.textual.error_text(error_message)
178
+ ctx.textual.end_step("error")
179
+ return Error(error_message, exception=e)
160
180
 
161
181
 
162
182
  # Export for plugin registration
@@ -80,7 +80,7 @@ class ErrorMessages:
80
80
 
81
81
  # AI errors
82
82
  AI_NOT_AVAILABLE = (
83
- "No AI provider configured. "
83
+ "No AI connection configured. "
84
84
  "The brief description will be used as is."
85
85
  )
86
86
  AI_GENERATION_FAILED = (
@@ -115,7 +115,7 @@ class ErrorMessages:
115
115
  # AI errors
116
116
  AI_NOT_AVAILABLE = (
117
117
  "⚠️ AI not available\n\n"
118
- "No AI provider configured. "
118
+ "No AI connection configured. "
119
119
  "Will use brief description as-is."
120
120
  )
121
121
  AI_GENERATION_FAILED = (
@@ -76,7 +76,7 @@ class Messages:
76
76
 
77
77
  class AIIssue:
78
78
  """AI issue generation step messages"""
79
- AI_NOT_CONFIGURED: str = "AI not configured. Run 'titan ai configure' to enable AI features."
79
+ AI_NOT_CONFIGURED: str = "AI not configured. Open AI Configuration to enable AI features."
80
80
  AI_NOT_CONFIGURED_SKIP: str = "AI not configured - skipping analysis"
81
81
  GENERATING_ISSUE: str = "Generating JIRA issue with AI..."
82
82
  GENERATION_SUCCESS: str = "AI generated JIRA issue successfully"
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "titan-cli"
3
- version = "0.3.2"
3
+ version = "0.4.1"
4
4
  description = "Modular development tools orchestrator - Streamline your workflows with AI integration and intuitive terminal UI"
5
5
  authors = ["MasOrange Apps Team <apps-management-stores@masorange.es>"]
6
6
  readme = "README.md"
@@ -35,6 +35,7 @@ pydantic = ">=2.0.0,<3.0.0"
35
35
  keyring = ">=25.7.0,<26.0.0"
36
36
  python-dotenv = ">=1.2.1,<2.0.0"
37
37
  anthropic = ">=0.75.0,<0.76.0"
38
+ openai = ">=2.0.0,<3.0.0"
38
39
  google-genai = "^1.58.0"
39
40
  google-auth = ">=2.43.0,<3.0.0"
40
41
  pyyaml = ">=6.0.3,<7.0.0"
@@ -43,6 +44,7 @@ textual = ">=1.0.0,<2.0.0"
43
44
  requests = ">=2.31.0,<3.0.0"
44
45
  packaging = ">=23.0,<25.0"
45
46
  structlog = ">=25.5.0,<26.0.0"
47
+ h2 = ">=4.1.0,<5.0.0"
46
48
 
47
49
  [tool.poetry.group.docs]
48
50
  optional = true