titan-cli 0.1.8__tar.gz → 0.3.2__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 (356) hide show
  1. {titan_cli-0.1.8 → titan_cli-0.3.2}/PKG-INFO +25 -11
  2. {titan_cli-0.1.8 → titan_cli-0.3.2}/README.md +16 -6
  3. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/clients/__init__.py +2 -1
  4. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/git_client.py +462 -0
  5. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/network/__init__.py +4 -0
  6. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/network/git_network.py +150 -0
  7. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/__init__.py +20 -0
  8. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/branch_service.py +232 -0
  9. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/commit_service.py +280 -0
  10. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/diff_service.py +200 -0
  11. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/remote_service.py +161 -0
  12. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/stash_service.py +136 -0
  13. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/status_service.py +135 -0
  14. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/tag_service.py +122 -0
  15. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/worktree_service.py +369 -0
  16. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/messages.py +2 -2
  17. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/__init__.py +62 -0
  18. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/__init__.py +14 -0
  19. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/branch_mapper.py +39 -0
  20. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/commit_mapper.py +51 -0
  21. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/status_mapper.py +62 -0
  22. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/tag_mapper.py +48 -0
  23. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/worktree_mapper.py +65 -0
  24. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/__init__.py +14 -0
  25. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/branch.py +17 -0
  26. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/commit.py +16 -0
  27. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/status.py +20 -0
  28. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/tag.py +16 -0
  29. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/worktree.py +18 -0
  30. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/__init__.py +14 -0
  31. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/branch.py +18 -0
  32. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/commit.py +19 -0
  33. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/status.py +22 -0
  34. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/tag.py +18 -0
  35. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/worktree.py +21 -0
  36. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/operations/__init__.py +56 -0
  37. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/operations/branch_operations.py +107 -0
  38. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/operations/commit_operations.py +196 -0
  39. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/operations/diff_operations.py +191 -0
  40. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/plugin.py +8 -0
  41. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/ai_commit_message_step.py +31 -68
  42. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/branch_steps.py +18 -14
  43. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/commit_step.py +21 -19
  44. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/create_branch_step.py +166 -0
  45. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/create_worktree_step.py +155 -0
  46. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/diff_summary_step.py +142 -0
  47. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/push_step.py +108 -0
  48. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/remove_worktree_step.py +98 -0
  49. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/status_step.py +70 -0
  50. titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/worktree_command_step.py +199 -0
  51. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/agents/__init__.py +2 -1
  52. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/agents/code_review_agent.py +168 -0
  53. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/agents/issue_generator.py +4 -3
  54. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/agents/pr_agent.py +166 -86
  55. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/checklists/__init__.py +5 -0
  56. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/checklists/defaults.py +100 -0
  57. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/github_client.py +376 -0
  58. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/network/__init__.py +17 -0
  59. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/network/gh_network.py +134 -0
  60. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_network.py +156 -0
  61. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_queries.py +170 -0
  62. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/protocols.py +86 -0
  63. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/services/__init__.py +18 -0
  64. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/services/issue_service.py +127 -0
  65. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/services/pr_service.py +683 -0
  66. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/services/review_service.py +566 -0
  67. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/services/team_service.py +76 -0
  68. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/config/pr_agent.toml +10 -5
  69. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/managers/__init__.py +15 -0
  70. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/managers/checklist_manager.py +23 -0
  71. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/managers/diff_context_manager.py +572 -0
  72. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/__init__.py +79 -0
  73. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/diff_models.py +130 -0
  74. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/formatting.py +209 -0
  75. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/__init__.py +30 -0
  76. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/comment_mapper.py +74 -0
  77. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/issue_mapper.py +35 -0
  78. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/pr_mapper.py +138 -0
  79. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/review_mapper.py +45 -0
  80. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/thread_mapper.py +40 -0
  81. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/__init__.py +42 -0
  82. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/__init__.py +19 -0
  83. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/issue_comment.py +57 -0
  84. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_comment.py +80 -0
  85. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_thread.py +65 -0
  86. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/user.py +47 -0
  87. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/__init__.py +23 -0
  88. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/issue.py +63 -0
  89. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/pull_request.py +187 -0
  90. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/review.py +54 -0
  91. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/user.py +51 -0
  92. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/review_enums.py +109 -0
  93. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/review_models.py +306 -0
  94. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/validators.py +172 -0
  95. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/view.py +255 -0
  96. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/__init__.py +103 -0
  97. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/code_review_operations.py +607 -0
  98. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/comment_operations.py +258 -0
  99. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/context_resolution_operations.py +300 -0
  100. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/findings_operations.py +280 -0
  101. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/issue_operations.py +110 -0
  102. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/manifest_operations.py +191 -0
  103. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/plan_prompt_operations.py +234 -0
  104. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/pr_creation_operations.py +78 -0
  105. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/pr_operations.py +125 -0
  106. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/review_action_operations.py +145 -0
  107. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/thread_resolution_operations.py +337 -0
  108. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/worktree_operations.py +131 -0
  109. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/plugin.py +97 -3
  110. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/steps/ai_pr_step.py +29 -97
  111. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/steps/code_review_steps.py +1784 -0
  112. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/steps/create_pr_step.py +123 -0
  113. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/steps/github_prompt_steps.py +50 -40
  114. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/steps/issue_steps.py +62 -38
  115. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/steps/pr_review_steps.py +1114 -0
  116. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/steps/select_cli_step.py +58 -0
  117. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/steps/worktree_steps.py +114 -0
  118. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/utils.py +61 -1
  119. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/__init__.py +8 -0
  120. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/code_block.py +287 -0
  121. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_thread.py +136 -0
  122. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_utils.py +201 -0
  123. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_view.py +360 -0
  124. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/reply_comment.py +80 -0
  125. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-issue-ai.yaml +0 -5
  126. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-pr-ai.yaml +13 -1
  127. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/workflows/respond-pr-comments.yaml +66 -0
  128. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr-new-findings.yaml.disabled +91 -0
  129. titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr-thread-resolution.yaml.disabled +56 -0
  130. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/jira_agent.py +33 -10
  131. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/prompts.py +2 -6
  132. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/validators.py +4 -4
  133. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/__init__.py +9 -0
  134. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/jira_client.py +415 -0
  135. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/__init__.py +10 -0
  136. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/jira_network.py +169 -0
  137. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/__init__.py +24 -0
  138. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/comment_service.py +136 -0
  139. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/issue_service.py +523 -0
  140. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/link_service.py +106 -0
  141. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/metadata_service.py +297 -0
  142. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/project_service.py +135 -0
  143. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/transition_service.py +180 -0
  144. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/config/templates/generic_issue.md.j2 +34 -0
  145. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/constants/__init__.py +34 -0
  146. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/constants/defaults.py +18 -0
  147. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/constants/messages.py +161 -0
  148. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/constants/templates.py +69 -0
  149. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/constants.py +266 -0
  150. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/markdown_formatter.py +3 -8
  151. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/messages.py +4 -1
  152. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/__init__.py +102 -0
  153. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/enums.py +194 -0
  154. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/formatting.py +227 -0
  155. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/__init__.py +27 -0
  156. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/comment_mapper.py +50 -0
  157. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_mapper.py +102 -0
  158. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_type_mapper.py +36 -0
  159. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/priority_mapper.py +33 -0
  160. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/project_mapper.py +44 -0
  161. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/status_mapper.py +37 -0
  162. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/transition_mapper.py +43 -0
  163. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/user_mapper.py +29 -0
  164. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/version_mapper.py +33 -0
  165. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/__init__.py +30 -0
  166. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/comment.py +20 -0
  167. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue.py +65 -0
  168. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue_type.py +18 -0
  169. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/priority.py +16 -0
  170. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/project.py +23 -0
  171. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/status.py +26 -0
  172. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/transition.py +18 -0
  173. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/user.py +18 -0
  174. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/version.py +18 -0
  175. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/view.py +171 -0
  176. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/operations/__init__.py +47 -0
  177. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_formatting_operations.py +180 -0
  178. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_operations.py +142 -0
  179. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/operations/jql_operations.py +163 -0
  180. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/plugin.py +55 -20
  181. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/ai_enhance_issue_description_step.py +233 -0
  182. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/confirm_auto_assign_step.py +67 -0
  183. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/create_generic_issue_step.py +143 -0
  184. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/get_issue_step.py +85 -0
  185. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/list_versions_step.py +124 -0
  186. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/prompt_issue_description_step.py +52 -0
  187. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/review_issue_description_step.py +83 -0
  188. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_jql_step.py +158 -0
  189. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_saved_query_step.py +206 -0
  190. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_priority_step.py +99 -0
  191. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_type_step.py +120 -0
  192. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/__init__.py +3 -0
  193. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/utils/input_validation.py +54 -0
  194. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/issue_sorter.py +3 -3
  195. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/saved_queries.py +4 -5
  196. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/utils.py +86 -0
  197. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/analyze-jira-issues.yaml +2 -10
  198. titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/workflows/create-generic-issue.yaml +56 -0
  199. {titan_cli-0.1.8 → titan_cli-0.3.2}/pyproject.toml +13 -4
  200. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/agents/base.py +36 -12
  201. titan_cli-0.3.2/titan_cli/ai/llm_tools.py +115 -0
  202. titan_cli-0.3.2/titan_cli/cli.py +159 -0
  203. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/config.py +34 -14
  204. titan_cli-0.3.2/titan_cli/core/logging/__init__.py +29 -0
  205. titan_cli-0.3.2/titan_cli/core/logging/config.py +321 -0
  206. titan_cli-0.3.2/titan_cli/core/logging/decorators.py +112 -0
  207. titan_cli-0.1.8/titan_cli/core/models.py → titan_cli-0.3.2/titan_cli/core/models/__init__.py +2 -2
  208. titan_cli-0.3.2/titan_cli/core/models/code_review.py +122 -0
  209. titan_cli-0.3.2/titan_cli/core/plugins/community.py +771 -0
  210. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/plugins/models.py +8 -0
  211. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/plugins/plugin_base.py +33 -2
  212. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/plugins/plugin_registry.py +110 -17
  213. titan_cli-0.3.2/titan_cli/core/result.py +66 -0
  214. titan_cli-0.3.2/titan_cli/core/utils.py +44 -0
  215. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/models.py +5 -0
  216. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/project_step_source.py +22 -1
  217. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/workflow_filter_service.py +3 -3
  218. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/workflow_registry.py +112 -2
  219. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/workflow_sources.py +83 -45
  220. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/builder.py +18 -3
  221. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/context.py +1 -0
  222. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/steps/ai_assistant_step.py +5 -8
  223. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/steps/command_step.py +3 -6
  224. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/workflow_executor.py +1 -1
  225. titan_cli-0.3.2/titan_cli/external_cli/adapters/__init__.py +9 -0
  226. titan_cli-0.3.2/titan_cli/external_cli/adapters/base.py +78 -0
  227. titan_cli-0.3.2/titan_cli/external_cli/adapters/claude.py +67 -0
  228. titan_cli-0.3.2/titan_cli/external_cli/adapters/codex.py +104 -0
  229. titan_cli-0.3.2/titan_cli/external_cli/adapters/gemini.py +68 -0
  230. titan_cli-0.3.2/titan_cli/external_cli/adapters/registry.py +46 -0
  231. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/external_cli/configs.py +5 -0
  232. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/__init__.py +44 -17
  233. titan_cli-0.3.2/titan_cli/ui/tui/colors.py +151 -0
  234. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/ai_config.py +6 -2
  235. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/ai_config_wizard.py +142 -27
  236. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/base.py +20 -3
  237. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/global_setup_wizard.py +2 -2
  238. titan_cli-0.3.2/titan_cli/ui/tui/screens/install_plugin_screen.py +623 -0
  239. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/main_menu.py +49 -1
  240. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/plugin_config_wizard.py +42 -42
  241. titan_cli-0.3.2/titan_cli/ui/tui/screens/plugin_management.py +698 -0
  242. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/project_setup_wizard.py +14 -24
  243. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/workflow_execution.py +25 -17
  244. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/workflows.py +2 -1
  245. titan_cli-0.3.2/titan_cli/ui/tui/textual_components.py +1299 -0
  246. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/textual_workflow_executor.py +90 -4
  247. titan_cli-0.3.2/titan_cli/ui/tui/theme.py +141 -0
  248. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/__init__.py +11 -0
  249. titan_cli-0.3.2/titan_cli/ui/tui/widgets/decision_badge.py +58 -0
  250. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/panel.py +48 -6
  251. titan_cli-0.3.2/titan_cli/ui/tui/widgets/panel_container.py +94 -0
  252. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/prompt_choice.py +15 -2
  253. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/prompt_input.py +15 -2
  254. titan_cli-0.3.2/titan_cli/ui/tui/widgets/prompt_option_list.py +168 -0
  255. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/prompt_selection_list.py +1 -1
  256. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/prompt_textarea.py +15 -4
  257. titan_cli-0.3.2/titan_cli/ui/tui/widgets/step_container.py +67 -0
  258. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/styled_option_list.py +24 -0
  259. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/table.py +30 -3
  260. titan_cli-0.3.2/titan_cli/ui/tui/widgets/wizard.py +49 -0
  261. titan_cli-0.3.2/titan_cli/utils/__init__.py +0 -0
  262. titan_cli-0.3.2/titan_cli/utils/autoupdate.py +309 -0
  263. titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/clients/git_client.py +0 -907
  264. titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/models.py +0 -39
  265. titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/steps/create_branch_step.py +0 -131
  266. titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/steps/diff_summary_step.py +0 -180
  267. titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/steps/push_step.py +0 -79
  268. titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/steps/status_step.py +0 -66
  269. titan_cli-0.1.8/plugins/titan-plugin-github/titan_plugin_github/clients/github_client.py +0 -1105
  270. titan_cli-0.1.8/plugins/titan-plugin-github/titan_plugin_github/models.py +0 -330
  271. titan_cli-0.1.8/plugins/titan-plugin-github/titan_plugin_github/steps/create_pr_step.py +0 -96
  272. titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/clients/jira_client.py +0 -746
  273. titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/models.py +0 -89
  274. titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/steps/get_issue_step.py +0 -86
  275. titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/steps/list_versions_step.py +0 -133
  276. titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_jql_step.py +0 -191
  277. titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_saved_query_step.py +0 -240
  278. titan_cli-0.1.8/titan_cli/cli.py +0 -92
  279. titan_cli-0.1.8/titan_cli/ui/tui/screens/plugin_management.py +0 -377
  280. titan_cli-0.1.8/titan_cli/ui/tui/textual_components.py +0 -694
  281. titan_cli-0.1.8/titan_cli/ui/tui/theme.py +0 -131
  282. titan_cli-0.1.8/titan_cli/ui/tui/widgets/step_container.py +0 -70
  283. titan_cli-0.1.8/titan_cli/utils/autoupdate.py +0 -155
  284. {titan_cli-0.1.8 → titan_cli-0.3.2}/LICENSE +0 -0
  285. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/__init__.py +0 -0
  286. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/exceptions.py +0 -0
  287. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/__init__.py +0 -0
  288. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/checkout_step.py +0 -0
  289. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/pull_step.py +0 -0
  290. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/restore_original_branch_step.py +0 -0
  291. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/save_current_branch_step.py +0 -0
  292. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/__init__.py +0 -0
  293. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/commit_ai_preview.py +0 -0
  294. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/workflows/commit-ai.yaml +0 -0
  295. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/__init__.py +0 -0
  296. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/agents/config_loader.py +0 -0
  297. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/clients/__init__.py +0 -0
  298. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/config/__init__.py +0 -0
  299. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/exceptions.py +0 -0
  300. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/messages.py +0 -0
  301. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/steps/__init__.py +0 -0
  302. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/steps/preview_step.py +0 -0
  303. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/__init__.py +0 -0
  304. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/create_pr_ai_preview.py +0 -0
  305. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/__init__.py +0 -0
  306. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/__init__.py +0 -0
  307. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/config_loader.py +0 -0
  308. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/response_parser.py +0 -0
  309. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/token_tracker.py +0 -0
  310. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/config/jira_agent.toml +0 -0
  311. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/config/templates/issue_analysis.md.j2 +0 -0
  312. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/exceptions.py +0 -0
  313. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/__init__.py +0 -0
  314. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/ai_analyze_issue_step.py +0 -0
  315. {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/prompt_select_issue_step.py +0 -0
  316. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/__init__.py +0 -0
  317. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/__main__.py +0 -0
  318. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/__init__.py +0 -0
  319. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/agents/__init__.py +0 -0
  320. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/client.py +0 -0
  321. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/constants.py +0 -0
  322. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/exceptions.py +0 -0
  323. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/models.py +0 -0
  324. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/oauth_helper.py +0 -0
  325. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/providers/__init__.py +0 -0
  326. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/providers/anthropic.py +0 -0
  327. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/providers/base.py +0 -0
  328. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/providers/gemini.py +0 -0
  329. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/clients/__init__.py +0 -0
  330. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/clients/gcloud_client.py +0 -0
  331. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/__init__.py +0 -0
  332. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/discovery.py +0 -0
  333. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/errors.py +1 -1
  334. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/plugins/available.py +0 -0
  335. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/secrets.py +0 -0
  336. {titan_cli-0.1.8/titan_cli/external_cli → titan_cli-0.3.2/titan_cli/core/validators}/__init__.py +0 -0
  337. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/__init__.py +0 -0
  338. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/workflow_exceptions.py +0 -0
  339. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/__init__.py +0 -0
  340. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/mock_context.py +0 -0
  341. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/results.py +0 -0
  342. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/utils/__init__.py +0 -0
  343. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/utils/venv.py +0 -0
  344. {titan_cli-0.1.8/titan_cli/utils → titan_cli-0.3.2/titan_cli/external_cli}/__init__.py +0 -0
  345. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/external_cli/launcher.py +0 -0
  346. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/messages.py +0 -0
  347. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/__previews__/statusbar_preview.py +0 -0
  348. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/app.py +0 -0
  349. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/icons.py +0 -0
  350. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/__init__.py +0 -0
  351. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/cli_launcher.py +0 -0
  352. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/button.py +0 -0
  353. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/header.py +0 -0
  354. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/multiline_input.py +0 -0
  355. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/status_bar.py +0 -0
  356. {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/text.py +0 -0
@@ -1,9 +1,9 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: titan-cli
3
- Version: 0.1.8
3
+ Version: 0.3.2
4
4
  Summary: Modular development tools orchestrator - Streamline your workflows with AI integration and intuitive terminal UI
5
- Home-page: https://github.com/masmovil/titan-cli
6
5
  License: MIT
6
+ License-File: LICENSE
7
7
  Keywords: cli,workflow,orchestrator,automation,devtools,ai
8
8
  Author: MasOrange Apps Team
9
9
  Author-email: apps-management-stores@masorange.es
@@ -17,6 +17,8 @@ Classifier: Programming Language :: Python :: 3
17
17
  Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
19
  Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
20
22
  Requires-Dist: anthropic (>=0.75.0,<0.76.0)
21
23
  Requires-Dist: google-auth (>=2.43.0,<3.0.0)
22
24
  Requires-Dist: google-genai (>=1.58.0,<2.0.0)
@@ -27,12 +29,14 @@ Requires-Dist: pydantic (>=2.0.0,<3.0.0)
27
29
  Requires-Dist: python-dotenv (>=1.2.1,<2.0.0)
28
30
  Requires-Dist: pyyaml (>=6.0.3,<7.0.0)
29
31
  Requires-Dist: requests (>=2.31.0,<3.0.0)
32
+ Requires-Dist: structlog (>=25.5.0,<26.0.0)
30
33
  Requires-Dist: textual (>=1.0.0,<2.0.0)
31
34
  Requires-Dist: tomli (>=2.0.0,<3.0.0)
32
35
  Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
33
36
  Requires-Dist: typer (>=0.20.0,<1.0.0)
34
- Project-URL: Documentation, https://github.com/masmovil/titan-cli
35
- Project-URL: Repository, https://github.com/masmovil/titan-cli
37
+ Project-URL: Documentation, https://masorange.github.io/titan-cli/
38
+ Project-URL: Homepage, https://github.com/masorange/titan-cli
39
+ Project-URL: Repository, https://github.com/masorange/titan-cli
36
40
  Description-Content-Type: text/markdown
37
41
 
38
42
  # Titan CLI
@@ -60,22 +64,32 @@ pipx install titan-cli
60
64
 
61
65
  # Verify installation
62
66
  titan --version
67
+
68
+ # Launch Titan
69
+ titan
63
70
  ```
64
71
 
65
- ### For Development
72
+ **Note:** This installs the stable production version. You only get the `titan` command.
73
+
74
+ ### For Contributors (Development Setup)
66
75
 
76
+ **See [DEVELOPMENT.md](DEVELOPMENT.md) for complete development setup.**
77
+
78
+ Quick start:
67
79
  ```bash
68
80
  # Clone repository
69
- git clone https://github.com/masmovil/titan-cli.git
81
+ git clone https://github.com/masorange/titan-cli.git
70
82
  cd titan-cli
71
83
 
72
- # Install with Poetry (editable mode)
73
- poetry install
84
+ # Setup development environment
85
+ make dev-install
74
86
 
75
87
  # Run development version
76
- poetry run titan-dev
88
+ titan-dev
77
89
  ```
78
90
 
91
+ **Note:** Development setup creates a `titan-dev` command that runs from your local codebase, allowing you to test changes immediately. This command is **not available** to end users who install from PyPI.
92
+
79
93
  ## 🚀 Quick Start
80
94
 
81
95
  ### First Time Setup
@@ -120,7 +134,7 @@ Configure during first setup or later via the TUI settings.
120
134
 
121
135
  - **Contributing**: See [DEVELOPMENT.md](DEVELOPMENT.md)
122
136
  - **AI Agent Guide**: See [CLAUDE.md](CLAUDE.md)
123
- - **Release History**: See [GitHub Releases](https://github.com/masmovil/titan-cli/releases)
137
+ - **Release History**: See [GitHub Releases](https://github.com/masorange/titan-cli/releases)
124
138
 
125
139
  ## 🤝 Contributing
126
140
 
@@ -23,22 +23,32 @@ pipx install titan-cli
23
23
 
24
24
  # Verify installation
25
25
  titan --version
26
+
27
+ # Launch Titan
28
+ titan
26
29
  ```
27
30
 
28
- ### For Development
31
+ **Note:** This installs the stable production version. You only get the `titan` command.
32
+
33
+ ### For Contributors (Development Setup)
29
34
 
35
+ **See [DEVELOPMENT.md](DEVELOPMENT.md) for complete development setup.**
36
+
37
+ Quick start:
30
38
  ```bash
31
39
  # Clone repository
32
- git clone https://github.com/masmovil/titan-cli.git
40
+ git clone https://github.com/masorange/titan-cli.git
33
41
  cd titan-cli
34
42
 
35
- # Install with Poetry (editable mode)
36
- poetry install
43
+ # Setup development environment
44
+ make dev-install
37
45
 
38
46
  # Run development version
39
- poetry run titan-dev
47
+ titan-dev
40
48
  ```
41
49
 
50
+ **Note:** Development setup creates a `titan-dev` command that runs from your local codebase, allowing you to test changes immediately. This command is **not available** to end users who install from PyPI.
51
+
42
52
  ## 🚀 Quick Start
43
53
 
44
54
  ### First Time Setup
@@ -83,7 +93,7 @@ Configure during first setup or later via the TUI settings.
83
93
 
84
94
  - **Contributing**: See [DEVELOPMENT.md](DEVELOPMENT.md)
85
95
  - **AI Agent Guide**: See [CLAUDE.md](CLAUDE.md)
86
- - **Release History**: See [GitHub Releases](https://github.com/masmovil/titan-cli/releases)
96
+ - **Release History**: See [GitHub Releases](https://github.com/masorange/titan-cli/releases)
87
97
 
88
98
  ## 🤝 Contributing
89
99
 
@@ -3,6 +3,7 @@
3
3
  Git client module
4
4
  """
5
5
 
6
- from .git_client import GitClient, GitClientError
6
+ from .git_client import GitClient
7
+ from ..exceptions import GitClientError
7
8
 
8
9
  __all__ = ["GitClient", "GitClientError"]
@@ -0,0 +1,462 @@
1
+ # plugins/titan-plugin-git/titan_plugin_git/clients/git_client_new.py
2
+ """
3
+ Git Client Facade
4
+
5
+ Unified API that delegates to specialized services.
6
+ All methods return ClientResult for consistent error handling.
7
+ """
8
+ from typing import List, Optional, Tuple
9
+
10
+ from titan_cli.core.result import ClientResult, ClientSuccess, ClientError
11
+
12
+ from .network import GitNetwork
13
+ from .services import (
14
+ BranchService,
15
+ CommitService,
16
+ StatusService,
17
+ DiffService,
18
+ RemoteService,
19
+ StashService,
20
+ TagService,
21
+ WorktreeService,
22
+ )
23
+ from ..models.view import (
24
+ UIGitBranch,
25
+ UIGitCommit,
26
+ UIGitStatus,
27
+ UIGitTag,
28
+ UIGitWorktree,
29
+ )
30
+ from ..messages import msg
31
+
32
+
33
+ class GitClient:
34
+ """
35
+ Git client facade - delegates to specialized services.
36
+
37
+ All public methods return ClientResult[T] for consistent error handling.
38
+ Uses pattern matching (match/case) for result handling in operations and steps.
39
+
40
+ Examples:
41
+ >>> client = GitClient()
42
+ >>> result = client.get_current_branch()
43
+ >>> match result:
44
+ ... case ClientSuccess(data=branch):
45
+ ... print(f"Current branch: {branch}")
46
+ ... case ClientError(error_message=err):
47
+ ... print(f"Error: {err}")
48
+ """
49
+
50
+ def __init__(
51
+ self,
52
+ repo_path: str = ".",
53
+ main_branch: str = "main",
54
+ default_remote: str = "origin"
55
+ ):
56
+ """
57
+ Initialize Git client.
58
+
59
+ Args:
60
+ repo_path: Path to git repository (default: current directory)
61
+ main_branch: Main branch name (from config)
62
+ default_remote: Default remote name (from config)
63
+ """
64
+ self.repo_path = repo_path
65
+ self.main_branch = main_branch
66
+ self.default_remote = default_remote
67
+
68
+ # Initialize network layer
69
+ self.network = GitNetwork(repo_path=repo_path)
70
+
71
+ # Initialize services
72
+ self.branch_service = BranchService(self.network)
73
+ self.commit_service = CommitService(self.network, main_branch, default_remote)
74
+ self.status_service = StatusService(self.network)
75
+ self.diff_service = DiffService(self.network, default_remote)
76
+ self.remote_service = RemoteService(self.network)
77
+ self.stash_service = StashService(self.network)
78
+ self.tag_service = TagService(self.network)
79
+ self.worktree_service = WorktreeService(self.network)
80
+
81
+ # State for safe_checkout / return_to_original_branch
82
+ self._original_branch: Optional[str] = None
83
+
84
+ # ===== Branch Methods =====
85
+
86
+ def get_current_branch(self) -> ClientResult[str]:
87
+ """Get current branch name."""
88
+ return self.branch_service.get_current_branch()
89
+
90
+ def get_branches(self, remote: bool = False) -> ClientResult[List[UIGitBranch]]:
91
+ """List branches."""
92
+ return self.branch_service.get_branches(remote=remote)
93
+
94
+ def create_branch(
95
+ self, branch_name: str, start_point: str = "HEAD"
96
+ ) -> ClientResult[None]:
97
+ """Create a new branch."""
98
+ return self.branch_service.create_branch(branch_name, start_point)
99
+
100
+ def delete_branch(self, branch: str, force: bool = False) -> ClientResult[None]:
101
+ """Delete a branch."""
102
+ return self.branch_service.delete_branch(branch, force)
103
+
104
+ def safe_delete_branch(self, branch: str, force: bool = False) -> ClientResult[None]:
105
+ """Delete branch if not protected."""
106
+ if self.is_protected_branch(branch):
107
+ return ClientError(
108
+ error_message=msg.Git.BRANCH_PROTECTED.format(branch=branch),
109
+ error_code="BRANCH_PROTECTED"
110
+ )
111
+ return self.branch_service.delete_branch(branch, force)
112
+
113
+ def checkout(self, branch: str) -> ClientResult[None]:
114
+ """Checkout a branch."""
115
+ return self.branch_service.checkout(branch)
116
+
117
+ def branch_exists_on_remote(
118
+ self, branch: str, remote: str = "origin"
119
+ ) -> ClientResult[bool]:
120
+ """Check if a branch exists on remote."""
121
+ return self.branch_service.branch_exists_on_remote(branch, remote)
122
+
123
+ def update_branch(
124
+ self, branch: str, remote: Optional[str] = None
125
+ ) -> ClientResult[None]:
126
+ """
127
+ Update branch from remote (fetch + merge --ff-only).
128
+
129
+ Args:
130
+ branch: Branch to update
131
+ remote: Remote name (defaults to configured default_remote)
132
+
133
+ Returns:
134
+ ClientResult[None]
135
+ """
136
+ remote = remote or self.default_remote
137
+
138
+ # Get current branch
139
+ current_result = self.get_current_branch()
140
+ match current_result:
141
+ case ClientSuccess(data=current):
142
+ pass
143
+ case ClientError() as err:
144
+ return err
145
+
146
+ # Checkout target branch if needed
147
+ if current != branch:
148
+ checkout_result = self.checkout(branch)
149
+ match checkout_result:
150
+ case ClientError() as err:
151
+ return err
152
+ case _:
153
+ pass
154
+
155
+ # Fetch
156
+ fetch_result = self.remote_service.fetch(remote, branch)
157
+ match fetch_result:
158
+ case ClientError() as err:
159
+ return err
160
+ case _:
161
+ pass
162
+
163
+ # Merge --ff-only
164
+ try:
165
+ self.network.run_command(["git", "merge", "--ff-only", f"{remote}/{branch}"])
166
+ except Exception as e:
167
+ error_str = str(e)
168
+ if "merge conflict" in error_str.lower():
169
+ return ClientError(
170
+ error_message=msg.Git.MERGE_CONFLICT_WHILE_UPDATING.format(branch=branch),
171
+ error_code="MERGE_CONFLICT"
172
+ )
173
+ return ClientError(error_message=error_str, error_code="MERGE_ERROR")
174
+
175
+ # Return to original branch if needed
176
+ if current != branch:
177
+ return self.checkout(current)
178
+
179
+ return ClientSuccess(data=None, message=f"Branch '{branch}' updated")
180
+
181
+ def update_from_main(self) -> ClientResult[None]:
182
+ """Update current branch from the configured main branch."""
183
+ return self.update_branch(self.main_branch, self.default_remote)
184
+
185
+ def safe_checkout(self, branch: str, auto_stash: bool = True) -> ClientResult[None]:
186
+ """
187
+ Safely checkout a branch with optional auto-stashing.
188
+
189
+ Args:
190
+ branch: Branch to checkout
191
+ auto_stash: Automatically stash uncommitted changes
192
+
193
+ Returns:
194
+ ClientResult[None]
195
+ """
196
+ # Save current branch
197
+ current_result = self.get_current_branch()
198
+ match current_result:
199
+ case ClientSuccess(data=current):
200
+ self._original_branch = current
201
+ case ClientError() as err:
202
+ return err
203
+
204
+ # Check for uncommitted changes
205
+ has_changes_result = self.status_service.has_uncommitted_changes()
206
+ match has_changes_result:
207
+ case ClientSuccess(data=has_changes):
208
+ pass
209
+ case ClientError() as err:
210
+ return err
211
+
212
+ # Stash if needed
213
+ if has_changes and auto_stash:
214
+ stash_result = self.stash_service.stash_push()
215
+ match stash_result:
216
+ case ClientError() as err:
217
+ return err
218
+ case _:
219
+ pass
220
+
221
+ # Checkout
222
+ return self.checkout(branch)
223
+
224
+ def return_to_original_branch(self) -> ClientResult[None]:
225
+ """Return to the original branch saved by safe_checkout."""
226
+ if not self._original_branch:
227
+ return ClientSuccess(data=None, message="No original branch to return to")
228
+
229
+ checkout_result = self.checkout(self._original_branch)
230
+ self._original_branch = None
231
+ return checkout_result
232
+
233
+ def is_protected_branch(self, branch: str) -> bool:
234
+ """Check if a branch is protected (main, master, develop, etc.)."""
235
+ protected = ["main", "master", "develop", "staging", "production"]
236
+ return branch in protected
237
+
238
+ # ===== Commit Methods =====
239
+
240
+ def commit(
241
+ self, message: str, all: bool = False, no_verify: bool = True
242
+ ) -> ClientResult[str]:
243
+ """Create a commit."""
244
+ return self.commit_service.commit(message, all, no_verify)
245
+
246
+ def commit_files(
247
+ self, files: list, message: str, no_verify: bool = True
248
+ ) -> ClientResult[str]:
249
+ """Create a commit with specific files only."""
250
+ return self.commit_service.commit_files(files, message, no_verify)
251
+
252
+ def get_current_commit(self) -> ClientResult[str]:
253
+ """Get current commit SHA (HEAD)."""
254
+ return self.commit_service.get_current_commit()
255
+
256
+ def get_commit_sha(self, ref: str) -> ClientResult[str]:
257
+ """Get commit SHA for any git ref."""
258
+ return self.commit_service.get_commit_sha(ref)
259
+
260
+ def get_commits_vs_base(self) -> ClientResult[List[str]]:
261
+ """Get commit messages from base branch to HEAD."""
262
+ return self.commit_service.get_commits_vs_base()
263
+
264
+ def get_branch_commits(
265
+ self, base_branch: str, head_branch: str
266
+ ) -> ClientResult[List[str]]:
267
+ """Get list of commits in head_branch that are not in base_branch."""
268
+ return self.commit_service.get_branch_commits(base_branch, head_branch)
269
+
270
+ def count_commits_ahead(self, base_branch: str = "develop") -> ClientResult[int]:
271
+ """Count how many commits current branch is ahead of base branch."""
272
+ return self.commit_service.count_commits_ahead(base_branch)
273
+
274
+ def count_unpushed_commits(
275
+ self, branch: Optional[str] = None, remote: str = "origin"
276
+ ) -> ClientResult[int]:
277
+ """Count how many commits are unpushed to remote."""
278
+ return self.commit_service.count_unpushed_commits(branch, remote)
279
+
280
+ # ===== Status Methods =====
281
+
282
+ def get_status(self) -> ClientResult[UIGitStatus]:
283
+ """Get repository status."""
284
+ return self.status_service.get_status()
285
+
286
+ def has_uncommitted_changes(self) -> ClientResult[bool]:
287
+ """Check if repository has uncommitted changes."""
288
+ return self.status_service.has_uncommitted_changes()
289
+
290
+ # ===== Diff Methods =====
291
+
292
+ def get_diff(self, base_ref: str, head_ref: str = "HEAD") -> ClientResult[str]:
293
+ """Get diff between two references."""
294
+ return self.diff_service.get_diff(base_ref, head_ref)
295
+
296
+ def get_uncommitted_diff(self) -> ClientResult[str]:
297
+ """Get diff of all uncommitted changes."""
298
+ return self.diff_service.get_uncommitted_diff()
299
+
300
+ def get_staged_diff(self) -> ClientResult[str]:
301
+ """Get diff of staged changes only."""
302
+ return self.diff_service.get_staged_diff()
303
+
304
+ def get_unstaged_diff(self) -> ClientResult[str]:
305
+ """Get diff of unstaged changes only."""
306
+ return self.diff_service.get_unstaged_diff()
307
+
308
+ def get_file_diff(self, file_path: str) -> ClientResult[str]:
309
+ """Get diff for a specific file."""
310
+ return self.diff_service.get_file_diff(file_path)
311
+
312
+ def get_branch_diff(self, base_branch: str, head_branch: str, context_lines: int = 3, use_remote: bool = False) -> ClientResult[str]:
313
+ """
314
+ Get diff between two branches.
315
+
316
+ Args:
317
+ base_branch: Base branch name
318
+ head_branch: Head branch name
319
+ context_lines: Number of context lines (default: 3)
320
+ use_remote: If True, both branches are treated as remote refs (default: False)
321
+
322
+ Returns:
323
+ ClientResult[str] with diff output
324
+ """
325
+ return self.diff_service.get_branch_diff(base_branch, head_branch, context_lines, use_remote)
326
+
327
+ def get_diff_stat(self, base_ref: str, head_ref: str = "HEAD") -> ClientResult[str]:
328
+ """Get diff stat summary."""
329
+ return self.diff_service.get_diff_stat(base_ref, head_ref)
330
+
331
+ def get_uncommitted_diff_stat(self) -> ClientResult[str]:
332
+ """Get diff stat summary of uncommitted changes."""
333
+ return self.diff_service.get_uncommitted_diff_stat()
334
+
335
+ def get_branch_diff_stat(
336
+ self, base_branch: str, head_branch: str
337
+ ) -> ClientResult[str]:
338
+ """Get diff stat summary between two branches."""
339
+ return self.diff_service.get_diff_stat(
340
+ f"{self.default_remote}/{base_branch}",
341
+ head_branch
342
+ )
343
+
344
+ # ===== Remote Methods =====
345
+
346
+ def push(
347
+ self,
348
+ remote: str = "origin",
349
+ branch: Optional[str] = None,
350
+ set_upstream: bool = False,
351
+ tags: bool = False
352
+ ) -> ClientResult[None]:
353
+ """Push to remote."""
354
+ return self.remote_service.push(remote, branch, set_upstream, tags)
355
+
356
+ def pull(
357
+ self, remote: str = "origin", branch: Optional[str] = None
358
+ ) -> ClientResult[None]:
359
+ """Pull from remote."""
360
+ return self.remote_service.pull(remote, branch)
361
+
362
+ def fetch(
363
+ self,
364
+ remote: str = "origin",
365
+ branch: Optional[str] = None,
366
+ all: bool = False
367
+ ) -> ClientResult[None]:
368
+ """Fetch from remote."""
369
+ return self.remote_service.fetch(remote, branch, all)
370
+
371
+ def get_github_repo_info(self) -> ClientResult[Tuple[Optional[str], Optional[str]]]:
372
+ """Extract GitHub repository owner and name from origin."""
373
+ return self.remote_service.get_github_repo_info()
374
+
375
+ # ===== Stash Methods =====
376
+
377
+ def stash_push(self, message: Optional[str] = None) -> ClientResult[bool]:
378
+ """Stash uncommitted changes."""
379
+ return self.stash_service.stash_push(message)
380
+
381
+ def stash_pop(self, stash_ref: Optional[str] = None) -> ClientResult[bool]:
382
+ """Pop stash (apply and remove)."""
383
+ return self.stash_service.stash_pop(stash_ref)
384
+
385
+ def find_stash_by_message(self, message: str) -> ClientResult[Optional[str]]:
386
+ """Find stash by message."""
387
+ return self.stash_service.find_stash_by_message(message)
388
+
389
+ def restore_stash(self, message: str) -> ClientResult[bool]:
390
+ """Restore stash by finding it with a message and popping it."""
391
+ return self.stash_service.restore_stash(message)
392
+
393
+ # ===== Tag Methods =====
394
+
395
+ def create_tag(
396
+ self, tag_name: str, message: str, ref: str = "HEAD"
397
+ ) -> ClientResult[None]:
398
+ """Create an annotated tag."""
399
+ return self.tag_service.create_tag(tag_name, message, ref)
400
+
401
+ def delete_tag(self, tag_name: str) -> ClientResult[None]:
402
+ """Delete a local tag."""
403
+ return self.tag_service.delete_tag(tag_name)
404
+
405
+ def tag_exists(self, tag_name: str) -> ClientResult[bool]:
406
+ """Check if a tag exists locally."""
407
+ return self.tag_service.tag_exists(tag_name)
408
+
409
+ def list_tags(self) -> ClientResult[List[UIGitTag]]:
410
+ """List all tags in the repository."""
411
+ return self.tag_service.list_tags()
412
+
413
+ # ===== Worktree Methods =====
414
+
415
+ def create_worktree(
416
+ self, path: str, branch: str, create_branch: bool = False, detached: bool = False
417
+ ) -> ClientResult[None]:
418
+ """Create a new worktree."""
419
+ return self.worktree_service.create_worktree(path, branch, create_branch, detached)
420
+
421
+ def remove_worktree(self, path: str, force: bool = False) -> ClientResult[None]:
422
+ """Remove a worktree."""
423
+ return self.worktree_service.remove_worktree(path, force)
424
+
425
+ def list_worktrees(self) -> ClientResult[List[UIGitWorktree]]:
426
+ """List all worktrees."""
427
+ return self.worktree_service.list_worktrees()
428
+
429
+ def run_in_worktree(self, worktree_path: str, args: List[str]) -> ClientResult[str]:
430
+ """Run a git command in a specific worktree."""
431
+ return self.worktree_service.run_in_worktree(worktree_path, args)
432
+
433
+ def get_commits(self, worktree_path: str, limit: int = 10) -> ClientResult[List[UIGitCommit]]:
434
+ """Get recent commits from a worktree."""
435
+ return self.worktree_service.get_commits(worktree_path, limit)
436
+
437
+ def get_worktree_diff_stat(self, worktree_path: str) -> ClientResult[str]:
438
+ """Get diff stat of uncommitted changes in a worktree."""
439
+ return self.worktree_service.get_diff_stat_in_worktree(worktree_path)
440
+
441
+ def checkout_branch_in_worktree(
442
+ self, worktree_path: str, branch_name: str, force: bool = False
443
+ ) -> ClientResult[None]:
444
+ """Checkout (or create) a branch in a worktree."""
445
+ return self.worktree_service.checkout_branch_in_worktree(worktree_path, branch_name, force)
446
+
447
+ def commit_in_worktree(
448
+ self,
449
+ worktree_path: str,
450
+ message: str,
451
+ add_all: bool = True,
452
+ no_verify: bool = False
453
+ ) -> ClientResult[str]:
454
+ """Stage and commit changes in a worktree."""
455
+ return self.worktree_service.commit_in_worktree(worktree_path, message, add_all, no_verify)
456
+
457
+ def push_from_worktree(
458
+ self, worktree_path: str, branch: str, remote: Optional[str] = None
459
+ ) -> ClientResult[None]:
460
+ """Push commits from a worktree to remote."""
461
+ remote = remote or self.default_remote
462
+ return self.worktree_service.push_from_worktree(worktree_path, branch, remote)
@@ -0,0 +1,4 @@
1
+ """Network layer for Git plugin."""
2
+ from .git_network import GitNetwork
3
+
4
+ __all__ = ["GitNetwork"]