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.
- {titan_cli-0.1.8 → titan_cli-0.3.2}/PKG-INFO +25 -11
- {titan_cli-0.1.8 → titan_cli-0.3.2}/README.md +16 -6
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/clients/__init__.py +2 -1
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/git_client.py +462 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/network/__init__.py +4 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/network/git_network.py +150 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/__init__.py +20 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/branch_service.py +232 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/commit_service.py +280 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/diff_service.py +200 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/remote_service.py +161 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/stash_service.py +136 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/status_service.py +135 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/tag_service.py +122 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/clients/services/worktree_service.py +369 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/messages.py +2 -2
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/__init__.py +62 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/__init__.py +14 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/branch_mapper.py +39 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/commit_mapper.py +51 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/status_mapper.py +62 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/tag_mapper.py +48 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/mappers/worktree_mapper.py +65 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/__init__.py +14 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/branch.py +17 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/commit.py +16 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/status.py +20 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/tag.py +16 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/network/worktree.py +18 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/__init__.py +14 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/branch.py +18 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/commit.py +19 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/status.py +22 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/tag.py +18 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/models/view/worktree.py +21 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/operations/__init__.py +56 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/operations/branch_operations.py +107 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/operations/commit_operations.py +196 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/operations/diff_operations.py +191 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/plugin.py +8 -0
- {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
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/branch_steps.py +18 -14
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/commit_step.py +21 -19
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/create_branch_step.py +166 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/create_worktree_step.py +155 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/diff_summary_step.py +142 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/push_step.py +108 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/remove_worktree_step.py +98 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/status_step.py +70 -0
- titan_cli-0.3.2/plugins/titan-plugin-git/titan_plugin_git/steps/worktree_command_step.py +199 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/agents/__init__.py +2 -1
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/agents/code_review_agent.py +168 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/agents/issue_generator.py +4 -3
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/agents/pr_agent.py +166 -86
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/checklists/__init__.py +5 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/checklists/defaults.py +100 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/github_client.py +376 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/network/__init__.py +17 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/network/gh_network.py +134 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_network.py +156 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_queries.py +170 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/protocols.py +86 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/services/__init__.py +18 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/services/issue_service.py +127 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/services/pr_service.py +683 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/services/review_service.py +566 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/clients/services/team_service.py +76 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/config/pr_agent.toml +10 -5
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/managers/__init__.py +15 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/managers/checklist_manager.py +23 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/managers/diff_context_manager.py +572 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/__init__.py +79 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/diff_models.py +130 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/formatting.py +209 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/__init__.py +30 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/comment_mapper.py +74 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/issue_mapper.py +35 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/pr_mapper.py +138 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/review_mapper.py +45 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/mappers/thread_mapper.py +40 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/__init__.py +42 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/__init__.py +19 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/issue_comment.py +57 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_comment.py +80 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_thread.py +65 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/user.py +47 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/__init__.py +23 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/issue.py +63 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/pull_request.py +187 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/review.py +54 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/user.py +51 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/review_enums.py +109 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/review_models.py +306 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/validators.py +172 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/models/view.py +255 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/__init__.py +103 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/code_review_operations.py +607 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/comment_operations.py +258 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/context_resolution_operations.py +300 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/findings_operations.py +280 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/issue_operations.py +110 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/manifest_operations.py +191 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/plan_prompt_operations.py +234 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/pr_creation_operations.py +78 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/pr_operations.py +125 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/review_action_operations.py +145 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/thread_resolution_operations.py +337 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/operations/worktree_operations.py +131 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/plugin.py +97 -3
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/steps/ai_pr_step.py +29 -97
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/steps/code_review_steps.py +1784 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/steps/create_pr_step.py +123 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/steps/github_prompt_steps.py +50 -40
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/steps/issue_steps.py +62 -38
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/steps/pr_review_steps.py +1114 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/steps/select_cli_step.py +58 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/steps/worktree_steps.py +114 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/utils.py +61 -1
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/__init__.py +8 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/code_block.py +287 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_thread.py +136 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_utils.py +201 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_view.py +360 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/widgets/reply_comment.py +80 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-issue-ai.yaml +0 -5
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-pr-ai.yaml +13 -1
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/workflows/respond-pr-comments.yaml +66 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr-new-findings.yaml.disabled +91 -0
- titan_cli-0.3.2/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr-thread-resolution.yaml.disabled +56 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/jira_agent.py +33 -10
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/prompts.py +2 -6
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/validators.py +4 -4
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/__init__.py +9 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/jira_client.py +415 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/__init__.py +10 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/jira_network.py +169 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/__init__.py +24 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/comment_service.py +136 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/issue_service.py +523 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/link_service.py +106 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/metadata_service.py +297 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/project_service.py +135 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/transition_service.py +180 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/config/templates/generic_issue.md.j2 +34 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/constants/__init__.py +34 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/constants/defaults.py +18 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/constants/messages.py +161 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/constants/templates.py +69 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/constants.py +266 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/markdown_formatter.py +3 -8
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/messages.py +4 -1
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/__init__.py +102 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/enums.py +194 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/formatting.py +227 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/__init__.py +27 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/comment_mapper.py +50 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_mapper.py +102 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_type_mapper.py +36 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/priority_mapper.py +33 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/project_mapper.py +44 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/status_mapper.py +37 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/transition_mapper.py +43 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/user_mapper.py +29 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/version_mapper.py +33 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/__init__.py +30 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/comment.py +20 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue.py +65 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue_type.py +18 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/priority.py +16 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/project.py +23 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/status.py +26 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/transition.py +18 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/user.py +18 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/version.py +18 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/models/view.py +171 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/operations/__init__.py +47 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_formatting_operations.py +180 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_operations.py +142 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/operations/jql_operations.py +163 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/plugin.py +55 -20
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/ai_enhance_issue_description_step.py +233 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/confirm_auto_assign_step.py +67 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/create_generic_issue_step.py +143 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/get_issue_step.py +85 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/list_versions_step.py +124 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/prompt_issue_description_step.py +52 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/review_issue_description_step.py +83 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_jql_step.py +158 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_saved_query_step.py +206 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_priority_step.py +99 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_type_step.py +120 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/__init__.py +3 -0
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/utils/input_validation.py +54 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/issue_sorter.py +3 -3
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/saved_queries.py +4 -5
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/utils.py +86 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/analyze-jira-issues.yaml +2 -10
- titan_cli-0.3.2/plugins/titan-plugin-jira/titan_plugin_jira/workflows/create-generic-issue.yaml +56 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/pyproject.toml +13 -4
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/agents/base.py +36 -12
- titan_cli-0.3.2/titan_cli/ai/llm_tools.py +115 -0
- titan_cli-0.3.2/titan_cli/cli.py +159 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/config.py +34 -14
- titan_cli-0.3.2/titan_cli/core/logging/__init__.py +29 -0
- titan_cli-0.3.2/titan_cli/core/logging/config.py +321 -0
- titan_cli-0.3.2/titan_cli/core/logging/decorators.py +112 -0
- titan_cli-0.1.8/titan_cli/core/models.py → titan_cli-0.3.2/titan_cli/core/models/__init__.py +2 -2
- titan_cli-0.3.2/titan_cli/core/models/code_review.py +122 -0
- titan_cli-0.3.2/titan_cli/core/plugins/community.py +771 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/plugins/models.py +8 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/plugins/plugin_base.py +33 -2
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/plugins/plugin_registry.py +110 -17
- titan_cli-0.3.2/titan_cli/core/result.py +66 -0
- titan_cli-0.3.2/titan_cli/core/utils.py +44 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/models.py +5 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/project_step_source.py +22 -1
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/workflow_filter_service.py +3 -3
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/workflow_registry.py +112 -2
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/workflow_sources.py +83 -45
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/builder.py +18 -3
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/context.py +1 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/steps/ai_assistant_step.py +5 -8
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/steps/command_step.py +3 -6
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/workflow_executor.py +1 -1
- titan_cli-0.3.2/titan_cli/external_cli/adapters/__init__.py +9 -0
- titan_cli-0.3.2/titan_cli/external_cli/adapters/base.py +78 -0
- titan_cli-0.3.2/titan_cli/external_cli/adapters/claude.py +67 -0
- titan_cli-0.3.2/titan_cli/external_cli/adapters/codex.py +104 -0
- titan_cli-0.3.2/titan_cli/external_cli/adapters/gemini.py +68 -0
- titan_cli-0.3.2/titan_cli/external_cli/adapters/registry.py +46 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/external_cli/configs.py +5 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/__init__.py +44 -17
- titan_cli-0.3.2/titan_cli/ui/tui/colors.py +151 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/ai_config.py +6 -2
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/ai_config_wizard.py +142 -27
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/base.py +20 -3
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/global_setup_wizard.py +2 -2
- titan_cli-0.3.2/titan_cli/ui/tui/screens/install_plugin_screen.py +623 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/main_menu.py +49 -1
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/plugin_config_wizard.py +42 -42
- titan_cli-0.3.2/titan_cli/ui/tui/screens/plugin_management.py +698 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/project_setup_wizard.py +14 -24
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/workflow_execution.py +25 -17
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/workflows.py +2 -1
- titan_cli-0.3.2/titan_cli/ui/tui/textual_components.py +1299 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/textual_workflow_executor.py +90 -4
- titan_cli-0.3.2/titan_cli/ui/tui/theme.py +141 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/__init__.py +11 -0
- titan_cli-0.3.2/titan_cli/ui/tui/widgets/decision_badge.py +58 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/panel.py +48 -6
- titan_cli-0.3.2/titan_cli/ui/tui/widgets/panel_container.py +94 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/prompt_choice.py +15 -2
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/prompt_input.py +15 -2
- titan_cli-0.3.2/titan_cli/ui/tui/widgets/prompt_option_list.py +168 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/prompt_selection_list.py +1 -1
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/prompt_textarea.py +15 -4
- titan_cli-0.3.2/titan_cli/ui/tui/widgets/step_container.py +67 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/styled_option_list.py +24 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/table.py +30 -3
- titan_cli-0.3.2/titan_cli/ui/tui/widgets/wizard.py +49 -0
- titan_cli-0.3.2/titan_cli/utils/__init__.py +0 -0
- titan_cli-0.3.2/titan_cli/utils/autoupdate.py +309 -0
- titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/clients/git_client.py +0 -907
- titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/models.py +0 -39
- titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/steps/create_branch_step.py +0 -131
- titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/steps/diff_summary_step.py +0 -180
- titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/steps/push_step.py +0 -79
- titan_cli-0.1.8/plugins/titan-plugin-git/titan_plugin_git/steps/status_step.py +0 -66
- titan_cli-0.1.8/plugins/titan-plugin-github/titan_plugin_github/clients/github_client.py +0 -1105
- titan_cli-0.1.8/plugins/titan-plugin-github/titan_plugin_github/models.py +0 -330
- titan_cli-0.1.8/plugins/titan-plugin-github/titan_plugin_github/steps/create_pr_step.py +0 -96
- titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/clients/jira_client.py +0 -746
- titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/models.py +0 -89
- titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/steps/get_issue_step.py +0 -86
- titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/steps/list_versions_step.py +0 -133
- titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_jql_step.py +0 -191
- titan_cli-0.1.8/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_saved_query_step.py +0 -240
- titan_cli-0.1.8/titan_cli/cli.py +0 -92
- titan_cli-0.1.8/titan_cli/ui/tui/screens/plugin_management.py +0 -377
- titan_cli-0.1.8/titan_cli/ui/tui/textual_components.py +0 -694
- titan_cli-0.1.8/titan_cli/ui/tui/theme.py +0 -131
- titan_cli-0.1.8/titan_cli/ui/tui/widgets/step_container.py +0 -70
- titan_cli-0.1.8/titan_cli/utils/autoupdate.py +0 -155
- {titan_cli-0.1.8 → titan_cli-0.3.2}/LICENSE +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/exceptions.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/checkout_step.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/steps/pull_step.py +0 -0
- {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
- {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
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/__init__.py +0 -0
- {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
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-git/titan_plugin_git/workflows/commit-ai.yaml +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/agents/config_loader.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/clients/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/config/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/exceptions.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/messages.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/steps/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/steps/preview_step.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/__init__.py +0 -0
- {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
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/config_loader.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/response_parser.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/token_tracker.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/config/jira_agent.toml +0 -0
- {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
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/exceptions.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/__init__.py +0 -0
- {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
- {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
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/__main__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/agents/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/client.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/constants.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/exceptions.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/models.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/oauth_helper.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/providers/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/providers/anthropic.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/providers/base.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ai/providers/gemini.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/clients/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/clients/gcloud_client.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/discovery.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/errors.py +1 -1
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/plugins/available.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/secrets.py +0 -0
- {titan_cli-0.1.8/titan_cli/external_cli → titan_cli-0.3.2/titan_cli/core/validators}/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/core/workflows/workflow_exceptions.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/mock_context.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/results.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/utils/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/engine/utils/venv.py +0 -0
- {titan_cli-0.1.8/titan_cli/utils → titan_cli-0.3.2/titan_cli/external_cli}/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/external_cli/launcher.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/messages.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/__previews__/statusbar_preview.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/app.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/icons.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/__init__.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/screens/cli_launcher.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/button.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/header.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/multiline_input.py +0 -0
- {titan_cli-0.1.8 → titan_cli-0.3.2}/titan_cli/ui/tui/widgets/status_bar.py +0 -0
- {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
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: titan-cli
|
|
3
|
-
Version: 0.
|
|
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.
|
|
35
|
-
Project-URL:
|
|
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
|
-
|
|
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/
|
|
81
|
+
git clone https://github.com/masorange/titan-cli.git
|
|
70
82
|
cd titan-cli
|
|
71
83
|
|
|
72
|
-
#
|
|
73
|
-
|
|
84
|
+
# Setup development environment
|
|
85
|
+
make dev-install
|
|
74
86
|
|
|
75
87
|
# Run development version
|
|
76
|
-
|
|
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/
|
|
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
|
-
|
|
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/
|
|
40
|
+
git clone https://github.com/masorange/titan-cli.git
|
|
33
41
|
cd titan-cli
|
|
34
42
|
|
|
35
|
-
#
|
|
36
|
-
|
|
43
|
+
# Setup development environment
|
|
44
|
+
make dev-install
|
|
37
45
|
|
|
38
46
|
# Run development version
|
|
39
|
-
|
|
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/
|
|
96
|
+
- **Release History**: See [GitHub Releases](https://github.com/masorange/titan-cli/releases)
|
|
87
97
|
|
|
88
98
|
## 🤝 Contributing
|
|
89
99
|
|
|
@@ -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)
|