titan-cli 0.4.0__tar.gz → 0.4.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 (350) hide show
  1. {titan_cli-0.4.0 → titan_cli-0.4.2}/PKG-INFO +1 -1
  2. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/git_client.py +14 -0
  3. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/commit_service.py +31 -0
  4. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/remote_service.py +18 -0
  5. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/tag_service.py +25 -0
  6. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/network/gh_network.py +2 -2
  7. {titan_cli-0.4.0 → titan_cli-0.4.2}/pyproject.toml +1 -1
  8. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/dependencies.py +1 -1
  9. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/config.py +144 -34
  10. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/plugins/available.py +1 -6
  11. titan_cli-0.4.0/titan_cli/core/plugins/community.py → titan_cli-0.4.2/titan_cli/core/plugins/community_sources.py +2 -275
  12. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/plugins/models.py +23 -3
  13. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/plugins/plugin_registry.py +90 -23
  14. titan_cli-0.4.2/titan_cli/core/plugins/runtime.py +174 -0
  15. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/install_plugin_screen.py +51 -46
  16. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/main_menu.py +29 -4
  17. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/plugin_management.py +112 -73
  18. {titan_cli-0.4.0 → titan_cli-0.4.2}/LICENSE +0 -0
  19. {titan_cli-0.4.0 → titan_cli-0.4.2}/README.md +0 -0
  20. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/__init__.py +0 -0
  21. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/__init__.py +0 -0
  22. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/network/__init__.py +0 -0
  23. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/network/git_network.py +0 -0
  24. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/__init__.py +0 -0
  25. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/branch_service.py +0 -0
  26. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/diff_service.py +0 -0
  27. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/stash_service.py +0 -0
  28. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/status_service.py +0 -0
  29. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/worktree_service.py +0 -0
  30. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/exceptions.py +0 -0
  31. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/messages.py +0 -0
  32. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/__init__.py +0 -0
  33. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/__init__.py +0 -0
  34. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/branch_mapper.py +0 -0
  35. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/commit_mapper.py +0 -0
  36. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/status_mapper.py +0 -0
  37. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/tag_mapper.py +0 -0
  38. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/worktree_mapper.py +0 -0
  39. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/__init__.py +0 -0
  40. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/branch.py +0 -0
  41. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/commit.py +0 -0
  42. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/status.py +0 -0
  43. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/tag.py +0 -0
  44. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/worktree.py +0 -0
  45. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/__init__.py +0 -0
  46. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/branch.py +0 -0
  47. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/commit.py +0 -0
  48. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/status.py +0 -0
  49. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/tag.py +0 -0
  50. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/worktree.py +0 -0
  51. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/operations/__init__.py +0 -0
  52. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/operations/branch_operations.py +0 -0
  53. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/operations/commit_operations.py +0 -0
  54. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/operations/diff_operations.py +0 -0
  55. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/plugin.py +0 -0
  56. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/__init__.py +0 -0
  57. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/ai_commit_message_step.py +0 -0
  58. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/branch_steps.py +0 -0
  59. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/checkout_step.py +0 -0
  60. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/commit_step.py +0 -0
  61. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/create_branch_step.py +0 -0
  62. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/create_worktree_step.py +0 -0
  63. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/diff_summary_step.py +0 -0
  64. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/pull_step.py +0 -0
  65. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/push_step.py +0 -0
  66. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/remove_worktree_step.py +0 -0
  67. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/restore_original_branch_step.py +0 -0
  68. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/save_current_branch_step.py +0 -0
  69. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/status_step.py +0 -0
  70. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/worktree_command_step.py +0 -0
  71. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/__init__.py +0 -0
  72. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/commit_ai_preview.py +0 -0
  73. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/workflows/commit-ai.yaml +0 -0
  74. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/__init__.py +0 -0
  75. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/agents/__init__.py +0 -0
  76. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/agents/code_review_agent.py +0 -0
  77. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/agents/config_loader.py +0 -0
  78. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/agents/issue_generator.py +0 -0
  79. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/agents/pr_agent.py +0 -0
  80. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/checklists/__init__.py +0 -0
  81. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/checklists/defaults.py +0 -0
  82. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/__init__.py +0 -0
  83. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/github_client.py +0 -0
  84. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/network/__init__.py +0 -0
  85. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_network.py +0 -0
  86. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_queries.py +0 -0
  87. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/protocols.py +0 -0
  88. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/__init__.py +0 -0
  89. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/issue_service.py +0 -0
  90. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/pr_service.py +0 -0
  91. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/release_service.py +0 -0
  92. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/review_service.py +0 -0
  93. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/team_service.py +0 -0
  94. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/config/__init__.py +0 -0
  95. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/config/pr_agent.toml +0 -0
  96. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/exceptions.py +0 -0
  97. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/managers/__init__.py +0 -0
  98. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/managers/checklist_manager.py +0 -0
  99. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/managers/diff_context_manager.py +0 -0
  100. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/messages.py +0 -0
  101. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/__init__.py +0 -0
  102. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/diff_models.py +0 -0
  103. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/formatting.py +0 -0
  104. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/__init__.py +0 -0
  105. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/comment_mapper.py +0 -0
  106. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/issue_mapper.py +0 -0
  107. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/pr_mapper.py +0 -0
  108. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/release_mapper.py +0 -0
  109. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/review_mapper.py +0 -0
  110. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/thread_mapper.py +0 -0
  111. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/__init__.py +0 -0
  112. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/__init__.py +0 -0
  113. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/issue_comment.py +0 -0
  114. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_comment.py +0 -0
  115. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_thread.py +0 -0
  116. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/user.py +0 -0
  117. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/__init__.py +0 -0
  118. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/issue.py +0 -0
  119. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/pull_request.py +0 -0
  120. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/release.py +0 -0
  121. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/review.py +0 -0
  122. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/user.py +0 -0
  123. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/review_enums.py +0 -0
  124. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/review_models.py +0 -0
  125. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/validators.py +0 -0
  126. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/view.py +0 -0
  127. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/__init__.py +0 -0
  128. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/code_review_operations.py +0 -0
  129. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/comment_operations.py +0 -0
  130. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/context_resolution_operations.py +0 -0
  131. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/findings_operations.py +0 -0
  132. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/issue_operations.py +0 -0
  133. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/manifest_operations.py +0 -0
  134. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/plan_prompt_operations.py +0 -0
  135. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/pr_creation_operations.py +0 -0
  136. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/pr_operations.py +0 -0
  137. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/review_action_operations.py +0 -0
  138. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/thread_resolution_operations.py +0 -0
  139. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/worktree_operations.py +0 -0
  140. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/plugin.py +0 -0
  141. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/__init__.py +0 -0
  142. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/ai_pr_step.py +0 -0
  143. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/code_review_steps.py +0 -0
  144. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/create_pr_step.py +0 -0
  145. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/github_prompt_steps.py +0 -0
  146. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/issue_steps.py +0 -0
  147. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/pr_review_steps.py +0 -0
  148. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/preview_step.py +0 -0
  149. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/select_cli_step.py +0 -0
  150. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/worktree_steps.py +0 -0
  151. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/utils.py +0 -0
  152. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/__init__.py +0 -0
  153. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/code_block.py +0 -0
  154. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_thread.py +0 -0
  155. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_utils.py +0 -0
  156. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_view.py +0 -0
  157. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/reply_comment.py +0 -0
  158. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/__init__.py +0 -0
  159. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/create_pr_ai_preview.py +0 -0
  160. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-issue-ai.yaml +0 -0
  161. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-pr-ai.yaml +0 -0
  162. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/respond-pr-comments.yaml +0 -0
  163. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr-new-findings.yaml.disabled +0 -0
  164. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr-thread-resolution.yaml.disabled +0 -0
  165. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/__init__.py +0 -0
  166. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/__init__.py +0 -0
  167. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/config_loader.py +0 -0
  168. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/jira_agent.py +0 -0
  169. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/prompts.py +0 -0
  170. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/response_parser.py +0 -0
  171. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/token_tracker.py +0 -0
  172. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/validators.py +0 -0
  173. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/__init__.py +0 -0
  174. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/jira_client.py +0 -0
  175. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/__init__.py +0 -0
  176. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/jira_network.py +0 -0
  177. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/__init__.py +0 -0
  178. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/comment_service.py +0 -0
  179. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/issue_service.py +0 -0
  180. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/link_service.py +0 -0
  181. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/metadata_service.py +0 -0
  182. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/project_service.py +0 -0
  183. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/transition_service.py +0 -0
  184. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/config/jira_agent.toml +0 -0
  185. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/config/templates/generic_issue.md.j2 +0 -0
  186. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/config/templates/issue_analysis.md.j2 +0 -0
  187. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/constants/__init__.py +0 -0
  188. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/constants/defaults.py +0 -0
  189. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/constants/messages.py +0 -0
  190. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/constants/templates.py +0 -0
  191. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/constants.py +0 -0
  192. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/exceptions.py +0 -0
  193. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/__init__.py +0 -0
  194. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/markdown_formatter.py +0 -0
  195. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/messages.py +0 -0
  196. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/__init__.py +0 -0
  197. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/enums.py +0 -0
  198. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/formatting.py +0 -0
  199. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/__init__.py +0 -0
  200. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/comment_mapper.py +0 -0
  201. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_mapper.py +0 -0
  202. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_type_mapper.py +0 -0
  203. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/priority_mapper.py +0 -0
  204. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/project_mapper.py +0 -0
  205. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/status_mapper.py +0 -0
  206. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/transition_mapper.py +0 -0
  207. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/user_mapper.py +0 -0
  208. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/version_mapper.py +0 -0
  209. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/__init__.py +0 -0
  210. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/comment.py +0 -0
  211. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue.py +0 -0
  212. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue_type.py +0 -0
  213. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/priority.py +0 -0
  214. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/project.py +0 -0
  215. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/status.py +0 -0
  216. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/transition.py +0 -0
  217. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/user.py +0 -0
  218. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/version.py +0 -0
  219. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/view.py +0 -0
  220. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/operations/__init__.py +0 -0
  221. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_formatting_operations.py +0 -0
  222. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_operations.py +0 -0
  223. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/operations/jql_operations.py +0 -0
  224. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/plugin.py +0 -0
  225. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/ai_analyze_issue_step.py +0 -0
  226. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/ai_enhance_issue_description_step.py +0 -0
  227. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/confirm_auto_assign_step.py +0 -0
  228. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/create_generic_issue_step.py +0 -0
  229. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/get_issue_step.py +0 -0
  230. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/list_versions_step.py +0 -0
  231. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/prompt_issue_description_step.py +0 -0
  232. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/prompt_select_issue_step.py +0 -0
  233. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/review_issue_description_step.py +0 -0
  234. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_jql_step.py +0 -0
  235. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_saved_query_step.py +0 -0
  236. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_priority_step.py +0 -0
  237. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_type_step.py +0 -0
  238. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/__init__.py +0 -0
  239. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/input_validation.py +0 -0
  240. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/issue_sorter.py +0 -0
  241. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/saved_queries.py +0 -0
  242. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils.py +0 -0
  243. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/analyze-jira-issues.yaml +0 -0
  244. {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/create-generic-issue.yaml +0 -0
  245. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/__init__.py +0 -0
  246. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/__main__.py +0 -0
  247. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/__init__.py +0 -0
  248. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/agents/__init__.py +0 -0
  249. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/agents/base.py +0 -0
  250. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/client.py +0 -0
  251. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/constants.py +0 -0
  252. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/exceptions.py +0 -0
  253. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/litellm_client.py +0 -0
  254. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/llm_tools.py +0 -0
  255. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/models.py +0 -0
  256. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/oauth_helper.py +0 -0
  257. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/__init__.py +0 -0
  258. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/anthropic.py +0 -0
  259. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/base.py +0 -0
  260. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/gemini.py +0 -0
  261. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/litellm.py +0 -0
  262. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/openai.py +0 -0
  263. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/cli.py +0 -0
  264. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/clients/__init__.py +0 -0
  265. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/clients/gcloud_client.py +0 -0
  266. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/__init__.py +0 -0
  267. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/discovery.py +0 -0
  268. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/errors.py +0 -0
  269. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/logging/__init__.py +0 -0
  270. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/logging/config.py +0 -0
  271. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/logging/decorators.py +0 -0
  272. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/migrations/__init__.py +0 -0
  273. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/migrations/base.py +0 -0
  274. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/migrations/legacy_to_v1.py +0 -0
  275. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/migrations/manager.py +0 -0
  276. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/models/__init__.py +0 -0
  277. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/models/code_review.py +0 -0
  278. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/plugins/local_sources.py +0 -0
  279. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/plugins/plugin_base.py +0 -0
  280. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/result.py +0 -0
  281. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/secrets.py +0 -0
  282. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/utils.py +0 -0
  283. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/validators/__init__.py +0 -0
  284. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/__init__.py +0 -0
  285. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/models.py +0 -0
  286. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/project_step_source.py +0 -0
  287. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/workflow_exceptions.py +0 -0
  288. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/workflow_filter_service.py +0 -0
  289. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/workflow_registry.py +0 -0
  290. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/workflow_sources.py +0 -0
  291. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/__init__.py +0 -0
  292. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/builder.py +0 -0
  293. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/context.py +0 -0
  294. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/mock_context.py +0 -0
  295. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/results.py +0 -0
  296. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/steps/ai_assistant_step.py +0 -0
  297. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/steps/command_step.py +0 -0
  298. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/utils/__init__.py +0 -0
  299. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/utils/venv.py +0 -0
  300. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/workflow_executor.py +0 -0
  301. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/__init__.py +0 -0
  302. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/__init__.py +0 -0
  303. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/base.py +0 -0
  304. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/claude.py +0 -0
  305. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/codex.py +0 -0
  306. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/gemini.py +0 -0
  307. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/registry.py +0 -0
  308. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/configs.py +0 -0
  309. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/launcher.py +0 -0
  310. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/messages.py +0 -0
  311. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/__init__.py +0 -0
  312. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/__previews__/statusbar_preview.py +0 -0
  313. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/app.py +0 -0
  314. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/colors.py +0 -0
  315. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/icons.py +0 -0
  316. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/__init__.py +0 -0
  317. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/ai_config.py +0 -0
  318. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/ai_config_wizard.py +0 -0
  319. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/base.py +0 -0
  320. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/cli_launcher.py +0 -0
  321. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/global_setup_wizard.py +0 -0
  322. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/plugin_config_wizard.py +0 -0
  323. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/project_setup_wizard.py +0 -0
  324. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/workflow_execution.py +0 -0
  325. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/workflows.py +0 -0
  326. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/textual_components.py +0 -0
  327. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/textual_workflow_executor.py +0 -0
  328. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/theme.py +0 -0
  329. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/__init__.py +0 -0
  330. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/button.py +0 -0
  331. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/decision_badge.py +0 -0
  332. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/dev_source_path_modal.py +0 -0
  333. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/header.py +0 -0
  334. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/multiline_input.py +0 -0
  335. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/panel.py +0 -0
  336. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/panel_container.py +0 -0
  337. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/prompt_choice.py +0 -0
  338. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/prompt_input.py +0 -0
  339. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/prompt_option_list.py +0 -0
  340. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/prompt_selection_list.py +0 -0
  341. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/prompt_textarea.py +0 -0
  342. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/segmented_switch.py +0 -0
  343. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/status_bar.py +0 -0
  344. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/step_container.py +0 -0
  345. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/styled_option_list.py +0 -0
  346. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/table.py +0 -0
  347. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/text.py +0 -0
  348. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/wizard.py +0 -0
  349. {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/utils/__init__.py +0 -0
  350. {titan_cli-0.4.0 → titan_cli-0.4.2}/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.4.0
3
+ Version: 0.4.2
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
@@ -267,6 +267,12 @@ class GitClient:
267
267
  """Get list of commits in head_branch that are not in base_branch."""
268
268
  return self.commit_service.get_branch_commits(base_branch, head_branch)
269
269
 
270
+ def get_commits_between_refs(
271
+ self, base_ref: str, head_ref: str = "HEAD"
272
+ ) -> ClientResult[List[str]]:
273
+ """Get list of commits reachable from head_ref but not base_ref."""
274
+ return self.commit_service.get_commits_between_refs(base_ref, head_ref)
275
+
270
276
  def count_commits_ahead(self, base_branch: str = "develop") -> ClientResult[int]:
271
277
  """Count how many commits current branch is ahead of base branch."""
272
278
  return self.commit_service.count_commits_ahead(base_branch)
@@ -353,6 +359,10 @@ class GitClient:
353
359
  """Push to remote."""
354
360
  return self.remote_service.push(remote, branch, set_upstream, tags)
355
361
 
362
+ def push_tag(self, tag_name: str, remote: str = "origin") -> ClientResult[None]:
363
+ """Push a specific tag to remote."""
364
+ return self.remote_service.push_tag(tag_name, remote)
365
+
356
366
  def pull(
357
367
  self, remote: str = "origin", branch: Optional[str] = None
358
368
  ) -> ClientResult[None]:
@@ -406,6 +416,10 @@ class GitClient:
406
416
  """Check if a tag exists locally."""
407
417
  return self.tag_service.tag_exists(tag_name)
408
418
 
419
+ def remote_tag_exists(self, tag_name: str, remote: str = "origin") -> ClientResult[bool]:
420
+ """Check if a tag exists on a remote."""
421
+ return self.tag_service.remote_tag_exists(tag_name, remote)
422
+
409
423
  def list_tags(self) -> ClientResult[List[UIGitTag]]:
410
424
  """List all tags in the repository."""
411
425
  return self.tag_service.list_tags()
@@ -225,6 +225,37 @@ class CommitService:
225
225
  except GitCommandError as e:
226
226
  return ClientError(error_message=str(e), error_code="COMMIT_ERROR")
227
227
 
228
+ @log_client_operation()
229
+ def get_commits_between_refs(
230
+ self, base_ref: str, head_ref: str = "HEAD"
231
+ ) -> ClientResult[List[str]]:
232
+ """
233
+ Get list of commit subjects reachable from head_ref but not base_ref.
234
+
235
+ Args:
236
+ base_ref: Base git reference (tag, branch, or commit SHA)
237
+ head_ref: Head git reference (default: HEAD)
238
+
239
+ Returns:
240
+ ClientResult[List[str]] with commit messages
241
+ """
242
+ try:
243
+ output = self.git.run_command([
244
+ "git", "log", f"{base_ref}..{head_ref}", "--pretty=format:%s"
245
+ ])
246
+
247
+ if not output:
248
+ return ClientSuccess(data=[], message="No commits found")
249
+
250
+ commits = [line.strip() for line in output.split("\n") if line.strip()]
251
+ return ClientSuccess(
252
+ data=commits,
253
+ message=f"Found {len(commits)} commits between {base_ref} and {head_ref}",
254
+ )
255
+
256
+ except GitCommandError as e:
257
+ return ClientError(error_message=str(e), error_code="COMMIT_ERROR")
258
+
228
259
  @log_client_operation()
229
260
  def count_commits_ahead(self, base_branch: str = "develop") -> ClientResult[int]:
230
261
  """
@@ -71,6 +71,24 @@ class RemoteService:
71
71
  except GitCommandError as e:
72
72
  return ClientError(error_message=str(e), error_code="PUSH_ERROR")
73
73
 
74
+ @log_client_operation()
75
+ def push_tag(self, tag_name: str, remote: str = "origin") -> ClientResult[None]:
76
+ """
77
+ Push a specific tag to remote.
78
+
79
+ Args:
80
+ tag_name: Tag name to push
81
+ remote: Remote name
82
+
83
+ Returns:
84
+ ClientResult[None]
85
+ """
86
+ try:
87
+ self.git.run_command(["git", "push", remote, tag_name])
88
+ return ClientSuccess(data=None, message=f"Pushed tag {tag_name} to {remote}")
89
+ except GitCommandError as e:
90
+ return ClientError(error_message=str(e), error_code="PUSH_ERROR")
91
+
74
92
  @log_client_operation()
75
93
  def pull(
76
94
  self, remote: str = "origin", branch: Optional[str] = None
@@ -93,6 +93,31 @@ class TagService:
93
93
  except GitCommandError as e:
94
94
  return ClientError(error_message=str(e), error_code="TAG_CHECK_ERROR")
95
95
 
96
+ @log_client_operation()
97
+ def remote_tag_exists(self, tag_name: str, remote: str = "origin") -> ClientResult[bool]:
98
+ """
99
+ Check if a tag exists on a remote.
100
+
101
+ Args:
102
+ tag_name: Name of the tag to check
103
+ remote: Remote name
104
+
105
+ Returns:
106
+ ClientResult[bool] with True if tag exists on the remote
107
+ """
108
+ try:
109
+ output = self.git.run_command(
110
+ ["git", "ls-remote", "--tags", remote, f"refs/tags/{tag_name}"],
111
+ check=False,
112
+ )
113
+ exists = bool(output.strip())
114
+ return ClientSuccess(
115
+ data=exists,
116
+ message=f"Tag '{tag_name}' {'exists' if exists else 'does not exist'} on {remote}",
117
+ )
118
+ except GitCommandError as e:
119
+ return ClientError(error_message=str(e), error_code="TAG_CHECK_ERROR")
120
+
96
121
  @log_client_operation()
97
122
  def list_tags(self) -> ClientResult[List[UIGitTag]]:
98
123
  """
@@ -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:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "titan-cli"
3
- version = "0.4.0"
3
+ version = "0.4.2"
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"
@@ -7,7 +7,7 @@ import subprocess
7
7
  import sys
8
8
  from dataclasses import dataclass
9
9
 
10
- from titan_cli.core.plugins.community import is_running_in_pipx
10
+ from titan_cli.core.plugins.community_sources import is_running_in_pipx
11
11
 
12
12
 
13
13
  @dataclass(frozen=True)
@@ -1,6 +1,9 @@
1
1
  # core/config.py
2
+ from copy import deepcopy
3
+ import hashlib
2
4
  from pathlib import Path
3
- from typing import Optional, List
5
+ import re
6
+ from typing import List, Optional
4
7
  import tomli
5
8
  from .models import TitanConfigModel
6
9
  from .migrations import MigrationManager
@@ -10,6 +13,7 @@ from .secrets import SecretManager
10
13
  from .errors import ConfigParseError, ConfigWriteError
11
14
  from .utils import find_project_root
12
15
  from .logging import get_logger
16
+ from .plugins.community_sources import PluginChannel
13
17
 
14
18
  logger = get_logger(__name__)
15
19
 
@@ -18,10 +22,7 @@ class TitanConfig:
18
22
 
19
23
  GLOBAL_CONFIG = Path.home() / ".titan" / "config.toml"
20
24
  global_migration_manager = MigrationManager()
21
- project_migration_manager = MigrationManager(
22
- migrations=[],
23
- target_version="legacy",
24
- )
25
+ project_migration_manager = MigrationManager()
25
26
 
26
27
  def __init__(
27
28
  self,
@@ -38,6 +39,7 @@ class TitanConfig:
38
39
  self._active_project_path = None # Set by load()
39
40
  self._workflow_registry = None # Set by load()
40
41
  self._plugin_warnings = []
42
+ self._plugin_sync_events = []
41
43
 
42
44
  # Use custom global config path if provided (for testing), otherwise use default
43
45
  self._global_config_path = global_config_path or self.GLOBAL_CONFIG
@@ -69,10 +71,7 @@ class TitanConfig:
69
71
  self.project_config_path = self._find_project_config(project_root)
70
72
 
71
73
  # Load project config if it exists
72
- self.project_config = self._load_and_migrate_toml(
73
- self.project_config_path,
74
- migration_manager=self.project_migration_manager,
75
- )
74
+ self.project_config = self._load_toml(self.project_config_path)
76
75
 
77
76
  # Merge and validate final config
78
77
  merged = self._merge_configs(self.global_config, self.project_config)
@@ -87,6 +86,7 @@ class TitanConfig:
87
86
  self.registry.reset()
88
87
  self.registry.initialize_plugins(config=self, secrets=self.secrets)
89
88
  self._plugin_warnings = self.registry.list_failed()
89
+ self._plugin_sync_events = self.registry.list_sync_events()
90
90
 
91
91
  # Re-initialize WorkflowRegistry using project root
92
92
  project_step_source = ProjectStepSource(project_root=project_root)
@@ -133,6 +133,7 @@ class TitanConfig:
133
133
  self,
134
134
  path: Optional[Path],
135
135
  migration_manager: MigrationManager,
136
+ write_on_migration: bool = True,
136
137
  ) -> dict:
137
138
  """Load TOML and normalize it to the current config schema."""
138
139
  raw_config = self._load_toml(path)
@@ -148,14 +149,14 @@ class TitanConfig:
148
149
  to_version=migration_result.final_version,
149
150
  steps=migration_result.applied_steps,
150
151
  )
151
- if path is not None:
152
+ if write_on_migration and path is not None:
152
153
  self._write_toml(path, migration_result.data)
153
154
 
154
155
  return migration_result.data
155
156
 
156
157
  def _merge_configs(self, global_cfg: dict, project_cfg: dict) -> dict:
157
158
  """Merge global and project configs (project overrides global)"""
158
- merged = {**global_cfg}
159
+ merged = deepcopy(global_cfg)
159
160
 
160
161
  # Project config overrides global
161
162
  for key, value in project_cfg.items():
@@ -175,12 +176,6 @@ class TitanConfig:
175
176
  if pk != "config":
176
177
  final_plugin_data[pk] = pv
177
178
 
178
- # Plugin source is a user-local concern. If global config already
179
- # defines a source override, preserve it instead of letting the
180
- # project config overwrite it.
181
- if "source" in plugin_data_global:
182
- final_plugin_data["source"] = plugin_data_global["source"]
183
-
184
179
  # Handle the nested 'config' dictionary separately (deep merge)
185
180
  config_section_global = plugin_data_global.get("config", {})
186
181
  config_section_project = plugin_data_project.get("config", {})
@@ -253,6 +248,10 @@ class TitanConfig:
253
248
  """Get list of failed or misconfigured plugins."""
254
249
  return self._plugin_warnings
255
250
 
251
+ def get_plugin_sync_events(self) -> List[str]:
252
+ """Get list of plugin auto-sync events from the latest load cycle."""
253
+ return self._plugin_sync_events
254
+
256
255
  def get_project_name(self) -> Optional[str]:
257
256
  """Get the current project name from project config."""
258
257
  if self.config and self.config.project:
@@ -388,22 +387,75 @@ class TitanConfig:
388
387
  return plugin_cfg.enabled if plugin_cfg else False
389
388
 
390
389
  def get_plugin_source_channel(self, plugin_name: str) -> str:
391
- """Return the configured source channel for a plugin."""
392
- if not self.config or not self.config.plugins:
393
- return "stable"
394
- plugin_cfg = self.config.plugins.get(plugin_name)
395
- if not plugin_cfg or not getattr(plugin_cfg, "source", None):
396
- return "stable"
397
- return plugin_cfg.source.channel or "stable"
390
+ """Return the effective source channel for a plugin."""
391
+ source = self.get_effective_plugin_source(plugin_name)
392
+ return source.get("channel", PluginChannel.STABLE)
398
393
 
399
394
  def get_plugin_source_path(self, plugin_name: str) -> Optional[Path]:
400
- """Return the configured dev_local path for a plugin, if any."""
401
- if not self.config or not self.config.plugins:
395
+ """Return the effective dev_local path for a plugin, if any."""
396
+ source = self.get_effective_plugin_source(plugin_name)
397
+ path = source.get("path")
398
+ if not path:
402
399
  return None
403
- plugin_cfg = self.config.plugins.get(plugin_name)
404
- if not plugin_cfg or not getattr(plugin_cfg, "source", None) or not plugin_cfg.source.path:
405
- return None
406
- return Path(plugin_cfg.source.path).expanduser().resolve()
400
+ return Path(path).expanduser().resolve()
401
+
402
+ def get_global_plugin_source(self, plugin_name: str) -> dict:
403
+ """Return the raw user-local source override for a plugin in the active project."""
404
+ scoped_source = self._get_project_source_scope_data().get("plugins", {}).get(plugin_name, {}).get("source", {})
405
+ if scoped_source:
406
+ return scoped_source.copy()
407
+
408
+ # Backward-compatible fallback for older global config layouts.
409
+ return (
410
+ self.global_config.get("plugins", {})
411
+ .get(plugin_name, {})
412
+ .get("source", {})
413
+ .copy()
414
+ )
415
+
416
+ def get_project_plugin_source(self, plugin_name: str) -> dict:
417
+ """Return the raw project source definition for a plugin."""
418
+ return (
419
+ self.project_config.get("plugins", {})
420
+ .get(plugin_name, {})
421
+ .get("source", {})
422
+ .copy()
423
+ )
424
+
425
+ def get_effective_plugin_source(self, plugin_name: str) -> dict:
426
+ """Return the effective plugin source after applying local overrides."""
427
+ global_source = self.get_global_plugin_source(plugin_name)
428
+ project_source = self.get_project_plugin_source(plugin_name)
429
+
430
+ if global_source.get("channel") == PluginChannel.DEV_LOCAL and global_source.get("path"):
431
+ return {
432
+ "channel": PluginChannel.DEV_LOCAL,
433
+ "path": global_source.get("path"),
434
+ "repo_url": project_source.get("repo_url"),
435
+ "requested_ref": project_source.get("requested_ref"),
436
+ "resolved_commit": project_source.get("resolved_commit"),
437
+ }
438
+
439
+ effective = dict(project_source)
440
+ effective.setdefault("channel", PluginChannel.STABLE)
441
+
442
+ # Preserve the remembered dev path for quick switching, but only as UX state.
443
+ if global_source.get("path") and "path" not in effective:
444
+ effective["path"] = global_source.get("path")
445
+
446
+ return effective
447
+
448
+ def get_project_plugin_repo_url(self, plugin_name: str) -> Optional[str]:
449
+ """Return the shared stable repository URL for a plugin."""
450
+ return self.get_project_plugin_source(plugin_name).get("repo_url")
451
+
452
+ def get_project_plugin_requested_ref(self, plugin_name: str) -> Optional[str]:
453
+ """Return the shared requested stable ref for a plugin."""
454
+ return self.get_project_plugin_source(plugin_name).get("requested_ref")
455
+
456
+ def get_project_plugin_resolved_commit(self, plugin_name: str) -> Optional[str]:
457
+ """Return the shared resolved stable commit for a plugin."""
458
+ return self.get_project_plugin_source(plugin_name).get("resolved_commit")
407
459
 
408
460
  def set_global_plugin_source(
409
461
  self,
@@ -413,7 +465,10 @@ class TitanConfig:
413
465
  ) -> None:
414
466
  """Persist a plugin source override in the global user config."""
415
467
  config_data = self._load_toml(self._global_config_path)
416
- plugins_table = config_data.setdefault("plugins", {})
468
+ project_sources = config_data.setdefault("project_sources", {})
469
+ project_table = project_sources.setdefault(self._get_project_source_scope_key(), {})
470
+ project_table["project_path"] = str((self._project_root or Path.cwd()).resolve())
471
+ plugins_table = project_table.setdefault("plugins", {})
417
472
  plugin_table = plugins_table.setdefault(plugin_name, {})
418
473
  source_table = plugin_table.setdefault("source", {})
419
474
 
@@ -428,19 +483,74 @@ class TitanConfig:
428
483
  def clear_global_plugin_source(self, plugin_name: str) -> None:
429
484
  """Remove a plugin source override from the global user config."""
430
485
  config_data = self._load_toml(self._global_config_path)
431
- plugins_table = config_data.get("plugins", {})
486
+ project_sources = config_data.get("project_sources", {})
487
+ project_key = self._find_project_source_scope_key(project_sources)
488
+ project_table = project_sources.get(project_key, {}) if project_key else {}
489
+ plugins_table = project_table.get("plugins", {})
432
490
  plugin_table = plugins_table.get(plugin_name)
433
491
  if not plugin_table:
492
+ # Fall back to cleaning any legacy global override for the plugin.
493
+ legacy_plugins = config_data.get("plugins", {})
494
+ legacy_plugin = legacy_plugins.get(plugin_name)
495
+ if not legacy_plugin:
496
+ return
497
+ legacy_plugin.pop("source", None)
498
+ if not legacy_plugin:
499
+ legacy_plugins.pop(plugin_name, None)
500
+ if not legacy_plugins and "plugins" in config_data:
501
+ config_data.pop("plugins", None)
502
+ self._write_global_config(config_data)
434
503
  return
435
504
 
436
505
  plugin_table.pop("source", None)
437
506
  if not plugin_table:
438
507
  plugins_table.pop(plugin_name, None)
439
- if not plugins_table and "plugins" in config_data:
440
- config_data.pop("plugins", None)
508
+ if not plugins_table and "plugins" in project_table:
509
+ project_table.pop("plugins", None)
510
+ if self._project_source_table_empty(project_table) and project_key in project_sources:
511
+ project_sources.pop(project_key, None)
512
+ if not project_sources and "project_sources" in config_data:
513
+ config_data.pop("project_sources", None)
441
514
 
442
515
  self._write_global_config(config_data)
443
516
 
517
+ def _get_project_source_scope_key(self) -> str:
518
+ """Return the global-config key used to scope local plugin overrides per project."""
519
+ project_path = str((self._project_root or Path.cwd()).resolve())
520
+ project_name = (self._project_root or Path.cwd()).resolve().name or "project"
521
+ safe_name = re.sub(r"[^a-zA-Z0-9]+", "_", project_name).strip("_").lower() or "project"
522
+ digest = hashlib.sha256(project_path.encode("utf-8")).hexdigest()[:8]
523
+ return f"p_{safe_name}_{digest}"
524
+
525
+ def _get_project_source_scope_data(self) -> dict:
526
+ """Return the scoped project source block for the active project."""
527
+ project_sources = self.global_config.get("project_sources", {})
528
+ project_key = self._find_project_source_scope_key(project_sources)
529
+ if project_key:
530
+ return project_sources.get(project_key, {})
531
+ return {}
532
+
533
+ def _find_project_source_scope_key(self, project_sources: dict) -> Optional[str]:
534
+ """Find the project_sources key matching the active project."""
535
+ current_path = str((self._project_root or Path.cwd()).resolve())
536
+ preferred_key = self._get_project_source_scope_key()
537
+ preferred_table = project_sources.get(preferred_key)
538
+ if isinstance(preferred_table, dict):
539
+ stored_path = preferred_table.get("project_path")
540
+ if not stored_path or stored_path == current_path:
541
+ return preferred_key
542
+
543
+ for key, value in project_sources.items():
544
+ if key == current_path:
545
+ return key
546
+ if isinstance(value, dict) and value.get("project_path") == current_path:
547
+ return key
548
+ return None
549
+
550
+ def _project_source_table_empty(self, project_table: dict) -> bool:
551
+ """Return whether a scoped project source block contains meaningful data."""
552
+ return not any(key != "project_path" for key in project_table)
553
+
444
554
  def get_status_bar_info(self) -> dict:
445
555
  """
446
556
  Get information for the status bar display.
@@ -1,9 +1,4 @@
1
- """
2
- This file contains a list of known, installable plugins for Titan CLI.
3
-
4
- This acts as a centralized registry for the `install` command, so the CLI
5
- knows what plugins are available to be installed via `pipx inject`.
6
- """
1
+ """Registry of known official plugins available to Titan CLI."""
7
2
  from typing import TypedDict, List
8
3
 
9
4
  class KnownPlugin(TypedDict):